<?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>69109</bug_id>
          
          <creation_ts>2011-09-29 16:14:23 -0700</creation_ts>
          <short_desc>Refactor out trivially duplicated code in DFGJITCodeGenerator.</short_desc>
          <delta_ts>2011-09-29 16:28:12 -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>JavaScriptCore</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Gavin Barraclough">barraclough</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>yuqiang.xian</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>475733</commentid>
    <comment_count>0</comment_count>
    <who name="Gavin Barraclough">barraclough</who>
    <bug_when>2011-09-29 16:14:23 -0700</bug_when>
    <thetext>Some code is trivially redundant between DFGJITCodeGenerator.cpp &amp; DFGJITCodeGenerator32_64.cpp

Basically move a JSVALUE64 specific code into a new DFGJITCodeGenerator64.cpp, leave common code in DFGJITCodeGenerator.cpp, and remove copies from DFGJITCodeGenerator32_64.cpp.

For some function differences are trivial &amp; make more sense to ifdef individually, and some Operand methods make more sense left in DFGJITCodeGenerator.cpp alongside similar constructors.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>475736</commentid>
    <comment_count>1</comment_count>
      <attachid>109214</attachid>
    <who name="Gavin Barraclough">barraclough</who>
    <bug_when>2011-09-29 16:16:20 -0700</bug_when>
    <thetext>Created attachment 109214
Fix</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>475743</commentid>
    <comment_count>2</comment_count>
    <who name="Gavin Barraclough">barraclough</who>
    <bug_when>2011-09-29 16:28:12 -0700</bug_when>
    <thetext>Fixed in r96377</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>109214</attachid>
            <date>2011-09-29 16:16:20 -0700</date>
            <delta_ts>2011-09-29 16:18:23 -0700</delta_ts>
            <desc>Fix</desc>
            <filename>69109.patch</filename>
            <type>text/plain</type>
            <size>203115</size>
            <attacher name="Gavin Barraclough">barraclough</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gOTYzNzQpCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMzMgQEAK
KzIwMTEtMDktMjkgIEdhdmluIEJhcnJhY2xvdWdoICA8YmFycmFjbG91Z2hAYXBwbGUuY29tPgor
CisgICAgICAgIFJlZmFjdG9yIG91dCB0cml2aWFsbHkgZHVwbGljYXRlZCBjb2RlIGluIERGR0pJ
VENvZGVHZW5lcmF0b3IuCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVn
LmNnaT9pZD02OTEwOQorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisg
ICAgICAgIFNvbWUgY29kZSBpcyB0cml2aWFsbHkgcmVkdW5kYW50IGJldHdlZW4gREZHSklUQ29k
ZUdlbmVyYXRvci5jcHAgJiBERkdKSVRDb2RlR2VuZXJhdG9yMzJfNjQuY3BwCisKKyAgICAgICAg
QmFzaWNhbGx5IG1vdmUgYSBKU1ZBTFVFNjQgc3BlY2lmaWMgY29kZSBpbnRvIGEgbmV3IERGR0pJ
VENvZGVHZW5lcmF0b3I2NC5jcHAsIGxlYXZlIGNvbW1vbiBjb2RlCisgICAgICAgIGluIERGR0pJ
VENvZGVHZW5lcmF0b3IuY3BwLCBhbmQgcmVtb3ZlIGNvcGllcyBmcm9tIERGR0pJVENvZGVHZW5l
cmF0b3IzMl82NC5jcHAuCisKKyAgICAgICAgRm9yIHNvbWUgZnVuY3Rpb24gZGlmZmVyZW5jZXMg
YXJlIHRyaXZpYWwgJiBtYWtlIG1vcmUgc2Vuc2UgdG8gaWZkZWYgaW5kaXZpZHVhbGx5LCBhbmQg
c29tZQorICAgICAgICBPcGVyYW5kIG1ldGhvZHMgbWFrZSBtb3JlIHNlbnNlIGxlZnQgaW4gREZH
SklUQ29kZUdlbmVyYXRvci5jcHAgYWxvbmdzaWRlIHNpbWlsYXIgY29uc3RydWN0b3JzLgorCisg
ICAgICAgICogSmF2YVNjcmlwdENvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvajoKKyAgICAg
ICAgKiBkZmcvREZHSklUQ29kZUdlbmVyYXRvci5jcHA6CisgICAgICAgIChKU0M6OkRGRzo6SklU
Q29kZUdlbmVyYXRvcjo6aXNLbm93bk5vdE51bWJlcik6CisgICAgICAgIChKU0M6OkRGRzo6SklU
Q29kZUdlbmVyYXRvcjo6aXNLbm93bkJvb2xlYW4pOgorICAgICAgICAoSlNDOjpERkc6OkpJVENv
ZGVHZW5lcmF0b3I6OndyaXRlQmFycmllcik6CisgICAgICAgIChKU0M6OkRGRzo6SklUQ29kZUdl
bmVyYXRvcjo6ZHVtcCk6CisgICAgICAgIChKU0M6OkRGRzo6SklUQ29kZUdlbmVyYXRvcjo6Y2hl
Y2tDb25zaXN0ZW5jeSk6CisgICAgICAgIChKU0M6OkRGRzo6R1BSVGVtcG9yYXJ5OjpHUFJUZW1w
b3JhcnkpOgorICAgICAgICAoSlNDOjpERkc6OkZQUlRlbXBvcmFyeTo6RlBSVGVtcG9yYXJ5KToK
KyAgICAgICAgKiBkZmcvREZHSklUQ29kZUdlbmVyYXRvcjMyXzY0LmNwcDoKKyAgICAgICAgKiBk
ZmcvREZHSklUQ29kZUdlbmVyYXRvcjY0LmNwcDogQ29waWVkIGZyb20gU291cmNlL0phdmFTY3Jp
cHRDb3JlL2RmZy9ERkdKSVRDb2RlR2VuZXJhdG9yLmNwcC4KKyAgICAgICAgKiBkZmcvREZHSklU
Q29tcGlsZXIuaDoKKyAgICAgICAgKEpTQzo6REZHOjpKSVRDb21waWxlcjo6YnJhbmNoSWZOb3RD
ZWxsKToKKyAgICAgICAgKiBkZmcvREZHSklUQ29tcGlsZXJJbmxpbmVNZXRob2RzLmg6CisKIDIw
MTEtMDktMjkgIE9saXZlciBIdW50ICA8b2xpdmVyQGFwcGxlLmNvbT4KIAogICAgICAgICBCdWls
ZCBmaXguCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUueGNvZGVw
cm9qL3Byb2plY3QucGJ4cHJvago9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
SmF2YVNjcmlwdENvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagkocmV2aXNpb24gOTYzNzMp
CisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUueGNvZGVwcm9qL3Byb2pl
Y3QucGJ4cHJvagkod29ya2luZyBjb3B5KQpAQCAtMzAwLDYgKzMwMCw3IEBACiAJCTg2ODgwRjFE
MTQzMjhCQjkwMEIwOEQ0MiAvKiBERkdKSVRDb21waWxlcjMyXzY0LmNwcCBpbiBTb3VyY2VzICov
ID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDg2ODgwRjE5MTQzMjhCQjkwMEIwOEQ0
MiAvKiBERkdKSVRDb21waWxlcjMyXzY0LmNwcCAqLzsgfTsKIAkJODY4ODBGMUUxNDMyOEJCOTAw
QjA4RDQyIC8qIERGR0pJVENvbXBpbGVySW5saW5lTWV0aG9kcy5oIGluIEhlYWRlcnMgKi8gPSB7
aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gODY4ODBGMUExNDMyOEJCOTAwQjA4RDQyIC8q
IERGR0pJVENvbXBpbGVySW5saW5lTWV0aG9kcy5oICovOyB9OwogCQk4Njg4MEYxRjE0MzI4QkI5
MDBCMDhENDIgLyogREZHU3BlY3VsYXRpdmVKSVQzMl82NC5jcHAgaW4gU291cmNlcyAqLyA9IHtp
c2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA4Njg4MEYxQjE0MzI4QkI5MDBCMDhENDIgLyog
REZHU3BlY3VsYXRpdmVKSVQzMl82NC5jcHAgKi87IH07CisJCTg2ODgwRjQ0MTQzNTMxQTgwMEIw
OEQ0MiAvKiBERkdKSVRDb2RlR2VuZXJhdG9yNjQuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0g
UEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gODY4ODBGNDMxNDM1MzFBNzAwQjA4RDQyIC8qIERGR0pJ
VENvZGVHZW5lcmF0b3I2NC5jcHAgKi87IH07CiAJCTg2OEJGQTA4MTE3Q0VGRDEwMEI5MDhCMSAv
KiBBdG9taWNTdHJpbmcuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBm
aWxlUmVmID0gODY4QkZBMDAxMTdDRUZEMTAwQjkwOEIxIC8qIEF0b21pY1N0cmluZy5jcHAgKi87
IH07CiAJCTg2OEJGQTA5MTE3Q0VGRDEwMEI5MDhCMSAvKiBBdG9taWNTdHJpbmcuaCBpbiBIZWFk
ZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDg2OEJGQTAxMTE3Q0VGRDEw
MEI5MDhCMSAvKiBBdG9taWNTdHJpbmcuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQ
cml2YXRlLCApOyB9OyB9OwogCQk4NjhCRkEwQTExN0NFRkQxMDBCOTA4QjEgLyogQXRvbWljU3Ry
aW5nSW1wbC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0g
ODY4QkZBMDIxMTdDRUZEMTAwQjkwOEIxIC8qIEF0b21pY1N0cmluZ0ltcGwuaCAqLzsgc2V0dGlu
Z3MgPSB7QVRUUklCVVRFUyA9IChQcml2YXRlLCApOyB9OyB9OwpAQCAtMTA2Myw2ICsxMDY0LDcg
QEAKIAkJODY4ODBGMUExNDMyOEJCOTAwQjA4RDQyIC8qIERGR0pJVENvbXBpbGVySW5saW5lTWV0
aG9kcy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxh
c3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBERkdKSVRDb21waWxlcklu
bGluZU1ldGhvZHMuaDsgcGF0aCA9IGRmZy9ERkdKSVRDb21waWxlcklubGluZU1ldGhvZHMuaDsg
c291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJODY4ODBGMUIxNDMyOEJCOTAwQjA4RDQyIC8q
IERGR1NwZWN1bGF0aXZlSklUMzJfNjQuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7
IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3Bw
OyBuYW1lID0gREZHU3BlY3VsYXRpdmVKSVQzMl82NC5jcHA7IHBhdGggPSBkZmcvREZHU3BlY3Vs
YXRpdmVKSVQzMl82NC5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTg2ODgwRjMx
MTQzNEZGQUYwMEIwOEQ0MiAvKiBDaGFuZ2VMb2cgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5j
ZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0OyBwYXRoID0gQ2hh
bmdlTG9nOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk4Njg4MEY0MzE0MzUzMUE3MDBC
MDhENDIgLyogREZHSklUQ29kZUdlbmVyYXRvcjY0LmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVm
ZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUu
Y3BwLmNwcDsgbmFtZSA9IERGR0pJVENvZGVHZW5lcmF0b3I2NC5jcHA7IHBhdGggPSBkZmcvREZH
SklUQ29kZUdlbmVyYXRvcjY0LmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJODY4
QkZBMDAxMTdDRUZEMTAwQjkwOEIxIC8qIEF0b21pY1N0cmluZy5jcHAgKi8gPSB7aXNhID0gUEJY
RmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3Vy
Y2Vjb2RlLmNwcC5jcHA7IG5hbWUgPSBBdG9taWNTdHJpbmcuY3BwOyBwYXRoID0gdGV4dC9BdG9t
aWNTdHJpbmcuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk4NjhCRkEwMTExN0NF
RkQxMDBCOTA4QjEgLyogQXRvbWljU3RyaW5nLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5j
ZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsg
bmFtZSA9IEF0b21pY1N0cmluZy5oOyBwYXRoID0gdGV4dC9BdG9taWNTdHJpbmcuaDsgc291cmNl
VHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJODY4QkZBMDIxMTdDRUZEMTAwQjkwOEIxIC8qIEF0b21p
Y1N0cmluZ0ltcGwuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rpbmcg
PSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0gQXRvbWljU3Ry
aW5nSW1wbC5oOyBwYXRoID0gdGV4dC9BdG9taWNTdHJpbmdJbXBsLmg7IHNvdXJjZVRyZWUgPSAi
PGdyb3VwPiI7IH07CkBAIC0yMjcyLDYgKzIyNzQsNyBAQAogCQkJCTg2RUM5REI5MTMyOERGODIw
MDJCMkFENyAvKiBERkdKSVRDb2RlR2VuZXJhdG9yLmNwcCAqLywKIAkJCQk4NkVDOURCQTEzMjhE
RjgyMDAyQjJBRDcgLyogREZHSklUQ29kZUdlbmVyYXRvci5oICovLAogCQkJCTg2ODgwRjE4MTQz
MjhCQjkwMEIwOEQ0MiAvKiBERkdKSVRDb2RlR2VuZXJhdG9yMzJfNjQuY3BwICovLAorCQkJCTg2
ODgwRjQzMTQzNTMxQTcwMEIwOEQ0MiAvKiBERkdKSVRDb2RlR2VuZXJhdG9yNjQuY3BwICovLAog
CQkJCTg2RUM5REJCMTMyOERGODIwMDJCMkFENyAvKiBERkdKSVRDb21waWxlci5jcHAgKi8sCiAJ
CQkJODZFQzlEQkMxMzI4REY4MjAwMkIyQUQ3IC8qIERGR0pJVENvbXBpbGVyLmggKi8sCiAJCQkJ
ODY4ODBGMTkxNDMyOEJCOTAwQjA4RDQyIC8qIERGR0pJVENvbXBpbGVyMzJfNjQuY3BwICovLApA
QCAtMzM2OCw2ICszMzcxLDcgQEAKIAkJCQk4Njg4MEYxQzE0MzI4QkI5MDBCMDhENDIgLyogREZH
SklUQ29kZUdlbmVyYXRvcjMyXzY0LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTg2ODgwRjFEMTQz
MjhCQjkwMEIwOEQ0MiAvKiBERkdKSVRDb21waWxlcjMyXzY0LmNwcCBpbiBTb3VyY2VzICovLAog
CQkJCTg2ODgwRjFGMTQzMjhCQjkwMEIwOEQ0MiAvKiBERkdTcGVjdWxhdGl2ZUpJVDMyXzY0LmNw
cCBpbiBTb3VyY2VzICovLAorCQkJCTg2ODgwRjQ0MTQzNTMxQTgwMEIwOEQ0MiAvKiBERkdKSVRD
b2RlR2VuZXJhdG9yNjQuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkpOwogCQkJcnVuT25seUZvckRl
cGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CiAJCX07CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvZGZnL0RGR0pJVENvZGVHZW5lcmF0b3IzMl82NC5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdKSVRDb2RlR2VuZXJhdG9yMzJfNjQuY3BwCShyZXZp
c2lvbiA5NjM3MykKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHSklUQ29kZUdlbmVy
YXRvcjMyXzY0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjcsNyArMjcsNiBAQAogI2luY2x1ZGUg
IkRGR0pJVENvZGVHZW5lcmF0b3IuaCIKIAogI2lmIEVOQUJMRShERkdfSklUKQotI2lmIFVTRShK
U1ZBTFVFMzJfNjQpCiAKICNpbmNsdWRlICJERkdKSVRDb21waWxlcklubGluZU1ldGhvZHMuaCIK
ICNpbmNsdWRlICJERkdTcGVjdWxhdGl2ZUpJVC5oIgpAQCAtMzUsMTUgKzM0LDcgQEAKIAogbmFt
ZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBERkcgewogCi1jb25zdCBkb3VibGUgSklUQ29kZUdlbmVy
YXRvcjo6dHdvVG9UaGUzMiA9IChkb3VibGUpMHgxMDAwMDAwMDB1bGw7Ci0KLXZvaWQgSklUQ29k
ZUdlbmVyYXRvcjo6Y2xlYXJHZW5lcmF0aW9uSW5mbygpCi17Ci0gICAgZm9yICh1bnNpZ25lZCBp
ID0gMDsgaSA8IG1fZ2VuZXJhdGlvbkluZm8uc2l6ZSgpOyArK2kpCi0gICAgICAgIG1fZ2VuZXJh
dGlvbkluZm9baV0gPSBHZW5lcmF0aW9uSW5mbygpOwotICAgIG1fZ3BycyA9IFJlZ2lzdGVyQmFu
azxHUFJJbmZvPigpOwotICAgIG1fZnBycyA9IFJlZ2lzdGVyQmFuazxGUFJJbmZvPigpOwotfQor
I2lmIFVTRShKU1ZBTFVFMzJfNjQpCiAKIEdQUlJlZyBKSVRDb2RlR2VuZXJhdG9yOjpmaWxsSW50
ZWdlcihOb2RlSW5kZXggbm9kZUluZGV4LCBEYXRhRm9ybWF0JiByZXR1cm5Gb3JtYXQpCiB7CkBA
IC0zMTQsMTUzICszMDUsNiBAQCBib29sIEpJVENvZGVHZW5lcmF0b3I6OmZpbGxKU1ZhbHVlKE5v
ZGVJCiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLUdQUlJlZyBKSVRDb2RlR2VuZXJhdG9yOjpmaWxs
U3RvcmFnZShOb2RlSW5kZXggbm9kZUluZGV4KQotewotICAgIE5vZGUmIG5vZGUgPSBtX2ppdC5n
cmFwaCgpW25vZGVJbmRleF07Ci0gICAgVmlydHVhbFJlZ2lzdGVyIHZpcnR1YWxSZWdpc3RlciA9
IG5vZGUudmlydHVhbFJlZ2lzdGVyKCk7Ci0gICAgR2VuZXJhdGlvbkluZm8mIGluZm8gPSBtX2dl
bmVyYXRpb25JbmZvW3ZpcnR1YWxSZWdpc3Rlcl07Ci0gICAgCi0gICAgc3dpdGNoIChpbmZvLnJl
Z2lzdGVyRm9ybWF0KCkpIHsKLSAgICBjYXNlIERhdGFGb3JtYXROb25lOiB7Ci0gICAgICAgIEdQ
UlJlZyBncHIgPSBhbGxvY2F0ZSgpOwotICAgICAgICBBU1NFUlQoaW5mby5zcGlsbEZvcm1hdCgp
ID09IERhdGFGb3JtYXRTdG9yYWdlKTsKLSAgICAgICAgbV9ncHJzLnJldGFpbihncHIsIHZpcnR1
YWxSZWdpc3RlciwgU3BpbGxPcmRlclNwaWxsZWQpOwotICAgICAgICBtX2ppdC5sb2FkUHRyKEpJ
VENvbXBpbGVyOjphZGRyZXNzRm9yKHZpcnR1YWxSZWdpc3RlciksIGdwcik7Ci0gICAgICAgIGlu
Zm8uZmlsbFN0b3JhZ2UoZ3ByKTsKLSAgICAgICAgcmV0dXJuIGdwcjsKLSAgICB9Ci0gICAgICAg
IAotICAgIGNhc2UgRGF0YUZvcm1hdFN0b3JhZ2U6IHsKLSAgICAgICAgR1BSUmVnIGdwciA9IGlu
Zm8uZ3ByKCk7Ci0gICAgICAgIG1fZ3Bycy5sb2NrKGdwcik7Ci0gICAgICAgIHJldHVybiBncHI7
Ci0gICAgfQotICAgICAgICAKLSAgICBkZWZhdWx0OgotICAgICAgICBBU1NFUlRfTk9UX1JFQUNI
RUQoKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIEludmFsaWRHUFJSZWc7Ci19Ci0KLXZvaWQg
SklUQ29kZUdlbmVyYXRvcjo6dXNlQ2hpbGRyZW4oTm9kZSYgbm9kZSkKLXsKLSAgICBpZiAobm9k
ZS5vcCAmIE5vZGVIYXNWYXJBcmdzKSB7Ci0gICAgICAgIGZvciAodW5zaWduZWQgY2hpbGRJZHgg
PSBub2RlLmZpcnN0Q2hpbGQoKTsgY2hpbGRJZHggPCBub2RlLmZpcnN0Q2hpbGQoKSArIG5vZGUu
bnVtQ2hpbGRyZW4oKTsgY2hpbGRJZHgrKykKLSAgICAgICAgICAgIHVzZShtX2ppdC5ncmFwaCgp
Lm1fdmFyQXJnQ2hpbGRyZW5bY2hpbGRJZHhdKTsKLSAgICB9IGVsc2UgewotICAgICAgICBOb2Rl
SW5kZXggY2hpbGQxID0gbm9kZS5jaGlsZDEoKTsKLSAgICAgICAgaWYgKGNoaWxkMSA9PSBOb05v
ZGUpIHsKLSAgICAgICAgICAgIEFTU0VSVChub2RlLmNoaWxkMigpID09IE5vTm9kZSAmJiBub2Rl
LmNoaWxkMygpID09IE5vTm9kZSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAg
ICAgICAgdXNlKGNoaWxkMSk7Ci0gICAgICAgIAotICAgICAgICBOb2RlSW5kZXggY2hpbGQyID0g
bm9kZS5jaGlsZDIoKTsKLSAgICAgICAgaWYgKGNoaWxkMiA9PSBOb05vZGUpIHsKLSAgICAgICAg
ICAgIEFTU0VSVChub2RlLmNoaWxkMygpID09IE5vTm9kZSk7Ci0gICAgICAgICAgICByZXR1cm47
Ci0gICAgICAgIH0KLSAgICAgICAgdXNlKGNoaWxkMik7Ci0gICAgICAgIAotICAgICAgICBOb2Rl
SW5kZXggY2hpbGQzID0gbm9kZS5jaGlsZDMoKTsKLSAgICAgICAgaWYgKGNoaWxkMyA9PSBOb05v
ZGUpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIHVzZShjaGlsZDMpOwotICAgIH0KLX0K
LQotYm9vbCBKSVRDb2RlR2VuZXJhdG9yOjppc1N0cmljdEludDMyKE5vZGVJbmRleCBub2RlSW5k
ZXgpCi17Ci0gICAgaWYgKGlzSW50MzJDb25zdGFudChub2RlSW5kZXgpKQotICAgICAgICByZXR1
cm4gdHJ1ZTsKLSAgICAKLSAgICBOb2RlJiBub2RlID0gbV9qaXQuZ3JhcGgoKVtub2RlSW5kZXhd
OwotICAgIEdlbmVyYXRpb25JbmZvJiBpbmZvID0gbV9nZW5lcmF0aW9uSW5mb1tub2RlLnZpcnR1
YWxSZWdpc3RlcigpXTsKLSAgICAKLSAgICByZXR1cm4gaW5mby5yZWdpc3RlckZvcm1hdCgpID09
IERhdGFGb3JtYXRJbnRlZ2VyOwotfQotCi1ib29sIEpJVENvZGVHZW5lcmF0b3I6OmlzS25vd25J
bnRlZ2VyKE5vZGVJbmRleCBub2RlSW5kZXgpCi17Ci0gICAgaWYgKGlzSW50MzJDb25zdGFudChu
b2RlSW5kZXgpKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIE5vZGUmIG5vZGUgPSBtX2pp
dC5ncmFwaCgpW25vZGVJbmRleF07Ci0gICAgCi0gICAgaWYgKG5vZGUuaGFzSW50MzJSZXN1bHQo
KSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgCi0gICAgR2VuZXJhdGlvbkluZm8mIGluZm8g
PSBtX2dlbmVyYXRpb25JbmZvW25vZGUudmlydHVhbFJlZ2lzdGVyKCldOwotCi0gICAgcmV0dXJu
IGluZm8uaXNKU0ludGVnZXIoKTsKLX0KLQotYm9vbCBKSVRDb2RlR2VuZXJhdG9yOjppc0tub3du
TnVtZXJpYyhOb2RlSW5kZXggbm9kZUluZGV4KQotewotICAgIGlmIChpc0ludDMyQ29uc3RhbnQo
bm9kZUluZGV4KSB8fCBpc051bWJlckNvbnN0YW50KG5vZGVJbmRleCkpCi0gICAgICAgIHJldHVy
biB0cnVlOwotCi0gICAgTm9kZSYgbm9kZSA9IG1faml0LmdyYXBoKClbbm9kZUluZGV4XTsKLSAg
ICAKLSAgICBpZiAobm9kZS5oYXNOdW1iZXJSZXN1bHQoKSkKLSAgICAgICAgcmV0dXJuIHRydWU7
Ci0gICAgCi0gICAgR2VuZXJhdGlvbkluZm8mIGluZm8gPSBtX2dlbmVyYXRpb25JbmZvW25vZGUu
dmlydHVhbFJlZ2lzdGVyKCldOwotCi0gICAgcmV0dXJuIGluZm8uaXNKU0ludGVnZXIoKSB8fCBp
bmZvLmlzSlNEb3VibGUoKTsKLX0KLQotYm9vbCBKSVRDb2RlR2VuZXJhdG9yOjppc0tub3duQ2Vs
bChOb2RlSW5kZXggbm9kZUluZGV4KQotewotICAgIHJldHVybiBtX2dlbmVyYXRpb25JbmZvW21f
aml0LmdyYXBoKClbbm9kZUluZGV4XS52aXJ0dWFsUmVnaXN0ZXIoKV0uaXNKU0NlbGwoKTsKLX0K
LQotYm9vbCBKSVRDb2RlR2VuZXJhdG9yOjppc0tub3duTm90Q2VsbChOb2RlSW5kZXggbm9kZUlu
ZGV4KQotewotICAgIE5vZGUmIG5vZGUgPSBtX2ppdC5ncmFwaCgpW25vZGVJbmRleF07Ci0gICAg
VmlydHVhbFJlZ2lzdGVyIHZpcnR1YWxSZWdpc3RlciA9IG5vZGUudmlydHVhbFJlZ2lzdGVyKCk7
Ci0gICAgR2VuZXJhdGlvbkluZm8mIGluZm8gPSBtX2dlbmVyYXRpb25JbmZvW3ZpcnR1YWxSZWdp
c3Rlcl07Ci0gICAgaWYgKG5vZGUuaGFzQ29uc3RhbnQoKSAmJiAhdmFsdWVPZkpTQ29uc3RhbnQo
bm9kZUluZGV4KS5pc0NlbGwoKSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuICEo
aW5mby5pc0pTQ2VsbCgpIHx8IGluZm8uaXNVbmtub3duSlMoKSk7Ci19Ci0KLWJvb2wgSklUQ29k
ZUdlbmVyYXRvcjo6aXNLbm93bk5vdEludGVnZXIoTm9kZUluZGV4IG5vZGVJbmRleCkKLXsKLSAg
ICBOb2RlJiBub2RlID0gbV9qaXQuZ3JhcGgoKVtub2RlSW5kZXhdOwotICAgIFZpcnR1YWxSZWdp
c3RlciB2aXJ0dWFsUmVnaXN0ZXIgPSBub2RlLnZpcnR1YWxSZWdpc3RlcigpOwotICAgIEdlbmVy
YXRpb25JbmZvJiBpbmZvID0gbV9nZW5lcmF0aW9uSW5mb1t2aXJ0dWFsUmVnaXN0ZXJdOwotCi0g
ICAgcmV0dXJuIGluZm8uaXNKU0RvdWJsZSgpIHx8IGluZm8uaXNKU0NlbGwoKSB8fCBpbmZvLmlz
SlNCb29sZWFuKCkKLSAgICAgICAgfHwgKG5vZGUuaGFzQ29uc3RhbnQoKSAmJiAhdmFsdWVPZkpT
Q29uc3RhbnQobm9kZUluZGV4KS5pc0ludDMyKCkpOwotfQotCi1ib29sIEpJVENvZGVHZW5lcmF0
b3I6OmlzS25vd25Ob3ROdW1iZXIoTm9kZUluZGV4IG5vZGVJbmRleCkKLXsKLSAgICBOb2RlJiBu
b2RlID0gbV9qaXQuZ3JhcGgoKVtub2RlSW5kZXhdOwotICAgIFZpcnR1YWxSZWdpc3RlciB2aXJ0
dWFsUmVnaXN0ZXIgPSBub2RlLnZpcnR1YWxSZWdpc3RlcigpOwotICAgIEdlbmVyYXRpb25JbmZv
JiBpbmZvID0gbV9nZW5lcmF0aW9uSW5mb1t2aXJ0dWFsUmVnaXN0ZXJdOwotICAgIAotICAgIHJl
dHVybiAoIWluZm8uaXNKU0RvdWJsZSgpICYmICFpbmZvLmlzSlNJbnRlZ2VyKCkgJiYgIWluZm8u
aXNVbmtub3duSlMoKSkKLSAgICAgICAgfHwgKG5vZGUuaGFzQ29uc3RhbnQoKSAmJiAhaXNOdW1i
ZXJDb25zdGFudChub2RlSW5kZXgpKTsKLX0KLQotYm9vbCBKSVRDb2RlR2VuZXJhdG9yOjppc0tu
b3duQm9vbGVhbihOb2RlSW5kZXggbm9kZUluZGV4KQotewotICAgIE5vZGUmIG5vZGUgPSBtX2pp
dC5ncmFwaCgpW25vZGVJbmRleF07Ci0gICAgaWYgKG5vZGUuaGFzQm9vbGVhblJlc3VsdCgpKQot
ICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAKLSAgICBpZiAoaXNCb29sZWFuQ29uc3RhbnQobm9k
ZUluZGV4KSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgCi0gICAgVmlydHVhbFJlZ2lzdGVy
IHZpcnR1YWxSZWdpc3RlciA9IG5vZGUudmlydHVhbFJlZ2lzdGVyKCk7Ci0gICAgR2VuZXJhdGlv
bkluZm8mIGluZm8gPSBtX2dlbmVyYXRpb25JbmZvW3ZpcnR1YWxSZWdpc3Rlcl07Ci0gICAgCi0g
ICAgcmV0dXJuIGluZm8uaXNKU0Jvb2xlYW4oKTsKLX0KLQogdm9pZCBKSVRDb2RlR2VuZXJhdG9y
Ojpub25TcGVjdWxhdGl2ZVZhbHVlVG9OdW1iZXIoTm9kZSYgbm9kZSkKIHsKICAgICBpZiAoaXNL
bm93bk51bWVyaWMobm9kZS5jaGlsZDEoKSkpIHsKQEAgLTEyMjcsMTIwICsxMDcxLDYgQEAgSklU
Q29tcGlsZXI6OkNhbGwgSklUQ29kZUdlbmVyYXRvcjo6Y2FjaAogICAgIHJldHVybiBmdW5jdGlv
bkNhbGw7CiB9CiAKLXZvaWQgSklUQ29kZUdlbmVyYXRvcjo6d3JpdGVCYXJyaWVyKE1hY3JvQXNz
ZW1ibGVyJiBqaXQsIEdQUlJlZyBvd25lciwgR1BSUmVnIHNjcmF0Y2gxLCBHUFJSZWcgc2NyYXRj
aDIsIFdyaXRlQmFycmllclVzZUtpbmQgdXNlS2luZCkKLXsKLSAgICBVTlVTRURfUEFSQU0oaml0
KTsKLSAgICBVTlVTRURfUEFSQU0ob3duZXIpOwotICAgIFVOVVNFRF9QQVJBTShzY3JhdGNoMSk7
Ci0gICAgVU5VU0VEX1BBUkFNKHNjcmF0Y2gyKTsKLSAgICBVTlVTRURfUEFSQU0odXNlS2luZCk7
Ci0gICAgQVNTRVJUKG93bmVyICE9IHNjcmF0Y2gxKTsKLSAgICBBU1NFUlQob3duZXIgIT0gc2Ny
YXRjaDIpOwotICAgIEFTU0VSVChzY3JhdGNoMSAhPSBzY3JhdGNoMik7Ci0KLSNpZiBFTkFCTEUo
V1JJVEVfQkFSUklFUl9QUk9GSUxJTkcpCi0gICAgSklUQ29tcGlsZXI6OmVtaXRDb3VudChqaXQs
IFdyaXRlQmFycmllckNvdW50ZXJzOjpqaXRDb3VudGVyRm9yKHVzZUtpbmQpKTsKLSNlbmRpZgot
ICAgIG1hcmtDZWxsQ2FyZChqaXQsIG93bmVyLCBzY3JhdGNoMSwgc2NyYXRjaDIpOwotfQotCi12
b2lkIEpJVENvZGVHZW5lcmF0b3I6Om1hcmtDZWxsQ2FyZChNYWNyb0Fzc2VtYmxlciYgaml0LCBH
UFJSZWcgb3duZXIsIEdQUlJlZyBzY3JhdGNoMSwgR1BSUmVnIHNjcmF0Y2gyKQotewotICAgIFVO
VVNFRF9QQVJBTShqaXQpOwotICAgIFVOVVNFRF9QQVJBTShvd25lcik7Ci0gICAgVU5VU0VEX1BB
UkFNKHNjcmF0Y2gxKTsKLSAgICBVTlVTRURfUEFSQU0oc2NyYXRjaDIpOwotICAgIAotI2lmIEVO
QUJMRShHR0MpCi0gICAgaml0Lm1vdmUob3duZXIsIHNjcmF0Y2gxKTsKLSAgICBqaXQuYW5kUHRy
KFRydXN0ZWRJbW0zMihzdGF0aWNfY2FzdDxpbnQzMl90PihNYXJrZWRCbG9jazo6YmxvY2tNYXNr
KSksIHNjcmF0Y2gxKTsKLSAgICBqaXQubW92ZShvd25lciwgc2NyYXRjaDIpOwotICAgIGppdC5y
c2hpZnQzMihUcnVzdGVkSW1tMzIoTWFya2VkQmxvY2s6OmNhcmRTaGlmdCksIHNjcmF0Y2gyKTsK
LSAgICBqaXQuYW5kUHRyKFRydXN0ZWRJbW0zMihNYXJrZWRCbG9jazo6Y2FyZE1hc2spLCBzY3Jh
dGNoMik7Ci0gICAgaml0LnN0b3JlOChUcnVzdGVkSW1tMzIoMSksIE1hY3JvQXNzZW1ibGVyOjpC
YXNlSW5kZXgoc2NyYXRjaDEsIHNjcmF0Y2gyLCBNYWNyb0Fzc2VtYmxlcjo6VGltZXNPbmUsIE1h
cmtlZEJsb2NrOjpvZmZzZXRPZkNhcmRzKCkpKTsKLSNlbmRpZgotfQotCi12b2lkIEpJVENvZGVH
ZW5lcmF0b3I6OndyaXRlQmFycmllcihHUFJSZWcgb3duZXJHUFIsIEdQUlJlZyB2YWx1ZUdQUiwg
Tm9kZUluZGV4IHZhbHVlSW5kZXgsIFdyaXRlQmFycmllclVzZUtpbmQgdXNlS2luZCwgR1BSUmVn
IHNjcmF0Y2gxLCBHUFJSZWcgc2NyYXRjaDIpCi17Ci0gICAgVU5VU0VEX1BBUkFNKG93bmVyR1BS
KTsKLSAgICBVTlVTRURfUEFSQU0odmFsdWVHUFIpOwotICAgIFVOVVNFRF9QQVJBTShzY3JhdGNo
MSk7Ci0gICAgVU5VU0VEX1BBUkFNKHNjcmF0Y2gyKTsKLSAgICBVTlVTRURfUEFSQU0odXNlS2lu
ZCk7Ci0KLSAgICBpZiAoaXNLbm93bk5vdENlbGwodmFsdWVJbmRleCkpCi0gICAgICAgIHJldHVy
bjsKLQotI2lmIEVOQUJMRShXUklURV9CQVJSSUVSX1BST0ZJTElORykKLSAgICBKSVRDb21waWxl
cjo6ZW1pdENvdW50KGppdCwgV3JpdGVCYXJyaWVyQ291bnRlcnM6OmppdENvdW50ZXJGb3IodXNl
S2luZCkpOwotI2VuZGlmCi0KLSNpZiBFTkFCTEUoR0dDKQotICAgIEpJVENvbXBpbGVyOjpKdW1w
IHJoc05vdENlbGw7Ci0gICAgYm9vbCBoYWRDZWxsQ2hlY2sgPSBmYWxzZTsKLSAgICBpZiAoIWlz
S25vd25DZWxsKHZhbHVlSW5kZXgpICYmICFpc0NlbGxQcmVkaWN0aW9uKG1faml0LmdyYXBoKCku
Z2V0UHJlZGljdGlvbihtX2ppdC5ncmFwaCgpW3ZhbHVlSW5kZXhdKSkpIHsKLSAgICAgICAgaGFk
Q2VsbENoZWNrID0gdHJ1ZTsKLSAgICAgICAgcmhzTm90Q2VsbCA9IG1faml0LmJyYW5jaDMyKE1h
Y3JvQXNzZW1ibGVyOjpOb3RFcXVhbCwgdmFsdWVHUFIsIFRydXN0ZWRJbW0zMihKU1ZhbHVlOjpD
ZWxsVGFnKSk7Ci0gICAgfQotCi0gICAgR1BSVGVtcG9yYXJ5IHRlbXAxOwotICAgIEdQUlRlbXBv
cmFyeSB0ZW1wMjsKLSAgICBpZiAoc2NyYXRjaDEgPT0gSW52YWxpZEdQUlJlZykgewotICAgICAg
ICBHUFJUZW1wb3Jhcnkgc2NyYXRjaEdQUih0aGlzKTsKLSAgICAgICAgdGVtcDEuYWRvcHQoc2Ny
YXRjaEdQUik7Ci0gICAgICAgIHNjcmF0Y2gxID0gdGVtcDEuZ3ByKCk7Ci0gICAgfQotICAgIGlm
IChzY3JhdGNoMiA9PSBJbnZhbGlkR1BSUmVnKSB7Ci0gICAgICAgIEdQUlRlbXBvcmFyeSBzY3Jh
dGNoR1BSKHRoaXMpOwotICAgICAgICB0ZW1wMi5hZG9wdChzY3JhdGNoR1BSKTsKLSAgICAgICAg
c2NyYXRjaDIgPSB0ZW1wMi5ncHIoKTsKLSAgICB9Ci0KLSAgICBtYXJrQ2VsbENhcmQobV9qaXQs
IG93bmVyR1BSLCBzY3JhdGNoMSwgc2NyYXRjaDIpOwotICAgIGlmIChoYWRDZWxsQ2hlY2spCi0g
ICAgICAgIHJoc05vdENlbGwubGluaygmbV9qaXQpOwotI2VuZGlmCi19Ci0KLXZvaWQgSklUQ29k
ZUdlbmVyYXRvcjo6d3JpdGVCYXJyaWVyKEpTQ2VsbCogb3duZXIsIEdQUlJlZyB2YWx1ZUdQUiwg
Tm9kZUluZGV4IHZhbHVlSW5kZXgsIFdyaXRlQmFycmllclVzZUtpbmQgdXNlS2luZCwgR1BSUmVn
IHNjcmF0Y2gpCi17Ci0gICAgVU5VU0VEX1BBUkFNKG93bmVyKTsKLSAgICBVTlVTRURfUEFSQU0o
dmFsdWVHUFIpOwotICAgIFVOVVNFRF9QQVJBTShzY3JhdGNoKTsKLSAgICBVTlVTRURfUEFSQU0o
dXNlS2luZCk7Ci0KLSAgICBpZiAoaXNLbm93bk5vdENlbGwodmFsdWVJbmRleCkpCi0gICAgICAg
IHJldHVybjsKLQotI2lmIEVOQUJMRShXUklURV9CQVJSSUVSX1BST0ZJTElORykKLSAgICBKSVRD
b21waWxlcjo6ZW1pdENvdW50KGppdCwgV3JpdGVCYXJyaWVyQ291bnRlcnM6OmppdENvdW50ZXJG
b3IodXNlS2luZCkpOwotI2VuZGlmCi0KLSNpZiBFTkFCTEUoR0dDKQotICAgIEpJVENvbXBpbGVy
OjpKdW1wIHJoc05vdENlbGw7Ci0gICAgYm9vbCBoYWRDZWxsQ2hlY2sgPSBmYWxzZTsKLSAgICBp
ZiAoIWlzS25vd25DZWxsKHZhbHVlSW5kZXgpICYmICFpc0NlbGxQcmVkaWN0aW9uKG1faml0Lmdy
YXBoKCkuZ2V0UHJlZGljdGlvbihtX2ppdC5ncmFwaCgpW3ZhbHVlSW5kZXhdKSkpIHsKLSAgICAg
ICAgaGFkQ2VsbENoZWNrID0gdHJ1ZTsKLSAgICAgICAgcmhzTm90Q2VsbCA9IG1faml0LmJyYW5j
aDMyKE1hY3JvQXNzZW1ibGVyOjpOb3RFcXVhbCwgdmFsdWVHUFIsIFRydXN0ZWRJbW0zMihKU1Zh
bHVlOjpDZWxsVGFnKSk7Ci0gICAgfQotICAgIAotICAgIEdQUlRlbXBvcmFyeSB0ZW1wOwotICAg
IGlmIChzY3JhdGNoID09IEludmFsaWRHUFJSZWcpIHsKLSAgICAgICAgR1BSVGVtcG9yYXJ5IHNj
cmF0Y2hHUFIodGhpcyk7Ci0gICAgICAgIHRlbXAuYWRvcHQoc2NyYXRjaEdQUik7Ci0gICAgICAg
IHNjcmF0Y2ggPSB0ZW1wLmdwcigpOwotICAgIH0KLQotICAgIHVpbnQ4X3QqIGNhcmRBZGRyZXNz
ID0gSGVhcDo6YWRkcmVzc09mQ2FyZEZvcihvd25lcik7Ci0gICAgbV9qaXQubW92ZShKSVRDb21w
aWxlcjo6VHJ1c3RlZEltbVB0cihjYXJkQWRkcmVzcyksIHNjcmF0Y2gpOwotICAgIG1faml0LnN0
b3JlOChKSVRDb21waWxlcjo6VHJ1c3RlZEltbTMyKDEpLCBKSVRDb21waWxlcjo6QWRkcmVzcyhz
Y3JhdGNoKSk7Ci0KLSAgICBpZiAoaGFkQ2VsbENoZWNrKQotICAgICAgICByaHNOb3RDZWxsLmxp
bmsoJm1faml0KTsKLSNlbmRpZgotfQotCiB2b2lkIEpJVENvZGVHZW5lcmF0b3I6OmNhY2hlZFB1
dEJ5SWQoR1BSUmVnIGJhc2VQYXlsb2FkR1BSLCBHUFJSZWcgdmFsdWVUYWdHUFIsIEdQUlJlZyB2
YWx1ZVBheWxvYWRHUFIsIE5vZGVJbmRleCB2YWx1ZUluZGV4LCBHUFJSZWcgc2NyYXRjaEdQUiwg
dW5zaWduZWQgaWRlbnRpZmllck51bWJlciwgUHV0S2luZCBwdXRLaW5kLCBKSVRDb21waWxlcjo6
SnVtcCBzbG93UGF0aFRhcmdldCkKIHsKICAgICBKSVRDb21waWxlcjo6RGF0YUxhYmVsUHRyIHN0
cnVjdHVyZVRvQ29tcGFyZTsKQEAgLTE2NjEsMjQgKzEzOTEsNiBAQCB2b2lkIEpJVENvZGVHZW5l
cmF0b3I6Om5vblNwZWN1bGF0aXZlTm9uCiAgICAgfQogfQogCi1ib29sIEpJVENvZGVHZW5lcmF0
b3I6Om5vblNwZWN1bGF0aXZlQ29tcGFyZShOb2RlJiBub2RlLCBNYWNyb0Fzc2VtYmxlcjo6UmVs
YXRpb25hbENvbmRpdGlvbiBjb25kLCBaX0RGR09wZXJhdGlvbl9FSkogaGVscGVyRnVuY3Rpb24p
Ci17Ci0gICAgTm9kZUluZGV4IGJyYW5jaE5vZGVJbmRleCA9IGRldGVjdFBlZXBIb2xlQnJhbmNo
KCk7Ci0gICAgaWYgKGJyYW5jaE5vZGVJbmRleCAhPSBOb05vZGUpIHsKLSAgICAgICAgQVNTRVJU
KG5vZGUuYWRqdXN0ZWRSZWZDb3VudCgpID09IDEpOwotICAgICAgICAKLSAgICAgICAgbm9uU3Bl
Y3VsYXRpdmVQZWVwaG9sZUJyYW5jaChub2RlLCBicmFuY2hOb2RlSW5kZXgsIGNvbmQsIGhlbHBl
ckZ1bmN0aW9uKTsKLSAgICAKLSAgICAgICAgbV9jb21waWxlSW5kZXggPSBicmFuY2hOb2RlSW5k
ZXg7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgbm9u
U3BlY3VsYXRpdmVOb25QZWVwaG9sZUNvbXBhcmUobm9kZSwgY29uZCwgaGVscGVyRnVuY3Rpb24p
OwotICAgIAotICAgIHJldHVybiBmYWxzZTsKLX0KLQogdm9pZCBKSVRDb2RlR2VuZXJhdG9yOjpu
b25TcGVjdWxhdGl2ZVBlZXBob2xlU3RyaWN0RXEoTm9kZSYgbm9kZSwgTm9kZUluZGV4IGJyYW5j
aE5vZGVJbmRleCwgYm9vbCBpbnZlcnQpCiB7CiAgICAgTm9kZSYgYnJhbmNoTm9kZSA9IG1faml0
LmdyYXBoKClbYnJhbmNoTm9kZUluZGV4XTsKQEAgLTE4MDMsMjcgKzE1MTUsNiBAQCB2b2lkIEpJ
VENvZGVHZW5lcmF0b3I6Om5vblNwZWN1bGF0aXZlTm9uCiAgICAganNWYWx1ZVJlc3VsdChyZXN1
bHRUYWdHUFIsIHJlc3VsdFBheWxvYWRHUFIsIG1fY29tcGlsZUluZGV4LCBEYXRhRm9ybWF0SlNC
b29sZWFuLCBVc2VDaGlsZHJlbkNhbGxlZEV4cGxpY2l0bHkpOwogfQogCi1ib29sIEpJVENvZGVH
ZW5lcmF0b3I6Om5vblNwZWN1bGF0aXZlU3RyaWN0RXEoTm9kZSYgbm9kZSwgYm9vbCBpbnZlcnQp
Ci17Ci0gICAgaWYgKCFpbnZlcnQgJiYgKGlzS25vd25OdW1lcmljKG5vZGUuY2hpbGQxKCkpIHx8
IGlzS25vd25OdW1lcmljKG5vZGUuY2hpbGQyKCkpKSkKLSAgICAgICAgcmV0dXJuIG5vblNwZWN1
bGF0aXZlQ29tcGFyZShub2RlLCBNYWNyb0Fzc2VtYmxlcjo6RXF1YWwsIG9wZXJhdGlvbkNvbXBh
cmVTdHJpY3RFcSk7Ci0gICAgCi0gICAgTm9kZUluZGV4IGJyYW5jaE5vZGVJbmRleCA9IGRldGVj
dFBlZXBIb2xlQnJhbmNoKCk7Ci0gICAgaWYgKGJyYW5jaE5vZGVJbmRleCAhPSBOb05vZGUpIHsK
LSAgICAgICAgQVNTRVJUKG5vZGUuYWRqdXN0ZWRSZWZDb3VudCgpID09IDEpOwotICAgICAgICAK
LSAgICAgICAgbm9uU3BlY3VsYXRpdmVQZWVwaG9sZVN0cmljdEVxKG5vZGUsIGJyYW5jaE5vZGVJ
bmRleCwgaW52ZXJ0KTsKLSAgICAKLSAgICAgICAgbV9jb21waWxlSW5kZXggPSBicmFuY2hOb2Rl
SW5kZXg7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAg
bm9uU3BlY3VsYXRpdmVOb25QZWVwaG9sZVN0cmljdEVxKG5vZGUsIGludmVydCk7Ci0gICAgCi0g
ICAgcmV0dXJuIGZhbHNlOwotfQotCiB2b2lkIEpJVENvZGVHZW5lcmF0b3I6OmVtaXRCcmFuY2go
Tm9kZSYgbm9kZSkKIHsKICAgICAvLyBGSVhNRTogQWRkIGZhc3QgY2FzZXMgZm9yIGtub3duIEJv
b2xlYW4hCkBAIC0xOTAyLDM0NSArMTU5Myw4IEBAIHZvaWQgTk9fUkVUVVJOIEpJVENvZGVHZW5l
cmF0b3I6OmVtaXRDYWwKICAgICBVTlVTRURfUEFSQU0obm9kZSk7CiB9CiAKLXZvaWQgSklUQ29k
ZUdlbmVyYXRvcjo6c3BlY3VsYXRpb25DaGVjayhNYWNyb0Fzc2VtYmxlcjo6SnVtcCBqdW1wVG9G
YWlsKQotewotICAgIEFTU0VSVChtX2lzU3BlY3VsYXRpdmUpOwotICAgIHN0YXRpY19jYXN0PFNw
ZWN1bGF0aXZlSklUKj4odGhpcyktPnNwZWN1bGF0aW9uQ2hlY2soanVtcFRvRmFpbCk7Ci19Ci0K
LSNpZm5kZWYgTkRFQlVHCi1zdGF0aWMgY29uc3QgY2hhciogZGF0YUZvcm1hdFN0cmluZyhEYXRh
Rm9ybWF0IGZvcm1hdCkKLXsKLSAgICAvLyBUaGVzZSB2YWx1ZXMgY29ycmVzcG9uZCB0byB0aGUg
RGF0YUZvcm1hdCBlbnVtLgotICAgIGNvbnN0IGNoYXIqIHN0cmluZ3NbXSA9IHsKLSAgICAgICAg
IlsgIF0iLAotICAgICAgICAiWyBpXSIsCi0gICAgICAgICJbIGRdIiwKLSAgICAgICAgIlsgY10i
LAotICAgICAgICAiRXJyISIsCi0gICAgICAgICJFcnIhIiwKLSAgICAgICAgIkVyciEiLAotICAg
ICAgICAiRXJyISIsCi0gICAgICAgICJbSiBdIiwKLSAgICAgICAgIltKaV0iLAotICAgICAgICAi
W0pkXSIsCi0gICAgICAgICJbSmNdIiwKLSAgICAgICAgIkVyciEiLAotICAgICAgICAiRXJyISIs
Ci0gICAgICAgICJFcnIhIiwKLSAgICAgICAgIkVyciEiLAotICAgIH07Ci0gICAgcmV0dXJuIHN0
cmluZ3NbZm9ybWF0XTsKLX0KLQotdm9pZCBKSVRDb2RlR2VuZXJhdG9yOjpkdW1wKGNvbnN0IGNo
YXIqIGxhYmVsKQotewotICAgIGlmIChsYWJlbCkKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICI8
JXM+XG4iLCBsYWJlbCk7Ci0KLSAgICBmcHJpbnRmKHN0ZGVyciwgIiAgZ3ByczpcbiIpOwotICAg
IG1fZ3Bycy5kdW1wKCk7Ci0gICAgZnByaW50ZihzdGRlcnIsICIgIGZwcnM6XG4iKTsKLSAgICBt
X2ZwcnMuZHVtcCgpOwotICAgIGZwcmludGYoc3RkZXJyLCAiICBWaXJ0dWFsUmVnaXN0ZXJzOlxu
Iik7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG1fZ2VuZXJhdGlvbkluZm8uc2l6ZSgp
OyArK2kpIHsKLSAgICAgICAgR2VuZXJhdGlvbkluZm8mIGluZm8gPSBtX2dlbmVyYXRpb25JbmZv
W2ldOwotICAgICAgICBpZiAoaW5mby5hbGl2ZSgpKQotICAgICAgICAgICAgZnByaW50ZihzdGRl
cnIsICIgICAgJSAzZDolcyVzIiwgaSwgZGF0YUZvcm1hdFN0cmluZyhpbmZvLnJlZ2lzdGVyRm9y
bWF0KCkpLCBkYXRhRm9ybWF0U3RyaW5nKGluZm8uc3BpbGxGb3JtYXQoKSkpOwotICAgICAgICBl
bHNlCi0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAlIDNkOltfX11bX19dIiwgaSk7
Ci0gICAgICAgIGlmIChpbmZvLnJlZ2lzdGVyRm9ybWF0KCkgPT0gRGF0YUZvcm1hdERvdWJsZSkK
LSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiOmZwciVkXG4iLCBpbmZvLmZwcigpKTsKLSAg
ICAgICAgZWxzZSBpZiAoaW5mby5yZWdpc3RlckZvcm1hdCgpICE9IERhdGFGb3JtYXROb25lICYm
ICEoaW5mby5yZWdpc3RlckZvcm1hdCgpICYgRGF0YUZvcm1hdEpTKSkgewotICAgICAgICAgICAg
QVNTRVJUKGluZm8uZ3ByKCkgIT0gSW52YWxpZEdQUlJlZyk7Ci0gICAgICAgICAgICBmcHJpbnRm
KHN0ZGVyciwgIjolc1xuIiwgR1BSSW5mbzo6ZGVidWdOYW1lKGluZm8uZ3ByKCkpKTsKLSAgICAg
ICAgfSBlbHNlCi0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7Ci0gICAgfQotICAg
IGlmIChsYWJlbCkKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICI8LyVzPlxuIiwgbGFiZWwpOwot
fQogI2VuZGlmCiAKLQotI2lmIEVOQUJMRShERkdfQ09OU0lTVEVOQ1lfQ0hFQ0spCi12b2lkIEpJ
VENvZGVHZW5lcmF0b3I6OmNoZWNrQ29uc2lzdGVuY3koKQotewotICAgIGJvb2wgZmFpbGVkID0g
ZmFsc2U7Ci0KLSAgICBmb3IgKGdwcl9pdGVyYXRvciBpdGVyID0gbV9ncHJzLmJlZ2luKCk7IGl0
ZXIgIT0gbV9ncHJzLmVuZCgpOyArK2l0ZXIpIHsKLSAgICAgICAgaWYgKGl0ZXIuaXNMb2NrZWQo
KSkgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJERkdfQ09OU0lTVEVOQ1lfQ0hFQ0sg
ZmFpbGVkOiBncHIgJXMgaXMgbG9ja2VkLlxuIiwgaXRlci5kZWJ1Z05hbWUoKSk7Ci0gICAgICAg
ICAgICBmYWlsZWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQotICAgIGZvciAoZnByX2l0ZXJh
dG9yIGl0ZXIgPSBtX2ZwcnMuYmVnaW4oKTsgaXRlciAhPSBtX2ZwcnMuZW5kKCk7ICsraXRlcikg
ewotICAgICAgICBpZiAoaXRlci5pc0xvY2tlZCgpKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0
ZGVyciwgIkRGR19DT05TSVNURU5DWV9DSEVDSyBmYWlsZWQ6IGZwciAlcyBpcyBsb2NrZWQuXG4i
LCBpdGVyLmRlYnVnTmFtZSgpKTsKLSAgICAgICAgICAgIGZhaWxlZCA9IHRydWU7Ci0gICAgICAg
IH0KLSAgICB9Ci0KLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbV9nZW5lcmF0aW9uSW5m
by5zaXplKCk7ICsraSkgewotICAgICAgICBWaXJ0dWFsUmVnaXN0ZXIgdmlydHVhbFJlZ2lzdGVy
ID0gKFZpcnR1YWxSZWdpc3RlcilpOwotICAgICAgICBHZW5lcmF0aW9uSW5mbyYgaW5mbyA9IG1f
Z2VuZXJhdGlvbkluZm9bdmlydHVhbFJlZ2lzdGVyXTsKLSAgICAgICAgaWYgKCFpbmZvLmFsaXZl
KCkpCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgc3dpdGNoIChpbmZvLnJlZ2lzdGVy
Rm9ybWF0KCkpIHsKLSAgICAgICAgY2FzZSBEYXRhRm9ybWF0Tm9uZToKLSAgICAgICAgY2FzZSBE
YXRhRm9ybWF0SlM6Ci0gICAgICAgIGNhc2UgRGF0YUZvcm1hdEpTSW50ZWdlcjoKLSAgICAgICAg
Y2FzZSBEYXRhRm9ybWF0SlNEb3VibGU6Ci0gICAgICAgIGNhc2UgRGF0YUZvcm1hdEpTQ2VsbDoK
LSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIERhdGFGb3JtYXRJbnRlZ2VyOgotICAg
ICAgICBjYXNlIERhdGFGb3JtYXRDZWxsOiB7Ci0gICAgICAgICAgICBHUFJSZWcgZ3ByID0gaW5m
by5ncHIoKTsKLSAgICAgICAgICAgIEFTU0VSVChncHIgIT0gSW52YWxpZEdQUlJlZyk7Ci0gICAg
ICAgICAgICBpZiAobV9ncHJzLm5hbWUoZ3ByKSAhPSB2aXJ0dWFsUmVnaXN0ZXIpIHsKLSAgICAg
ICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkRGR19DT05TSVNURU5DWV9DSEVDSyBmYWlsZWQ6
IG5hbWUgbWlzbWF0Y2ggZm9yIHZpcnR1YWwgcmVnaXN0ZXIgJWQgKGdwciAlcykuXG4iLCB2aXJ0
dWFsUmVnaXN0ZXIsIEdQUkluZm86OmRlYnVnTmFtZShncHIpKTsKLSAgICAgICAgICAgICAgICBm
YWlsZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAg
IH0KLSAgICAgICAgY2FzZSBEYXRhRm9ybWF0RG91YmxlOiB7Ci0gICAgICAgICAgICBGUFJSZWcg
ZnByID0gaW5mby5mcHIoKTsKLSAgICAgICAgICAgIEFTU0VSVChmcHIgIT0gSW52YWxpZEZQUlJl
Zyk7Ci0gICAgICAgICAgICBpZiAobV9mcHJzLm5hbWUoZnByKSAhPSB2aXJ0dWFsUmVnaXN0ZXIp
IHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkRGR19DT05TSVNURU5DWV9DSEVD
SyBmYWlsZWQ6IG5hbWUgbWlzbWF0Y2ggZm9yIHZpcnR1YWwgcmVnaXN0ZXIgJWQgKGZwciAlcyku
XG4iLCB2aXJ0dWFsUmVnaXN0ZXIsIEZQUkluZm86OmRlYnVnTmFtZShmcHIpKTsKLSAgICAgICAg
ICAgICAgICBmYWlsZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7
Ci0gICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGZvciAoZ3ByX2l0ZXJhdG9yIGl0
ZXIgPSBtX2dwcnMuYmVnaW4oKTsgaXRlciAhPSBtX2dwcnMuZW5kKCk7ICsraXRlcikgewotICAg
ICAgICBWaXJ0dWFsUmVnaXN0ZXIgdmlydHVhbFJlZ2lzdGVyID0gaXRlci5uYW1lKCk7Ci0gICAg
ICAgIGlmICh2aXJ0dWFsUmVnaXN0ZXIgPT0gSW52YWxpZFZpcnR1YWxSZWdpc3RlcikKLSAgICAg
ICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIEdlbmVyYXRpb25JbmZvJiBpbmZvID0gbV9nZW5l
cmF0aW9uSW5mb1t2aXJ0dWFsUmVnaXN0ZXJdOwotICAgICAgICBpZiAoIShpbmZvLnJlZ2lzdGVy
Rm9ybWF0KCkgJiBEYXRhRm9ybWF0SlMpKSB7Ci0gICAgICAgICAgICBpZiAoaXRlci5yZWdJRCgp
ICE9IGluZm8uZ3ByKCkpIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkRGR19D
T05TSVNURU5DWV9DSEVDSyBmYWlsZWQ6IG5hbWUgbWlzbWF0Y2ggZm9yIGdwciAlcyAodmlydHVh
bCByZWdpc3RlciAlZCkuXG4iLCBpdGVyLmRlYnVnTmFtZSgpLCB2aXJ0dWFsUmVnaXN0ZXIpOwot
ICAgICAgICAgICAgICAgIGZhaWxlZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0g
ZWxzZSB7Ci0gICAgICAgICAgICBpZiAoaXRlci5yZWdJRCgpICE9IGluZm8udGFnR1BSKCkgJiYg
aXRlci5yZWdJRCgpICE9IGluZm8ucGF5bG9hZEdQUigpKSB7Ci0gICAgICAgICAgICAgICAgZnBy
aW50ZihzdGRlcnIsICJERkdfQ09OU0lTVEVOQ1lfQ0hFQ0sgZmFpbGVkOiBuYW1lIG1pc21hdGNo
IGZvciBncHIgJXMgKHZpcnR1YWwgcmVnaXN0ZXIgJWQpLlxuIiwgaXRlci5kZWJ1Z05hbWUoKSwg
dmlydHVhbFJlZ2lzdGVyKTsKLSAgICAgICAgICAgICAgICBmYWlsZWQgPSB0cnVlOwotICAgICAg
ICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm9yIChmcHJfaXRlcmF0b3IgaXRlciA9
IG1fZnBycy5iZWdpbigpOyBpdGVyICE9IG1fZnBycy5lbmQoKTsgKytpdGVyKSB7Ci0gICAgICAg
IFZpcnR1YWxSZWdpc3RlciB2aXJ0dWFsUmVnaXN0ZXIgPSBpdGVyLm5hbWUoKTsKLSAgICAgICAg
aWYgKHZpcnR1YWxSZWdpc3RlciA9PSBJbnZhbGlkVmlydHVhbFJlZ2lzdGVyKQotICAgICAgICAg
ICAgY29udGludWU7Ci0KLSAgICAgICAgR2VuZXJhdGlvbkluZm8mIGluZm8gPSBtX2dlbmVyYXRp
b25JbmZvW3ZpcnR1YWxSZWdpc3Rlcl07Ci0gICAgICAgIGlmIChpdGVyLnJlZ0lEKCkgIT0gaW5m
by5mcHIoKSkgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJERkdfQ09OU0lTVEVOQ1lf
Q0hFQ0sgZmFpbGVkOiBuYW1lIG1pc21hdGNoIGZvciBmcHIgJXMgKHZpcnR1YWwgcmVnaXN0ZXIg
JWQpLlxuIiwgaXRlci5kZWJ1Z05hbWUoKSwgdmlydHVhbFJlZ2lzdGVyKTsKLSAgICAgICAgICAg
IGZhaWxlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoZmFpbGVkKSB7Ci0g
ICAgICAgIGR1bXAoKTsKLSAgICAgICAgQ1JBU0goKTsKLSAgICB9Ci19Ci0jZW5kaWYKLQotR1BS
VGVtcG9yYXJ5OjpHUFJUZW1wb3JhcnkoKQotICAgIDogbV9qaXQoMCkKLSAgICAsIG1fZ3ByKElu
dmFsaWRHUFJSZWcpCi17Ci19Ci0KLUdQUlRlbXBvcmFyeTo6R1BSVGVtcG9yYXJ5KEpJVENvZGVH
ZW5lcmF0b3IqIGppdCkKLSAgICA6IG1faml0KGppdCkKLSAgICAsIG1fZ3ByKEludmFsaWRHUFJS
ZWcpCi17Ci0gICAgLy8gd2UgY3VycmVudHkgbGF6aWx5IGFsbG9jYXRlIHRoZSByZWcsIGFzIHRo
ZSBudW1iZXIgb2YgcmVncyBvbiBYODYgaXMgbGltaXRlZC4KLX0KLQotR1BSVGVtcG9yYXJ5OjpH
UFJUZW1wb3JhcnkoSklUQ29kZUdlbmVyYXRvciogaml0LCBHUFJSZWcgc3BlY2lmaWMpCi0gICAg
OiBtX2ppdChqaXQpCi0gICAgLCBtX2dwcihJbnZhbGlkR1BSUmVnKQotewotICAgIG1fZ3ByID0g
bV9qaXQtPmFsbG9jYXRlKHNwZWNpZmljKTsKLX0KLQotR1BSVGVtcG9yYXJ5OjpHUFJUZW1wb3Jh
cnkoSklUQ29kZUdlbmVyYXRvciogaml0LCBTcGVjdWxhdGVJbnRlZ2VyT3BlcmFuZCYgb3AxKQot
ICAgIDogbV9qaXQoaml0KQotICAgICwgbV9ncHIoSW52YWxpZEdQUlJlZykKLXsKLSAgICBpZiAo
bV9qaXQtPmNhblJldXNlKG9wMS5pbmRleCgpKSkKLSAgICAgICAgbV9ncHIgPSBtX2ppdC0+cmV1
c2Uob3AxLmdwcigpKTsKLSAgICBlbHNlCi0gICAgICAgIG1fZ3ByID0gbV9qaXQtPmFsbG9jYXRl
KCk7Ci19Ci0KLUdQUlRlbXBvcmFyeTo6R1BSVGVtcG9yYXJ5KEpJVENvZGVHZW5lcmF0b3IqIGpp
dCwgU3BlY3VsYXRlSW50ZWdlck9wZXJhbmQmIG9wMSwgU3BlY3VsYXRlSW50ZWdlck9wZXJhbmQm
IG9wMikKLSAgICA6IG1faml0KGppdCkKLSAgICAsIG1fZ3ByKEludmFsaWRHUFJSZWcpCi17Ci0g
ICAgaWYgKG1faml0LT5jYW5SZXVzZShvcDEuaW5kZXgoKSkpCi0gICAgICAgIG1fZ3ByID0gbV9q
aXQtPnJldXNlKG9wMS5ncHIoKSk7Ci0gICAgZWxzZSBpZiAobV9qaXQtPmNhblJldXNlKG9wMi5p
bmRleCgpKSkKLSAgICAgICAgbV9ncHIgPSBtX2ppdC0+cmV1c2Uob3AyLmdwcigpKTsKLSAgICBl
bHNlCi0gICAgICAgIG1fZ3ByID0gbV9qaXQtPmFsbG9jYXRlKCk7Ci19Ci0KLUdQUlRlbXBvcmFy
eTo6R1BSVGVtcG9yYXJ5KEpJVENvZGVHZW5lcmF0b3IqIGppdCwgU3BlY3VsYXRlU3RyaWN0SW50
MzJPcGVyYW5kJiBvcDEpCi0gICAgOiBtX2ppdChqaXQpCi0gICAgLCBtX2dwcihJbnZhbGlkR1BS
UmVnKQotewotICAgIGlmIChtX2ppdC0+Y2FuUmV1c2Uob3AxLmluZGV4KCkpKQotICAgICAgICBt
X2dwciA9IG1faml0LT5yZXVzZShvcDEuZ3ByKCkpOwotICAgIGVsc2UKLSAgICAgICAgbV9ncHIg
PSBtX2ppdC0+YWxsb2NhdGUoKTsKLX0KLQotR1BSVGVtcG9yYXJ5OjpHUFJUZW1wb3JhcnkoSklU
Q29kZUdlbmVyYXRvciogaml0LCBJbnRlZ2VyT3BlcmFuZCYgb3AxKQotICAgIDogbV9qaXQoaml0
KQotICAgICwgbV9ncHIoSW52YWxpZEdQUlJlZykKLXsKLSAgICBpZiAobV9qaXQtPmNhblJldXNl
KG9wMS5pbmRleCgpKSkKLSAgICAgICAgbV9ncHIgPSBtX2ppdC0+cmV1c2Uob3AxLmdwcigpKTsK
LSAgICBlbHNlCi0gICAgICAgIG1fZ3ByID0gbV9qaXQtPmFsbG9jYXRlKCk7Ci19Ci0KLUdQUlRl
bXBvcmFyeTo6R1BSVGVtcG9yYXJ5KEpJVENvZGVHZW5lcmF0b3IqIGppdCwgSW50ZWdlck9wZXJh
bmQmIG9wMSwgSW50ZWdlck9wZXJhbmQmIG9wMikKLSAgICA6IG1faml0KGppdCkKLSAgICAsIG1f
Z3ByKEludmFsaWRHUFJSZWcpCi17Ci0gICAgaWYgKG1faml0LT5jYW5SZXVzZShvcDEuaW5kZXgo
KSkpCi0gICAgICAgIG1fZ3ByID0gbV9qaXQtPnJldXNlKG9wMS5ncHIoKSk7Ci0gICAgZWxzZSBp
ZiAobV9qaXQtPmNhblJldXNlKG9wMi5pbmRleCgpKSkKLSAgICAgICAgbV9ncHIgPSBtX2ppdC0+
cmV1c2Uob3AyLmdwcigpKTsKLSAgICBlbHNlCi0gICAgICAgIG1fZ3ByID0gbV9qaXQtPmFsbG9j
YXRlKCk7Ci19Ci0KLUdQUlRlbXBvcmFyeTo6R1BSVGVtcG9yYXJ5KEpJVENvZGVHZW5lcmF0b3Iq
IGppdCwgU3BlY3VsYXRlQ2VsbE9wZXJhbmQmIG9wMSkKLSAgICA6IG1faml0KGppdCkKLSAgICAs
IG1fZ3ByKEludmFsaWRHUFJSZWcpCi17Ci0gICAgaWYgKG1faml0LT5jYW5SZXVzZShvcDEuaW5k
ZXgoKSkpCi0gICAgICAgIG1fZ3ByID0gbV9qaXQtPnJldXNlKG9wMS5ncHIoKSk7Ci0gICAgZWxz
ZQotICAgICAgICBtX2dwciA9IG1faml0LT5hbGxvY2F0ZSgpOwotfQotCi1HUFJUZW1wb3Jhcnk6
OkdQUlRlbXBvcmFyeShKSVRDb2RlR2VuZXJhdG9yKiBqaXQsIFNwZWN1bGF0ZUJvb2xlYW5PcGVy
YW5kJiBvcDEpCi0gICAgOiBtX2ppdChqaXQpCi0gICAgLCBtX2dwcihJbnZhbGlkR1BSUmVnKQot
ewotICAgIGlmIChtX2ppdC0+Y2FuUmV1c2Uob3AxLmluZGV4KCkpKQotICAgICAgICBtX2dwciA9
IG1faml0LT5yZXVzZShvcDEuZ3ByKCkpOwotICAgIGVsc2UKLSAgICAgICAgbV9ncHIgPSBtX2pp
dC0+YWxsb2NhdGUoKTsKLX0KLQotR1BSVGVtcG9yYXJ5OjpHUFJUZW1wb3JhcnkoSklUQ29kZUdl
bmVyYXRvciogaml0LCBKU1ZhbHVlT3BlcmFuZCYgb3AxLCBib29sIHRhZykKLSAgICA6IG1faml0
KGppdCkKLSAgICAsIG1fZ3ByKEludmFsaWRHUFJSZWcpCi17Ci0gICAgaWYgKCFvcDEuaXNEb3Vi
bGUoKSAmJiBtX2ppdC0+Y2FuUmV1c2Uob3AxLmluZGV4KCkpKQotICAgICAgICBtX2dwciA9IG1f
aml0LT5yZXVzZSh0YWcgPyBvcDEudGFnR1BSKCkgOiBvcDEucGF5bG9hZEdQUigpKTsKLSAgICBl
bHNlCi0gICAgICAgIG1fZ3ByID0gbV9qaXQtPmFsbG9jYXRlKCk7Ci19Ci0KLUdQUlRlbXBvcmFy
eTo6R1BSVGVtcG9yYXJ5KEpJVENvZGVHZW5lcmF0b3IqIGppdCwgU3RvcmFnZU9wZXJhbmQmIG9w
MSkKLSAgICA6IG1faml0KGppdCkKLSAgICAsIG1fZ3ByKEludmFsaWRHUFJSZWcpCi17Ci0gICAg
aWYgKG1faml0LT5jYW5SZXVzZShvcDEuaW5kZXgoKSkpCi0gICAgICAgIG1fZ3ByID0gbV9qaXQt
PnJldXNlKG9wMS5ncHIoKSk7Ci0gICAgZWxzZQotICAgICAgICBtX2dwciA9IG1faml0LT5hbGxv
Y2F0ZSgpOwotfQotCi12b2lkIEdQUlRlbXBvcmFyeTo6YWRvcHQoR1BSVGVtcG9yYXJ5JiBvdGhl
cikKLXsKLSAgICBBU1NFUlQoIW1faml0KTsKLSAgICBBU1NFUlQobV9ncHIgPT0gSW52YWxpZEdQ
UlJlZyk7Ci0gICAgQVNTRVJUKG90aGVyLm1faml0KTsKLSAgICBBU1NFUlQob3RoZXIubV9ncHIg
IT0gSW52YWxpZEdQUlJlZyk7Ci0gICAgbV9qaXQgPSBvdGhlci5tX2ppdDsKLSAgICBtX2dwciA9
IG90aGVyLm1fZ3ByOwotICAgIG90aGVyLm1faml0ID0gMDsKLSAgICBvdGhlci5tX2dwciA9IElu
dmFsaWRHUFJSZWc7Ci19Ci0KLUZQUlRlbXBvcmFyeTo6RlBSVGVtcG9yYXJ5KEpJVENvZGVHZW5l
cmF0b3IqIGppdCkKLSAgICA6IG1faml0KGppdCkKLSAgICAsIG1fZnByKEludmFsaWRGUFJSZWcp
Ci17Ci0gICAgbV9mcHIgPSBtX2ppdC0+ZnByQWxsb2NhdGUoKTsKLX0KLQotRlBSVGVtcG9yYXJ5
OjpGUFJUZW1wb3JhcnkoSklUQ29kZUdlbmVyYXRvciogaml0LCBEb3VibGVPcGVyYW5kJiBvcDEp
Ci0gICAgOiBtX2ppdChqaXQpCi0gICAgLCBtX2ZwcihJbnZhbGlkRlBSUmVnKQotewotICAgIGlm
IChtX2ppdC0+Y2FuUmV1c2Uob3AxLmluZGV4KCkpKQotICAgICAgICBtX2ZwciA9IG1faml0LT5y
ZXVzZShvcDEuZnByKCkpOwotICAgIGVsc2UKLSAgICAgICAgbV9mcHIgPSBtX2ppdC0+ZnByQWxs
b2NhdGUoKTsKLX0KLQotRlBSVGVtcG9yYXJ5OjpGUFJUZW1wb3JhcnkoSklUQ29kZUdlbmVyYXRv
ciogaml0LCBEb3VibGVPcGVyYW5kJiBvcDEsIERvdWJsZU9wZXJhbmQmIG9wMikKLSAgICA6IG1f
aml0KGppdCkKLSAgICAsIG1fZnByKEludmFsaWRGUFJSZWcpCi17Ci0gICAgaWYgKG1faml0LT5j
YW5SZXVzZShvcDEuaW5kZXgoKSkpCi0gICAgICAgIG1fZnByID0gbV9qaXQtPnJldXNlKG9wMS5m
cHIoKSk7Ci0gICAgZWxzZSBpZiAobV9qaXQtPmNhblJldXNlKG9wMi5pbmRleCgpKSkKLSAgICAg
ICAgbV9mcHIgPSBtX2ppdC0+cmV1c2Uob3AyLmZwcigpKTsKLSAgICBlbHNlCi0gICAgICAgIG1f
ZnByID0gbV9qaXQtPmZwckFsbG9jYXRlKCk7Ci19Ci0KLUZQUlRlbXBvcmFyeTo6RlBSVGVtcG9y
YXJ5KEpJVENvZGVHZW5lcmF0b3IqIGppdCwgU3BlY3VsYXRlRG91YmxlT3BlcmFuZCYgb3AxKQot
ICAgIDogbV9qaXQoaml0KQotICAgICwgbV9mcHIoSW52YWxpZEZQUlJlZykKLXsKLSAgICBpZiAo
bV9qaXQtPmNhblJldXNlKG9wMS5pbmRleCgpKSkKLSAgICAgICAgbV9mcHIgPSBtX2ppdC0+cmV1
c2Uob3AxLmZwcigpKTsKLSAgICBlbHNlCi0gICAgICAgIG1fZnByID0gbV9qaXQtPmZwckFsbG9j
YXRlKCk7Ci19Ci0KLUZQUlRlbXBvcmFyeTo6RlBSVGVtcG9yYXJ5KEpJVENvZGVHZW5lcmF0b3Iq
IGppdCwgU3BlY3VsYXRlRG91YmxlT3BlcmFuZCYgb3AxLCBTcGVjdWxhdGVEb3VibGVPcGVyYW5k
JiBvcDIpCi0gICAgOiBtX2ppdChqaXQpCi0gICAgLCBtX2ZwcihJbnZhbGlkRlBSUmVnKQotewot
ICAgIGlmIChtX2ppdC0+Y2FuUmV1c2Uob3AxLmluZGV4KCkpKQotICAgICAgICBtX2ZwciA9IG1f
aml0LT5yZXVzZShvcDEuZnByKCkpOwotICAgIGVsc2UgaWYgKG1faml0LT5jYW5SZXVzZShvcDIu
aW5kZXgoKSkpCi0gICAgICAgIG1fZnByID0gbV9qaXQtPnJldXNlKG9wMi5mcHIoKSk7Ci0gICAg
ZWxzZQotICAgICAgICBtX2ZwciA9IG1faml0LT5mcHJBbGxvY2F0ZSgpOwotfQotCi1GUFJUZW1w
b3Jhcnk6OkZQUlRlbXBvcmFyeShKSVRDb2RlR2VuZXJhdG9yKiBqaXQsIEpTVmFsdWVPcGVyYW5k
JiBvcDEpCi0gICAgOiBtX2ppdChqaXQpCi0gICAgLCBtX2ZwcihJbnZhbGlkRlBSUmVnKQotewot
ICAgIGlmIChvcDEuaXNEb3VibGUoKSAmJiBtX2ppdC0+Y2FuUmV1c2Uob3AxLmluZGV4KCkpKQot
ICAgICAgICBtX2ZwciA9IG1faml0LT5yZXVzZShvcDEuZnByKCkpOwotICAgIGVsc2UKLSAgICAg
ICAgbV9mcHIgPSBtX2ppdC0+ZnByQWxsb2NhdGUoKTsKLX0KLQogfSB9IC8vIG5hbWVzcGFjZSBK
U0M6OkRGRwogCiAjZW5kaWYKLSNlbmRpZgpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2Rm
Zy9ERkdKSVRDb2RlR2VuZXJhdG9yNjQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9kZmcvREZHSklUQ29kZUdlbmVyYXRvcjY0LmNwcAkocmV2aXNpb24gOTYzNjMpCShm
cm9tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHSklUQ29kZUdlbmVyYXRvci5jcHA6OTYz
NjMpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0pJVENvZGVHZW5lcmF0b3I2NC5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwyMjc0IEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDExIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkK
KyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExP
U1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRl
ICJERkdKSVRDb2RlR2VuZXJhdG9yLmgiCisKKyNpZiBFTkFCTEUoREZHX0pJVCkKKyNpZiBVU0Uo
SlNWQUxVRTY0KQorCisjaW5jbHVkZSAiREZHU3BlY3VsYXRpdmVKSVQuaCIKKyNpbmNsdWRlICJM
aW5rQnVmZmVyLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgREZHIHsKKworY29uc3Qg
ZG91YmxlIEpJVENvZGVHZW5lcmF0b3I6OnR3b1RvVGhlMzIgPSAoZG91YmxlKTB4MTAwMDAwMDAw
dWxsOworCit2b2lkIEpJVENvZGVHZW5lcmF0b3I6OmNsZWFyR2VuZXJhdGlvbkluZm8oKQorewor
ICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBtX2dlbmVyYXRpb25JbmZvLnNpemUoKTsgKytp
KQorICAgICAgICBtX2dlbmVyYXRpb25JbmZvW2ldID0gR2VuZXJhdGlvbkluZm8oKTsKKyAgICBt
X2dwcnMgPSBSZWdpc3RlckJhbms8R1BSSW5mbz4oKTsKKyAgICBtX2ZwcnMgPSBSZWdpc3RlckJh
bms8RlBSSW5mbz4oKTsKK30KKworR1BSUmVnIEpJVENvZGVHZW5lcmF0b3I6OmZpbGxJbnRlZ2Vy
KE5vZGVJbmRleCBub2RlSW5kZXgsIERhdGFGb3JtYXQmIHJldHVybkZvcm1hdCkKK3sKKyAgICBO
b2RlJiBub2RlID0gbV9qaXQuZ3JhcGgoKVtub2RlSW5kZXhdOworICAgIFZpcnR1YWxSZWdpc3Rl
ciB2aXJ0dWFsUmVnaXN0ZXIgPSBub2RlLnZpcnR1YWxSZWdpc3RlcigpOworICAgIEdlbmVyYXRp
b25JbmZvJiBpbmZvID0gbV9nZW5lcmF0aW9uSW5mb1t2aXJ0dWFsUmVnaXN0ZXJdOworCisgICAg
aWYgKGluZm8ucmVnaXN0ZXJGb3JtYXQoKSA9PSBEYXRhRm9ybWF0Tm9uZSkgeworICAgICAgICBH
UFJSZWcgZ3ByID0gYWxsb2NhdGUoKTsKKworICAgICAgICBpZiAobm9kZS5oYXNDb25zdGFudCgp
KSB7CisgICAgICAgICAgICBtX2dwcnMucmV0YWluKGdwciwgdmlydHVhbFJlZ2lzdGVyLCBTcGls
bE9yZGVyQ29uc3RhbnQpOworICAgICAgICAgICAgaWYgKGlzSW50MzJDb25zdGFudChub2RlSW5k
ZXgpKSB7CisgICAgICAgICAgICAgICAgbV9qaXQubW92ZShNYWNyb0Fzc2VtYmxlcjo6SW1tMzIo
dmFsdWVPZkludDMyQ29uc3RhbnQobm9kZUluZGV4KSksIGdwcik7CisgICAgICAgICAgICAgICAg
aW5mby5maWxsSW50ZWdlcihncHIpOworICAgICAgICAgICAgICAgIHJldHVybkZvcm1hdCA9IERh
dGFGb3JtYXRJbnRlZ2VyOworICAgICAgICAgICAgICAgIHJldHVybiBncHI7CisgICAgICAgICAg
ICB9CisgICAgICAgICAgICBpZiAoaXNOdW1iZXJDb25zdGFudChub2RlSW5kZXgpKSB7CisgICAg
ICAgICAgICAgICAgSlNWYWx1ZSBqc1ZhbHVlID0ganNOdW1iZXIodmFsdWVPZk51bWJlckNvbnN0
YW50KG5vZGVJbmRleCkpOworICAgICAgICAgICAgICAgIG1faml0Lm1vdmUoTWFjcm9Bc3NlbWJs
ZXI6OkltbVB0cihKU1ZhbHVlOjplbmNvZGUoanNWYWx1ZSkpLCBncHIpOworICAgICAgICAgICAg
fSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBU1NFUlQoaXNKU0NvbnN0YW50KG5vZGVJbmRleCkp
OworICAgICAgICAgICAgICAgIEpTVmFsdWUganNWYWx1ZSA9IHZhbHVlT2ZKU0NvbnN0YW50KG5v
ZGVJbmRleCk7CisgICAgICAgICAgICAgICAgbV9qaXQubW92ZShNYWNyb0Fzc2VtYmxlcjo6SW1t
UHRyKEpTVmFsdWU6OmVuY29kZShqc1ZhbHVlKSksIGdwcik7CisgICAgICAgICAgICB9CisgICAg
ICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBU1NFUlQoaW5mby5zcGlsbEZvcm1hdCgpID09IERh
dGFGb3JtYXRKUyB8fCBpbmZvLnNwaWxsRm9ybWF0KCkgPT0gRGF0YUZvcm1hdEpTSW50ZWdlcik7
CisgICAgICAgICAgICBtX2dwcnMucmV0YWluKGdwciwgdmlydHVhbFJlZ2lzdGVyLCBTcGlsbE9y
ZGVyU3BpbGxlZCk7CisgICAgICAgICAgICBtX2ppdC5sb2FkUHRyKEpJVENvbXBpbGVyOjphZGRy
ZXNzRm9yKHZpcnR1YWxSZWdpc3RlciksIGdwcik7CisgICAgICAgIH0KKworICAgICAgICAvLyBT
aW5jZSB3ZSBzdGF0aWNhbGx5IGtub3cgdGhhdCB3ZSdyZSBmaWxsaW5nIGFuIGludGVnZXIsIGFu
ZCB2YWx1ZXMKKyAgICAgICAgLy8gaW4gdGhlIFJlZ2lzdGVyRmlsZSBhcmUgYm94ZWQsIHRoaXMg
bXVzdCBiZSBEYXRhRm9ybWF0SlNJbnRlZ2VyLgorICAgICAgICAvLyBXZSB3aWxsIGNoZWNrIHRo
aXMgd2l0aCBhIGppdEFzc2VydCBiZWxvdy4KKyAgICAgICAgaW5mby5maWxsSlNWYWx1ZShncHIs
IERhdGFGb3JtYXRKU0ludGVnZXIpOworICAgICAgICB1bmxvY2soZ3ByKTsKKyAgICB9CisKKyAg
ICBzd2l0Y2ggKGluZm8ucmVnaXN0ZXJGb3JtYXQoKSkgeworICAgIGNhc2UgRGF0YUZvcm1hdE5v
bmU6CisgICAgICAgIC8vIFNob3VsZCBoYXZlIGZpbGxlZCwgYWJvdmUuCisgICAgY2FzZSBEYXRh
Rm9ybWF0SlNEb3VibGU6CisgICAgY2FzZSBEYXRhRm9ybWF0RG91YmxlOgorICAgIGNhc2UgRGF0
YUZvcm1hdEpTOgorICAgIGNhc2UgRGF0YUZvcm1hdENlbGw6CisgICAgY2FzZSBEYXRhRm9ybWF0
SlNDZWxsOgorICAgIGNhc2UgRGF0YUZvcm1hdEJvb2xlYW46CisgICAgY2FzZSBEYXRhRm9ybWF0
SlNCb29sZWFuOgorICAgIGNhc2UgRGF0YUZvcm1hdFN0b3JhZ2U6CisgICAgICAgIC8vIFNob3Vs
ZCBvbmx5IGJlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiBpZiB3ZSBrbm93IHRoaXMgb3BlcmFuZCB0
byBiZSBpbnRlZ2VyLgorICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKworICAgIGNhc2Ug
RGF0YUZvcm1hdEpTSW50ZWdlcjogeworICAgICAgICBHUFJSZWcgZ3ByID0gaW5mby5ncHIoKTsK
KyAgICAgICAgbV9ncHJzLmxvY2soZ3ByKTsKKyAgICAgICAgbV9qaXQuaml0QXNzZXJ0SXNKU0lu
dDMyKGdwcik7CisgICAgICAgIHJldHVybkZvcm1hdCA9IERhdGFGb3JtYXRKU0ludGVnZXI7Cisg
ICAgICAgIHJldHVybiBncHI7CisgICAgfQorCisgICAgY2FzZSBEYXRhRm9ybWF0SW50ZWdlcjog
eworICAgICAgICBHUFJSZWcgZ3ByID0gaW5mby5ncHIoKTsKKyAgICAgICAgbV9ncHJzLmxvY2so
Z3ByKTsKKyAgICAgICAgbV9qaXQuaml0QXNzZXJ0SXNJbnQzMihncHIpOworICAgICAgICByZXR1
cm5Gb3JtYXQgPSBEYXRhRm9ybWF0SW50ZWdlcjsKKyAgICAgICAgcmV0dXJuIGdwcjsKKyAgICB9
CisgICAgfQorCisgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgcmV0dXJuIEludmFsaWRH
UFJSZWc7Cit9CisKK0ZQUlJlZyBKSVRDb2RlR2VuZXJhdG9yOjpmaWxsRG91YmxlKE5vZGVJbmRl
eCBub2RlSW5kZXgpCit7CisgICAgTm9kZSYgbm9kZSA9IG1faml0LmdyYXBoKClbbm9kZUluZGV4
XTsKKyAgICBWaXJ0dWFsUmVnaXN0ZXIgdmlydHVhbFJlZ2lzdGVyID0gbm9kZS52aXJ0dWFsUmVn
aXN0ZXIoKTsKKyAgICBHZW5lcmF0aW9uSW5mbyYgaW5mbyA9IG1fZ2VuZXJhdGlvbkluZm9bdmly
dHVhbFJlZ2lzdGVyXTsKKworICAgIGlmIChpbmZvLnJlZ2lzdGVyRm9ybWF0KCkgPT0gRGF0YUZv
cm1hdE5vbmUpIHsKKyAgICAgICAgR1BSUmVnIGdwciA9IGFsbG9jYXRlKCk7CisKKyAgICAgICAg
aWYgKG5vZGUuaGFzQ29uc3RhbnQoKSkgeworICAgICAgICAgICAgaWYgKGlzSW50MzJDb25zdGFu
dChub2RlSW5kZXgpKSB7CisgICAgICAgICAgICAgICAgLy8gRklYTUU6IHNob3VsZCBub3QgYmUg
cmVhY2hhYmxlPworICAgICAgICAgICAgICAgIG1faml0Lm1vdmUoTWFjcm9Bc3NlbWJsZXI6Oklt
bTMyKHZhbHVlT2ZJbnQzMkNvbnN0YW50KG5vZGVJbmRleCkpLCBncHIpOworICAgICAgICAgICAg
ICAgIG1fZ3Bycy5yZXRhaW4oZ3ByLCB2aXJ0dWFsUmVnaXN0ZXIsIFNwaWxsT3JkZXJDb25zdGFu
dCk7CisgICAgICAgICAgICAgICAgaW5mby5maWxsSW50ZWdlcihncHIpOworICAgICAgICAgICAg
ICAgIHVubG9jayhncHIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChpc051bWJlckNvbnN0YW50
KG5vZGVJbmRleCkpIHsKKyAgICAgICAgICAgICAgICBGUFJSZWcgZnByID0gZnByQWxsb2NhdGUo
KTsKKyAgICAgICAgICAgICAgICBtX2ppdC5tb3ZlKE1hY3JvQXNzZW1ibGVyOjpJbW1QdHIocmVp
bnRlcnByZXRfY2FzdDx2b2lkKj4ocmVpbnRlcnByZXREb3VibGVUb0ludHB0cih2YWx1ZU9mTnVt
YmVyQ29uc3RhbnQobm9kZUluZGV4KSkpKSwgZ3ByKTsKKyAgICAgICAgICAgICAgICBtX2ppdC5t
b3ZlUHRyVG9Eb3VibGUoZ3ByLCBmcHIpOworICAgICAgICAgICAgICAgIHVubG9jayhncHIpOwor
CisgICAgICAgICAgICAgICAgbV9mcHJzLnJldGFpbihmcHIsIHZpcnR1YWxSZWdpc3RlciwgU3Bp
bGxPcmRlckRvdWJsZSk7CisgICAgICAgICAgICAgICAgaW5mby5maWxsRG91YmxlKGZwcik7Cisg
ICAgICAgICAgICAgICAgcmV0dXJuIGZwcjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAg
ICAgICAgICAgLy8gRklYTUU6IHNob3VsZCBub3QgYmUgcmVhY2hhYmxlPworICAgICAgICAgICAg
ICAgIEFTU0VSVChpc0pTQ29uc3RhbnQobm9kZUluZGV4KSk7CisgICAgICAgICAgICAgICAgSlNW
YWx1ZSBqc1ZhbHVlID0gdmFsdWVPZkpTQ29uc3RhbnQobm9kZUluZGV4KTsKKyAgICAgICAgICAg
ICAgICBtX2ppdC5tb3ZlKE1hY3JvQXNzZW1ibGVyOjpJbW1QdHIoSlNWYWx1ZTo6ZW5jb2RlKGpz
VmFsdWUpKSwgZ3ByKTsKKyAgICAgICAgICAgICAgICBtX2dwcnMucmV0YWluKGdwciwgdmlydHVh
bFJlZ2lzdGVyLCBTcGlsbE9yZGVyQ29uc3RhbnQpOworICAgICAgICAgICAgICAgIGluZm8uZmls
bEpTVmFsdWUoZ3ByLCBEYXRhRm9ybWF0SlMpOworICAgICAgICAgICAgICAgIHVubG9jayhncHIp
OworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgRGF0YUZvcm1h
dCBzcGlsbEZvcm1hdCA9IGluZm8uc3BpbGxGb3JtYXQoKTsKKyAgICAgICAgICAgIEFTU0VSVChz
cGlsbEZvcm1hdCAmIERhdGFGb3JtYXRKUyk7CisgICAgICAgICAgICBtX2dwcnMucmV0YWluKGdw
ciwgdmlydHVhbFJlZ2lzdGVyLCBTcGlsbE9yZGVyU3BpbGxlZCk7CisgICAgICAgICAgICBtX2pp
dC5sb2FkUHRyKEpJVENvbXBpbGVyOjphZGRyZXNzRm9yKHZpcnR1YWxSZWdpc3RlciksIGdwcik7
CisgICAgICAgICAgICBpbmZvLmZpbGxKU1ZhbHVlKGdwciwgbV9pc1NwZWN1bGF0aXZlID8gc3Bp
bGxGb3JtYXQgOiBEYXRhRm9ybWF0SlMpOworICAgICAgICAgICAgdW5sb2NrKGdwcik7CisgICAg
ICAgIH0KKyAgICB9CisKKyAgICBzd2l0Y2ggKGluZm8ucmVnaXN0ZXJGb3JtYXQoKSkgeworICAg
IGNhc2UgRGF0YUZvcm1hdE5vbmU6CisgICAgICAgIC8vIFNob3VsZCBoYXZlIGZpbGxlZCwgYWJv
dmUuCisgICAgY2FzZSBEYXRhRm9ybWF0Q2VsbDoKKyAgICBjYXNlIERhdGFGb3JtYXRKU0NlbGw6
CisgICAgY2FzZSBEYXRhRm9ybWF0Qm9vbGVhbjoKKyAgICBjYXNlIERhdGFGb3JtYXRKU0Jvb2xl
YW46CisgICAgY2FzZSBEYXRhRm9ybWF0U3RvcmFnZToKKyAgICAgICAgLy8gU2hvdWxkIG9ubHkg
YmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIGlmIHdlIGtub3cgdGhpcyBvcGVyYW5kIHRvIGJlIG51
bWVyaWMuCisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworCisgICAgY2FzZSBEYXRhRm9y
bWF0SlM6IHsKKyAgICAgICAgR1BSUmVnIGpzVmFsdWVHcHIgPSBpbmZvLmdwcigpOworICAgICAg
ICBtX2dwcnMubG9jayhqc1ZhbHVlR3ByKTsKKyAgICAgICAgRlBSUmVnIGZwciA9IGZwckFsbG9j
YXRlKCk7CisgICAgICAgIEdQUlJlZyB0ZW1wR3ByID0gYWxsb2NhdGUoKTsgLy8gRklYTUU6IGNh
biB3ZSBza2lwIHRoaXMgYWxsb2NhdGlvbiBvbiB0aGUgbGFzdCB1c2Ugb2YgdGhlIHZpcnR1YWwg
cmVnaXN0ZXI/CisKKyAgICAgICAgSklUQ29tcGlsZXI6Okp1bXAgaXNJbnRlZ2VyID0gbV9qaXQu
YnJhbmNoUHRyKE1hY3JvQXNzZW1ibGVyOjpBYm92ZU9yRXF1YWwsIGpzVmFsdWVHcHIsIEdQUklu
Zm86OnRhZ1R5cGVOdW1iZXJSZWdpc3Rlcik7CisKKyAgICAgICAgbV9qaXQuaml0QXNzZXJ0SXNK
U0RvdWJsZShqc1ZhbHVlR3ByKTsKKworICAgICAgICAvLyBGaXJzdCwgaWYgd2UgZ2V0IGhlcmUg
d2UgaGF2ZSBhIGRvdWJsZSBlbmNvZGVkIGFzIGEgSlNWYWx1ZQorICAgICAgICBtX2ppdC5tb3Zl
KGpzVmFsdWVHcHIsIHRlbXBHcHIpOworICAgICAgICB1bmJveERvdWJsZSh0ZW1wR3ByLCBmcHIp
OworICAgICAgICBKSVRDb21waWxlcjo6SnVtcCBoYXNVbmJveGVkRG91YmxlID0gbV9qaXQuanVt
cCgpOworCisgICAgICAgIC8vIEZpbmFsbHksIGhhbmRsZSBpbnRlZ2Vycy4KKyAgICAgICAgaXNJ
bnRlZ2VyLmxpbmsoJm1faml0KTsKKyAgICAgICAgbV9qaXQuY29udmVydEludDMyVG9Eb3VibGUo
anNWYWx1ZUdwciwgZnByKTsKKyAgICAgICAgaGFzVW5ib3hlZERvdWJsZS5saW5rKCZtX2ppdCk7
CisKKyAgICAgICAgbV9ncHJzLnJlbGVhc2UoanNWYWx1ZUdwcik7CisgICAgICAgIG1fZ3Bycy51
bmxvY2soanNWYWx1ZUdwcik7CisgICAgICAgIG1fZ3Bycy51bmxvY2sodGVtcEdwcik7CisgICAg
ICAgIG1fZnBycy5yZXRhaW4oZnByLCB2aXJ0dWFsUmVnaXN0ZXIsIFNwaWxsT3JkZXJEb3VibGUp
OworICAgICAgICBpbmZvLmZpbGxEb3VibGUoZnByKTsKKyAgICAgICAgaW5mby5raWxsU3BpbGxl
ZCgpOworICAgICAgICByZXR1cm4gZnByOworICAgIH0KKworICAgIGNhc2UgRGF0YUZvcm1hdEpT
SW50ZWdlcjoKKyAgICBjYXNlIERhdGFGb3JtYXRJbnRlZ2VyOiB7CisgICAgICAgIEZQUlJlZyBm
cHIgPSBmcHJBbGxvY2F0ZSgpOworICAgICAgICBHUFJSZWcgZ3ByID0gaW5mby5ncHIoKTsKKyAg
ICAgICAgbV9ncHJzLmxvY2soZ3ByKTsKKyAgICAgICAgbV9qaXQuY29udmVydEludDMyVG9Eb3Vi
bGUoZ3ByLCBmcHIpOworICAgICAgICBtX2dwcnMudW5sb2NrKGdwcik7CisgICAgICAgIHJldHVy
biBmcHI7CisgICAgfQorCisgICAgLy8gVW5ib3ggdGhlIGRvdWJsZQorICAgIGNhc2UgRGF0YUZv
cm1hdEpTRG91YmxlOiB7CisgICAgICAgIEdQUlJlZyBncHIgPSBpbmZvLmdwcigpOworICAgICAg
ICBGUFJSZWcgZnByID0gZnByQWxsb2NhdGUoKTsKKyAgICAgICAgaWYgKG1fZ3Bycy5pc0xvY2tl
ZChncHIpKSB7CisgICAgICAgICAgICAvLyBNYWtlIHN1cmUgd2UgZG9uJ3QgdHJhbXBsZSBncHIg
aWYgaXQgaXMgaW4gdXNlLgorICAgICAgICAgICAgR1BSUmVnIHRlbXAgPSBhbGxvY2F0ZSgpOwor
ICAgICAgICAgICAgbV9qaXQubW92ZShncHIsIHRlbXApOworICAgICAgICAgICAgdW5ib3hEb3Vi
bGUodGVtcCwgZnByKTsKKyAgICAgICAgICAgIHVubG9jayh0ZW1wKTsKKyAgICAgICAgfSBlbHNl
CisgICAgICAgICAgICB1bmJveERvdWJsZShncHIsIGZwcik7CisKKyAgICAgICAgbV9ncHJzLnJl
bGVhc2UoZ3ByKTsKKyAgICAgICAgbV9mcHJzLnJldGFpbihmcHIsIHZpcnR1YWxSZWdpc3Rlciwg
U3BpbGxPcmRlckRvdWJsZSk7CisKKyAgICAgICAgaW5mby5maWxsRG91YmxlKGZwcik7CisgICAg
ICAgIHJldHVybiBmcHI7CisgICAgfQorCisgICAgY2FzZSBEYXRhRm9ybWF0RG91YmxlOiB7Cisg
ICAgICAgIEZQUlJlZyBmcHIgPSBpbmZvLmZwcigpOworICAgICAgICBtX2ZwcnMubG9jayhmcHIp
OworICAgICAgICByZXR1cm4gZnByOworICAgIH0KKyAgICB9CisKKyAgICBBU1NFUlRfTk9UX1JF
QUNIRUQoKTsKKyAgICByZXR1cm4gSW52YWxpZEZQUlJlZzsKK30KKworR1BSUmVnIEpJVENvZGVH
ZW5lcmF0b3I6OmZpbGxKU1ZhbHVlKE5vZGVJbmRleCBub2RlSW5kZXgpCit7CisgICAgTm9kZSYg
bm9kZSA9IG1faml0LmdyYXBoKClbbm9kZUluZGV4XTsKKyAgICBWaXJ0dWFsUmVnaXN0ZXIgdmly
dHVhbFJlZ2lzdGVyID0gbm9kZS52aXJ0dWFsUmVnaXN0ZXIoKTsKKyAgICBHZW5lcmF0aW9uSW5m
byYgaW5mbyA9IG1fZ2VuZXJhdGlvbkluZm9bdmlydHVhbFJlZ2lzdGVyXTsKKworICAgIHN3aXRj
aCAoaW5mby5yZWdpc3RlckZvcm1hdCgpKSB7CisgICAgY2FzZSBEYXRhRm9ybWF0Tm9uZTogewor
ICAgICAgICBHUFJSZWcgZ3ByID0gYWxsb2NhdGUoKTsKKworICAgICAgICBpZiAobm9kZS5oYXND
b25zdGFudCgpKSB7CisgICAgICAgICAgICBpZiAoaXNJbnQzMkNvbnN0YW50KG5vZGVJbmRleCkp
IHsKKyAgICAgICAgICAgICAgICBpbmZvLmZpbGxKU1ZhbHVlKGdwciwgRGF0YUZvcm1hdEpTSW50
ZWdlcik7CisgICAgICAgICAgICAgICAgSlNWYWx1ZSBqc1ZhbHVlID0ganNOdW1iZXIodmFsdWVP
ZkludDMyQ29uc3RhbnQobm9kZUluZGV4KSk7CisgICAgICAgICAgICAgICAgbV9qaXQubW92ZShN
YWNyb0Fzc2VtYmxlcjo6SW1tUHRyKEpTVmFsdWU6OmVuY29kZShqc1ZhbHVlKSksIGdwcik7Cisg
ICAgICAgICAgICB9IGVsc2UgaWYgKGlzTnVtYmVyQ29uc3RhbnQobm9kZUluZGV4KSkgeworICAg
ICAgICAgICAgICAgIGluZm8uZmlsbEpTVmFsdWUoZ3ByLCBEYXRhRm9ybWF0SlNEb3VibGUpOwor
ICAgICAgICAgICAgICAgIEpTVmFsdWUganNWYWx1ZShKU1ZhbHVlOjpFbmNvZGVBc0RvdWJsZSwg
dmFsdWVPZk51bWJlckNvbnN0YW50KG5vZGVJbmRleCkpOworICAgICAgICAgICAgICAgIG1faml0
Lm1vdmUoTWFjcm9Bc3NlbWJsZXI6OkltbVB0cihKU1ZhbHVlOjplbmNvZGUoanNWYWx1ZSkpLCBn
cHIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBU1NFUlQoaXNKU0Nv
bnN0YW50KG5vZGVJbmRleCkpOworICAgICAgICAgICAgICAgIEpTVmFsdWUganNWYWx1ZSA9IHZh
bHVlT2ZKU0NvbnN0YW50KG5vZGVJbmRleCk7CisgICAgICAgICAgICAgICAgbV9qaXQubW92ZShN
YWNyb0Fzc2VtYmxlcjo6SW1tUHRyKEpTVmFsdWU6OmVuY29kZShqc1ZhbHVlKSksIGdwcik7Cisg
ICAgICAgICAgICAgICAgaW5mby5maWxsSlNWYWx1ZShncHIsIERhdGFGb3JtYXRKUyk7CisgICAg
ICAgICAgICB9CisKKyAgICAgICAgICAgIG1fZ3Bycy5yZXRhaW4oZ3ByLCB2aXJ0dWFsUmVnaXN0
ZXIsIFNwaWxsT3JkZXJDb25zdGFudCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBE
YXRhRm9ybWF0IHNwaWxsRm9ybWF0ID0gaW5mby5zcGlsbEZvcm1hdCgpOworICAgICAgICAgICAg
QVNTRVJUKHNwaWxsRm9ybWF0ICYgRGF0YUZvcm1hdEpTKTsKKyAgICAgICAgICAgIG1fZ3Bycy5y
ZXRhaW4oZ3ByLCB2aXJ0dWFsUmVnaXN0ZXIsIFNwaWxsT3JkZXJTcGlsbGVkKTsKKyAgICAgICAg
ICAgIG1faml0LmxvYWRQdHIoSklUQ29tcGlsZXI6OmFkZHJlc3NGb3IodmlydHVhbFJlZ2lzdGVy
KSwgZ3ByKTsKKyAgICAgICAgICAgIGluZm8uZmlsbEpTVmFsdWUoZ3ByLCBtX2lzU3BlY3VsYXRp
dmUgPyBzcGlsbEZvcm1hdCA6IERhdGFGb3JtYXRKUyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0
dXJuIGdwcjsKKyAgICB9CisKKyAgICBjYXNlIERhdGFGb3JtYXRJbnRlZ2VyOiB7CisgICAgICAg
IEdQUlJlZyBncHIgPSBpbmZvLmdwcigpOworICAgICAgICAvLyBJZiB0aGUgcmVnaXN0ZXIgaGFz
IGFscmVhZHkgYmVlbiBsb2NrZWQgd2UgbmVlZCB0byB0YWtlIGEgY29weS4KKyAgICAgICAgLy8g
SWYgbm90LCB3ZSdsbCB6ZXJvIGV4dGVuZCBpbiBwbGFjZSwgc28gbWFyayBvbiB0aGUgaW5mbyB0
aGF0IHRoaXMgaXMgbm93IHR5cGUgRGF0YUZvcm1hdEludGVnZXIsIG5vdCBEYXRhRm9ybWF0SlNJ
bnRlZ2VyLgorICAgICAgICBpZiAobV9ncHJzLmlzTG9ja2VkKGdwcikpIHsKKyAgICAgICAgICAg
IEdQUlJlZyByZXN1bHQgPSBhbGxvY2F0ZSgpOworICAgICAgICAgICAgbV9qaXQub3JQdHIoR1BS
SW5mbzo6dGFnVHlwZU51bWJlclJlZ2lzdGVyLCBncHIsIHJlc3VsdCk7CisgICAgICAgICAgICBy
ZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIG1fZ3Bycy5sb2NrKGdwcik7CisgICAg
ICAgIG1faml0Lm9yUHRyKEdQUkluZm86OnRhZ1R5cGVOdW1iZXJSZWdpc3RlciwgZ3ByKTsKKyAg
ICAgICAgaW5mby5maWxsSlNWYWx1ZShncHIsIERhdGFGb3JtYXRKU0ludGVnZXIpOworICAgICAg
ICByZXR1cm4gZ3ByOworICAgIH0KKworICAgIGNhc2UgRGF0YUZvcm1hdERvdWJsZTogeworICAg
ICAgICBGUFJSZWcgZnByID0gaW5mby5mcHIoKTsKKyAgICAgICAgR1BSUmVnIGdwciA9IGJveERv
dWJsZShmcHIpOworCisgICAgICAgIC8vIFVwZGF0ZSBhbGwgaW5mbworICAgICAgICBpbmZvLmZp
bGxKU1ZhbHVlKGdwciwgRGF0YUZvcm1hdEpTRG91YmxlKTsKKyAgICAgICAgbV9mcHJzLnJlbGVh
c2UoZnByKTsKKyAgICAgICAgbV9ncHJzLnJldGFpbihncHIsIHZpcnR1YWxSZWdpc3RlciwgU3Bp
bGxPcmRlckpTKTsKKworICAgICAgICByZXR1cm4gZ3ByOworICAgIH0KKworICAgIGNhc2UgRGF0
YUZvcm1hdENlbGw6CisgICAgICAgIC8vIE5vIHJldGFnIHJlcXVpcmVkIG9uIEpTVkFMVUU2NCEK
KyAgICBjYXNlIERhdGFGb3JtYXRKUzoKKyAgICBjYXNlIERhdGFGb3JtYXRKU0ludGVnZXI6Cisg
ICAgY2FzZSBEYXRhRm9ybWF0SlNEb3VibGU6CisgICAgY2FzZSBEYXRhRm9ybWF0SlNDZWxsOgor
ICAgIGNhc2UgRGF0YUZvcm1hdEpTQm9vbGVhbjogeworICAgICAgICBHUFJSZWcgZ3ByID0gaW5m
by5ncHIoKTsKKyAgICAgICAgbV9ncHJzLmxvY2soZ3ByKTsKKyAgICAgICAgcmV0dXJuIGdwcjsK
KyAgICB9CisgICAgICAgIAorICAgIGNhc2UgRGF0YUZvcm1hdEJvb2xlYW46CisgICAgY2FzZSBE
YXRhRm9ybWF0U3RvcmFnZToKKyAgICAgICAgLy8gdGhpcyB0eXBlIGN1cnJlbnRseSBuZXZlciBv
Y2N1cnMKKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgfQorCisgICAgQVNTRVJU
X05PVF9SRUFDSEVEKCk7CisgICAgcmV0dXJuIEludmFsaWRHUFJSZWc7Cit9CisKK0dQUlJlZyBK
SVRDb2RlR2VuZXJhdG9yOjpmaWxsU3RvcmFnZShOb2RlSW5kZXggbm9kZUluZGV4KQoreworICAg
IE5vZGUmIG5vZGUgPSBtX2ppdC5ncmFwaCgpW25vZGVJbmRleF07CisgICAgVmlydHVhbFJlZ2lz
dGVyIHZpcnR1YWxSZWdpc3RlciA9IG5vZGUudmlydHVhbFJlZ2lzdGVyKCk7CisgICAgR2VuZXJh
dGlvbkluZm8mIGluZm8gPSBtX2dlbmVyYXRpb25JbmZvW3ZpcnR1YWxSZWdpc3Rlcl07CisgICAg
CisgICAgc3dpdGNoIChpbmZvLnJlZ2lzdGVyRm9ybWF0KCkpIHsKKyAgICBjYXNlIERhdGFGb3Jt
YXROb25lOiB7CisgICAgICAgIEdQUlJlZyBncHIgPSBhbGxvY2F0ZSgpOworICAgICAgICBBU1NF
UlQoaW5mby5zcGlsbEZvcm1hdCgpID09IERhdGFGb3JtYXRTdG9yYWdlKTsKKyAgICAgICAgbV9n
cHJzLnJldGFpbihncHIsIHZpcnR1YWxSZWdpc3RlciwgU3BpbGxPcmRlclNwaWxsZWQpOworICAg
ICAgICBtX2ppdC5sb2FkUHRyKEpJVENvbXBpbGVyOjphZGRyZXNzRm9yKHZpcnR1YWxSZWdpc3Rl
ciksIGdwcik7CisgICAgICAgIGluZm8uZmlsbFN0b3JhZ2UoZ3ByKTsKKyAgICAgICAgcmV0dXJu
IGdwcjsKKyAgICB9CisgICAgICAgIAorICAgIGNhc2UgRGF0YUZvcm1hdFN0b3JhZ2U6IHsKKyAg
ICAgICAgR1BSUmVnIGdwciA9IGluZm8uZ3ByKCk7CisgICAgICAgIG1fZ3Bycy5sb2NrKGdwcik7
CisgICAgICAgIHJldHVybiBncHI7CisgICAgfQorICAgICAgICAKKyAgICBkZWZhdWx0OgorICAg
ICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIEludmFs
aWRHUFJSZWc7Cit9CisKK3ZvaWQgSklUQ29kZUdlbmVyYXRvcjo6dXNlQ2hpbGRyZW4oTm9kZSYg
bm9kZSkKK3sKKyAgICBpZiAobm9kZS5vcCAmIE5vZGVIYXNWYXJBcmdzKSB7CisgICAgICAgIGZv
ciAodW5zaWduZWQgY2hpbGRJZHggPSBub2RlLmZpcnN0Q2hpbGQoKTsgY2hpbGRJZHggPCBub2Rl
LmZpcnN0Q2hpbGQoKSArIG5vZGUubnVtQ2hpbGRyZW4oKTsgY2hpbGRJZHgrKykKKyAgICAgICAg
ICAgIHVzZShtX2ppdC5ncmFwaCgpLm1fdmFyQXJnQ2hpbGRyZW5bY2hpbGRJZHhdKTsKKyAgICB9
IGVsc2UgeworICAgICAgICBOb2RlSW5kZXggY2hpbGQxID0gbm9kZS5jaGlsZDEoKTsKKyAgICAg
ICAgaWYgKGNoaWxkMSA9PSBOb05vZGUpIHsKKyAgICAgICAgICAgIEFTU0VSVChub2RlLmNoaWxk
MigpID09IE5vTm9kZSAmJiBub2RlLmNoaWxkMygpID09IE5vTm9kZSk7CisgICAgICAgICAgICBy
ZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgdXNlKGNoaWxkMSk7CisgICAgICAgIAorICAgICAg
ICBOb2RlSW5kZXggY2hpbGQyID0gbm9kZS5jaGlsZDIoKTsKKyAgICAgICAgaWYgKGNoaWxkMiA9
PSBOb05vZGUpIHsKKyAgICAgICAgICAgIEFTU0VSVChub2RlLmNoaWxkMygpID09IE5vTm9kZSk7
CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgdXNlKGNoaWxkMik7Cisg
ICAgICAgIAorICAgICAgICBOb2RlSW5kZXggY2hpbGQzID0gbm9kZS5jaGlsZDMoKTsKKyAgICAg
ICAgaWYgKGNoaWxkMyA9PSBOb05vZGUpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIHVz
ZShjaGlsZDMpOworICAgIH0KK30KKworYm9vbCBKSVRDb2RlR2VuZXJhdG9yOjppc1N0cmljdElu
dDMyKE5vZGVJbmRleCBub2RlSW5kZXgpCit7CisgICAgaWYgKGlzSW50MzJDb25zdGFudChub2Rl
SW5kZXgpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAKKyAgICBOb2RlJiBub2RlID0gbV9q
aXQuZ3JhcGgoKVtub2RlSW5kZXhdOworICAgIEdlbmVyYXRpb25JbmZvJiBpbmZvID0gbV9nZW5l
cmF0aW9uSW5mb1tub2RlLnZpcnR1YWxSZWdpc3RlcigpXTsKKyAgICAKKyAgICByZXR1cm4gaW5m
by5yZWdpc3RlckZvcm1hdCgpID09IERhdGFGb3JtYXRJbnRlZ2VyOworfQorCitib29sIEpJVENv
ZGVHZW5lcmF0b3I6OmlzS25vd25JbnRlZ2VyKE5vZGVJbmRleCBub2RlSW5kZXgpCit7CisgICAg
aWYgKGlzSW50MzJDb25zdGFudChub2RlSW5kZXgpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKwor
ICAgIE5vZGUmIG5vZGUgPSBtX2ppdC5ncmFwaCgpW25vZGVJbmRleF07CisgICAgCisgICAgaWYg
KG5vZGUuaGFzSW50MzJSZXN1bHQoKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgCisgICAg
R2VuZXJhdGlvbkluZm8mIGluZm8gPSBtX2dlbmVyYXRpb25JbmZvW25vZGUudmlydHVhbFJlZ2lz
dGVyKCldOworCisgICAgcmV0dXJuIGluZm8uaXNKU0ludGVnZXIoKTsKK30KKworYm9vbCBKSVRD
b2RlR2VuZXJhdG9yOjppc0tub3duTnVtZXJpYyhOb2RlSW5kZXggbm9kZUluZGV4KQoreworICAg
IGlmIChpc0ludDMyQ29uc3RhbnQobm9kZUluZGV4KSB8fCBpc051bWJlckNvbnN0YW50KG5vZGVJ
bmRleCkpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgTm9kZSYgbm9kZSA9IG1faml0Lmdy
YXBoKClbbm9kZUluZGV4XTsKKyAgICAKKyAgICBpZiAobm9kZS5oYXNOdW1iZXJSZXN1bHQoKSkK
KyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgCisgICAgR2VuZXJhdGlvbkluZm8mIGluZm8gPSBt
X2dlbmVyYXRpb25JbmZvW25vZGUudmlydHVhbFJlZ2lzdGVyKCldOworCisgICAgcmV0dXJuIGlu
Zm8uaXNKU0ludGVnZXIoKSB8fCBpbmZvLmlzSlNEb3VibGUoKTsKK30KKworYm9vbCBKSVRDb2Rl
R2VuZXJhdG9yOjppc0tub3duQ2VsbChOb2RlSW5kZXggbm9kZUluZGV4KQoreworICAgIHJldHVy
biBtX2dlbmVyYXRpb25JbmZvW21faml0LmdyYXBoKClbbm9kZUluZGV4XS52aXJ0dWFsUmVnaXN0
ZXIoKV0uaXNKU0NlbGwoKTsKK30KKworYm9vbCBKSVRDb2RlR2VuZXJhdG9yOjppc0tub3duTm90
Q2VsbChOb2RlSW5kZXggbm9kZUluZGV4KQoreworICAgIE5vZGUmIG5vZGUgPSBtX2ppdC5ncmFw
aCgpW25vZGVJbmRleF07CisgICAgVmlydHVhbFJlZ2lzdGVyIHZpcnR1YWxSZWdpc3RlciA9IG5v
ZGUudmlydHVhbFJlZ2lzdGVyKCk7CisgICAgR2VuZXJhdGlvbkluZm8mIGluZm8gPSBtX2dlbmVy
YXRpb25JbmZvW3ZpcnR1YWxSZWdpc3Rlcl07CisgICAgaWYgKG5vZGUuaGFzQ29uc3RhbnQoKSAm
JiAhdmFsdWVPZkpTQ29uc3RhbnQobm9kZUluZGV4KS5pc0NlbGwoKSkKKyAgICAgICAgcmV0dXJu
IHRydWU7CisgICAgcmV0dXJuICEoaW5mby5pc0pTQ2VsbCgpIHx8IGluZm8uaXNVbmtub3duSlMo
KSk7Cit9CisKK2Jvb2wgSklUQ29kZUdlbmVyYXRvcjo6aXNLbm93bk5vdEludGVnZXIoTm9kZUlu
ZGV4IG5vZGVJbmRleCkKK3sKKyAgICBOb2RlJiBub2RlID0gbV9qaXQuZ3JhcGgoKVtub2RlSW5k
ZXhdOworICAgIFZpcnR1YWxSZWdpc3RlciB2aXJ0dWFsUmVnaXN0ZXIgPSBub2RlLnZpcnR1YWxS
ZWdpc3RlcigpOworICAgIEdlbmVyYXRpb25JbmZvJiBpbmZvID0gbV9nZW5lcmF0aW9uSW5mb1t2
aXJ0dWFsUmVnaXN0ZXJdOworICAgIAorICAgIHJldHVybiBpbmZvLmlzSlNEb3VibGUoKSB8fCBp
bmZvLmlzSlNDZWxsKCkgfHwgaW5mby5pc0pTQm9vbGVhbigpCisgICAgICAgIHx8IChub2RlLmhh
c0NvbnN0YW50KCkgJiYgIXZhbHVlT2ZKU0NvbnN0YW50KG5vZGVJbmRleCkuaXNJbnQzMigpKTsK
K30KKworYm9vbCBKSVRDb2RlR2VuZXJhdG9yOjppc0tub3duTm90TnVtYmVyKE5vZGVJbmRleCBu
b2RlSW5kZXgpCit7CisgICAgTm9kZSYgbm9kZSA9IG1faml0LmdyYXBoKClbbm9kZUluZGV4XTsK
KyAgICBWaXJ0dWFsUmVnaXN0ZXIgdmlydHVhbFJlZ2lzdGVyID0gbm9kZS52aXJ0dWFsUmVnaXN0
ZXIoKTsKKyAgICBHZW5lcmF0aW9uSW5mbyYgaW5mbyA9IG1fZ2VuZXJhdGlvbkluZm9bdmlydHVh
bFJlZ2lzdGVyXTsKKyAgICAKKyAgICByZXR1cm4gKCFpbmZvLmlzSlNEb3VibGUoKSAmJiAhaW5m
by5pc0pTSW50ZWdlcigpICYmICFpbmZvLmlzVW5rbm93bkpTKCkpCisgICAgICAgIHx8IChub2Rl
Lmhhc0NvbnN0YW50KCkgJiYgIWlzTnVtYmVyQ29uc3RhbnQobm9kZUluZGV4KSk7Cit9CisKK2Jv
b2wgSklUQ29kZUdlbmVyYXRvcjo6aXNLbm93bkJvb2xlYW4oTm9kZUluZGV4IG5vZGVJbmRleCkK
K3sKKyAgICBOb2RlJiBub2RlID0gbV9qaXQuZ3JhcGgoKVtub2RlSW5kZXhdOworICAgIGlmIChu
b2RlLmhhc0Jvb2xlYW5SZXN1bHQoKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgCisgICAg
aWYgKGlzQm9vbGVhbkNvbnN0YW50KG5vZGVJbmRleCkpCisgICAgICAgIHJldHVybiB0cnVlOwor
ICAgIAorICAgIFZpcnR1YWxSZWdpc3RlciB2aXJ0dWFsUmVnaXN0ZXIgPSBub2RlLnZpcnR1YWxS
ZWdpc3RlcigpOworICAgIEdlbmVyYXRpb25JbmZvJiBpbmZvID0gbV9nZW5lcmF0aW9uSW5mb1t2
aXJ0dWFsUmVnaXN0ZXJdOworICAgIAorICAgIHJldHVybiBpbmZvLmlzSlNCb29sZWFuKCk7Cit9
CisKK3ZvaWQgSklUQ29kZUdlbmVyYXRvcjo6bm9uU3BlY3VsYXRpdmVWYWx1ZVRvTnVtYmVyKE5v
ZGUmIG5vZGUpCit7CisgICAgaWYgKGlzS25vd25OdW1lcmljKG5vZGUuY2hpbGQxKCkpKSB7Cisg
ICAgICAgIEpTVmFsdWVPcGVyYW5kIG9wMSh0aGlzLCBub2RlLmNoaWxkMSgpKTsKKyAgICAgICAg
R1BSVGVtcG9yYXJ5IHJlc3VsdCh0aGlzLCBvcDEpOworICAgICAgICBtX2ppdC5tb3ZlKG9wMS5n
cHIoKSwgcmVzdWx0LmdwcigpKTsKKyAgICAgICAganNWYWx1ZVJlc3VsdChyZXN1bHQuZ3ByKCks
IG1fY29tcGlsZUluZGV4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEpTVmFsdWVP
cGVyYW5kIG9wMSh0aGlzLCBub2RlLmNoaWxkMSgpKTsKKyAgICBHUFJUZW1wb3JhcnkgcmVzdWx0
KHRoaXMpOworICAgIAorICAgIEFTU0VSVCghaXNJbnQzMkNvbnN0YW50KG5vZGUuY2hpbGQxKCkp
KTsKKyAgICBBU1NFUlQoIWlzTnVtYmVyQ29uc3RhbnQobm9kZS5jaGlsZDEoKSkpOworICAgIAor
ICAgIEdQUlJlZyBqc1ZhbHVlR3ByID0gb3AxLmdwcigpOworICAgIEdQUlJlZyBncHIgPSByZXN1
bHQuZ3ByKCk7CisgICAgb3AxLnVzZSgpOworCisgICAgSklUQ29tcGlsZXI6Okp1bXAgaXNJbnRl
Z2VyID0gbV9qaXQuYnJhbmNoUHRyKE1hY3JvQXNzZW1ibGVyOjpBYm92ZU9yRXF1YWwsIGpzVmFs
dWVHcHIsIEdQUkluZm86OnRhZ1R5cGVOdW1iZXJSZWdpc3Rlcik7CisgICAgSklUQ29tcGlsZXI6
Okp1bXAgbm9uTnVtZXJpYyA9IG1faml0LmJyYW5jaFRlc3RQdHIoTWFjcm9Bc3NlbWJsZXI6Olpl
cm8sIGpzVmFsdWVHcHIsIEdQUkluZm86OnRhZ1R5cGVOdW1iZXJSZWdpc3Rlcik7CisKKyAgICAv
LyBGaXJzdCwgaWYgd2UgZ2V0IGhlcmUgd2UgaGF2ZSBhIGRvdWJsZSBlbmNvZGVkIGFzIGEgSlNW
YWx1ZQorICAgIG1faml0Lm1vdmUoanNWYWx1ZUdwciwgZ3ByKTsKKyAgICBKSVRDb21waWxlcjo6
SnVtcCBoYXNVbmJveGVkRG91YmxlID0gbV9qaXQuanVtcCgpOworCisgICAgLy8gTmV4dCBoYW5k
bGUgY2VsbHMgKCYgb3RoZXIgSlMgaW1tZWRpYXRlcykKKyAgICBub25OdW1lcmljLmxpbmsoJm1f
aml0KTsKKyAgICBzaWxlbnRTcGlsbEFsbFJlZ2lzdGVycyhncHIpOworICAgIG1faml0Lm1vdmUo
anNWYWx1ZUdwciwgR1BSSW5mbzo6YXJndW1lbnRHUFIxKTsKKyAgICBtX2ppdC5tb3ZlKEdQUklu
Zm86OmNhbGxGcmFtZVJlZ2lzdGVyLCBHUFJJbmZvOjphcmd1bWVudEdQUjApOworICAgIGFwcGVu
ZENhbGxXaXRoRXhjZXB0aW9uQ2hlY2soZGZnQ29udmVydEpTVmFsdWVUb051bWJlcik7CisgICAg
Ym94RG91YmxlKEZQUkluZm86OnJldHVyblZhbHVlRlBSLCBncHIpOworICAgIHNpbGVudEZpbGxB
bGxSZWdpc3RlcnMoZ3ByKTsKKyAgICBKSVRDb21waWxlcjo6SnVtcCBoYXNDYWxsZWRUb051bWJl
ciA9IG1faml0Lmp1bXAoKTsKKyAgICAKKyAgICAvLyBGaW5hbGx5LCBoYW5kbGUgaW50ZWdlcnMu
CisgICAgaXNJbnRlZ2VyLmxpbmsoJm1faml0KTsKKyAgICBtX2ppdC5vclB0cihHUFJJbmZvOjp0
YWdUeXBlTnVtYmVyUmVnaXN0ZXIsIGpzVmFsdWVHcHIsIGdwcik7CisgICAgaGFzVW5ib3hlZERv
dWJsZS5saW5rKCZtX2ppdCk7CisgICAgaGFzQ2FsbGVkVG9OdW1iZXIubGluaygmbV9qaXQpOwor
ICAgIAorICAgIGpzVmFsdWVSZXN1bHQocmVzdWx0LmdwcigpLCBtX2NvbXBpbGVJbmRleCwgVXNl
Q2hpbGRyZW5DYWxsZWRFeHBsaWNpdGx5KTsKK30KKwordm9pZCBKSVRDb2RlR2VuZXJhdG9yOjpu
b25TcGVjdWxhdGl2ZVZhbHVlVG9JbnQzMihOb2RlJiBub2RlKQoreworICAgIEFTU0VSVCghaXNJ
bnQzMkNvbnN0YW50KG5vZGUuY2hpbGQxKCkpKTsKKyAgICAKKyAgICBpZiAoaXNLbm93bkludGVn
ZXIobm9kZS5jaGlsZDEoKSkpIHsKKyAgICAgICAgSW50ZWdlck9wZXJhbmQgb3AxKHRoaXMsIG5v
ZGUuY2hpbGQxKCkpOworICAgICAgICBHUFJUZW1wb3JhcnkgcmVzdWx0KHRoaXMsIG9wMSk7Cisg
ICAgICAgIG1faml0Lm1vdmUob3AxLmdwcigpLCByZXN1bHQuZ3ByKCkpOworICAgICAgICBpbnRl
Z2VyUmVzdWx0KHJlc3VsdC5ncHIoKSwgbV9jb21waWxlSW5kZXgpOworICAgICAgICByZXR1cm47
CisgICAgfQorICAgIAorICAgIEdlbmVyYXRpb25JbmZvJiBjaGlsZEluZm8gPSBtX2dlbmVyYXRp
b25JbmZvW21faml0LmdyYXBoKClbbm9kZS5jaGlsZDEoKV0udmlydHVhbFJlZ2lzdGVyKCldOwor
ICAgIGlmIChpc0pTRG91YmxlKGNoaWxkSW5mby5yZWdpc3RlckZvcm1hdCgpKSkgeworICAgICAg
ICBEb3VibGVPcGVyYW5kIG9wMSh0aGlzLCBub2RlLmNoaWxkMSgpKTsKKyAgICAgICAgR1BSVGVt
cG9yYXJ5IHJlc3VsdCh0aGlzKTsKKyAgICAgICAgRlBSUmVnIGZwciA9IG9wMS5mcHIoKTsKKyAg
ICAgICAgR1BSUmVnIGdwciA9IHJlc3VsdC5ncHIoKTsKKyAgICAgICAgb3AxLnVzZSgpOworICAg
ICAgICBKSVRDb21waWxlcjo6SnVtcCB0cnVuY2F0ZWRUb0ludGVnZXIgPSBtX2ppdC5icmFuY2hU
cnVuY2F0ZURvdWJsZVRvSW50MzIoZnByLCBncHIsIEpJVENvbXBpbGVyOjpCcmFuY2hJZlRydW5j
YXRlU3VjY2Vzc2Z1bCk7CisgICAgICAgIAorICAgICAgICBzaWxlbnRTcGlsbEFsbFJlZ2lzdGVy
cyhncHIpOworICAgICAgICAKKyAgICAgICAgbV9qaXQubW92ZURvdWJsZShmcHIsIEZQUkluZm86
OmFyZ3VtZW50RlBSMCk7CisgICAgICAgIGFwcGVuZENhbGxXaXRoRXhjZXB0aW9uQ2hlY2sodG9J
bnQzMik7CisgICAgICAgIG1faml0Lnplcm9FeHRlbmQzMlRvUHRyKEdQUkluZm86OnJldHVyblZh
bHVlR1BSLCBncHIpOworICAgICAgICAKKyAgICAgICAgc2lsZW50RmlsbEFsbFJlZ2lzdGVycyhn
cHIpOworICAgICAgICAKKyAgICAgICAgdHJ1bmNhdGVkVG9JbnRlZ2VyLmxpbmsoJm1faml0KTsK
KyAgICAgICAgaW50ZWdlclJlc3VsdChncHIsIG1fY29tcGlsZUluZGV4LCBVc2VDaGlsZHJlbkNh
bGxlZEV4cGxpY2l0bHkpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIAorICAgIEpTVmFs
dWVPcGVyYW5kIG9wMSh0aGlzLCBub2RlLmNoaWxkMSgpKTsKKyAgICBHUFJUZW1wb3JhcnkgcmVz
dWx0KHRoaXMsIG9wMSk7CisgICAgR1BSUmVnIGpzVmFsdWVHcHIgPSBvcDEuZ3ByKCk7CisgICAg
R1BSUmVnIHJlc3VsdEdQUiA9IHJlc3VsdC5ncHIoKTsKKyAgICBvcDEudXNlKCk7CisKKyAgICBK
SVRDb21waWxlcjo6SnVtcCBpc0ludGVnZXIgPSBtX2ppdC5icmFuY2hQdHIoTWFjcm9Bc3NlbWJs
ZXI6OkFib3ZlT3JFcXVhbCwganNWYWx1ZUdwciwgR1BSSW5mbzo6dGFnVHlwZU51bWJlclJlZ2lz
dGVyKTsKKworICAgIC8vIEZpcnN0IGhhbmRsZSBub24taW50ZWdlcnMKKyAgICBzaWxlbnRTcGls
bEFsbFJlZ2lzdGVycyhyZXN1bHRHUFIpOworICAgIG1faml0Lm1vdmUoanNWYWx1ZUdwciwgR1BS
SW5mbzo6YXJndW1lbnRHUFIxKTsKKyAgICBtX2ppdC5tb3ZlKEdQUkluZm86OmNhbGxGcmFtZVJl
Z2lzdGVyLCBHUFJJbmZvOjphcmd1bWVudEdQUjApOworICAgIGFwcGVuZENhbGxXaXRoRXhjZXB0
aW9uQ2hlY2soZGZnQ29udmVydEpTVmFsdWVUb0ludDMyKTsKKyAgICBtX2ppdC56ZXJvRXh0ZW5k
MzJUb1B0cihHUFJJbmZvOjpyZXR1cm5WYWx1ZUdQUiwgcmVzdWx0R1BSKTsKKyAgICBzaWxlbnRG
aWxsQWxsUmVnaXN0ZXJzKHJlc3VsdEdQUik7CisgICAgSklUQ29tcGlsZXI6Okp1bXAgaGFzQ2Fs
bGVkVG9JbnQzMiA9IG1faml0Lmp1bXAoKTsKKworICAgIC8vIFRoZW4gaGFuZGxlIGludGVnZXJz
LgorICAgIGlzSW50ZWdlci5saW5rKCZtX2ppdCk7CisgICAgbV9qaXQuemVyb0V4dGVuZDMyVG9Q
dHIoanNWYWx1ZUdwciwgcmVzdWx0R1BSKTsKKyAgICBoYXNDYWxsZWRUb0ludDMyLmxpbmsoJm1f
aml0KTsKKyAgICBpbnRlZ2VyUmVzdWx0KHJlc3VsdEdQUiwgbV9jb21waWxlSW5kZXgsIFVzZUNo
aWxkcmVuQ2FsbGVkRXhwbGljaXRseSk7Cit9CisKK3ZvaWQgSklUQ29kZUdlbmVyYXRvcjo6bm9u
U3BlY3VsYXRpdmVVSW50MzJUb051bWJlcihOb2RlJiBub2RlKQoreworICAgIEludGVnZXJPcGVy
YW5kIG9wMSh0aGlzLCBub2RlLmNoaWxkMSgpKTsKKyAgICBGUFJUZW1wb3JhcnkgYm94ZXIodGhp
cyk7CisgICAgR1BSVGVtcG9yYXJ5IHJlc3VsdCh0aGlzLCBvcDEpOworICAgIAorICAgIEpJVENv
bXBpbGVyOjpKdW1wIHBvc2l0aXZlID0gbV9qaXQuYnJhbmNoMzIoTWFjcm9Bc3NlbWJsZXI6Okdy
ZWF0ZXJUaGFuT3JFcXVhbCwgb3AxLmdwcigpLCBUcnVzdGVkSW1tMzIoMCkpOworICAgIAorICAg
IG1faml0LmNvbnZlcnRJbnQzMlRvRG91YmxlKG9wMS5ncHIoKSwgYm94ZXIuZnByKCkpOworICAg
IG1faml0LmFkZERvdWJsZShKSVRDb21waWxlcjo6QWJzb2x1dGVBZGRyZXNzKCZ0d29Ub1RoZTMy
KSwgYm94ZXIuZnByKCkpOworICAgIAorICAgIGJveERvdWJsZShib3hlci5mcHIoKSwgcmVzdWx0
LmdwcigpKTsKKyAgICAKKyAgICBKSVRDb21waWxlcjo6SnVtcCBkb25lID0gbV9qaXQuanVtcCgp
OworICAgIAorICAgIHBvc2l0aXZlLmxpbmsoJm1faml0KTsKKyAgICAKKyAgICBtX2ppdC5vclB0
cihHUFJJbmZvOjp0YWdUeXBlTnVtYmVyUmVnaXN0ZXIsIG9wMS5ncHIoKSwgcmVzdWx0Lmdwcigp
KTsKKyAgICAKKyAgICBkb25lLmxpbmsoJm1faml0KTsKKyAgICAKKyAgICBqc1ZhbHVlUmVzdWx0
KHJlc3VsdC5ncHIoKSwgbV9jb21waWxlSW5kZXgpOworfQorCit2b2lkIEpJVENvZGVHZW5lcmF0
b3I6Om5vblNwZWN1bGF0aXZlS25vd25Db25zdGFudEFyaXRoT3AoTm9kZVR5cGUgb3AsIE5vZGVJ
bmRleCByZWdDaGlsZCwgTm9kZUluZGV4IGltbUNoaWxkLCBib29sIGNvbW11dGUpCit7CisgICAg
SlNWYWx1ZU9wZXJhbmQgcmVnQXJnKHRoaXMsIHJlZ0NoaWxkKTsKKyAgICBHUFJSZWcgcmVnQXJn
R1BSID0gcmVnQXJnLmdwcigpOworICAgIEdQUlRlbXBvcmFyeSByZXN1bHQodGhpcyk7CisgICAg
R1BSUmVnIHJlc3VsdEdQUiA9IHJlc3VsdC5ncHIoKTsKKyAgICBGUFJUZW1wb3JhcnkgdG1wMSh0
aGlzKTsKKyAgICBGUFJUZW1wb3JhcnkgdG1wMih0aGlzKTsKKyAgICBGUFJSZWcgdG1wMUZQUiA9
IHRtcDEuZnByKCk7CisgICAgRlBSUmVnIHRtcDJGUFIgPSB0bXAyLmZwcigpOworICAgIAorICAg
IHJlZ0FyZy51c2UoKTsKKyAgICB1c2UoaW1tQ2hpbGQpOworCisgICAgSklUQ29tcGlsZXI6Okp1
bXAgbm90SW50OworICAgIAorICAgIGludDMyX3QgaW1tID0gdmFsdWVPZkludDMyQ29uc3RhbnQo
aW1tQ2hpbGQpOworICAgICAgICAKKyAgICBpZiAoIWlzS25vd25JbnRlZ2VyKHJlZ0NoaWxkKSkK
KyAgICAgICAgbm90SW50ID0gbV9qaXQuYnJhbmNoUHRyKE1hY3JvQXNzZW1ibGVyOjpCZWxvdywg
cmVnQXJnR1BSLCBHUFJJbmZvOjp0YWdUeXBlTnVtYmVyUmVnaXN0ZXIpOworICAgIAorICAgIEpJ
VENvbXBpbGVyOjpKdW1wIG92ZXJmbG93OworICAgIAorICAgIHN3aXRjaCAob3ApIHsKKyAgICBj
YXNlIFZhbHVlQWRkOgorICAgIGNhc2UgQXJpdGhBZGQ6CisgICAgICAgIG92ZXJmbG93ID0gbV9q
aXQuYnJhbmNoQWRkMzIoTWFjcm9Bc3NlbWJsZXI6Ok92ZXJmbG93LCByZWdBcmdHUFIsIEltbTMy
KGltbSksIHJlc3VsdEdQUik7CisgICAgICAgIGJyZWFrOworICAgICAgICAKKyAgICBjYXNlIEFy
aXRoU3ViOgorICAgICAgICBvdmVyZmxvdyA9IG1faml0LmJyYW5jaFN1YjMyKE1hY3JvQXNzZW1i
bGVyOjpPdmVyZmxvdywgcmVnQXJnR1BSLCBJbW0zMihpbW0pLCByZXN1bHRHUFIpOworICAgICAg
ICBicmVhazsKKyAgICAgICAgCisgICAgZGVmYXVsdDoKKyAgICAgICAgQVNTRVJUX05PVF9SRUFD
SEVEKCk7CisgICAgfQorICAgIAorICAgIG1faml0Lm9yUHRyKEdQUkluZm86OnRhZ1R5cGVOdW1i
ZXJSZWdpc3RlciwgcmVzdWx0R1BSKTsKKyAgICAgICAgCisgICAgSklUQ29tcGlsZXI6Okp1bXAg
ZG9uZSA9IG1faml0Lmp1bXAoKTsKKyAgICAKKyAgICBvdmVyZmxvdy5saW5rKCZtX2ppdCk7Cisg
ICAgCisgICAgSklUQ29tcGlsZXI6Okp1bXAgbm90TnVtYmVyOworICAgIAorICAgIC8vIGZpcnN0
IGRlYWwgd2l0aCBvdmVyZmxvdyBjYXNlCisgICAgbV9qaXQuY29udmVydEludDMyVG9Eb3VibGUo
cmVnQXJnR1BSLCB0bXAyRlBSKTsKKyAgICAKKyAgICAvLyBub3cgZGVhbCB3aXRoIG5vdC1pbnQg
Y2FzZSwgaWYgYXBwbGljYWJsZQorICAgIGlmICghaXNLbm93bkludGVnZXIocmVnQ2hpbGQpKSB7
CisgICAgICAgIEpJVENvbXBpbGVyOjpKdW1wIGhhdmVWYWx1ZSA9IG1faml0Lmp1bXAoKTsKKyAg
ICAgICAgCisgICAgICAgIG5vdEludC5saW5rKCZtX2ppdCk7CisgICAgICAgIAorICAgICAgICBp
ZiAoIWlzS25vd25OdW1lcmljKHJlZ0NoaWxkKSkgeworICAgICAgICAgICAgQVNTRVJUKG9wID09
IFZhbHVlQWRkKTsKKyAgICAgICAgICAgIG5vdE51bWJlciA9IG1faml0LmJyYW5jaFRlc3RQdHIo
TWFjcm9Bc3NlbWJsZXI6Olplcm8sIHJlZ0FyZ0dQUiwgR1BSSW5mbzo6dGFnVHlwZU51bWJlclJl
Z2lzdGVyKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgbV9qaXQubW92ZShyZWdBcmdH
UFIsIHJlc3VsdEdQUik7CisgICAgICAgIG1faml0LmFkZFB0cihHUFJJbmZvOjp0YWdUeXBlTnVt
YmVyUmVnaXN0ZXIsIHJlc3VsdEdQUik7CisgICAgICAgIG1faml0Lm1vdmVQdHJUb0RvdWJsZShy
ZXN1bHRHUFIsIHRtcDJGUFIpOworICAgICAgICAKKyAgICAgICAgaGF2ZVZhbHVlLmxpbmsoJm1f
aml0KTsKKyAgICB9CisgICAgCisgICAgbV9qaXQubW92ZShNYWNyb0Fzc2VtYmxlcjo6SW1tUHRy
KHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KHJlaW50ZXJwcmV0RG91YmxlVG9JbnRwdHIodmFsdWVP
Zk51bWJlckNvbnN0YW50KGltbUNoaWxkKSkpKSwgcmVzdWx0R1BSKTsKKyAgICBtX2ppdC5tb3Zl
UHRyVG9Eb3VibGUocmVzdWx0R1BSLCB0bXAxRlBSKTsKKyAgICBzd2l0Y2ggKG9wKSB7CisgICAg
Y2FzZSBWYWx1ZUFkZDoKKyAgICBjYXNlIEFyaXRoQWRkOgorICAgICAgICBtX2ppdC5hZGREb3Vi
bGUodG1wMUZQUiwgdG1wMkZQUik7CisgICAgICAgIGJyZWFrOworICAgICAgICAKKyAgICBjYXNl
IEFyaXRoU3ViOgorICAgICAgICBtX2ppdC5zdWJEb3VibGUodG1wMUZQUiwgdG1wMkZQUik7Cisg
ICAgICAgIGJyZWFrOworICAgICAgICAgICAgCisgICAgZGVmYXVsdDoKKyAgICAgICAgQVNTRVJU
X05PVF9SRUFDSEVEKCk7CisgICAgfQorICAgIAorICAgIEpJVENvbXBpbGVyOjpKdW1wIGRvbmVD
YXNlQ29udmVydGVkVG9JbnQ7CisgICAgCisgICAgaWYgKG9wID09IFZhbHVlQWRkKSB7CisgICAg
ICAgIEpJVENvbXBpbGVyOjpKdW1wTGlzdCBmYWlsdXJlQ2FzZXM7CisgICAgICAgIG1faml0LmJy
YW5jaENvbnZlcnREb3VibGVUb0ludDMyKHRtcDJGUFIsIHJlc3VsdEdQUiwgZmFpbHVyZUNhc2Vz
LCB0bXAxRlBSKTsKKyAgICAgICAgbV9qaXQub3JQdHIoR1BSSW5mbzo6dGFnVHlwZU51bWJlclJl
Z2lzdGVyLCByZXN1bHRHUFIpOworICAgICAgICAKKyAgICAgICAgZG9uZUNhc2VDb252ZXJ0ZWRU
b0ludCA9IG1faml0Lmp1bXAoKTsKKyAgICAgICAgCisgICAgICAgIGZhaWx1cmVDYXNlcy5saW5r
KCZtX2ppdCk7CisgICAgfQorICAgIAorICAgIG1faml0Lm1vdmVEb3VibGVUb1B0cih0bXAyRlBS
LCByZXN1bHRHUFIpOworICAgIG1faml0LnN1YlB0cihHUFJJbmZvOjp0YWdUeXBlTnVtYmVyUmVn
aXN0ZXIsIHJlc3VsdEdQUik7CisgICAgICAgIAorICAgIGlmICghaXNLbm93bk51bWVyaWMocmVn
Q2hpbGQpKSB7CisgICAgICAgIEFTU0VSVChub3ROdW1iZXIuaXNTZXQoKSk7CisgICAgICAgIEFT
U0VSVChvcCA9PSBWYWx1ZUFkZCk7CisgICAgICAgICAgICAKKyAgICAgICAgSklUQ29tcGlsZXI6
Okp1bXAgZG9uZUNhc2VXYXNOdW1iZXIgPSBtX2ppdC5qdW1wKCk7CisgICAgICAgICAgICAKKyAg
ICAgICAgbm90TnVtYmVyLmxpbmsoJm1faml0KTsKKyAgICAgICAgICAgIAorICAgICAgICBzaWxl
bnRTcGlsbEFsbFJlZ2lzdGVycyhyZXN1bHRHUFIpOworICAgICAgICBpZiAoY29tbXV0ZSkgewor
ICAgICAgICAgICAgbV9qaXQubW92ZShyZWdBcmdHUFIsIEdQUkluZm86OmFyZ3VtZW50R1BSMik7
CisgICAgICAgICAgICBtX2ppdC5tb3ZlKE1hY3JvQXNzZW1ibGVyOjpJbW1QdHIoc3RhdGljX2Nh
c3Q8Y29uc3Qgdm9pZCo+KEpTVmFsdWU6OmVuY29kZShqc051bWJlcihpbW0pKSkpLCBHUFJJbmZv
Ojphcmd1bWVudEdQUjEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbV9qaXQubW92
ZShyZWdBcmdHUFIsIEdQUkluZm86OmFyZ3VtZW50R1BSMSk7CisgICAgICAgICAgICBtX2ppdC5t
b3ZlKE1hY3JvQXNzZW1ibGVyOjpJbW1QdHIoc3RhdGljX2Nhc3Q8Y29uc3Qgdm9pZCo+KEpTVmFs
dWU6OmVuY29kZShqc051bWJlcihpbW0pKSkpLCBHUFJJbmZvOjphcmd1bWVudEdQUjIpOworICAg
ICAgICB9CisgICAgICAgIG1faml0Lm1vdmUoR1BSSW5mbzo6Y2FsbEZyYW1lUmVnaXN0ZXIsIEdQ
UkluZm86OmFyZ3VtZW50R1BSMCk7CisgICAgICAgIGFwcGVuZENhbGxXaXRoRXhjZXB0aW9uQ2hl
Y2sob3BlcmF0aW9uVmFsdWVBZGROb3ROdW1iZXIpOworICAgICAgICBtX2ppdC5tb3ZlKEdQUklu
Zm86OnJldHVyblZhbHVlR1BSLCByZXN1bHRHUFIpOworICAgICAgICBzaWxlbnRGaWxsQWxsUmVn
aXN0ZXJzKHJlc3VsdEdQUik7CisgICAgICAgICAgICAKKyAgICAgICAgZG9uZUNhc2VXYXNOdW1i
ZXIubGluaygmbV9qaXQpOworICAgIH0KKyAgICAKKyAgICBkb25lLmxpbmsoJm1faml0KTsKKyAg
ICBpZiAoZG9uZUNhc2VDb252ZXJ0ZWRUb0ludC5pc1NldCgpKQorICAgICAgICBkb25lQ2FzZUNv
bnZlcnRlZFRvSW50LmxpbmsoJm1faml0KTsKKyAgICAgICAgCisgICAganNWYWx1ZVJlc3VsdChy
ZXN1bHRHUFIsIG1fY29tcGlsZUluZGV4LCBVc2VDaGlsZHJlbkNhbGxlZEV4cGxpY2l0bHkpOwor
fQorCit2b2lkIEpJVENvZGVHZW5lcmF0b3I6Om5vblNwZWN1bGF0aXZlQmFzaWNBcml0aE9wKE5v
ZGVUeXBlIG9wLCBOb2RlICZub2RlKQoreworICAgIEpTVmFsdWVPcGVyYW5kIGFyZzEodGhpcywg
bm9kZS5jaGlsZDEoKSk7CisgICAgSlNWYWx1ZU9wZXJhbmQgYXJnMih0aGlzLCBub2RlLmNoaWxk
MigpKTsKKyAgICAKKyAgICBGUFJUZW1wb3JhcnkgdG1wMSh0aGlzKTsKKyAgICBGUFJUZW1wb3Jh
cnkgdG1wMih0aGlzKTsKKyAgICBGUFJSZWcgdG1wMUZQUiA9IHRtcDEuZnByKCk7CisgICAgRlBS
UmVnIHRtcDJGUFIgPSB0bXAyLmZwcigpOworICAgIAorICAgIEdQUlRlbXBvcmFyeSByZXN1bHQo
dGhpcyk7CisKKyAgICBHUFJSZWcgYXJnMUdQUiA9IGFyZzEuZ3ByKCk7CisgICAgR1BSUmVnIGFy
ZzJHUFIgPSBhcmcyLmdwcigpOworICAgIAorICAgIEdQUlJlZyByZXN1bHRHUFIgPSByZXN1bHQu
Z3ByKCk7CisgICAgCisgICAgYXJnMS51c2UoKTsKKyAgICBhcmcyLnVzZSgpOworICAgIAorICAg
IEpJVENvbXBpbGVyOjpKdW1wIGNoaWxkMU5vdEludDsKKyAgICBKSVRDb21waWxlcjo6SnVtcCBj
aGlsZDJOb3RJbnQ7CisgICAgSklUQ29tcGlsZXI6Okp1bXBMaXN0IG92ZXJmbG93OworICAgIAor
ICAgIGlmICghaXNLbm93bkludGVnZXIobm9kZS5jaGlsZDEoKSkpCisgICAgICAgIGNoaWxkMU5v
dEludCA9IG1faml0LmJyYW5jaFB0cihNYWNyb0Fzc2VtYmxlcjo6QmVsb3csIGFyZzFHUFIsIEdQ
UkluZm86OnRhZ1R5cGVOdW1iZXJSZWdpc3Rlcik7CisgICAgaWYgKCFpc0tub3duSW50ZWdlcihu
b2RlLmNoaWxkMigpKSkKKyAgICAgICAgY2hpbGQyTm90SW50ID0gbV9qaXQuYnJhbmNoUHRyKE1h
Y3JvQXNzZW1ibGVyOjpCZWxvdywgYXJnMkdQUiwgR1BSSW5mbzo6dGFnVHlwZU51bWJlclJlZ2lz
dGVyKTsKKyAgICAKKyAgICBzd2l0Y2ggKG9wKSB7CisgICAgY2FzZSBWYWx1ZUFkZDoKKyAgICBj
YXNlIEFyaXRoQWRkOiB7CisgICAgICAgIG92ZXJmbG93LmFwcGVuZChtX2ppdC5icmFuY2hBZGQz
MihNYWNyb0Fzc2VtYmxlcjo6T3ZlcmZsb3csIGFyZzFHUFIsIGFyZzJHUFIsIHJlc3VsdEdQUikp
OworICAgICAgICBicmVhazsKKyAgICB9CisgICAgICAgIAorICAgIGNhc2UgQXJpdGhTdWI6IHsK
KyAgICAgICAgb3ZlcmZsb3cuYXBwZW5kKG1faml0LmJyYW5jaFN1YjMyKE1hY3JvQXNzZW1ibGVy
OjpPdmVyZmxvdywgYXJnMUdQUiwgYXJnMkdQUiwgcmVzdWx0R1BSKSk7CisgICAgICAgIGJyZWFr
OworICAgIH0KKyAgICAgICAgCisgICAgY2FzZSBBcml0aE11bDogeworICAgICAgICBvdmVyZmxv
dy5hcHBlbmQobV9qaXQuYnJhbmNoTXVsMzIoTWFjcm9Bc3NlbWJsZXI6Ok92ZXJmbG93LCBhcmcx
R1BSLCBhcmcyR1BSLCByZXN1bHRHUFIpKTsKKyAgICAgICAgb3ZlcmZsb3cuYXBwZW5kKG1faml0
LmJyYW5jaFRlc3QzMihNYWNyb0Fzc2VtYmxlcjo6WmVybywgcmVzdWx0R1BSKSk7CisgICAgICAg
IGJyZWFrOworICAgIH0KKyAgICAgICAgCisgICAgZGVmYXVsdDoKKyAgICAgICAgQVNTRVJUX05P
VF9SRUFDSEVEKCk7CisgICAgfQorICAgIAorICAgIG1faml0Lm9yUHRyKEdQUkluZm86OnRhZ1R5
cGVOdW1iZXJSZWdpc3RlciwgcmVzdWx0R1BSKTsKKyAgICAgICAgCisgICAgSklUQ29tcGlsZXI6
Okp1bXAgZG9uZSA9IG1faml0Lmp1bXAoKTsKKyAgICAKKyAgICBKSVRDb21waWxlcjo6SnVtcExp
c3QgaGF2ZUZQUkFyZ3VtZW50czsKKworICAgIG92ZXJmbG93LmxpbmsoJm1faml0KTsKKyAgICAg
ICAgCisgICAgLy8gYm90aCBhcmd1bWVudHMgYXJlIGludGVnZXJzCisgICAgbV9qaXQuY29udmVy
dEludDMyVG9Eb3VibGUoYXJnMUdQUiwgdG1wMUZQUik7CisgICAgbV9qaXQuY29udmVydEludDMy
VG9Eb3VibGUoYXJnMkdQUiwgdG1wMkZQUik7CisgICAgICAgIAorICAgIGhhdmVGUFJBcmd1bWVu
dHMuYXBwZW5kKG1faml0Lmp1bXAoKSk7CisgICAgICAgIAorICAgIEpJVENvbXBpbGVyOjpKdW1w
TGlzdCBub3ROdW1iZXJzOworICAgICAgICAKKyAgICBKSVRDb21waWxlcjo6SnVtcCBjaGlsZDJO
b3RJbnQyOworICAgICAgICAKKyAgICBpZiAoIWlzS25vd25JbnRlZ2VyKG5vZGUuY2hpbGQxKCkp
KSB7CisgICAgICAgIGNoaWxkMU5vdEludC5saW5rKCZtX2ppdCk7CisgICAgICAgICAgICAKKyAg
ICAgICAgaWYgKCFpc0tub3duTnVtZXJpYyhub2RlLmNoaWxkMSgpKSkgeworICAgICAgICAgICAg
QVNTRVJUKG9wID09IFZhbHVlQWRkKTsKKyAgICAgICAgICAgIG5vdE51bWJlcnMuYXBwZW5kKG1f
aml0LmJyYW5jaFRlc3RQdHIoTWFjcm9Bc3NlbWJsZXI6Olplcm8sIGFyZzFHUFIsIEdQUkluZm86
OnRhZ1R5cGVOdW1iZXJSZWdpc3RlcikpOworICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAg
ICAgbV9qaXQubW92ZShhcmcxR1BSLCByZXN1bHRHUFIpOworICAgICAgICB1bmJveERvdWJsZShy
ZXN1bHRHUFIsIHRtcDFGUFIpOworICAgICAgICAgICAgCisgICAgICAgIC8vIGNoaWxkMSBpcyBj
b252ZXJ0ZWQgdG8gYSBkb3VibGU7IGNoaWxkMiBtYXkgZWl0aGVyIGJlIGFuIGludCBvcgorICAg
ICAgICAvLyBhIGJveGVkIGRvdWJsZQorICAgICAgICAgICAgCisgICAgICAgIGlmICghaXNLbm93
bkludGVnZXIobm9kZS5jaGlsZDIoKSkpIHsKKyAgICAgICAgICAgIGlmIChpc0tub3duTnVtZXJp
Yyhub2RlLmNoaWxkMigpKSkKKyAgICAgICAgICAgICAgICBjaGlsZDJOb3RJbnQyID0gbV9qaXQu
YnJhbmNoUHRyKE1hY3JvQXNzZW1ibGVyOjpCZWxvdywgYXJnMkdQUiwgR1BSSW5mbzo6dGFnVHlw
ZU51bWJlclJlZ2lzdGVyKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIEFT
U0VSVChvcCA9PSBWYWx1ZUFkZCk7CisgICAgICAgICAgICAgICAgSklUQ29tcGlsZXI6Okp1bXAg
Y2hpbGQySXNJbnQgPSBtX2ppdC5icmFuY2hQdHIoTWFjcm9Bc3NlbWJsZXI6OkFib3ZlT3JFcXVh
bCwgYXJnMkdQUiwgR1BSSW5mbzo6dGFnVHlwZU51bWJlclJlZ2lzdGVyKTsKKyAgICAgICAgICAg
ICAgICBub3ROdW1iZXJzLmFwcGVuZChtX2ppdC5icmFuY2hUZXN0UHRyKE1hY3JvQXNzZW1ibGVy
OjpaZXJvLCBhcmcyR1BSLCBHUFJJbmZvOjp0YWdUeXBlTnVtYmVyUmVnaXN0ZXIpKTsKKyAgICAg
ICAgICAgICAgICBjaGlsZDJOb3RJbnQyID0gbV9qaXQuanVtcCgpOworICAgICAgICAgICAgICAg
IGNoaWxkMklzSW50LmxpbmsoJm1faml0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAg
ICAgICAgICAgCisgICAgICAgIC8vIGNoaWxkIDIgaXMgZGVmaW5pdGVseSBhbiBpbnRlZ2VyCisg
ICAgICAgIG1faml0LmNvbnZlcnRJbnQzMlRvRG91YmxlKGFyZzJHUFIsIHRtcDJGUFIpOworICAg
ICAgICAgICAgCisgICAgICAgIGhhdmVGUFJBcmd1bWVudHMuYXBwZW5kKG1faml0Lmp1bXAoKSk7
CisgICAgfQorICAgICAgICAKKyAgICBpZiAoIWlzS25vd25JbnRlZ2VyKG5vZGUuY2hpbGQyKCkp
KSB7CisgICAgICAgIGNoaWxkMk5vdEludC5saW5rKCZtX2ppdCk7CisgICAgICAgICAgICAKKyAg
ICAgICAgaWYgKCFpc0tub3duTnVtZXJpYyhub2RlLmNoaWxkMigpKSkgeworICAgICAgICAgICAg
QVNTRVJUKG9wID09IFZhbHVlQWRkKTsKKyAgICAgICAgICAgIG5vdE51bWJlcnMuYXBwZW5kKG1f
aml0LmJyYW5jaFRlc3RQdHIoTWFjcm9Bc3NlbWJsZXI6Olplcm8sIGFyZzJHUFIsIEdQUkluZm86
OnRhZ1R5cGVOdW1iZXJSZWdpc3RlcikpOworICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAg
ICAgLy8gY2hpbGQxIGlzIGRlZmluaXRlbHkgYW4gaW50ZWdlciwgYW5kIGNoaWxkIDIgaXMgZGVm
aW5pdGVseSBub3QKKyAgICAgICAgICAgIAorICAgICAgICBtX2ppdC5jb252ZXJ0SW50MzJUb0Rv
dWJsZShhcmcxR1BSLCB0bXAxRlBSKTsKKyAgICAgICAgICAgIAorICAgICAgICBpZiAoY2hpbGQy
Tm90SW50Mi5pc1NldCgpKQorICAgICAgICAgICAgY2hpbGQyTm90SW50Mi5saW5rKCZtX2ppdCk7
CisgICAgICAgICAgICAKKyAgICAgICAgbV9qaXQubW92ZShhcmcyR1BSLCByZXN1bHRHUFIpOwor
ICAgICAgICB1bmJveERvdWJsZShyZXN1bHRHUFIsIHRtcDJGUFIpOworICAgIH0KKyAgICAgICAg
CisgICAgaGF2ZUZQUkFyZ3VtZW50cy5saW5rKCZtX2ppdCk7CisgICAgICAgIAorICAgIHN3aXRj
aCAob3ApIHsKKyAgICBjYXNlIFZhbHVlQWRkOgorICAgIGNhc2UgQXJpdGhBZGQ6CisgICAgICAg
IG1faml0LmFkZERvdWJsZSh0bXAyRlBSLCB0bXAxRlBSKTsKKyAgICAgICAgYnJlYWs7CisgICAg
ICAgICAgICAKKyAgICBjYXNlIEFyaXRoU3ViOgorICAgICAgICBtX2ppdC5zdWJEb3VibGUodG1w
MkZQUiwgdG1wMUZQUik7CisgICAgICAgIGJyZWFrOworICAgICAgICAgICAgCisgICAgY2FzZSBB
cml0aE11bDoKKyAgICAgICAgbV9qaXQubXVsRG91YmxlKHRtcDJGUFIsIHRtcDFGUFIpOworICAg
ICAgICBicmVhazsKKyAgICAgICAgICAgIAorICAgIGRlZmF1bHQ6CisgICAgICAgIEFTU0VSVF9O
T1RfUkVBQ0hFRCgpOworICAgIH0KKyAgICAKKyAgICBKSVRDb21waWxlcjo6SnVtcCBkb25lQ2Fz
ZUNvbnZlcnRlZFRvSW50OworICAgIAorICAgIGlmIChvcCA9PSBWYWx1ZUFkZCkgeworICAgICAg
ICBKSVRDb21waWxlcjo6SnVtcExpc3QgZmFpbHVyZUNhc2VzOworICAgICAgICBtX2ppdC5icmFu
Y2hDb252ZXJ0RG91YmxlVG9JbnQzMih0bXAxRlBSLCByZXN1bHRHUFIsIGZhaWx1cmVDYXNlcywg
dG1wMkZQUik7CisgICAgICAgIG1faml0Lm9yUHRyKEdQUkluZm86OnRhZ1R5cGVOdW1iZXJSZWdp
c3RlciwgcmVzdWx0R1BSKTsKKyAgICAgICAgCisgICAgICAgIGRvbmVDYXNlQ29udmVydGVkVG9J
bnQgPSBtX2ppdC5qdW1wKCk7CisgICAgICAgIAorICAgICAgICBmYWlsdXJlQ2FzZXMubGluaygm
bV9qaXQpOworICAgIH0KKyAgICAgICAgCisgICAgYm94RG91YmxlKHRtcDFGUFIsIHJlc3VsdEdQ
Uik7CisgICAgICAgIAorICAgIGlmICghbm90TnVtYmVycy5lbXB0eSgpKSB7CisgICAgICAgIEFT
U0VSVChvcCA9PSBWYWx1ZUFkZCk7CisgICAgICAgICAgICAKKyAgICAgICAgSklUQ29tcGlsZXI6
Okp1bXAgZG9uZUNhc2VXYXNOdW1iZXIgPSBtX2ppdC5qdW1wKCk7CisgICAgICAgICAgICAKKyAg
ICAgICAgbm90TnVtYmVycy5saW5rKCZtX2ppdCk7CisgICAgICAgICAgICAKKyAgICAgICAgc2ls
ZW50U3BpbGxBbGxSZWdpc3RlcnMocmVzdWx0R1BSKTsKKyAgICAgICAgc2V0dXBTdHViQXJndW1l
bnRzKGFyZzFHUFIsIGFyZzJHUFIpOworICAgICAgICBtX2ppdC5tb3ZlKEdQUkluZm86OmNhbGxG
cmFtZVJlZ2lzdGVyLCBHUFJJbmZvOjphcmd1bWVudEdQUjApOworICAgICAgICBhcHBlbmRDYWxs
V2l0aEV4Y2VwdGlvbkNoZWNrKG9wZXJhdGlvblZhbHVlQWRkTm90TnVtYmVyKTsKKyAgICAgICAg
bV9qaXQubW92ZShHUFJJbmZvOjpyZXR1cm5WYWx1ZUdQUiwgcmVzdWx0R1BSKTsKKyAgICAgICAg
c2lsZW50RmlsbEFsbFJlZ2lzdGVycyhyZXN1bHRHUFIpOworCisgICAgICAgIGRvbmVDYXNlV2Fz
TnVtYmVyLmxpbmsoJm1faml0KTsKKyAgICB9CisgICAgCisgICAgZG9uZS5saW5rKCZtX2ppdCk7
CisgICAgaWYgKGRvbmVDYXNlQ29udmVydGVkVG9JbnQuaXNTZXQoKSkKKyAgICAgICAgZG9uZUNh
c2VDb252ZXJ0ZWRUb0ludC5saW5rKCZtX2ppdCk7CisgICAgICAgIAorICAgIGpzVmFsdWVSZXN1
bHQocmVzdWx0R1BSLCBtX2NvbXBpbGVJbmRleCwgVXNlQ2hpbGRyZW5DYWxsZWRFeHBsaWNpdGx5
KTsKK30KKwordm9pZCBKSVRDb2RlR2VuZXJhdG9yOjpub25TcGVjdWxhdGl2ZUFyaXRoTW9kKE5v
ZGUmIG5vZGUpCit7CisgICAgSlNWYWx1ZU9wZXJhbmQgb3AxKHRoaXMsIG5vZGUuY2hpbGQxKCkp
OworICAgIEpTVmFsdWVPcGVyYW5kIG9wMih0aGlzLCBub2RlLmNoaWxkMigpKTsKKyAgICBHUFJU
ZW1wb3JhcnkgZWF4KHRoaXMsIFg4NlJlZ2lzdGVyczo6ZWF4KTsKKyAgICBHUFJUZW1wb3Jhcnkg
ZWR4KHRoaXMsIFg4NlJlZ2lzdGVyczo6ZWR4KTsKKworICAgIEZQUlRlbXBvcmFyeSBvcDFEb3Vi
bGUodGhpcyk7CisgICAgRlBSVGVtcG9yYXJ5IG9wMkRvdWJsZSh0aGlzKTsKKyAgICAKKyAgICBH
UFJSZWcgb3AxR1BSID0gb3AxLmdwcigpOworICAgIEdQUlJlZyBvcDJHUFIgPSBvcDIuZ3ByKCk7
CisgICAgCisgICAgRlBSUmVnIG9wMUZQUiA9IG9wMURvdWJsZS5mcHIoKTsKKyAgICBGUFJSZWcg
b3AyRlBSID0gb3AyRG91YmxlLmZwcigpOworICAgICAgICAKKyAgICBvcDEudXNlKCk7CisgICAg
b3AyLnVzZSgpOworICAgIAorICAgIEdQUlJlZyB0ZW1wMiA9IEludmFsaWRHUFJSZWc7CisgICAg
R1BSUmVnIHVuYm94R1BSOworICAgIGlmIChvcDJHUFIgPT0gWDg2UmVnaXN0ZXJzOjplYXggfHwg
b3AyR1BSID09IFg4NlJlZ2lzdGVyczo6ZWR4KSB7CisgICAgICAgIHRlbXAyID0gYWxsb2NhdGUo
KTsKKyAgICAgICAgbV9qaXQubW92ZShvcDJHUFIsIHRlbXAyKTsKKyAgICAgICAgb3AyR1BSID0g
dGVtcDI7CisgICAgICAgIHVuYm94R1BSID0gdGVtcDI7CisgICAgfSBlbHNlIGlmIChvcDFHUFIg
PT0gWDg2UmVnaXN0ZXJzOjplYXgpCisgICAgICAgIHVuYm94R1BSID0gWDg2UmVnaXN0ZXJzOjpl
ZHg7CisgICAgZWxzZQorICAgICAgICB1bmJveEdQUiA9IFg4NlJlZ2lzdGVyczo6ZWF4OworICAg
IEFTU0VSVCh1bmJveEdQUiAhPSBvcDEuZ3ByKCkpOworICAgIEFTU0VSVCh1bmJveEdQUiAhPSBv
cDIuZ3ByKCkpOworCisgICAgSklUQ29tcGlsZXI6Okp1bXAgZmlyc3RPcE5vdEludDsKKyAgICBK
SVRDb21waWxlcjo6SnVtcCBzZWNvbmRPcE5vdEludDsKKyAgICBKSVRDb21waWxlcjo6SnVtcExp
c3QgZG9uZTsKKyAgICBKSVRDb21waWxlcjo6SnVtcCBtb2RCeVplcm87CisgICAgCisgICAgaWYg
KCFpc0tub3duSW50ZWdlcihub2RlLmNoaWxkMSgpKSkKKyAgICAgICAgZmlyc3RPcE5vdEludCA9
IG1faml0LmJyYW5jaFB0cihNYWNyb0Fzc2VtYmxlcjo6QmVsb3csIG9wMUdQUiwgR1BSSW5mbzo6
dGFnVHlwZU51bWJlclJlZ2lzdGVyKTsKKyAgICBpZiAoIWlzS25vd25JbnRlZ2VyKG5vZGUuY2hp
bGQyKCkpKQorICAgICAgICBzZWNvbmRPcE5vdEludCA9IG1faml0LmJyYW5jaFB0cihNYWNyb0Fz
c2VtYmxlcjo6QmVsb3csIG9wMkdQUiwgR1BSSW5mbzo6dGFnVHlwZU51bWJlclJlZ2lzdGVyKTsK
KyAgICAKKyAgICBtb2RCeVplcm8gPSBtX2ppdC5icmFuY2hUZXN0MzIoTWFjcm9Bc3NlbWJsZXI6
Olplcm8sIG9wMkdQUik7CisgICAgCisgICAgbV9qaXQubW92ZShvcDFHUFIsIGVheC5ncHIoKSk7
CisgICAgbV9qaXQuYXNzZW1ibGVyKCkuY2RxKCk7CisgICAgbV9qaXQuYXNzZW1ibGVyKCkuaWRp
dmxfcihvcDJHUFIpOworICAgIAorICAgIG1faml0Lm9yUHRyKEdQUkluZm86OnRhZ1R5cGVOdW1i
ZXJSZWdpc3RlciwgWDg2UmVnaXN0ZXJzOjplZHgpOworICAgIAorICAgIGRvbmUuYXBwZW5kKG1f
aml0Lmp1bXAoKSk7CisgICAgICAgIAorICAgIEpJVENvbXBpbGVyOjpKdW1wIGdvdERvdWJsZUFy
Z3M7CisgICAgCisgICAgbW9kQnlaZXJvLmxpbmsoJm1faml0KTsKKyAgICAgICAgCisgICAgbV9q
aXQubW92ZShNYWNyb0Fzc2VtYmxlcjo6VHJ1c3RlZEltbVB0cihKU1ZhbHVlOjplbmNvZGUoanNO
dW1iZXIoc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjpxdWlldF9OYU4oKSkpKSwgWDg2UmVn
aXN0ZXJzOjplZHgpOworICAgIGRvbmUuYXBwZW5kKG1faml0Lmp1bXAoKSk7CisgICAgCisgICAg
aWYgKCFpc0tub3duSW50ZWdlcihub2RlLmNoaWxkMSgpKSkgeworICAgICAgICBmaXJzdE9wTm90
SW50LmxpbmsoJm1faml0KTsKKyAgICAgICAgCisgICAgICAgIEpJVENvbXBpbGVyOjpKdW1wIHNl
Y29uZE9wTm90SW50MjsKKyAgICAgICAgCisgICAgICAgIGlmICghaXNLbm93bkludGVnZXIobm9k
ZS5jaGlsZDIoKSkpCisgICAgICAgICAgICBzZWNvbmRPcE5vdEludDIgPSBtX2ppdC5icmFuY2hQ
dHIoTWFjcm9Bc3NlbWJsZXI6OkJlbG93LCBvcDJHUFIsIEdQUkluZm86OnRhZ1R5cGVOdW1iZXJS
ZWdpc3Rlcik7CisgICAgICAgICAgICAKKyAgICAgICAgLy8gZmlyc3Qgb3AgaXMgYSBkb3VibGUs
IHNlY29uZCBvcCBpcyBhbiBpbnQuCisgICAgICAgIG1faml0LmNvbnZlcnRJbnQzMlRvRG91Ymxl
KG9wMkdQUiwgb3AyRlBSKTsKKworICAgICAgICBpZiAoIWlzS25vd25JbnRlZ2VyKG5vZGUuY2hp
bGQyKCkpKSB7CisgICAgICAgICAgICBKSVRDb21waWxlcjo6SnVtcCBnb3RTZWNvbmRPcCA9IG1f
aml0Lmp1bXAoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgc2Vjb25kT3BOb3RJbnQyLmxp
bmsoJm1faml0KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gZmlyc3Qgb3AgaXMgYSBk
b3VibGUsIHNlY29uZCBvcCBpcyBhIGRvdWJsZS4KKyAgICAgICAgICAgIG1faml0Lm1vdmUob3Ay
R1BSLCB1bmJveEdQUik7CisgICAgICAgICAgICB1bmJveERvdWJsZSh1bmJveEdQUiwgb3AyRlBS
KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgZ290U2Vjb25kT3AubGluaygmbV9qaXQpOwor
ICAgICAgICB9CisgICAgICAgIAorICAgICAgICBtX2ppdC5tb3ZlKG9wMUdQUiwgdW5ib3hHUFIp
OworICAgICAgICB1bmJveERvdWJsZSh1bmJveEdQUiwgb3AxRlBSKTsKKyAgICAgICAgCisgICAg
ICAgIGdvdERvdWJsZUFyZ3MgPSBtX2ppdC5qdW1wKCk7CisgICAgfQorICAgIAorICAgIGlmICgh
aXNLbm93bkludGVnZXIobm9kZS5jaGlsZDIoKSkpIHsKKyAgICAgICAgc2Vjb25kT3BOb3RJbnQu
bGluaygmbV9qaXQpOworICAgICAgICAKKyAgICAgICAgLy8gd2Uga25vdyB0aGF0IHRoZSBmaXJz
dCBvcCBpcyBhbiBpbnQsIGFuZCB0aGUgc2Vjb25kIGlzIGEgZG91YmxlCisgICAgICAgIG1faml0
LmNvbnZlcnRJbnQzMlRvRG91YmxlKG9wMUdQUiwgb3AxRlBSKTsKKyAgICAgICAgbV9qaXQubW92
ZShvcDJHUFIsIHVuYm94R1BSKTsKKyAgICAgICAgdW5ib3hEb3VibGUodW5ib3hHUFIsIG9wMkZQ
Uik7CisgICAgfQorICAgIAorICAgIGlmICghaXNLbm93bkludGVnZXIobm9kZS5jaGlsZDEoKSkp
CisgICAgICAgIGdvdERvdWJsZUFyZ3MubGluaygmbV9qaXQpOworICAgIAorICAgIGlmICghaXNL
bm93bkludGVnZXIobm9kZS5jaGlsZDEoKSkgfHwgIWlzS25vd25JbnRlZ2VyKG5vZGUuY2hpbGQy
KCkpKSB7CisgICAgICAgIHNpbGVudFNwaWxsQWxsUmVnaXN0ZXJzKFg4NlJlZ2lzdGVyczo6ZWR4
KTsKKyAgICAgICAgc2V0dXBUd29TdHViQXJnczxGUFJJbmZvOjphcmd1bWVudEZQUjAsIEZQUklu
Zm86OmFyZ3VtZW50RlBSMT4ob3AxRlBSLCBvcDJGUFIpOworICAgICAgICBtX2ppdC5hcHBlbmRD
YWxsKGZtb2QpOworICAgICAgICBib3hEb3VibGUoRlBSSW5mbzo6cmV0dXJuVmFsdWVGUFIsIFg4
NlJlZ2lzdGVyczo6ZWR4KTsKKyAgICAgICAgc2lsZW50RmlsbEFsbFJlZ2lzdGVycyhYODZSZWdp
c3RlcnM6OmVkeCk7CisgICAgfQorICAgICAgICAKKyAgICBkb25lLmxpbmsoJm1faml0KTsKKyAg
ICAKKyAgICBpZiAodGVtcDIgIT0gSW52YWxpZEdQUlJlZykKKyAgICAgICAgdW5sb2NrKHRlbXAy
KTsKKyAgICAKKyAgICBqc1ZhbHVlUmVzdWx0KFg4NlJlZ2lzdGVyczo6ZWR4LCBtX2NvbXBpbGVJ
bmRleCwgVXNlQ2hpbGRyZW5DYWxsZWRFeHBsaWNpdGx5KTsKK30KKwordm9pZCBKSVRDb2RlR2Vu
ZXJhdG9yOjpub25TcGVjdWxhdGl2ZUNoZWNrSGFzSW5zdGFuY2UoTm9kZSYgbm9kZSkKK3sKKyAg
ICBKU1ZhbHVlT3BlcmFuZCBiYXNlKHRoaXMsIG5vZGUuY2hpbGQxKCkpOworICAgIEdQUlRlbXBv
cmFyeSBzdHJ1Y3R1cmUodGhpcyk7CisgICAgCisgICAgR1BSUmVnIGJhc2VSZWcgPSBiYXNlLmdw
cigpOworICAgIEdQUlJlZyBzdHJ1Y3R1cmVSZWcgPSBzdHJ1Y3R1cmUuZ3ByKCk7CisgICAgCisg
ICAgLy8gQ2hlY2sgdGhhdCBiYXNlIGlzIGEgY2VsbC4KKyAgICBNYWNyb0Fzc2VtYmxlcjo6SnVt
cCBiYXNlTm90Q2VsbCA9IG1faml0LmJyYW5jaFRlc3RQdHIoTWFjcm9Bc3NlbWJsZXI6Ok5vblpl
cm8sIGJhc2VSZWcsIEdQUkluZm86OnRhZ01hc2tSZWdpc3Rlcik7CisgICAgCisgICAgLy8gQ2hl
Y2sgdGhhdCBiYXNlICdJbXBsZW1lbnRzSGFzSW5zdGFuY2UnLgorICAgIG1faml0LmxvYWRQdHIo
TWFjcm9Bc3NlbWJsZXI6OkFkZHJlc3MoYmFzZVJlZywgSlNDZWxsOjpzdHJ1Y3R1cmVPZmZzZXQo
KSksIHN0cnVjdHVyZVJlZyk7CisgICAgTWFjcm9Bc3NlbWJsZXI6Okp1bXAgaW1wbGVtZW50c0hh
c0luc3RhbmNlID0gbV9qaXQuYnJhbmNoVGVzdDgoTWFjcm9Bc3NlbWJsZXI6Ok5vblplcm8sIE1h
Y3JvQXNzZW1ibGVyOjpBZGRyZXNzKHN0cnVjdHVyZVJlZywgU3RydWN0dXJlOjp0eXBlSW5mb0Zs
YWdzT2Zmc2V0KCkpLCBNYWNyb0Fzc2VtYmxlcjo6VHJ1c3RlZEltbTMyKEltcGxlbWVudHNIYXNJ
bnN0YW5jZSkpOworICAgIAorICAgIC8vIEF0IHRoaXMgcG9pbnQgd2UgYWx3YXlzIHRocm93LCBz
byBubyBuZWVkIHRvIHByZXNlcnZlIHJlZ2lzdGVycy4KKyAgICBiYXNlTm90Q2VsbC5saW5rKCZt
X2ppdCk7CisgICAgbV9qaXQubW92ZShiYXNlUmVnLCBHUFJJbmZvOjphcmd1bWVudEdQUjEpOwor
ICAgIG1faml0Lm1vdmUoR1BSSW5mbzo6Y2FsbEZyYW1lUmVnaXN0ZXIsIEdQUkluZm86OmFyZ3Vt
ZW50R1BSMCk7CisgICAgLy8gQXQgc29tZSBwb2ludCB3ZSBjb3VsZCBvcHRpbWl6ZSB0aGlzIHRv
IHBsYW50IGEgZGlyZWN0IGp1bXAsIHJhdGhlciB0aGVuIGNoZWNraW5nCisgICAgLy8gZm9yIGFu
IGV4Y2VwdGlvbiAob3BlcmF0aW9uVGhyb3dIYXNJbnN0YW5jZUVycm9yIGFsd2F5cyB0aHJvd3Mp
LiBQcm9iYWJseSBub3Qgd29ydGgKKyAgICAvLyBhZGRpbmcgdGhlIGV4dHJhIGludGVyZmFjZSB0
byBkbyB0aGlzIG5vdywgYnV0IHdlIG1heSBhbHNvIHdhbnQgdGhpcyBmb3Igb3BfdGhyb3cuCisg
ICAgYXBwZW5kQ2FsbFdpdGhFeGNlcHRpb25DaGVjayhvcGVyYXRpb25UaHJvd0hhc0luc3RhbmNl
RXJyb3IpOworICAgIAorICAgIGltcGxlbWVudHNIYXNJbnN0YW5jZS5saW5rKCZtX2ppdCk7Cisg
ICAgbm9SZXN1bHQobV9jb21waWxlSW5kZXgpOworfQorCit2b2lkIEpJVENvZGVHZW5lcmF0b3I6
Om5vblNwZWN1bGF0aXZlSW5zdGFuY2VPZihOb2RlJiBub2RlKQoreworICAgIEpTVmFsdWVPcGVy
YW5kIHZhbHVlKHRoaXMsIG5vZGUuY2hpbGQxKCkpOworICAgIEpTVmFsdWVPcGVyYW5kIGJhc2Uo
dGhpcywgbm9kZS5jaGlsZDIoKSk7CisgICAgSlNWYWx1ZU9wZXJhbmQgcHJvdG90eXBlKHRoaXMs
IG5vZGUuY2hpbGQzKCkpOworICAgIEdQUlRlbXBvcmFyeSBzY3JhdGNoKHRoaXMsIGJhc2UpOwor
CisgICAgR1BSUmVnIHZhbHVlUmVnID0gdmFsdWUuZ3ByKCk7CisgICAgR1BSUmVnIGJhc2VSZWcg
PSBiYXNlLmdwcigpOworICAgIEdQUlJlZyBwcm90b3R5cGVSZWcgPSBwcm90b3R5cGUuZ3ByKCk7
CisgICAgR1BSUmVnIHNjcmF0Y2hSZWcgPSBzY3JhdGNoLmdwcigpOworICAgICAgICAKKyAgICB2
YWx1ZS51c2UoKTsKKyAgICBiYXNlLnVzZSgpOworICAgIHByb3RvdHlwZS51c2UoKTsKKworICAg
IC8vIENoZWNrIHRoYXQgb3BlcmFuZHMgYXJlIGNlbGxzIChiYXNlIGlzIGNoZWNrZWQgYnkgQ2hl
Y2tIYXNJbnN0YW5jZSwgc28gd2UgY2FuIGp1c3QgYXNzZXJ0KS4KKyAgICBNYWNyb0Fzc2VtYmxl
cjo6SnVtcCB2YWx1ZU5vdENlbGwgPSBtX2ppdC5icmFuY2hUZXN0UHRyKE1hY3JvQXNzZW1ibGVy
OjpOb25aZXJvLCB2YWx1ZVJlZywgR1BSSW5mbzo6dGFnTWFza1JlZ2lzdGVyKTsKKyAgICBtX2pp
dC5qaXRBc3NlcnRJc0NlbGwoYmFzZVJlZyk7CisgICAgTWFjcm9Bc3NlbWJsZXI6Okp1bXAgcHJv
dG90eXBlTm90Q2VsbCA9IG1faml0LmJyYW5jaFRlc3RQdHIoTWFjcm9Bc3NlbWJsZXI6Ok5vblpl
cm8sIHByb3RvdHlwZVJlZywgR1BSSW5mbzo6dGFnTWFza1JlZ2lzdGVyKTsKKworICAgIC8vIENo
ZWNrIHRoYXQgYmFzZVZhbCAnSW1wbGVtZW50c0RlZmF1bHRIYXNJbnN0YW5jZScuCisgICAgbV9q
aXQubG9hZFB0cihNYWNyb0Fzc2VtYmxlcjo6QWRkcmVzcyhiYXNlUmVnLCBKU0NlbGw6OnN0cnVj
dHVyZU9mZnNldCgpKSwgc2NyYXRjaFJlZyk7CisgICAgTWFjcm9Bc3NlbWJsZXI6Okp1bXAgbm90
RGVmYXVsdEhhc0luc3RhbmNlID0gbV9qaXQuYnJhbmNoVGVzdDgoTWFjcm9Bc3NlbWJsZXI6Olpl
cm8sIE1hY3JvQXNzZW1ibGVyOjpBZGRyZXNzKHNjcmF0Y2hSZWcsIFN0cnVjdHVyZTo6dHlwZUlu
Zm9GbGFnc09mZnNldCgpKSwgVHJ1c3RlZEltbTMyKEltcGxlbWVudHNEZWZhdWx0SGFzSW5zdGFu
Y2UpKTsKKworICAgIC8vIENoZWNrIHRoYXQgcHJvdG90eXBlIGlzIGFuIG9iamVjdAorICAgIG1f
aml0LmxvYWRQdHIoTWFjcm9Bc3NlbWJsZXI6OkFkZHJlc3MocHJvdG90eXBlUmVnLCBKU0NlbGw6
OnN0cnVjdHVyZU9mZnNldCgpKSwgc2NyYXRjaFJlZyk7CisgICAgTWFjcm9Bc3NlbWJsZXI6Okp1
bXAgcHJvdG9Ob3RPYmplY3QgPSBtX2ppdC5icmFuY2hJZk5vdE9iamVjdChzY3JhdGNoUmVnKTsK
KworICAgIC8vIEluaXRpYWxpemUgc2NyYXRjaFJlZyB3aXRoIHRoZSB2YWx1ZSBiZWluZyBjaGVj
a2VkLgorICAgIG1faml0Lm1vdmUodmFsdWVSZWcsIHNjcmF0Y2hSZWcpOworCisgICAgLy8gV2Fs
ayB1cCB0aGUgcHJvdG90eXBlIGNoYWluIG9mIHRoZSB2YWx1ZSAoaW4gc2NyYXRjaFJlZyksIGNv
bXBhcmluZyB0byBwcm90b3R5cGVSZWcuCisgICAgTWFjcm9Bc3NlbWJsZXI6OkxhYmVsIGxvb3Ao
Jm1faml0KTsKKyAgICBtX2ppdC5sb2FkUHRyKE1hY3JvQXNzZW1ibGVyOjpBZGRyZXNzKHNjcmF0
Y2hSZWcsIEpTQ2VsbDo6c3RydWN0dXJlT2Zmc2V0KCkpLCBzY3JhdGNoUmVnKTsKKyAgICBtX2pp
dC5sb2FkUHRyKE1hY3JvQXNzZW1ibGVyOjpBZGRyZXNzKHNjcmF0Y2hSZWcsIFN0cnVjdHVyZTo6
cHJvdG90eXBlT2Zmc2V0KCkpLCBzY3JhdGNoUmVnKTsKKyAgICBNYWNyb0Fzc2VtYmxlcjo6SnVt
cCBpc0luc3RhbmNlID0gbV9qaXQuYnJhbmNoUHRyKE1hY3JvQXNzZW1ibGVyOjpFcXVhbCwgc2Ny
YXRjaFJlZywgcHJvdG90eXBlUmVnKTsKKyAgICBtX2ppdC5icmFuY2hUZXN0UHRyKE1hY3JvQXNz
ZW1ibGVyOjpaZXJvLCBzY3JhdGNoUmVnLCBHUFJJbmZvOjp0YWdNYXNrUmVnaXN0ZXIpLmxpbmtU
byhsb29wLCAmbV9qaXQpOworCisgICAgLy8gTm8gbWF0Y2ggLSByZXN1bHQgaXMgZmFsc2UuCisg
ICAgbV9qaXQubW92ZShNYWNyb0Fzc2VtYmxlcjo6VHJ1c3RlZEltbVB0cihKU1ZhbHVlOjplbmNv
ZGUoanNCb29sZWFuKGZhbHNlKSkpLCBzY3JhdGNoUmVnKTsKKyAgICBNYWNyb0Fzc2VtYmxlcjo6
SnVtcCB3YXNOb3RJbnN0YW5jZSA9IG1faml0Lmp1bXAoKTsKKworICAgIC8vIExpbmsgdG8gaGVy
ZSBpZiBhbnkgY2hlY2tzIGZhaWwgdGhhdCByZXF1aXJlIHVzIHRvIHRyeSBjYWxsaW5nIG91dCB0
byBhbiBvcGVyYXRpb24gdG8gaGVscCwKKyAgICAvLyBlLmcuIGZvciBhbiBBUEkgb3ZlcnJpZGRl
biBIYXNJbnN0YW5jZS4KKyAgICB2YWx1ZU5vdENlbGwubGluaygmbV9qaXQpOworICAgIHByb3Rv
dHlwZU5vdENlbGwubGluaygmbV9qaXQpOworICAgIG5vdERlZmF1bHRIYXNJbnN0YW5jZS5saW5r
KCZtX2ppdCk7CisgICAgcHJvdG9Ob3RPYmplY3QubGluaygmbV9qaXQpOworCisgICAgc2lsZW50
U3BpbGxBbGxSZWdpc3RlcnMoc2NyYXRjaFJlZyk7CisgICAgc2V0dXBTdHViQXJndW1lbnRzKHZh
bHVlUmVnLCBiYXNlUmVnLCBwcm90b3R5cGVSZWcpOworICAgIG1faml0Lm1vdmUoR1BSSW5mbzo6
Y2FsbEZyYW1lUmVnaXN0ZXIsIEdQUkluZm86OmFyZ3VtZW50R1BSMCk7CisgICAgYXBwZW5kQ2Fs
bFdpdGhFeGNlcHRpb25DaGVjayhvcGVyYXRpb25JbnN0YW5jZU9mKTsKKyAgICBtX2ppdC5tb3Zl
KEdQUkluZm86OnJldHVyblZhbHVlR1BSLCBzY3JhdGNoUmVnKTsKKyAgICBzaWxlbnRGaWxsQWxs
UmVnaXN0ZXJzKHNjcmF0Y2hSZWcpOworCisgICAgTWFjcm9Bc3NlbWJsZXI6Okp1bXAgd2FzTm90
RGVmYXVsdEhhc0luc3RhbmNlID0gbV9qaXQuanVtcCgpOworCisgICAgaXNJbnN0YW5jZS5saW5r
KCZtX2ppdCk7CisgICAgbV9qaXQubW92ZShNYWNyb0Fzc2VtYmxlcjo6VHJ1c3RlZEltbVB0cihK
U1ZhbHVlOjplbmNvZGUoanNCb29sZWFuKHRydWUpKSksIHNjcmF0Y2hSZWcpOworCisgICAgd2Fz
Tm90SW5zdGFuY2UubGluaygmbV9qaXQpOworICAgIHdhc05vdERlZmF1bHRIYXNJbnN0YW5jZS5s
aW5rKCZtX2ppdCk7CisgICAganNWYWx1ZVJlc3VsdChzY3JhdGNoUmVnLCBtX2NvbXBpbGVJbmRl
eCwgVXNlQ2hpbGRyZW5DYWxsZWRFeHBsaWNpdGx5KTsKK30KKworSklUQ29tcGlsZXI6OkNhbGwg
SklUQ29kZUdlbmVyYXRvcjo6Y2FjaGVkR2V0QnlJZChHUFJSZWcgYmFzZUdQUiwgR1BSUmVnIHJl
c3VsdEdQUiwgR1BSUmVnIHNjcmF0Y2hHUFIsIHVuc2lnbmVkIGlkZW50aWZpZXJOdW1iZXIsIEpJ
VENvbXBpbGVyOjpKdW1wIHNsb3dQYXRoVGFyZ2V0LCBOb2RlVHlwZSBub2RlVHlwZSkKK3sKKyAg
ICBKSVRDb21waWxlcjo6RGF0YUxhYmVsUHRyIHN0cnVjdHVyZVRvQ29tcGFyZTsKKyAgICBKSVRD
b21waWxlcjo6SnVtcCBzdHJ1Y3R1cmVDaGVjayA9IG1faml0LmJyYW5jaFB0cldpdGhQYXRjaChK
SVRDb21waWxlcjo6Tm90RXF1YWwsIEpJVENvbXBpbGVyOjpBZGRyZXNzKGJhc2VHUFIsIEpTQ2Vs
bDo6c3RydWN0dXJlT2Zmc2V0KCkpLCBzdHJ1Y3R1cmVUb0NvbXBhcmUsIEpJVENvbXBpbGVyOjpU
cnVzdGVkSW1tUHRyKHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KC0xKSkpOworICAgIAorICAgIG1f
aml0LmxvYWRQdHIoSklUQ29tcGlsZXI6OkFkZHJlc3MoYmFzZUdQUiwgSlNPYmplY3Q6Om9mZnNl
dE9mUHJvcGVydHlTdG9yYWdlKCkpLCByZXN1bHRHUFIpOworICAgIEpJVENvbXBpbGVyOjpEYXRh
TGFiZWxDb21wYWN0IGxvYWRXaXRoUGF0Y2ggPSBtX2ppdC5sb2FkUHRyV2l0aENvbXBhY3RBZGRy
ZXNzT2Zmc2V0UGF0Y2goSklUQ29tcGlsZXI6OkFkZHJlc3MocmVzdWx0R1BSLCAwKSwgcmVzdWx0
R1BSKTsKKyAgICAKKyAgICBKSVRDb21waWxlcjo6SnVtcCBkb25lID0gbV9qaXQuanVtcCgpOwor
CisgICAgc3RydWN0dXJlQ2hlY2subGluaygmbV9qaXQpOworICAgIAorICAgIGlmIChzbG93UGF0
aFRhcmdldC5pc1NldCgpKQorICAgICAgICBzbG93UGF0aFRhcmdldC5saW5rKCZtX2ppdCk7Cisg
ICAgCisgICAgSklUQ29tcGlsZXI6OkxhYmVsIHNsb3dDYXNlID0gbV9qaXQubGFiZWwoKTsKKwor
ICAgIHNpbGVudFNwaWxsQWxsUmVnaXN0ZXJzKHJlc3VsdEdQUik7CisgICAgbV9qaXQubW92ZShi
YXNlR1BSLCBHUFJJbmZvOjphcmd1bWVudEdQUjEpOworICAgIG1faml0Lm1vdmUoSklUQ29tcGls
ZXI6OkltbVB0cihpZGVudGlmaWVyKGlkZW50aWZpZXJOdW1iZXIpKSwgR1BSSW5mbzo6YXJndW1l
bnRHUFIyKTsKKyAgICBtX2ppdC5tb3ZlKEdQUkluZm86OmNhbGxGcmFtZVJlZ2lzdGVyLCBHUFJJ
bmZvOjphcmd1bWVudEdQUjApOworICAgIEpJVENvbXBpbGVyOjpDYWxsIGZ1bmN0aW9uQ2FsbDsK
KyAgICBzd2l0Y2ggKG5vZGVUeXBlKSB7CisgICAgY2FzZSBHZXRCeUlkOgorICAgICAgICBmdW5j
dGlvbkNhbGwgPSBhcHBlbmRDYWxsV2l0aEV4Y2VwdGlvbkNoZWNrKG9wZXJhdGlvbkdldEJ5SWRP
cHRpbWl6ZSk7CisgICAgICAgIGJyZWFrOworICAgICAgICAKKyAgICBjYXNlIEdldE1ldGhvZDoK
KyAgICAgICAgZnVuY3Rpb25DYWxsID0gYXBwZW5kQ2FsbFdpdGhFeGNlcHRpb25DaGVjayhvcGVy
YXRpb25HZXRNZXRob2RPcHRpbWl6ZSk7CisgICAgICAgIGJyZWFrOworICAgICAgICAKKyAgICBk
ZWZhdWx0OgorICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgcmV0dXJuIEpJ
VENvbXBpbGVyOjpDYWxsKCk7CisgICAgfQorICAgIG1faml0Lm1vdmUoR1BSSW5mbzo6cmV0dXJu
VmFsdWVHUFIsIHJlc3VsdEdQUik7CisgICAgc2lsZW50RmlsbEFsbFJlZ2lzdGVycyhyZXN1bHRH
UFIpOworICAgIAorICAgIGRvbmUubGluaygmbV9qaXQpOworICAgIAorICAgIEpJVENvbXBpbGVy
OjpMYWJlbCBkb25lTGFiZWwgPSBtX2ppdC5sYWJlbCgpOworCisgICAgaW50MTZfdCBjaGVja0lt
bVRvQ2FsbCA9IHNhZmVDYXN0PGludDE2X3Q+KG1faml0LmRpZmZlcmVuY2VCZXR3ZWVuKHN0cnVj
dHVyZVRvQ29tcGFyZSwgZnVuY3Rpb25DYWxsKSk7CisgICAgaW50MTZfdCBjYWxsVG9DaGVjayA9
IHNhZmVDYXN0PGludDE2X3Q+KG1faml0LmRpZmZlcmVuY2VCZXR3ZWVuKGZ1bmN0aW9uQ2FsbCwg
c3RydWN0dXJlQ2hlY2spKTsKKyAgICBpbnQxNl90IGNhbGxUb0xvYWQgPSBzYWZlQ2FzdDxpbnQx
Nl90PihtX2ppdC5kaWZmZXJlbmNlQmV0d2VlbihmdW5jdGlvbkNhbGwsIGxvYWRXaXRoUGF0Y2gp
KTsKKyAgICBpbnQxNl90IGNhbGxUb1Nsb3dDYXNlID0gc2FmZUNhc3Q8aW50MTZfdD4obV9qaXQu
ZGlmZmVyZW5jZUJldHdlZW4oZnVuY3Rpb25DYWxsLCBzbG93Q2FzZSkpOworICAgIGludDE2X3Qg
Y2FsbFRvRG9uZSA9IHNhZmVDYXN0PGludDE2X3Q+KG1faml0LmRpZmZlcmVuY2VCZXR3ZWVuKGZ1
bmN0aW9uQ2FsbCwgZG9uZUxhYmVsKSk7CisgICAgCisgICAgbV9qaXQuYWRkUHJvcGVydHlBY2Nl
c3MoZnVuY3Rpb25DYWxsLCBjaGVja0ltbVRvQ2FsbCwgY2FsbFRvQ2hlY2ssIGNhbGxUb0xvYWQs
IGNhbGxUb1Nsb3dDYXNlLCBjYWxsVG9Eb25lLCBzYWZlQ2FzdDxpbnQ4X3Q+KGJhc2VHUFIpLCBz
YWZlQ2FzdDxpbnQ4X3Q+KHJlc3VsdEdQUiksIHNhZmVDYXN0PGludDhfdD4oc2NyYXRjaEdQUikp
OworICAgIAorICAgIGlmIChzY3JhdGNoR1BSICE9IHJlc3VsdEdQUiAmJiBzY3JhdGNoR1BSICE9
IEludmFsaWRHUFJSZWcpCisgICAgICAgIHVubG9jayhzY3JhdGNoR1BSKTsKKyAgICAKKyAgICBy
ZXR1cm4gZnVuY3Rpb25DYWxsOworfQorCit2b2lkIEpJVENvZGVHZW5lcmF0b3I6OndyaXRlQmFy
cmllcihNYWNyb0Fzc2VtYmxlciYgaml0LCBHUFJSZWcgb3duZXIsIEdQUlJlZyBzY3JhdGNoMSwg
R1BSUmVnIHNjcmF0Y2gyLCBXcml0ZUJhcnJpZXJVc2VLaW5kIHVzZUtpbmQpCit7CisgICAgVU5V
U0VEX1BBUkFNKGppdCk7CisgICAgVU5VU0VEX1BBUkFNKG93bmVyKTsKKyAgICBVTlVTRURfUEFS
QU0oc2NyYXRjaDEpOworICAgIFVOVVNFRF9QQVJBTShzY3JhdGNoMik7CisgICAgVU5VU0VEX1BB
UkFNKHVzZUtpbmQpOworICAgIEFTU0VSVChvd25lciAhPSBzY3JhdGNoMSk7CisgICAgQVNTRVJU
KG93bmVyICE9IHNjcmF0Y2gyKTsKKyAgICBBU1NFUlQoc2NyYXRjaDEgIT0gc2NyYXRjaDIpOwor
CisjaWYgRU5BQkxFKFdSSVRFX0JBUlJJRVJfUFJPRklMSU5HKQorICAgIEpJVENvbXBpbGVyOjpl
bWl0Q291bnQoaml0LCBXcml0ZUJhcnJpZXJDb3VudGVyczo6aml0Q291bnRlckZvcih1c2VLaW5k
KSk7CisjZW5kaWYKKyAgICBtYXJrQ2VsbENhcmQoaml0LCBvd25lciwgc2NyYXRjaDEsIHNjcmF0
Y2gyKTsKK30KKwordm9pZCBKSVRDb2RlR2VuZXJhdG9yOjptYXJrQ2VsbENhcmQoTWFjcm9Bc3Nl
bWJsZXImIGppdCwgR1BSUmVnIG93bmVyLCBHUFJSZWcgc2NyYXRjaDEsIEdQUlJlZyBzY3JhdGNo
MikKK3sKKyAgICBVTlVTRURfUEFSQU0oaml0KTsKKyAgICBVTlVTRURfUEFSQU0ob3duZXIpOwor
ICAgIFVOVVNFRF9QQVJBTShzY3JhdGNoMSk7CisgICAgVU5VU0VEX1BBUkFNKHNjcmF0Y2gyKTsK
KyAgICAKKyNpZiBFTkFCTEUoR0dDKQorICAgIGppdC5tb3ZlKG93bmVyLCBzY3JhdGNoMSk7Cisg
ICAgaml0LmFuZFB0cihUcnVzdGVkSW1tMzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4oTWFya2VkQmxv
Y2s6OmJsb2NrTWFzaykpLCBzY3JhdGNoMSk7CisgICAgaml0Lm1vdmUob3duZXIsIHNjcmF0Y2gy
KTsKKyAgICBqaXQucnNoaWZ0MzIoVHJ1c3RlZEltbTMyKE1hcmtlZEJsb2NrOjpjYXJkU2hpZnQp
LCBzY3JhdGNoMik7CisgICAgaml0LmFuZFB0cihUcnVzdGVkSW1tMzIoTWFya2VkQmxvY2s6OmNh
cmRNYXNrKSwgc2NyYXRjaDIpOworICAgIGppdC5zdG9yZTgoVHJ1c3RlZEltbTMyKDEpLCBNYWNy
b0Fzc2VtYmxlcjo6QmFzZUluZGV4KHNjcmF0Y2gxLCBzY3JhdGNoMiwgTWFjcm9Bc3NlbWJsZXI6
OlRpbWVzT25lLCBNYXJrZWRCbG9jazo6b2Zmc2V0T2ZDYXJkcygpKSk7CisjZW5kaWYKK30KKwor
dm9pZCBKSVRDb2RlR2VuZXJhdG9yOjp3cml0ZUJhcnJpZXIoR1BSUmVnIG93bmVyR1BSLCBHUFJS
ZWcgdmFsdWVHUFIsIE5vZGVJbmRleCB2YWx1ZUluZGV4LCBXcml0ZUJhcnJpZXJVc2VLaW5kIHVz
ZUtpbmQsIEdQUlJlZyBzY3JhdGNoMSwgR1BSUmVnIHNjcmF0Y2gyKQoreworICAgIFVOVVNFRF9Q
QVJBTShvd25lckdQUik7CisgICAgVU5VU0VEX1BBUkFNKHZhbHVlR1BSKTsKKyAgICBVTlVTRURf
UEFSQU0oc2NyYXRjaDEpOworICAgIFVOVVNFRF9QQVJBTShzY3JhdGNoMik7CisgICAgVU5VU0VE
X1BBUkFNKHVzZUtpbmQpOworCisgICAgaWYgKGlzS25vd25Ob3RDZWxsKHZhbHVlSW5kZXgpKQor
ICAgICAgICByZXR1cm47CisKKyNpZiBFTkFCTEUoV1JJVEVfQkFSUklFUl9QUk9GSUxJTkcpCisg
ICAgSklUQ29tcGlsZXI6OmVtaXRDb3VudChqaXQsIFdyaXRlQmFycmllckNvdW50ZXJzOjpqaXRD
b3VudGVyRm9yKHVzZUtpbmQpKTsKKyNlbmRpZgorCisjaWYgRU5BQkxFKEdHQykKKyAgICBKSVRD
b21waWxlcjo6SnVtcCByaHNOb3RDZWxsOworICAgIGJvb2wgaGFkQ2VsbENoZWNrID0gZmFsc2U7
CisgICAgaWYgKCFpc0tub3duQ2VsbCh2YWx1ZUluZGV4KSAmJiAhaXNDZWxsUHJlZGljdGlvbiht
X2ppdC5nZXRQcmVkaWN0aW9uKHZhbHVlSW5kZXgpKSkgeworICAgICAgICBoYWRDZWxsQ2hlY2sg
PSB0cnVlOworICAgICAgICByaHNOb3RDZWxsID0gbV9qaXQuYnJhbmNoVGVzdFB0cihNYWNyb0Fz
c2VtYmxlcjo6Tm9uWmVybywgdmFsdWVHUFIsIEdQUkluZm86OnRhZ01hc2tSZWdpc3Rlcik7Cisg
ICAgfQorCisgICAgR1BSVGVtcG9yYXJ5IHRlbXAxOworICAgIEdQUlRlbXBvcmFyeSB0ZW1wMjsK
KyAgICBpZiAoc2NyYXRjaDEgPT0gSW52YWxpZEdQUlJlZykgeworICAgICAgICBHUFJUZW1wb3Jh
cnkgc2NyYXRjaEdQUih0aGlzKTsKKyAgICAgICAgdGVtcDEuYWRvcHQoc2NyYXRjaEdQUik7Cisg
ICAgICAgIHNjcmF0Y2gxID0gdGVtcDEuZ3ByKCk7CisgICAgfQorICAgIGlmIChzY3JhdGNoMiA9
PSBJbnZhbGlkR1BSUmVnKSB7CisgICAgICAgIEdQUlRlbXBvcmFyeSBzY3JhdGNoR1BSKHRoaXMp
OworICAgICAgICB0ZW1wMi5hZG9wdChzY3JhdGNoR1BSKTsKKyAgICAgICAgc2NyYXRjaDIgPSB0
ZW1wMi5ncHIoKTsKKyAgICB9CisKKyAgICBtYXJrQ2VsbENhcmQobV9qaXQsIG93bmVyR1BSLCBz
Y3JhdGNoMSwgc2NyYXRjaDIpOworICAgIGlmIChoYWRDZWxsQ2hlY2spCisgICAgICAgIHJoc05v
dENlbGwubGluaygmbV9qaXQpOworI2VuZGlmCit9CisKK3ZvaWQgSklUQ29kZUdlbmVyYXRvcjo6
d3JpdGVCYXJyaWVyKEpTQ2VsbCogb3duZXIsIEdQUlJlZyB2YWx1ZUdQUiwgTm9kZUluZGV4IHZh
bHVlSW5kZXgsIFdyaXRlQmFycmllclVzZUtpbmQgdXNlS2luZCwgR1BSUmVnIHNjcmF0Y2gpCit7
CisgICAgVU5VU0VEX1BBUkFNKG93bmVyKTsKKyAgICBVTlVTRURfUEFSQU0odmFsdWVHUFIpOwor
ICAgIFVOVVNFRF9QQVJBTShzY3JhdGNoKTsKKyAgICBVTlVTRURfUEFSQU0odXNlS2luZCk7CisK
KyAgICBpZiAoaXNLbm93bk5vdENlbGwodmFsdWVJbmRleCkpCisgICAgICAgIHJldHVybjsKKwor
I2lmIEVOQUJMRShXUklURV9CQVJSSUVSX1BST0ZJTElORykKKyAgICBKSVRDb21waWxlcjo6ZW1p
dENvdW50KGppdCwgV3JpdGVCYXJyaWVyQ291bnRlcnM6OmppdENvdW50ZXJGb3IodXNlS2luZCkp
OworI2VuZGlmCisKKyNpZiBFTkFCTEUoR0dDKQorICAgIEpJVENvbXBpbGVyOjpKdW1wIHJoc05v
dENlbGw7CisgICAgYm9vbCBoYWRDZWxsQ2hlY2sgPSBmYWxzZTsKKyAgICBpZiAoIWlzS25vd25D
ZWxsKHZhbHVlSW5kZXgpICYmICFpc0NlbGxQcmVkaWN0aW9uKG1faml0LmdldFByZWRpY3Rpb24o
dmFsdWVJbmRleCkpKSB7CisgICAgICAgIGhhZENlbGxDaGVjayA9IHRydWU7CisgICAgICAgIHJo
c05vdENlbGwgPSBtX2ppdC5icmFuY2hUZXN0UHRyKE1hY3JvQXNzZW1ibGVyOjpOb25aZXJvLCB2
YWx1ZUdQUiwgR1BSSW5mbzo6dGFnTWFza1JlZ2lzdGVyKTsKKyAgICB9CisgICAgCisgICAgR1BS
VGVtcG9yYXJ5IHRlbXA7CisgICAgaWYgKHNjcmF0Y2ggPT0gSW52YWxpZEdQUlJlZykgeworICAg
ICAgICBHUFJUZW1wb3Jhcnkgc2NyYXRjaEdQUih0aGlzKTsKKyAgICAgICAgdGVtcC5hZG9wdChz
Y3JhdGNoR1BSKTsKKyAgICAgICAgc2NyYXRjaCA9IHRlbXAuZ3ByKCk7CisgICAgfQorCisgICAg
dWludDhfdCogY2FyZEFkZHJlc3MgPSBIZWFwOjphZGRyZXNzT2ZDYXJkRm9yKG93bmVyKTsKKyAg
ICBtX2ppdC5tb3ZlKEpJVENvbXBpbGVyOjpUcnVzdGVkSW1tUHRyKGNhcmRBZGRyZXNzKSwgc2Ny
YXRjaCk7CisgICAgbV9qaXQuc3RvcmU4KEpJVENvbXBpbGVyOjpUcnVzdGVkSW1tMzIoMSksIEpJ
VENvbXBpbGVyOjpBZGRyZXNzKHNjcmF0Y2gpKTsKKworICAgIGlmIChoYWRDZWxsQ2hlY2spCisg
ICAgICAgIHJoc05vdENlbGwubGluaygmbV9qaXQpOworI2VuZGlmCit9CisKK3ZvaWQgSklUQ29k
ZUdlbmVyYXRvcjo6Y2FjaGVkUHV0QnlJZChHUFJSZWcgYmFzZUdQUiwgR1BSUmVnIHZhbHVlR1BS
LCBOb2RlSW5kZXggdmFsdWVJbmRleCwgR1BSUmVnIHNjcmF0Y2hHUFIsIHVuc2lnbmVkIGlkZW50
aWZpZXJOdW1iZXIsIFB1dEtpbmQgcHV0S2luZCwgSklUQ29tcGlsZXI6Okp1bXAgc2xvd1BhdGhU
YXJnZXQpCit7CisgICAgCisgICAgSklUQ29tcGlsZXI6OkRhdGFMYWJlbFB0ciBzdHJ1Y3R1cmVU
b0NvbXBhcmU7CisgICAgSklUQ29tcGlsZXI6Okp1bXAgc3RydWN0dXJlQ2hlY2sgPSBtX2ppdC5i
cmFuY2hQdHJXaXRoUGF0Y2goSklUQ29tcGlsZXI6Ok5vdEVxdWFsLCBKSVRDb21waWxlcjo6QWRk
cmVzcyhiYXNlR1BSLCBKU0NlbGw6OnN0cnVjdHVyZU9mZnNldCgpKSwgc3RydWN0dXJlVG9Db21w
YXJlLCBKSVRDb21waWxlcjo6VHJ1c3RlZEltbVB0cihyZWludGVycHJldF9jYXN0PHZvaWQqPigt
MSkpKTsKKworICAgIHdyaXRlQmFycmllcihiYXNlR1BSLCB2YWx1ZUdQUiwgdmFsdWVJbmRleCwg
V3JpdGVCYXJyaWVyRm9yUHJvcGVydHlBY2Nlc3MsIHNjcmF0Y2hHUFIpOworCisgICAgbV9qaXQu
bG9hZFB0cihKSVRDb21waWxlcjo6QWRkcmVzcyhiYXNlR1BSLCBKU09iamVjdDo6b2Zmc2V0T2ZQ
cm9wZXJ0eVN0b3JhZ2UoKSksIHNjcmF0Y2hHUFIpOworICAgIEpJVENvbXBpbGVyOjpEYXRhTGFi
ZWwzMiBzdG9yZVdpdGhQYXRjaCA9IG1faml0LnN0b3JlUHRyV2l0aEFkZHJlc3NPZmZzZXRQYXRj
aCh2YWx1ZUdQUiwgSklUQ29tcGlsZXI6OkFkZHJlc3Moc2NyYXRjaEdQUiwgMCkpOworCisgICAg
SklUQ29tcGlsZXI6Okp1bXAgZG9uZSA9IG1faml0Lmp1bXAoKTsKKworICAgIHN0cnVjdHVyZUNo
ZWNrLmxpbmsoJm1faml0KTsKKworICAgIGlmIChzbG93UGF0aFRhcmdldC5pc1NldCgpKQorICAg
ICAgICBzbG93UGF0aFRhcmdldC5saW5rKCZtX2ppdCk7CisKKyAgICBKSVRDb21waWxlcjo6TGFi
ZWwgc2xvd0Nhc2UgPSBtX2ppdC5sYWJlbCgpOworCisgICAgc2lsZW50U3BpbGxBbGxSZWdpc3Rl
cnMoSW52YWxpZEdQUlJlZyk7CisgICAgc2V0dXBUd29TdHViQXJnczxHUFJJbmZvOjphcmd1bWVu
dEdQUjEsIEdQUkluZm86OmFyZ3VtZW50R1BSMj4odmFsdWVHUFIsIGJhc2VHUFIpOworICAgIG1f
aml0Lm1vdmUoSklUQ29tcGlsZXI6OkltbVB0cihpZGVudGlmaWVyKGlkZW50aWZpZXJOdW1iZXIp
KSwgR1BSSW5mbzo6YXJndW1lbnRHUFIzKTsKKyAgICBtX2ppdC5tb3ZlKEdQUkluZm86OmNhbGxG
cmFtZVJlZ2lzdGVyLCBHUFJJbmZvOjphcmd1bWVudEdQUjApOworICAgIFZfREZHT3BlcmF0aW9u
X0VKSkkgb3B0aW1pemVkQ2FsbDsKKyAgICBpZiAobV9qaXQuY29kZUJsb2NrKCktPmlzU3RyaWN0
TW9kZSgpKSB7CisgICAgICAgIGlmIChwdXRLaW5kID09IERpcmVjdCkKKyAgICAgICAgICAgIG9w
dGltaXplZENhbGwgPSBvcGVyYXRpb25QdXRCeUlkRGlyZWN0U3RyaWN0T3B0aW1pemU7CisgICAg
ICAgIGVsc2UKKyAgICAgICAgICAgIG9wdGltaXplZENhbGwgPSBvcGVyYXRpb25QdXRCeUlkU3Ry
aWN0T3B0aW1pemU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHB1dEtpbmQgPT0gRGlyZWN0
KQorICAgICAgICAgICAgb3B0aW1pemVkQ2FsbCA9IG9wZXJhdGlvblB1dEJ5SWREaXJlY3ROb25T
dHJpY3RPcHRpbWl6ZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgb3B0aW1pemVkQ2FsbCA9
IG9wZXJhdGlvblB1dEJ5SWROb25TdHJpY3RPcHRpbWl6ZTsKKyAgICB9CisgICAgSklUQ29tcGls
ZXI6OkNhbGwgZnVuY3Rpb25DYWxsID0gYXBwZW5kQ2FsbFdpdGhFeGNlcHRpb25DaGVjayhvcHRp
bWl6ZWRDYWxsKTsKKyAgICBzaWxlbnRGaWxsQWxsUmVnaXN0ZXJzKEludmFsaWRHUFJSZWcpOwor
CisgICAgZG9uZS5saW5rKCZtX2ppdCk7CisgICAgSklUQ29tcGlsZXI6OkxhYmVsIGRvbmVMYWJl
bCA9IG1faml0LmxhYmVsKCk7CisKKyAgICBpbnQxNl90IGNoZWNrSW1tVG9DYWxsID0gc2FmZUNh
c3Q8aW50MTZfdD4obV9qaXQuZGlmZmVyZW5jZUJldHdlZW4oc3RydWN0dXJlVG9Db21wYXJlLCBm
dW5jdGlvbkNhbGwpKTsKKyAgICBpbnQxNl90IGNhbGxUb0NoZWNrID0gc2FmZUNhc3Q8aW50MTZf
dD4obV9qaXQuZGlmZmVyZW5jZUJldHdlZW4oZnVuY3Rpb25DYWxsLCBzdHJ1Y3R1cmVDaGVjaykp
OworICAgIGludDE2X3QgY2FsbFRvU3RvcmUgPSBzYWZlQ2FzdDxpbnQxNl90PihtX2ppdC5kaWZm
ZXJlbmNlQmV0d2VlbihmdW5jdGlvbkNhbGwsIHN0b3JlV2l0aFBhdGNoKSk7CisgICAgaW50MTZf
dCBjYWxsVG9TbG93Q2FzZSA9IHNhZmVDYXN0PGludDE2X3Q+KG1faml0LmRpZmZlcmVuY2VCZXR3
ZWVuKGZ1bmN0aW9uQ2FsbCwgc2xvd0Nhc2UpKTsKKyAgICBpbnQxNl90IGNhbGxUb0RvbmUgPSBz
YWZlQ2FzdDxpbnQxNl90PihtX2ppdC5kaWZmZXJlbmNlQmV0d2VlbihmdW5jdGlvbkNhbGwsIGRv
bmVMYWJlbCkpOworCisgICAgbV9qaXQuYWRkUHJvcGVydHlBY2Nlc3MoZnVuY3Rpb25DYWxsLCBj
aGVja0ltbVRvQ2FsbCwgY2FsbFRvQ2hlY2ssIGNhbGxUb1N0b3JlLCBjYWxsVG9TbG93Q2FzZSwg
Y2FsbFRvRG9uZSwgc2FmZUNhc3Q8aW50OF90PihiYXNlR1BSKSwgc2FmZUNhc3Q8aW50OF90Pih2
YWx1ZUdQUiksIHNhZmVDYXN0PGludDhfdD4oc2NyYXRjaEdQUikpOworfQorCit2b2lkIEpJVENv
ZGVHZW5lcmF0b3I6OmNhY2hlZEdldE1ldGhvZChHUFJSZWcgYmFzZUdQUiwgR1BSUmVnIHJlc3Vs
dEdQUiwgR1BSUmVnIHNjcmF0Y2hHUFIsIHVuc2lnbmVkIGlkZW50aWZpZXJOdW1iZXIsIEpJVENv
bXBpbGVyOjpKdW1wIHNsb3dQYXRoVGFyZ2V0KQoreworICAgIEpJVENvbXBpbGVyOjpDYWxsIHNs
b3dDYWxsOworICAgIEpJVENvbXBpbGVyOjpEYXRhTGFiZWxQdHIgc3RydWN0VG9Db21wYXJlLCBw
cm90b09iaiwgcHJvdG9TdHJ1Y3RUb0NvbXBhcmUsIHB1dEZ1bmN0aW9uOworICAgIAorICAgIEpJ
VENvbXBpbGVyOjpKdW1wIHdyb25nU3RydWN0dXJlID0gbV9qaXQuYnJhbmNoUHRyV2l0aFBhdGNo
KEpJVENvbXBpbGVyOjpOb3RFcXVhbCwgSklUQ29tcGlsZXI6OkFkZHJlc3MoYmFzZUdQUiwgSlND
ZWxsOjpzdHJ1Y3R1cmVPZmZzZXQoKSksIHN0cnVjdFRvQ29tcGFyZSwgSklUQ29tcGlsZXI6OlRy
dXN0ZWRJbW1QdHIocmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oLTEpKSk7CisgICAgcHJvdG9PYmog
PSBtX2ppdC5tb3ZlV2l0aFBhdGNoKEpJVENvbXBpbGVyOjpUcnVzdGVkSW1tUHRyKDApLCByZXN1
bHRHUFIpOworICAgIEpJVENvbXBpbGVyOjpKdW1wIHdyb25nUHJvdG9TdHJ1Y3R1cmUgPSBtX2pp
dC5icmFuY2hQdHJXaXRoUGF0Y2goSklUQ29tcGlsZXI6Ok5vdEVxdWFsLCBKSVRDb21waWxlcjo6
QWRkcmVzcyhyZXN1bHRHUFIsIEpTQ2VsbDo6c3RydWN0dXJlT2Zmc2V0KCkpLCBwcm90b1N0cnVj
dFRvQ29tcGFyZSwgSklUQ29tcGlsZXI6OlRydXN0ZWRJbW1QdHIocmVpbnRlcnByZXRfY2FzdDx2
b2lkKj4oLTEpKSk7CisgICAgCisgICAgcHV0RnVuY3Rpb24gPSBtX2ppdC5tb3ZlV2l0aFBhdGNo
KEpJVENvbXBpbGVyOjpUcnVzdGVkSW1tUHRyKDApLCByZXN1bHRHUFIpOworICAgIAorICAgIEpJ
VENvbXBpbGVyOjpKdW1wIGRvbmUgPSBtX2ppdC5qdW1wKCk7CisgICAgCisgICAgd3JvbmdTdHJ1
Y3R1cmUubGluaygmbV9qaXQpOworICAgIHdyb25nUHJvdG9TdHJ1Y3R1cmUubGluaygmbV9qaXQp
OworICAgIAorICAgIHNsb3dDYWxsID0gY2FjaGVkR2V0QnlJZChiYXNlR1BSLCByZXN1bHRHUFIs
IHNjcmF0Y2hHUFIsIGlkZW50aWZpZXJOdW1iZXIsIHNsb3dQYXRoVGFyZ2V0LCBHZXRNZXRob2Qp
OworICAgIAorICAgIGRvbmUubGluaygmbV9qaXQpOworICAgIAorICAgIG1faml0LmFkZE1ldGhv
ZEdldChzbG93Q2FsbCwgc3RydWN0VG9Db21wYXJlLCBwcm90b09iaiwgcHJvdG9TdHJ1Y3RUb0Nv
bXBhcmUsIHB1dEZ1bmN0aW9uKTsKK30KKwordm9pZCBKSVRDb2RlR2VuZXJhdG9yOjpub25TcGVj
dWxhdGl2ZU5vblBlZXBob2xlQ29tcGFyZU51bGwoTm9kZUluZGV4IG9wZXJhbmQsIGJvb2wgaW52
ZXJ0KQoreworICAgIEpTVmFsdWVPcGVyYW5kIGFyZyh0aGlzLCBvcGVyYW5kKTsKKyAgICBHUFJS
ZWcgYXJnR1BSID0gYXJnLmdwcigpOworICAgIAorICAgIEdQUlRlbXBvcmFyeSByZXN1bHQodGhp
cywgYXJnKTsKKyAgICBHUFJSZWcgcmVzdWx0R1BSID0gcmVzdWx0LmdwcigpOworICAgIAorICAg
IEpJVENvbXBpbGVyOjpKdW1wIG5vdENlbGw7CisgICAgCisgICAgaWYgKCFpc0tub3duQ2VsbChv
cGVyYW5kKSkKKyAgICAgICAgbm90Q2VsbCA9IG1faml0LmJyYW5jaFRlc3RQdHIoTWFjcm9Bc3Nl
bWJsZXI6Ok5vblplcm8sIGFyZ0dQUiwgR1BSSW5mbzo6dGFnTWFza1JlZ2lzdGVyKTsKKyAgICAK
KyAgICBtX2ppdC5sb2FkUHRyKEpJVENvbXBpbGVyOjpBZGRyZXNzKGFyZ0dQUiwgSlNDZWxsOjpz
dHJ1Y3R1cmVPZmZzZXQoKSksIHJlc3VsdEdQUik7CisgICAgbV9qaXQudGVzdDgoaW52ZXJ0ID8g
SklUQ29tcGlsZXI6Olplcm8gOiBKSVRDb21waWxlcjo6Tm9uWmVybywgSklUQ29tcGlsZXI6OkFk
ZHJlc3MocmVzdWx0R1BSLCBTdHJ1Y3R1cmU6OnR5cGVJbmZvRmxhZ3NPZmZzZXQoKSksIEpJVENv
bXBpbGVyOjpUcnVzdGVkSW1tMzIoTWFzcXVlcmFkZXNBc1VuZGVmaW5lZCksIHJlc3VsdEdQUik7
CisgICAgCisgICAgaWYgKCFpc0tub3duQ2VsbChvcGVyYW5kKSkgeworICAgICAgICBKSVRDb21w
aWxlcjo6SnVtcCBkb25lID0gbV9qaXQuanVtcCgpOworICAgICAgICAKKyAgICAgICAgbm90Q2Vs
bC5saW5rKCZtX2ppdCk7CisgICAgICAgIAorICAgICAgICBtX2ppdC5tb3ZlKGFyZ0dQUiwgcmVz
dWx0R1BSKTsKKyAgICAgICAgbV9qaXQuYW5kUHRyKEpJVENvbXBpbGVyOjpUcnVzdGVkSW1tMzIo
flRhZ0JpdFVuZGVmaW5lZCksIHJlc3VsdEdQUik7CisgICAgICAgIG1faml0LmNvbXBhcmVQdHIo
aW52ZXJ0ID8gSklUQ29tcGlsZXI6Ok5vdEVxdWFsIDogSklUQ29tcGlsZXI6OkVxdWFsLCByZXN1
bHRHUFIsIEpJVENvbXBpbGVyOjpUcnVzdGVkSW1tMzIoVmFsdWVOdWxsKSwgcmVzdWx0R1BSKTsK
KyAgICAgICAgCisgICAgICAgIGRvbmUubGluaygmbV9qaXQpOworICAgIH0KKyAgICAKKyAgICBt
X2ppdC5vcjMyKFRydXN0ZWRJbW0zMihWYWx1ZUZhbHNlKSwgcmVzdWx0R1BSKTsKKyAgICBqc1Zh
bHVlUmVzdWx0KHJlc3VsdEdQUiwgbV9jb21waWxlSW5kZXgsIERhdGFGb3JtYXRKU0Jvb2xlYW4p
OworfQorCit2b2lkIEpJVENvZGVHZW5lcmF0b3I6Om5vblNwZWN1bGF0aXZlUGVlcGhvbGVCcmFu
Y2hOdWxsKE5vZGVJbmRleCBvcGVyYW5kLCBOb2RlSW5kZXggYnJhbmNoTm9kZUluZGV4LCBib29s
IGludmVydCkKK3sKKyAgICBOb2RlJiBicmFuY2hOb2RlID0gbV9qaXQuZ3JhcGgoKVticmFuY2hO
b2RlSW5kZXhdOworICAgIEJsb2NrSW5kZXggdGFrZW4gPSBtX2ppdC5ncmFwaCgpLmJsb2NrSW5k
ZXhGb3JCeXRlY29kZU9mZnNldChicmFuY2hOb2RlLnRha2VuQnl0ZWNvZGVPZmZzZXQoKSk7Cisg
ICAgQmxvY2tJbmRleCBub3RUYWtlbiA9IG1faml0LmdyYXBoKCkuYmxvY2tJbmRleEZvckJ5dGVj
b2RlT2Zmc2V0KGJyYW5jaE5vZGUubm90VGFrZW5CeXRlY29kZU9mZnNldCgpKTsKKyAgICAKKyAg
ICBpZiAodGFrZW4gPT0gKG1fYmxvY2sgKyAxKSkgeworICAgICAgICBpbnZlcnQgPSAhaW52ZXJ0
OworICAgICAgICBCbG9ja0luZGV4IHRtcCA9IHRha2VuOworICAgICAgICB0YWtlbiA9IG5vdFRh
a2VuOworICAgICAgICBub3RUYWtlbiA9IHRtcDsKKyAgICB9CisKKyAgICBKU1ZhbHVlT3BlcmFu
ZCBhcmcodGhpcywgb3BlcmFuZCk7CisgICAgR1BSUmVnIGFyZ0dQUiA9IGFyZy5ncHIoKTsKKyAg
ICAKKyAgICBHUFJUZW1wb3JhcnkgcmVzdWx0KHRoaXMsIGFyZyk7CisgICAgR1BSUmVnIHJlc3Vs
dEdQUiA9IHJlc3VsdC5ncHIoKTsKKyAgICAKKyAgICBKSVRDb21waWxlcjo6SnVtcCBub3RDZWxs
OworICAgIAorICAgIGlmICghaXNLbm93bkNlbGwob3BlcmFuZCkpCisgICAgICAgIG5vdENlbGwg
PSBtX2ppdC5icmFuY2hUZXN0UHRyKE1hY3JvQXNzZW1ibGVyOjpOb25aZXJvLCBhcmdHUFIsIEdQ
UkluZm86OnRhZ01hc2tSZWdpc3Rlcik7CisgICAgCisgICAgbV9qaXQubG9hZFB0cihKSVRDb21w
aWxlcjo6QWRkcmVzcyhhcmdHUFIsIEpTQ2VsbDo6c3RydWN0dXJlT2Zmc2V0KCkpLCByZXN1bHRH
UFIpOworICAgIGFkZEJyYW5jaChtX2ppdC5icmFuY2hUZXN0OChpbnZlcnQgPyBKSVRDb21waWxl
cjo6WmVybyA6IEpJVENvbXBpbGVyOjpOb25aZXJvLCBKSVRDb21waWxlcjo6QWRkcmVzcyhyZXN1
bHRHUFIsIFN0cnVjdHVyZTo6dHlwZUluZm9GbGFnc09mZnNldCgpKSwgSklUQ29tcGlsZXI6OlRy
dXN0ZWRJbW0zMihNYXNxdWVyYWRlc0FzVW5kZWZpbmVkKSksIHRha2VuKTsKKyAgICAKKyAgICBp
ZiAoIWlzS25vd25DZWxsKG9wZXJhbmQpKSB7CisgICAgICAgIGFkZEJyYW5jaChtX2ppdC5qdW1w
KCksIG5vdFRha2VuKTsKKyAgICAgICAgCisgICAgICAgIG5vdENlbGwubGluaygmbV9qaXQpOwor
ICAgICAgICAKKyAgICAgICAgbV9qaXQubW92ZShhcmdHUFIsIHJlc3VsdEdQUik7CisgICAgICAg
IG1faml0LmFuZFB0cihKSVRDb21waWxlcjo6VHJ1c3RlZEltbTMyKH5UYWdCaXRVbmRlZmluZWQp
LCByZXN1bHRHUFIpOworICAgICAgICBhZGRCcmFuY2gobV9qaXQuYnJhbmNoUHRyKGludmVydCA/
IEpJVENvbXBpbGVyOjpOb3RFcXVhbCA6IEpJVENvbXBpbGVyOjpFcXVhbCwgcmVzdWx0R1BSLCBK
SVRDb21waWxlcjo6VHJ1c3RlZEltbVB0cihyZWludGVycHJldF9jYXN0PHZvaWQqPihWYWx1ZU51
bGwpKSksIHRha2VuKTsKKyAgICB9CisgICAgCisgICAgaWYgKG5vdFRha2VuICE9IChtX2Jsb2Nr
ICsgMSkpCisgICAgICAgIGFkZEJyYW5jaChtX2ppdC5qdW1wKCksIG5vdFRha2VuKTsKK30KKwor
Ym9vbCBKSVRDb2RlR2VuZXJhdG9yOjpub25TcGVjdWxhdGl2ZUNvbXBhcmVOdWxsKE5vZGUmIG5v
ZGUsIE5vZGVJbmRleCBvcGVyYW5kLCBib29sIGludmVydCkKK3sKKyAgICBOb2RlSW5kZXggYnJh
bmNoTm9kZUluZGV4ID0gZGV0ZWN0UGVlcEhvbGVCcmFuY2goKTsKKyAgICBpZiAoYnJhbmNoTm9k
ZUluZGV4ICE9IE5vTm9kZSkgeworICAgICAgICBBU1NFUlQobm9kZS5hZGp1c3RlZFJlZkNvdW50
KCkgPT0gMSk7CisgICAgICAgIAorICAgICAgICBub25TcGVjdWxhdGl2ZVBlZXBob2xlQnJhbmNo
TnVsbChvcGVyYW5kLCBicmFuY2hOb2RlSW5kZXgsIGludmVydCk7CisgICAgCisgICAgICAgIHVz
ZShub2RlLmNoaWxkMSgpKTsKKyAgICAgICAgdXNlKG5vZGUuY2hpbGQyKCkpOworICAgICAgICBt
X2NvbXBpbGVJbmRleCA9IGJyYW5jaE5vZGVJbmRleDsKKyAgICAgICAgCisgICAgICAgIHJldHVy
biB0cnVlOworICAgIH0KKyAgICAKKyAgICBub25TcGVjdWxhdGl2ZU5vblBlZXBob2xlQ29tcGFy
ZU51bGwob3BlcmFuZCwgaW52ZXJ0KTsKKyAgICAKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3Zv
aWQgSklUQ29kZUdlbmVyYXRvcjo6bm9uU3BlY3VsYXRpdmVQZWVwaG9sZUJyYW5jaChOb2RlJiBu
b2RlLCBOb2RlSW5kZXggYnJhbmNoTm9kZUluZGV4LCBNYWNyb0Fzc2VtYmxlcjo6UmVsYXRpb25h
bENvbmRpdGlvbiBjb25kLCBaX0RGR09wZXJhdGlvbl9FSkogaGVscGVyRnVuY3Rpb24pCit7Cisg
ICAgTm9kZSYgYnJhbmNoTm9kZSA9IG1faml0LmdyYXBoKClbYnJhbmNoTm9kZUluZGV4XTsKKyAg
ICBCbG9ja0luZGV4IHRha2VuID0gbV9qaXQuZ3JhcGgoKS5ibG9ja0luZGV4Rm9yQnl0ZWNvZGVP
ZmZzZXQoYnJhbmNoTm9kZS50YWtlbkJ5dGVjb2RlT2Zmc2V0KCkpOworICAgIEJsb2NrSW5kZXgg
bm90VGFrZW4gPSBtX2ppdC5ncmFwaCgpLmJsb2NrSW5kZXhGb3JCeXRlY29kZU9mZnNldChicmFu
Y2hOb2RlLm5vdFRha2VuQnl0ZWNvZGVPZmZzZXQoKSk7CisKKyAgICBKSVRDb21waWxlcjo6UmVz
dWx0Q29uZGl0aW9uIGNhbGxSZXN1bHRDb25kaXRpb24gPSBKSVRDb21waWxlcjo6Tm9uWmVybzsK
KworICAgIC8vIFRoZSBicmFuY2ggaW5zdHJ1Y3Rpb24gd2lsbCBicmFuY2ggdG8gdGhlIHRha2Vu
IGJsb2NrLgorICAgIC8vIElmIHRha2VuIGlzIG5leHQsIHN3aXRjaCB0YWtlbiB3aXRoIG5vdFRh
a2VuICYgaW52ZXJ0IHRoZSBicmFuY2ggY29uZGl0aW9uIHNvIHdlIGNhbiBmYWxsIHRocm91Z2gu
CisgICAgaWYgKHRha2VuID09IChtX2Jsb2NrICsgMSkpIHsKKyAgICAgICAgY29uZCA9IEpJVENv
bXBpbGVyOjppbnZlcnQoY29uZCk7CisgICAgICAgIGNhbGxSZXN1bHRDb25kaXRpb24gPSBKSVRD
b21waWxlcjo6WmVybzsKKyAgICAgICAgQmxvY2tJbmRleCB0bXAgPSB0YWtlbjsKKyAgICAgICAg
dGFrZW4gPSBub3RUYWtlbjsKKyAgICAgICAgbm90VGFrZW4gPSB0bXA7CisgICAgfQorCisgICAg
SlNWYWx1ZU9wZXJhbmQgYXJnMSh0aGlzLCBub2RlLmNoaWxkMSgpKTsKKyAgICBKU1ZhbHVlT3Bl
cmFuZCBhcmcyKHRoaXMsIG5vZGUuY2hpbGQyKCkpOworICAgIEdQUlJlZyBhcmcxR1BSID0gYXJn
MS5ncHIoKTsKKyAgICBHUFJSZWcgYXJnMkdQUiA9IGFyZzIuZ3ByKCk7CisgICAgCisgICAgSklU
Q29tcGlsZXI6Okp1bXBMaXN0IHNsb3dQYXRoOworICAgIAorICAgIGlmIChpc0tub3duTm90SW50
ZWdlcihub2RlLmNoaWxkMSgpKSB8fCBpc0tub3duTm90SW50ZWdlcihub2RlLmNoaWxkMigpKSkg
eworICAgICAgICBHUFJSZXN1bHQgcmVzdWx0KHRoaXMpOworICAgICAgICBHUFJSZWcgcmVzdWx0
R1BSID0gcmVzdWx0LmdwcigpOworICAgIAorICAgICAgICBhcmcxLnVzZSgpOworICAgICAgICBh
cmcyLnVzZSgpOworICAgIAorICAgICAgICBmbHVzaFJlZ2lzdGVycygpOworCisgICAgICAgIGNh
bGxPcGVyYXRpb24oaGVscGVyRnVuY3Rpb24sIHJlc3VsdEdQUiwgYXJnMUdQUiwgYXJnMkdQUik7
CisgICAgICAgIGFkZEJyYW5jaChtX2ppdC5icmFuY2hUZXN0OChjYWxsUmVzdWx0Q29uZGl0aW9u
LCByZXN1bHRHUFIpLCB0YWtlbik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgR1BSVGVtcG9yYXJ5
IHJlc3VsdCh0aGlzLCBhcmcyKTsKKyAgICAgICAgR1BSUmVnIHJlc3VsdEdQUiA9IHJlc3VsdC5n
cHIoKTsKKyAgICAKKyAgICAgICAgYXJnMS51c2UoKTsKKyAgICAgICAgYXJnMi51c2UoKTsKKyAg
ICAKKyAgICAgICAgaWYgKCFpc0tub3duSW50ZWdlcihub2RlLmNoaWxkMSgpKSkKKyAgICAgICAg
ICAgIHNsb3dQYXRoLmFwcGVuZChtX2ppdC5icmFuY2hQdHIoTWFjcm9Bc3NlbWJsZXI6OkJlbG93
LCBhcmcxR1BSLCBHUFJJbmZvOjp0YWdUeXBlTnVtYmVyUmVnaXN0ZXIpKTsKKyAgICAgICAgaWYg
KCFpc0tub3duSW50ZWdlcihub2RlLmNoaWxkMigpKSkKKyAgICAgICAgICAgIHNsb3dQYXRoLmFw
cGVuZChtX2ppdC5icmFuY2hQdHIoTWFjcm9Bc3NlbWJsZXI6OkJlbG93LCBhcmcyR1BSLCBHUFJJ
bmZvOjp0YWdUeXBlTnVtYmVyUmVnaXN0ZXIpKTsKKyAgICAKKyAgICAgICAgYWRkQnJhbmNoKG1f
aml0LmJyYW5jaDMyKGNvbmQsIGFyZzFHUFIsIGFyZzJHUFIpLCB0YWtlbik7CisgICAgCisgICAg
ICAgIGlmICghaXNLbm93bkludGVnZXIobm9kZS5jaGlsZDEoKSkgfHwgIWlzS25vd25JbnRlZ2Vy
KG5vZGUuY2hpbGQyKCkpKSB7CisgICAgICAgICAgICBhZGRCcmFuY2gobV9qaXQuanVtcCgpLCBu
b3RUYWtlbik7CisgICAgCisgICAgICAgICAgICBzbG93UGF0aC5saW5rKCZtX2ppdCk7CisgICAg
CisgICAgICAgICAgICBzaWxlbnRTcGlsbEFsbFJlZ2lzdGVycyhyZXN1bHRHUFIpOworICAgICAg
ICAgICAgc2V0dXBTdHViQXJndW1lbnRzKGFyZzFHUFIsIGFyZzJHUFIpOworICAgICAgICAgICAg
bV9qaXQubW92ZShHUFJJbmZvOjpjYWxsRnJhbWVSZWdpc3RlciwgR1BSSW5mbzo6YXJndW1lbnRH
UFIwKTsKKyAgICAgICAgICAgIGFwcGVuZENhbGxXaXRoRXhjZXB0aW9uQ2hlY2soaGVscGVyRnVu
Y3Rpb24pOworICAgICAgICAgICAgbV9qaXQubW92ZShHUFJJbmZvOjpyZXR1cm5WYWx1ZUdQUiwg
cmVzdWx0R1BSKTsKKyAgICAgICAgICAgIHNpbGVudEZpbGxBbGxSZWdpc3RlcnMocmVzdWx0R1BS
KTsKKyAgICAgICAgCisgICAgICAgICAgICBhZGRCcmFuY2gobV9qaXQuYnJhbmNoVGVzdDgoY2Fs
bFJlc3VsdENvbmRpdGlvbiwgcmVzdWx0R1BSKSwgdGFrZW4pOworICAgICAgICB9CisgICAgfQor
CisgICAgaWYgKG5vdFRha2VuICE9IChtX2Jsb2NrICsgMSkpCisgICAgICAgIGFkZEJyYW5jaCht
X2ppdC5qdW1wKCksIG5vdFRha2VuKTsKK30KKwordm9pZCBKSVRDb2RlR2VuZXJhdG9yOjpub25T
cGVjdWxhdGl2ZU5vblBlZXBob2xlQ29tcGFyZShOb2RlJiBub2RlLCBNYWNyb0Fzc2VtYmxlcjo6
UmVsYXRpb25hbENvbmRpdGlvbiBjb25kLCBaX0RGR09wZXJhdGlvbl9FSkogaGVscGVyRnVuY3Rp
b24pCit7CisgICAgSlNWYWx1ZU9wZXJhbmQgYXJnMSh0aGlzLCBub2RlLmNoaWxkMSgpKTsKKyAg
ICBKU1ZhbHVlT3BlcmFuZCBhcmcyKHRoaXMsIG5vZGUuY2hpbGQyKCkpOworICAgIEdQUlJlZyBh
cmcxR1BSID0gYXJnMS5ncHIoKTsKKyAgICBHUFJSZWcgYXJnMkdQUiA9IGFyZzIuZ3ByKCk7Cisg
ICAgCisgICAgSklUQ29tcGlsZXI6Okp1bXBMaXN0IHNsb3dQYXRoOworICAgIAorICAgIGlmIChp
c0tub3duTm90SW50ZWdlcihub2RlLmNoaWxkMSgpKSB8fCBpc0tub3duTm90SW50ZWdlcihub2Rl
LmNoaWxkMigpKSkgeworICAgICAgICBHUFJSZXN1bHQgcmVzdWx0KHRoaXMpOworICAgICAgICBH
UFJSZWcgcmVzdWx0R1BSID0gcmVzdWx0LmdwcigpOworICAgIAorICAgICAgICBhcmcxLnVzZSgp
OworICAgICAgICBhcmcyLnVzZSgpOworICAgIAorICAgICAgICBmbHVzaFJlZ2lzdGVycygpOwor
ICAgICAgICAKKyAgICAgICAgY2FsbE9wZXJhdGlvbihoZWxwZXJGdW5jdGlvbiwgcmVzdWx0R1BS
LCBhcmcxR1BSLCBhcmcyR1BSKTsKKyAgICAgICAgCisgICAgICAgIG1faml0Lm9yMzIoVHJ1c3Rl
ZEltbTMyKFZhbHVlRmFsc2UpLCByZXN1bHRHUFIpOworICAgICAgICBqc1ZhbHVlUmVzdWx0KHJl
c3VsdEdQUiwgbV9jb21waWxlSW5kZXgsIERhdGFGb3JtYXRKU0Jvb2xlYW4sIFVzZUNoaWxkcmVu
Q2FsbGVkRXhwbGljaXRseSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgR1BSVGVtcG9yYXJ5IHJl
c3VsdCh0aGlzLCBhcmcyKTsKKyAgICAgICAgR1BSUmVnIHJlc3VsdEdQUiA9IHJlc3VsdC5ncHIo
KTsKKworICAgICAgICBhcmcxLnVzZSgpOworICAgICAgICBhcmcyLnVzZSgpOworICAgIAorICAg
ICAgICBpZiAoIWlzS25vd25JbnRlZ2VyKG5vZGUuY2hpbGQxKCkpKQorICAgICAgICAgICAgc2xv
d1BhdGguYXBwZW5kKG1faml0LmJyYW5jaFB0cihNYWNyb0Fzc2VtYmxlcjo6QmVsb3csIGFyZzFH
UFIsIEdQUkluZm86OnRhZ1R5cGVOdW1iZXJSZWdpc3RlcikpOworICAgICAgICBpZiAoIWlzS25v
d25JbnRlZ2VyKG5vZGUuY2hpbGQyKCkpKQorICAgICAgICAgICAgc2xvd1BhdGguYXBwZW5kKG1f
aml0LmJyYW5jaFB0cihNYWNyb0Fzc2VtYmxlcjo6QmVsb3csIGFyZzJHUFIsIEdQUkluZm86OnRh
Z1R5cGVOdW1iZXJSZWdpc3RlcikpOworICAgIAorICAgICAgICBtX2ppdC5jb21wYXJlMzIoY29u
ZCwgYXJnMUdQUiwgYXJnMkdQUiwgcmVzdWx0R1BSKTsKKyAgICAKKyAgICAgICAgaWYgKCFpc0tu
b3duSW50ZWdlcihub2RlLmNoaWxkMSgpKSB8fCAhaXNLbm93bkludGVnZXIobm9kZS5jaGlsZDIo
KSkpIHsKKyAgICAgICAgICAgIEpJVENvbXBpbGVyOjpKdW1wIGhhdmVSZXN1bHQgPSBtX2ppdC5q
dW1wKCk7CisgICAgCisgICAgICAgICAgICBzbG93UGF0aC5saW5rKCZtX2ppdCk7CisgICAgICAg
IAorICAgICAgICAgICAgc2lsZW50U3BpbGxBbGxSZWdpc3RlcnMocmVzdWx0R1BSKTsKKyAgICAg
ICAgICAgIHNldHVwU3R1YkFyZ3VtZW50cyhhcmcxR1BSLCBhcmcyR1BSKTsKKyAgICAgICAgICAg
IG1faml0Lm1vdmUoR1BSSW5mbzo6Y2FsbEZyYW1lUmVnaXN0ZXIsIEdQUkluZm86OmFyZ3VtZW50
R1BSMCk7CisgICAgICAgICAgICBhcHBlbmRDYWxsV2l0aEV4Y2VwdGlvbkNoZWNrKGhlbHBlckZ1
bmN0aW9uKTsKKyAgICAgICAgICAgIG1faml0Lm1vdmUoR1BSSW5mbzo6cmV0dXJuVmFsdWVHUFIs
IHJlc3VsdEdQUik7CisgICAgICAgICAgICBzaWxlbnRGaWxsQWxsUmVnaXN0ZXJzKHJlc3VsdEdQ
Uik7CisgICAgICAgIAorICAgICAgICAgICAgbV9qaXQuYW5kUHRyKFRydXN0ZWRJbW0zMigxKSwg
cmVzdWx0R1BSKTsKKyAgICAgICAgCisgICAgICAgICAgICBoYXZlUmVzdWx0LmxpbmsoJm1faml0
KTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgbV9qaXQub3IzMihUcnVzdGVkSW1tMzIo
VmFsdWVGYWxzZSksIHJlc3VsdEdQUik7CisgICAgICAgIAorICAgICAgICBqc1ZhbHVlUmVzdWx0
KHJlc3VsdEdQUiwgbV9jb21waWxlSW5kZXgsIERhdGFGb3JtYXRKU0Jvb2xlYW4sIFVzZUNoaWxk
cmVuQ2FsbGVkRXhwbGljaXRseSk7CisgICAgfQorfQorCitib29sIEpJVENvZGVHZW5lcmF0b3I6
Om5vblNwZWN1bGF0aXZlQ29tcGFyZShOb2RlJiBub2RlLCBNYWNyb0Fzc2VtYmxlcjo6UmVsYXRp
b25hbENvbmRpdGlvbiBjb25kLCBaX0RGR09wZXJhdGlvbl9FSkogaGVscGVyRnVuY3Rpb24pCit7
CisgICAgTm9kZUluZGV4IGJyYW5jaE5vZGVJbmRleCA9IGRldGVjdFBlZXBIb2xlQnJhbmNoKCk7
CisgICAgaWYgKGJyYW5jaE5vZGVJbmRleCAhPSBOb05vZGUpIHsKKyAgICAgICAgQVNTRVJUKG5v
ZGUuYWRqdXN0ZWRSZWZDb3VudCgpID09IDEpOworICAgICAgICAKKyAgICAgICAgbm9uU3BlY3Vs
YXRpdmVQZWVwaG9sZUJyYW5jaChub2RlLCBicmFuY2hOb2RlSW5kZXgsIGNvbmQsIGhlbHBlckZ1
bmN0aW9uKTsKKyAgICAKKyAgICAgICAgbV9jb21waWxlSW5kZXggPSBicmFuY2hOb2RlSW5kZXg7
CisgICAgICAgIAorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgbm9uU3Bl
Y3VsYXRpdmVOb25QZWVwaG9sZUNvbXBhcmUobm9kZSwgY29uZCwgaGVscGVyRnVuY3Rpb24pOwor
ICAgIAorICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBKSVRDb2RlR2VuZXJhdG9yOjpub25T
cGVjdWxhdGl2ZVBlZXBob2xlU3RyaWN0RXEoTm9kZSYgbm9kZSwgTm9kZUluZGV4IGJyYW5jaE5v
ZGVJbmRleCwgYm9vbCBpbnZlcnQpCit7CisgICAgTm9kZSYgYnJhbmNoTm9kZSA9IG1faml0Lmdy
YXBoKClbYnJhbmNoTm9kZUluZGV4XTsKKyAgICBCbG9ja0luZGV4IHRha2VuID0gbV9qaXQuZ3Jh
cGgoKS5ibG9ja0luZGV4Rm9yQnl0ZWNvZGVPZmZzZXQoYnJhbmNoTm9kZS50YWtlbkJ5dGVjb2Rl
T2Zmc2V0KCkpOworICAgIEJsb2NrSW5kZXggbm90VGFrZW4gPSBtX2ppdC5ncmFwaCgpLmJsb2Nr
SW5kZXhGb3JCeXRlY29kZU9mZnNldChicmFuY2hOb2RlLm5vdFRha2VuQnl0ZWNvZGVPZmZzZXQo
KSk7CisKKyAgICAvLyBUaGUgYnJhbmNoIGluc3RydWN0aW9uIHdpbGwgYnJhbmNoIHRvIHRoZSB0
YWtlbiBibG9jay4KKyAgICAvLyBJZiB0YWtlbiBpcyBuZXh0LCBzd2l0Y2ggdGFrZW4gd2l0aCBu
b3RUYWtlbiAmIGludmVydCB0aGUgYnJhbmNoIGNvbmRpdGlvbiBzbyB3ZSBjYW4gZmFsbCB0aHJv
dWdoLgorICAgIGlmICh0YWtlbiA9PSAobV9ibG9jayArIDEpKSB7CisgICAgICAgIGludmVydCA9
ICFpbnZlcnQ7CisgICAgICAgIEJsb2NrSW5kZXggdG1wID0gdGFrZW47CisgICAgICAgIHRha2Vu
ID0gbm90VGFrZW47CisgICAgICAgIG5vdFRha2VuID0gdG1wOworICAgIH0KKyAgICAKKyAgICBK
U1ZhbHVlT3BlcmFuZCBhcmcxKHRoaXMsIG5vZGUuY2hpbGQxKCkpOworICAgIEpTVmFsdWVPcGVy
YW5kIGFyZzIodGhpcywgbm9kZS5jaGlsZDIoKSk7CisgICAgR1BSUmVnIGFyZzFHUFIgPSBhcmcx
LmdwcigpOworICAgIEdQUlJlZyBhcmcyR1BSID0gYXJnMi5ncHIoKTsKKyAgICAKKyAgICBHUFJU
ZW1wb3JhcnkgcmVzdWx0KHRoaXMpOworICAgIEdQUlJlZyByZXN1bHRHUFIgPSByZXN1bHQuZ3By
KCk7CisgICAgCisgICAgYXJnMS51c2UoKTsKKyAgICBhcmcyLnVzZSgpOworICAgIAorICAgIGlm
IChpc0tub3duQ2VsbChub2RlLmNoaWxkMSgpKSAmJiBpc0tub3duQ2VsbChub2RlLmNoaWxkMigp
KSkgeworICAgICAgICAvLyBzZWUgaWYgd2UgZ2V0IGx1Y2t5OiBpZiB0aGUgYXJndW1lbnRzIGFy
ZSBjZWxscyBhbmQgdGhleSByZWZlcmVuY2UgdGhlIHNhbWUKKyAgICAgICAgLy8gY2VsbCwgdGhl
biB0aGV5IG11c3QgYmUgc3RyaWN0bHkgZXF1YWwuCisgICAgICAgIGFkZEJyYW5jaChtX2ppdC5i
cmFuY2hQdHIoSklUQ29tcGlsZXI6OkVxdWFsLCBhcmcxR1BSLCBhcmcyR1BSKSwgaW52ZXJ0ID8g
bm90VGFrZW4gOiB0YWtlbik7CisgICAgICAgIAorICAgICAgICBzaWxlbnRTcGlsbEFsbFJlZ2lz
dGVycyhyZXN1bHRHUFIpOworICAgICAgICBzZXR1cFN0dWJBcmd1bWVudHMoYXJnMUdQUiwgYXJn
MkdQUik7CisgICAgICAgIG1faml0Lm1vdmUoR1BSSW5mbzo6Y2FsbEZyYW1lUmVnaXN0ZXIsIEdQ
UkluZm86OmFyZ3VtZW50R1BSMCk7CisgICAgICAgIGFwcGVuZENhbGxXaXRoRXhjZXB0aW9uQ2hl
Y2sob3BlcmF0aW9uQ29tcGFyZVN0cmljdEVxQ2VsbCk7CisgICAgICAgIG1faml0Lm1vdmUoR1BS
SW5mbzo6cmV0dXJuVmFsdWVHUFIsIHJlc3VsdEdQUik7CisgICAgICAgIHNpbGVudEZpbGxBbGxS
ZWdpc3RlcnMocmVzdWx0R1BSKTsKKyAgICAgICAgCisgICAgICAgIGFkZEJyYW5jaChtX2ppdC5i
cmFuY2hUZXN0OChpbnZlcnQgPyBKSVRDb21waWxlcjo6Tm9uWmVybyA6IEpJVENvbXBpbGVyOjpa
ZXJvLCByZXN1bHRHUFIpLCB0YWtlbik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbV9qaXQub3JQ
dHIoYXJnMUdQUiwgYXJnMkdQUiwgcmVzdWx0R1BSKTsKKyAgICAgICAgCisgICAgICAgIEpJVENv
bXBpbGVyOjpKdW1wIHR3b0NlbGxzQ2FzZSA9IG1faml0LmJyYW5jaFRlc3RQdHIoSklUQ29tcGls
ZXI6Olplcm8sIHJlc3VsdEdQUiwgR1BSSW5mbzo6dGFnTWFza1JlZ2lzdGVyKTsKKyAgICAgICAg
CisgICAgICAgIEpJVENvbXBpbGVyOjpKdW1wIG51bWJlckNhc2UgPSBtX2ppdC5icmFuY2hUZXN0
UHRyKEpJVENvbXBpbGVyOjpOb25aZXJvLCByZXN1bHRHUFIsIEdQUkluZm86OnRhZ1R5cGVOdW1i
ZXJSZWdpc3Rlcik7CisgICAgICAgIAorICAgICAgICBhZGRCcmFuY2gobV9qaXQuYnJhbmNoMzIo
aW52ZXJ0ID8gSklUQ29tcGlsZXI6Ok5vdEVxdWFsIDogSklUQ29tcGlsZXI6OkVxdWFsLCBhcmcx
R1BSLCBhcmcyR1BSKSwgdGFrZW4pOworICAgICAgICBhZGRCcmFuY2gobV9qaXQuanVtcCgpLCBu
b3RUYWtlbik7CisgICAgICAgIAorICAgICAgICB0d29DZWxsc0Nhc2UubGluaygmbV9qaXQpOwor
ICAgICAgICBhZGRCcmFuY2gobV9qaXQuYnJhbmNoUHRyKEpJVENvbXBpbGVyOjpFcXVhbCwgYXJn
MUdQUiwgYXJnMkdQUiksIGludmVydCA/IG5vdFRha2VuIDogdGFrZW4pOworICAgICAgICAKKyAg
ICAgICAgbnVtYmVyQ2FzZS5saW5rKCZtX2ppdCk7CisgICAgICAgIAorICAgICAgICBzaWxlbnRT
cGlsbEFsbFJlZ2lzdGVycyhyZXN1bHRHUFIpOworICAgICAgICBzZXR1cFN0dWJBcmd1bWVudHMo
YXJnMUdQUiwgYXJnMkdQUik7CisgICAgICAgIG1faml0Lm1vdmUoR1BSSW5mbzo6Y2FsbEZyYW1l
UmVnaXN0ZXIsIEdQUkluZm86OmFyZ3VtZW50R1BSMCk7CisgICAgICAgIGFwcGVuZENhbGxXaXRo
RXhjZXB0aW9uQ2hlY2sob3BlcmF0aW9uQ29tcGFyZVN0cmljdEVxKTsKKyAgICAgICAgbV9qaXQu
bW92ZShHUFJJbmZvOjpyZXR1cm5WYWx1ZUdQUiwgcmVzdWx0R1BSKTsKKyAgICAgICAgc2lsZW50
RmlsbEFsbFJlZ2lzdGVycyhyZXN1bHRHUFIpOworICAgICAgICAKKyAgICAgICAgYWRkQnJhbmNo
KG1faml0LmJyYW5jaFRlc3Q4KGludmVydCA/IEpJVENvbXBpbGVyOjpaZXJvIDogSklUQ29tcGls
ZXI6Ok5vblplcm8sIHJlc3VsdEdQUiksIHRha2VuKTsKKyAgICB9CisgICAgCisgICAgaWYgKG5v
dFRha2VuICE9IChtX2Jsb2NrICsgMSkpCisgICAgICAgIGFkZEJyYW5jaChtX2ppdC5qdW1wKCks
IG5vdFRha2VuKTsKK30KKwordm9pZCBKSVRDb2RlR2VuZXJhdG9yOjpub25TcGVjdWxhdGl2ZU5v
blBlZXBob2xlU3RyaWN0RXEoTm9kZSYgbm9kZSwgYm9vbCBpbnZlcnQpCit7CisgICAgSlNWYWx1
ZU9wZXJhbmQgYXJnMSh0aGlzLCBub2RlLmNoaWxkMSgpKTsKKyAgICBKU1ZhbHVlT3BlcmFuZCBh
cmcyKHRoaXMsIG5vZGUuY2hpbGQyKCkpOworICAgIEdQUlJlZyBhcmcxR1BSID0gYXJnMS5ncHIo
KTsKKyAgICBHUFJSZWcgYXJnMkdQUiA9IGFyZzIuZ3ByKCk7CisgICAgCisgICAgR1BSVGVtcG9y
YXJ5IHJlc3VsdCh0aGlzKTsKKyAgICBHUFJSZWcgcmVzdWx0R1BSID0gcmVzdWx0LmdwcigpOwor
ICAgIAorICAgIGFyZzEudXNlKCk7CisgICAgYXJnMi51c2UoKTsKKyAgICAKKyAgICBpZiAoaXNL
bm93bkNlbGwobm9kZS5jaGlsZDEoKSkgJiYgaXNLbm93bkNlbGwobm9kZS5jaGlsZDIoKSkpIHsK
KyAgICAgICAgLy8gc2VlIGlmIHdlIGdldCBsdWNreTogaWYgdGhlIGFyZ3VtZW50cyBhcmUgY2Vs
bHMgYW5kIHRoZXkgcmVmZXJlbmNlIHRoZSBzYW1lCisgICAgICAgIC8vIGNlbGwsIHRoZW4gdGhl
eSBtdXN0IGJlIHN0cmljdGx5IGVxdWFsLgorICAgICAgICBKSVRDb21waWxlcjo6SnVtcCBub3RF
cXVhbENhc2UgPSBtX2ppdC5icmFuY2hQdHIoSklUQ29tcGlsZXI6Ok5vdEVxdWFsLCBhcmcxR1BS
LCBhcmcyR1BSKTsKKyAgICAgICAgCisgICAgICAgIG1faml0Lm1vdmUoSklUQ29tcGlsZXI6OlRy
dXN0ZWRJbW1QdHIoSlNWYWx1ZTo6ZW5jb2RlKGpzQm9vbGVhbighaW52ZXJ0KSkpLCByZXN1bHRH
UFIpOworICAgICAgICAKKyAgICAgICAgSklUQ29tcGlsZXI6Okp1bXAgZG9uZSA9IG1faml0Lmp1
bXAoKTsKKworICAgICAgICBub3RFcXVhbENhc2UubGluaygmbV9qaXQpOworICAgICAgICAKKyAg
ICAgICAgc2lsZW50U3BpbGxBbGxSZWdpc3RlcnMocmVzdWx0R1BSKTsKKyAgICAgICAgc2V0dXBT
dHViQXJndW1lbnRzKGFyZzFHUFIsIGFyZzJHUFIpOworICAgICAgICBtX2ppdC5tb3ZlKEdQUklu
Zm86OmNhbGxGcmFtZVJlZ2lzdGVyLCBHUFJJbmZvOjphcmd1bWVudEdQUjApOworICAgICAgICBh
cHBlbmRDYWxsV2l0aEV4Y2VwdGlvbkNoZWNrKG9wZXJhdGlvbkNvbXBhcmVTdHJpY3RFcUNlbGwp
OworICAgICAgICBtX2ppdC5tb3ZlKEdQUkluZm86OnJldHVyblZhbHVlR1BSLCByZXN1bHRHUFIp
OworICAgICAgICBzaWxlbnRGaWxsQWxsUmVnaXN0ZXJzKHJlc3VsdEdQUik7CisgICAgICAgIAor
ICAgICAgICBtX2ppdC5hbmRQdHIoSklUQ29tcGlsZXI6OlRydXN0ZWRJbW0zMigxKSwgcmVzdWx0
R1BSKTsKKyAgICAgICAgbV9qaXQub3IzMihKSVRDb21waWxlcjo6VHJ1c3RlZEltbTMyKFZhbHVl
RmFsc2UpLCByZXN1bHRHUFIpOworICAgICAgICAKKyAgICAgICAgZG9uZS5saW5rKCZtX2ppdCk7
CisgICAgfSBlbHNlIHsKKyAgICAgICAgbV9qaXQub3JQdHIoYXJnMUdQUiwgYXJnMkdQUiwgcmVz
dWx0R1BSKTsKKyAgICAgICAgCisgICAgICAgIEpJVENvbXBpbGVyOjpKdW1wIHR3b0NlbGxzQ2Fz
ZSA9IG1faml0LmJyYW5jaFRlc3RQdHIoSklUQ29tcGlsZXI6Olplcm8sIHJlc3VsdEdQUiwgR1BS
SW5mbzo6dGFnTWFza1JlZ2lzdGVyKTsKKyAgICAgICAgCisgICAgICAgIEpJVENvbXBpbGVyOjpK
dW1wIG51bWJlckNhc2UgPSBtX2ppdC5icmFuY2hUZXN0UHRyKEpJVENvbXBpbGVyOjpOb25aZXJv
LCByZXN1bHRHUFIsIEdQUkluZm86OnRhZ1R5cGVOdW1iZXJSZWdpc3Rlcik7CisgICAgICAgIAor
ICAgICAgICBtX2ppdC5jb21wYXJlMzIoaW52ZXJ0ID8gSklUQ29tcGlsZXI6Ok5vdEVxdWFsIDog
SklUQ29tcGlsZXI6OkVxdWFsLCBhcmcxR1BSLCBhcmcyR1BSLCByZXN1bHRHUFIpOworICAgICAg
ICAKKyAgICAgICAgSklUQ29tcGlsZXI6Okp1bXAgZG9uZTEgPSBtX2ppdC5qdW1wKCk7CisgICAg
ICAgIAorICAgICAgICB0d29DZWxsc0Nhc2UubGluaygmbV9qaXQpOworICAgICAgICBKSVRDb21w
aWxlcjo6SnVtcCBub3RFcXVhbENhc2UgPSBtX2ppdC5icmFuY2hQdHIoSklUQ29tcGlsZXI6Ok5v
dEVxdWFsLCBhcmcxR1BSLCBhcmcyR1BSKTsKKyAgICAgICAgCisgICAgICAgIG1faml0Lm1vdmUo
SklUQ29tcGlsZXI6OlRydXN0ZWRJbW1QdHIoSlNWYWx1ZTo6ZW5jb2RlKGpzQm9vbGVhbighaW52
ZXJ0KSkpLCByZXN1bHRHUFIpOworICAgICAgICAKKyAgICAgICAgSklUQ29tcGlsZXI6Okp1bXAg
ZG9uZTIgPSBtX2ppdC5qdW1wKCk7CisgICAgICAgIAorICAgICAgICBudW1iZXJDYXNlLmxpbmso
Jm1faml0KTsKKyAgICAgICAgbm90RXF1YWxDYXNlLmxpbmsoJm1faml0KTsKKyAgICAgICAgCisg
ICAgICAgIHNpbGVudFNwaWxsQWxsUmVnaXN0ZXJzKHJlc3VsdEdQUik7CisgICAgICAgIHNldHVw
U3R1YkFyZ3VtZW50cyhhcmcxR1BSLCBhcmcyR1BSKTsKKyAgICAgICAgbV9qaXQubW92ZShHUFJJ
bmZvOjpjYWxsRnJhbWVSZWdpc3RlciwgR1BSSW5mbzo6YXJndW1lbnRHUFIwKTsKKyAgICAgICAg
YXBwZW5kQ2FsbFdpdGhFeGNlcHRpb25DaGVjayhvcGVyYXRpb25Db21wYXJlU3RyaWN0RXEpOwor
ICAgICAgICBtX2ppdC5tb3ZlKEdQUkluZm86OnJldHVyblZhbHVlR1BSLCByZXN1bHRHUFIpOwor
ICAgICAgICBzaWxlbnRGaWxsQWxsUmVnaXN0ZXJzKHJlc3VsdEdQUik7CisgICAgICAgIAorICAg
ICAgICBtX2ppdC5hbmRQdHIoSklUQ29tcGlsZXI6OlRydXN0ZWRJbW0zMigxKSwgcmVzdWx0R1BS
KTsKKworICAgICAgICBkb25lMS5saW5rKCZtX2ppdCk7CisKKyAgICAgICAgbV9qaXQub3IzMihK
SVRDb21waWxlcjo6VHJ1c3RlZEltbTMyKFZhbHVlRmFsc2UpLCByZXN1bHRHUFIpOworICAgICAg
ICAKKyAgICAgICAgZG9uZTIubGluaygmbV9qaXQpOworICAgIH0KKyAgICAKKyAgICBqc1ZhbHVl
UmVzdWx0KHJlc3VsdEdQUiwgbV9jb21waWxlSW5kZXgsIERhdGFGb3JtYXRKU0Jvb2xlYW4sIFVz
ZUNoaWxkcmVuQ2FsbGVkRXhwbGljaXRseSk7Cit9CisKK2Jvb2wgSklUQ29kZUdlbmVyYXRvcjo6
bm9uU3BlY3VsYXRpdmVTdHJpY3RFcShOb2RlJiBub2RlLCBib29sIGludmVydCkKK3sKKyAgICBp
ZiAoIWludmVydCAmJiAoaXNLbm93bk51bWVyaWMobm9kZS5jaGlsZDEoKSkgfHwgaXNLbm93bk51
bWVyaWMobm9kZS5jaGlsZDIoKSkpKQorICAgICAgICByZXR1cm4gbm9uU3BlY3VsYXRpdmVDb21w
YXJlKG5vZGUsIE1hY3JvQXNzZW1ibGVyOjpFcXVhbCwgb3BlcmF0aW9uQ29tcGFyZVN0cmljdEVx
KTsKKyAgICAKKyAgICBOb2RlSW5kZXggYnJhbmNoTm9kZUluZGV4ID0gZGV0ZWN0UGVlcEhvbGVC
cmFuY2goKTsKKyAgICBpZiAoYnJhbmNoTm9kZUluZGV4ICE9IE5vTm9kZSkgeworICAgICAgICBB
U1NFUlQobm9kZS5hZGp1c3RlZFJlZkNvdW50KCkgPT0gMSk7CisgICAgICAgIAorICAgICAgICBu
b25TcGVjdWxhdGl2ZVBlZXBob2xlU3RyaWN0RXEobm9kZSwgYnJhbmNoTm9kZUluZGV4LCBpbnZl
cnQpOworICAgIAorICAgICAgICBtX2NvbXBpbGVJbmRleCA9IGJyYW5jaE5vZGVJbmRleDsKKyAg
ICAgICAgCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAKKyAgICBub25TcGVjdWxh
dGl2ZU5vblBlZXBob2xlU3RyaWN0RXEobm9kZSwgaW52ZXJ0KTsKKyAgICAKKyAgICByZXR1cm4g
ZmFsc2U7Cit9CisKK3ZvaWQgSklUQ29kZUdlbmVyYXRvcjo6ZW1pdEJyYW5jaChOb2RlJiBub2Rl
KQoreworICAgIEpTVmFsdWVPcGVyYW5kIHZhbHVlKHRoaXMsIG5vZGUuY2hpbGQxKCkpOworICAg
IEdQUlJlZyB2YWx1ZUdQUiA9IHZhbHVlLmdwcigpOworICAgIAorICAgIEJsb2NrSW5kZXggdGFr
ZW4gPSBtX2ppdC5ncmFwaCgpLmJsb2NrSW5kZXhGb3JCeXRlY29kZU9mZnNldChub2RlLnRha2Vu
Qnl0ZWNvZGVPZmZzZXQoKSk7CisgICAgQmxvY2tJbmRleCBub3RUYWtlbiA9IG1faml0LmdyYXBo
KCkuYmxvY2tJbmRleEZvckJ5dGVjb2RlT2Zmc2V0KG5vZGUubm90VGFrZW5CeXRlY29kZU9mZnNl
dCgpKTsKKyAgICAKKyAgICBpZiAoaXNLbm93bkJvb2xlYW4obm9kZS5jaGlsZDEoKSkpIHsKKyAg
ICAgICAgTWFjcm9Bc3NlbWJsZXI6OlJlc3VsdENvbmRpdGlvbiBjb25kaXRpb24gPSBNYWNyb0Fz
c2VtYmxlcjo6Tm9uWmVybzsKKyAgICAgICAgCisgICAgICAgIGlmICh0YWtlbiA9PSAobV9ibG9j
ayArIDEpKSB7CisgICAgICAgICAgICBjb25kaXRpb24gPSBNYWNyb0Fzc2VtYmxlcjo6WmVybzsK
KyAgICAgICAgICAgIEJsb2NrSW5kZXggdG1wID0gdGFrZW47CisgICAgICAgICAgICB0YWtlbiA9
IG5vdFRha2VuOworICAgICAgICAgICAgbm90VGFrZW4gPSB0bXA7CisgICAgICAgIH0KKyAgICAg
ICAgCisgICAgICAgIGFkZEJyYW5jaChtX2ppdC5icmFuY2hUZXN0MzIoY29uZGl0aW9uLCB2YWx1
ZUdQUiwgVHJ1c3RlZEltbTMyKHRydWUpKSwgdGFrZW4pOworICAgICAgICBpZiAobm90VGFrZW4g
IT0gKG1fYmxvY2sgKyAxKSkKKyAgICAgICAgICAgIGFkZEJyYW5jaChtX2ppdC5qdW1wKCksIG5v
dFRha2VuKTsKKyAgICAgICAgCisgICAgICAgIG5vUmVzdWx0KG1fY29tcGlsZUluZGV4KTsKKyAg
ICB9IGVsc2UgeworICAgICAgICBHUFJUZW1wb3JhcnkgcmVzdWx0KHRoaXMpOworICAgICAgICBH
UFJSZWcgcmVzdWx0R1BSID0gcmVzdWx0LmdwcigpOworICAgICAgICAKKyAgICAgICAgYm9vbCBw
cmVkaWN0Qm9vbGVhbiA9IGlzQm9vbGVhblByZWRpY3Rpb24obV9qaXQuZ2V0UHJlZGljdGlvbihu
b2RlLmNoaWxkMSgpKSk7CisgICAgCisgICAgICAgIGlmIChwcmVkaWN0Qm9vbGVhbikgeworICAg
ICAgICAgICAgYWRkQnJhbmNoKG1faml0LmJyYW5jaFB0cihNYWNyb0Fzc2VtYmxlcjo6RXF1YWws
IHZhbHVlR1BSLCBNYWNyb0Fzc2VtYmxlcjo6SW1tUHRyKEpTVmFsdWU6OmVuY29kZShqc0Jvb2xl
YW4oZmFsc2UpKSkpLCBub3RUYWtlbik7CisgICAgICAgICAgICBhZGRCcmFuY2gobV9qaXQuYnJh
bmNoUHRyKE1hY3JvQXNzZW1ibGVyOjpFcXVhbCwgdmFsdWVHUFIsIE1hY3JvQXNzZW1ibGVyOjpJ
bW1QdHIoSlNWYWx1ZTo6ZW5jb2RlKGpzQm9vbGVhbih0cnVlKSkpKSwgdGFrZW4pOworICAgICAg
ICB9CisgICAgICAgIAorICAgICAgICBpZiAobV9pc1NwZWN1bGF0aXZlICYmIHByZWRpY3RCb29s
ZWFuKSB7CisgICAgICAgICAgICBzcGVjdWxhdGlvbkNoZWNrKG1faml0Lmp1bXAoKSk7CisgICAg
ICAgICAgICB2YWx1ZS51c2UoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFkZEJy
YW5jaChtX2ppdC5icmFuY2hQdHIoTWFjcm9Bc3NlbWJsZXI6OkVxdWFsLCB2YWx1ZUdQUiwgTWFj
cm9Bc3NlbWJsZXI6OkltbVB0cihKU1ZhbHVlOjplbmNvZGUoanNOdW1iZXIoMCkpKSksIG5vdFRh
a2VuKTsKKyAgICAgICAgICAgIGFkZEJyYW5jaChtX2ppdC5icmFuY2hQdHIoTWFjcm9Bc3NlbWJs
ZXI6OkFib3ZlT3JFcXVhbCwgdmFsdWVHUFIsIEdQUkluZm86OnRhZ1R5cGVOdW1iZXJSZWdpc3Rl
ciksIHRha2VuKTsKKyAgICAKKyAgICAgICAgICAgIGlmICghcHJlZGljdEJvb2xlYW4pIHsKKyAg
ICAgICAgICAgICAgICBhZGRCcmFuY2gobV9qaXQuYnJhbmNoUHRyKE1hY3JvQXNzZW1ibGVyOjpF
cXVhbCwgdmFsdWVHUFIsIE1hY3JvQXNzZW1ibGVyOjpJbW1QdHIoSlNWYWx1ZTo6ZW5jb2RlKGpz
Qm9vbGVhbihmYWxzZSkpKSksIG5vdFRha2VuKTsKKyAgICAgICAgICAgICAgICBhZGRCcmFuY2go
bV9qaXQuYnJhbmNoUHRyKE1hY3JvQXNzZW1ibGVyOjpFcXVhbCwgdmFsdWVHUFIsIE1hY3JvQXNz
ZW1ibGVyOjpJbW1QdHIoSlNWYWx1ZTo6ZW5jb2RlKGpzQm9vbGVhbih0cnVlKSkpKSwgdGFrZW4p
OworICAgICAgICAgICAgfQorICAgIAorICAgICAgICAgICAgdmFsdWUudXNlKCk7CisgICAgCisg
ICAgICAgICAgICBzaWxlbnRTcGlsbEFsbFJlZ2lzdGVycyhyZXN1bHRHUFIpOworICAgICAgICAg
ICAgbV9qaXQubW92ZSh2YWx1ZUdQUiwgR1BSSW5mbzo6YXJndW1lbnRHUFIxKTsKKyAgICAgICAg
ICAgIG1faml0Lm1vdmUoR1BSSW5mbzo6Y2FsbEZyYW1lUmVnaXN0ZXIsIEdQUkluZm86OmFyZ3Vt
ZW50R1BSMCk7CisgICAgICAgICAgICBhcHBlbmRDYWxsV2l0aEV4Y2VwdGlvbkNoZWNrKGRmZ0Nv
bnZlcnRKU1ZhbHVlVG9Cb29sZWFuKTsKKyAgICAgICAgICAgIG1faml0Lm1vdmUoR1BSSW5mbzo6
cmV0dXJuVmFsdWVHUFIsIHJlc3VsdEdQUik7CisgICAgICAgICAgICBzaWxlbnRGaWxsQWxsUmVn
aXN0ZXJzKHJlc3VsdEdQUik7CisgICAgCisgICAgICAgICAgICBhZGRCcmFuY2gobV9qaXQuYnJh
bmNoVGVzdDgoTWFjcm9Bc3NlbWJsZXI6Ok5vblplcm8sIHJlc3VsdEdQUiksIHRha2VuKTsKKyAg
ICAgICAgICAgIGlmIChub3RUYWtlbiAhPSAobV9ibG9jayArIDEpKQorICAgICAgICAgICAgICAg
IGFkZEJyYW5jaChtX2ppdC5qdW1wKCksIG5vdFRha2VuKTsKKyAgICAgICAgfQorICAgICAgICAK
KyAgICAgICAgbm9SZXN1bHQobV9jb21waWxlSW5kZXgsIFVzZUNoaWxkcmVuQ2FsbGVkRXhwbGlj
aXRseSk7CisgICAgfQorfQorCit2b2lkIEpJVENvZGVHZW5lcmF0b3I6Om5vblNwZWN1bGF0aXZl
TG9naWNhbE5vdChOb2RlJiBub2RlKQoreworICAgIEpTVmFsdWVPcGVyYW5kIGFyZzEodGhpcywg
bm9kZS5jaGlsZDEoKSk7CisgICAgR1BSVGVtcG9yYXJ5IHJlc3VsdCh0aGlzKTsKKyAgICAKKyAg
ICBHUFJSZWcgYXJnMUdQUiA9IGFyZzEuZ3ByKCk7CisgICAgR1BSUmVnIHJlc3VsdEdQUiA9IHJl
c3VsdC5ncHIoKTsKKyAgICAKKyAgICBhcmcxLnVzZSgpOworICAgIAorICAgIG1faml0Lm1vdmUo
YXJnMUdQUiwgcmVzdWx0R1BSKTsKKyAgICBtX2ppdC54b3JQdHIoVHJ1c3RlZEltbTMyKHN0YXRp
Y19jYXN0PGludDMyX3Q+KFZhbHVlRmFsc2UpKSwgcmVzdWx0R1BSKTsKKyAgICBKSVRDb21waWxl
cjo6SnVtcCBmYXN0Q2FzZSA9IG1faml0LmJyYW5jaFRlc3RQdHIoSklUQ29tcGlsZXI6Olplcm8s
IHJlc3VsdEdQUiwgVHJ1c3RlZEltbTMyKHN0YXRpY19jYXN0PGludDMyX3Q+KH4xKSkpOworICAg
IAorICAgIHNpbGVudFNwaWxsQWxsUmVnaXN0ZXJzKHJlc3VsdEdQUik7CisgICAgbV9qaXQubW92
ZShhcmcxR1BSLCBHUFJJbmZvOjphcmd1bWVudEdQUjEpOworICAgIG1faml0Lm1vdmUoR1BSSW5m
bzo6Y2FsbEZyYW1lUmVnaXN0ZXIsIEdQUkluZm86OmFyZ3VtZW50R1BSMCk7CisgICAgYXBwZW5k
Q2FsbFdpdGhFeGNlcHRpb25DaGVjayhkZmdDb252ZXJ0SlNWYWx1ZVRvQm9vbGVhbik7CisgICAg
bV9qaXQubW92ZShHUFJJbmZvOjpyZXR1cm5WYWx1ZUdQUiwgcmVzdWx0R1BSKTsKKyAgICBzaWxl
bnRGaWxsQWxsUmVnaXN0ZXJzKHJlc3VsdEdQUik7CisgICAgCisgICAgZmFzdENhc2UubGluaygm
bV9qaXQpOworICAgIAorICAgIG1faml0LnhvclB0cihUcnVzdGVkSW1tMzIoc3RhdGljX2Nhc3Q8
aW50MzJfdD4oVmFsdWVUcnVlKSksIHJlc3VsdEdQUik7CisgICAganNWYWx1ZVJlc3VsdChyZXN1
bHRHUFIsIG1fY29tcGlsZUluZGV4LCBEYXRhRm9ybWF0SlNCb29sZWFuLCBVc2VDaGlsZHJlbkNh
bGxlZEV4cGxpY2l0bHkpOworfQorCit2b2lkIEpJVENvZGVHZW5lcmF0b3I6OmVtaXRDYWxsKE5v
ZGUmIG5vZGUpCit7CisgICAgUF9ERkdPcGVyYXRpb25fRSBzbG93Q2FsbEZ1bmN0aW9uOworICAg
IGJvb2wgaXNDYWxsOworICAgIAorICAgIGlmIChub2RlLm9wID09IENhbGwpIHsKKyAgICAgICAg
c2xvd0NhbGxGdW5jdGlvbiA9IG9wZXJhdGlvbkxpbmtDYWxsOworICAgICAgICBpc0NhbGwgPSB0
cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIEFTU0VSVChub2RlLm9wID09IENvbnN0cnVjdCk7
CisgICAgICAgIHNsb3dDYWxsRnVuY3Rpb24gPSBvcGVyYXRpb25MaW5rQ29uc3RydWN0OworICAg
ICAgICBpc0NhbGwgPSBmYWxzZTsKKyAgICB9CisgICAgCisgICAgTm9kZUluZGV4IGNhbGxlZU5v
ZGVJbmRleCA9IG1faml0LmdyYXBoKCkubV92YXJBcmdDaGlsZHJlbltub2RlLmZpcnN0Q2hpbGQo
KV07CisgICAgSlNWYWx1ZU9wZXJhbmQgY2FsbGVlKHRoaXMsIGNhbGxlZU5vZGVJbmRleCk7Cisg
ICAgR1BSUmVnIGNhbGxlZUdQUiA9IGNhbGxlZS5ncHIoKTsKKyAgICB1c2UoY2FsbGVlTm9kZUlu
ZGV4KTsKKyAgICAKKyAgICAvLyB0aGUgY2FsbCBpbnN0cnVjdGlvbidzIGZpcnN0IGNoaWxkIGlz
IGVpdGhlciB0aGUgZnVuY3Rpb24gKG5vcm1hbCBjYWxsKSBvciB0aGUKKyAgICAvLyByZWNlaXZl
ciAobWV0aG9kIGNhbGwpLiBzdWJzZXF1ZW50IGNoaWxkcmVuIGFyZSB0aGUgYXJndW1lbnRzLgor
ICAgIGludCBudW1BcmdzID0gbm9kZS5udW1DaGlsZHJlbigpIC0gMTsKKyAgICAKKyAgICAvLyBG
b3IgY29uc3RydWN0b3JzLCB0aGUgdGhpcyBhcmd1bWVudCBpcyBub3QgcGFzc2VkIGJ1dCB3ZSBo
YXZlIHRvIG1ha2Ugc3BhY2UKKyAgICAvLyBmb3IgaXQuCisgICAgaW50IG51bVBhc3NlZEFyZ3Mg
PSBudW1BcmdzICsgKGlzQ2FsbCA/IDAgOiAxKTsKKyAgICAKKyAgICAvLyBhbW91bnQgb2Ygc3R1
ZmYgKGluIHVuaXRzIG9mIHNpemVvZihSZWdpc3RlcikpIHRoYXQgd2UgbmVlZCB0byBwbGFjZSBh
dCB0aGUKKyAgICAvLyB0b3Agb2YgdGhlIEpTIHN0YWNrLgorICAgIGludCBjYWxsRGF0YVNpemUg
PSAwOworCisgICAgLy8gZmlyc3QgdGhlcmUgYXJlIHRoZSBhcmd1bWVudHMKKyAgICBjYWxsRGF0
YVNpemUgKz0gbnVtUGFzc2VkQXJnczsKKyAgICAKKyAgICAvLyBhbmQgdGhlbiB0aGVyZSBpcyB0
aGUgY2FsbCBmcmFtZSBoZWFkZXIKKyAgICBjYWxsRGF0YVNpemUgKz0gUmVnaXN0ZXJGaWxlOjpD
YWxsRnJhbWVIZWFkZXJTaXplOworICAgIAorICAgIG1faml0LnN0b3JlUHRyKE1hY3JvQXNzZW1i
bGVyOjpUcnVzdGVkSW1tUHRyKEpTVmFsdWU6OmVuY29kZShqc051bWJlcihudW1QYXNzZWRBcmdz
KSkpLCBhZGRyZXNzT2ZDYWxsRGF0YShSZWdpc3RlckZpbGU6OkFyZ3VtZW50Q291bnQpKTsKKyAg
ICBtX2ppdC5zdG9yZVB0cihHUFJJbmZvOjpjYWxsRnJhbWVSZWdpc3RlciwgYWRkcmVzc09mQ2Fs
bERhdGEoUmVnaXN0ZXJGaWxlOjpDYWxsZXJGcmFtZSkpOworICAgIAorICAgIGZvciAoaW50IGFy
Z0lkeCA9IDA7IGFyZ0lkeCA8IG51bUFyZ3M7IGFyZ0lkeCsrKSB7CisgICAgICAgIE5vZGVJbmRl
eCBhcmdOb2RlSW5kZXggPSBtX2ppdC5ncmFwaCgpLm1fdmFyQXJnQ2hpbGRyZW5bbm9kZS5maXJz
dENoaWxkKCkgKyAxICsgYXJnSWR4XTsKKyAgICAgICAgSlNWYWx1ZU9wZXJhbmQgYXJnKHRoaXMs
IGFyZ05vZGVJbmRleCk7CisgICAgICAgIEdQUlJlZyBhcmdHUFIgPSBhcmcuZ3ByKCk7CisgICAg
ICAgIHVzZShhcmdOb2RlSW5kZXgpOworICAgICAgICAKKyAgICAgICAgbV9qaXQuc3RvcmVQdHIo
YXJnR1BSLCBhZGRyZXNzT2ZDYWxsRGF0YSgtY2FsbERhdGFTaXplICsgYXJnSWR4ICsgKGlzQ2Fs
bCA/IDAgOiAxKSkpOworICAgIH0KKyAgICAKKyAgICBtX2ppdC5zdG9yZVB0cihjYWxsZWVHUFIs
IGFkZHJlc3NPZkNhbGxEYXRhKFJlZ2lzdGVyRmlsZTo6Q2FsbGVlKSk7CisgICAgCisgICAgZmx1
c2hSZWdpc3RlcnMoKTsKKyAgICAKKyAgICBHUFJSZXN1bHQgcmVzdWx0KHRoaXMpOworICAgIEdQ
UlJlZyByZXN1bHRHUFIgPSByZXN1bHQuZ3ByKCk7CisKKyAgICBKSVRDb21waWxlcjo6RGF0YUxh
YmVsUHRyIHRhcmdldFRvQ2hlY2s7CisgICAgSklUQ29tcGlsZXI6Okp1bXAgc2xvd1BhdGg7Cisg
ICAgCisgICAgc2xvd1BhdGggPSBtX2ppdC5icmFuY2hQdHJXaXRoUGF0Y2goTWFjcm9Bc3NlbWJs
ZXI6Ok5vdEVxdWFsLCBjYWxsZWVHUFIsIHRhcmdldFRvQ2hlY2ssIE1hY3JvQXNzZW1ibGVyOjpU
cnVzdGVkSW1tUHRyKEpTVmFsdWU6OmVuY29kZShKU1ZhbHVlKCkpKSk7CisgICAgbV9qaXQubG9h
ZFB0cihNYWNyb0Fzc2VtYmxlcjo6QWRkcmVzcyhjYWxsZWVHUFIsIE9CSkVDVF9PRkZTRVRPRihK
U0Z1bmN0aW9uLCBtX3Njb3BlQ2hhaW4pKSwgcmVzdWx0R1BSKTsKKyAgICBtX2ppdC5zdG9yZVB0
cihyZXN1bHRHUFIsIGFkZHJlc3NPZkNhbGxEYXRhKFJlZ2lzdGVyRmlsZTo6U2NvcGVDaGFpbikp
OworCisgICAgbV9qaXQuYWRkUHRyKEltbTMyKG1faml0LmNvZGVCbG9jaygpLT5tX251bUNhbGxl
ZVJlZ2lzdGVycyAqIHNpemVvZihSZWdpc3RlcikpLCBHUFJJbmZvOjpjYWxsRnJhbWVSZWdpc3Rl
cik7CisgICAgCisgICAgSklUQ29tcGlsZXI6OkNhbGwgZmFzdENhbGwgPSBtX2ppdC5uZWFyQ2Fs
bCgpOworICAgIG1faml0Lm5vdGlmeUNhbGwoZmFzdENhbGwsIG1faml0LmdyYXBoKClbbV9jb21w
aWxlSW5kZXhdLmNvZGVPcmlnaW4pOworICAgIAorICAgIEpJVENvbXBpbGVyOjpKdW1wIGRvbmUg
PSBtX2ppdC5qdW1wKCk7CisgICAgCisgICAgc2xvd1BhdGgubGluaygmbV9qaXQpOworICAgIAor
ICAgIG1faml0LmFkZFB0cihJbW0zMihtX2ppdC5jb2RlQmxvY2soKS0+bV9udW1DYWxsZWVSZWdp
c3RlcnMgKiBzaXplb2YoUmVnaXN0ZXIpKSwgR1BSSW5mbzo6Y2FsbEZyYW1lUmVnaXN0ZXIsIEdQ
UkluZm86OmFyZ3VtZW50R1BSMCk7CisgICAgSklUQ29tcGlsZXI6OkNhbGwgc2xvd0NhbGwgPSBt
X2ppdC5hcHBlbmRDYWxsV2l0aEZhc3RFeGNlcHRpb25DaGVjayhzbG93Q2FsbEZ1bmN0aW9uLCBt
X2ppdC5ncmFwaCgpW21fY29tcGlsZUluZGV4XS5jb2RlT3JpZ2luKTsKKyAgICBtX2ppdC5tb3Zl
KEltbTMyKG51bVBhc3NlZEFyZ3MpLCBHUFJJbmZvOjpyZWdUMSk7CisgICAgbV9qaXQuYWRkUHRy
KEltbTMyKG1faml0LmNvZGVCbG9jaygpLT5tX251bUNhbGxlZVJlZ2lzdGVycyAqIHNpemVvZihS
ZWdpc3RlcikpLCBHUFJJbmZvOjpjYWxsRnJhbWVSZWdpc3Rlcik7CisgICAgbV9qaXQubm90aWZ5
Q2FsbChtX2ppdC5jYWxsKEdQUkluZm86OnJldHVyblZhbHVlR1BSKSwgbV9qaXQuZ3JhcGgoKVtt
X2NvbXBpbGVJbmRleF0uY29kZU9yaWdpbik7CisgICAgCisgICAgZG9uZS5saW5rKCZtX2ppdCk7
CisgICAgCisgICAgbV9qaXQubW92ZShHUFJJbmZvOjpyZXR1cm5WYWx1ZUdQUiwgcmVzdWx0R1BS
KTsKKyAgICAKKyAgICBqc1ZhbHVlUmVzdWx0KHJlc3VsdEdQUiwgbV9jb21waWxlSW5kZXgsIERh
dGFGb3JtYXRKUywgVXNlQ2hpbGRyZW5DYWxsZWRFeHBsaWNpdGx5KTsKKyAgICAKKyAgICBtX2pp
dC5hZGRKU0NhbGwoZmFzdENhbGwsIHNsb3dDYWxsLCB0YXJnZXRUb0NoZWNrLCBpc0NhbGwsIG1f
aml0LmdyYXBoKClbbV9jb21waWxlSW5kZXhdLmNvZGVPcmlnaW4pOworfQorCit2b2lkIEpJVENv
ZGVHZW5lcmF0b3I6OnNwZWN1bGF0aW9uQ2hlY2soTWFjcm9Bc3NlbWJsZXI6Okp1bXAganVtcFRv
RmFpbCkKK3sKKyAgICBBU1NFUlQobV9pc1NwZWN1bGF0aXZlKTsKKyAgICBzdGF0aWNfY2FzdDxT
cGVjdWxhdGl2ZUpJVCo+KHRoaXMpLT5zcGVjdWxhdGlvbkNoZWNrKGp1bXBUb0ZhaWwpOworfQor
CisjaWZuZGVmIE5ERUJVRworc3RhdGljIGNvbnN0IGNoYXIqIGRhdGFGb3JtYXRTdHJpbmcoRGF0
YUZvcm1hdCBmb3JtYXQpCit7CisgICAgLy8gVGhlc2UgdmFsdWVzIGNvcnJlc3BvbmQgdG8gdGhl
IERhdGFGb3JtYXQgZW51bS4KKyAgICBjb25zdCBjaGFyKiBzdHJpbmdzW10gPSB7CisgICAgICAg
ICJbICBdIiwKKyAgICAgICAgIlsgaV0iLAorICAgICAgICAiWyBkXSIsCisgICAgICAgICJbIGNd
IiwKKyAgICAgICAgIkVyciEiLAorICAgICAgICAiRXJyISIsCisgICAgICAgICJFcnIhIiwKKyAg
ICAgICAgIkVyciEiLAorICAgICAgICAiW0ogXSIsCisgICAgICAgICJbSmldIiwKKyAgICAgICAg
IltKZF0iLAorICAgICAgICAiW0pjXSIsCisgICAgICAgICJFcnIhIiwKKyAgICAgICAgIkVyciEi
LAorICAgICAgICAiRXJyISIsCisgICAgICAgICJFcnIhIiwKKyAgICB9OworICAgIHJldHVybiBz
dHJpbmdzW2Zvcm1hdF07Cit9CisKK3ZvaWQgSklUQ29kZUdlbmVyYXRvcjo6ZHVtcChjb25zdCBj
aGFyKiBsYWJlbCkKK3sKKyAgICBpZiAobGFiZWwpCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAi
PCVzPlxuIiwgbGFiZWwpOworCisgICAgZnByaW50ZihzdGRlcnIsICIgIGdwcnM6XG4iKTsKKyAg
ICBtX2dwcnMuZHVtcCgpOworICAgIGZwcmludGYoc3RkZXJyLCAiICBmcHJzOlxuIik7CisgICAg
bV9mcHJzLmR1bXAoKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAgVmlydHVhbFJlZ2lzdGVyczpc
biIpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBtX2dlbmVyYXRpb25JbmZvLnNpemUo
KTsgKytpKSB7CisgICAgICAgIEdlbmVyYXRpb25JbmZvJiBpbmZvID0gbV9nZW5lcmF0aW9uSW5m
b1tpXTsKKyAgICAgICAgaWYgKGluZm8uYWxpdmUoKSkKKyAgICAgICAgICAgIGZwcmludGYoc3Rk
ZXJyLCAiICAgICUgM2Q6JXMlcyIsIGksIGRhdGFGb3JtYXRTdHJpbmcoaW5mby5yZWdpc3RlckZv
cm1hdCgpKSwgZGF0YUZvcm1hdFN0cmluZyhpbmZvLnNwaWxsRm9ybWF0KCkpKTsKKyAgICAgICAg
ZWxzZQorICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIgICAgJSAzZDpbX19dW19fXSIsIGkp
OworICAgICAgICBpZiAoaW5mby5yZWdpc3RlckZvcm1hdCgpID09IERhdGFGb3JtYXREb3VibGUp
CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIjpmcHIlZFxuIiwgaW5mby5mcHIoKSk7Cisg
ICAgICAgIGVsc2UgaWYgKGluZm8ucmVnaXN0ZXJGb3JtYXQoKSAhPSBEYXRhRm9ybWF0Tm9uZSkg
eworICAgICAgICAgICAgQVNTRVJUKGluZm8uZ3ByKCkgIT0gSW52YWxpZEdQUlJlZyk7CisgICAg
ICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIjolc1xuIiwgR1BSSW5mbzo6ZGVidWdOYW1lKGluZm8u
Z3ByKCkpKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxu
Iik7CisgICAgfQorICAgIGlmIChsYWJlbCkKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICI8LyVz
PlxuIiwgbGFiZWwpOworfQorI2VuZGlmCisKKworI2lmIEVOQUJMRShERkdfQ09OU0lTVEVOQ1lf
Q0hFQ0spCit2b2lkIEpJVENvZGVHZW5lcmF0b3I6OmNoZWNrQ29uc2lzdGVuY3koKQoreworICAg
IGJvb2wgZmFpbGVkID0gZmFsc2U7CisKKyAgICBmb3IgKGdwcl9pdGVyYXRvciBpdGVyID0gbV9n
cHJzLmJlZ2luKCk7IGl0ZXIgIT0gbV9ncHJzLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgICAgaWYg
KGl0ZXIuaXNMb2NrZWQoKSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJERkdfQ09O
U0lTVEVOQ1lfQ0hFQ0sgZmFpbGVkOiBncHIgJXMgaXMgbG9ja2VkLlxuIiwgaXRlci5kZWJ1Z05h
bWUoKSk7CisgICAgICAgICAgICBmYWlsZWQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorICAg
IGZvciAoZnByX2l0ZXJhdG9yIGl0ZXIgPSBtX2ZwcnMuYmVnaW4oKTsgaXRlciAhPSBtX2ZwcnMu
ZW5kKCk7ICsraXRlcikgeworICAgICAgICBpZiAoaXRlci5pc0xvY2tlZCgpKSB7CisgICAgICAg
ICAgICBmcHJpbnRmKHN0ZGVyciwgIkRGR19DT05TSVNURU5DWV9DSEVDSyBmYWlsZWQ6IGZwciAl
cyBpcyBsb2NrZWQuXG4iLCBpdGVyLmRlYnVnTmFtZSgpKTsKKyAgICAgICAgICAgIGZhaWxlZCA9
IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwg
bV9nZW5lcmF0aW9uSW5mby5zaXplKCk7ICsraSkgeworICAgICAgICBWaXJ0dWFsUmVnaXN0ZXIg
dmlydHVhbFJlZ2lzdGVyID0gKFZpcnR1YWxSZWdpc3RlcilpOworICAgICAgICBHZW5lcmF0aW9u
SW5mbyYgaW5mbyA9IG1fZ2VuZXJhdGlvbkluZm9bdmlydHVhbFJlZ2lzdGVyXTsKKyAgICAgICAg
aWYgKCFpbmZvLmFsaXZlKCkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgc3dpdGNo
IChpbmZvLnJlZ2lzdGVyRm9ybWF0KCkpIHsKKyAgICAgICAgY2FzZSBEYXRhRm9ybWF0Tm9uZToK
KyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIERhdGFGb3JtYXRJbnRlZ2VyOgorICAg
ICAgICBjYXNlIERhdGFGb3JtYXRDZWxsOgorICAgICAgICBjYXNlIERhdGFGb3JtYXRKUzoKKyAg
ICAgICAgY2FzZSBEYXRhRm9ybWF0SlNJbnRlZ2VyOgorICAgICAgICBjYXNlIERhdGFGb3JtYXRK
U0RvdWJsZToKKyAgICAgICAgY2FzZSBEYXRhRm9ybWF0SlNDZWxsOiB7CisgICAgICAgICAgICBH
UFJSZWcgZ3ByID0gaW5mby5ncHIoKTsKKyAgICAgICAgICAgIEFTU0VSVChncHIgIT0gSW52YWxp
ZEdQUlJlZyk7CisgICAgICAgICAgICBpZiAobV9ncHJzLm5hbWUoZ3ByKSAhPSB2aXJ0dWFsUmVn
aXN0ZXIpIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkRGR19DT05TSVNURU5D
WV9DSEVDSyBmYWlsZWQ6IG5hbWUgbWlzbWF0Y2ggZm9yIHZpcnR1YWwgcmVnaXN0ZXIgJWQgKGdw
ciAlcykuXG4iLCB2aXJ0dWFsUmVnaXN0ZXIsIEdQUkluZm86OmRlYnVnTmFtZShncHIpKTsKKyAg
ICAgICAgICAgICAgICBmYWlsZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBEYXRhRm9ybWF0RG91YmxlOiB7CisgICAg
ICAgICAgICBGUFJSZWcgZnByID0gaW5mby5mcHIoKTsKKyAgICAgICAgICAgIEFTU0VSVChmcHIg
IT0gSW52YWxpZEZQUlJlZyk7CisgICAgICAgICAgICBpZiAobV9mcHJzLm5hbWUoZnByKSAhPSB2
aXJ0dWFsUmVnaXN0ZXIpIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkRGR19D
T05TSVNURU5DWV9DSEVDSyBmYWlsZWQ6IG5hbWUgbWlzbWF0Y2ggZm9yIHZpcnR1YWwgcmVnaXN0
ZXIgJWQgKGZwciAlcykuXG4iLCB2aXJ0dWFsUmVnaXN0ZXIsIEZQUkluZm86OmRlYnVnTmFtZShm
cHIpKTsKKyAgICAgICAgICAgICAgICBmYWlsZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAo
Z3ByX2l0ZXJhdG9yIGl0ZXIgPSBtX2dwcnMuYmVnaW4oKTsgaXRlciAhPSBtX2dwcnMuZW5kKCk7
ICsraXRlcikgeworICAgICAgICBWaXJ0dWFsUmVnaXN0ZXIgdmlydHVhbFJlZ2lzdGVyID0gaXRl
ci5uYW1lKCk7CisgICAgICAgIGlmICh2aXJ0dWFsUmVnaXN0ZXIgPT0gSW52YWxpZFZpcnR1YWxS
ZWdpc3RlcikKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIEdlbmVyYXRpb25JbmZv
JiBpbmZvID0gbV9nZW5lcmF0aW9uSW5mb1t2aXJ0dWFsUmVnaXN0ZXJdOworICAgICAgICBpZiAo
aXRlci5yZWdJRCgpICE9IGluZm8uZ3ByKCkpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJy
LCAiREZHX0NPTlNJU1RFTkNZX0NIRUNLIGZhaWxlZDogbmFtZSBtaXNtYXRjaCBmb3IgZ3ByICVz
ICh2aXJ0dWFsIHJlZ2lzdGVyICVkKS5cbiIsIGl0ZXIuZGVidWdOYW1lKCksIHZpcnR1YWxSZWdp
c3Rlcik7CisgICAgICAgICAgICBmYWlsZWQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisg
ICAgZm9yIChmcHJfaXRlcmF0b3IgaXRlciA9IG1fZnBycy5iZWdpbigpOyBpdGVyICE9IG1fZnBy
cy5lbmQoKTsgKytpdGVyKSB7CisgICAgICAgIFZpcnR1YWxSZWdpc3RlciB2aXJ0dWFsUmVnaXN0
ZXIgPSBpdGVyLm5hbWUoKTsKKyAgICAgICAgaWYgKHZpcnR1YWxSZWdpc3RlciA9PSBJbnZhbGlk
VmlydHVhbFJlZ2lzdGVyKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgR2VuZXJh
dGlvbkluZm8mIGluZm8gPSBtX2dlbmVyYXRpb25JbmZvW3ZpcnR1YWxSZWdpc3Rlcl07CisgICAg
ICAgIGlmIChpdGVyLnJlZ0lEKCkgIT0gaW5mby5mcHIoKSkgeworICAgICAgICAgICAgZnByaW50
ZihzdGRlcnIsICJERkdfQ09OU0lTVEVOQ1lfQ0hFQ0sgZmFpbGVkOiBuYW1lIG1pc21hdGNoIGZv
ciBmcHIgJXMgKHZpcnR1YWwgcmVnaXN0ZXIgJWQpLlxuIiwgaXRlci5kZWJ1Z05hbWUoKSwgdmly
dHVhbFJlZ2lzdGVyKTsKKyAgICAgICAgICAgIGZhaWxlZCA9IHRydWU7CisgICAgICAgIH0KKyAg
ICB9CisKKyAgICBpZiAoZmFpbGVkKSB7CisgICAgICAgIGR1bXAoKTsKKyAgICAgICAgQ1JBU0go
KTsKKyAgICB9Cit9CisjZW5kaWYKKworR1BSVGVtcG9yYXJ5OjpHUFJUZW1wb3JhcnkoKQorICAg
IDogbV9qaXQoMCkKKyAgICAsIG1fZ3ByKEludmFsaWRHUFJSZWcpCit7Cit9CisKK0dQUlRlbXBv
cmFyeTo6R1BSVGVtcG9yYXJ5KEpJVENvZGVHZW5lcmF0b3IqIGppdCkKKyAgICA6IG1faml0KGpp
dCkKKyAgICAsIG1fZ3ByKEludmFsaWRHUFJSZWcpCit7CisgICAgbV9ncHIgPSBtX2ppdC0+YWxs
b2NhdGUoKTsKK30KKworR1BSVGVtcG9yYXJ5OjpHUFJUZW1wb3JhcnkoSklUQ29kZUdlbmVyYXRv
ciogaml0LCBHUFJSZWcgc3BlY2lmaWMpCisgICAgOiBtX2ppdChqaXQpCisgICAgLCBtX2dwcihJ
bnZhbGlkR1BSUmVnKQoreworICAgIG1fZ3ByID0gbV9qaXQtPmFsbG9jYXRlKHNwZWNpZmljKTsK
K30KKworR1BSVGVtcG9yYXJ5OjpHUFJUZW1wb3JhcnkoSklUQ29kZUdlbmVyYXRvciogaml0LCBT
cGVjdWxhdGVJbnRlZ2VyT3BlcmFuZCYgb3AxKQorICAgIDogbV9qaXQoaml0KQorICAgICwgbV9n
cHIoSW52YWxpZEdQUlJlZykKK3sKKyAgICBpZiAobV9qaXQtPmNhblJldXNlKG9wMS5pbmRleCgp
KSkKKyAgICAgICAgbV9ncHIgPSBtX2ppdC0+cmV1c2Uob3AxLmdwcigpKTsKKyAgICBlbHNlCisg
ICAgICAgIG1fZ3ByID0gbV9qaXQtPmFsbG9jYXRlKCk7Cit9CisKK0dQUlRlbXBvcmFyeTo6R1BS
VGVtcG9yYXJ5KEpJVENvZGVHZW5lcmF0b3IqIGppdCwgU3BlY3VsYXRlSW50ZWdlck9wZXJhbmQm
IG9wMSwgU3BlY3VsYXRlSW50ZWdlck9wZXJhbmQmIG9wMikKKyAgICA6IG1faml0KGppdCkKKyAg
ICAsIG1fZ3ByKEludmFsaWRHUFJSZWcpCit7CisgICAgaWYgKG1faml0LT5jYW5SZXVzZShvcDEu
aW5kZXgoKSkpCisgICAgICAgIG1fZ3ByID0gbV9qaXQtPnJldXNlKG9wMS5ncHIoKSk7CisgICAg
ZWxzZSBpZiAobV9qaXQtPmNhblJldXNlKG9wMi5pbmRleCgpKSkKKyAgICAgICAgbV9ncHIgPSBt
X2ppdC0+cmV1c2Uob3AyLmdwcigpKTsKKyAgICBlbHNlCisgICAgICAgIG1fZ3ByID0gbV9qaXQt
PmFsbG9jYXRlKCk7Cit9CisKK0dQUlRlbXBvcmFyeTo6R1BSVGVtcG9yYXJ5KEpJVENvZGVHZW5l
cmF0b3IqIGppdCwgU3BlY3VsYXRlU3RyaWN0SW50MzJPcGVyYW5kJiBvcDEpCisgICAgOiBtX2pp
dChqaXQpCisgICAgLCBtX2dwcihJbnZhbGlkR1BSUmVnKQoreworICAgIGlmIChtX2ppdC0+Y2Fu
UmV1c2Uob3AxLmluZGV4KCkpKQorICAgICAgICBtX2dwciA9IG1faml0LT5yZXVzZShvcDEuZ3By
KCkpOworICAgIGVsc2UKKyAgICAgICAgbV9ncHIgPSBtX2ppdC0+YWxsb2NhdGUoKTsKK30KKwor
R1BSVGVtcG9yYXJ5OjpHUFJUZW1wb3JhcnkoSklUQ29kZUdlbmVyYXRvciogaml0LCBJbnRlZ2Vy
T3BlcmFuZCYgb3AxKQorICAgIDogbV9qaXQoaml0KQorICAgICwgbV9ncHIoSW52YWxpZEdQUlJl
ZykKK3sKKyAgICBpZiAobV9qaXQtPmNhblJldXNlKG9wMS5pbmRleCgpKSkKKyAgICAgICAgbV9n
cHIgPSBtX2ppdC0+cmV1c2Uob3AxLmdwcigpKTsKKyAgICBlbHNlCisgICAgICAgIG1fZ3ByID0g
bV9qaXQtPmFsbG9jYXRlKCk7Cit9CisKK0dQUlRlbXBvcmFyeTo6R1BSVGVtcG9yYXJ5KEpJVENv
ZGVHZW5lcmF0b3IqIGppdCwgSW50ZWdlck9wZXJhbmQmIG9wMSwgSW50ZWdlck9wZXJhbmQmIG9w
MikKKyAgICA6IG1faml0KGppdCkKKyAgICAsIG1fZ3ByKEludmFsaWRHUFJSZWcpCit7CisgICAg
aWYgKG1faml0LT5jYW5SZXVzZShvcDEuaW5kZXgoKSkpCisgICAgICAgIG1fZ3ByID0gbV9qaXQt
PnJldXNlKG9wMS5ncHIoKSk7CisgICAgZWxzZSBpZiAobV9qaXQtPmNhblJldXNlKG9wMi5pbmRl
eCgpKSkKKyAgICAgICAgbV9ncHIgPSBtX2ppdC0+cmV1c2Uob3AyLmdwcigpKTsKKyAgICBlbHNl
CisgICAgICAgIG1fZ3ByID0gbV9qaXQtPmFsbG9jYXRlKCk7Cit9CisKK0dQUlRlbXBvcmFyeTo6
R1BSVGVtcG9yYXJ5KEpJVENvZGVHZW5lcmF0b3IqIGppdCwgU3BlY3VsYXRlQ2VsbE9wZXJhbmQm
IG9wMSkKKyAgICA6IG1faml0KGppdCkKKyAgICAsIG1fZ3ByKEludmFsaWRHUFJSZWcpCit7Cisg
ICAgaWYgKG1faml0LT5jYW5SZXVzZShvcDEuaW5kZXgoKSkpCisgICAgICAgIG1fZ3ByID0gbV9q
aXQtPnJldXNlKG9wMS5ncHIoKSk7CisgICAgZWxzZQorICAgICAgICBtX2dwciA9IG1faml0LT5h
bGxvY2F0ZSgpOworfQorCitHUFJUZW1wb3Jhcnk6OkdQUlRlbXBvcmFyeShKSVRDb2RlR2VuZXJh
dG9yKiBqaXQsIFNwZWN1bGF0ZUJvb2xlYW5PcGVyYW5kJiBvcDEpCisgICAgOiBtX2ppdChqaXQp
CisgICAgLCBtX2dwcihJbnZhbGlkR1BSUmVnKQoreworICAgIGlmIChtX2ppdC0+Y2FuUmV1c2Uo
b3AxLmluZGV4KCkpKQorICAgICAgICBtX2dwciA9IG1faml0LT5yZXVzZShvcDEuZ3ByKCkpOwor
ICAgIGVsc2UKKyAgICAgICAgbV9ncHIgPSBtX2ppdC0+YWxsb2NhdGUoKTsKK30KKworR1BSVGVt
cG9yYXJ5OjpHUFJUZW1wb3JhcnkoSklUQ29kZUdlbmVyYXRvciogaml0LCBKU1ZhbHVlT3BlcmFu
ZCYgb3AxKQorICAgIDogbV9qaXQoaml0KQorICAgICwgbV9ncHIoSW52YWxpZEdQUlJlZykKK3sK
KyAgICBpZiAobV9qaXQtPmNhblJldXNlKG9wMS5pbmRleCgpKSkKKyAgICAgICAgbV9ncHIgPSBt
X2ppdC0+cmV1c2Uob3AxLmdwcigpKTsKKyAgICBlbHNlCisgICAgICAgIG1fZ3ByID0gbV9qaXQt
PmFsbG9jYXRlKCk7Cit9CisKK0dQUlRlbXBvcmFyeTo6R1BSVGVtcG9yYXJ5KEpJVENvZGVHZW5l
cmF0b3IqIGppdCwgU3RvcmFnZU9wZXJhbmQmIG9wMSkKKyAgICA6IG1faml0KGppdCkKKyAgICAs
IG1fZ3ByKEludmFsaWRHUFJSZWcpCit7CisgICAgaWYgKG1faml0LT5jYW5SZXVzZShvcDEuaW5k
ZXgoKSkpCisgICAgICAgIG1fZ3ByID0gbV9qaXQtPnJldXNlKG9wMS5ncHIoKSk7CisgICAgZWxz
ZQorICAgICAgICBtX2dwciA9IG1faml0LT5hbGxvY2F0ZSgpOworfQorCit2b2lkIEdQUlRlbXBv
cmFyeTo6YWRvcHQoR1BSVGVtcG9yYXJ5JiBvdGhlcikKK3sKKyAgICBBU1NFUlQoIW1faml0KTsK
KyAgICBBU1NFUlQobV9ncHIgPT0gSW52YWxpZEdQUlJlZyk7CisgICAgQVNTRVJUKG90aGVyLm1f
aml0KTsKKyAgICBBU1NFUlQob3RoZXIubV9ncHIgIT0gSW52YWxpZEdQUlJlZyk7CisgICAgbV9q
aXQgPSBvdGhlci5tX2ppdDsKKyAgICBtX2dwciA9IG90aGVyLm1fZ3ByOworICAgIG90aGVyLm1f
aml0ID0gMDsKKyAgICBvdGhlci5tX2dwciA9IEludmFsaWRHUFJSZWc7Cit9CisKK0ZQUlRlbXBv
cmFyeTo6RlBSVGVtcG9yYXJ5KEpJVENvZGVHZW5lcmF0b3IqIGppdCkKKyAgICA6IG1faml0KGpp
dCkKKyAgICAsIG1fZnByKEludmFsaWRGUFJSZWcpCit7CisgICAgbV9mcHIgPSBtX2ppdC0+ZnBy
QWxsb2NhdGUoKTsKK30KKworRlBSVGVtcG9yYXJ5OjpGUFJUZW1wb3JhcnkoSklUQ29kZUdlbmVy
YXRvciogaml0LCBEb3VibGVPcGVyYW5kJiBvcDEpCisgICAgOiBtX2ppdChqaXQpCisgICAgLCBt
X2ZwcihJbnZhbGlkRlBSUmVnKQoreworICAgIGlmIChtX2ppdC0+Y2FuUmV1c2Uob3AxLmluZGV4
KCkpKQorICAgICAgICBtX2ZwciA9IG1faml0LT5yZXVzZShvcDEuZnByKCkpOworICAgIGVsc2UK
KyAgICAgICAgbV9mcHIgPSBtX2ppdC0+ZnByQWxsb2NhdGUoKTsKK30KKworRlBSVGVtcG9yYXJ5
OjpGUFJUZW1wb3JhcnkoSklUQ29kZUdlbmVyYXRvciogaml0LCBEb3VibGVPcGVyYW5kJiBvcDEs
IERvdWJsZU9wZXJhbmQmIG9wMikKKyAgICA6IG1faml0KGppdCkKKyAgICAsIG1fZnByKEludmFs
aWRGUFJSZWcpCit7CisgICAgaWYgKG1faml0LT5jYW5SZXVzZShvcDEuaW5kZXgoKSkpCisgICAg
ICAgIG1fZnByID0gbV9qaXQtPnJldXNlKG9wMS5mcHIoKSk7CisgICAgZWxzZSBpZiAobV9qaXQt
PmNhblJldXNlKG9wMi5pbmRleCgpKSkKKyAgICAgICAgbV9mcHIgPSBtX2ppdC0+cmV1c2Uob3Ay
LmZwcigpKTsKKyAgICBlbHNlCisgICAgICAgIG1fZnByID0gbV9qaXQtPmZwckFsbG9jYXRlKCk7
Cit9CisKK0ZQUlRlbXBvcmFyeTo6RlBSVGVtcG9yYXJ5KEpJVENvZGVHZW5lcmF0b3IqIGppdCwg
U3BlY3VsYXRlRG91YmxlT3BlcmFuZCYgb3AxKQorICAgIDogbV9qaXQoaml0KQorICAgICwgbV9m
cHIoSW52YWxpZEZQUlJlZykKK3sKKyAgICBpZiAobV9qaXQtPmNhblJldXNlKG9wMS5pbmRleCgp
KSkKKyAgICAgICAgbV9mcHIgPSBtX2ppdC0+cmV1c2Uob3AxLmZwcigpKTsKKyAgICBlbHNlCisg
ICAgICAgIG1fZnByID0gbV9qaXQtPmZwckFsbG9jYXRlKCk7Cit9CisKK0ZQUlRlbXBvcmFyeTo6
RlBSVGVtcG9yYXJ5KEpJVENvZGVHZW5lcmF0b3IqIGppdCwgU3BlY3VsYXRlRG91YmxlT3BlcmFu
ZCYgb3AxLCBTcGVjdWxhdGVEb3VibGVPcGVyYW5kJiBvcDIpCisgICAgOiBtX2ppdChqaXQpCisg
ICAgLCBtX2ZwcihJbnZhbGlkRlBSUmVnKQoreworICAgIGlmIChtX2ppdC0+Y2FuUmV1c2Uob3Ax
LmluZGV4KCkpKQorICAgICAgICBtX2ZwciA9IG1faml0LT5yZXVzZShvcDEuZnByKCkpOworICAg
IGVsc2UgaWYgKG1faml0LT5jYW5SZXVzZShvcDIuaW5kZXgoKSkpCisgICAgICAgIG1fZnByID0g
bV9qaXQtPnJldXNlKG9wMi5mcHIoKSk7CisgICAgZWxzZQorICAgICAgICBtX2ZwciA9IG1faml0
LT5mcHJBbGxvY2F0ZSgpOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6REZHCisKKyNlbmRp
ZgorI2VuZGlmCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0pJVENvZGVHZW5l
cmF0b3I2NC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdK
SVRDb2RlR2VuZXJhdG9yNjQuY3BwCShyZXZpc2lvbiA5NjM2MykKKysrIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9kZmcvREZHSklUQ29kZUdlbmVyYXRvcjY0LmNwcAkod29ya2luZyBjb3B5KQpAQCAt
MjcsMjIgKzI3LDE0IEBACiAjaW5jbHVkZSAiREZHSklUQ29kZUdlbmVyYXRvci5oIgogCiAjaWYg
RU5BQkxFKERGR19KSVQpCi0jaWYgVVNFKEpTVkFMVUU2NCkKIAorI2luY2x1ZGUgIkRGR0pJVENv
bXBpbGVySW5saW5lTWV0aG9kcy5oIgogI2luY2x1ZGUgIkRGR1NwZWN1bGF0aXZlSklULmgiCiAj
aW5jbHVkZSAiTGlua0J1ZmZlci5oIgogCiBuYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIERGRyB7
CiAKLWNvbnN0IGRvdWJsZSBKSVRDb2RlR2VuZXJhdG9yOjp0d29Ub1RoZTMyID0gKGRvdWJsZSkw
eDEwMDAwMDAwMHVsbDsKLQotdm9pZCBKSVRDb2RlR2VuZXJhdG9yOjpjbGVhckdlbmVyYXRpb25J
bmZvKCkKLXsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbV9nZW5lcmF0aW9uSW5mby5z
aXplKCk7ICsraSkKLSAgICAgICAgbV9nZW5lcmF0aW9uSW5mb1tpXSA9IEdlbmVyYXRpb25JbmZv
KCk7Ci0gICAgbV9ncHJzID0gUmVnaXN0ZXJCYW5rPEdQUkluZm8+KCk7Ci0gICAgbV9mcHJzID0g
UmVnaXN0ZXJCYW5rPEZQUkluZm8+KCk7Ci19CisjaWYgVVNFKEpTVkFMVUU2NCkKIAogR1BSUmVn
IEpJVENvZGVHZW5lcmF0b3I6OmZpbGxJbnRlZ2VyKE5vZGVJbmRleCBub2RlSW5kZXgsIERhdGFG
b3JtYXQmIHJldHVybkZvcm1hdCkKIHsKQEAgLTMyOCwxNTMgKzMyMCw2IEBAIEdQUlJlZyBKSVRD
b2RlR2VuZXJhdG9yOjpmaWxsSlNWYWx1ZShOb2QKICAgICByZXR1cm4gSW52YWxpZEdQUlJlZzsK
IH0KIAotR1BSUmVnIEpJVENvZGVHZW5lcmF0b3I6OmZpbGxTdG9yYWdlKE5vZGVJbmRleCBub2Rl
SW5kZXgpCi17Ci0gICAgTm9kZSYgbm9kZSA9IG1faml0LmdyYXBoKClbbm9kZUluZGV4XTsKLSAg
ICBWaXJ0dWFsUmVnaXN0ZXIgdmlydHVhbFJlZ2lzdGVyID0gbm9kZS52aXJ0dWFsUmVnaXN0ZXIo
KTsKLSAgICBHZW5lcmF0aW9uSW5mbyYgaW5mbyA9IG1fZ2VuZXJhdGlvbkluZm9bdmlydHVhbFJl
Z2lzdGVyXTsKLSAgICAKLSAgICBzd2l0Y2ggKGluZm8ucmVnaXN0ZXJGb3JtYXQoKSkgewotICAg
IGNhc2UgRGF0YUZvcm1hdE5vbmU6IHsKLSAgICAgICAgR1BSUmVnIGdwciA9IGFsbG9jYXRlKCk7
Ci0gICAgICAgIEFTU0VSVChpbmZvLnNwaWxsRm9ybWF0KCkgPT0gRGF0YUZvcm1hdFN0b3JhZ2Up
OwotICAgICAgICBtX2dwcnMucmV0YWluKGdwciwgdmlydHVhbFJlZ2lzdGVyLCBTcGlsbE9yZGVy
U3BpbGxlZCk7Ci0gICAgICAgIG1faml0LmxvYWRQdHIoSklUQ29tcGlsZXI6OmFkZHJlc3NGb3Io
dmlydHVhbFJlZ2lzdGVyKSwgZ3ByKTsKLSAgICAgICAgaW5mby5maWxsU3RvcmFnZShncHIpOwot
ICAgICAgICByZXR1cm4gZ3ByOwotICAgIH0KLSAgICAgICAgCi0gICAgY2FzZSBEYXRhRm9ybWF0
U3RvcmFnZTogewotICAgICAgICBHUFJSZWcgZ3ByID0gaW5mby5ncHIoKTsKLSAgICAgICAgbV9n
cHJzLmxvY2soZ3ByKTsKLSAgICAgICAgcmV0dXJuIGdwcjsKLSAgICB9Ci0gICAgICAgIAotICAg
IGRlZmF1bHQ6Ci0gICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgIH0KLSAgICAKLSAg
ICByZXR1cm4gSW52YWxpZEdQUlJlZzsKLX0KLQotdm9pZCBKSVRDb2RlR2VuZXJhdG9yOjp1c2VD
aGlsZHJlbihOb2RlJiBub2RlKQotewotICAgIGlmIChub2RlLm9wICYgTm9kZUhhc1ZhckFyZ3Mp
IHsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBjaGlsZElkeCA9IG5vZGUuZmlyc3RDaGlsZCgpOyBj
aGlsZElkeCA8IG5vZGUuZmlyc3RDaGlsZCgpICsgbm9kZS5udW1DaGlsZHJlbigpOyBjaGlsZElk
eCsrKQotICAgICAgICAgICAgdXNlKG1faml0LmdyYXBoKCkubV92YXJBcmdDaGlsZHJlbltjaGls
ZElkeF0pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIE5vZGVJbmRleCBjaGlsZDEgPSBub2RlLmNo
aWxkMSgpOwotICAgICAgICBpZiAoY2hpbGQxID09IE5vTm9kZSkgewotICAgICAgICAgICAgQVNT
RVJUKG5vZGUuY2hpbGQyKCkgPT0gTm9Ob2RlICYmIG5vZGUuY2hpbGQzKCkgPT0gTm9Ob2RlKTsK
LSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICB1c2UoY2hpbGQxKTsKLSAg
ICAgICAgCi0gICAgICAgIE5vZGVJbmRleCBjaGlsZDIgPSBub2RlLmNoaWxkMigpOwotICAgICAg
ICBpZiAoY2hpbGQyID09IE5vTm9kZSkgewotICAgICAgICAgICAgQVNTRVJUKG5vZGUuY2hpbGQz
KCkgPT0gTm9Ob2RlKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICB1
c2UoY2hpbGQyKTsKLSAgICAgICAgCi0gICAgICAgIE5vZGVJbmRleCBjaGlsZDMgPSBub2RlLmNo
aWxkMygpOwotICAgICAgICBpZiAoY2hpbGQzID09IE5vTm9kZSkKLSAgICAgICAgICAgIHJldHVy
bjsKLSAgICAgICAgdXNlKGNoaWxkMyk7Ci0gICAgfQotfQotCi1ib29sIEpJVENvZGVHZW5lcmF0
b3I6OmlzU3RyaWN0SW50MzIoTm9kZUluZGV4IG5vZGVJbmRleCkKLXsKLSAgICBpZiAoaXNJbnQz
MkNvbnN0YW50KG5vZGVJbmRleCkpCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIAotICAgIE5v
ZGUmIG5vZGUgPSBtX2ppdC5ncmFwaCgpW25vZGVJbmRleF07Ci0gICAgR2VuZXJhdGlvbkluZm8m
IGluZm8gPSBtX2dlbmVyYXRpb25JbmZvW25vZGUudmlydHVhbFJlZ2lzdGVyKCldOwotICAgIAot
ICAgIHJldHVybiBpbmZvLnJlZ2lzdGVyRm9ybWF0KCkgPT0gRGF0YUZvcm1hdEludGVnZXI7Ci19
Ci0KLWJvb2wgSklUQ29kZUdlbmVyYXRvcjo6aXNLbm93bkludGVnZXIoTm9kZUluZGV4IG5vZGVJ
bmRleCkKLXsKLSAgICBpZiAoaXNJbnQzMkNvbnN0YW50KG5vZGVJbmRleCkpCi0gICAgICAgIHJl
dHVybiB0cnVlOwotCi0gICAgTm9kZSYgbm9kZSA9IG1faml0LmdyYXBoKClbbm9kZUluZGV4XTsK
LSAgICAKLSAgICBpZiAobm9kZS5oYXNJbnQzMlJlc3VsdCgpKQotICAgICAgICByZXR1cm4gdHJ1
ZTsKLSAgICAKLSAgICBHZW5lcmF0aW9uSW5mbyYgaW5mbyA9IG1fZ2VuZXJhdGlvbkluZm9bbm9k
ZS52aXJ0dWFsUmVnaXN0ZXIoKV07Ci0KLSAgICByZXR1cm4gaW5mby5pc0pTSW50ZWdlcigpOwot
fQotCi1ib29sIEpJVENvZGVHZW5lcmF0b3I6OmlzS25vd25OdW1lcmljKE5vZGVJbmRleCBub2Rl
SW5kZXgpCi17Ci0gICAgaWYgKGlzSW50MzJDb25zdGFudChub2RlSW5kZXgpIHx8IGlzTnVtYmVy
Q29uc3RhbnQobm9kZUluZGV4KSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBOb2RlJiBu
b2RlID0gbV9qaXQuZ3JhcGgoKVtub2RlSW5kZXhdOwotICAgIAotICAgIGlmIChub2RlLmhhc051
bWJlclJlc3VsdCgpKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAKLSAgICBHZW5lcmF0aW9u
SW5mbyYgaW5mbyA9IG1fZ2VuZXJhdGlvbkluZm9bbm9kZS52aXJ0dWFsUmVnaXN0ZXIoKV07Ci0K
LSAgICByZXR1cm4gaW5mby5pc0pTSW50ZWdlcigpIHx8IGluZm8uaXNKU0RvdWJsZSgpOwotfQot
Ci1ib29sIEpJVENvZGVHZW5lcmF0b3I6OmlzS25vd25DZWxsKE5vZGVJbmRleCBub2RlSW5kZXgp
Ci17Ci0gICAgcmV0dXJuIG1fZ2VuZXJhdGlvbkluZm9bbV9qaXQuZ3JhcGgoKVtub2RlSW5kZXhd
LnZpcnR1YWxSZWdpc3RlcigpXS5pc0pTQ2VsbCgpOwotfQotCi1ib29sIEpJVENvZGVHZW5lcmF0
b3I6OmlzS25vd25Ob3RDZWxsKE5vZGVJbmRleCBub2RlSW5kZXgpCi17Ci0gICAgTm9kZSYgbm9k
ZSA9IG1faml0LmdyYXBoKClbbm9kZUluZGV4XTsKLSAgICBWaXJ0dWFsUmVnaXN0ZXIgdmlydHVh
bFJlZ2lzdGVyID0gbm9kZS52aXJ0dWFsUmVnaXN0ZXIoKTsKLSAgICBHZW5lcmF0aW9uSW5mbyYg
aW5mbyA9IG1fZ2VuZXJhdGlvbkluZm9bdmlydHVhbFJlZ2lzdGVyXTsKLSAgICBpZiAobm9kZS5o
YXNDb25zdGFudCgpICYmICF2YWx1ZU9mSlNDb25zdGFudChub2RlSW5kZXgpLmlzQ2VsbCgpKQot
ICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gIShpbmZvLmlzSlNDZWxsKCkgfHwgaW5m
by5pc1Vua25vd25KUygpKTsKLX0KLQotYm9vbCBKSVRDb2RlR2VuZXJhdG9yOjppc0tub3duTm90
SW50ZWdlcihOb2RlSW5kZXggbm9kZUluZGV4KQotewotICAgIE5vZGUmIG5vZGUgPSBtX2ppdC5n
cmFwaCgpW25vZGVJbmRleF07Ci0gICAgVmlydHVhbFJlZ2lzdGVyIHZpcnR1YWxSZWdpc3RlciA9
IG5vZGUudmlydHVhbFJlZ2lzdGVyKCk7Ci0gICAgR2VuZXJhdGlvbkluZm8mIGluZm8gPSBtX2dl
bmVyYXRpb25JbmZvW3ZpcnR1YWxSZWdpc3Rlcl07Ci0gICAgCi0gICAgcmV0dXJuIGluZm8uaXNK
U0RvdWJsZSgpIHx8IGluZm8uaXNKU0NlbGwoKSB8fCBpbmZvLmlzSlNCb29sZWFuKCkKLSAgICAg
ICAgfHwgKG5vZGUuaGFzQ29uc3RhbnQoKSAmJiAhdmFsdWVPZkpTQ29uc3RhbnQobm9kZUluZGV4
KS5pc0ludDMyKCkpOwotfQotCi1ib29sIEpJVENvZGVHZW5lcmF0b3I6OmlzS25vd25Ob3ROdW1i
ZXIoTm9kZUluZGV4IG5vZGVJbmRleCkKLXsKLSAgICBOb2RlJiBub2RlID0gbV9qaXQuZ3JhcGgo
KVtub2RlSW5kZXhdOwotICAgIFZpcnR1YWxSZWdpc3RlciB2aXJ0dWFsUmVnaXN0ZXIgPSBub2Rl
LnZpcnR1YWxSZWdpc3RlcigpOwotICAgIEdlbmVyYXRpb25JbmZvJiBpbmZvID0gbV9nZW5lcmF0
aW9uSW5mb1t2aXJ0dWFsUmVnaXN0ZXJdOwotICAgIAotICAgIHJldHVybiAoIWluZm8uaXNKU0Rv
dWJsZSgpICYmICFpbmZvLmlzSlNJbnRlZ2VyKCkgJiYgIWluZm8uaXNVbmtub3duSlMoKSkKLSAg
ICAgICAgfHwgKG5vZGUuaGFzQ29uc3RhbnQoKSAmJiAhaXNOdW1iZXJDb25zdGFudChub2RlSW5k
ZXgpKTsKLX0KLQotYm9vbCBKSVRDb2RlR2VuZXJhdG9yOjppc0tub3duQm9vbGVhbihOb2RlSW5k
ZXggbm9kZUluZGV4KQotewotICAgIE5vZGUmIG5vZGUgPSBtX2ppdC5ncmFwaCgpW25vZGVJbmRl
eF07Ci0gICAgaWYgKG5vZGUuaGFzQm9vbGVhblJlc3VsdCgpKQotICAgICAgICByZXR1cm4gdHJ1
ZTsKLSAgICAKLSAgICBpZiAoaXNCb29sZWFuQ29uc3RhbnQobm9kZUluZGV4KSkKLSAgICAgICAg
cmV0dXJuIHRydWU7Ci0gICAgCi0gICAgVmlydHVhbFJlZ2lzdGVyIHZpcnR1YWxSZWdpc3RlciA9
IG5vZGUudmlydHVhbFJlZ2lzdGVyKCk7Ci0gICAgR2VuZXJhdGlvbkluZm8mIGluZm8gPSBtX2dl
bmVyYXRpb25JbmZvW3ZpcnR1YWxSZWdpc3Rlcl07Ci0gICAgCi0gICAgcmV0dXJuIGluZm8uaXNK
U0Jvb2xlYW4oKTsKLX0KLQogdm9pZCBKSVRDb2RlR2VuZXJhdG9yOjpub25TcGVjdWxhdGl2ZVZh
bHVlVG9OdW1iZXIoTm9kZSYgbm9kZSkKIHsKICAgICBpZiAoaXNLbm93bk51bWVyaWMobm9kZS5j
aGlsZDEoKSkpIHsKQEAgLTExNzcsMTIwICsxMDIyLDYgQEAgSklUQ29tcGlsZXI6OkNhbGwgSklU
Q29kZUdlbmVyYXRvcjo6Y2FjaAogICAgIHJldHVybiBmdW5jdGlvbkNhbGw7CiB9CiAKLXZvaWQg
SklUQ29kZUdlbmVyYXRvcjo6d3JpdGVCYXJyaWVyKE1hY3JvQXNzZW1ibGVyJiBqaXQsIEdQUlJl
ZyBvd25lciwgR1BSUmVnIHNjcmF0Y2gxLCBHUFJSZWcgc2NyYXRjaDIsIFdyaXRlQmFycmllclVz
ZUtpbmQgdXNlS2luZCkKLXsKLSAgICBVTlVTRURfUEFSQU0oaml0KTsKLSAgICBVTlVTRURfUEFS
QU0ob3duZXIpOwotICAgIFVOVVNFRF9QQVJBTShzY3JhdGNoMSk7Ci0gICAgVU5VU0VEX1BBUkFN
KHNjcmF0Y2gyKTsKLSAgICBVTlVTRURfUEFSQU0odXNlS2luZCk7Ci0gICAgQVNTRVJUKG93bmVy
ICE9IHNjcmF0Y2gxKTsKLSAgICBBU1NFUlQob3duZXIgIT0gc2NyYXRjaDIpOwotICAgIEFTU0VS
VChzY3JhdGNoMSAhPSBzY3JhdGNoMik7Ci0KLSNpZiBFTkFCTEUoV1JJVEVfQkFSUklFUl9QUk9G
SUxJTkcpCi0gICAgSklUQ29tcGlsZXI6OmVtaXRDb3VudChqaXQsIFdyaXRlQmFycmllckNvdW50
ZXJzOjpqaXRDb3VudGVyRm9yKHVzZUtpbmQpKTsKLSNlbmRpZgotICAgIG1hcmtDZWxsQ2FyZChq
aXQsIG93bmVyLCBzY3JhdGNoMSwgc2NyYXRjaDIpOwotfQotCi12b2lkIEpJVENvZGVHZW5lcmF0
b3I6Om1hcmtDZWxsQ2FyZChNYWNyb0Fzc2VtYmxlciYgaml0LCBHUFJSZWcgb3duZXIsIEdQUlJl
ZyBzY3JhdGNoMSwgR1BSUmVnIHNjcmF0Y2gyKQotewotICAgIFVOVVNFRF9QQVJBTShqaXQpOwot
ICAgIFVOVVNFRF9QQVJBTShvd25lcik7Ci0gICAgVU5VU0VEX1BBUkFNKHNjcmF0Y2gxKTsKLSAg
ICBVTlVTRURfUEFSQU0oc2NyYXRjaDIpOwotICAgIAotI2lmIEVOQUJMRShHR0MpCi0gICAgaml0
Lm1vdmUob3duZXIsIHNjcmF0Y2gxKTsKLSAgICBqaXQuYW5kUHRyKFRydXN0ZWRJbW0zMihzdGF0
aWNfY2FzdDxpbnQzMl90PihNYXJrZWRCbG9jazo6YmxvY2tNYXNrKSksIHNjcmF0Y2gxKTsKLSAg
ICBqaXQubW92ZShvd25lciwgc2NyYXRjaDIpOwotICAgIGppdC5hbmRQdHIoVHJ1c3RlZEltbTMy
KHN0YXRpY19jYXN0PGludDMyX3Q+KH5NYXJrZWRCbG9jazo6YmxvY2tNYXNrKSksIHNjcmF0Y2gy
KTsKLSAgICBqaXQucnNoaWZ0MzIoVHJ1c3RlZEltbTMyKE1hcmtlZEJsb2NrOjpsb2cyQ2FyZFNp
emUpLCBzY3JhdGNoMik7Ci0gICAgaml0LnN0b3JlOChUcnVzdGVkSW1tMzIoMSksIE1hY3JvQXNz
ZW1ibGVyOjpCYXNlSW5kZXgoc2NyYXRjaDEsIHNjcmF0Y2gyLCBNYWNyb0Fzc2VtYmxlcjo6VGlt
ZXNPbmUsIE1hcmtlZEJsb2NrOjpvZmZzZXRPZkNhcmRzKCkpKTsKLSNlbmRpZgotfQotCi12b2lk
IEpJVENvZGVHZW5lcmF0b3I6OndyaXRlQmFycmllcihHUFJSZWcgb3duZXJHUFIsIEdQUlJlZyB2
YWx1ZUdQUiwgTm9kZUluZGV4IHZhbHVlSW5kZXgsIFdyaXRlQmFycmllclVzZUtpbmQgdXNlS2lu
ZCwgR1BSUmVnIHNjcmF0Y2gxLCBHUFJSZWcgc2NyYXRjaDIpCi17Ci0gICAgVU5VU0VEX1BBUkFN
KG93bmVyR1BSKTsKLSAgICBVTlVTRURfUEFSQU0odmFsdWVHUFIpOwotICAgIFVOVVNFRF9QQVJB
TShzY3JhdGNoMSk7Ci0gICAgVU5VU0VEX1BBUkFNKHNjcmF0Y2gyKTsKLSAgICBVTlVTRURfUEFS
QU0odXNlS2luZCk7Ci0KLSAgICBpZiAoaXNLbm93bk5vdENlbGwodmFsdWVJbmRleCkpCi0gICAg
ICAgIHJldHVybjsKLQotI2lmIEVOQUJMRShXUklURV9CQVJSSUVSX1BST0ZJTElORykKLSAgICBK
SVRDb21waWxlcjo6ZW1pdENvdW50KGppdCwgV3JpdGVCYXJyaWVyQ291bnRlcnM6OmppdENvdW50
ZXJGb3IodXNlS2luZCkpOwotI2VuZGlmCi0KLSNpZiBFTkFCTEUoR0dDKQotICAgIEpJVENvbXBp
bGVyOjpKdW1wIHJoc05vdENlbGw7Ci0gICAgYm9vbCBoYWRDZWxsQ2hlY2sgPSBmYWxzZTsKLSAg
ICBpZiAoIWlzS25vd25DZWxsKHZhbHVlSW5kZXgpICYmICFpc0NlbGxQcmVkaWN0aW9uKG1faml0
LmdldFByZWRpY3Rpb24odmFsdWVJbmRleCkpKSB7Ci0gICAgICAgIGhhZENlbGxDaGVjayA9IHRy
dWU7Ci0gICAgICAgIHJoc05vdENlbGwgPSBtX2ppdC5icmFuY2hUZXN0UHRyKE1hY3JvQXNzZW1i
bGVyOjpOb25aZXJvLCB2YWx1ZUdQUiwgR1BSSW5mbzo6dGFnTWFza1JlZ2lzdGVyKTsKLSAgICB9
Ci0KLSAgICBHUFJUZW1wb3JhcnkgdGVtcDE7Ci0gICAgR1BSVGVtcG9yYXJ5IHRlbXAyOwotICAg
IGlmIChzY3JhdGNoMSA9PSBJbnZhbGlkR1BSUmVnKSB7Ci0gICAgICAgIEdQUlRlbXBvcmFyeSBz
Y3JhdGNoR1BSKHRoaXMpOwotICAgICAgICB0ZW1wMS5hZG9wdChzY3JhdGNoR1BSKTsKLSAgICAg
ICAgc2NyYXRjaDEgPSB0ZW1wMS5ncHIoKTsKLSAgICB9Ci0gICAgaWYgKHNjcmF0Y2gyID09IElu
dmFsaWRHUFJSZWcpIHsKLSAgICAgICAgR1BSVGVtcG9yYXJ5IHNjcmF0Y2hHUFIodGhpcyk7Ci0g
ICAgICAgIHRlbXAyLmFkb3B0KHNjcmF0Y2hHUFIpOwotICAgICAgICBzY3JhdGNoMiA9IHRlbXAy
LmdwcigpOwotICAgIH0KLQotICAgIG1hcmtDZWxsQ2FyZChtX2ppdCwgb3duZXJHUFIsIHNjcmF0
Y2gxLCBzY3JhdGNoMik7Ci0gICAgaWYgKGhhZENlbGxDaGVjaykKLSAgICAgICAgcmhzTm90Q2Vs
bC5saW5rKCZtX2ppdCk7Ci0jZW5kaWYKLX0KLQotdm9pZCBKSVRDb2RlR2VuZXJhdG9yOjp3cml0
ZUJhcnJpZXIoSlNDZWxsKiBvd25lciwgR1BSUmVnIHZhbHVlR1BSLCBOb2RlSW5kZXggdmFsdWVJ
bmRleCwgV3JpdGVCYXJyaWVyVXNlS2luZCB1c2VLaW5kLCBHUFJSZWcgc2NyYXRjaCkKLXsKLSAg
ICBVTlVTRURfUEFSQU0ob3duZXIpOwotICAgIFVOVVNFRF9QQVJBTSh2YWx1ZUdQUik7Ci0gICAg
VU5VU0VEX1BBUkFNKHNjcmF0Y2gpOwotICAgIFVOVVNFRF9QQVJBTSh1c2VLaW5kKTsKLQotICAg
IGlmIChpc0tub3duTm90Q2VsbCh2YWx1ZUluZGV4KSkKLSAgICAgICAgcmV0dXJuOwotCi0jaWYg
RU5BQkxFKFdSSVRFX0JBUlJJRVJfUFJPRklMSU5HKQotICAgIEpJVENvbXBpbGVyOjplbWl0Q291
bnQoaml0LCBXcml0ZUJhcnJpZXJDb3VudGVyczo6aml0Q291bnRlckZvcih1c2VLaW5kKSk7Ci0j
ZW5kaWYKLQotI2lmIEVOQUJMRShHR0MpCi0gICAgSklUQ29tcGlsZXI6Okp1bXAgcmhzTm90Q2Vs
bDsKLSAgICBib29sIGhhZENlbGxDaGVjayA9IGZhbHNlOwotICAgIGlmICghaXNLbm93bkNlbGwo
dmFsdWVJbmRleCkgJiYgIWlzQ2VsbFByZWRpY3Rpb24obV9qaXQuZ2V0UHJlZGljdGlvbih2YWx1
ZUluZGV4KSkpIHsKLSAgICAgICAgaGFkQ2VsbENoZWNrID0gdHJ1ZTsKLSAgICAgICAgcmhzTm90
Q2VsbCA9IG1faml0LmJyYW5jaFRlc3RQdHIoTWFjcm9Bc3NlbWJsZXI6Ok5vblplcm8sIHZhbHVl
R1BSLCBHUFJJbmZvOjp0YWdNYXNrUmVnaXN0ZXIpOwotICAgIH0KLSAgICAKLSAgICBHUFJUZW1w
b3JhcnkgdGVtcDsKLSAgICBpZiAoc2NyYXRjaCA9PSBJbnZhbGlkR1BSUmVnKSB7Ci0gICAgICAg
IEdQUlRlbXBvcmFyeSBzY3JhdGNoR1BSKHRoaXMpOwotICAgICAgICB0ZW1wLmFkb3B0KHNjcmF0
Y2hHUFIpOwotICAgICAgICBzY3JhdGNoID0gdGVtcC5ncHIoKTsKLSAgICB9Ci0KLSAgICB1aW50
OF90KiBjYXJkQWRkcmVzcyA9IEhlYXA6OmFkZHJlc3NPZkNhcmRGb3Iob3duZXIpOwotICAgIG1f
aml0Lm1vdmUoSklUQ29tcGlsZXI6OlRydXN0ZWRJbW1QdHIoY2FyZEFkZHJlc3MpLCBzY3JhdGNo
KTsKLSAgICBtX2ppdC5zdG9yZTgoSklUQ29tcGlsZXI6OlRydXN0ZWRJbW0zMigxKSwgSklUQ29t
cGlsZXI6OkFkZHJlc3Moc2NyYXRjaCkpOwotCi0gICAgaWYgKGhhZENlbGxDaGVjaykKLSAgICAg
ICAgcmhzTm90Q2VsbC5saW5rKCZtX2ppdCk7Ci0jZW5kaWYKLX0KLQogdm9pZCBKSVRDb2RlR2Vu
ZXJhdG9yOjpjYWNoZWRQdXRCeUlkKEdQUlJlZyBiYXNlR1BSLCBHUFJSZWcgdmFsdWVHUFIsIE5v
ZGVJbmRleCB2YWx1ZUluZGV4LCBHUFJSZWcgc2NyYXRjaEdQUiwgdW5zaWduZWQgaWRlbnRpZmll
ck51bWJlciwgUHV0S2luZCBwdXRLaW5kLCBKSVRDb21waWxlcjo6SnVtcCBzbG93UGF0aFRhcmdl
dCkKIHsKICAgICAKQEAgLTE1ODcsMjQgKzEzMTgsNiBAQCB2b2lkIEpJVENvZGVHZW5lcmF0b3I6
Om5vblNwZWN1bGF0aXZlTm9uCiAgICAgfQogfQogCi1ib29sIEpJVENvZGVHZW5lcmF0b3I6Om5v
blNwZWN1bGF0aXZlQ29tcGFyZShOb2RlJiBub2RlLCBNYWNyb0Fzc2VtYmxlcjo6UmVsYXRpb25h
bENvbmRpdGlvbiBjb25kLCBaX0RGR09wZXJhdGlvbl9FSkogaGVscGVyRnVuY3Rpb24pCi17Ci0g
ICAgTm9kZUluZGV4IGJyYW5jaE5vZGVJbmRleCA9IGRldGVjdFBlZXBIb2xlQnJhbmNoKCk7Ci0g
ICAgaWYgKGJyYW5jaE5vZGVJbmRleCAhPSBOb05vZGUpIHsKLSAgICAgICAgQVNTRVJUKG5vZGUu
YWRqdXN0ZWRSZWZDb3VudCgpID09IDEpOwotICAgICAgICAKLSAgICAgICAgbm9uU3BlY3VsYXRp
dmVQZWVwaG9sZUJyYW5jaChub2RlLCBicmFuY2hOb2RlSW5kZXgsIGNvbmQsIGhlbHBlckZ1bmN0
aW9uKTsKLSAgICAKLSAgICAgICAgbV9jb21waWxlSW5kZXggPSBicmFuY2hOb2RlSW5kZXg7Ci0g
ICAgICAgIAotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgbm9uU3BlY3Vs
YXRpdmVOb25QZWVwaG9sZUNvbXBhcmUobm9kZSwgY29uZCwgaGVscGVyRnVuY3Rpb24pOwotICAg
IAotICAgIHJldHVybiBmYWxzZTsKLX0KLQogdm9pZCBKSVRDb2RlR2VuZXJhdG9yOjpub25TcGVj
dWxhdGl2ZVBlZXBob2xlU3RyaWN0RXEoTm9kZSYgbm9kZSwgTm9kZUluZGV4IGJyYW5jaE5vZGVJ
bmRleCwgYm9vbCBpbnZlcnQpCiB7CiAgICAgTm9kZSYgYnJhbmNoTm9kZSA9IG1faml0LmdyYXBo
KClbYnJhbmNoTm9kZUluZGV4XTsKQEAgLTE3NDgsMjcgKzE0NjEsNiBAQCB2b2lkIEpJVENvZGVH
ZW5lcmF0b3I6Om5vblNwZWN1bGF0aXZlTm9uCiAgICAganNWYWx1ZVJlc3VsdChyZXN1bHRHUFIs
IG1fY29tcGlsZUluZGV4LCBEYXRhRm9ybWF0SlNCb29sZWFuLCBVc2VDaGlsZHJlbkNhbGxlZEV4
cGxpY2l0bHkpOwogfQogCi1ib29sIEpJVENvZGVHZW5lcmF0b3I6Om5vblNwZWN1bGF0aXZlU3Ry
aWN0RXEoTm9kZSYgbm9kZSwgYm9vbCBpbnZlcnQpCi17Ci0gICAgaWYgKCFpbnZlcnQgJiYgKGlz
S25vd25OdW1lcmljKG5vZGUuY2hpbGQxKCkpIHx8IGlzS25vd25OdW1lcmljKG5vZGUuY2hpbGQy
KCkpKSkKLSAgICAgICAgcmV0dXJuIG5vblNwZWN1bGF0aXZlQ29tcGFyZShub2RlLCBNYWNyb0Fz
c2VtYmxlcjo6RXF1YWwsIG9wZXJhdGlvbkNvbXBhcmVTdHJpY3RFcSk7Ci0gICAgCi0gICAgTm9k
ZUluZGV4IGJyYW5jaE5vZGVJbmRleCA9IGRldGVjdFBlZXBIb2xlQnJhbmNoKCk7Ci0gICAgaWYg
KGJyYW5jaE5vZGVJbmRleCAhPSBOb05vZGUpIHsKLSAgICAgICAgQVNTRVJUKG5vZGUuYWRqdXN0
ZWRSZWZDb3VudCgpID09IDEpOwotICAgICAgICAKLSAgICAgICAgbm9uU3BlY3VsYXRpdmVQZWVw
aG9sZVN0cmljdEVxKG5vZGUsIGJyYW5jaE5vZGVJbmRleCwgaW52ZXJ0KTsKLSAgICAKLSAgICAg
ICAgbV9jb21waWxlSW5kZXggPSBicmFuY2hOb2RlSW5kZXg7Ci0gICAgICAgIAotICAgICAgICBy
ZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgbm9uU3BlY3VsYXRpdmVOb25QZWVwaG9sZVN0
cmljdEVxKG5vZGUsIGludmVydCk7Ci0gICAgCi0gICAgcmV0dXJuIGZhbHNlOwotfQotCiB2b2lk
IEpJVENvZGVHZW5lcmF0b3I6OmVtaXRCcmFuY2goTm9kZSYgbm9kZSkKIHsKICAgICBKU1ZhbHVl
T3BlcmFuZCB2YWx1ZSh0aGlzLCBub2RlLmNoaWxkMSgpKTsKQEAgLTE5NDcsMzI4ICsxNjM5LDgg
QEAgdm9pZCBKSVRDb2RlR2VuZXJhdG9yOjplbWl0Q2FsbChOb2RlJiBubwogICAgIG1faml0LmFk
ZEpTQ2FsbChmYXN0Q2FsbCwgc2xvd0NhbGwsIHRhcmdldFRvQ2hlY2ssIGlzQ2FsbCwgbV9qaXQu
Z3JhcGgoKVttX2NvbXBpbGVJbmRleF0uY29kZU9yaWdpbik7CiB9CiAKLXZvaWQgSklUQ29kZUdl
bmVyYXRvcjo6c3BlY3VsYXRpb25DaGVjayhNYWNyb0Fzc2VtYmxlcjo6SnVtcCBqdW1wVG9GYWls
KQotewotICAgIEFTU0VSVChtX2lzU3BlY3VsYXRpdmUpOwotICAgIHN0YXRpY19jYXN0PFNwZWN1
bGF0aXZlSklUKj4odGhpcyktPnNwZWN1bGF0aW9uQ2hlY2soanVtcFRvRmFpbCk7Ci19Ci0KLSNp
Zm5kZWYgTkRFQlVHCi1zdGF0aWMgY29uc3QgY2hhciogZGF0YUZvcm1hdFN0cmluZyhEYXRhRm9y
bWF0IGZvcm1hdCkKLXsKLSAgICAvLyBUaGVzZSB2YWx1ZXMgY29ycmVzcG9uZCB0byB0aGUgRGF0
YUZvcm1hdCBlbnVtLgotICAgIGNvbnN0IGNoYXIqIHN0cmluZ3NbXSA9IHsKLSAgICAgICAgIlsg
IF0iLAotICAgICAgICAiWyBpXSIsCi0gICAgICAgICJbIGRdIiwKLSAgICAgICAgIlsgY10iLAot
ICAgICAgICAiRXJyISIsCi0gICAgICAgICJFcnIhIiwKLSAgICAgICAgIkVyciEiLAotICAgICAg
ICAiRXJyISIsCi0gICAgICAgICJbSiBdIiwKLSAgICAgICAgIltKaV0iLAotICAgICAgICAiW0pk
XSIsCi0gICAgICAgICJbSmNdIiwKLSAgICAgICAgIkVyciEiLAotICAgICAgICAiRXJyISIsCi0g
ICAgICAgICJFcnIhIiwKLSAgICAgICAgIkVyciEiLAotICAgIH07Ci0gICAgcmV0dXJuIHN0cmlu
Z3NbZm9ybWF0XTsKLX0KLQotdm9pZCBKSVRDb2RlR2VuZXJhdG9yOjpkdW1wKGNvbnN0IGNoYXIq
IGxhYmVsKQotewotICAgIGlmIChsYWJlbCkKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICI8JXM+
XG4iLCBsYWJlbCk7Ci0KLSAgICBmcHJpbnRmKHN0ZGVyciwgIiAgZ3ByczpcbiIpOwotICAgIG1f
Z3Bycy5kdW1wKCk7Ci0gICAgZnByaW50ZihzdGRlcnIsICIgIGZwcnM6XG4iKTsKLSAgICBtX2Zw
cnMuZHVtcCgpOwotICAgIGZwcmludGYoc3RkZXJyLCAiICBWaXJ0dWFsUmVnaXN0ZXJzOlxuIik7
Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG1fZ2VuZXJhdGlvbkluZm8uc2l6ZSgpOyAr
K2kpIHsKLSAgICAgICAgR2VuZXJhdGlvbkluZm8mIGluZm8gPSBtX2dlbmVyYXRpb25JbmZvW2ld
OwotICAgICAgICBpZiAoaW5mby5hbGl2ZSgpKQotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIs
ICIgICAgJSAzZDolcyVzIiwgaSwgZGF0YUZvcm1hdFN0cmluZyhpbmZvLnJlZ2lzdGVyRm9ybWF0
KCkpLCBkYXRhRm9ybWF0U3RyaW5nKGluZm8uc3BpbGxGb3JtYXQoKSkpOwotICAgICAgICBlbHNl
Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAlIDNkOltfX11bX19dIiwgaSk7Ci0g
ICAgICAgIGlmIChpbmZvLnJlZ2lzdGVyRm9ybWF0KCkgPT0gRGF0YUZvcm1hdERvdWJsZSkKLSAg
ICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiOmZwciVkXG4iLCBpbmZvLmZwcigpKTsKLSAgICAg
ICAgZWxzZSBpZiAoaW5mby5yZWdpc3RlckZvcm1hdCgpICE9IERhdGFGb3JtYXROb25lKSB7Ci0g
ICAgICAgICAgICBBU1NFUlQoaW5mby5ncHIoKSAhPSBJbnZhbGlkR1BSUmVnKTsKLSAgICAgICAg
ICAgIGZwcmludGYoc3RkZXJyLCAiOiVzXG4iLCBHUFJJbmZvOjpkZWJ1Z05hbWUoaW5mby5ncHIo
KSkpOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiXG4iKTsK
LSAgICB9Ci0gICAgaWYgKGxhYmVsKQotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIjwvJXM+XG4i
LCBsYWJlbCk7Ci19Ci0jZW5kaWYKLQotCi0jaWYgRU5BQkxFKERGR19DT05TSVNURU5DWV9DSEVD
SykKLXZvaWQgSklUQ29kZUdlbmVyYXRvcjo6Y2hlY2tDb25zaXN0ZW5jeSgpCi17Ci0gICAgYm9v
bCBmYWlsZWQgPSBmYWxzZTsKLQotICAgIGZvciAoZ3ByX2l0ZXJhdG9yIGl0ZXIgPSBtX2dwcnMu
YmVnaW4oKTsgaXRlciAhPSBtX2dwcnMuZW5kKCk7ICsraXRlcikgewotICAgICAgICBpZiAoaXRl
ci5pc0xvY2tlZCgpKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkRGR19DT05TSVNU
RU5DWV9DSEVDSyBmYWlsZWQ6IGdwciAlcyBpcyBsb2NrZWQuXG4iLCBpdGVyLmRlYnVnTmFtZSgp
KTsKLSAgICAgICAgICAgIGZhaWxlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZm9y
IChmcHJfaXRlcmF0b3IgaXRlciA9IG1fZnBycy5iZWdpbigpOyBpdGVyICE9IG1fZnBycy5lbmQo
KTsgKytpdGVyKSB7Ci0gICAgICAgIGlmIChpdGVyLmlzTG9ja2VkKCkpIHsKLSAgICAgICAgICAg
IGZwcmludGYoc3RkZXJyLCAiREZHX0NPTlNJU1RFTkNZX0NIRUNLIGZhaWxlZDogZnByICVzIGlz
IGxvY2tlZC5cbiIsIGl0ZXIuZGVidWdOYW1lKCkpOwotICAgICAgICAgICAgZmFpbGVkID0gdHJ1
ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBtX2dl
bmVyYXRpb25JbmZvLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIFZpcnR1YWxSZWdpc3RlciB2aXJ0
dWFsUmVnaXN0ZXIgPSAoVmlydHVhbFJlZ2lzdGVyKWk7Ci0gICAgICAgIEdlbmVyYXRpb25JbmZv
JiBpbmZvID0gbV9nZW5lcmF0aW9uSW5mb1t2aXJ0dWFsUmVnaXN0ZXJdOwotICAgICAgICBpZiAo
IWluZm8uYWxpdmUoKSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBzd2l0Y2ggKGlu
Zm8ucmVnaXN0ZXJGb3JtYXQoKSkgewotICAgICAgICBjYXNlIERhdGFGb3JtYXROb25lOgotICAg
ICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRGF0YUZvcm1hdEludGVnZXI6Ci0gICAgICAg
IGNhc2UgRGF0YUZvcm1hdENlbGw6Ci0gICAgICAgIGNhc2UgRGF0YUZvcm1hdEpTOgotICAgICAg
ICBjYXNlIERhdGFGb3JtYXRKU0ludGVnZXI6Ci0gICAgICAgIGNhc2UgRGF0YUZvcm1hdEpTRG91
YmxlOgotICAgICAgICBjYXNlIERhdGFGb3JtYXRKU0NlbGw6IHsKLSAgICAgICAgICAgIEdQUlJl
ZyBncHIgPSBpbmZvLmdwcigpOwotICAgICAgICAgICAgQVNTRVJUKGdwciAhPSBJbnZhbGlkR1BS
UmVnKTsKLSAgICAgICAgICAgIGlmIChtX2dwcnMubmFtZShncHIpICE9IHZpcnR1YWxSZWdpc3Rl
cikgewotICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiREZHX0NPTlNJU1RFTkNZX0NI
RUNLIGZhaWxlZDogbmFtZSBtaXNtYXRjaCBmb3IgdmlydHVhbCByZWdpc3RlciAlZCAoZ3ByICVz
KS5cbiIsIHZpcnR1YWxSZWdpc3RlciwgR1BSSW5mbzo6ZGVidWdOYW1lKGdwcikpOwotICAgICAg
ICAgICAgICAgIGZhaWxlZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVh
azsKLSAgICAgICAgfQotICAgICAgICBjYXNlIERhdGFGb3JtYXREb3VibGU6IHsKLSAgICAgICAg
ICAgIEZQUlJlZyBmcHIgPSBpbmZvLmZwcigpOwotICAgICAgICAgICAgQVNTRVJUKGZwciAhPSBJ
bnZhbGlkRlBSUmVnKTsKLSAgICAgICAgICAgIGlmIChtX2ZwcnMubmFtZShmcHIpICE9IHZpcnR1
YWxSZWdpc3RlcikgewotICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiREZHX0NPTlNJ
U1RFTkNZX0NIRUNLIGZhaWxlZDogbmFtZSBtaXNtYXRjaCBmb3IgdmlydHVhbCByZWdpc3RlciAl
ZCAoZnByICVzKS5cbiIsIHZpcnR1YWxSZWdpc3RlciwgRlBSSW5mbzo6ZGVidWdOYW1lKGZwcikp
OwotICAgICAgICAgICAgICAgIGZhaWxlZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAg
ICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm9yIChncHJf
aXRlcmF0b3IgaXRlciA9IG1fZ3Bycy5iZWdpbigpOyBpdGVyICE9IG1fZ3Bycy5lbmQoKTsgKytp
dGVyKSB7Ci0gICAgICAgIFZpcnR1YWxSZWdpc3RlciB2aXJ0dWFsUmVnaXN0ZXIgPSBpdGVyLm5h
bWUoKTsKLSAgICAgICAgaWYgKHZpcnR1YWxSZWdpc3RlciA9PSBJbnZhbGlkVmlydHVhbFJlZ2lz
dGVyKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgR2VuZXJhdGlvbkluZm8mIGlu
Zm8gPSBtX2dlbmVyYXRpb25JbmZvW3ZpcnR1YWxSZWdpc3Rlcl07Ci0gICAgICAgIGlmIChpdGVy
LnJlZ0lEKCkgIT0gaW5mby5ncHIoKSkgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJE
RkdfQ09OU0lTVEVOQ1lfQ0hFQ0sgZmFpbGVkOiBuYW1lIG1pc21hdGNoIGZvciBncHIgJXMgKHZp
cnR1YWwgcmVnaXN0ZXIgJWQpLlxuIiwgaXRlci5kZWJ1Z05hbWUoKSwgdmlydHVhbFJlZ2lzdGVy
KTsKLSAgICAgICAgICAgIGZhaWxlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBm
b3IgKGZwcl9pdGVyYXRvciBpdGVyID0gbV9mcHJzLmJlZ2luKCk7IGl0ZXIgIT0gbV9mcHJzLmVu
ZCgpOyArK2l0ZXIpIHsKLSAgICAgICAgVmlydHVhbFJlZ2lzdGVyIHZpcnR1YWxSZWdpc3RlciA9
IGl0ZXIubmFtZSgpOwotICAgICAgICBpZiAodmlydHVhbFJlZ2lzdGVyID09IEludmFsaWRWaXJ0
dWFsUmVnaXN0ZXIpCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICBHZW5lcmF0aW9u
SW5mbyYgaW5mbyA9IG1fZ2VuZXJhdGlvbkluZm9bdmlydHVhbFJlZ2lzdGVyXTsKLSAgICAgICAg
aWYgKGl0ZXIucmVnSUQoKSAhPSBpbmZvLmZwcigpKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0
ZGVyciwgIkRGR19DT05TSVNURU5DWV9DSEVDSyBmYWlsZWQ6IG5hbWUgbWlzbWF0Y2ggZm9yIGZw
ciAlcyAodmlydHVhbCByZWdpc3RlciAlZCkuXG4iLCBpdGVyLmRlYnVnTmFtZSgpLCB2aXJ0dWFs
UmVnaXN0ZXIpOwotICAgICAgICAgICAgZmFpbGVkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0K
LQotICAgIGlmIChmYWlsZWQpIHsKLSAgICAgICAgZHVtcCgpOwotICAgICAgICBDUkFTSCgpOwot
ICAgIH0KLX0KICNlbmRpZgogCi1HUFJUZW1wb3Jhcnk6OkdQUlRlbXBvcmFyeSgpCi0gICAgOiBt
X2ppdCgwKQotICAgICwgbV9ncHIoSW52YWxpZEdQUlJlZykKLXsKLX0KLQotR1BSVGVtcG9yYXJ5
OjpHUFJUZW1wb3JhcnkoSklUQ29kZUdlbmVyYXRvciogaml0KQotICAgIDogbV9qaXQoaml0KQot
ICAgICwgbV9ncHIoSW52YWxpZEdQUlJlZykKLXsKLSAgICBtX2dwciA9IG1faml0LT5hbGxvY2F0
ZSgpOwotfQotCi1HUFJUZW1wb3Jhcnk6OkdQUlRlbXBvcmFyeShKSVRDb2RlR2VuZXJhdG9yKiBq
aXQsIEdQUlJlZyBzcGVjaWZpYykKLSAgICA6IG1faml0KGppdCkKLSAgICAsIG1fZ3ByKEludmFs
aWRHUFJSZWcpCi17Ci0gICAgbV9ncHIgPSBtX2ppdC0+YWxsb2NhdGUoc3BlY2lmaWMpOwotfQot
Ci1HUFJUZW1wb3Jhcnk6OkdQUlRlbXBvcmFyeShKSVRDb2RlR2VuZXJhdG9yKiBqaXQsIFNwZWN1
bGF0ZUludGVnZXJPcGVyYW5kJiBvcDEpCi0gICAgOiBtX2ppdChqaXQpCi0gICAgLCBtX2dwcihJ
bnZhbGlkR1BSUmVnKQotewotICAgIGlmIChtX2ppdC0+Y2FuUmV1c2Uob3AxLmluZGV4KCkpKQot
ICAgICAgICBtX2dwciA9IG1faml0LT5yZXVzZShvcDEuZ3ByKCkpOwotICAgIGVsc2UKLSAgICAg
ICAgbV9ncHIgPSBtX2ppdC0+YWxsb2NhdGUoKTsKLX0KLQotR1BSVGVtcG9yYXJ5OjpHUFJUZW1w
b3JhcnkoSklUQ29kZUdlbmVyYXRvciogaml0LCBTcGVjdWxhdGVJbnRlZ2VyT3BlcmFuZCYgb3Ax
LCBTcGVjdWxhdGVJbnRlZ2VyT3BlcmFuZCYgb3AyKQotICAgIDogbV9qaXQoaml0KQotICAgICwg
bV9ncHIoSW52YWxpZEdQUlJlZykKLXsKLSAgICBpZiAobV9qaXQtPmNhblJldXNlKG9wMS5pbmRl
eCgpKSkKLSAgICAgICAgbV9ncHIgPSBtX2ppdC0+cmV1c2Uob3AxLmdwcigpKTsKLSAgICBlbHNl
IGlmIChtX2ppdC0+Y2FuUmV1c2Uob3AyLmluZGV4KCkpKQotICAgICAgICBtX2dwciA9IG1faml0
LT5yZXVzZShvcDIuZ3ByKCkpOwotICAgIGVsc2UKLSAgICAgICAgbV9ncHIgPSBtX2ppdC0+YWxs
b2NhdGUoKTsKLX0KLQotR1BSVGVtcG9yYXJ5OjpHUFJUZW1wb3JhcnkoSklUQ29kZUdlbmVyYXRv
ciogaml0LCBTcGVjdWxhdGVTdHJpY3RJbnQzMk9wZXJhbmQmIG9wMSkKLSAgICA6IG1faml0KGpp
dCkKLSAgICAsIG1fZ3ByKEludmFsaWRHUFJSZWcpCi17Ci0gICAgaWYgKG1faml0LT5jYW5SZXVz
ZShvcDEuaW5kZXgoKSkpCi0gICAgICAgIG1fZ3ByID0gbV9qaXQtPnJldXNlKG9wMS5ncHIoKSk7
Ci0gICAgZWxzZQotICAgICAgICBtX2dwciA9IG1faml0LT5hbGxvY2F0ZSgpOwotfQotCi1HUFJU
ZW1wb3Jhcnk6OkdQUlRlbXBvcmFyeShKSVRDb2RlR2VuZXJhdG9yKiBqaXQsIEludGVnZXJPcGVy
YW5kJiBvcDEpCi0gICAgOiBtX2ppdChqaXQpCi0gICAgLCBtX2dwcihJbnZhbGlkR1BSUmVnKQot
ewotICAgIGlmIChtX2ppdC0+Y2FuUmV1c2Uob3AxLmluZGV4KCkpKQotICAgICAgICBtX2dwciA9
IG1faml0LT5yZXVzZShvcDEuZ3ByKCkpOwotICAgIGVsc2UKLSAgICAgICAgbV9ncHIgPSBtX2pp
dC0+YWxsb2NhdGUoKTsKLX0KLQotR1BSVGVtcG9yYXJ5OjpHUFJUZW1wb3JhcnkoSklUQ29kZUdl
bmVyYXRvciogaml0LCBJbnRlZ2VyT3BlcmFuZCYgb3AxLCBJbnRlZ2VyT3BlcmFuZCYgb3AyKQot
ICAgIDogbV9qaXQoaml0KQotICAgICwgbV9ncHIoSW52YWxpZEdQUlJlZykKLXsKLSAgICBpZiAo
bV9qaXQtPmNhblJldXNlKG9wMS5pbmRleCgpKSkKLSAgICAgICAgbV9ncHIgPSBtX2ppdC0+cmV1
c2Uob3AxLmdwcigpKTsKLSAgICBlbHNlIGlmIChtX2ppdC0+Y2FuUmV1c2Uob3AyLmluZGV4KCkp
KQotICAgICAgICBtX2dwciA9IG1faml0LT5yZXVzZShvcDIuZ3ByKCkpOwotICAgIGVsc2UKLSAg
ICAgICAgbV9ncHIgPSBtX2ppdC0+YWxsb2NhdGUoKTsKLX0KLQotR1BSVGVtcG9yYXJ5OjpHUFJU
ZW1wb3JhcnkoSklUQ29kZUdlbmVyYXRvciogaml0LCBTcGVjdWxhdGVDZWxsT3BlcmFuZCYgb3Ax
KQotICAgIDogbV9qaXQoaml0KQotICAgICwgbV9ncHIoSW52YWxpZEdQUlJlZykKLXsKLSAgICBp
ZiAobV9qaXQtPmNhblJldXNlKG9wMS5pbmRleCgpKSkKLSAgICAgICAgbV9ncHIgPSBtX2ppdC0+
cmV1c2Uob3AxLmdwcigpKTsKLSAgICBlbHNlCi0gICAgICAgIG1fZ3ByID0gbV9qaXQtPmFsbG9j
YXRlKCk7Ci19Ci0KLUdQUlRlbXBvcmFyeTo6R1BSVGVtcG9yYXJ5KEpJVENvZGVHZW5lcmF0b3Iq
IGppdCwgU3BlY3VsYXRlQm9vbGVhbk9wZXJhbmQmIG9wMSkKLSAgICA6IG1faml0KGppdCkKLSAg
ICAsIG1fZ3ByKEludmFsaWRHUFJSZWcpCi17Ci0gICAgaWYgKG1faml0LT5jYW5SZXVzZShvcDEu
aW5kZXgoKSkpCi0gICAgICAgIG1fZ3ByID0gbV9qaXQtPnJldXNlKG9wMS5ncHIoKSk7Ci0gICAg
ZWxzZQotICAgICAgICBtX2dwciA9IG1faml0LT5hbGxvY2F0ZSgpOwotfQotCi1HUFJUZW1wb3Jh
cnk6OkdQUlRlbXBvcmFyeShKSVRDb2RlR2VuZXJhdG9yKiBqaXQsIEpTVmFsdWVPcGVyYW5kJiBv
cDEpCi0gICAgOiBtX2ppdChqaXQpCi0gICAgLCBtX2dwcihJbnZhbGlkR1BSUmVnKQotewotICAg
IGlmIChtX2ppdC0+Y2FuUmV1c2Uob3AxLmluZGV4KCkpKQotICAgICAgICBtX2dwciA9IG1faml0
LT5yZXVzZShvcDEuZ3ByKCkpOwotICAgIGVsc2UKLSAgICAgICAgbV9ncHIgPSBtX2ppdC0+YWxs
b2NhdGUoKTsKLX0KLQotR1BSVGVtcG9yYXJ5OjpHUFJUZW1wb3JhcnkoSklUQ29kZUdlbmVyYXRv
ciogaml0LCBTdG9yYWdlT3BlcmFuZCYgb3AxKQotICAgIDogbV9qaXQoaml0KQotICAgICwgbV9n
cHIoSW52YWxpZEdQUlJlZykKLXsKLSAgICBpZiAobV9qaXQtPmNhblJldXNlKG9wMS5pbmRleCgp
KSkKLSAgICAgICAgbV9ncHIgPSBtX2ppdC0+cmV1c2Uob3AxLmdwcigpKTsKLSAgICBlbHNlCi0g
ICAgICAgIG1fZ3ByID0gbV9qaXQtPmFsbG9jYXRlKCk7Ci19Ci0KLXZvaWQgR1BSVGVtcG9yYXJ5
OjphZG9wdChHUFJUZW1wb3JhcnkmIG90aGVyKQotewotICAgIEFTU0VSVCghbV9qaXQpOwotICAg
IEFTU0VSVChtX2dwciA9PSBJbnZhbGlkR1BSUmVnKTsKLSAgICBBU1NFUlQob3RoZXIubV9qaXQp
OwotICAgIEFTU0VSVChvdGhlci5tX2dwciAhPSBJbnZhbGlkR1BSUmVnKTsKLSAgICBtX2ppdCA9
IG90aGVyLm1faml0OwotICAgIG1fZ3ByID0gb3RoZXIubV9ncHI7Ci0gICAgb3RoZXIubV9qaXQg
PSAwOwotICAgIG90aGVyLm1fZ3ByID0gSW52YWxpZEdQUlJlZzsKLX0KLQotRlBSVGVtcG9yYXJ5
OjpGUFJUZW1wb3JhcnkoSklUQ29kZUdlbmVyYXRvciogaml0KQotICAgIDogbV9qaXQoaml0KQot
ICAgICwgbV9mcHIoSW52YWxpZEZQUlJlZykKLXsKLSAgICBtX2ZwciA9IG1faml0LT5mcHJBbGxv
Y2F0ZSgpOwotfQotCi1GUFJUZW1wb3Jhcnk6OkZQUlRlbXBvcmFyeShKSVRDb2RlR2VuZXJhdG9y
KiBqaXQsIERvdWJsZU9wZXJhbmQmIG9wMSkKLSAgICA6IG1faml0KGppdCkKLSAgICAsIG1fZnBy
KEludmFsaWRGUFJSZWcpCi17Ci0gICAgaWYgKG1faml0LT5jYW5SZXVzZShvcDEuaW5kZXgoKSkp
Ci0gICAgICAgIG1fZnByID0gbV9qaXQtPnJldXNlKG9wMS5mcHIoKSk7Ci0gICAgZWxzZQotICAg
ICAgICBtX2ZwciA9IG1faml0LT5mcHJBbGxvY2F0ZSgpOwotfQotCi1GUFJUZW1wb3Jhcnk6OkZQ
UlRlbXBvcmFyeShKSVRDb2RlR2VuZXJhdG9yKiBqaXQsIERvdWJsZU9wZXJhbmQmIG9wMSwgRG91
YmxlT3BlcmFuZCYgb3AyKQotICAgIDogbV9qaXQoaml0KQotICAgICwgbV9mcHIoSW52YWxpZEZQ
UlJlZykKLXsKLSAgICBpZiAobV9qaXQtPmNhblJldXNlKG9wMS5pbmRleCgpKSkKLSAgICAgICAg
bV9mcHIgPSBtX2ppdC0+cmV1c2Uob3AxLmZwcigpKTsKLSAgICBlbHNlIGlmIChtX2ppdC0+Y2Fu
UmV1c2Uob3AyLmluZGV4KCkpKQotICAgICAgICBtX2ZwciA9IG1faml0LT5yZXVzZShvcDIuZnBy
KCkpOwotICAgIGVsc2UKLSAgICAgICAgbV9mcHIgPSBtX2ppdC0+ZnByQWxsb2NhdGUoKTsKLX0K
LQotRlBSVGVtcG9yYXJ5OjpGUFJUZW1wb3JhcnkoSklUQ29kZUdlbmVyYXRvciogaml0LCBTcGVj
dWxhdGVEb3VibGVPcGVyYW5kJiBvcDEpCi0gICAgOiBtX2ppdChqaXQpCi0gICAgLCBtX2ZwcihJ
bnZhbGlkRlBSUmVnKQotewotICAgIGlmIChtX2ppdC0+Y2FuUmV1c2Uob3AxLmluZGV4KCkpKQot
ICAgICAgICBtX2ZwciA9IG1faml0LT5yZXVzZShvcDEuZnByKCkpOwotICAgIGVsc2UKLSAgICAg
ICAgbV9mcHIgPSBtX2ppdC0+ZnByQWxsb2NhdGUoKTsKLX0KLQotRlBSVGVtcG9yYXJ5OjpGUFJU
ZW1wb3JhcnkoSklUQ29kZUdlbmVyYXRvciogaml0LCBTcGVjdWxhdGVEb3VibGVPcGVyYW5kJiBv
cDEsIFNwZWN1bGF0ZURvdWJsZU9wZXJhbmQmIG9wMikKLSAgICA6IG1faml0KGppdCkKLSAgICAs
IG1fZnByKEludmFsaWRGUFJSZWcpCi17Ci0gICAgaWYgKG1faml0LT5jYW5SZXVzZShvcDEuaW5k
ZXgoKSkpCi0gICAgICAgIG1fZnByID0gbV9qaXQtPnJldXNlKG9wMS5mcHIoKSk7Ci0gICAgZWxz
ZSBpZiAobV9qaXQtPmNhblJldXNlKG9wMi5pbmRleCgpKSkKLSAgICAgICAgbV9mcHIgPSBtX2pp
dC0+cmV1c2Uob3AyLmZwcigpKTsKLSAgICBlbHNlCi0gICAgICAgIG1fZnByID0gbV9qaXQtPmZw
ckFsbG9jYXRlKCk7Ci19Ci0KIH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpERkcKIAogI2VuZGlmCi0j
ZW5kaWYKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHSklUQ29kZUdlbmVyYXRv
ci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdKSVRDb2Rl
R2VuZXJhdG9yLmNwcAkocmV2aXNpb24gOTYzNzMpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
ZGZnL0RGR0pJVENvZGVHZW5lcmF0b3IuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNyw4ICsyNyw4
IEBACiAjaW5jbHVkZSAiREZHSklUQ29kZUdlbmVyYXRvci5oIgogCiAjaWYgRU5BQkxFKERGR19K
SVQpCi0jaWYgVVNFKEpTVkFMVUU2NCkKIAorI2luY2x1ZGUgIkRGR0pJVENvbXBpbGVySW5saW5l
TWV0aG9kcy5oIgogI2luY2x1ZGUgIkRGR1NwZWN1bGF0aXZlSklULmgiCiAjaW5jbHVkZSAiTGlu
a0J1ZmZlci5oIgogCkBAIC00NCwyOTAgKzQ0LDYgQEAgdm9pZCBKSVRDb2RlR2VuZXJhdG9yOjpj
bGVhckdlbmVyYXRpb25JbgogICAgIG1fZnBycyA9IFJlZ2lzdGVyQmFuazxGUFJJbmZvPigpOwog
fQogCi1HUFJSZWcgSklUQ29kZUdlbmVyYXRvcjo6ZmlsbEludGVnZXIoTm9kZUluZGV4IG5vZGVJ
bmRleCwgRGF0YUZvcm1hdCYgcmV0dXJuRm9ybWF0KQotewotICAgIE5vZGUmIG5vZGUgPSBtX2pp
dC5ncmFwaCgpW25vZGVJbmRleF07Ci0gICAgVmlydHVhbFJlZ2lzdGVyIHZpcnR1YWxSZWdpc3Rl
ciA9IG5vZGUudmlydHVhbFJlZ2lzdGVyKCk7Ci0gICAgR2VuZXJhdGlvbkluZm8mIGluZm8gPSBt
X2dlbmVyYXRpb25JbmZvW3ZpcnR1YWxSZWdpc3Rlcl07Ci0KLSAgICBpZiAoaW5mby5yZWdpc3Rl
ckZvcm1hdCgpID09IERhdGFGb3JtYXROb25lKSB7Ci0gICAgICAgIEdQUlJlZyBncHIgPSBhbGxv
Y2F0ZSgpOwotCi0gICAgICAgIGlmIChub2RlLmhhc0NvbnN0YW50KCkpIHsKLSAgICAgICAgICAg
IG1fZ3Bycy5yZXRhaW4oZ3ByLCB2aXJ0dWFsUmVnaXN0ZXIsIFNwaWxsT3JkZXJDb25zdGFudCk7
Ci0gICAgICAgICAgICBpZiAoaXNJbnQzMkNvbnN0YW50KG5vZGVJbmRleCkpIHsKLSAgICAgICAg
ICAgICAgICBtX2ppdC5tb3ZlKE1hY3JvQXNzZW1ibGVyOjpJbW0zMih2YWx1ZU9mSW50MzJDb25z
dGFudChub2RlSW5kZXgpKSwgZ3ByKTsKLSAgICAgICAgICAgICAgICBpbmZvLmZpbGxJbnRlZ2Vy
KGdwcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuRm9ybWF0ID0gRGF0YUZvcm1hdEludGVnZXI7
Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdwcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAg
IGlmIChpc051bWJlckNvbnN0YW50KG5vZGVJbmRleCkpIHsKLSAgICAgICAgICAgICAgICBKU1Zh
bHVlIGpzVmFsdWUgPSBqc051bWJlcih2YWx1ZU9mTnVtYmVyQ29uc3RhbnQobm9kZUluZGV4KSk7
Ci0gICAgICAgICAgICAgICAgbV9qaXQubW92ZShNYWNyb0Fzc2VtYmxlcjo6SW1tUHRyKEpTVmFs
dWU6OmVuY29kZShqc1ZhbHVlKSksIGdwcik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAg
ICAgICAgICAgIEFTU0VSVChpc0pTQ29uc3RhbnQobm9kZUluZGV4KSk7Ci0gICAgICAgICAgICAg
ICAgSlNWYWx1ZSBqc1ZhbHVlID0gdmFsdWVPZkpTQ29uc3RhbnQobm9kZUluZGV4KTsKLSAgICAg
ICAgICAgICAgICBtX2ppdC5tb3ZlKE1hY3JvQXNzZW1ibGVyOjpJbW1QdHIoSlNWYWx1ZTo6ZW5j
b2RlKGpzVmFsdWUpKSwgZ3ByKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAg
ICAgICAgICAgIEFTU0VSVChpbmZvLnNwaWxsRm9ybWF0KCkgPT0gRGF0YUZvcm1hdEpTIHx8IGlu
Zm8uc3BpbGxGb3JtYXQoKSA9PSBEYXRhRm9ybWF0SlNJbnRlZ2VyKTsKLSAgICAgICAgICAgIG1f
Z3Bycy5yZXRhaW4oZ3ByLCB2aXJ0dWFsUmVnaXN0ZXIsIFNwaWxsT3JkZXJTcGlsbGVkKTsKLSAg
ICAgICAgICAgIG1faml0LmxvYWRQdHIoSklUQ29tcGlsZXI6OmFkZHJlc3NGb3IodmlydHVhbFJl
Z2lzdGVyKSwgZ3ByKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFNpbmNlIHdlIHN0YXRpY2Fs
bHkga25vdyB0aGF0IHdlJ3JlIGZpbGxpbmcgYW4gaW50ZWdlciwgYW5kIHZhbHVlcwotICAgICAg
ICAvLyBpbiB0aGUgUmVnaXN0ZXJGaWxlIGFyZSBib3hlZCwgdGhpcyBtdXN0IGJlIERhdGFGb3Jt
YXRKU0ludGVnZXIuCi0gICAgICAgIC8vIFdlIHdpbGwgY2hlY2sgdGhpcyB3aXRoIGEgaml0QXNz
ZXJ0IGJlbG93LgotICAgICAgICBpbmZvLmZpbGxKU1ZhbHVlKGdwciwgRGF0YUZvcm1hdEpTSW50
ZWdlcik7Ci0gICAgICAgIHVubG9jayhncHIpOwotICAgIH0KLQotICAgIHN3aXRjaCAoaW5mby5y
ZWdpc3RlckZvcm1hdCgpKSB7Ci0gICAgY2FzZSBEYXRhRm9ybWF0Tm9uZToKLSAgICAgICAgLy8g
U2hvdWxkIGhhdmUgZmlsbGVkLCBhYm92ZS4KLSAgICBjYXNlIERhdGFGb3JtYXRKU0RvdWJsZToK
LSAgICBjYXNlIERhdGFGb3JtYXREb3VibGU6Ci0gICAgY2FzZSBEYXRhRm9ybWF0SlM6Ci0gICAg
Y2FzZSBEYXRhRm9ybWF0Q2VsbDoKLSAgICBjYXNlIERhdGFGb3JtYXRKU0NlbGw6Ci0gICAgY2Fz
ZSBEYXRhRm9ybWF0Qm9vbGVhbjoKLSAgICBjYXNlIERhdGFGb3JtYXRKU0Jvb2xlYW46Ci0gICAg
Y2FzZSBEYXRhRm9ybWF0U3RvcmFnZToKLSAgICAgICAgLy8gU2hvdWxkIG9ubHkgYmUgY2FsbGlu
ZyB0aGlzIGZ1bmN0aW9uIGlmIHdlIGtub3cgdGhpcyBvcGVyYW5kIHRvIGJlIGludGVnZXIuCi0g
ICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotCi0gICAgY2FzZSBEYXRhRm9ybWF0SlNJbnRl
Z2VyOiB7Ci0gICAgICAgIEdQUlJlZyBncHIgPSBpbmZvLmdwcigpOwotICAgICAgICBtX2dwcnMu
bG9jayhncHIpOwotICAgICAgICBtX2ppdC5qaXRBc3NlcnRJc0pTSW50MzIoZ3ByKTsKLSAgICAg
ICAgcmV0dXJuRm9ybWF0ID0gRGF0YUZvcm1hdEpTSW50ZWdlcjsKLSAgICAgICAgcmV0dXJuIGdw
cjsKLSAgICB9Ci0KLSAgICBjYXNlIERhdGFGb3JtYXRJbnRlZ2VyOiB7Ci0gICAgICAgIEdQUlJl
ZyBncHIgPSBpbmZvLmdwcigpOwotICAgICAgICBtX2dwcnMubG9jayhncHIpOwotICAgICAgICBt
X2ppdC5qaXRBc3NlcnRJc0ludDMyKGdwcik7Ci0gICAgICAgIHJldHVybkZvcm1hdCA9IERhdGFG
b3JtYXRJbnRlZ2VyOwotICAgICAgICByZXR1cm4gZ3ByOwotICAgIH0KLSAgICB9Ci0KLSAgICBB
U1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICByZXR1cm4gSW52YWxpZEdQUlJlZzsKLX0KLQotRlBS
UmVnIEpJVENvZGVHZW5lcmF0b3I6OmZpbGxEb3VibGUoTm9kZUluZGV4IG5vZGVJbmRleCkKLXsK
LSAgICBOb2RlJiBub2RlID0gbV9qaXQuZ3JhcGgoKVtub2RlSW5kZXhdOwotICAgIFZpcnR1YWxS
ZWdpc3RlciB2aXJ0dWFsUmVnaXN0ZXIgPSBub2RlLnZpcnR1YWxSZWdpc3RlcigpOwotICAgIEdl
bmVyYXRpb25JbmZvJiBpbmZvID0gbV9nZW5lcmF0aW9uSW5mb1t2aXJ0dWFsUmVnaXN0ZXJdOwot
Ci0gICAgaWYgKGluZm8ucmVnaXN0ZXJGb3JtYXQoKSA9PSBEYXRhRm9ybWF0Tm9uZSkgewotICAg
ICAgICBHUFJSZWcgZ3ByID0gYWxsb2NhdGUoKTsKLQotICAgICAgICBpZiAobm9kZS5oYXNDb25z
dGFudCgpKSB7Ci0gICAgICAgICAgICBpZiAoaXNJbnQzMkNvbnN0YW50KG5vZGVJbmRleCkpIHsK
LSAgICAgICAgICAgICAgICAvLyBGSVhNRTogc2hvdWxkIG5vdCBiZSByZWFjaGFibGU/Ci0gICAg
ICAgICAgICAgICAgbV9qaXQubW92ZShNYWNyb0Fzc2VtYmxlcjo6SW1tMzIodmFsdWVPZkludDMy
Q29uc3RhbnQobm9kZUluZGV4KSksIGdwcik7Ci0gICAgICAgICAgICAgICAgbV9ncHJzLnJldGFp
bihncHIsIHZpcnR1YWxSZWdpc3RlciwgU3BpbGxPcmRlckNvbnN0YW50KTsKLSAgICAgICAgICAg
ICAgICBpbmZvLmZpbGxJbnRlZ2VyKGdwcik7Ci0gICAgICAgICAgICAgICAgdW5sb2NrKGdwcik7
Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGlzTnVtYmVyQ29uc3RhbnQobm9kZUluZGV4KSkgewot
ICAgICAgICAgICAgICAgIEZQUlJlZyBmcHIgPSBmcHJBbGxvY2F0ZSgpOwotICAgICAgICAgICAg
ICAgIG1faml0Lm1vdmUoTWFjcm9Bc3NlbWJsZXI6OkltbVB0cihyZWludGVycHJldF9jYXN0PHZv
aWQqPihyZWludGVycHJldERvdWJsZVRvSW50cHRyKHZhbHVlT2ZOdW1iZXJDb25zdGFudChub2Rl
SW5kZXgpKSkpLCBncHIpOwotICAgICAgICAgICAgICAgIG1faml0Lm1vdmVQdHJUb0RvdWJsZShn
cHIsIGZwcik7Ci0gICAgICAgICAgICAgICAgdW5sb2NrKGdwcik7Ci0KLSAgICAgICAgICAgICAg
ICBtX2ZwcnMucmV0YWluKGZwciwgdmlydHVhbFJlZ2lzdGVyLCBTcGlsbE9yZGVyRG91YmxlKTsK
LSAgICAgICAgICAgICAgICBpbmZvLmZpbGxEb3VibGUoZnByKTsKLSAgICAgICAgICAgICAgICBy
ZXR1cm4gZnByOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBGSVhN
RTogc2hvdWxkIG5vdCBiZSByZWFjaGFibGU/Ci0gICAgICAgICAgICAgICAgQVNTRVJUKGlzSlND
b25zdGFudChub2RlSW5kZXgpKTsKLSAgICAgICAgICAgICAgICBKU1ZhbHVlIGpzVmFsdWUgPSB2
YWx1ZU9mSlNDb25zdGFudChub2RlSW5kZXgpOwotICAgICAgICAgICAgICAgIG1faml0Lm1vdmUo
TWFjcm9Bc3NlbWJsZXI6OkltbVB0cihKU1ZhbHVlOjplbmNvZGUoanNWYWx1ZSkpLCBncHIpOwot
ICAgICAgICAgICAgICAgIG1fZ3Bycy5yZXRhaW4oZ3ByLCB2aXJ0dWFsUmVnaXN0ZXIsIFNwaWxs
T3JkZXJDb25zdGFudCk7Ci0gICAgICAgICAgICAgICAgaW5mby5maWxsSlNWYWx1ZShncHIsIERh
dGFGb3JtYXRKUyk7Ci0gICAgICAgICAgICAgICAgdW5sb2NrKGdwcik7Ci0gICAgICAgICAgICB9
Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBEYXRhRm9ybWF0IHNwaWxsRm9ybWF0ID0g
aW5mby5zcGlsbEZvcm1hdCgpOwotICAgICAgICAgICAgQVNTRVJUKHNwaWxsRm9ybWF0ICYgRGF0
YUZvcm1hdEpTKTsKLSAgICAgICAgICAgIG1fZ3Bycy5yZXRhaW4oZ3ByLCB2aXJ0dWFsUmVnaXN0
ZXIsIFNwaWxsT3JkZXJTcGlsbGVkKTsKLSAgICAgICAgICAgIG1faml0LmxvYWRQdHIoSklUQ29t
cGlsZXI6OmFkZHJlc3NGb3IodmlydHVhbFJlZ2lzdGVyKSwgZ3ByKTsKLSAgICAgICAgICAgIGlu
Zm8uZmlsbEpTVmFsdWUoZ3ByLCBtX2lzU3BlY3VsYXRpdmUgPyBzcGlsbEZvcm1hdCA6IERhdGFG
b3JtYXRKUyk7Ci0gICAgICAgICAgICB1bmxvY2soZ3ByKTsKLSAgICAgICAgfQotICAgIH0KLQot
ICAgIHN3aXRjaCAoaW5mby5yZWdpc3RlckZvcm1hdCgpKSB7Ci0gICAgY2FzZSBEYXRhRm9ybWF0
Tm9uZToKLSAgICAgICAgLy8gU2hvdWxkIGhhdmUgZmlsbGVkLCBhYm92ZS4KLSAgICBjYXNlIERh
dGFGb3JtYXRDZWxsOgotICAgIGNhc2UgRGF0YUZvcm1hdEpTQ2VsbDoKLSAgICBjYXNlIERhdGFG
b3JtYXRCb29sZWFuOgotICAgIGNhc2UgRGF0YUZvcm1hdEpTQm9vbGVhbjoKLSAgICBjYXNlIERh
dGFGb3JtYXRTdG9yYWdlOgotICAgICAgICAvLyBTaG91bGQgb25seSBiZSBjYWxsaW5nIHRoaXMg
ZnVuY3Rpb24gaWYgd2Uga25vdyB0aGlzIG9wZXJhbmQgdG8gYmUgbnVtZXJpYy4KLSAgICAgICAg
QVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0KLSAgICBjYXNlIERhdGFGb3JtYXRKUzogewotICAgICAg
ICBHUFJSZWcganNWYWx1ZUdwciA9IGluZm8uZ3ByKCk7Ci0gICAgICAgIG1fZ3Bycy5sb2NrKGpz
VmFsdWVHcHIpOwotICAgICAgICBGUFJSZWcgZnByID0gZnByQWxsb2NhdGUoKTsKLSAgICAgICAg
R1BSUmVnIHRlbXBHcHIgPSBhbGxvY2F0ZSgpOyAvLyBGSVhNRTogY2FuIHdlIHNraXAgdGhpcyBh
bGxvY2F0aW9uIG9uIHRoZSBsYXN0IHVzZSBvZiB0aGUgdmlydHVhbCByZWdpc3Rlcj8KLQotICAg
ICAgICBKSVRDb21waWxlcjo6SnVtcCBpc0ludGVnZXIgPSBtX2ppdC5icmFuY2hQdHIoTWFjcm9B
c3NlbWJsZXI6OkFib3ZlT3JFcXVhbCwganNWYWx1ZUdwciwgR1BSSW5mbzo6dGFnVHlwZU51bWJl
clJlZ2lzdGVyKTsKLQotICAgICAgICBtX2ppdC5qaXRBc3NlcnRJc0pTRG91YmxlKGpzVmFsdWVH
cHIpOwotCi0gICAgICAgIC8vIEZpcnN0LCBpZiB3ZSBnZXQgaGVyZSB3ZSBoYXZlIGEgZG91Ymxl
IGVuY29kZWQgYXMgYSBKU1ZhbHVlCi0gICAgICAgIG1faml0Lm1vdmUoanNWYWx1ZUdwciwgdGVt
cEdwcik7Ci0gICAgICAgIHVuYm94RG91YmxlKHRlbXBHcHIsIGZwcik7Ci0gICAgICAgIEpJVENv
bXBpbGVyOjpKdW1wIGhhc1VuYm94ZWREb3VibGUgPSBtX2ppdC5qdW1wKCk7Ci0KLSAgICAgICAg
Ly8gRmluYWxseSwgaGFuZGxlIGludGVnZXJzLgotICAgICAgICBpc0ludGVnZXIubGluaygmbV9q
aXQpOwotICAgICAgICBtX2ppdC5jb252ZXJ0SW50MzJUb0RvdWJsZShqc1ZhbHVlR3ByLCBmcHIp
OwotICAgICAgICBoYXNVbmJveGVkRG91YmxlLmxpbmsoJm1faml0KTsKLQotICAgICAgICBtX2dw
cnMucmVsZWFzZShqc1ZhbHVlR3ByKTsKLSAgICAgICAgbV9ncHJzLnVubG9jayhqc1ZhbHVlR3By
KTsKLSAgICAgICAgbV9ncHJzLnVubG9jayh0ZW1wR3ByKTsKLSAgICAgICAgbV9mcHJzLnJldGFp
bihmcHIsIHZpcnR1YWxSZWdpc3RlciwgU3BpbGxPcmRlckRvdWJsZSk7Ci0gICAgICAgIGluZm8u
ZmlsbERvdWJsZShmcHIpOwotICAgICAgICBpbmZvLmtpbGxTcGlsbGVkKCk7Ci0gICAgICAgIHJl
dHVybiBmcHI7Ci0gICAgfQotCi0gICAgY2FzZSBEYXRhRm9ybWF0SlNJbnRlZ2VyOgotICAgIGNh
c2UgRGF0YUZvcm1hdEludGVnZXI6IHsKLSAgICAgICAgRlBSUmVnIGZwciA9IGZwckFsbG9jYXRl
KCk7Ci0gICAgICAgIEdQUlJlZyBncHIgPSBpbmZvLmdwcigpOwotICAgICAgICBtX2dwcnMubG9j
ayhncHIpOwotICAgICAgICBtX2ppdC5jb252ZXJ0SW50MzJUb0RvdWJsZShncHIsIGZwcik7Ci0g
ICAgICAgIG1fZ3Bycy51bmxvY2soZ3ByKTsKLSAgICAgICAgcmV0dXJuIGZwcjsKLSAgICB9Ci0K
LSAgICAvLyBVbmJveCB0aGUgZG91YmxlCi0gICAgY2FzZSBEYXRhRm9ybWF0SlNEb3VibGU6IHsK
LSAgICAgICAgR1BSUmVnIGdwciA9IGluZm8uZ3ByKCk7Ci0gICAgICAgIEZQUlJlZyBmcHIgPSBm
cHJBbGxvY2F0ZSgpOwotICAgICAgICBpZiAobV9ncHJzLmlzTG9ja2VkKGdwcikpIHsKLSAgICAg
ICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBkb24ndCB0cmFtcGxlIGdwciBpZiBpdCBpcyBpbiB1c2Uu
Ci0gICAgICAgICAgICBHUFJSZWcgdGVtcCA9IGFsbG9jYXRlKCk7Ci0gICAgICAgICAgICBtX2pp
dC5tb3ZlKGdwciwgdGVtcCk7Ci0gICAgICAgICAgICB1bmJveERvdWJsZSh0ZW1wLCBmcHIpOwot
ICAgICAgICAgICAgdW5sb2NrKHRlbXApOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIHVu
Ym94RG91YmxlKGdwciwgZnByKTsKLQotICAgICAgICBtX2dwcnMucmVsZWFzZShncHIpOwotICAg
ICAgICBtX2ZwcnMucmV0YWluKGZwciwgdmlydHVhbFJlZ2lzdGVyLCBTcGlsbE9yZGVyRG91Ymxl
KTsKLQotICAgICAgICBpbmZvLmZpbGxEb3VibGUoZnByKTsKLSAgICAgICAgcmV0dXJuIGZwcjsK
LSAgICB9Ci0KLSAgICBjYXNlIERhdGFGb3JtYXREb3VibGU6IHsKLSAgICAgICAgRlBSUmVnIGZw
ciA9IGluZm8uZnByKCk7Ci0gICAgICAgIG1fZnBycy5sb2NrKGZwcik7Ci0gICAgICAgIHJldHVy
biBmcHI7Ci0gICAgfQotICAgIH0KLQotICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgIHJl
dHVybiBJbnZhbGlkRlBSUmVnOwotfQotCi1HUFJSZWcgSklUQ29kZUdlbmVyYXRvcjo6ZmlsbEpT
VmFsdWUoTm9kZUluZGV4IG5vZGVJbmRleCkKLXsKLSAgICBOb2RlJiBub2RlID0gbV9qaXQuZ3Jh
cGgoKVtub2RlSW5kZXhdOwotICAgIFZpcnR1YWxSZWdpc3RlciB2aXJ0dWFsUmVnaXN0ZXIgPSBu
b2RlLnZpcnR1YWxSZWdpc3RlcigpOwotICAgIEdlbmVyYXRpb25JbmZvJiBpbmZvID0gbV9nZW5l
cmF0aW9uSW5mb1t2aXJ0dWFsUmVnaXN0ZXJdOwotCi0gICAgc3dpdGNoIChpbmZvLnJlZ2lzdGVy
Rm9ybWF0KCkpIHsKLSAgICBjYXNlIERhdGFGb3JtYXROb25lOiB7Ci0gICAgICAgIEdQUlJlZyBn
cHIgPSBhbGxvY2F0ZSgpOwotCi0gICAgICAgIGlmIChub2RlLmhhc0NvbnN0YW50KCkpIHsKLSAg
ICAgICAgICAgIGlmIChpc0ludDMyQ29uc3RhbnQobm9kZUluZGV4KSkgewotICAgICAgICAgICAg
ICAgIGluZm8uZmlsbEpTVmFsdWUoZ3ByLCBEYXRhRm9ybWF0SlNJbnRlZ2VyKTsKLSAgICAgICAg
ICAgICAgICBKU1ZhbHVlIGpzVmFsdWUgPSBqc051bWJlcih2YWx1ZU9mSW50MzJDb25zdGFudChu
b2RlSW5kZXgpKTsKLSAgICAgICAgICAgICAgICBtX2ppdC5tb3ZlKE1hY3JvQXNzZW1ibGVyOjpJ
bW1QdHIoSlNWYWx1ZTo6ZW5jb2RlKGpzVmFsdWUpKSwgZ3ByKTsKLSAgICAgICAgICAgIH0gZWxz
ZSBpZiAoaXNOdW1iZXJDb25zdGFudChub2RlSW5kZXgpKSB7Ci0gICAgICAgICAgICAgICAgaW5m
by5maWxsSlNWYWx1ZShncHIsIERhdGFGb3JtYXRKU0RvdWJsZSk7Ci0gICAgICAgICAgICAgICAg
SlNWYWx1ZSBqc1ZhbHVlKEpTVmFsdWU6OkVuY29kZUFzRG91YmxlLCB2YWx1ZU9mTnVtYmVyQ29u
c3RhbnQobm9kZUluZGV4KSk7Ci0gICAgICAgICAgICAgICAgbV9qaXQubW92ZShNYWNyb0Fzc2Vt
Ymxlcjo6SW1tUHRyKEpTVmFsdWU6OmVuY29kZShqc1ZhbHVlKSksIGdwcik7Ci0gICAgICAgICAg
ICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFTU0VSVChpc0pTQ29uc3RhbnQobm9kZUluZGV4
KSk7Ci0gICAgICAgICAgICAgICAgSlNWYWx1ZSBqc1ZhbHVlID0gdmFsdWVPZkpTQ29uc3RhbnQo
bm9kZUluZGV4KTsKLSAgICAgICAgICAgICAgICBtX2ppdC5tb3ZlKE1hY3JvQXNzZW1ibGVyOjpJ
bW1QdHIoSlNWYWx1ZTo6ZW5jb2RlKGpzVmFsdWUpKSwgZ3ByKTsKLSAgICAgICAgICAgICAgICBp
bmZvLmZpbGxKU1ZhbHVlKGdwciwgRGF0YUZvcm1hdEpTKTsKLSAgICAgICAgICAgIH0KLQotICAg
ICAgICAgICAgbV9ncHJzLnJldGFpbihncHIsIHZpcnR1YWxSZWdpc3RlciwgU3BpbGxPcmRlckNv
bnN0YW50KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIERhdGFGb3JtYXQgc3BpbGxG
b3JtYXQgPSBpbmZvLnNwaWxsRm9ybWF0KCk7Ci0gICAgICAgICAgICBBU1NFUlQoc3BpbGxGb3Jt
YXQgJiBEYXRhRm9ybWF0SlMpOwotICAgICAgICAgICAgbV9ncHJzLnJldGFpbihncHIsIHZpcnR1
YWxSZWdpc3RlciwgU3BpbGxPcmRlclNwaWxsZWQpOwotICAgICAgICAgICAgbV9qaXQubG9hZFB0
cihKSVRDb21waWxlcjo6YWRkcmVzc0Zvcih2aXJ0dWFsUmVnaXN0ZXIpLCBncHIpOwotICAgICAg
ICAgICAgaW5mby5maWxsSlNWYWx1ZShncHIsIG1faXNTcGVjdWxhdGl2ZSA/IHNwaWxsRm9ybWF0
IDogRGF0YUZvcm1hdEpTKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZ3ByOwotICAgIH0K
LQotICAgIGNhc2UgRGF0YUZvcm1hdEludGVnZXI6IHsKLSAgICAgICAgR1BSUmVnIGdwciA9IGlu
Zm8uZ3ByKCk7Ci0gICAgICAgIC8vIElmIHRoZSByZWdpc3RlciBoYXMgYWxyZWFkeSBiZWVuIGxv
Y2tlZCB3ZSBuZWVkIHRvIHRha2UgYSBjb3B5LgotICAgICAgICAvLyBJZiBub3QsIHdlJ2xsIHpl
cm8gZXh0ZW5kIGluIHBsYWNlLCBzbyBtYXJrIG9uIHRoZSBpbmZvIHRoYXQgdGhpcyBpcyBub3cg
dHlwZSBEYXRhRm9ybWF0SW50ZWdlciwgbm90IERhdGFGb3JtYXRKU0ludGVnZXIuCi0gICAgICAg
IGlmIChtX2dwcnMuaXNMb2NrZWQoZ3ByKSkgewotICAgICAgICAgICAgR1BSUmVnIHJlc3VsdCA9
IGFsbG9jYXRlKCk7Ci0gICAgICAgICAgICBtX2ppdC5vclB0cihHUFJJbmZvOjp0YWdUeXBlTnVt
YmVyUmVnaXN0ZXIsIGdwciwgcmVzdWx0KTsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0g
ICAgICAgIH0KLSAgICAgICAgbV9ncHJzLmxvY2soZ3ByKTsKLSAgICAgICAgbV9qaXQub3JQdHIo
R1BSSW5mbzo6dGFnVHlwZU51bWJlclJlZ2lzdGVyLCBncHIpOwotICAgICAgICBpbmZvLmZpbGxK
U1ZhbHVlKGdwciwgRGF0YUZvcm1hdEpTSW50ZWdlcik7Ci0gICAgICAgIHJldHVybiBncHI7Ci0g
ICAgfQotCi0gICAgY2FzZSBEYXRhRm9ybWF0RG91YmxlOiB7Ci0gICAgICAgIEZQUlJlZyBmcHIg
PSBpbmZvLmZwcigpOwotICAgICAgICBHUFJSZWcgZ3ByID0gYm94RG91YmxlKGZwcik7Ci0KLSAg
ICAgICAgLy8gVXBkYXRlIGFsbCBpbmZvCi0gICAgICAgIGluZm8uZmlsbEpTVmFsdWUoZ3ByLCBE
YXRhRm9ybWF0SlNEb3VibGUpOwotICAgICAgICBtX2ZwcnMucmVsZWFzZShmcHIpOwotICAgICAg
ICBtX2dwcnMucmV0YWluKGdwciwgdmlydHVhbFJlZ2lzdGVyLCBTcGlsbE9yZGVySlMpOwotCi0g
ICAgICAgIHJldHVybiBncHI7Ci0gICAgfQotCi0gICAgY2FzZSBEYXRhRm9ybWF0Q2VsbDoKLSAg
ICAgICAgLy8gTm8gcmV0YWcgcmVxdWlyZWQgb24gSlNWQUxVRTY0IQotICAgIGNhc2UgRGF0YUZv
cm1hdEpTOgotICAgIGNhc2UgRGF0YUZvcm1hdEpTSW50ZWdlcjoKLSAgICBjYXNlIERhdGFGb3Jt
YXRKU0RvdWJsZToKLSAgICBjYXNlIERhdGFGb3JtYXRKU0NlbGw6Ci0gICAgY2FzZSBEYXRhRm9y
bWF0SlNCb29sZWFuOiB7Ci0gICAgICAgIEdQUlJlZyBncHIgPSBpbmZvLmdwcigpOwotICAgICAg
ICBtX2dwcnMubG9jayhncHIpOwotICAgICAgICByZXR1cm4gZ3ByOwotICAgIH0KLSAgICAgICAg
Ci0gICAgY2FzZSBEYXRhRm9ybWF0Qm9vbGVhbjoKLSAgICBjYXNlIERhdGFGb3JtYXRTdG9yYWdl
OgotICAgICAgICAvLyB0aGlzIHR5cGUgY3VycmVudGx5IG5ldmVyIG9jY3VycwotICAgICAgICBB
U1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICB9Ci0KLSAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsK
LSAgICByZXR1cm4gSW52YWxpZEdQUlJlZzsKLX0KLQogR1BSUmVnIEpJVENvZGVHZW5lcmF0b3I6
OmZpbGxTdG9yYWdlKE5vZGVJbmRleCBub2RlSW5kZXgpCiB7CiAgICAgTm9kZSYgbm9kZSA9IG1f
aml0LmdyYXBoKClbbm9kZUluZGV4XTsKQEAgLTQ1Myw3MjggKzE2OSwyNiBAQCBib29sIEpJVENv
ZGVHZW5lcmF0b3I6OmlzS25vd25Ob3RJbnRlZ2VyCiBib29sIEpJVENvZGVHZW5lcmF0b3I6Omlz
S25vd25Ob3ROdW1iZXIoTm9kZUluZGV4IG5vZGVJbmRleCkKIHsKICAgICBOb2RlJiBub2RlID0g
bV9qaXQuZ3JhcGgoKVtub2RlSW5kZXhdOwotICAgIFZpcnR1YWxSZWdpc3RlciB2aXJ0dWFsUmVn
aXN0ZXIgPSBub2RlLnZpcnR1YWxSZWdpc3RlcigpOwotICAgIEdlbmVyYXRpb25JbmZvJiBpbmZv
ID0gbV9nZW5lcmF0aW9uSW5mb1t2aXJ0dWFsUmVnaXN0ZXJdOwotICAgIAotICAgIHJldHVybiAo
IWluZm8uaXNKU0RvdWJsZSgpICYmICFpbmZvLmlzSlNJbnRlZ2VyKCkgJiYgIWluZm8uaXNVbmtu
b3duSlMoKSkKLSAgICAgICAgfHwgKG5vZGUuaGFzQ29uc3RhbnQoKSAmJiAhaXNOdW1iZXJDb25z
dGFudChub2RlSW5kZXgpKTsKLX0KLQotYm9vbCBKSVRDb2RlR2VuZXJhdG9yOjppc0tub3duQm9v
bGVhbihOb2RlSW5kZXggbm9kZUluZGV4KQotewotICAgIE5vZGUmIG5vZGUgPSBtX2ppdC5ncmFw
aCgpW25vZGVJbmRleF07Ci0gICAgaWYgKG5vZGUuaGFzQm9vbGVhblJlc3VsdCgpKQotICAgICAg
ICByZXR1cm4gdHJ1ZTsKLSAgICAKLSAgICBpZiAoaXNCb29sZWFuQ29uc3RhbnQobm9kZUluZGV4
KSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgCi0gICAgVmlydHVhbFJlZ2lzdGVyIHZpcnR1
YWxSZWdpc3RlciA9IG5vZGUudmlydHVhbFJlZ2lzdGVyKCk7Ci0gICAgR2VuZXJhdGlvbkluZm8m
IGluZm8gPSBtX2dlbmVyYXRpb25JbmZvW3ZpcnR1YWxSZWdpc3Rlcl07Ci0gICAgCi0gICAgcmV0
dXJuIGluZm8uaXNKU0Jvb2xlYW4oKTsKLX0KLQotdm9pZCBKSVRDb2RlR2VuZXJhdG9yOjpub25T
cGVjdWxhdGl2ZVZhbHVlVG9OdW1iZXIoTm9kZSYgbm9kZSkKLXsKLSAgICBpZiAoaXNLbm93bk51
bWVyaWMobm9kZS5jaGlsZDEoKSkpIHsKLSAgICAgICAgSlNWYWx1ZU9wZXJhbmQgb3AxKHRoaXMs
IG5vZGUuY2hpbGQxKCkpOwotICAgICAgICBHUFJUZW1wb3JhcnkgcmVzdWx0KHRoaXMsIG9wMSk7
Ci0gICAgICAgIG1faml0Lm1vdmUob3AxLmdwcigpLCByZXN1bHQuZ3ByKCkpOwotICAgICAgICBq
c1ZhbHVlUmVzdWx0KHJlc3VsdC5ncHIoKSwgbV9jb21waWxlSW5kZXgpOwotICAgICAgICByZXR1
cm47Ci0gICAgfQotCi0gICAgSlNWYWx1ZU9wZXJhbmQgb3AxKHRoaXMsIG5vZGUuY2hpbGQxKCkp
OwotICAgIEdQUlRlbXBvcmFyeSByZXN1bHQodGhpcyk7Ci0gICAgCi0gICAgQVNTRVJUKCFpc0lu
dDMyQ29uc3RhbnQobm9kZS5jaGlsZDEoKSkpOwotICAgIEFTU0VSVCghaXNOdW1iZXJDb25zdGFu
dChub2RlLmNoaWxkMSgpKSk7Ci0gICAgCi0gICAgR1BSUmVnIGpzVmFsdWVHcHIgPSBvcDEuZ3By
KCk7Ci0gICAgR1BSUmVnIGdwciA9IHJlc3VsdC5ncHIoKTsKLSAgICBvcDEudXNlKCk7Ci0KLSAg
ICBKSVRDb21waWxlcjo6SnVtcCBpc0ludGVnZXIgPSBtX2ppdC5icmFuY2hQdHIoTWFjcm9Bc3Nl
bWJsZXI6OkFib3ZlT3JFcXVhbCwganNWYWx1ZUdwciwgR1BSSW5mbzo6dGFnVHlwZU51bWJlclJl
Z2lzdGVyKTsKLSAgICBKSVRDb21waWxlcjo6SnVtcCBub25OdW1lcmljID0gbV9qaXQuYnJhbmNo
VGVzdFB0cihNYWNyb0Fzc2VtYmxlcjo6WmVybywganNWYWx1ZUdwciwgR1BSSW5mbzo6dGFnVHlw
ZU51bWJlclJlZ2lzdGVyKTsKLQotICAgIC8vIEZpcnN0LCBpZiB3ZSBnZXQgaGVyZSB3ZSBoYXZl
IGEgZG91YmxlIGVuY29kZWQgYXMgYSBKU1ZhbHVlCi0gICAgbV9qaXQubW92ZShqc1ZhbHVlR3By
LCBncHIpOwotICAgIEpJVENvbXBpbGVyOjpKdW1wIGhhc1VuYm94ZWREb3VibGUgPSBtX2ppdC5q
dW1wKCk7Ci0KLSAgICAvLyBOZXh0IGhhbmRsZSBjZWxscyAoJiBvdGhlciBKUyBpbW1lZGlhdGVz
KQotICAgIG5vbk51bWVyaWMubGluaygmbV9qaXQpOwotICAgIHNpbGVudFNwaWxsQWxsUmVnaXN0
ZXJzKGdwcik7Ci0gICAgbV9qaXQubW92ZShqc1ZhbHVlR3ByLCBHUFJJbmZvOjphcmd1bWVudEdQ
UjEpOwotICAgIG1faml0Lm1vdmUoR1BSSW5mbzo6Y2FsbEZyYW1lUmVnaXN0ZXIsIEdQUkluZm86
OmFyZ3VtZW50R1BSMCk7Ci0gICAgYXBwZW5kQ2FsbFdpdGhFeGNlcHRpb25DaGVjayhkZmdDb252
ZXJ0SlNWYWx1ZVRvTnVtYmVyKTsKLSAgICBib3hEb3VibGUoRlBSSW5mbzo6cmV0dXJuVmFsdWVG
UFIsIGdwcik7Ci0gICAgc2lsZW50RmlsbEFsbFJlZ2lzdGVycyhncHIpOwotICAgIEpJVENvbXBp
bGVyOjpKdW1wIGhhc0NhbGxlZFRvTnVtYmVyID0gbV9qaXQuanVtcCgpOwotICAgIAotICAgIC8v
IEZpbmFsbHksIGhhbmRsZSBpbnRlZ2Vycy4KLSAgICBpc0ludGVnZXIubGluaygmbV9qaXQpOwot
ICAgIG1faml0Lm9yUHRyKEdQUkluZm86OnRhZ1R5cGVOdW1iZXJSZWdpc3RlciwganNWYWx1ZUdw
ciwgZ3ByKTsKLSAgICBoYXNVbmJveGVkRG91YmxlLmxpbmsoJm1faml0KTsKLSAgICBoYXNDYWxs
ZWRUb051bWJlci5saW5rKCZtX2ppdCk7Ci0gICAgCi0gICAganNWYWx1ZVJlc3VsdChyZXN1bHQu
Z3ByKCksIG1fY29tcGlsZUluZGV4LCBVc2VDaGlsZHJlbkNhbGxlZEV4cGxpY2l0bHkpOwotfQot
Ci12b2lkIEpJVENvZGVHZW5lcmF0b3I6Om5vblNwZWN1bGF0aXZlVmFsdWVUb0ludDMyKE5vZGUm
IG5vZGUpCi17Ci0gICAgQVNTRVJUKCFpc0ludDMyQ29uc3RhbnQobm9kZS5jaGlsZDEoKSkpOwot
ICAgIAotICAgIGlmIChpc0tub3duSW50ZWdlcihub2RlLmNoaWxkMSgpKSkgewotICAgICAgICBJ
bnRlZ2VyT3BlcmFuZCBvcDEodGhpcywgbm9kZS5jaGlsZDEoKSk7Ci0gICAgICAgIEdQUlRlbXBv
cmFyeSByZXN1bHQodGhpcywgb3AxKTsKLSAgICAgICAgbV9qaXQubW92ZShvcDEuZ3ByKCksIHJl
c3VsdC5ncHIoKSk7Ci0gICAgICAgIGludGVnZXJSZXN1bHQocmVzdWx0LmdwcigpLCBtX2NvbXBp
bGVJbmRleCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgCi0gICAgR2VuZXJhdGlvbklu
Zm8mIGNoaWxkSW5mbyA9IG1fZ2VuZXJhdGlvbkluZm9bbV9qaXQuZ3JhcGgoKVtub2RlLmNoaWxk
MSgpXS52aXJ0dWFsUmVnaXN0ZXIoKV07Ci0gICAgaWYgKGlzSlNEb3VibGUoY2hpbGRJbmZvLnJl
Z2lzdGVyRm9ybWF0KCkpKSB7Ci0gICAgICAgIERvdWJsZU9wZXJhbmQgb3AxKHRoaXMsIG5vZGUu
Y2hpbGQxKCkpOwotICAgICAgICBHUFJUZW1wb3JhcnkgcmVzdWx0KHRoaXMpOwotICAgICAgICBG
UFJSZWcgZnByID0gb3AxLmZwcigpOwotICAgICAgICBHUFJSZWcgZ3ByID0gcmVzdWx0Lmdwcigp
OwotICAgICAgICBvcDEudXNlKCk7Ci0gICAgICAgIEpJVENvbXBpbGVyOjpKdW1wIHRydW5jYXRl
ZFRvSW50ZWdlciA9IG1faml0LmJyYW5jaFRydW5jYXRlRG91YmxlVG9JbnQzMihmcHIsIGdwciwg
SklUQ29tcGlsZXI6OkJyYW5jaElmVHJ1bmNhdGVTdWNjZXNzZnVsKTsKLSAgICAgICAgCi0gICAg
ICAgIHNpbGVudFNwaWxsQWxsUmVnaXN0ZXJzKGdwcik7Ci0gICAgICAgIAotICAgICAgICBtX2pp
dC5tb3ZlRG91YmxlKGZwciwgRlBSSW5mbzo6YXJndW1lbnRGUFIwKTsKLSAgICAgICAgYXBwZW5k
Q2FsbFdpdGhFeGNlcHRpb25DaGVjayh0b0ludDMyKTsKLSAgICAgICAgbV9qaXQuemVyb0V4dGVu
ZDMyVG9QdHIoR1BSSW5mbzo6cmV0dXJuVmFsdWVHUFIsIGdwcik7Ci0gICAgICAgIAotICAgICAg
ICBzaWxlbnRGaWxsQWxsUmVnaXN0ZXJzKGdwcik7Ci0gICAgICAgIAotICAgICAgICB0cnVuY2F0
ZWRUb0ludGVnZXIubGluaygmbV9qaXQpOwotICAgICAgICBpbnRlZ2VyUmVzdWx0KGdwciwgbV9j
b21waWxlSW5kZXgsIFVzZUNoaWxkcmVuQ2FsbGVkRXhwbGljaXRseSk7Ci0gICAgICAgIHJldHVy
bjsKLSAgICB9Ci0gICAgCi0gICAgSlNWYWx1ZU9wZXJhbmQgb3AxKHRoaXMsIG5vZGUuY2hpbGQx
KCkpOwotICAgIEdQUlRlbXBvcmFyeSByZXN1bHQodGhpcywgb3AxKTsKLSAgICBHUFJSZWcganNW
YWx1ZUdwciA9IG9wMS5ncHIoKTsKLSAgICBHUFJSZWcgcmVzdWx0R1BSID0gcmVzdWx0Lmdwcigp
OwotICAgIG9wMS51c2UoKTsKLQotICAgIEpJVENvbXBpbGVyOjpKdW1wIGlzSW50ZWdlciA9IG1f
aml0LmJyYW5jaFB0cihNYWNyb0Fzc2VtYmxlcjo6QWJvdmVPckVxdWFsLCBqc1ZhbHVlR3ByLCBH
UFJJbmZvOjp0YWdUeXBlTnVtYmVyUmVnaXN0ZXIpOwotCi0gICAgLy8gRmlyc3QgaGFuZGxlIG5v
bi1pbnRlZ2VycwotICAgIHNpbGVudFNwaWxsQWxsUmVnaXN0ZXJzKHJlc3VsdEdQUik7Ci0gICAg
bV9qaXQubW92ZShqc1ZhbHVlR3ByLCBHUFJJbmZvOjphcmd1bWVudEdQUjEpOwotICAgIG1faml0
Lm1vdmUoR1BSSW5mbzo6Y2FsbEZyYW1lUmVnaXN0ZXIsIEdQUkluZm86OmFyZ3VtZW50R1BSMCk7
Ci0gICAgYXBwZW5kQ2FsbFdpdGhFeGNlcHRpb25DaGVjayhkZmdDb252ZXJ0SlNWYWx1ZVRvSW50
MzIpOwotICAgIG1faml0Lnplcm9FeHRlbmQzMlRvUHRyKEdQUkluZm86OnJldHVyblZhbHVlR1BS
LCByZXN1bHRHUFIpOwotICAgIHNpbGVudEZpbGxBbGxSZWdpc3RlcnMocmVzdWx0R1BSKTsKLSAg
ICBKSVRDb21waWxlcjo6SnVtcCBoYXNDYWxsZWRUb0ludDMyID0gbV9qaXQuanVtcCgpOwotCi0g
ICAgLy8gVGhlbiBoYW5kbGUgaW50ZWdlcnMuCi0gICAgaXNJbnRlZ2VyLmxpbmsoJm1faml0KTsK
LSAgICBtX2ppdC56ZXJvRXh0ZW5kMzJUb1B0cihqc1ZhbHVlR3ByLCByZXN1bHRHUFIpOwotICAg
IGhhc0NhbGxlZFRvSW50MzIubGluaygmbV9qaXQpOwotICAgIGludGVnZXJSZXN1bHQocmVzdWx0
R1BSLCBtX2NvbXBpbGVJbmRleCwgVXNlQ2hpbGRyZW5DYWxsZWRFeHBsaWNpdGx5KTsKLX0KLQot
dm9pZCBKSVRDb2RlR2VuZXJhdG9yOjpub25TcGVjdWxhdGl2ZVVJbnQzMlRvTnVtYmVyKE5vZGUm
IG5vZGUpCi17Ci0gICAgSW50ZWdlck9wZXJhbmQgb3AxKHRoaXMsIG5vZGUuY2hpbGQxKCkpOwot
ICAgIEZQUlRlbXBvcmFyeSBib3hlcih0aGlzKTsKLSAgICBHUFJUZW1wb3JhcnkgcmVzdWx0KHRo
aXMsIG9wMSk7Ci0gICAgCi0gICAgSklUQ29tcGlsZXI6Okp1bXAgcG9zaXRpdmUgPSBtX2ppdC5i
cmFuY2gzMihNYWNyb0Fzc2VtYmxlcjo6R3JlYXRlclRoYW5PckVxdWFsLCBvcDEuZ3ByKCksIFRy
dXN0ZWRJbW0zMigwKSk7Ci0gICAgCi0gICAgbV9qaXQuY29udmVydEludDMyVG9Eb3VibGUob3Ax
LmdwcigpLCBib3hlci5mcHIoKSk7Ci0gICAgbV9qaXQuYWRkRG91YmxlKEpJVENvbXBpbGVyOjpB
YnNvbHV0ZUFkZHJlc3MoJnR3b1RvVGhlMzIpLCBib3hlci5mcHIoKSk7Ci0gICAgCi0gICAgYm94
RG91YmxlKGJveGVyLmZwcigpLCByZXN1bHQuZ3ByKCkpOwotICAgIAotICAgIEpJVENvbXBpbGVy
OjpKdW1wIGRvbmUgPSBtX2ppdC5qdW1wKCk7Ci0gICAgCi0gICAgcG9zaXRpdmUubGluaygmbV9q
aXQpOwotICAgIAotICAgIG1faml0Lm9yUHRyKEdQUkluZm86OnRhZ1R5cGVOdW1iZXJSZWdpc3Rl
ciwgb3AxLmdwcigpLCByZXN1bHQuZ3ByKCkpOwotICAgIAotICAgIGRvbmUubGluaygmbV9qaXQp
OwotICAgIAotICAgIGpzVmFsdWVSZXN1bHQocmVzdWx0LmdwcigpLCBtX2NvbXBpbGVJbmRleCk7
Ci19Ci0KLXZvaWQgSklUQ29kZUdlbmVyYXRvcjo6bm9uU3BlY3VsYXRpdmVLbm93bkNvbnN0YW50
QXJpdGhPcChOb2RlVHlwZSBvcCwgTm9kZUluZGV4IHJlZ0NoaWxkLCBOb2RlSW5kZXggaW1tQ2hp
bGQsIGJvb2wgY29tbXV0ZSkKLXsKLSAgICBKU1ZhbHVlT3BlcmFuZCByZWdBcmcodGhpcywgcmVn
Q2hpbGQpOwotICAgIEdQUlJlZyByZWdBcmdHUFIgPSByZWdBcmcuZ3ByKCk7Ci0gICAgR1BSVGVt
cG9yYXJ5IHJlc3VsdCh0aGlzKTsKLSAgICBHUFJSZWcgcmVzdWx0R1BSID0gcmVzdWx0Lmdwcigp
OwotICAgIEZQUlRlbXBvcmFyeSB0bXAxKHRoaXMpOwotICAgIEZQUlRlbXBvcmFyeSB0bXAyKHRo
aXMpOwotICAgIEZQUlJlZyB0bXAxRlBSID0gdG1wMS5mcHIoKTsKLSAgICBGUFJSZWcgdG1wMkZQ
UiA9IHRtcDIuZnByKCk7Ci0gICAgCi0gICAgcmVnQXJnLnVzZSgpOwotICAgIHVzZShpbW1DaGls
ZCk7Ci0KLSAgICBKSVRDb21waWxlcjo6SnVtcCBub3RJbnQ7Ci0gICAgCi0gICAgaW50MzJfdCBp
bW0gPSB2YWx1ZU9mSW50MzJDb25zdGFudChpbW1DaGlsZCk7Ci0gICAgICAgIAotICAgIGlmICgh
aXNLbm93bkludGVnZXIocmVnQ2hpbGQpKQotICAgICAgICBub3RJbnQgPSBtX2ppdC5icmFuY2hQ
dHIoTWFjcm9Bc3NlbWJsZXI6OkJlbG93LCByZWdBcmdHUFIsIEdQUkluZm86OnRhZ1R5cGVOdW1i
ZXJSZWdpc3Rlcik7Ci0gICAgCi0gICAgSklUQ29tcGlsZXI6Okp1bXAgb3ZlcmZsb3c7Ci0gICAg
Ci0gICAgc3dpdGNoIChvcCkgewotICAgIGNhc2UgVmFsdWVBZGQ6Ci0gICAgY2FzZSBBcml0aEFk
ZDoKLSAgICAgICAgb3ZlcmZsb3cgPSBtX2ppdC5icmFuY2hBZGQzMihNYWNyb0Fzc2VtYmxlcjo6
T3ZlcmZsb3csIHJlZ0FyZ0dQUiwgSW1tMzIoaW1tKSwgcmVzdWx0R1BSKTsKLSAgICAgICAgYnJl
YWs7Ci0gICAgICAgIAotICAgIGNhc2UgQXJpdGhTdWI6Ci0gICAgICAgIG92ZXJmbG93ID0gbV9q
aXQuYnJhbmNoU3ViMzIoTWFjcm9Bc3NlbWJsZXI6Ok92ZXJmbG93LCByZWdBcmdHUFIsIEltbTMy
KGltbSksIHJlc3VsdEdQUik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgICAKLSAgICBkZWZhdWx0
OgotICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICB9Ci0gICAgCi0gICAgbV9qaXQu
b3JQdHIoR1BSSW5mbzo6dGFnVHlwZU51bWJlclJlZ2lzdGVyLCByZXN1bHRHUFIpOwotICAgICAg
ICAKLSAgICBKSVRDb21waWxlcjo6SnVtcCBkb25lID0gbV9qaXQuanVtcCgpOwotICAgIAotICAg
IG92ZXJmbG93LmxpbmsoJm1faml0KTsKLSAgICAKLSAgICBKSVRDb21waWxlcjo6SnVtcCBub3RO
dW1iZXI7Ci0gICAgCi0gICAgLy8gZmlyc3QgZGVhbCB3aXRoIG92ZXJmbG93IGNhc2UKLSAgICBt
X2ppdC5jb252ZXJ0SW50MzJUb0RvdWJsZShyZWdBcmdHUFIsIHRtcDJGUFIpOwotICAgIAotICAg
IC8vIG5vdyBkZWFsIHdpdGggbm90LWludCBjYXNlLCBpZiBhcHBsaWNhYmxlCi0gICAgaWYgKCFp
c0tub3duSW50ZWdlcihyZWdDaGlsZCkpIHsKLSAgICAgICAgSklUQ29tcGlsZXI6Okp1bXAgaGF2
ZVZhbHVlID0gbV9qaXQuanVtcCgpOwotICAgICAgICAKLSAgICAgICAgbm90SW50LmxpbmsoJm1f
aml0KTsKLSAgICAgICAgCi0gICAgICAgIGlmICghaXNLbm93bk51bWVyaWMocmVnQ2hpbGQpKSB7
Ci0gICAgICAgICAgICBBU1NFUlQob3AgPT0gVmFsdWVBZGQpOwotICAgICAgICAgICAgbm90TnVt
YmVyID0gbV9qaXQuYnJhbmNoVGVzdFB0cihNYWNyb0Fzc2VtYmxlcjo6WmVybywgcmVnQXJnR1BS
LCBHUFJJbmZvOjp0YWdUeXBlTnVtYmVyUmVnaXN0ZXIpOwotICAgICAgICB9Ci0gICAgICAgIAot
ICAgICAgICBtX2ppdC5tb3ZlKHJlZ0FyZ0dQUiwgcmVzdWx0R1BSKTsKLSAgICAgICAgbV9qaXQu
YWRkUHRyKEdQUkluZm86OnRhZ1R5cGVOdW1iZXJSZWdpc3RlciwgcmVzdWx0R1BSKTsKLSAgICAg
ICAgbV9qaXQubW92ZVB0clRvRG91YmxlKHJlc3VsdEdQUiwgdG1wMkZQUik7Ci0gICAgICAgIAot
ICAgICAgICBoYXZlVmFsdWUubGluaygmbV9qaXQpOwotICAgIH0KLSAgICAKLSAgICBtX2ppdC5t
b3ZlKE1hY3JvQXNzZW1ibGVyOjpJbW1QdHIocmVpbnRlcnByZXRfY2FzdDx2b2lkKj4ocmVpbnRl
cnByZXREb3VibGVUb0ludHB0cih2YWx1ZU9mTnVtYmVyQ29uc3RhbnQoaW1tQ2hpbGQpKSkpLCBy
ZXN1bHRHUFIpOwotICAgIG1faml0Lm1vdmVQdHJUb0RvdWJsZShyZXN1bHRHUFIsIHRtcDFGUFIp
OwotICAgIHN3aXRjaCAob3ApIHsKLSAgICBjYXNlIFZhbHVlQWRkOgotICAgIGNhc2UgQXJpdGhB
ZGQ6Ci0gICAgICAgIG1faml0LmFkZERvdWJsZSh0bXAxRlBSLCB0bXAyRlBSKTsKLSAgICAgICAg
YnJlYWs7Ci0gICAgICAgIAotICAgIGNhc2UgQXJpdGhTdWI6Ci0gICAgICAgIG1faml0LnN1YkRv
dWJsZSh0bXAxRlBSLCB0bXAyRlBSKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAKLSAg
ICBkZWZhdWx0OgotICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICB9Ci0gICAgCi0g
ICAgSklUQ29tcGlsZXI6Okp1bXAgZG9uZUNhc2VDb252ZXJ0ZWRUb0ludDsKLSAgICAKLSAgICBp
ZiAob3AgPT0gVmFsdWVBZGQpIHsKLSAgICAgICAgSklUQ29tcGlsZXI6Okp1bXBMaXN0IGZhaWx1
cmVDYXNlczsKLSAgICAgICAgbV9qaXQuYnJhbmNoQ29udmVydERvdWJsZVRvSW50MzIodG1wMkZQ
UiwgcmVzdWx0R1BSLCBmYWlsdXJlQ2FzZXMsIHRtcDFGUFIpOwotICAgICAgICBtX2ppdC5vclB0
cihHUFJJbmZvOjp0YWdUeXBlTnVtYmVyUmVnaXN0ZXIsIHJlc3VsdEdQUik7Ci0gICAgICAgIAot
ICAgICAgICBkb25lQ2FzZUNvbnZlcnRlZFRvSW50ID0gbV9qaXQuanVtcCgpOwotICAgICAgICAK
LSAgICAgICAgZmFpbHVyZUNhc2VzLmxpbmsoJm1faml0KTsKLSAgICB9Ci0gICAgCi0gICAgbV9q
aXQubW92ZURvdWJsZVRvUHRyKHRtcDJGUFIsIHJlc3VsdEdQUik7Ci0gICAgbV9qaXQuc3ViUHRy
KEdQUkluZm86OnRhZ1R5cGVOdW1iZXJSZWdpc3RlciwgcmVzdWx0R1BSKTsKLSAgICAgICAgCi0g
ICAgaWYgKCFpc0tub3duTnVtZXJpYyhyZWdDaGlsZCkpIHsKLSAgICAgICAgQVNTRVJUKG5vdE51
bWJlci5pc1NldCgpKTsKLSAgICAgICAgQVNTRVJUKG9wID09IFZhbHVlQWRkKTsKLSAgICAgICAg
ICAgIAotICAgICAgICBKSVRDb21waWxlcjo6SnVtcCBkb25lQ2FzZVdhc051bWJlciA9IG1faml0
Lmp1bXAoKTsKLSAgICAgICAgICAgIAotICAgICAgICBub3ROdW1iZXIubGluaygmbV9qaXQpOwot
ICAgICAgICAgICAgCi0gICAgICAgIHNpbGVudFNwaWxsQWxsUmVnaXN0ZXJzKHJlc3VsdEdQUik7
Ci0gICAgICAgIGlmIChjb21tdXRlKSB7Ci0gICAgICAgICAgICBtX2ppdC5tb3ZlKHJlZ0FyZ0dQ
UiwgR1BSSW5mbzo6YXJndW1lbnRHUFIyKTsKLSAgICAgICAgICAgIG1faml0Lm1vdmUoTWFjcm9B
c3NlbWJsZXI6OkltbVB0cihzdGF0aWNfY2FzdDxjb25zdCB2b2lkKj4oSlNWYWx1ZTo6ZW5jb2Rl
KGpzTnVtYmVyKGltbSkpKSksIEdQUkluZm86OmFyZ3VtZW50R1BSMSk7Ci0gICAgICAgIH0gZWxz
ZSB7Ci0gICAgICAgICAgICBtX2ppdC5tb3ZlKHJlZ0FyZ0dQUiwgR1BSSW5mbzo6YXJndW1lbnRH
UFIxKTsKLSAgICAgICAgICAgIG1faml0Lm1vdmUoTWFjcm9Bc3NlbWJsZXI6OkltbVB0cihzdGF0
aWNfY2FzdDxjb25zdCB2b2lkKj4oSlNWYWx1ZTo6ZW5jb2RlKGpzTnVtYmVyKGltbSkpKSksIEdQ
UkluZm86OmFyZ3VtZW50R1BSMik7Ci0gICAgICAgIH0KLSAgICAgICAgbV9qaXQubW92ZShHUFJJ
bmZvOjpjYWxsRnJhbWVSZWdpc3RlciwgR1BSSW5mbzo6YXJndW1lbnRHUFIwKTsKLSAgICAgICAg
YXBwZW5kQ2FsbFdpdGhFeGNlcHRpb25DaGVjayhvcGVyYXRpb25WYWx1ZUFkZE5vdE51bWJlcik7
Ci0gICAgICAgIG1faml0Lm1vdmUoR1BSSW5mbzo6cmV0dXJuVmFsdWVHUFIsIHJlc3VsdEdQUik7
Ci0gICAgICAgIHNpbGVudEZpbGxBbGxSZWdpc3RlcnMocmVzdWx0R1BSKTsKLSAgICAgICAgICAg
IAotICAgICAgICBkb25lQ2FzZVdhc051bWJlci5saW5rKCZtX2ppdCk7Ci0gICAgfQotICAgIAot
ICAgIGRvbmUubGluaygmbV9qaXQpOwotICAgIGlmIChkb25lQ2FzZUNvbnZlcnRlZFRvSW50Lmlz
U2V0KCkpCi0gICAgICAgIGRvbmVDYXNlQ29udmVydGVkVG9JbnQubGluaygmbV9qaXQpOwotICAg
ICAgICAKLSAgICBqc1ZhbHVlUmVzdWx0KHJlc3VsdEdQUiwgbV9jb21waWxlSW5kZXgsIFVzZUNo
aWxkcmVuQ2FsbGVkRXhwbGljaXRseSk7Ci19Ci0KLXZvaWQgSklUQ29kZUdlbmVyYXRvcjo6bm9u
U3BlY3VsYXRpdmVCYXNpY0FyaXRoT3AoTm9kZVR5cGUgb3AsIE5vZGUgJm5vZGUpCi17Ci0gICAg
SlNWYWx1ZU9wZXJhbmQgYXJnMSh0aGlzLCBub2RlLmNoaWxkMSgpKTsKLSAgICBKU1ZhbHVlT3Bl
cmFuZCBhcmcyKHRoaXMsIG5vZGUuY2hpbGQyKCkpOwotICAgIAotICAgIEZQUlRlbXBvcmFyeSB0
bXAxKHRoaXMpOwotICAgIEZQUlRlbXBvcmFyeSB0bXAyKHRoaXMpOwotICAgIEZQUlJlZyB0bXAx
RlBSID0gdG1wMS5mcHIoKTsKLSAgICBGUFJSZWcgdG1wMkZQUiA9IHRtcDIuZnByKCk7Ci0gICAg
Ci0gICAgR1BSVGVtcG9yYXJ5IHJlc3VsdCh0aGlzKTsKLQotICAgIEdQUlJlZyBhcmcxR1BSID0g
YXJnMS5ncHIoKTsKLSAgICBHUFJSZWcgYXJnMkdQUiA9IGFyZzIuZ3ByKCk7Ci0gICAgCi0gICAg
R1BSUmVnIHJlc3VsdEdQUiA9IHJlc3VsdC5ncHIoKTsKLSAgICAKLSAgICBhcmcxLnVzZSgpOwot
ICAgIGFyZzIudXNlKCk7Ci0gICAgCi0gICAgSklUQ29tcGlsZXI6Okp1bXAgY2hpbGQxTm90SW50
OwotICAgIEpJVENvbXBpbGVyOjpKdW1wIGNoaWxkMk5vdEludDsKLSAgICBKSVRDb21waWxlcjo6
SnVtcExpc3Qgb3ZlcmZsb3c7Ci0gICAgCi0gICAgaWYgKCFpc0tub3duSW50ZWdlcihub2RlLmNo
aWxkMSgpKSkKLSAgICAgICAgY2hpbGQxTm90SW50ID0gbV9qaXQuYnJhbmNoUHRyKE1hY3JvQXNz
ZW1ibGVyOjpCZWxvdywgYXJnMUdQUiwgR1BSSW5mbzo6dGFnVHlwZU51bWJlclJlZ2lzdGVyKTsK
LSAgICBpZiAoIWlzS25vd25JbnRlZ2VyKG5vZGUuY2hpbGQyKCkpKQotICAgICAgICBjaGlsZDJO
b3RJbnQgPSBtX2ppdC5icmFuY2hQdHIoTWFjcm9Bc3NlbWJsZXI6OkJlbG93LCBhcmcyR1BSLCBH
UFJJbmZvOjp0YWdUeXBlTnVtYmVyUmVnaXN0ZXIpOwotICAgIAotICAgIHN3aXRjaCAob3ApIHsK
LSAgICBjYXNlIFZhbHVlQWRkOgotICAgIGNhc2UgQXJpdGhBZGQ6IHsKLSAgICAgICAgb3ZlcmZs
b3cuYXBwZW5kKG1faml0LmJyYW5jaEFkZDMyKE1hY3JvQXNzZW1ibGVyOjpPdmVyZmxvdywgYXJn
MUdQUiwgYXJnMkdQUiwgcmVzdWx0R1BSKSk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICAg
ICAgCi0gICAgY2FzZSBBcml0aFN1YjogewotICAgICAgICBvdmVyZmxvdy5hcHBlbmQobV9qaXQu
YnJhbmNoU3ViMzIoTWFjcm9Bc3NlbWJsZXI6Ok92ZXJmbG93LCBhcmcxR1BSLCBhcmcyR1BSLCBy
ZXN1bHRHUFIpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgICAgICAKLSAgICBjYXNlIEFy
aXRoTXVsOiB7Ci0gICAgICAgIG92ZXJmbG93LmFwcGVuZChtX2ppdC5icmFuY2hNdWwzMihNYWNy
b0Fzc2VtYmxlcjo6T3ZlcmZsb3csIGFyZzFHUFIsIGFyZzJHUFIsIHJlc3VsdEdQUikpOwotICAg
ICAgICBvdmVyZmxvdy5hcHBlbmQobV9qaXQuYnJhbmNoVGVzdDMyKE1hY3JvQXNzZW1ibGVyOjpa
ZXJvLCByZXN1bHRHUFIpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgICAgICAKLSAgICBk
ZWZhdWx0OgotICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICB9Ci0gICAgCi0gICAg
bV9qaXQub3JQdHIoR1BSSW5mbzo6dGFnVHlwZU51bWJlclJlZ2lzdGVyLCByZXN1bHRHUFIpOwot
ICAgICAgICAKLSAgICBKSVRDb21waWxlcjo6SnVtcCBkb25lID0gbV9qaXQuanVtcCgpOwotICAg
IAotICAgIEpJVENvbXBpbGVyOjpKdW1wTGlzdCBoYXZlRlBSQXJndW1lbnRzOwotCi0gICAgb3Zl
cmZsb3cubGluaygmbV9qaXQpOwotICAgICAgICAKLSAgICAvLyBib3RoIGFyZ3VtZW50cyBhcmUg
aW50ZWdlcnMKLSAgICBtX2ppdC5jb252ZXJ0SW50MzJUb0RvdWJsZShhcmcxR1BSLCB0bXAxRlBS
KTsKLSAgICBtX2ppdC5jb252ZXJ0SW50MzJUb0RvdWJsZShhcmcyR1BSLCB0bXAyRlBSKTsKLSAg
ICAgICAgCi0gICAgaGF2ZUZQUkFyZ3VtZW50cy5hcHBlbmQobV9qaXQuanVtcCgpKTsKLSAgICAg
ICAgCi0gICAgSklUQ29tcGlsZXI6Okp1bXBMaXN0IG5vdE51bWJlcnM7Ci0gICAgICAgIAotICAg
IEpJVENvbXBpbGVyOjpKdW1wIGNoaWxkMk5vdEludDI7Ci0gICAgICAgIAotICAgIGlmICghaXNL
bm93bkludGVnZXIobm9kZS5jaGlsZDEoKSkpIHsKLSAgICAgICAgY2hpbGQxTm90SW50Lmxpbmso
Jm1faml0KTsKLSAgICAgICAgICAgIAotICAgICAgICBpZiAoIWlzS25vd25OdW1lcmljKG5vZGUu
Y2hpbGQxKCkpKSB7Ci0gICAgICAgICAgICBBU1NFUlQob3AgPT0gVmFsdWVBZGQpOwotICAgICAg
ICAgICAgbm90TnVtYmVycy5hcHBlbmQobV9qaXQuYnJhbmNoVGVzdFB0cihNYWNyb0Fzc2VtYmxl
cjo6WmVybywgYXJnMUdQUiwgR1BSSW5mbzo6dGFnVHlwZU51bWJlclJlZ2lzdGVyKSk7Ci0gICAg
ICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICBtX2ppdC5tb3ZlKGFyZzFHUFIsIHJlc3VsdEdQ
Uik7Ci0gICAgICAgIHVuYm94RG91YmxlKHJlc3VsdEdQUiwgdG1wMUZQUik7Ci0gICAgICAgICAg
ICAKLSAgICAgICAgLy8gY2hpbGQxIGlzIGNvbnZlcnRlZCB0byBhIGRvdWJsZTsgY2hpbGQyIG1h
eSBlaXRoZXIgYmUgYW4gaW50IG9yCi0gICAgICAgIC8vIGEgYm94ZWQgZG91YmxlCi0gICAgICAg
ICAgICAKLSAgICAgICAgaWYgKCFpc0tub3duSW50ZWdlcihub2RlLmNoaWxkMigpKSkgewotICAg
ICAgICAgICAgaWYgKGlzS25vd25OdW1lcmljKG5vZGUuY2hpbGQyKCkpKQotICAgICAgICAgICAg
ICAgIGNoaWxkMk5vdEludDIgPSBtX2ppdC5icmFuY2hQdHIoTWFjcm9Bc3NlbWJsZXI6OkJlbG93
LCBhcmcyR1BSLCBHUFJJbmZvOjp0YWdUeXBlTnVtYmVyUmVnaXN0ZXIpOwotICAgICAgICAgICAg
ZWxzZSB7Ci0gICAgICAgICAgICAgICAgQVNTRVJUKG9wID09IFZhbHVlQWRkKTsKLSAgICAgICAg
ICAgICAgICBKSVRDb21waWxlcjo6SnVtcCBjaGlsZDJJc0ludCA9IG1faml0LmJyYW5jaFB0cihN
YWNyb0Fzc2VtYmxlcjo6QWJvdmVPckVxdWFsLCBhcmcyR1BSLCBHUFJJbmZvOjp0YWdUeXBlTnVt
YmVyUmVnaXN0ZXIpOwotICAgICAgICAgICAgICAgIG5vdE51bWJlcnMuYXBwZW5kKG1faml0LmJy
YW5jaFRlc3RQdHIoTWFjcm9Bc3NlbWJsZXI6Olplcm8sIGFyZzJHUFIsIEdQUkluZm86OnRhZ1R5
cGVOdW1iZXJSZWdpc3RlcikpOwotICAgICAgICAgICAgICAgIGNoaWxkMk5vdEludDIgPSBtX2pp
dC5qdW1wKCk7Ci0gICAgICAgICAgICAgICAgY2hpbGQySXNJbnQubGluaygmbV9qaXQpOwotICAg
ICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgLy8gY2hpbGQgMiBp
cyBkZWZpbml0ZWx5IGFuIGludGVnZXIKLSAgICAgICAgbV9qaXQuY29udmVydEludDMyVG9Eb3Vi
bGUoYXJnMkdQUiwgdG1wMkZQUik7Ci0gICAgICAgICAgICAKLSAgICAgICAgaGF2ZUZQUkFyZ3Vt
ZW50cy5hcHBlbmQobV9qaXQuanVtcCgpKTsKLSAgICB9Ci0gICAgICAgIAotICAgIGlmICghaXNL
bm93bkludGVnZXIobm9kZS5jaGlsZDIoKSkpIHsKLSAgICAgICAgY2hpbGQyTm90SW50Lmxpbmso
Jm1faml0KTsKLSAgICAgICAgICAgIAotICAgICAgICBpZiAoIWlzS25vd25OdW1lcmljKG5vZGUu
Y2hpbGQyKCkpKSB7Ci0gICAgICAgICAgICBBU1NFUlQob3AgPT0gVmFsdWVBZGQpOwotICAgICAg
ICAgICAgbm90TnVtYmVycy5hcHBlbmQobV9qaXQuYnJhbmNoVGVzdFB0cihNYWNyb0Fzc2VtYmxl
cjo6WmVybywgYXJnMkdQUiwgR1BSSW5mbzo6dGFnVHlwZU51bWJlclJlZ2lzdGVyKSk7Ci0gICAg
ICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAvLyBjaGlsZDEgaXMgZGVmaW5pdGVseSBhbiBp
bnRlZ2VyLCBhbmQgY2hpbGQgMiBpcyBkZWZpbml0ZWx5IG5vdAotICAgICAgICAgICAgCi0gICAg
ICAgIG1faml0LmNvbnZlcnRJbnQzMlRvRG91YmxlKGFyZzFHUFIsIHRtcDFGUFIpOwotICAgICAg
ICAgICAgCi0gICAgICAgIGlmIChjaGlsZDJOb3RJbnQyLmlzU2V0KCkpCi0gICAgICAgICAgICBj
aGlsZDJOb3RJbnQyLmxpbmsoJm1faml0KTsKLSAgICAgICAgICAgIAotICAgICAgICBtX2ppdC5t
b3ZlKGFyZzJHUFIsIHJlc3VsdEdQUik7Ci0gICAgICAgIHVuYm94RG91YmxlKHJlc3VsdEdQUiwg
dG1wMkZQUik7Ci0gICAgfQotICAgICAgICAKLSAgICBoYXZlRlBSQXJndW1lbnRzLmxpbmsoJm1f
aml0KTsKLSAgICAgICAgCi0gICAgc3dpdGNoIChvcCkgewotICAgIGNhc2UgVmFsdWVBZGQ6Ci0g
ICAgY2FzZSBBcml0aEFkZDoKLSAgICAgICAgbV9qaXQuYWRkRG91YmxlKHRtcDJGUFIsIHRtcDFG
UFIpOwotICAgICAgICBicmVhazsKLSAgICAgICAgICAgIAotICAgIGNhc2UgQXJpdGhTdWI6Ci0g
ICAgICAgIG1faml0LnN1YkRvdWJsZSh0bXAyRlBSLCB0bXAxRlBSKTsKLSAgICAgICAgYnJlYWs7
Ci0gICAgICAgICAgICAKLSAgICBjYXNlIEFyaXRoTXVsOgotICAgICAgICBtX2ppdC5tdWxEb3Vi
bGUodG1wMkZQUiwgdG1wMUZQUik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgICAgICAgCi0gICAg
ZGVmYXVsdDoKLSAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgfQotICAgIAotICAg
IEpJVENvbXBpbGVyOjpKdW1wIGRvbmVDYXNlQ29udmVydGVkVG9JbnQ7Ci0gICAgCi0gICAgaWYg
KG9wID09IFZhbHVlQWRkKSB7Ci0gICAgICAgIEpJVENvbXBpbGVyOjpKdW1wTGlzdCBmYWlsdXJl
Q2FzZXM7Ci0gICAgICAgIG1faml0LmJyYW5jaENvbnZlcnREb3VibGVUb0ludDMyKHRtcDFGUFIs
IHJlc3VsdEdQUiwgZmFpbHVyZUNhc2VzLCB0bXAyRlBSKTsKLSAgICAgICAgbV9qaXQub3JQdHIo
R1BSSW5mbzo6dGFnVHlwZU51bWJlclJlZ2lzdGVyLCByZXN1bHRHUFIpOwotICAgICAgICAKLSAg
ICAgICAgZG9uZUNhc2VDb252ZXJ0ZWRUb0ludCA9IG1faml0Lmp1bXAoKTsKLSAgICAgICAgCi0g
ICAgICAgIGZhaWx1cmVDYXNlcy5saW5rKCZtX2ppdCk7Ci0gICAgfQotICAgICAgICAKLSAgICBi
b3hEb3VibGUodG1wMUZQUiwgcmVzdWx0R1BSKTsKLSAgICAgICAgCi0gICAgaWYgKCFub3ROdW1i
ZXJzLmVtcHR5KCkpIHsKLSAgICAgICAgQVNTRVJUKG9wID09IFZhbHVlQWRkKTsKLSAgICAgICAg
ICAgIAotICAgICAgICBKSVRDb21waWxlcjo6SnVtcCBkb25lQ2FzZVdhc051bWJlciA9IG1faml0
Lmp1bXAoKTsKLSAgICAgICAgICAgIAotICAgICAgICBub3ROdW1iZXJzLmxpbmsoJm1faml0KTsK
LSAgICAgICAgICAgIAotICAgICAgICBzaWxlbnRTcGlsbEFsbFJlZ2lzdGVycyhyZXN1bHRHUFIp
OwotICAgICAgICBzZXR1cFN0dWJBcmd1bWVudHMoYXJnMUdQUiwgYXJnMkdQUik7Ci0gICAgICAg
IG1faml0Lm1vdmUoR1BSSW5mbzo6Y2FsbEZyYW1lUmVnaXN0ZXIsIEdQUkluZm86OmFyZ3VtZW50
R1BSMCk7Ci0gICAgICAgIGFwcGVuZENhbGxXaXRoRXhjZXB0aW9uQ2hlY2sob3BlcmF0aW9uVmFs
dWVBZGROb3ROdW1iZXIpOwotICAgICAgICBtX2ppdC5tb3ZlKEdQUkluZm86OnJldHVyblZhbHVl
R1BSLCByZXN1bHRHUFIpOwotICAgICAgICBzaWxlbnRGaWxsQWxsUmVnaXN0ZXJzKHJlc3VsdEdQ
Uik7Ci0KLSAgICAgICAgZG9uZUNhc2VXYXNOdW1iZXIubGluaygmbV9qaXQpOwotICAgIH0KLSAg
ICAKLSAgICBkb25lLmxpbmsoJm1faml0KTsKLSAgICBpZiAoZG9uZUNhc2VDb252ZXJ0ZWRUb0lu
dC5pc1NldCgpKQotICAgICAgICBkb25lQ2FzZUNvbnZlcnRlZFRvSW50LmxpbmsoJm1faml0KTsK
LSAgICAgICAgCi0gICAganNWYWx1ZVJlc3VsdChyZXN1bHRHUFIsIG1fY29tcGlsZUluZGV4LCBV
c2VDaGlsZHJlbkNhbGxlZEV4cGxpY2l0bHkpOwotfQotCi12b2lkIEpJVENvZGVHZW5lcmF0b3I6
Om5vblNwZWN1bGF0aXZlQXJpdGhNb2QoTm9kZSYgbm9kZSkKLXsKLSAgICBKU1ZhbHVlT3BlcmFu
ZCBvcDEodGhpcywgbm9kZS5jaGlsZDEoKSk7Ci0gICAgSlNWYWx1ZU9wZXJhbmQgb3AyKHRoaXMs
IG5vZGUuY2hpbGQyKCkpOwotICAgIEdQUlRlbXBvcmFyeSBlYXgodGhpcywgWDg2UmVnaXN0ZXJz
OjplYXgpOwotICAgIEdQUlRlbXBvcmFyeSBlZHgodGhpcywgWDg2UmVnaXN0ZXJzOjplZHgpOwot
Ci0gICAgRlBSVGVtcG9yYXJ5IG9wMURvdWJsZSh0aGlzKTsKLSAgICBGUFJUZW1wb3Jhcnkgb3Ay
RG91YmxlKHRoaXMpOwotICAgIAotICAgIEdQUlJlZyBvcDFHUFIgPSBvcDEuZ3ByKCk7Ci0gICAg
R1BSUmVnIG9wMkdQUiA9IG9wMi5ncHIoKTsKLSAgICAKLSAgICBGUFJSZWcgb3AxRlBSID0gb3Ax
RG91YmxlLmZwcigpOwotICAgIEZQUlJlZyBvcDJGUFIgPSBvcDJEb3VibGUuZnByKCk7Ci0gICAg
ICAgIAotICAgIG9wMS51c2UoKTsKLSAgICBvcDIudXNlKCk7Ci0gICAgCi0gICAgR1BSUmVnIHRl
bXAyID0gSW52YWxpZEdQUlJlZzsKLSAgICBHUFJSZWcgdW5ib3hHUFI7Ci0gICAgaWYgKG9wMkdQ
UiA9PSBYODZSZWdpc3RlcnM6OmVheCB8fCBvcDJHUFIgPT0gWDg2UmVnaXN0ZXJzOjplZHgpIHsK
LSAgICAgICAgdGVtcDIgPSBhbGxvY2F0ZSgpOwotICAgICAgICBtX2ppdC5tb3ZlKG9wMkdQUiwg
dGVtcDIpOwotICAgICAgICBvcDJHUFIgPSB0ZW1wMjsKLSAgICAgICAgdW5ib3hHUFIgPSB0ZW1w
MjsKLSAgICB9IGVsc2UgaWYgKG9wMUdQUiA9PSBYODZSZWdpc3RlcnM6OmVheCkKLSAgICAgICAg
dW5ib3hHUFIgPSBYODZSZWdpc3RlcnM6OmVkeDsKLSAgICBlbHNlCi0gICAgICAgIHVuYm94R1BS
ID0gWDg2UmVnaXN0ZXJzOjplYXg7Ci0gICAgQVNTRVJUKHVuYm94R1BSICE9IG9wMS5ncHIoKSk7
Ci0gICAgQVNTRVJUKHVuYm94R1BSICE9IG9wMi5ncHIoKSk7Ci0KLSAgICBKSVRDb21waWxlcjo6
SnVtcCBmaXJzdE9wTm90SW50OwotICAgIEpJVENvbXBpbGVyOjpKdW1wIHNlY29uZE9wTm90SW50
OwotICAgIEpJVENvbXBpbGVyOjpKdW1wTGlzdCBkb25lOwotICAgIEpJVENvbXBpbGVyOjpKdW1w
IG1vZEJ5WmVybzsKLSAgICAKLSAgICBpZiAoIWlzS25vd25JbnRlZ2VyKG5vZGUuY2hpbGQxKCkp
KQotICAgICAgICBmaXJzdE9wTm90SW50ID0gbV9qaXQuYnJhbmNoUHRyKE1hY3JvQXNzZW1ibGVy
OjpCZWxvdywgb3AxR1BSLCBHUFJJbmZvOjp0YWdUeXBlTnVtYmVyUmVnaXN0ZXIpOwotICAgIGlm
ICghaXNLbm93bkludGVnZXIobm9kZS5jaGlsZDIoKSkpCi0gICAgICAgIHNlY29uZE9wTm90SW50
ID0gbV9qaXQuYnJhbmNoUHRyKE1hY3JvQXNzZW1ibGVyOjpCZWxvdywgb3AyR1BSLCBHUFJJbmZv
Ojp0YWdUeXBlTnVtYmVyUmVnaXN0ZXIpOwotICAgIAotICAgIG1vZEJ5WmVybyA9IG1faml0LmJy
YW5jaFRlc3QzMihNYWNyb0Fzc2VtYmxlcjo6WmVybywgb3AyR1BSKTsKLSAgICAKLSAgICBtX2pp
dC5tb3ZlKG9wMUdQUiwgZWF4LmdwcigpKTsKLSAgICBtX2ppdC5hc3NlbWJsZXIoKS5jZHEoKTsK
LSAgICBtX2ppdC5hc3NlbWJsZXIoKS5pZGl2bF9yKG9wMkdQUik7Ci0gICAgCi0gICAgbV9qaXQu
b3JQdHIoR1BSSW5mbzo6dGFnVHlwZU51bWJlclJlZ2lzdGVyLCBYODZSZWdpc3RlcnM6OmVkeCk7
Ci0gICAgCi0gICAgZG9uZS5hcHBlbmQobV9qaXQuanVtcCgpKTsKLSAgICAgICAgCi0gICAgSklU
Q29tcGlsZXI6Okp1bXAgZ290RG91YmxlQXJnczsKLSAgICAKLSAgICBtb2RCeVplcm8ubGluaygm
bV9qaXQpOwotICAgICAgICAKLSAgICBtX2ppdC5tb3ZlKE1hY3JvQXNzZW1ibGVyOjpUcnVzdGVk
SW1tUHRyKEpTVmFsdWU6OmVuY29kZShqc051bWJlcihzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJs
ZT46OnF1aWV0X05hTigpKSkpLCBYODZSZWdpc3RlcnM6OmVkeCk7Ci0gICAgZG9uZS5hcHBlbmQo
bV9qaXQuanVtcCgpKTsKLSAgICAKLSAgICBpZiAoIWlzS25vd25JbnRlZ2VyKG5vZGUuY2hpbGQx
KCkpKSB7Ci0gICAgICAgIGZpcnN0T3BOb3RJbnQubGluaygmbV9qaXQpOwotICAgICAgICAKLSAg
ICAgICAgSklUQ29tcGlsZXI6Okp1bXAgc2Vjb25kT3BOb3RJbnQyOwotICAgICAgICAKLSAgICAg
ICAgaWYgKCFpc0tub3duSW50ZWdlcihub2RlLmNoaWxkMigpKSkKLSAgICAgICAgICAgIHNlY29u
ZE9wTm90SW50MiA9IG1faml0LmJyYW5jaFB0cihNYWNyb0Fzc2VtYmxlcjo6QmVsb3csIG9wMkdQ
UiwgR1BSSW5mbzo6dGFnVHlwZU51bWJlclJlZ2lzdGVyKTsKLSAgICAgICAgICAgIAotICAgICAg
ICAvLyBmaXJzdCBvcCBpcyBhIGRvdWJsZSwgc2Vjb25kIG9wIGlzIGFuIGludC4KLSAgICAgICAg
bV9qaXQuY29udmVydEludDMyVG9Eb3VibGUob3AyR1BSLCBvcDJGUFIpOwotCi0gICAgICAgIGlm
ICghaXNLbm93bkludGVnZXIobm9kZS5jaGlsZDIoKSkpIHsKLSAgICAgICAgICAgIEpJVENvbXBp
bGVyOjpKdW1wIGdvdFNlY29uZE9wID0gbV9qaXQuanVtcCgpOwotICAgICAgICAgICAgCi0gICAg
ICAgICAgICBzZWNvbmRPcE5vdEludDIubGluaygmbV9qaXQpOwotICAgICAgICAgICAgCi0gICAg
ICAgICAgICAvLyBmaXJzdCBvcCBpcyBhIGRvdWJsZSwgc2Vjb25kIG9wIGlzIGEgZG91YmxlLgot
ICAgICAgICAgICAgbV9qaXQubW92ZShvcDJHUFIsIHVuYm94R1BSKTsKLSAgICAgICAgICAgIHVu
Ym94RG91YmxlKHVuYm94R1BSLCBvcDJGUFIpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBn
b3RTZWNvbmRPcC5saW5rKCZtX2ppdCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIG1f
aml0Lm1vdmUob3AxR1BSLCB1bmJveEdQUik7Ci0gICAgICAgIHVuYm94RG91YmxlKHVuYm94R1BS
LCBvcDFGUFIpOwotICAgICAgICAKLSAgICAgICAgZ290RG91YmxlQXJncyA9IG1faml0Lmp1bXAo
KTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKCFpc0tub3duSW50ZWdlcihub2RlLmNoaWxkMigpKSkg
ewotICAgICAgICBzZWNvbmRPcE5vdEludC5saW5rKCZtX2ppdCk7Ci0gICAgICAgIAotICAgICAg
ICAvLyB3ZSBrbm93IHRoYXQgdGhlIGZpcnN0IG9wIGlzIGFuIGludCwgYW5kIHRoZSBzZWNvbmQg
aXMgYSBkb3VibGUKLSAgICAgICAgbV9qaXQuY29udmVydEludDMyVG9Eb3VibGUob3AxR1BSLCBv
cDFGUFIpOwotICAgICAgICBtX2ppdC5tb3ZlKG9wMkdQUiwgdW5ib3hHUFIpOwotICAgICAgICB1
bmJveERvdWJsZSh1bmJveEdQUiwgb3AyRlBSKTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKCFpc0tu
b3duSW50ZWdlcihub2RlLmNoaWxkMSgpKSkKLSAgICAgICAgZ290RG91YmxlQXJncy5saW5rKCZt
X2ppdCk7Ci0gICAgCi0gICAgaWYgKCFpc0tub3duSW50ZWdlcihub2RlLmNoaWxkMSgpKSB8fCAh
aXNLbm93bkludGVnZXIobm9kZS5jaGlsZDIoKSkpIHsKLSAgICAgICAgc2lsZW50U3BpbGxBbGxS
ZWdpc3RlcnMoWDg2UmVnaXN0ZXJzOjplZHgpOwotICAgICAgICBzZXR1cFR3b1N0dWJBcmdzPEZQ
UkluZm86OmFyZ3VtZW50RlBSMCwgRlBSSW5mbzo6YXJndW1lbnRGUFIxPihvcDFGUFIsIG9wMkZQ
Uik7Ci0gICAgICAgIG1faml0LmFwcGVuZENhbGwoZm1vZCk7Ci0gICAgICAgIGJveERvdWJsZShG
UFJJbmZvOjpyZXR1cm5WYWx1ZUZQUiwgWDg2UmVnaXN0ZXJzOjplZHgpOwotICAgICAgICBzaWxl
bnRGaWxsQWxsUmVnaXN0ZXJzKFg4NlJlZ2lzdGVyczo6ZWR4KTsKLSAgICB9Ci0gICAgICAgIAot
ICAgIGRvbmUubGluaygmbV9qaXQpOwotICAgIAotICAgIGlmICh0ZW1wMiAhPSBJbnZhbGlkR1BS
UmVnKQotICAgICAgICB1bmxvY2sodGVtcDIpOwotICAgIAotICAgIGpzVmFsdWVSZXN1bHQoWDg2
UmVnaXN0ZXJzOjplZHgsIG1fY29tcGlsZUluZGV4LCBVc2VDaGlsZHJlbkNhbGxlZEV4cGxpY2l0
bHkpOwotfQotCi12b2lkIEpJVENvZGVHZW5lcmF0b3I6Om5vblNwZWN1bGF0aXZlQ2hlY2tIYXNJ
bnN0YW5jZShOb2RlJiBub2RlKQotewotICAgIEpTVmFsdWVPcGVyYW5kIGJhc2UodGhpcywgbm9k
ZS5jaGlsZDEoKSk7Ci0gICAgR1BSVGVtcG9yYXJ5IHN0cnVjdHVyZSh0aGlzKTsKLSAgICAKLSAg
ICBHUFJSZWcgYmFzZVJlZyA9IGJhc2UuZ3ByKCk7Ci0gICAgR1BSUmVnIHN0cnVjdHVyZVJlZyA9
IHN0cnVjdHVyZS5ncHIoKTsKLSAgICAKLSAgICAvLyBDaGVjayB0aGF0IGJhc2UgaXMgYSBjZWxs
LgotICAgIE1hY3JvQXNzZW1ibGVyOjpKdW1wIGJhc2VOb3RDZWxsID0gbV9qaXQuYnJhbmNoVGVz
dFB0cihNYWNyb0Fzc2VtYmxlcjo6Tm9uWmVybywgYmFzZVJlZywgR1BSSW5mbzo6dGFnTWFza1Jl
Z2lzdGVyKTsKLSAgICAKLSAgICAvLyBDaGVjayB0aGF0IGJhc2UgJ0ltcGxlbWVudHNIYXNJbnN0
YW5jZScuCi0gICAgbV9qaXQubG9hZFB0cihNYWNyb0Fzc2VtYmxlcjo6QWRkcmVzcyhiYXNlUmVn
LCBKU0NlbGw6OnN0cnVjdHVyZU9mZnNldCgpKSwgc3RydWN0dXJlUmVnKTsKLSAgICBNYWNyb0Fz
c2VtYmxlcjo6SnVtcCBpbXBsZW1lbnRzSGFzSW5zdGFuY2UgPSBtX2ppdC5icmFuY2hUZXN0OChN
YWNyb0Fzc2VtYmxlcjo6Tm9uWmVybywgTWFjcm9Bc3NlbWJsZXI6OkFkZHJlc3Moc3RydWN0dXJl
UmVnLCBTdHJ1Y3R1cmU6OnR5cGVJbmZvRmxhZ3NPZmZzZXQoKSksIE1hY3JvQXNzZW1ibGVyOjpU
cnVzdGVkSW1tMzIoSW1wbGVtZW50c0hhc0luc3RhbmNlKSk7Ci0gICAgCi0gICAgLy8gQXQgdGhp
cyBwb2ludCB3ZSBhbHdheXMgdGhyb3csIHNvIG5vIG5lZWQgdG8gcHJlc2VydmUgcmVnaXN0ZXJz
LgotICAgIGJhc2VOb3RDZWxsLmxpbmsoJm1faml0KTsKLSAgICBtX2ppdC5tb3ZlKGJhc2VSZWcs
IEdQUkluZm86OmFyZ3VtZW50R1BSMSk7Ci0gICAgbV9qaXQubW92ZShHUFJJbmZvOjpjYWxsRnJh
bWVSZWdpc3RlciwgR1BSSW5mbzo6YXJndW1lbnRHUFIwKTsKLSAgICAvLyBBdCBzb21lIHBvaW50
IHdlIGNvdWxkIG9wdGltaXplIHRoaXMgdG8gcGxhbnQgYSBkaXJlY3QganVtcCwgcmF0aGVyIHRo
ZW4gY2hlY2tpbmcKLSAgICAvLyBmb3IgYW4gZXhjZXB0aW9uIChvcGVyYXRpb25UaHJvd0hhc0lu
c3RhbmNlRXJyb3IgYWx3YXlzIHRocm93cykuIFByb2JhYmx5IG5vdCB3b3J0aAotICAgIC8vIGFk
ZGluZyB0aGUgZXh0cmEgaW50ZXJmYWNlIHRvIGRvIHRoaXMgbm93LCBidXQgd2UgbWF5IGFsc28g
d2FudCB0aGlzIGZvciBvcF90aHJvdy4KLSAgICBhcHBlbmRDYWxsV2l0aEV4Y2VwdGlvbkNoZWNr
KG9wZXJhdGlvblRocm93SGFzSW5zdGFuY2VFcnJvcik7Ci0gICAgCi0gICAgaW1wbGVtZW50c0hh
c0luc3RhbmNlLmxpbmsoJm1faml0KTsKLSAgICBub1Jlc3VsdChtX2NvbXBpbGVJbmRleCk7Ci19
Ci0KLXZvaWQgSklUQ29kZUdlbmVyYXRvcjo6bm9uU3BlY3VsYXRpdmVJbnN0YW5jZU9mKE5vZGUm
IG5vZGUpCi17Ci0gICAgSlNWYWx1ZU9wZXJhbmQgdmFsdWUodGhpcywgbm9kZS5jaGlsZDEoKSk7
Ci0gICAgSlNWYWx1ZU9wZXJhbmQgYmFzZSh0aGlzLCBub2RlLmNoaWxkMigpKTsKLSAgICBKU1Zh
bHVlT3BlcmFuZCBwcm90b3R5cGUodGhpcywgbm9kZS5jaGlsZDMoKSk7Ci0gICAgR1BSVGVtcG9y
YXJ5IHNjcmF0Y2godGhpcywgYmFzZSk7Ci0KLSAgICBHUFJSZWcgdmFsdWVSZWcgPSB2YWx1ZS5n
cHIoKTsKLSAgICBHUFJSZWcgYmFzZVJlZyA9IGJhc2UuZ3ByKCk7Ci0gICAgR1BSUmVnIHByb3Rv
dHlwZVJlZyA9IHByb3RvdHlwZS5ncHIoKTsKLSAgICBHUFJSZWcgc2NyYXRjaFJlZyA9IHNjcmF0
Y2guZ3ByKCk7Ci0gICAgICAgIAotICAgIHZhbHVlLnVzZSgpOwotICAgIGJhc2UudXNlKCk7Ci0g
ICAgcHJvdG90eXBlLnVzZSgpOwotCi0gICAgLy8gQ2hlY2sgdGhhdCBvcGVyYW5kcyBhcmUgY2Vs
bHMgKGJhc2UgaXMgY2hlY2tlZCBieSBDaGVja0hhc0luc3RhbmNlLCBzbyB3ZSBjYW4ganVzdCBh
c3NlcnQpLgotICAgIE1hY3JvQXNzZW1ibGVyOjpKdW1wIHZhbHVlTm90Q2VsbCA9IG1faml0LmJy
YW5jaFRlc3RQdHIoTWFjcm9Bc3NlbWJsZXI6Ok5vblplcm8sIHZhbHVlUmVnLCBHUFJJbmZvOjp0
YWdNYXNrUmVnaXN0ZXIpOwotICAgIG1faml0LmppdEFzc2VydElzQ2VsbChiYXNlUmVnKTsKLSAg
ICBNYWNyb0Fzc2VtYmxlcjo6SnVtcCBwcm90b3R5cGVOb3RDZWxsID0gbV9qaXQuYnJhbmNoVGVz
dFB0cihNYWNyb0Fzc2VtYmxlcjo6Tm9uWmVybywgcHJvdG90eXBlUmVnLCBHUFJJbmZvOjp0YWdN
YXNrUmVnaXN0ZXIpOwotCi0gICAgLy8gQ2hlY2sgdGhhdCBiYXNlVmFsICdJbXBsZW1lbnRzRGVm
YXVsdEhhc0luc3RhbmNlJy4KLSAgICBtX2ppdC5sb2FkUHRyKE1hY3JvQXNzZW1ibGVyOjpBZGRy
ZXNzKGJhc2VSZWcsIEpTQ2VsbDo6c3RydWN0dXJlT2Zmc2V0KCkpLCBzY3JhdGNoUmVnKTsKLSAg
ICBNYWNyb0Fzc2VtYmxlcjo6SnVtcCBub3REZWZhdWx0SGFzSW5zdGFuY2UgPSBtX2ppdC5icmFu
Y2hUZXN0OChNYWNyb0Fzc2VtYmxlcjo6WmVybywgTWFjcm9Bc3NlbWJsZXI6OkFkZHJlc3Moc2Ny
YXRjaFJlZywgU3RydWN0dXJlOjp0eXBlSW5mb0ZsYWdzT2Zmc2V0KCkpLCBUcnVzdGVkSW1tMzIo
SW1wbGVtZW50c0RlZmF1bHRIYXNJbnN0YW5jZSkpOwotCi0gICAgLy8gQ2hlY2sgdGhhdCBwcm90
b3R5cGUgaXMgYW4gb2JqZWN0Ci0gICAgbV9qaXQubG9hZFB0cihNYWNyb0Fzc2VtYmxlcjo6QWRk
cmVzcyhwcm90b3R5cGVSZWcsIEpTQ2VsbDo6c3RydWN0dXJlT2Zmc2V0KCkpLCBzY3JhdGNoUmVn
KTsKLSAgICBNYWNyb0Fzc2VtYmxlcjo6SnVtcCBwcm90b05vdE9iamVjdCA9IG1faml0LmJyYW5j
aElmTm90T2JqZWN0KHNjcmF0Y2hSZWcpOwotCi0gICAgLy8gSW5pdGlhbGl6ZSBzY3JhdGNoUmVn
IHdpdGggdGhlIHZhbHVlIGJlaW5nIGNoZWNrZWQuCi0gICAgbV9qaXQubW92ZSh2YWx1ZVJlZywg
c2NyYXRjaFJlZyk7Ci0KLSAgICAvLyBXYWxrIHVwIHRoZSBwcm90b3R5cGUgY2hhaW4gb2YgdGhl
IHZhbHVlIChpbiBzY3JhdGNoUmVnKSwgY29tcGFyaW5nIHRvIHByb3RvdHlwZVJlZy4KLSAgICBN
YWNyb0Fzc2VtYmxlcjo6TGFiZWwgbG9vcCgmbV9qaXQpOwotICAgIG1faml0LmxvYWRQdHIoTWFj
cm9Bc3NlbWJsZXI6OkFkZHJlc3Moc2NyYXRjaFJlZywgSlNDZWxsOjpzdHJ1Y3R1cmVPZmZzZXQo
KSksIHNjcmF0Y2hSZWcpOwotICAgIG1faml0LmxvYWRQdHIoTWFjcm9Bc3NlbWJsZXI6OkFkZHJl
c3Moc2NyYXRjaFJlZywgU3RydWN0dXJlOjpwcm90b3R5cGVPZmZzZXQoKSksIHNjcmF0Y2hSZWcp
OwotICAgIE1hY3JvQXNzZW1ibGVyOjpKdW1wIGlzSW5zdGFuY2UgPSBtX2ppdC5icmFuY2hQdHIo
TWFjcm9Bc3NlbWJsZXI6OkVxdWFsLCBzY3JhdGNoUmVnLCBwcm90b3R5cGVSZWcpOwotICAgIG1f
aml0LmJyYW5jaFRlc3RQdHIoTWFjcm9Bc3NlbWJsZXI6Olplcm8sIHNjcmF0Y2hSZWcsIEdQUklu
Zm86OnRhZ01hc2tSZWdpc3RlcikubGlua1RvKGxvb3AsICZtX2ppdCk7Ci0KLSAgICAvLyBObyBt
YXRjaCAtIHJlc3VsdCBpcyBmYWxzZS4KLSAgICBtX2ppdC5tb3ZlKE1hY3JvQXNzZW1ibGVyOjpU
cnVzdGVkSW1tUHRyKEpTVmFsdWU6OmVuY29kZShqc0Jvb2xlYW4oZmFsc2UpKSksIHNjcmF0Y2hS
ZWcpOwotICAgIE1hY3JvQXNzZW1ibGVyOjpKdW1wIHdhc05vdEluc3RhbmNlID0gbV9qaXQuanVt
cCgpOwotCi0gICAgLy8gTGluayB0byBoZXJlIGlmIGFueSBjaGVja3MgZmFpbCB0aGF0IHJlcXVp
cmUgdXMgdG8gdHJ5IGNhbGxpbmcgb3V0IHRvIGFuIG9wZXJhdGlvbiB0byBoZWxwLAotICAgIC8v
IGUuZy4gZm9yIGFuIEFQSSBvdmVycmlkZGVuIEhhc0luc3RhbmNlLgotICAgIHZhbHVlTm90Q2Vs
bC5saW5rKCZtX2ppdCk7Ci0gICAgcHJvdG90eXBlTm90Q2VsbC5saW5rKCZtX2ppdCk7Ci0gICAg
bm90RGVmYXVsdEhhc0luc3RhbmNlLmxpbmsoJm1faml0KTsKLSAgICBwcm90b05vdE9iamVjdC5s
aW5rKCZtX2ppdCk7Ci0KLSAgICBzaWxlbnRTcGlsbEFsbFJlZ2lzdGVycyhzY3JhdGNoUmVnKTsK
LSAgICBzZXR1cFN0dWJBcmd1bWVudHModmFsdWVSZWcsIGJhc2VSZWcsIHByb3RvdHlwZVJlZyk7
Ci0gICAgbV9qaXQubW92ZShHUFJJbmZvOjpjYWxsRnJhbWVSZWdpc3RlciwgR1BSSW5mbzo6YXJn
dW1lbnRHUFIwKTsKLSAgICBhcHBlbmRDYWxsV2l0aEV4Y2VwdGlvbkNoZWNrKG9wZXJhdGlvbklu
c3RhbmNlT2YpOwotICAgIG1faml0Lm1vdmUoR1BSSW5mbzo6cmV0dXJuVmFsdWVHUFIsIHNjcmF0
Y2hSZWcpOwotICAgIHNpbGVudEZpbGxBbGxSZWdpc3RlcnMoc2NyYXRjaFJlZyk7Ci0KLSAgICBN
YWNyb0Fzc2VtYmxlcjo6SnVtcCB3YXNOb3REZWZhdWx0SGFzSW5zdGFuY2UgPSBtX2ppdC5qdW1w
KCk7Ci0KLSAgICBpc0luc3RhbmNlLmxpbmsoJm1faml0KTsKLSAgICBtX2ppdC5tb3ZlKE1hY3Jv
QXNzZW1ibGVyOjpUcnVzdGVkSW1tUHRyKEpTVmFsdWU6OmVuY29kZShqc0Jvb2xlYW4odHJ1ZSkp
KSwgc2NyYXRjaFJlZyk7Ci0KLSAgICB3YXNOb3RJbnN0YW5jZS5saW5rKCZtX2ppdCk7Ci0gICAg
d2FzTm90RGVmYXVsdEhhc0luc3RhbmNlLmxpbmsoJm1faml0KTsKLSAgICBqc1ZhbHVlUmVzdWx0
KHNjcmF0Y2hSZWcsIG1fY29tcGlsZUluZGV4LCBVc2VDaGlsZHJlbkNhbGxlZEV4cGxpY2l0bHkp
OwotfQotCi1KSVRDb21waWxlcjo6Q2FsbCBKSVRDb2RlR2VuZXJhdG9yOjpjYWNoZWRHZXRCeUlk
KEdQUlJlZyBiYXNlR1BSLCBHUFJSZWcgcmVzdWx0R1BSLCBHUFJSZWcgc2NyYXRjaEdQUiwgdW5z
aWduZWQgaWRlbnRpZmllck51bWJlciwgSklUQ29tcGlsZXI6Okp1bXAgc2xvd1BhdGhUYXJnZXQs
IE5vZGVUeXBlIG5vZGVUeXBlKQotewotICAgIEpJVENvbXBpbGVyOjpEYXRhTGFiZWxQdHIgc3Ry
dWN0dXJlVG9Db21wYXJlOwotICAgIEpJVENvbXBpbGVyOjpKdW1wIHN0cnVjdHVyZUNoZWNrID0g
bV9qaXQuYnJhbmNoUHRyV2l0aFBhdGNoKEpJVENvbXBpbGVyOjpOb3RFcXVhbCwgSklUQ29tcGls
ZXI6OkFkZHJlc3MoYmFzZUdQUiwgSlNDZWxsOjpzdHJ1Y3R1cmVPZmZzZXQoKSksIHN0cnVjdHVy
ZVRvQ29tcGFyZSwgSklUQ29tcGlsZXI6OlRydXN0ZWRJbW1QdHIocmVpbnRlcnByZXRfY2FzdDx2
b2lkKj4oLTEpKSk7Ci0gICAgCi0gICAgbV9qaXQubG9hZFB0cihKSVRDb21waWxlcjo6QWRkcmVz
cyhiYXNlR1BSLCBKU09iamVjdDo6b2Zmc2V0T2ZQcm9wZXJ0eVN0b3JhZ2UoKSksIHJlc3VsdEdQ
Uik7Ci0gICAgSklUQ29tcGlsZXI6OkRhdGFMYWJlbENvbXBhY3QgbG9hZFdpdGhQYXRjaCA9IG1f
aml0LmxvYWRQdHJXaXRoQ29tcGFjdEFkZHJlc3NPZmZzZXRQYXRjaChKSVRDb21waWxlcjo6QWRk
cmVzcyhyZXN1bHRHUFIsIDApLCByZXN1bHRHUFIpOwotICAgIAotICAgIEpJVENvbXBpbGVyOjpK
dW1wIGRvbmUgPSBtX2ppdC5qdW1wKCk7Ci0KLSAgICBzdHJ1Y3R1cmVDaGVjay5saW5rKCZtX2pp
dCk7Ci0gICAgCi0gICAgaWYgKHNsb3dQYXRoVGFyZ2V0LmlzU2V0KCkpCi0gICAgICAgIHNsb3dQ
YXRoVGFyZ2V0LmxpbmsoJm1faml0KTsKLSAgICAKLSAgICBKSVRDb21waWxlcjo6TGFiZWwgc2xv
d0Nhc2UgPSBtX2ppdC5sYWJlbCgpOwotCi0gICAgc2lsZW50U3BpbGxBbGxSZWdpc3RlcnMocmVz
dWx0R1BSKTsKLSAgICBtX2ppdC5tb3ZlKGJhc2VHUFIsIEdQUkluZm86OmFyZ3VtZW50R1BSMSk7
Ci0gICAgbV9qaXQubW92ZShKSVRDb21waWxlcjo6SW1tUHRyKGlkZW50aWZpZXIoaWRlbnRpZmll
ck51bWJlcikpLCBHUFJJbmZvOjphcmd1bWVudEdQUjIpOwotICAgIG1faml0Lm1vdmUoR1BSSW5m
bzo6Y2FsbEZyYW1lUmVnaXN0ZXIsIEdQUkluZm86OmFyZ3VtZW50R1BSMCk7Ci0gICAgSklUQ29t
cGlsZXI6OkNhbGwgZnVuY3Rpb25DYWxsOwotICAgIHN3aXRjaCAobm9kZVR5cGUpIHsKLSAgICBj
YXNlIEdldEJ5SWQ6Ci0gICAgICAgIGZ1bmN0aW9uQ2FsbCA9IGFwcGVuZENhbGxXaXRoRXhjZXB0
aW9uQ2hlY2sob3BlcmF0aW9uR2V0QnlJZE9wdGltaXplKTsKLSAgICAgICAgYnJlYWs7Ci0gICAg
ICAgIAotICAgIGNhc2UgR2V0TWV0aG9kOgotICAgICAgICBmdW5jdGlvbkNhbGwgPSBhcHBlbmRD
YWxsV2l0aEV4Y2VwdGlvbkNoZWNrKG9wZXJhdGlvbkdldE1ldGhvZE9wdGltaXplKTsKLSAgICAg
ICAgYnJlYWs7Ci0gICAgICAgIAotICAgIGRlZmF1bHQ6Ci0gICAgICAgIEFTU0VSVF9OT1RfUkVB
Q0hFRCgpOwotICAgICAgICByZXR1cm4gSklUQ29tcGlsZXI6OkNhbGwoKTsKLSAgICB9Ci0gICAg
bV9qaXQubW92ZShHUFJJbmZvOjpyZXR1cm5WYWx1ZUdQUiwgcmVzdWx0R1BSKTsKLSAgICBzaWxl
bnRGaWxsQWxsUmVnaXN0ZXJzKHJlc3VsdEdQUik7Ci0gICAgCi0gICAgZG9uZS5saW5rKCZtX2pp
dCk7CisgICAgVmlydHVhbFJlZ2lzdGVyIHZpcnR1YWxSZWdpc3RlciA9IG5vZGUudmlydHVhbFJl
Z2lzdGVyKCk7CisgICAgR2VuZXJhdGlvbkluZm8mIGluZm8gPSBtX2dlbmVyYXRpb25JbmZvW3Zp
cnR1YWxSZWdpc3Rlcl07CiAgICAgCi0gICAgSklUQ29tcGlsZXI6OkxhYmVsIGRvbmVMYWJlbCA9
IG1faml0LmxhYmVsKCk7CisgICAgcmV0dXJuICghaW5mby5pc0pTRG91YmxlKCkgJiYgIWluZm8u
aXNKU0ludGVnZXIoKSAmJiAhaW5mby5pc1Vua25vd25KUygpKQorICAgICAgICB8fCAobm9kZS5o
YXNDb25zdGFudCgpICYmICFpc051bWJlckNvbnN0YW50KG5vZGVJbmRleCkpOworfQogCi0gICAg
aW50MTZfdCBjaGVja0ltbVRvQ2FsbCA9IHNhZmVDYXN0PGludDE2X3Q+KG1faml0LmRpZmZlcmVu
Y2VCZXR3ZWVuKHN0cnVjdHVyZVRvQ29tcGFyZSwgZnVuY3Rpb25DYWxsKSk7Ci0gICAgaW50MTZf
dCBjYWxsVG9DaGVjayA9IHNhZmVDYXN0PGludDE2X3Q+KG1faml0LmRpZmZlcmVuY2VCZXR3ZWVu
KGZ1bmN0aW9uQ2FsbCwgc3RydWN0dXJlQ2hlY2spKTsKLSAgICBpbnQxNl90IGNhbGxUb0xvYWQg
PSBzYWZlQ2FzdDxpbnQxNl90PihtX2ppdC5kaWZmZXJlbmNlQmV0d2VlbihmdW5jdGlvbkNhbGws
IGxvYWRXaXRoUGF0Y2gpKTsKLSAgICBpbnQxNl90IGNhbGxUb1Nsb3dDYXNlID0gc2FmZUNhc3Q8
aW50MTZfdD4obV9qaXQuZGlmZmVyZW5jZUJldHdlZW4oZnVuY3Rpb25DYWxsLCBzbG93Q2FzZSkp
OwotICAgIGludDE2X3QgY2FsbFRvRG9uZSA9IHNhZmVDYXN0PGludDE2X3Q+KG1faml0LmRpZmZl
cmVuY2VCZXR3ZWVuKGZ1bmN0aW9uQ2FsbCwgZG9uZUxhYmVsKSk7Citib29sIEpJVENvZGVHZW5l
cmF0b3I6OmlzS25vd25Cb29sZWFuKE5vZGVJbmRleCBub2RlSW5kZXgpCit7CisgICAgTm9kZSYg
bm9kZSA9IG1faml0LmdyYXBoKClbbm9kZUluZGV4XTsKKyAgICBpZiAobm9kZS5oYXNCb29sZWFu
UmVzdWx0KCkpCisgICAgICAgIHJldHVybiB0cnVlOwogICAgIAotICAgIG1faml0LmFkZFByb3Bl
cnR5QWNjZXNzKGZ1bmN0aW9uQ2FsbCwgY2hlY2tJbW1Ub0NhbGwsIGNhbGxUb0NoZWNrLCBjYWxs
VG9Mb2FkLCBjYWxsVG9TbG93Q2FzZSwgY2FsbFRvRG9uZSwgc2FmZUNhc3Q8aW50OF90PihiYXNl
R1BSKSwgc2FmZUNhc3Q8aW50OF90PihyZXN1bHRHUFIpLCBzYWZlQ2FzdDxpbnQ4X3Q+KHNjcmF0
Y2hHUFIpKTsKKyAgICBpZiAoaXNCb29sZWFuQ29uc3RhbnQobm9kZUluZGV4KSkKKyAgICAgICAg
cmV0dXJuIHRydWU7CiAgICAgCi0gICAgaWYgKHNjcmF0Y2hHUFIgIT0gcmVzdWx0R1BSICYmIHNj
cmF0Y2hHUFIgIT0gSW52YWxpZEdQUlJlZykKLSAgICAgICAgdW5sb2NrKHNjcmF0Y2hHUFIpOwor
ICAgIFZpcnR1YWxSZWdpc3RlciB2aXJ0dWFsUmVnaXN0ZXIgPSBub2RlLnZpcnR1YWxSZWdpc3Rl
cigpOworICAgIEdlbmVyYXRpb25JbmZvJiBpbmZvID0gbV9nZW5lcmF0aW9uSW5mb1t2aXJ0dWFs
UmVnaXN0ZXJdOwogICAgIAotICAgIHJldHVybiBmdW5jdGlvbkNhbGw7CisgICAgcmV0dXJuIGlu
Zm8uaXNKU0Jvb2xlYW4oKTsKIH0KIAogdm9pZCBKSVRDb2RlR2VuZXJhdG9yOjp3cml0ZUJhcnJp
ZXIoTWFjcm9Bc3NlbWJsZXImIGppdCwgR1BSUmVnIG93bmVyLCBHUFJSZWcgc2NyYXRjaDEsIEdQ
UlJlZyBzY3JhdGNoMiwgV3JpdGVCYXJyaWVyVXNlS2luZCB1c2VLaW5kKQpAQCAtMTIzMSw3ICsy
NDUsNyBAQCB2b2lkIEpJVENvZGVHZW5lcmF0b3I6OndyaXRlQmFycmllcihHUFJSCiAgICAgYm9v
bCBoYWRDZWxsQ2hlY2sgPSBmYWxzZTsKICAgICBpZiAoIWlzS25vd25DZWxsKHZhbHVlSW5kZXgp
ICYmICFpc0NlbGxQcmVkaWN0aW9uKG1faml0LmdldFByZWRpY3Rpb24odmFsdWVJbmRleCkpKSB7
CiAgICAgICAgIGhhZENlbGxDaGVjayA9IHRydWU7Ci0gICAgICAgIHJoc05vdENlbGwgPSBtX2pp
dC5icmFuY2hUZXN0UHRyKE1hY3JvQXNzZW1ibGVyOjpOb25aZXJvLCB2YWx1ZUdQUiwgR1BSSW5m
bzo6dGFnTWFza1JlZ2lzdGVyKTsKKyAgICAgICAgcmhzTm90Q2VsbCA9IG1faml0LmJyYW5jaElm
Tm90Q2VsbCh2YWx1ZUdQUik7CiAgICAgfQogCiAgICAgR1BSVGVtcG9yYXJ5IHRlbXAxOwpAQCAt
MTI3Miw3ICsyODYsNyBAQCB2b2lkIEpJVENvZGVHZW5lcmF0b3I6OndyaXRlQmFycmllcihKU0Nl
CiAgICAgYm9vbCBoYWRDZWxsQ2hlY2sgPSBmYWxzZTsKICAgICBpZiAoIWlzS25vd25DZWxsKHZh
bHVlSW5kZXgpICYmICFpc0NlbGxQcmVkaWN0aW9uKG1faml0LmdldFByZWRpY3Rpb24odmFsdWVJ
bmRleCkpKSB7CiAgICAgICAgIGhhZENlbGxDaGVjayA9IHRydWU7Ci0gICAgICAgIHJoc05vdENl
bGwgPSBtX2ppdC5icmFuY2hUZXN0UHRyKE1hY3JvQXNzZW1ibGVyOjpOb25aZXJvLCB2YWx1ZUdQ
UiwgR1BSSW5mbzo6dGFnTWFza1JlZ2lzdGVyKTsKKyAgICAgICAgcmhzTm90Q2VsbCA9IG1faml0
LmJyYW5jaElmTm90Q2VsbCh2YWx1ZUdQUik7CiAgICAgfQogICAgIAogICAgIEdQUlRlbXBvcmFy
eSB0ZW1wOwpAQCAtMTI5MSwzMDIgKzMwNSw2IEBAIHZvaWQgSklUQ29kZUdlbmVyYXRvcjo6d3Jp
dGVCYXJyaWVyKEpTQ2UKICNlbmRpZgogfQogCi12b2lkIEpJVENvZGVHZW5lcmF0b3I6OmNhY2hl
ZFB1dEJ5SWQoR1BSUmVnIGJhc2VHUFIsIEdQUlJlZyB2YWx1ZUdQUiwgTm9kZUluZGV4IHZhbHVl
SW5kZXgsIEdQUlJlZyBzY3JhdGNoR1BSLCB1bnNpZ25lZCBpZGVudGlmaWVyTnVtYmVyLCBQdXRL
aW5kIHB1dEtpbmQsIEpJVENvbXBpbGVyOjpKdW1wIHNsb3dQYXRoVGFyZ2V0KQotewotICAgIAot
ICAgIEpJVENvbXBpbGVyOjpEYXRhTGFiZWxQdHIgc3RydWN0dXJlVG9Db21wYXJlOwotICAgIEpJ
VENvbXBpbGVyOjpKdW1wIHN0cnVjdHVyZUNoZWNrID0gbV9qaXQuYnJhbmNoUHRyV2l0aFBhdGNo
KEpJVENvbXBpbGVyOjpOb3RFcXVhbCwgSklUQ29tcGlsZXI6OkFkZHJlc3MoYmFzZUdQUiwgSlND
ZWxsOjpzdHJ1Y3R1cmVPZmZzZXQoKSksIHN0cnVjdHVyZVRvQ29tcGFyZSwgSklUQ29tcGlsZXI6
OlRydXN0ZWRJbW1QdHIocmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oLTEpKSk7Ci0KLSAgICB3cml0
ZUJhcnJpZXIoYmFzZUdQUiwgdmFsdWVHUFIsIHZhbHVlSW5kZXgsIFdyaXRlQmFycmllckZvclBy
b3BlcnR5QWNjZXNzLCBzY3JhdGNoR1BSKTsKLQotICAgIG1faml0LmxvYWRQdHIoSklUQ29tcGls
ZXI6OkFkZHJlc3MoYmFzZUdQUiwgSlNPYmplY3Q6Om9mZnNldE9mUHJvcGVydHlTdG9yYWdlKCkp
LCBzY3JhdGNoR1BSKTsKLSAgICBKSVRDb21waWxlcjo6RGF0YUxhYmVsMzIgc3RvcmVXaXRoUGF0
Y2ggPSBtX2ppdC5zdG9yZVB0cldpdGhBZGRyZXNzT2Zmc2V0UGF0Y2godmFsdWVHUFIsIEpJVENv
bXBpbGVyOjpBZGRyZXNzKHNjcmF0Y2hHUFIsIDApKTsKLQotICAgIEpJVENvbXBpbGVyOjpKdW1w
IGRvbmUgPSBtX2ppdC5qdW1wKCk7Ci0KLSAgICBzdHJ1Y3R1cmVDaGVjay5saW5rKCZtX2ppdCk7
Ci0KLSAgICBpZiAoc2xvd1BhdGhUYXJnZXQuaXNTZXQoKSkKLSAgICAgICAgc2xvd1BhdGhUYXJn
ZXQubGluaygmbV9qaXQpOwotCi0gICAgSklUQ29tcGlsZXI6OkxhYmVsIHNsb3dDYXNlID0gbV9q
aXQubGFiZWwoKTsKLQotICAgIHNpbGVudFNwaWxsQWxsUmVnaXN0ZXJzKEludmFsaWRHUFJSZWcp
OwotICAgIHNldHVwVHdvU3R1YkFyZ3M8R1BSSW5mbzo6YXJndW1lbnRHUFIxLCBHUFJJbmZvOjph
cmd1bWVudEdQUjI+KHZhbHVlR1BSLCBiYXNlR1BSKTsKLSAgICBtX2ppdC5tb3ZlKEpJVENvbXBp
bGVyOjpJbW1QdHIoaWRlbnRpZmllcihpZGVudGlmaWVyTnVtYmVyKSksIEdQUkluZm86OmFyZ3Vt
ZW50R1BSMyk7Ci0gICAgbV9qaXQubW92ZShHUFJJbmZvOjpjYWxsRnJhbWVSZWdpc3RlciwgR1BS
SW5mbzo6YXJndW1lbnRHUFIwKTsKLSAgICBWX0RGR09wZXJhdGlvbl9FSkpJIG9wdGltaXplZENh
bGw7Ci0gICAgaWYgKG1faml0LmNvZGVCbG9jaygpLT5pc1N0cmljdE1vZGUoKSkgewotICAgICAg
ICBpZiAocHV0S2luZCA9PSBEaXJlY3QpCi0gICAgICAgICAgICBvcHRpbWl6ZWRDYWxsID0gb3Bl
cmF0aW9uUHV0QnlJZERpcmVjdFN0cmljdE9wdGltaXplOwotICAgICAgICBlbHNlCi0gICAgICAg
ICAgICBvcHRpbWl6ZWRDYWxsID0gb3BlcmF0aW9uUHV0QnlJZFN0cmljdE9wdGltaXplOwotICAg
IH0gZWxzZSB7Ci0gICAgICAgIGlmIChwdXRLaW5kID09IERpcmVjdCkKLSAgICAgICAgICAgIG9w
dGltaXplZENhbGwgPSBvcGVyYXRpb25QdXRCeUlkRGlyZWN0Tm9uU3RyaWN0T3B0aW1pemU7Ci0g
ICAgICAgIGVsc2UKLSAgICAgICAgICAgIG9wdGltaXplZENhbGwgPSBvcGVyYXRpb25QdXRCeUlk
Tm9uU3RyaWN0T3B0aW1pemU7Ci0gICAgfQotICAgIEpJVENvbXBpbGVyOjpDYWxsIGZ1bmN0aW9u
Q2FsbCA9IGFwcGVuZENhbGxXaXRoRXhjZXB0aW9uQ2hlY2sob3B0aW1pemVkQ2FsbCk7Ci0gICAg
c2lsZW50RmlsbEFsbFJlZ2lzdGVycyhJbnZhbGlkR1BSUmVnKTsKLQotICAgIGRvbmUubGluaygm
bV9qaXQpOwotICAgIEpJVENvbXBpbGVyOjpMYWJlbCBkb25lTGFiZWwgPSBtX2ppdC5sYWJlbCgp
OwotCi0gICAgaW50MTZfdCBjaGVja0ltbVRvQ2FsbCA9IHNhZmVDYXN0PGludDE2X3Q+KG1faml0
LmRpZmZlcmVuY2VCZXR3ZWVuKHN0cnVjdHVyZVRvQ29tcGFyZSwgZnVuY3Rpb25DYWxsKSk7Ci0g
ICAgaW50MTZfdCBjYWxsVG9DaGVjayA9IHNhZmVDYXN0PGludDE2X3Q+KG1faml0LmRpZmZlcmVu
Y2VCZXR3ZWVuKGZ1bmN0aW9uQ2FsbCwgc3RydWN0dXJlQ2hlY2spKTsKLSAgICBpbnQxNl90IGNh
bGxUb1N0b3JlID0gc2FmZUNhc3Q8aW50MTZfdD4obV9qaXQuZGlmZmVyZW5jZUJldHdlZW4oZnVu
Y3Rpb25DYWxsLCBzdG9yZVdpdGhQYXRjaCkpOwotICAgIGludDE2X3QgY2FsbFRvU2xvd0Nhc2Ug
PSBzYWZlQ2FzdDxpbnQxNl90PihtX2ppdC5kaWZmZXJlbmNlQmV0d2VlbihmdW5jdGlvbkNhbGws
IHNsb3dDYXNlKSk7Ci0gICAgaW50MTZfdCBjYWxsVG9Eb25lID0gc2FmZUNhc3Q8aW50MTZfdD4o
bV9qaXQuZGlmZmVyZW5jZUJldHdlZW4oZnVuY3Rpb25DYWxsLCBkb25lTGFiZWwpKTsKLQotICAg
IG1faml0LmFkZFByb3BlcnR5QWNjZXNzKGZ1bmN0aW9uQ2FsbCwgY2hlY2tJbW1Ub0NhbGwsIGNh
bGxUb0NoZWNrLCBjYWxsVG9TdG9yZSwgY2FsbFRvU2xvd0Nhc2UsIGNhbGxUb0RvbmUsIHNhZmVD
YXN0PGludDhfdD4oYmFzZUdQUiksIHNhZmVDYXN0PGludDhfdD4odmFsdWVHUFIpLCBzYWZlQ2Fz
dDxpbnQ4X3Q+KHNjcmF0Y2hHUFIpKTsKLX0KLQotdm9pZCBKSVRDb2RlR2VuZXJhdG9yOjpjYWNo
ZWRHZXRNZXRob2QoR1BSUmVnIGJhc2VHUFIsIEdQUlJlZyByZXN1bHRHUFIsIEdQUlJlZyBzY3Jh
dGNoR1BSLCB1bnNpZ25lZCBpZGVudGlmaWVyTnVtYmVyLCBKSVRDb21waWxlcjo6SnVtcCBzbG93
UGF0aFRhcmdldCkKLXsKLSAgICBKSVRDb21waWxlcjo6Q2FsbCBzbG93Q2FsbDsKLSAgICBKSVRD
b21waWxlcjo6RGF0YUxhYmVsUHRyIHN0cnVjdFRvQ29tcGFyZSwgcHJvdG9PYmosIHByb3RvU3Ry
dWN0VG9Db21wYXJlLCBwdXRGdW5jdGlvbjsKLSAgICAKLSAgICBKSVRDb21waWxlcjo6SnVtcCB3
cm9uZ1N0cnVjdHVyZSA9IG1faml0LmJyYW5jaFB0cldpdGhQYXRjaChKSVRDb21waWxlcjo6Tm90
RXF1YWwsIEpJVENvbXBpbGVyOjpBZGRyZXNzKGJhc2VHUFIsIEpTQ2VsbDo6c3RydWN0dXJlT2Zm
c2V0KCkpLCBzdHJ1Y3RUb0NvbXBhcmUsIEpJVENvbXBpbGVyOjpUcnVzdGVkSW1tUHRyKHJlaW50
ZXJwcmV0X2Nhc3Q8dm9pZCo+KC0xKSkpOwotICAgIHByb3RvT2JqID0gbV9qaXQubW92ZVdpdGhQ
YXRjaChKSVRDb21waWxlcjo6VHJ1c3RlZEltbVB0cigwKSwgcmVzdWx0R1BSKTsKLSAgICBKSVRD
b21waWxlcjo6SnVtcCB3cm9uZ1Byb3RvU3RydWN0dXJlID0gbV9qaXQuYnJhbmNoUHRyV2l0aFBh
dGNoKEpJVENvbXBpbGVyOjpOb3RFcXVhbCwgSklUQ29tcGlsZXI6OkFkZHJlc3MocmVzdWx0R1BS
LCBKU0NlbGw6OnN0cnVjdHVyZU9mZnNldCgpKSwgcHJvdG9TdHJ1Y3RUb0NvbXBhcmUsIEpJVENv
bXBpbGVyOjpUcnVzdGVkSW1tUHRyKHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KC0xKSkpOwotICAg
IAotICAgIHB1dEZ1bmN0aW9uID0gbV9qaXQubW92ZVdpdGhQYXRjaChKSVRDb21waWxlcjo6VHJ1
c3RlZEltbVB0cigwKSwgcmVzdWx0R1BSKTsKLSAgICAKLSAgICBKSVRDb21waWxlcjo6SnVtcCBk
b25lID0gbV9qaXQuanVtcCgpOwotICAgIAotICAgIHdyb25nU3RydWN0dXJlLmxpbmsoJm1faml0
KTsKLSAgICB3cm9uZ1Byb3RvU3RydWN0dXJlLmxpbmsoJm1faml0KTsKLSAgICAKLSAgICBzbG93
Q2FsbCA9IGNhY2hlZEdldEJ5SWQoYmFzZUdQUiwgcmVzdWx0R1BSLCBzY3JhdGNoR1BSLCBpZGVu
dGlmaWVyTnVtYmVyLCBzbG93UGF0aFRhcmdldCwgR2V0TWV0aG9kKTsKLSAgICAKLSAgICBkb25l
LmxpbmsoJm1faml0KTsKLSAgICAKLSAgICBtX2ppdC5hZGRNZXRob2RHZXQoc2xvd0NhbGwsIHN0
cnVjdFRvQ29tcGFyZSwgcHJvdG9PYmosIHByb3RvU3RydWN0VG9Db21wYXJlLCBwdXRGdW5jdGlv
bik7Ci19Ci0KLXZvaWQgSklUQ29kZUdlbmVyYXRvcjo6bm9uU3BlY3VsYXRpdmVOb25QZWVwaG9s
ZUNvbXBhcmVOdWxsKE5vZGVJbmRleCBvcGVyYW5kLCBib29sIGludmVydCkKLXsKLSAgICBKU1Zh
bHVlT3BlcmFuZCBhcmcodGhpcywgb3BlcmFuZCk7Ci0gICAgR1BSUmVnIGFyZ0dQUiA9IGFyZy5n
cHIoKTsKLSAgICAKLSAgICBHUFJUZW1wb3JhcnkgcmVzdWx0KHRoaXMsIGFyZyk7Ci0gICAgR1BS
UmVnIHJlc3VsdEdQUiA9IHJlc3VsdC5ncHIoKTsKLSAgICAKLSAgICBKSVRDb21waWxlcjo6SnVt
cCBub3RDZWxsOwotICAgIAotICAgIGlmICghaXNLbm93bkNlbGwob3BlcmFuZCkpCi0gICAgICAg
IG5vdENlbGwgPSBtX2ppdC5icmFuY2hUZXN0UHRyKE1hY3JvQXNzZW1ibGVyOjpOb25aZXJvLCBh
cmdHUFIsIEdQUkluZm86OnRhZ01hc2tSZWdpc3Rlcik7Ci0gICAgCi0gICAgbV9qaXQubG9hZFB0
cihKSVRDb21waWxlcjo6QWRkcmVzcyhhcmdHUFIsIEpTQ2VsbDo6c3RydWN0dXJlT2Zmc2V0KCkp
LCByZXN1bHRHUFIpOwotICAgIG1faml0LnRlc3Q4KGludmVydCA/IEpJVENvbXBpbGVyOjpaZXJv
IDogSklUQ29tcGlsZXI6Ok5vblplcm8sIEpJVENvbXBpbGVyOjpBZGRyZXNzKHJlc3VsdEdQUiwg
U3RydWN0dXJlOjp0eXBlSW5mb0ZsYWdzT2Zmc2V0KCkpLCBKSVRDb21waWxlcjo6VHJ1c3RlZElt
bTMyKE1hc3F1ZXJhZGVzQXNVbmRlZmluZWQpLCByZXN1bHRHUFIpOwotICAgIAotICAgIGlmICgh
aXNLbm93bkNlbGwob3BlcmFuZCkpIHsKLSAgICAgICAgSklUQ29tcGlsZXI6Okp1bXAgZG9uZSA9
IG1faml0Lmp1bXAoKTsKLSAgICAgICAgCi0gICAgICAgIG5vdENlbGwubGluaygmbV9qaXQpOwot
ICAgICAgICAKLSAgICAgICAgbV9qaXQubW92ZShhcmdHUFIsIHJlc3VsdEdQUik7Ci0gICAgICAg
IG1faml0LmFuZFB0cihKSVRDb21waWxlcjo6VHJ1c3RlZEltbTMyKH5UYWdCaXRVbmRlZmluZWQp
LCByZXN1bHRHUFIpOwotICAgICAgICBtX2ppdC5jb21wYXJlUHRyKGludmVydCA/IEpJVENvbXBp
bGVyOjpOb3RFcXVhbCA6IEpJVENvbXBpbGVyOjpFcXVhbCwgcmVzdWx0R1BSLCBKSVRDb21waWxl
cjo6VHJ1c3RlZEltbTMyKFZhbHVlTnVsbCksIHJlc3VsdEdQUik7Ci0gICAgICAgIAotICAgICAg
ICBkb25lLmxpbmsoJm1faml0KTsKLSAgICB9Ci0gICAgCi0gICAgbV9qaXQub3IzMihUcnVzdGVk
SW1tMzIoVmFsdWVGYWxzZSksIHJlc3VsdEdQUik7Ci0gICAganNWYWx1ZVJlc3VsdChyZXN1bHRH
UFIsIG1fY29tcGlsZUluZGV4LCBEYXRhRm9ybWF0SlNCb29sZWFuKTsKLX0KLQotdm9pZCBKSVRD
b2RlR2VuZXJhdG9yOjpub25TcGVjdWxhdGl2ZVBlZXBob2xlQnJhbmNoTnVsbChOb2RlSW5kZXgg
b3BlcmFuZCwgTm9kZUluZGV4IGJyYW5jaE5vZGVJbmRleCwgYm9vbCBpbnZlcnQpCi17Ci0gICAg
Tm9kZSYgYnJhbmNoTm9kZSA9IG1faml0LmdyYXBoKClbYnJhbmNoTm9kZUluZGV4XTsKLSAgICBC
bG9ja0luZGV4IHRha2VuID0gbV9qaXQuZ3JhcGgoKS5ibG9ja0luZGV4Rm9yQnl0ZWNvZGVPZmZz
ZXQoYnJhbmNoTm9kZS50YWtlbkJ5dGVjb2RlT2Zmc2V0KCkpOwotICAgIEJsb2NrSW5kZXggbm90
VGFrZW4gPSBtX2ppdC5ncmFwaCgpLmJsb2NrSW5kZXhGb3JCeXRlY29kZU9mZnNldChicmFuY2hO
b2RlLm5vdFRha2VuQnl0ZWNvZGVPZmZzZXQoKSk7Ci0gICAgCi0gICAgaWYgKHRha2VuID09ICht
X2Jsb2NrICsgMSkpIHsKLSAgICAgICAgaW52ZXJ0ID0gIWludmVydDsKLSAgICAgICAgQmxvY2tJ
bmRleCB0bXAgPSB0YWtlbjsKLSAgICAgICAgdGFrZW4gPSBub3RUYWtlbjsKLSAgICAgICAgbm90
VGFrZW4gPSB0bXA7Ci0gICAgfQotCi0gICAgSlNWYWx1ZU9wZXJhbmQgYXJnKHRoaXMsIG9wZXJh
bmQpOwotICAgIEdQUlJlZyBhcmdHUFIgPSBhcmcuZ3ByKCk7Ci0gICAgCi0gICAgR1BSVGVtcG9y
YXJ5IHJlc3VsdCh0aGlzLCBhcmcpOwotICAgIEdQUlJlZyByZXN1bHRHUFIgPSByZXN1bHQuZ3By
KCk7Ci0gICAgCi0gICAgSklUQ29tcGlsZXI6Okp1bXAgbm90Q2VsbDsKLSAgICAKLSAgICBpZiAo
IWlzS25vd25DZWxsKG9wZXJhbmQpKQotICAgICAgICBub3RDZWxsID0gbV9qaXQuYnJhbmNoVGVz
dFB0cihNYWNyb0Fzc2VtYmxlcjo6Tm9uWmVybywgYXJnR1BSLCBHUFJJbmZvOjp0YWdNYXNrUmVn
aXN0ZXIpOwotICAgIAotICAgIG1faml0LmxvYWRQdHIoSklUQ29tcGlsZXI6OkFkZHJlc3MoYXJn
R1BSLCBKU0NlbGw6OnN0cnVjdHVyZU9mZnNldCgpKSwgcmVzdWx0R1BSKTsKLSAgICBhZGRCcmFu
Y2gobV9qaXQuYnJhbmNoVGVzdDgoaW52ZXJ0ID8gSklUQ29tcGlsZXI6Olplcm8gOiBKSVRDb21w
aWxlcjo6Tm9uWmVybywgSklUQ29tcGlsZXI6OkFkZHJlc3MocmVzdWx0R1BSLCBTdHJ1Y3R1cmU6
OnR5cGVJbmZvRmxhZ3NPZmZzZXQoKSksIEpJVENvbXBpbGVyOjpUcnVzdGVkSW1tMzIoTWFzcXVl
cmFkZXNBc1VuZGVmaW5lZCkpLCB0YWtlbik7Ci0gICAgCi0gICAgaWYgKCFpc0tub3duQ2VsbChv
cGVyYW5kKSkgewotICAgICAgICBhZGRCcmFuY2gobV9qaXQuanVtcCgpLCBub3RUYWtlbik7Ci0g
ICAgICAgIAotICAgICAgICBub3RDZWxsLmxpbmsoJm1faml0KTsKLSAgICAgICAgCi0gICAgICAg
IG1faml0Lm1vdmUoYXJnR1BSLCByZXN1bHRHUFIpOwotICAgICAgICBtX2ppdC5hbmRQdHIoSklU
Q29tcGlsZXI6OlRydXN0ZWRJbW0zMih+VGFnQml0VW5kZWZpbmVkKSwgcmVzdWx0R1BSKTsKLSAg
ICAgICAgYWRkQnJhbmNoKG1faml0LmJyYW5jaFB0cihpbnZlcnQgPyBKSVRDb21waWxlcjo6Tm90
RXF1YWwgOiBKSVRDb21waWxlcjo6RXF1YWwsIHJlc3VsdEdQUiwgSklUQ29tcGlsZXI6OlRydXN0
ZWRJbW1QdHIocmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oVmFsdWVOdWxsKSkpLCB0YWtlbik7Ci0g
ICAgfQotICAgIAotICAgIGlmIChub3RUYWtlbiAhPSAobV9ibG9jayArIDEpKQotICAgICAgICBh
ZGRCcmFuY2gobV9qaXQuanVtcCgpLCBub3RUYWtlbik7Ci19Ci0KLWJvb2wgSklUQ29kZUdlbmVy
YXRvcjo6bm9uU3BlY3VsYXRpdmVDb21wYXJlTnVsbChOb2RlJiBub2RlLCBOb2RlSW5kZXggb3Bl
cmFuZCwgYm9vbCBpbnZlcnQpCi17Ci0gICAgTm9kZUluZGV4IGJyYW5jaE5vZGVJbmRleCA9IGRl
dGVjdFBlZXBIb2xlQnJhbmNoKCk7Ci0gICAgaWYgKGJyYW5jaE5vZGVJbmRleCAhPSBOb05vZGUp
IHsKLSAgICAgICAgQVNTRVJUKG5vZGUuYWRqdXN0ZWRSZWZDb3VudCgpID09IDEpOwotICAgICAg
ICAKLSAgICAgICAgbm9uU3BlY3VsYXRpdmVQZWVwaG9sZUJyYW5jaE51bGwob3BlcmFuZCwgYnJh
bmNoTm9kZUluZGV4LCBpbnZlcnQpOwotICAgIAotICAgICAgICB1c2Uobm9kZS5jaGlsZDEoKSk7
Ci0gICAgICAgIHVzZShub2RlLmNoaWxkMigpKTsKLSAgICAgICAgbV9jb21waWxlSW5kZXggPSBi
cmFuY2hOb2RlSW5kZXg7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0g
ICAgCi0gICAgbm9uU3BlY3VsYXRpdmVOb25QZWVwaG9sZUNvbXBhcmVOdWxsKG9wZXJhbmQsIGlu
dmVydCk7Ci0gICAgCi0gICAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIEpJVENvZGVHZW5lcmF0
b3I6Om5vblNwZWN1bGF0aXZlUGVlcGhvbGVCcmFuY2goTm9kZSYgbm9kZSwgTm9kZUluZGV4IGJy
YW5jaE5vZGVJbmRleCwgTWFjcm9Bc3NlbWJsZXI6OlJlbGF0aW9uYWxDb25kaXRpb24gY29uZCwg
Wl9ERkdPcGVyYXRpb25fRUpKIGhlbHBlckZ1bmN0aW9uKQotewotICAgIE5vZGUmIGJyYW5jaE5v
ZGUgPSBtX2ppdC5ncmFwaCgpW2JyYW5jaE5vZGVJbmRleF07Ci0gICAgQmxvY2tJbmRleCB0YWtl
biA9IG1faml0LmdyYXBoKCkuYmxvY2tJbmRleEZvckJ5dGVjb2RlT2Zmc2V0KGJyYW5jaE5vZGUu
dGFrZW5CeXRlY29kZU9mZnNldCgpKTsKLSAgICBCbG9ja0luZGV4IG5vdFRha2VuID0gbV9qaXQu
Z3JhcGgoKS5ibG9ja0luZGV4Rm9yQnl0ZWNvZGVPZmZzZXQoYnJhbmNoTm9kZS5ub3RUYWtlbkJ5
dGVjb2RlT2Zmc2V0KCkpOwotCi0gICAgSklUQ29tcGlsZXI6OlJlc3VsdENvbmRpdGlvbiBjYWxs
UmVzdWx0Q29uZGl0aW9uID0gSklUQ29tcGlsZXI6Ok5vblplcm87Ci0KLSAgICAvLyBUaGUgYnJh
bmNoIGluc3RydWN0aW9uIHdpbGwgYnJhbmNoIHRvIHRoZSB0YWtlbiBibG9jay4KLSAgICAvLyBJ
ZiB0YWtlbiBpcyBuZXh0LCBzd2l0Y2ggdGFrZW4gd2l0aCBub3RUYWtlbiAmIGludmVydCB0aGUg
YnJhbmNoIGNvbmRpdGlvbiBzbyB3ZSBjYW4gZmFsbCB0aHJvdWdoLgotICAgIGlmICh0YWtlbiA9
PSAobV9ibG9jayArIDEpKSB7Ci0gICAgICAgIGNvbmQgPSBKSVRDb21waWxlcjo6aW52ZXJ0KGNv
bmQpOwotICAgICAgICBjYWxsUmVzdWx0Q29uZGl0aW9uID0gSklUQ29tcGlsZXI6Olplcm87Ci0g
ICAgICAgIEJsb2NrSW5kZXggdG1wID0gdGFrZW47Ci0gICAgICAgIHRha2VuID0gbm90VGFrZW47
Ci0gICAgICAgIG5vdFRha2VuID0gdG1wOwotICAgIH0KLQotICAgIEpTVmFsdWVPcGVyYW5kIGFy
ZzEodGhpcywgbm9kZS5jaGlsZDEoKSk7Ci0gICAgSlNWYWx1ZU9wZXJhbmQgYXJnMih0aGlzLCBu
b2RlLmNoaWxkMigpKTsKLSAgICBHUFJSZWcgYXJnMUdQUiA9IGFyZzEuZ3ByKCk7Ci0gICAgR1BS
UmVnIGFyZzJHUFIgPSBhcmcyLmdwcigpOwotICAgIAotICAgIEpJVENvbXBpbGVyOjpKdW1wTGlz
dCBzbG93UGF0aDsKLSAgICAKLSAgICBpZiAoaXNLbm93bk5vdEludGVnZXIobm9kZS5jaGlsZDEo
KSkgfHwgaXNLbm93bk5vdEludGVnZXIobm9kZS5jaGlsZDIoKSkpIHsKLSAgICAgICAgR1BSUmVz
dWx0IHJlc3VsdCh0aGlzKTsKLSAgICAgICAgR1BSUmVnIHJlc3VsdEdQUiA9IHJlc3VsdC5ncHIo
KTsKLSAgICAKLSAgICAgICAgYXJnMS51c2UoKTsKLSAgICAgICAgYXJnMi51c2UoKTsKLSAgICAK
LSAgICAgICAgZmx1c2hSZWdpc3RlcnMoKTsKLQotICAgICAgICBjYWxsT3BlcmF0aW9uKGhlbHBl
ckZ1bmN0aW9uLCByZXN1bHRHUFIsIGFyZzFHUFIsIGFyZzJHUFIpOwotICAgICAgICBhZGRCcmFu
Y2gobV9qaXQuYnJhbmNoVGVzdDgoY2FsbFJlc3VsdENvbmRpdGlvbiwgcmVzdWx0R1BSKSwgdGFr
ZW4pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEdQUlRlbXBvcmFyeSByZXN1bHQodGhpcywgYXJn
Mik7Ci0gICAgICAgIEdQUlJlZyByZXN1bHRHUFIgPSByZXN1bHQuZ3ByKCk7Ci0gICAgCi0gICAg
ICAgIGFyZzEudXNlKCk7Ci0gICAgICAgIGFyZzIudXNlKCk7Ci0gICAgCi0gICAgICAgIGlmICgh
aXNLbm93bkludGVnZXIobm9kZS5jaGlsZDEoKSkpCi0gICAgICAgICAgICBzbG93UGF0aC5hcHBl
bmQobV9qaXQuYnJhbmNoUHRyKE1hY3JvQXNzZW1ibGVyOjpCZWxvdywgYXJnMUdQUiwgR1BSSW5m
bzo6dGFnVHlwZU51bWJlclJlZ2lzdGVyKSk7Ci0gICAgICAgIGlmICghaXNLbm93bkludGVnZXIo
bm9kZS5jaGlsZDIoKSkpCi0gICAgICAgICAgICBzbG93UGF0aC5hcHBlbmQobV9qaXQuYnJhbmNo
UHRyKE1hY3JvQXNzZW1ibGVyOjpCZWxvdywgYXJnMkdQUiwgR1BSSW5mbzo6dGFnVHlwZU51bWJl
clJlZ2lzdGVyKSk7Ci0gICAgCi0gICAgICAgIGFkZEJyYW5jaChtX2ppdC5icmFuY2gzMihjb25k
LCBhcmcxR1BSLCBhcmcyR1BSKSwgdGFrZW4pOwotICAgIAotICAgICAgICBpZiAoIWlzS25vd25J
bnRlZ2VyKG5vZGUuY2hpbGQxKCkpIHx8ICFpc0tub3duSW50ZWdlcihub2RlLmNoaWxkMigpKSkg
ewotICAgICAgICAgICAgYWRkQnJhbmNoKG1faml0Lmp1bXAoKSwgbm90VGFrZW4pOwotICAgIAot
ICAgICAgICAgICAgc2xvd1BhdGgubGluaygmbV9qaXQpOwotICAgIAotICAgICAgICAgICAgc2ls
ZW50U3BpbGxBbGxSZWdpc3RlcnMocmVzdWx0R1BSKTsKLSAgICAgICAgICAgIHNldHVwU3R1YkFy
Z3VtZW50cyhhcmcxR1BSLCBhcmcyR1BSKTsKLSAgICAgICAgICAgIG1faml0Lm1vdmUoR1BSSW5m
bzo6Y2FsbEZyYW1lUmVnaXN0ZXIsIEdQUkluZm86OmFyZ3VtZW50R1BSMCk7Ci0gICAgICAgICAg
ICBhcHBlbmRDYWxsV2l0aEV4Y2VwdGlvbkNoZWNrKGhlbHBlckZ1bmN0aW9uKTsKLSAgICAgICAg
ICAgIG1faml0Lm1vdmUoR1BSSW5mbzo6cmV0dXJuVmFsdWVHUFIsIHJlc3VsdEdQUik7Ci0gICAg
ICAgICAgICBzaWxlbnRGaWxsQWxsUmVnaXN0ZXJzKHJlc3VsdEdQUik7Ci0gICAgICAgIAotICAg
ICAgICAgICAgYWRkQnJhbmNoKG1faml0LmJyYW5jaFRlc3Q4KGNhbGxSZXN1bHRDb25kaXRpb24s
IHJlc3VsdEdQUiksIHRha2VuKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChub3RUYWtl
biAhPSAobV9ibG9jayArIDEpKQotICAgICAgICBhZGRCcmFuY2gobV9qaXQuanVtcCgpLCBub3RU
YWtlbik7Ci19Ci0KLXZvaWQgSklUQ29kZUdlbmVyYXRvcjo6bm9uU3BlY3VsYXRpdmVOb25QZWVw
aG9sZUNvbXBhcmUoTm9kZSYgbm9kZSwgTWFjcm9Bc3NlbWJsZXI6OlJlbGF0aW9uYWxDb25kaXRp
b24gY29uZCwgWl9ERkdPcGVyYXRpb25fRUpKIGhlbHBlckZ1bmN0aW9uKQotewotICAgIEpTVmFs
dWVPcGVyYW5kIGFyZzEodGhpcywgbm9kZS5jaGlsZDEoKSk7Ci0gICAgSlNWYWx1ZU9wZXJhbmQg
YXJnMih0aGlzLCBub2RlLmNoaWxkMigpKTsKLSAgICBHUFJSZWcgYXJnMUdQUiA9IGFyZzEuZ3By
KCk7Ci0gICAgR1BSUmVnIGFyZzJHUFIgPSBhcmcyLmdwcigpOwotICAgIAotICAgIEpJVENvbXBp
bGVyOjpKdW1wTGlzdCBzbG93UGF0aDsKLSAgICAKLSAgICBpZiAoaXNLbm93bk5vdEludGVnZXIo
bm9kZS5jaGlsZDEoKSkgfHwgaXNLbm93bk5vdEludGVnZXIobm9kZS5jaGlsZDIoKSkpIHsKLSAg
ICAgICAgR1BSUmVzdWx0IHJlc3VsdCh0aGlzKTsKLSAgICAgICAgR1BSUmVnIHJlc3VsdEdQUiA9
IHJlc3VsdC5ncHIoKTsKLSAgICAKLSAgICAgICAgYXJnMS51c2UoKTsKLSAgICAgICAgYXJnMi51
c2UoKTsKLSAgICAKLSAgICAgICAgZmx1c2hSZWdpc3RlcnMoKTsKLSAgICAgICAgCi0gICAgICAg
IGNhbGxPcGVyYXRpb24oaGVscGVyRnVuY3Rpb24sIHJlc3VsdEdQUiwgYXJnMUdQUiwgYXJnMkdQ
Uik7Ci0gICAgICAgIAotICAgICAgICBtX2ppdC5vcjMyKFRydXN0ZWRJbW0zMihWYWx1ZUZhbHNl
KSwgcmVzdWx0R1BSKTsKLSAgICAgICAganNWYWx1ZVJlc3VsdChyZXN1bHRHUFIsIG1fY29tcGls
ZUluZGV4LCBEYXRhRm9ybWF0SlNCb29sZWFuLCBVc2VDaGlsZHJlbkNhbGxlZEV4cGxpY2l0bHkp
OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEdQUlRlbXBvcmFyeSByZXN1bHQodGhpcywgYXJnMik7
Ci0gICAgICAgIEdQUlJlZyByZXN1bHRHUFIgPSByZXN1bHQuZ3ByKCk7Ci0KLSAgICAgICAgYXJn
MS51c2UoKTsKLSAgICAgICAgYXJnMi51c2UoKTsKLSAgICAKLSAgICAgICAgaWYgKCFpc0tub3du
SW50ZWdlcihub2RlLmNoaWxkMSgpKSkKLSAgICAgICAgICAgIHNsb3dQYXRoLmFwcGVuZChtX2pp
dC5icmFuY2hQdHIoTWFjcm9Bc3NlbWJsZXI6OkJlbG93LCBhcmcxR1BSLCBHUFJJbmZvOjp0YWdU
eXBlTnVtYmVyUmVnaXN0ZXIpKTsKLSAgICAgICAgaWYgKCFpc0tub3duSW50ZWdlcihub2RlLmNo
aWxkMigpKSkKLSAgICAgICAgICAgIHNsb3dQYXRoLmFwcGVuZChtX2ppdC5icmFuY2hQdHIoTWFj
cm9Bc3NlbWJsZXI6OkJlbG93LCBhcmcyR1BSLCBHUFJJbmZvOjp0YWdUeXBlTnVtYmVyUmVnaXN0
ZXIpKTsKLSAgICAKLSAgICAgICAgbV9qaXQuY29tcGFyZTMyKGNvbmQsIGFyZzFHUFIsIGFyZzJH
UFIsIHJlc3VsdEdQUik7Ci0gICAgCi0gICAgICAgIGlmICghaXNLbm93bkludGVnZXIobm9kZS5j
aGlsZDEoKSkgfHwgIWlzS25vd25JbnRlZ2VyKG5vZGUuY2hpbGQyKCkpKSB7Ci0gICAgICAgICAg
ICBKSVRDb21waWxlcjo6SnVtcCBoYXZlUmVzdWx0ID0gbV9qaXQuanVtcCgpOwotICAgIAotICAg
ICAgICAgICAgc2xvd1BhdGgubGluaygmbV9qaXQpOwotICAgICAgICAKLSAgICAgICAgICAgIHNp
bGVudFNwaWxsQWxsUmVnaXN0ZXJzKHJlc3VsdEdQUik7Ci0gICAgICAgICAgICBzZXR1cFN0dWJB
cmd1bWVudHMoYXJnMUdQUiwgYXJnMkdQUik7Ci0gICAgICAgICAgICBtX2ppdC5tb3ZlKEdQUklu
Zm86OmNhbGxGcmFtZVJlZ2lzdGVyLCBHUFJJbmZvOjphcmd1bWVudEdQUjApOwotICAgICAgICAg
ICAgYXBwZW5kQ2FsbFdpdGhFeGNlcHRpb25DaGVjayhoZWxwZXJGdW5jdGlvbik7Ci0gICAgICAg
ICAgICBtX2ppdC5tb3ZlKEdQUkluZm86OnJldHVyblZhbHVlR1BSLCByZXN1bHRHUFIpOwotICAg
ICAgICAgICAgc2lsZW50RmlsbEFsbFJlZ2lzdGVycyhyZXN1bHRHUFIpOwotICAgICAgICAKLSAg
ICAgICAgICAgIG1faml0LmFuZFB0cihUcnVzdGVkSW1tMzIoMSksIHJlc3VsdEdQUik7Ci0gICAg
ICAgIAotICAgICAgICAgICAgaGF2ZVJlc3VsdC5saW5rKCZtX2ppdCk7Ci0gICAgICAgIH0KLSAg
ICAgICAgCi0gICAgICAgIG1faml0Lm9yMzIoVHJ1c3RlZEltbTMyKFZhbHVlRmFsc2UpLCByZXN1
bHRHUFIpOwotICAgICAgICAKLSAgICAgICAganNWYWx1ZVJlc3VsdChyZXN1bHRHUFIsIG1fY29t
cGlsZUluZGV4LCBEYXRhRm9ybWF0SlNCb29sZWFuLCBVc2VDaGlsZHJlbkNhbGxlZEV4cGxpY2l0
bHkpOwotICAgIH0KLX0KLQogYm9vbCBKSVRDb2RlR2VuZXJhdG9yOjpub25TcGVjdWxhdGl2ZUNv
bXBhcmUoTm9kZSYgbm9kZSwgTWFjcm9Bc3NlbWJsZXI6OlJlbGF0aW9uYWxDb25kaXRpb24gY29u
ZCwgWl9ERkdPcGVyYXRpb25fRUpKIGhlbHBlckZ1bmN0aW9uKQogewogICAgIE5vZGVJbmRleCBi
cmFuY2hOb2RlSW5kZXggPSBkZXRlY3RQZWVwSG9sZUJyYW5jaCgpOwpAQCAtMTYwNSwxNDkgKzMy
Myw2IEBAIGJvb2wgSklUQ29kZUdlbmVyYXRvcjo6bm9uU3BlY3VsYXRpdmVDb20KICAgICByZXR1
cm4gZmFsc2U7CiB9CiAKLXZvaWQgSklUQ29kZUdlbmVyYXRvcjo6bm9uU3BlY3VsYXRpdmVQZWVw
aG9sZVN0cmljdEVxKE5vZGUmIG5vZGUsIE5vZGVJbmRleCBicmFuY2hOb2RlSW5kZXgsIGJvb2wg
aW52ZXJ0KQotewotICAgIE5vZGUmIGJyYW5jaE5vZGUgPSBtX2ppdC5ncmFwaCgpW2JyYW5jaE5v
ZGVJbmRleF07Ci0gICAgQmxvY2tJbmRleCB0YWtlbiA9IG1faml0LmdyYXBoKCkuYmxvY2tJbmRl
eEZvckJ5dGVjb2RlT2Zmc2V0KGJyYW5jaE5vZGUudGFrZW5CeXRlY29kZU9mZnNldCgpKTsKLSAg
ICBCbG9ja0luZGV4IG5vdFRha2VuID0gbV9qaXQuZ3JhcGgoKS5ibG9ja0luZGV4Rm9yQnl0ZWNv
ZGVPZmZzZXQoYnJhbmNoTm9kZS5ub3RUYWtlbkJ5dGVjb2RlT2Zmc2V0KCkpOwotCi0gICAgLy8g
VGhlIGJyYW5jaCBpbnN0cnVjdGlvbiB3aWxsIGJyYW5jaCB0byB0aGUgdGFrZW4gYmxvY2suCi0g
ICAgLy8gSWYgdGFrZW4gaXMgbmV4dCwgc3dpdGNoIHRha2VuIHdpdGggbm90VGFrZW4gJiBpbnZl
cnQgdGhlIGJyYW5jaCBjb25kaXRpb24gc28gd2UgY2FuIGZhbGwgdGhyb3VnaC4KLSAgICBpZiAo
dGFrZW4gPT0gKG1fYmxvY2sgKyAxKSkgewotICAgICAgICBpbnZlcnQgPSAhaW52ZXJ0OwotICAg
ICAgICBCbG9ja0luZGV4IHRtcCA9IHRha2VuOwotICAgICAgICB0YWtlbiA9IG5vdFRha2VuOwot
ICAgICAgICBub3RUYWtlbiA9IHRtcDsKLSAgICB9Ci0gICAgCi0gICAgSlNWYWx1ZU9wZXJhbmQg
YXJnMSh0aGlzLCBub2RlLmNoaWxkMSgpKTsKLSAgICBKU1ZhbHVlT3BlcmFuZCBhcmcyKHRoaXMs
IG5vZGUuY2hpbGQyKCkpOwotICAgIEdQUlJlZyBhcmcxR1BSID0gYXJnMS5ncHIoKTsKLSAgICBH
UFJSZWcgYXJnMkdQUiA9IGFyZzIuZ3ByKCk7Ci0gICAgCi0gICAgR1BSVGVtcG9yYXJ5IHJlc3Vs
dCh0aGlzKTsKLSAgICBHUFJSZWcgcmVzdWx0R1BSID0gcmVzdWx0LmdwcigpOwotICAgIAotICAg
IGFyZzEudXNlKCk7Ci0gICAgYXJnMi51c2UoKTsKLSAgICAKLSAgICBpZiAoaXNLbm93bkNlbGwo
bm9kZS5jaGlsZDEoKSkgJiYgaXNLbm93bkNlbGwobm9kZS5jaGlsZDIoKSkpIHsKLSAgICAgICAg
Ly8gc2VlIGlmIHdlIGdldCBsdWNreTogaWYgdGhlIGFyZ3VtZW50cyBhcmUgY2VsbHMgYW5kIHRo
ZXkgcmVmZXJlbmNlIHRoZSBzYW1lCi0gICAgICAgIC8vIGNlbGwsIHRoZW4gdGhleSBtdXN0IGJl
IHN0cmljdGx5IGVxdWFsLgotICAgICAgICBhZGRCcmFuY2gobV9qaXQuYnJhbmNoUHRyKEpJVENv
bXBpbGVyOjpFcXVhbCwgYXJnMUdQUiwgYXJnMkdQUiksIGludmVydCA/IG5vdFRha2VuIDogdGFr
ZW4pOwotICAgICAgICAKLSAgICAgICAgc2lsZW50U3BpbGxBbGxSZWdpc3RlcnMocmVzdWx0R1BS
KTsKLSAgICAgICAgc2V0dXBTdHViQXJndW1lbnRzKGFyZzFHUFIsIGFyZzJHUFIpOwotICAgICAg
ICBtX2ppdC5tb3ZlKEdQUkluZm86OmNhbGxGcmFtZVJlZ2lzdGVyLCBHUFJJbmZvOjphcmd1bWVu
dEdQUjApOwotICAgICAgICBhcHBlbmRDYWxsV2l0aEV4Y2VwdGlvbkNoZWNrKG9wZXJhdGlvbkNv
bXBhcmVTdHJpY3RFcUNlbGwpOwotICAgICAgICBtX2ppdC5tb3ZlKEdQUkluZm86OnJldHVyblZh
bHVlR1BSLCByZXN1bHRHUFIpOwotICAgICAgICBzaWxlbnRGaWxsQWxsUmVnaXN0ZXJzKHJlc3Vs
dEdQUik7Ci0gICAgICAgIAotICAgICAgICBhZGRCcmFuY2gobV9qaXQuYnJhbmNoVGVzdDgoaW52
ZXJ0ID8gSklUQ29tcGlsZXI6Ok5vblplcm8gOiBKSVRDb21waWxlcjo6WmVybywgcmVzdWx0R1BS
KSwgdGFrZW4pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1faml0Lm9yUHRyKGFyZzFHUFIsIGFy
ZzJHUFIsIHJlc3VsdEdQUik7Ci0gICAgICAgIAotICAgICAgICBKSVRDb21waWxlcjo6SnVtcCB0
d29DZWxsc0Nhc2UgPSBtX2ppdC5icmFuY2hUZXN0UHRyKEpJVENvbXBpbGVyOjpaZXJvLCByZXN1
bHRHUFIsIEdQUkluZm86OnRhZ01hc2tSZWdpc3Rlcik7Ci0gICAgICAgIAotICAgICAgICBKSVRD
b21waWxlcjo6SnVtcCBudW1iZXJDYXNlID0gbV9qaXQuYnJhbmNoVGVzdFB0cihKSVRDb21waWxl
cjo6Tm9uWmVybywgcmVzdWx0R1BSLCBHUFJJbmZvOjp0YWdUeXBlTnVtYmVyUmVnaXN0ZXIpOwot
ICAgICAgICAKLSAgICAgICAgYWRkQnJhbmNoKG1faml0LmJyYW5jaDMyKGludmVydCA/IEpJVENv
bXBpbGVyOjpOb3RFcXVhbCA6IEpJVENvbXBpbGVyOjpFcXVhbCwgYXJnMUdQUiwgYXJnMkdQUiks
IHRha2VuKTsKLSAgICAgICAgYWRkQnJhbmNoKG1faml0Lmp1bXAoKSwgbm90VGFrZW4pOwotICAg
ICAgICAKLSAgICAgICAgdHdvQ2VsbHNDYXNlLmxpbmsoJm1faml0KTsKLSAgICAgICAgYWRkQnJh
bmNoKG1faml0LmJyYW5jaFB0cihKSVRDb21waWxlcjo6RXF1YWwsIGFyZzFHUFIsIGFyZzJHUFIp
LCBpbnZlcnQgPyBub3RUYWtlbiA6IHRha2VuKTsKLSAgICAgICAgCi0gICAgICAgIG51bWJlckNh
c2UubGluaygmbV9qaXQpOwotICAgICAgICAKLSAgICAgICAgc2lsZW50U3BpbGxBbGxSZWdpc3Rl
cnMocmVzdWx0R1BSKTsKLSAgICAgICAgc2V0dXBTdHViQXJndW1lbnRzKGFyZzFHUFIsIGFyZzJH
UFIpOwotICAgICAgICBtX2ppdC5tb3ZlKEdQUkluZm86OmNhbGxGcmFtZVJlZ2lzdGVyLCBHUFJJ
bmZvOjphcmd1bWVudEdQUjApOwotICAgICAgICBhcHBlbmRDYWxsV2l0aEV4Y2VwdGlvbkNoZWNr
KG9wZXJhdGlvbkNvbXBhcmVTdHJpY3RFcSk7Ci0gICAgICAgIG1faml0Lm1vdmUoR1BSSW5mbzo6
cmV0dXJuVmFsdWVHUFIsIHJlc3VsdEdQUik7Ci0gICAgICAgIHNpbGVudEZpbGxBbGxSZWdpc3Rl
cnMocmVzdWx0R1BSKTsKLSAgICAgICAgCi0gICAgICAgIGFkZEJyYW5jaChtX2ppdC5icmFuY2hU
ZXN0OChpbnZlcnQgPyBKSVRDb21waWxlcjo6WmVybyA6IEpJVENvbXBpbGVyOjpOb25aZXJvLCBy
ZXN1bHRHUFIpLCB0YWtlbik7Ci0gICAgfQotICAgIAotICAgIGlmIChub3RUYWtlbiAhPSAobV9i
bG9jayArIDEpKQotICAgICAgICBhZGRCcmFuY2gobV9qaXQuanVtcCgpLCBub3RUYWtlbik7Ci19
Ci0KLXZvaWQgSklUQ29kZUdlbmVyYXRvcjo6bm9uU3BlY3VsYXRpdmVOb25QZWVwaG9sZVN0cmlj
dEVxKE5vZGUmIG5vZGUsIGJvb2wgaW52ZXJ0KQotewotICAgIEpTVmFsdWVPcGVyYW5kIGFyZzEo
dGhpcywgbm9kZS5jaGlsZDEoKSk7Ci0gICAgSlNWYWx1ZU9wZXJhbmQgYXJnMih0aGlzLCBub2Rl
LmNoaWxkMigpKTsKLSAgICBHUFJSZWcgYXJnMUdQUiA9IGFyZzEuZ3ByKCk7Ci0gICAgR1BSUmVn
IGFyZzJHUFIgPSBhcmcyLmdwcigpOwotICAgIAotICAgIEdQUlRlbXBvcmFyeSByZXN1bHQodGhp
cyk7Ci0gICAgR1BSUmVnIHJlc3VsdEdQUiA9IHJlc3VsdC5ncHIoKTsKLSAgICAKLSAgICBhcmcx
LnVzZSgpOwotICAgIGFyZzIudXNlKCk7Ci0gICAgCi0gICAgaWYgKGlzS25vd25DZWxsKG5vZGUu
Y2hpbGQxKCkpICYmIGlzS25vd25DZWxsKG5vZGUuY2hpbGQyKCkpKSB7Ci0gICAgICAgIC8vIHNl
ZSBpZiB3ZSBnZXQgbHVja3k6IGlmIHRoZSBhcmd1bWVudHMgYXJlIGNlbGxzIGFuZCB0aGV5IHJl
ZmVyZW5jZSB0aGUgc2FtZQotICAgICAgICAvLyBjZWxsLCB0aGVuIHRoZXkgbXVzdCBiZSBzdHJp
Y3RseSBlcXVhbC4KLSAgICAgICAgSklUQ29tcGlsZXI6Okp1bXAgbm90RXF1YWxDYXNlID0gbV9q
aXQuYnJhbmNoUHRyKEpJVENvbXBpbGVyOjpOb3RFcXVhbCwgYXJnMUdQUiwgYXJnMkdQUik7Ci0g
ICAgICAgIAotICAgICAgICBtX2ppdC5tb3ZlKEpJVENvbXBpbGVyOjpUcnVzdGVkSW1tUHRyKEpT
VmFsdWU6OmVuY29kZShqc0Jvb2xlYW4oIWludmVydCkpKSwgcmVzdWx0R1BSKTsKLSAgICAgICAg
Ci0gICAgICAgIEpJVENvbXBpbGVyOjpKdW1wIGRvbmUgPSBtX2ppdC5qdW1wKCk7Ci0KLSAgICAg
ICAgbm90RXF1YWxDYXNlLmxpbmsoJm1faml0KTsKLSAgICAgICAgCi0gICAgICAgIHNpbGVudFNw
aWxsQWxsUmVnaXN0ZXJzKHJlc3VsdEdQUik7Ci0gICAgICAgIHNldHVwU3R1YkFyZ3VtZW50cyhh
cmcxR1BSLCBhcmcyR1BSKTsKLSAgICAgICAgbV9qaXQubW92ZShHUFJJbmZvOjpjYWxsRnJhbWVS
ZWdpc3RlciwgR1BSSW5mbzo6YXJndW1lbnRHUFIwKTsKLSAgICAgICAgYXBwZW5kQ2FsbFdpdGhF
eGNlcHRpb25DaGVjayhvcGVyYXRpb25Db21wYXJlU3RyaWN0RXFDZWxsKTsKLSAgICAgICAgbV9q
aXQubW92ZShHUFJJbmZvOjpyZXR1cm5WYWx1ZUdQUiwgcmVzdWx0R1BSKTsKLSAgICAgICAgc2ls
ZW50RmlsbEFsbFJlZ2lzdGVycyhyZXN1bHRHUFIpOwotICAgICAgICAKLSAgICAgICAgbV9qaXQu
YW5kUHRyKEpJVENvbXBpbGVyOjpUcnVzdGVkSW1tMzIoMSksIHJlc3VsdEdQUik7Ci0gICAgICAg
IG1faml0Lm9yMzIoSklUQ29tcGlsZXI6OlRydXN0ZWRJbW0zMihWYWx1ZUZhbHNlKSwgcmVzdWx0
R1BSKTsKLSAgICAgICAgCi0gICAgICAgIGRvbmUubGluaygmbV9qaXQpOwotICAgIH0gZWxzZSB7
Ci0gICAgICAgIG1faml0Lm9yUHRyKGFyZzFHUFIsIGFyZzJHUFIsIHJlc3VsdEdQUik7Ci0gICAg
ICAgIAotICAgICAgICBKSVRDb21waWxlcjo6SnVtcCB0d29DZWxsc0Nhc2UgPSBtX2ppdC5icmFu
Y2hUZXN0UHRyKEpJVENvbXBpbGVyOjpaZXJvLCByZXN1bHRHUFIsIEdQUkluZm86OnRhZ01hc2tS
ZWdpc3Rlcik7Ci0gICAgICAgIAotICAgICAgICBKSVRDb21waWxlcjo6SnVtcCBudW1iZXJDYXNl
ID0gbV9qaXQuYnJhbmNoVGVzdFB0cihKSVRDb21waWxlcjo6Tm9uWmVybywgcmVzdWx0R1BSLCBH
UFJJbmZvOjp0YWdUeXBlTnVtYmVyUmVnaXN0ZXIpOwotICAgICAgICAKLSAgICAgICAgbV9qaXQu
Y29tcGFyZTMyKGludmVydCA/IEpJVENvbXBpbGVyOjpOb3RFcXVhbCA6IEpJVENvbXBpbGVyOjpF
cXVhbCwgYXJnMUdQUiwgYXJnMkdQUiwgcmVzdWx0R1BSKTsKLSAgICAgICAgCi0gICAgICAgIEpJ
VENvbXBpbGVyOjpKdW1wIGRvbmUxID0gbV9qaXQuanVtcCgpOwotICAgICAgICAKLSAgICAgICAg
dHdvQ2VsbHNDYXNlLmxpbmsoJm1faml0KTsKLSAgICAgICAgSklUQ29tcGlsZXI6Okp1bXAgbm90
RXF1YWxDYXNlID0gbV9qaXQuYnJhbmNoUHRyKEpJVENvbXBpbGVyOjpOb3RFcXVhbCwgYXJnMUdQ
UiwgYXJnMkdQUik7Ci0gICAgICAgIAotICAgICAgICBtX2ppdC5tb3ZlKEpJVENvbXBpbGVyOjpU
cnVzdGVkSW1tUHRyKEpTVmFsdWU6OmVuY29kZShqc0Jvb2xlYW4oIWludmVydCkpKSwgcmVzdWx0
R1BSKTsKLSAgICAgICAgCi0gICAgICAgIEpJVENvbXBpbGVyOjpKdW1wIGRvbmUyID0gbV9qaXQu
anVtcCgpOwotICAgICAgICAKLSAgICAgICAgbnVtYmVyQ2FzZS5saW5rKCZtX2ppdCk7Ci0gICAg
ICAgIG5vdEVxdWFsQ2FzZS5saW5rKCZtX2ppdCk7Ci0gICAgICAgIAotICAgICAgICBzaWxlbnRT
cGlsbEFsbFJlZ2lzdGVycyhyZXN1bHRHUFIpOwotICAgICAgICBzZXR1cFN0dWJBcmd1bWVudHMo
YXJnMUdQUiwgYXJnMkdQUik7Ci0gICAgICAgIG1faml0Lm1vdmUoR1BSSW5mbzo6Y2FsbEZyYW1l
UmVnaXN0ZXIsIEdQUkluZm86OmFyZ3VtZW50R1BSMCk7Ci0gICAgICAgIGFwcGVuZENhbGxXaXRo
RXhjZXB0aW9uQ2hlY2sob3BlcmF0aW9uQ29tcGFyZVN0cmljdEVxKTsKLSAgICAgICAgbV9qaXQu
bW92ZShHUFJJbmZvOjpyZXR1cm5WYWx1ZUdQUiwgcmVzdWx0R1BSKTsKLSAgICAgICAgc2lsZW50
RmlsbEFsbFJlZ2lzdGVycyhyZXN1bHRHUFIpOwotICAgICAgICAKLSAgICAgICAgbV9qaXQuYW5k
UHRyKEpJVENvbXBpbGVyOjpUcnVzdGVkSW1tMzIoMSksIHJlc3VsdEdQUik7Ci0KLSAgICAgICAg
ZG9uZTEubGluaygmbV9qaXQpOwotCi0gICAgICAgIG1faml0Lm9yMzIoSklUQ29tcGlsZXI6OlRy
dXN0ZWRJbW0zMihWYWx1ZUZhbHNlKSwgcmVzdWx0R1BSKTsKLSAgICAgICAgCi0gICAgICAgIGRv
bmUyLmxpbmsoJm1faml0KTsKLSAgICB9Ci0gICAgCi0gICAganNWYWx1ZVJlc3VsdChyZXN1bHRH
UFIsIG1fY29tcGlsZUluZGV4LCBEYXRhRm9ybWF0SlNCb29sZWFuLCBVc2VDaGlsZHJlbkNhbGxl
ZEV4cGxpY2l0bHkpOwotfQotCiBib29sIEpJVENvZGVHZW5lcmF0b3I6Om5vblNwZWN1bGF0aXZl
U3RyaWN0RXEoTm9kZSYgbm9kZSwgYm9vbCBpbnZlcnQpCiB7CiAgICAgaWYgKCFpbnZlcnQgJiYg
KGlzS25vd25OdW1lcmljKG5vZGUuY2hpbGQxKCkpIHx8IGlzS25vd25OdW1lcmljKG5vZGUuY2hp
bGQyKCkpKSkKQEAgLTE3NjksMTg0ICszNDQsNiBAQCBib29sIEpJVENvZGVHZW5lcmF0b3I6Om5v
blNwZWN1bGF0aXZlU3RyCiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi12b2lkIEpJVENvZGVHZW5l
cmF0b3I6OmVtaXRCcmFuY2goTm9kZSYgbm9kZSkKLXsKLSAgICBKU1ZhbHVlT3BlcmFuZCB2YWx1
ZSh0aGlzLCBub2RlLmNoaWxkMSgpKTsKLSAgICBHUFJSZWcgdmFsdWVHUFIgPSB2YWx1ZS5ncHIo
KTsKLSAgICAKLSAgICBCbG9ja0luZGV4IHRha2VuID0gbV9qaXQuZ3JhcGgoKS5ibG9ja0luZGV4
Rm9yQnl0ZWNvZGVPZmZzZXQobm9kZS50YWtlbkJ5dGVjb2RlT2Zmc2V0KCkpOwotICAgIEJsb2Nr
SW5kZXggbm90VGFrZW4gPSBtX2ppdC5ncmFwaCgpLmJsb2NrSW5kZXhGb3JCeXRlY29kZU9mZnNl
dChub2RlLm5vdFRha2VuQnl0ZWNvZGVPZmZzZXQoKSk7Ci0gICAgCi0gICAgaWYgKGlzS25vd25C
b29sZWFuKG5vZGUuY2hpbGQxKCkpKSB7Ci0gICAgICAgIE1hY3JvQXNzZW1ibGVyOjpSZXN1bHRD
b25kaXRpb24gY29uZGl0aW9uID0gTWFjcm9Bc3NlbWJsZXI6Ok5vblplcm87Ci0gICAgICAgIAot
ICAgICAgICBpZiAodGFrZW4gPT0gKG1fYmxvY2sgKyAxKSkgewotICAgICAgICAgICAgY29uZGl0
aW9uID0gTWFjcm9Bc3NlbWJsZXI6Olplcm87Ci0gICAgICAgICAgICBCbG9ja0luZGV4IHRtcCA9
IHRha2VuOwotICAgICAgICAgICAgdGFrZW4gPSBub3RUYWtlbjsKLSAgICAgICAgICAgIG5vdFRh
a2VuID0gdG1wOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBhZGRCcmFuY2gobV9qaXQu
YnJhbmNoVGVzdDMyKGNvbmRpdGlvbiwgdmFsdWVHUFIsIFRydXN0ZWRJbW0zMih0cnVlKSksIHRh
a2VuKTsKLSAgICAgICAgaWYgKG5vdFRha2VuICE9IChtX2Jsb2NrICsgMSkpCi0gICAgICAgICAg
ICBhZGRCcmFuY2gobV9qaXQuanVtcCgpLCBub3RUYWtlbik7Ci0gICAgICAgIAotICAgICAgICBu
b1Jlc3VsdChtX2NvbXBpbGVJbmRleCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgR1BSVGVtcG9y
YXJ5IHJlc3VsdCh0aGlzKTsKLSAgICAgICAgR1BSUmVnIHJlc3VsdEdQUiA9IHJlc3VsdC5ncHIo
KTsKLSAgICAgICAgCi0gICAgICAgIGJvb2wgcHJlZGljdEJvb2xlYW4gPSBpc0Jvb2xlYW5QcmVk
aWN0aW9uKG1faml0LmdldFByZWRpY3Rpb24obm9kZS5jaGlsZDEoKSkpOwotICAgIAotICAgICAg
ICBpZiAocHJlZGljdEJvb2xlYW4pIHsKLSAgICAgICAgICAgIGFkZEJyYW5jaChtX2ppdC5icmFu
Y2hQdHIoTWFjcm9Bc3NlbWJsZXI6OkVxdWFsLCB2YWx1ZUdQUiwgTWFjcm9Bc3NlbWJsZXI6Oklt
bVB0cihKU1ZhbHVlOjplbmNvZGUoanNCb29sZWFuKGZhbHNlKSkpKSwgbm90VGFrZW4pOwotICAg
ICAgICAgICAgYWRkQnJhbmNoKG1faml0LmJyYW5jaFB0cihNYWNyb0Fzc2VtYmxlcjo6RXF1YWws
IHZhbHVlR1BSLCBNYWNyb0Fzc2VtYmxlcjo6SW1tUHRyKEpTVmFsdWU6OmVuY29kZShqc0Jvb2xl
YW4odHJ1ZSkpKSksIHRha2VuKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKG1f
aXNTcGVjdWxhdGl2ZSAmJiBwcmVkaWN0Qm9vbGVhbikgewotICAgICAgICAgICAgc3BlY3VsYXRp
b25DaGVjayhtX2ppdC5qdW1wKCkpOwotICAgICAgICAgICAgdmFsdWUudXNlKCk7Ci0gICAgICAg
IH0gZWxzZSB7Ci0gICAgICAgICAgICBhZGRCcmFuY2gobV9qaXQuYnJhbmNoUHRyKE1hY3JvQXNz
ZW1ibGVyOjpFcXVhbCwgdmFsdWVHUFIsIE1hY3JvQXNzZW1ibGVyOjpJbW1QdHIoSlNWYWx1ZTo6
ZW5jb2RlKGpzTnVtYmVyKDApKSkpLCBub3RUYWtlbik7Ci0gICAgICAgICAgICBhZGRCcmFuY2go
bV9qaXQuYnJhbmNoUHRyKE1hY3JvQXNzZW1ibGVyOjpBYm92ZU9yRXF1YWwsIHZhbHVlR1BSLCBH
UFJJbmZvOjp0YWdUeXBlTnVtYmVyUmVnaXN0ZXIpLCB0YWtlbik7Ci0gICAgCi0gICAgICAgICAg
ICBpZiAoIXByZWRpY3RCb29sZWFuKSB7Ci0gICAgICAgICAgICAgICAgYWRkQnJhbmNoKG1faml0
LmJyYW5jaFB0cihNYWNyb0Fzc2VtYmxlcjo6RXF1YWwsIHZhbHVlR1BSLCBNYWNyb0Fzc2VtYmxl
cjo6SW1tUHRyKEpTVmFsdWU6OmVuY29kZShqc0Jvb2xlYW4oZmFsc2UpKSkpLCBub3RUYWtlbik7
Ci0gICAgICAgICAgICAgICAgYWRkQnJhbmNoKG1faml0LmJyYW5jaFB0cihNYWNyb0Fzc2VtYmxl
cjo6RXF1YWwsIHZhbHVlR1BSLCBNYWNyb0Fzc2VtYmxlcjo6SW1tUHRyKEpTVmFsdWU6OmVuY29k
ZShqc0Jvb2xlYW4odHJ1ZSkpKSksIHRha2VuKTsKLSAgICAgICAgICAgIH0KLSAgICAKLSAgICAg
ICAgICAgIHZhbHVlLnVzZSgpOwotICAgIAotICAgICAgICAgICAgc2lsZW50U3BpbGxBbGxSZWdp
c3RlcnMocmVzdWx0R1BSKTsKLSAgICAgICAgICAgIG1faml0Lm1vdmUodmFsdWVHUFIsIEdQUklu
Zm86OmFyZ3VtZW50R1BSMSk7Ci0gICAgICAgICAgICBtX2ppdC5tb3ZlKEdQUkluZm86OmNhbGxG
cmFtZVJlZ2lzdGVyLCBHUFJJbmZvOjphcmd1bWVudEdQUjApOwotICAgICAgICAgICAgYXBwZW5k
Q2FsbFdpdGhFeGNlcHRpb25DaGVjayhkZmdDb252ZXJ0SlNWYWx1ZVRvQm9vbGVhbik7Ci0gICAg
ICAgICAgICBtX2ppdC5tb3ZlKEdQUkluZm86OnJldHVyblZhbHVlR1BSLCByZXN1bHRHUFIpOwot
ICAgICAgICAgICAgc2lsZW50RmlsbEFsbFJlZ2lzdGVycyhyZXN1bHRHUFIpOwotICAgIAotICAg
ICAgICAgICAgYWRkQnJhbmNoKG1faml0LmJyYW5jaFRlc3Q4KE1hY3JvQXNzZW1ibGVyOjpOb25a
ZXJvLCByZXN1bHRHUFIpLCB0YWtlbik7Ci0gICAgICAgICAgICBpZiAobm90VGFrZW4gIT0gKG1f
YmxvY2sgKyAxKSkKLSAgICAgICAgICAgICAgICBhZGRCcmFuY2gobV9qaXQuanVtcCgpLCBub3RU
YWtlbik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIG5vUmVzdWx0KG1fY29tcGlsZUlu
ZGV4LCBVc2VDaGlsZHJlbkNhbGxlZEV4cGxpY2l0bHkpOwotICAgIH0KLX0KLQotdm9pZCBKSVRD
b2RlR2VuZXJhdG9yOjpub25TcGVjdWxhdGl2ZUxvZ2ljYWxOb3QoTm9kZSYgbm9kZSkKLXsKLSAg
ICBKU1ZhbHVlT3BlcmFuZCBhcmcxKHRoaXMsIG5vZGUuY2hpbGQxKCkpOwotICAgIEdQUlRlbXBv
cmFyeSByZXN1bHQodGhpcyk7Ci0gICAgCi0gICAgR1BSUmVnIGFyZzFHUFIgPSBhcmcxLmdwcigp
OwotICAgIEdQUlJlZyByZXN1bHRHUFIgPSByZXN1bHQuZ3ByKCk7Ci0gICAgCi0gICAgYXJnMS51
c2UoKTsKLSAgICAKLSAgICBtX2ppdC5tb3ZlKGFyZzFHUFIsIHJlc3VsdEdQUik7Ci0gICAgbV9q
aXQueG9yUHRyKFRydXN0ZWRJbW0zMihzdGF0aWNfY2FzdDxpbnQzMl90PihWYWx1ZUZhbHNlKSks
IHJlc3VsdEdQUik7Ci0gICAgSklUQ29tcGlsZXI6Okp1bXAgZmFzdENhc2UgPSBtX2ppdC5icmFu
Y2hUZXN0UHRyKEpJVENvbXBpbGVyOjpaZXJvLCByZXN1bHRHUFIsIFRydXN0ZWRJbW0zMihzdGF0
aWNfY2FzdDxpbnQzMl90Pih+MSkpKTsKLSAgICAKLSAgICBzaWxlbnRTcGlsbEFsbFJlZ2lzdGVy
cyhyZXN1bHRHUFIpOwotICAgIG1faml0Lm1vdmUoYXJnMUdQUiwgR1BSSW5mbzo6YXJndW1lbnRH
UFIxKTsKLSAgICBtX2ppdC5tb3ZlKEdQUkluZm86OmNhbGxGcmFtZVJlZ2lzdGVyLCBHUFJJbmZv
Ojphcmd1bWVudEdQUjApOwotICAgIGFwcGVuZENhbGxXaXRoRXhjZXB0aW9uQ2hlY2soZGZnQ29u
dmVydEpTVmFsdWVUb0Jvb2xlYW4pOwotICAgIG1faml0Lm1vdmUoR1BSSW5mbzo6cmV0dXJuVmFs
dWVHUFIsIHJlc3VsdEdQUik7Ci0gICAgc2lsZW50RmlsbEFsbFJlZ2lzdGVycyhyZXN1bHRHUFIp
OwotICAgIAotICAgIGZhc3RDYXNlLmxpbmsoJm1faml0KTsKLSAgICAKLSAgICBtX2ppdC54b3JQ
dHIoVHJ1c3RlZEltbTMyKHN0YXRpY19jYXN0PGludDMyX3Q+KFZhbHVlVHJ1ZSkpLCByZXN1bHRH
UFIpOwotICAgIGpzVmFsdWVSZXN1bHQocmVzdWx0R1BSLCBtX2NvbXBpbGVJbmRleCwgRGF0YUZv
cm1hdEpTQm9vbGVhbiwgVXNlQ2hpbGRyZW5DYWxsZWRFeHBsaWNpdGx5KTsKLX0KLQotdm9pZCBK
SVRDb2RlR2VuZXJhdG9yOjplbWl0Q2FsbChOb2RlJiBub2RlKQotewotICAgIFBfREZHT3BlcmF0
aW9uX0Ugc2xvd0NhbGxGdW5jdGlvbjsKLSAgICBib29sIGlzQ2FsbDsKLSAgICAKLSAgICBpZiAo
bm9kZS5vcCA9PSBDYWxsKSB7Ci0gICAgICAgIHNsb3dDYWxsRnVuY3Rpb24gPSBvcGVyYXRpb25M
aW5rQ2FsbDsKLSAgICAgICAgaXNDYWxsID0gdHJ1ZTsKLSAgICB9IGVsc2UgewotICAgICAgICBB
U1NFUlQobm9kZS5vcCA9PSBDb25zdHJ1Y3QpOwotICAgICAgICBzbG93Q2FsbEZ1bmN0aW9uID0g
b3BlcmF0aW9uTGlua0NvbnN0cnVjdDsKLSAgICAgICAgaXNDYWxsID0gZmFsc2U7Ci0gICAgfQot
ICAgIAotICAgIE5vZGVJbmRleCBjYWxsZWVOb2RlSW5kZXggPSBtX2ppdC5ncmFwaCgpLm1fdmFy
QXJnQ2hpbGRyZW5bbm9kZS5maXJzdENoaWxkKCldOwotICAgIEpTVmFsdWVPcGVyYW5kIGNhbGxl
ZSh0aGlzLCBjYWxsZWVOb2RlSW5kZXgpOwotICAgIEdQUlJlZyBjYWxsZWVHUFIgPSBjYWxsZWUu
Z3ByKCk7Ci0gICAgdXNlKGNhbGxlZU5vZGVJbmRleCk7Ci0gICAgCi0gICAgLy8gdGhlIGNhbGwg
aW5zdHJ1Y3Rpb24ncyBmaXJzdCBjaGlsZCBpcyBlaXRoZXIgdGhlIGZ1bmN0aW9uIChub3JtYWwg
Y2FsbCkgb3IgdGhlCi0gICAgLy8gcmVjZWl2ZXIgKG1ldGhvZCBjYWxsKS4gc3Vic2VxdWVudCBj
aGlsZHJlbiBhcmUgdGhlIGFyZ3VtZW50cy4KLSAgICBpbnQgbnVtQXJncyA9IG5vZGUubnVtQ2hp
bGRyZW4oKSAtIDE7Ci0gICAgCi0gICAgLy8gRm9yIGNvbnN0cnVjdG9ycywgdGhlIHRoaXMgYXJn
dW1lbnQgaXMgbm90IHBhc3NlZCBidXQgd2UgaGF2ZSB0byBtYWtlIHNwYWNlCi0gICAgLy8gZm9y
IGl0LgotICAgIGludCBudW1QYXNzZWRBcmdzID0gbnVtQXJncyArIChpc0NhbGwgPyAwIDogMSk7
Ci0gICAgCi0gICAgLy8gYW1vdW50IG9mIHN0dWZmIChpbiB1bml0cyBvZiBzaXplb2YoUmVnaXN0
ZXIpKSB0aGF0IHdlIG5lZWQgdG8gcGxhY2UgYXQgdGhlCi0gICAgLy8gdG9wIG9mIHRoZSBKUyBz
dGFjay4KLSAgICBpbnQgY2FsbERhdGFTaXplID0gMDsKLQotICAgIC8vIGZpcnN0IHRoZXJlIGFy
ZSB0aGUgYXJndW1lbnRzCi0gICAgY2FsbERhdGFTaXplICs9IG51bVBhc3NlZEFyZ3M7Ci0gICAg
Ci0gICAgLy8gYW5kIHRoZW4gdGhlcmUgaXMgdGhlIGNhbGwgZnJhbWUgaGVhZGVyCi0gICAgY2Fs
bERhdGFTaXplICs9IFJlZ2lzdGVyRmlsZTo6Q2FsbEZyYW1lSGVhZGVyU2l6ZTsKLSAgICAKLSAg
ICBtX2ppdC5zdG9yZVB0cihNYWNyb0Fzc2VtYmxlcjo6VHJ1c3RlZEltbVB0cihKU1ZhbHVlOjpl
bmNvZGUoanNOdW1iZXIobnVtUGFzc2VkQXJncykpKSwgYWRkcmVzc09mQ2FsbERhdGEoUmVnaXN0
ZXJGaWxlOjpBcmd1bWVudENvdW50KSk7Ci0gICAgbV9qaXQuc3RvcmVQdHIoR1BSSW5mbzo6Y2Fs
bEZyYW1lUmVnaXN0ZXIsIGFkZHJlc3NPZkNhbGxEYXRhKFJlZ2lzdGVyRmlsZTo6Q2FsbGVyRnJh
bWUpKTsKLSAgICAKLSAgICBmb3IgKGludCBhcmdJZHggPSAwOyBhcmdJZHggPCBudW1BcmdzOyBh
cmdJZHgrKykgewotICAgICAgICBOb2RlSW5kZXggYXJnTm9kZUluZGV4ID0gbV9qaXQuZ3JhcGgo
KS5tX3ZhckFyZ0NoaWxkcmVuW25vZGUuZmlyc3RDaGlsZCgpICsgMSArIGFyZ0lkeF07Ci0gICAg
ICAgIEpTVmFsdWVPcGVyYW5kIGFyZyh0aGlzLCBhcmdOb2RlSW5kZXgpOwotICAgICAgICBHUFJS
ZWcgYXJnR1BSID0gYXJnLmdwcigpOwotICAgICAgICB1c2UoYXJnTm9kZUluZGV4KTsKLSAgICAg
ICAgCi0gICAgICAgIG1faml0LnN0b3JlUHRyKGFyZ0dQUiwgYWRkcmVzc09mQ2FsbERhdGEoLWNh
bGxEYXRhU2l6ZSArIGFyZ0lkeCArIChpc0NhbGwgPyAwIDogMSkpKTsKLSAgICB9Ci0gICAgCi0g
ICAgbV9qaXQuc3RvcmVQdHIoY2FsbGVlR1BSLCBhZGRyZXNzT2ZDYWxsRGF0YShSZWdpc3RlckZp
bGU6OkNhbGxlZSkpOwotICAgIAotICAgIGZsdXNoUmVnaXN0ZXJzKCk7Ci0gICAgCi0gICAgR1BS
UmVzdWx0IHJlc3VsdCh0aGlzKTsKLSAgICBHUFJSZWcgcmVzdWx0R1BSID0gcmVzdWx0Lmdwcigp
OwotCi0gICAgSklUQ29tcGlsZXI6OkRhdGFMYWJlbFB0ciB0YXJnZXRUb0NoZWNrOwotICAgIEpJ
VENvbXBpbGVyOjpKdW1wIHNsb3dQYXRoOwotICAgIAotICAgIHNsb3dQYXRoID0gbV9qaXQuYnJh
bmNoUHRyV2l0aFBhdGNoKE1hY3JvQXNzZW1ibGVyOjpOb3RFcXVhbCwgY2FsbGVlR1BSLCB0YXJn
ZXRUb0NoZWNrLCBNYWNyb0Fzc2VtYmxlcjo6VHJ1c3RlZEltbVB0cihKU1ZhbHVlOjplbmNvZGUo
SlNWYWx1ZSgpKSkpOwotICAgIG1faml0LmxvYWRQdHIoTWFjcm9Bc3NlbWJsZXI6OkFkZHJlc3Mo
Y2FsbGVlR1BSLCBPQkpFQ1RfT0ZGU0VUT0YoSlNGdW5jdGlvbiwgbV9zY29wZUNoYWluKSksIHJl
c3VsdEdQUik7Ci0gICAgbV9qaXQuc3RvcmVQdHIocmVzdWx0R1BSLCBhZGRyZXNzT2ZDYWxsRGF0
YShSZWdpc3RlckZpbGU6OlNjb3BlQ2hhaW4pKTsKLQotICAgIG1faml0LmFkZFB0cihJbW0zMiht
X2ppdC5jb2RlQmxvY2soKS0+bV9udW1DYWxsZWVSZWdpc3RlcnMgKiBzaXplb2YoUmVnaXN0ZXIp
KSwgR1BSSW5mbzo6Y2FsbEZyYW1lUmVnaXN0ZXIpOwotICAgIAotICAgIEpJVENvbXBpbGVyOjpD
YWxsIGZhc3RDYWxsID0gbV9qaXQubmVhckNhbGwoKTsKLSAgICBtX2ppdC5ub3RpZnlDYWxsKGZh
c3RDYWxsLCBtX2ppdC5ncmFwaCgpW21fY29tcGlsZUluZGV4XS5jb2RlT3JpZ2luKTsKLSAgICAK
LSAgICBKSVRDb21waWxlcjo6SnVtcCBkb25lID0gbV9qaXQuanVtcCgpOwotICAgIAotICAgIHNs
b3dQYXRoLmxpbmsoJm1faml0KTsKLSAgICAKLSAgICBtX2ppdC5hZGRQdHIoSW1tMzIobV9qaXQu
Y29kZUJsb2NrKCktPm1fbnVtQ2FsbGVlUmVnaXN0ZXJzICogc2l6ZW9mKFJlZ2lzdGVyKSksIEdQ
UkluZm86OmNhbGxGcmFtZVJlZ2lzdGVyLCBHUFJJbmZvOjphcmd1bWVudEdQUjApOwotICAgIEpJ
VENvbXBpbGVyOjpDYWxsIHNsb3dDYWxsID0gbV9qaXQuYXBwZW5kQ2FsbFdpdGhGYXN0RXhjZXB0
aW9uQ2hlY2soc2xvd0NhbGxGdW5jdGlvbiwgbV9qaXQuZ3JhcGgoKVttX2NvbXBpbGVJbmRleF0u
Y29kZU9yaWdpbik7Ci0gICAgbV9qaXQubW92ZShJbW0zMihudW1QYXNzZWRBcmdzKSwgR1BSSW5m
bzo6cmVnVDEpOwotICAgIG1faml0LmFkZFB0cihJbW0zMihtX2ppdC5jb2RlQmxvY2soKS0+bV9u
dW1DYWxsZWVSZWdpc3RlcnMgKiBzaXplb2YoUmVnaXN0ZXIpKSwgR1BSSW5mbzo6Y2FsbEZyYW1l
UmVnaXN0ZXIpOwotICAgIG1faml0Lm5vdGlmeUNhbGwobV9qaXQuY2FsbChHUFJJbmZvOjpyZXR1
cm5WYWx1ZUdQUiksIG1faml0LmdyYXBoKClbbV9jb21waWxlSW5kZXhdLmNvZGVPcmlnaW4pOwot
ICAgIAotICAgIGRvbmUubGluaygmbV9qaXQpOwotICAgIAotICAgIG1faml0Lm1vdmUoR1BSSW5m
bzo6cmV0dXJuVmFsdWVHUFIsIHJlc3VsdEdQUik7Ci0gICAgCi0gICAganNWYWx1ZVJlc3VsdChy
ZXN1bHRHUFIsIG1fY29tcGlsZUluZGV4LCBEYXRhRm9ybWF0SlMsIFVzZUNoaWxkcmVuQ2FsbGVk
RXhwbGljaXRseSk7Ci0gICAgCi0gICAgbV9qaXQuYWRkSlNDYWxsKGZhc3RDYWxsLCBzbG93Q2Fs
bCwgdGFyZ2V0VG9DaGVjaywgaXNDYWxsLCBtX2ppdC5ncmFwaCgpW21fY29tcGlsZUluZGV4XS5j
b2RlT3JpZ2luKTsKLX0KLQogdm9pZCBKSVRDb2RlR2VuZXJhdG9yOjpzcGVjdWxhdGlvbkNoZWNr
KE1hY3JvQXNzZW1ibGVyOjpKdW1wIGp1bXBUb0ZhaWwpCiB7CiAgICAgQVNTRVJUKG1faXNTcGVj
dWxhdGl2ZSk7CkBAIC0xOTk2LDcgKzM5MywxMSBAQCB2b2lkIEpJVENvZGVHZW5lcmF0b3I6OmR1
bXAoY29uc3QgY2hhciogCiAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAlIDNkOltf
X11bX19dIiwgaSk7CiAgICAgICAgIGlmIChpbmZvLnJlZ2lzdGVyRm9ybWF0KCkgPT0gRGF0YUZv
cm1hdERvdWJsZSkKICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiOmZwciVkXG4iLCBpbmZv
LmZwcigpKTsKLSAgICAgICAgZWxzZSBpZiAoaW5mby5yZWdpc3RlckZvcm1hdCgpICE9IERhdGFG
b3JtYXROb25lKSB7CisgICAgICAgIGVsc2UgaWYgKGluZm8ucmVnaXN0ZXJGb3JtYXQoKSAhPSBE
YXRhRm9ybWF0Tm9uZQorI2lmIFVTRShKU1ZBTFVFMzJfNjQpCisgICAgICAgICAgICAmJiAhKGlu
Zm8ucmVnaXN0ZXJGb3JtYXQoKSAmIERhdGFGb3JtYXRKUykKKyNlbmRpZgorICAgICAgICAgICAg
KSB7CiAgICAgICAgICAgICBBU1NFUlQoaW5mby5ncHIoKSAhPSBJbnZhbGlkR1BSUmVnKTsKICAg
ICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiOiVzXG4iLCBHUFJJbmZvOjpkZWJ1Z05hbWUoaW5m
by5ncHIoKSkpOwogICAgICAgICB9IGVsc2UKQEAgLTIwMzQsMTIgKzQzNSwxNSBAQCB2b2lkIEpJ
VENvZGVHZW5lcmF0b3I6OmNoZWNrQ29uc2lzdGVuY3koCiAgICAgICAgIHN3aXRjaCAoaW5mby5y
ZWdpc3RlckZvcm1hdCgpKSB7CiAgICAgICAgIGNhc2UgRGF0YUZvcm1hdE5vbmU6CiAgICAgICAg
ICAgICBicmVhazsKLSAgICAgICAgY2FzZSBEYXRhRm9ybWF0SW50ZWdlcjoKLSAgICAgICAgY2Fz
ZSBEYXRhRm9ybWF0Q2VsbDoKICAgICAgICAgY2FzZSBEYXRhRm9ybWF0SlM6CiAgICAgICAgIGNh
c2UgRGF0YUZvcm1hdEpTSW50ZWdlcjoKICAgICAgICAgY2FzZSBEYXRhRm9ybWF0SlNEb3VibGU6
Ci0gICAgICAgIGNhc2UgRGF0YUZvcm1hdEpTQ2VsbDogeworICAgICAgICBjYXNlIERhdGFGb3Jt
YXRKU0NlbGw6CisjaWYgVVNFKEpTVkFMVUUzMl82NCkKKyAgICAgICAgICAgIGJyZWFrOworI2Vu
ZGlmCisgICAgICAgIGNhc2UgRGF0YUZvcm1hdEludGVnZXI6CisgICAgICAgIGNhc2UgRGF0YUZv
cm1hdENlbGw6IHsKICAgICAgICAgICAgIEdQUlJlZyBncHIgPSBpbmZvLmdwcigpOwogICAgICAg
ICAgICAgQVNTRVJUKGdwciAhPSBJbnZhbGlkR1BSUmVnKTsKICAgICAgICAgICAgIGlmIChtX2dw
cnMubmFtZShncHIpICE9IHZpcnR1YWxSZWdpc3RlcikgewpAQCAtMjA2NiwxMCArNDcwLDI0IEBA
IHZvaWQgSklUQ29kZUdlbmVyYXRvcjo6Y2hlY2tDb25zaXN0ZW5jeSgKICAgICAgICAgICAgIGNv
bnRpbnVlOwogCiAgICAgICAgIEdlbmVyYXRpb25JbmZvJiBpbmZvID0gbV9nZW5lcmF0aW9uSW5m
b1t2aXJ0dWFsUmVnaXN0ZXJdOworI2lmIFVTRShKU1ZBTFVFNjQpCiAgICAgICAgIGlmIChpdGVy
LnJlZ0lEKCkgIT0gaW5mby5ncHIoKSkgewogICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJE
RkdfQ09OU0lTVEVOQ1lfQ0hFQ0sgZmFpbGVkOiBuYW1lIG1pc21hdGNoIGZvciBncHIgJXMgKHZp
cnR1YWwgcmVnaXN0ZXIgJWQpLlxuIiwgaXRlci5kZWJ1Z05hbWUoKSwgdmlydHVhbFJlZ2lzdGVy
KTsKICAgICAgICAgICAgIGZhaWxlZCA9IHRydWU7CiAgICAgICAgIH0KKyNlbHNlCisgICAgICAg
IGlmICghKGluZm8ucmVnaXN0ZXJGb3JtYXQoKSAmIERhdGFGb3JtYXRKUykpIHsKKyAgICAgICAg
ICAgIGlmIChpdGVyLnJlZ0lEKCkgIT0gaW5mby5ncHIoKSkgeworICAgICAgICAgICAgICAgIGZw
cmludGYoc3RkZXJyLCAiREZHX0NPTlNJU1RFTkNZX0NIRUNLIGZhaWxlZDogbmFtZSBtaXNtYXRj
aCBmb3IgZ3ByICVzICh2aXJ0dWFsIHJlZ2lzdGVyICVkKS5cbiIsIGl0ZXIuZGVidWdOYW1lKCks
IHZpcnR1YWxSZWdpc3Rlcik7CisgICAgICAgICAgICAgICAgZmFpbGVkID0gdHJ1ZTsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChpdGVyLnJlZ0lEKCkg
IT0gaW5mby50YWdHUFIoKSAmJiBpdGVyLnJlZ0lEKCkgIT0gaW5mby5wYXlsb2FkR1BSKCkpIHsK
KyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkRGR19DT05TSVNURU5DWV9DSEVDSyBm
YWlsZWQ6IG5hbWUgbWlzbWF0Y2ggZm9yIGdwciAlcyAodmlydHVhbCByZWdpc3RlciAlZCkuXG4i
LCBpdGVyLmRlYnVnTmFtZSgpLCB2aXJ0dWFsUmVnaXN0ZXIpOworICAgICAgICAgICAgICAgIGZh
aWxlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZgogICAgIH0KIAog
ICAgIGZvciAoZnByX2l0ZXJhdG9yIGl0ZXIgPSBtX2ZwcnMuYmVnaW4oKTsgaXRlciAhPSBtX2Zw
cnMuZW5kKCk7ICsraXRlcikgewpAQCAtMjEwMSw3ICs1MTksMTEgQEAgR1BSVGVtcG9yYXJ5OjpH
UFJUZW1wb3JhcnkoSklUQ29kZUdlbmVyYQogICAgIDogbV9qaXQoaml0KQogICAgICwgbV9ncHIo
SW52YWxpZEdQUlJlZykKIHsKKyNpZiBDUFUoWDg2KQorICAgIC8vIHdlIGN1cnJlbnR5IGxhemls
eSBhbGxvY2F0ZSB0aGUgcmVnLCBhcyB0aGUgbnVtYmVyIG9mIHJlZ3Mgb24gWDg2IGlzIGxpbWl0
ZWQuCisjZWxzZQogICAgIG1fZ3ByID0gbV9qaXQtPmFsbG9jYXRlKCk7CisjZW5kaWYKIH0KIAog
R1BSVGVtcG9yYXJ5OjpHUFJUZW1wb3JhcnkoSklUQ29kZUdlbmVyYXRvciogaml0LCBHUFJSZWcg
c3BlY2lmaWMpCkBAIC0yMTg1LDYgKzYwNyw3IEBAIEdQUlRlbXBvcmFyeTo6R1BSVGVtcG9yYXJ5
KEpJVENvZGVHZW5lcmEKICAgICAgICAgbV9ncHIgPSBtX2ppdC0+YWxsb2NhdGUoKTsKIH0KIAor
I2lmIFVTRShKU1ZBTFVFNjQpCiBHUFJUZW1wb3Jhcnk6OkdQUlRlbXBvcmFyeShKSVRDb2RlR2Vu
ZXJhdG9yKiBqaXQsIEpTVmFsdWVPcGVyYW5kJiBvcDEpCiAgICAgOiBtX2ppdChqaXQpCiAgICAg
LCBtX2dwcihJbnZhbGlkR1BSUmVnKQpAQCAtMjE5NCw2ICs2MTcsMTcgQEAgR1BSVGVtcG9yYXJ5
OjpHUFJUZW1wb3JhcnkoSklUQ29kZUdlbmVyYQogICAgIGVsc2UKICAgICAgICAgbV9ncHIgPSBt
X2ppdC0+YWxsb2NhdGUoKTsKIH0KKyNlbHNlCitHUFJUZW1wb3Jhcnk6OkdQUlRlbXBvcmFyeShK
SVRDb2RlR2VuZXJhdG9yKiBqaXQsIEpTVmFsdWVPcGVyYW5kJiBvcDEsIGJvb2wgdGFnKQorICAg
IDogbV9qaXQoaml0KQorICAgICwgbV9ncHIoSW52YWxpZEdQUlJlZykKK3sKKyAgICBpZiAoIW9w
MS5pc0RvdWJsZSgpICYmIG1faml0LT5jYW5SZXVzZShvcDEuaW5kZXgoKSkpCisgICAgICAgIG1f
Z3ByID0gbV9qaXQtPnJldXNlKHRhZyA/IG9wMS50YWdHUFIoKSA6IG9wMS5wYXlsb2FkR1BSKCkp
OworICAgIGVsc2UKKyAgICAgICAgbV9ncHIgPSBtX2ppdC0+YWxsb2NhdGUoKTsKK30KKyNlbmRp
ZgogCiBHUFJUZW1wb3Jhcnk6OkdQUlRlbXBvcmFyeShKSVRDb2RlR2VuZXJhdG9yKiBqaXQsIFN0
b3JhZ2VPcGVyYW5kJiBvcDEpCiAgICAgOiBtX2ppdChqaXQpCkBAIC0yMjY4LDcgKzcwMiwxOCBA
QCBGUFJUZW1wb3Jhcnk6OkZQUlRlbXBvcmFyeShKSVRDb2RlR2VuZXJhCiAgICAgICAgIG1fZnBy
ID0gbV9qaXQtPmZwckFsbG9jYXRlKCk7CiB9CiAKKyNpZiBVU0UoSlNWQUxVRTMyXzY0KQorRlBS
VGVtcG9yYXJ5OjpGUFJUZW1wb3JhcnkoSklUQ29kZUdlbmVyYXRvciogaml0LCBKU1ZhbHVlT3Bl
cmFuZCYgb3AxKQorICAgIDogbV9qaXQoaml0KQorICAgICwgbV9mcHIoSW52YWxpZEZQUlJlZykK
K3sKKyAgICBpZiAob3AxLmlzRG91YmxlKCkgJiYgbV9qaXQtPmNhblJldXNlKG9wMS5pbmRleCgp
KSkKKyAgICAgICAgbV9mcHIgPSBtX2ppdC0+cmV1c2Uob3AxLmZwcigpKTsKKyAgICBlbHNlCisg
ICAgICAgIG1fZnByID0gbV9qaXQtPmZwckFsbG9jYXRlKCk7Cit9CisjZW5kaWYKKwogfSB9IC8v
IG5hbWVzcGFjZSBKU0M6OkRGRwogCiAjZW5kaWYKLSNlbmRpZgpJbmRleDogU291cmNlL0phdmFT
Y3JpcHRDb3JlL2RmZy9ERkdKSVRDb21waWxlci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9kZmcvREZHSklUQ29tcGlsZXIuaAkocmV2aXNpb24gOTYzNzMpCisrKyBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0pJVENvbXBpbGVyLmgJKHdvcmtpbmcgY29weSkKQEAg
LTE2NSw2ICsxNjUsMTUgQEAgcHVibGljOgogICAgIH0KICNlbmRpZgogCisgICAgSnVtcCBicmFu
Y2hJZk5vdENlbGwoR1BSUmVnIHJlZykKKyAgICB7CisjaWYgVVNFKEpTVkFMVUU2NCkKKyAgICAg
ICAgcmV0dXJuIGJyYW5jaFRlc3RQdHIoTWFjcm9Bc3NlbWJsZXI6Ok5vblplcm8sIHJlZywgR1BS
SW5mbzo6dGFnTWFza1JlZ2lzdGVyKTsKKyNlbHNlCisgICAgICAgIHJldHVybiBicmFuY2gzMihN
YWNyb0Fzc2VtYmxlcjo6Tm90RXF1YWwsIHJlZywgVHJ1c3RlZEltbTMyKEpTVmFsdWU6OkNlbGxU
YWcpKTsKKyNlbmRpZgorICAgIH0KKyAgICAKICAgICBzdGF0aWMgQWRkcmVzcyBhZGRyZXNzRm9y
R2xvYmFsVmFyKEdQUlJlZyBnbG9iYWwsIGludDMyX3QgdmFyTnVtYmVyKQogICAgIHsKICAgICAg
ICAgcmV0dXJuIEFkZHJlc3MoZ2xvYmFsLCB2YXJOdW1iZXIgKiBzaXplb2YoUmVnaXN0ZXIpKTsK
SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHSklUQ29tcGlsZXJJbmxpbmVNZXRo
b2RzLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdKSVRDb21w
aWxlcklubGluZU1ldGhvZHMuaAkocmV2aXNpb24gOTYzNzMpCisrKyBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvZGZnL0RGR0pJVENvbXBpbGVySW5saW5lTWV0aG9kcy5oCSh3b3JraW5nIGNvcHkpCkBA
IC00LDEwICs0LDExIEBACiAKIAogI2lmIEVOQUJMRShERkdfSklUKQotI2lmIFVTRShKU1ZBTFVF
MzJfNjQpCiAKIG5hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgREZHIHsKIAorI2lmIFVTRShKU1ZB
TFVFMzJfNjQpCisKIGlubGluZSB2b2lkIEpJVENvbXBpbGVyOjplbWl0TG9hZFRhZyhOb2RlSW5k
ZXggaW5kZXgsIEdQUlJlZyB0YWcpCiB7CiAgICAgaWYgKGlzQ29uc3RhbnQoaW5kZXgpKSB7CkBA
IC0xMzQsOSArMTM1LDEwIEBAIGlubGluZSB2b2lkIEpJVENvbXBpbGVyOjplbWl0U3RvcmUoTm9k
ZUkKICAgICBzdG9yZTMyKEltbTMyKGNvbnN0YW50LnRhZygpKSwgdGFnRm9yKHZpcnR1YWxSZWdp
c3RlcikpOwogfQogCisjZW5kaWYgLy8gVVNFKEpTVkFMVUUzMl82NCkKKwogfSB9IC8vIG5hbWVz
cGFjZSBKU0M6OkRGRwogCi0jZW5kaWYgLy8gVVNFKEpTVkFMVUUzMl82NCkKICNlbmRpZiAvLyBF
TkFCTEVfREZHX0pJVAogCiAjZW5kaWYK
</data>
<flag name="review"
          id="106407"
          type_id="1"
          status="+"
          setter="oliver"
    />
          </attachment>
      

    </bug>

</bugzilla>