<?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>8285</bug_id>
          
          <creation_ts>2006-04-09 22:46:17 -0700</creation_ts>
          <short_desc>Implement &quot;TreeCode&quot; based javascript interpreter</short_desc>
          <delta_ts>2008-06-08 20:45:41 -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>420+</version>
          <rep_platform>Mac</rep_platform>
          <op_sys>OS X 10.4</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>10928</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Eric Seidel (no email)">eric</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>darin</cc>
    
    <cc>eric</cc>
    
    <cc>ggaren</cc>
    
    <cc>ian</cc>
    
    <cc>mjs</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>38857</commentid>
    <comment_count>0</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2006-04-09 22:46:17 -0700</bug_when>
    <thetext>ggaren and I got a little carried away last weekend and well... implemented treecode.

&lt;rdar://problem/4409156&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>38858</commentid>
    <comment_count>1</comment_count>
      <attachid>7610</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2006-04-09 22:50:14 -0700</bug_when>
    <thetext>Created attachment 7610
First stab a treecode based JavaScript interpreter

First of all, this patch passes *ALL* javascript test cases, but it should not be considered a finished product.  We&apos;ve come a long way, but we have a little ways left to go.
Currently the TreeCode interpreter is a little slower than TOT, however there is a lot of fat left to trim.
This patch is here to facilitate discussion, as I&apos;m sure at least Maciej and Darin will have a number of thoughts on the issue.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>38859</commentid>
    <comment_count>2</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2006-04-10 00:11:48 -0700</bug_when>
    <thetext>FYI: on my MacBookPro the current numbers show nearly a 50% performance regression.  Again, there is a lot of fat left to trim.

% compare-timing-files -c 5 old.times latest-treecode.times

===== old.times =====
average of fastest 5 runs: 726.8
range of fastest 5 runs: 0.69% (5)

===== latest-treecode.times =====
average of fastest 5 runs: 1052.2
range of fastest 5 runs: 0.38% (4)

performance LOSS of 44.77% (325.4 / 726.8)
</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>38866</commentid>
    <comment_count>3</comment_count>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2006-04-10 07:13:56 -0700</bug_when>
    <thetext>In some unit tests, the current numbers are only a 2% regression. It&apos;s likely that the js-ibench numbers reflect the fact that we haven&apos;t integrated function calls yet, so a function call starts up a nested version of the interpreter loop.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>39117</commentid>
    <comment_count>4</comment_count>
      <attachid>7610</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2006-04-13 01:01:24 -0700</bug_when>
    <thetext>Comment on attachment 7610
First stab a treecode based JavaScript interpreter

This is going well, on a branch. But this patch is obsolete and we won&apos;t be reviewing it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>82703</commentid>
    <comment_count>5</comment_count>
    <who name="Cameron Zwarich (cpst)">zwarich</who>
    <bug_when>2008-06-08 20:45:41 -0700</bug_when>
    <thetext>We did this with SquirrelFish.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>7610</attachid>
            <date>2006-04-09 22:50:14 -0700</date>
            <delta_ts>2006-04-13 01:01:24 -0700</delta_ts>
            <desc>First stab a treecode based JavaScript interpreter</desc>
            <filename>treecode.patch</filename>
            <type>text/plain</type>
            <size>265887</size>
            <attacher name="Eric Seidel (no email)">eric</attacher>
            
              <data encoding="base64">SW5kZXg6IGt4bWxjb3JlL1ZlY3Rvci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGt4bWxjb3JlL1ZlY3Rvci5o
CShyZXZpc2lvbiAxMzc0NSkKKysrIGt4bWxjb3JlL1ZlY3Rvci5oCSh3b3JraW5nIGNvcHkpCkBA
IC0zNzMsNiArMzczLDggQEAgbmFtZXNwYWNlIEtYTUxDb3JlIHsKICAgICAgICAgY29uc3QgVCYg
bGFzdCgpIGNvbnN0IHsgcmV0dXJuIGF0KHNpemUoKSAtIDEpOyB9CiAKICAgICAgICAgdm9pZCBy
ZXNpemUoc2l6ZV90IHNpemUpOworICAgICAgICB2b2lkIHNocmlua1RvKHNpemVfdCBzaXplKTsK
KyAgICAgICAgdm9pZCBncm93VG8oc2l6ZV90IHNpemUpOwogICAgICAgICB2b2lkIHJlc2VydmVD
YXBhY2l0eShzaXplX3QgbmV3Q2FwYWNpdHkpOwogCiAgICAgICAgIHZvaWQgY2xlYXIoKSB7IHJl
c2l6ZSgwKTsgfQpAQCAtNTA1LDIwICs1MDcsMzcgQEAgbmFtZXNwYWNlIEtYTUxDb3JlIHsKICAg
ICB9CiAKICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCBzaXplX3QgaW5saW5lQ2FwYWNpdHk+Ci0g
ICAgdm9pZCBWZWN0b3I8VCwgaW5saW5lQ2FwYWNpdHk+OjpyZXNpemUoc2l6ZV90IHNpemUpCisg
ICAgaW5saW5lIHZvaWQgVmVjdG9yPFQsIGlubGluZUNhcGFjaXR5Pjo6c2hyaW5rVG8oc2l6ZV90
IHNpemUpCiAgICAgewotICAgICAgICBpZiAoc2l6ZSA8PSBtX3NpemUpCi0gICAgICAgICAgICBU
eXBlT3BlcmF0aW9uczo6ZGVzdHJ1Y3QoYmVnaW4oKSArIHNpemUsIGVuZCgpKTsKLSAgICAgICAg
ZWxzZSB7Ci0gICAgICAgICAgICBpZiAoc2l6ZSA+IGNhcGFjaXR5KCkpCi0gICAgICAgICAgICAg
ICAgZXhwYW5kQ2FwYWNpdHkoc2l6ZSk7Ci0gICAgICAgICAgICBUeXBlT3BlcmF0aW9uczo6aW5p
dGlhbGl6ZShlbmQoKSwgYmVnaW4oKSArIHNpemUpOwotICAgICAgICB9CisgICAgICAgIEFTU0VS
VChzaXplIDw9IG1fc2l6ZSk7CiAgICAgICAgIAorICAgICAgICBUeXBlT3BlcmF0aW9uczo6ZGVz
dHJ1Y3QoYmVnaW4oKSArIHNpemUsIGVuZCgpKTsKKyAgICAgICAgCisgICAgICAgIG1fc2l6ZSA9
IHNpemU7CisgICAgfQorICAgIAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHNpemVfdCBpbmxp
bmVDYXBhY2l0eT4KKyAgICBpbmxpbmUgdm9pZCBWZWN0b3I8VCwgaW5saW5lQ2FwYWNpdHk+Ojpn
cm93VG8oc2l6ZV90IHNpemUpCisgICAgeworICAgICAgICBBU1NFUlQoc2l6ZSA+PSBtX3NpemUp
OworCisgICAgICAgIGlmIChzaXplID4gY2FwYWNpdHkoKSkKKyAgICAgICAgICAgIGV4cGFuZENh
cGFjaXR5KHNpemUpOworICAgICAgICBUeXBlT3BlcmF0aW9uczo6aW5pdGlhbGl6ZShlbmQoKSwg
YmVnaW4oKSArIHNpemUpOworICAgICAgICAgICAgICAgIAogICAgICAgICBtX3NpemUgPSBzaXpl
OwogICAgIH0KIAogICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHNpemVfdCBpbmxpbmVDYXBhY2l0
eT4KKyAgICBpbmxpbmUgdm9pZCBWZWN0b3I8VCwgaW5saW5lQ2FwYWNpdHk+OjpyZXNpemUoc2l6
ZV90IHNpemUpCisgICAgeworICAgICAgICBpZiAoc2l6ZSA8PSBtX3NpemUpCisgICAgICAgICAg
ICBzaHJpbmtUbyhzaXplKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZ3Jvd1RvKHNpemUp
OworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHNpemVfdCBpbmxpbmVDYXBhY2l0
eT4KICAgICB2b2lkIFZlY3RvcjxULCBpbmxpbmVDYXBhY2l0eT46OnJlc2VydmVDYXBhY2l0eShz
aXplX3QgbmV3Q2FwYWNpdHkpCiAgICAgewogICAgICAgICBpZiAobmV3Q2FwYWNpdHkgPCBjYXBh
Y2l0eSgpKQpJbmRleDoga2pzL2ludGVycHJldGVyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBranMvaW50
ZXJwcmV0ZXIuY3BwCShyZXZpc2lvbiAxMzc0NSkKKysrIGtqcy9pbnRlcnByZXRlci5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTEyMyw4ICsxMjMsOCBAQCBDb21wbGV0aW9uIEludGVycHJldGVyOjpl
dmFsdWF0ZShjb25zdCBVCiAgICAgICAgIEpTTG9jayBsb2NrOwogICAgICAgICBFeGVjU3RhdGUg
KmV4ZWMgPSByZXAtPmdsb2JhbEV4ZWMoKTsKICAgICAgICAgQ1N0cmluZyBmID0gc291cmNlVVJM
LlVURjhTdHJpbmcoKTsKLSAgICAgICAgQ1N0cmluZyBtZXNzYWdlID0gY29tcC52YWx1ZSgpLT50
b09iamVjdChleGVjKS0+dG9TdHJpbmcoZXhlYykuVVRGOFN0cmluZygpOwotICAgICAgICBpbnQg
bGluZSA9IGNvbXAudmFsdWUoKS0+dG9PYmplY3QoZXhlYyktPmdldChleGVjLCAibGluZSIpLT50
b1VJbnQzMihleGVjKTsKKyAgICAgICAgQ1N0cmluZyBtZXNzYWdlID0gY29tcC52YWx1ZSgpLT50
b1N0cmluZyhleGVjKS5VVEY4U3RyaW5nKCk7CisgICAgICAgIGludCBsaW5lID0gY29tcC52YWx1
ZSgpLT5pc09iamVjdCgpID8gY29tcC52YWx1ZSgpLT50b09iamVjdChleGVjKS0+Z2V0KGV4ZWMs
ICJsaW5lIiktPnRvVUludDMyKGV4ZWMpIDogMDsKICNpZiBQTEFURk9STShXSU5fT1MpCiAgICAg
ICAgIHByaW50ZigiJXMgbGluZSAlZDogJXNcbiIsIGYuY19zdHIoKSwgbGluZSwgbWVzc2FnZS5j
X3N0cigpKTsKICNlbHNlCkluZGV4OiBranMvaW50ZXJuYWwuY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGtq
cy9pbnRlcm5hbC5jcHAJKHJldmlzaW9uIDEzNzQ1KQorKysga2pzL2ludGVybmFsLmNwcAkod29y
a2luZyBjb3B5KQpAQCAtNDEsNiArNDEsNyBAQAogI2luY2x1ZGUgIm9wZXJhdGlvbnMuaCIKICNp
bmNsdWRlICJyZWdleHBfb2JqZWN0LmgiCiAjaW5jbHVkZSAic3RyaW5nX29iamVjdC5oIgorI2lu
Y2x1ZGUgIlRyZWVDb2RlLmgiCiAjaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8a3htbGNv
cmUvSGFzaE1hcC5oPgogI2luY2x1ZGUgPGt4bWxjb3JlL0hhc2hTZXQuaD4KQEAgLTI4MiwxMCAr
MjgzLDkgQEAgSW50ZXJwcmV0ZXJJbXA6OkludGVycHJldGVySW1wKEludGVycHJldAogICAgIG5l
eHQgPSBzX2hvb2stPm5leHQ7CiAgICAgc19ob29rLT5uZXh0LT5wcmV2ID0gdGhpczsKICAgICBz
X2hvb2stPm5leHQgPSB0aGlzOwotICB9IGVsc2UgeworICB9IGVsc2UKICAgICAvLyBUaGlzIGlz
IHRoZSBmaXJzdCBpbnRlcnByZXRlcgogICAgIHNfaG9vayA9IG5leHQgPSBwcmV2ID0gdGhpczsK
LSAgfQogCiAgIGludGVycHJldGVyTWFwKCkuc2V0KGdsb2IsIHRoaXMpOwogCkBAIC00MjcsNyAr
NDI3LDYgQEAgSW50ZXJwcmV0ZXJJbXA6On5JbnRlcnByZXRlckltcCgpCiAKIHZvaWQgSW50ZXJw
cmV0ZXJJbXA6OmNsZWFyKCkKIHsKLSAgLy9mcHJpbnRmKHN0ZGVyciwiSW50ZXJwcmV0ZXJJbXA6
OmNsZWFyXG4iKTsKICAgLy8gcmVtb3ZlIGZyb20gZ2xvYmFsIGNoYWluIChzZWUgaW5pdCgpKQog
ICBKU0xvY2sgbG9jazsKIApAQCAtNDM1LDEwICs0MzQsOCBAQCB2b2lkIEludGVycHJldGVySW1w
OjpjbGVhcigpCiAgIHByZXYtPm5leHQgPSBuZXh0OwogICBzX2hvb2sgPSBuZXh0OwogICBpZiAo
c19ob29rID09IHRoaXMpCi0gIHsKICAgICAvLyBUaGlzIHdhcyB0aGUgbGFzdCBpbnRlcnByZXRl
cgogICAgIHNfaG9vayA9IDBMOwotICB9CiAgIGludGVycHJldGVyTWFwKCkucmVtb3ZlKGdsb2Jh
bCk7CiB9CiAKQEAgLTQ1Miw2ICs0NDksMTYgQEAgdm9pZCBJbnRlcnByZXRlckltcDo6bWFyaygp
CiAgICAgICBnbG9iYWwtPm1hcmsoKTsKICAgaWYgKGdsb2JFeGVjLmV4Y2VwdGlvbigpKQogICAg
ICAgZ2xvYkV4ZWMuZXhjZXB0aW9uKCktPm1hcmsoKTsKKyAgdW5zaWduZWQgc2l6ZSA9IG1fdmFs
dWVTdGFjay5zaXplKCk7CisgIGZvciAodW5zaWduZWQgeCA9IDA7IHggPCBzaXplOyB4KyspIHsK
KyAgICBKU1ZhbHVlKiB2YWwgPSBtX3ZhbHVlU3RhY2tbeF07CisgICAgaWYgKCF2YWwtPm1hcmtl
ZCgpKQorICAgICAgICB2YWwtPm1hcmsoKTsKKyAgfQorICBpZiAobV92YWx1ZVJldHVybiAmJiAh
bV92YWx1ZVJldHVybi0+bWFya2VkKCkpCisgICAgbV92YWx1ZVJldHVybi0+bWFyaygpOworICBp
ZiAobV9jb21wbGV0aW9uUmV0dXJuLnZhbHVlKCkgJiYgIW1fY29tcGxldGlvblJldHVybi52YWx1
ZSgpLT5tYXJrZWQoKSkKKyAgICBtX2NvbXBsZXRpb25SZXR1cm4udmFsdWUoKS0+bWFyaygpOwog
fQogCiBib29sIEludGVycHJldGVySW1wOjpjaGVja1N5bnRheChjb25zdCBVU3RyaW5nICZjb2Rl
KQpAQCAtNDg4LDcgKzQ5NSw4IEBAIENvbXBsZXRpb24gSW50ZXJwcmV0ZXJJbXA6OmV2YWx1YXRl
KGNvbnMKICAgaWYgKCFwcm9nTm9kZSkKICAgICByZXR1cm4gQ29tcGxldGlvbihUaHJvdywgRXJy
b3I6OmNyZWF0ZSgmZ2xvYkV4ZWMsIFN5bnRheEVycm9yLCBlcnJNc2csIGVyckxpbmUsIHNpZCwg
JnNvdXJjZVVSTCkpOwogCi0gIGdsb2JFeGVjLmNsZWFyRXhjZXB0aW9uKCk7CisgIEFTU0VSVCgh
Z2xvYkV4ZWMuaGFkRXhjZXB0aW9uKCkpOworICBBU1NFUlQobV9jb21wbGV0aW9uUmV0dXJuLmNv
bXBsVHlwZSgpID09IE5vcm1hbCAmJiBtX2NvbXBsZXRpb25SZXR1cm4udmFsdWUoKSA9PSAwKTsK
IAogICByZWN1cnNpb24rKzsKIApAQCAtNTAwLDI3ICs1MDgsMzIgQEAgQ29tcGxldGlvbiBJbnRl
cnByZXRlckltcDo6ZXZhbHVhdGUoY29ucwogICAgICAgdGhpc09iaiA9IHRoaXNWLT50b09iamVj
dCgmZ2xvYkV4ZWMpOwogCiAgIENvbXBsZXRpb24gcmVzOwotICBpZiAoZ2xvYkV4ZWMuaGFkRXhj
ZXB0aW9uKCkpCisgIGlmIChnbG9iRXhlYy5oYWRFeGNlcHRpb24oKSkgewogICAgIC8vIHRoZSB0
aGlzVi0+dG9PYmplY3QoKSBjb252ZXJzaW9uIGFib3ZlIG1pZ2h0IGhhdmUgdGhyb3duIGFuIGV4
Y2VwdGlvbiAtIGlmIHNvLCBwcm9wYWdhdGUgaXQKICAgICByZXMgPSBDb21wbGV0aW9uKFRocm93
LCBnbG9iRXhlYy5leGNlcHRpb24oKSk7Ci0gIGVsc2UgeworICAgICAgCisgICAgZ2xvYkV4ZWMu
Y2xlYXJFeGNlcHRpb24oKTsKKyAgICByZXNldENvbXBsZXRpb25Ub05vcm1hbCgpOworICB9IGVs
c2UgewogICAgIC8vIGV4ZWN1dGUgdGhlIGNvZGUKICAgICBDb250ZXh0SW1wIGN0eChnbG9iYWxP
YmosIHRoaXMsIHRoaXNPYmosIHByb2dOb2RlLmdldCgpKTsKICAgICBFeGVjU3RhdGUgbmV3RXhl
YyhtX2ludGVycHJldGVyLCAmY3R4KTsKICAgICBwcm9nTm9kZS0+cHJvY2Vzc1ZhckRlY2xzKCZu
ZXdFeGVjKTsKLSAgICByZXMgPSBwcm9nTm9kZS0+ZXhlY3V0ZSgmbmV3RXhlYyk7CisgICAgcmVz
ID0gY2FsbEV4ZWN1dGVPbk5vZGUocHJvZ05vZGUuZ2V0KCksICZuZXdFeGVjKTsKICAgfQogCiAg
IHJlY3Vyc2lvbi0tOwogCisgIEFTU0VSVCghZ2xvYkV4ZWMuaGFkRXhjZXB0aW9uKCkpOworICBB
U1NFUlQobV9jb21wbGV0aW9uUmV0dXJuLmNvbXBsVHlwZSgpID09IE5vcm1hbCAmJiBtX2NvbXBs
ZXRpb25SZXR1cm4udmFsdWUoKSA9PSAwKTsKKyAgCiAgIHJldHVybiByZXM7CiB9CiAKIHZvaWQg
SW50ZXJwcmV0ZXJJbXA6OnNhdmVCdWlsdGlucyAoU2F2ZWRCdWlsdGlucyAmYnVpbHRpbnMpIGNv
bnN0CiB7Ci0gIGlmICghYnVpbHRpbnMuX2ludGVybmFsKSB7CisgIGlmICghYnVpbHRpbnMuX2lu
dGVybmFsKQogICAgIGJ1aWx0aW5zLl9pbnRlcm5hbCA9IG5ldyBTYXZlZEJ1aWx0aW5zSW50ZXJu
YWw7Ci0gIH0KIAogICBidWlsdGlucy5faW50ZXJuYWwtPmJfT2JqZWN0ID0gYl9PYmplY3Q7CiAg
IGJ1aWx0aW5zLl9pbnRlcm5hbC0+Yl9GdW5jdGlvbiA9IGJfRnVuY3Rpb247CkBAIC02MDMsNiAr
NjE2LDI1NCBAQCBJbnRlcnByZXRlckltcCAqSW50ZXJwcmV0ZXJJbXA6OmludGVycHJlCiAgICAg
cmV0dXJuIGludGVycHJldGVyTWFwKCkuZ2V0KGdsb2JhbCk7CiB9CiAKK2VudW0gU3RhY2tUeXBl
IHsKKyAgICBWYWx1ZVN0YWNrLAorICAgIFN0YXRlU3RhY2ssCisgICAgTGlzdFN0YWNrCit9Owor
CitzdGF0aWMgdW5zaWduZWQgc2l6ZU1hcmtlckZvclN0YWNrKGNvbnN0IEludGVycHJldGVySW1w
OjpVbndpbmRCYXJyaWVyJiB1bndpbmRCYXJyaWVyLCBTdGFja1R5cGUgc3RhY2tUeXBlKQorewor
ICAgIHN3aXRjaChzdGFja1R5cGUpIHsKKyAgICBjYXNlIFZhbHVlU3RhY2s6CisgICAgICAgIHJl
dHVybiB1bndpbmRCYXJyaWVyLnZhbHVlU3RhY2tTaXplOworICAgIGNhc2UgU3RhdGVTdGFjazoK
KyAgICAgICAgcmV0dXJuIHVud2luZEJhcnJpZXIuc3RhdGVTdGFja1NpemU7CisgICAgY2FzZSBM
aXN0U3RhY2s6CisgICAgICAgIHJldHVybiB1bndpbmRCYXJyaWVyLmxpc3RTdGFja1NpemU7Cisg
ICAgfQorICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIHJldHVybiAwOworfQorCitzdGF0
aWMgdm9pZCBwcmludFVud2luZEJhcnJpZXIoY29uc3QgSW50ZXJwcmV0ZXJJbXA6OlVud2luZEJh
cnJpZXImIHVud2luZEJhcnJpZXIsIGJvb2wgcHJpbnRTdGFja1N0YXRlcyA9IGZhbHNlKQorewor
ICAgIHByaW50ZigiPT09IHVud2luZCBiYXJyaWVyIHR5cGUocyk6Iik7CisgICAgc2hvcnQgYmFy
cmllclR5cGUgPSB1bndpbmRCYXJyaWVyLmJhcnJpZXJUeXBlOworICAgIGlmIChiYXJyaWVyVHlw
ZSA9PSBBbGwpCisgICAgICAgIHByaW50ZigiIEFsbCIpOworICAgIGVsc2UgeworICAgICAgICBp
ZiAoYmFycmllclR5cGUgPT0gQnJlYWspCisgICAgICAgICAgICBwcmludGYoIiBCcmVhayIpOwor
ICAgICAgICBpZiAoYmFycmllclR5cGUgPT0gQ29udGludWUpCisgICAgICAgICAgICBwcmludGYo
IiBDb250aW51ZSIpOworICAgICAgICBpZiAoYmFycmllclR5cGUgPT0gUmV0dXJuVmFsdWUpCisg
ICAgICAgICAgICBwcmludGYoIiBSZXR1cm5WYWx1ZSIpOworICAgICAgICBpZiAoYmFycmllclR5
cGUgPT0gVGhyb3cpCisgICAgICAgICAgICBwcmludGYoIiBUaHJvdyIpOworICAgICAgICBpZiAo
YmFycmllclR5cGUgPT0gU2NvcGUpCisgICAgICAgICAgICBwcmludGYoIiBTY29wZSIpOworICAg
IH0KKyAgICBwcmludGYoIiwgc3RhdGU6ICVzICglaSkgbm9kZTogJXAiLCBuYW1lRm9ySW50ZXJw
cmV0ZXJTdGF0ZVt1bndpbmRCYXJyaWVyLmNvbnRpbnVlU3RhdGUuc3RhdGVdLCB1bndpbmRCYXJy
aWVyLmNvbnRpbnVlU3RhdGUuc3RhdGUsIHVud2luZEJhcnJpZXIuY29udGludWVTdGF0ZS5ub2Rl
KTsKKyAgICBpZiAocHJpbnRTdGFja1N0YXRlcykgeworICAgICAgICBwcmludGYoIiwgdmFsdWVz
OiAlbHUiLCB1bndpbmRCYXJyaWVyLnZhbHVlU3RhY2tTaXplKTsKKyAgICAgICAgcHJpbnRmKCIs
IHN0YXRlczogJWx1IiwgdW53aW5kQmFycmllci5zdGF0ZVN0YWNrU2l6ZSk7CisgICAgICAgIHBy
aW50ZigiLCBsaXN0czogJWx1IiwgdW53aW5kQmFycmllci5saXN0U3RhY2tTaXplKTsKKyAgICAg
ICAgcHJpbnRmKCIsIG5vZGVzOiAlbHUiLCB1bndpbmRCYXJyaWVyLm5vZGVTdGFja1NpemUpOwor
ICAgIH0KKyAgICBwcmludGYoIiA9PT1cbiIpOworfQorCitzdGF0aWMgdm9pZCBwcmludFVud2lu
ZEJhcnJpZXJzSWZOZWNlc3NhcnkoY29uc3QgU3RhY2s8SW50ZXJwcmV0ZXJJbXA6OlVud2luZEJh
cnJpZXIsIEtKU19NQVhfU1RBQ0s+JiB1bndpbmRTdGFjaywgaW50JiBjdXJyZW50TWFya2VyLCB1
bnNpZ25lZCBzdGFja0xvY2F0aW9uLCBTdGFja1R5cGUgc3RhY2tUeXBlKQoreworICAgIGlmIChj
dXJyZW50TWFya2VyIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIEludGVycHJldGVySW1wOjpV
bndpbmRCYXJyaWVyIHVud2luZEJhcnJpZXIgPSB1bndpbmRTdGFja1tjdXJyZW50TWFya2VyXTsK
KyAgICB3aGlsZSAoKGN1cnJlbnRNYXJrZXIgPj0gMCkgJiYgKHNpemVNYXJrZXJGb3JTdGFjayh1
bndpbmRCYXJyaWVyLCBzdGFja1R5cGUpIC0gMSkgPT0gc3RhY2tMb2NhdGlvbikgeworICAgICAg
ICBwcmludFVud2luZEJhcnJpZXIodW53aW5kQmFycmllcik7CisgICAgICAgIC8vIGtlZXAgc2Vh
cmNoaW5nIGluIGNhc2UgdGhlcmUgYXJlIG11bHRpcGxlIHVud2luZCBtYXJrZXJzIGF0IHRoaXMg
cG9zaXRpb24uCisgICAgICAgIGN1cnJlbnRNYXJrZXItLTsKKyAgICAgICAgdW53aW5kQmFycmll
ciA9IHVud2luZFN0YWNrW2N1cnJlbnRNYXJrZXJdOworICAgIH0KK30KKwordm9pZCBJbnRlcnBy
ZXRlckltcDo6cHJpbnRVbndpbmRCYXJyaWVyU3RhY2soKQoreworICAgIHByaW50ZigiVW53aW5k
QmFycmllciBTdGFjazpcbiIpOworICAgIHVuc2lnbmVkIHNpemUgPSBtX3Vud2luZEJhcnJpZXJT
dGFjay5zaXplKCk7CisgICAgaWYgKHNpemUgPT0gMCkKKyAgICAgICAgcHJpbnRmKCI8ZW1wdHk+
XG4iKTsKKyAgICAKKyAgICBmb3IgKGludCB4ID0gc2l6ZS0xOyB4ID49IDA7IHgtLSkgeworICAg
ICAgICBwcmludGYoIiVpOiAiLCB4KTsKKyAgICAgICAgcHJpbnRVbndpbmRCYXJyaWVyKG1fdW53
aW5kQmFycmllclN0YWNrW3hdLCB0cnVlKTsKKyAgICB9Cit9CisKK3ZvaWQgSW50ZXJwcmV0ZXJJ
bXA6OnByaW50U3RhY2tzKCkKK3sKKyAgICBwcmludFN0YXRlU3RhY2soKTsKKyAgICBwcmludFZh
bHVlU3RhY2soKTsKKyAgICBwcmludExpc3RTdGFjaygpOworfQorCit2b2lkIEludGVycHJldGVy
SW1wOjpwcmludFN0YXRlU3RhY2soKQoreworICAgIHByaW50ZigiU3RhdGUgU3RhY2s6XG4iKTsK
KyAgICB1bnNpZ25lZCBzaXplID0gbV9zdGF0ZVN0YWNrLnNpemUoKTsKKyAgICBpZiAoc2l6ZSA9
PSAwKQorICAgICAgICBwcmludGYoIjxlbXB0eT5cbiIpOworICAgIAorICAgIGludCB1bndpbmRJ
dGVyID0gbV91bndpbmRCYXJyaWVyU3RhY2suc2l6ZSgpIC0gMTsKKyAgICBmb3IgKGludCB4ID0g
c2l6ZSAtIDE7IHggPj0gMDsgeC0tKSB7CisgICAgICAgIHByaW50VW53aW5kQmFycmllcnNJZk5l
Y2Vzc2FyeShtX3Vud2luZEJhcnJpZXJTdGFjaywgdW53aW5kSXRlciwgeCwgU3RhdGVTdGFjayk7
IAorICAgICAgICBJbnRlcnByZXRlclN0YXRlIHN0YXRlID0gbV9zdGF0ZVN0YWNrW3hdLnN0YXRl
OworICAgICAgICBwcmludGYoIiVpOiAlcyAoJWkpLCAlcFxuIiwgeCwgbmFtZUZvckludGVycHJl
dGVyU3RhdGVbc3RhdGVdLCBzdGF0ZSwgbV9zdGF0ZVN0YWNrW3hdLm5vZGUpOworICAgIH0KKyAg
ICBwcmludFVud2luZEJhcnJpZXJzSWZOZWNlc3NhcnkobV91bndpbmRCYXJyaWVyU3RhY2ssIHVu
d2luZEl0ZXIsIDAsIFN0YXRlU3RhY2spOyAKK30KKwordm9pZCBJbnRlcnByZXRlckltcDo6cHJp
bnRWYWx1ZVN0YWNrKCkKK3sKKyAgICBwcmludGYoIlZhbHVlIFN0YWNrOlxuIik7CisgICAgdW5z
aWduZWQgc2l6ZSA9IG1fdmFsdWVTdGFjay5zaXplKCk7CisgICAgaWYgKHNpemUgPT0gMCkKKyAg
ICAgICAgcHJpbnRmKCI8ZW1wdHk+XG4iKTsKKyAgICAKKyAgICBpbnQgdW53aW5kSXRlciA9IG1f
dW53aW5kQmFycmllclN0YWNrLnNpemUoKSAtIDE7CisgICAgZm9yIChpbnQgeCA9IHNpemUgLSAx
OyB4ID49IDA7IHgtLSkgeworICAgICAgICBwcmludFVud2luZEJhcnJpZXJzSWZOZWNlc3Nhcnko
bV91bndpbmRCYXJyaWVyU3RhY2ssIHVud2luZEl0ZXIsIHgsIFZhbHVlU3RhY2spOworICAgICAg
ICBKU1ZhbHVlKiB2ID0gbV92YWx1ZVN0YWNrW3hdOworICAgICAgICBwcmludGYoIiVpOiAlcCBb
dHlwZTogJXNdIFt2YWx1ZTogJXNdXG4iCisgICAgICAgICAgICAgICAsIHgKKyAgICAgICAgICAg
ICAgICwgdgorICAgICAgICAgICAgICAgLCB2ID8gdHlwZVN0cmluZ0ZvclZhbHVlKHYpLT50b1N0
cmluZygmZ2xvYkV4ZWMpLmNzdHJpbmcoKS5jX3N0cigpIDogIk5VTEwgc3RhY2sgbWFya2VyIgor
ICAgICAgICAgICAgICAgLCB2ID8gdi0+dG9TdHJpbmcoJmdsb2JFeGVjKS5jc3RyaW5nKCkuY19z
dHIoKSA6ICIwIgorICAgICAgICAgICAgICAgKTsKKyAgICB9CisgICAgcHJpbnRVbndpbmRCYXJy
aWVyc0lmTmVjZXNzYXJ5KG1fdW53aW5kQmFycmllclN0YWNrLCB1bndpbmRJdGVyLCAwLCBWYWx1
ZVN0YWNrKTsKK30KKwordm9pZCBJbnRlcnByZXRlckltcDo6cHJpbnRMaXN0U3RhY2soKQorewor
ICAgIHByaW50ZigiTGlzdCBTdGFjazpcbiIpOworICAgIHVuc2lnbmVkIHNpemUgPSBtX2xpc3RS
ZXR1cm5TdGFjay5zaXplKCk7CisgICAgaWYgKHNpemUgPT0gMCkKKyAgICAgICAgcHJpbnRmKCI8
ZW1wdHk+XG4iKTsKKyAgICAKKyAgICBpbnQgdW53aW5kSXRlciA9IG1fdW53aW5kQmFycmllclN0
YWNrLnNpemUoKSAtIDE7CisgICAgZm9yIChpbnQgeCA9IHNpemUtMTsgeCA+PSAwOyB4LS0pIHsK
KyAgICAgICAgcHJpbnRVbndpbmRCYXJyaWVyc0lmTmVjZXNzYXJ5KG1fdW53aW5kQmFycmllclN0
YWNrLCB1bndpbmRJdGVyLCB4LCBMaXN0U3RhY2spOworICAgICAgICBwcmludGYoIiVpOiAoIiwg
eCk7CisgICAgICAgIGNvbnN0IExpc3QmIGxpc3QgPSBtX2xpc3RSZXR1cm5TdGFja1t4XTsKKyAg
ICAgICAgTGlzdEl0ZXJhdG9yIGl0ciA9IGxpc3QuYmVnaW4oKTsKKyAgICAgICAgTGlzdEl0ZXJh
dG9yIGVuZCA9IGxpc3QuZW5kKCk7CisgICAgICAgIHdoaWxlIChpdHIgIT0gZW5kKSB7CisgICAg
ICAgICAgICAgcHJpbnRmKCIlcCIsICppdHIpOworICAgICAgICAgICAgIGlmICgrK2l0cikKKyAg
ICAgICAgICAgICAgICBwcmludGYoIiwgIik7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRmKCIp
XG4iKTsKKyAgICB9CisgICAgcHJpbnRVbndpbmRCYXJyaWVyc0lmTmVjZXNzYXJ5KG1fdW53aW5k
QmFycmllclN0YWNrLCB1bndpbmRJdGVyLCAwLCBMaXN0U3RhY2spOworfQorCitzdGF0aWMgaW5s
aW5lIGNvbnN0IFVTdHJpbmcmIGN1cnJlbnRTb3VyY2VVUkwoRXhlY1N0YXRlKiBleGVjKQorewor
ICAgIHJldHVybiBleGVjLT5jb250ZXh0KCkuaW1wKCktPmN1cnJlbnRCb2R5KCktPnNvdXJjZVVS
TCgpOworfQorCit2b2lkIEludGVycHJldGVySW1wOjp1bndpbmRUb05leHRCYXJyaWVyKEV4ZWNT
dGF0ZSogZXhlYywgTm9kZSogY3VycmVudE5vZGUpCit7CisgICAgQVNTRVJUKG1fY29tcGxldGlv
blJldHVybi5jb21wbFR5cGUoKSAhPSBOb3JtYWwpOworICAgIAorICAgIFVud2luZEJhcnJpZXIq
IGJhcnJpZXIgPSAwOworICAgIGludCBiYXJyaWVySW5kZXggPSBtX3Vud2luZEJhcnJpZXJTdGFj
ay5zaXplKCkgLSAxOworICAgIHdoaWxlIChiYXJyaWVySW5kZXggPj0gMCkgeworICAgICAgICBi
YXJyaWVyID0gJm1fdW53aW5kQmFycmllclN0YWNrW2JhcnJpZXJJbmRleF07CisgICAgICAgIC8v
IEZJWE1FOiBIYWNrIGZvciByZWNvZ25pemluZyBmdW5jdGlvbiBjYWxsIGZyYW1lIGJhcnJpZXJz
CisgICAgICAgIGlmIChiYXJyaWVyLT5iYXJyaWVyVHlwZSA9PSBBbGwpCisgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgCisgICAgICAgIC8vIEZJWE1FOiBIYWNrIGZvciBwb3BwaW5nIHRoZSBz
Y29wZSBjaGFpbiB3aGVuIHVud2luZGluZyBwYXN0IGEgc2NvcGUgcHVzaAorICAgICAgICBpZiAo
YmFycmllci0+YmFycmllclR5cGUgPT0gU2NvcGUpCisgICAgICAgICAgICBleGVjLT5jb250ZXh0
KCkuaW1wKCktPnBvcFNjb3BlKCk7CisgICAgICAgIAorICAgICAgICBpZiAoYmFycmllci0+YmFy
cmllclR5cGUgPT0gbV9jb21wbGV0aW9uUmV0dXJuLmNvbXBsVHlwZSgpKSB7CisgICAgICAgICAg
ICBTdGF0ZW1lbnROb2RlKiBiYXJyaWVyTm9kZSA9IHN0YXRpY19jYXN0PFN0YXRlbWVudE5vZGUq
PihiYXJyaWVyLT5jb250aW51ZVN0YXRlLm5vZGUpOworICAgICAgICAgICAgaWYgKGJhcnJpZXJO
b2RlLT5scy5jb250YWlucyhtX2NvbXBsZXRpb25SZXR1cm4udGFyZ2V0KCkpIHx8IGJhcnJpZXJO
b2RlLT5pc0xhYmVsTm9kZSgpKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9Cisg
ICAgICAgIGJhcnJpZXJJbmRleC0tOworICAgIH0KKyAgICAKKyAgICBpZiAoYmFycmllci0+YmFy
cmllclR5cGUgPT0gQWxsKSB7IC8vIHVud2luZGluZyBwYXN0IGEgZnVuY3Rpb24gY2FsbCBmcmFt
ZQorICAgICAgICBzd2l0Y2ggKG1fY29tcGxldGlvblJldHVybi5jb21wbFR5cGUoKSkgeworICAg
ICAgICBkZWZhdWx0OgorICAgICAgICBjYXNlIE5vcm1hbDoKKyAgICAgICAgICAgIEFTU0VSVF9O
T1RfUkVBQ0hFRCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIC8vIFlvdSBjYW4ndCAi
YnJlYWsiIG91dCBvZiBhIGZ1bmN0aW9uCisgICAgICAgIGNhc2UgQnJlYWs6CisgICAgICAgIHsK
KyAgICAgICAgICAgIC8vIEZJWE1FOiBUaGlzIGNoZWNrIHNob3VsZCBoYXBwZW4gYXQgcGFyc2Ug
dGltZS4gVGhlbiBpdCBjYW4gY2hhbmdlIHRvIGFuIEFTU0VSVC4KKyAgICAgICAgICAgIGNvbnN0
IElkZW50aWZpZXImIHRhcmdldCA9IG1fY29tcGxldGlvblJldHVybi50YXJnZXQoKTsKKyAgICAg
ICAgICAgIGlmICh0YXJnZXQuaXNFbXB0eSgpKQorICAgICAgICAgICAgICAgIG1fY29tcGxldGlv
blJldHVybiA9IGN1cnJlbnROb2RlLT5jcmVhdGVFcnJvckNvbXBsZXRpb24oZXhlYywgU3ludGF4
RXJyb3IsICJJbnZhbGlkIGJyZWFrIHN0YXRlbWVudC4iKTsKKyAgICAgICAgICAgIGVsc2UKKyAg
ICAgICAgICAgICAgICBtX2NvbXBsZXRpb25SZXR1cm4gPSBjdXJyZW50Tm9kZS0+Y3JlYXRlRXJy
b3JDb21wbGV0aW9uKGV4ZWMsIFN5bnRheEVycm9yLCAiTGFiZWwgJXMgbm90IGZvdW5kLiIsIHRh
cmdldCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAvLyBZb3UgY2Fu
J3QgImNvbnRpbnVlIiBvdXQgb2YgYSBmdW5jdGlvbgorICAgICAgICBjYXNlIENvbnRpbnVlOgor
ICAgICAgICB7CisgICAgICAgICAgICAvLyBGSVhNRTogVGhpcyBjaGVjayBzaG91bGQgaGFwcGVu
IGF0IHBhcnNlIHRpbWUuIFRoZW4gaXQgY2FuIGNoYW5nZSB0byBhbiBBU1NFUlQuCisgICAgICAg
ICAgICBjb25zdCBJZGVudGlmaWVyJiB0YXJnZXQgPSBtX2NvbXBsZXRpb25SZXR1cm4udGFyZ2V0
KCk7CisgICAgICAgICAgICBpZiAodGFyZ2V0LmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICBt
X2NvbXBsZXRpb25SZXR1cm4gPSBjdXJyZW50Tm9kZS0+Y3JlYXRlRXJyb3JDb21wbGV0aW9uKGV4
ZWMsIFN5bnRheEVycm9yLCAiSW52YWxpZCBjb250aW51ZSBzdGF0ZW1lbnQuIik7CisgICAgICAg
ICAgICBlbHNlCisgICAgICAgICAgICAgICAgbV9jb21wbGV0aW9uUmV0dXJuID0gY3VycmVudE5v
ZGUtPmNyZWF0ZUVycm9yQ29tcGxldGlvbihleGVjLCBTeW50YXhFcnJvciwgIkxhYmVsICVzIG5v
dCBmb3VuZC4iLCB0YXJnZXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAg
ICAgLy8gWW91IGNhbiAicmV0dXJuIiBhbmQgInRocm93IiBvdXQgb2YgYSBmdW5jdGlvbiwgc28g
d2UgcHJvcG9nYXRlIHRoZSBjb21wbGV0aW9uIHRvIHRoZSBjYWxsaW5nIGZyYW1lCisgICAgICAg
IGNhc2UgUmV0dXJuVmFsdWU6CisgICAgICAgIGNhc2UgVGhyb3c6CisgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIElmIGEgdGhyb3cgY29tZXMgZnJvbSBhbiBp
bnRlcm5hbCBmdW5jdGlvbiBvciBhbiBldmFsIHN0YXRlbWVudCwgaXQgZG9lc24ndCBpbmNsdWRl
IGEgbGluZSBudW1iZXIsCisgICAgLy8gc28gd2Ugd2FsayB0aGUgc3RhdGUgc3RhY2sgdW50aWwg
d2UgZmluZCBhIG5vZGUgd2l0aCBhIHZhbGlkIGxpbmUgbnVtYmVyLCB3aGljaCBzaG91bGQgYmUg
dGhlIGNhbGxlci4KKyAgICBpZiAoZXhlYy0+aGFkRXhjZXB0aW9uKCkpIHsgICAgCisgICAgICAg
IEpTVmFsdWUgKmV4Y2VwdGlvblZhbHVlID0gZXhlYy0+ZXhjZXB0aW9uKCk7CisgICAgICAgIGlm
IChleGNlcHRpb25WYWx1ZS0+aXNPYmplY3QoKSkgeworICAgICAgICAgICAgSlNPYmplY3QgKmV4
Y2VwdGlvbiA9IHN0YXRpY19jYXN0PEpTT2JqZWN0ICo+KGV4Y2VwdGlvblZhbHVlKTsKKyAgICAg
ICAgICAgIGlmICghZXhjZXB0aW9uLT5oYXNQcm9wZXJ0eShleGVjLCAic291cmNlVVJMIikpCisg
ICAgICAgICAgICAgICAgZXhjZXB0aW9uLT5wdXQoZXhlYywgInNvdXJjZVVSTCIsIGpzU3RyaW5n
KGN1cnJlbnRTb3VyY2VVUkwoZXhlYykpKTsKKyAgICAgICAgICAgIGlmICghZXhjZXB0aW9uLT5o
YXNQcm9wZXJ0eShleGVjLCAibGluZSIpKSB7CisgICAgICAgICAgICAgICAgLy8gV2FsayB0aGUg
c3RhdGUgc3RhY2sgdW50aWwgd2UgZmluZCBhIHZhbGlkIGxpbmUgbnVtYmVyCisgICAgICAgICAg
ICAgICAgaW50IHN0YXRlU3RhY2tVbndpbmRMaW1pdCA9IGJhcnJpZXItPnN0YXRlU3RhY2tTaXpl
OworICAgICAgICAgICAgICAgIGZvciAoaW50IHN0YXRlU3RhY2tJbmRleCA9IHN0YXRlU3RhY2tE
ZXB0aCgpIC0gMTsgc3RhdGVTdGFja0luZGV4ID49IHN0YXRlU3RhY2tVbndpbmRMaW1pdDsgc3Rh
dGVTdGFja0luZGV4LS0pIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RhdGUmIHN0YXRl
ID0gbV9zdGF0ZVN0YWNrW3N0YXRlU3RhY2tJbmRleF07CisgICAgICAgICAgICAgICAgICAgIGlm
IChzdGF0ZS5ub2RlLT5tX2xpbmUgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4
Y2VwdGlvbi0+cHV0KGV4ZWMsICJsaW5lIiwganNOdW1iZXIoc3RhdGUubm9kZS0+bV9saW5lKSk7
CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQor
ICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBleGVj
LT5jbGVhckV4Y2VwdGlvbigpOworICAgIH0KKyAgICAKKyAgICAvLyBSZXNldCB0aGUgdW53aW5k
IGJhcnJpZXIgc3RhY2sKKyAgICBtX3Vud2luZEJhcnJpZXJTdGFjay5zaHJpbmtUbyhiYXJyaWVy
SW5kZXggKyAxKTsKKworICAgIC8vIEFTU0VSVCB0aGF0IHVud2luZGluZyB0cmF2ZWxzIGRvd24g
dGhlIHN0YWNrLCBub3QgdXAKKyAgICBBU1NFUlQodmFsdWVTdGFja0RlcHRoKCkgPj0gYmFycmll
ci0+dmFsdWVTdGFja1NpemUpOworICAgIEFTU0VSVChzdGF0ZVN0YWNrRGVwdGgoKSA+PSBiYXJy
aWVyLT5zdGF0ZVN0YWNrU2l6ZSk7CisgICAgQVNTRVJUKGxpc3RTdGFja0RlcHRoKCkgPj0gYmFy
cmllci0+bGlzdFN0YWNrU2l6ZSk7CisgICAgQVNTRVJUKG5vZGVTdGFja0RlcHRoKCkgPj0gYmFy
cmllci0+bm9kZVN0YWNrU2l6ZSk7CisKKyAgICAvLyBVbndpbmQgdGhlIHN0YWNrcworICAgIG1f
c3RhdGVTdGFjay5zaHJpbmtUbyhiYXJyaWVyLT5zdGF0ZVN0YWNrU2l6ZSk7CisgICAgbV92YWx1
ZVN0YWNrLnNocmlua1RvKGJhcnJpZXItPnZhbHVlU3RhY2tTaXplKTsKKyAgICBtX2xpc3RSZXR1
cm5TdGFjay5zaHJpbmtUbyhiYXJyaWVyLT5saXN0U3RhY2tTaXplKTsKKyAgICBtX25vZGVTdGFj
ay5zaHJpbmtUbyhiYXJyaWVyLT5ub2RlU3RhY2tTaXplKTsKKyAgICAKKyAgICAvLyBGSVhNRTog
SGFjayBmb3IgcmVjb2duaXppbmcgZnVuY3Rpb24gY2FsbCBmcmFtZSBiYXJyaWVycyBhbmQgc2Nv
cGUgY2hhaW4gYmFycmllcnMKKyAgICBpZiAoYmFycmllci0+Y29udGludWVTdGF0ZS5zdGF0ZSAh
PSBJbnRlcm5hbEVycm9yU3RhdGUpCisgICAgICAgIHB1c2hOZXh0U3RhdGUoYmFycmllci0+Y29u
dGludWVTdGF0ZSk7Cit9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnRl
cm5hbEZ1bmN0aW9uSW1wIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKSW5kZXg6IGtqcy9U
cmVlQ29kZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIGtqcy9UcmVlQ29kZS5oCShyZXZpc2lvbiAwKQorKysg
a2pzL1RyZWVDb2RlLmgJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiAgVGhp
cyBmaWxlIGlzIHBhcnQgb2YgdGhlIEtERSBsaWJyYXJpZXMKKyAqICBDb3B5cmlnaHQgKEMpIDE5
OTktMjAwMiBIYXJyaSBQb3J0ZW4gKHBvcnRlbkBrZGUub3JnKQorICogIENvcHlyaWdodCAoQykg
MjAwMSBQZXRlciBLZWxseSAocG1rQHBvc3QuY29tKQorICogIENvcHlyaWdodCAoQykgMjAwMyBB
cHBsZSBDb21wdXRlciwgSW5jLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2Fy
ZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRo
ZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFz
IHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqICB2
ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZl
cnNpb24uCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0
aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0
aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9y
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMaWJy
YXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91
IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQ
dWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUg
Q09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91
bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqICBCb3N0
b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKworbmFtZXNwYWNlIEtKUyB7CisKK0Nv
bXBsZXRpb24gY2FsbEV4ZWN1dGVPbk5vZGUoU3RhdGVtZW50Tm9kZSosIEV4ZWNTdGF0ZSopOwor
SlNWYWx1ZSAqdHlwZVN0cmluZ0ZvclZhbHVlKEpTVmFsdWUqKTsKKworfSAvLyBuYW1lc3BhY2UK
XCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCkluZGV4OiBranMvaW50ZXJuYWwuaAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBranMvaW50ZXJuYWwuaAkocmV2aXNpb24gMTM3NDUpCisrKyBranMvaW50ZXJuYWwu
aAkod29ya2luZyBjb3B5KQpAQCAtMzIsOSArMzIsMTEgQEAKICNpbmNsdWRlICJzY29wZV9jaGFp
bi5oIgogI2luY2x1ZGUgInR5cGVzLmgiCiAjaW5jbHVkZSAidXN0cmluZy5oIgorI2luY2x1ZGUg
IkludGVycHJldGVyU3RhdGUuaCIKIAogI2luY2x1ZGUgPGt4bWxjb3JlL05vbmNvcHlhYmxlLmg+
CiAjaW5jbHVkZSA8a3htbGNvcmUvUmVmUHRyLmg+CisjaW5jbHVkZSA8a3htbGNvcmUvVmVjdG9y
Lmg+CiAKICNkZWZpbmUgSTE4Tl9OT09QKHMpIHMKIApAQCAtNDIsNyArNDQsOCBAQCBuYW1lc3Bh
Y2UgS0pTIHsKIAogICBjbGFzcyBEZWJ1Z2dlcjsKICAgY2xhc3MgRnVuY3Rpb25Qcm90b3R5cGU7
Ci0KKyAgY2xhc3MgTm9kZTsKKyAgICAKICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIC8vICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIFByaW1pdGl2ZSBpbXBscwogICAvLyAtLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0KQEAgLTE2OSw2ICsxNzIsNDggQEAgbmFtZXNwYWNlIEtKUyB7CiAgICAgUHJvdGVj
dGVkUHRyPEpTT2JqZWN0PiBiX3R5cGVFcnJvclByb3RvdHlwZTsKICAgICBQcm90ZWN0ZWRQdHI8
SlNPYmplY3Q+IGJfdXJpRXJyb3JQcm90b3R5cGU7CiAgIH07CisgIAorI2RlZmluZSBTVEFDS19V
U0VTX0FSUkFZIDAKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc2l6ZV90IGlubGluZUNhcGFj
aXR5ID0gMD4KKyAgICAgIGNsYXNzIFN0YWNrIHsKKyAgICBwdWJsaWM6CisjaWYgU1RBQ0tfVVNF
U19BUlJBWQorICAgICAgICAgIFN0YWNrKCkgOiBtX3N0YWNrVG9wKG1fc3RhY2tCYXNlIC0gMSkg
eyB9CisgICAgICAgICAgVCYgcGVlaygpIHsgQVNTRVJUKCFpc0VtcHR5KCkpOyByZXR1cm4gKm1f
c3RhY2tUb3A7fQorICAgICAgICAgIHZvaWQgcHVzaChjb25zdCBUJiB2YWx1ZSkgeyAgQVNTRVJU
KHNpemUoKSAhPSBpbmxpbmVDYXBhY2l0eSk7ICooKyttX3N0YWNrVG9wKSA9IHZhbHVlOyB9Cisg
ICAgICAgICAgVCBwb3AoKSB7IEFTU0VSVCghaXNFbXB0eSgpKTsgcmV0dXJuICptX3N0YWNrVG9w
LS07IH0KKyAgICAgICAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fc3RhY2tUb3Ag
LSBtX3N0YWNrQmFzZSArIDE7IH0KKyAgICAgICAgICBib29sIGlzRW1wdHkoKSBjb25zdCB7IHJl
dHVybiAobV9zdGFja1RvcCA8IG1fc3RhY2tCYXNlKTsgfQorICAgICAgICAgIHZvaWQgc2hyaW5r
VG8oc2l6ZV90IG5ld1NpemUpIHsgbV9zdGFja1RvcCA9IG1fc3RhY2tCYXNlICsgbmV3U2l6ZSAt
IDE7IH0KKyAgICAgICAgICBUJiBvcGVyYXRvcltdKHVuc2lnbmVkIGkpIHsgQVNTRVJUKGkgPCBp
bmxpbmVDYXBhY2l0eSk7IHJldHVybiBtX3N0YWNrQmFzZVtpXTsgfQorICAgICAgICAgIGNvbnN0
IFQmIG9wZXJhdG9yW10odW5zaWduZWQgaSkgY29uc3QgeyBBU1NFUlQoaSA8IGlubGluZUNhcGFj
aXR5KTsgcmV0dXJuIG1fc3RhY2tCYXNlW2ldOyB9CisgICAgcHJpdmF0ZToKKyAgICAgICAgVCBt
X3N0YWNrQmFzZVtpbmxpbmVDYXBhY2l0eV07CisgICAgICAgIFQqIG1fc3RhY2tUb3A7IC8vIHBv
aW50ZXIgdG8gdGhlIGxhc3QgcHVzaGVkIHZhbHVlCisjZWxzZQorICAgICAgICAgIFQmIHBlZWso
KSB7IHJldHVybiBtX3ZlY3Rvci5sYXN0KCk7IH0KKyAgICAgICAgICB2b2lkIHB1c2goY29uc3Qg
VCYgdmFsdWUpIHsgbV92ZWN0b3IuYXBwZW5kKHZhbHVlKTsgfQorICAgICAgICAgIFQgcG9wKCk7
CisgICAgICAgICAgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBtX3ZlY3Rvci5zaXplKCk7
IH0KKyAgICAgICAgICBib29sIGlzRW1wdHkoKSBjb25zdCB7IHJldHVybiBtX3ZlY3Rvci5pc0Vt
cHR5KCk7IH0KKyAgICAgICAgICB2b2lkIHNocmlua1RvKHNpemVfdCBuZXdTaXplKSB7IG1fdmVj
dG9yLnNocmlua1RvKG5ld1NpemUpOyB9CisgICAgICAgICAgVCYgb3BlcmF0b3JbXSh1bnNpZ25l
ZCBpKSB7IHJldHVybiBtX3ZlY3Rvci5hdChpKTsgfQorICAgICAgICAgIGNvbnN0IFQmIG9wZXJh
dG9yW10odW5zaWduZWQgaSkgY29uc3QgeyByZXR1cm4gbV92ZWN0b3IuYXQoaSk7IH0KKyAgICBw
cml2YXRlOgorICAgICAgICBWZWN0b3I8VCwgaW5saW5lQ2FwYWNpdHk+IG1fdmVjdG9yOworI2Vu
ZGlmCisgICAgICB9OworCisjaWYgIVNUQUNLX1VTRVNfQVJSQVkKKyAgdGVtcGxhdGUgPHR5cGVu
YW1lIFQsIHNpemVfdCBpbmxpbmVDYXBhY2l0eT4KKyAgICAgIGlubGluZSBUIFN0YWNrPFQsIGlu
bGluZUNhcGFjaXR5Pjo6cG9wKCkKKyAgeworICAgICAgICAgIFQgdmFsdWUgPSBtX3ZlY3Rvci5s
YXN0KCk7CisgICAgICAgICAgbV92ZWN0b3IucmVtb3ZlTGFzdCgpOworICAgICAgICAgIHJldHVy
biB2YWx1ZTsKKyAgfQorI2VuZGlmCiAKICAgY2xhc3MgSW50ZXJwcmV0ZXJJbXAgewogICAgIGZy
aWVuZCBjbGFzcyBDb2xsZWN0b3I7CkBAIC0yMzgsNiArMjgzLDkwIEBAIG5hbWVzcGFjZSBLSlMg
ewogCiAgICAgdm9pZCBzYXZlQnVpbHRpbnMgKFNhdmVkQnVpbHRpbnMgJmJ1aWx0aW5zKSBjb25z
dDsKICAgICB2b2lkIHJlc3RvcmVCdWlsdGlucyAoY29uc3QgU2F2ZWRCdWlsdGlucyAmYnVpbHRp
bnMpOworICAgICAgICAgICAgCisgICAgSlNWYWx1ZSomIHBlZWtWYWx1ZUxvY2FsKCkgeyByZXR1
cm4gbV92YWx1ZVN0YWNrLnBlZWsoKTsgfQorICAgIEpTVmFsdWUqIHBvcFZhbHVlTG9jYWwoKSB7
IHJldHVybiBtX3ZhbHVlU3RhY2sucG9wKCk7IH0KKyAgICB2b2lkIHB1c2hWYWx1ZUxvY2FsKEpT
VmFsdWUqIHZhbHVlKSB7IG1fdmFsdWVTdGFjay5wdXNoKHZhbHVlKTsgfQorICAgIHVuc2lnbmVk
IHZhbHVlU3RhY2tEZXB0aCgpIHsgcmV0dXJuIG1fdmFsdWVTdGFjay5zaXplKCk7IH0KKyAgICAK
KyAgICBzdHJ1Y3QgU3RhdGUgeworICAgICAgICBTdGF0ZSgpIHsgfSAvLyBBbGxvdyBTdGFjazxU
PiBhcnJheS1iYXNlZCBhbGxvY2F0aW9uCisgICAgICAgIFN0YXRlKEludGVycHJldGVyU3RhdGUg
cywgTm9kZSogbikgOiBzdGF0ZShzKSwgbm9kZShuKSB7IH0KKyAgICAgICAgSW50ZXJwcmV0ZXJT
dGF0ZSBzdGF0ZTsKKyAgICAgICAgTm9kZSogbm9kZTsKKyAgICB9OworCisgICAgY29uc3QgQ29t
cGxldGlvbiYgZ2V0Q29tcGxldGlvblJldHVybigpIHsgcmV0dXJuIG1fY29tcGxldGlvblJldHVy
bjsgfQorICAgIHZvaWQgcmVzZXRDb21wbGV0aW9uVG9Ob3JtYWwoKSB7IG1fY29tcGxldGlvblJl
dHVybiA9IE5vcm1hbDsgfQorICAgIHZvaWQgc2V0Q29tcGxldGlvblJldHVybihjb25zdCBDb21w
bGV0aW9uJiBjKSB7IEFTU0VSVChtX2NvbXBsZXRpb25SZXR1cm4uY29tcGxUeXBlKCkgPT0gTm9y
bWFsKTsgaWYgKGMuY29tcGxUeXBlKCkgIT0gTm9ybWFsIHx8IGMudmFsdWUoKSkgbV9jb21wbGV0
aW9uUmV0dXJuID0gYzsgfQorICAgIAorICAgIEpTVmFsdWUqIGdldFZhbHVlUmV0dXJuKCkgeyBy
ZXR1cm4gbV92YWx1ZVJldHVybjsgfQorICAgIHZvaWQgc2V0VmFsdWVSZXR1cm4oSlNWYWx1ZSog
dikgeyBtX3ZhbHVlUmV0dXJuID0gdjsgfQorICAgIAorICAgIGNvbnN0IFN0YXRlJiBwZWVrTmV4
dFN0YXRlKCkgeyByZXR1cm4gbV9zdGF0ZVN0YWNrLnBlZWsoKTsgfQorICAgIFN0YXRlIHBvcE5l
eHRTdGF0ZSgpIHsgcmV0dXJuIG1fc3RhdGVTdGFjay5wb3AoKTsgfQorICAgIHZvaWQgcHVzaE5l
eHRTdGF0ZShjb25zdCBTdGF0ZSYgc3RhdGUpIHsgbV9zdGF0ZVN0YWNrLnB1c2goc3RhdGUpOyB9
CisgICAgdW5zaWduZWQgc3RhdGVTdGFja0RlcHRoKCkgeyByZXR1cm4gbV9zdGF0ZVN0YWNrLnNp
emUoKTsgfQorICAgIAorICAgIHN0cnVjdCBVbndpbmRCYXJyaWVyIHsKKyAgICAgICAgVW53aW5k
QmFycmllcigpIHsgfSAvLyBBbGxvdyBTdGFjazxUPiBhcnJheS1iYXNlZCBhbGxvY2F0aW9uCisg
ICAgICAgIFVud2luZEJhcnJpZXIoc2hvcnQgdHlwZSwgY29uc3QgU3RhdGUmIHN0YXRlLCBzaXpl
X3QgdmFsdWVCYXNlLCBzaXplX3Qgc3RhdGVCYXNlLCBzaXplX3QgbGlzdEJhc2UsIHNpemVfdCBu
b2RlQmFzZSkKKyAgICAgICAgICAgIDogYmFycmllclR5cGUodHlwZSkKKyAgICAgICAgICAgICwg
Y29udGludWVTdGF0ZShzdGF0ZSkKKyAgICAgICAgICAgICwgdmFsdWVTdGFja1NpemUodmFsdWVC
YXNlKQorICAgICAgICAgICAgLCBzdGF0ZVN0YWNrU2l6ZShzdGF0ZUJhc2UpCisgICAgICAgICAg
ICAsIGxpc3RTdGFja1NpemUobGlzdEJhc2UpCisgICAgICAgICAgICAsIG5vZGVTdGFja1NpemUo
bm9kZUJhc2UpIAorICAgICAgICB7IAorICAgICAgICB9CisKKyAgICAgICAgc2hvcnQgYmFycmll
clR5cGU7CisgICAgICAgIFN0YXRlIGNvbnRpbnVlU3RhdGU7CisgICAgICAgIHNpemVfdCB2YWx1
ZVN0YWNrU2l6ZTsKKyAgICAgICAgc2l6ZV90IHN0YXRlU3RhY2tTaXplOworICAgICAgICBzaXpl
X3QgbGlzdFN0YWNrU2l6ZTsKKyAgICAgICAgc2l6ZV90IG5vZGVTdGFja1NpemU7CisgICAgfTsK
KyAgICAKKyAgICBjb25zdCBVbndpbmRCYXJyaWVyJiBwZWVrVW53aW5kQmFycmllcigpCisgICAg
eworICAgICAgICByZXR1cm4gbV91bndpbmRCYXJyaWVyU3RhY2sucGVlaygpOworICAgIH0KKwor
ICAgIC8vIEZJWE1FOiBBU1NFUlQgdGhhdCBlbnVtL3Nob3J0IGNvbnZlcnNpb24gZG9lc24ndCBs
b3NlIGRhdGEKKyAgICB2b2lkIHB1c2hVbndpbmRCYXJyaWVyKHNob3J0IGJhcnJpZXJUeXBlLCBT
dGF0ZSBjb250aW51ZVN0YXRlKQorICAgIHsKKyAgICAgICAgVW53aW5kQmFycmllciB1bndpbmRC
YXJyaWVyKGJhcnJpZXJUeXBlLCBjb250aW51ZVN0YXRlLCB2YWx1ZVN0YWNrRGVwdGgoKSwgc3Rh
dGVTdGFja0RlcHRoKCksIGxpc3RTdGFja0RlcHRoKCksIG5vZGVTdGFja0RlcHRoKCkpOworICAg
ICAgICBtX3Vud2luZEJhcnJpZXJTdGFjay5wdXNoKHVud2luZEJhcnJpZXIpOworICAgIH0KKyAg
ICB2b2lkIHBvcFVud2luZEJhcnJpZXIoKQorICAgIHsKKyNpZm5kZWYgTkRFQlVHCisgICAgICAg
IGNvbnN0IFVud2luZEJhcnJpZXImIHVud2luZEJhcnJpZXIgPSBtX3Vud2luZEJhcnJpZXJTdGFj
ay5wZWVrKCk7CisgICAgICAgIEFTU0VSVCh2YWx1ZVN0YWNrRGVwdGgoKSA9PSB1bndpbmRCYXJy
aWVyLnZhbHVlU3RhY2tTaXplKTsKKyAgICAgICAgQVNTRVJUKHN0YXRlU3RhY2tEZXB0aCgpID09
IHVud2luZEJhcnJpZXIuc3RhdGVTdGFja1NpemUpOworICAgICAgICBBU1NFUlQobGlzdFN0YWNr
RGVwdGgoKSA9PSB1bndpbmRCYXJyaWVyLmxpc3RTdGFja1NpemUpOworICAgICAgICBBU1NFUlQo
bm9kZVN0YWNrRGVwdGgoKSA9PSB1bndpbmRCYXJyaWVyLm5vZGVTdGFja1NpemUpOworI2VuZGlm
CisgICAgICAgIG1fdW53aW5kQmFycmllclN0YWNrLnBvcCgpOworICAgIH0KKyAgICB2b2lkIHVu
d2luZFRvTmV4dEJhcnJpZXIoRXhlY1N0YXRlKiBleGVjLCBOb2RlKiBjdXJyZW50Tm9kZSk7Cisg
ICAgICAgIAorICAgIExpc3QmIHBlZWtMaXN0UmV0dXJuKCkgeyByZXR1cm4gbV9saXN0UmV0dXJu
U3RhY2sucGVlaygpOyB9CisgICAgTGlzdCBwb3BMaXN0UmV0dXJuKCkgeyByZXR1cm4gbV9saXN0
UmV0dXJuU3RhY2sucG9wKCk7IH0KKyAgICB2b2lkIHB1c2hMaXN0UmV0dXJuKGNvbnN0IExpc3Qm
IGxpc3QpIHsgbV9saXN0UmV0dXJuU3RhY2sucHVzaChsaXN0KTsgfQorICAgIHVuc2lnbmVkIGxp
c3RTdGFja0RlcHRoKCkgeyByZXR1cm4gbV9saXN0UmV0dXJuU3RhY2suc2l6ZSgpOyB9CisgICAg
CisgICAgTm9kZSomIHBlZWtOb2RlTG9jYWwoKSB7IHJldHVybiBtX25vZGVTdGFjay5wZWVrKCk7
IH0KKyAgICBOb2RlKiBwb3BOb2RlTG9jYWwoKSB7IHJldHVybiBtX25vZGVTdGFjay5wb3AoKTsg
fQorICAgIHZvaWQgcHVzaE5vZGVMb2NhbChOb2RlKiBub2RlKSB7IG1fbm9kZVN0YWNrLnB1c2go
bm9kZSk7IH0KKyAgICB1bnNpZ25lZCBub2RlU3RhY2tEZXB0aCgpIHsgcmV0dXJuIG1fbm9kZVN0
YWNrLnNpemUoKTsgfQorICAgIAorICAgIHZvaWQgcHJpbnRTdGFja3MoKTsKKyAgICB2b2lkIHBy
aW50U3RhdGVTdGFjaygpOworICAgIHZvaWQgcHJpbnRWYWx1ZVN0YWNrKCk7CisgICAgdm9pZCBw
cmludExpc3RTdGFjaygpOworICAgIHZvaWQgcHJpbnRVbndpbmRCYXJyaWVyU3RhY2soKTsKIAog
ICBwcml2YXRlOgogICAgIHZvaWQgY2xlYXIoKTsKQEAgLTI5Myw2ICs0MjIsMTQgQEAgbmFtZXNw
YWNlIEtKUyB7CiAgICAgQ29udGV4dEltcCAqX2NvbnRleHQ7CiAKICAgICBpbnQgcmVjdXJzaW9u
OworICAgIAorICAgIENvbXBsZXRpb24gbV9jb21wbGV0aW9uUmV0dXJuOworICAgIEpTVmFsdWUq
IG1fdmFsdWVSZXR1cm47CisgICAgU3RhY2s8VW53aW5kQmFycmllciwgS0pTX01BWF9TVEFDSz4g
bV91bndpbmRCYXJyaWVyU3RhY2s7CisgICAgU3RhY2s8U3RhdGUsIEtKU19NQVhfU1RBQ0s+IG1f
c3RhdGVTdGFjazsKKyAgICBTdGFjazxKU1ZhbHVlKiwgS0pTX01BWF9TVEFDSz4gbV92YWx1ZVN0
YWNrOworICAgIFN0YWNrPExpc3QsIEtKU19NQVhfU1RBQ0s+IG1fbGlzdFJldHVyblN0YWNrOwor
ICAgIFN0YWNrPE5vZGUqLCBLSlNfTUFYX1NUQUNLPiBtX25vZGVTdGFjazsKICAgfTsKIAogICBj
bGFzcyBBdHRhY2hlZEludGVycHJldGVyOwpAQCAtMzU2LDQgKzQ5Myw5IEBAIGlubGluZSB2b2lk
IExhYmVsU3RhY2s6OnBvcCgpCiAKIH0gLy8gbmFtZXNwYWNlCiAKK25hbWVzcGFjZSBLWE1MQ29y
ZSB7CisgICAgdGVtcGxhdGU8PiBzdHJ1Y3QgSXNQb2Q8S0pTOjpJbnRlcnByZXRlckltcDo6U3Rh
dGU+IHsgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSB0cnVlOyB9OworICAgIHRlbXBsYXRlPD4g
c3RydWN0IElzUG9kPEtKUzo6SW50ZXJwcmV0ZXJJbXA6OlVud2luZEJhcnJpZXI+IHsgc3RhdGlj
IGNvbnN0IGJvb2wgdmFsdWUgPSB0cnVlOyB9OworfQorCiAjZW5kaWYgLy8gIElOVEVSTkFMX0gK
SW5kZXg6IGtqcy9mdW5jdGlvbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0ga2pzL2Z1bmN0aW9uLmNwcAko
cmV2aXNpb24gMTM3NDUpCisrKyBranMvZnVuY3Rpb24uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0z
Miw2ICszMiw3IEBACiAjaW5jbHVkZSAib3BlcmF0aW9ucy5oIgogI2luY2x1ZGUgImRlYnVnZ2Vy
LmgiCiAjaW5jbHVkZSAiY29udGV4dC5oIgorI2luY2x1ZGUgIlRyZWVDb2RlLmgiCiAKICNpbmNs
dWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPGVycm5vLmg+CkBAIC02OCw2ICs2OSw3IEBAIEZ1bmN0
aW9uSW1wOjp+RnVuY3Rpb25JbXAoKQogCiBKU1ZhbHVlICpGdW5jdGlvbkltcDo6Y2FsbEFzRnVu
Y3Rpb24oRXhlY1N0YXRlKiBleGVjLCBKU09iamVjdCogdGhpc09iaiwgY29uc3QgTGlzdCYgYXJn
cykKIHsKKyAgQVNTRVJUKCFleGVjLT5oYWRFeGNlcHRpb24oKSk7CiAgIEpTT2JqZWN0ICpnbG9i
YWxPYmogPSBleGVjLT5keW5hbWljSW50ZXJwcmV0ZXIoKS0+Z2xvYmFsT2JqZWN0KCk7CiAKICAg
Ly8gZW50ZXIgYSBuZXcgZXhlY3V0aW9uIGNvbnRleHQKQEAgLTMwOCw2ICszMTAsNyBAQCBib29s
IERlY2xhcmVkRnVuY3Rpb25JbXA6OmltcGxlbWVudHNDb25zCiAvLyBFQ01BIDEzLjIuMiBbW0Nv
bnN0cnVjdF1dCiBKU09iamVjdCAqRGVjbGFyZWRGdW5jdGlvbkltcDo6Y29uc3RydWN0KEV4ZWNT
dGF0ZSAqZXhlYywgY29uc3QgTGlzdCAmYXJncykKIHsKKyAgQVNTRVJUKCFleGVjLT5oYWRFeGNl
cHRpb24oKSk7CiAgIEpTT2JqZWN0ICpwcm90bzsKICAgSlNWYWx1ZSAqcCA9IGdldChleGVjLHBy
b3RvdHlwZVByb3BlcnR5TmFtZSk7CiAgIGlmIChwLT5pc09iamVjdCgpKQpAQCAtMzI3LDcgKzMz
MCw4IEBAIEpTT2JqZWN0ICpEZWNsYXJlZEZ1bmN0aW9uSW1wOjpjb25zdHJ1Y3QKIAogQ29tcGxl
dGlvbiBEZWNsYXJlZEZ1bmN0aW9uSW1wOjpleGVjdXRlKEV4ZWNTdGF0ZSAqZXhlYykKIHsKLSAg
Q29tcGxldGlvbiByZXN1bHQgPSBib2R5LT5leGVjdXRlKGV4ZWMpOworICBBU1NFUlQoIWV4ZWMt
PmhhZEV4Y2VwdGlvbigpKTsKKyAgQ29tcGxldGlvbiByZXN1bHQgPSBjYWxsRXhlY3V0ZU9uTm9k
ZShib2R5LmdldCgpLCBleGVjKTsKIAogICBpZiAocmVzdWx0LmNvbXBsVHlwZSgpID09IFRocm93
IHx8IHJlc3VsdC5jb21wbFR5cGUoKSA9PSBSZXR1cm5WYWx1ZSkKICAgICAgIHJldHVybiByZXN1
bHQ7CkBAIC04MTIsMTMgKzgxNiwxNyBAQCBKU1ZhbHVlICpHbG9iYWxGdW5jSW1wOjpjYWxsQXNG
dW5jdGlvbihFCiAgICAgICAgIAogICAgICAgICAvLyBleGVjdXRlIHRoZSBjb2RlCiAgICAgICAg
IHByb2dOb2RlLT5wcm9jZXNzVmFyRGVjbHMoJm5ld0V4ZWMpOwotICAgICAgICBDb21wbGV0aW9u
IGMgPSBwcm9nTm9kZS0+ZXhlY3V0ZSgmbmV3RXhlYyk7CisgICAgICAgIAorICAgICAgICAvLyBF
dmFsIHJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBsYXN0IHN0YXRlbWVudCBleGVjdXRlZCBieSB0
aGUgaW50ZXJwcmV0ZXIuIFdlIG5lZWQKKyAgICAgICAgLy8gdG8gY2xlYXIgdGhhdCB2YWx1ZSBp
bml0aWFsbHksIG90aGVyd2lzZSBhbiBldmFsIHRoYXQgb25seSBleGVjdXRlZCBlbXB0eSBzdGF0
ZW1lbnRzIChlLmcuIGV2YWwoIiIpKQorICAgICAgICAvLyB3b3VsZCByZXR1cm4gdGhlIHZhbHVl
IG9mIHRoZSBsYXN0IHN0YXRlbWVudCBleGVjdXRlZCBiZWZvcmUgdGhlIGV2YWwsIGluc3RlYWQg
b2YgJ3VuZGVmaW5lZCcuCisgICAgICAgIGV4ZWMtPmR5bmFtaWNJbnRlcnByZXRlcigpLT5pbXAo
KS0+cmVzZXRDb21wbGV0aW9uVG9Ob3JtYWwoKTsKKyAgICAgICAgcmVzID0ganNVbmRlZmluZWQo
KTsKIAotICAgICAgICAvLyBpZiBhbiBleGNlcHRpb24gb2NjdXJlZCwgcHJvcG9nYXRlIGl0IGJh
Y2sgdG8gdGhlIHByZXZpb3VzIGV4ZWN1dGlvbiBvYmplY3QKLSAgICAgICAgaWYgKG5ld0V4ZWMu
aGFkRXhjZXB0aW9uKCkpCi0gICAgICAgICAgZXhlYy0+c2V0RXhjZXB0aW9uKG5ld0V4ZWMuZXhj
ZXB0aW9uKCkpOworICAgICAgICBDb21wbGV0aW9uIGMgPSBjYWxsRXhlY3V0ZU9uTm9kZShwcm9n
Tm9kZS5nZXQoKSwgJm5ld0V4ZWMpOworICAgICAgICAvLyBjYWxsRXhlY3V0ZU9uTm9kZSBjbGVh
cnMgZXhjZXB0aW9ucyBhbmQgcmV0dXJucyB0aGVtIGFzIHBhcnQgb2YgYSBUaHJvdyBjb21wbGV0
aW9uCisgICAgICAgIEFTU0VSVCghbmV3RXhlYy5oYWRFeGNlcHRpb24oKSk7CiAKLSAgICAgICAg
cmVzID0ganNVbmRlZmluZWQoKTsKICAgICAgICAgaWYgKGMuY29tcGxUeXBlKCkgPT0gVGhyb3cp
CiAgICAgICAgICAgZXhlYy0+c2V0RXhjZXB0aW9uKGMudmFsdWUoKSk7CiAgICAgICAgIGVsc2Ug
aWYgKGMuaXNWYWx1ZUNvbXBsZXRpb24oKSkKSW5kZXg6IGtqcy9ub2Rlcy5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0ga2pzL25vZGVzLmNwcAkocmV2aXNpb24gMTM3NDUpCisrKyBranMvbm9kZXMuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC0yNCw3MCArMjQsMzQgQEAKICNpbmNsdWRlICJjb25maWcuaCIKICNp
bmNsdWRlICJub2Rlcy5oIgogCi0jaW5jbHVkZSA8bWF0aC5oPgotI2luY2x1ZGUgPGFzc2VydC5o
PgotI2lmZGVmIEtKU19ERUJVR19NRU0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHR5
cGVpbmZvPgotI2VuZGlmCi0KICNpbmNsdWRlICJjb2xsZWN0b3IuaCIKICNpbmNsdWRlICJjb250
ZXh0LmgiCiAjaW5jbHVkZSAiZGVidWdnZXIuaCIKICNpbmNsdWRlICJmdW5jdGlvbl9vYmplY3Qu
aCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgotI2luY2x1ZGUgInZhbHVlLmgiCi0jaW5jbHVkZSAi
b2JqZWN0LmgiCi0jaW5jbHVkZSAidHlwZXMuaCIKICNpbmNsdWRlICJpbnRlcnByZXRlci5oIgog
I2luY2x1ZGUgImxleGVyLmgiCisjaW5jbHVkZSAib2JqZWN0LmgiCiAjaW5jbHVkZSAib3BlcmF0
aW9ucy5oIgotI2luY2x1ZGUgInVzdHJpbmcuaCIKICNpbmNsdWRlICJyZWZlcmVuY2VfbGlzdC5o
IgotI2luY2x1ZGUgPGt4bWxjb3JlL0hhc2hTZXQuaD4KKyNpbmNsdWRlICJ0eXBlcy5oIgorI2lu
Y2x1ZGUgInVzdHJpbmcuaCIKKyNpbmNsdWRlICJ2YWx1ZS5oIgogI2luY2x1ZGUgPGt4bWxjb3Jl
L0hhc2hDb3VudGVkU2V0Lmg+CisjaW5jbHVkZSA8a3htbGNvcmUvSGFzaFNldC5oPgogCi11c2lu
ZyBuYW1lc3BhY2UgS0pTOworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPG1hdGguaD4K
KworI2lmZGVmIEtKU19ERUJVR19NRU0KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHR5
cGVpbmZvPgorI2VuZGlmCiAKLSNkZWZpbmUgS0pTX0JSRUFLUE9JTlQgXAotICBpZiAoRGVidWdn
ZXI6OmRlYnVnZ2Vyc1ByZXNlbnQgPiAwICYmICFoaXRTdGF0ZW1lbnQoZXhlYykpIFwKLSAgICBy
ZXR1cm4gQ29tcGxldGlvbihOb3JtYWwpOwotCi0jZGVmaW5lIEtKU19BQk9SVFBPSU5UIFwKLSAg
aWYgKERlYnVnZ2VyOjpkZWJ1Z2dlcnNQcmVzZW50ID4gMCAmJiBcCi0gICAgICBleGVjLT5keW5h
bWljSW50ZXJwcmV0ZXIoKS0+aW1wKCktPmRlYnVnZ2VyKCkgJiYgXAotICAgICAgZXhlYy0+ZHlu
YW1pY0ludGVycHJldGVyKCktPmltcCgpLT5kZWJ1Z2dlcigpLT5pbXAoKS0+YWJvcnRlZCgpKSBc
Ci0gICAgcmV0dXJuIENvbXBsZXRpb24oTm9ybWFsKTsKLQotI2RlZmluZSBLSlNfQ0hFQ0tFWENF
UFRJT04gXAotICBpZiAoZXhlYy0+aGFkRXhjZXB0aW9uKCkpIHsgXAotICAgIHNldEV4Y2VwdGlv
bkRldGFpbHNJZk5lZWRlZChleGVjKTsgXAotICAgIEpTVmFsdWUgKmV4ID0gZXhlYy0+ZXhjZXB0
aW9uKCk7IFwKLSAgICBleGVjLT5jbGVhckV4Y2VwdGlvbigpOyBcCi0gICAgcmV0dXJuIENvbXBs
ZXRpb24oVGhyb3csIGV4KTsgXAotICB9IFwKLSAgaWYgKENvbGxlY3Rvcjo6aXNPdXRPZk1lbW9y
eSgpKSBcCi0gICAgcmV0dXJuIENvbXBsZXRpb24oVGhyb3csIEVycm9yOjpjcmVhdGUoZXhlYywg
R2VuZXJhbEVycm9yLCAiT3V0IG9mIG1lbW9yeSIpKTsKLQotI2RlZmluZSBLSlNfQ0hFQ0tFWENF
UFRJT05WQUxVRSBcCi0gIGlmIChleGVjLT5oYWRFeGNlcHRpb24oKSkgeyBcCi0gICAgc2V0RXhj
ZXB0aW9uRGV0YWlsc0lmTmVlZGVkKGV4ZWMpOyBcCi0gICAgcmV0dXJuIGpzVW5kZWZpbmVkKCk7
IFwKLSAgfSBcCi0gIGlmIChDb2xsZWN0b3I6OmlzT3V0T2ZNZW1vcnkoKSkgXAotICAgIHJldHVy
biBqc1VuZGVmaW5lZCgpOyAvLyB3aWxsIGJlIHBpY2tlZCB1cCBieSBLSlNfQ0hFQ0tFWENFUFRJ
T04KLQotI2RlZmluZSBLSlNfQ0hFQ0tFWENFUFRJT05MSVNUIFwKLSAgaWYgKGV4ZWMtPmhhZEV4
Y2VwdGlvbigpKSB7IFwKLSAgICBzZXRFeGNlcHRpb25EZXRhaWxzSWZOZWVkZWQoZXhlYyk7IFwK
LSAgICByZXR1cm4gTGlzdCgpOyBcCi0gIH0gXAotICBpZiAoQ29sbGVjdG9yOjppc091dE9mTWVt
b3J5KCkpIFwKLSAgICByZXR1cm4gTGlzdCgpOyAvLyB3aWxsIGJlIHBpY2tlZCB1cCBieSBLSlNf
Q0hFQ0tFWENFUFRJT04KK3VzaW5nIG5hbWVzcGFjZSBLSlM7CiAKIC8vIC0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLSBOb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tCiAKLQogI2lmbmRlZiBOREVCVUcKIHN0cnVjdCBOb2RlQ291bnRlciB7IAogICAgIHN0
YXRpYyBpbnQgY291bnQ7IApAQCAtMTAwLDcgKzY0LDcgQEAgc3RhdGljIE5vZGVDb3VudGVyIG5v
ZGVJbXBsQ291bnRlcjsKIHN0YXRpYyBIYXNoU2V0PE5vZGUqPiogbmV3Tm9kZXM7CiBzdGF0aWMg
SGFzaENvdW50ZWRTZXQ8Tm9kZSo+KiBub2RlRXh0cmFSZWZDb3VudHM7CiAKLU5vZGU6Ok5vZGUo
KQorTm9kZTo6Tm9kZShJbnRlcnByZXRlclN0YXRlIGludGVycHJldGVyU3RhdGUpIDogbV9pbnRl
cnByZXRlclN0YXRlKGludGVycHJldGVyU3RhdGUpCiB7CiAjaWZuZGVmIE5ERUJVRwogICAgICsr
Tm9kZUNvdW50ZXI6OmNvdW50OwpAQCAtMjgxLDE0ICsyNDUsMTcgQEAgTm9kZSAqTm9kZTo6bm9k
ZUluc2lkZUFsbFBhcmVucygpCiAgICAgcmV0dXJuIHRoaXM7CiB9CiAKLS8vIC0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLSBTdGF0ZW1lbnROb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tCi0KLVN0YXRlbWVudE5vZGU6OlN0YXRlbWVudE5vZGUoKSAKLSAgICA6IG1fbGFz
dExpbmUoLTEpCitOb2RlICpHcm91cE5vZGU6Om5vZGVJbnNpZGVBbGxQYXJlbnMoKQogewotICAg
IG1fbGluZSA9IC0xOworICAgIE5vZGUgKm4gPSB0aGlzOworICAgIGRvCisgICAgICAgIG4gPSBz
dGF0aWNfY2FzdDxHcm91cE5vZGUgKj4obiktPmdyb3VwLmdldCgpOworICAgIHdoaWxlIChuLT5p
c0dyb3VwTm9kZSgpKTsKKyAgICByZXR1cm4gbjsKIH0KIAorLy8gLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tIFN0YXRlbWVudE5vZGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0KKwogdm9pZCBTdGF0ZW1lbnROb2RlOjpzZXRMb2MoaW50IGZpcnN0TGluZSwgaW50IGxhc3RM
aW5lKQogewogICAgIG1fbGluZSA9IGZpcnN0TGluZTsKQEAgLTMwOSwxOTI5ICsyNzYsMjg0IEBA
IHZvaWQgU3RhdGVtZW50Tm9kZTo6cHJvY2Vzc0Z1bmNEZWNsKEV4ZWMKIHsKIH0KIAotLy8gLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE51bGxOb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFbGVt
ZW50Tm9kZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLUpTVmFsdWUgKk51
bGxOb2RlOjpldmFsdWF0ZShFeGVjU3RhdGUgKikKLXsKLSAgcmV0dXJuIGpzTnVsbCgpOwordm9p
ZCBFbGVtZW50Tm9kZTo6YnJlYWtDeWNsZSgpIAoreyAKKyAgICBuZXh0ID0gMDsKIH0KIAotLy8g
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEJvb2xlYW5Ob2RlIC0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQ
cm9wZXJ0eUxpc3ROb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLUpTVmFsdWUg
KkJvb2xlYW5Ob2RlOjpldmFsdWF0ZShFeGVjU3RhdGUgKikKLXsKLSAgcmV0dXJuIGpzQm9vbGVh
bih2YWx1ZSk7Cit2b2lkIFByb3BlcnR5TGlzdE5vZGU6OmJyZWFrQ3ljbGUoKSAKK3sgCisgICAg
bmV4dCA9IDA7CiB9CiAKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBOdW1iZXJO
b2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAtLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0gQXJndW1lbnRMaXN0Tm9kZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLQogCi1KU1ZhbHVlICpOdW1iZXJOb2RlOjpldmFsdWF0ZShFeGVjU3RhdGUgKikKLXsK
LSAgcmV0dXJuIGpzTnVtYmVyKHZhbHVlKTsKK3ZvaWQgQXJndW1lbnRMaXN0Tm9kZTo6YnJlYWtD
eWNsZSgpIAoreyAKKyAgICBuZXh0ID0gMDsKIH0KIAotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tIFN0cmluZ05vZGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K
Ky8vIEVDTUEgMTEuMTMKIAotSlNWYWx1ZSAqU3RyaW5nTm9kZTo6ZXZhbHVhdGUoRXhlY1N0YXRl
ICopCitzdGF0aWMgQUxXQVlTX0lOTElORSBKU1ZhbHVlICp2YWx1ZUZvclJlYWRNb2RpZnlBc3Np
Z25tZW50KEV4ZWNTdGF0ZSAqIGV4ZWMsIEpTVmFsdWUgKnYxLCBKU1ZhbHVlICp2MiwgT3BlcmF0
b3Igb3BlcikKIHsKLSAgcmV0dXJuIGpzU3RyaW5nKHZhbHVlKTsKKyAgSlNWYWx1ZSAqdjsKKyAg
aW50IGkxOworICBpbnQgaTI7CisgIHVuc2lnbmVkIGludCB1aTsKKyAgc3dpdGNoIChvcGVyKSB7
CisgIGNhc2UgT3BNdWx0RXE6CisgICAgdiA9IG11bHQoZXhlYywgdjEsIHYyLCAnKicpOworICAg
IGJyZWFrOworICBjYXNlIE9wRGl2RXE6CisgICAgdiA9IG11bHQoZXhlYywgdjEsIHYyLCAnLycp
OworICAgIGJyZWFrOworICBjYXNlIE9wUGx1c0VxOgorICAgIHYgPSBhZGQoZXhlYywgdjEsIHYy
LCAnKycpOworICAgIGJyZWFrOworICBjYXNlIE9wTWludXNFcToKKyAgICB2ID0gYWRkKGV4ZWMs
IHYxLCB2MiwgJy0nKTsKKyAgICBicmVhazsKKyAgY2FzZSBPcExTaGlmdDoKKyAgICBpMSA9IHYx
LT50b0ludDMyKGV4ZWMpOworICAgIGkyID0gdjItPnRvSW50MzIoZXhlYyk7CisgICAgdiA9IGpz
TnVtYmVyKGkxIDw8IGkyKTsKKyAgICBicmVhazsKKyAgY2FzZSBPcFJTaGlmdDoKKyAgICBpMSA9
IHYxLT50b0ludDMyKGV4ZWMpOworICAgIGkyID0gdjItPnRvSW50MzIoZXhlYyk7CisgICAgdiA9
IGpzTnVtYmVyKGkxID4+IGkyKTsKKyAgICBicmVhazsKKyAgY2FzZSBPcFVSU2hpZnQ6CisgICAg
dWkgPSB2MS0+dG9VSW50MzIoZXhlYyk7CisgICAgaTIgPSB2Mi0+dG9JbnQzMihleGVjKTsKKyAg
ICB2ID0ganNOdW1iZXIodWkgPj4gaTIpOworICAgIGJyZWFrOworICBjYXNlIE9wQW5kRXE6Cisg
ICAgaTEgPSB2MS0+dG9JbnQzMihleGVjKTsKKyAgICBpMiA9IHYyLT50b0ludDMyKGV4ZWMpOwor
ICAgIHYgPSBqc051bWJlcihpMSAmIGkyKTsKKyAgICBicmVhazsKKyAgY2FzZSBPcFhPckVxOgor
ICAgIGkxID0gdjEtPnRvSW50MzIoZXhlYyk7CisgICAgaTIgPSB2Mi0+dG9JbnQzMihleGVjKTsK
KyAgICB2ID0ganNOdW1iZXIoaTEgXiBpMik7CisgICAgYnJlYWs7CisgIGNhc2UgT3BPckVxOgor
ICAgIGkxID0gdjEtPnRvSW50MzIoZXhlYyk7CisgICAgaTIgPSB2Mi0+dG9JbnQzMihleGVjKTsK
KyAgICB2ID0ganNOdW1iZXIoaTEgfCBpMik7CisgICAgYnJlYWs7CisgIGNhc2UgT3BNb2RFcTog
eworICAgIGRvdWJsZSBkMSA9IHYxLT50b051bWJlcihleGVjKTsKKyAgICBkb3VibGUgZDIgPSB2
Mi0+dG9OdW1iZXIoZXhlYyk7CisgICAgdiA9IGpzTnVtYmVyKGZtb2QoZDEsIGQyKSk7CisgIH0K
KyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBhc3NlcnQoMCk7CisgICAgdiA9IGpzVW5kZWZp
bmVkKCk7CisgIH0KKyAgCisgIHJldHVybiB2OwogfQogCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0gUmVnRXhwTm9kZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFN0YXRMaXN0Tm9kZSAtLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotSlNWYWx1ZSAqUmVnRXhwTm9kZTo6ZXZhbHVh
dGUoRXhlY1N0YXRlICpleGVjKQorU3RhdExpc3ROb2RlOjpTdGF0TGlzdE5vZGUoU3RhdGVtZW50
Tm9kZSAqcykKKyAgOiBTdGF0ZW1lbnROb2RlKFN0YXRMaXN0Tm9kZUV4ZWN1dGVTdGF0ZSksIHN0
YXRlbWVudChzKSwgbmV4dCh0aGlzKQogewotICBMaXN0IGxpc3Q7Ci0gIGxpc3QuYXBwZW5kKGpz
U3RyaW5nKHBhdHRlcm4pKTsKLSAgbGlzdC5hcHBlbmQoanNTdHJpbmcoZmxhZ3MpKTsKLQotICBK
U09iamVjdCAqcmVnID0gZXhlYy0+bGV4aWNhbEludGVycHJldGVyKCktPmltcCgpLT5idWlsdGlu
UmVnRXhwKCk7Ci0gIHJldHVybiByZWctPmNvbnN0cnVjdChleGVjLGxpc3QpOworICAgIFBhcnNl
cjo6bm90ZU5vZGVDeWNsZSh0aGlzKTsKKyAgICBzZXRMb2Mocy0+Zmlyc3RMaW5lKCksIHMtPmxh
c3RMaW5lKCkpOwogfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVGhpc05v
ZGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBFQ01BIDExLjEu
MQotSlNWYWx1ZSAqVGhpc05vZGU6OmV2YWx1YXRlKEV4ZWNTdGF0ZSAqZXhlYykKKyAKK1N0YXRM
aXN0Tm9kZTo6U3RhdExpc3ROb2RlKFN0YXRMaXN0Tm9kZSAqbCwgU3RhdGVtZW50Tm9kZSAqcykK
KyAgOiBTdGF0ZW1lbnROb2RlKFN0YXRMaXN0Tm9kZUV4ZWN1dGVTdGF0ZSksIHN0YXRlbWVudChz
KSwgbmV4dChsLT5uZXh0KQogewotICByZXR1cm4gZXhlYy0+Y29udGV4dCgpLmltcCgpLT50aGlz
VmFsdWUoKTsKKyAgICBsLT5uZXh0ID0gdGhpczsKKyAgICBzZXRMb2MobC0+Zmlyc3RMaW5lKCks
IHMtPmxhc3RMaW5lKCkpOwogfQogCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0g
UmVzb2x2ZU5vZGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBFQ01B
IDExLjEuMiAmIDEwLjEuNAotSlNWYWx1ZSAqUmVzb2x2ZU5vZGU6OmV2YWx1YXRlKEV4ZWNTdGF0
ZSAqZXhlYykKK3ZvaWQgU3RhdExpc3ROb2RlOjpwcm9jZXNzVmFyRGVjbHMoRXhlY1N0YXRlICpl
eGVjKQogewotICBjb25zdCBTY29wZUNoYWluJiBjaGFpbiA9IGV4ZWMtPmNvbnRleHQoKS5pbXAo
KS0+c2NvcGVDaGFpbigpOwotICBTY29wZUNoYWluSXRlcmF0b3IgaXRlciA9IGNoYWluLmJlZ2lu
KCk7Ci0gIFNjb3BlQ2hhaW5JdGVyYXRvciBlbmQgPSBjaGFpbi5lbmQoKTsKLSAgCi0gIC8vIHdl
IG11c3QgYWx3YXlzIGhhdmUgc29tZXRoaW5nIGluIHRoZSBzY29wZSBjaGFpbgotICBhc3NlcnQo
aXRlciAhPSBlbmQpOwotCi0gIFByb3BlcnR5U2xvdCBzbG90OwotICBkbyB7IAotICAgIEpTT2Jq
ZWN0ICpvID0gKml0ZXI7Ci0KLSAgICBpZiAoby0+Z2V0UHJvcGVydHlTbG90KGV4ZWMsIGlkZW50
LCBzbG90KSkKLSAgICAgIHJldHVybiBzbG90LmdldFZhbHVlKGV4ZWMsIG8sIGlkZW50KTsKLSAg
ICAKLSAgICArK2l0ZXI7Ci0gIH0gd2hpbGUgKGl0ZXIgIT0gZW5kKTsKKyAgZm9yIChTdGF0TGlz
dE5vZGUgKm4gPSB0aGlzOyBuOyBuID0gbi0+bmV4dC5nZXQoKSkKKyAgICBuLT5zdGF0ZW1lbnQt
PnByb2Nlc3NWYXJEZWNscyhleGVjKTsKK30KIAotICByZXR1cm4gdGhyb3dVbmRlZmluZWRWYXJp
YWJsZUVycm9yKGV4ZWMsIGlkZW50KTsKK3ZvaWQgU3RhdExpc3ROb2RlOjpicmVha0N5Y2xlKCkg
Cit7IAorICAgIG5leHQgPSAwOwogfQogCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0gR3JvdXBOb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFZhckRlY2xOb2RlIC0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0KIAotLy8gRUNNQSAxMS4xLjYKLUpTVmFsdWUgKkdyb3VwTm9kZTo6
ZXZhbHVhdGUoRXhlY1N0YXRlICpleGVjKQordm9pZCBWYXJEZWNsTm9kZTo6cHJvY2Vzc1ZhckRl
Y2xzKEV4ZWNTdGF0ZSAqZXhlYykKIHsKLSAgcmV0dXJuIGdyb3VwLT5ldmFsdWF0ZShleGVjKTsK
LX0KKyAgSlNPYmplY3QgKnZhcmlhYmxlID0gZXhlYy0+Y29udGV4dCgpLmltcCgpLT52YXJpYWJs
ZU9iamVjdCgpOwogCi1Ob2RlICpHcm91cE5vZGU6Om5vZGVJbnNpZGVBbGxQYXJlbnMoKQotewot
ICAgIE5vZGUgKm4gPSB0aGlzOwotICAgIGRvCi0gICAgICAgIG4gPSBzdGF0aWNfY2FzdDxHcm91
cE5vZGUgKj4obiktPmdyb3VwLmdldCgpOwotICAgIHdoaWxlIChuLT5pc0dyb3VwTm9kZSgpKTsK
LSAgICByZXR1cm4gbjsKKyAgLy8gSWYgYSB2YXJpYWJsZSBieSB0aGlzIG5hbWUgYWxyZWFkeSBl
eGlzdHMsIGRvbid0IGNsb2JiZXIgaXQgLQorICAvLyBpdCBtaWdodCBiZSBhIGZ1bmN0aW9uIHBh
cmFtZXRlcgorICBpZiAoIXZhcmlhYmxlLT5oYXNQcm9wZXJ0eShleGVjLCBpZGVudCkpIHsKKyAg
ICBpbnQgZmxhZ3MgPSBJbnRlcm5hbDsKKyAgICBpZiAoZXhlYy0+Y29udGV4dCgpLmltcCgpLT5j
b2RlVHlwZSgpICE9IEV2YWxDb2RlKQorICAgICAgZmxhZ3MgfD0gRG9udERlbGV0ZTsKKyAgICBp
ZiAodmFyVHlwZSA9PSBWYXJEZWNsTm9kZTo6Q29uc3RhbnQpCisgICAgICBmbGFncyB8PSBSZWFk
T25seTsKKyAgICB2YXJpYWJsZS0+cHV0KGV4ZWMsIGlkZW50LCBqc1VuZGVmaW5lZCgpLCBmbGFn
cyk7CisgIH0KIH0KIAotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEVsZW1lbnRO
b2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIC0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLSBWYXJEZWNsTGlzdE5vZGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tCiAKLS8vIEVDTUEgMTEuMS40Ci1KU1ZhbHVlICpFbGVtZW50Tm9kZTo6ZXZhbHVhdGUo
RXhlY1N0YXRlICpleGVjKQordm9pZCBWYXJEZWNsTGlzdE5vZGU6OnByb2Nlc3NWYXJEZWNscyhF
eGVjU3RhdGUgKmV4ZWMpCiB7Ci0gIEpTT2JqZWN0ICphcnJheSA9IGV4ZWMtPmxleGljYWxJbnRl
cnByZXRlcigpLT5idWlsdGluQXJyYXkoKS0+Y29uc3RydWN0KGV4ZWMsIExpc3Q6OmVtcHR5KCkp
OwotICBpbnQgbGVuZ3RoID0gMDsKLSAgZm9yIChFbGVtZW50Tm9kZSAqbiA9IHRoaXM7IG47IG4g
PSBuLT5uZXh0LmdldCgpKSB7Ci0gICAgSlNWYWx1ZSAqdmFsID0gbi0+bm9kZS0+ZXZhbHVhdGUo
ZXhlYyk7Ci0gICAgS0pTX0NIRUNLRVhDRVBUSU9OVkFMVUUKLSAgICBsZW5ndGggKz0gbi0+ZWxp
c2lvbjsKLSAgICBhcnJheS0+cHV0KGV4ZWMsIGxlbmd0aCsrLCB2YWwpOwotICB9Ci0gIHJldHVy
biBhcnJheTsKKyAgZm9yIChWYXJEZWNsTGlzdE5vZGUgKm4gPSB0aGlzOyBuOyBuID0gbi0+bmV4
dC5nZXQoKSkKKyAgICBuLT52YXItPnByb2Nlc3NWYXJEZWNscyhleGVjKTsKIH0KIAotdm9pZCBF
bGVtZW50Tm9kZTo6YnJlYWtDeWNsZSgpIAordm9pZCBWYXJEZWNsTGlzdE5vZGU6OmJyZWFrQ3lj
bGUoKSAKIHsgCiAgICAgbmV4dCA9IDA7CiB9CiAKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLSBBcnJheU5vZGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisv
LyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVmFyU3RhdGVtZW50Tm9kZSAtLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0vLyBFQ01BIDExLjEuNAotSlNWYWx1ZSAqQXJyYXlO
b2RlOjpldmFsdWF0ZShFeGVjU3RhdGUgKmV4ZWMpCit2b2lkIFZhclN0YXRlbWVudE5vZGU6OnBy
b2Nlc3NWYXJEZWNscyhFeGVjU3RhdGUgKmV4ZWMpCiB7Ci0gIEpTT2JqZWN0ICphcnJheTsKLSAg
aW50IGxlbmd0aDsKKyAgbmV4dC0+cHJvY2Vzc1ZhckRlY2xzKGV4ZWMpOworfQorCisvLyAtLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQmxvY2tOb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLQogCi0gIGlmIChlbGVtZW50KSB7Ci0gICAgYXJyYXkgPSBzdGF0aWNf
Y2FzdDxKU09iamVjdCo+KGVsZW1lbnQtPmV2YWx1YXRlKGV4ZWMpKTsKLSAgICBLSlNfQ0hFQ0tF
WENFUFRJT05WQUxVRQotICAgIGxlbmd0aCA9IG9wdCA/IGFycmF5LT5nZXQoZXhlYyxsZW5ndGhQ
cm9wZXJ0eU5hbWUpLT50b0ludDMyKGV4ZWMpIDogMDsKK0Jsb2NrTm9kZTo6QmxvY2tOb2RlKFNv
dXJjZUVsZW1lbnRzTm9kZSAqcykgOiBTdGF0ZW1lbnROb2RlKEJsb2NrTm9kZUV4ZWN1dGVTdGF0
ZSkKK3sKKyAgaWYgKHMpIHsKKyAgICBzb3VyY2UgPSBzLT5uZXh0LnJlbGVhc2UoKTsKKyAgICBQ
YXJzZXI6OnJlbW92ZU5vZGVDeWNsZShzb3VyY2UuZ2V0KCkpOworICAgIHNldExvYyhzLT5maXJz
dExpbmUoKSwgcy0+bGFzdExpbmUoKSk7CiAgIH0gZWxzZSB7Ci0gICAgSlNWYWx1ZSAqbmV3QXJy
ID0gZXhlYy0+bGV4aWNhbEludGVycHJldGVyKCktPmJ1aWx0aW5BcnJheSgpLT5jb25zdHJ1Y3Qo
ZXhlYyxMaXN0OjplbXB0eSgpKTsKLSAgICBhcnJheSA9IHN0YXRpY19jYXN0PEpTT2JqZWN0Kj4o
bmV3QXJyKTsKLSAgICBsZW5ndGggPSAwOworICAgIHNvdXJjZSA9IDA7CiAgIH0KK30KIAotICBp
ZiAob3B0KQotICAgIGFycmF5LT5wdXQoZXhlYyxsZW5ndGhQcm9wZXJ0eU5hbWUsIGpzTnVtYmVy
KGVsaXNpb24gKyBsZW5ndGgpLCBEb250RW51bSB8IERvbnREZWxldGUpOwotCi0gIHJldHVybiBh
cnJheTsKK3ZvaWQgQmxvY2tOb2RlOjpwcm9jZXNzVmFyRGVjbHMoRXhlY1N0YXRlICpleGVjKQor
eworICBpZiAoc291cmNlKQorICAgIHNvdXJjZS0+cHJvY2Vzc1ZhckRlY2xzKGV4ZWMpOwogfQog
Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gT2JqZWN0TGl0ZXJhbE5vZGUgLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tIElmTm9kZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotLy8g
RUNNQSAxMS4xLjUKLUpTVmFsdWUgKk9iamVjdExpdGVyYWxOb2RlOjpldmFsdWF0ZShFeGVjU3Rh
dGUgKmV4ZWMpCit2b2lkIElmTm9kZTo6cHJvY2Vzc1ZhckRlY2xzKEV4ZWNTdGF0ZSAqZXhlYykK
IHsKLSAgaWYgKGxpc3QpCi0gICAgcmV0dXJuIGxpc3QtPmV2YWx1YXRlKGV4ZWMpOworICBzdGF0
ZW1lbnQxLT5wcm9jZXNzVmFyRGVjbHMoZXhlYyk7CiAKLSAgcmV0dXJuIGV4ZWMtPmxleGljYWxJ
bnRlcnByZXRlcigpLT5idWlsdGluT2JqZWN0KCktPmNvbnN0cnVjdChleGVjLExpc3Q6OmVtcHR5
KCkpOworICBpZiAoc3RhdGVtZW50MikKKyAgICBzdGF0ZW1lbnQyLT5wcm9jZXNzVmFyRGVjbHMo
ZXhlYyk7CiB9CiAKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0eUxp
c3ROb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAtLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0gRG9XaGlsZU5vZGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLQogCi0vLyBFQ01BIDExLjEuNQotSlNWYWx1ZSAqUHJvcGVydHlMaXN0Tm9kZTo6ZXZhbHVh
dGUoRXhlY1N0YXRlICpleGVjKQordm9pZCBEb1doaWxlTm9kZTo6cHJvY2Vzc1ZhckRlY2xzKEV4
ZWNTdGF0ZSAqZXhlYykKIHsKLSAgSlNPYmplY3QgKm9iaiA9IGV4ZWMtPmxleGljYWxJbnRlcnBy
ZXRlcigpLT5idWlsdGluT2JqZWN0KCktPmNvbnN0cnVjdChleGVjLCBMaXN0OjplbXB0eSgpKTsK
LSAgCi0gIGZvciAoUHJvcGVydHlMaXN0Tm9kZSAqcCA9IHRoaXM7IHA7IHAgPSBwLT5uZXh0Lmdl
dCgpKSB7Ci0gICAgSlNWYWx1ZSAqbiA9IHAtPm5vZGUtPm5hbWUtPmV2YWx1YXRlKGV4ZWMpOwot
ICAgIEtKU19DSEVDS0VYQ0VQVElPTlZBTFVFCi0gICAgSlNWYWx1ZSAqdiA9IHAtPm5vZGUtPmFz
c2lnbi0+ZXZhbHVhdGUoZXhlYyk7Ci0gICAgS0pTX0NIRUNLRVhDRVBUSU9OVkFMVUUKLSAgICAK
LSAgICBJZGVudGlmaWVyIHByb3BlcnR5TmFtZSA9IElkZW50aWZpZXIobi0+dG9TdHJpbmcoZXhl
YykpOwotICAgIHN3aXRjaCAocC0+bm9kZS0+dHlwZSkgewotICAgICAgY2FzZSBQcm9wZXJ0eU5v
ZGU6OkdldHRlcjoKLSAgICAgICAgYXNzZXJ0KHYtPmlzT2JqZWN0KCkpOwotICAgICAgICBvYmot
PmRlZmluZUdldHRlcihleGVjLCBwcm9wZXJ0eU5hbWUsIHN0YXRpY19jYXN0PEpTT2JqZWN0ICo+
KHYpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFByb3BlcnR5Tm9kZTo6U2V0dGVyOgot
ICAgICAgICBhc3NlcnQodi0+aXNPYmplY3QoKSk7Ci0gICAgICAgIG9iai0+ZGVmaW5lU2V0dGVy
KGV4ZWMsIHByb3BlcnR5TmFtZSwgc3RhdGljX2Nhc3Q8SlNPYmplY3QgKj4odikpOwotICAgICAg
ICBicmVhazsKLSAgICAgIGNhc2UgUHJvcGVydHlOb2RlOjpDb25zdGFudDoKLSAgICAgICAgb2Jq
LT5wdXQoZXhlYywgcHJvcGVydHlOYW1lLCB2KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9
Ci0KLSAgcmV0dXJuIG9iajsKKyAgc3RhdGVtZW50LT5wcm9jZXNzVmFyRGVjbHMoZXhlYyk7CiB9
CiAKLXZvaWQgUHJvcGVydHlMaXN0Tm9kZTo6YnJlYWtDeWNsZSgpIAoteyAKLSAgICBuZXh0ID0g
MDsKLX0KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBXaGlsZU5vZGUgLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLSBQcm9wZXJ0eU5vZGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8v
IEVDTUEgMTEuMS41Ci1KU1ZhbHVlICpQcm9wZXJ0eU5vZGU6OmV2YWx1YXRlKEV4ZWNTdGF0ZSop
Cit2b2lkIFdoaWxlTm9kZTo6cHJvY2Vzc1ZhckRlY2xzKEV4ZWNTdGF0ZSAqZXhlYykKIHsKLSAg
YXNzZXJ0KGZhbHNlKTsKLSAgcmV0dXJuIGpzTnVsbCgpOworICBzdGF0ZW1lbnQtPnByb2Nlc3NW
YXJEZWNscyhleGVjKTsKIH0KIAotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9w
ZXJ0eU5hbWVOb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIC0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGb3JOb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tCiAKLS8vIEVDTUEgMTEuMS41Ci1KU1ZhbHVlICpQcm9wZXJ0eU5hbWVOb2Rl
OjpldmFsdWF0ZShFeGVjU3RhdGUqKQordm9pZCBGb3JOb2RlOjpwcm9jZXNzVmFyRGVjbHMoRXhl
Y1N0YXRlICpleGVjKQogewotICBKU1ZhbHVlICpzOwotCi0gIGlmIChzdHIuaXNOdWxsKCkpIHsK
LSAgICBzID0ganNTdHJpbmcoVVN0cmluZzo6ZnJvbShudW1lcmljKSk7Ci0gIH0gZWxzZSB7Ci0g
ICAgcyA9IGpzU3RyaW5nKHN0ci51c3RyaW5nKCkpOwotICB9CisgIGlmIChleHByMSkKKyAgICBl
eHByMS0+cHJvY2Vzc1ZhckRlY2xzKGV4ZWMpOwogCi0gIHJldHVybiBzOworICBzdGF0ZW1lbnQt
PnByb2Nlc3NWYXJEZWNscyhleGVjKTsKIH0KIAotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tIEJyYWNrZXRBY2Nlc3Nvck5vZGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGb3JJbk5vZGUgLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLS8vIEVDTUEgMTEuMi4xYQotSlNWYWx1ZSAq
QnJhY2tldEFjY2Vzc29yTm9kZTo6ZXZhbHVhdGUoRXhlY1N0YXRlICpleGVjKQorRm9ySW5Ob2Rl
OjpGb3JJbk5vZGUoTm9kZSAqbCwgTm9kZSAqZSwgU3RhdGVtZW50Tm9kZSAqcykKKyAgOiBTdGF0
ZW1lbnROb2RlKEZvckluTm9kZUV4ZWN1dGVTdGF0ZSksIGluaXQoMEwpLCBsZXhwcihsKSwgZXhw
cihlKSwgdmFyRGVjbCgwTCksIHN0YXRlbWVudChzKQogewotICBKU1ZhbHVlICp2MSA9IGV4cHIx
LT5ldmFsdWF0ZShleGVjKTsKLSAgS0pTX0NIRUNLRVhDRVBUSU9OVkFMVUUKLSAgSlNWYWx1ZSAq
djIgPSBleHByMi0+ZXZhbHVhdGUoZXhlYyk7Ci0gIEtKU19DSEVDS0VYQ0VQVElPTlZBTFVFCi0g
IEpTT2JqZWN0ICpvID0gdjEtPnRvT2JqZWN0KGV4ZWMpOwotICB1aW50MzJfdCBpOwotICBpZiAo
djItPmdldFVJbnQzMihpKSkKLSAgICByZXR1cm4gby0+Z2V0KGV4ZWMsIGkpOwotICByZXR1cm4g
by0+Z2V0KGV4ZWMsIElkZW50aWZpZXIodjItPnRvU3RyaW5nKGV4ZWMpKSk7CiB9CiAKLS8vIC0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBEb3RBY2Nlc3Nvck5vZGUgLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gRUNNQSAxMS4yLjFiCi1KU1ZhbHVlICpEb3RBY2Nl
c3Nvck5vZGU6OmV2YWx1YXRlKEV4ZWNTdGF0ZSAqZXhlYykKK0ZvckluTm9kZTo6Rm9ySW5Ob2Rl
KGNvbnN0IElkZW50aWZpZXIgJmksIEFzc2lnbkV4cHJOb2RlICppbiwgTm9kZSAqZSwgU3RhdGVt
ZW50Tm9kZSAqcykKKyAgOiBTdGF0ZW1lbnROb2RlKEZvckluTm9kZUV4ZWN1dGVTdGF0ZSksIGlk
ZW50KGkpLCBpbml0KGluKSwgZXhwcihlKSwgc3RhdGVtZW50KHMpCiB7Ci0gIEpTVmFsdWUgKnYg
PSBleHByLT5ldmFsdWF0ZShleGVjKTsKLSAgS0pTX0NIRUNLRVhDRVBUSU9OVkFMVUUKLSAgcmV0
dXJuIHYtPnRvT2JqZWN0KGV4ZWMpLT5nZXQoZXhlYywgaWRlbnQpOworICB2YXJEZWNsID0gbmV3
IFZhckRlY2xOb2RlKGlkZW50LCBpbml0LmdldCgpLCBWYXJEZWNsTm9kZTo6VmFyaWFibGUpOwor
ICBsZXhwciA9IG5ldyBSZXNvbHZlTm9kZShpZGVudCk7Cit9CiAKK3ZvaWQgRm9ySW5Ob2RlOjpw
cm9jZXNzVmFyRGVjbHMoRXhlY1N0YXRlICpleGVjKQoreworICBpZiAodmFyRGVjbCkKKyAgICB2
YXJEZWNsLT5wcm9jZXNzVmFyRGVjbHMoZXhlYyk7CisgIHN0YXRlbWVudC0+cHJvY2Vzc1ZhckRl
Y2xzKGV4ZWMpOwogfQogCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQXJndW1l
bnRMaXN0Tm9kZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tIFdpdGhOb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0KIAotSlNWYWx1ZSAqQXJndW1lbnRMaXN0Tm9kZTo6ZXZhbHVhdGUoRXhlY1N0YXRlICopCit2
b2lkIFdpdGhOb2RlOjpwcm9jZXNzVmFyRGVjbHMoRXhlY1N0YXRlICpleGVjKQogewotICBhc3Nl
cnQoMCk7Ci0gIHJldHVybiAwOyAvLyBkdW1teSwgc2VlIGV2YWx1YXRlTGlzdCgpCisgICAgc3Rh
dGVtZW50LT5wcm9jZXNzVmFyRGVjbHMoZXhlYyk7CiB9CiAKLS8vIEVDTUEgMTEuMi40Ci1MaXN0
IEFyZ3VtZW50TGlzdE5vZGU6OmV2YWx1YXRlTGlzdChFeGVjU3RhdGUgKmV4ZWMpCisvLyAtLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ2FzZUNsYXVzZU5vZGUgLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLQorCisvLyBFQ01BIDEyLjExCit2b2lkIENhc2VDbGF1c2VOb2RlOjpw
cm9jZXNzVmFyRGVjbHMoRXhlY1N0YXRlICpleGVjKQogewotICBMaXN0IGw7CisgIGlmIChuZXh0
KQorICAgIG5leHQtPnByb2Nlc3NWYXJEZWNscyhleGVjKTsKK30KIAotICBmb3IgKEFyZ3VtZW50
TGlzdE5vZGUgKm4gPSB0aGlzOyBuOyBuID0gbi0+bmV4dC5nZXQoKSkgewotICAgIEpTVmFsdWUg
KnYgPSBuLT5leHByLT5ldmFsdWF0ZShleGVjKTsKLSAgICBLSlNfQ0hFQ0tFWENFUFRJT05MSVNU
Ci0gICAgbC5hcHBlbmQodik7Ci0gIH0KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LSBDbGF1c2VMaXN0Tm9kZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLSAgcmV0
dXJuIGw7CisvLyBFQ01BIDEyLjExCit2b2lkIENsYXVzZUxpc3ROb2RlOjpwcm9jZXNzVmFyRGVj
bHMoRXhlY1N0YXRlICpleGVjKQoreworICBmb3IgKENsYXVzZUxpc3ROb2RlICpuID0gdGhpczsg
bjsgbiA9IG4tPm5leHQuZ2V0KCkpCisgICAgaWYgKG4tPmNsYXVzZSkKKyAgICAgIG4tPmNsYXVz
ZS0+cHJvY2Vzc1ZhckRlY2xzKGV4ZWMpOwogfQogCi12b2lkIEFyZ3VtZW50TGlzdE5vZGU6OmJy
ZWFrQ3ljbGUoKSAKK3ZvaWQgQ2xhdXNlTGlzdE5vZGU6OmJyZWFrQ3ljbGUoKSAKIHsgCiAgICAg
bmV4dCA9IDA7CiB9CiAKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBBcmd1bWVu
dHNOb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAtLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0gQ2FzZUJsb2NrTm9kZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLQogCi1KU1ZhbHVlICpBcmd1bWVudHNOb2RlOjpldmFsdWF0ZShFeGVjU3RhdGUgKikK
K0Nhc2VCbG9ja05vZGU6OkNhc2VCbG9ja05vZGUoQ2xhdXNlTGlzdE5vZGUgKmwxLCBDYXNlQ2xh
dXNlTm9kZSAqZCwgQ2xhdXNlTGlzdE5vZGUgKmwyKQorICAgIDogTm9kZShDYXNlQmxvY2tOb2Rl
RXhlY3V0ZUJsb2NrV2l0aElucHV0VmFsdWUpCiB7Ci0gIGFzc2VydCgwKTsKLSAgcmV0dXJuIDA7
IC8vIGR1bW15LCBzZWUgZXZhbHVhdGVMaXN0KCkKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tIE5ld0V4cHJOb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0KKyAgaWYgKGwxKSB7CisgICAgbGlzdDEgPSBsMS0+bmV4dC5yZWxlYXNlKCk7CisgICAgUGFy
c2VyOjpyZW1vdmVOb2RlQ3ljbGUobGlzdDEuZ2V0KCkpOworICB9IGVsc2UKKyAgICBsaXN0MSA9
IDA7CiAKLS8vIEVDTUEgMTEuMi4yCisgIGRlZiA9IGQ7CiAKLUpTVmFsdWUgKk5ld0V4cHJOb2Rl
OjpldmFsdWF0ZShFeGVjU3RhdGUgKmV4ZWMpCi17Ci0gIEpTVmFsdWUgKnYgPSBleHByLT5ldmFs
dWF0ZShleGVjKTsKLSAgS0pTX0NIRUNLRVhDRVBUSU9OVkFMVUUKLQotICBMaXN0IGFyZ0xpc3Q7
Ci0gIGlmIChhcmdzKSB7Ci0gICAgYXJnTGlzdCA9IGFyZ3MtPmV2YWx1YXRlTGlzdChleGVjKTsK
LSAgICBLSlNfQ0hFQ0tFWENFUFRJT05WQUxVRQotICB9Ci0KLSAgaWYgKCF2LT5pc09iamVjdCgp
KSB7Ci0gICAgcmV0dXJuIHRocm93RXJyb3IoZXhlYywgVHlwZUVycm9yLCAiVmFsdWUgJXMgKHJl
c3VsdCBvZiBleHByZXNzaW9uICVzKSBpcyBub3QgYW4gb2JqZWN0LiBDYW5ub3QgYmUgdXNlZCB3
aXRoIG5ldy4iLCB2LCBleHByLmdldCgpKTsKLSAgfQotCi0gIEpTT2JqZWN0ICpjb25zdHIgPSBz
dGF0aWNfY2FzdDxKU09iamVjdCo+KHYpOwotICBpZiAoIWNvbnN0ci0+aW1wbGVtZW50c0NvbnN0
cnVjdCgpKSB7Ci0gICAgcmV0dXJuIHRocm93RXJyb3IoZXhlYywgVHlwZUVycm9yLCAiVmFsdWUg
JXMgKHJlc3VsdCBvZiBleHByZXNzaW9uICVzKSBpcyBub3QgYSBjb25zdHJ1Y3Rvci4gQ2Fubm90
IGJlIHVzZWQgd2l0aCBuZXcuIiwgdiwgZXhwci5nZXQoKSk7Ci0gIH0KLQotICByZXR1cm4gY29u
c3RyLT5jb25zdHJ1Y3QoZXhlYywgYXJnTGlzdCk7Ci19Ci0KLS8vIEVDTUEgMTEuMi4zCi1KU1Zh
bHVlICpGdW5jdGlvbkNhbGxWYWx1ZU5vZGU6OmV2YWx1YXRlKEV4ZWNTdGF0ZSAqZXhlYykKLXsK
LSAgSlNWYWx1ZSAqdiA9IGV4cHItPmV2YWx1YXRlKGV4ZWMpOwotICBLSlNfQ0hFQ0tFWENFUFRJ
T05WQUxVRQotCi0gIGlmICghdi0+aXNPYmplY3QoKSkgewotICAgIHJldHVybiB0aHJvd0Vycm9y
KGV4ZWMsIFR5cGVFcnJvciwgIlZhbHVlICVzIChyZXN1bHQgb2YgZXhwcmVzc2lvbiAlcykgaXMg
bm90IG9iamVjdC4iLCB2LCBleHByLmdldCgpKTsKLSAgfQotICAKLSAgSlNPYmplY3QgKmZ1bmMg
PSBzdGF0aWNfY2FzdDxKU09iamVjdCo+KHYpOwotCi0gIGlmICghZnVuYy0+aW1wbGVtZW50c0Nh
bGwoKSkgewotICAgIHJldHVybiB0aHJvd0Vycm9yKGV4ZWMsIFR5cGVFcnJvciwgIk9iamVjdCAl
cyAocmVzdWx0IG9mIGV4cHJlc3Npb24gJXMpIGRvZXMgbm90IGFsbG93IGNhbGxzLiIsIHYsIGV4
cHIuZ2V0KCkpOwotICB9Ci0KLSAgTGlzdCBhcmdMaXN0ID0gYXJncy0+ZXZhbHVhdGVMaXN0KGV4
ZWMpOwotICBLSlNfQ0hFQ0tFWENFUFRJT05WQUxVRQotCi0gIEpTT2JqZWN0ICp0aGlzT2JqID0g
IGV4ZWMtPmR5bmFtaWNJbnRlcnByZXRlcigpLT5nbG9iYWxPYmplY3QoKTsKLQotICByZXR1cm4g
ZnVuYy0+Y2FsbChleGVjLCB0aGlzT2JqLCBhcmdMaXN0KTsKLX0KLQotLy8gRUNNQSAxMS4yLjMK
LUpTVmFsdWUgKkZ1bmN0aW9uQ2FsbFJlc29sdmVOb2RlOjpldmFsdWF0ZShFeGVjU3RhdGUgKmV4
ZWMpCi17Ci0gIGNvbnN0IFNjb3BlQ2hhaW4mIGNoYWluID0gZXhlYy0+Y29udGV4dCgpLmltcCgp
LT5zY29wZUNoYWluKCk7Ci0gIFNjb3BlQ2hhaW5JdGVyYXRvciBpdGVyID0gY2hhaW4uYmVnaW4o
KTsKLSAgU2NvcGVDaGFpbkl0ZXJhdG9yIGVuZCA9IGNoYWluLmVuZCgpOwotICAKLSAgLy8gd2Ug
bXVzdCBhbHdheXMgaGF2ZSBzb21ldGhpbmcgaW4gdGhlIHNjb3BlIGNoYWluCi0gIGFzc2VydChp
dGVyICE9IGVuZCk7Ci0KLSAgUHJvcGVydHlTbG90IHNsb3Q7Ci0gIEpTT2JqZWN0ICpiYXNlOwot
ICBkbyB7IAotICAgIGJhc2UgPSAqaXRlcjsKLSAgICBpZiAoYmFzZS0+Z2V0UHJvcGVydHlTbG90
KGV4ZWMsIGlkZW50LCBzbG90KSkgewotICAgICAgSlNWYWx1ZSAqdiA9IHNsb3QuZ2V0VmFsdWUo
ZXhlYywgYmFzZSwgaWRlbnQpOwotICAgICAgS0pTX0NIRUNLRVhDRVBUSU9OVkFMVUUKLSAgICAg
ICAgCi0gICAgICBpZiAoIXYtPmlzT2JqZWN0KCkpIHsKLSAgICAgICAgcmV0dXJuIHRocm93RXJy
b3IoZXhlYywgVHlwZUVycm9yLCAiVmFsdWUgJXMgKHJlc3VsdCBvZiBleHByZXNzaW9uICVzKSBp
cyBub3Qgb2JqZWN0LiIsIHYsIGlkZW50KTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgSlNPYmpl
Y3QgKmZ1bmMgPSBzdGF0aWNfY2FzdDxKU09iamVjdCo+KHYpOwotICAgICAgCi0gICAgICBpZiAo
IWZ1bmMtPmltcGxlbWVudHNDYWxsKCkpIHsKLSAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoZXhl
YywgVHlwZUVycm9yLCAiT2JqZWN0ICVzIChyZXN1bHQgb2YgZXhwcmVzc2lvbiAlcykgZG9lcyBu
b3QgYWxsb3cgY2FsbHMuIiwgdiwgaWRlbnQpOwotICAgICAgfQotICAgICAgCi0gICAgICBMaXN0
IGFyZ0xpc3QgPSBhcmdzLT5ldmFsdWF0ZUxpc3QoZXhlYyk7Ci0gICAgICBLSlNfQ0hFQ0tFWENF
UFRJT05WQUxVRQotICAgICAgICAKLSAgICAgIEpTT2JqZWN0ICp0aGlzT2JqID0gYmFzZTsKLSAg
ICAgIC8vIEVDTUEgMTEuMi4zIHNheXMgdGhhdCBpbiB0aGlzIHNpdHVhdGlvbiB0aGUgdGhpcyB2
YWx1ZSBzaG91bGQgYmUgbnVsbC4KLSAgICAgIC8vIEhvd2V2ZXIsIHNlY3Rpb24gMTAuMi4zIHNh
eXMgdGhhdCBpbiB0aGUgY2FzZSB3aGVyZSB0aGUgdmFsdWUgcHJvdmlkZWQKLSAgICAgIC8vIGJ5
IHRoZSBjYWxsZXIgaXMgbnVsbCwgdGhlIGdsb2JhbCBvYmplY3Qgc2hvdWxkIGJlIHVzZWQuIEl0
IGFsc28gc2F5cwotICAgICAgLy8gdGhhdCB0aGUgc2VjdGlvbiBkb2VzIG5vdCBhcHBseSB0byBp
bnRlcmFsIGZ1bmN0aW9ucywgYnV0IGZvciBzaW1wbGljaXR5Ci0gICAgICAvLyBvZiBpbXBsZW1l
bnRhdGlvbiB3ZSB1c2UgdGhlIGdsb2JhbCBvYmplY3QgYW55d2F5IGhlcmUuIFRoaXMgZ3VhcmFu
dGVlcwotICAgICAgLy8gdGhhdCBpbiBob3N0IG9iamVjdHMgeW91IGFsd2F5cyBnZXQgYSB2YWxp
ZCBvYmplY3QgZm9yIHRoaXMuCi0gICAgICBpZiAodGhpc09iai0+aXNBY3RpdmF0aW9uKCkpCi0g
ICAgICAgIHRoaXNPYmogPSBleGVjLT5keW5hbWljSW50ZXJwcmV0ZXIoKS0+Z2xvYmFsT2JqZWN0
KCk7Ci0KLSAgICAgIHJldHVybiBmdW5jLT5jYWxsKGV4ZWMsIHRoaXNPYmosIGFyZ0xpc3QpOwot
ICAgIH0KLSAgICArK2l0ZXI7Ci0gIH0gd2hpbGUgKGl0ZXIgIT0gZW5kKTsKLSAgCi0gIHJldHVy
biB0aHJvd1VuZGVmaW5lZFZhcmlhYmxlRXJyb3IoZXhlYywgaWRlbnQpOwotfQotCi0vLyBFQ01B
IDExLjIuMwotSlNWYWx1ZSAqRnVuY3Rpb25DYWxsQnJhY2tldE5vZGU6OmV2YWx1YXRlKEV4ZWNT
dGF0ZSAqZXhlYykKLXsKLSAgSlNWYWx1ZSAqYmFzZVZhbCA9IGJhc2UtPmV2YWx1YXRlKGV4ZWMp
OwotICBLSlNfQ0hFQ0tFWENFUFRJT05WQUxVRQotCi0gIEpTVmFsdWUgKnN1YnNjcmlwdFZhbCA9
IHN1YnNjcmlwdC0+ZXZhbHVhdGUoZXhlYyk7Ci0KLSAgSlNPYmplY3QgKmJhc2VPYmogPSBiYXNl
VmFsLT50b09iamVjdChleGVjKTsKLSAgdWludDMyX3QgaTsKLSAgUHJvcGVydHlTbG90IHNsb3Q7
Ci0KLSAgSlNWYWx1ZSAqZnVuY1ZhbDsKLSAgaWYgKHN1YnNjcmlwdFZhbC0+Z2V0VUludDMyKGkp
KSB7Ci0gICAgaWYgKGJhc2VPYmotPmdldFByb3BlcnR5U2xvdChleGVjLCBpLCBzbG90KSkKLSAg
ICAgIGZ1bmNWYWwgPSBzbG90LmdldFZhbHVlKGV4ZWMsIGJhc2VPYmosIGkpOwotICAgIGVsc2UK
LSAgICAgIGZ1bmNWYWwgPSBqc1VuZGVmaW5lZCgpOwotICB9IGVsc2UgewotICAgIElkZW50aWZp
ZXIgaWRlbnQoc3Vic2NyaXB0VmFsLT50b1N0cmluZyhleGVjKSk7Ci0gICAgaWYgKGJhc2VPYmot
PmdldFByb3BlcnR5U2xvdChleGVjLCBpZGVudCwgc2xvdCkpCi0gICAgICBmdW5jVmFsID0gYmFz
ZU9iai0+Z2V0KGV4ZWMsIGlkZW50KTsKLSAgICBlbHNlCi0gICAgICBmdW5jVmFsID0ganNVbmRl
ZmluZWQoKTsKLSAgfQotCi0gIEtKU19DSEVDS0VYQ0VQVElPTlZBTFVFCi0gIAotICBpZiAoIWZ1
bmNWYWwtPmlzT2JqZWN0KCkpIHsKLSAgICByZXR1cm4gdGhyb3dFcnJvcihleGVjLCBUeXBlRXJy
b3IsICJWYWx1ZSAlcyAocmVzdWx0IG9mIGV4cHJlc3Npb24gJXNbJXNdKSBpcyBub3Qgb2JqZWN0
LiIsIGZ1bmNWYWwsIGJhc2UuZ2V0KCksIHN1YnNjcmlwdC5nZXQoKSk7Ci0gIH0KLSAgCi0gIEpT
T2JqZWN0ICpmdW5jID0gc3RhdGljX2Nhc3Q8SlNPYmplY3QqPihmdW5jVmFsKTsKLQotICBpZiAo
IWZ1bmMtPmltcGxlbWVudHNDYWxsKCkpIHsKLSAgICByZXR1cm4gdGhyb3dFcnJvcihleGVjLCBU
eXBlRXJyb3IsICJPYmplY3QgJXMgKHJlc3VsdCBvZiBleHByZXNzaW9uICVzWyVzXSkgZG9lcyBu
b3QgYWxsb3cgY2FsbHMuIiwgZnVuY1ZhbCwgYmFzZS5nZXQoKSwgc3Vic2NyaXB0LmdldCgpKTsK
LSAgfQotCi0gIExpc3QgYXJnTGlzdCA9IGFyZ3MtPmV2YWx1YXRlTGlzdChleGVjKTsKLSAgS0pT
X0NIRUNLRVhDRVBUSU9OVkFMVUUKLQotICBKU09iamVjdCAqdGhpc09iaiA9IGJhc2VPYmo7Ci0g
IGFzc2VydCh0aGlzT2JqKTsKLSAgYXNzZXJ0KHRoaXNPYmotPmlzT2JqZWN0KCkpOwotICBhc3Nl
cnQoIXRoaXNPYmotPmlzQWN0aXZhdGlvbigpKTsKLQotICByZXR1cm4gZnVuYy0+Y2FsbChleGVj
LCB0aGlzT2JqLCBhcmdMaXN0KTsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKmRvdEV4cHJOb3RB
bk9iamVjdFN0cmluZygpCi17Ci0gIHJldHVybiAiVmFsdWUgJXMgKHJlc3VsdCBvZiBleHByZXNz
aW9uICVzLiVzKSBpcyBub3Qgb2JqZWN0LiI7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpkb3RF
eHByRG9lc05vdEFsbG93Q2FsbHNTdHJpbmcoKSAKLXsKLSAgcmV0dXJuICJPYmplY3QgJXMgKHJl
c3VsdCBvZiBleHByZXNzaW9uICVzLiVzKSBkb2VzIG5vdCBhbGxvdyBjYWxscy4iOwotfQotCi0v
LyBFQ01BIDExLjIuMwotSlNWYWx1ZSAqRnVuY3Rpb25DYWxsRG90Tm9kZTo6ZXZhbHVhdGUoRXhl
Y1N0YXRlICpleGVjKQotewotICBKU1ZhbHVlICpiYXNlVmFsID0gYmFzZS0+ZXZhbHVhdGUoZXhl
Yyk7Ci0KLSAgSlNPYmplY3QgKmJhc2VPYmogPSBiYXNlVmFsLT50b09iamVjdChleGVjKTsKLSAg
UHJvcGVydHlTbG90IHNsb3Q7Ci0gIEpTVmFsdWUgKmZ1bmNWYWwgPSBiYXNlT2JqLT5nZXRQcm9w
ZXJ0eVNsb3QoZXhlYywgaWRlbnQsIHNsb3QpID8gc2xvdC5nZXRWYWx1ZShleGVjLCBiYXNlT2Jq
LCBpZGVudCkgOiBqc1VuZGVmaW5lZCgpOwotICBLSlNfQ0hFQ0tFWENFUFRJT05WQUxVRQotCi0g
IGlmICghZnVuY1ZhbC0+aXNPYmplY3QoKSkKLSAgICByZXR1cm4gdGhyb3dFcnJvcihleGVjLCBU
eXBlRXJyb3IsIGRvdEV4cHJOb3RBbk9iamVjdFN0cmluZygpLCBmdW5jVmFsLCBiYXNlLmdldCgp
LCBpZGVudCk7Ci0gIAotICBKU09iamVjdCAqZnVuYyA9IHN0YXRpY19jYXN0PEpTT2JqZWN0Kj4o
ZnVuY1ZhbCk7Ci0KLSAgaWYgKCFmdW5jLT5pbXBsZW1lbnRzQ2FsbCgpKQotICAgIHJldHVybiB0
aHJvd0Vycm9yKGV4ZWMsIFR5cGVFcnJvciwgZG90RXhwckRvZXNOb3RBbGxvd0NhbGxzU3RyaW5n
KCksIGZ1bmNWYWwsIGJhc2UuZ2V0KCksIGlkZW50KTsKLQotICBMaXN0IGFyZ0xpc3QgPSBhcmdz
LT5ldmFsdWF0ZUxpc3QoZXhlYyk7Ci0gIEtKU19DSEVDS0VYQ0VQVElPTlZBTFVFCi0KLSAgSlNP
YmplY3QgKnRoaXNPYmogPSBiYXNlT2JqOwotICBhc3NlcnQodGhpc09iaik7Ci0gIGFzc2VydCh0
aGlzT2JqLT5pc09iamVjdCgpKTsKLSAgYXNzZXJ0KCF0aGlzT2JqLT5pc0FjdGl2YXRpb24oKSk7
Ci0KLSAgcmV0dXJuIGZ1bmMtPmNhbGwoZXhlYywgdGhpc09iaiwgYXJnTGlzdCk7Ci19Ci0KLS8v
IEVDTUEgMTEuMwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUG9zdGZpeFJl
c29sdmVOb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotSlNWYWx1ZSAq
UG9zdGZpeFJlc29sdmVOb2RlOjpldmFsdWF0ZShFeGVjU3RhdGUgKmV4ZWMpCi17Ci0gIGNvbnN0
IFNjb3BlQ2hhaW4mIGNoYWluID0gZXhlYy0+Y29udGV4dCgpLmltcCgpLT5zY29wZUNoYWluKCk7
Ci0gIFNjb3BlQ2hhaW5JdGVyYXRvciBpdGVyID0gY2hhaW4uYmVnaW4oKTsKLSAgU2NvcGVDaGFp
bkl0ZXJhdG9yIGVuZCA9IGNoYWluLmVuZCgpOwotICAKLSAgLy8gd2UgbXVzdCBhbHdheXMgaGF2
ZSBzb21ldGhpbmcgaW4gdGhlIHNjb3BlIGNoYWluCi0gIGFzc2VydChpdGVyICE9IGVuZCk7Ci0K
LSAgUHJvcGVydHlTbG90IHNsb3Q7Ci0gIEpTT2JqZWN0ICpiYXNlOwotICBkbyB7IAotICAgIGJh
c2UgPSAqaXRlcjsKLSAgICBpZiAoYmFzZS0+Z2V0UHJvcGVydHlTbG90KGV4ZWMsIG1faWRlbnQs
IHNsb3QpKSB7Ci0gICAgICAgIEpTVmFsdWUgKnYgPSBzbG90LmdldFZhbHVlKGV4ZWMsIGJhc2Us
IG1faWRlbnQpOwotCi0gICAgICAgIGRvdWJsZSBuID0gdi0+dG9OdW1iZXIoZXhlYyk7Ci0gICAg
ICAgIAotICAgICAgICBkb3VibGUgbmV3VmFsdWUgPSAobV9vcGVyID09IE9wUGx1c1BsdXMpID8g
biArIDEgOiBuIC0gMTsKLSAgICAgICAgYmFzZS0+cHV0KGV4ZWMsIG1faWRlbnQsIGpzTnVtYmVy
KG5ld1ZhbHVlKSk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4ganNOdW1iZXIobik7Ci0gICAg
fQotCi0gICAgKytpdGVyOwotICB9IHdoaWxlIChpdGVyICE9IGVuZCk7Ci0KLSAgcmV0dXJuIHRo
cm93VW5kZWZpbmVkVmFyaWFibGVFcnJvcihleGVjLCBtX2lkZW50KTsKLX0KLQotLy8gLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBvc3RmaXhCcmFja2V0Tm9kZSAtLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUpTVmFsdWUgKlBvc3RmaXhCcmFja2V0Tm9kZTo6ZXZh
bHVhdGUoRXhlY1N0YXRlICpleGVjKQotewotICBKU1ZhbHVlICpiYXNlVmFsdWUgPSBtX2Jhc2Ut
PmV2YWx1YXRlKGV4ZWMpOwotICBLSlNfQ0hFQ0tFWENFUFRJT05WQUxVRQotICBKU1ZhbHVlICpz
dWJzY3JpcHQgPSBtX3N1YnNjcmlwdC0+ZXZhbHVhdGUoZXhlYyk7Ci0gIEtKU19DSEVDS0VYQ0VQ
VElPTlZBTFVFCi0KLSAgSlNPYmplY3QgKmJhc2UgPSBiYXNlVmFsdWUtPnRvT2JqZWN0KGV4ZWMp
OwotCi0gIHVpbnQzMl90IHByb3BlcnR5SW5kZXg7Ci0gIGlmIChzdWJzY3JpcHQtPmdldFVJbnQz
Mihwcm9wZXJ0eUluZGV4KSkgewotICAgIFByb3BlcnR5U2xvdCBzbG90OwotICAgIEpTVmFsdWUg
KnYgPSBiYXNlLT5nZXRQcm9wZXJ0eVNsb3QoZXhlYywgcHJvcGVydHlJbmRleCwgc2xvdCkgPyBz
bG90LmdldFZhbHVlKGV4ZWMsIGJhc2UsIHByb3BlcnR5SW5kZXgpIDoganNVbmRlZmluZWQoKTsK
LSAgICBLSlNfQ0hFQ0tFWENFUFRJT05WQUxVRQotCi0gICAgZG91YmxlIG4gPSB2LT50b051bWJl
cihleGVjKTsKLQotICAgIGRvdWJsZSBuZXdWYWx1ZSA9IChtX29wZXIgPT0gT3BQbHVzUGx1cykg
PyBuICsgMSA6IG4gLSAxOwotICAgIGJhc2UtPnB1dChleGVjLCBwcm9wZXJ0eUluZGV4LCBqc051
bWJlcihuZXdWYWx1ZSkpOwotICAgICAgICAKLSAgICByZXR1cm4ganNOdW1iZXIobik7Ci0gIH0K
LQotICBJZGVudGlmaWVyIHByb3BlcnR5TmFtZShzdWJzY3JpcHQtPnRvU3RyaW5nKGV4ZWMpKTsK
LSAgUHJvcGVydHlTbG90IHNsb3Q7Ci0gIEpTVmFsdWUgKnYgPSBiYXNlLT5nZXRQcm9wZXJ0eVNs
b3QoZXhlYywgcHJvcGVydHlOYW1lLCBzbG90KSA/IHNsb3QuZ2V0VmFsdWUoZXhlYywgYmFzZSwg
cHJvcGVydHlOYW1lKSA6IGpzVW5kZWZpbmVkKCk7Ci0gIEtKU19DSEVDS0VYQ0VQVElPTlZBTFVF
Ci0KLSAgZG91YmxlIG4gPSB2LT50b051bWJlcihleGVjKTsKLSAgCi0gIGRvdWJsZSBuZXdWYWx1
ZSA9IChtX29wZXIgPT0gT3BQbHVzUGx1cykgPyBuICsgMSA6IG4gLSAxOwotICBiYXNlLT5wdXQo
ZXhlYywgcHJvcGVydHlOYW1lLCBqc051bWJlcihuZXdWYWx1ZSkpOwotICAgICAgICAKLSAgcmV0
dXJuIGpzTnVtYmVyKG4pOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0g
UG9zdGZpeERvdE5vZGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1KU1Zh
bHVlICpQb3N0Zml4RG90Tm9kZTo6ZXZhbHVhdGUoRXhlY1N0YXRlICpleGVjKQotewotICBKU1Zh
bHVlICpiYXNlVmFsdWUgPSBtX2Jhc2UtPmV2YWx1YXRlKGV4ZWMpOwotICBLSlNfQ0hFQ0tFWENF
UFRJT05WQUxVRQotICBKU09iamVjdCAqYmFzZSA9IGJhc2VWYWx1ZS0+dG9PYmplY3QoZXhlYyk7
Ci0KLSAgUHJvcGVydHlTbG90IHNsb3Q7Ci0gIEpTVmFsdWUgKnYgPSBiYXNlLT5nZXRQcm9wZXJ0
eVNsb3QoZXhlYywgbV9pZGVudCwgc2xvdCkgPyBzbG90LmdldFZhbHVlKGV4ZWMsIGJhc2UsIG1f
aWRlbnQpIDoganNVbmRlZmluZWQoKTsKLSAgS0pTX0NIRUNLRVhDRVBUSU9OVkFMVUUKLQotICBk
b3VibGUgbiA9IHYtPnRvTnVtYmVyKGV4ZWMpOwotICAKLSAgZG91YmxlIG5ld1ZhbHVlID0gKG1f
b3BlciA9PSBPcFBsdXNQbHVzKSA/IG4gKyAxIDogbiAtIDE7Ci0gIGJhc2UtPnB1dChleGVjLCBt
X2lkZW50LCBqc051bWJlcihuZXdWYWx1ZSkpOwotICAgICAgICAKLSAgcmV0dXJuIGpzTnVtYmVy
KG4pOwotfQotCi0vLyBFQ01BIDExLjQuMQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0gRGVsZXRlUmVzb2x2ZU5vZGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0KLUpTVmFsdWUgKkRlbGV0ZVJlc29sdmVOb2RlOjpldmFsdWF0ZShFeGVjU3RhdGUgKmV4ZWMp
Ci17Ci0gIGNvbnN0IFNjb3BlQ2hhaW4mIGNoYWluID0gZXhlYy0+Y29udGV4dCgpLmltcCgpLT5z
Y29wZUNoYWluKCk7Ci0gIFNjb3BlQ2hhaW5JdGVyYXRvciBpdGVyID0gY2hhaW4uYmVnaW4oKTsK
LSAgU2NvcGVDaGFpbkl0ZXJhdG9yIGVuZCA9IGNoYWluLmVuZCgpOwotICAKLSAgLy8gd2UgbXVz
dCBhbHdheXMgaGF2ZSBzb21ldGhpbmcgaW4gdGhlIHNjb3BlIGNoYWluCi0gIGFzc2VydChpdGVy
ICE9IGVuZCk7Ci0KLSAgUHJvcGVydHlTbG90IHNsb3Q7Ci0gIEpTT2JqZWN0ICpiYXNlOwotICBk
byB7IAotICAgIGJhc2UgPSAqaXRlcjsKLSAgICBpZiAoYmFzZS0+Z2V0UHJvcGVydHlTbG90KGV4
ZWMsIG1faWRlbnQsIHNsb3QpKSB7Ci0gICAgICAgIHJldHVybiBqc0Jvb2xlYW4oYmFzZS0+ZGVs
ZXRlUHJvcGVydHkoZXhlYywgbV9pZGVudCkpOwotICAgIH0KLQotICAgICsraXRlcjsKLSAgfSB3
aGlsZSAoaXRlciAhPSBlbmQpOwotCi0gIHJldHVybiBqc0Jvb2xlYW4odHJ1ZSk7Ci19Ci0KLS8v
IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBEZWxldGVCcmFja2V0Tm9kZSAtLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotSlNWYWx1ZSAqRGVsZXRlQnJhY2tldE5vZGU6
OmV2YWx1YXRlKEV4ZWNTdGF0ZSAqZXhlYykKLXsKLSAgSlNWYWx1ZSAqYmFzZVZhbHVlID0gbV9i
YXNlLT5ldmFsdWF0ZShleGVjKTsKLSAgS0pTX0NIRUNLRVhDRVBUSU9OVkFMVUUKLSAgSlNWYWx1
ZSAqc3Vic2NyaXB0ID0gbV9zdWJzY3JpcHQtPmV2YWx1YXRlKGV4ZWMpOwotICBLSlNfQ0hFQ0tF
WENFUFRJT05WQUxVRQotCi0gIEpTT2JqZWN0ICpiYXNlID0gYmFzZVZhbHVlLT50b09iamVjdChl
eGVjKTsKLQotICB1aW50MzJfdCBwcm9wZXJ0eUluZGV4OwotICBpZiAoc3Vic2NyaXB0LT5nZXRV
SW50MzIocHJvcGVydHlJbmRleCkpCi0gICAgICByZXR1cm4ganNCb29sZWFuKGJhc2UtPmRlbGV0
ZVByb3BlcnR5KGV4ZWMsIHByb3BlcnR5SW5kZXgpKTsKLQotICBJZGVudGlmaWVyIHByb3BlcnR5
TmFtZShzdWJzY3JpcHQtPnRvU3RyaW5nKGV4ZWMpKTsKLSAgcmV0dXJuIGpzQm9vbGVhbihiYXNl
LT5kZWxldGVQcm9wZXJ0eShleGVjLCBwcm9wZXJ0eU5hbWUpKTsKLX0KLQotLy8gLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tIERlbGV0ZURvdE5vZGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0KLUpTVmFsdWUgKkRlbGV0ZURvdE5vZGU6OmV2YWx1YXRlKEV4ZWNTdGF0
ZSAqZXhlYykKLXsKLSAgSlNWYWx1ZSAqYmFzZVZhbHVlID0gbV9iYXNlLT5ldmFsdWF0ZShleGVj
KTsKLSAgSlNPYmplY3QgKmJhc2UgPSBiYXNlVmFsdWUtPnRvT2JqZWN0KGV4ZWMpOwotICBLSlNf
Q0hFQ0tFWENFUFRJT05WQUxVRQotCi0gIHJldHVybiBqc0Jvb2xlYW4oYmFzZS0+ZGVsZXRlUHJv
cGVydHkoZXhlYywgbV9pZGVudCkpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0gRGVsZXRlVmFsdWVOb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
Ci1KU1ZhbHVlICpEZWxldGVWYWx1ZU5vZGU6OmV2YWx1YXRlKEV4ZWNTdGF0ZSAqZXhlYykKLXsK
LSAgbV9leHByLT5ldmFsdWF0ZShleGVjKTsKLSAgS0pTX0NIRUNLRVhDRVBUSU9OVkFMVUUKLQot
ICAvLyBkZWxldGUgb24gYSBub24tbG9jYXRpb24gZXhwcmVzc2lvbiBpZ25vcmVzIHRoZSB2YWx1
ZSBhbmQgcmV0dXJucyB0cnVlCi0gIHJldHVybiBqc0Jvb2xlYW4odHJ1ZSk7Ci19Ci0KLS8vIC0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBWb2lkTm9kZSAtLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIEVDTUEgMTEuNC4yCi1KU1ZhbHVlICpWb2lkTm9kZTo6
ZXZhbHVhdGUoRXhlY1N0YXRlICpleGVjKQotewotICBleHByLT5ldmFsdWF0ZShleGVjKTsKLSAg
S0pTX0NIRUNLRVhDRVBUSU9OVkFMVUUKLQotICByZXR1cm4ganNVbmRlZmluZWQoKTsKLX0KLQot
Ly8gRUNNQSAxMS40LjMKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFR5cGVP
ZlZhbHVlTm9kZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMg
SlNWYWx1ZSAqdHlwZVN0cmluZ0ZvclZhbHVlKEpTVmFsdWUgKnYpCi17Ci0gICAgc3dpdGNoICh2
LT50eXBlKCkpIHsKLSAgICBjYXNlIFVuZGVmaW5lZFR5cGU6Ci0gICAgICAgIHJldHVybiBqc1N0
cmluZygidW5kZWZpbmVkIik7Ci0gICAgY2FzZSBOdWxsVHlwZToKLSAgICAgICAgcmV0dXJuIGpz
U3RyaW5nKCJvYmplY3QiKTsKLSAgICBjYXNlIEJvb2xlYW5UeXBlOgotICAgICAgICByZXR1cm4g
anNTdHJpbmcoImJvb2xlYW4iKTsKLSAgICBjYXNlIE51bWJlclR5cGU6Ci0gICAgICAgIHJldHVy
biBqc1N0cmluZygibnVtYmVyIik7Ci0gICAgY2FzZSBTdHJpbmdUeXBlOgotICAgICAgICByZXR1
cm4ganNTdHJpbmcoInN0cmluZyIpOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIGlmICh2LT5pc09i
amVjdCgpKSB7Ci0gICAgICAgICAgICAvLyBSZXR1cm4gInVuZGVmaW5lZCIgZm9yIG9iamVjdHMg
dGhhdCBzaG91bGQgYmUgdHJlYXRlZAotICAgICAgICAgICAgLy8gYXMgbnVsbCB3aGVuIGRvaW5n
IGNvbXBhcmlzb25zLgotICAgICAgICAgICAgaWYgKHN0YXRpY19jYXN0PEpTT2JqZWN0Kj4odikt
Pm1hc3F1ZXJhZGVBc1VuZGVmaW5lZCgpKQotICAgICAgICAgICAgICAgIHJldHVybiBqc1N0cmlu
ZygidW5kZWZpbmVkIik7ICAgICAgICAgICAgCi0gICAgICAgICAgICBlbHNlIGlmIChzdGF0aWNf
Y2FzdDxKU09iamVjdCo+KHYpLT5pbXBsZW1lbnRzQ2FsbCgpKQotICAgICAgICAgICAgICAgIHJl
dHVybiBqc1N0cmluZygiZnVuY3Rpb24iKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAg
cmV0dXJuIGpzU3RyaW5nKCJvYmplY3QiKTsKLSAgICB9Ci19Ci0KLUpTVmFsdWUgKlR5cGVPZlJl
c29sdmVOb2RlOjpldmFsdWF0ZShFeGVjU3RhdGUgKmV4ZWMpCi17Ci0gIGNvbnN0IFNjb3BlQ2hh
aW4mIGNoYWluID0gZXhlYy0+Y29udGV4dCgpLmltcCgpLT5zY29wZUNoYWluKCk7Ci0gIFNjb3Bl
Q2hhaW5JdGVyYXRvciBpdGVyID0gY2hhaW4uYmVnaW4oKTsKLSAgU2NvcGVDaGFpbkl0ZXJhdG9y
IGVuZCA9IGNoYWluLmVuZCgpOwotICAKLSAgLy8gd2UgbXVzdCBhbHdheXMgaGF2ZSBzb21ldGhp
bmcgaW4gdGhlIHNjb3BlIGNoYWluCi0gIGFzc2VydChpdGVyICE9IGVuZCk7Ci0KLSAgUHJvcGVy
dHlTbG90IHNsb3Q7Ci0gIEpTT2JqZWN0ICpiYXNlOwotICBkbyB7IAotICAgIGJhc2UgPSAqaXRl
cjsKLSAgICBpZiAoYmFzZS0+Z2V0UHJvcGVydHlTbG90KGV4ZWMsIG1faWRlbnQsIHNsb3QpKSB7
Ci0gICAgICAgIEpTVmFsdWUgKnYgPSBzbG90LmdldFZhbHVlKGV4ZWMsIGJhc2UsIG1faWRlbnQp
OwotICAgICAgICByZXR1cm4gdHlwZVN0cmluZ0ZvclZhbHVlKHYpOwotICAgIH0KLQotICAgICsr
aXRlcjsKLSAgfSB3aGlsZSAoaXRlciAhPSBlbmQpOwotCi0gIHJldHVybiBqc1N0cmluZygidW5k
ZWZpbmVkIik7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBUeXBlT2ZW
YWx1ZU5vZGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotSlNWYWx1ZSAq
VHlwZU9mVmFsdWVOb2RlOjpldmFsdWF0ZShFeGVjU3RhdGUgKmV4ZWMpCi17Ci0gIEpTVmFsdWUg
KnYgPSBtX2V4cHItPmV2YWx1YXRlKGV4ZWMpOwotICBLSlNfQ0hFQ0tFWENFUFRJT05WQUxVRQot
Ci0gIHJldHVybiB0eXBlU3RyaW5nRm9yVmFsdWUodik7Ci19Ci0KLS8vIEVDTUEgMTEuNC40IGFu
ZCAxMS40LjUKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByZWZpeFJlc29s
dmVOb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotSlNWYWx1ZSAqUHJl
Zml4UmVzb2x2ZU5vZGU6OmV2YWx1YXRlKEV4ZWNTdGF0ZSAqZXhlYykKLXsKLSAgY29uc3QgU2Nv
cGVDaGFpbiYgY2hhaW4gPSBleGVjLT5jb250ZXh0KCkuaW1wKCktPnNjb3BlQ2hhaW4oKTsKLSAg
U2NvcGVDaGFpbkl0ZXJhdG9yIGl0ZXIgPSBjaGFpbi5iZWdpbigpOwotICBTY29wZUNoYWluSXRl
cmF0b3IgZW5kID0gY2hhaW4uZW5kKCk7Ci0gIAotICAvLyB3ZSBtdXN0IGFsd2F5cyBoYXZlIHNv
bWV0aGluZyBpbiB0aGUgc2NvcGUgY2hhaW4KLSAgYXNzZXJ0KGl0ZXIgIT0gZW5kKTsKLQotICBQ
cm9wZXJ0eVNsb3Qgc2xvdDsKLSAgSlNPYmplY3QgKmJhc2U7Ci0gIGRvIHsgCi0gICAgYmFzZSA9
ICppdGVyOwotICAgIGlmIChiYXNlLT5nZXRQcm9wZXJ0eVNsb3QoZXhlYywgbV9pZGVudCwgc2xv
dCkpIHsKLSAgICAgICAgSlNWYWx1ZSAqdiA9IHNsb3QuZ2V0VmFsdWUoZXhlYywgYmFzZSwgbV9p
ZGVudCk7Ci0KLSAgICAgICAgZG91YmxlIG4gPSB2LT50b051bWJlcihleGVjKTsKLSAgICAgICAg
Ci0gICAgICAgIGRvdWJsZSBuZXdWYWx1ZSA9IChtX29wZXIgPT0gT3BQbHVzUGx1cykgPyBuICsg
MSA6IG4gLSAxOwotICAgICAgICBKU1ZhbHVlICpuMiA9IGpzTnVtYmVyKG5ld1ZhbHVlKTsKLSAg
ICAgICAgYmFzZS0+cHV0KGV4ZWMsIG1faWRlbnQsIG4yKTsKLQotICAgICAgICByZXR1cm4gbjI7
Ci0gICAgfQotCi0gICAgKytpdGVyOwotICB9IHdoaWxlIChpdGVyICE9IGVuZCk7Ci0KLSAgcmV0
dXJuIHRocm93VW5kZWZpbmVkVmFyaWFibGVFcnJvcihleGVjLCBtX2lkZW50KTsKLX0KLQotLy8g
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByZWZpeEJyYWNrZXROb2RlIC0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotSlNWYWx1ZSAqUHJlZml4QnJhY2tldE5vZGU6
OmV2YWx1YXRlKEV4ZWNTdGF0ZSAqZXhlYykKLXsKLSAgSlNWYWx1ZSAqYmFzZVZhbHVlID0gbV9i
YXNlLT5ldmFsdWF0ZShleGVjKTsKLSAgS0pTX0NIRUNLRVhDRVBUSU9OVkFMVUUKLSAgSlNWYWx1
ZSAqc3Vic2NyaXB0ID0gbV9zdWJzY3JpcHQtPmV2YWx1YXRlKGV4ZWMpOwotICBLSlNfQ0hFQ0tF
WENFUFRJT05WQUxVRQotCi0gIEpTT2JqZWN0ICpiYXNlID0gYmFzZVZhbHVlLT50b09iamVjdChl
eGVjKTsKLQotICB1aW50MzJfdCBwcm9wZXJ0eUluZGV4OwotICBpZiAoc3Vic2NyaXB0LT5nZXRV
SW50MzIocHJvcGVydHlJbmRleCkpIHsKLSAgICBQcm9wZXJ0eVNsb3Qgc2xvdDsKLSAgICBKU1Zh
bHVlICp2ID0gYmFzZS0+Z2V0UHJvcGVydHlTbG90KGV4ZWMsIHByb3BlcnR5SW5kZXgsIHNsb3Qp
ID8gc2xvdC5nZXRWYWx1ZShleGVjLCBiYXNlLCBwcm9wZXJ0eUluZGV4KSA6IGpzVW5kZWZpbmVk
KCk7Ci0gICAgS0pTX0NIRUNLRVhDRVBUSU9OVkFMVUUKLQotICAgIGRvdWJsZSBuID0gdi0+dG9O
dW1iZXIoZXhlYyk7Ci0KLSAgICBkb3VibGUgbmV3VmFsdWUgPSAobV9vcGVyID09IE9wUGx1c1Bs
dXMpID8gbiArIDEgOiBuIC0gMTsKLSAgICBKU1ZhbHVlICpuMiA9IGpzTnVtYmVyKG5ld1ZhbHVl
KTsKLSAgICBiYXNlLT5wdXQoZXhlYywgcHJvcGVydHlJbmRleCwgbjIpOwotCi0gICAgcmV0dXJu
IG4yOwotICB9Ci0KLSAgSWRlbnRpZmllciBwcm9wZXJ0eU5hbWUoc3Vic2NyaXB0LT50b1N0cmlu
ZyhleGVjKSk7Ci0gIFByb3BlcnR5U2xvdCBzbG90OwotICBKU1ZhbHVlICp2ID0gYmFzZS0+Z2V0
UHJvcGVydHlTbG90KGV4ZWMsIHByb3BlcnR5TmFtZSwgc2xvdCkgPyBzbG90LmdldFZhbHVlKGV4
ZWMsIGJhc2UsIHByb3BlcnR5TmFtZSkgOiBqc1VuZGVmaW5lZCgpOwotICBLSlNfQ0hFQ0tFWENF
UFRJT05WQUxVRQotCi0gIGRvdWJsZSBuID0gdi0+dG9OdW1iZXIoZXhlYyk7Ci0gIAotICBkb3Vi
bGUgbmV3VmFsdWUgPSAobV9vcGVyID09IE9wUGx1c1BsdXMpID8gbiArIDEgOiBuIC0gMTsKLSAg
SlNWYWx1ZSAqbjIgPSBqc051bWJlcihuZXdWYWx1ZSk7Ci0gIGJhc2UtPnB1dChleGVjLCBwcm9w
ZXJ0eU5hbWUsIG4yKTsKLQotICByZXR1cm4gbjI7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLSBQcmVmaXhEb3ROb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0KLQotSlNWYWx1ZSAqUHJlZml4RG90Tm9kZTo6ZXZhbHVhdGUoRXhlY1N0YXRlICpleGVj
KQotewotICBKU1ZhbHVlICpiYXNlVmFsdWUgPSBtX2Jhc2UtPmV2YWx1YXRlKGV4ZWMpOwotICBL
SlNfQ0hFQ0tFWENFUFRJT05WQUxVRQotICBKU09iamVjdCAqYmFzZSA9IGJhc2VWYWx1ZS0+dG9P
YmplY3QoZXhlYyk7Ci0KLSAgUHJvcGVydHlTbG90IHNsb3Q7Ci0gIEpTVmFsdWUgKnYgPSBiYXNl
LT5nZXRQcm9wZXJ0eVNsb3QoZXhlYywgbV9pZGVudCwgc2xvdCkgPyBzbG90LmdldFZhbHVlKGV4
ZWMsIGJhc2UsIG1faWRlbnQpIDoganNVbmRlZmluZWQoKTsKLSAgS0pTX0NIRUNLRVhDRVBUSU9O
VkFMVUUKLQotICBkb3VibGUgbiA9IHYtPnRvTnVtYmVyKGV4ZWMpOwotICAKLSAgZG91YmxlIG5l
d1ZhbHVlID0gKG1fb3BlciA9PSBPcFBsdXNQbHVzKSA/IG4gKyAxIDogbiAtIDE7Ci0gIEpTVmFs
dWUgKm4yID0ganNOdW1iZXIobmV3VmFsdWUpOwotICBiYXNlLT5wdXQoZXhlYywgbV9pZGVudCwg
bjIpOwotCi0gIHJldHVybiBuMjsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tIFVuYXJ5UGx1c05vZGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8g
RUNNQSAxMS40LjYKLUpTVmFsdWUgKlVuYXJ5UGx1c05vZGU6OmV2YWx1YXRlKEV4ZWNTdGF0ZSAq
ZXhlYykKLXsKLSAgSlNWYWx1ZSAqdiA9IGV4cHItPmV2YWx1YXRlKGV4ZWMpOwotICBLSlNfQ0hF
Q0tFWENFUFRJT05WQUxVRQotCi0gIHJldHVybiBqc051bWJlcih2LT50b051bWJlcihleGVjKSk7
Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBOZWdhdGVOb2RlIC0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIEVDTUEgMTEuNC43Ci1KU1ZhbHVl
ICpOZWdhdGVOb2RlOjpldmFsdWF0ZShFeGVjU3RhdGUgKmV4ZWMpCi17Ci0gIEpTVmFsdWUgKnYg
PSBleHByLT5ldmFsdWF0ZShleGVjKTsKLSAgS0pTX0NIRUNLRVhDRVBUSU9OVkFMVUUKLQotICBk
b3VibGUgbiA9IHYtPnRvTnVtYmVyKGV4ZWMpOwotICByZXR1cm4ganNOdW1iZXIoLW4pOwotfQot
Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQml0d2lzZU5vdE5vZGUgLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBFQ01BIDExLjQuOAotSlNWYWx1ZSAqQml0
d2lzZU5vdE5vZGU6OmV2YWx1YXRlKEV4ZWNTdGF0ZSAqZXhlYykKLXsKLSAgSlNWYWx1ZSAqdiA9
IGV4cHItPmV2YWx1YXRlKGV4ZWMpOwotICBLSlNfQ0hFQ0tFWENFUFRJT05WQUxVRQotICByZXR1
cm4ganNOdW1iZXIofnYtPnRvSW50MzIoZXhlYykpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0gTG9naWNhbE5vdE5vZGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLQotCi0vLyBFQ01BIDExLjQuOQotSlNWYWx1ZSAqTG9naWNhbE5vdE5vZGU6OmV2YWx1YXRl
KEV4ZWNTdGF0ZSAqZXhlYykKLXsKLSAgSlNWYWx1ZSAqdiA9IGV4cHItPmV2YWx1YXRlKGV4ZWMp
OwotICBLSlNfQ0hFQ0tFWENFUFRJT05WQUxVRQotICByZXR1cm4ganNCb29sZWFuKCF2LT50b0Jv
b2xlYW4oZXhlYykpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTXVs
dE5vZGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBFQ01BIDEx
LjUKLUpTVmFsdWUgKk11bHROb2RlOjpldmFsdWF0ZShFeGVjU3RhdGUgKmV4ZWMpCi17Ci0gIEpT
VmFsdWUgKnYxID0gdGVybTEtPmV2YWx1YXRlKGV4ZWMpOwotICBLSlNfQ0hFQ0tFWENFUFRJT05W
QUxVRQotCi0gIEpTVmFsdWUgKnYyID0gdGVybTItPmV2YWx1YXRlKGV4ZWMpOwotICBLSlNfQ0hF
Q0tFWENFUFRJT05WQUxVRQotCi0gIHJldHVybiBtdWx0KGV4ZWMsIHYxLCB2Miwgb3Blcik7Ci19
Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBBZGROb2RlIC0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIEVDTUEgMTEuNgotSlNWYWx1ZSAqQWRk
Tm9kZTo6ZXZhbHVhdGUoRXhlY1N0YXRlICpleGVjKQotewotICBKU1ZhbHVlICp2MSA9IHRlcm0x
LT5ldmFsdWF0ZShleGVjKTsKLSAgS0pTX0NIRUNLRVhDRVBUSU9OVkFMVUUKLQotICBKU1ZhbHVl
ICp2MiA9IHRlcm0yLT5ldmFsdWF0ZShleGVjKTsKLSAgS0pTX0NIRUNLRVhDRVBUSU9OVkFMVUUK
LQotICByZXR1cm4gYWRkKGV4ZWMsIHYxLCB2Miwgb3Blcik7Ci19Ci0KLS8vIC0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLSBTaGlmdE5vZGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tCi0KLS8vIEVDTUEgMTEuNwotSlNWYWx1ZSAqU2hpZnROb2RlOjpldmFsdWF0ZShF
eGVjU3RhdGUgKmV4ZWMpCi17Ci0gIEpTVmFsdWUgKnYxID0gdGVybTEtPmV2YWx1YXRlKGV4ZWMp
OwotICBLSlNfQ0hFQ0tFWENFUFRJT05WQUxVRQotICBKU1ZhbHVlICp2MiA9IHRlcm0yLT5ldmFs
dWF0ZShleGVjKTsKLSAgS0pTX0NIRUNLRVhDRVBUSU9OVkFMVUUKLSAgdW5zaWduZWQgaW50IGky
ID0gdjItPnRvVUludDMyKGV4ZWMpOwotICBpMiAmPSAweDFmOwotCi0gIHN3aXRjaCAob3Blcikg
ewotICBjYXNlIE9wTFNoaWZ0OgotICAgIHJldHVybiBqc051bWJlcih2MS0+dG9JbnQzMihleGVj
KSA8PCBpMik7Ci0gIGNhc2UgT3BSU2hpZnQ6Ci0gICAgcmV0dXJuIGpzTnVtYmVyKHYxLT50b0lu
dDMyKGV4ZWMpID4+IGkyKTsKLSAgY2FzZSBPcFVSU2hpZnQ6Ci0gICAgcmV0dXJuIGpzTnVtYmVy
KHYxLT50b1VJbnQzMihleGVjKSA+PiBpMik7Ci0gIGRlZmF1bHQ6Ci0gICAgYXNzZXJ0KCEiU2hp
ZnROb2RlOiB1bmhhbmRsZWQgc3dpdGNoIGNhc2UiKTsKLSAgICByZXR1cm4ganNVbmRlZmluZWQo
KTsKLSAgfQotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUmVsYXRpb25h
bE5vZGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBFQ01BIDExLjgKLUpT
VmFsdWUgKlJlbGF0aW9uYWxOb2RlOjpldmFsdWF0ZShFeGVjU3RhdGUgKmV4ZWMpCi17Ci0gIEpT
VmFsdWUgKnYxID0gZXhwcjEtPmV2YWx1YXRlKGV4ZWMpOwotICBLSlNfQ0hFQ0tFWENFUFRJT05W
QUxVRQotICBKU1ZhbHVlICp2MiA9IGV4cHIyLT5ldmFsdWF0ZShleGVjKTsKLSAgS0pTX0NIRUNL
RVhDRVBUSU9OVkFMVUUKLQotICBib29sIGI7Ci0gIGlmIChvcGVyID09IE9wTGVzcyB8fCBvcGVy
ID09IE9wR3JlYXRlckVxKSB7Ci0gICAgaW50IHIgPSByZWxhdGlvbihleGVjLCB2MSwgdjIpOwot
ICAgIGlmIChyIDwgMCkKLSAgICAgIGIgPSBmYWxzZTsKLSAgICBlbHNlCi0gICAgICBiID0gKG9w
ZXIgPT0gT3BMZXNzKSA/IChyID09IDEpIDogKHIgPT0gMCk7Ci0gIH0gZWxzZSBpZiAob3BlciA9
PSBPcEdyZWF0ZXIgfHwgb3BlciA9PSBPcExlc3NFcSkgewotICAgIGludCByID0gcmVsYXRpb24o
ZXhlYywgdjIsIHYxKTsKLSAgICBpZiAociA8IDApCi0gICAgICBiID0gZmFsc2U7Ci0gICAgZWxz
ZQotICAgICAgYiA9IChvcGVyID09IE9wR3JlYXRlcikgPyAociA9PSAxKSA6IChyID09IDApOwot
ICB9IGVsc2UgaWYgKG9wZXIgPT0gT3BJbikgewotICAgICAgLy8gSXMgYWxsIG9mIHRoaXMgT0sg
Zm9yIGhvc3Qgb2JqZWN0cz8KLSAgICAgIGlmICghdjItPmlzT2JqZWN0KCkpCi0gICAgICAgICAg
cmV0dXJuIHRocm93RXJyb3IoZXhlYywgIFR5cGVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIlZhbHVlICVzIChyZXN1bHQgb2YgZXhwcmVzc2lvbiAlcykgaXMgbm90IGFuIG9i
amVjdC4gQ2Fubm90IGJlIHVzZWQgd2l0aCBJTiBleHByZXNzaW9uLiIsIHYyLCBleHByMi5nZXQo
KSk7Ci0gICAgICBKU09iamVjdCAqbzIoc3RhdGljX2Nhc3Q8SlNPYmplY3QqPih2MikpOwotICAg
ICAgYiA9IG8yLT5oYXNQcm9wZXJ0eShleGVjLCBJZGVudGlmaWVyKHYxLT50b1N0cmluZyhleGVj
KSkpOwotICB9IGVsc2UgewotICAgIGlmICghdjItPmlzT2JqZWN0KCkpCi0gICAgICAgIHJldHVy
biB0aHJvd0Vycm9yKGV4ZWMsICBUeXBlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAg
ICAiVmFsdWUgJXMgKHJlc3VsdCBvZiBleHByZXNzaW9uICVzKSBpcyBub3QgYW4gb2JqZWN0LiBD
YW5ub3QgYmUgdXNlZCB3aXRoIGluc3RhbmNlb2Ygb3BlcmF0b3IuIiwgdjIsIGV4cHIyLmdldCgp
KTsKLQotICAgIEpTT2JqZWN0ICpvMihzdGF0aWNfY2FzdDxKU09iamVjdCo+KHYyKSk7Ci0gICAg
aWYgKCFvMi0+aW1wbGVtZW50c0hhc0luc3RhbmNlKCkpIHsKLSAgICAgIC8vIEFjY29yZGluZyB0
byB0aGUgc3BlYywgb25seSBzb21lIHR5cGVzIG9mIG9iamVjdHMgImltcGxlbWVudCIgdGhlIFtb
SGFzSW5zdGFuY2VdXSBwcm9wZXJ0eS4KLSAgICAgIC8vIEJ1dCB3ZSBhcmUgc3VwcG9zZWQgdG8g
dGhyb3cgYW4gZXhjZXB0aW9uIHdoZXJlIHRoZSBvYmplY3QgZG9lcyBub3QgImhhdmUiIHRoZSBb
W0hhc0luc3RhbmNlXV0KLSAgICAgIC8vIHByb3BlcnR5LiBJdCBzZWVtcyB0aGF0IGFsbCBvYmpl
Y3QgaGF2ZSB0aGUgcHJvcGVydHksIGJ1dCBub3QgYWxsIGltcGxlbWVudCBpdCwgc28gaW4gdGhp
cwotICAgICAgLy8gY2FzZSB3ZSByZXR1cm4gZmFsc2UgKGNvbnNpc3RlbnQgd2l0aCBtb3ppbGxh
KQotICAgICAgcmV0dXJuIGpzQm9vbGVhbihmYWxzZSk7Ci0gICAgICAvLyAgICAgIHJldHVybiB0
aHJvd0Vycm9yKGV4ZWMsIFR5cGVFcnJvciwKLSAgICAgIC8vCQkJIk9iamVjdCBkb2VzIG5vdCBp
bXBsZW1lbnQgdGhlIFtbSGFzSW5zdGFuY2VdXSBtZXRob2QuIiApOwotICAgIH0KLSAgICByZXR1
cm4ganNCb29sZWFuKG8yLT5oYXNJbnN0YW5jZShleGVjLCB2MSkpOwotICB9Ci0KLSAgcmV0dXJu
IGpzQm9vbGVhbihiKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEVx
dWFsTm9kZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gRUNNQSAx
MS45Ci1KU1ZhbHVlICpFcXVhbE5vZGU6OmV2YWx1YXRlKEV4ZWNTdGF0ZSAqZXhlYykKLXsKLSAg
SlNWYWx1ZSAqdjEgPSBleHByMS0+ZXZhbHVhdGUoZXhlYyk7Ci0gIEtKU19DSEVDS0VYQ0VQVElP
TlZBTFVFCi0gIEpTVmFsdWUgKnYyID0gZXhwcjItPmV2YWx1YXRlKGV4ZWMpOwotICBLSlNfQ0hF
Q0tFWENFUFRJT05WQUxVRQotCi0gIGJvb2wgcmVzdWx0OwotICBpZiAob3BlciA9PSBPcEVxRXEg
fHwgb3BlciA9PSBPcE5vdEVxKSB7Ci0gICAgLy8gPT0gYW5kICE9Ci0gICAgYm9vbCBlcSA9IGVx
dWFsKGV4ZWMsdjEsIHYyKTsKLSAgICByZXN1bHQgPSBvcGVyID09IE9wRXFFcSA/IGVxIDogIWVx
OwotICB9IGVsc2UgewotICAgIC8vID09PSBhbmQgIT09Ci0gICAgYm9vbCBlcSA9IHN0cmljdEVx
dWFsKGV4ZWMsdjEsIHYyKTsKLSAgICByZXN1bHQgPSBvcGVyID09IE9wU3RyRXEgPyBlcSA6ICFl
cTsKLSAgfQotICByZXR1cm4ganNCb29sZWFuKHJlc3VsdCk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLSBCaXRPcGVyTm9kZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tCi0KLS8vIEVDTUEgMTEuMTAKLUpTVmFsdWUgKkJpdE9wZXJOb2RlOjpldmFsdWF0
ZShFeGVjU3RhdGUgKmV4ZWMpCi17Ci0gIEpTVmFsdWUgKnYxID0gZXhwcjEtPmV2YWx1YXRlKGV4
ZWMpOwotICBLSlNfQ0hFQ0tFWENFUFRJT05WQUxVRQotICBKU1ZhbHVlICp2MiA9IGV4cHIyLT5l
dmFsdWF0ZShleGVjKTsKLSAgS0pTX0NIRUNLRVhDRVBUSU9OVkFMVUUKLSAgaW50IGkxID0gdjEt
PnRvSW50MzIoZXhlYyk7Ci0gIGludCBpMiA9IHYyLT50b0ludDMyKGV4ZWMpOwotICBpbnQgcmVz
dWx0OwotICBpZiAob3BlciA9PSBPcEJpdEFuZCkKLSAgICByZXN1bHQgPSBpMSAmIGkyOwotICBl
bHNlIGlmIChvcGVyID09IE9wQml0WE9yKQotICAgIHJlc3VsdCA9IGkxIF4gaTI7Ci0gIGVsc2UK
LSAgICByZXN1bHQgPSBpMSB8IGkyOwotCi0gIHJldHVybiBqc051bWJlcihyZXN1bHQpOwotfQot
Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQmluYXJ5TG9naWNhbE5vZGUgLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBFQ01BIDExLjExCi1KU1ZhbHVlICpCaW5h
cnlMb2dpY2FsTm9kZTo6ZXZhbHVhdGUoRXhlY1N0YXRlICpleGVjKQotewotICBKU1ZhbHVlICp2
MSA9IGV4cHIxLT5ldmFsdWF0ZShleGVjKTsKLSAgS0pTX0NIRUNLRVhDRVBUSU9OVkFMVUUKLSAg
Ym9vbCBiMSA9IHYxLT50b0Jvb2xlYW4oZXhlYyk7Ci0gIGlmICgoIWIxICYmIG9wZXIgPT0gT3BB
bmQpIHx8IChiMSAmJiBvcGVyID09IE9wT3IpKQotICAgIHJldHVybiB2MTsKLQotICBKU1ZhbHVl
ICp2MiA9IGV4cHIyLT5ldmFsdWF0ZShleGVjKTsKLSAgS0pTX0NIRUNLRVhDRVBUSU9OVkFMVUUK
LQotICByZXR1cm4gdjI7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBD
b25kaXRpb25hbE5vZGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIEVDTUEg
MTEuMTIKLUpTVmFsdWUgKkNvbmRpdGlvbmFsTm9kZTo6ZXZhbHVhdGUoRXhlY1N0YXRlICpleGVj
KQotewotICBKU1ZhbHVlICp2ID0gbG9naWNhbC0+ZXZhbHVhdGUoZXhlYyk7Ci0gIEtKU19DSEVD
S0VYQ0VQVElPTlZBTFVFCi0gIGJvb2wgYiA9IHYtPnRvQm9vbGVhbihleGVjKTsKLQotICBpZiAo
YikKLSAgICB2ID0gZXhwcjEtPmV2YWx1YXRlKGV4ZWMpOwotICBlbHNlCi0gICAgdiA9IGV4cHIy
LT5ldmFsdWF0ZShleGVjKTsKLSAgS0pTX0NIRUNLRVhDRVBUSU9OVkFMVUUKLQotICByZXR1cm4g
djsKLX0KLQotLy8gRUNNQSAxMS4xMwotCi1zdGF0aWMgQUxXQVlTX0lOTElORSBKU1ZhbHVlICp2
YWx1ZUZvclJlYWRNb2RpZnlBc3NpZ25tZW50KEV4ZWNTdGF0ZSAqIGV4ZWMsIEpTVmFsdWUgKnYx
LCBKU1ZhbHVlICp2MiwgT3BlcmF0b3Igb3BlcikKLXsKLSAgSlNWYWx1ZSAqdjsKLSAgaW50IGkx
OwotICBpbnQgaTI7Ci0gIHVuc2lnbmVkIGludCB1aTsKLSAgc3dpdGNoIChvcGVyKSB7Ci0gIGNh
c2UgT3BNdWx0RXE6Ci0gICAgdiA9IG11bHQoZXhlYywgdjEsIHYyLCAnKicpOwotICAgIGJyZWFr
OwotICBjYXNlIE9wRGl2RXE6Ci0gICAgdiA9IG11bHQoZXhlYywgdjEsIHYyLCAnLycpOwotICAg
IGJyZWFrOwotICBjYXNlIE9wUGx1c0VxOgotICAgIHYgPSBhZGQoZXhlYywgdjEsIHYyLCAnKycp
OwotICAgIGJyZWFrOwotICBjYXNlIE9wTWludXNFcToKLSAgICB2ID0gYWRkKGV4ZWMsIHYxLCB2
MiwgJy0nKTsKLSAgICBicmVhazsKLSAgY2FzZSBPcExTaGlmdDoKLSAgICBpMSA9IHYxLT50b0lu
dDMyKGV4ZWMpOwotICAgIGkyID0gdjItPnRvSW50MzIoZXhlYyk7Ci0gICAgdiA9IGpzTnVtYmVy
KGkxIDw8IGkyKTsKLSAgICBicmVhazsKLSAgY2FzZSBPcFJTaGlmdDoKLSAgICBpMSA9IHYxLT50
b0ludDMyKGV4ZWMpOwotICAgIGkyID0gdjItPnRvSW50MzIoZXhlYyk7Ci0gICAgdiA9IGpzTnVt
YmVyKGkxID4+IGkyKTsKLSAgICBicmVhazsKLSAgY2FzZSBPcFVSU2hpZnQ6Ci0gICAgdWkgPSB2
MS0+dG9VSW50MzIoZXhlYyk7Ci0gICAgaTIgPSB2Mi0+dG9JbnQzMihleGVjKTsKLSAgICB2ID0g
anNOdW1iZXIodWkgPj4gaTIpOwotICAgIGJyZWFrOwotICBjYXNlIE9wQW5kRXE6Ci0gICAgaTEg
PSB2MS0+dG9JbnQzMihleGVjKTsKLSAgICBpMiA9IHYyLT50b0ludDMyKGV4ZWMpOwotICAgIHYg
PSBqc051bWJlcihpMSAmIGkyKTsKLSAgICBicmVhazsKLSAgY2FzZSBPcFhPckVxOgotICAgIGkx
ID0gdjEtPnRvSW50MzIoZXhlYyk7Ci0gICAgaTIgPSB2Mi0+dG9JbnQzMihleGVjKTsKLSAgICB2
ID0ganNOdW1iZXIoaTEgXiBpMik7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgT3BPckVxOgotICAgIGkx
ID0gdjEtPnRvSW50MzIoZXhlYyk7Ci0gICAgaTIgPSB2Mi0+dG9JbnQzMihleGVjKTsKLSAgICB2
ID0ganNOdW1iZXIoaTEgfCBpMik7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgT3BNb2RFcTogewotICAg
IGRvdWJsZSBkMSA9IHYxLT50b051bWJlcihleGVjKTsKLSAgICBkb3VibGUgZDIgPSB2Mi0+dG9O
dW1iZXIoZXhlYyk7Ci0gICAgdiA9IGpzTnVtYmVyKGZtb2QoZDEsIGQyKSk7Ci0gIH0KLSAgICBi
cmVhazsKLSAgZGVmYXVsdDoKLSAgICBhc3NlcnQoMCk7Ci0gICAgdiA9IGpzVW5kZWZpbmVkKCk7
Ci0gIH0KLSAgCi0gIHJldHVybiB2OwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0gQXNzaWduUmVzb2x2ZU5vZGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0KLQotSlNWYWx1ZSAqQXNzaWduUmVzb2x2ZU5vZGU6OmV2YWx1YXRlKEV4ZWNTdGF0ZSAqZXhl
YykKLXsKLSAgY29uc3QgU2NvcGVDaGFpbiYgY2hhaW4gPSBleGVjLT5jb250ZXh0KCkuaW1wKCkt
PnNjb3BlQ2hhaW4oKTsKLSAgU2NvcGVDaGFpbkl0ZXJhdG9yIGl0ZXIgPSBjaGFpbi5iZWdpbigp
OwotICBTY29wZUNoYWluSXRlcmF0b3IgZW5kID0gY2hhaW4uZW5kKCk7Ci0gIAotICAvLyB3ZSBt
dXN0IGFsd2F5cyBoYXZlIHNvbWV0aGluZyBpbiB0aGUgc2NvcGUgY2hhaW4KLSAgYXNzZXJ0KGl0
ZXIgIT0gZW5kKTsKLQotICBQcm9wZXJ0eVNsb3Qgc2xvdDsKLSAgSlNPYmplY3QgKmJhc2U7Ci0g
IGRvIHsgCi0gICAgYmFzZSA9ICppdGVyOwotICAgIGlmIChiYXNlLT5nZXRQcm9wZXJ0eVNsb3Qo
ZXhlYywgbV9pZGVudCwgc2xvdCkpCi0gICAgICBnb3RvIGZvdW5kOwotCi0gICAgKytpdGVyOwot
ICB9IHdoaWxlIChpdGVyICE9IGVuZCk7Ci0KLSAgaWYgKG1fb3BlciAhPSBPcEVxdWFsKQotICAg
IHJldHVybiB0aHJvd1VuZGVmaW5lZFZhcmlhYmxlRXJyb3IoZXhlYywgbV9pZGVudCk7Ci0KLSBm
b3VuZDoKLSAgSlNWYWx1ZSAqdjsKLQotICBpZiAobV9vcGVyID09IE9wRXF1YWwpIHsKLSAgICB2
ID0gbV9yaWdodC0+ZXZhbHVhdGUoZXhlYyk7Ci0gIH0gZWxzZSB7Ci0gICAgSlNWYWx1ZSAqdjEg
PSBzbG90LmdldFZhbHVlKGV4ZWMsIGJhc2UsIG1faWRlbnQpOwotICAgIEtKU19DSEVDS0VYQ0VQ
VElPTlZBTFVFCi0gICAgSlNWYWx1ZSAqdjIgPSBtX3JpZ2h0LT5ldmFsdWF0ZShleGVjKTsKLSAg
ICB2ID0gdmFsdWVGb3JSZWFkTW9kaWZ5QXNzaWdubWVudChleGVjLCB2MSwgdjIsIG1fb3Blcik7
Ci0gIH0KLQotICBLSlNfQ0hFQ0tFWENFUFRJT05WQUxVRQotCi0gIGJhc2UtPnB1dChleGVjLCBt
X2lkZW50LCB2KTsKLSAgcmV0dXJuIHY7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLSBBc3NpZ25Eb3ROb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
Ci0KLUpTVmFsdWUgKkFzc2lnbkRvdE5vZGU6OmV2YWx1YXRlKEV4ZWNTdGF0ZSAqZXhlYykKLXsK
LSAgSlNWYWx1ZSAqYmFzZVZhbHVlID0gbV9iYXNlLT5ldmFsdWF0ZShleGVjKTsKLSAgS0pTX0NI
RUNLRVhDRVBUSU9OVkFMVUUKLSAgSlNPYmplY3QgKmJhc2UgPSBiYXNlVmFsdWUtPnRvT2JqZWN0
KGV4ZWMpOwotCi0gIEpTVmFsdWUgKnY7Ci0KLSAgaWYgKG1fb3BlciA9PSBPcEVxdWFsKSB7Ci0g
ICAgdiA9IG1fcmlnaHQtPmV2YWx1YXRlKGV4ZWMpOwotICB9IGVsc2UgewotICAgIFByb3BlcnR5
U2xvdCBzbG90OwotICAgIEpTVmFsdWUgKnYxID0gYmFzZS0+Z2V0UHJvcGVydHlTbG90KGV4ZWMs
IG1faWRlbnQsIHNsb3QpID8gc2xvdC5nZXRWYWx1ZShleGVjLCBiYXNlLCBtX2lkZW50KSA6IGpz
VW5kZWZpbmVkKCk7Ci0gICAgS0pTX0NIRUNLRVhDRVBUSU9OVkFMVUUKLSAgICBKU1ZhbHVlICp2
MiA9IG1fcmlnaHQtPmV2YWx1YXRlKGV4ZWMpOwotICAgIHYgPSB2YWx1ZUZvclJlYWRNb2RpZnlB
c3NpZ25tZW50KGV4ZWMsIHYxLCB2MiwgbV9vcGVyKTsKLSAgfQotCi0gIEtKU19DSEVDS0VYQ0VQ
VElPTlZBTFVFCi0KLSAgYmFzZS0+cHV0KGV4ZWMsIG1faWRlbnQsIHYpOwotICByZXR1cm4gdjsK
LX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEFzc2lnbkJyYWNrZXROb2Rl
IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUpTVmFsdWUgKkFzc2lnbkJy
YWNrZXROb2RlOjpldmFsdWF0ZShFeGVjU3RhdGUgKmV4ZWMpCi17Ci0gIEpTVmFsdWUgKmJhc2VW
YWx1ZSA9IG1fYmFzZS0+ZXZhbHVhdGUoZXhlYyk7Ci0gIEtKU19DSEVDS0VYQ0VQVElPTlZBTFVF
Ci0gIEpTVmFsdWUgKnN1YnNjcmlwdCA9IG1fc3Vic2NyaXB0LT5ldmFsdWF0ZShleGVjKTsKLSAg
S0pTX0NIRUNLRVhDRVBUSU9OVkFMVUUKLQotICBKU09iamVjdCAqYmFzZSA9IGJhc2VWYWx1ZS0+
dG9PYmplY3QoZXhlYyk7Ci0KLSAgdWludDMyX3QgcHJvcGVydHlJbmRleDsKLSAgaWYgKHN1YnNj
cmlwdC0+Z2V0VUludDMyKHByb3BlcnR5SW5kZXgpKSB7Ci0gICAgSlNWYWx1ZSAqdjsKLSAgICBp
ZiAobV9vcGVyID09IE9wRXF1YWwpIHsKLSAgICAgIHYgPSBtX3JpZ2h0LT5ldmFsdWF0ZShleGVj
KTsKLSAgICB9IGVsc2UgewotICAgICAgUHJvcGVydHlTbG90IHNsb3Q7Ci0gICAgICBKU1ZhbHVl
ICp2MSA9IGJhc2UtPmdldFByb3BlcnR5U2xvdChleGVjLCBwcm9wZXJ0eUluZGV4LCBzbG90KSA/
IHNsb3QuZ2V0VmFsdWUoZXhlYywgYmFzZSwgcHJvcGVydHlJbmRleCkgOiBqc1VuZGVmaW5lZCgp
OwotICAgICAgS0pTX0NIRUNLRVhDRVBUSU9OVkFMVUUKLSAgICAgIEpTVmFsdWUgKnYyID0gbV9y
aWdodC0+ZXZhbHVhdGUoZXhlYyk7Ci0gICAgICB2ID0gdmFsdWVGb3JSZWFkTW9kaWZ5QXNzaWdu
bWVudChleGVjLCB2MSwgdjIsIG1fb3Blcik7Ci0gICAgfQotCi0gICAgS0pTX0NIRUNLRVhDRVBU
SU9OVkFMVUUKLQotICAgIGJhc2UtPnB1dChleGVjLCBwcm9wZXJ0eUluZGV4LCB2KTsKLSAgICBy
ZXR1cm4gdjsKLSAgfQotCi0gIElkZW50aWZpZXIgcHJvcGVydHlOYW1lKHN1YnNjcmlwdC0+dG9T
dHJpbmcoZXhlYykpOwotICBKU1ZhbHVlICp2OwotCi0gIGlmIChtX29wZXIgPT0gT3BFcXVhbCkg
ewotICAgIHYgPSBtX3JpZ2h0LT5ldmFsdWF0ZShleGVjKTsKLSAgfSBlbHNlIHsKLSAgICBQcm9w
ZXJ0eVNsb3Qgc2xvdDsKLSAgICBKU1ZhbHVlICp2MSA9IGJhc2UtPmdldFByb3BlcnR5U2xvdChl
eGVjLCBwcm9wZXJ0eU5hbWUsIHNsb3QpID8gc2xvdC5nZXRWYWx1ZShleGVjLCBiYXNlLCBwcm9w
ZXJ0eU5hbWUpIDoganNVbmRlZmluZWQoKTsKLSAgICBLSlNfQ0hFQ0tFWENFUFRJT05WQUxVRQot
ICAgIEpTVmFsdWUgKnYyID0gbV9yaWdodC0+ZXZhbHVhdGUoZXhlYyk7Ci0gICAgdiA9IHZhbHVl
Rm9yUmVhZE1vZGlmeUFzc2lnbm1lbnQoZXhlYywgdjEsIHYyLCBtX29wZXIpOwotICB9Ci0KLSAg
S0pTX0NIRUNLRVhDRVBUSU9OVkFMVUUKLQotICBiYXNlLT5wdXQoZXhlYywgcHJvcGVydHlOYW1l
LCB2KTsKLSAgcmV0dXJuIHY7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LSBDb21tYU5vZGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIEVD
TUEgMTEuMTQKLUpTVmFsdWUgKkNvbW1hTm9kZTo6ZXZhbHVhdGUoRXhlY1N0YXRlICpleGVjKQot
ewotICBleHByMS0+ZXZhbHVhdGUoZXhlYyk7Ci0gIEtKU19DSEVDS0VYQ0VQVElPTlZBTFVFCi0g
IEpTVmFsdWUgKnYgPSBleHByMi0+ZXZhbHVhdGUoZXhlYyk7Ci0gIEtKU19DSEVDS0VYQ0VQVElP
TlZBTFVFCi0KLSAgcmV0dXJuIHY7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLSBTdGF0TGlzdE5vZGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVN0
YXRMaXN0Tm9kZTo6U3RhdExpc3ROb2RlKFN0YXRlbWVudE5vZGUgKnMpCi0gIDogc3RhdGVtZW50
KHMpLCBuZXh0KHRoaXMpCi17Ci0gICAgUGFyc2VyOjpub3RlTm9kZUN5Y2xlKHRoaXMpOwotICAg
IHNldExvYyhzLT5maXJzdExpbmUoKSwgcy0+bGFzdExpbmUoKSk7Ci19Ci0gCi1TdGF0TGlzdE5v
ZGU6OlN0YXRMaXN0Tm9kZShTdGF0TGlzdE5vZGUgKmwsIFN0YXRlbWVudE5vZGUgKnMpCi0gIDog
c3RhdGVtZW50KHMpLCBuZXh0KGwtPm5leHQpCi17Ci0gIGwtPm5leHQgPSB0aGlzOwotICBzZXRM
b2MobC0+Zmlyc3RMaW5lKCksIHMtPmxhc3RMaW5lKCkpOwotfQotCi0vLyBFQ01BIDEyLjEKLUNv
bXBsZXRpb24gU3RhdExpc3ROb2RlOjpleGVjdXRlKEV4ZWNTdGF0ZSAqZXhlYykKLXsKLSAgQ29t
cGxldGlvbiBjID0gc3RhdGVtZW50LT5leGVjdXRlKGV4ZWMpOwotICBLSlNfQUJPUlRQT0lOVAot
ICBpZiAoYy5jb21wbFR5cGUoKSAhPSBOb3JtYWwpCi0gICAgcmV0dXJuIGM7Ci0gIAotICBKU1Zh
bHVlICp2ID0gYy52YWx1ZSgpOwotICAKLSAgZm9yIChTdGF0TGlzdE5vZGUgKm4gPSBuZXh0Lmdl
dCgpOyBuOyBuID0gbi0+bmV4dC5nZXQoKSkgewotICAgIENvbXBsZXRpb24gYzIgPSBuLT5zdGF0
ZW1lbnQtPmV4ZWN1dGUoZXhlYyk7Ci0gICAgS0pTX0FCT1JUUE9JTlQKLSAgICBpZiAoYzIuY29t
cGxUeXBlKCkgIT0gTm9ybWFsKQotICAgICAgcmV0dXJuIGMyOwotCi0gICAgaWYgKGMyLmlzVmFs
dWVDb21wbGV0aW9uKCkpCi0gICAgICB2ID0gYzIudmFsdWUoKTsKLSAgICBjID0gYzI7Ci0gIH0K
LQotICByZXR1cm4gQ29tcGxldGlvbihjLmNvbXBsVHlwZSgpLCB2LCBjLnRhcmdldCgpKTsKLX0K
LQotdm9pZCBTdGF0TGlzdE5vZGU6OnByb2Nlc3NWYXJEZWNscyhFeGVjU3RhdGUgKmV4ZWMpCi17
Ci0gIGZvciAoU3RhdExpc3ROb2RlICpuID0gdGhpczsgbjsgbiA9IG4tPm5leHQuZ2V0KCkpCi0g
ICAgbi0+c3RhdGVtZW50LT5wcm9jZXNzVmFyRGVjbHMoZXhlYyk7Ci19Ci0KLXZvaWQgU3RhdExp
c3ROb2RlOjpicmVha0N5Y2xlKCkgCi17IAotICAgIG5leHQgPSAwOwotfQotCi0vLyAtLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQXNzaWduRXhwck5vZGUgLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLQotCi0vLyBFQ01BIDEyLjIKLUpTVmFsdWUgKkFzc2lnbkV4cHJOb2RlOjpl
dmFsdWF0ZShFeGVjU3RhdGUgKmV4ZWMpCi17Ci0gIHJldHVybiBleHByLT5ldmFsdWF0ZShleGVj
KTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFZhckRlY2xOb2RlIC0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIAotVmFyRGVjbE5vZGU6OlZh
ckRlY2xOb2RlKGNvbnN0IElkZW50aWZpZXIgJmlkLCBBc3NpZ25FeHByTm9kZSAqaW4sIFR5cGUg
dCkKLSAgICA6IHZhclR5cGUodCksIGlkZW50KGlkKSwgaW5pdChpbikKLXsKLX0KLQotLy8gRUNN
QSAxMi4yCi1KU1ZhbHVlICpWYXJEZWNsTm9kZTo6ZXZhbHVhdGUoRXhlY1N0YXRlICpleGVjKQot
ewotICBKU09iamVjdCAqdmFyaWFibGUgPSBleGVjLT5jb250ZXh0KCkuaW1wKCktPnZhcmlhYmxl
T2JqZWN0KCk7Ci0KLSAgSlNWYWx1ZSAqdmFsOwotICBpZiAoaW5pdCkgewotICAgICAgdmFsID0g
aW5pdC0+ZXZhbHVhdGUoZXhlYyk7Ci0gICAgICBLSlNfQ0hFQ0tFWENFUFRJT05WQUxVRQotICB9
IGVsc2UgewotICAgICAgLy8gYWxyZWFkeSBkZWNsYXJlZD8gLSBjaGVjayB3aXRoIGdldERpcmVj
dCBzbyB5b3UgY2FuIG92ZXJyaWRlCi0gICAgICAvLyBidWlsdC1pbiBwcm9wZXJ0aWVzIG9mIHRo
ZSBnbG9iYWwgb2JqZWN0IHdpdGggdmFyIGRlY2xhcmF0aW9ucy4KLSAgICAgIGlmICh2YXJpYWJs
ZS0+Z2V0RGlyZWN0KGlkZW50KSkgCi0gICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICB2YWwgPSBq
c1VuZGVmaW5lZCgpOwotICB9Ci0KLSNpZmRlZiBLSlNfVkVSQk9TRQotICBwcmludEluZm8oZXhl
YywoVVN0cmluZygibmV3IHZhcmlhYmxlICIpK2lkZW50LnVzdHJpbmcoKSkuY3N0cmluZygpLmNf
c3RyKCksdmFsKTsKLSNlbmRpZgotICAvLyBXZSB1c2UgSW50ZXJuYWwgdG8gYnlwYXNzIGFsbCBj
aGVja3MgaW4gZGVyaXZlZCBvYmplY3RzLCBlLmcuIHNvIHRoYXQKLSAgLy8gInZhciBsb2NhdGlv
biIgY3JlYXRlcyBhIGR5bmFtaWMgcHJvcGVydHkgaW5zdGVhZCBvZiBhY3RpdmF0aW5nIHdpbmRv
dy5sb2NhdGlvbi4KLSAgaW50IGZsYWdzID0gSW50ZXJuYWw7Ci0gIGlmIChleGVjLT5jb250ZXh0
KCkuaW1wKCktPmNvZGVUeXBlKCkgIT0gRXZhbENvZGUpCi0gICAgZmxhZ3MgfD0gRG9udERlbGV0
ZTsKLSAgaWYgKHZhclR5cGUgPT0gVmFyRGVjbE5vZGU6OkNvbnN0YW50KQotICAgIGZsYWdzIHw9
IFJlYWRPbmx5OwotICB2YXJpYWJsZS0+cHV0KGV4ZWMsIGlkZW50LCB2YWwsIGZsYWdzKTsKLQot
ICByZXR1cm4ganNTdHJpbmcoaWRlbnQudXN0cmluZygpKTsKLX0KLQotdm9pZCBWYXJEZWNsTm9k
ZTo6cHJvY2Vzc1ZhckRlY2xzKEV4ZWNTdGF0ZSAqZXhlYykKLXsKLSAgSlNPYmplY3QgKnZhcmlh
YmxlID0gZXhlYy0+Y29udGV4dCgpLmltcCgpLT52YXJpYWJsZU9iamVjdCgpOwotCi0gIC8vIElm
IGEgdmFyaWFibGUgYnkgdGhpcyBuYW1lIGFscmVhZHkgZXhpc3RzLCBkb24ndCBjbG9iYmVyIGl0
IC0KLSAgLy8gaXQgbWlnaHQgYmUgYSBmdW5jdGlvbiBwYXJhbWV0ZXIKLSAgaWYgKCF2YXJpYWJs
ZS0+aGFzUHJvcGVydHkoZXhlYywgaWRlbnQpKSB7Ci0gICAgaW50IGZsYWdzID0gSW50ZXJuYWw7
Ci0gICAgaWYgKGV4ZWMtPmNvbnRleHQoKS5pbXAoKS0+Y29kZVR5cGUoKSAhPSBFdmFsQ29kZSkK
LSAgICAgIGZsYWdzIHw9IERvbnREZWxldGU7Ci0gICAgaWYgKHZhclR5cGUgPT0gVmFyRGVjbE5v
ZGU6OkNvbnN0YW50KQotICAgICAgZmxhZ3MgfD0gUmVhZE9ubHk7Ci0gICAgdmFyaWFibGUtPnB1
dChleGVjLCBpZGVudCwganNVbmRlZmluZWQoKSwgZmxhZ3MpOwotICB9Ci19Ci0KLS8vIC0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBWYXJEZWNsTGlzdE5vZGUgLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tCi0KLS8vIEVDTUEgMTIuMgotSlNWYWx1ZSAqVmFyRGVjbExpc3ROb2Rl
OjpldmFsdWF0ZShFeGVjU3RhdGUgKmV4ZWMpCi17Ci0gIGZvciAoVmFyRGVjbExpc3ROb2RlICpu
ID0gdGhpczsgbjsgbiA9IG4tPm5leHQuZ2V0KCkpIHsKLSAgICBuLT52YXItPmV2YWx1YXRlKGV4
ZWMpOwotICAgIEtKU19DSEVDS0VYQ0VQVElPTlZBTFVFCi0gIH0KLSAgcmV0dXJuIGpzVW5kZWZp
bmVkKCk7Ci19Ci0KLXZvaWQgVmFyRGVjbExpc3ROb2RlOjpwcm9jZXNzVmFyRGVjbHMoRXhlY1N0
YXRlICpleGVjKQotewotICBmb3IgKFZhckRlY2xMaXN0Tm9kZSAqbiA9IHRoaXM7IG47IG4gPSBu
LT5uZXh0LmdldCgpKQotICAgIG4tPnZhci0+cHJvY2Vzc1ZhckRlY2xzKGV4ZWMpOwotfQotCi12
b2lkIFZhckRlY2xMaXN0Tm9kZTo6YnJlYWtDeWNsZSgpIAoteyAKLSAgICBuZXh0ID0gMDsKLX0K
LQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFZhclN0YXRlbWVudE5vZGUgLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gRUNNQSAxMi4yCi1Db21wbGV0aW9uIFZh
clN0YXRlbWVudE5vZGU6OmV4ZWN1dGUoRXhlY1N0YXRlICpleGVjKQotewotICBLSlNfQlJFQUtQ
T0lOVDsKLQotICAodm9pZCkgbmV4dC0+ZXZhbHVhdGUoZXhlYyk7Ci0gIEtKU19DSEVDS0VYQ0VQ
VElPTgotCi0gIHJldHVybiBDb21wbGV0aW9uKE5vcm1hbCk7Ci19Ci0KLXZvaWQgVmFyU3RhdGVt
ZW50Tm9kZTo6cHJvY2Vzc1ZhckRlY2xzKEV4ZWNTdGF0ZSAqZXhlYykKLXsKLSAgbmV4dC0+cHJv
Y2Vzc1ZhckRlY2xzKGV4ZWMpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0gQmxvY2tOb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1CbG9j
a05vZGU6OkJsb2NrTm9kZShTb3VyY2VFbGVtZW50c05vZGUgKnMpCi17Ci0gIGlmIChzKSB7Ci0g
ICAgc291cmNlID0gcy0+bmV4dDsKLSAgICBQYXJzZXI6OnJlbW92ZU5vZGVDeWNsZShzb3VyY2Uu
Z2V0KCkpOwotICAgIHMtPm5leHQgPSAwOwotICAgIHNldExvYyhzLT5maXJzdExpbmUoKSwgcy0+
bGFzdExpbmUoKSk7Ci0gIH0gZWxzZSB7Ci0gICAgc291cmNlID0gMDsKLSAgfQotfQotCi0vLyBF
Q01BIDEyLjEKLUNvbXBsZXRpb24gQmxvY2tOb2RlOjpleGVjdXRlKEV4ZWNTdGF0ZSAqZXhlYykK
LXsKLSAgaWYgKCFzb3VyY2UpCi0gICAgcmV0dXJuIENvbXBsZXRpb24oTm9ybWFsKTsKLQotICBz
b3VyY2UtPnByb2Nlc3NGdW5jRGVjbChleGVjKTsKLQotICByZXR1cm4gc291cmNlLT5leGVjdXRl
KGV4ZWMpOwotfQotCi12b2lkIEJsb2NrTm9kZTo6cHJvY2Vzc1ZhckRlY2xzKEV4ZWNTdGF0ZSAq
ZXhlYykKLXsKLSAgaWYgKHNvdXJjZSkKLSAgICBzb3VyY2UtPnByb2Nlc3NWYXJEZWNscyhleGVj
KTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEVtcHR5U3RhdGVtZW50
Tm9kZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gRUNNQSAxMi4zCi1Db21wbGV0
aW9uIEVtcHR5U3RhdGVtZW50Tm9kZTo6ZXhlY3V0ZShFeGVjU3RhdGUgKikKLXsKLSAgcmV0dXJu
IENvbXBsZXRpb24oTm9ybWFsKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tIEV4cHJTdGF0ZW1lbnROb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8g
RUNNQSAxMi40Ci1Db21wbGV0aW9uIEV4cHJTdGF0ZW1lbnROb2RlOjpleGVjdXRlKEV4ZWNTdGF0
ZSAqZXhlYykKLXsKLSAgS0pTX0JSRUFLUE9JTlQ7Ci0KLSAgSlNWYWx1ZSAqdiA9IGV4cHItPmV2
YWx1YXRlKGV4ZWMpOwotICBLSlNfQ0hFQ0tFWENFUFRJT04KLQotICByZXR1cm4gQ29tcGxldGlv
bihOb3JtYWwsIHYpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSWZO
b2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBFQ01BIDEy
LjUKLUNvbXBsZXRpb24gSWZOb2RlOjpleGVjdXRlKEV4ZWNTdGF0ZSAqZXhlYykKLXsKLSAgS0pT
X0JSRUFLUE9JTlQ7Ci0KLSAgSlNWYWx1ZSAqdiA9IGV4cHItPmV2YWx1YXRlKGV4ZWMpOwotICBL
SlNfQ0hFQ0tFWENFUFRJT04KLSAgYm9vbCBiID0gdi0+dG9Cb29sZWFuKGV4ZWMpOwotCi0gIC8v
IGlmIC4uLiB0aGVuCi0gIGlmIChiKQotICAgIHJldHVybiBzdGF0ZW1lbnQxLT5leGVjdXRlKGV4
ZWMpOwotCi0gIC8vIG5vIGVsc2UKLSAgaWYgKCFzdGF0ZW1lbnQyKQotICAgIHJldHVybiBDb21w
bGV0aW9uKE5vcm1hbCk7Ci0KLSAgLy8gZWxzZQotICByZXR1cm4gc3RhdGVtZW50Mi0+ZXhlY3V0
ZShleGVjKTsKLX0KLQotdm9pZCBJZk5vZGU6OnByb2Nlc3NWYXJEZWNscyhFeGVjU3RhdGUgKmV4
ZWMpCi17Ci0gIHN0YXRlbWVudDEtPnByb2Nlc3NWYXJEZWNscyhleGVjKTsKLQotICBpZiAoc3Rh
dGVtZW50MikKLSAgICBzdGF0ZW1lbnQyLT5wcm9jZXNzVmFyRGVjbHMoZXhlYyk7Ci19Ci0KLS8v
IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBEb1doaWxlTm9kZSAtLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIEVDTUEgMTIuNi4xCi1Db21wbGV0aW9uIERvV2hp
bGVOb2RlOjpleGVjdXRlKEV4ZWNTdGF0ZSAqZXhlYykKLXsKLSAgS0pTX0JSRUFLUE9JTlQ7Ci0K
LSAgSlNWYWx1ZSAqYnY7Ci0gIENvbXBsZXRpb24gYzsKLQotICBkbyB7Ci0gICAgLy8gYmFpbCBv
dXQgb24gZXJyb3IKLSAgICBLSlNfQ0hFQ0tFWENFUFRJT04KLQotICAgIGV4ZWMtPmNvbnRleHQo
KS5pbXAoKS0+cHVzaEl0ZXJhdGlvbigpOwotICAgIGMgPSBzdGF0ZW1lbnQtPmV4ZWN1dGUoZXhl
Yyk7Ci0gICAgZXhlYy0+Y29udGV4dCgpLmltcCgpLT5wb3BJdGVyYXRpb24oKTsKLSAgICBpZiAo
ISgoYy5jb21wbFR5cGUoKSA9PSBDb250aW51ZSkgJiYgbHMuY29udGFpbnMoYy50YXJnZXQoKSkp
KSB7Ci0gICAgICBpZiAoKGMuY29tcGxUeXBlKCkgPT0gQnJlYWspICYmIGxzLmNvbnRhaW5zKGMu
dGFyZ2V0KCkpKQotICAgICAgICByZXR1cm4gQ29tcGxldGlvbihOb3JtYWwsIDApOwotICAgICAg
aWYgKGMuY29tcGxUeXBlKCkgIT0gTm9ybWFsKQotICAgICAgICByZXR1cm4gYzsKLSAgICB9Ci0g
ICAgYnYgPSBleHByLT5ldmFsdWF0ZShleGVjKTsKLSAgICBLSlNfQ0hFQ0tFWENFUFRJT04KLSAg
fSB3aGlsZSAoYnYtPnRvQm9vbGVhbihleGVjKSk7Ci0KLSAgcmV0dXJuIENvbXBsZXRpb24oTm9y
bWFsLCAwKTsKLX0KLQotdm9pZCBEb1doaWxlTm9kZTo6cHJvY2Vzc1ZhckRlY2xzKEV4ZWNTdGF0
ZSAqZXhlYykKLXsKLSAgc3RhdGVtZW50LT5wcm9jZXNzVmFyRGVjbHMoZXhlYyk7Ci19Ci0KLS8v
IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBXaGlsZU5vZGUgLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIEVDTUEgMTIuNi4yCi1Db21wbGV0aW9uIFdoaWxl
Tm9kZTo6ZXhlY3V0ZShFeGVjU3RhdGUgKmV4ZWMpCi17Ci0gIEtKU19CUkVBS1BPSU5UOwotCi0g
IEpTVmFsdWUgKmJ2OwotICBDb21wbGV0aW9uIGM7Ci0gIGJvb2wgYihmYWxzZSk7Ci0gIEpTVmFs
dWUgKnZhbHVlID0gMDsKLQotICB3aGlsZSAoMSkgewotICAgIGJ2ID0gZXhwci0+ZXZhbHVhdGUo
ZXhlYyk7Ci0gICAgS0pTX0NIRUNLRVhDRVBUSU9OCi0gICAgYiA9IGJ2LT50b0Jvb2xlYW4oZXhl
Yyk7Ci0KLSAgICAvLyBiYWlsIG91dCBvbiBlcnJvcgotICAgIEtKU19DSEVDS0VYQ0VQVElPTgot
Ci0gICAgaWYgKCFiKQotICAgICAgcmV0dXJuIENvbXBsZXRpb24oTm9ybWFsLCB2YWx1ZSk7Ci0K
LSAgICBleGVjLT5jb250ZXh0KCkuaW1wKCktPnB1c2hJdGVyYXRpb24oKTsKLSAgICBjID0gc3Rh
dGVtZW50LT5leGVjdXRlKGV4ZWMpOwotICAgIGV4ZWMtPmNvbnRleHQoKS5pbXAoKS0+cG9wSXRl
cmF0aW9uKCk7Ci0gICAgaWYgKGMuaXNWYWx1ZUNvbXBsZXRpb24oKSkKLSAgICAgIHZhbHVlID0g
Yy52YWx1ZSgpOwotCi0gICAgaWYgKChjLmNvbXBsVHlwZSgpID09IENvbnRpbnVlKSAmJiBscy5j
b250YWlucyhjLnRhcmdldCgpKSkKLSAgICAgIGNvbnRpbnVlOwotICAgIGlmICgoYy5jb21wbFR5
cGUoKSA9PSBCcmVhaykgJiYgbHMuY29udGFpbnMoYy50YXJnZXQoKSkpCi0gICAgICByZXR1cm4g
Q29tcGxldGlvbihOb3JtYWwsIHZhbHVlKTsKLSAgICBpZiAoYy5jb21wbFR5cGUoKSAhPSBOb3Jt
YWwpCi0gICAgICByZXR1cm4gYzsKLSAgfQotCi0gIHJldHVybiBDb21wbGV0aW9uKCk7IC8vIHdv
cmsgYXJvdW5kIGdjYyA0LjAgYnVnCi19Ci0KLXZvaWQgV2hpbGVOb2RlOjpwcm9jZXNzVmFyRGVj
bHMoRXhlY1N0YXRlICpleGVjKQotewotICBzdGF0ZW1lbnQtPnByb2Nlc3NWYXJEZWNscyhleGVj
KTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZvck5vZGUgLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gRUNNQSAxMi42LjMKLUNvbXBs
ZXRpb24gRm9yTm9kZTo6ZXhlY3V0ZShFeGVjU3RhdGUgKmV4ZWMpCi17Ci0gIEpTVmFsdWUgKnYs
ICpjdmFsID0gMDsKLQotICBpZiAoZXhwcjEpIHsKLSAgICB2ID0gZXhwcjEtPmV2YWx1YXRlKGV4
ZWMpOwotICAgIEtKU19DSEVDS0VYQ0VQVElPTgotICB9Ci0gIHdoaWxlICgxKSB7Ci0gICAgaWYg
KGV4cHIyKSB7Ci0gICAgICB2ID0gZXhwcjItPmV2YWx1YXRlKGV4ZWMpOwotICAgICAgS0pTX0NI
RUNLRVhDRVBUSU9OCi0gICAgICBpZiAoIXYtPnRvQm9vbGVhbihleGVjKSkKLQlyZXR1cm4gQ29t
cGxldGlvbihOb3JtYWwsIGN2YWwpOwotICAgIH0KLSAgICAvLyBiYWlsIG91dCBvbiBlcnJvcgot
ICAgIEtKU19DSEVDS0VYQ0VQVElPTgotCi0gICAgZXhlYy0+Y29udGV4dCgpLmltcCgpLT5wdXNo
SXRlcmF0aW9uKCk7Ci0gICAgQ29tcGxldGlvbiBjID0gc3RhdGVtZW50LT5leGVjdXRlKGV4ZWMp
OwotICAgIGV4ZWMtPmNvbnRleHQoKS5pbXAoKS0+cG9wSXRlcmF0aW9uKCk7Ci0gICAgaWYgKGMu
aXNWYWx1ZUNvbXBsZXRpb24oKSkKLSAgICAgIGN2YWwgPSBjLnZhbHVlKCk7Ci0gICAgaWYgKCEo
KGMuY29tcGxUeXBlKCkgPT0gQ29udGludWUpICYmIGxzLmNvbnRhaW5zKGMudGFyZ2V0KCkpKSkg
ewotICAgICAgaWYgKChjLmNvbXBsVHlwZSgpID09IEJyZWFrKSAmJiBscy5jb250YWlucyhjLnRh
cmdldCgpKSkKLSAgICAgICAgcmV0dXJuIENvbXBsZXRpb24oTm9ybWFsLCBjdmFsKTsKLSAgICAg
IGlmIChjLmNvbXBsVHlwZSgpICE9IE5vcm1hbCkKLSAgICAgIHJldHVybiBjOwotICAgIH0KLSAg
ICBpZiAoZXhwcjMpIHsKLSAgICAgIHYgPSBleHByMy0+ZXZhbHVhdGUoZXhlYyk7Ci0gICAgICBL
SlNfQ0hFQ0tFWENFUFRJT04KLSAgICB9Ci0gIH0KLSAgCi0gIHJldHVybiBDb21wbGV0aW9uKCk7
IC8vIHdvcmsgYXJvdW5kIGdjYyA0LjAgYnVnCi19Ci0KLXZvaWQgRm9yTm9kZTo6cHJvY2Vzc1Zh
ckRlY2xzKEV4ZWNTdGF0ZSAqZXhlYykKLXsKLSAgaWYgKGV4cHIxKQotICAgIGV4cHIxLT5wcm9j
ZXNzVmFyRGVjbHMoZXhlYyk7Ci0KLSAgc3RhdGVtZW50LT5wcm9jZXNzVmFyRGVjbHMoZXhlYyk7
Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGb3JJbk5vZGUgLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUZvckluTm9kZTo6Rm9ySW5Ob2RlKE5v
ZGUgKmwsIE5vZGUgKmUsIFN0YXRlbWVudE5vZGUgKnMpCi0gIDogaW5pdCgwTCksIGxleHByKGwp
LCBleHByKGUpLCB2YXJEZWNsKDBMKSwgc3RhdGVtZW50KHMpCi17Ci19Ci0KLUZvckluTm9kZTo6
Rm9ySW5Ob2RlKGNvbnN0IElkZW50aWZpZXIgJmksIEFzc2lnbkV4cHJOb2RlICppbiwgTm9kZSAq
ZSwgU3RhdGVtZW50Tm9kZSAqcykKLSAgOiBpZGVudChpKSwgaW5pdChpbiksIGV4cHIoZSksIHN0
YXRlbWVudChzKQotewotICAvLyBmb3IoIHZhciBmb28gPSBiYXIgaW4gYmF6ICkKLSAgdmFyRGVj
bCA9IG5ldyBWYXJEZWNsTm9kZShpZGVudCwgaW5pdC5nZXQoKSwgVmFyRGVjbE5vZGU6OlZhcmlh
YmxlKTsKLSAgbGV4cHIgPSBuZXcgUmVzb2x2ZU5vZGUoaWRlbnQpOwotfQotCi0vLyBFQ01BIDEy
LjYuNAotQ29tcGxldGlvbiBGb3JJbk5vZGU6OmV4ZWN1dGUoRXhlY1N0YXRlICpleGVjKQotewot
ICBKU1ZhbHVlICplOwotICBKU1ZhbHVlICpyZXR2YWwgPSAwOwotICBKU09iamVjdCAqdjsKLSAg
Q29tcGxldGlvbiBjOwotICBSZWZlcmVuY2VMaXN0IHByb3BMaXN0OwotCi0gIGlmICh2YXJEZWNs
KSB7Ci0gICAgdmFyRGVjbC0+ZXZhbHVhdGUoZXhlYyk7Ci0gICAgS0pTX0NIRUNLRVhDRVBUSU9O
Ci0gIH0KLQotICBlID0gZXhwci0+ZXZhbHVhdGUoZXhlYyk7Ci0KLSAgLy8gZm9yIE51bGwgYW5k
IFVuZGVmaW5lZCwgd2Ugd2FudCB0byBtYWtlIHN1cmUgbm90IHRvIGdvIHRocm91Z2gKLSAgLy8g
dGhlIGxvb3AgYXQgYWxsLCBiZWNhdXNlIHRoZWlyIG9iamVjdCB3cmFwcGVycyB3aWxsIGhhdmUg
YQotICAvLyBwcm9wZXJ0eSBsaXN0IGJ1dCB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiBpZiB5b3Ug
YXR0ZW1wdCB0bwotICAvLyBhY2Nlc3MgYW55IHByb3BlcnR5LgotICBpZiAoZS0+aXNVbmRlZmlu
ZWRPck51bGwoKSkgewotICAgIHJldHVybiBDb21wbGV0aW9uKE5vcm1hbCwgMCk7Ci0gIH0KLQot
ICBLSlNfQ0hFQ0tFWENFUFRJT04KLSAgdiA9IGUtPnRvT2JqZWN0KGV4ZWMpOwotICBwcm9wTGlz
dCA9IHYtPnByb3BMaXN0KGV4ZWMpOwotCi0gIFJlZmVyZW5jZUxpc3RJdGVyYXRvciBwcm9wSXQg
PSBwcm9wTGlzdC5iZWdpbigpOwotCi0gIHdoaWxlIChwcm9wSXQgIT0gcHJvcExpc3QuZW5kKCkp
IHsKLSAgICBJZGVudGlmaWVyIG5hbWUgPSBwcm9wSXQtPmdldFByb3BlcnR5TmFtZShleGVjKTsK
LSAgICBpZiAoIXYtPmhhc1Byb3BlcnR5KGV4ZWMsIG5hbWUpKSB7Ci0gICAgICBwcm9wSXQrKzsK
LSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIEpTVmFsdWUgKnN0ciA9IGpzU3RyaW5nKG5h
bWUudXN0cmluZygpKTsKLQotICAgIGlmIChsZXhwci0+aXNSZXNvbHZlTm9kZSgpKSB7Ci0gICAg
ICAgIGNvbnN0IElkZW50aWZpZXIgJmlkZW50ID0gc3RhdGljX2Nhc3Q8UmVzb2x2ZU5vZGUgKj4o
bGV4cHIuZ2V0KCkpLT5pZGVudGlmaWVyKCk7Ci0KLSAgICAgICAgY29uc3QgU2NvcGVDaGFpbiYg
Y2hhaW4gPSBleGVjLT5jb250ZXh0KCkuaW1wKCktPnNjb3BlQ2hhaW4oKTsKLSAgICAgICAgU2Nv
cGVDaGFpbkl0ZXJhdG9yIGl0ZXIgPSBjaGFpbi5iZWdpbigpOwotICAgICAgICBTY29wZUNoYWlu
SXRlcmF0b3IgZW5kID0gY2hhaW4uZW5kKCk7Ci0gIAotICAgICAgICAvLyB3ZSBtdXN0IGFsd2F5
cyBoYXZlIHNvbWV0aGluZyBpbiB0aGUgc2NvcGUgY2hhaW4KLSAgICAgICAgYXNzZXJ0KGl0ZXIg
IT0gZW5kKTsKLQotICAgICAgICBQcm9wZXJ0eVNsb3Qgc2xvdDsKLSAgICAgICAgSlNPYmplY3Qg
Km87Ci0gICAgICAgIGRvIHsgCi0gICAgICAgICAgICBvID0gKml0ZXI7Ci0gICAgICAgICAgICBp
ZiAoby0+Z2V0UHJvcGVydHlTbG90KGV4ZWMsIGlkZW50LCBzbG90KSkgewotICAgICAgICAgICAg
ICAgIG8tPnB1dChleGVjLCBpZGVudCwgc3RyKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAg
ICAgICAgICAgIH0KLSAgICAgICAgICAgICsraXRlcjsKLSAgICAgICAgfSB3aGlsZSAoaXRlciAh
PSBlbmQpOwotICAgICAgICAKLSAgICAgICAgaWYgKGl0ZXIgPT0gZW5kKQotICAgICAgICAgICAg
by0+cHV0KGV4ZWMsIGlkZW50LCBzdHIpOwotICAgIH0gZWxzZSBpZiAobGV4cHItPmlzRG90QWNj
ZXNzb3JOb2RlKCkpIHsKLSAgICAgICAgY29uc3QgSWRlbnRpZmllciYgaWRlbnQgPSBzdGF0aWNf
Y2FzdDxEb3RBY2Nlc3Nvck5vZGUgKj4obGV4cHIuZ2V0KCkpLT5pZGVudGlmaWVyKCk7Ci0gICAg
ICAgIEpTVmFsdWUgKnYgPSBzdGF0aWNfY2FzdDxEb3RBY2Nlc3Nvck5vZGUgKj4obGV4cHIuZ2V0
KCkpLT5iYXNlKCktPmV2YWx1YXRlKGV4ZWMpOwotICAgICAgICBLSlNfQ0hFQ0tFWENFUFRJT04K
LSAgICAgICAgSlNPYmplY3QgKm8gPSB2LT50b09iamVjdChleGVjKTsKLQotICAgICAgICBvLT5w
dXQoZXhlYywgaWRlbnQsIHN0cik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgYXNzZXJ0KGxleHBy
LT5pc0JyYWNrZXRBY2Nlc3Nvck5vZGUoKSk7Ci0gICAgICAgIEpTVmFsdWUgKnYgPSBzdGF0aWNf
Y2FzdDxCcmFja2V0QWNjZXNzb3JOb2RlICo+KGxleHByLmdldCgpKS0+YmFzZSgpLT5ldmFsdWF0
ZShleGVjKTsKLSAgICAgICAgS0pTX0NIRUNLRVhDRVBUSU9OCi0gICAgICAgIEpTVmFsdWUgKnYy
ID0gc3RhdGljX2Nhc3Q8QnJhY2tldEFjY2Vzc29yTm9kZSAqPihsZXhwci5nZXQoKSktPnN1YnNj
cmlwdCgpLT5ldmFsdWF0ZShleGVjKTsKLSAgICAgICAgS0pTX0NIRUNLRVhDRVBUSU9OCi0gICAg
ICAgIEpTT2JqZWN0ICpvID0gdi0+dG9PYmplY3QoZXhlYyk7Ci0KLSAgICAgICAgdWludDMyX3Qg
aTsKLSAgICAgICAgaWYgKHYyLT5nZXRVSW50MzIoaSkpCi0gICAgICAgICAgICBvLT5wdXQoZXhl
YywgaSwgc3RyKTsKLSAgICAgICAgby0+cHV0KGV4ZWMsIElkZW50aWZpZXIodjItPnRvU3RyaW5n
KGV4ZWMpKSwgc3RyKTsKLSAgICB9Ci0KLSAgICBLSlNfQ0hFQ0tFWENFUFRJT04KLQotICAgIGV4
ZWMtPmNvbnRleHQoKS5pbXAoKS0+cHVzaEl0ZXJhdGlvbigpOwotICAgIGMgPSBzdGF0ZW1lbnQt
PmV4ZWN1dGUoZXhlYyk7Ci0gICAgZXhlYy0+Y29udGV4dCgpLmltcCgpLT5wb3BJdGVyYXRpb24o
KTsKLSAgICBpZiAoYy5pc1ZhbHVlQ29tcGxldGlvbigpKQotICAgICAgcmV0dmFsID0gYy52YWx1
ZSgpOwotCi0gICAgaWYgKCEoKGMuY29tcGxUeXBlKCkgPT0gQ29udGludWUpICYmIGxzLmNvbnRh
aW5zKGMudGFyZ2V0KCkpKSkgewotICAgICAgaWYgKChjLmNvbXBsVHlwZSgpID09IEJyZWFrKSAm
JiBscy5jb250YWlucyhjLnRhcmdldCgpKSkKLSAgICAgICAgYnJlYWs7Ci0gICAgICBpZiAoYy5j
b21wbFR5cGUoKSAhPSBOb3JtYWwpIHsKLSAgICAgICAgcmV0dXJuIGM7Ci0gICAgICB9Ci0gICAg
fQotCi0gICAgcHJvcEl0Kys7Ci0gIH0KLQotICAvLyBiYWlsIG91dCBvbiBlcnJvcgotICBLSlNf
Q0hFQ0tFWENFUFRJT04KLQotICByZXR1cm4gQ29tcGxldGlvbihOb3JtYWwsIHJldHZhbCk7Ci19
Ci0KLXZvaWQgRm9ySW5Ob2RlOjpwcm9jZXNzVmFyRGVjbHMoRXhlY1N0YXRlICpleGVjKQotewot
ICBpZiAodmFyRGVjbCkKLSAgICB2YXJEZWNsLT5wcm9jZXNzVmFyRGVjbHMoZXhlYyk7Ci0gIHN0
YXRlbWVudC0+cHJvY2Vzc1ZhckRlY2xzKGV4ZWMpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0gQ29udGludWVOb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLQotCi0vLyBFQ01BIDEyLjcKLUNvbXBsZXRpb24gQ29udGludWVOb2RlOjpleGVjdXRlKEV4
ZWNTdGF0ZSAqZXhlYykKLXsKLSAgS0pTX0JSRUFLUE9JTlQ7Ci0KLSAgaWYgKGlkZW50LmlzRW1w
dHkoKSAmJiAhZXhlYy0+Y29udGV4dCgpLmltcCgpLT5pbkl0ZXJhdGlvbigpKQotICAgIHJldHVy
biBjcmVhdGVFcnJvckNvbXBsZXRpb24oZXhlYywgU3ludGF4RXJyb3IsICJJbnZhbGlkIGNvbnRp
bnVlIHN0YXRlbWVudC4iKTsKLSAgZWxzZSBpZiAoIWlkZW50LmlzRW1wdHkoKSAmJiAhZXhlYy0+
Y29udGV4dCgpLmltcCgpLT5zZWVuTGFiZWxzKCktPmNvbnRhaW5zKGlkZW50KSkKLSAgICByZXR1
cm4gY3JlYXRlRXJyb3JDb21wbGV0aW9uKGV4ZWMsIFN5bnRheEVycm9yLCAiTGFiZWwgJXMgbm90
IGZvdW5kLiIsIGlkZW50KTsKLSAgZWxzZQotICAgIHJldHVybiBDb21wbGV0aW9uKENvbnRpbnVl
LCAwLCBpZGVudCk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBCcmVh
a05vZGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIEVDTUEgMTIu
OAotQ29tcGxldGlvbiBCcmVha05vZGU6OmV4ZWN1dGUoRXhlY1N0YXRlICpleGVjKQotewotICBL
SlNfQlJFQUtQT0lOVDsKLQotICBpZiAoaWRlbnQuaXNFbXB0eSgpICYmICFleGVjLT5jb250ZXh0
KCkuaW1wKCktPmluSXRlcmF0aW9uKCkgJiYKLSAgICAgICFleGVjLT5jb250ZXh0KCkuaW1wKCkt
PmluU3dpdGNoKCkpCi0gICAgcmV0dXJuIGNyZWF0ZUVycm9yQ29tcGxldGlvbihleGVjLCBTeW50
YXhFcnJvciwgIkludmFsaWQgYnJlYWsgc3RhdGVtZW50LiIpOwotICBlbHNlIGlmICghaWRlbnQu
aXNFbXB0eSgpICYmICFleGVjLT5jb250ZXh0KCkuaW1wKCktPnNlZW5MYWJlbHMoKS0+Y29udGFp
bnMoaWRlbnQpKQotICAgIHJldHVybiBjcmVhdGVFcnJvckNvbXBsZXRpb24oZXhlYywgU3ludGF4
RXJyb3IsICJMYWJlbCAlcyBub3QgZm91bmQuIik7Ci0gIGVsc2UKLSAgICByZXR1cm4gQ29tcGxl
dGlvbihCcmVhaywgMCwgaWRlbnQpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0gUmV0dXJuTm9kZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0v
LyBFQ01BIDEyLjkKLUNvbXBsZXRpb24gUmV0dXJuTm9kZTo6ZXhlY3V0ZShFeGVjU3RhdGUgKmV4
ZWMpCi17Ci0gIEtKU19CUkVBS1BPSU5UOwotCi0gIENvZGVUeXBlIGNvZGVUeXBlID0gZXhlYy0+
Y29udGV4dCgpLmltcCgpLT5jb2RlVHlwZSgpOwotICBpZiAoY29kZVR5cGUgIT0gRnVuY3Rpb25D
b2RlICYmIGNvZGVUeXBlICE9IEFub255bW91c0NvZGUgKSB7Ci0gICAgcmV0dXJuIGNyZWF0ZUVy
cm9yQ29tcGxldGlvbihleGVjLCBTeW50YXhFcnJvciwgIkludmFsaWQgcmV0dXJuIHN0YXRlbWVu
dC4iKTsKLSAgfQotCi0gIGlmICghdmFsdWUpCi0gICAgcmV0dXJuIENvbXBsZXRpb24oUmV0dXJu
VmFsdWUsIGpzVW5kZWZpbmVkKCkpOwotCi0gIEpTVmFsdWUgKnYgPSB2YWx1ZS0+ZXZhbHVhdGUo
ZXhlYyk7Ci0gIEtKU19DSEVDS0VYQ0VQVElPTgotCi0gIHJldHVybiBDb21wbGV0aW9uKFJldHVy
blZhbHVlLCB2KTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFdpdGhO
b2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gRUNNQSAxMi4x
MAotQ29tcGxldGlvbiBXaXRoTm9kZTo6ZXhlY3V0ZShFeGVjU3RhdGUgKmV4ZWMpCi17Ci0gIEtK
U19CUkVBS1BPSU5UOwotCi0gIEpTVmFsdWUgKnYgPSBleHByLT5ldmFsdWF0ZShleGVjKTsKLSAg
S0pTX0NIRUNLRVhDRVBUSU9OCi0gIEpTT2JqZWN0ICpvID0gdi0+dG9PYmplY3QoZXhlYyk7Ci0g
IEtKU19DSEVDS0VYQ0VQVElPTgotICBleGVjLT5jb250ZXh0KCkuaW1wKCktPnB1c2hTY29wZShv
KTsKLSAgQ29tcGxldGlvbiByZXMgPSBzdGF0ZW1lbnQtPmV4ZWN1dGUoZXhlYyk7Ci0gIGV4ZWMt
PmNvbnRleHQoKS5pbXAoKS0+cG9wU2NvcGUoKTsKLQotICByZXR1cm4gcmVzOwotfQotCi12b2lk
IFdpdGhOb2RlOjpwcm9jZXNzVmFyRGVjbHMoRXhlY1N0YXRlICpleGVjKQotewotICBzdGF0ZW1l
bnQtPnByb2Nlc3NWYXJEZWNscyhleGVjKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tIENhc2VDbGF1c2VOb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K
LQotLy8gRUNNQSAxMi4xMQotSlNWYWx1ZSAqQ2FzZUNsYXVzZU5vZGU6OmV2YWx1YXRlKEV4ZWNT
dGF0ZSAqZXhlYykKLXsKLSAgSlNWYWx1ZSAqdiA9IGV4cHItPmV2YWx1YXRlKGV4ZWMpOwotICBL
SlNfQ0hFQ0tFWENFUFRJT05WQUxVRQotCi0gIHJldHVybiB2OwotfQotCi0vLyBFQ01BIDEyLjEx
Ci1Db21wbGV0aW9uIENhc2VDbGF1c2VOb2RlOjpldmFsU3RhdGVtZW50cyhFeGVjU3RhdGUgKmV4
ZWMpCi17Ci0gIGlmIChuZXh0KQotICAgIHJldHVybiBuZXh0LT5leGVjdXRlKGV4ZWMpOwotICBl
bHNlCi0gICAgcmV0dXJuIENvbXBsZXRpb24oTm9ybWFsLCBqc1VuZGVmaW5lZCgpKTsKLX0KLQot
dm9pZCBDYXNlQ2xhdXNlTm9kZTo6cHJvY2Vzc1ZhckRlY2xzKEV4ZWNTdGF0ZSAqZXhlYykKLXsK
LSAgaWYgKG5leHQpCi0gICAgbmV4dC0+cHJvY2Vzc1ZhckRlY2xzKGV4ZWMpOwotfQotCi0vLyAt
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ2xhdXNlTGlzdE5vZGUgLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLQotCi1KU1ZhbHVlICpDbGF1c2VMaXN0Tm9kZTo6ZXZhbHVhdGUo
RXhlY1N0YXRlICopCi17Ci0gIC8vIHNob3VsZCBuZXZlciBiZSBjYWxsZWQKLSAgYXNzZXJ0KGZh
bHNlKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8vIEVDTUEgMTIuMTEKLXZvaWQgQ2xhdXNlTGlzdE5v
ZGU6OnByb2Nlc3NWYXJEZWNscyhFeGVjU3RhdGUgKmV4ZWMpCi17Ci0gIGZvciAoQ2xhdXNlTGlz
dE5vZGUgKm4gPSB0aGlzOyBuOyBuID0gbi0+bmV4dC5nZXQoKSkKLSAgICBpZiAobi0+Y2xhdXNl
KQotICAgICAgbi0+Y2xhdXNlLT5wcm9jZXNzVmFyRGVjbHMoZXhlYyk7Ci19Ci0KLXZvaWQgQ2xh
dXNlTGlzdE5vZGU6OmJyZWFrQ3ljbGUoKSAKLXsgCi0gICAgbmV4dCA9IDA7Ci19Ci0KLS8vIC0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDYXNlQmxvY2tOb2RlIC0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tCi0KLUNhc2VCbG9ja05vZGU6OkNhc2VCbG9ja05vZGUoQ2xhdXNl
TGlzdE5vZGUgKmwxLCBDYXNlQ2xhdXNlTm9kZSAqZCwKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgQ2xhdXNlTGlzdE5vZGUgKmwyKQotewotICBpZiAobDEpIHsKLSAgICBsaXN0MSA9IGwx
LT5uZXh0OwotICAgIFBhcnNlcjo6cmVtb3ZlTm9kZUN5Y2xlKGxpc3QxLmdldCgpKTsKLSAgICBs
MS0+bmV4dCA9IDA7Ci0gIH0gZWxzZSB7Ci0gICAgbGlzdDEgPSAwOwotICB9Ci0KLSAgZGVmID0g
ZDsKLQotICBpZiAobDIpIHsKLSAgICBsaXN0MiA9IGwyLT5uZXh0OwotICAgIFBhcnNlcjo6cmVt
b3ZlTm9kZUN5Y2xlKGxpc3QyLmdldCgpKTsKLSAgICBsMi0+bmV4dCA9IDA7Ci0gIH0gZWxzZSB7
Ci0gICAgbGlzdDIgPSAwOwotICB9Ci19Ci0gCi1KU1ZhbHVlICpDYXNlQmxvY2tOb2RlOjpldmFs
dWF0ZShFeGVjU3RhdGUgKikKLXsKLSAgLy8gc2hvdWxkIG5ldmVyIGJlIGNhbGxlZAotICBhc3Nl
cnQoZmFsc2UpOwotICByZXR1cm4gMDsKLX0KLQotLy8gRUNNQSAxMi4xMQotQ29tcGxldGlvbiBD
YXNlQmxvY2tOb2RlOjpldmFsQmxvY2soRXhlY1N0YXRlICpleGVjLCBKU1ZhbHVlICppbnB1dCkK
LXsKLSAgSlNWYWx1ZSAqdjsKLSAgQ29tcGxldGlvbiByZXM7Ci0gIENsYXVzZUxpc3ROb2RlICph
ID0gbGlzdDEuZ2V0KCk7Ci0gIENsYXVzZUxpc3ROb2RlICpiID0gbGlzdDIuZ2V0KCk7Ci0gIENh
c2VDbGF1c2VOb2RlICpjbGF1c2U7Ci0KLSAgICB3aGlsZSAoYSkgewotICAgICAgY2xhdXNlID0g
YS0+Z2V0Q2xhdXNlKCk7Ci0gICAgICBhID0gYS0+Z2V0TmV4dCgpOwotICAgICAgdiA9IGNsYXVz
ZS0+ZXZhbHVhdGUoZXhlYyk7Ci0gICAgICBLSlNfQ0hFQ0tFWENFUFRJT04KLSAgICAgIGlmIChz
dHJpY3RFcXVhbChleGVjLCBpbnB1dCwgdikpIHsKLQlyZXMgPSBjbGF1c2UtPmV2YWxTdGF0ZW1l
bnRzKGV4ZWMpOwotCWlmIChyZXMuY29tcGxUeXBlKCkgIT0gTm9ybWFsKQotCSAgcmV0dXJuIHJl
czsKLQl3aGlsZSAoYSkgewotCSAgcmVzID0gYS0+Z2V0Q2xhdXNlKCktPmV2YWxTdGF0ZW1lbnRz
KGV4ZWMpOwotCSAgaWYgKHJlcy5jb21wbFR5cGUoKSAhPSBOb3JtYWwpCi0JICAgIHJldHVybiBy
ZXM7Ci0JICBhID0gYS0+Z2V0TmV4dCgpOwotCX0KLQlicmVhazsKLSAgICAgIH0KLSAgICB9Ci0K
LSAgd2hpbGUgKGIpIHsKLSAgICBjbGF1c2UgPSBiLT5nZXRDbGF1c2UoKTsKLSAgICBiID0gYi0+
Z2V0TmV4dCgpOwotICAgIHYgPSBjbGF1c2UtPmV2YWx1YXRlKGV4ZWMpOwotICAgIEtKU19DSEVD
S0VYQ0VQVElPTgotICAgIGlmIChzdHJpY3RFcXVhbChleGVjLCBpbnB1dCwgdikpIHsKLSAgICAg
IHJlcyA9IGNsYXVzZS0+ZXZhbFN0YXRlbWVudHMoZXhlYyk7Ci0gICAgICBpZiAocmVzLmNvbXBs
VHlwZSgpICE9IE5vcm1hbCkKLQlyZXR1cm4gcmVzOwotICAgICAgZ290byBzdGVwMTg7Ci0gICAg
fQotICB9Ci0KLSAgLy8gZGVmYXVsdCBjbGF1c2UKLSAgaWYgKGRlZikgewotICAgIHJlcyA9IGRl
Zi0+ZXZhbFN0YXRlbWVudHMoZXhlYyk7Ci0gICAgaWYgKHJlcy5jb21wbFR5cGUoKSAhPSBOb3Jt
YWwpCi0gICAgICByZXR1cm4gcmVzOwotICB9Ci0gIGIgPSBsaXN0Mi5nZXQoKTsKLSBzdGVwMTg6
Ci0gIHdoaWxlIChiKSB7Ci0gICAgY2xhdXNlID0gYi0+Z2V0Q2xhdXNlKCk7Ci0gICAgcmVzID0g
Y2xhdXNlLT5ldmFsU3RhdGVtZW50cyhleGVjKTsKLSAgICBpZiAocmVzLmNvbXBsVHlwZSgpICE9
IE5vcm1hbCkKLSAgICAgIHJldHVybiByZXM7Ci0gICAgYiA9IGItPmdldE5leHQoKTsKLSAgfQot
Ci0gIC8vIGJhaWwgb3V0IG9uIGVycm9yCi0gIEtKU19DSEVDS0VYQ0VQVElPTgotCi0gIHJldHVy
biBDb21wbGV0aW9uKE5vcm1hbCk7Ci19Ci0KLXZvaWQgQ2FzZUJsb2NrTm9kZTo6cHJvY2Vzc1Zh
ckRlY2xzKEV4ZWNTdGF0ZSAqZXhlYykKKyAgaWYgKGwyKSB7CisgICAgbGlzdDIgPSBsMi0+bmV4
dC5yZWxlYXNlKCk7CisgICAgUGFyc2VyOjpyZW1vdmVOb2RlQ3ljbGUobGlzdDIuZ2V0KCkpOwor
ICB9IGVsc2UKKyAgICBsaXN0MiA9IDA7Cit9CisgCisvLyBFQ01BIDEyLjExCit2b2lkIENhc2VC
bG9ja05vZGU6OnByb2Nlc3NWYXJEZWNscyhFeGVjU3RhdGUgKmV4ZWMpCiB7CiAgIGlmIChsaXN0
MSkKICAgICBsaXN0MS0+cHJvY2Vzc1ZhckRlY2xzKGV4ZWMpOwpAQCAtMjI0MywyMyArNTY1LDYg
QEAgdm9pZCBDYXNlQmxvY2tOb2RlOjpwcm9jZXNzVmFyRGVjbHMoRXhlYwogCiAvLyAtLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU3dpdGNoTm9kZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLQogCi0vLyBFQ01BIDEyLjExCi1Db21wbGV0aW9uIFN3aXRjaE5vZGU6OmV4
ZWN1dGUoRXhlY1N0YXRlICpleGVjKQotewotICBLSlNfQlJFQUtQT0lOVDsKLQotICBKU1ZhbHVl
ICp2ID0gZXhwci0+ZXZhbHVhdGUoZXhlYyk7Ci0gIEtKU19DSEVDS0VYQ0VQVElPTgotCi0gIGV4
ZWMtPmNvbnRleHQoKS5pbXAoKS0+cHVzaFN3aXRjaCgpOwotICBDb21wbGV0aW9uIHJlcyA9IGJs
b2NrLT5ldmFsQmxvY2soZXhlYyx2KTsKLSAgZXhlYy0+Y29udGV4dCgpLmltcCgpLT5wb3BTd2l0
Y2goKTsKLQotICBpZiAoKHJlcy5jb21wbFR5cGUoKSA9PSBCcmVhaykgJiYgbHMuY29udGFpbnMo
cmVzLnRhcmdldCgpKSkKLSAgICByZXR1cm4gQ29tcGxldGlvbihOb3JtYWwsIHJlcy52YWx1ZSgp
KTsKLSAgcmV0dXJuIHJlczsKLX0KLQogdm9pZCBTd2l0Y2hOb2RlOjpwcm9jZXNzVmFyRGVjbHMo
RXhlY1N0YXRlICpleGVjKQogewogICBibG9jay0+cHJvY2Vzc1ZhckRlY2xzKGV4ZWMpOwpAQCAt
MjI2Nyw2MyArNTcyLDEzIEBAIHZvaWQgU3dpdGNoTm9kZTo6cHJvY2Vzc1ZhckRlY2xzKEV4ZWNT
dGEKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIExhYmVsTm9kZSAtLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotLy8gRUNNQSAxMi4xMgotQ29tcGxldGlv
biBMYWJlbE5vZGU6OmV4ZWN1dGUoRXhlY1N0YXRlICpleGVjKQotewotICBpZiAoIWV4ZWMtPmNv
bnRleHQoKS5pbXAoKS0+c2VlbkxhYmVscygpLT5wdXNoKGxhYmVsKSkKLSAgICByZXR1cm4gY3Jl
YXRlRXJyb3JDb21wbGV0aW9uKGV4ZWMsIFN5bnRheEVycm9yLCAiRHVwbGljYXRlZCBsYWJlbCAl
cyBmb3VuZC4iLCBsYWJlbCk7Ci0gIENvbXBsZXRpb24gZSA9IHN0YXRlbWVudC0+ZXhlY3V0ZShl
eGVjKTsKLSAgZXhlYy0+Y29udGV4dCgpLmltcCgpLT5zZWVuTGFiZWxzKCktPnBvcCgpOwotCi0g
IGlmICgoZS5jb21wbFR5cGUoKSA9PSBCcmVhaykgJiYgKGUudGFyZ2V0KCkgPT0gbGFiZWwpKQot
ICAgIHJldHVybiBDb21wbGV0aW9uKE5vcm1hbCwgZS52YWx1ZSgpKTsKLSAgcmV0dXJuIGU7Ci19
Ci0KIHZvaWQgTGFiZWxOb2RlOjpwcm9jZXNzVmFyRGVjbHMoRXhlY1N0YXRlICpleGVjKQogewog
ICBzdGF0ZW1lbnQtPnByb2Nlc3NWYXJEZWNscyhleGVjKTsKIH0KIAotLy8gLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tIFRocm93Tm9kZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0KLQotLy8gRUNNQSAxMi4xMwotQ29tcGxldGlvbiBUaHJvd05vZGU6OmV4ZWN1dGUo
RXhlY1N0YXRlICpleGVjKQotewotICBLSlNfQlJFQUtQT0lOVDsKLQotICBKU1ZhbHVlICp2ID0g
ZXhwci0+ZXZhbHVhdGUoZXhlYyk7Ci0gIEtKU19DSEVDS0VYQ0VQVElPTgotCi0gIHJldHVybiBD
b21wbGV0aW9uKFRocm93LCB2KTsKLX0KLQogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tIFRyeU5vZGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotLy8g
RUNNQSAxMi4xNAotQ29tcGxldGlvbiBUcnlOb2RlOjpleGVjdXRlKEV4ZWNTdGF0ZSAqZXhlYykK
LXsKLSAgS0pTX0JSRUFLUE9JTlQ7Ci0KLSAgQ29tcGxldGlvbiBjID0gdHJ5QmxvY2stPmV4ZWN1
dGUoZXhlYyk7Ci0KLSAgaWYgKGNhdGNoQmxvY2sgJiYgYy5jb21wbFR5cGUoKSA9PSBUaHJvdykg
ewotICAgIEpTT2JqZWN0ICpvYmogPSBuZXcgSlNPYmplY3Q7Ci0gICAgb2JqLT5wdXQoZXhlYywg
ZXhjZXB0aW9uSWRlbnQsIGMudmFsdWUoKSwgRG9udERlbGV0ZSk7Ci0gICAgZXhlYy0+Y29udGV4
dCgpLmltcCgpLT5wdXNoU2NvcGUob2JqKTsKLSAgICBjID0gY2F0Y2hCbG9jay0+ZXhlY3V0ZShl
eGVjKTsKLSAgICBleGVjLT5jb250ZXh0KCkuaW1wKCktPnBvcFNjb3BlKCk7Ci0gIH0KLQotICBp
ZiAoZmluYWxseUJsb2NrKSB7Ci0gICAgQ29tcGxldGlvbiBjMiA9IGZpbmFsbHlCbG9jay0+ZXhl
Y3V0ZShleGVjKTsKLSAgICBpZiAoYzIuY29tcGxUeXBlKCkgIT0gTm9ybWFsKQotICAgICAgYyA9
IGMyOwotICB9Ci0KLSAgcmV0dXJuIGM7Ci19Ci0KIHZvaWQgVHJ5Tm9kZTo6cHJvY2Vzc1ZhckRl
Y2xzKEV4ZWNTdGF0ZSAqZXhlYykKIHsKICAgdHJ5QmxvY2stPnByb2Nlc3NWYXJEZWNscyhleGVj
KTsKQEAgLTIzMzUsMTIgKzU5MCw2IEBAIHZvaWQgVHJ5Tm9kZTo6cHJvY2Vzc1ZhckRlY2xzKEV4
ZWNTdGF0ZSAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBhcmFtZXRlck5v
ZGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotLy8gRUNNQSAxMwotSlNWYWx1
ZSAqUGFyYW1ldGVyTm9kZTo6ZXZhbHVhdGUoRXhlY1N0YXRlICopCi17Ci0gIHJldHVybiBqc1Vu
ZGVmaW5lZCgpOwotfQotCiB2b2lkIFBhcmFtZXRlck5vZGU6OmJyZWFrQ3ljbGUoKSAKIHsgCiAg
ICAgbmV4dCA9IDA7CkBAIC0yMzk4LDg0ICs2NDcsMjIgQEAgdm9pZCBGdW5jRGVjbE5vZGU6OnBy
b2Nlc3NGdW5jRGVjbChFeGVjUwogICB9CiB9CiAKLUNvbXBsZXRpb24gRnVuY0RlY2xOb2RlOjpl
eGVjdXRlKEV4ZWNTdGF0ZSAqKQotewotICAgIHJldHVybiBDb21wbGV0aW9uKE5vcm1hbCk7Ci19
Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGdW5jRXhwck5vZGUgLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIEVDTUEgMTMKLUpTVmFsdWUgKkZ1bmNF
eHByTm9kZTo6ZXZhbHVhdGUoRXhlY1N0YXRlICpleGVjKQotewotICBDb250ZXh0SW1wICpjb250
ZXh0ID0gZXhlYy0+Y29udGV4dCgpLmltcCgpOwotICBib29sIG5hbWVkID0gIWlkZW50LmlzTnVs
bCgpOwotICBKU09iamVjdCAqZnVuY3Rpb25TY29wZU9iamVjdCA9IDA7Ci0KLSAgaWYgKG5hbWVk
KSB7Ci0gICAgLy8gbmFtZWQgRnVuY3Rpb25FeHByZXNzaW9ucyBjYW4gcmVjdXJzaXZlbHkgY2Fs
bCB0aGVtc2VsdmVzLAotICAgIC8vIGJ1dCB0aGV5IHdvbid0IHJlZ2lzdGVyIHdpdGggdGhlIGN1
cnJlbnQgc2NvcGUgY2hhaW4gYW5kIHNob3VsZAotICAgIC8vIGJlIGNvbnRhaW5lZCBhcyBzaW5n
bGUgcHJvcGVydHkgaW4gYW4gYW5vbnltb3VzIG9iamVjdC4KLSAgICBmdW5jdGlvblNjb3BlT2Jq
ZWN0ID0gbmV3IEpTT2JqZWN0OwotICAgIGNvbnRleHQtPnB1c2hTY29wZShmdW5jdGlvblNjb3Bl
T2JqZWN0KTsKLSAgfQotCi0gIEZ1bmN0aW9uSW1wICpmdW5jID0gbmV3IERlY2xhcmVkRnVuY3Rp
b25JbXAoZXhlYywgaWRlbnQsIGJvZHkuZ2V0KCksIGNvbnRleHQtPnNjb3BlQ2hhaW4oKSk7Ci0g
IEpTT2JqZWN0ICpwcm90byA9IGV4ZWMtPmxleGljYWxJbnRlcnByZXRlcigpLT5idWlsdGluT2Jq
ZWN0KCktPmNvbnN0cnVjdChleGVjLCBMaXN0OjplbXB0eSgpKTsKLSAgcHJvdG8tPnB1dChleGVj
LCBjb25zdHJ1Y3RvclByb3BlcnR5TmFtZSwgZnVuYywgUmVhZE9ubHl8RG9udERlbGV0ZXxEb250
RW51bSk7Ci0gIGZ1bmMtPnB1dChleGVjLCBwcm90b3R5cGVQcm9wZXJ0eU5hbWUsIHByb3RvLCBJ
bnRlcm5hbHxEb250RGVsZXRlKTsKLQotICBpbnQgcGxlbiA9IDA7Ci0gIGZvcihQYXJhbWV0ZXJO
b2RlICpwID0gcGFyYW0uZ2V0KCk7IHAgIT0gMEw7IHAgPSBwLT5uZXh0UGFyYW0oKSwgcGxlbisr
KQotICAgIGZ1bmMtPmFkZFBhcmFtZXRlcihwLT5pZGVudCgpKTsKLQotICBpZiAobmFtZWQpIHsK
LSAgICBmdW5jdGlvblNjb3BlT2JqZWN0LT5wdXQoZXhlYywgaWRlbnQsIGZ1bmMsIEludGVybmFs
IHwgUmVhZE9ubHkgfCAoY29udGV4dC0+Y29kZVR5cGUoKSA9PSBFdmFsQ29kZSA/IDAgOiBEb250
RGVsZXRlKSk7Ci0gICAgY29udGV4dC0+cG9wU2NvcGUoKTsKLSAgfQotCi0gIHJldHVybiBmdW5j
OwotfQotCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU291cmNlRWxlbWVudHNO
b2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBpbnQgU291cmNlRWxlbWVudHNOb2Rl
Ojpjb3VudCA9IDA7CiAKIFNvdXJjZUVsZW1lbnRzTm9kZTo6U291cmNlRWxlbWVudHNOb2RlKFN0
YXRlbWVudE5vZGUgKnMxKQotICA6IG5vZGUoczEpLCBuZXh0KHRoaXMpCisgICAgOiBTdGF0ZW1l
bnROb2RlKFNvdXJjZUVsZW1lbnRzTm9kZUV4ZWN1dGVTdGF0ZSksIG5vZGUoczEpLCBuZXh0KHRo
aXMpCiB7CiAgICAgUGFyc2VyOjpub3RlTm9kZUN5Y2xlKHRoaXMpOwogICAgIHNldExvYyhzMS0+
Zmlyc3RMaW5lKCksIHMxLT5sYXN0TGluZSgpKTsKIH0KIAogU291cmNlRWxlbWVudHNOb2RlOjpT
b3VyY2VFbGVtZW50c05vZGUoU291cmNlRWxlbWVudHNOb2RlICpzMSwgU3RhdGVtZW50Tm9kZSAq
czIpCi0gIDogbm9kZShzMiksIG5leHQoczEtPm5leHQpCisgICAgOiBTdGF0ZW1lbnROb2RlKFNv
dXJjZUVsZW1lbnRzTm9kZUV4ZWN1dGVTdGF0ZSksIG5vZGUoczIpLCBuZXh0KHMxLT5uZXh0LnJl
bGVhc2UoKSkKIHsKLSAgczEtPm5leHQgPSB0aGlzOwotICBzZXRMb2MoczEtPmZpcnN0TGluZSgp
LCBzMi0+bGFzdExpbmUoKSk7Ci19Ci0KLS8vIEVDTUEgMTQKLUNvbXBsZXRpb24gU291cmNlRWxl
bWVudHNOb2RlOjpleGVjdXRlKEV4ZWNTdGF0ZSAqZXhlYykKLXsKLSAgS0pTX0NIRUNLRVhDRVBU
SU9OCi0KLSAgQ29tcGxldGlvbiBjMSA9IG5vZGUtPmV4ZWN1dGUoZXhlYyk7Ci0gIEtKU19DSEVD
S0VYQ0VQVElPTjsKLSAgaWYgKGMxLmNvbXBsVHlwZSgpICE9IE5vcm1hbCkKLSAgICByZXR1cm4g
YzE7Ci0gIAotICBmb3IgKFNvdXJjZUVsZW1lbnRzTm9kZSAqbiA9IG5leHQuZ2V0KCk7IG47IG4g
PSBuLT5uZXh0LmdldCgpKSB7Ci0gICAgQ29tcGxldGlvbiBjMiA9IG4tPm5vZGUtPmV4ZWN1dGUo
ZXhlYyk7Ci0gICAgaWYgKGMyLmNvbXBsVHlwZSgpICE9IE5vcm1hbCkKLSAgICAgIHJldHVybiBj
MjsKLSAgICAvLyBUaGUgc3BlYyBzYXlzIHRvIHJldHVybiBjMiBoZXJlLCBidXQgaXQgc2VlbXMg
dGhhdCBtb3ppbGxhIHJldHVybnMgYzEgaWYKLSAgICAvLyBjMiBkb2Vzbid0IGhhdmUgYSB2YWx1
ZQotICAgIGlmIChjMi52YWx1ZSgpKQotICAgICAgYzEgPSBjMjsKLSAgfQotICAKLSAgcmV0dXJu
IGMxOworICAgIHMxLT5uZXh0ID0gdGhpczsKKyAgICBzZXRMb2MoczEtPmZpcnN0TGluZSgpLCBz
Mi0+bGFzdExpbmUoKSk7CiB9CiAKIC8vIEVDTUEgMTQKSW5kZXg6IGtqcy9JbnRlcnByZXRlclN0
YXRlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0ga2pzL0ludGVycHJldGVyU3RhdGUuaAkocmV2aXNpb24gMCkK
KysrIGtqcy9JbnRlcnByZXRlclN0YXRlLmgJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMjUxIEBA
CisvLyAtKi0gbW9kZTogYysrOyBjLWJhc2ljLW9mZnNldDogNCAtKi0KKy8qCisgKiBUaGlzIGZp
bGUgaXMgcGFydCBvZiB0aGUgS0RFIGxpYnJhcmllcworICogQ29weXJpZ2h0IChDKSAyMDA1LCAy
MDA2IEFwcGxlIENvbXB1dGVyLCBJbmMuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29m
dHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVy
IHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2Ug
YXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICog
dmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2
ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0
aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRo
b3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5
IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hv
dWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1Ymxp
YyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJ
TkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlv
biwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEg
MDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisjaWZuZGVmIEludGVycHJldGVyU3RhdGVfaAor
I2RlZmluZSBJbnRlcnByZXRlclN0YXRlX2gKKworbmFtZXNwYWNlIEtKUyB7CisKKy8vIEZJWE1F
OiB0aGlzIHNob3VsZCBwcm9iYWJseSBqdXN0IGJlIGEgZ2VuZXJhdGVkIHNvdXJjZSBmaWxlIGZy
b20gYSBwZXJsIHNjcmlwdC4KKworI2RlZmluZSBFVkFMVUFURV9NQUNST19GT1JfRUFDSF9FVkFM
VUFURV9TVEFURShtYWNybykgXAorICAgIG1hY3JvKE51bGxOb2RlRXZhbHVhdGVTdGF0ZSkgXAor
ICAgIG1hY3JvKEJvb2xlYW5Ob2RlRXZhbHVhdGVTdGF0ZSkgXAorICAgIG1hY3JvKE51bWJlck5v
ZGVFdmFsdWF0ZVN0YXRlKSBcCisgICAgbWFjcm8oU3RyaW5nTm9kZUV2YWx1YXRlU3RhdGUpIFwK
KyAgICBtYWNybyhSZWdFeHBOb2RlRXZhbHVhdGVTdGF0ZSkgXAorICAgIG1hY3JvKFRoaXNOb2Rl
RXZhbHVhdGVTdGF0ZSkgXAorICAgIG1hY3JvKFJlc29sdmVOb2RlRXZhbHVhdGVTdGF0ZSkgXAor
ICAgIG1hY3JvKEdyb3VwTm9kZUV2YWx1YXRlU3RhdGUpIFwKKyAgICBtYWNybyhFbGVtZW50Tm9k
ZUV2YWx1YXRlU3RhdGUpIFwKKyAgICBtYWNybyhFbGVtZW50Tm9kZUV2YWx1YXRlU3RhdGUxKSBc
CisgICAgbWFjcm8oRWxlbWVudE5vZGVFdmFsdWF0ZVN0YXRlMikgXAorICAgIG1hY3JvKEFycmF5
Tm9kZUV2YWx1YXRlU3RhdGUpIFwKKyAgICBtYWNybyhBcnJheU5vZGVFdmFsdWF0ZVN0YXRlMSkg
XAorICAgIG1hY3JvKE9iamVjdExpdGVyYWxOb2RlRXZhbHVhdGVTdGF0ZSkgXAorICAgIG1hY3Jv
KFByb3BlcnR5TGlzdE5vZGVFdmFsdWF0ZVN0YXRlKSBcCisgICAgbWFjcm8oUHJvcGVydHlMaXN0
Tm9kZUV2YWx1YXRlU3RhdGUxKSBcCisgICAgbWFjcm8oUHJvcGVydHlMaXN0Tm9kZUV2YWx1YXRl
U3RhdGUyKSBcCisgICAgbWFjcm8oUHJvcGVydHlMaXN0Tm9kZUV2YWx1YXRlU3RhdGUzKSBcCisg
ICAgbWFjcm8oUHJvcGVydHlOYW1lTm9kZUV2YWx1YXRlU3RhdGUpIFwKKyAgICBtYWNybyhCcmFj
a2V0QWNjZXNzb3JOb2RlRXZhbHVhdGVTdGF0ZSkgXAorICAgIG1hY3JvKEJyYWNrZXRBY2Nlc3Nv
ck5vZGVFdmFsdWF0ZVN0YXRlMSkgXAorICAgIG1hY3JvKEJyYWNrZXRBY2Nlc3Nvck5vZGVFdmFs
dWF0ZVN0YXRlMikgXAorICAgIG1hY3JvKERvdEFjY2Vzc29yTm9kZUV2YWx1YXRlU3RhdGUpIFwK
KyAgICBtYWNybyhEb3RBY2Nlc3Nvck5vZGVFdmFsdWF0ZVN0YXRlMSkgXAorICAgIG1hY3JvKE5l
d0V4cHJOb2RlRXZhbHVhdGVTdGF0ZSkgXAorICAgIG1hY3JvKE5ld0V4cHJOb2RlRXZhbHVhdGVT
dGF0ZTEpIFwKKyAgICBtYWNybyhOZXdFeHByTm9kZUV2YWx1YXRlU3RhdGUyKSBcCisgICAgbWFj
cm8oRnVuY3Rpb25DYWxsVmFsdWVOb2RlRXZhbHVhdGVTdGF0ZSkgXAorICAgIG1hY3JvKEZ1bmN0
aW9uQ2FsbFZhbHVlTm9kZUV2YWx1YXRlU3RhdGUxKSBcCisgICAgbWFjcm8oRnVuY3Rpb25DYWxs
VmFsdWVOb2RlRXZhbHVhdGVTdGF0ZTIpIFwKKyAgICBtYWNybyhGdW5jdGlvbkNhbGxSZXNvbHZl
Tm9kZUV2YWx1YXRlU3RhdGUpIFwKKyAgICBtYWNybyhGdW5jdGlvbkNhbGxSZXNvbHZlTm9kZUV2
YWx1YXRlU3RhdGUxKSBcCisgICAgbWFjcm8oRnVuY3Rpb25DYWxsQnJhY2tldE5vZGVFdmFsdWF0
ZVN0YXRlKSBcCisgICAgbWFjcm8oRnVuY3Rpb25DYWxsQnJhY2tldE5vZGVFdmFsdWF0ZVN0YXRl
MSkgXAorICAgIG1hY3JvKEZ1bmN0aW9uQ2FsbEJyYWNrZXROb2RlRXZhbHVhdGVTdGF0ZTIpIFwK
KyAgICBtYWNybyhGdW5jdGlvbkNhbGxCcmFja2V0Tm9kZUV2YWx1YXRlU3RhdGUzKSBcCisgICAg
bWFjcm8oRnVuY3Rpb25DYWxsRG90Tm9kZUV2YWx1YXRlU3RhdGUpIFwKKyAgICBtYWNybyhGdW5j
dGlvbkNhbGxEb3ROb2RlRXZhbHVhdGVTdGF0ZTEpIFwKKyAgICBtYWNybyhGdW5jdGlvbkNhbGxE
b3ROb2RlRXZhbHVhdGVTdGF0ZTIpIFwKKyAgICBtYWNybyhQb3N0Zml4UmVzb2x2ZU5vZGVFdmFs
dWF0ZVN0YXRlKSBcCisgICAgbWFjcm8oUG9zdGZpeEJyYWNrZXROb2RlRXZhbHVhdGVTdGF0ZSkg
XAorICAgIG1hY3JvKFBvc3RmaXhCcmFja2V0Tm9kZUV2YWx1YXRlU3RhdGUxKSBcCisgICAgbWFj
cm8oUG9zdGZpeEJyYWNrZXROb2RlRXZhbHVhdGVTdGF0ZTIpIFwKKyAgICBtYWNybyhQb3N0Zml4
RG90Tm9kZUV2YWx1YXRlU3RhdGUpIFwKKyAgICBtYWNybyhQb3N0Zml4RG90Tm9kZUV2YWx1YXRl
U3RhdGUxKSBcCisgICAgbWFjcm8oRGVsZXRlUmVzb2x2ZU5vZGVFdmFsdWF0ZVN0YXRlKSBcCisg
ICAgbWFjcm8oRGVsZXRlQnJhY2tldE5vZGVFdmFsdWF0ZVN0YXRlKSBcCisgICAgbWFjcm8oRGVs
ZXRlQnJhY2tldE5vZGVFdmFsdWF0ZVN0YXRlMSkgXAorICAgIG1hY3JvKERlbGV0ZUJyYWNrZXRO
b2RlRXZhbHVhdGVTdGF0ZTIpIFwKKyAgICBtYWNybyhEZWxldGVEb3ROb2RlRXZhbHVhdGVTdGF0
ZSkgXAorICAgIG1hY3JvKERlbGV0ZURvdE5vZGVFdmFsdWF0ZVN0YXRlMSkgXAorICAgIG1hY3Jv
KERlbGV0ZVZhbHVlTm9kZUV2YWx1YXRlU3RhdGUpIFwKKyAgICBtYWNybyhEZWxldGVWYWx1ZU5v
ZGVFdmFsdWF0ZVN0YXRlMSkgXAorICAgIG1hY3JvKFZvaWROb2RlRXZhbHVhdGVTdGF0ZSkgXAor
ICAgIG1hY3JvKFZvaWROb2RlRXZhbHVhdGVTdGF0ZTEpIFwKKyAgICBtYWNybyhUeXBlT2ZSZXNv
bHZlTm9kZUV2YWx1YXRlU3RhdGUpIFwKKyAgICBtYWNybyhUeXBlT2ZWYWx1ZU5vZGVFdmFsdWF0
ZVN0YXRlKSBcCisgICAgbWFjcm8oVHlwZU9mVmFsdWVOb2RlRXZhbHVhdGVTdGF0ZTEpIFwKKyAg
ICBtYWNybyhQcmVmaXhSZXNvbHZlTm9kZUV2YWx1YXRlU3RhdGUpIFwKKyAgICBtYWNybyhQcmVm
aXhCcmFja2V0Tm9kZUV2YWx1YXRlU3RhdGUpIFwKKyAgICBtYWNybyhQcmVmaXhCcmFja2V0Tm9k
ZUV2YWx1YXRlU3RhdGUxKSBcCisgICAgbWFjcm8oUHJlZml4QnJhY2tldE5vZGVFdmFsdWF0ZVN0
YXRlMikgXAorICAgIG1hY3JvKFByZWZpeERvdE5vZGVFdmFsdWF0ZVN0YXRlKSBcCisgICAgbWFj
cm8oUHJlZml4RG90Tm9kZUV2YWx1YXRlU3RhdGUxKSBcCisgICAgbWFjcm8oVW5hcnlQbHVzTm9k
ZUV2YWx1YXRlU3RhdGUpIFwKKyAgICBtYWNybyhVbmFyeVBsdXNOb2RlRXZhbHVhdGVTdGF0ZTEp
IFwKKyAgICBtYWNybyhOZWdhdGVOb2RlRXZhbHVhdGVTdGF0ZSkgXAorICAgIG1hY3JvKE5lZ2F0
ZU5vZGVFdmFsdWF0ZVN0YXRlMSkgXAorICAgIG1hY3JvKEJpdHdpc2VOb3ROb2RlRXZhbHVhdGVT
dGF0ZSkgXAorICAgIG1hY3JvKEJpdHdpc2VOb3ROb2RlRXZhbHVhdGVTdGF0ZTEpIFwKKyAgICBt
YWNybyhMb2dpY2FsTm90Tm9kZUV2YWx1YXRlU3RhdGUpIFwKKyAgICBtYWNybyhMb2dpY2FsTm90
Tm9kZUV2YWx1YXRlU3RhdGUxKSBcCisgICAgbWFjcm8oTXVsdE5vZGVFdmFsdWF0ZVN0YXRlKSBc
CisgICAgbWFjcm8oTXVsdE5vZGVFdmFsdWF0ZVN0YXRlMSkgXAorICAgIG1hY3JvKE11bHROb2Rl
RXZhbHVhdGVTdGF0ZTIpIFwKKyAgICBtYWNybyhBZGROb2RlRXZhbHVhdGVTdGF0ZSkgXAorICAg
IG1hY3JvKEFkZE5vZGVFdmFsdWF0ZVN0YXRlMSkgXAorICAgIG1hY3JvKEFkZE5vZGVFdmFsdWF0
ZVN0YXRlMikgXAorICAgIG1hY3JvKFNoaWZ0Tm9kZUV2YWx1YXRlU3RhdGUpIFwKKyAgICBtYWNy
byhTaGlmdE5vZGVFdmFsdWF0ZVN0YXRlMSkgXAorICAgIG1hY3JvKFNoaWZ0Tm9kZUV2YWx1YXRl
U3RhdGUyKSBcCisgICAgbWFjcm8oUmVsYXRpb25hbE5vZGVFdmFsdWF0ZVN0YXRlKSBcCisgICAg
bWFjcm8oUmVsYXRpb25hbE5vZGVFdmFsdWF0ZVN0YXRlMSkgXAorICAgIG1hY3JvKFJlbGF0aW9u
YWxOb2RlRXZhbHVhdGVTdGF0ZTIpIFwKKyAgICBtYWNybyhFcXVhbE5vZGVFdmFsdWF0ZVN0YXRl
KSBcCisgICAgbWFjcm8oRXF1YWxOb2RlRXZhbHVhdGVTdGF0ZTEpIFwKKyAgICBtYWNybyhFcXVh
bE5vZGVFdmFsdWF0ZVN0YXRlMikgXAorICAgIG1hY3JvKEJpdE9wZXJOb2RlRXZhbHVhdGVTdGF0
ZSkgXAorICAgIG1hY3JvKEJpdE9wZXJOb2RlRXZhbHVhdGVTdGF0ZTEpIFwKKyAgICBtYWNybyhC
aXRPcGVyTm9kZUV2YWx1YXRlU3RhdGUyKSBcCisgICAgbWFjcm8oQmluYXJ5TG9naWNhbE5vZGVF
dmFsdWF0ZVN0YXRlKSBcCisgICAgbWFjcm8oQmluYXJ5TG9naWNhbE5vZGVFdmFsdWF0ZVN0YXRl
MSkgXAorICAgIG1hY3JvKENvbmRpdGlvbmFsTm9kZUV2YWx1YXRlU3RhdGUpIFwKKyAgICBtYWNy
byhDb25kaXRpb25hbE5vZGVFdmFsdWF0ZVN0YXRlMSkgXAorICAgIG1hY3JvKEFzc2lnblJlc29s
dmVOb2RlRXZhbHVhdGVTdGF0ZSkgXAorICAgIG1hY3JvKEFzc2lnblJlc29sdmVOb2RlRXZhbHVh
dGVTdGF0ZTEpIFwKKyAgICBtYWNybyhBc3NpZ25Eb3ROb2RlRXZhbHVhdGVTdGF0ZSkgXAorICAg
IG1hY3JvKEFzc2lnbkRvdE5vZGVFdmFsdWF0ZVN0YXRlMSkgXAorICAgIG1hY3JvKEFzc2lnbkRv
dE5vZGVFdmFsdWF0ZVN0YXRlMikgXAorICAgIG1hY3JvKEFzc2lnbkRvdE5vZGVFdmFsdWF0ZVN0
YXRlMykgXAorICAgIG1hY3JvKEFzc2lnbkJyYWNrZXROb2RlRXZhbHVhdGVTdGF0ZSkgXAorICAg
IG1hY3JvKEFzc2lnbkJyYWNrZXROb2RlRXZhbHVhdGVTdGF0ZTEpIFwKKyAgICBtYWNybyhBc3Np
Z25CcmFja2V0Tm9kZUV2YWx1YXRlU3RhdGUyKSBcCisgICAgbWFjcm8oQXNzaWduQnJhY2tldE5v
ZGVFdmFsdWF0ZVN0YXRlMykgXAorICAgIG1hY3JvKENvbW1hTm9kZUV2YWx1YXRlU3RhdGUpIFwK
KyAgICBtYWNybyhDb21tYU5vZGVFdmFsdWF0ZVN0YXRlMSkgXAorICAgIG1hY3JvKEFzc2lnbkV4
cHJOb2RlRXZhbHVhdGVTdGF0ZSkgXAorICAgIG1hY3JvKFZhckRlY2xOb2RlRXZhbHVhdGVTdGF0
ZSkgXAorICAgIG1hY3JvKFZhckRlY2xOb2RlRXZhbHVhdGVTdGF0ZTEpIFwKKyAgICBtYWNybyhW
YXJEZWNsTGlzdE5vZGVFdmFsdWF0ZVN0YXRlKSBcCisgICAgbWFjcm8oVmFyRGVjbExpc3ROb2Rl
RXZhbHVhdGVTdGF0ZTEpIFwKKyAgICBtYWNybyhDYXNlQ2xhdXNlTm9kZUV2YWx1YXRlU3RhdGUp
IFwKKyAgICBtYWNybyhGdW5jRXhwck5vZGVFdmFsdWF0ZVN0YXRlKQorLy8gZW5kIG9mIG1hY3Jv
CisKKyNkZWZpbmUgRVZBTFVBVEVfTUFDUk9fRk9SX0VBQ0hfRVZBTFVBVEVfTElTVF9TVEFURSht
YWNybykgXAorICAgIG1hY3JvKEFyZ3VtZW50TGlzdE5vZGVFdmFsdWF0ZUxpc3RTdGF0ZSkgXAor
ICAgIG1hY3JvKEFyZ3VtZW50TGlzdE5vZGVFdmFsdWF0ZUxpc3RTdGF0ZTEpIFwKKyAgICBtYWNy
byhBcmd1bWVudExpc3ROb2RlRXZhbHVhdGVMaXN0U3RhdGUyKSBcCisgICAgbWFjcm8oQXJndW1l
bnRzTm9kZUV2YWx1YXRlTGlzdFN0YXRlKQorLy8gZW5kIG9mIG1hY3JvCisgICAgCisjZGVmaW5l
IEVWQUxVQVRFX01BQ1JPX0ZPUl9FQUNIX0VYRUNVVEVfU1RBVEUobWFjcm8pIFwKKyAgICBtYWNy
byhTdGF0TGlzdE5vZGVFeGVjdXRlU3RhdGUpIFwKKyAgICBtYWNybyhTdGF0TGlzdE5vZGVFeGVj
dXRlU3RhdGUxKSBcCisgICAgbWFjcm8oU3RhdExpc3ROb2RlRXhlY3V0ZVN0YXRlMikgXAorICAg
IG1hY3JvKFZhclN0YXRlbWVudE5vZGVFeGVjdXRlU3RhdGUpIFwKKyAgICBtYWNybyhWYXJTdGF0
ZW1lbnROb2RlRXhlY3V0ZVN0YXRlMSkgXAorICAgIG1hY3JvKEJsb2NrTm9kZUV4ZWN1dGVTdGF0
ZSkgXAorICAgIG1hY3JvKEVtcHR5U3RhdGVtZW50Tm9kZUV4ZWN1dGVTdGF0ZSkgXAorICAgIG1h
Y3JvKEV4cHJTdGF0ZW1lbnROb2RlRXhlY3V0ZVN0YXRlKSBcCisgICAgbWFjcm8oRXhwclN0YXRl
bWVudE5vZGVFeGVjdXRlU3RhdGUxKSBcCisgICAgbWFjcm8oSWZOb2RlRXhlY3V0ZVN0YXRlKSBc
CisgICAgbWFjcm8oSWZOb2RlRXhlY3V0ZVN0YXRlMSkgXAorICAgIG1hY3JvKFdoaWxlTm9kZUV4
ZWN1dGVTdGF0ZSkgXAorICAgIG1hY3JvKFdoaWxlTm9kZUV4ZWN1dGVDb250aW51ZVN0YXRlKSBc
CisgICAgbWFjcm8oV2hpbGVOb2RlRXhlY3V0ZVRlc3RTdGF0ZSkgXAorICAgIG1hY3JvKFdoaWxl
Tm9kZUV4ZWN1dGVCb2R5U3RhdGUpIFwKKyAgICBtYWNybyhXaGlsZU5vZGVFeGVjdXRlRW5kU3Rh
dGUpIFwKKyAgICBtYWNybyhEb1doaWxlTm9kZUV4ZWN1dGVTdGF0ZSkgXAorICAgIG1hY3JvKERv
V2hpbGVOb2RlRXhlY3V0ZUNvbnRpbnVlU3RhdGUpIFwKKyAgICBtYWNybyhEb1doaWxlTm9kZUV4
ZWN1dGVUZXN0U3RhdGUpIFwKKyAgICBtYWNybyhEb1doaWxlTm9kZUV4ZWN1dGVCb2R5U3RhdGUp
IFwKKyAgICBtYWNybyhEb1doaWxlTm9kZUV4ZWN1dGVFbmRTdGF0ZSkgXAorICAgIG1hY3JvKEZv
ck5vZGVFeGVjdXRlU3RhdGUpIFwKKyAgICBtYWNybyhGb3JOb2RlRXhlY3V0ZVRlc3RTdGF0ZSkg
XAorICAgIG1hY3JvKEZvck5vZGVFeGVjdXRlQm9keVN0YXRlKSBcCisgICAgbWFjcm8oRm9yTm9k
ZUV4ZWN1dGVDb250aW51ZVN0YXRlKSBcCisgICAgbWFjcm8oRm9yTm9kZUV4ZWN1dGVQb3N0Qm9k
eVN0YXRlKSBcCisgICAgbWFjcm8oRm9yTm9kZUV4ZWN1dGVFbmRTdGF0ZSkgXAorICAgIG1hY3Jv
KEZvckluTm9kZUV4ZWN1dGVTdGF0ZSkgXAorICAgIG1hY3JvKEZvckluTm9kZUV4ZWN1dGVTdGF0
ZTIpIFwKKyAgICBtYWNybyhGb3JJbk5vZGVFeGVjdXRlU3RhdGUzKSBcCisgICAgbWFjcm8oRm9y
SW5Ob2RlUmVzb2x2ZU5vZGVFeGVjdXRlU3RhdGUpIFwKKyAgICBtYWNybyhGb3JJbk5vZGVEb3RB
Y2Nlc3Nvck5vZGVFeGVjdXRlU3RhdGUpIFwKKyAgICBtYWNybyhGb3JJbk5vZGVEb3RBY2Nlc3Nv
ck5vZGVFeGVjdXRlU3RhdGUxKSBcCisgICAgbWFjcm8oRm9ySW5Ob2RlQnJhY2tldEFjY2Vzc29y
Tm9kZUV4ZWN1dGVTdGF0ZSkgXAorICAgIG1hY3JvKEZvckluTm9kZUJyYWNrZXRBY2Nlc3Nvck5v
ZGVFeGVjdXRlU3RhdGUxKSBcCisgICAgbWFjcm8oRm9ySW5Ob2RlQnJhY2tldEFjY2Vzc29yTm9k
ZUV4ZWN1dGVTdGF0ZTIpIFwKKyAgICBtYWNybyhGb3JJbk5vZGVFeGVjdXRlQm9keVN0YXRlKSBc
CisgICAgbWFjcm8oRm9ySW5Ob2RlRXhlY3V0ZVBvcENvbnRpbnVlVW53aW5kQmFycmllclN0YXRl
KSBcCisgICAgbWFjcm8oRm9ySW5Ob2RlRXhlY3V0ZVBvcEJyZWFrVW53aW5kQmFycmllclN0YXRl
KSBcCisgICAgbWFjcm8oQ29udGludWVOb2RlRXhlY3V0ZVN0YXRlKSBcCisgICAgbWFjcm8oQnJl
YWtOb2RlRXhlY3V0ZVN0YXRlKSBcCisgICAgbWFjcm8oUmV0dXJuTm9kZUV4ZWN1dGVTdGF0ZSkg
XAorICAgIG1hY3JvKFJldHVybk5vZGVFeGVjdXRlU3RhdGUxKSBcCisgICAgbWFjcm8oV2l0aE5v
ZGVFeGVjdXRlU3RhdGUpIFwKKyAgICBtYWNybyhXaXRoTm9kZUV4ZWN1dGVTdGF0ZTEpIFwKKyAg
ICBtYWNybyhXaXRoTm9kZUV4ZWN1dGVTdGF0ZTIpIFwKKyAgICBtYWNybyhTd2l0Y2hOb2RlRXhl
Y3V0ZVN0YXRlKSBcCisgICAgbWFjcm8oU3dpdGNoTm9kZUV4ZWN1dGVTdGF0ZTEpIFwKKyAgICBt
YWNybyhTd2l0Y2hOb2RlRXhlY3V0ZVN0YXRlMikgXAorICAgIG1hY3JvKExhYmVsTm9kZUV4ZWN1
dGVTdGF0ZSkgXAorICAgIG1hY3JvKExhYmVsTm9kZUV4ZWN1dGVTdGF0ZTEpIFwKKyAgICBtYWNy
byhUaHJvd05vZGVFeGVjdXRlU3RhdGUpIFwKKyAgICBtYWNybyhUaHJvd05vZGVFeGVjdXRlU3Rh
dGUxKSBcCisgICAgbWFjcm8oVHJ5Tm9kZUV4ZWN1dGVTdGF0ZSkgXAorICAgIG1hY3JvKFRyeU5v
ZGVFeGVjdXRlRXhjZXB0aW9uVGhyb3duU3RhdGUpIFwKKyAgICBtYWNybyhUcnlOb2RlRXhlY3V0
ZVBvcFNjb3BlQWZ0ZXJDYXRjaEJsb2NrU3RhdGUpIFwKKyAgICBtYWNybyhUcnlOb2RlRXhlY3V0
ZU5vRXhjZXB0aW9uVGhyb3duU3RhdGUpIFwKKyAgICBtYWNybyhUcnlOb2RlRXhlY3V0ZVJldGhy
b3dBZnRlckZpbmFsbHlTdGF0ZSkgXAorICAgIG1hY3JvKEZ1bmNEZWNsTm9kZUV4ZWN1dGVTdGF0
ZSkgXAorICAgIG1hY3JvKFNvdXJjZUVsZW1lbnRzTm9kZUV4ZWN1dGVTdGF0ZSkgXAorICAgIG1h
Y3JvKFNvdXJjZUVsZW1lbnRzTm9kZUV4ZWN1dGVTdGF0ZTEpIFwKKyAgICBtYWNybyhDYXNlQmxv
Y2tOb2RlRXhlY3V0ZUJsb2NrV2l0aElucHV0VmFsdWUpIFwKKyAgICBtYWNybyhDYXNlQmxvY2tO
b2RlRXhlY3V0ZUJsb2NrV2l0aElucHV0VmFsdWUxKSBcCisgICAgbWFjcm8oQ2FzZUJsb2NrTm9k
ZUV4ZWN1dGVCbG9ja1dpdGhJbnB1dFZhbHVlMikgXAorICAgIG1hY3JvKENhc2VCbG9ja05vZGVF
eGVjdXRlQmxvY2tXaXRoSW5wdXRWYWx1ZTMpIFwKKyAgICBtYWNybyhDYXNlQmxvY2tOb2RlRXhl
Y3V0ZUJsb2NrV2l0aElucHV0VmFsdWU0KSBcCisgICAgbWFjcm8oQ2FzZUJsb2NrTm9kZUV4ZWN1
dGVCbG9ja1dpdGhJbnB1dFZhbHVlNSkgXAorICAgIG1hY3JvKENhc2VCbG9ja05vZGVFeGVjdXRl
QmxvY2tXaXRoSW5wdXRWYWx1ZTYpIFwKKyAgICBtYWNybyhDYXNlQmxvY2tOb2RlRXhlY3V0ZUJs
b2NrV2l0aElucHV0VmFsdWU3KSBcCisgICAgbWFjcm8oQ2FzZUJsb2NrTm9kZUV4ZWN1dGVCbG9j
a1dpdGhJbnB1dFZhbHVlOCkgXAorICAgIG1hY3JvKENhc2VCbG9ja05vZGVFeGVjdXRlQmxvY2tX
aXRoSW5wdXRWYWx1ZTkpIFwKKyAgICBtYWNybyhDYXNlQmxvY2tOb2RlRXhlY3V0ZUJsb2NrV2l0
aElucHV0VmFsdWUxMCkgXAorICAgIG1hY3JvKENhc2VCbG9ja05vZGVFeGVjdXRlQmxvY2tXaXRo
SW5wdXRWYWx1ZTExKQorLy8gZW5kIG9mIG1hY3JvCisgICAgCitlbnVtIEludGVycHJldGVyU3Rh
dGUgeworICAgIEludGVybmFsRXJyb3JTdGF0ZSwKKyAgICAKKyNkZWZpbmUgUFJJTlRfQVNfRU5V
TShuYW1lKSAgICBuYW1lLAorICAgIEVWQUxVQVRFX01BQ1JPX0ZPUl9FQUNIX0VWQUxVQVRFX1NU
QVRFKFBSSU5UX0FTX0VOVU0pCisgICAgCisgICAgRXZhbHVhdGVfRXZhbHV0ZUxpc3RfQm91bmRh
cnksCisgICAgCisgICAgRVZBTFVBVEVfTUFDUk9fRk9SX0VBQ0hfRVZBTFVBVEVfTElTVF9TVEFU
RShQUklOVF9BU19FTlVNKQorICAgIAorICAgIEV2YWx1YXRlTGlzdF9FeGVjdXRlX0JvdW5kYXJ5
LAorCisgICAgRVZBTFVBVEVfTUFDUk9fRk9SX0VBQ0hfRVhFQ1VURV9TVEFURShQUklOVF9BU19F
TlVNKQorI3VuZGVmIFBSSU5UX0FTX0VOVU0KKworICAgIExhc3RJbnRlcnByZXRlclN0YXRlCit9
OyAKKworZXh0ZXJuIGNvbnN0IGNoYXIqIG5hbWVGb3JJbnRlcnByZXRlclN0YXRlW0xhc3RJbnRl
cnByZXRlclN0YXRlKzFdOworCit9CisKKyNlbmRpZgpJbmRleDoga2pzL3JlZmVyZW5jZV9saXN0
LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0ga2pzL3JlZmVyZW5jZV9saXN0LmgJKHJldmlzaW9uIDEzNzQ1KQor
Kysga2pzL3JlZmVyZW5jZV9saXN0LmgJKHdvcmtpbmcgY29weSkKQEAgLTMxLDIwICszMSw2IEBA
IG5hbWVzcGFjZSBLSlMgewogICBjbGFzcyBSZWZlcmVuY2VMaXN0Tm9kZTsKICAgY2xhc3MgUmVm
ZXJlbmNlTGlzdEhlYWROb2RlOwogCi0gIGNsYXNzIFJlZmVyZW5jZUxpc3RJdGVyYXRvciB7Ci0g
ICAgZnJpZW5kIGNsYXNzIFJlZmVyZW5jZUxpc3Q7Ci0gIAotICBwdWJsaWM6Ci0gICAgYm9vbCBv
cGVyYXRvciE9KGNvbnN0IFJlZmVyZW5jZUxpc3RJdGVyYXRvciAmaXQpIGNvbnN0OwotICAgIGNv
bnN0IFJlZmVyZW5jZSAqb3BlcmF0b3ItPigpIGNvbnN0OwotICAgIGNvbnN0IFJlZmVyZW5jZSAm
b3BlcmF0b3IrKyhpbnQgaSk7Ci0gICAgCi0gIHByaXZhdGU6Ci0gICAgUmVmZXJlbmNlTGlzdEl0
ZXJhdG9yKFJlZmVyZW5jZUxpc3ROb2RlICpuKTsKLSAgICBSZWZlcmVuY2VMaXN0SXRlcmF0b3Io
KTsKLSAgICBSZWZlcmVuY2VMaXN0Tm9kZSAqbm9kZTsKLSAgfTsKLSAgCiAgIGNsYXNzIFJlZmVy
ZW5jZUxpc3QgewogICBwdWJsaWM6CiAgICAgUmVmZXJlbmNlTGlzdCgpOwpAQCAtNjMsNiArNDks
MjEgQEAgbmFtZXNwYWNlIEtKUyB7CiAgICAgUmVmZXJlbmNlTGlzdEhlYWROb2RlICpoZWFkOwog
ICAgIFJlZmVyZW5jZUxpc3ROb2RlICp0YWlsOwogICB9OyAKKworICBjbGFzcyBSZWZlcmVuY2VM
aXN0SXRlcmF0b3IgeworICAgICAgZnJpZW5kIGNsYXNzIFJlZmVyZW5jZUxpc3Q7CisgICAgICAK
KyAgcHVibGljOgorICAgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFJlZmVyZW5jZUxpc3RJdGVy
YXRvciAmaXQpIGNvbnN0OworICAgICAgY29uc3QgUmVmZXJlbmNlICpvcGVyYXRvci0+KCkgY29u
c3Q7CisgICAgICBjb25zdCBSZWZlcmVuY2UgJm9wZXJhdG9yKysoaW50IGkpOworICAgICAgCisg
IHByaXZhdGU6CisgICAgICBSZWZlcmVuY2VMaXN0SXRlcmF0b3IoY29uc3QgUmVmZXJlbmNlTGlz
dCYsIFJlZmVyZW5jZUxpc3ROb2RlKik7CisgICAgICBSZWZlcmVuY2VMaXN0SXRlcmF0b3IoKTsK
KyAgICAgIFJlZmVyZW5jZUxpc3QgbGlzdDsgLy8gaGFuZyBvbiB0byB0aGUgbGlzdCB0byBlbnN1
cmUgaXQncyBub3QgZGVzdHJveWVkIHdoaWxlIHdlIGl0ZXJhdGUKKyAgICAgIFJlZmVyZW5jZUxp
c3ROb2RlICpub2RlOworICB9OwogICAKIH0KIApJbmRleDoga2pzL25vZGVzLmgKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0ga2pzL25vZGVzLmgJKHJldmlzaW9uIDEzNzQ1KQorKysga2pzL25vZGVzLmgJKHdvcmtp
bmcgY29weSkKQEAgLTI1LDYgKzI1LDcgQEAKICNpZm5kZWYgTk9ERVNfSF8KICNkZWZpbmUgTk9E
RVNfSF8KIAorI2luY2x1ZGUgIkludGVycHJldGVyU3RhdGUuaCIKICNpbmNsdWRlICJQYXJzZXIu
aCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogI2luY2x1ZGUgPGt4bWxjb3JlL0xpc3RSZWZQdHIu
aD4KQEAgLTMyLDE0ICszMywxNSBAQAogCiBuYW1lc3BhY2UgS0pTIHsKIAotICBjbGFzcyBQcm9n
cmFtTm9kZTsKLSAgY2xhc3MgUHJvcGVydHlOYW1lTm9kZTsKLSAgY2xhc3MgUHJvcGVydHlMaXN0
Tm9kZTsKKyAgc3RydWN0IFByb2dyYW1Ob2RlOworICBzdHJ1Y3QgUHJvcGVydHlOYW1lTm9kZTsK
KyAgc3RydWN0IFByb3BlcnR5TGlzdE5vZGU7CisgIHN0cnVjdCBTdGF0ZW1lbnROb2RlOwogICBj
bGFzcyBSZWZlcmVuY2U7CiAgIGNsYXNzIFJlZ0V4cDsKICAgY2xhc3MgU291cmNlRWxlbWVudHNO
b2RlOwogICBjbGFzcyBTb3VyY2VTdHJlYW07Ci0KKyAgCiAgIGVudW0gT3BlcmF0b3IgeyBPcEVx
dWFsLAogCQkgIE9wRXFFcSwKIAkJICBPcE5vdEVxLApAQCAtNzEsMTIgKzczLDEwIEBAIG5hbWVz
cGFjZSBLSlMgewogCQkgIE9wSW5zdGFuY2VPZgogICB9OwogCi0gIGNsYXNzIE5vZGUgewotICBw
dWJsaWM6Ci0gICAgTm9kZSgpOworICBzdHJ1Y3QgTm9kZSB7CisgICAgZXhwbGljaXQgTm9kZShJ
bnRlcnByZXRlclN0YXRlKTsKICAgICB2aXJ0dWFsIH5Ob2RlKCk7CiAKLSAgICB2aXJ0dWFsIEpT
VmFsdWUgKmV2YWx1YXRlKEV4ZWNTdGF0ZSAqZXhlYykgPSAwOwogICAgIFVTdHJpbmcgdG9TdHJp
bmcoKSBjb25zdDsKICAgICB2aXJ0dWFsIHZvaWQgc3RyZWFtVG8oU291cmNlU3RyZWFtJikgY29u
c3QgPSAwOwogICAgIHZpcnR1YWwgdm9pZCBwcm9jZXNzVmFyRGVjbHMoRXhlY1N0YXRlKikge30K
QEAgLTg3LDIxOSArODcsMTc0IEBAIG5hbWVzcGFjZSBLSlMgewogICAgIHVuc2lnbmVkIHJlZmNv
dW50KCk7CiAgICAgc3RhdGljIHZvaWQgY2xlYXJOZXdOb2RlcygpOwogCi0gICAgdmlydHVhbCBO
b2RlICpub2RlSW5zaWRlQWxsUGFyZW5zKCk7CisgICAgSW50ZXJwcmV0ZXJTdGF0ZSBpbnRlcnBy
ZXRlclN0YXRlKCkgeyByZXR1cm4gKEludGVycHJldGVyU3RhdGUpbV9pbnRlcnByZXRlclN0YXRl
OyB9CisKKyAgICB2aXJ0dWFsIE5vZGUqIG5vZGVJbnNpZGVBbGxQYXJlbnMoKTsKIAogICAgIHZp
cnR1YWwgYm9vbCBpc0xvY2F0aW9uKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KICAgICB2aXJ0
dWFsIGJvb2wgaXNSZXNvbHZlTm9kZSgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CiAgICAgdmly
dHVhbCBib29sIGlzQnJhY2tldEFjY2Vzc29yTm9kZSgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9
CiAgICAgdmlydHVhbCBib29sIGlzRG90QWNjZXNzb3JOb2RlKCkgY29uc3QgeyByZXR1cm4gZmFs
c2U7IH0KICAgICB2aXJ0dWFsIGJvb2wgaXNHcm91cE5vZGUoKSBjb25zdCB7IHJldHVybiBmYWxz
ZTsgfQorICAgIHZpcnR1YWwgYm9vbCBpc0xhYmVsTm9kZSgpIGNvbnN0IHsgcmV0dXJuIGZhbHNl
OyB9CiAKICAgICB2aXJ0dWFsIHZvaWQgYnJlYWtDeWNsZSgpIHsgfQogCi0gIHByb3RlY3RlZDoK
LSAgICBDb21wbGV0aW9uIGNyZWF0ZUVycm9yQ29tcGxldGlvbihFeGVjU3RhdGUgKiwgRXJyb3JU
eXBlLCBjb25zdCBjaGFyICptc2cpOwotICAgIENvbXBsZXRpb24gY3JlYXRlRXJyb3JDb21wbGV0
aW9uKEV4ZWNTdGF0ZSAqLCBFcnJvclR5cGUsIGNvbnN0IGNoYXIgKm1zZywgY29uc3QgSWRlbnRp
ZmllciAmKTsKLQotICAgIEpTVmFsdWUgKnRocm93RXJyb3IoRXhlY1N0YXRlICosIEVycm9yVHlw
ZSwgY29uc3QgY2hhciAqbXNnKTsKLSAgICBKU1ZhbHVlICp0aHJvd0Vycm9yKEV4ZWNTdGF0ZSAq
LCBFcnJvclR5cGUsIGNvbnN0IGNoYXIgKm1zZywgSlNWYWx1ZSAqLCBOb2RlICopOwotICAgIEpT
VmFsdWUgKnRocm93RXJyb3IoRXhlY1N0YXRlICosIEVycm9yVHlwZSwgY29uc3QgY2hhciAqbXNn
LCBjb25zdCBJZGVudGlmaWVyICYpOwotICAgIEpTVmFsdWUgKnRocm93RXJyb3IoRXhlY1N0YXRl
ICosIEVycm9yVHlwZSwgY29uc3QgY2hhciAqbXNnLCBKU1ZhbHVlICosIGNvbnN0IElkZW50aWZp
ZXIgJik7Ci0gICAgSlNWYWx1ZSAqdGhyb3dFcnJvcihFeGVjU3RhdGUgKiwgRXJyb3JUeXBlLCBj
b25zdCBjaGFyICptc2csIEpTVmFsdWUgKiwgTm9kZSAqLCBOb2RlICopOwotICAgIEpTVmFsdWUg
KnRocm93RXJyb3IoRXhlY1N0YXRlICosIEVycm9yVHlwZSwgY29uc3QgY2hhciAqbXNnLCBKU1Zh
bHVlICosIE5vZGUgKiwgY29uc3QgSWRlbnRpZmllciAmKTsKKyAgICBDb21wbGV0aW9uIGNyZWF0
ZUVycm9yQ29tcGxldGlvbihFeGVjU3RhdGUqLCBFcnJvclR5cGUsIGNvbnN0IGNoYXIgKm1zZyk7
CisgICAgQ29tcGxldGlvbiBjcmVhdGVFcnJvckNvbXBsZXRpb24oRXhlY1N0YXRlKiwgRXJyb3JU
eXBlLCBjb25zdCBjaGFyICptc2csIGNvbnN0IElkZW50aWZpZXIgJik7CisKKyAgICBKU1ZhbHVl
ICp0aHJvd0Vycm9yKEV4ZWNTdGF0ZSosIEVycm9yVHlwZSwgY29uc3QgY2hhciAqbXNnKTsKKyAg
ICBKU1ZhbHVlICp0aHJvd0Vycm9yKEV4ZWNTdGF0ZSosIEVycm9yVHlwZSwgY29uc3QgY2hhciAq
bXNnLCBKU1ZhbHVlICosIE5vZGUgKik7CisgICAgSlNWYWx1ZSAqdGhyb3dFcnJvcihFeGVjU3Rh
dGUqLCBFcnJvclR5cGUsIGNvbnN0IGNoYXIgKm1zZywgY29uc3QgSWRlbnRpZmllciAmKTsKKyAg
ICBKU1ZhbHVlICp0aHJvd0Vycm9yKEV4ZWNTdGF0ZSosIEVycm9yVHlwZSwgY29uc3QgY2hhciAq
bXNnLCBKU1ZhbHVlICosIGNvbnN0IElkZW50aWZpZXIgJik7CisgICAgSlNWYWx1ZSAqdGhyb3dF
cnJvcihFeGVjU3RhdGUqLCBFcnJvclR5cGUsIGNvbnN0IGNoYXIgKm1zZywgSlNWYWx1ZSAqLCBO
b2RlICosIE5vZGUgKik7CisgICAgSlNWYWx1ZSAqdGhyb3dFcnJvcihFeGVjU3RhdGUqLCBFcnJv
clR5cGUsIGNvbnN0IGNoYXIgKm1zZywgSlNWYWx1ZSAqLCBOb2RlICosIGNvbnN0IElkZW50aWZp
ZXIgJik7CiAKLSAgICBKU1ZhbHVlICp0aHJvd1VuZGVmaW5lZFZhcmlhYmxlRXJyb3IoRXhlY1N0
YXRlICosIGNvbnN0IElkZW50aWZpZXIgJik7CisgICAgSlNWYWx1ZSAqdGhyb3dVbmRlZmluZWRW
YXJpYWJsZUVycm9yKEV4ZWNTdGF0ZSosIGNvbnN0IElkZW50aWZpZXIgJik7CiAKICAgICB2b2lk
IHNldEV4Y2VwdGlvbkRldGFpbHNJZk5lZWRlZChFeGVjU3RhdGUqKTsKIAotICAgIGludCBtX2xp
bmU7CisgICAgc2hvcnQgbV9saW5lOworICAgIHNob3J0IG1faW50ZXJwcmV0ZXJTdGF0ZTsKKyAg
ICAKICAgcHJpdmF0ZToKLSAgICAvLyBkaXNhbGxvdyBhc3NpZ25tZW50CisgICAgLy8gcHJvaGli
aXQgdGhlc2Ugb3BlcmF0aW9ucwogICAgIE5vZGUmIG9wZXJhdG9yPShjb25zdCBOb2RlJik7CiAg
ICAgTm9kZShjb25zdCBOb2RlICZvdGhlcik7CiAgIH07CiAKLSAgY2xhc3MgU3RhdGVtZW50Tm9k
ZSA6IHB1YmxpYyBOb2RlIHsKLSAgcHVibGljOgotICAgIFN0YXRlbWVudE5vZGUoKTsKKyAgc3Ry
dWN0IFN0YXRlbWVudE5vZGUgOiBwdWJsaWMgTm9kZSB7CisgICAgZXhwbGljaXQgU3RhdGVtZW50
Tm9kZShJbnRlcnByZXRlclN0YXRlIHN0YXRlKSA6IE5vZGUoc3RhdGUpLCBtX2xhc3RMaW5lKC0x
KSB7IG1fbGluZSA9IC0xOyB9CiAgICAgdm9pZCBzZXRMb2MoaW50IGxpbmUwLCBpbnQgbGluZTEp
OwogICAgIGludCBmaXJzdExpbmUoKSBjb25zdCB7IHJldHVybiBsaW5lTm8oKTsgfQogICAgIGlu
dCBsYXN0TGluZSgpIGNvbnN0IHsgcmV0dXJuIG1fbGFzdExpbmU7IH0KICAgICBib29sIGhpdFN0
YXRlbWVudChFeGVjU3RhdGUqKTsKLSAgICB2aXJ0dWFsIENvbXBsZXRpb24gZXhlY3V0ZShFeGVj
U3RhdGUgKmV4ZWMpID0gMDsKKwogICAgIHZvaWQgcHVzaExhYmVsKGNvbnN0IElkZW50aWZpZXIg
JmlkKSB7IGxzLnB1c2goaWQpOyB9CiAgICAgdmlydHVhbCB2b2lkIHByb2Nlc3NGdW5jRGVjbChF
eGVjU3RhdGUqKTsKLSAgcHJvdGVjdGVkOgogICAgIExhYmVsU3RhY2sgbHM7Ci0gIHByaXZhdGU6
Ci0gICAgSlNWYWx1ZSAqZXZhbHVhdGUoRXhlY1N0YXRlKikgeyByZXR1cm4ganNVbmRlZmluZWQo
KTsgfQogICAgIGludCBtX2xhc3RMaW5lOwogICB9OwogCi0gIGNsYXNzIE51bGxOb2RlIDogcHVi
bGljIE5vZGUgewotICBwdWJsaWM6Ci0gICAgTnVsbE5vZGUoKSB7fQotICAgIEpTVmFsdWUqIGV2
YWx1YXRlKEV4ZWNTdGF0ZSopOworICBzdHJ1Y3QgTnVsbE5vZGUgOiBwdWJsaWMgTm9kZSB7Cisg
ICAgTnVsbE5vZGUoKSA6IE5vZGUoTnVsbE5vZGVFdmFsdWF0ZVN0YXRlKSB7fQogICAgIHZpcnR1
YWwgdm9pZCBzdHJlYW1UbyhTb3VyY2VTdHJlYW0mKSBjb25zdDsKICAgfTsKIAotICBjbGFzcyBC
b29sZWFuTm9kZSA6IHB1YmxpYyBOb2RlIHsKLSAgcHVibGljOgotICAgIEJvb2xlYW5Ob2RlKGJv
b2wgdikgOiB2YWx1ZSh2KSB7fQotICAgIEpTVmFsdWUqIGV2YWx1YXRlKEV4ZWNTdGF0ZSopOwor
ICBzdHJ1Y3QgQm9vbGVhbk5vZGUgOiBwdWJsaWMgTm9kZSB7CisgICAgQm9vbGVhbk5vZGUoYm9v
bCB2KSA6IE5vZGUoQm9vbGVhbk5vZGVFdmFsdWF0ZVN0YXRlKSwgdmFsdWUodikge30KICAgICB2
aXJ0dWFsIHZvaWQgc3RyZWFtVG8oU291cmNlU3RyZWFtJikgY29uc3Q7Ci0gIHByaXZhdGU6CiAg
ICAgYm9vbCB2YWx1ZTsKICAgfTsKIAotICBjbGFzcyBOdW1iZXJOb2RlIDogcHVibGljIE5vZGUg
ewotICBwdWJsaWM6Ci0gICAgTnVtYmVyTm9kZShkb3VibGUgdikgOiB2YWx1ZSh2KSB7fQotICAg
IEpTVmFsdWUqIGV2YWx1YXRlKEV4ZWNTdGF0ZSopOworICBzdHJ1Y3QgTnVtYmVyTm9kZSA6IHB1
YmxpYyBOb2RlIHsKKyAgICBOdW1iZXJOb2RlKGRvdWJsZSB2KSA6IE5vZGUoTnVtYmVyTm9kZUV2
YWx1YXRlU3RhdGUpLCB2YWx1ZSh2KSB7fQogICAgIHZpcnR1YWwgdm9pZCBzdHJlYW1UbyhTb3Vy
Y2VTdHJlYW0mKSBjb25zdDsKLSAgcHJpdmF0ZToKICAgICBkb3VibGUgdmFsdWU7CiAgIH07CiAK
LSAgY2xhc3MgU3RyaW5nTm9kZSA6IHB1YmxpYyBOb2RlIHsKLSAgcHVibGljOgotICAgIFN0cmlu
Z05vZGUoY29uc3QgVVN0cmluZyAqdikgeyB2YWx1ZSA9ICp2OyB9Ci0gICAgSlNWYWx1ZSogZXZh
bHVhdGUoRXhlY1N0YXRlKik7CisgIHN0cnVjdCBTdHJpbmdOb2RlIDogcHVibGljIE5vZGUgewor
ICAgIFN0cmluZ05vZGUoY29uc3QgVVN0cmluZyAqdikgOiBOb2RlKFN0cmluZ05vZGVFdmFsdWF0
ZVN0YXRlKSB7IHZhbHVlID0gKnY7IH0KICAgICB2aXJ0dWFsIHZvaWQgc3RyZWFtVG8oU291cmNl
U3RyZWFtJikgY29uc3Q7Ci0gIHByaXZhdGU6CiAgICAgVVN0cmluZyB2YWx1ZTsKICAgfTsKIAot
ICBjbGFzcyBSZWdFeHBOb2RlIDogcHVibGljIE5vZGUgewotICBwdWJsaWM6CisgIHN0cnVjdCBS
ZWdFeHBOb2RlIDogcHVibGljIE5vZGUgewogICAgIFJlZ0V4cE5vZGUoY29uc3QgVVN0cmluZyAm
cCwgY29uc3QgVVN0cmluZyAmZikKLSAgICAgIDogcGF0dGVybihwKSwgZmxhZ3MoZikgeyB9Ci0g
ICAgSlNWYWx1ZSogZXZhbHVhdGUoRXhlY1N0YXRlKik7CisgICAgICA6IE5vZGUoUmVnRXhwTm9k
ZUV2YWx1YXRlU3RhdGUpLCBwYXR0ZXJuKHApLCBmbGFncyhmKSB7IH0KICAgICB2aXJ0dWFsIHZv
aWQgc3RyZWFtVG8oU291cmNlU3RyZWFtJikgY29uc3Q7Ci0gIHByaXZhdGU6CiAgICAgVVN0cmlu
ZyBwYXR0ZXJuLCBmbGFnczsKICAgfTsKIAotICBjbGFzcyBUaGlzTm9kZSA6IHB1YmxpYyBOb2Rl
IHsKLSAgcHVibGljOgotICAgIFRoaXNOb2RlKCkge30KLSAgICBKU1ZhbHVlKiBldmFsdWF0ZShF
eGVjU3RhdGUqKTsKKyAgc3RydWN0IFRoaXNOb2RlIDogcHVibGljIE5vZGUgeworICAgIFRoaXNO
b2RlKCkgOiBOb2RlKFRoaXNOb2RlRXZhbHVhdGVTdGF0ZSkge30KICAgICB2aXJ0dWFsIHZvaWQg
c3RyZWFtVG8oU291cmNlU3RyZWFtJikgY29uc3Q7CiAgIH07CiAKLSAgY2xhc3MgUmVzb2x2ZU5v
ZGUgOiBwdWJsaWMgTm9kZSB7Ci0gIHB1YmxpYzoKLSAgICBSZXNvbHZlTm9kZShjb25zdCBJZGVu
dGlmaWVyICZzKSA6IGlkZW50KHMpIHsgfQotICAgIEpTVmFsdWUqIGV2YWx1YXRlKEV4ZWNTdGF0
ZSopOworICBzdHJ1Y3QgUmVzb2x2ZU5vZGUgOiBwdWJsaWMgTm9kZSB7CisgICAgUmVzb2x2ZU5v
ZGUoY29uc3QgSWRlbnRpZmllciAmcykgOiBOb2RlKFJlc29sdmVOb2RlRXZhbHVhdGVTdGF0ZSks
IGlkZW50KHMpIHsgfQogICAgIHZpcnR1YWwgdm9pZCBzdHJlYW1UbyhTb3VyY2VTdHJlYW0mKSBj
b25zdDsKIAogICAgIHZpcnR1YWwgYm9vbCBpc0xvY2F0aW9uKCkgY29uc3QgeyByZXR1cm4gdHJ1
ZTsgfQogICAgIHZpcnR1YWwgYm9vbCBpc1Jlc29sdmVOb2RlKCkgY29uc3QgeyByZXR1cm4gdHJ1
ZTsgfQogICAgIGNvbnN0IElkZW50aWZpZXImIGlkZW50aWZpZXIoKSBjb25zdCB7IHJldHVybiBp
ZGVudDsgfQogCi0gIHByaXZhdGU6CiAgICAgSWRlbnRpZmllciBpZGVudDsKICAgfTsKIAotICBj
bGFzcyBHcm91cE5vZGUgOiBwdWJsaWMgTm9kZSB7Ci0gIHB1YmxpYzoKLSAgICBHcm91cE5vZGUo
Tm9kZSAqZykgOiBncm91cChnKSB7IH0KLSAgICB2aXJ0dWFsIEpTVmFsdWUqIGV2YWx1YXRlKEV4
ZWNTdGF0ZSopOworICBzdHJ1Y3QgR3JvdXBOb2RlIDogcHVibGljIE5vZGUgeworICAgIEdyb3Vw
Tm9kZShOb2RlICpnKSA6IE5vZGUoR3JvdXBOb2RlRXZhbHVhdGVTdGF0ZSksIGdyb3VwKGcpIHsg
fQogICAgIHZpcnR1YWwgTm9kZSAqbm9kZUluc2lkZUFsbFBhcmVucygpOwogICAgIHZpcnR1YWwg
dm9pZCBzdHJlYW1UbyhTb3VyY2VTdHJlYW0mKSBjb25zdDsKICAgICB2aXJ0dWFsIGJvb2wgaXNH
cm91cE5vZGUoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0gIHByaXZhdGU6CiAgICAgUmVmUHRy
PE5vZGU+IGdyb3VwOwogICB9OwogCi0gIGNsYXNzIEVsZW1lbnROb2RlIDogcHVibGljIE5vZGUg
ewotICBwdWJsaWM6CisgIHN0cnVjdCBFbGVtZW50Tm9kZSA6IHB1YmxpYyBOb2RlIHsKICAgICAv
LyBsaXN0IHBvaW50ZXIgaXMgdGFpbCBvZiBhIGNpcmN1bGFyIGxpc3QsIGNyYWNrZWQgaW4gdGhl
IEFycmF5Tm9kZSBjdG9yCi0gICAgRWxlbWVudE5vZGUoaW50IGUsIE5vZGUgKm4pIDogbmV4dCh0
aGlzKSwgZWxpc2lvbihlKSwgbm9kZShuKSB7IFBhcnNlcjo6bm90ZU5vZGVDeWNsZSh0aGlzKTsg
fQorICAgIEVsZW1lbnROb2RlKGludCBlLCBOb2RlICpuKSA6IE5vZGUoRWxlbWVudE5vZGVFdmFs
dWF0ZVN0YXRlKSwgbmV4dCh0aGlzKSwgZWxpc2lvbihlKSwgbm9kZShuKSB7IFBhcnNlcjo6bm90
ZU5vZGVDeWNsZSh0aGlzKTsgfQogICAgIEVsZW1lbnROb2RlKEVsZW1lbnROb2RlICpsLCBpbnQg
ZSwgTm9kZSAqbikKLSAgICAgIDogbmV4dChsLT5uZXh0KSwgZWxpc2lvbihlKSwgbm9kZShuKSB7
IGwtPm5leHQgPSB0aGlzOyB9Ci0gICAgSlNWYWx1ZSogZXZhbHVhdGUoRXhlY1N0YXRlKik7Cisg
ICAgICA6IE5vZGUoRWxlbWVudE5vZGVFdmFsdWF0ZVN0YXRlKSwgbmV4dChsLT5uZXh0KSwgZWxp
c2lvbihlKSwgbm9kZShuKSB7IGwtPm5leHQgPSB0aGlzOyB9CiAgICAgdmlydHVhbCB2b2lkIHN0
cmVhbVRvKFNvdXJjZVN0cmVhbSYpIGNvbnN0OwogICAgIFBhc3NSZWZQdHI8RWxlbWVudE5vZGU+
IHJlbGVhc2VOZXh0KCkgeyByZXR1cm4gbmV4dC5yZWxlYXNlKCk7IH0KICAgICB2aXJ0dWFsIHZv
aWQgYnJlYWtDeWNsZSgpOwotICBwcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBBcnJheU5vZGU7
CiAgICAgTGlzdFJlZlB0cjxFbGVtZW50Tm9kZT4gbmV4dDsKICAgICBpbnQgZWxpc2lvbjsKICAg
ICBSZWZQdHI8Tm9kZT4gbm9kZTsKICAgfTsKIAotICBjbGFzcyBBcnJheU5vZGUgOiBwdWJsaWMg
Tm9kZSB7Ci0gIHB1YmxpYzoKLSAgICBBcnJheU5vZGUoaW50IGUpIDogZWxpc2lvbihlKSwgb3B0
KHRydWUpIHsgfQotICAgIEFycmF5Tm9kZShFbGVtZW50Tm9kZSAqZWxlKQotICAgICAgOiBlbGVt
ZW50KGVsZS0+bmV4dCksIGVsaXNpb24oMCksIG9wdChmYWxzZSkgeyBQYXJzZXI6OnJlbW92ZU5v
ZGVDeWNsZShlbGVtZW50LmdldCgpKTsgZWxlLT5uZXh0ID0gMDsgfQotICAgIEFycmF5Tm9kZShp
bnQgZWxpLCBFbGVtZW50Tm9kZSAqZWxlKQotICAgICAgOiBlbGVtZW50KGVsZS0+bmV4dCksIGVs
aXNpb24oZWxpKSwgb3B0KHRydWUpIHsgUGFyc2VyOjpyZW1vdmVOb2RlQ3ljbGUoZWxlbWVudC5n
ZXQoKSk7IGVsZS0+bmV4dCA9IDA7IH0KLSAgICBKU1ZhbHVlKiBldmFsdWF0ZShFeGVjU3RhdGUq
KTsKKyAgc3RydWN0IEFycmF5Tm9kZSA6IHB1YmxpYyBOb2RlIHsKKyAgICBBcnJheU5vZGUoaW50
IGUpIDogTm9kZShBcnJheU5vZGVFdmFsdWF0ZVN0YXRlKSwgZWxpc2lvbihlKSwgb3B0KHRydWUp
IHsgfQorICAgIEFycmF5Tm9kZShFbGVtZW50Tm9kZSogZWxlKQorICAgICAgOiBOb2RlKEFycmF5
Tm9kZUV2YWx1YXRlU3RhdGUpLCBlbGVtZW50KGVsZS0+bmV4dC5yZWxlYXNlKCkpLCBlbGlzaW9u
KDApLCBvcHQoZmFsc2UpIHsgUGFyc2VyOjpyZW1vdmVOb2RlQ3ljbGUoZWxlbWVudC5nZXQoKSk7
IH0KKyAgICBBcnJheU5vZGUoaW50IGVsaSwgRWxlbWVudE5vZGUqIGVsZSkKKyAgICAgIDogTm9k
ZShBcnJheU5vZGVFdmFsdWF0ZVN0YXRlKSwgZWxlbWVudChlbGUtPm5leHQucmVsZWFzZSgpKSwg
ZWxpc2lvbihlbGkpLCBvcHQodHJ1ZSkgeyBQYXJzZXI6OnJlbW92ZU5vZGVDeWNsZShlbGVtZW50
LmdldCgpKTsgfQogICAgIHZpcnR1YWwgdm9pZCBzdHJlYW1UbyhTb3VyY2VTdHJlYW0mKSBjb25z
dDsKLSAgcHJpdmF0ZToKICAgICBSZWZQdHI8RWxlbWVudE5vZGU+IGVsZW1lbnQ7CiAgICAgaW50
IGVsaXNpb247CiAgICAgYm9vbCBvcHQ7CiAgIH07CiAKLSAgY2xhc3MgUHJvcGVydHlOYW1lTm9k
ZSA6IHB1YmxpYyBOb2RlIHsKLSAgcHVibGljOgotICAgIFByb3BlcnR5TmFtZU5vZGUoZG91Ymxl
IGQpIDogbnVtZXJpYyhkKSB7IH0KLSAgICBQcm9wZXJ0eU5hbWVOb2RlKGNvbnN0IElkZW50aWZp
ZXIgJnMpIDogc3RyKHMpIHsgfQotICAgIEpTVmFsdWUqIGV2YWx1YXRlKEV4ZWNTdGF0ZSopOwor
ICBzdHJ1Y3QgUHJvcGVydHlOYW1lTm9kZSA6IHB1YmxpYyBOb2RlIHsKKyAgICBQcm9wZXJ0eU5h
bWVOb2RlKGRvdWJsZSBkKSA6IE5vZGUoUHJvcGVydHlOYW1lTm9kZUV2YWx1YXRlU3RhdGUpLCBu
dW1lcmljKGQpIHsgfQorICAgIFByb3BlcnR5TmFtZU5vZGUoY29uc3QgSWRlbnRpZmllciAmcykg
OiBOb2RlKFByb3BlcnR5TmFtZU5vZGVFdmFsdWF0ZVN0YXRlKSwgc3RyKHMpIHsgfQogICAgIHZp
cnR1YWwgdm9pZCBzdHJlYW1UbyhTb3VyY2VTdHJlYW0mKSBjb25zdDsKLSAgcHJpdmF0ZToKICAg
ICBkb3VibGUgbnVtZXJpYzsKICAgICBJZGVudGlmaWVyIHN0cjsKICAgfTsKICAgCi0gIGNsYXNz
IFByb3BlcnR5Tm9kZSA6IHB1YmxpYyBOb2RlIHsKLSAgcHVibGljOgorICBzdHJ1Y3QgUHJvcGVy
dHlOb2RlIDogcHVibGljIE5vZGUgewogICAgIGVudW0gVHlwZSB7IENvbnN0YW50LCBHZXR0ZXIs
IFNldHRlciB9OwogICAgIFByb3BlcnR5Tm9kZShQcm9wZXJ0eU5hbWVOb2RlICpuLCBOb2RlICph
LCBUeXBlIHQpIAotICAgICAgOiBuYW1lKG4pLCBhc3NpZ24oYSksIHR5cGUodCkgeyB9Ci0gICAg
SlNWYWx1ZSogZXZhbHVhdGUoRXhlY1N0YXRlKik7CisgICAgICA6IE5vZGUoSW50ZXJuYWxFcnJv
clN0YXRlKSwgbmFtZShuKSwgYXNzaWduKGEpLCB0eXBlKHQpIHsgfQogICAgIHZpcnR1YWwgdm9p
ZCBzdHJlYW1UbyhTb3VyY2VTdHJlYW0mKSBjb25zdDsKLSAgICBmcmllbmQgY2xhc3MgUHJvcGVy
dHlMaXN0Tm9kZTsKLSAgcHJpdmF0ZToKICAgICBSZWZQdHI8UHJvcGVydHlOYW1lTm9kZT4gbmFt
ZTsKICAgICBSZWZQdHI8Tm9kZT4gYXNzaWduOwogICAgIFR5cGUgdHlwZTsKICAgfTsKICAgCi0g
IGNsYXNzIFByb3BlcnR5TGlzdE5vZGUgOiBwdWJsaWMgTm9kZSB7Ci0gIHB1YmxpYzoKKyAgc3Ry
dWN0IFByb3BlcnR5TGlzdE5vZGUgOiBwdWJsaWMgTm9kZSB7CiAgICAgLy8gbGlzdCBwb2ludGVy
IGlzIHRhaWwgb2YgYSBjaXJjdWxhciBsaXN0LCBjcmFja2VkIGluIHRoZSBPYmplY3RMaXRlcmFs
Tm9kZSBjdG9yCiAgICAgUHJvcGVydHlMaXN0Tm9kZShQcm9wZXJ0eU5vZGUgKm4pCi0gICAgICA6
IG5vZGUobiksIG5leHQodGhpcykgeyBQYXJzZXI6Om5vdGVOb2RlQ3ljbGUodGhpcyk7IH0KKyAg
ICAgIDogTm9kZShQcm9wZXJ0eUxpc3ROb2RlRXZhbHVhdGVTdGF0ZSksIG5vZGUobiksIG5leHQo
dGhpcykgeyBQYXJzZXI6Om5vdGVOb2RlQ3ljbGUodGhpcyk7IH0KICAgICBQcm9wZXJ0eUxpc3RO
b2RlKFByb3BlcnR5Tm9kZSAqbiwgUHJvcGVydHlMaXN0Tm9kZSAqbCkKLSAgICAgIDogbm9kZShu
KSwgbmV4dChsLT5uZXh0KSB7IGwtPm5leHQgPSB0aGlzOyB9Ci0gICAgSlNWYWx1ZSogZXZhbHVh
dGUoRXhlY1N0YXRlKik7CisgICAgICA6IE5vZGUoUHJvcGVydHlMaXN0Tm9kZUV2YWx1YXRlU3Rh
dGUpLCBub2RlKG4pLCBuZXh0KGwtPm5leHQpIHsgbC0+bmV4dCA9IHRoaXM7IH0KICAgICB2aXJ0
dWFsIHZvaWQgc3RyZWFtVG8oU291cmNlU3RyZWFtJikgY29uc3Q7CiAgICAgUGFzc1JlZlB0cjxQ
cm9wZXJ0eUxpc3ROb2RlPiByZWxlYXNlTmV4dCgpIHsgcmV0dXJuIG5leHQucmVsZWFzZSgpOyB9
CiAgICAgdmlydHVhbCB2b2lkIGJyZWFrQ3ljbGUoKTsKLSAgcHJpdmF0ZToKLSAgICBmcmllbmQg
Y2xhc3MgT2JqZWN0TGl0ZXJhbE5vZGU7CiAgICAgUmVmUHRyPFByb3BlcnR5Tm9kZT4gbm9kZTsK
ICAgICBMaXN0UmVmUHRyPFByb3BlcnR5TGlzdE5vZGU+IG5leHQ7CiAgIH07CiAKLSAgY2xhc3Mg
T2JqZWN0TGl0ZXJhbE5vZGUgOiBwdWJsaWMgTm9kZSB7Ci0gIHB1YmxpYzoKLSAgICBPYmplY3RM
aXRlcmFsTm9kZSgpIHsgfQotICAgIE9iamVjdExpdGVyYWxOb2RlKFByb3BlcnR5TGlzdE5vZGUg
KmwpIDogbGlzdChsLT5uZXh0KSB7IFBhcnNlcjo6cmVtb3ZlTm9kZUN5Y2xlKGxpc3QuZ2V0KCkp
OyBsLT5uZXh0ID0gMDsgfQotICAgIEpTVmFsdWUqIGV2YWx1YXRlKEV4ZWNTdGF0ZSopOworICBz
dHJ1Y3QgT2JqZWN0TGl0ZXJhbE5vZGUgOiBwdWJsaWMgTm9kZSB7CisgICAgT2JqZWN0TGl0ZXJh
bE5vZGUoKSA6IE5vZGUoT2JqZWN0TGl0ZXJhbE5vZGVFdmFsdWF0ZVN0YXRlKSB7IH0KKyAgICBP
YmplY3RMaXRlcmFsTm9kZShQcm9wZXJ0eUxpc3ROb2RlICpsKSA6IE5vZGUoT2JqZWN0TGl0ZXJh
bE5vZGVFdmFsdWF0ZVN0YXRlKSwgbGlzdChsLT5uZXh0LnJlbGVhc2UoKSkgeyBQYXJzZXI6OnJl
bW92ZU5vZGVDeWNsZShsaXN0LmdldCgpKTsgfQogICAgIHZpcnR1YWwgdm9pZCBzdHJlYW1UbyhT
b3VyY2VTdHJlYW0mKSBjb25zdDsKLSAgcHJpdmF0ZToKICAgICBSZWZQdHI8UHJvcGVydHlMaXN0
Tm9kZT4gbGlzdDsKICAgfTsKIAotICBjbGFzcyBCcmFja2V0QWNjZXNzb3JOb2RlIDogcHVibGlj
IE5vZGUgewotICBwdWJsaWM6Ci0gICAgQnJhY2tldEFjY2Vzc29yTm9kZShOb2RlICplMSwgTm9k
ZSAqZTIpIDogZXhwcjEoZTEpLCBleHByMihlMikge30KLSAgICBKU1ZhbHVlKiBldmFsdWF0ZShF
eGVjU3RhdGUqKTsKKyAgc3RydWN0IEJyYWNrZXRBY2Nlc3Nvck5vZGUgOiBwdWJsaWMgTm9kZSB7
CisgICAgQnJhY2tldEFjY2Vzc29yTm9kZShOb2RlKiBlMSwgTm9kZSogZTIpIDogTm9kZShCcmFj
a2V0QWNjZXNzb3JOb2RlRXZhbHVhdGVTdGF0ZSksIGV4cHIxKGUxKSwgZXhwcjIoZTIpIHt9CiAg
ICAgdmlydHVhbCB2b2lkIHN0cmVhbVRvKFNvdXJjZVN0cmVhbSYpIGNvbnN0OwogCiAgICAgdmly
dHVhbCBib29sIGlzTG9jYXRpb24oKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CkBAIC0zMDcsMTUg
KzI2MiwxMiBAQCBuYW1lc3BhY2UgS0pTIHsKICAgICBOb2RlICpiYXNlKCkgeyByZXR1cm4gZXhw
cjEuZ2V0KCk7IH0KICAgICBOb2RlICpzdWJzY3JpcHQoKSB7IHJldHVybiBleHByMi5nZXQoKTsg
fQogCi0gIHByaXZhdGU6CiAgICAgUmVmUHRyPE5vZGU+IGV4cHIxOwogICAgIFJlZlB0cjxOb2Rl
PiBleHByMjsKICAgfTsKIAotICBjbGFzcyBEb3RBY2Nlc3Nvck5vZGUgOiBwdWJsaWMgTm9kZSB7
Ci0gIHB1YmxpYzoKLSAgICBEb3RBY2Nlc3Nvck5vZGUoTm9kZSAqZSwgY29uc3QgSWRlbnRpZmll
ciAmcykgOiBleHByKGUpLCBpZGVudChzKSB7IH0KLSAgICBKU1ZhbHVlKiBldmFsdWF0ZShFeGVj
U3RhdGUqKTsKKyAgc3RydWN0IERvdEFjY2Vzc29yTm9kZSA6IHB1YmxpYyBOb2RlIHsKKyAgICBE
b3RBY2Nlc3Nvck5vZGUoTm9kZSogZSwgY29uc3QgSWRlbnRpZmllciAmcykgOiBOb2RlKERvdEFj
Y2Vzc29yTm9kZUV2YWx1YXRlU3RhdGUpLCBleHByKGUpLCBpZGVudChzKSB7IH0KICAgICB2aXJ0
dWFsIHZvaWQgc3RyZWFtVG8oU291cmNlU3RyZWFtJikgY29uc3Q7CiAKICAgICB2aXJ0dWFsIGJv
b2wgaXNMb2NhdGlvbigpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KQEAgLTMyMywzMzUgKzI3NSwy
MzkgQEAgbmFtZXNwYWNlIEtKUyB7CiAgICAgTm9kZSAqYmFzZSgpIGNvbnN0IHsgcmV0dXJuIGV4
cHIuZ2V0KCk7IH0KICAgICBjb25zdCBJZGVudGlmaWVyJiBpZGVudGlmaWVyKCkgY29uc3QgeyBy
ZXR1cm4gaWRlbnQ7IH0KIAotICBwcml2YXRlOgogICAgIFJlZlB0cjxOb2RlPiBleHByOwogICAg
IElkZW50aWZpZXIgaWRlbnQ7CiAgIH07CiAKLSAgY2xhc3MgQXJndW1lbnRMaXN0Tm9kZSA6IHB1
YmxpYyBOb2RlIHsKLSAgcHVibGljOgorICBzdHJ1Y3QgQXJndW1lbnRMaXN0Tm9kZSA6IHB1Ymxp
YyBOb2RlIHsKICAgICAvLyBsaXN0IHBvaW50ZXIgaXMgdGFpbCBvZiBhIGNpcmN1bGFyIGxpc3Qs
IGNyYWNrZWQgaW4gdGhlIEFyZ3VtZW50c05vZGUgY3RvcgotICAgIEFyZ3VtZW50TGlzdE5vZGUo
Tm9kZSAqZSkgOiBuZXh0KHRoaXMpLCBleHByKGUpIHsgUGFyc2VyOjpub3RlTm9kZUN5Y2xlKHRo
aXMpOyB9Ci0gICAgQXJndW1lbnRMaXN0Tm9kZShBcmd1bWVudExpc3ROb2RlICpsLCBOb2RlICpl
KQotICAgICAgOiBuZXh0KGwtPm5leHQpLCBleHByKGUpIHsgbC0+bmV4dCA9IHRoaXM7IH0KLSAg
ICBKU1ZhbHVlKiBldmFsdWF0ZShFeGVjU3RhdGUqKTsKLSAgICBMaXN0IGV2YWx1YXRlTGlzdChF
eGVjU3RhdGUqKTsKKyAgICBBcmd1bWVudExpc3ROb2RlKE5vZGUqIGUpIDogTm9kZShBcmd1bWVu
dExpc3ROb2RlRXZhbHVhdGVMaXN0U3RhdGUpLCBuZXh0KHRoaXMpLCBleHByKGUpIHsgUGFyc2Vy
Ojpub3RlTm9kZUN5Y2xlKHRoaXMpOyB9CisgICAgQXJndW1lbnRMaXN0Tm9kZShBcmd1bWVudExp
c3ROb2RlICpsLCBOb2RlKiBlKQorICAgICAgOiBOb2RlKEFyZ3VtZW50TGlzdE5vZGVFdmFsdWF0
ZUxpc3RTdGF0ZSksIG5leHQobC0+bmV4dCksIGV4cHIoZSkgeyBsLT5uZXh0ID0gdGhpczsgfQog
ICAgIHZpcnR1YWwgdm9pZCBzdHJlYW1UbyhTb3VyY2VTdHJlYW0mKSBjb25zdDsKICAgICBQYXNz
UmVmUHRyPEFyZ3VtZW50TGlzdE5vZGU+IHJlbGVhc2VOZXh0KCkgeyByZXR1cm4gbmV4dC5yZWxl
YXNlKCk7IH0KICAgICB2aXJ0dWFsIHZvaWQgYnJlYWtDeWNsZSgpOwotICBwcml2YXRlOgotICAg
IGZyaWVuZCBjbGFzcyBBcmd1bWVudHNOb2RlOwogICAgIExpc3RSZWZQdHI8QXJndW1lbnRMaXN0
Tm9kZT4gbmV4dDsKICAgICBSZWZQdHI8Tm9kZT4gZXhwcjsKICAgfTsKIAotICBjbGFzcyBBcmd1
bWVudHNOb2RlIDogcHVibGljIE5vZGUgewotICBwdWJsaWM6Ci0gICAgQXJndW1lbnRzTm9kZSgp
IHsgfQorICBzdHJ1Y3QgQXJndW1lbnRzTm9kZSA6IHB1YmxpYyBOb2RlIHsKKyAgICBBcmd1bWVu
dHNOb2RlKCkgOiBOb2RlKEFyZ3VtZW50c05vZGVFdmFsdWF0ZUxpc3RTdGF0ZSkgeyB9CiAgICAg
QXJndW1lbnRzTm9kZShBcmd1bWVudExpc3ROb2RlICpsKQotICAgICAgOiBsaXN0KGwtPm5leHQp
IHsgUGFyc2VyOjpyZW1vdmVOb2RlQ3ljbGUobGlzdC5nZXQoKSk7IGwtPm5leHQgPSAwOyB9Ci0g
ICAgSlNWYWx1ZSogZXZhbHVhdGUoRXhlY1N0YXRlKik7Ci0gICAgTGlzdCBldmFsdWF0ZUxpc3Qo
RXhlY1N0YXRlICpleGVjKSB7IHJldHVybiBsaXN0ID8gbGlzdC0+ZXZhbHVhdGVMaXN0KGV4ZWMp
IDogTGlzdCgpOyB9CisgICAgICA6IE5vZGUoQXJndW1lbnRzTm9kZUV2YWx1YXRlTGlzdFN0YXRl
KSwgbGlzdChsLT5uZXh0LnJlbGVhc2UoKSkgeyBQYXJzZXI6OnJlbW92ZU5vZGVDeWNsZShsaXN0
LmdldCgpKTsgfQogICAgIHZpcnR1YWwgdm9pZCBzdHJlYW1UbyhTb3VyY2VTdHJlYW0mKSBjb25z
dDsKLSAgcHJpdmF0ZToKICAgICBSZWZQdHI8QXJndW1lbnRMaXN0Tm9kZT4gbGlzdDsKICAgfTsK
IAotICBjbGFzcyBOZXdFeHByTm9kZSA6IHB1YmxpYyBOb2RlIHsKLSAgcHVibGljOgotICAgIE5l
d0V4cHJOb2RlKE5vZGUgKmUpIDogZXhwcihlKSB7fQotICAgIE5ld0V4cHJOb2RlKE5vZGUgKmUs
IEFyZ3VtZW50c05vZGUgKmEpIDogZXhwcihlKSwgYXJncyhhKSB7fQotICAgIEpTVmFsdWUqIGV2
YWx1YXRlKEV4ZWNTdGF0ZSopOworICBzdHJ1Y3QgTmV3RXhwck5vZGUgOiBwdWJsaWMgTm9kZSB7
CisgICAgTmV3RXhwck5vZGUoTm9kZSogZSkgOiBOb2RlKE5ld0V4cHJOb2RlRXZhbHVhdGVTdGF0
ZSksIGV4cHIoZSkge30KKyAgICBOZXdFeHByTm9kZShOb2RlKiBlLCBBcmd1bWVudHNOb2RlICph
KSA6IE5vZGUoTmV3RXhwck5vZGVFdmFsdWF0ZVN0YXRlKSwgZXhwcihlKSwgYXJncyhhKSB7fQog
ICAgIHZpcnR1YWwgdm9pZCBzdHJlYW1UbyhTb3VyY2VTdHJlYW0mKSBjb25zdDsKLSAgcHJpdmF0
ZToKICAgICBSZWZQdHI8Tm9kZT4gZXhwcjsKICAgICBSZWZQdHI8QXJndW1lbnRzTm9kZT4gYXJn
czsKICAgfTsKIAotICBjbGFzcyBGdW5jdGlvbkNhbGxWYWx1ZU5vZGUgOiBwdWJsaWMgTm9kZSB7
Ci0gIHB1YmxpYzoKLSAgICBGdW5jdGlvbkNhbGxWYWx1ZU5vZGUoTm9kZSAqZSwgQXJndW1lbnRz
Tm9kZSAqYSkgOiBleHByKGUpLCBhcmdzKGEpIHt9Ci0gICAgSlNWYWx1ZSogZXZhbHVhdGUoRXhl
Y1N0YXRlKik7CisgIHN0cnVjdCBGdW5jdGlvbkNhbGxWYWx1ZU5vZGUgOiBwdWJsaWMgTm9kZSB7
CisgICAgRnVuY3Rpb25DYWxsVmFsdWVOb2RlKE5vZGUqIGUsIEFyZ3VtZW50c05vZGUgKmEpIDog
Tm9kZShGdW5jdGlvbkNhbGxWYWx1ZU5vZGVFdmFsdWF0ZVN0YXRlKSwgZXhwcihlKSwgYXJncyhh
KSB7fQogICAgIHZpcnR1YWwgdm9pZCBzdHJlYW1UbyhTb3VyY2VTdHJlYW0mKSBjb25zdDsKLSAg
cHJpdmF0ZToKICAgICBSZWZQdHI8Tm9kZT4gZXhwcjsKICAgICBSZWZQdHI8QXJndW1lbnRzTm9k
ZT4gYXJnczsKICAgfTsKIAotICBjbGFzcyBGdW5jdGlvbkNhbGxSZXNvbHZlTm9kZSA6IHB1Ymxp
YyBOb2RlIHsKLSAgcHVibGljOgotICAgIEZ1bmN0aW9uQ2FsbFJlc29sdmVOb2RlKGNvbnN0IElk
ZW50aWZpZXImIGksIEFyZ3VtZW50c05vZGUgKmEpIDogaWRlbnQoaSksIGFyZ3MoYSkge30KLSAg
ICBKU1ZhbHVlKiBldmFsdWF0ZShFeGVjU3RhdGUqKTsKKyAgc3RydWN0IEZ1bmN0aW9uQ2FsbFJl
c29sdmVOb2RlIDogcHVibGljIE5vZGUgeworICAgIEZ1bmN0aW9uQ2FsbFJlc29sdmVOb2RlKGNv
bnN0IElkZW50aWZpZXImIGksIEFyZ3VtZW50c05vZGUgKmEpIDogTm9kZShGdW5jdGlvbkNhbGxS
ZXNvbHZlTm9kZUV2YWx1YXRlU3RhdGUpLCBpZGVudChpKSwgYXJncyhhKSB7fQogICAgIHZpcnR1
YWwgdm9pZCBzdHJlYW1UbyhTb3VyY2VTdHJlYW0mKSBjb25zdDsKLSAgcHJpdmF0ZToKICAgICBJ
ZGVudGlmaWVyIGlkZW50OwogICAgIFJlZlB0cjxBcmd1bWVudHNOb2RlPiBhcmdzOwogICB9Owog
Ci0gIGNsYXNzIEZ1bmN0aW9uQ2FsbEJyYWNrZXROb2RlIDogcHVibGljIE5vZGUgewotICBwdWJs
aWM6Ci0gICAgRnVuY3Rpb25DYWxsQnJhY2tldE5vZGUoTm9kZSAqYiwgTm9kZSAqcywgQXJndW1l
bnRzTm9kZSAqYSkgOiBiYXNlKGIpLCBzdWJzY3JpcHQocyksIGFyZ3MoYSkge30KLSAgICBKU1Zh
bHVlKiBldmFsdWF0ZShFeGVjU3RhdGUqKTsKKyAgc3RydWN0IEZ1bmN0aW9uQ2FsbEJyYWNrZXRO
b2RlIDogcHVibGljIE5vZGUgeworICAgIEZ1bmN0aW9uQ2FsbEJyYWNrZXROb2RlKE5vZGUgKmIs
IE5vZGUgKnMsIEFyZ3VtZW50c05vZGUgKmEpIDogTm9kZShGdW5jdGlvbkNhbGxCcmFja2V0Tm9k
ZUV2YWx1YXRlU3RhdGUpLCBiYXNlKGIpLCBzdWJzY3JpcHQocyksIGFyZ3MoYSkge30KICAgICB2
aXJ0dWFsIHZvaWQgc3RyZWFtVG8oU291cmNlU3RyZWFtJikgY29uc3Q7Ci0gIHByb3RlY3RlZDoK
ICAgICBSZWZQdHI8Tm9kZT4gYmFzZTsKICAgICBSZWZQdHI8Tm9kZT4gc3Vic2NyaXB0OwogICAg
IFJlZlB0cjxBcmd1bWVudHNOb2RlPiBhcmdzOwogICB9OwogCi0gIGNsYXNzIEZ1bmN0aW9uQ2Fs
bFBhcmVuQnJhY2tldE5vZGUgOiBwdWJsaWMgRnVuY3Rpb25DYWxsQnJhY2tldE5vZGUgewotICBw
dWJsaWM6CisgIHN0cnVjdCBGdW5jdGlvbkNhbGxQYXJlbkJyYWNrZXROb2RlIDogcHVibGljIEZ1
bmN0aW9uQ2FsbEJyYWNrZXROb2RlIHsKICAgICBGdW5jdGlvbkNhbGxQYXJlbkJyYWNrZXROb2Rl
KE5vZGUgKmIsIE5vZGUgKnMsIEFyZ3VtZW50c05vZGUgKmEpIDogRnVuY3Rpb25DYWxsQnJhY2tl
dE5vZGUoYiwgcywgYSkge30KICAgICB2aXJ0dWFsIHZvaWQgc3RyZWFtVG8oU291cmNlU3RyZWFt
JikgY29uc3Q7CiAgIH07CiAKLSAgY2xhc3MgRnVuY3Rpb25DYWxsRG90Tm9kZSA6IHB1YmxpYyBO
b2RlIHsKLSAgcHVibGljOgotICAgIEZ1bmN0aW9uQ2FsbERvdE5vZGUoTm9kZSAqYiwgY29uc3Qg
SWRlbnRpZmllciAmaSwgQXJndW1lbnRzTm9kZSAqYSkgOiBiYXNlKGIpLCBpZGVudChpKSwgYXJn
cyhhKSB7fQotICAgIEpTVmFsdWUqIGV2YWx1YXRlKEV4ZWNTdGF0ZSopOworICBzdHJ1Y3QgRnVu
Y3Rpb25DYWxsRG90Tm9kZSA6IHB1YmxpYyBOb2RlIHsKKyAgICBGdW5jdGlvbkNhbGxEb3ROb2Rl
KE5vZGUgKmIsIGNvbnN0IElkZW50aWZpZXIgJmksIEFyZ3VtZW50c05vZGUgKmEpIDogTm9kZShG
dW5jdGlvbkNhbGxEb3ROb2RlRXZhbHVhdGVTdGF0ZSksIGJhc2UoYiksIGlkZW50KGkpLCBhcmdz
KGEpIHt9CiAgICAgdmlydHVhbCB2b2lkIHN0cmVhbVRvKFNvdXJjZVN0cmVhbSYpIGNvbnN0Owot
ICBwcm90ZWN0ZWQ6CiAgICAgUmVmUHRyPE5vZGU+IGJhc2U7CiAgICAgSWRlbnRpZmllciBpZGVu
dDsKICAgICBSZWZQdHI8QXJndW1lbnRzTm9kZT4gYXJnczsKICAgfTsKIAotICBjbGFzcyBGdW5j
dGlvbkNhbGxQYXJlbkRvdE5vZGUgOiBwdWJsaWMgRnVuY3Rpb25DYWxsRG90Tm9kZSB7Ci0gIHB1
YmxpYzoKKyAgc3RydWN0IEZ1bmN0aW9uQ2FsbFBhcmVuRG90Tm9kZSA6IHB1YmxpYyBGdW5jdGlv
bkNhbGxEb3ROb2RlIHsKICAgICBGdW5jdGlvbkNhbGxQYXJlbkRvdE5vZGUoTm9kZSAqYiwgY29u
c3QgSWRlbnRpZmllciAmaSwgQXJndW1lbnRzTm9kZSAqYSkgOiBGdW5jdGlvbkNhbGxEb3ROb2Rl
KGIsIGksIGEpIHt9CiAgICAgdmlydHVhbCB2b2lkIHN0cmVhbVRvKFNvdXJjZVN0cmVhbSYpIGNv
bnN0OwogICB9OwogCi0gIGNsYXNzIFBvc3RmaXhSZXNvbHZlTm9kZSA6IHB1YmxpYyBOb2RlIHsK
LSAgcHVibGljOgotICAgIFBvc3RmaXhSZXNvbHZlTm9kZShjb25zdCBJZGVudGlmaWVyJiBpLCBP
cGVyYXRvciBvKSA6IG1faWRlbnQoaSksIG1fb3BlcihvKSB7fQotICAgIEpTVmFsdWUqIGV2YWx1
YXRlKEV4ZWNTdGF0ZSopOworICBzdHJ1Y3QgUG9zdGZpeFJlc29sdmVOb2RlIDogcHVibGljIE5v
ZGUgeworICAgIFBvc3RmaXhSZXNvbHZlTm9kZShjb25zdCBJZGVudGlmaWVyJiBpLCBPcGVyYXRv
ciBvKSA6IE5vZGUoUG9zdGZpeFJlc29sdmVOb2RlRXZhbHVhdGVTdGF0ZSksIG1faWRlbnQoaSks
IG1fb3BlcihvKSB7fQogICAgIHZpcnR1YWwgdm9pZCBzdHJlYW1UbyhTb3VyY2VTdHJlYW0mKSBj
b25zdDsKLSAgcHJpdmF0ZToKICAgICBJZGVudGlmaWVyIG1faWRlbnQ7CiAgICAgT3BlcmF0b3Ig
bV9vcGVyOwogICB9OwogCi0gIGNsYXNzIFBvc3RmaXhCcmFja2V0Tm9kZSA6IHB1YmxpYyBOb2Rl
IHsKLSAgcHVibGljOgotICAgIFBvc3RmaXhCcmFja2V0Tm9kZShOb2RlICpiLCBOb2RlICpzLCBP
cGVyYXRvciBvKSA6IG1fYmFzZShiKSwgbV9zdWJzY3JpcHQocyksIG1fb3BlcihvKSB7fQotICAg
IEpTVmFsdWUqIGV2YWx1YXRlKEV4ZWNTdGF0ZSopOworICBzdHJ1Y3QgUG9zdGZpeEJyYWNrZXRO
b2RlIDogcHVibGljIE5vZGUgeworICAgIFBvc3RmaXhCcmFja2V0Tm9kZShOb2RlICpiLCBOb2Rl
ICpzLCBPcGVyYXRvciBvKSA6IE5vZGUoUG9zdGZpeEJyYWNrZXROb2RlRXZhbHVhdGVTdGF0ZSks
IG1fYmFzZShiKSwgbV9zdWJzY3JpcHQocyksIG1fb3BlcihvKSB7fQogICAgIHZpcnR1YWwgdm9p
ZCBzdHJlYW1UbyhTb3VyY2VTdHJlYW0mKSBjb25zdDsKLSAgcHJpdmF0ZToKICAgICBSZWZQdHI8
Tm9kZT4gbV9iYXNlOwogICAgIFJlZlB0cjxOb2RlPiBtX3N1YnNjcmlwdDsKICAgICBPcGVyYXRv
ciBtX29wZXI7CiAgIH07CiAKLSAgY2xhc3MgUG9zdGZpeERvdE5vZGUgOiBwdWJsaWMgTm9kZSB7
Ci0gIHB1YmxpYzoKLSAgICBQb3N0Zml4RG90Tm9kZShOb2RlICpiLCBjb25zdCBJZGVudGlmaWVy
JiBpLCBPcGVyYXRvciBvKSA6IG1fYmFzZShiKSwgbV9pZGVudChpKSwgbV9vcGVyKG8pIHt9Ci0g
ICAgSlNWYWx1ZSogZXZhbHVhdGUoRXhlY1N0YXRlKik7CisgIHN0cnVjdCBQb3N0Zml4RG90Tm9k
ZSA6IHB1YmxpYyBOb2RlIHsKKyAgICBQb3N0Zml4RG90Tm9kZShOb2RlICpiLCBjb25zdCBJZGVu
dGlmaWVyJiBpLCBPcGVyYXRvciBvKSA6IE5vZGUoUG9zdGZpeERvdE5vZGVFdmFsdWF0ZVN0YXRl
KSwgbV9iYXNlKGIpLCBtX2lkZW50KGkpLCBtX29wZXIobykge30KICAgICB2aXJ0dWFsIHZvaWQg
c3RyZWFtVG8oU291cmNlU3RyZWFtJikgY29uc3Q7Ci0gIHByaXZhdGU6CiAgICAgUmVmUHRyPE5v
ZGU+IG1fYmFzZTsKICAgICBJZGVudGlmaWVyIG1faWRlbnQ7CiAgICAgT3BlcmF0b3IgbV9vcGVy
OwogICB9OwogCi0gIGNsYXNzIERlbGV0ZVJlc29sdmVOb2RlIDogcHVibGljIE5vZGUgewotICBw
dWJsaWM6Ci0gICAgRGVsZXRlUmVzb2x2ZU5vZGUoY29uc3QgSWRlbnRpZmllciYgaSkgOiBtX2lk
ZW50KGkpIHt9Ci0gICAgSlNWYWx1ZSogZXZhbHVhdGUoRXhlY1N0YXRlKik7CisgIHN0cnVjdCBE
ZWxldGVSZXNvbHZlTm9kZSA6IHB1YmxpYyBOb2RlIHsKKyAgICBEZWxldGVSZXNvbHZlTm9kZShj
b25zdCBJZGVudGlmaWVyJiBpKSA6IE5vZGUoRGVsZXRlUmVzb2x2ZU5vZGVFdmFsdWF0ZVN0YXRl
KSwgbV9pZGVudChpKSB7fQogICAgIHZpcnR1YWwgdm9pZCBzdHJlYW1UbyhTb3VyY2VTdHJlYW0m
KSBjb25zdDsKLSAgcHJpdmF0ZToKICAgICBJZGVudGlmaWVyIG1faWRlbnQ7CiAgIH07CiAKLSAg
Y2xhc3MgRGVsZXRlQnJhY2tldE5vZGUgOiBwdWJsaWMgTm9kZSB7Ci0gIHB1YmxpYzoKLSAgICBE
ZWxldGVCcmFja2V0Tm9kZShOb2RlICpiYXNlLCBOb2RlICpzdWJzY3JpcHQpIDogbV9iYXNlKGJh
c2UpLCBtX3N1YnNjcmlwdChzdWJzY3JpcHQpIHt9Ci0gICAgSlNWYWx1ZSogZXZhbHVhdGUoRXhl
Y1N0YXRlKik7CisgIHN0cnVjdCBEZWxldGVCcmFja2V0Tm9kZSA6IHB1YmxpYyBOb2RlIHsKKyAg
ICBEZWxldGVCcmFja2V0Tm9kZShOb2RlICpiYXNlLCBOb2RlICpzdWJzY3JpcHQpIDogTm9kZShE
ZWxldGVCcmFja2V0Tm9kZUV2YWx1YXRlU3RhdGUpLCBtX2Jhc2UoYmFzZSksIG1fc3Vic2NyaXB0
KHN1YnNjcmlwdCkge30KICAgICB2aXJ0dWFsIHZvaWQgc3RyZWFtVG8oU291cmNlU3RyZWFtJikg
Y29uc3Q7Ci0gIHByaXZhdGU6CiAgICAgUmVmUHRyPE5vZGU+IG1fYmFzZTsKICAgICBSZWZQdHI8
Tm9kZT4gbV9zdWJzY3JpcHQ7CiAgIH07CiAKLSAgY2xhc3MgRGVsZXRlRG90Tm9kZSA6IHB1Ymxp
YyBOb2RlIHsKLSAgcHVibGljOgotICAgIERlbGV0ZURvdE5vZGUoTm9kZSAqYmFzZSwgY29uc3Qg
SWRlbnRpZmllciYgaSkgOiBtX2Jhc2UoYmFzZSksIG1faWRlbnQoaSkge30KLSAgICBKU1ZhbHVl
KiBldmFsdWF0ZShFeGVjU3RhdGUqKTsKKyAgc3RydWN0IERlbGV0ZURvdE5vZGUgOiBwdWJsaWMg
Tm9kZSB7CisgICAgRGVsZXRlRG90Tm9kZShOb2RlICpiYXNlLCBjb25zdCBJZGVudGlmaWVyJiBp
KSA6IE5vZGUoRGVsZXRlRG90Tm9kZUV2YWx1YXRlU3RhdGUpLCBtX2Jhc2UoYmFzZSksIG1faWRl
bnQoaSkge30KICAgICB2aXJ0dWFsIHZvaWQgc3RyZWFtVG8oU291cmNlU3RyZWFtJikgY29uc3Q7
Ci0gIHByaXZhdGU6CiAgICAgUmVmUHRyPE5vZGU+IG1fYmFzZTsKICAgICBJZGVudGlmaWVyIG1f
aWRlbnQ7CiAgIH07CiAKLSAgY2xhc3MgRGVsZXRlVmFsdWVOb2RlIDogcHVibGljIE5vZGUgewot
ICBwdWJsaWM6Ci0gICAgRGVsZXRlVmFsdWVOb2RlKE5vZGUgKmUpIDogbV9leHByKGUpIHt9Ci0g
ICAgSlNWYWx1ZSogZXZhbHVhdGUoRXhlY1N0YXRlKik7CisgIHN0cnVjdCBEZWxldGVWYWx1ZU5v
ZGUgOiBwdWJsaWMgTm9kZSB7CisgICAgRGVsZXRlVmFsdWVOb2RlKE5vZGUqIGUpIDogTm9kZShE
ZWxldGVWYWx1ZU5vZGVFdmFsdWF0ZVN0YXRlKSwgbV9leHByKGUpIHt9CiAgICAgdmlydHVhbCB2
b2lkIHN0cmVhbVRvKFNvdXJjZVN0cmVhbSYpIGNvbnN0OwotICBwcml2YXRlOgogICAgIFJlZlB0
cjxOb2RlPiBtX2V4cHI7CiAgIH07CiAKLSAgY2xhc3MgVm9pZE5vZGUgOiBwdWJsaWMgTm9kZSB7
Ci0gIHB1YmxpYzoKLSAgICBWb2lkTm9kZShOb2RlICplKSA6IGV4cHIoZSkge30KLSAgICBKU1Zh
bHVlKiBldmFsdWF0ZShFeGVjU3RhdGUqKTsKKyAgc3RydWN0IFZvaWROb2RlIDogcHVibGljIE5v
ZGUgeworICAgIFZvaWROb2RlKE5vZGUqIGUpIDogTm9kZShWb2lkTm9kZUV2YWx1YXRlU3RhdGUp
LCBleHByKGUpIHt9CiAgICAgdmlydHVhbCB2b2lkIHN0cmVhbVRvKFNvdXJjZVN0cmVhbSYpIGNv
bnN0OwotICBwcml2YXRlOgogICAgIFJlZlB0cjxOb2RlPiBleHByOwogICB9OwogCi0gIGNsYXNz
IFR5cGVPZlJlc29sdmVOb2RlIDogcHVibGljIE5vZGUgewotICBwdWJsaWM6Ci0gICAgVHlwZU9m
UmVzb2x2ZU5vZGUoY29uc3QgSWRlbnRpZmllciYgaSkgOiBtX2lkZW50KGkpIHt9Ci0gICAgSlNW
YWx1ZSogZXZhbHVhdGUoRXhlY1N0YXRlKik7CisgIHN0cnVjdCBUeXBlT2ZSZXNvbHZlTm9kZSA6
IHB1YmxpYyBOb2RlIHsKKyAgICBUeXBlT2ZSZXNvbHZlTm9kZShjb25zdCBJZGVudGlmaWVyJiBp
KSA6IE5vZGUoVHlwZU9mUmVzb2x2ZU5vZGVFdmFsdWF0ZVN0YXRlKSwgbV9pZGVudChpKSB7fQog
ICAgIHZpcnR1YWwgdm9pZCBzdHJlYW1UbyhTb3VyY2VTdHJlYW0mKSBjb25zdDsKLSAgcHJpdmF0
ZToKICAgICBJZGVudGlmaWVyIG1faWRlbnQ7CiAgIH07CiAKLSAgY2xhc3MgVHlwZU9mVmFsdWVO
b2RlIDogcHVibGljIE5vZGUgewotICBwdWJsaWM6Ci0gICAgVHlwZU9mVmFsdWVOb2RlKE5vZGUg
KmUpIDogbV9leHByKGUpIHt9Ci0gICAgSlNWYWx1ZSogZXZhbHVhdGUoRXhlY1N0YXRlKik7Cisg
IHN0cnVjdCBUeXBlT2ZWYWx1ZU5vZGUgOiBwdWJsaWMgTm9kZSB7CisgICAgVHlwZU9mVmFsdWVO
b2RlKE5vZGUqIGUpIDogTm9kZShUeXBlT2ZWYWx1ZU5vZGVFdmFsdWF0ZVN0YXRlKSwgbV9leHBy
KGUpIHt9CiAgICAgdmlydHVhbCB2b2lkIHN0cmVhbVRvKFNvdXJjZVN0cmVhbSYpIGNvbnN0Owot
ICBwcml2YXRlOgogICAgIFJlZlB0cjxOb2RlPiBtX2V4cHI7CiAgIH07CiAKLSAgY2xhc3MgUHJl
Zml4UmVzb2x2ZU5vZGUgOiBwdWJsaWMgTm9kZSB7Ci0gIHB1YmxpYzoKLSAgICBQcmVmaXhSZXNv
bHZlTm9kZShjb25zdCBJZGVudGlmaWVyJiBpLCBPcGVyYXRvciBvKSA6IG1faWRlbnQoaSksIG1f
b3BlcihvKSB7fQotICAgIEpTVmFsdWUqIGV2YWx1YXRlKEV4ZWNTdGF0ZSopOworICBzdHJ1Y3Qg
UHJlZml4UmVzb2x2ZU5vZGUgOiBwdWJsaWMgTm9kZSB7CisgICAgUHJlZml4UmVzb2x2ZU5vZGUo
Y29uc3QgSWRlbnRpZmllciYgaSwgT3BlcmF0b3IgbykgOiBOb2RlKFByZWZpeFJlc29sdmVOb2Rl
RXZhbHVhdGVTdGF0ZSksIG1faWRlbnQoaSksIG1fb3BlcihvKSB7fQogICAgIHZpcnR1YWwgdm9p
ZCBzdHJlYW1UbyhTb3VyY2VTdHJlYW0mKSBjb25zdDsKLSAgcHJpdmF0ZToKICAgICBJZGVudGlm
aWVyIG1faWRlbnQ7CiAgICAgT3BlcmF0b3IgbV9vcGVyOwogICB9OwogCi0gIGNsYXNzIFByZWZp
eEJyYWNrZXROb2RlIDogcHVibGljIE5vZGUgewotICBwdWJsaWM6Ci0gICAgUHJlZml4QnJhY2tl
dE5vZGUoTm9kZSAqYiwgTm9kZSAqcywgT3BlcmF0b3IgbykgOiBtX2Jhc2UoYiksIG1fc3Vic2Ny
aXB0KHMpLCBtX29wZXIobykge30KLSAgICBKU1ZhbHVlKiBldmFsdWF0ZShFeGVjU3RhdGUqKTsK
KyAgc3RydWN0IFByZWZpeEJyYWNrZXROb2RlIDogcHVibGljIE5vZGUgeworICAgIFByZWZpeEJy
YWNrZXROb2RlKE5vZGUgKmIsIE5vZGUgKnMsIE9wZXJhdG9yIG8pIDogTm9kZShQcmVmaXhCcmFj
a2V0Tm9kZUV2YWx1YXRlU3RhdGUpLCBtX2Jhc2UoYiksIG1fc3Vic2NyaXB0KHMpLCBtX29wZXIo
bykge30KICAgICB2aXJ0dWFsIHZvaWQgc3RyZWFtVG8oU291cmNlU3RyZWFtJikgY29uc3Q7Ci0g
IHByaXZhdGU6CiAgICAgUmVmUHRyPE5vZGU+IG1fYmFzZTsKICAgICBSZWZQdHI8Tm9kZT4gbV9z
dWJzY3JpcHQ7CiAgICAgT3BlcmF0b3IgbV9vcGVyOwogICB9OwogCi0gIGNsYXNzIFByZWZpeERv
dE5vZGUgOiBwdWJsaWMgTm9kZSB7Ci0gIHB1YmxpYzoKLSAgICBQcmVmaXhEb3ROb2RlKE5vZGUg
KmIsIGNvbnN0IElkZW50aWZpZXImIGksIE9wZXJhdG9yIG8pIDogbV9iYXNlKGIpLCBtX2lkZW50
KGkpLCBtX29wZXIobykge30KLSAgICBKU1ZhbHVlKiBldmFsdWF0ZShFeGVjU3RhdGUqKTsKKyAg
c3RydWN0IFByZWZpeERvdE5vZGUgOiBwdWJsaWMgTm9kZSB7CisgICAgUHJlZml4RG90Tm9kZShO
b2RlICpiLCBjb25zdCBJZGVudGlmaWVyJiBpLCBPcGVyYXRvciBvKSA6IE5vZGUoUHJlZml4RG90
Tm9kZUV2YWx1YXRlU3RhdGUpLCBtX2Jhc2UoYiksIG1faWRlbnQoaSksIG1fb3BlcihvKSB7fQog
ICAgIHZpcnR1YWwgdm9pZCBzdHJlYW1UbyhTb3VyY2VTdHJlYW0mKSBjb25zdDsKLSAgcHJpdmF0
ZToKICAgICBSZWZQdHI8Tm9kZT4gbV9iYXNlOwogICAgIElkZW50aWZpZXIgbV9pZGVudDsKICAg
ICBPcGVyYXRvciBtX29wZXI7CiAgIH07CiAKLSAgY2xhc3MgVW5hcnlQbHVzTm9kZSA6IHB1Ymxp
YyBOb2RlIHsKLSAgcHVibGljOgotICAgIFVuYXJ5UGx1c05vZGUoTm9kZSAqZSkgOiBleHByKGUp
IHt9Ci0gICAgSlNWYWx1ZSogZXZhbHVhdGUoRXhlY1N0YXRlKik7CisgIHN0cnVjdCBVbmFyeVBs
dXNOb2RlIDogcHVibGljIE5vZGUgeworICAgIFVuYXJ5UGx1c05vZGUoTm9kZSogZSkgOiBOb2Rl
KFVuYXJ5UGx1c05vZGVFdmFsdWF0ZVN0YXRlKSwgZXhwcihlKSB7fQogICAgIHZpcnR1YWwgdm9p
ZCBzdHJlYW1UbyhTb3VyY2VTdHJlYW0mKSBjb25zdDsKLSAgcHJpdmF0ZToKICAgICBSZWZQdHI8
Tm9kZT4gZXhwcjsKICAgfTsKIAotICBjbGFzcyBOZWdhdGVOb2RlIDogcHVibGljIE5vZGUgewot
ICBwdWJsaWM6Ci0gICAgTmVnYXRlTm9kZShOb2RlICplKSA6IGV4cHIoZSkge30KLSAgICBKU1Zh
bHVlKiBldmFsdWF0ZShFeGVjU3RhdGUqKTsKKyAgc3RydWN0IE5lZ2F0ZU5vZGUgOiBwdWJsaWMg
Tm9kZSB7CisgICAgTmVnYXRlTm9kZShOb2RlKiBlKSA6IE5vZGUoTmVnYXRlTm9kZUV2YWx1YXRl
U3RhdGUpLCBleHByKGUpIHt9CiAgICAgdmlydHVhbCB2b2lkIHN0cmVhbVRvKFNvdXJjZVN0cmVh
bSYpIGNvbnN0OwotICBwcml2YXRlOgogICAgIFJlZlB0cjxOb2RlPiBleHByOwogICB9OwogCi0g
IGNsYXNzIEJpdHdpc2VOb3ROb2RlIDogcHVibGljIE5vZGUgewotICBwdWJsaWM6Ci0gICAgQml0
d2lzZU5vdE5vZGUoTm9kZSAqZSkgOiBleHByKGUpIHt9Ci0gICAgSlNWYWx1ZSogZXZhbHVhdGUo
RXhlY1N0YXRlKik7CisgIHN0cnVjdCBCaXR3aXNlTm90Tm9kZSA6IHB1YmxpYyBOb2RlIHsKKyAg
ICBCaXR3aXNlTm90Tm9kZShOb2RlKiBlKSA6IE5vZGUoQml0d2lzZU5vdE5vZGVFdmFsdWF0ZVN0
YXRlKSwgZXhwcihlKSB7fQogICAgIHZpcnR1YWwgdm9pZCBzdHJlYW1UbyhTb3VyY2VTdHJlYW0m
KSBjb25zdDsKLSAgcHJpdmF0ZToKICAgICBSZWZQdHI8Tm9kZT4gZXhwcjsKICAgfTsKIAotICBj
bGFzcyBMb2dpY2FsTm90Tm9kZSA6IHB1YmxpYyBOb2RlIHsKLSAgcHVibGljOgotICAgIExvZ2lj
YWxOb3ROb2RlKE5vZGUgKmUpIDogZXhwcihlKSB7fQotICAgIEpTVmFsdWUqIGV2YWx1YXRlKEV4
ZWNTdGF0ZSopOworICBzdHJ1Y3QgTG9naWNhbE5vdE5vZGUgOiBwdWJsaWMgTm9kZSB7CisgICAg
TG9naWNhbE5vdE5vZGUoTm9kZSogZSkgOiBOb2RlKExvZ2ljYWxOb3ROb2RlRXZhbHVhdGVTdGF0
ZSksIGV4cHIoZSkge30KICAgICB2aXJ0dWFsIHZvaWQgc3RyZWFtVG8oU291cmNlU3RyZWFtJikg
Y29uc3Q7Ci0gIHByaXZhdGU6CiAgICAgUmVmUHRyPE5vZGU+IGV4cHI7CiAgIH07CiAKLSAgY2xh
c3MgTXVsdE5vZGUgOiBwdWJsaWMgTm9kZSB7Ci0gIHB1YmxpYzoKLSAgICBNdWx0Tm9kZShOb2Rl
ICp0MSwgTm9kZSAqdDIsIGNoYXIgb3ApIDogdGVybTEodDEpLCB0ZXJtMih0MiksIG9wZXIob3Ap
IHt9Ci0gICAgSlNWYWx1ZSogZXZhbHVhdGUoRXhlY1N0YXRlKik7CisgIHN0cnVjdCBNdWx0Tm9k
ZSA6IHB1YmxpYyBOb2RlIHsKKyAgICBNdWx0Tm9kZShOb2RlICp0MSwgTm9kZSAqdDIsIGNoYXIg
b3ApIDogTm9kZShNdWx0Tm9kZUV2YWx1YXRlU3RhdGUpLCB0ZXJtMSh0MSksIHRlcm0yKHQyKSwg
b3BlcihvcCkge30KICAgICB2aXJ0dWFsIHZvaWQgc3RyZWFtVG8oU291cmNlU3RyZWFtJikgY29u
c3Q7Ci0gIHByaXZhdGU6CiAgICAgUmVmUHRyPE5vZGU+IHRlcm0xOwogICAgIFJlZlB0cjxOb2Rl
PiB0ZXJtMjsKICAgICBjaGFyIG9wZXI7CiAgIH07CiAKLSAgY2xhc3MgQWRkTm9kZSA6IHB1Ymxp
YyBOb2RlIHsKLSAgcHVibGljOgotICAgIEFkZE5vZGUoTm9kZSAqdDEsIE5vZGUgKnQyLCBjaGFy
IG9wKSA6IHRlcm0xKHQxKSwgdGVybTIodDIpLCBvcGVyKG9wKSB7fQotICAgIEpTVmFsdWUqIGV2
YWx1YXRlKEV4ZWNTdGF0ZSopOworICBzdHJ1Y3QgQWRkTm9kZSA6IHB1YmxpYyBOb2RlIHsKKyAg
ICBBZGROb2RlKE5vZGUgKnQxLCBOb2RlICp0MiwgY2hhciBvcCkgOiBOb2RlKEFkZE5vZGVFdmFs
dWF0ZVN0YXRlKSwgdGVybTEodDEpLCB0ZXJtMih0MiksIG9wZXIob3ApIHt9CiAgICAgdmlydHVh
bCB2b2lkIHN0cmVhbVRvKFNvdXJjZVN0cmVhbSYpIGNvbnN0OwotICBwcml2YXRlOgogICAgIFJl
ZlB0cjxOb2RlPiB0ZXJtMTsKICAgICBSZWZQdHI8Tm9kZT4gdGVybTI7CiAgICAgY2hhciBvcGVy
OwogICB9OwogCi0gIGNsYXNzIFNoaWZ0Tm9kZSA6IHB1YmxpYyBOb2RlIHsKLSAgcHVibGljOgor
ICBzdHJ1Y3QgU2hpZnROb2RlIDogcHVibGljIE5vZGUgewogICAgIFNoaWZ0Tm9kZShOb2RlICp0
MSwgT3BlcmF0b3IgbywgTm9kZSAqdDIpCi0gICAgICA6IHRlcm0xKHQxKSwgdGVybTIodDIpLCBv
cGVyKG8pIHt9Ci0gICAgSlNWYWx1ZSogZXZhbHVhdGUoRXhlY1N0YXRlKik7CisgICAgICA6IE5v
ZGUoU2hpZnROb2RlRXZhbHVhdGVTdGF0ZSksIHRlcm0xKHQxKSwgdGVybTIodDIpLCBvcGVyKG8p
IHt9CiAgICAgdmlydHVhbCB2b2lkIHN0cmVhbVRvKFNvdXJjZVN0cmVhbSYpIGNvbnN0OwotICBw
cml2YXRlOgogICAgIFJlZlB0cjxOb2RlPiB0ZXJtMTsKICAgICBSZWZQdHI8Tm9kZT4gdGVybTI7
CiAgICAgT3BlcmF0b3Igb3BlcjsKICAgfTsKIAotICBjbGFzcyBSZWxhdGlvbmFsTm9kZSA6IHB1
YmxpYyBOb2RlIHsKLSAgcHVibGljOgotICAgIFJlbGF0aW9uYWxOb2RlKE5vZGUgKmUxLCBPcGVy
YXRvciBvLCBOb2RlICplMikgOgotICAgICAgZXhwcjEoZTEpLCBleHByMihlMiksIG9wZXIobykg
e30KLSAgICBKU1ZhbHVlKiBldmFsdWF0ZShFeGVjU3RhdGUqKTsKKyAgc3RydWN0IFJlbGF0aW9u
YWxOb2RlIDogcHVibGljIE5vZGUgeworICAgIFJlbGF0aW9uYWxOb2RlKE5vZGUqIGUxLCBPcGVy
YXRvciBvLCBOb2RlKiBlMikKKyAgICAgIDogTm9kZShSZWxhdGlvbmFsTm9kZUV2YWx1YXRlU3Rh
dGUpLCBleHByMShlMSksIGV4cHIyKGUyKSwgb3BlcihvKSB7fQogICAgIHZpcnR1YWwgdm9pZCBz
dHJlYW1UbyhTb3VyY2VTdHJlYW0mKSBjb25zdDsKLSAgcHJpdmF0ZToKICAgICBSZWZQdHI8Tm9k
ZT4gZXhwcjE7CiAgICAgUmVmUHRyPE5vZGU+IGV4cHIyOwogICAgIE9wZXJhdG9yIG9wZXI7CiAg
IH07CiAKLSAgY2xhc3MgRXF1YWxOb2RlIDogcHVibGljIE5vZGUgewotICBwdWJsaWM6Ci0gICAg
RXF1YWxOb2RlKE5vZGUgKmUxLCBPcGVyYXRvciBvLCBOb2RlICplMikKLSAgICAgIDogZXhwcjEo
ZTEpLCBleHByMihlMiksIG9wZXIobykge30KLSAgICBKU1ZhbHVlKiBldmFsdWF0ZShFeGVjU3Rh
dGUqKTsKKyAgc3RydWN0IEVxdWFsTm9kZSA6IHB1YmxpYyBOb2RlIHsKKyAgICBFcXVhbE5vZGUo
Tm9kZSogZTEsIE9wZXJhdG9yIG8sIE5vZGUqIGUyKQorICAgICAgOiBOb2RlKEVxdWFsTm9kZUV2
YWx1YXRlU3RhdGUpLCBleHByMShlMSksIGV4cHIyKGUyKSwgb3BlcihvKSB7fQogICAgIHZpcnR1
YWwgdm9pZCBzdHJlYW1UbyhTb3VyY2VTdHJlYW0mKSBjb25zdDsKLSAgcHJpdmF0ZToKICAgICBS
ZWZQdHI8Tm9kZT4gZXhwcjE7CiAgICAgUmVmUHRyPE5vZGU+IGV4cHIyOwogICAgIE9wZXJhdG9y
IG9wZXI7CiAgIH07CiAKLSAgY2xhc3MgQml0T3Blck5vZGUgOiBwdWJsaWMgTm9kZSB7Ci0gIHB1
YmxpYzoKLSAgICBCaXRPcGVyTm9kZShOb2RlICplMSwgT3BlcmF0b3IgbywgTm9kZSAqZTIpIDoK
LSAgICAgIGV4cHIxKGUxKSwgZXhwcjIoZTIpLCBvcGVyKG8pIHt9Ci0gICAgSlNWYWx1ZSogZXZh
bHVhdGUoRXhlY1N0YXRlKik7CisgIHN0cnVjdCBCaXRPcGVyTm9kZSA6IHB1YmxpYyBOb2RlIHsK
KyAgICBCaXRPcGVyTm9kZShOb2RlKiBlMSwgT3BlcmF0b3IgbywgTm9kZSogZTIpIDoKKyAgICAg
IE5vZGUoQml0T3Blck5vZGVFdmFsdWF0ZVN0YXRlKSwgZXhwcjEoZTEpLCBleHByMihlMiksIG9w
ZXIobykge30KICAgICB2aXJ0dWFsIHZvaWQgc3RyZWFtVG8oU291cmNlU3RyZWFtJikgY29uc3Q7
Ci0gIHByaXZhdGU6CiAgICAgUmVmUHRyPE5vZGU+IGV4cHIxOwogICAgIFJlZlB0cjxOb2RlPiBl
eHByMjsKICAgICBPcGVyYXRvciBvcGVyOwpAQCAtNjYwLDEzICs1MTYsMTAgQEAgbmFtZXNwYWNl
IEtKUyB7CiAgIC8qKgogICAgKiBleHByMSAmJiBleHByMiwgZXhwcjEgfHwgZXhwcjIKICAgICov
Ci0gIGNsYXNzIEJpbmFyeUxvZ2ljYWxOb2RlIDogcHVibGljIE5vZGUgewotICBwdWJsaWM6Ci0g
ICAgQmluYXJ5TG9naWNhbE5vZGUoTm9kZSAqZTEsIE9wZXJhdG9yIG8sIE5vZGUgKmUyKSA6Ci0g
ICAgICBleHByMShlMSksIGV4cHIyKGUyKSwgb3BlcihvKSB7fQotICAgIEpTVmFsdWUqIGV2YWx1
YXRlKEV4ZWNTdGF0ZSopOworICBzdHJ1Y3QgQmluYXJ5TG9naWNhbE5vZGUgOiBwdWJsaWMgTm9k
ZSB7CisgICAgQmluYXJ5TG9naWNhbE5vZGUoTm9kZSogZTEsIE9wZXJhdG9yIG8sIE5vZGUqIGUy
KSA6CisgICAgICBOb2RlKEJpbmFyeUxvZ2ljYWxOb2RlRXZhbHVhdGVTdGF0ZSksIGV4cHIxKGUx
KSwgZXhwcjIoZTIpLCBvcGVyKG8pIHt9CiAgICAgdmlydHVhbCB2b2lkIHN0cmVhbVRvKFNvdXJj
ZVN0cmVhbSYpIGNvbnN0OwotICBwcml2YXRlOgogICAgIFJlZlB0cjxOb2RlPiBleHByMTsKICAg
ICBSZWZQdHI8Tm9kZT4gZXhwcjI7CiAgICAgT3BlcmF0b3Igb3BlcjsKQEAgLTY3NSwyMTcgKzUy
OCwxNzEgQEAgbmFtZXNwYWNlIEtKUyB7CiAgIC8qKgogICAgKiBUaGUgdGVybmFyeSBvcGVyYXRv
ciwgImxvZ2ljYWwgPyBleHByMSA6IGV4cHIyIgogICAgKi8KLSAgY2xhc3MgQ29uZGl0aW9uYWxO
b2RlIDogcHVibGljIE5vZGUgewotICBwdWJsaWM6Ci0gICAgQ29uZGl0aW9uYWxOb2RlKE5vZGUg
KmwsIE5vZGUgKmUxLCBOb2RlICplMikgOgotICAgICAgbG9naWNhbChsKSwgZXhwcjEoZTEpLCBl
eHByMihlMikge30KLSAgICBKU1ZhbHVlKiBldmFsdWF0ZShFeGVjU3RhdGUqKTsKKyAgc3RydWN0
IENvbmRpdGlvbmFsTm9kZSA6IHB1YmxpYyBOb2RlIHsKKyAgICBDb25kaXRpb25hbE5vZGUoTm9k
ZSAqbCwgTm9kZSogZTEsIE5vZGUqIGUyKSA6CisgICAgICBOb2RlKENvbmRpdGlvbmFsTm9kZUV2
YWx1YXRlU3RhdGUpLCBsb2dpY2FsKGwpLCBleHByMShlMSksIGV4cHIyKGUyKSB7fQogICAgIHZp
cnR1YWwgdm9pZCBzdHJlYW1UbyhTb3VyY2VTdHJlYW0mKSBjb25zdDsKLSAgcHJpdmF0ZToKICAg
ICBSZWZQdHI8Tm9kZT4gbG9naWNhbDsKICAgICBSZWZQdHI8Tm9kZT4gZXhwcjE7CiAgICAgUmVm
UHRyPE5vZGU+IGV4cHIyOwogICB9OwogCi0gIGNsYXNzIEFzc2lnblJlc29sdmVOb2RlIDogcHVi
bGljIE5vZGUgewotICBwdWJsaWM6CisgIHN0cnVjdCBBc3NpZ25SZXNvbHZlTm9kZSA6IHB1Ymxp
YyBOb2RlIHsKICAgICBBc3NpZ25SZXNvbHZlTm9kZShjb25zdCBJZGVudGlmaWVyICZpZGVudCwg
T3BlcmF0b3Igb3BlciwgTm9kZSAqcmlnaHQpIAotICAgICAgOiBtX2lkZW50KGlkZW50KSwgbV9v
cGVyKG9wZXIpLCBtX3JpZ2h0KHJpZ2h0KSB7fQotICAgIEpTVmFsdWUqIGV2YWx1YXRlKEV4ZWNT
dGF0ZSopOworICAgICAgOiBOb2RlKEFzc2lnblJlc29sdmVOb2RlRXZhbHVhdGVTdGF0ZSksIG1f
aWRlbnQoaWRlbnQpLCBtX29wZXIob3BlciksIG1fcmlnaHQocmlnaHQpIHt9CiAgICAgdmlydHVh
bCB2b2lkIHN0cmVhbVRvKFNvdXJjZVN0cmVhbSYpIGNvbnN0OwotICBwcm90ZWN0ZWQ6CiAgICAg
SWRlbnRpZmllciBtX2lkZW50OwogICAgIE9wZXJhdG9yIG1fb3BlcjsKICAgICBSZWZQdHI8Tm9k
ZT4gbV9yaWdodDsKICAgfTsKIAotICBjbGFzcyBBc3NpZ25CcmFja2V0Tm9kZSA6IHB1YmxpYyBO
b2RlIHsKLSAgcHVibGljOgorICBzdHJ1Y3QgQXNzaWduQnJhY2tldE5vZGUgOiBwdWJsaWMgTm9k
ZSB7CiAgICAgQXNzaWduQnJhY2tldE5vZGUoTm9kZSAqYmFzZSwgTm9kZSAqc3Vic2NyaXB0LCBP
cGVyYXRvciBvcGVyLCBOb2RlICpyaWdodCkgCi0gICAgICA6IG1fYmFzZShiYXNlKSwgbV9zdWJz
Y3JpcHQoc3Vic2NyaXB0KSwgbV9vcGVyKG9wZXIpLCBtX3JpZ2h0KHJpZ2h0KSB7fQotICAgIEpT
VmFsdWUqIGV2YWx1YXRlKEV4ZWNTdGF0ZSopOworICAgICAgOiBOb2RlKEFzc2lnbkJyYWNrZXRO
b2RlRXZhbHVhdGVTdGF0ZSksIG1fYmFzZShiYXNlKSwgbV9zdWJzY3JpcHQoc3Vic2NyaXB0KSwg
bV9vcGVyKG9wZXIpLCBtX3JpZ2h0KHJpZ2h0KSB7fQogICAgIHZpcnR1YWwgdm9pZCBzdHJlYW1U
byhTb3VyY2VTdHJlYW0mKSBjb25zdDsKLSAgcHJvdGVjdGVkOgogICAgIFJlZlB0cjxOb2RlPiBt
X2Jhc2U7CiAgICAgUmVmUHRyPE5vZGU+IG1fc3Vic2NyaXB0OwogICAgIE9wZXJhdG9yIG1fb3Bl
cjsKICAgICBSZWZQdHI8Tm9kZT4gbV9yaWdodDsKICAgfTsKIAotICBjbGFzcyBBc3NpZ25Eb3RO
b2RlIDogcHVibGljIE5vZGUgewotICBwdWJsaWM6CisgIHN0cnVjdCBBc3NpZ25Eb3ROb2RlIDog
cHVibGljIE5vZGUgewogICAgIEFzc2lnbkRvdE5vZGUoTm9kZSAqYmFzZSwgY29uc3QgSWRlbnRp
ZmllciYgaWRlbnQsIE9wZXJhdG9yIG9wZXIsIE5vZGUgKnJpZ2h0KQotICAgICAgOiBtX2Jhc2Uo
YmFzZSksIG1faWRlbnQoaWRlbnQpLCBtX29wZXIob3BlciksIG1fcmlnaHQocmlnaHQpIHt9Ci0g
ICAgSlNWYWx1ZSogZXZhbHVhdGUoRXhlY1N0YXRlKik7CisgICAgICA6IE5vZGUoQXNzaWduRG90
Tm9kZUV2YWx1YXRlU3RhdGUpLCBtX2Jhc2UoYmFzZSksIG1faWRlbnQoaWRlbnQpLCBtX29wZXIo
b3BlciksIG1fcmlnaHQocmlnaHQpIHt9CiAgICAgdmlydHVhbCB2b2lkIHN0cmVhbVRvKFNvdXJj
ZVN0cmVhbSYpIGNvbnN0OwotICBwcm90ZWN0ZWQ6CiAgICAgUmVmUHRyPE5vZGU+IG1fYmFzZTsK
ICAgICBJZGVudGlmaWVyIG1faWRlbnQ7CiAgICAgT3BlcmF0b3IgbV9vcGVyOwogICAgIFJlZlB0
cjxOb2RlPiBtX3JpZ2h0OwogICB9OwogCi0gIGNsYXNzIENvbW1hTm9kZSA6IHB1YmxpYyBOb2Rl
IHsKLSAgcHVibGljOgotICAgIENvbW1hTm9kZShOb2RlICplMSwgTm9kZSAqZTIpIDogZXhwcjEo
ZTEpLCBleHByMihlMikge30KLSAgICBKU1ZhbHVlKiBldmFsdWF0ZShFeGVjU3RhdGUqKTsKKyAg
c3RydWN0IENvbW1hTm9kZSA6IHB1YmxpYyBOb2RlIHsKKyAgICBDb21tYU5vZGUoTm9kZSogZTEs
IE5vZGUqIGUyKSA6IE5vZGUoQ29tbWFOb2RlRXZhbHVhdGVTdGF0ZSksIGV4cHIxKGUxKSwgZXhw
cjIoZTIpIHt9CiAgICAgdmlydHVhbCB2b2lkIHN0cmVhbVRvKFNvdXJjZVN0cmVhbSYpIGNvbnN0
OwotICBwcml2YXRlOgogICAgIFJlZlB0cjxOb2RlPiBleHByMTsKICAgICBSZWZQdHI8Tm9kZT4g
ZXhwcjI7CiAgIH07CiAKLSAgY2xhc3MgU3RhdExpc3ROb2RlIDogcHVibGljIFN0YXRlbWVudE5v
ZGUgewotICBwdWJsaWM6CisgIHN0cnVjdCBTdGF0TGlzdE5vZGUgOiBwdWJsaWMgU3RhdGVtZW50
Tm9kZSB7CiAgICAgLy8gbGlzdCBwb2ludGVyIGlzIHRhaWwgb2YgYSBjaXJjdWxhciBsaXN0LCBj
cmFja2VkIGluIHRoZSBDYXNlQ2xhdXNlTm9kZSBjdG9yCiAgICAgU3RhdExpc3ROb2RlKFN0YXRl
bWVudE5vZGUgKnMpOwogICAgIFN0YXRMaXN0Tm9kZShTdGF0TGlzdE5vZGUgKmwsIFN0YXRlbWVu
dE5vZGUgKnMpOwotICAgIHZpcnR1YWwgQ29tcGxldGlvbiBleGVjdXRlKEV4ZWNTdGF0ZSopOwog
ICAgIHZpcnR1YWwgdm9pZCBwcm9jZXNzVmFyRGVjbHMoRXhlY1N0YXRlKik7CiAgICAgdmlydHVh
bCB2b2lkIHN0cmVhbVRvKFNvdXJjZVN0cmVhbSYpIGNvbnN0OwogICAgIFBhc3NSZWZQdHI8U3Rh
dExpc3ROb2RlPiByZWxlYXNlTmV4dCgpIHsgcmV0dXJuIG5leHQucmVsZWFzZSgpOyB9CiAgICAg
dmlydHVhbCB2b2lkIGJyZWFrQ3ljbGUoKTsKLSAgcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3Mg
Q2FzZUNsYXVzZU5vZGU7CiAgICAgUmVmUHRyPFN0YXRlbWVudE5vZGU+IHN0YXRlbWVudDsKICAg
ICBMaXN0UmVmUHRyPFN0YXRMaXN0Tm9kZT4gbmV4dDsKICAgfTsKIAotICBjbGFzcyBBc3NpZ25F
eHByTm9kZSA6IHB1YmxpYyBOb2RlIHsKLSAgcHVibGljOgotICAgIEFzc2lnbkV4cHJOb2RlKE5v
ZGUgKmUpIDogZXhwcihlKSB7fQotICAgIEpTVmFsdWUqIGV2YWx1YXRlKEV4ZWNTdGF0ZSopOwor
ICBzdHJ1Y3QgQXNzaWduRXhwck5vZGUgOiBwdWJsaWMgTm9kZSB7CisgICAgQXNzaWduRXhwck5v
ZGUoTm9kZSogZSkgOiBOb2RlKEFzc2lnbkV4cHJOb2RlRXZhbHVhdGVTdGF0ZSksIGV4cHIoZSkg
e30KICAgICB2aXJ0dWFsIHZvaWQgc3RyZWFtVG8oU291cmNlU3RyZWFtJikgY29uc3Q7Ci0gIHBy
aXZhdGU6CiAgICAgUmVmUHRyPE5vZGU+IGV4cHI7CiAgIH07CiAKLSAgY2xhc3MgVmFyRGVjbE5v
ZGUgOiBwdWJsaWMgTm9kZSB7Ci0gIHB1YmxpYzoKKyAgc3RydWN0IFZhckRlY2xOb2RlIDogcHVi
bGljIE5vZGUgewogICAgIGVudW0gVHlwZSB7IFZhcmlhYmxlLCBDb25zdGFudCB9OwotICAgIFZh
ckRlY2xOb2RlKGNvbnN0IElkZW50aWZpZXIgJmlkLCBBc3NpZ25FeHByTm9kZSAqaW4sIFR5cGUg
dCk7Ci0gICAgSlNWYWx1ZSogZXZhbHVhdGUoRXhlY1N0YXRlKik7CisgICAgVmFyRGVjbE5vZGU6
OlZhckRlY2xOb2RlKGNvbnN0IElkZW50aWZpZXIgJmlkLCBBc3NpZ25FeHByTm9kZSAqaW4sIFR5
cGUgdCkKKyAgICAgIDogTm9kZShWYXJEZWNsTm9kZUV2YWx1YXRlU3RhdGUpLCB2YXJUeXBlKHQp
LCBpZGVudChpZCksIGluaXQoaW4pIHsgfQogICAgIHZpcnR1YWwgdm9pZCBwcm9jZXNzVmFyRGVj
bHMoRXhlY1N0YXRlKik7CiAgICAgdmlydHVhbCB2b2lkIHN0cmVhbVRvKFNvdXJjZVN0cmVhbSYp
IGNvbnN0OwotICBwcml2YXRlOgogICAgIFR5cGUgdmFyVHlwZTsKICAgICBJZGVudGlmaWVyIGlk
ZW50OwogICAgIFJlZlB0cjxBc3NpZ25FeHByTm9kZT4gaW5pdDsKICAgfTsKIAotICBjbGFzcyBW
YXJEZWNsTGlzdE5vZGUgOiBwdWJsaWMgTm9kZSB7Ci0gIHB1YmxpYzoKKyAgc3RydWN0IFZhckRl
Y2xMaXN0Tm9kZSA6IHB1YmxpYyBOb2RlIHsKICAgICAvLyBsaXN0IHBvaW50ZXIgaXMgdGFpbCBv
ZiBhIGNpcmN1bGFyIGxpc3QsIGNyYWNrZWQgaW4gdGhlIEZvck5vZGUvVmFyU3RhdGVtZW50Tm9k
ZSBjdG9yCi0gICAgVmFyRGVjbExpc3ROb2RlKFZhckRlY2xOb2RlICp2KSA6IG5leHQodGhpcyks
IHZhcih2KSB7IFBhcnNlcjo6bm90ZU5vZGVDeWNsZSh0aGlzKTsgfQorICAgIFZhckRlY2xMaXN0
Tm9kZShWYXJEZWNsTm9kZSAqdikgOiBOb2RlKFZhckRlY2xMaXN0Tm9kZUV2YWx1YXRlU3RhdGUp
LCBuZXh0KHRoaXMpLCB2YXIodikgeyBQYXJzZXI6Om5vdGVOb2RlQ3ljbGUodGhpcyk7IH0KICAg
ICBWYXJEZWNsTGlzdE5vZGUoVmFyRGVjbExpc3ROb2RlICpsLCBWYXJEZWNsTm9kZSAqdikKLSAg
ICAgIDogbmV4dChsLT5uZXh0KSwgdmFyKHYpIHsgbC0+bmV4dCA9IHRoaXM7IH0KLSAgICBKU1Zh
bHVlKiBldmFsdWF0ZShFeGVjU3RhdGUqKTsKKyAgICAgIDogTm9kZShWYXJEZWNsTGlzdE5vZGVF
dmFsdWF0ZVN0YXRlKSwgbmV4dChsLT5uZXh0KSwgdmFyKHYpIHsgbC0+bmV4dCA9IHRoaXM7IH0K
ICAgICB2aXJ0dWFsIHZvaWQgcHJvY2Vzc1ZhckRlY2xzKEV4ZWNTdGF0ZSopOwogICAgIHZpcnR1
YWwgdm9pZCBzdHJlYW1UbyhTb3VyY2VTdHJlYW0mKSBjb25zdDsKICAgICBQYXNzUmVmUHRyPFZh
ckRlY2xMaXN0Tm9kZT4gcmVsZWFzZU5leHQoKSB7IHJldHVybiBuZXh0LnJlbGVhc2UoKTsgfQog
ICAgIHZpcnR1YWwgdm9pZCBicmVha0N5Y2xlKCk7Ci0gIHByaXZhdGU6Ci0gICAgZnJpZW5kIGNs
YXNzIEZvck5vZGU7Ci0gICAgZnJpZW5kIGNsYXNzIFZhclN0YXRlbWVudE5vZGU7CiAgICAgTGlz
dFJlZlB0cjxWYXJEZWNsTGlzdE5vZGU+IG5leHQ7CiAgICAgUmVmUHRyPFZhckRlY2xOb2RlPiB2
YXI7CiAgIH07CiAKLSAgY2xhc3MgVmFyU3RhdGVtZW50Tm9kZSA6IHB1YmxpYyBTdGF0ZW1lbnRO
b2RlIHsKLSAgcHVibGljOgotICAgIFZhclN0YXRlbWVudE5vZGUoVmFyRGVjbExpc3ROb2RlICps
KSA6IG5leHQobC0+bmV4dCkgeyBQYXJzZXI6OnJlbW92ZU5vZGVDeWNsZShuZXh0LmdldCgpKTsg
bC0+bmV4dCA9IDA7IH0KLSAgICB2aXJ0dWFsIENvbXBsZXRpb24gZXhlY3V0ZShFeGVjU3RhdGUq
KTsKKyAgc3RydWN0IFZhclN0YXRlbWVudE5vZGUgOiBwdWJsaWMgU3RhdGVtZW50Tm9kZSB7Cisg
ICAgVmFyU3RhdGVtZW50Tm9kZShWYXJEZWNsTGlzdE5vZGUgKmwpIAorICAgICAgICA6IFN0YXRl
bWVudE5vZGUoVmFyU3RhdGVtZW50Tm9kZUV4ZWN1dGVTdGF0ZSksIG5leHQobC0+bmV4dC5yZWxl
YXNlKCkpIAorICAgIHsKKyAgICAgICAgUGFyc2VyOjpyZW1vdmVOb2RlQ3ljbGUobmV4dC5nZXQo
KSk7CisgICAgfQogICAgIHZpcnR1YWwgdm9pZCBwcm9jZXNzVmFyRGVjbHMoRXhlY1N0YXRlKik7
CiAgICAgdmlydHVhbCB2b2lkIHN0cmVhbVRvKFNvdXJjZVN0cmVhbSYpIGNvbnN0OwotICBwcml2
YXRlOgogICAgIFJlZlB0cjxWYXJEZWNsTGlzdE5vZGU+IG5leHQ7CiAgIH07CiAKLSAgY2xhc3Mg
QmxvY2tOb2RlIDogcHVibGljIFN0YXRlbWVudE5vZGUgewotICBwdWJsaWM6CisgIHN0cnVjdCBC
bG9ja05vZGUgOiBwdWJsaWMgU3RhdGVtZW50Tm9kZSB7CiAgICAgQmxvY2tOb2RlKFNvdXJjZUVs
ZW1lbnRzTm9kZSAqcyk7Ci0gICAgdmlydHVhbCBDb21wbGV0aW9uIGV4ZWN1dGUoRXhlY1N0YXRl
Kik7CiAgICAgdmlydHVhbCB2b2lkIHByb2Nlc3NWYXJEZWNscyhFeGVjU3RhdGUqKTsKICAgICB2
aXJ0dWFsIHZvaWQgc3RyZWFtVG8oU291cmNlU3RyZWFtJikgY29uc3Q7Ci0gIHByb3RlY3RlZDoK
ICAgICBSZWZQdHI8U291cmNlRWxlbWVudHNOb2RlPiBzb3VyY2U7CiAgIH07CiAKLSAgY2xhc3Mg
RW1wdHlTdGF0ZW1lbnROb2RlIDogcHVibGljIFN0YXRlbWVudE5vZGUgewotICBwdWJsaWM6Ci0g
ICAgRW1wdHlTdGF0ZW1lbnROb2RlKCkgeyB9IC8vIGRlYnVnCi0gICAgdmlydHVhbCBDb21wbGV0
aW9uIGV4ZWN1dGUoRXhlY1N0YXRlKik7CisgIHN0cnVjdCBFbXB0eVN0YXRlbWVudE5vZGUgOiBw
dWJsaWMgU3RhdGVtZW50Tm9kZSB7CisgICAgRW1wdHlTdGF0ZW1lbnROb2RlKCkgOiBTdGF0ZW1l
bnROb2RlKEVtcHR5U3RhdGVtZW50Tm9kZUV4ZWN1dGVTdGF0ZSkgeyB9CiAgICAgdmlydHVhbCB2
b2lkIHN0cmVhbVRvKFNvdXJjZVN0cmVhbSYpIGNvbnN0OwogICB9OwogCi0gIGNsYXNzIEV4cHJT
dGF0ZW1lbnROb2RlIDogcHVibGljIFN0YXRlbWVudE5vZGUgewotICBwdWJsaWM6Ci0gICAgRXhw
clN0YXRlbWVudE5vZGUoTm9kZSAqZSkgOiBleHByKGUpIHsgfQotICAgIHZpcnR1YWwgQ29tcGxl
dGlvbiBleGVjdXRlKEV4ZWNTdGF0ZSopOworICBzdHJ1Y3QgRXhwclN0YXRlbWVudE5vZGUgOiBw
dWJsaWMgU3RhdGVtZW50Tm9kZSB7CisgICAgRXhwclN0YXRlbWVudE5vZGUoTm9kZSogZSkgOiBT
dGF0ZW1lbnROb2RlKEV4cHJTdGF0ZW1lbnROb2RlRXhlY3V0ZVN0YXRlKSwgZXhwcihlKSB7IH0K
ICAgICB2aXJ0dWFsIHZvaWQgc3RyZWFtVG8oU291cmNlU3RyZWFtJikgY29uc3Q7Ci0gIHByaXZh
dGU6CiAgICAgUmVmUHRyPE5vZGU+IGV4cHI7CiAgIH07CiAKLSAgY2xhc3MgSWZOb2RlIDogcHVi
bGljIFN0YXRlbWVudE5vZGUgewotICBwdWJsaWM6Ci0gICAgSWZOb2RlKE5vZGUgKmUsIFN0YXRl
bWVudE5vZGUgKnMxLCBTdGF0ZW1lbnROb2RlICpzMikKLSAgICAgIDogZXhwcihlKSwgc3RhdGVt
ZW50MShzMSksIHN0YXRlbWVudDIoczIpIHt9Ci0gICAgdmlydHVhbCBDb21wbGV0aW9uIGV4ZWN1
dGUoRXhlY1N0YXRlKik7CisgIHN0cnVjdCBJZk5vZGUgOiBwdWJsaWMgU3RhdGVtZW50Tm9kZSB7
CisgICAgSWZOb2RlKE5vZGUqIGUsIFN0YXRlbWVudE5vZGUgKnMxLCBTdGF0ZW1lbnROb2RlICpz
MikKKyAgICAgICAgOiBTdGF0ZW1lbnROb2RlKElmTm9kZUV4ZWN1dGVTdGF0ZSksIGV4cHIoZSks
IHN0YXRlbWVudDEoczEpLCBzdGF0ZW1lbnQyKHMyKSAgeyB9CiAgICAgdmlydHVhbCB2b2lkIHBy
b2Nlc3NWYXJEZWNscyhFeGVjU3RhdGUqKTsKICAgICB2aXJ0dWFsIHZvaWQgc3RyZWFtVG8oU291
cmNlU3RyZWFtJikgY29uc3Q7Ci0gIHByaXZhdGU6CiAgICAgUmVmUHRyPE5vZGU+IGV4cHI7CiAg
ICAgUmVmUHRyPFN0YXRlbWVudE5vZGU+IHN0YXRlbWVudDE7CiAgICAgUmVmUHRyPFN0YXRlbWVu
dE5vZGU+IHN0YXRlbWVudDI7CiAgIH07CiAKLSAgY2xhc3MgRG9XaGlsZU5vZGUgOiBwdWJsaWMg
U3RhdGVtZW50Tm9kZSB7Ci0gIHB1YmxpYzoKLSAgICBEb1doaWxlTm9kZShTdGF0ZW1lbnROb2Rl
ICpzLCBOb2RlICplKSA6IHN0YXRlbWVudChzKSwgZXhwcihlKSB7fQotICAgIHZpcnR1YWwgQ29t
cGxldGlvbiBleGVjdXRlKEV4ZWNTdGF0ZSopOworICBzdHJ1Y3QgRG9XaGlsZU5vZGUgOiBwdWJs
aWMgU3RhdGVtZW50Tm9kZSB7CisgICAgRG9XaGlsZU5vZGUoU3RhdGVtZW50Tm9kZSAqcywgTm9k
ZSogZSkgCisgICAgICAgIDogU3RhdGVtZW50Tm9kZShEb1doaWxlTm9kZUV4ZWN1dGVTdGF0ZSks
IHN0YXRlbWVudChzKSwgZXhwcihlKSB7IH0KICAgICB2aXJ0dWFsIHZvaWQgcHJvY2Vzc1ZhckRl
Y2xzKEV4ZWNTdGF0ZSopOwogICAgIHZpcnR1YWwgdm9pZCBzdHJlYW1UbyhTb3VyY2VTdHJlYW0m
KSBjb25zdDsKLSAgcHJpdmF0ZToKICAgICBSZWZQdHI8U3RhdGVtZW50Tm9kZT4gc3RhdGVtZW50
OwogICAgIFJlZlB0cjxOb2RlPiBleHByOwogICB9OwogCi0gIGNsYXNzIFdoaWxlTm9kZSA6IHB1
YmxpYyBTdGF0ZW1lbnROb2RlIHsKLSAgcHVibGljOgotICAgIFdoaWxlTm9kZShOb2RlICplLCBT
dGF0ZW1lbnROb2RlICpzKSA6IGV4cHIoZSksIHN0YXRlbWVudChzKSB7fQotICAgIHZpcnR1YWwg
Q29tcGxldGlvbiBleGVjdXRlKEV4ZWNTdGF0ZSopOworICBzdHJ1Y3QgV2hpbGVOb2RlIDogcHVi
bGljIFN0YXRlbWVudE5vZGUgeworICAgIFdoaWxlTm9kZShOb2RlKiBlLCBTdGF0ZW1lbnROb2Rl
ICpzKSAKKyAgICAgICAgOiBTdGF0ZW1lbnROb2RlKFdoaWxlTm9kZUV4ZWN1dGVTdGF0ZSksIGV4
cHIoZSksIHN0YXRlbWVudChzKSB7IH0KICAgICB2aXJ0dWFsIHZvaWQgcHJvY2Vzc1ZhckRlY2xz
KEV4ZWNTdGF0ZSopOwogICAgIHZpcnR1YWwgdm9pZCBzdHJlYW1UbyhTb3VyY2VTdHJlYW0mKSBj
b25zdDsKLSAgcHJpdmF0ZToKICAgICBSZWZQdHI8Tm9kZT4gZXhwcjsKICAgICBSZWZQdHI8U3Rh
dGVtZW50Tm9kZT4gc3RhdGVtZW50OwogICB9OwogCi0gIGNsYXNzIEZvck5vZGUgOiBwdWJsaWMg
U3RhdGVtZW50Tm9kZSB7Ci0gIHB1YmxpYzoKLSAgICBGb3JOb2RlKE5vZGUgKmUxLCBOb2RlICpl
MiwgTm9kZSAqZTMsIFN0YXRlbWVudE5vZGUgKnMpIDoKLSAgICAgIGV4cHIxKGUxKSwgZXhwcjIo
ZTIpLCBleHByMyhlMyksIHN0YXRlbWVudChzKSB7fQotICAgIEZvck5vZGUoVmFyRGVjbExpc3RO
b2RlICplMSwgTm9kZSAqZTIsIE5vZGUgKmUzLCBTdGF0ZW1lbnROb2RlICpzKSA6Ci0gICAgICBl
eHByMShlMS0+bmV4dCksIGV4cHIyKGUyKSwgZXhwcjMoZTMpLCBzdGF0ZW1lbnQocykgeyBQYXJz
ZXI6OnJlbW92ZU5vZGVDeWNsZShleHByMS5nZXQoKSk7IGUxLT5uZXh0ID0gMDsgfQotICAgIHZp
cnR1YWwgQ29tcGxldGlvbiBleGVjdXRlKEV4ZWNTdGF0ZSopOworICBzdHJ1Y3QgRm9yTm9kZSA6
IHB1YmxpYyBTdGF0ZW1lbnROb2RlIHsKKyAgICBGb3JOb2RlKE5vZGUqIGUxLCBOb2RlKiBlMiwg
Tm9kZSogZTMsIFN0YXRlbWVudE5vZGUgKnMpCisgICAgICAgIDogU3RhdGVtZW50Tm9kZShGb3JO
b2RlRXhlY3V0ZVN0YXRlKSwgZXhwcjEoZTEpLCBleHByMihlMiksIGV4cHIzKGUzKSwgc3RhdGVt
ZW50KHMpIHsgfQorICAgIEZvck5vZGUoVmFyRGVjbExpc3ROb2RlKiBlMSwgTm9kZSogZTIsIE5v
ZGUqIGUzLCBTdGF0ZW1lbnROb2RlICpzKSAKKyAgICAgICAgOiBTdGF0ZW1lbnROb2RlKEZvck5v
ZGVFeGVjdXRlU3RhdGUpLCBleHByMShlMS0+bmV4dC5yZWxlYXNlKCkpLCBleHByMihlMiksIGV4
cHIzKGUzKSwgc3RhdGVtZW50KHMpIAorICAgIHsgCisgICAgICAgIFBhcnNlcjo6cmVtb3ZlTm9k
ZUN5Y2xlKGV4cHIxLmdldCgpKTsgCisgICAgfQogICAgIHZpcnR1YWwgdm9pZCBwcm9jZXNzVmFy
RGVjbHMoRXhlY1N0YXRlKik7CiAgICAgdmlydHVhbCB2b2lkIHN0cmVhbVRvKFNvdXJjZVN0cmVh
bSYpIGNvbnN0OwotICBwcml2YXRlOgogICAgIFJlZlB0cjxOb2RlPiBleHByMTsKICAgICBSZWZQ
dHI8Tm9kZT4gZXhwcjI7CiAgICAgUmVmUHRyPE5vZGU+IGV4cHIzOwogICAgIFJlZlB0cjxTdGF0
ZW1lbnROb2RlPiBzdGF0ZW1lbnQ7CiAgIH07CiAKLSAgY2xhc3MgRm9ySW5Ob2RlIDogcHVibGlj
IFN0YXRlbWVudE5vZGUgewotICBwdWJsaWM6Ci0gICAgRm9ySW5Ob2RlKE5vZGUgKmwsIE5vZGUg
KmUsIFN0YXRlbWVudE5vZGUgKnMpOwotICAgIEZvckluTm9kZShjb25zdCBJZGVudGlmaWVyICZp
LCBBc3NpZ25FeHByTm9kZSAqaW4sIE5vZGUgKmUsIFN0YXRlbWVudE5vZGUgKnMpOwotICAgIHZp
cnR1YWwgQ29tcGxldGlvbiBleGVjdXRlKEV4ZWNTdGF0ZSopOworICBzdHJ1Y3QgRm9ySW5Ob2Rl
IDogcHVibGljIFN0YXRlbWVudE5vZGUgeworICAgIEZvckluTm9kZShOb2RlICpsLCBOb2RlKiBl
LCBTdGF0ZW1lbnROb2RlICpzKTsKKyAgICBGb3JJbk5vZGUoY29uc3QgSWRlbnRpZmllciAmaSwg
QXNzaWduRXhwck5vZGUgKmluLCBOb2RlKiBlLCBTdGF0ZW1lbnROb2RlICpzKTsKICAgICB2aXJ0
dWFsIHZvaWQgcHJvY2Vzc1ZhckRlY2xzKEV4ZWNTdGF0ZSopOwogICAgIHZpcnR1YWwgdm9pZCBz
dHJlYW1UbyhTb3VyY2VTdHJlYW0mKSBjb25zdDsKLSAgcHJpdmF0ZToKICAgICBJZGVudGlmaWVy
IGlkZW50OwogICAgIFJlZlB0cjxBc3NpZ25FeHByTm9kZT4gaW5pdDsKICAgICBSZWZQdHI8Tm9k
ZT4gbGV4cHI7CkBAIC04OTQsMjE5ICs3MDEsMTY5IEBAIG5hbWVzcGFjZSBLSlMgewogICAgIFJl
ZlB0cjxTdGF0ZW1lbnROb2RlPiBzdGF0ZW1lbnQ7CiAgIH07CiAKLSAgY2xhc3MgQ29udGludWVO
b2RlIDogcHVibGljIFN0YXRlbWVudE5vZGUgewotICBwdWJsaWM6Ci0gICAgQ29udGludWVOb2Rl
KCkgeyB9Ci0gICAgQ29udGludWVOb2RlKGNvbnN0IElkZW50aWZpZXIgJmkpIDogaWRlbnQoaSkg
eyB9Ci0gICAgdmlydHVhbCBDb21wbGV0aW9uIGV4ZWN1dGUoRXhlY1N0YXRlKik7CisgIHN0cnVj
dCBDb250aW51ZU5vZGUgOiBwdWJsaWMgU3RhdGVtZW50Tm9kZSB7CisgICAgQ29udGludWVOb2Rl
KCkgOiBTdGF0ZW1lbnROb2RlKENvbnRpbnVlTm9kZUV4ZWN1dGVTdGF0ZSkgeyB9CisgICAgQ29u
dGludWVOb2RlKGNvbnN0IElkZW50aWZpZXIgJmkpIDogU3RhdGVtZW50Tm9kZShDb250aW51ZU5v
ZGVFeGVjdXRlU3RhdGUpLCBpZGVudChpKSB7IH0KICAgICB2aXJ0dWFsIHZvaWQgc3RyZWFtVG8o
U291cmNlU3RyZWFtJikgY29uc3Q7Ci0gIHByaXZhdGU6CiAgICAgSWRlbnRpZmllciBpZGVudDsK
ICAgfTsKIAotICBjbGFzcyBCcmVha05vZGUgOiBwdWJsaWMgU3RhdGVtZW50Tm9kZSB7Ci0gIHB1
YmxpYzoKLSAgICBCcmVha05vZGUoKSB7IH0KLSAgICBCcmVha05vZGUoY29uc3QgSWRlbnRpZmll
ciAmaSkgOiBpZGVudChpKSB7IH0KLSAgICB2aXJ0dWFsIENvbXBsZXRpb24gZXhlY3V0ZShFeGVj
U3RhdGUqKTsKKyAgc3RydWN0IEJyZWFrTm9kZSA6IHB1YmxpYyBTdGF0ZW1lbnROb2RlIHsKKyAg
ICBCcmVha05vZGUoKSA6IFN0YXRlbWVudE5vZGUoQnJlYWtOb2RlRXhlY3V0ZVN0YXRlKSB7IH0K
KyAgICBCcmVha05vZGUoY29uc3QgSWRlbnRpZmllciAmaSkgOiBTdGF0ZW1lbnROb2RlKEJyZWFr
Tm9kZUV4ZWN1dGVTdGF0ZSksIGlkZW50KGkpIHsgfQogICAgIHZpcnR1YWwgdm9pZCBzdHJlYW1U
byhTb3VyY2VTdHJlYW0mKSBjb25zdDsKLSAgcHJpdmF0ZToKICAgICBJZGVudGlmaWVyIGlkZW50
OwogICB9OwogCi0gIGNsYXNzIFJldHVybk5vZGUgOiBwdWJsaWMgU3RhdGVtZW50Tm9kZSB7Ci0g
IHB1YmxpYzoKLSAgICBSZXR1cm5Ob2RlKE5vZGUgKnYpIDogdmFsdWUodikge30KLSAgICB2aXJ0
dWFsIENvbXBsZXRpb24gZXhlY3V0ZShFeGVjU3RhdGUqKTsKKyAgc3RydWN0IFJldHVybk5vZGUg
OiBwdWJsaWMgU3RhdGVtZW50Tm9kZSB7CisgICAgUmV0dXJuTm9kZShOb2RlICp2KSA6IFN0YXRl
bWVudE5vZGUoUmV0dXJuTm9kZUV4ZWN1dGVTdGF0ZSksIHZhbHVlKHYpIHsgfQogICAgIHZpcnR1
YWwgdm9pZCBzdHJlYW1UbyhTb3VyY2VTdHJlYW0mKSBjb25zdDsKLSAgcHJpdmF0ZToKICAgICBS
ZWZQdHI8Tm9kZT4gdmFsdWU7CiAgIH07CiAKLSAgY2xhc3MgV2l0aE5vZGUgOiBwdWJsaWMgU3Rh
dGVtZW50Tm9kZSB7Ci0gIHB1YmxpYzoKLSAgICBXaXRoTm9kZShOb2RlICplLCBTdGF0ZW1lbnRO
b2RlICpzKSA6IGV4cHIoZSksIHN0YXRlbWVudChzKSB7fQotICAgIHZpcnR1YWwgQ29tcGxldGlv
biBleGVjdXRlKEV4ZWNTdGF0ZSopOworICBzdHJ1Y3QgV2l0aE5vZGUgOiBwdWJsaWMgU3RhdGVt
ZW50Tm9kZSB7CisgICAgV2l0aE5vZGUoTm9kZSogZSwgU3RhdGVtZW50Tm9kZSAqcykgOiBTdGF0
ZW1lbnROb2RlKFdpdGhOb2RlRXhlY3V0ZVN0YXRlKSwgZXhwcihlKSwgc3RhdGVtZW50KHMpIHsg
fQogICAgIHZpcnR1YWwgdm9pZCBwcm9jZXNzVmFyRGVjbHMoRXhlY1N0YXRlKik7CiAgICAgdmly
dHVhbCB2b2lkIHN0cmVhbVRvKFNvdXJjZVN0cmVhbSYpIGNvbnN0OwotICBwcml2YXRlOgogICAg
IFJlZlB0cjxOb2RlPiBleHByOwogICAgIFJlZlB0cjxTdGF0ZW1lbnROb2RlPiBzdGF0ZW1lbnQ7
CiAgIH07CiAKLSAgY2xhc3MgQ2FzZUNsYXVzZU5vZGUgOiBwdWJsaWMgTm9kZSB7Ci0gIHB1Ymxp
YzoKLSAgICBDYXNlQ2xhdXNlTm9kZShOb2RlICplKSA6IGV4cHIoZSkgeyB9Ci0gICAgQ2FzZUNs
YXVzZU5vZGUoTm9kZSAqZSwgU3RhdExpc3ROb2RlICpsKQotICAgICAgOiBleHByKGUpLCBuZXh0
KGwtPm5leHQpIHsgUGFyc2VyOjpyZW1vdmVOb2RlQ3ljbGUobmV4dC5nZXQoKSk7IGwtPm5leHQg
PSAwOyB9Ci0gICAgSlNWYWx1ZSogZXZhbHVhdGUoRXhlY1N0YXRlKik7Ci0gICAgQ29tcGxldGlv
biBldmFsU3RhdGVtZW50cyhFeGVjU3RhdGUqKTsKKyAgc3RydWN0IENhc2VDbGF1c2VOb2RlIDog
cHVibGljIE5vZGUgeworICAgIENhc2VDbGF1c2VOb2RlKE5vZGUqIGUpIDogTm9kZShDYXNlQ2xh
dXNlTm9kZUV2YWx1YXRlU3RhdGUpLCBleHByKGUpIHt9IAorICAgIENhc2VDbGF1c2VOb2RlKE5v
ZGUqIGUsIFN0YXRMaXN0Tm9kZSAqbCkgOiBOb2RlKENhc2VDbGF1c2VOb2RlRXZhbHVhdGVTdGF0
ZSksIGV4cHIoZSksIG5leHQobC0+bmV4dC5yZWxlYXNlKCkpIHsgUGFyc2VyOjpyZW1vdmVOb2Rl
Q3ljbGUobmV4dC5nZXQoKSk7fQogICAgIHZpcnR1YWwgdm9pZCBwcm9jZXNzVmFyRGVjbHMoRXhl
Y1N0YXRlKik7CiAgICAgdmlydHVhbCB2b2lkIHN0cmVhbVRvKFNvdXJjZVN0cmVhbSYpIGNvbnN0
OwotICBwcml2YXRlOgogICAgIFJlZlB0cjxOb2RlPiBleHByOwogICAgIFJlZlB0cjxTdGF0TGlz
dE5vZGU+IG5leHQ7CiAgIH07CiAKLSAgY2xhc3MgQ2xhdXNlTGlzdE5vZGUgOiBwdWJsaWMgTm9k
ZSB7Ci0gIHB1YmxpYzoKKyAgc3RydWN0IENsYXVzZUxpc3ROb2RlIDogcHVibGljIE5vZGUgewog
ICAgIC8vIGxpc3QgcG9pbnRlciBpcyB0YWlsIG9mIGEgY2lyY3VsYXIgbGlzdCwgY3JhY2tlZCBp
biB0aGUgQ2FzZUJsb2NrTm9kZSBjdG9yCi0gICAgQ2xhdXNlTGlzdE5vZGUoQ2FzZUNsYXVzZU5v
ZGUgKmMpIDogY2xhdXNlKGMpLCBuZXh0KHRoaXMpIHsgUGFyc2VyOjpub3RlTm9kZUN5Y2xlKHRo
aXMpOyB9CisgICAgQ2xhdXNlTGlzdE5vZGUoQ2FzZUNsYXVzZU5vZGUgKmMpIDogTm9kZShJbnRl
cm5hbEVycm9yU3RhdGUpLCBjbGF1c2UoYyksIG5leHQodGhpcykgeyBQYXJzZXI6Om5vdGVOb2Rl
Q3ljbGUodGhpcyk7IH0KICAgICBDbGF1c2VMaXN0Tm9kZShDbGF1c2VMaXN0Tm9kZSAqbiwgQ2Fz
ZUNsYXVzZU5vZGUgKmMpCi0gICAgICA6IGNsYXVzZShjKSwgbmV4dChuLT5uZXh0KSB7IG4tPm5l
eHQgPSB0aGlzOyB9Ci0gICAgSlNWYWx1ZSogZXZhbHVhdGUoRXhlY1N0YXRlKik7CisgICAgICA6
IE5vZGUoSW50ZXJuYWxFcnJvclN0YXRlKSwgY2xhdXNlKGMpLCBuZXh0KG4tPm5leHQpIHsgbi0+
bmV4dCA9IHRoaXM7IH0KICAgICBDYXNlQ2xhdXNlTm9kZSAqZ2V0Q2xhdXNlKCkgY29uc3QgeyBy
ZXR1cm4gY2xhdXNlLmdldCgpOyB9CiAgICAgQ2xhdXNlTGlzdE5vZGUgKmdldE5leHQoKSBjb25z
dCB7IHJldHVybiBuZXh0LmdldCgpOyB9CiAgICAgdmlydHVhbCB2b2lkIHByb2Nlc3NWYXJEZWNs
cyhFeGVjU3RhdGUqKTsKICAgICB2aXJ0dWFsIHZvaWQgc3RyZWFtVG8oU291cmNlU3RyZWFtJikg
Y29uc3Q7CiAgICAgUGFzc1JlZlB0cjxDbGF1c2VMaXN0Tm9kZT4gcmVsZWFzZU5leHQoKSB7IHJl
dHVybiBuZXh0LnJlbGVhc2UoKTsgfQogICAgIHZpcnR1YWwgdm9pZCBicmVha0N5Y2xlKCk7Ci0g
IHByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIENhc2VCbG9ja05vZGU7CiAgICAgUmVmUHRyPENh
c2VDbGF1c2VOb2RlPiBjbGF1c2U7CiAgICAgTGlzdFJlZlB0cjxDbGF1c2VMaXN0Tm9kZT4gbmV4
dDsKICAgfTsKIAotICBjbGFzcyBDYXNlQmxvY2tOb2RlIDogcHVibGljIE5vZGUgewotICBwdWJs
aWM6CisgIHN0cnVjdCBDYXNlQmxvY2tOb2RlIDogcHVibGljIE5vZGUgewogICAgIENhc2VCbG9j
a05vZGUoQ2xhdXNlTGlzdE5vZGUgKmwxLCBDYXNlQ2xhdXNlTm9kZSAqZCwgQ2xhdXNlTGlzdE5v
ZGUgKmwyKTsKLSAgICBKU1ZhbHVlKiBldmFsdWF0ZShFeGVjU3RhdGUqKTsKLSAgICBDb21wbGV0
aW9uIGV2YWxCbG9jayhFeGVjU3RhdGUgKmV4ZWMsIEpTVmFsdWUgKmlucHV0KTsKKyAgICBDb21w
bGV0aW9uIGV2YWxCbG9jayhFeGVjU3RhdGUqLCBKU1ZhbHVlICppbnB1dCk7CiAgICAgdmlydHVh
bCB2b2lkIHByb2Nlc3NWYXJEZWNscyhFeGVjU3RhdGUqKTsKICAgICB2aXJ0dWFsIHZvaWQgc3Ry
ZWFtVG8oU291cmNlU3RyZWFtJikgY29uc3Q7Ci0gIHByaXZhdGU6CiAgICAgUmVmUHRyPENsYXVz
ZUxpc3ROb2RlPiBsaXN0MTsKICAgICBSZWZQdHI8Q2FzZUNsYXVzZU5vZGU+IGRlZjsKICAgICBS
ZWZQdHI8Q2xhdXNlTGlzdE5vZGU+IGxpc3QyOwogICB9OwogCi0gIGNsYXNzIFN3aXRjaE5vZGUg
OiBwdWJsaWMgU3RhdGVtZW50Tm9kZSB7Ci0gIHB1YmxpYzoKLSAgICBTd2l0Y2hOb2RlKE5vZGUg
KmUsIENhc2VCbG9ja05vZGUgKmIpIDogZXhwcihlKSwgYmxvY2soYikgeyB9Ci0gICAgdmlydHVh
bCBDb21wbGV0aW9uIGV4ZWN1dGUoRXhlY1N0YXRlKik7CisgIHN0cnVjdCBTd2l0Y2hOb2RlIDog
cHVibGljIFN0YXRlbWVudE5vZGUgeworICAgIFN3aXRjaE5vZGUoTm9kZSogZSwgQ2FzZUJsb2Nr
Tm9kZSAqYikgOiBTdGF0ZW1lbnROb2RlKFN3aXRjaE5vZGVFeGVjdXRlU3RhdGUpLCBleHByKGUp
LCBibG9jayhiKSB7IH0KICAgICB2aXJ0dWFsIHZvaWQgcHJvY2Vzc1ZhckRlY2xzKEV4ZWNTdGF0
ZSopOwogICAgIHZpcnR1YWwgdm9pZCBzdHJlYW1UbyhTb3VyY2VTdHJlYW0mKSBjb25zdDsKLSAg
cHJpdmF0ZToKICAgICBSZWZQdHI8Tm9kZT4gZXhwcjsKICAgICBSZWZQdHI8Q2FzZUJsb2NrTm9k
ZT4gYmxvY2s7CiAgIH07CiAKLSAgY2xhc3MgTGFiZWxOb2RlIDogcHVibGljIFN0YXRlbWVudE5v
ZGUgewotICBwdWJsaWM6Ci0gICAgTGFiZWxOb2RlKGNvbnN0IElkZW50aWZpZXIgJmwsIFN0YXRl
bWVudE5vZGUgKnMpIDogbGFiZWwobCksIHN0YXRlbWVudChzKSB7IH0KLSAgICB2aXJ0dWFsIENv
bXBsZXRpb24gZXhlY3V0ZShFeGVjU3RhdGUqKTsKKyAgc3RydWN0IExhYmVsTm9kZSA6IHB1Ymxp
YyBTdGF0ZW1lbnROb2RlIHsKKyAgICBMYWJlbE5vZGUoY29uc3QgSWRlbnRpZmllciAmbCwgU3Rh
dGVtZW50Tm9kZSAqcykgCisgICAgICAgIDogU3RhdGVtZW50Tm9kZShMYWJlbE5vZGVFeGVjdXRl
U3RhdGUpLCBsYWJlbChsKSwgc3RhdGVtZW50KHMpIHsgfQorICAgIHZpcnR1YWwgYm9vbCBpc0xh
YmVsTm9kZSgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KICAgICB2aXJ0dWFsIHZvaWQgcHJvY2Vz
c1ZhckRlY2xzKEV4ZWNTdGF0ZSopOwogICAgIHZpcnR1YWwgdm9pZCBzdHJlYW1UbyhTb3VyY2VT
dHJlYW0mKSBjb25zdDsKLSAgcHJpdmF0ZToKICAgICBJZGVudGlmaWVyIGxhYmVsOwogICAgIFJl
ZlB0cjxTdGF0ZW1lbnROb2RlPiBzdGF0ZW1lbnQ7CiAgIH07CiAKLSAgY2xhc3MgVGhyb3dOb2Rl
IDogcHVibGljIFN0YXRlbWVudE5vZGUgewotICBwdWJsaWM6Ci0gICAgVGhyb3dOb2RlKE5vZGUg
KmUpIDogZXhwcihlKSB7fQotICAgIHZpcnR1YWwgQ29tcGxldGlvbiBleGVjdXRlKEV4ZWNTdGF0
ZSopOworICBzdHJ1Y3QgVGhyb3dOb2RlIDogcHVibGljIFN0YXRlbWVudE5vZGUgeworICAgIFRo
cm93Tm9kZShOb2RlKiBlKSA6IFN0YXRlbWVudE5vZGUoVGhyb3dOb2RlRXhlY3V0ZVN0YXRlKSwg
ZXhwcihlKSB7IH0KICAgICB2aXJ0dWFsIHZvaWQgc3RyZWFtVG8oU291cmNlU3RyZWFtJikgY29u
c3Q7Ci0gIHByaXZhdGU6CiAgICAgUmVmUHRyPE5vZGU+IGV4cHI7CiAgIH07CiAKLSAgY2xhc3Mg
VHJ5Tm9kZSA6IHB1YmxpYyBTdGF0ZW1lbnROb2RlIHsKLSAgcHVibGljOgorICBzdHJ1Y3QgVHJ5
Tm9kZSA6IHB1YmxpYyBTdGF0ZW1lbnROb2RlIHsKICAgICBUcnlOb2RlKFN0YXRlbWVudE5vZGUg
KmIsIGNvbnN0IElkZW50aWZpZXIgJmUsIFN0YXRlbWVudE5vZGUgKmMsIFN0YXRlbWVudE5vZGUg
KmYpCi0gICAgICA6IHRyeUJsb2NrKGIpLCBleGNlcHRpb25JZGVudChlKSwgY2F0Y2hCbG9jayhj
KSwgZmluYWxseUJsb2NrKGYpIHsgfQotICAgIHZpcnR1YWwgQ29tcGxldGlvbiBleGVjdXRlKEV4
ZWNTdGF0ZSopOworICAgICAgICA6IFN0YXRlbWVudE5vZGUoVHJ5Tm9kZUV4ZWN1dGVTdGF0ZSks
IHRyeUJsb2NrKGIpLCBleGNlcHRpb25JZGVudChlKSwgY2F0Y2hCbG9jayhjKSwgZmluYWxseUJs
b2NrKGYpIHsgfQogICAgIHZpcnR1YWwgdm9pZCBwcm9jZXNzVmFyRGVjbHMoRXhlY1N0YXRlKik7
CiAgICAgdmlydHVhbCB2b2lkIHN0cmVhbVRvKFNvdXJjZVN0cmVhbSYpIGNvbnN0OwotICBwcml2
YXRlOgogICAgIFJlZlB0cjxTdGF0ZW1lbnROb2RlPiB0cnlCbG9jazsKICAgICBJZGVudGlmaWVy
IGV4Y2VwdGlvbklkZW50OwogICAgIFJlZlB0cjxTdGF0ZW1lbnROb2RlPiBjYXRjaEJsb2NrOwog
ICAgIFJlZlB0cjxTdGF0ZW1lbnROb2RlPiBmaW5hbGx5QmxvY2s7CiAgIH07CiAKLSAgY2xhc3Mg
UGFyYW1ldGVyTm9kZSA6IHB1YmxpYyBOb2RlIHsKLSAgcHVibGljOgorICBzdHJ1Y3QgUGFyYW1l
dGVyTm9kZSA6IHB1YmxpYyBOb2RlIHsKICAgICAvLyBsaXN0IHBvaW50ZXIgaXMgdGFpbCBvZiBh
IGNpcmN1bGFyIGxpc3QsIGNyYWNrZWQgaW4gdGhlIEZ1bmNEZWNsTm9kZS9GdW5jRXhwck5vZGUg
Y3RvcgotICAgIFBhcmFtZXRlck5vZGUoY29uc3QgSWRlbnRpZmllciAmaSkgOiBpZChpKSwgbmV4
dCh0aGlzKSB7IFBhcnNlcjo6bm90ZU5vZGVDeWNsZSh0aGlzKTsgfQorICAgIFBhcmFtZXRlck5v
ZGUoY29uc3QgSWRlbnRpZmllciAmaSkgOiBOb2RlKEludGVybmFsRXJyb3JTdGF0ZSksIGlkKGkp
LCBuZXh0KHRoaXMpIHsgUGFyc2VyOjpub3RlTm9kZUN5Y2xlKHRoaXMpOyB9CiAgICAgUGFyYW1l
dGVyTm9kZShQYXJhbWV0ZXJOb2RlICpuZXh0LCBjb25zdCBJZGVudGlmaWVyICZpKQotICAgICAg
OiBpZChpKSwgbmV4dChuZXh0LT5uZXh0KSB7IG5leHQtPm5leHQgPSB0aGlzOyB9Ci0gICAgSlNW
YWx1ZSogZXZhbHVhdGUoRXhlY1N0YXRlKik7CisgICAgICA6IE5vZGUoSW50ZXJuYWxFcnJvclN0
YXRlKSwgaWQoaSksIG5leHQobmV4dC0+bmV4dCkgeyBuZXh0LT5uZXh0ID0gdGhpczsgfQogICAg
IElkZW50aWZpZXIgaWRlbnQoKSB7IHJldHVybiBpZDsgfQogICAgIFBhcmFtZXRlck5vZGUgKm5l
eHRQYXJhbSgpIHsgcmV0dXJuIG5leHQuZ2V0KCk7IH0KICAgICB2aXJ0dWFsIHZvaWQgc3RyZWFt
VG8oU291cmNlU3RyZWFtJikgY29uc3Q7CiAgICAgUGFzc1JlZlB0cjxQYXJhbWV0ZXJOb2RlPiBy
ZWxlYXNlTmV4dCgpIHsgcmV0dXJuIG5leHQucmVsZWFzZSgpOyB9CiAgICAgdmlydHVhbCB2b2lk
IGJyZWFrQ3ljbGUoKTsKLSAgcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRnVuY0RlY2xOb2Rl
OwotICAgIGZyaWVuZCBjbGFzcyBGdW5jRXhwck5vZGU7CiAgICAgSWRlbnRpZmllciBpZDsKICAg
ICBMaXN0UmVmUHRyPFBhcmFtZXRlck5vZGU+IG5leHQ7CiAgIH07CiAKICAgLy8gaW5oZXJpdGVk
IGJ5IFByb2dyYW1Ob2RlCi0gIGNsYXNzIEZ1bmN0aW9uQm9keU5vZGUgOiBwdWJsaWMgQmxvY2tO
b2RlIHsKLSAgcHVibGljOgorICBzdHJ1Y3QgRnVuY3Rpb25Cb2R5Tm9kZSA6IHB1YmxpYyBCbG9j
a05vZGUgewogICAgIEZ1bmN0aW9uQm9keU5vZGUoU291cmNlRWxlbWVudHNOb2RlICopOwogICAg
IHZpcnR1YWwgdm9pZCBwcm9jZXNzRnVuY0RlY2woRXhlY1N0YXRlKik7CiAgICAgaW50IHNvdXJj
ZUlkKCkgeyByZXR1cm4gbV9zb3VyY2VJZDsgfQogICAgIGNvbnN0IFVTdHJpbmcmIHNvdXJjZVVS
TCgpIHsgcmV0dXJuIG1fc291cmNlVVJMOyB9Ci0gIHByaXZhdGU6CiAgICAgVVN0cmluZyBtX3Nv
dXJjZVVSTDsKICAgICBpbnQgbV9zb3VyY2VJZDsKICAgfTsKIAotICBjbGFzcyBGdW5jRXhwck5v
ZGUgOiBwdWJsaWMgTm9kZSB7Ci0gIHB1YmxpYzoKKyAgc3RydWN0IEZ1bmNFeHByTm9kZSA6IHB1
YmxpYyBOb2RlIHsKICAgICBGdW5jRXhwck5vZGUoY29uc3QgSWRlbnRpZmllciAmaSwgRnVuY3Rp
b25Cb2R5Tm9kZSAqYiwgUGFyYW1ldGVyTm9kZSAqcCA9IDApCi0gICAgICA6IGlkZW50KGkpLCBw
YXJhbShwID8gcC0+bmV4dCA6IDApLCBib2R5KGIpIHsgaWYgKHApIHsgUGFyc2VyOjpyZW1vdmVO
b2RlQ3ljbGUocGFyYW0uZ2V0KCkpOyBwLT5uZXh0ID0gMDsgfSB9Ci0gICAgdmlydHVhbCBKU1Zh
bHVlICpldmFsdWF0ZShFeGVjU3RhdGUqKTsKKyAgICAgIDogTm9kZShGdW5jRXhwck5vZGVFdmFs
dWF0ZVN0YXRlKSwgaWRlbnQoaSksIHBhcmFtKHAgPyBwLT5uZXh0LnJlbGVhc2UoKSA6IDApLCBi
b2R5KGIpIHsgaWYgKHApIHsgUGFyc2VyOjpyZW1vdmVOb2RlQ3ljbGUocGFyYW0uZ2V0KCkpOyB9
IH0KICAgICB2aXJ0dWFsIHZvaWQgc3RyZWFtVG8oU291cmNlU3RyZWFtJikgY29uc3Q7Ci0gIHBy
aXZhdGU6CiAgICAgLy8gVXNlZCBmb3Igc3RyZWFtVG8KLSAgICBmcmllbmQgY2xhc3MgUHJvcGVy
dHlOb2RlOwogICAgIElkZW50aWZpZXIgaWRlbnQ7CiAgICAgUmVmUHRyPFBhcmFtZXRlck5vZGU+
IHBhcmFtOwogICAgIFJlZlB0cjxGdW5jdGlvbkJvZHlOb2RlPiBib2R5OwogICB9OwogCi0gIGNs
YXNzIEZ1bmNEZWNsTm9kZSA6IHB1YmxpYyBTdGF0ZW1lbnROb2RlIHsKLSAgcHVibGljOgorICBz
dHJ1Y3QgRnVuY0RlY2xOb2RlIDogcHVibGljIFN0YXRlbWVudE5vZGUgewogICAgIEZ1bmNEZWNs
Tm9kZShjb25zdCBJZGVudGlmaWVyICZpLCBGdW5jdGlvbkJvZHlOb2RlICpiKQotICAgICAgOiBp
ZGVudChpKSwgYm9keShiKSB7IH0KKyAgICAgICAgOiBTdGF0ZW1lbnROb2RlKEZ1bmNEZWNsTm9k
ZUV4ZWN1dGVTdGF0ZSksIGlkZW50KGkpLCBib2R5KGIpIHsgfQogICAgIEZ1bmNEZWNsTm9kZShj
b25zdCBJZGVudGlmaWVyICZpLCBQYXJhbWV0ZXJOb2RlICpwLCBGdW5jdGlvbkJvZHlOb2RlICpi
KQotICAgICAgOiBpZGVudChpKSwgcGFyYW0ocC0+bmV4dCksIGJvZHkoYikgeyBQYXJzZXI6OnJl
bW92ZU5vZGVDeWNsZShwYXJhbS5nZXQoKSk7IHAtPm5leHQgPSAwOyB9Ci0gICAgdmlydHVhbCBD
b21wbGV0aW9uIGV4ZWN1dGUoRXhlY1N0YXRlKik7CisgICAgICAgIDogU3RhdGVtZW50Tm9kZShG
dW5jRGVjbE5vZGVFeGVjdXRlU3RhdGUpLCBpZGVudChpKSwgcGFyYW0ocC0+bmV4dC5yZWxlYXNl
KCkpLCBib2R5KGIpIAorICAgIHsgCisgICAgICAgIFBhcnNlcjo6cmVtb3ZlTm9kZUN5Y2xlKHBh
cmFtLmdldCgpKTsKKyAgICB9CiAgICAgdmlydHVhbCB2b2lkIHByb2Nlc3NGdW5jRGVjbChFeGVj
U3RhdGUqKTsKICAgICB2aXJ0dWFsIHZvaWQgc3RyZWFtVG8oU291cmNlU3RyZWFtJikgY29uc3Q7
Ci0gIHByaXZhdGU6CiAgICAgSWRlbnRpZmllciBpZGVudDsKICAgICBSZWZQdHI8UGFyYW1ldGVy
Tm9kZT4gcGFyYW07CiAgICAgUmVmUHRyPEZ1bmN0aW9uQm9keU5vZGU+IGJvZHk7CiAgIH07CiAK
ICAgLy8gQSBsaW5rZWQgbGlzdCBvZiBzb3VyY2UgZWxlbWVudCBub2RlcwotICBjbGFzcyBTb3Vy
Y2VFbGVtZW50c05vZGUgOiBwdWJsaWMgU3RhdGVtZW50Tm9kZSB7Ci0gIHB1YmxpYzoKKyAgc3Ry
dWN0IFNvdXJjZUVsZW1lbnRzTm9kZSA6IHB1YmxpYyBTdGF0ZW1lbnROb2RlIHsKICAgICAgIHN0
YXRpYyBpbnQgY291bnQ7CiAgICAgLy8gbGlzdCBwb2ludGVyIGlzIHRhaWwgb2YgYSBjaXJjdWxh
ciBsaXN0LCBjcmFja2VkIGluIHRoZSBCbG9ja05vZGUgKG9yIHN1YmNsYXNzKSBjdG9yCi0gICAg
U291cmNlRWxlbWVudHNOb2RlKFN0YXRlbWVudE5vZGUqKTsKKyAgICBTb3VyY2VFbGVtZW50c05v
ZGUoU3RhdGVtZW50Tm9kZSAqczEpOwogICAgIFNvdXJjZUVsZW1lbnRzTm9kZShTb3VyY2VFbGVt
ZW50c05vZGUgKnMxLCBTdGF0ZW1lbnROb2RlICpzMik7CiAgICAgCi0gICAgQ29tcGxldGlvbiBl
eGVjdXRlKEV4ZWNTdGF0ZSopOwogICAgIHZvaWQgcHJvY2Vzc0Z1bmNEZWNsKEV4ZWNTdGF0ZSop
OwogICAgIHZpcnR1YWwgdm9pZCBwcm9jZXNzVmFyRGVjbHMoRXhlY1N0YXRlKik7CiAgICAgdmly
dHVhbCB2b2lkIHN0cmVhbVRvKFNvdXJjZVN0cmVhbSYpIGNvbnN0OwogICAgIFBhc3NSZWZQdHI8
U291cmNlRWxlbWVudHNOb2RlPiByZWxlYXNlTmV4dCgpIHsgcmV0dXJuIG5leHQucmVsZWFzZSgp
OyB9CiAgICAgdmlydHVhbCB2b2lkIGJyZWFrQ3ljbGUoKTsKLSAgcHJpdmF0ZToKLSAgICBmcmll
bmQgY2xhc3MgQmxvY2tOb2RlOwogICAgIFJlZlB0cjxTdGF0ZW1lbnROb2RlPiBub2RlOwogICAg
IExpc3RSZWZQdHI8U291cmNlRWxlbWVudHNOb2RlPiBuZXh0OwogICB9OwogCi0gIGNsYXNzIFBy
b2dyYW1Ob2RlIDogcHVibGljIEZ1bmN0aW9uQm9keU5vZGUgewotICBwdWJsaWM6CisgIHN0cnVj
dCBQcm9ncmFtTm9kZSA6IHB1YmxpYyBGdW5jdGlvbkJvZHlOb2RlIHsKICAgICBQcm9ncmFtTm9k
ZShTb3VyY2VFbGVtZW50c05vZGUgKnMpOwogICB9OwogCkluZGV4OiBranMvY29tcGxldGlvbi5o
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIGtqcy9jb21wbGV0aW9uLmgJKHJldmlzaW9uIDEzNzQ1KQorKysga2pz
L2NvbXBsZXRpb24uaAkod29ya2luZyBjb3B5KQpAQCAtMzMsNyArMzMsMTcgQEAgbmFtZXNwYWNl
IEtKUyB7CiAgIC8qKgogICAgKiBDb21wbGV0aW9uIHR5cGVzLgogICAgKi8KLSAgZW51bSBDb21w
bFR5cGUgeyBOb3JtYWwsIEJyZWFrLCBDb250aW51ZSwgUmV0dXJuVmFsdWUsIFRocm93IH07Cisg
IGVudW0gQ29tcGxUeXBlIHsKKyAgICBOb3JtYWwgICAgICA9IDEgPDwgMCwKKyAgICBCcmVhayAg
ICAgICA9IDEgPDwgMSwKKyAgICBDb250aW51ZSAgICA9IDEgPDwgMiwKKyAgICBSZXR1cm5WYWx1
ZSA9IDEgPDwgMywKKyAgICBUaHJvdyAgICAgICA9IDEgPDwgNCwKKyAgICAgIAorICAgIFNjb3Bl
ICAgICAgID0gMSA8PCA1LCAvLyBGSVhNRTogVGhpcyBpc24ndCBhIHJlYWwgdW53aW5kIHR5cGUg
LS0gd2Ugc2hvdWxkIGRvIHNvbWV0aGluZyBjbGVhcmVyCisgICAgICAKKyAgICBBbGwgICAgICAg
ICA9IE5vcm1hbCB8IEJyZWFrIHwgQ29udGludWUgfCBSZXR1cm5WYWx1ZSB8IFRocm93CisgIH07
CiAKICAgLyoqCiAgICAqIENvbXBsZXRpb24gb2JqZWN0cyBhcmUgdXNlZCB0byBjb252ZXkgdGhl
IHJldHVybiBzdGF0dXMgYW5kIHZhbHVlCkluZGV4OiBranMvcmVmZXJlbmNlX2xpc3QuY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIGtqcy9yZWZlcmVuY2VfbGlzdC5jcHAJKHJldmlzaW9uIDEzNzQ1KQorKysg
a2pzL3JlZmVyZW5jZV9saXN0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtODcsNyArODcsNiBAQCB2
b2lkIFJlZmVyZW5jZUxpc3Q6OnN3YXAoUmVmZXJlbmNlTGlzdCAmCiAgIHRhaWwgPSB0bXBUYWls
OwogfQogCi0KIHZvaWQgUmVmZXJlbmNlTGlzdDo6YXBwZW5kKGNvbnN0IFJlZmVyZW5jZSYgcmVm
KQogewogICBpZiAodGFpbCA9PSBOVUxMKSB7CkBAIC0xMjIsMjAgKzEyMSwyMCBAQCBSZWZlcmVu
Y2VMaXN0Ojp+UmVmZXJlbmNlTGlzdCgpCiAgICAgCiBSZWZlcmVuY2VMaXN0SXRlcmF0b3IgUmVm
ZXJlbmNlTGlzdDo6YmVnaW4oKSBjb25zdAogewotICByZXR1cm4gUmVmZXJlbmNlTGlzdEl0ZXJh
dG9yKGhlYWQpOworICByZXR1cm4gUmVmZXJlbmNlTGlzdEl0ZXJhdG9yKCp0aGlzLCBoZWFkKTsK
IH0KIAogUmVmZXJlbmNlTGlzdEl0ZXJhdG9yIFJlZmVyZW5jZUxpc3Q6OmVuZCgpIGNvbnN0CiB7
Ci0gIHJldHVybiBSZWZlcmVuY2VMaXN0SXRlcmF0b3IoTlVMTCk7CisgIHJldHVybiBSZWZlcmVu
Y2VMaXN0SXRlcmF0b3IoKnRoaXMsIE5VTEwpOwogfQogCiAKIC8vIFJlZmVyZW5jZUxpc3RJdGVy
YXRvcgogCiAKLVJlZmVyZW5jZUxpc3RJdGVyYXRvcjo6UmVmZXJlbmNlTGlzdEl0ZXJhdG9yKFJl
ZmVyZW5jZUxpc3ROb2RlICpuKSA6Ci0gIG5vZGUobikKK1JlZmVyZW5jZUxpc3RJdGVyYXRvcjo6
UmVmZXJlbmNlTGlzdEl0ZXJhdG9yKGNvbnN0IFJlZmVyZW5jZUxpc3QmIGwsIFJlZmVyZW5jZUxp
c3ROb2RlICpuKSAKKyAgICA6IGxpc3QobCksIG5vZGUobikKIHsKIH0KIApJbmRleDoga2pzL2Nv
bnRleHQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBranMvY29udGV4dC5oCShyZXZpc2lvbiAxMzc0NSkKKysr
IGtqcy9jb250ZXh0LmgJKHdvcmtpbmcgY29weSkKQEAgLTU0LDE1ICs1NCw2IEBAIG5hbWVzcGFj
ZSBLSlMgIHsKICAgICB2b2lkIHB1c2hTY29wZShKU09iamVjdCAqcykgeyBzY29wZS5wdXNoKHMp
OyB9CiAgICAgdm9pZCBwb3BTY29wZSgpIHsgc2NvcGUucG9wKCk7IH0KICAgICBMYWJlbFN0YWNr
ICpzZWVuTGFiZWxzKCkgeyByZXR1cm4gJmxzOyB9Ci0KLQotICAgIHZvaWQgcHVzaEl0ZXJhdGlv
bigpIHsgbV9pdGVyYXRpb25EZXB0aCsrOyB9Ci0gICAgdm9pZCBwb3BJdGVyYXRpb24oKSB7IG1f
aXRlcmF0aW9uRGVwdGgtLTsgfQotICAgIGJvb2wgaW5JdGVyYXRpb24oKSBjb25zdCB7IHJldHVy
biAobV9pdGVyYXRpb25EZXB0aCA+IDApOyB9Ci0gICAgCi0gICAgdm9pZCBwdXNoU3dpdGNoKCkg
eyBtX3N3aXRjaERlcHRoKys7IH0KLSAgICB2b2lkIHBvcFN3aXRjaCgpIHsgbV9zd2l0Y2hEZXB0
aC0tOyB9Ci0gICAgYm9vbCBpblN3aXRjaCgpIGNvbnN0IHsgcmV0dXJuIChtX3N3aXRjaERlcHRo
ID4gMCk7IH0KICAgICAgICAgCiAgICAgdm9pZCBtYXJrKCk7CiAKSW5kZXg6IGtqcy9UcmVlQ29k
ZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0ga2pzL1RyZWVDb2RlLmNwcAkocmV2aXNpb24gMCkKKysrIGtq
cy9UcmVlQ29kZS5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMjQwMCBAQAorLyoKKyAqICBU
aGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgS0RFIGxpYnJhcmllcworICogIENvcHlyaWdodCAoQykg
MTk5OS0yMDAyIEhhcnJpIFBvcnRlbiAocG9ydGVuQGtkZS5vcmcpCisgKiAgQ29weXJpZ2h0IChD
KSAyMDAxIFBldGVyIEtlbGx5IChwbWtAcG9zdC5jb20pCisgKiAgQ29weXJpZ2h0IChDKSAyMDAz
IEFwcGxlIENvbXB1dGVyLCBJbmMuCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3
YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIg
dGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2Ug
YXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICog
IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIg
dmVyc2lvbi4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3Bl
IHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3
aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkg
b3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIExp
YnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZ
b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFs
IFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmls
ZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBG
b3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogIEJv
c3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgi
CisjaW5jbHVkZSAibm9kZXMuaCIKKworI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxhc3Nl
cnQuaD4KKyNpZmRlZiBLSlNfREVCVUdfTUVNCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRl
IDx0eXBlaW5mbz4KKyNlbmRpZgorCisjaW5jbHVkZSAiY29sbGVjdG9yLmgiCisjaW5jbHVkZSAi
Y29udGV4dC5oIgorI2luY2x1ZGUgImRlYnVnZ2VyLmgiCisjaW5jbHVkZSAiZnVuY3Rpb25fb2Jq
ZWN0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJ2YWx1ZS5oIgorI2luY2x1
ZGUgIm9iamVjdC5oIgorI2luY2x1ZGUgInR5cGVzLmgiCisjaW5jbHVkZSAiaW50ZXJwcmV0ZXIu
aCIKKyNpbmNsdWRlICJsZXhlci5oIgorI2luY2x1ZGUgIm9wZXJhdGlvbnMuaCIKKyNpbmNsdWRl
ICJ1c3RyaW5nLmgiCisjaW5jbHVkZSAicmVmZXJlbmNlX2xpc3QuaCIKKyNpbmNsdWRlIDxreG1s
Y29yZS9IYXNoU2V0Lmg+CisjaW5jbHVkZSA8a3htbGNvcmUvSGFzaENvdW50ZWRTZXQuaD4KKyNp
bmNsdWRlICJJbnRlcnByZXRlclN0YXRlLmgiCisKK25hbWVzcGFjZSBLSlMgeworCitjb25zdCBj
aGFyKiBuYW1lRm9ySW50ZXJwcmV0ZXJTdGF0ZVtMYXN0SW50ZXJwcmV0ZXJTdGF0ZSsxXSA9IHsK
KyAgICAiSW50ZXJuYWxFcnJvclN0YXRlIiwKKyNkZWZpbmUgUFJJTlRfQVNfU1RSSU5HKG5hbWUp
ICNuYW1lICwKKyAgICBFVkFMVUFURV9NQUNST19GT1JfRUFDSF9FVkFMVUFURV9TVEFURShQUklO
VF9BU19TVFJJTkcpCisKKyAgICAiRXZhbHVhdGVfRXZhbHVhdGVMaXN0X0JvdW5kYXJ5IiwKKyAg
ICAKKyAgICBFVkFMVUFURV9NQUNST19GT1JfRUFDSF9FVkFMVUFURV9MSVNUX1NUQVRFKFBSSU5U
X0FTX1NUUklORykKKyAgICAKKyAgICAiRXZhbHVhdGVMaXN0X0V4ZWN1dGVfQm91bmRhcnkiLAor
ICAgIAorICAgIEVWQUxVQVRFX01BQ1JPX0ZPUl9FQUNIX0VYRUNVVEVfU1RBVEUoUFJJTlRfQVNf
U1RSSU5HKQorI3VuZGVmIFBSSU5UX0FTX1NUUklORworICAgICJMYXN0SW50ZXJwcmV0ZXJTdGF0
ZSIKK307CisKKyNkZWZpbmUgUkVUVVJOX0NPTVBMRVRJT04oYykgZG8geyBcCisgICAgaW50ZXJw
cmV0ZXItPnNldENvbXBsZXRpb25SZXR1cm4oYyk7IFwKKyAgICBnb3RvIGludGVycHJldGVyX3N0
YXRlX3N3aXRjaF9lbmQ7IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgUkVUVVJOX05PUk1BTF9D
T01QTEVUSU9OKCkgZG8geyBcCisgICAgQVNTRVJUKGludGVycHJldGVyLT5nZXRDb21wbGV0aW9u
UmV0dXJuKCkuY29tcGxUeXBlKCkgPT0gTm9ybWFsKTsgXAorICAgIGdvdG8gaW50ZXJwcmV0ZXJf
c3RhdGVfc3dpdGNoX2VuZDsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBLSlNfQ0hFQ0tFWENF
UFRJT04oKSBcCitpZiAoZXhlYy0+aGFkRXhjZXB0aW9uKCkpIHsgXAorICAgIGN1cnJlbnROb2Rl
LT5zZXRFeGNlcHRpb25EZXRhaWxzSWZOZWVkZWQoZXhlYyk7IFwKKyAgICBSRVRVUk5fQ09NUExF
VElPTihDb21wbGV0aW9uKFRocm93LCBleGVjLT5leGNlcHRpb24oKSkpOyBcCit9CisKK3N0YXRp
YyBpbmxpbmUgaW50IGN1cnJlbnRTb3VyY2VJZChFeGVjU3RhdGUqIGV4ZWMpCit7CisgICAgcmV0
dXJuIGV4ZWMtPmNvbnRleHQoKS5pbXAoKS0+Y3VycmVudEJvZHkoKS0+c291cmNlSWQoKTsKK30K
Kworc3RhdGljIGNvbnN0IGNoYXIgKmRvdEV4cHJOb3RBbk9iamVjdFN0cmluZygpCit7CisgICAg
cmV0dXJuICJWYWx1ZSAlcyAocmVzdWx0IG9mIGV4cHJlc3Npb24gJXMuJXMpIGlzIG5vdCBvYmpl
Y3QuIjsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmRvdEV4cHJEb2VzTm90QWxsb3dDYWxsc1N0
cmluZygpIAoreworICAgIHJldHVybiAiT2JqZWN0ICVzIChyZXN1bHQgb2YgZXhwcmVzc2lvbiAl
cy4lcykgZG9lcyBub3QgYWxsb3cgY2FsbHMuIjsKK30KKworSlNWYWx1ZSAqdHlwZVN0cmluZ0Zv
clZhbHVlKEpTVmFsdWUgKnYpCit7CisgICAgc3dpdGNoICh2LT50eXBlKCkpIHsKKyAgICAgICAg
Y2FzZSBVbmRlZmluZWRUeXBlOgorICAgICAgICAgICAgcmV0dXJuIGpzU3RyaW5nKCJ1bmRlZmlu
ZWQiKTsKKyAgICAgICAgY2FzZSBOdWxsVHlwZToKKyAgICAgICAgICAgIHJldHVybiBqc1N0cmlu
Zygib2JqZWN0Iik7CisgICAgICAgIGNhc2UgQm9vbGVhblR5cGU6CisgICAgICAgICAgICByZXR1
cm4ganNTdHJpbmcoImJvb2xlYW4iKTsKKyAgICAgICAgY2FzZSBOdW1iZXJUeXBlOgorICAgICAg
ICAgICAgcmV0dXJuIGpzU3RyaW5nKCJudW1iZXIiKTsKKyAgICAgICAgY2FzZSBTdHJpbmdUeXBl
OgorICAgICAgICAgICAgcmV0dXJuIGpzU3RyaW5nKCJzdHJpbmciKTsKKyAgICAgICAgZGVmYXVs
dDoKKyAgICAgICAgICAgIGlmICh2LT5pc09iamVjdCgpKSB7CisgICAgICAgICAgICAgICAgLy8g
UmV0dXJuICJ1bmRlZmluZWQiIGZvciBvYmplY3RzIHRoYXQgc2hvdWxkIGJlIHRyZWF0ZWQKKyAg
ICAgICAgICAgICAgICAvLyBhcyBudWxsIHdoZW4gZG9pbmcgY29tcGFyaXNvbnMuCisgICAgICAg
ICAgICAgICAgaWYgKHN0YXRpY19jYXN0PEpTT2JqZWN0Kj4odiktPm1hc3F1ZXJhZGVBc1VuZGVm
aW5lZCgpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4ganNTdHJpbmcoInVuZGVmaW5lZCIp
OyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0YXRpY19jYXN0PEpTT2Jq
ZWN0Kj4odiktPmltcGxlbWVudHNDYWxsKCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBq
c1N0cmluZygiZnVuY3Rpb24iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAg
ICAgICAgcmV0dXJuIGpzU3RyaW5nKCJvYmplY3QiKTsKKyAgICB9Cit9CisKK3N0YXRpYyBBTFdB
WVNfSU5MSU5FIEpTVmFsdWUgKnZhbHVlRm9yUmVhZE1vZGlmeUFzc2lnbm1lbnQoRXhlY1N0YXRl
ICogZXhlYywgSlNWYWx1ZSAqdjEsIEpTVmFsdWUgKnYyLCBPcGVyYXRvciBvcGVyKQoreworICAg
IEpTVmFsdWUgKnY7CisgICAgaW50IGkxOworICAgIGludCBpMjsKKyAgICB1bnNpZ25lZCBpbnQg
dWk7CisgICAgc3dpdGNoIChvcGVyKSB7CisgICAgICAgIGNhc2UgT3BNdWx0RXE6CisgICAgICAg
ICAgICB2ID0gbXVsdChleGVjLCB2MSwgdjIsICcqJyk7CisgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgY2FzZSBPcERpdkVxOgorICAgICAgICAgICAgdiA9IG11bHQoZXhlYywgdjEsIHYyLCAn
LycpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT3BQbHVzRXE6CisgICAgICAg
ICAgICB2ID0gYWRkKGV4ZWMsIHYxLCB2MiwgJysnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICBjYXNlIE9wTWludXNFcToKKyAgICAgICAgICAgIHYgPSBhZGQoZXhlYywgdjEsIHYyLCAn
LScpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT3BMU2hpZnQ6CisgICAgICAg
ICAgICBpMSA9IHYxLT50b0ludDMyKGV4ZWMpOworICAgICAgICAgICAgaTIgPSB2Mi0+dG9JbnQz
MihleGVjKTsKKyAgICAgICAgICAgIHYgPSBqc051bWJlcihpMSA8PCBpMik7CisgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgY2FzZSBPcFJTaGlmdDoKKyAgICAgICAgICAgIGkxID0gdjEtPnRv
SW50MzIoZXhlYyk7CisgICAgICAgICAgICBpMiA9IHYyLT50b0ludDMyKGV4ZWMpOworICAgICAg
ICAgICAgdiA9IGpzTnVtYmVyKGkxID4+IGkyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICBjYXNlIE9wVVJTaGlmdDoKKyAgICAgICAgICAgIHVpID0gdjEtPnRvVUludDMyKGV4ZWMpOwor
ICAgICAgICAgICAgaTIgPSB2Mi0+dG9JbnQzMihleGVjKTsKKyAgICAgICAgICAgIHYgPSBqc051
bWJlcih1aSA+PiBpMik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPcEFuZEVx
OgorICAgICAgICAgICAgaTEgPSB2MS0+dG9JbnQzMihleGVjKTsKKyAgICAgICAgICAgIGkyID0g
djItPnRvSW50MzIoZXhlYyk7CisgICAgICAgICAgICB2ID0ganNOdW1iZXIoaTEgJiBpMik7Cisg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPcFhPckVxOgorICAgICAgICAgICAgaTEg
PSB2MS0+dG9JbnQzMihleGVjKTsKKyAgICAgICAgICAgIGkyID0gdjItPnRvSW50MzIoZXhlYyk7
CisgICAgICAgICAgICB2ID0ganNOdW1iZXIoaTEgXiBpMik7CisgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgY2FzZSBPcE9yRXE6CisgICAgICAgICAgICBpMSA9IHYxLT50b0ludDMyKGV4ZWMp
OworICAgICAgICAgICAgaTIgPSB2Mi0+dG9JbnQzMihleGVjKTsKKyAgICAgICAgICAgIHYgPSBq
c051bWJlcihpMSB8IGkyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9wTW9k
RXE6IHsKKyAgICAgICAgICAgIGRvdWJsZSBkMSA9IHYxLT50b051bWJlcihleGVjKTsKKyAgICAg
ICAgICAgIGRvdWJsZSBkMiA9IHYyLT50b051bWJlcihleGVjKTsKKyAgICAgICAgICAgIHYgPSBq
c051bWJlcihmbW9kKGQxLCBkMikpOworICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFzc2VydChmYWxzZSk7CisgICAgICAgICAgICB2
ID0ganNVbmRlZmluZWQoKTsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIHY7Cit9CisKKyNkZWZp
bmUgU0VUX1ZBTFVFX1JFVFVSTih2KSBcCisgICAgaW50ZXJwcmV0ZXItPnNldFZhbHVlUmV0dXJu
KHYpCisKKy8vIFNldCB0aGlzIHRvIDEgdG8gc2VlIGxvZ2dpbmcuCisjZGVmaW5lIFRSQUNFX0VY
RUNVVElPTiAwCisKKyNpZiBUUkFDRV9FWEVDVVRJT04KKyNkZWZpbmUgUFVTSF9MT0NBTF9WQUxV
RSh2YWx1ZSkgXAorICAgIChwcmludGYoIlBVU0ggJXMgKCVpKSBjYWxsZWQgb24gJXAsIHB1c2hp
bmcgJXAsIHByZS1wdXNoIGRlcHRoOiAlaVxuIiwgbmFtZUZvckludGVycHJldGVyU3RhdGVbc3Rh
dGVQYWlyLnN0YXRlXSwgc3RhdGVQYWlyLnN0YXRlLCBzdGF0ZVBhaXIubm9kZSwgdmFsdWUsIGlu
dGVycHJldGVyLT52YWx1ZVN0YWNrRGVwdGgoKSksIGludGVycHJldGVyLT5wdXNoVmFsdWVMb2Nh
bCh2YWx1ZSkpCisKKyNkZWZpbmUgUE9QX0xPQ0FMX1ZBTFVFKCkgKHByaW50ZigiUE9QICVzICgl
aSkgY2FsbGVkIG9uICVwLCBwb3BwaW5nLCBwcmUtcG9wIGRlcHRoOiAlaVxuIiwgbmFtZUZvcklu
dGVycHJldGVyU3RhdGVbc3RhdGVQYWlyLnN0YXRlXSwgc3RhdGVQYWlyLnN0YXRlLCBzdGF0ZVBh
aXIubm9kZSwgaW50ZXJwcmV0ZXItPnZhbHVlU3RhY2tEZXB0aCgpKSwgYXNzZXJ0KGludGVycHJl
dGVyLT52YWx1ZVN0YWNrRGVwdGgoKSA+IHN0YWNrQmFzZS52YWx1ZVN0YWNrU2l6ZSksIGludGVy
cHJldGVyLT5wb3BWYWx1ZUxvY2FsKCkpCisKKyNkZWZpbmUgUkVUVVJOX1ZBTFVFKHZhbHVlKSBc
Cit7XAorICAgIEpTVmFsdWUqIHZhbCA9IHZhbHVlOyBcCisgICAgcHJpbnRmKCJSRVRVUk4gJXMg
KCVpKSBjYWxsZWQgb24gJXAsIHJldHVybmluZyAlcFxuIiwgbmFtZUZvckludGVycHJldGVyU3Rh
dGVbc3RhdGVQYWlyLnN0YXRlXSwgc3RhdGVQYWlyLnN0YXRlLCBzdGF0ZVBhaXIubm9kZSwgdmFs
KTsgXAorICAgIFNFVF9WQUxVRV9SRVRVUk4odmFsKTsgXAorICAgIGdvdG8gaW50ZXJwcmV0ZXJf
c3RhdGVfc3dpdGNoX2VuZDsgXAorfQorCisjZGVmaW5lIFNFVF9KVU1QX1NUQVRFKG5leHRTdGF0
ZSwgbmV4dE5vZGUpIFwKK3sgXAorICAgIHByaW50ZigiSlVNUCAlcyAoJWkpIGNhbGxlZCBvbiAl
cCwganVtcGluZyB0byAlcyAoJWkpIG9uICVwXG4iLCBuYW1lRm9ySW50ZXJwcmV0ZXJTdGF0ZVtz
dGF0ZVBhaXIuc3RhdGVdLCBzdGF0ZVBhaXIuc3RhdGUsIHN0YXRlUGFpci5ub2RlLCBuYW1lRm9y
SW50ZXJwcmV0ZXJTdGF0ZVtuZXh0U3RhdGVdLCBuZXh0U3RhdGUsIG5leHROb2RlKTsgXAorICAg
IEFTU0VSVChuZXh0U3RhdGUgIT0gc3RhdGVQYWlyLnN0YXRlKTsgXAorICAgIGludGVycHJldGVy
LT5wdXNoTmV4dFN0YXRlKEludGVycHJldGVySW1wOjpTdGF0ZShuZXh0U3RhdGUsIG5leHROb2Rl
KSk7IFwKK30KKworI2Vsc2UKKworI2RlZmluZSBQVVNIX0xPQ0FMX1ZBTFVFKHZhbHVlKSBpbnRl
cnByZXRlci0+cHVzaFZhbHVlTG9jYWwodmFsdWUpCisjZGVmaW5lIFBPUF9MT0NBTF9WQUxVRSgp
IChhc3NlcnQoaW50ZXJwcmV0ZXItPnZhbHVlU3RhY2tEZXB0aCgpID4gc3RhY2tCYXNlLnZhbHVl
U3RhY2tTaXplKSwgaW50ZXJwcmV0ZXItPnBvcFZhbHVlTG9jYWwoKSkKKworI2RlZmluZSBSRVRV
Uk5fVkFMVUUodmFsdWUpIFwKK2RvIHtcCisgICAgU0VUX1ZBTFVFX1JFVFVSTih2YWx1ZSk7IFwK
KyAgICBnb3RvIGludGVycHJldGVyX3N0YXRlX3N3aXRjaF9lbmQ7IFwKK30gd2hpbGUgKDApCisK
Ky8vIEFsbCBjb2RlIHNob3VsZCB1c2UgU0VUX0NPTlRJTlVFX1NUQVRFIHdoZW4gcG9zc2libGUs
IGFzIGl0IHBlcmZvcm1zIGFkZGl0aW9uYWwgc2FuaXR5IGNoZWNrcy4KKyNkZWZpbmUgU0VUX0pV
TVBfU1RBVEUobmV4dFN0YXRlLCBuZXh0Tm9kZSkgXAorZG8geyBcCisgICAgQVNTRVJUKG5leHRT
dGF0ZSAhPSBzdGF0ZVBhaXIuc3RhdGUpOyBcCisgICAgaW50ZXJwcmV0ZXItPnB1c2hOZXh0U3Rh
dGUoSW50ZXJwcmV0ZXJJbXA6OlN0YXRlKG5leHRTdGF0ZSwgbmV4dE5vZGUpKTsgXAorfSB3aGls
ZSAoMCkKKworI2VuZGlmCisKKy8vIFRoaXMgY2FuIG9ubHkgYmUgdXNlZCBmb3IgY2FsbGluZyB5
b3Vyc2VsZi4KKyNkZWZpbmUgU0VUX0xPT1BfU1RBVEUobmV4dFN0YXRlKSBcCitkbyB7IFwKKyAg
ICBBU1NFUlQobmV4dFN0YXRlID09IHN0YXRlUGFpci5zdGF0ZSk7IFwKKyAgICBpbnRlcnByZXRl
ci0+cHVzaE5leHRTdGF0ZShJbnRlcnByZXRlckltcDo6U3RhdGUobmV4dFN0YXRlLCBjdXJyZW50
Tm9kZSkpOyBcCit9IHdoaWxlICgwKQorCisKKyNkZWZpbmUgUEVFS19MT0NBTF9WQUxVRSgpIChh
c3NlcnQoaW50ZXJwcmV0ZXItPnZhbHVlU3RhY2tEZXB0aCgpID4gc3RhY2tCYXNlLnZhbHVlU3Rh
Y2tTaXplKSwgaW50ZXJwcmV0ZXItPnBlZWtWYWx1ZUxvY2FsKCkpCisKKyNkZWZpbmUgUFVTSF9M
SVNUKGxpc3QpIGludGVycHJldGVyLT5wdXNoTGlzdFJldHVybihsaXN0KQorI2RlZmluZSBQRUVL
X0xJU1QoKSAoYXNzZXJ0KGludGVycHJldGVyLT5saXN0U3RhY2tEZXB0aCgpID4gc3RhY2tCYXNl
Lmxpc3RTdGFja1NpemUpLCBpbnRlcnByZXRlci0+cGVla0xpc3RSZXR1cm4oKSkKKyNkZWZpbmUg
UE9QX0xJU1QoKSAoYXNzZXJ0KGludGVycHJldGVyLT5saXN0U3RhY2tEZXB0aCgpID4gc3RhY2tC
YXNlLmxpc3RTdGFja1NpemUpLCBpbnRlcnByZXRlci0+cG9wTGlzdFJldHVybigpKQorCisjZGVm
aW5lIFBVU0hfTk9ERShub2RlKSBpbnRlcnByZXRlci0+cHVzaE5vZGVMb2NhbChub2RlKQorI2Rl
ZmluZSBQRUVLX05PREUoKSAoYXNzZXJ0KGludGVycHJldGVyLT5ub2RlU3RhY2tEZXB0aCgpID4g
c3RhY2tCYXNlLm5vZGVTdGFja1NpemUpLCBpbnRlcnByZXRlci0+cGVla05vZGVMb2NhbCgpKQor
I2RlZmluZSBQT1BfTk9ERSgpIChhc3NlcnQoaW50ZXJwcmV0ZXItPm5vZGVTdGFja0RlcHRoKCkg
PiBzdGFja0Jhc2Uubm9kZVN0YWNrU2l6ZSksIGludGVycHJldGVyLT5wb3BOb2RlTG9jYWwoKSkK
KworLy8gRkFMTF9USFJPVUdIIGlzIHVzZWQgaW4gZGVidWcgYnVpbGRzIHRvIGFsbG93IHByb3Bl
ciBhc3NlcnQgY2hlY2tpbmcgZXZlbgorLy8gd2hlbiBzb21lIHN0YXRlcyBmYWxsIHRocm91Z2gg
dG8gYW5vdGhlciAodGh1cyBub3QgY2hhbmdpbmcgdGhlIGN1cnJlbnQgc3RhdGUpCisjaWZuZGVm
IE5ERUJVRworI2RlZmluZSBGQUxMX1RIUk9VR0goKSBcCisgICAgc3RhdGVQYWlyLnN0YXRlID0g
KEludGVycHJldGVyU3RhdGUpKHN0YXRlUGFpci5zdGF0ZSArIDEpCisjZWxzZQorI2RlZmluZSBG
QUxMX1RIUk9VR0goKQorI2VuZGlmCisKKyNkZWZpbmUgUkVUVVJOX0xJU1QobGlzdCkgXAorZG8g
e1wKKyAgICBQVVNIX0xJU1QobGlzdCk7IFwKKyAgICBnb3RvIGludGVycHJldGVyX3N0YXRlX3N3
aXRjaF9lbmQ7IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgSVNfRVZBTFVBVEVfU1RBVEUoc3Rh
dGUpIFwKKyAgICAoc3RhdGUgPiBJbnRlcm5hbEVycm9yU3RhdGUgJiYgc3RhdGUgPCBFdmFsdWF0
ZV9FdmFsdXRlTGlzdF9Cb3VuZGFyeSkKKworI2RlZmluZSBJU19FVkFMVUFURV9MSVNUX1NUQVRF
KHN0YXRlKSBcCisgICAgKHN0YXRlID4gRXZhbHVhdGVfRXZhbHV0ZUxpc3RfQm91bmRhcnkgJiYg
c3RhdGUgPCBFdmFsdWF0ZUxpc3RfRXhlY3V0ZV9Cb3VuZGFyeSkKKworI2RlZmluZSBJU19FWEVD
VVRFX1NUQVRFKHN0YXRlKSBcCisgICAgKHN0YXRlID4gRXZhbHVhdGVMaXN0X0V4ZWN1dGVfQm91
bmRhcnkgJiYgc3RhdGUgPCBMYXN0SW50ZXJwcmV0ZXJTdGF0ZSkKKworI2RlZmluZSBQVVNIX0VW
QUxVQVRFKG5vZGUpIFwKK2RvIHsgXAorICAgIEludGVycHJldGVyU3RhdGUgbmV4dFN0YXRlID0g
bm9kZS0+aW50ZXJwcmV0ZXJTdGF0ZSgpOyBcCisgICAgQVNTRVJUKElTX0VWQUxVQVRFX1NUQVRF
KG5leHRTdGF0ZSkpOyBcCisgICAgaW50ZXJwcmV0ZXItPnB1c2hOZXh0U3RhdGUoSW50ZXJwcmV0
ZXJJbXA6OlN0YXRlKG5leHRTdGF0ZSwgbm9kZSkpOyBcCit9IHdoaWxlICgwKQorICAgIAorI2Rl
ZmluZSBQVVNIX0VWQUxVQVRFX0xJU1Qobm9kZSkgXAorZG8geyBcCisgICAgSW50ZXJwcmV0ZXJT
dGF0ZSBuZXh0U3RhdGUgPSBub2RlLT5pbnRlcnByZXRlclN0YXRlKCk7IFwKKyAgICBBU1NFUlQo
SVNfRVZBTFVBVEVfTElTVF9TVEFURShuZXh0U3RhdGUpKTsgXAorICAgIGludGVycHJldGVyLT5w
dXNoTmV4dFN0YXRlKEludGVycHJldGVySW1wOjpTdGF0ZShuZXh0U3RhdGUsIG5vZGUpKTsgXAor
fSB3aGlsZSAoMCkKKworI2RlZmluZSBQVVNIX0VYRUNVVEUobm9kZSkgXAorZG8geyBcCisgICAg
SW50ZXJwcmV0ZXJTdGF0ZSBuZXh0U3RhdGUgPSBub2RlLT5pbnRlcnByZXRlclN0YXRlKCk7IFwK
KyAgICBBU1NFUlQoSVNfRVhFQ1VURV9TVEFURShuZXh0U3RhdGUpKTsgXAorICAgIGludGVycHJl
dGVyLT5wdXNoTmV4dFN0YXRlKEludGVycHJldGVySW1wOjpTdGF0ZShuZXh0U3RhdGUsIG5vZGUp
KTsgXAorfSB3aGlsZSAoMCkKKworLy8gVGhpcyBleHBsaWNpdHkgY2hlY2tzIGZvciBjb250aW51
ZSBzdGF0ZSBidWdzCisvLyBGSVhNRTogVGhpcyBzaG91bGQgbm90IHRha2UgYW4gYXJndW1lbnQg
b25jZSB3ZSBoYXZlIGEgd2F5IHRvIGNoZWNrIGlmIGN1cnJlbnRTdGF0ZSsxID09IGEgc3Vic3Rh
dGUKKyNkZWZpbmUgU0VUX0NPTlRJTlVFX1NUQVRFKG5leHRTdGF0ZSkgXAorZG8geyBcCisgICAg
QVNTRVJUKG5leHRTdGF0ZSA9PSBzdGF0ZVBhaXIuc3RhdGUgKyAxKTsgXAorICAgIFNFVF9KVU1Q
X1NUQVRFKG5leHRTdGF0ZSwgY3VycmVudE5vZGUpOyBcCit9IHdoaWxlICgwKQorCisKKyNkZWZp
bmUgR0VUX0xBU1RfQ09NUExFVElPTigpIFwKKyAgICBpbnRlcnByZXRlci0+Z2V0Q29tcGxldGlv
blJldHVybigpCisgICAgCisjZGVmaW5lIEdFVF9WQUxVRV9SRVRVUk4oKSBcCisgICAgaW50ZXJw
cmV0ZXItPmdldFZhbHVlUmV0dXJuKCkKKworLy8gRklYTUU6IFJFVFVSTl9FUlJPUiBpcyBhIHN0
b3AtZ2FwLiAgRXZlbnR1YWxseSB0aHJvd0Vycm9yKiBzaG91bGQgYmUgZnJlZSBmdW5jdGlvbnMg
d2hpY2ggc2V0IHRoZSBpbnRlcnByZXRlciBjb21wbGV0aW9uIHRoZW1zZWx2ZXMKKyNkZWZpbmUg
UkVUVVJOX0VSUk9SKHZhbHVlKSAgIFJFVFVSTl9DT01QTEVUSU9OKENvbXBsZXRpb24oVGhyb3cs
IHZhbHVlKSkKKworI2RlZmluZSBSRVNFVF9DT01QTEVUSU9OX1RPX05PUk1BTCgpIFwKKyAgICBp
bnRlcnByZXRlci0+cmVzZXRDb21wbGV0aW9uVG9Ob3JtYWwoKQorCisjZGVmaW5lIFBVU0hfVU5X
SU5EX0JBUlJJRVIoYmFycmllclR5cGUsIHN0YXRlKSBcCisgICAgaW50ZXJwcmV0ZXItPnB1c2hV
bndpbmRCYXJyaWVyKGJhcnJpZXJUeXBlLCBJbnRlcnByZXRlckltcDo6U3RhdGUoc3RhdGUsIGN1
cnJlbnROb2RlKSk7CisKKyNkZWZpbmUgUE9QX1VOV0lORF9CQVJSSUVSKHR5cGUpIFwKK2RvIHsg
XAorICAgIEFTU0VSVChpbnRlcnByZXRlci0+cGVla1Vud2luZEJhcnJpZXIoKS5iYXJyaWVyVHlw
ZSA9PSB0eXBlKTsgXAorICAgIGludGVycHJldGVyLT5wb3BVbndpbmRCYXJyaWVyKCk7IFwKK30g
d2hpbGUgKDApCisgICAgCisjZGVmaW5lIEVYRUNVVEVfQU5EX0NPTlRJTlVFKG5vZGUsIG5leHRT
dGF0ZSkgXAorZG8geyBcCisgICAgU0VUX0NPTlRJTlVFX1NUQVRFKG5leHRTdGF0ZSk7IFwKKyAg
ICBQVVNIX0VYRUNVVEUobm9kZSk7IFwKKyAgICBnb3RvIGludGVycHJldGVyX3N0YXRlX3N3aXRj
aF9lbmQ7IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgRVhFQ1VURV9BTkRfSlVNUChub2RlLCBu
ZXh0U3RhdGUpIFwKK2RvIHsgXAorICAgIFNFVF9KVU1QX1NUQVRFKG5leHRTdGF0ZSwgY3VycmVu
dE5vZGUpOyBcCisgICAgUFVTSF9FWEVDVVRFKG5vZGUpOyBcCisgICAgZ290byBpbnRlcnByZXRl
cl9zdGF0ZV9zd2l0Y2hfZW5kOyBcCit9IHdoaWxlICgwKQorCisvLyBUaGlzIGNhbGwgY2FuIG9u
bHkgYmUgdXNlZCBmb3IgY29udGludWluZyB3aXRoIHRoZSBuZXh0IHN0YXRlCisvLyBVc2Ugb3Ro
ZXIgY2FsbHMgdG8ganVtcCBvciBsb29wLgorI2RlZmluZSBFVkFMVUFURV9BTkRfQ09OVElOVUUo
bm9kZSwgbmV4dFN0YXRlKSBcCitkbyB7IFwKKyAgICBTRVRfQ09OVElOVUVfU1RBVEUobmV4dFN0
YXRlKTsgXAorICAgIFBVU0hfRVZBTFVBVEUobm9kZSk7IFwKKyAgICBnb3RvIGludGVycHJldGVy
X3N0YXRlX3N3aXRjaF9lbmQ7IFwKK30gd2hpbGUgKDApCisKKy8vIEFsbCBjb2RlIHNob3VsZCB1
c2UgRVZBTFVBVEVfQU5EX0NPTlRJTlVFIHdoZW4gcG9zc2libGUsIGFzIGl0IHBlcmZvcm1zIGFk
ZGl0aW9uYWwgc2FuaXR5IGNoZWNrcy4KKyNkZWZpbmUgRVZBTFVBVEVfQU5EX0pVTVAobm9kZSwg
bmV4dFN0YXRlKSBcCitkbyB7IFwKKyAgICBTRVRfSlVNUF9TVEFURShuZXh0U3RhdGUsIGN1cnJl
bnROb2RlKTsgXAorICAgIFBVU0hfRVZBTFVBVEUobm9kZSk7IFwKKyAgICBnb3RvIGludGVycHJl
dGVyX3N0YXRlX3N3aXRjaF9lbmQ7IFwKK30gd2hpbGUgKDApCisKKy8vIFRoaXMgY2FsbCBjYW4g
b25seSBiZSB1c2VkIGZvciBjb250aW51aW5nIHdpdGggdGhlIG5leHQgc3RhdGUKKy8vIFVzZSBv
dGhlciBjYWxscyB0byBqdW1wIG9yIGxvb3AuCisjZGVmaW5lIEVWQUxVQVRFX0xJU1RfQU5EX0NP
TlRJTlVFKG5vZGUsIG5leHRTdGF0ZSkgXAorZG8geyBcCisgICAgU0VUX0NPTlRJTlVFX1NUQVRF
KG5leHRTdGF0ZSk7IFwKKyAgICBQVVNIX0VWQUxVQVRFX0xJU1Qobm9kZSk7IFwKKyAgICBnb3Rv
IGludGVycHJldGVyX3N0YXRlX3N3aXRjaF9lbmQ7IFwKK30gd2hpbGUgKDApCisKK3ZvaWQgcnVu
SW50ZXJwcmV0ZXJMb29wKEV4ZWNTdGF0ZSogZXhlYykKK3sKKyAgICBBU1NFUlQoIWV4ZWMtPmhh
ZEV4Y2VwdGlvbigpKTsKKyAgICAKKyAgICBib29sIGRlYnVnZ2VyQXR0YWNoZWQgPSBEZWJ1Z2dl
cjo6ZGVidWdnZXJzUHJlc2VudCA+IDA7CisKKyAgICBJbnRlcnByZXRlckltcCogaW50ZXJwcmV0
ZXIgPSBleGVjLT5keW5hbWljSW50ZXJwcmV0ZXIoKS0+aW1wKCk7CisgICAgSW50ZXJwcmV0ZXJJ
bXA6OlVud2luZEJhcnJpZXIgc3RhY2tCYXNlID0gaW50ZXJwcmV0ZXItPnBlZWtVbndpbmRCYXJy
aWVyKCk7CisgICAgCisgICAgd2hpbGUgKGludGVycHJldGVyLT5zdGF0ZVN0YWNrRGVwdGgoKSA+
IHN0YWNrQmFzZS5zdGF0ZVN0YWNrU2l6ZSkgeworICAgIAorICAgICAgICAvLyBGSVhNRTogQXMg
YSBsb29wIG9wdGltaXphdGlvbiwgd2Ugc2hvdWxkIGp1c3QgcGVlaywgaW5zdGVhZCBvZiBwb3Ag
aGVyZQorICAgICAgICAvLyBUaGVuIGV2ZXJ5IG5vbi1sb29wIGZ1bmN0aW9uIHdvdWxkIHBvcCBp
dHNlbGYuCisgICAgICAgIEludGVycHJldGVySW1wOjpTdGF0ZSBzdGF0ZVBhaXIgPSBpbnRlcnBy
ZXRlci0+cG9wTmV4dFN0YXRlKCk7CisgICAgICAgIE5vZGUqIGN1cnJlbnROb2RlID0gc3RhdGVQ
YWlyLm5vZGU7CisgICAgICAgIAorI2lmIFRSQUNFX0VYRUNVVElPTgorICAgICAgICBwcmludGYo
IkVYRUMgJXMgKCVpKSBvbiAlcCAoc3RhdGUgc3RhdGU6ICVpLCB2YWx1ZSBzdGFjazogJWkpXG4i
LCBuYW1lRm9ySW50ZXJwcmV0ZXJTdGF0ZVtzdGF0ZVBhaXIuc3RhdGVdLCBzdGF0ZVBhaXIuc3Rh
dGUsIHN0YXRlUGFpci5ub2RlLCBpbnRlcnByZXRlci0+c3RhdGVTdGFja0RlcHRoKCksIGludGVy
cHJldGVyLT52YWx1ZVN0YWNrRGVwdGgoKSk7CisjZW5kaWYKKworICAgICAgICAvLyBGSVhNRTog
VGhpcyBpcyB3cm9uZywgdGhpcyB3b24ndCBhY3R1YWxseSByZXR1cm4uCisgICAgICAgIGlmIChk
ZWJ1Z2dlckF0dGFjaGVkKSB7CisgICAgICAgICAgICBpZiAoSVNfRVhFQ1VURV9TVEFURShzdGF0
ZVBhaXIuc3RhdGUpICYmICFzdGF0aWNfY2FzdDxTdGF0ZW1lbnROb2RlKj4oY3VycmVudE5vZGUp
LT5oaXRTdGF0ZW1lbnQoZXhlYykpCisgICAgICAgICAgICAgICAgUkVUVVJOX05PUk1BTF9DT01Q
TEVUSU9OKCk7IC8vIEZJWE1FOiBEbyBzb21ldGhpbmcgdGhlIGRlYnVnZ2VyIGNhbiB1c2UKKyAg
ICAgICAgICAgIGlmIChpbnRlcnByZXRlci0+ZGVidWdnZXIoKSAmJiBpbnRlcnByZXRlci0+ZGVi
dWdnZXIoKS0+aW1wKCktPmFib3J0ZWQoKSkKKyAgICAgICAgICAgICAgICBSRVRVUk5fTk9STUFM
X0NPTVBMRVRJT04oKTsgLy8gRklYTUU6IERvIHNvbWV0aGluZyB0aGUgZGVidWdnZXIgY2FuIHVz
ZQorICAgICAgICB9CisKKyAgICAgICAgLy8gRklYTUU6IE9OTFkgY2hlY2sgd2hlbiBjaGVja2lu
ZyBpZiB3ZSd2ZSBydW4gdG9vIGxvbmcKKyAgICAgICAgaWYgKENvbGxlY3Rvcjo6aXNPdXRPZk1l
bW9yeSgpKQorICAgICAgICAgICAgUkVUVVJOX0NPTVBMRVRJT04oQ29tcGxldGlvbihUaHJvdywg
RXJyb3I6OmNyZWF0ZShleGVjLCBHZW5lcmFsRXJyb3IsICJPdXQgb2YgbWVtb3J5IikpKTsKKwor
ICAgICAgICBzd2l0Y2ggKHN0YXRlUGFpci5zdGF0ZSkgeworICAgICAgICAgICAgY2FzZSBJbnRl
cm5hbEVycm9yU3RhdGU6CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAg
ICAgICAgICAgICAgIC8vIHNob3VsZCBuZXZlciBiZSBjYWxsZWQKKyAgICAgICAgICAgICAgICBB
U1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgICAgICAgICBSRVRVUk5fVkFMVUUoKEpTVmFs
dWUqKTApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBjYXNlIE51
bGxOb2RlRXZhbHVhdGVTdGF0ZToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBSRVRV
Uk5fVkFMVUUoanNOdWxsKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAg
ICAgICBjYXNlIEJvb2xlYW5Ob2RlRXZhbHVhdGVTdGF0ZToKKyAgICAgICAgICAgIHsKKyAgICAg
ICAgICAgICAgICBSRVRVUk5fVkFMVUUoanNCb29sZWFuKHN0YXRpY19jYXN0PEJvb2xlYW5Ob2Rl
Kj4oY3VycmVudE5vZGUpLT52YWx1ZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisg
ICAgICAgICAgICBjYXNlIE51bWJlck5vZGVFdmFsdWF0ZVN0YXRlOgorICAgICAgICAgICAgewor
ICAgICAgICAgICAgICAgIFJFVFVSTl9WQUxVRShqc051bWJlcihzdGF0aWNfY2FzdDxOdW1iZXJO
b2RlKj4oY3VycmVudE5vZGUpLT52YWx1ZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAg
CisgICAgICAgICAgICBjYXNlIFN0cmluZ05vZGVFdmFsdWF0ZVN0YXRlOgorICAgICAgICAgICAg
eworICAgICAgICAgICAgICAgIFJFVFVSTl9WQUxVRShqc1N0cmluZyhzdGF0aWNfY2FzdDxTdHJp
bmdOb2RlKj4oY3VycmVudE5vZGUpLT52YWx1ZSkpOworICAgICAgICAgICAgfQorICAgICAgICAg
ICAgCisgICAgICAgICAgICBjYXNlIFJlZ0V4cE5vZGVFdmFsdWF0ZVN0YXRlOgorICAgICAgICAg
ICAgeworICAgICAgICAgICAgICAgIFJlZ0V4cE5vZGUqIHJlZ2V4cE5vZGUgPSBzdGF0aWNfY2Fz
dDxSZWdFeHBOb2RlKj4oY3VycmVudE5vZGUpOworICAgICAgICAgICAgICAgIExpc3QgbGlzdDsK
KyAgICAgICAgICAgICAgICBsaXN0LmFwcGVuZChqc1N0cmluZyhyZWdleHBOb2RlLT5wYXR0ZXJu
KSk7CisgICAgICAgICAgICAgICAgbGlzdC5hcHBlbmQoanNTdHJpbmcocmVnZXhwTm9kZS0+Zmxh
Z3MpKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBKU09iamVjdCAqcmVnID0g
ZXhlYy0+bGV4aWNhbEludGVycHJldGVyKCktPmltcCgpLT5idWlsdGluUmVnRXhwKCk7CisgICAg
ICAgICAgICAgICAgUkVUVVJOX1ZBTFVFKHJlZy0+Y29uc3RydWN0KGV4ZWMsIGxpc3QpKTsKKyAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FzZSBUaGlzTm9kZUV2YWx1
YXRlU3RhdGU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUkVUVVJOX1ZBTFVFKGV4
ZWMtPmNvbnRleHQoKS5pbXAoKS0+dGhpc1ZhbHVlKCkpOworICAgICAgICAgICAgfQorICAgICAg
ICAgICAgICAgIAorICAgICAgICAgICAgY2FzZSBSZXNvbHZlTm9kZUV2YWx1YXRlU3RhdGU6Cisg
ICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUmVzb2x2ZU5vZGUqIHJlc29sdmVOb2RlID0g
c3RhdGljX2Nhc3Q8UmVzb2x2ZU5vZGUqPihjdXJyZW50Tm9kZSk7CisgICAgICAgICAgICAgICAg
Y29uc3QgU2NvcGVDaGFpbiYgY2hhaW4gPSBleGVjLT5jb250ZXh0KCkuaW1wKCktPnNjb3BlQ2hh
aW4oKTsKKyAgICAgICAgICAgICAgICBTY29wZUNoYWluSXRlcmF0b3IgaXRlciA9IGNoYWluLmJl
Z2luKCk7CisgICAgICAgICAgICAgICAgU2NvcGVDaGFpbkl0ZXJhdG9yIGVuZCA9IGNoYWluLmVu
ZCgpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIHdlIG11c3QgYWx3YXlz
IGhhdmUgc29tZXRoaW5nIGluIHRoZSBzY29wZSBjaGFpbgorICAgICAgICAgICAgICAgIGFzc2Vy
dChpdGVyICE9IGVuZCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgUHJvcGVy
dHlTbG90IHNsb3Q7CisgICAgICAgICAgICAgICAgZG8geyAKKyAgICAgICAgICAgICAgICAgICAg
SlNPYmplY3QgKm8gPSAqaXRlcjsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAg
ICAgICAgIGlmIChvLT5nZXRQcm9wZXJ0eVNsb3QoZXhlYywgcmVzb2x2ZU5vZGUtPmlkZW50LCBz
bG90KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIFJFVFVSTl9WQUxVRShzbG90LmdldFZhbHVl
KGV4ZWMsIG8sIHJlc29sdmVOb2RlLT5pZGVudCkpOworICAgICAgICAgICAgICAgICAgICAKKyAg
ICAgICAgICAgICAgICAgICAgKytpdGVyOworICAgICAgICAgICAgICAgIH0gd2hpbGUgKGl0ZXIg
IT0gZW5kKTsKKyAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgUkVUVVJOX0VSUk9S
KHJlc29sdmVOb2RlLT50aHJvd1VuZGVmaW5lZFZhcmlhYmxlRXJyb3IoZXhlYywgcmVzb2x2ZU5v
ZGUtPmlkZW50KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAg
ICBjYXNlIEdyb3VwTm9kZUV2YWx1YXRlU3RhdGU6CisgICAgICAgICAgICB7CisgICAgICAgICAg
ICAgICAgUFVTSF9FVkFMVUFURShzdGF0aWNfY2FzdDxHcm91cE5vZGUqPihjdXJyZW50Tm9kZSkt
Pmdyb3VwLmdldCgpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhc2UgRWxlbWVudE5vZGVFdmFsdWF0ZVN0YXRl
OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBVU0hfTE9DQUxfVkFMVUUoZXhlYy0+
bGV4aWNhbEludGVycHJldGVyKCktPmJ1aWx0aW5BcnJheSgpLT5jb25zdHJ1Y3QoZXhlYywgTGlz
dDo6ZW1wdHkoKSkpOworICAgICAgICAgICAgICAgIFBVU0hfTE9DQUxfVkFMVUUoanNOdW1iZXIo
MCkpOworICAgICAgICAgICAgICAgIEZBTExfVEhST1VHSCgpOworICAgICAgICAgICAgfQorICAg
ICAgICAgICAgY2FzZSBFbGVtZW50Tm9kZUV2YWx1YXRlU3RhdGUxOgorICAgICAgICAgICAgewor
ICAgICAgICAgICAgICAgIEVWQUxVQVRFX0FORF9DT05USU5VRShzdGF0aWNfY2FzdDxFbGVtZW50
Tm9kZSo+KGN1cnJlbnROb2RlKS0+bm9kZS5nZXQoKSwgRWxlbWVudE5vZGVFdmFsdWF0ZVN0YXRl
Mik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEVsZW1lbnROb2RlRXZhbHVhdGVT
dGF0ZTI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRWxlbWVudE5vZGUqIG4gPSBz
dGF0aWNfY2FzdDxFbGVtZW50Tm9kZSo+KGN1cnJlbnROb2RlKTsKKyAgICAgICAgICAgICAgICBK
U1ZhbHVlKiB2YWwgPSBHRVRfVkFMVUVfUkVUVVJOKCk7CisgICAgICAgICAgICAgICAgaW50IGwg
PSBQT1BfTE9DQUxfVkFMVUUoKS0+dG9JbnQzMihleGVjKTsKKyAgICAgICAgICAgICAgICBKU09i
amVjdCogYXJyYXkgPSBzdGF0aWNfY2FzdDxKU09iamVjdCo+KFBFRUtfTE9DQUxfVkFMVUUoKSk7
CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgbCArPSBuLT5lbGlzaW9uOworICAg
ICAgICAgICAgICAgIGFycmF5LT5wdXQoZXhlYywgbCsrLCB2YWwpOworICAgICAgICAgICAgICAg
IAorICAgICAgICAgICAgICAgIG4gPSBuLT5uZXh0LmdldCgpOworICAgICAgICAgICAgICAgIGlm
IChuKSB7CisgICAgICAgICAgICAgICAgICAgIFBVU0hfTE9DQUxfVkFMVUUoanNOdW1iZXIobCkp
OworICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRTogcHVzaGluZyAicCIgYXMgdGhlIGN1cnJl
bnQgbm9kZSBpcyBkYW5nZXJvdXMKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBmdW5j
dGlvbiB1c2VkIGN1cnJlbnQgbm9kZSBhZnRlciB0aGlzIGNhbGwsIGN1cnJlbnROb2RlIHdvdWxk
IGJlIHdyb25nLgorICAgICAgICAgICAgICAgICAgICBTRVRfSlVNUF9TVEFURShFbGVtZW50Tm9k
ZUV2YWx1YXRlU3RhdGUxLCBuKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
ICAgICAgICAgfQorICAgICAgICAgICAgICAgIFJFVFVSTl9WQUxVRShQT1BfTE9DQUxfVkFMVUUo
KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBjYXNlIEFy
cmF5Tm9kZUV2YWx1YXRlU3RhdGU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQXJy
YXlOb2RlKiBhcnJheU5vZGUgPSBzdGF0aWNfY2FzdDxBcnJheU5vZGUqPihjdXJyZW50Tm9kZSk7
CisgICAgICAgICAgICAgICAgaWYgKGFycmF5Tm9kZS0+ZWxlbWVudCkKKyAgICAgICAgICAgICAg
ICAgICAgRVZBTFVBVEVfQU5EX0NPTlRJTlVFKGFycmF5Tm9kZS0+ZWxlbWVudC5nZXQoKSwgQXJy
YXlOb2RlRXZhbHVhdGVTdGF0ZTEpOworICAgICAgICAgICAgICAgIEZBTExfVEhST1VHSCgpOwor
ICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBBcnJheU5vZGVFdmFsdWF0ZVN0YXRlMToK
KyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBcnJheU5vZGUqIGFycmF5Tm9kZSA9IHN0
YXRpY19jYXN0PEFycmF5Tm9kZSo+KGN1cnJlbnROb2RlKTsKKyAgICAgICAgICAgICAgICBKU09i
amVjdCAqYXJyYXk7CisgICAgICAgICAgICAgICAgaW50IGxlbmd0aDsKKyAgICAgICAgICAgICAg
ICAKKyAgICAgICAgICAgICAgICBpZiAoYXJyYXlOb2RlLT5lbGVtZW50KSB7CisgICAgICAgICAg
ICAgICAgICAgIGFycmF5ID0gc3RhdGljX2Nhc3Q8SlNPYmplY3QqPihHRVRfVkFMVUVfUkVUVVJO
KCkpOworICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBhcnJheU5vZGUtPm9wdCA/IGFycmF5
LT5nZXQoZXhlYywgbGVuZ3RoUHJvcGVydHlOYW1lKS0+dG9JbnQzMihleGVjKSA6IDA7CisgICAg
ICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYXJyYXkgPSBleGVjLT5s
ZXhpY2FsSW50ZXJwcmV0ZXIoKS0+YnVpbHRpbkFycmF5KCktPmNvbnN0cnVjdChleGVjLCBMaXN0
OjplbXB0eSgpKTsKKyAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gMDsKKyAgICAgICAgICAg
ICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKGFycmF5Tm9kZS0+
b3B0KQorICAgICAgICAgICAgICAgICAgICBhcnJheS0+cHV0KGV4ZWMsIGxlbmd0aFByb3BlcnR5
TmFtZSwganNOdW1iZXIoYXJyYXlOb2RlLT5lbGlzaW9uICsgbGVuZ3RoKSwgRG9udEVudW0gfCBE
b250RGVsZXRlKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBSRVRVUk5fVkFM
VUUoYXJyYXkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAg
Y2FzZSBPYmplY3RMaXRlcmFsTm9kZUV2YWx1YXRlU3RhdGU6CisgICAgICAgICAgICB7CisgICAg
ICAgICAgICAgICAgT2JqZWN0TGl0ZXJhbE5vZGUqIG9iamVjdExpdGVyYWxOb2RlID0gc3RhdGlj
X2Nhc3Q8T2JqZWN0TGl0ZXJhbE5vZGUqPihjdXJyZW50Tm9kZSk7CisgICAgICAgICAgICAgICAg
aWYgKG9iamVjdExpdGVyYWxOb2RlLT5saXN0KSB7CisgICAgICAgICAgICAgICAgICAgIFBVU0hf
RVZBTFVBVEUob2JqZWN0TGl0ZXJhbE5vZGUtPmxpc3QuZ2V0KCkpOworICAgICAgICAgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAg
ICAgICAgICAgUkVUVVJOX1ZBTFVFKGV4ZWMtPmxleGljYWxJbnRlcnByZXRlcigpLT5idWlsdGlu
T2JqZWN0KCktPmNvbnN0cnVjdChleGVjLCBMaXN0OjplbXB0eSgpKSk7CisgICAgICAgICAgICB9
CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBjYXNlIFByb3BlcnR5TGlzdE5vZGVFdmFs
dWF0ZVN0YXRlOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEpTT2JqZWN0KiBvYmog
PSBleGVjLT5sZXhpY2FsSW50ZXJwcmV0ZXIoKS0+YnVpbHRpbk9iamVjdCgpLT5jb25zdHJ1Y3Qo
ZXhlYywgTGlzdDo6ZW1wdHkoKSk7CisgICAgICAgICAgICAgICAgUFVTSF9MT0NBTF9WQUxVRShv
YmopOworICAgICAgICAgICAgICAgIEZBTExfVEhST1VHSCgpOworICAgICAgICAgICAgfQorICAg
ICAgICAgICAgY2FzZSBQcm9wZXJ0eUxpc3ROb2RlRXZhbHVhdGVTdGF0ZTE6CisgICAgICAgICAg
ICB7CisgICAgICAgICAgICAgICAgRVZBTFVBVEVfQU5EX0NPTlRJTlVFKHN0YXRpY19jYXN0PFBy
b3BlcnR5TGlzdE5vZGUqPihjdXJyZW50Tm9kZSktPm5vZGUtPm5hbWUuZ2V0KCksIFByb3BlcnR5
TGlzdE5vZGVFdmFsdWF0ZVN0YXRlMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNl
IFByb3BlcnR5TGlzdE5vZGVFdmFsdWF0ZVN0YXRlMjoKKyAgICAgICAgICAgIHsKKyAgICAgICAg
ICAgICAgICBQVVNIX0xPQ0FMX1ZBTFVFKEdFVF9WQUxVRV9SRVRVUk4oKSk7CisgICAgICAgICAg
ICAgICAgRVZBTFVBVEVfQU5EX0NPTlRJTlVFKHN0YXRpY19jYXN0PFByb3BlcnR5TGlzdE5vZGUq
PihjdXJyZW50Tm9kZSktPm5vZGUtPmFzc2lnbi5nZXQoKSwgUHJvcGVydHlMaXN0Tm9kZUV2YWx1
YXRlU3RhdGUzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgUHJvcGVydHlMaXN0
Tm9kZUV2YWx1YXRlU3RhdGUzOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFByb3Bl
cnR5TGlzdE5vZGUqIHAgPSBzdGF0aWNfY2FzdDxQcm9wZXJ0eUxpc3ROb2RlKj4oY3VycmVudE5v
ZGUpOworICAgICAgICAgICAgICAgIEpTVmFsdWUqIHYgPSBHRVRfVkFMVUVfUkVUVVJOKCk7Cisg
ICAgICAgICAgICAgICAgSlNWYWx1ZSogbmFtZSA9IFBPUF9MT0NBTF9WQUxVRSgpOworICAgICAg
ICAgICAgICAgIEpTT2JqZWN0KiBvYmogPSBzdGF0aWNfY2FzdDxKU09iamVjdCo+KFBFRUtfTE9D
QUxfVkFMVUUoKSk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgSWRlbnRpZmll
ciBwcm9wZXJ0eU5hbWUgPSBJZGVudGlmaWVyKG5hbWUtPnRvU3RyaW5nKGV4ZWMpKTsKKyAgICAg
ICAgICAgICAgICBzd2l0Y2ggKHAtPm5vZGUtPnR5cGUpIHsKKyAgICAgICAgICAgICAgICBjYXNl
IFByb3BlcnR5Tm9kZTo6R2V0dGVyOgorICAgICAgICAgICAgICAgICAgICBhc3NlcnQodi0+aXNP
YmplY3QoKSk7CisgICAgICAgICAgICAgICAgICAgIG9iai0+ZGVmaW5lR2V0dGVyKGV4ZWMsIHBy
b3BlcnR5TmFtZSwgc3RhdGljX2Nhc3Q8SlNPYmplY3QgKj4odikpOworICAgICAgICAgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFByb3BlcnR5Tm9kZTo6U2V0dGVyOgor
ICAgICAgICAgICAgICAgICAgICBhc3NlcnQodi0+aXNPYmplY3QoKSk7CisgICAgICAgICAgICAg
ICAgICAgIG9iai0+ZGVmaW5lU2V0dGVyKGV4ZWMsIHByb3BlcnR5TmFtZSwgc3RhdGljX2Nhc3Q8
SlNPYmplY3QgKj4odikpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAg
ICAgICBjYXNlIFByb3BlcnR5Tm9kZTo6Q29uc3RhbnQ6CisgICAgICAgICAgICAgICAgICAgIG9i
ai0+cHV0KGV4ZWMsIHByb3BlcnR5TmFtZSwgdik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFr
OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBw
ID0gcC0+bmV4dC5nZXQoKTsKKyAgICAgICAgICAgICAgICBpZiAocCkgeworICAgICAgICAgICAg
ICAgICAgICAvLyBGSVhNRTogcHVzaGluZyAicCIgYXMgdGhlIGN1cnJlbnQgbm9kZSBpcyBkYW5n
ZXJvdXMKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBmdW5jdGlvbiBoYWQgdG8gY29u
dGludWUgYWZ0ZXIgdGhpcyBsb29wLCBjdXJyZW50Tm9kZSB3b3VsZCBiZSB0aGUgd3Jvbmcgbm9k
ZS4KKyAgICAgICAgICAgICAgICAgICAgU0VUX0pVTVBfU1RBVEUoUHJvcGVydHlMaXN0Tm9kZUV2
YWx1YXRlU3RhdGUxLCBwKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAg
ICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIFJFVFVSTl9WQUxVRShQ
T1BfTE9DQUxfVkFMVUUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIAorICAgICAgICAgICAgY2FzZSBQcm9wZXJ0eU5hbWVOb2RlRXZhbHVhdGVTdGF0
ZToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBKU1ZhbHVlICpzOworICAgICAgICAg
ICAgICAgIFByb3BlcnR5TmFtZU5vZGUqIHByb3BlcnR5TmFtZU5vZGUgPSBzdGF0aWNfY2FzdDxQ
cm9wZXJ0eU5hbWVOb2RlKj4oY3VycmVudE5vZGUpOworICAgICAgICAgICAgICAgIGlmIChwcm9w
ZXJ0eU5hbWVOb2RlLT5zdHIuaXNOdWxsKCkpCisgICAgICAgICAgICAgICAgICAgIHMgPSBqc1N0
cmluZyhVU3RyaW5nOjpmcm9tKHByb3BlcnR5TmFtZU5vZGUtPm51bWVyaWMpKTsKKyAgICAgICAg
ICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHMgPSBqc1N0cmluZyhwcm9wZXJ0eU5h
bWVOb2RlLT5zdHIudXN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAg
ICBSRVRVUk5fVkFMVUUocyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAg
ICAgIGNhc2UgQnJhY2tldEFjY2Vzc29yTm9kZUV2YWx1YXRlU3RhdGU6CisgICAgICAgICAgICB7
CisgICAgICAgICAgICAgICAgRVZBTFVBVEVfQU5EX0NPTlRJTlVFKHN0YXRpY19jYXN0PEJyYWNr
ZXRBY2Nlc3Nvck5vZGUqPihjdXJyZW50Tm9kZSktPmV4cHIxLmdldCgpLCBCcmFja2V0QWNjZXNz
b3JOb2RlRXZhbHVhdGVTdGF0ZTEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBC
cmFja2V0QWNjZXNzb3JOb2RlRXZhbHVhdGVTdGF0ZTE6CisgICAgICAgICAgICB7CisgICAgICAg
ICAgICAgICAgUFVTSF9MT0NBTF9WQUxVRShHRVRfVkFMVUVfUkVUVVJOKCkpOworICAgICAgICAg
ICAgICAgIEVWQUxVQVRFX0FORF9DT05USU5VRShzdGF0aWNfY2FzdDxCcmFja2V0QWNjZXNzb3JO
b2RlKj4oY3VycmVudE5vZGUpLT5leHByMi5nZXQoKSwgQnJhY2tldEFjY2Vzc29yTm9kZUV2YWx1
YXRlU3RhdGUyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgQnJhY2tldEFjY2Vz
c29yTm9kZUV2YWx1YXRlU3RhdGUyOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEpT
VmFsdWUgKnYxID0gUE9QX0xPQ0FMX1ZBTFVFKCk7CisgICAgICAgICAgICAgICAgSlNWYWx1ZSAq
djIgPSBHRVRfVkFMVUVfUkVUVVJOKCk7CisgICAgICAgICAgICAgICAgSlNPYmplY3QgKm8gPSB2
MS0+dG9PYmplY3QoZXhlYyk7CisgICAgICAgICAgICAgICAgS0pTX0NIRUNLRVhDRVBUSU9OKCk7
CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTsKKyAgICAgICAgICAgICAgICBpZiAodjItPmdl
dFVJbnQzMihpKSkKKyAgICAgICAgICAgICAgICAgICAgUkVUVVJOX1ZBTFVFKG8tPmdldChleGVj
LCBpKSk7CisgICAgICAgICAgICAgICAgUkVUVVJOX1ZBTFVFKG8tPmdldChleGVjLCBJZGVudGlm
aWVyKHYyLT50b1N0cmluZyhleGVjKSkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAor
ICAgICAgICAgICAgY2FzZSBEb3RBY2Nlc3Nvck5vZGVFdmFsdWF0ZVN0YXRlOgorICAgICAgICAg
ICAgeworICAgICAgICAgICAgICAgIEVWQUxVQVRFX0FORF9DT05USU5VRShzdGF0aWNfY2FzdDxE
b3RBY2Nlc3Nvck5vZGUqPihjdXJyZW50Tm9kZSktPmV4cHIuZ2V0KCksIERvdEFjY2Vzc29yTm9k
ZUV2YWx1YXRlU3RhdGUxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgRG90QWNj
ZXNzb3JOb2RlRXZhbHVhdGVTdGF0ZTE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAg
UkVUVVJOX1ZBTFVFKEdFVF9WQUxVRV9SRVRVUk4oKS0+dG9PYmplY3QoZXhlYyktPmdldChleGVj
LCBzdGF0aWNfY2FzdDxEb3RBY2Nlc3Nvck5vZGUqPihjdXJyZW50Tm9kZSktPmlkZW50KSk7Cisg
ICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBjYXNlIE5ld0V4cHJO
b2RlRXZhbHVhdGVTdGF0ZToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBFVkFMVUFU
RV9BTkRfQ09OVElOVUUoc3RhdGljX2Nhc3Q8TmV3RXhwck5vZGUqPihjdXJyZW50Tm9kZSktPmV4
cHIuZ2V0KCksIE5ld0V4cHJOb2RlRXZhbHVhdGVTdGF0ZTEpOworICAgICAgICAgICAgfQorICAg
ICAgICAgICAgY2FzZSBOZXdFeHByTm9kZUV2YWx1YXRlU3RhdGUxOgorICAgICAgICAgICAgewor
ICAgICAgICAgICAgICAgIE5ld0V4cHJOb2RlKiBuZXdFeHByTm9kZSA9IHN0YXRpY19jYXN0PE5l
d0V4cHJOb2RlKj4oY3VycmVudE5vZGUpOworICAgICAgICAgICAgICAgIFBVU0hfTE9DQUxfVkFM
VUUoR0VUX1ZBTFVFX1JFVFVSTigpKTsKKyAgICAgICAgICAgICAgICBpZiAobmV3RXhwck5vZGUt
PmFyZ3MpCisgICAgICAgICAgICAgICAgICAgIEVWQUxVQVRFX0xJU1RfQU5EX0NPTlRJTlVFKG5l
d0V4cHJOb2RlLT5hcmdzLmdldCgpLCBOZXdFeHByTm9kZUV2YWx1YXRlU3RhdGUyKTsKKyAgICAg
ICAgICAgICAgICBGQUxMX1RIUk9VR0goKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNh
c2UgTmV3RXhwck5vZGVFdmFsdWF0ZVN0YXRlMjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAg
ICAgICBOZXdFeHByTm9kZSogbmV3RXhwck5vZGUgPSBzdGF0aWNfY2FzdDxOZXdFeHByTm9kZSo+
KGN1cnJlbnROb2RlKTsKKyAgICAgICAgICAgICAgICBKU1ZhbHVlKiB2ID0gUE9QX0xPQ0FMX1ZB
TFVFKCk7CisgICAgICAgICAgICAgICAgTGlzdCBhcmdMaXN0OworICAgICAgICAgICAgICAgIGlm
IChuZXdFeHByTm9kZS0+YXJncykKKyAgICAgICAgICAgICAgICAgICAgYXJnTGlzdCA9IFBPUF9M
SVNUKCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKCF2LT5pc09iamVj
dCgpKQorICAgICAgICAgICAgICAgICAgICBSRVRVUk5fRVJST1IobmV3RXhwck5vZGUtPnRocm93
RXJyb3IoZXhlYywgVHlwZUVycm9yLCAiVmFsdWUgJXMgKHJlc3VsdCBvZiBleHByZXNzaW9uICVz
KSBpcyBub3QgYW4gb2JqZWN0LiBDYW5ub3QgYmUgdXNlZCB3aXRoIG5ldy4iLCB2LCBuZXdFeHBy
Tm9kZS0+ZXhwci5nZXQoKSkpOworICAgICAgICAgICAgICAgIEpTT2JqZWN0ICpjb25zdHIgPSBz
dGF0aWNfY2FzdDxKU09iamVjdCo+KHYpOworICAgICAgICAgICAgICAgIGlmICghY29uc3RyLT5p
bXBsZW1lbnRzQ29uc3RydWN0KCkpCisgICAgICAgICAgICAgICAgICAgIFJFVFVSTl9FUlJPUihu
ZXdFeHByTm9kZS0+dGhyb3dFcnJvcihleGVjLCBUeXBlRXJyb3IsICJWYWx1ZSAlcyAocmVzdWx0
IG9mIGV4cHJlc3Npb24gJXMpIGlzIG5vdCBhIGNvbnN0cnVjdG9yLiBDYW5ub3QgYmUgdXNlZCB3
aXRoIG5ldy4iLCB2LCBuZXdFeHByTm9kZS0+ZXhwci5nZXQoKSkpOworCisgICAgICAgICAgICAg
ICAgUkVUVVJOX1ZBTFVFKGNvbnN0ci0+Y29uc3RydWN0KGV4ZWMsIGFyZ0xpc3QpKTsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhc2UgRnVuY3Rpb25DYWxs
VmFsdWVOb2RlRXZhbHVhdGVTdGF0ZToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBF
VkFMVUFURV9BTkRfQ09OVElOVUUoc3RhdGljX2Nhc3Q8RnVuY3Rpb25DYWxsVmFsdWVOb2RlKj4o
Y3VycmVudE5vZGUpLT5leHByLmdldCgpLCBGdW5jdGlvbkNhbGxWYWx1ZU5vZGVFdmFsdWF0ZVN0
YXRlMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEZ1bmN0aW9uQ2FsbFZhbHVl
Tm9kZUV2YWx1YXRlU3RhdGUxOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZ1bmN0
aW9uQ2FsbFZhbHVlTm9kZSogZnVuY3Rpb25DYWxsVmFsdWVOb2RlID0gc3RhdGljX2Nhc3Q8RnVu
Y3Rpb25DYWxsVmFsdWVOb2RlKj4oY3VycmVudE5vZGUpOworICAgICAgICAgICAgICAgIEpTVmFs
dWUqIHYgPSBHRVRfVkFMVUVfUkVUVVJOKCk7CisgICAgICAgICAgICAgICAgaWYgKCF2LT5pc09i
amVjdCgpKQorICAgICAgICAgICAgICAgICAgICBSRVRVUk5fRVJST1IoZnVuY3Rpb25DYWxsVmFs
dWVOb2RlLT50aHJvd0Vycm9yKGV4ZWMsIFR5cGVFcnJvciwgIlZhbHVlICVzIChyZXN1bHQgb2Yg
ZXhwcmVzc2lvbiAlcykgaXMgbm90IG9iamVjdC4iLCB2LCBmdW5jdGlvbkNhbGxWYWx1ZU5vZGUt
PmV4cHIuZ2V0KCkpKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBKU09iamVj
dCAqZnVuYyA9IHN0YXRpY19jYXN0PEpTT2JqZWN0Kj4odik7CisgICAgICAgICAgICAgICAgaWYg
KCFmdW5jLT5pbXBsZW1lbnRzQ2FsbCgpKQorICAgICAgICAgICAgICAgICAgICBSRVRVUk5fRVJS
T1IoZnVuY3Rpb25DYWxsVmFsdWVOb2RlLT50aHJvd0Vycm9yKGV4ZWMsIFR5cGVFcnJvciwgIk9i
amVjdCAlcyAocmVzdWx0IG9mIGV4cHJlc3Npb24gJXMpIGRvZXMgbm90IGFsbG93IGNhbGxzLiIs
IHYsIGZ1bmN0aW9uQ2FsbFZhbHVlTm9kZS0+ZXhwci5nZXQoKSkpOworICAgICAgICAgICAgICAg
IFBVU0hfTE9DQUxfVkFMVUUoZnVuYyk7CisgICAgICAgICAgICAgICAgRVZBTFVBVEVfTElTVF9B
TkRfQ09OVElOVUUoZnVuY3Rpb25DYWxsVmFsdWVOb2RlLT5hcmdzLmdldCgpLCBGdW5jdGlvbkNh
bGxWYWx1ZU5vZGVFdmFsdWF0ZVN0YXRlMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBj
YXNlIEZ1bmN0aW9uQ2FsbFZhbHVlTm9kZUV2YWx1YXRlU3RhdGUyOgorICAgICAgICAgICAgewor
ICAgICAgICAgICAgICAgIExpc3QgYXJnTGlzdCA9IFBPUF9MSVNUKCk7CisgICAgICAgICAgICAg
ICAgSlNPYmplY3QgKmZ1bmMgPSBzdGF0aWNfY2FzdDxKU09iamVjdCo+KFBPUF9MT0NBTF9WQUxV
RSgpKTsKKyAgICAgICAgICAgICAgICBKU09iamVjdCAqdGhpc09iaiA9ICBleGVjLT5keW5hbWlj
SW50ZXJwcmV0ZXIoKS0+Z2xvYmFsT2JqZWN0KCk7CisgICAgICAgICAgICAgICAgUkVUVVJOX1ZB
TFVFKGZ1bmMtPmNhbGwoZXhlYywgdGhpc09iaiwgYXJnTGlzdCkpOworICAgICAgICAgICAgfQor
ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgY2FzZSBGdW5jdGlvbkNhbGxSZXNvbHZlTm9k
ZUV2YWx1YXRlU3RhdGU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRnVuY3Rpb25D
YWxsUmVzb2x2ZU5vZGUqIGZ1bmN0aW9uQ2FsbFJlc29sdmVOb2RlID0gc3RhdGljX2Nhc3Q8RnVu
Y3Rpb25DYWxsUmVzb2x2ZU5vZGUqPihjdXJyZW50Tm9kZSk7CisgICAgICAgICAgICAgICAgY29u
c3QgU2NvcGVDaGFpbiYgY2hhaW4gPSBleGVjLT5jb250ZXh0KCkuaW1wKCktPnNjb3BlQ2hhaW4o
KTsKKyAgICAgICAgICAgICAgICBTY29wZUNoYWluSXRlcmF0b3IgaXRlciA9IGNoYWluLmJlZ2lu
KCk7CisgICAgICAgICAgICAgICAgU2NvcGVDaGFpbkl0ZXJhdG9yIGVuZCA9IGNoYWluLmVuZCgp
OworICAgICAgICAgICAgICAgIGNvbnN0IElkZW50aWZpZXImIGlkZW50ID0gZnVuY3Rpb25DYWxs
UmVzb2x2ZU5vZGUtPmlkZW50OworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8v
IHdlIG11c3QgYWx3YXlzIGhhdmUgc29tZXRoaW5nIGluIHRoZSBzY29wZSBjaGFpbgorICAgICAg
ICAgICAgICAgIGFzc2VydChpdGVyICE9IGVuZCk7CisgICAgICAgICAgICAgICAgCisgICAgICAg
ICAgICAgICAgSlNPYmplY3QqIHJlc29sdmVkRnVuY3Rpb24gPSAwOworICAgICAgICAgICAgICAg
IFByb3BlcnR5U2xvdCBzbG90OworICAgICAgICAgICAgICAgIEpTT2JqZWN0KiBiYXNlOworICAg
ICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgYmFzZSA9ICppdGVyOworICAg
ICAgICAgICAgICAgICAgICBpZiAoYmFzZS0+Z2V0UHJvcGVydHlTbG90KGV4ZWMsIGlkZW50LCBz
bG90KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgSlNWYWx1ZSAqdiA9IHNsb3QuZ2V0VmFs
dWUoZXhlYywgYmFzZSwgaWRlbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgS0pTX0NIRUNL
RVhDRVBUSU9OKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAg
ICAgICAgIGlmICghdi0+aXNPYmplY3QoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBS
RVRVUk5fRVJST1IoZnVuY3Rpb25DYWxsUmVzb2x2ZU5vZGUtPnRocm93RXJyb3IoZXhlYywgVHlw
ZUVycm9yLCAiVmFsdWUgJXMgKHJlc3VsdCBvZiBleHByZXNzaW9uICVzKSBpcyBub3Qgb2JqZWN0
LiIsIHYsIGlkZW50KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAg
ICAgICAgICAgIHJlc29sdmVkRnVuY3Rpb24gPSBzdGF0aWNfY2FzdDxKU09iamVjdCo+KHYpOwor
ICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJl
c29sdmVkRnVuY3Rpb24tPmltcGxlbWVudHNDYWxsKCkpCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgUkVUVVJOX0VSUk9SKGZ1bmN0aW9uQ2FsbFJlc29sdmVOb2RlLT50aHJvd0Vycm9yKGV4
ZWMsIFR5cGVFcnJvciwgIk9iamVjdCAlcyAocmVzdWx0IG9mIGV4cHJlc3Npb24gJXMpIGRvZXMg
bm90IGFsbG93IGNhbGxzLiIsIHYsIGlkZW50KSk7CisgICAgICAgICAgICAgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICArK2l0ZXI7
CisgICAgICAgICAgICAgICAgfSB3aGlsZSAoaXRlciAhPSBlbmQpOworICAgICAgICAgICAgICAg
IAorICAgICAgICAgICAgICAgIGlmICghcmVzb2x2ZWRGdW5jdGlvbikKKyAgICAgICAgICAgICAg
ICAgICAgUkVUVVJOX0VSUk9SKGZ1bmN0aW9uQ2FsbFJlc29sdmVOb2RlLT50aHJvd1VuZGVmaW5l
ZFZhcmlhYmxlRXJyb3IoZXhlYywgaWRlbnQpKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAg
ICAgICAgICBQVVNIX0xPQ0FMX1ZBTFVFKGJhc2UpOworICAgICAgICAgICAgICAgIFBVU0hfTE9D
QUxfVkFMVUUocmVzb2x2ZWRGdW5jdGlvbik7CisgICAgICAgICAgICAgICAgRVZBTFVBVEVfTElT
VF9BTkRfQ09OVElOVUUoZnVuY3Rpb25DYWxsUmVzb2x2ZU5vZGUtPmFyZ3MuZ2V0KCksIEZ1bmN0
aW9uQ2FsbFJlc29sdmVOb2RlRXZhbHVhdGVTdGF0ZTEpOworICAgICAgICAgICAgfQorICAgICAg
ICAgICAgY2FzZSBGdW5jdGlvbkNhbGxSZXNvbHZlTm9kZUV2YWx1YXRlU3RhdGUxOgorICAgICAg
ICAgICAgeworICAgICAgICAgICAgICAgIExpc3QgYXJnTGlzdCA9IFBPUF9MSVNUKCk7CisgICAg
ICAgICAgICAgICAgSlNPYmplY3QqIGZ1bmMgPSBzdGF0aWNfY2FzdDxKU09iamVjdCo+KFBPUF9M
T0NBTF9WQUxVRSgpKTsKKyAgICAgICAgICAgICAgICBKU09iamVjdCogdGhpc09iaiA9IHN0YXRp
Y19jYXN0PEpTT2JqZWN0Kj4oUE9QX0xPQ0FMX1ZBTFVFKCkpOworICAgICAgICAgICAgICAgIC8v
IEVDTUEgMTEuMi4zIHNheXMgdGhhdCBpbiB0aGlzIHNpdHVhdGlvbiB0aGUgdGhpcyB2YWx1ZSBz
aG91bGQgYmUgbnVsbC4KKyAgICAgICAgICAgICAgICAvLyBIb3dldmVyLCBzZWN0aW9uIDEwLjIu
MyBzYXlzIHRoYXQgaW4gdGhlIGNhc2Ugd2hlcmUgdGhlIHZhbHVlIHByb3ZpZGVkCisgICAgICAg
ICAgICAgICAgLy8gYnkgdGhlIGNhbGxlciBpcyBudWxsLCB0aGUgZ2xvYmFsIG9iamVjdCBzaG91
bGQgYmUgdXNlZC4gSXQgYWxzbyBzYXlzCisgICAgICAgICAgICAgICAgLy8gdGhhdCB0aGUgc2Vj
dGlvbiBkb2VzIG5vdCBhcHBseSB0byBpbnRlcmFsIGZ1bmN0aW9ucywgYnV0IGZvciBzaW1wbGlj
aXR5CisgICAgICAgICAgICAgICAgLy8gb2YgaW1wbGVtZW50YXRpb24gd2UgdXNlIHRoZSBnbG9i
YWwgb2JqZWN0IGFueXdheSBoZXJlLiBUaGlzIGd1YXJhbnRlZXMKKyAgICAgICAgICAgICAgICAv
LyB0aGF0IGluIGhvc3Qgb2JqZWN0cyB5b3UgYWx3YXlzIGdldCBhIHZhbGlkIG9iamVjdCBmb3Ig
dGhpcy4KKyAgICAgICAgICAgICAgICBpZiAodGhpc09iai0+aXNBY3RpdmF0aW9uKCkpCisgICAg
ICAgICAgICAgICAgICAgIHRoaXNPYmogPSBleGVjLT5keW5hbWljSW50ZXJwcmV0ZXIoKS0+Z2xv
YmFsT2JqZWN0KCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgUkVUVVJOX1ZB
TFVFKGZ1bmMtPmNhbGwoZXhlYywgdGhpc09iaiwgYXJnTGlzdCkpOworICAgICAgICAgICAgfQor
ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgY2FzZSBGdW5jdGlvbkNhbGxCcmFja2V0Tm9k
ZUV2YWx1YXRlU3RhdGU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRVZBTFVBVEVf
QU5EX0NPTlRJTlVFKHN0YXRpY19jYXN0PEZ1bmN0aW9uQ2FsbEJyYWNrZXROb2RlKj4oY3VycmVu
dE5vZGUpLT5iYXNlLmdldCgpLCBGdW5jdGlvbkNhbGxCcmFja2V0Tm9kZUV2YWx1YXRlU3RhdGUx
KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgRnVuY3Rpb25DYWxsQnJhY2tldE5v
ZGVFdmFsdWF0ZVN0YXRlMToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQVVNIX0xP
Q0FMX1ZBTFVFKEdFVF9WQUxVRV9SRVRVUk4oKSk7CisgICAgICAgICAgICAgICAgRVZBTFVBVEVf
QU5EX0NPTlRJTlVFKHN0YXRpY19jYXN0PEZ1bmN0aW9uQ2FsbEJyYWNrZXROb2RlKj4oY3VycmVu
dE5vZGUpLT5zdWJzY3JpcHQuZ2V0KCksIEZ1bmN0aW9uQ2FsbEJyYWNrZXROb2RlRXZhbHVhdGVT
dGF0ZTIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBGdW5jdGlvbkNhbGxCcmFj
a2V0Tm9kZUV2YWx1YXRlU3RhdGUyOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZ1
bmN0aW9uQ2FsbEJyYWNrZXROb2RlKiBmdW5jdGlvbkNhbGxCcmFja2V0Tm9kZSA9IHN0YXRpY19j
YXN0PEZ1bmN0aW9uQ2FsbEJyYWNrZXROb2RlKj4oY3VycmVudE5vZGUpOworICAgICAgICAgICAg
ICAgIAorICAgICAgICAgICAgICAgIEpTVmFsdWUgKnN1YnNjcmlwdFZhbCA9IEdFVF9WQUxVRV9S
RVRVUk4oKTsKKyAgICAgICAgICAgICAgICBKU09iamVjdCAqYmFzZU9iaiA9IFBFRUtfTE9DQUxf
VkFMVUUoKS0+dG9PYmplY3QoZXhlYyk7CisgICAgICAgICAgICAgICAgS0pTX0NIRUNLRVhDRVBU
SU9OKCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgdWludDMyX3QgaTsKKyAg
ICAgICAgICAgICAgICBQcm9wZXJ0eVNsb3Qgc2xvdDsKKyAgICAgICAgICAgICAgICAKKyAgICAg
ICAgICAgICAgICBKU1ZhbHVlICpmdW5jVmFsOworICAgICAgICAgICAgICAgIGlmIChzdWJzY3Jp
cHRWYWwtPmdldFVJbnQzMihpKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoYmFzZU9iai0+
Z2V0UHJvcGVydHlTbG90KGV4ZWMsIGksIHNsb3QpKQorICAgICAgICAgICAgICAgICAgICAgICAg
ZnVuY1ZhbCA9IHNsb3QuZ2V0VmFsdWUoZXhlYywgYmFzZU9iaiwgaSk7CisgICAgICAgICAgICAg
ICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNWYWwgPSBqc1VuZGVmaW5l
ZCgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIElkZW50
aWZpZXIgaWRlbnQoc3Vic2NyaXB0VmFsLT50b1N0cmluZyhleGVjKSk7CisgICAgICAgICAgICAg
ICAgICAgIGlmIChiYXNlT2JqLT5nZXRQcm9wZXJ0eVNsb3QoZXhlYywgaWRlbnQsIHNsb3QpKQor
ICAgICAgICAgICAgICAgICAgICAgICAgZnVuY1ZhbCA9IGJhc2VPYmotPmdldChleGVjLCBpZGVu
dCk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1
bmNWYWwgPSBqc1VuZGVmaW5lZCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAg
ICAKKyAgICAgICAgICAgICAgICBLSlNfQ0hFQ0tFWENFUFRJT04oKTsKKyAgICAgICAgICAgICAg
ICAKKyAgICAgICAgICAgICAgICBpZiAoIWZ1bmNWYWwtPmlzT2JqZWN0KCkpCisgICAgICAgICAg
ICAgICAgICAgIFJFVFVSTl9FUlJPUihmdW5jdGlvbkNhbGxCcmFja2V0Tm9kZS0+dGhyb3dFcnJv
cihleGVjLCBUeXBlRXJyb3IsICJWYWx1ZSAlcyAocmVzdWx0IG9mIGV4cHJlc3Npb24gJXNbJXNd
KSBpcyBub3Qgb2JqZWN0LiIsIGZ1bmNWYWwsIGZ1bmN0aW9uQ2FsbEJyYWNrZXROb2RlLT5iYXNl
LmdldCgpLCBmdW5jdGlvbkNhbGxCcmFja2V0Tm9kZS0+c3Vic2NyaXB0LmdldCgpKSk7CisgICAg
ICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgSlNPYmplY3QgKmZ1bmMgPSBzdGF0aWNfY2Fz
dDxKU09iamVjdCo+KGZ1bmNWYWwpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAg
IGlmICghZnVuYy0+aW1wbGVtZW50c0NhbGwoKSkKKyAgICAgICAgICAgICAgICAgICAgUkVUVVJO
X0VSUk9SKGZ1bmN0aW9uQ2FsbEJyYWNrZXROb2RlLT50aHJvd0Vycm9yKGV4ZWMsIFR5cGVFcnJv
ciwgIk9iamVjdCAlcyAocmVzdWx0IG9mIGV4cHJlc3Npb24gJXNbJXNdKSBkb2VzIG5vdCBhbGxv
dyBjYWxscy4iLCBmdW5jVmFsLCBmdW5jdGlvbkNhbGxCcmFja2V0Tm9kZS0+YmFzZS5nZXQoKSwg
ZnVuY3Rpb25DYWxsQnJhY2tldE5vZGUtPnN1YnNjcmlwdC5nZXQoKSkpOworICAgICAgICAgICAg
CisgICAgICAgICAgICAgICAgUFVTSF9MT0NBTF9WQUxVRShmdW5jKTsKKyAgICAgICAgICAgICAg
ICBFVkFMVUFURV9MSVNUX0FORF9DT05USU5VRShmdW5jdGlvbkNhbGxCcmFja2V0Tm9kZS0+YXJn
cy5nZXQoKSwgRnVuY3Rpb25DYWxsQnJhY2tldE5vZGVFdmFsdWF0ZVN0YXRlMyk7CisgICAgICAg
ICAgICB9CisgICAgICAgICAgICBjYXNlIEZ1bmN0aW9uQ2FsbEJyYWNrZXROb2RlRXZhbHVhdGVT
dGF0ZTM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTGlzdCBhcmdMaXN0ID0gUE9Q
X0xJU1QoKTsKKyAgICAgICAgICAgICAgICBKU09iamVjdCAqZnVuYyA9IHN0YXRpY19jYXN0PEpT
T2JqZWN0Kj4oUE9QX0xPQ0FMX1ZBTFVFKCkpOworICAgICAgICAgICAgICAgIEpTT2JqZWN0ICp0
aGlzT2JqID0gUE9QX0xPQ0FMX1ZBTFVFKCktPnRvT2JqZWN0KGV4ZWMpOworICAgICAgICAgICAg
ICAgIEtKU19DSEVDS0VYQ0VQVElPTigpOworICAgICAgICAgICAgICAgIGFzc2VydCh0aGlzT2Jq
KTsKKyAgICAgICAgICAgICAgICBhc3NlcnQodGhpc09iai0+aXNPYmplY3QoKSk7CisgICAgICAg
ICAgICAgICAgYXNzZXJ0KCF0aGlzT2JqLT5pc0FjdGl2YXRpb24oKSk7CisgICAgICAgICAgICAg
ICAgCisgICAgICAgICAgICAgICAgUkVUVVJOX1ZBTFVFKGZ1bmMtPmNhbGwoZXhlYywgdGhpc09i
aiwgYXJnTGlzdCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBj
YXNlIEZ1bmN0aW9uQ2FsbERvdE5vZGVFdmFsdWF0ZVN0YXRlOgorICAgICAgICAgICAgeworICAg
ICAgICAgICAgICAgIEVWQUxVQVRFX0FORF9DT05USU5VRShzdGF0aWNfY2FzdDxGdW5jdGlvbkNh
bGxEb3ROb2RlKj4oY3VycmVudE5vZGUpLT5iYXNlLmdldCgpLCBGdW5jdGlvbkNhbGxEb3ROb2Rl
RXZhbHVhdGVTdGF0ZTEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBGdW5jdGlv
bkNhbGxEb3ROb2RlRXZhbHVhdGVTdGF0ZTE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAg
ICAgRnVuY3Rpb25DYWxsRG90Tm9kZSogZnVuY3Rpb25DYWxsRG90Tm9kZSA9IHN0YXRpY19jYXN0
PEZ1bmN0aW9uQ2FsbERvdE5vZGUqPihjdXJyZW50Tm9kZSk7CisgICAgICAgICAgICAgICAgSlNP
YmplY3QqIGJhc2VPYmogPSBHRVRfVkFMVUVfUkVUVVJOKCktPnRvT2JqZWN0KGV4ZWMpOworICAg
ICAgICAgICAgICAgIEtKU19DSEVDS0VYQ0VQVElPTigpOworICAgICAgICAgICAgICAgIFByb3Bl
cnR5U2xvdCBzbG90OworICAgICAgICAgICAgICAgIGNvbnN0IElkZW50aWZpZXImIGlkZW50ID0g
ZnVuY3Rpb25DYWxsRG90Tm9kZS0+aWRlbnQ7CisgICAgICAgICAgICAgICAgSlNWYWx1ZSogZnVu
Y1ZhbCA9IGJhc2VPYmotPmdldFByb3BlcnR5U2xvdChleGVjLCBpZGVudCwgc2xvdCkgPyBzbG90
LmdldFZhbHVlKGV4ZWMsIGJhc2VPYmosIGlkZW50KSA6IGpzVW5kZWZpbmVkKCk7CisgICAgICAg
ICAgICAgICAgS0pTX0NIRUNLRVhDRVBUSU9OKCk7CisgICAgICAgICAgICAgICAgCisgICAgICAg
ICAgICAgICAgaWYgKCFmdW5jVmFsLT5pc09iamVjdCgpKQorICAgICAgICAgICAgICAgICAgICBS
RVRVUk5fRVJST1IoZnVuY3Rpb25DYWxsRG90Tm9kZS0+dGhyb3dFcnJvcihleGVjLCBUeXBlRXJy
b3IsIGRvdEV4cHJOb3RBbk9iamVjdFN0cmluZygpLCBmdW5jVmFsLCBmdW5jdGlvbkNhbGxEb3RO
b2RlLT5iYXNlLmdldCgpLCBpZGVudCkpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAg
ICAgIEpTT2JqZWN0KiBmdW5jID0gc3RhdGljX2Nhc3Q8SlNPYmplY3QqPihmdW5jVmFsKTsKKyAg
ICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAoIWZ1bmMtPmltcGxlbWVudHNDYWxs
KCkpCisgICAgICAgICAgICAgICAgICAgIFJFVFVSTl9FUlJPUihmdW5jdGlvbkNhbGxEb3ROb2Rl
LT50aHJvd0Vycm9yKGV4ZWMsIFR5cGVFcnJvciwgZG90RXhwckRvZXNOb3RBbGxvd0NhbGxzU3Ry
aW5nKCksIGZ1bmNWYWwsIGZ1bmN0aW9uQ2FsbERvdE5vZGUtPmJhc2UuZ2V0KCksIGlkZW50KSk7
CisgICAgICAgICAgICAgICAgUFVTSF9MT0NBTF9WQUxVRShiYXNlT2JqKTsKKyAgICAgICAgICAg
ICAgICBQVVNIX0xPQ0FMX1ZBTFVFKGZ1bmMpOworICAgICAgICAgICAgICAgIEVWQUxVQVRFX0xJ
U1RfQU5EX0NPTlRJTlVFKGZ1bmN0aW9uQ2FsbERvdE5vZGUtPmFyZ3MuZ2V0KCksIEZ1bmN0aW9u
Q2FsbERvdE5vZGVFdmFsdWF0ZVN0YXRlMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBj
YXNlIEZ1bmN0aW9uQ2FsbERvdE5vZGVFdmFsdWF0ZVN0YXRlMjoKKyAgICAgICAgICAgIHsKKyAg
ICAgICAgICAgICAgICBMaXN0IGFyZ0xpc3QgPSBQT1BfTElTVCgpOworICAgICAgICAgICAgICAg
IEpTT2JqZWN0KiBmdW5jID0gc3RhdGljX2Nhc3Q8SlNPYmplY3QqPihQT1BfTE9DQUxfVkFMVUUo
KSk7CisgICAgICAgICAgICAgICAgSlNPYmplY3QgKnRoaXNPYmogPSBQT1BfTE9DQUxfVkFMVUUo
KS0+dG9PYmplY3QoZXhlYyk7CisgICAgICAgICAgICAgICAgS0pTX0NIRUNLRVhDRVBUSU9OKCk7
CisgICAgICAgICAgICAgICAgYXNzZXJ0KHRoaXNPYmopOworICAgICAgICAgICAgICAgIGFzc2Vy
dCh0aGlzT2JqLT5pc09iamVjdCgpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnQoIXRoaXNPYmot
PmlzQWN0aXZhdGlvbigpKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBSRVRV
Uk5fVkFMVUUoZnVuYy0+Y2FsbChleGVjLCB0aGlzT2JqLCBhcmdMaXN0KSk7CisgICAgICAgICAg
ICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBjYXNlIFBvc3RmaXhSZXNvbHZlTm9k
ZUV2YWx1YXRlU3RhdGU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUG9zdGZpeFJl
c29sdmVOb2RlKiBwb3N0Zml4UmVzb2x2ZU5vZGUgPSBzdGF0aWNfY2FzdDxQb3N0Zml4UmVzb2x2
ZU5vZGUqPihjdXJyZW50Tm9kZSk7CisgICAgICAgICAgICAgICAgY29uc3QgSWRlbnRpZmllciYg
aWRlbnQgPSBwb3N0Zml4UmVzb2x2ZU5vZGUtPm1faWRlbnQ7CisgICAgICAgICAgICAgICAgY29u
c3QgU2NvcGVDaGFpbiYgY2hhaW4gPSBleGVjLT5jb250ZXh0KCkuaW1wKCktPnNjb3BlQ2hhaW4o
KTsKKyAgICAgICAgICAgICAgICBTY29wZUNoYWluSXRlcmF0b3IgaXRlciA9IGNoYWluLmJlZ2lu
KCk7CisgICAgICAgICAgICAgICAgU2NvcGVDaGFpbkl0ZXJhdG9yIGVuZCA9IGNoYWluLmVuZCgp
OworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIHdlIG11c3QgYWx3YXlzIGhh
dmUgc29tZXRoaW5nIGluIHRoZSBzY29wZSBjaGFpbgorICAgICAgICAgICAgICAgIGFzc2VydChp
dGVyICE9IGVuZCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgUHJvcGVydHlT
bG90IHNsb3Q7CisgICAgICAgICAgICAgICAgSlNPYmplY3QgKmJhc2U7CisgICAgICAgICAgICAg
ICAgZG8geyAKKyAgICAgICAgICAgICAgICAgICAgYmFzZSA9ICppdGVyOworICAgICAgICAgICAg
ICAgICAgICBpZiAoYmFzZS0+Z2V0UHJvcGVydHlTbG90KGV4ZWMsIGlkZW50LCBzbG90KSkgewor
ICAgICAgICAgICAgICAgICAgICAgICAgSlNWYWx1ZSAqdiA9IHNsb3QuZ2V0VmFsdWUoZXhlYywg
YmFzZSwgaWRlbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAg
ICAgICAgICBkb3VibGUgbiA9IHYtPnRvTnVtYmVyKGV4ZWMpOworICAgICAgICAgICAgICAgICAg
ICAgICAgZG91YmxlIG5ld1ZhbHVlID0gKHBvc3RmaXhSZXNvbHZlTm9kZS0+bV9vcGVyID09IE9w
UGx1c1BsdXMpID8gbiArIDEuMCA6IG4gLSAxLjA7CisgICAgICAgICAgICAgICAgICAgICAgICBi
YXNlLT5wdXQoZXhlYywgaWRlbnQsIGpzTnVtYmVyKG5ld1ZhbHVlKSk7CisgICAgICAgICAgICAg
ICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIFJFVFVSTl9WQUxVRShqc051bWJl
cihuKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCisgICAg
ICAgICAgICAgICAgICAgICsraXRlcjsKKyAgICAgICAgICAgICAgICB9IHdoaWxlIChpdGVyICE9
IGVuZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgUkVUVVJO
X0VSUk9SKHBvc3RmaXhSZXNvbHZlTm9kZS0+dGhyb3dVbmRlZmluZWRWYXJpYWJsZUVycm9yKGV4
ZWMsIGlkZW50KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisKKyAgICAgICAg
ICAgIGNhc2UgUG9zdGZpeEJyYWNrZXROb2RlRXZhbHVhdGVTdGF0ZToKKyAgICAgICAgICAgIHsK
KyAgICAgICAgICAgICAgICBFVkFMVUFURV9BTkRfQ09OVElOVUUoc3RhdGljX2Nhc3Q8UG9zdGZp
eEJyYWNrZXROb2RlKj4oY3VycmVudE5vZGUpLT5tX2Jhc2UuZ2V0KCksIFBvc3RmaXhCcmFja2V0
Tm9kZUV2YWx1YXRlU3RhdGUxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgUG9z
dGZpeEJyYWNrZXROb2RlRXZhbHVhdGVTdGF0ZTE6CisgICAgICAgICAgICB7CisgICAgICAgICAg
ICAgICAgUFVTSF9MT0NBTF9WQUxVRShHRVRfVkFMVUVfUkVUVVJOKCkpOworICAgICAgICAgICAg
ICAgIEVWQUxVQVRFX0FORF9DT05USU5VRShzdGF0aWNfY2FzdDxQb3N0Zml4QnJhY2tldE5vZGUq
PihjdXJyZW50Tm9kZSktPm1fc3Vic2NyaXB0LmdldCgpLCBQb3N0Zml4QnJhY2tldE5vZGVFdmFs
dWF0ZVN0YXRlMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIFBvc3RmaXhCcmFj
a2V0Tm9kZUV2YWx1YXRlU3RhdGUyOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBv
c3RmaXhCcmFja2V0Tm9kZSogcG9zdGZpeEJyYWNrZXROb2RlID0gc3RhdGljX2Nhc3Q8UG9zdGZp
eEJyYWNrZXROb2RlKj4oY3VycmVudE5vZGUpOworICAgICAgICAgICAgICAgIAorICAgICAgICAg
ICAgICAgIEpTVmFsdWUgKnN1YnNjcmlwdCA9IEdFVF9WQUxVRV9SRVRVUk4oKTsKKyAgICAgICAg
ICAgICAgICBKU09iamVjdCAqYmFzZSA9IFBPUF9MT0NBTF9WQUxVRSgpLT50b09iamVjdChleGVj
KTsKKyAgICAgICAgICAgICAgICBLSlNfQ0hFQ0tFWENFUFRJT04oKTsKKyAgICAgICAgICAgICAg
ICAKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcm9wZXJ0eUluZGV4OworICAgICAgICAgICAg
ICAgIGlmIChzdWJzY3JpcHQtPmdldFVJbnQzMihwcm9wZXJ0eUluZGV4KSkgeworICAgICAgICAg
ICAgICAgICAgICBQcm9wZXJ0eVNsb3Qgc2xvdDsKKyAgICAgICAgICAgICAgICAgICAgSlNWYWx1
ZSAqdiA9IGJhc2UtPmdldFByb3BlcnR5U2xvdChleGVjLCBwcm9wZXJ0eUluZGV4LCBzbG90KSA/
IHNsb3QuZ2V0VmFsdWUoZXhlYywgYmFzZSwgcHJvcGVydHlJbmRleCkgOiBqc1VuZGVmaW5lZCgp
OworICAgICAgICAgICAgICAgICAgICBLSlNfQ0hFQ0tFWENFUFRJT04oKTsKKyAgICAgICAgICAg
ICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBuID0gdi0+dG9OdW1iZXIoZXhl
Yyk7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBkb3VibGUgbmV3
VmFsdWUgPSAocG9zdGZpeEJyYWNrZXROb2RlLT5tX29wZXIgPT0gT3BQbHVzUGx1cykgPyBuICsg
MSA6IG4gLSAxOworICAgICAgICAgICAgICAgICAgICBiYXNlLT5wdXQoZXhlYywgcHJvcGVydHlJ
bmRleCwganNOdW1iZXIobmV3VmFsdWUpKTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAg
ICAgICAgICAgICAgIFJFVFVSTl9WQUxVRShqc051bWJlcihuKSk7CisgICAgICAgICAgICAgICAg
fQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIElkZW50aWZpZXIgcHJvcGVydHlO
YW1lKHN1YnNjcmlwdC0+dG9TdHJpbmcoZXhlYykpOworICAgICAgICAgICAgICAgIFByb3BlcnR5
U2xvdCBzbG90OworICAgICAgICAgICAgICAgIEpTVmFsdWUgKnYgPSBiYXNlLT5nZXRQcm9wZXJ0
eVNsb3QoZXhlYywgcHJvcGVydHlOYW1lLCBzbG90KSA/IHNsb3QuZ2V0VmFsdWUoZXhlYywgYmFz
ZSwgcHJvcGVydHlOYW1lKSA6IGpzVW5kZWZpbmVkKCk7CisgICAgICAgICAgICAgICAgS0pTX0NI
RUNLRVhDRVBUSU9OKCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgZG91Ymxl
IG4gPSB2LT50b051bWJlcihleGVjKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAg
ICBkb3VibGUgbmV3VmFsdWUgPSAocG9zdGZpeEJyYWNrZXROb2RlLT5tX29wZXIgPT0gT3BQbHVz
UGx1cykgPyBuICsgMSA6IG4gLSAxOworICAgICAgICAgICAgICAgIGJhc2UtPnB1dChleGVjLCBw
cm9wZXJ0eU5hbWUsIGpzTnVtYmVyKG5ld1ZhbHVlKSk7CisgICAgICAgICAgICAgICAgCisgICAg
ICAgICAgICAgICAgUkVUVVJOX1ZBTFVFKGpzTnVtYmVyKG4pKTsKKyAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhc2UgUG9zdGZp
eERvdE5vZGVFdmFsdWF0ZVN0YXRlOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEVW
QUxVQVRFX0FORF9DT05USU5VRShzdGF0aWNfY2FzdDxQb3N0Zml4RG90Tm9kZSo+KGN1cnJlbnRO
b2RlKS0+bV9iYXNlLmdldCgpLCBQb3N0Zml4RG90Tm9kZUV2YWx1YXRlU3RhdGUxKTsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgUG9zdGZpeERvdE5vZGVFdmFsdWF0ZVN0YXRlMToK
KyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQb3N0Zml4RG90Tm9kZSogcG9zdEZpeERv
dE5vZGUgPSBzdGF0aWNfY2FzdDxQb3N0Zml4RG90Tm9kZSo+KGN1cnJlbnROb2RlKTsKKyAgICAg
ICAgICAgICAgICBKU09iamVjdCogYmFzZSA9IEdFVF9WQUxVRV9SRVRVUk4oKS0+dG9PYmplY3Qo
ZXhlYyk7CisgICAgICAgICAgICAgICAgS0pTX0NIRUNLRVhDRVBUSU9OKCk7CisgICAgICAgICAg
ICAgICAgCisgICAgICAgICAgICAgICAgUHJvcGVydHlTbG90IHNsb3Q7CisgICAgICAgICAgICAg
ICAgSlNWYWx1ZSAqdiA9IGJhc2UtPmdldFByb3BlcnR5U2xvdChleGVjLCBwb3N0Rml4RG90Tm9k
ZS0+bV9pZGVudCwgc2xvdCkgPyBzbG90LmdldFZhbHVlKGV4ZWMsIGJhc2UsIHBvc3RGaXhEb3RO
b2RlLT5tX2lkZW50KSA6IGpzVW5kZWZpbmVkKCk7CisgICAgICAgICAgICAgICAgS0pTX0NIRUNL
RVhDRVBUSU9OKCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgZG91YmxlIG4g
PSB2LT50b051bWJlcihleGVjKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBk
b3VibGUgbmV3VmFsdWUgPSAocG9zdEZpeERvdE5vZGUtPm1fb3BlciA9PSBPcFBsdXNQbHVzKSA/
IG4gKyAxIDogbiAtIDE7CisgICAgICAgICAgICAgICAgYmFzZS0+cHV0KGV4ZWMsIHBvc3RGaXhE
b3ROb2RlLT5tX2lkZW50LCBqc051bWJlcihuZXdWYWx1ZSkpOworICAgICAgICAgICAgICAgIAor
ICAgICAgICAgICAgICAgIFJFVFVSTl9WQUxVRShqc051bWJlcihuKSk7CisgICAgICAgICAgICB9
CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBjYXNlIERl
bGV0ZVJlc29sdmVOb2RlRXZhbHVhdGVTdGF0ZToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAg
ICAgICBEZWxldGVSZXNvbHZlTm9kZSogZGVsZXRlUmVzb2x2ZU5vZGUgPSBzdGF0aWNfY2FzdDxE
ZWxldGVSZXNvbHZlTm9kZSo+KGN1cnJlbnROb2RlKTsKKyAgICAgICAgICAgICAgICBjb25zdCBT
Y29wZUNoYWluJiBjaGFpbiA9IGV4ZWMtPmNvbnRleHQoKS5pbXAoKS0+c2NvcGVDaGFpbigpOwor
ICAgICAgICAgICAgICAgIFNjb3BlQ2hhaW5JdGVyYXRvciBpdGVyID0gY2hhaW4uYmVnaW4oKTsK
KyAgICAgICAgICAgICAgICBTY29wZUNoYWluSXRlcmF0b3IgZW5kID0gY2hhaW4uZW5kKCk7Cisg
ICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gd2UgbXVzdCBhbHdheXMgaGF2ZSBz
b21ldGhpbmcgaW4gdGhlIHNjb3BlIGNoYWluCisgICAgICAgICAgICAgICAgYXNzZXJ0KGl0ZXIg
IT0gZW5kKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBQcm9wZXJ0eVNsb3Qg
c2xvdDsKKyAgICAgICAgICAgICAgICBKU09iamVjdCAqYmFzZTsKKyAgICAgICAgICAgICAgICBk
byB7CisgICAgICAgICAgICAgICAgICAgIGJhc2UgPSAqaXRlcjsKKyAgICAgICAgICAgICAgICAg
ICAgaWYgKGJhc2UtPmdldFByb3BlcnR5U2xvdChleGVjLCBkZWxldGVSZXNvbHZlTm9kZS0+bV9p
ZGVudCwgc2xvdCkpCisgICAgICAgICAgICAgICAgICAgICAgICBSRVRVUk5fVkFMVUUoanNCb29s
ZWFuKGJhc2UtPmRlbGV0ZVByb3BlcnR5KGV4ZWMsIGRlbGV0ZVJlc29sdmVOb2RlLT5tX2lkZW50
KSkpOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgKytpdGVyOwor
ICAgICAgICAgICAgICAgIH0gd2hpbGUgKGl0ZXIgIT0gZW5kKTsKKyAgICAgICAgICAgICAgICAg
ICAgCisgICAgICAgICAgICAgICAgUkVUVVJOX1ZBTFVFKGpzQm9vbGVhbih0cnVlKSk7CisgICAg
ICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBjYXNlIERlbGV0ZUJyYWNr
ZXROb2RlRXZhbHVhdGVTdGF0ZToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBFVkFM
VUFURV9BTkRfQ09OVElOVUUoc3RhdGljX2Nhc3Q8RGVsZXRlQnJhY2tldE5vZGUqPihjdXJyZW50
Tm9kZSktPm1fYmFzZS5nZXQoKSwgRGVsZXRlQnJhY2tldE5vZGVFdmFsdWF0ZVN0YXRlMSk7Cisg
ICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIERlbGV0ZUJyYWNrZXROb2RlRXZhbHVhdGVT
dGF0ZTE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFVTSF9MT0NBTF9WQUxVRShH
RVRfVkFMVUVfUkVUVVJOKCkpOworICAgICAgICAgICAgICAgIEVWQUxVQVRFX0FORF9DT05USU5V
RShzdGF0aWNfY2FzdDxEZWxldGVCcmFja2V0Tm9kZSo+KGN1cnJlbnROb2RlKS0+bV9zdWJzY3Jp
cHQuZ2V0KCksIERlbGV0ZUJyYWNrZXROb2RlRXZhbHVhdGVTdGF0ZTIpOworICAgICAgICAgICAg
fQorICAgICAgICAgICAgY2FzZSBEZWxldGVCcmFja2V0Tm9kZUV2YWx1YXRlU3RhdGUyOgorICAg
ICAgICAgICAgeworICAgICAgICAgICAgICAgIEpTVmFsdWUgKnN1YnNjcmlwdCA9IEdFVF9WQUxV
RV9SRVRVUk4oKTsKKyAgICAgICAgICAgICAgICBKU09iamVjdCAqYmFzZSA9IFBPUF9MT0NBTF9W
QUxVRSgpLT50b09iamVjdChleGVjKTsKKyAgICAgICAgICAgICAgICBLSlNfQ0hFQ0tFWENFUFRJ
T04oKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcm9wZXJ0
eUluZGV4OworICAgICAgICAgICAgICAgIGlmIChzdWJzY3JpcHQtPmdldFVJbnQzMihwcm9wZXJ0
eUluZGV4KSkKKyAgICAgICAgICAgICAgICAgICAgUkVUVVJOX1ZBTFVFKGpzQm9vbGVhbihiYXNl
LT5kZWxldGVQcm9wZXJ0eShleGVjLCBwcm9wZXJ0eUluZGV4KSkpOworICAgICAgICAgICAgICAg
IAorICAgICAgICAgICAgICAgIElkZW50aWZpZXIgcHJvcGVydHlOYW1lKHN1YnNjcmlwdC0+dG9T
dHJpbmcoZXhlYykpOworICAgICAgICAgICAgICAgIFJFVFVSTl9WQUxVRShqc0Jvb2xlYW4oYmFz
ZS0+ZGVsZXRlUHJvcGVydHkoZXhlYywgcHJvcGVydHlOYW1lKSkpOworICAgICAgICAgICAgfQor
ICAgICAgICAgICAgCisgICAgICAgICAgICBjYXNlIERlbGV0ZURvdE5vZGVFdmFsdWF0ZVN0YXRl
OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEVWQUxVQVRFX0FORF9DT05USU5VRShz
dGF0aWNfY2FzdDxEZWxldGVEb3ROb2RlKj4oY3VycmVudE5vZGUpLT5tX2Jhc2UuZ2V0KCksIERl
bGV0ZURvdE5vZGVFdmFsdWF0ZVN0YXRlMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBj
YXNlIERlbGV0ZURvdE5vZGVFdmFsdWF0ZVN0YXRlMToKKyAgICAgICAgICAgIHsKKyAgICAgICAg
ICAgICAgICBKU09iamVjdCAqYmFzZSA9IEdFVF9WQUxVRV9SRVRVUk4oKS0+dG9PYmplY3QoZXhl
Yyk7CisgICAgICAgICAgICAgICAgUkVUVVJOX1ZBTFVFKGpzQm9vbGVhbihiYXNlLT5kZWxldGVQ
cm9wZXJ0eShleGVjLCBzdGF0aWNfY2FzdDxEZWxldGVEb3ROb2RlKj4oY3VycmVudE5vZGUpLT5t
X2lkZW50KSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIERlbGV0ZVZhbHVl
Tm9kZUV2YWx1YXRlU3RhdGU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRVZBTFVB
VEVfQU5EX0NPTlRJTlVFKHN0YXRpY19jYXN0PERlbGV0ZVZhbHVlTm9kZSo+KGN1cnJlbnROb2Rl
KS0+bV9leHByLmdldCgpLCBEZWxldGVWYWx1ZU5vZGVFdmFsdWF0ZVN0YXRlMSk7CisgICAgICAg
ICAgICB9CisgICAgICAgICAgICBjYXNlIERlbGV0ZVZhbHVlTm9kZUV2YWx1YXRlU3RhdGUxOgor
ICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFJFVFVSTl9WQUxVRShqc0Jvb2xlYW4odHJ1
ZSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIFZvaWROb2RlRXZhbHVhdGVT
dGF0ZToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBFVkFMVUFURV9BTkRfQ09OVElO
VUUoc3RhdGljX2Nhc3Q8Vm9pZE5vZGUqPihjdXJyZW50Tm9kZSktPmV4cHIuZ2V0KCksIFZvaWRO
b2RlRXZhbHVhdGVTdGF0ZTEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBWb2lk
Tm9kZUV2YWx1YXRlU3RhdGUxOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFJFVFVS
Tl9WQUxVRShqc1VuZGVmaW5lZCgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2Fz
ZSBUeXBlT2ZSZXNvbHZlTm9kZUV2YWx1YXRlU3RhdGU6CisgICAgICAgICAgICB7CisgICAgICAg
ICAgICAgICAgY29uc3QgU2NvcGVDaGFpbiYgY2hhaW4gPSBleGVjLT5jb250ZXh0KCkuaW1wKCkt
PnNjb3BlQ2hhaW4oKTsKKyAgICAgICAgICAgICAgICBTY29wZUNoYWluSXRlcmF0b3IgaXRlciA9
IGNoYWluLmJlZ2luKCk7CisgICAgICAgICAgICAgICAgU2NvcGVDaGFpbkl0ZXJhdG9yIGVuZCA9
IGNoYWluLmVuZCgpOworICAgICAgICAgICAgICAgIGNvbnN0IElkZW50aWZpZXImIGlkZW50ID0g
c3RhdGljX2Nhc3Q8VHlwZU9mUmVzb2x2ZU5vZGUqPihjdXJyZW50Tm9kZSktPm1faWRlbnQ7Cisg
ICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gd2UgbXVzdCBhbHdheXMgaGF2ZSBz
b21ldGhpbmcgaW4gdGhlIHNjb3BlIGNoYWluCisgICAgICAgICAgICAgICAgYXNzZXJ0KGl0ZXIg
IT0gZW5kKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBQcm9wZXJ0eVNsb3Qg
c2xvdDsKKyAgICAgICAgICAgICAgICBKU09iamVjdCAqYmFzZTsKKyAgICAgICAgICAgICAgICBk
byB7IAorICAgICAgICAgICAgICAgICAgICBiYXNlID0gKml0ZXI7CisgICAgICAgICAgICAgICAg
ICAgIGlmIChiYXNlLT5nZXRQcm9wZXJ0eVNsb3QoZXhlYywgaWRlbnQsIHNsb3QpKSB7CisgICAg
ICAgICAgICAgICAgICAgICAgICBKU1ZhbHVlICp2ID0gc2xvdC5nZXRWYWx1ZShleGVjLCBiYXNl
LCBpZGVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBSRVRVUk5fVkFMVUUodHlwZVN0cmlu
Z0ZvclZhbHVlKHYpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAg
ICAKKyAgICAgICAgICAgICAgICAgICAgKytpdGVyOworICAgICAgICAgICAgICAgIH0gd2hpbGUg
KGl0ZXIgIT0gZW5kKTsKKyAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBSRVRV
Uk5fVkFMVUUoanNTdHJpbmcoInVuZGVmaW5lZCIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgICAgICAKKyAgICAgICAgICAgIGNhc2UgVHlwZU9mVmFsdWVOb2RlRXZhbHVhdGVTdGF0ZToK
KyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBFVkFMVUFURV9BTkRfQ09OVElOVUUoc3Rh
dGljX2Nhc3Q8VHlwZU9mVmFsdWVOb2RlKj4oY3VycmVudE5vZGUpLT5tX2V4cHIuZ2V0KCksIFR5
cGVPZlZhbHVlTm9kZUV2YWx1YXRlU3RhdGUxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAg
IGNhc2UgVHlwZU9mVmFsdWVOb2RlRXZhbHVhdGVTdGF0ZTE6CisgICAgICAgICAgICB7CisgICAg
ICAgICAgICAgICAgUkVUVVJOX1ZBTFVFKHR5cGVTdHJpbmdGb3JWYWx1ZShHRVRfVkFMVUVfUkVU
VVJOKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FzZSBQ
cmVmaXhSZXNvbHZlTm9kZUV2YWx1YXRlU3RhdGU6CisgICAgICAgICAgICB7CisgICAgICAgICAg
ICAgICAgUHJlZml4UmVzb2x2ZU5vZGUqIHByZWZpeFJlc29sdmVOb2RlID0gc3RhdGljX2Nhc3Q8
UHJlZml4UmVzb2x2ZU5vZGUqPihjdXJyZW50Tm9kZSk7CisgICAgICAgICAgICAgICAgY29uc3Qg
U2NvcGVDaGFpbiYgY2hhaW4gPSBleGVjLT5jb250ZXh0KCkuaW1wKCktPnNjb3BlQ2hhaW4oKTsK
KyAgICAgICAgICAgICAgICBTY29wZUNoYWluSXRlcmF0b3IgaXRlciA9IGNoYWluLmJlZ2luKCk7
CisgICAgICAgICAgICAgICAgU2NvcGVDaGFpbkl0ZXJhdG9yIGVuZCA9IGNoYWluLmVuZCgpOwor
ICAgICAgICAgICAgICAgIGNvbnN0IElkZW50aWZpZXImIGlkZW50ID0gcHJlZml4UmVzb2x2ZU5v
ZGUtPm1faWRlbnQ7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gd2UgbXVz
dCBhbHdheXMgaGF2ZSBzb21ldGhpbmcgaW4gdGhlIHNjb3BlIGNoYWluCisgICAgICAgICAgICAg
ICAgYXNzZXJ0KGl0ZXIgIT0gZW5kKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAg
ICBQcm9wZXJ0eVNsb3Qgc2xvdDsKKyAgICAgICAgICAgICAgICBKU09iamVjdCAqYmFzZTsKKyAg
ICAgICAgICAgICAgICBkbyB7IAorICAgICAgICAgICAgICAgICAgICBiYXNlID0gKml0ZXI7Cisg
ICAgICAgICAgICAgICAgICAgIGlmIChiYXNlLT5nZXRQcm9wZXJ0eVNsb3QoZXhlYywgaWRlbnQs
IHNsb3QpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBKU1ZhbHVlICp2ID0gc2xvdC5nZXRW
YWx1ZShleGVjLCBiYXNlLCBpZGVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAg
ICAgICAgICAgICAgICAgICAgIGRvdWJsZSBuID0gdi0+dG9OdW1iZXIoZXhlYyk7CisgICAgICAg
ICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBuZXdWYWx1
ZSA9IChwcmVmaXhSZXNvbHZlTm9kZS0+bV9vcGVyID09IE9wUGx1c1BsdXMpID8gbiArIDEgOiBu
IC0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEpTVmFsdWUgKm4yID0ganNOdW1iZXIobmV3
VmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgYmFzZS0+cHV0KGV4ZWMsIGlkZW50LCBu
Mik7CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIFJF
VFVSTl9WQUxVRShuMik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAg
ICAgCisgICAgICAgICAgICAgICAgICAgICsraXRlcjsKKyAgICAgICAgICAgICAgICB9IHdoaWxl
IChpdGVyICE9IGVuZCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgUkVUVVJO
X0VSUk9SKHByZWZpeFJlc29sdmVOb2RlLT50aHJvd1VuZGVmaW5lZFZhcmlhYmxlRXJyb3IoZXhl
YywgaWRlbnQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAg
ICAgICAKKyAgICAgICAgICAgIGNhc2UgUHJlZml4QnJhY2tldE5vZGVFdmFsdWF0ZVN0YXRlOgor
ICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEVWQUxVQVRFX0FORF9DT05USU5VRShzdGF0
aWNfY2FzdDxQcmVmaXhCcmFja2V0Tm9kZSo+KGN1cnJlbnROb2RlKS0+bV9iYXNlLmdldCgpLCBQ
cmVmaXhCcmFja2V0Tm9kZUV2YWx1YXRlU3RhdGUxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIGNhc2UgUHJlZml4QnJhY2tldE5vZGVFdmFsdWF0ZVN0YXRlMToKKyAgICAgICAgICAgIHsK
KyAgICAgICAgICAgICAgICBQVVNIX0xPQ0FMX1ZBTFVFKEdFVF9WQUxVRV9SRVRVUk4oKSk7Cisg
ICAgICAgICAgICAgICAgRVZBTFVBVEVfQU5EX0NPTlRJTlVFKHN0YXRpY19jYXN0PFByZWZpeEJy
YWNrZXROb2RlKj4oY3VycmVudE5vZGUpLT5tX3N1YnNjcmlwdC5nZXQoKSwgUHJlZml4QnJhY2tl
dE5vZGVFdmFsdWF0ZVN0YXRlMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIFBy
ZWZpeEJyYWNrZXROb2RlRXZhbHVhdGVTdGF0ZTI6CisgICAgICAgICAgICB7CisgICAgICAgICAg
ICAgICAgUHJlZml4QnJhY2tldE5vZGUqIHByZWZpeEJyYWNrZXROb2RlID0gc3RhdGljX2Nhc3Q8
UHJlZml4QnJhY2tldE5vZGUqPihjdXJyZW50Tm9kZSk7CisgICAgICAgICAgICAgICAgT3BlcmF0
b3Igb3BlciA9IHByZWZpeEJyYWNrZXROb2RlLT5tX29wZXI7CisgICAgICAgICAgICAgICAgSlNW
YWx1ZSAqc3Vic2NyaXB0ID0gR0VUX1ZBTFVFX1JFVFVSTigpOworICAgICAgICAgICAgICAgIEpT
T2JqZWN0ICpiYXNlID0gUE9QX0xPQ0FMX1ZBTFVFKCktPnRvT2JqZWN0KGV4ZWMpOworICAgICAg
ICAgICAgICAgIEtKU19DSEVDS0VYQ0VQVElPTigpOworICAgICAgICAgICAgICAgIAorICAgICAg
ICAgICAgICAgIHVpbnQzMl90IHByb3BlcnR5SW5kZXg7CisgICAgICAgICAgICAgICAgaWYgKHN1
YnNjcmlwdC0+Z2V0VUludDMyKHByb3BlcnR5SW5kZXgpKSB7CisgICAgICAgICAgICAgICAgICAg
IFByb3BlcnR5U2xvdCBzbG90OworICAgICAgICAgICAgICAgICAgICBKU1ZhbHVlICp2ID0gYmFz
ZS0+Z2V0UHJvcGVydHlTbG90KGV4ZWMsIHByb3BlcnR5SW5kZXgsIHNsb3QpID8gc2xvdC5nZXRW
YWx1ZShleGVjLCBiYXNlLCBwcm9wZXJ0eUluZGV4KSA6IGpzVW5kZWZpbmVkKCk7CisgICAgICAg
ICAgICAgICAgICAgIEtKU19DSEVDS0VYQ0VQVElPTigpOworICAgICAgICAgICAgICAgICAgICAK
KyAgICAgICAgICAgICAgICAgICAgZG91YmxlIG4gPSB2LT50b051bWJlcihleGVjKTsKKyAgICAg
ICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBuZXdWYWx1ZSA9IChv
cGVyID09IE9wUGx1c1BsdXMpID8gbiArIDEgOiBuIC0gMTsKKyAgICAgICAgICAgICAgICAgICAg
SlNWYWx1ZSAqbjIgPSBqc051bWJlcihuZXdWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIGJh
c2UtPnB1dChleGVjLCBwcm9wZXJ0eUluZGV4LCBuMik7CisgICAgICAgICAgICAgICAgICAgIAor
ICAgICAgICAgICAgICAgICAgICBSRVRVUk5fVkFMVUUobjIpOworICAgICAgICAgICAgICAgIH0K
KyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBJZGVudGlmaWVyIHByb3BlcnR5TmFt
ZShzdWJzY3JpcHQtPnRvU3RyaW5nKGV4ZWMpKTsKKyAgICAgICAgICAgICAgICBQcm9wZXJ0eVNs
b3Qgc2xvdDsKKyAgICAgICAgICAgICAgICBKU1ZhbHVlICp2ID0gYmFzZS0+Z2V0UHJvcGVydHlT
bG90KGV4ZWMsIHByb3BlcnR5TmFtZSwgc2xvdCkgPyBzbG90LmdldFZhbHVlKGV4ZWMsIGJhc2Us
IHByb3BlcnR5TmFtZSkgOiBqc1VuZGVmaW5lZCgpOworICAgICAgICAgICAgICAgIEtKU19DSEVD
S0VYQ0VQVElPTigpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGRvdWJsZSBu
ID0gdi0+dG9OdW1iZXIoZXhlYyk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAg
ZG91YmxlIG5ld1ZhbHVlID0gKG9wZXIgPT0gT3BQbHVzUGx1cykgPyBuICsgMSA6IG4gLSAxOwor
ICAgICAgICAgICAgICAgIEpTVmFsdWUgKm4yID0ganNOdW1iZXIobmV3VmFsdWUpOworICAgICAg
ICAgICAgICAgIGJhc2UtPnB1dChleGVjLCBwcm9wZXJ0eU5hbWUsIG4yKTsKKyAgICAgICAgICAg
ICAgICAKKyAgICAgICAgICAgICAgICBSRVRVUk5fVkFMVUUobjIpOworICAgICAgICAgICAgfQor
ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgY2FzZSBQcmVm
aXhEb3ROb2RlRXZhbHVhdGVTdGF0ZToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBF
VkFMVUFURV9BTkRfQ09OVElOVUUoc3RhdGljX2Nhc3Q8UHJlZml4RG90Tm9kZSo+KGN1cnJlbnRO
b2RlKS0+bV9iYXNlLmdldCgpLCBQcmVmaXhEb3ROb2RlRXZhbHVhdGVTdGF0ZTEpOworICAgICAg
ICAgICAgfQorICAgICAgICAgICAgY2FzZSBQcmVmaXhEb3ROb2RlRXZhbHVhdGVTdGF0ZTE6Cisg
ICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSlNPYmplY3QgKmJhc2UgPSBHRVRfVkFMVUVf
UkVUVVJOKCktPnRvT2JqZWN0KGV4ZWMpOworICAgICAgICAgICAgICAgIEtKU19DSEVDS0VYQ0VQ
VElPTigpOworICAgICAgICAgICAgICAgIFByZWZpeERvdE5vZGUqIHByZWZpeERvdE5vZGUgPSBz
dGF0aWNfY2FzdDxQcmVmaXhEb3ROb2RlKj4oY3VycmVudE5vZGUpOworICAgICAgICAgICAgICAg
IGNvbnN0IElkZW50aWZpZXImIGlkZW50ID0gcHJlZml4RG90Tm9kZS0+bV9pZGVudDsKKyAgICAg
ICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBQcm9wZXJ0eVNsb3Qgc2xvdDsKKyAgICAgICAg
ICAgICAgICBKU1ZhbHVlICp2ID0gYmFzZS0+Z2V0UHJvcGVydHlTbG90KGV4ZWMsIGlkZW50LCBz
bG90KSA/IHNsb3QuZ2V0VmFsdWUoZXhlYywgYmFzZSwgaWRlbnQpIDoganNVbmRlZmluZWQoKTsK
KyAgICAgICAgICAgICAgICBLSlNfQ0hFQ0tFWENFUFRJT04oKTsKKyAgICAgICAgICAgICAgICAK
KyAgICAgICAgICAgICAgICBkb3VibGUgbiA9IHYtPnRvTnVtYmVyKGV4ZWMpOworICAgICAgICAg
ICAgICAgIGRvdWJsZSBuZXdWYWx1ZSA9IChwcmVmaXhEb3ROb2RlLT5tX29wZXIgPT0gT3BQbHVz
UGx1cykgPyBuICsgMSA6IG4gLSAxOworICAgICAgICAgICAgICAgIEpTVmFsdWUgKm4yID0ganNO
dW1iZXIobmV3VmFsdWUpOworICAgICAgICAgICAgICAgIGJhc2UtPnB1dChleGVjLCBpZGVudCwg
bjIpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIFJFVFVSTl9WQUxVRShuMik7
CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIEZJWE1FOiBUaGlz
IGNhbiBqdXN0IGJlIHJlbW92ZWQsIG9yPworICAgICAgICAgICAgY2FzZSBVbmFyeVBsdXNOb2Rl
RXZhbHVhdGVTdGF0ZToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBFVkFMVUFURV9B
TkRfQ09OVElOVUUoc3RhdGljX2Nhc3Q8VW5hcnlQbHVzTm9kZSo+KGN1cnJlbnROb2RlKS0+ZXhw
ci5nZXQoKSwgVW5hcnlQbHVzTm9kZUV2YWx1YXRlU3RhdGUxKTsKKyAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgIGNhc2UgVW5hcnlQbHVzTm9kZUV2YWx1YXRlU3RhdGUxOgorICAgICAgICAgICAg
eworICAgICAgICAgICAgICAgIGRvdWJsZSB2YWx1ZSA9IEdFVF9WQUxVRV9SRVRVUk4oKS0+dG9O
dW1iZXIoZXhlYyk7CisgICAgICAgICAgICAgICAgUkVUVVJOX1ZBTFVFKGpzTnVtYmVyKHZhbHVl
KSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgTmVnYXRlTm9kZUV2YWx1YXRl
U3RhdGU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRVZBTFVBVEVfQU5EX0NPTlRJ
TlVFKHN0YXRpY19jYXN0PE5lZ2F0ZU5vZGUqPihjdXJyZW50Tm9kZSktPmV4cHIuZ2V0KCksIE5l
Z2F0ZU5vZGVFdmFsdWF0ZVN0YXRlMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNl
IE5lZ2F0ZU5vZGVFdmFsdWF0ZVN0YXRlMToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAg
ICBkb3VibGUgdmFsdWUgPSBHRVRfVkFMVUVfUkVUVVJOKCktPnRvTnVtYmVyKGV4ZWMpOworICAg
ICAgICAgICAgICAgIFJFVFVSTl9WQUxVRShqc051bWJlcigtdmFsdWUpKTsKKyAgICAgICAgICAg
IH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FzZSBCaXR3aXNlTm90Tm9kZUV2YWx1YXRl
U3RhdGU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRVZBTFVBVEVfQU5EX0NPTlRJ
TlVFKHN0YXRpY19jYXN0PEJpdHdpc2VOb3ROb2RlKj4oY3VycmVudE5vZGUpLT5leHByLmdldCgp
LCBCaXR3aXNlTm90Tm9kZUV2YWx1YXRlU3RhdGUxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIGNhc2UgQml0d2lzZU5vdE5vZGVFdmFsdWF0ZVN0YXRlMToKKyAgICAgICAgICAgIHsKKyAg
ICAgICAgICAgICAgICBpbnQzMl90IHZhbHVlID0gR0VUX1ZBTFVFX1JFVFVSTigpLT50b0ludDMy
KGV4ZWMpOworICAgICAgICAgICAgICAgIFJFVFVSTl9WQUxVRShqc051bWJlcih+dmFsdWUpKTsK
KyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhc2UgTG9naWNh
bE5vdE5vZGVFdmFsdWF0ZVN0YXRlOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEVW
QUxVQVRFX0FORF9DT05USU5VRShzdGF0aWNfY2FzdDxMb2dpY2FsTm90Tm9kZSo+KGN1cnJlbnRO
b2RlKS0+ZXhwci5nZXQoKSwgTG9naWNhbE5vdE5vZGVFdmFsdWF0ZVN0YXRlMSk7CisgICAgICAg
ICAgICB9CisgICAgICAgICAgICBjYXNlIExvZ2ljYWxOb3ROb2RlRXZhbHVhdGVTdGF0ZTE6Cisg
ICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYm9vbCB2YWx1ZSA9IEdFVF9WQUxVRV9SRVRV
Uk4oKS0+dG9Cb29sZWFuKGV4ZWMpOworICAgICAgICAgICAgICAgIFJFVFVSTl9WQUxVRShqc0Jv
b2xlYW4oIXZhbHVlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAg
IGNhc2UgTXVsdE5vZGVFdmFsdWF0ZVN0YXRlOgorICAgICAgICAgICAgeworICAgICAgICAgICAg
ICAgIEVWQUxVQVRFX0FORF9DT05USU5VRShzdGF0aWNfY2FzdDxNdWx0Tm9kZSo+KGN1cnJlbnRO
b2RlKS0+dGVybTEuZ2V0KCksIE11bHROb2RlRXZhbHVhdGVTdGF0ZTEpOworICAgICAgICAgICAg
fQorICAgICAgICAgICAgY2FzZSBNdWx0Tm9kZUV2YWx1YXRlU3RhdGUxOgorICAgICAgICAgICAg
eworICAgICAgICAgICAgICAgIFBVU0hfTE9DQUxfVkFMVUUoR0VUX1ZBTFVFX1JFVFVSTigpKTsK
KyAgICAgICAgICAgICAgICBFVkFMVUFURV9BTkRfQ09OVElOVUUoc3RhdGljX2Nhc3Q8TXVsdE5v
ZGUqPihjdXJyZW50Tm9kZSktPnRlcm0yLmdldCgpLCBNdWx0Tm9kZUV2YWx1YXRlU3RhdGUyKTsK
KyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgTXVsdE5vZGVFdmFsdWF0ZVN0YXRlMjoK
KyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBSRVRVUk5fVkFMVUUobXVsdChleGVjLCBQ
T1BfTE9DQUxfVkFMVUUoKSwgR0VUX1ZBTFVFX1JFVFVSTigpLCBzdGF0aWNfY2FzdDxNdWx0Tm9k
ZSo+KGN1cnJlbnROb2RlKS0+b3BlcikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisg
ICAgICAgICAgICBjYXNlIEFkZE5vZGVFdmFsdWF0ZVN0YXRlOgorICAgICAgICAgICAgeworICAg
ICAgICAgICAgICAgIEVWQUxVQVRFX0FORF9DT05USU5VRShzdGF0aWNfY2FzdDxBZGROb2RlKj4o
Y3VycmVudE5vZGUpLT50ZXJtMS5nZXQoKSwgQWRkTm9kZUV2YWx1YXRlU3RhdGUxKTsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgQWRkTm9kZUV2YWx1YXRlU3RhdGUxOgorICAgICAg
ICAgICAgeworICAgICAgICAgICAgICAgIFBVU0hfTE9DQUxfVkFMVUUoR0VUX1ZBTFVFX1JFVFVS
TigpKTsKKyAgICAgICAgICAgICAgICBFVkFMVUFURV9BTkRfQ09OVElOVUUoc3RhdGljX2Nhc3Q8
QWRkTm9kZSo+KGN1cnJlbnROb2RlKS0+dGVybTIuZ2V0KCksIEFkZE5vZGVFdmFsdWF0ZVN0YXRl
Mik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEFkZE5vZGVFdmFsdWF0ZVN0YXRl
MjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBSRVRVUk5fVkFMVUUoYWRkKGV4ZWMs
IFBPUF9MT0NBTF9WQUxVRSgpLCBHRVRfVkFMVUVfUkVUVVJOKCksIHN0YXRpY19jYXN0PEFkZE5v
ZGUqPihjdXJyZW50Tm9kZSktPm9wZXIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAor
ICAgICAgICAgICAgY2FzZSBTaGlmdE5vZGVFdmFsdWF0ZVN0YXRlOgorICAgICAgICAgICAgewor
ICAgICAgICAgICAgICAgIEVWQUxVQVRFX0FORF9DT05USU5VRShzdGF0aWNfY2FzdDxTaGlmdE5v
ZGUqPihjdXJyZW50Tm9kZSktPnRlcm0xLmdldCgpLCBTaGlmdE5vZGVFdmFsdWF0ZVN0YXRlMSk7
CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIFNoaWZ0Tm9kZUV2YWx1YXRlU3RhdGUx
OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBVU0hfTE9DQUxfVkFMVUUoR0VUX1ZB
TFVFX1JFVFVSTigpKTsKKyAgICAgICAgICAgICAgICBFVkFMVUFURV9BTkRfQ09OVElOVUUoc3Rh
dGljX2Nhc3Q8U2hpZnROb2RlKj4oY3VycmVudE5vZGUpLT50ZXJtMi5nZXQoKSwgU2hpZnROb2Rl
RXZhbHVhdGVTdGF0ZTIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBTaGlmdE5v
ZGVFdmFsdWF0ZVN0YXRlMjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBKU1ZhbHVl
ICp2MiA9IEdFVF9WQUxVRV9SRVRVUk4oKTsKKyAgICAgICAgICAgICAgICBKU1ZhbHVlICp2MSA9
IFBPUF9MT0NBTF9WQUxVRSgpOworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBpMiA9IHYy
LT50b1VJbnQzMihleGVjKTsKKyAgICAgICAgICAgICAgICBpMiAmPSAweDFmOworICAgICAgICAg
ICAgICAgIAorICAgICAgICAgICAgICAgIEpTVmFsdWUqIHJlc3VsdDsKKyAgICAgICAgICAgICAg
ICBzd2l0Y2ggKHN0YXRpY19jYXN0PFNoaWZ0Tm9kZSo+KGN1cnJlbnROb2RlKS0+b3Blcikgewor
ICAgICAgICAgICAgICAgICAgICBjYXNlIE9wTFNoaWZ0OgorICAgICAgICAgICAgICAgICAgICAg
ICAgcmVzdWx0ID0ganNOdW1iZXIodjEtPnRvSW50MzIoZXhlYykgPDwgaTIpOworICAgICAgICAg
ICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgT3BSU2hpZnQ6
CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBqc051bWJlcih2MS0+dG9JbnQzMihl
eGVjKSA+PiBpMik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAg
ICAgICAgICAgY2FzZSBPcFVSU2hpZnQ6CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQg
PSBqc051bWJlcih2MS0+dG9VSW50MzIoZXhlYykgPj4gaTIpOworICAgICAgICAgICAgICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAg
ICAgICAgICAgICBhc3NlcnQoISJTaGlmdE5vZGU6IHVuaGFuZGxlZCBzd2l0Y2ggY2FzZSIpOwor
ICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0ganNVbmRlZmluZWQoKTsKKyAgICAgICAg
ICAgICAgICB9CisgICAgICAgICAgICAgICAgUkVUVVJOX1ZBTFVFKHJlc3VsdCk7CisgICAgICAg
ICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhc2UgUmVsYXRpb25hbE5vZGVFdmFs
dWF0ZVN0YXRlOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEVWQUxVQVRFX0FORF9D
T05USU5VRShzdGF0aWNfY2FzdDxSZWxhdGlvbmFsTm9kZSo+KGN1cnJlbnROb2RlKS0+ZXhwcjEu
Z2V0KCksIFJlbGF0aW9uYWxOb2RlRXZhbHVhdGVTdGF0ZTEpOworICAgICAgICAgICAgfQorICAg
ICAgICAgICAgY2FzZSBSZWxhdGlvbmFsTm9kZUV2YWx1YXRlU3RhdGUxOgorICAgICAgICAgICAg
eworICAgICAgICAgICAgICAgIFBVU0hfTE9DQUxfVkFMVUUoR0VUX1ZBTFVFX1JFVFVSTigpKTsK
KyAgICAgICAgICAgICAgICBFVkFMVUFURV9BTkRfQ09OVElOVUUoc3RhdGljX2Nhc3Q8UmVsYXRp
b25hbE5vZGUqPihjdXJyZW50Tm9kZSktPmV4cHIyLmdldCgpLCBSZWxhdGlvbmFsTm9kZUV2YWx1
YXRlU3RhdGUyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgUmVsYXRpb25hbE5v
ZGVFdmFsdWF0ZVN0YXRlMjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBSZWxhdGlv
bmFsTm9kZSogcmVsYXRpb25hbE5vZGUgPSBzdGF0aWNfY2FzdDxSZWxhdGlvbmFsTm9kZSo+KGN1
cnJlbnROb2RlKTsKKyAgICAgICAgICAgICAgICBKU1ZhbHVlICp2MiA9IEdFVF9WQUxVRV9SRVRV
Uk4oKTsKKyAgICAgICAgICAgICAgICBKU1ZhbHVlICp2MSA9IFBPUF9MT0NBTF9WQUxVRSgpOwor
ICAgICAgICAgICAgICAgIE9wZXJhdG9yIG9wZXIgPSByZWxhdGlvbmFsTm9kZS0+b3BlcjsKKyAg
ICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBib29sIGI7CisgICAgICAgICAgICAgICAg
aWYgKG9wZXIgPT0gT3BMZXNzIHx8IG9wZXIgPT0gT3BHcmVhdGVyRXEpIHsKKyAgICAgICAgICAg
ICAgICAgICAgaW50IHIgPSByZWxhdGlvbihleGVjLCB2MSwgdjIpOworICAgICAgICAgICAgICAg
ICAgICBpZiAociA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICBiID0gZmFsc2U7CisgICAg
ICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAob3BlciA9
PSBPcExlc3MpID8gKHIgPT0gMSkgOiAociA9PSAwKTsKKyAgICAgICAgICAgICAgICB9IGVsc2Ug
aWYgKG9wZXIgPT0gT3BHcmVhdGVyIHx8IG9wZXIgPT0gT3BMZXNzRXEpIHsKKyAgICAgICAgICAg
ICAgICAgICAgaW50IHIgPSByZWxhdGlvbihleGVjLCB2MiwgdjEpOworICAgICAgICAgICAgICAg
ICAgICBpZiAociA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICBiID0gZmFsc2U7CisgICAg
ICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAob3BlciA9
PSBPcEdyZWF0ZXIpID8gKHIgPT0gMSkgOiAociA9PSAwKTsKKyAgICAgICAgICAgICAgICB9IGVs
c2UgaWYgKG9wZXIgPT0gT3BJbikgeworICAgICAgICAgICAgICAgICAgICAvLyBJcyBhbGwgb2Yg
dGhpcyBPSyBmb3IgaG9zdCBvYmplY3RzPworICAgICAgICAgICAgICAgICAgICBpZiAoIXYyLT5p
c09iamVjdCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgUkVUVVJOX0VSUk9SKHJlbGF0aW9u
YWxOb2RlLT50aHJvd0Vycm9yKGV4ZWMsIFR5cGVFcnJvciwgIlZhbHVlICVzIChyZXN1bHQgb2Yg
ZXhwcmVzc2lvbiAlcykgaXMgbm90IGFuIG9iamVjdC4gQ2Fubm90IGJlIHVzZWQgd2l0aCBJTiBl
eHByZXNzaW9uLiIsIHYyLCByZWxhdGlvbmFsTm9kZS0+ZXhwcjIuZ2V0KCkpKTsKKyAgICAgICAg
ICAgICAgICAgICAgSlNPYmplY3QgKm8yKHN0YXRpY19jYXN0PEpTT2JqZWN0Kj4odjIpKTsKKyAg
ICAgICAgICAgICAgICAgICAgYiA9IG8yLT5oYXNQcm9wZXJ0eShleGVjLCBJZGVudGlmaWVyKHYx
LT50b1N0cmluZyhleGVjKSkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAg
ICAgICAgICAgIGlmICghdjItPmlzT2JqZWN0KCkpCisgICAgICAgICAgICAgICAgICAgICAgICBS
RVRVUk5fRVJST1IocmVsYXRpb25hbE5vZGUtPnRocm93RXJyb3IoZXhlYywgVHlwZUVycm9yLCAi
VmFsdWUgJXMgKHJlc3VsdCBvZiBleHByZXNzaW9uICVzKSBpcyBub3QgYW4gb2JqZWN0LiBDYW5u
b3QgYmUgdXNlZCB3aXRoIGluc3RhbmNlb2Ygb3BlcmF0b3IuIiwgdjIsIHJlbGF0aW9uYWxOb2Rl
LT5leHByMi5nZXQoKSkpOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAg
ICAgSlNPYmplY3QgKm8yKHN0YXRpY19jYXN0PEpTT2JqZWN0Kj4odjIpKTsKKyAgICAgICAgICAg
ICAgICAgICAgaWYgKCFvMi0+aW1wbGVtZW50c0hhc0luc3RhbmNlKCkpIHsKKyAgICAgICAgICAg
ICAgICAgICAgICAgIC8vIEFjY29yZGluZyB0byB0aGUgc3BlYywgb25seSBzb21lIHR5cGVzIG9m
IG9iamVjdHMgImltcGxlbWVudCIgdGhlIFtbSGFzSW5zdGFuY2VdXSBwcm9wZXJ0eS4KKyAgICAg
ICAgICAgICAgICAgICAgICAgIC8vIEJ1dCB3ZSBhcmUgc3VwcG9zZWQgdG8gdGhyb3cgYW4gZXhj
ZXB0aW9uIHdoZXJlIHRoZSBvYmplY3QgZG9lcyBub3QgImhhdmUiIHRoZSBbW0hhc0luc3RhbmNl
XV0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByb3BlcnR5LiBJdCBzZWVtcyB0aGF0IGFs
bCBvYmplY3QgaGF2ZSB0aGUgcHJvcGVydHksIGJ1dCBub3QgYWxsIGltcGxlbWVudCBpdCwgc28g
aW4gdGhpcworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FzZSB3ZSByZXR1cm4gZmFsc2Ug
KGNvbnNpc3RlbnQgd2l0aCBtb3ppbGxhKQorICAgICAgICAgICAgICAgICAgICAgICAgUkVUVVJO
X1ZBTFVFKGpzQm9vbGVhbihmYWxzZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAg
ICByZXR1cm4gdGhyb3dFcnJvcihleGVjLCBUeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAg
ICAgICAvLwkJCSJPYmplY3QgZG9lcyBub3QgaW1wbGVtZW50IHRoZSBbW0hhc0luc3RhbmNlXV0g
bWV0aG9kLiIgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBS
RVRVUk5fVkFMVUUoanNCb29sZWFuKG8yLT5oYXNJbnN0YW5jZShleGVjLCB2MSkpKTsKKyAgICAg
ICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgUkVUVVJOX1ZB
TFVFKGpzQm9vbGVhbihiKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKworICAgICAg
ICAgICAgY2FzZSBFcXVhbE5vZGVFdmFsdWF0ZVN0YXRlOgorICAgICAgICAgICAgeworICAgICAg
ICAgICAgICAgIEVWQUxVQVRFX0FORF9DT05USU5VRShzdGF0aWNfY2FzdDxFcXVhbE5vZGUqPihj
dXJyZW50Tm9kZSktPmV4cHIxLmdldCgpLCBFcXVhbE5vZGVFdmFsdWF0ZVN0YXRlMSk7CisgICAg
ICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEVxdWFsTm9kZUV2YWx1YXRlU3RhdGUxOgorICAg
ICAgICAgICAgeworICAgICAgICAgICAgICAgIFBVU0hfTE9DQUxfVkFMVUUoR0VUX1ZBTFVFX1JF
VFVSTigpKTsKKyAgICAgICAgICAgICAgICBFVkFMVUFURV9BTkRfQ09OVElOVUUoc3RhdGljX2Nh
c3Q8RXF1YWxOb2RlKj4oY3VycmVudE5vZGUpLT5leHByMi5nZXQoKSwgRXF1YWxOb2RlRXZhbHVh
dGVTdGF0ZTIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBFcXVhbE5vZGVFdmFs
dWF0ZVN0YXRlMjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBKU1ZhbHVlKiB2MiA9
IEdFVF9WQUxVRV9SRVRVUk4oKTsKKyAgICAgICAgICAgICAgICBKU1ZhbHVlKiB2MSA9IFBPUF9M
T0NBTF9WQUxVRSgpOworICAgICAgICAgICAgICAgIE9wZXJhdG9yIG9wZXIgPSBzdGF0aWNfY2Fz
dDxFcXVhbE5vZGUqPihjdXJyZW50Tm9kZSktPm9wZXI7CisgICAgICAgICAgICAgICAgCisgICAg
ICAgICAgICAgICAgYm9vbCByZXN1bHQ7CisgICAgICAgICAgICAgICAgaWYgKG9wZXIgPT0gT3BF
cUVxIHx8IG9wZXIgPT0gT3BOb3RFcSkgeworICAgICAgICAgICAgICAgICAgICAvLyA9PSBhbmQg
IT0KKyAgICAgICAgICAgICAgICAgICAgYm9vbCBlcSA9IGVxdWFsKGV4ZWMsIHYxLCB2Mik7Cisg
ICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG9wZXIgPT0gT3BFcUVxID8gZXEgOiAhZXE7Cisg
ICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gPT09IGFuZCAh
PT0KKyAgICAgICAgICAgICAgICAgICAgYm9vbCBlcSA9IHN0cmljdEVxdWFsKGV4ZWMsIHYxLCB2
Mik7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG9wZXIgPT0gT3BTdHJFcSA/IGVxIDog
IWVxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBSRVRVUk5fVkFMVUUoanNC
b29sZWFuKHJlc3VsdCkpOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIGNhc2UgQml0
T3Blck5vZGVFdmFsdWF0ZVN0YXRlOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEVW
QUxVQVRFX0FORF9DT05USU5VRShzdGF0aWNfY2FzdDxCaXRPcGVyTm9kZSo+KGN1cnJlbnROb2Rl
KS0+ZXhwcjEuZ2V0KCksIEJpdE9wZXJOb2RlRXZhbHVhdGVTdGF0ZTEpOworICAgICAgICAgICAg
fQorICAgICAgICAgICAgY2FzZSBCaXRPcGVyTm9kZUV2YWx1YXRlU3RhdGUxOgorICAgICAgICAg
ICAgeworICAgICAgICAgICAgICAgIFBVU0hfTE9DQUxfVkFMVUUoR0VUX1ZBTFVFX1JFVFVSTigp
KTsKKyAgICAgICAgICAgICAgICBFVkFMVUFURV9BTkRfQ09OVElOVUUoc3RhdGljX2Nhc3Q8Qml0
T3Blck5vZGUqPihjdXJyZW50Tm9kZSktPmV4cHIyLmdldCgpLCBCaXRPcGVyTm9kZUV2YWx1YXRl
U3RhdGUyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgQml0T3Blck5vZGVFdmFs
dWF0ZVN0YXRlMjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBKU1ZhbHVlKiB2MiA9
IEdFVF9WQUxVRV9SRVRVUk4oKTsKKyAgICAgICAgICAgICAgICBKU1ZhbHVlKiB2MSA9IFBPUF9M
T0NBTF9WQUxVRSgpOworICAgICAgICAgICAgICAgIE9wZXJhdG9yIG9wZXIgPSBzdGF0aWNfY2Fz
dDxCaXRPcGVyTm9kZSo+KGN1cnJlbnROb2RlKS0+b3BlcjsKKworICAgICAgICAgICAgICAgIGlu
dCBpMSA9IHYxLT50b0ludDMyKGV4ZWMpOworICAgICAgICAgICAgICAgIGludCBpMiA9IHYyLT50
b0ludDMyKGV4ZWMpOworICAgICAgICAgICAgICAgIGludCByZXN1bHQ7CisgICAgICAgICAgICAg
ICAgaWYgKG9wZXIgPT0gT3BCaXRBbmQpCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGkx
ICYgaTI7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAob3BlciA9PSBPcEJpdFhPcikKKyAgICAg
ICAgICAgICAgICAgICAgcmVzdWx0ID0gaTEgXiBpMjsKKyAgICAgICAgICAgICAgICBlbHNlCisg
ICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGkxIHwgaTI7CisgICAgICAgICAgICAgICAgCisg
ICAgICAgICAgICAgICAgUkVUVVJOX1ZBTFVFKGpzTnVtYmVyKHJlc3VsdCkpOworICAgICAgICAg
ICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgY2FzZSBCaW5hcnlMb2dpY2FsTm9k
ZUV2YWx1YXRlU3RhdGU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRVZBTFVBVEVf
QU5EX0NPTlRJTlVFKHN0YXRpY19jYXN0PEJpbmFyeUxvZ2ljYWxOb2RlKj4oY3VycmVudE5vZGUp
LT5leHByMS5nZXQoKSwgQmluYXJ5TG9naWNhbE5vZGVFdmFsdWF0ZVN0YXRlMSk7CisgICAgICAg
ICAgICB9CisgICAgICAgICAgICBjYXNlIEJpbmFyeUxvZ2ljYWxOb2RlRXZhbHVhdGVTdGF0ZTE6
CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSlNWYWx1ZSogdjEgPSBHRVRfVkFMVUVf
UkVUVVJOKCk7CisgICAgICAgICAgICAgICAgQmluYXJ5TG9naWNhbE5vZGUqIGJpbmFyeUxvZ2lj
YWxOb2RlID0gc3RhdGljX2Nhc3Q8QmluYXJ5TG9naWNhbE5vZGUqPihjdXJyZW50Tm9kZSk7Cisg
ICAgICAgICAgICAgICAgT3BlcmF0b3Igb3BlciA9IGJpbmFyeUxvZ2ljYWxOb2RlLT5vcGVyOwor
ICAgICAgICAgICAgICAgIGJvb2wgYjEgPSB2MS0+dG9Cb29sZWFuKGV4ZWMpOworICAgICAgICAg
ICAgICAgIGlmICgoIWIxICYmIG9wZXIgPT0gT3BBbmQpIHx8IChiMSAmJiBvcGVyID09IE9wT3Ip
KQorICAgICAgICAgICAgICAgICAgICBSRVRVUk5fVkFMVUUodjEpOworICAgICAgICAgICAgICAg
IFBVU0hfRVZBTFVBVEUoYmluYXJ5TG9naWNhbE5vZGUtPmV4cHIyLmdldCgpKTsKKyAgICAgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAg
Y2FzZSBDb25kaXRpb25hbE5vZGVFdmFsdWF0ZVN0YXRlOgorICAgICAgICAgICAgeworICAgICAg
ICAgICAgICAgIEVWQUxVQVRFX0FORF9DT05USU5VRShzdGF0aWNfY2FzdDxDb25kaXRpb25hbE5v
ZGUqPihjdXJyZW50Tm9kZSktPmxvZ2ljYWwuZ2V0KCksIENvbmRpdGlvbmFsTm9kZUV2YWx1YXRl
U3RhdGUxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgQ29uZGl0aW9uYWxOb2Rl
RXZhbHVhdGVTdGF0ZTE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSlNWYWx1ZSAq
diA9IEdFVF9WQUxVRV9SRVRVUk4oKTsKKyAgICAgICAgICAgICAgICBDb25kaXRpb25hbE5vZGUq
IGNvbmRpdGlvbmFsTm9kZSA9IHN0YXRpY19jYXN0PENvbmRpdGlvbmFsTm9kZSo+KGN1cnJlbnRO
b2RlKTsKKyAgICAgICAgICAgICAgICBSZWZQdHI8Tm9kZT4gbm9kZSA9IHYtPnRvQm9vbGVhbihl
eGVjKSA/IGNvbmRpdGlvbmFsTm9kZS0+ZXhwcjEgOiBjb25kaXRpb25hbE5vZGUtPmV4cHIyOwor
ICAgICAgICAgICAgICAgIFBVU0hfRVZBTFVBVEUobm9kZS5nZXQoKSk7CisgICAgICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhc2Ug
QXNzaWduUmVzb2x2ZU5vZGVFdmFsdWF0ZVN0YXRlOgorICAgICAgICAgICAgeworICAgICAgICAg
ICAgICAgIEFzc2lnblJlc29sdmVOb2RlICphc3NpZ25SZXNvbHZlTm9kZSA9IHN0YXRpY19jYXN0
PEFzc2lnblJlc29sdmVOb2RlKj4oY3VycmVudE5vZGUpOworICAgICAgICAgICAgICAgIGNvbnN0
IFNjb3BlQ2hhaW4mIGNoYWluID0gZXhlYy0+Y29udGV4dCgpLmltcCgpLT5zY29wZUNoYWluKCk7
CisgICAgICAgICAgICAgICAgU2NvcGVDaGFpbkl0ZXJhdG9yIGl0ZXIgPSBjaGFpbi5iZWdpbigp
OworICAgICAgICAgICAgICAgIFNjb3BlQ2hhaW5JdGVyYXRvciBlbmQgPSBjaGFpbi5lbmQoKTsK
KyAgICAgICAgICAgICAgICBPcGVyYXRvciBvcGVyID0gYXNzaWduUmVzb2x2ZU5vZGUtPm1fb3Bl
cjsKKyAgICAgICAgICAgICAgICBjb25zdCBJZGVudGlmaWVyJiBpZGVudCA9IGFzc2lnblJlc29s
dmVOb2RlLT5tX2lkZW50OworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIHdl
IG11c3QgYWx3YXlzIGhhdmUgc29tZXRoaW5nIGluIHRoZSBzY29wZSBjaGFpbgorICAgICAgICAg
ICAgICAgIGFzc2VydChpdGVyICE9IGVuZCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAg
ICAgICAgUHJvcGVydHlTbG90IHNsb3Q7CisgICAgICAgICAgICAgICAgSlNPYmplY3QgKmJhc2U7
CisgICAgICAgICAgICAgICAgYm9vbCBmb3VuZFNsb3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAg
ICBkbyB7IAorICAgICAgICAgICAgICAgICAgICBiYXNlID0gKml0ZXI7CisgICAgICAgICAgICAg
ICAgICAgIGlmIChiYXNlLT5nZXRQcm9wZXJ0eVNsb3QoZXhlYywgaWRlbnQsIHNsb3QpKSB7Cisg
ICAgICAgICAgICAgICAgICAgICAgICBmb3VuZFNsb3QgPSB0cnVlOworICAgICAgICAgICAgICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAg
ICAgCisgICAgICAgICAgICAgICAgICAgICsraXRlcjsKKyAgICAgICAgICAgICAgICB9IHdoaWxl
IChpdGVyICE9IGVuZCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKCFm
b3VuZFNsb3QgJiYgKG9wZXIgIT0gT3BFcXVhbCkpCisgICAgICAgICAgICAgICAgICAgIFJFVFVS
Tl9FUlJPUihhc3NpZ25SZXNvbHZlTm9kZS0+dGhyb3dVbmRlZmluZWRWYXJpYWJsZUVycm9yKGV4
ZWMsIGlkZW50KSk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgUFVTSF9MT0NB
TF9WQUxVRShiYXNlKTsKKyAgICAgICAgICAgICAgICBFVkFMVUFURV9BTkRfQ09OVElOVUUoYXNz
aWduUmVzb2x2ZU5vZGUtPm1fcmlnaHQuZ2V0KCksIEFzc2lnblJlc29sdmVOb2RlRXZhbHVhdGVT
dGF0ZTEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBBc3NpZ25SZXNvbHZlTm9k
ZUV2YWx1YXRlU3RhdGUxOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFzc2lnblJl
c29sdmVOb2RlICphc3NpZ25SZXNvbHZlTm9kZSA9IHN0YXRpY19jYXN0PEFzc2lnblJlc29sdmVO
b2RlKj4oY3VycmVudE5vZGUpOworICAgICAgICAgICAgICAgIE9wZXJhdG9yIG9wZXIgPSBhc3Np
Z25SZXNvbHZlTm9kZS0+bV9vcGVyOworICAgICAgICAgICAgICAgIGNvbnN0IElkZW50aWZpZXIm
IGlkZW50ID0gYXNzaWduUmVzb2x2ZU5vZGUtPm1faWRlbnQ7CisgICAgICAgICAgICAgICAgSlNW
YWx1ZSogdiA9IEdFVF9WQUxVRV9SRVRVUk4oKTsKKyAgICAgICAgICAgICAgICBKU09iamVjdCog
YmFzZSA9IHN0YXRpY19jYXN0PEpTT2JqZWN0Kj4oUE9QX0xPQ0FMX1ZBTFVFKCkpOworICAgICAg
ICAgICAgICAgIC8vIEZJWE1FOiBXZSBjb3VsZCBhdm9pZCB0aGlzIHNsb3QgZG91YmxlLWxvb2t1
cCBieSBoYXZpbmcgYSBzbG90IHN0YWNrLgorICAgICAgICAgICAgICAgIFByb3BlcnR5U2xvdCBz
bG90OworICAgICAgICAgICAgICAgIGJhc2UtPmdldFByb3BlcnR5U2xvdChleGVjLCBpZGVudCwg
c2xvdCk7CisgICAgICAgICAgICAgICAgaWYgKG9wZXIgIT0gT3BFcXVhbCkgeworICAgICAgICAg
ICAgICAgICAgICBKU1ZhbHVlKiB2MSA9IHNsb3QuZ2V0VmFsdWUoZXhlYywgYmFzZSwgaWRlbnQp
OworICAgICAgICAgICAgICAgICAgICBLSlNfQ0hFQ0tFWENFUFRJT04oKTsKKyAgICAgICAgICAg
ICAgICAgICAgdiA9IHZhbHVlRm9yUmVhZE1vZGlmeUFzc2lnbm1lbnQoZXhlYywgdjEsIHYsIG9w
ZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBLSlNfQ0hFQ0tFWENFUFRJ
T04oKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBiYXNlLT5wdXQoZXhlYywg
aWRlbnQsIHYpOworICAgICAgICAgICAgICAgIFJFVFVSTl9WQUxVRSh2KTsKKyAgICAgICAgICAg
IH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgCisgICAgICAgICAgICBjYXNlIEFzc2lnbkRv
dE5vZGVFdmFsdWF0ZVN0YXRlOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEVWQUxV
QVRFX0FORF9DT05USU5VRShzdGF0aWNfY2FzdDxBc3NpZ25Eb3ROb2RlKj4oY3VycmVudE5vZGUp
LT5tX2Jhc2UuZ2V0KCksIEFzc2lnbkRvdE5vZGVFdmFsdWF0ZVN0YXRlMSk7CisgICAgICAgICAg
ICB9CisgICAgICAgICAgICBjYXNlIEFzc2lnbkRvdE5vZGVFdmFsdWF0ZVN0YXRlMToKKyAgICAg
ICAgICAgIHsKKyAgICAgICAgICAgICAgICBQVVNIX0xPQ0FMX1ZBTFVFKEdFVF9WQUxVRV9SRVRV
Uk4oKSk7CisgICAgICAgICAgICAgICAgQXNzaWduRG90Tm9kZSogYXNzaWduRG90Tm9kZSA9IHN0
YXRpY19jYXN0PEFzc2lnbkRvdE5vZGUqPihjdXJyZW50Tm9kZSk7CisgICAgICAgICAgICAgICAg
aWYgKGFzc2lnbkRvdE5vZGUtPm1fb3BlciA9PSBPcEVxdWFsKQorICAgICAgICAgICAgICAgICAg
ICBFVkFMVUFURV9BTkRfSlVNUChhc3NpZ25Eb3ROb2RlLT5tX3JpZ2h0LmdldCgpLCBBc3NpZ25E
b3ROb2RlRXZhbHVhdGVTdGF0ZTMpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAg
ICAgICAgICAgRVZBTFVBVEVfQU5EX0NPTlRJTlVFKGFzc2lnbkRvdE5vZGUtPm1fcmlnaHQuZ2V0
KCksIEFzc2lnbkRvdE5vZGVFdmFsdWF0ZVN0YXRlMik7CisgICAgICAgICAgICB9CisgICAgICAg
ICAgICBjYXNlIEFzc2lnbkRvdE5vZGVFdmFsdWF0ZVN0YXRlMjoKKyAgICAgICAgICAgIHsKKyAg
ICAgICAgICAgICAgICBBc3NpZ25Eb3ROb2RlKiBhc3NpZ25Eb3ROb2RlID0gc3RhdGljX2Nhc3Q8
QXNzaWduRG90Tm9kZSo+KGN1cnJlbnROb2RlKTsKKyAgICAgICAgICAgICAgICBKU1ZhbHVlKiB2
MiA9IEdFVF9WQUxVRV9SRVRVUk4oKTsKKyAgICAgICAgICAgICAgICBKU09iamVjdCogYmFzZSA9
IFBFRUtfTE9DQUxfVkFMVUUoKS0+dG9PYmplY3QoZXhlYyk7CisgICAgICAgICAgICAgICAgS0pT
X0NIRUNLRVhDRVBUSU9OKCk7CisgICAgICAgICAgICAgICAgUHJvcGVydHlTbG90IHNsb3Q7Cisg
ICAgICAgICAgICAgICAgSlNWYWx1ZSAqdjEgPSBiYXNlLT5nZXRQcm9wZXJ0eVNsb3QoZXhlYywg
YXNzaWduRG90Tm9kZS0+bV9pZGVudCwgc2xvdCkgPyBzbG90LmdldFZhbHVlKGV4ZWMsIGJhc2Us
IGFzc2lnbkRvdE5vZGUtPm1faWRlbnQpIDoganNVbmRlZmluZWQoKTsKKyAgICAgICAgICAgICAg
ICBLSlNfQ0hFQ0tFWENFUFRJT04oKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAg
ICBTRVRfVkFMVUVfUkVUVVJOKHZhbHVlRm9yUmVhZE1vZGlmeUFzc2lnbm1lbnQoZXhlYywgdjEs
IHYyLCBhc3NpZ25Eb3ROb2RlLT5tX29wZXIpKTsKKyAgICAgICAgICAgICAgICBGQUxMX1RIUk9V
R0goKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgQXNzaWduRG90Tm9kZUV2YWx1
YXRlU3RhdGUzOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFzc2lnbkRvdE5vZGUq
IGFzc2lnbkRvdE5vZGUgPSBzdGF0aWNfY2FzdDxBc3NpZ25Eb3ROb2RlKj4oY3VycmVudE5vZGUp
OworICAgICAgICAgICAgICAgIEpTVmFsdWUqIHYgPSBHRVRfVkFMVUVfUkVUVVJOKCk7CisgICAg
ICAgICAgICAgICAgSlNPYmplY3QqIGJhc2UgPSBQT1BfTE9DQUxfVkFMVUUoKS0+dG9PYmplY3Qo
ZXhlYyk7CisgICAgICAgICAgICAgICAgS0pTX0NIRUNLRVhDRVBUSU9OKCk7CisgICAgICAgICAg
ICAgICAgYmFzZS0+cHV0KGV4ZWMsIGFzc2lnbkRvdE5vZGUtPm1faWRlbnQsIHYpOworICAgICAg
ICAgICAgICAgIFJFVFVSTl9WQUxVRSh2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAg
ICAKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FzZSBBc3NpZ25CcmFja2V0Tm9kZUV2YWx1
YXRlU3RhdGU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRVZBTFVBVEVfQU5EX0NP
TlRJTlVFKHN0YXRpY19jYXN0PEFzc2lnbkJyYWNrZXROb2RlKj4oY3VycmVudE5vZGUpLT5tX2Jh
c2UuZ2V0KCksIEFzc2lnbkJyYWNrZXROb2RlRXZhbHVhdGVTdGF0ZTEpOworICAgICAgICAgICAg
fQorICAgICAgICAgICAgY2FzZSBBc3NpZ25CcmFja2V0Tm9kZUV2YWx1YXRlU3RhdGUxOgorICAg
ICAgICAgICAgeworICAgICAgICAgICAgICAgIFBVU0hfTE9DQUxfVkFMVUUoR0VUX1ZBTFVFX1JF
VFVSTigpKTsKKyAgICAgICAgICAgICAgICBFVkFMVUFURV9BTkRfQ09OVElOVUUoc3RhdGljX2Nh
c3Q8QXNzaWduQnJhY2tldE5vZGUqPihjdXJyZW50Tm9kZSktPm1fc3Vic2NyaXB0LmdldCgpLCBB
c3NpZ25CcmFja2V0Tm9kZUV2YWx1YXRlU3RhdGUyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIGNhc2UgQXNzaWduQnJhY2tldE5vZGVFdmFsdWF0ZVN0YXRlMjoKKyAgICAgICAgICAgIHsK
KyAgICAgICAgICAgICAgICBQVVNIX0xPQ0FMX1ZBTFVFKEdFVF9WQUxVRV9SRVRVUk4oKSk7Cisg
ICAgICAgICAgICAgICAgRVZBTFVBVEVfQU5EX0NPTlRJTlVFKHN0YXRpY19jYXN0PEFzc2lnbkJy
YWNrZXROb2RlKj4oY3VycmVudE5vZGUpLT5tX3JpZ2h0LmdldCgpLCBBc3NpZ25CcmFja2V0Tm9k
ZUV2YWx1YXRlU3RhdGUzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgQXNzaWdu
QnJhY2tldE5vZGVFdmFsdWF0ZVN0YXRlMzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAg
ICBBc3NpZ25CcmFja2V0Tm9kZSogYXNzaWduQnJhY2tldE5vZGUgPSBzdGF0aWNfY2FzdDxBc3Np
Z25CcmFja2V0Tm9kZSo+KGN1cnJlbnROb2RlKTsKKyAgICAgICAgICAgICAgICBKU1ZhbHVlKiB2
ID0gR0VUX1ZBTFVFX1JFVFVSTigpOworICAgICAgICAgICAgICAgIEpTVmFsdWUqIHN1YnNjcmlw
dCA9IFBPUF9MT0NBTF9WQUxVRSgpOyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIEpTT2Jq
ZWN0KiBiYXNlID0gUE9QX0xPQ0FMX1ZBTFVFKCktPnRvT2JqZWN0KGV4ZWMpOworICAgICAgICAg
ICAgICAgIEtKU19DSEVDS0VYQ0VQVElPTigpOworICAgICAgICAgICAgICAgIE9wZXJhdG9yIG9w
ZXIgPSBhc3NpZ25CcmFja2V0Tm9kZS0+bV9vcGVyOworICAgICAgICAgICAgICAgIAorICAgICAg
ICAgICAgICAgIHVpbnQzMl90IHByb3BlcnR5SW5kZXg7CisgICAgICAgICAgICAgICAgaWYgKHN1
YnNjcmlwdC0+Z2V0VUludDMyKHByb3BlcnR5SW5kZXgpKSB7CisgICAgICAgICAgICAgICAgICAg
IGlmIChvcGVyICE9IE9wRXF1YWwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5
U2xvdCBzbG90OworICAgICAgICAgICAgICAgICAgICAgICAgSlNWYWx1ZSAqdjEgPSBiYXNlLT5n
ZXRQcm9wZXJ0eVNsb3QoZXhlYywgcHJvcGVydHlJbmRleCwgc2xvdCkgPyBzbG90LmdldFZhbHVl
KGV4ZWMsIGJhc2UsIHByb3BlcnR5SW5kZXgpIDoganNVbmRlZmluZWQoKTsKKyAgICAgICAgICAg
ICAgICAgICAgICAgIEtKU19DSEVDS0VYQ0VQVElPTigpOworICAgICAgICAgICAgICAgICAgICAg
ICAgdiA9IHZhbHVlRm9yUmVhZE1vZGlmeUFzc2lnbm1lbnQoZXhlYywgdjEsIHYsIG9wZXIpOwor
ICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIEtKU19DSEVDS0VYQ0VQ
VElPTigpOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgYmFzZS0+
cHV0KGV4ZWMsIHByb3BlcnR5SW5kZXgsIHYpOworICAgICAgICAgICAgICAgICAgICBSRVRVUk5f
VkFMVUUodik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAg
ICAgICAgIElkZW50aWZpZXIgcHJvcGVydHlOYW1lKHN1YnNjcmlwdC0+dG9TdHJpbmcoZXhlYykp
OworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIChvcGVyICE9IE9wRXF1YWwp
IHsKKyAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlTbG90IHNsb3Q7CisgICAgICAgICAgICAg
ICAgICAgIEpTVmFsdWUgKnYxID0gYmFzZS0+Z2V0UHJvcGVydHlTbG90KGV4ZWMsIHByb3BlcnR5
TmFtZSwgc2xvdCkgPyBzbG90LmdldFZhbHVlKGV4ZWMsIGJhc2UsIHByb3BlcnR5TmFtZSkgOiBq
c1VuZGVmaW5lZCgpOworICAgICAgICAgICAgICAgICAgICBLSlNfQ0hFQ0tFWENFUFRJT04oKTsK
KyAgICAgICAgICAgICAgICAgICAgdiA9IHZhbHVlRm9yUmVhZE1vZGlmeUFzc2lnbm1lbnQoZXhl
YywgdjEsIHYsIG9wZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBLSlNf
Q0hFQ0tFWENFUFRJT04oKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBiYXNl
LT5wdXQoZXhlYywgcHJvcGVydHlOYW1lLCB2KTsKKyAgICAgICAgICAgICAgICBSRVRVUk5fVkFM
VUUodik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBjYXNl
IENvbW1hTm9kZUV2YWx1YXRlU3RhdGU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAg
UFVTSF9FVkFMVUFURShzdGF0aWNfY2FzdDxDb21tYU5vZGUqPihjdXJyZW50Tm9kZSktPmV4cHIy
LmdldCgpKTsKKyAgICAgICAgICAgICAgICBQVVNIX0VWQUxVQVRFKHN0YXRpY19jYXN0PENvbW1h
Tm9kZSo+KGN1cnJlbnROb2RlKS0+ZXhwcjEuZ2V0KCkpOyAvLyBpZ25vcmUgdGhlIGZpcnN0IHJl
dHVybiB2YWx1ZQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAg
ICAgICAgCisgICAgICAgICAgICBjYXNlIEFzc2lnbkV4cHJOb2RlRXZhbHVhdGVTdGF0ZToKKyAg
ICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQVVNIX0VWQUxVQVRFKHN0YXRpY19jYXN0PEFz
c2lnbkV4cHJOb2RlKj4oY3VycmVudE5vZGUpLT5leHByLmdldCgpKTsKKyAgICAgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGNh
c2UgVmFyRGVjbE5vZGVFdmFsdWF0ZVN0YXRlOgorICAgICAgICAgICAgeworICAgICAgICAgICAg
ICAgIFZhckRlY2xOb2RlKiB2YXJEZWNsID0gc3RhdGljX2Nhc3Q8VmFyRGVjbE5vZGUqPihjdXJy
ZW50Tm9kZSk7CisgICAgICAgICAgICAgICAgSlNPYmplY3QqIHZhcmlhYmxlID0gZXhlYy0+Y29u
dGV4dCgpLmltcCgpLT52YXJpYWJsZU9iamVjdCgpOworCisgICAgICAgICAgICAgICAgaWYgKHZh
ckRlY2wtPmluaXQpCisgICAgICAgICAgICAgICAgICAgIEVWQUxVQVRFX0FORF9DT05USU5VRSh2
YXJEZWNsLT5pbml0LmdldCgpLCBWYXJEZWNsTm9kZUV2YWx1YXRlU3RhdGUxKTsKKyAgICAgICAg
ICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBkZWNsYXJlZD8g
LSBjaGVjayB3aXRoIGdldERpcmVjdCBzbyB5b3UgY2FuIG92ZXJyaWRlCisgICAgICAgICAgICAg
ICAgICAgIC8vIGJ1aWx0LWluIHByb3BlcnRpZXMgb2YgdGhlIGdsb2JhbCBvYmplY3Qgd2l0aCB2
YXIgZGVjbGFyYXRpb25zLgorICAgICAgICAgICAgICAgICAgICBpZiAodmFyaWFibGUtPmdldERp
cmVjdCh2YXJEZWNsLT5pZGVudCkpCisgICAgICAgICAgICAgICAgICAgICAgICBSRVRVUk5fVkFM
VUUoKEpTVmFsdWUqKTApOworICAgICAgICAgICAgICAgICAgICBTRVRfVkFMVUVfUkVUVVJOKGpz
VW5kZWZpbmVkKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBGQUxMX1RI
Uk9VR0goKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgVmFyRGVjbE5vZGVFdmFs
dWF0ZVN0YXRlMToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBWYXJEZWNsTm9kZSog
dmFyRGVjbCA9IHN0YXRpY19jYXN0PFZhckRlY2xOb2RlKj4oY3VycmVudE5vZGUpOworICAgICAg
ICAgICAgICAgIEpTVmFsdWUqIHZhbCA9IEdFVF9WQUxVRV9SRVRVUk4oKTsKKyAgICAgICAgICAg
ICAgICBKU09iamVjdCogdmFyaWFibGUgPSBleGVjLT5jb250ZXh0KCkuaW1wKCktPnZhcmlhYmxl
T2JqZWN0KCk7CisjaWZkZWYgS0pTX1ZFUkJPU0UKKyAgICAgICAgICAgICAgICBwcmludEluZm8o
ZXhlYywgKFVTdHJpbmcoIm5ldyB2YXJpYWJsZSAiKSArIGlkZW50LnVzdHJpbmcoKSkuY3N0cmlu
ZygpLmNfc3RyKCksIHZhbCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAvLyBXZSB1c2UgSW50
ZXJuYWwgdG8gYnlwYXNzIGFsbCBjaGVja3MgaW4gZGVyaXZlZCBvYmplY3RzLCBlLmcuIHNvIHRo
YXQKKyAgICAgICAgICAgICAgICAvLyAidmFyIGxvY2F0aW9uIiBjcmVhdGVzIGEgZHluYW1pYyBw
cm9wZXJ0eSBpbnN0ZWFkIG9mIGFjdGl2YXRpbmcgd2luZG93LmxvY2F0aW9uLgorICAgICAgICAg
ICAgICAgIGludCBmbGFncyA9IEludGVybmFsOworICAgICAgICAgICAgICAgIGlmIChleGVjLT5j
b250ZXh0KCkuaW1wKCktPmNvZGVUeXBlKCkgIT0gRXZhbENvZGUpCisgICAgICAgICAgICAgICAg
ICAgIGZsYWdzIHw9IERvbnREZWxldGU7CisgICAgICAgICAgICAgICAgaWYgKHZhckRlY2wtPnZh
clR5cGUgPT0gVmFyRGVjbE5vZGU6OkNvbnN0YW50KQorICAgICAgICAgICAgICAgICAgICBmbGFn
cyB8PSBSZWFkT25seTsKKyAgICAgICAgICAgICAgICB2YXJpYWJsZS0+cHV0KGV4ZWMsIHZhckRl
Y2wtPmlkZW50LCB2YWwsIGZsYWdzKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAg
ICBSRVRVUk5fVkFMVUUoanNTdHJpbmcodmFyRGVjbC0+aWRlbnQudXN0cmluZygpKSk7CisgICAg
ICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBjYXNlIFZhckRlY2xMaXN0
Tm9kZUV2YWx1YXRlU3RhdGU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gRklY
TUU6IFRoaXMgY291bGQgYmUgb3B0aW1pemVkIHRvIHB1c2ggdGhlc2UgYWxsIGF0IG9uY2UgYW5k
IHJldHVybiAob25jZSB3ZSByZXZlcnNlIHRoZSBsaXN0KS4KKyAgICAgICAgICAgICAgICBFVkFM
VUFURV9BTkRfQ09OVElOVUUoc3RhdGljX2Nhc3Q8VmFyRGVjbExpc3ROb2RlKj4oY3VycmVudE5v
ZGUpLT52YXIuZ2V0KCksIFZhckRlY2xMaXN0Tm9kZUV2YWx1YXRlU3RhdGUxKTsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgIGNhc2UgVmFyRGVjbExpc3ROb2RlRXZhbHVhdGVTdGF0ZTE6Cisg
ICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVmFyRGVjbExpc3ROb2RlKiBuID0gc3RhdGlj
X2Nhc3Q8VmFyRGVjbExpc3ROb2RlKj4oY3VycmVudE5vZGUpOworICAgICAgICAgICAgICAgIG4g
PSBuLT5uZXh0LmdldCgpOworICAgICAgICAgICAgICAgIGlmIChuKSB7CisgICAgICAgICAgICAg
ICAgICAgIC8vIEZJWE1FOiBwdXNoaW5nICJwIiBhcyB0aGUgY3VycmVudCBub2RlIGlzIGRhbmdl
cm91cworICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIGZ1bmN0aW9uIGhhZCB0byBjb250
aW51ZSBhZnRlciB0aGlzIGxvb3AsIGN1cnJlbnROb2RlIHdvdWxkIGJlIHRoZSB3cm9uZyBub2Rl
LgorICAgICAgICAgICAgICAgICAgICBTRVRfSlVNUF9TVEFURShWYXJEZWNsTGlzdE5vZGVFdmFs
dWF0ZVN0YXRlLCBuKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAg
ICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIFJFVFVSTl9WQUxVRShqc1Vu
ZGVmaW5lZCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAg
IGNhc2UgQ2FzZUNsYXVzZU5vZGVFdmFsdWF0ZVN0YXRlOgorICAgICAgICAgICAgeworICAgICAg
ICAgICAgICAgIFBVU0hfRVZBTFVBVEUoc3RhdGljX2Nhc3Q8Q2FzZUNsYXVzZU5vZGUqPihjdXJy
ZW50Tm9kZSktPmV4cHIuZ2V0KCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAg
ICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgY2FzZSBGdW5jRXhwck5vZGVFdmFs
dWF0ZVN0YXRlOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZ1bmNFeHByTm9kZSog
ZnVuY0V4cHJOb2RlID0gc3RhdGljX2Nhc3Q8RnVuY0V4cHJOb2RlKj4oY3VycmVudE5vZGUpOwor
ICAgICAgICAgICAgICAgIENvbnRleHRJbXAgKmNvbnRleHQgPSBleGVjLT5jb250ZXh0KCkuaW1w
KCk7CisgICAgICAgICAgICAgICAgYm9vbCBuYW1lZCA9ICFmdW5jRXhwck5vZGUtPmlkZW50Lmlz
TnVsbCgpOworICAgICAgICAgICAgICAgIEpTT2JqZWN0ICpmdW5jdGlvblNjb3BlT2JqZWN0ID0g
MDsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAobmFtZWQpIHsKKyAgICAg
ICAgICAgICAgICAgICAgLy8gbmFtZWQgRnVuY3Rpb25FeHByZXNzaW9ucyBjYW4gcmVjdXJzaXZl
bHkgY2FsbCB0aGVtc2VsdmVzLAorICAgICAgICAgICAgICAgICAgICAvLyBidXQgdGhleSB3b24n
dCByZWdpc3RlciB3aXRoIHRoZSBjdXJyZW50IHNjb3BlIGNoYWluIGFuZCBzaG91bGQKKyAgICAg
ICAgICAgICAgICAgICAgLy8gYmUgY29udGFpbmVkIGFzIHNpbmdsZSBwcm9wZXJ0eSBpbiBhbiBh
bm9ueW1vdXMgb2JqZWN0LgorICAgICAgICAgICAgICAgICAgICBmdW5jdGlvblNjb3BlT2JqZWN0
ID0gbmV3IEpTT2JqZWN0OworICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5wdXNoU2NvcGUo
ZnVuY3Rpb25TY29wZU9iamVjdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAg
IAorICAgICAgICAgICAgICAgIEZ1bmN0aW9uSW1wKiBmdW5jID0gbmV3IERlY2xhcmVkRnVuY3Rp
b25JbXAoZXhlYywgZnVuY0V4cHJOb2RlLT5pZGVudCwgZnVuY0V4cHJOb2RlLT5ib2R5LmdldCgp
LCBjb250ZXh0LT5zY29wZUNoYWluKCkpOworICAgICAgICAgICAgICAgIEpTT2JqZWN0KiBwcm90
byA9IGV4ZWMtPmxleGljYWxJbnRlcnByZXRlcigpLT5idWlsdGluT2JqZWN0KCktPmNvbnN0cnVj
dChleGVjLCBMaXN0OjplbXB0eSgpKTsKKyAgICAgICAgICAgICAgICBwcm90by0+cHV0KGV4ZWMs
IGNvbnN0cnVjdG9yUHJvcGVydHlOYW1lLCBmdW5jLCBSZWFkT25seXxEb250RGVsZXRlfERvbnRF
bnVtKTsKKyAgICAgICAgICAgICAgICBmdW5jLT5wdXQoZXhlYywgcHJvdG90eXBlUHJvcGVydHlO
YW1lLCBwcm90bywgSW50ZXJuYWx8RG9udERlbGV0ZSk7CisgICAgICAgICAgICAgICAgCisgICAg
ICAgICAgICAgICAgaW50IHBsZW4gPSAwOworICAgICAgICAgICAgICAgIGZvciAoUGFyYW1ldGVy
Tm9kZSAqcCA9IGZ1bmNFeHByTm9kZS0+cGFyYW0uZ2V0KCk7IHAgIT0gMEw7IHAgPSBwLT5uZXh0
UGFyYW0oKSwgcGxlbisrKQorICAgICAgICAgICAgICAgICAgICBmdW5jLT5hZGRQYXJhbWV0ZXIo
cC0+aWRlbnQoKSk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKG5hbWVk
KSB7CisgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uU2NvcGVPYmplY3QtPnB1dChleGVjLCBm
dW5jRXhwck5vZGUtPmlkZW50LCBmdW5jLCBJbnRlcm5hbCB8IFJlYWRPbmx5IHwgKGNvbnRleHQt
PmNvZGVUeXBlKCkgPT0gRXZhbENvZGUgPyAwIDogRG9udERlbGV0ZSkpOworICAgICAgICAgICAg
ICAgICAgICBjb250ZXh0LT5wb3BTY29wZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgICAgICAKKyAgICAgICAgICAgICAgICBSRVRVUk5fVkFMVUUoZnVuYyk7CisgICAgICAgICAg
ICB9CisgICAgICAgICAgICBjYXNlIEFyZ3VtZW50TGlzdE5vZGVFdmFsdWF0ZUxpc3RTdGF0ZToK
KyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQVVNIX0xJU1QoTGlzdCgpKTsKKyAgICAg
ICAgICAgICAgICBGQUxMX1RIUk9VR0goKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNh
c2UgQXJndW1lbnRMaXN0Tm9kZUV2YWx1YXRlTGlzdFN0YXRlMToKKyAgICAgICAgICAgIHsKKyAg
ICAgICAgICAgICAgICBFVkFMVUFURV9BTkRfQ09OVElOVUUoc3RhdGljX2Nhc3Q8QXJndW1lbnRM
aXN0Tm9kZSo+KGN1cnJlbnROb2RlKS0+ZXhwci5nZXQoKSwgQXJndW1lbnRMaXN0Tm9kZUV2YWx1
YXRlTGlzdFN0YXRlMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEFyZ3VtZW50
TGlzdE5vZGVFdmFsdWF0ZUxpc3RTdGF0ZTI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAg
ICAgQXJndW1lbnRMaXN0Tm9kZSogbiA9IHN0YXRpY19jYXN0PEFyZ3VtZW50TGlzdE5vZGUqPihj
dXJyZW50Tm9kZSk7CisgICAgICAgICAgICAgICAgSlNWYWx1ZSogdiA9IEdFVF9WQUxVRV9SRVRV
Uk4oKTsKKyAgICAgICAgICAgICAgICBMaXN0JiBsID0gUEVFS19MSVNUKCk7CisgICAgICAgICAg
ICAgICAgbC5hcHBlbmQodik7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgbiA9
IG4tPm5leHQuZ2V0KCk7CisgICAgICAgICAgICAgICAgaWYgKG4pIHsKKyAgICAgICAgICAgICAg
ICAgICAgU0VUX0pVTVBfU1RBVEUoQXJndW1lbnRMaXN0Tm9kZUV2YWx1YXRlTGlzdFN0YXRlMSwg
bik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIE5vIHJldHVybiwgbGlz
dCBhbHJlYWR5IHB1c2hlZCBpbiBBcmd1bWVudExpc3ROb2RlRXZhbHVhdGVMaXN0U3RhdGUKKyAg
ICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgQXJn
dW1lbnRzTm9kZUV2YWx1YXRlTGlzdFN0YXRlOgorICAgICAgICAgICAgeworICAgICAgICAgICAg
ICAgIEFyZ3VtZW50c05vZGUqIGFyZ3VtZW50c05vZGUgPSBzdGF0aWNfY2FzdDxBcmd1bWVudHNO
b2RlKj4oY3VycmVudE5vZGUpOworICAgICAgICAgICAgICAgIGlmIChhcmd1bWVudHNOb2RlLT5s
aXN0KQorICAgICAgICAgICAgICAgICAgICBQVVNIX0VWQUxVQVRFX0xJU1QoYXJndW1lbnRzTm9k
ZS0+bGlzdC5nZXQoKSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAg
ICBSRVRVUk5fTElTVChMaXN0KCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAg
ICAgfQorICAgICAgICAKKyAgICAgICAgICAgIGNhc2UgU3RhdExpc3ROb2RlRXhlY3V0ZVN0YXRl
OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEVYRUNVVEVfQU5EX0NPTlRJTlVFKHN0
YXRpY19jYXN0PFN0YXRMaXN0Tm9kZSo+KGN1cnJlbnROb2RlKS0+c3RhdGVtZW50LmdldCgpLCBT
dGF0TGlzdE5vZGVFeGVjdXRlU3RhdGUxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNh
c2UgU3RhdExpc3ROb2RlRXhlY3V0ZVN0YXRlMToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAg
ICAgICBTdGF0TGlzdE5vZGUqIG4gPSBzdGF0aWNfY2FzdDxTdGF0TGlzdE5vZGUqPihjdXJyZW50
Tm9kZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBp
ZiAoKG4gPSBuLT5uZXh0LmdldCgpKSkgeworICAgICAgICAgICAgICAgICAgICBTRVRfSlVNUF9T
VEFURShTdGF0TGlzdE5vZGVFeGVjdXRlU3RhdGUsIG4pOworICAgICAgICAgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgUkVUVVJOX05PUk1BTF9D
T01QTEVUSU9OKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgVmFyU3RhdGVt
ZW50Tm9kZUV4ZWN1dGVTdGF0ZToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQVVNI
X0VWQUxVQVRFKHN0YXRpY19jYXN0PFZhclN0YXRlbWVudE5vZGUqPihjdXJyZW50Tm9kZSktPm5l
eHQuZ2V0KCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAg
ICAgICAgICBjYXNlIEJsb2NrTm9kZUV4ZWN1dGVTdGF0ZToKKyAgICAgICAgICAgIHsKKyAgICAg
ICAgICAgICAgICBCbG9ja05vZGUqIGJsb2NrTm9kZSA9IHN0YXRpY19jYXN0PEJsb2NrTm9kZSo+
KGN1cnJlbnROb2RlKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJsb2NrTm9kZS0+c291cmNlKQor
ICAgICAgICAgICAgICAgICAgICBSRVRVUk5fTk9STUFMX0NPTVBMRVRJT04oKTsKKyAgICAgICAg
ICAgICAgICAKKyAgICAgICAgICAgICAgICBibG9ja05vZGUtPnNvdXJjZS0+cHJvY2Vzc0Z1bmNE
ZWNsKGV4ZWMpOworICAgICAgICAgICAgICAgIFBVU0hfRVhFQ1VURShibG9ja05vZGUtPnNvdXJj
ZS5nZXQoKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAg
ICAgICAgIGNhc2UgRW1wdHlTdGF0ZW1lbnROb2RlRXhlY3V0ZVN0YXRlOgorICAgICAgICAgICAg
eworICAgICAgICAgICAgICAgIFJFVFVSTl9OT1JNQUxfQ09NUExFVElPTigpOworICAgICAgICAg
ICAgfQorCisgICAgICAgICAgICBjYXNlIEV4cHJTdGF0ZW1lbnROb2RlRXhlY3V0ZVN0YXRlOgor
ICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBFVkFMVUFURV9B
TkRfQ09OVElOVUUoc3RhdGljX2Nhc3Q8RXhwclN0YXRlbWVudE5vZGUqPihjdXJyZW50Tm9kZSkt
PmV4cHIuZ2V0KCksIEV4cHJTdGF0ZW1lbnROb2RlRXhlY3V0ZVN0YXRlMSk7CisgICAgICAgICAg
ICB9CisgICAgICAgICAgICBjYXNlIEV4cHJTdGF0ZW1lbnROb2RlRXhlY3V0ZVN0YXRlMToKKyAg
ICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBSRVRVUk5fQ09NUExFVElPTihDb21wbGV0aW9u
KE5vcm1hbCwgR0VUX1ZBTFVFX1JFVFVSTigpKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAg
ICAgIGNhc2UgSWZOb2RlRXhlY3V0ZVN0YXRlOgorICAgICAgICAgICAgeyAgICAgICAgICAgICAg
ICAKKyAgICAgICAgICAgICAgICBFVkFMVUFURV9BTkRfQ09OVElOVUUoc3RhdGljX2Nhc3Q8SWZO
b2RlKj4oY3VycmVudE5vZGUpLT5leHByLmdldCgpLCBJZk5vZGVFeGVjdXRlU3RhdGUxKTsKKyAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgSWZOb2RlRXhlY3V0ZVN0YXRlMToKKyAgICAg
ICAgICAgIHsKKyAgICAgICAgICAgICAgICBJZk5vZGUqIGlmTm9kZSA9IHN0YXRpY19jYXN0PElm
Tm9kZSo+KGN1cnJlbnROb2RlKTsKKyAgICAgICAgICAgICAgICBpZiAoR0VUX1ZBTFVFX1JFVFVS
TigpLT50b0Jvb2xlYW4oZXhlYykpIHsKKyAgICAgICAgICAgICAgICAgICAgUFVTSF9FWEVDVVRF
KGlmTm9kZS0+c3RhdGVtZW50MS5nZXQoKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBu
byBlbHNlCisgICAgICAgICAgICAgICAgaWYgKCFpZk5vZGUtPnN0YXRlbWVudDIpCisgICAgICAg
ICAgICAgICAgICAgIFJFVFVSTl9OT1JNQUxfQ09NUExFVElPTigpOworICAgICAgICAgICAgICAg
IAorICAgICAgICAgICAgICAgIFBVU0hfRVhFQ1VURShpZk5vZGUtPnN0YXRlbWVudDIuZ2V0KCkp
OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAg
IGNhc2UgRG9XaGlsZU5vZGVFeGVjdXRlU3RhdGU6CisgICAgICAgICAgICB7CisgICAgICAgICAg
ICAgICAgUFVTSF9VTldJTkRfQkFSUklFUihCcmVhaywgRG9XaGlsZU5vZGVFeGVjdXRlRW5kU3Rh
dGUpOworICAgICAgICAgICAgICAgIFBVU0hfVU5XSU5EX0JBUlJJRVIoQ29udGludWUsIERvV2hp
bGVOb2RlRXhlY3V0ZUNvbnRpbnVlU3RhdGUpOworICAgICAgICAgICAgICAgIFNFVF9WQUxVRV9S
RVRVUk4oanNCb29sZWFuKHRydWUpKTsKKyAgICAgICAgICAgICAgICBTRVRfSlVNUF9TVEFURShE
b1doaWxlTm9kZUV4ZWN1dGVCb2R5U3RhdGUsIGN1cnJlbnROb2RlKTsKKyAgICAgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgRG9XaGlsZU5vZGVFeGVj
dXRlQ29udGludWVTdGF0ZToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBU1NFUlQo
R0VUX0xBU1RfQ09NUExFVElPTigpLmNvbXBsVHlwZSgpID09IENvbnRpbnVlKTsKKyAgICAgICAg
ICAgICAgICBSRVNFVF9DT01QTEVUSU9OX1RPX05PUk1BTCgpOworICAgICAgICAgICAgICAgIEZB
TExfVEhST1VHSCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBEb1doaWxlTm9k
ZUV4ZWN1dGVUZXN0U3RhdGU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRVZBTFVB
VEVfQU5EX0NPTlRJTlVFKHN0YXRpY19jYXN0PERvV2hpbGVOb2RlKj4oY3VycmVudE5vZGUpLT5l
eHByLmdldCgpLCBEb1doaWxlTm9kZUV4ZWN1dGVCb2R5U3RhdGUpOworICAgICAgICAgICAgfQor
ICAgICAgICAgICAgY2FzZSBEb1doaWxlTm9kZUV4ZWN1dGVCb2R5U3RhdGU6CisgICAgICAgICAg
ICB7CisgICAgICAgICAgICAgICAgaWYgKEdFVF9WQUxVRV9SRVRVUk4oKS0+dG9Cb29sZWFuKGV4
ZWMpKQorICAgICAgICAgICAgICAgICAgICBFWEVDVVRFX0FORF9KVU1QKHN0YXRpY19jYXN0PERv
V2hpbGVOb2RlKj4oY3VycmVudE5vZGUpLT5zdGF0ZW1lbnQuZ2V0KCksIERvV2hpbGVOb2RlRXhl
Y3V0ZVRlc3RTdGF0ZSk7CisKKyAgICAgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2ggaWYgdGhl
IHRlc3QgcmV0dXJucyBmYWxzZQorICAgICAgICAgICAgICAgIFBPUF9VTldJTkRfQkFSUklFUihD
b250aW51ZSk7CisgICAgICAgICAgICAgICAgRkFMTF9USFJPVUdIKCk7CisgICAgICAgICAgICB9
CisgICAgICAgICAgICBjYXNlIERvV2hpbGVOb2RlRXhlY3V0ZUVuZFN0YXRlOgorICAgICAgICAg
ICAgeworICAgICAgICAgICAgICAgIFBPUF9VTldJTkRfQkFSUklFUihCcmVhayk7CisgICAgICAg
ICAgICAgICAgCisgICAgICAgICAgICAgICAgQ29tcGxUeXBlIGNvbXBsVHlwZSA9IEdFVF9MQVNU
X0NPTVBMRVRJT04oKS5jb21wbFR5cGUoKTsKKyAgICAgICAgICAgICAgICBpZiAoY29tcGxUeXBl
ICE9IE5vcm1hbCkgeworICAgICAgICAgICAgICAgICAgICBBU1NFUlQoY29tcGxUeXBlID09IEJy
ZWFrKTsKKyAgICAgICAgICAgICAgICAgICAgUkVTRVRfQ09NUExFVElPTl9UT19OT1JNQUwoKTsK
KyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9
CisgICAgICAgICAgICAKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FzZSBXaGlsZU5vZGVF
eGVjdXRlU3RhdGU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFVTSF9VTldJTkRf
QkFSUklFUihCcmVhaywgV2hpbGVOb2RlRXhlY3V0ZUVuZFN0YXRlKTsKKyAgICAgICAgICAgICAg
ICBQVVNIX1VOV0lORF9CQVJSSUVSKENvbnRpbnVlLCBXaGlsZU5vZGVFeGVjdXRlQ29udGludWVT
dGF0ZSk7CisgICAgICAgICAgICAgICAgRkFMTF9USFJPVUdIKCk7CisgICAgICAgICAgICB9Cisg
ICAgICAgICAgICBjYXNlIFdoaWxlTm9kZUV4ZWN1dGVDb250aW51ZVN0YXRlOgorICAgICAgICAg
ICAgeworICAgICAgICAgICAgICAgIEFTU0VSVChHRVRfTEFTVF9DT01QTEVUSU9OKCkuY29tcGxU
eXBlKCkgPT0gTm9ybWFsIHx8IEdFVF9MQVNUX0NPTVBMRVRJT04oKS5jb21wbFR5cGUoKSA9PSBD
b250aW51ZSk7CisgICAgICAgICAgICAgICAgUkVTRVRfQ09NUExFVElPTl9UT19OT1JNQUwoKTsK
KyAgICAgICAgICAgICAgICBGQUxMX1RIUk9VR0goKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIGNhc2UgV2hpbGVOb2RlRXhlY3V0ZVRlc3RTdGF0ZToKKyAgICAgICAgICAgIHsKKyAgICAg
ICAgICAgICAgICBFVkFMVUFURV9BTkRfQ09OVElOVUUoc3RhdGljX2Nhc3Q8V2hpbGVOb2RlKj4o
Y3VycmVudE5vZGUpLT5leHByLmdldCgpLCBXaGlsZU5vZGVFeGVjdXRlQm9keVN0YXRlKTsKKyAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgV2hpbGVOb2RlRXhlY3V0ZUJvZHlTdGF0ZToK
KyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoR0VUX1ZBTFVFX1JFVFVSTigpLT50
b0Jvb2xlYW4oZXhlYykpCisgICAgICAgICAgICAgICAgICAgIEVYRUNVVEVfQU5EX0pVTVAoc3Rh
dGljX2Nhc3Q8V2hpbGVOb2RlKj4oY3VycmVudE5vZGUpLT5zdGF0ZW1lbnQuZ2V0KCksIFdoaWxl
Tm9kZUV4ZWN1dGVUZXN0U3RhdGUpOworCisgICAgICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdo
IGlmIHRoZSB0ZXN0IHJldHVybnMgZmFsc2UKKyAgICAgICAgICAgICAgICBQT1BfVU5XSU5EX0JB
UlJJRVIoQ29udGludWUpOworICAgICAgICAgICAgICAgIEZBTExfVEhST1VHSCgpOworICAgICAg
ICAgICAgfQorICAgICAgICAgICAgY2FzZSBXaGlsZU5vZGVFeGVjdXRlRW5kU3RhdGU6CisgICAg
ICAgICAgICB7CisgICAgICAgICAgICAgICAgUE9QX1VOV0lORF9CQVJSSUVSKEJyZWFrKTsKKwor
ICAgICAgICAgICAgICAgIENvbXBsVHlwZSBjb21wbFR5cGUgPSBHRVRfTEFTVF9DT01QTEVUSU9O
KCkuY29tcGxUeXBlKCk7CisgICAgICAgICAgICAgICAgaWYgKGNvbXBsVHlwZSAhPSBOb3JtYWwp
IHsKKyAgICAgICAgICAgICAgICAgICAgQVNTRVJUKGNvbXBsVHlwZSA9PSBCcmVhayk7CisgICAg
ICAgICAgICAgICAgICAgIFJFU0VUX0NPTVBMRVRJT05fVE9fTk9STUFMKCk7CisgICAgICAgICAg
ICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgY2FzZSBGb3JOb2RlRXhlY3V0
ZVN0YXRlOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBVU0hfVU5XSU5EX0JBUlJJ
RVIoQnJlYWssIEZvck5vZGVFeGVjdXRlRW5kU3RhdGUpOworICAgICAgICAgICAgICAgIFBVU0hf
VU5XSU5EX0JBUlJJRVIoQ29udGludWUsIEZvck5vZGVFeGVjdXRlQ29udGludWVTdGF0ZSk7Cisg
ICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgRm9yTm9kZSogZm9yTm9kZSA9IHN0YXRp
Y19jYXN0PEZvck5vZGUqPihjdXJyZW50Tm9kZSk7CisgICAgICAgICAgICAgICAgaWYgKGZvck5v
ZGUtPmV4cHIxKQorICAgICAgICAgICAgICAgICAgICBFVkFMVUFURV9BTkRfQ09OVElOVUUoZm9y
Tm9kZS0+ZXhwcjEuZ2V0KCksIEZvck5vZGVFeGVjdXRlVGVzdFN0YXRlKTsKKworICAgICAgICAg
ICAgICAgIC8vIGZhbGwgdGhyb3VnaCBpZiB0aGVyZSdzIG5vIGluaXRpbGl6YXRpb24gc3RhdGVt
ZW50CisgICAgICAgICAgICAgICAgRkFMTF9USFJPVUdIKCk7CisgICAgICAgICAgICB9CisgICAg
ICAgICAgICBjYXNlIEZvck5vZGVFeGVjdXRlVGVzdFN0YXRlOgorICAgICAgICAgICAgeworICAg
ICAgICAgICAgICAgIEZvck5vZGUqIGZvck5vZGUgPSBzdGF0aWNfY2FzdDxGb3JOb2RlKj4oY3Vy
cmVudE5vZGUpOworICAgICAgICAgICAgICAgIGlmIChmb3JOb2RlLT5leHByMikKKyAgICAgICAg
ICAgICAgICAgICAgRVZBTFVBVEVfQU5EX0NPTlRJTlVFKGZvck5vZGUtPmV4cHIyLmdldCgpLCBG
b3JOb2RlRXhlY3V0ZUJvZHlTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAg
ICAgICAgIC8vIGZhbGwgdGhyb3VnaCBpZiB0aGVyZSdzIG5vIHRlc3Qgc3RhdGVtZW50CisgICAg
ICAgICAgICAgICAgRkFMTF9USFJPVUdIKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBj
YXNlIEZvck5vZGVFeGVjdXRlQm9keVN0YXRlOgorICAgICAgICAgICAgeworICAgICAgICAgICAg
ICAgIEZvck5vZGUqIGZvck5vZGUgPSBzdGF0aWNfY2FzdDxGb3JOb2RlKj4oY3VycmVudE5vZGUp
OworCisgICAgICAgICAgICAgICAgaWYgKGZvck5vZGUtPmV4cHIyICYmICFHRVRfVkFMVUVfUkVU
VVJOKCktPnRvQm9vbGVhbihleGVjKSkgeworICAgICAgICAgICAgICAgICAgICBQT1BfVU5XSU5E
X0JBUlJJRVIoQ29udGludWUpOyAvLyB3ZSdyZSBkb25lLCBubyBtb3JlIGNvbnRpbnVlcyBwb3Nz
aWJsZQorICAgICAgICAgICAgICAgICAgICBTRVRfSlVNUF9TVEFURShGb3JOb2RlRXhlY3V0ZUVu
ZFN0YXRlLCBmb3JOb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAg
ICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIEVYRUNVVEVfQU5EX0pV
TVAoZm9yTm9kZS0+c3RhdGVtZW50LmdldCgpLCBGb3JOb2RlRXhlY3V0ZVBvc3RCb2R5U3RhdGUp
OworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBGb3JOb2RlRXhlY3V0ZUNvbnRpbnVl
U3RhdGU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQVNTRVJUKEdFVF9MQVNUX0NP
TVBMRVRJT04oKS5jb21wbFR5cGUoKSA9PSBOb3JtYWwgfHwgR0VUX0xBU1RfQ09NUExFVElPTigp
LmNvbXBsVHlwZSgpID09IENvbnRpbnVlKTsKKyAgICAgICAgICAgICAgICBSRVNFVF9DT01QTEVU
SU9OX1RPX05PUk1BTCgpOworICAgICAgICAgICAgICAgIEZBTExfVEhST1VHSCgpOworICAgICAg
ICAgICAgfQorICAgICAgICAgICAgY2FzZSBGb3JOb2RlRXhlY3V0ZVBvc3RCb2R5U3RhdGU6Cisg
ICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRm9yTm9kZSogZm9yTm9kZSA9IHN0YXRpY19j
YXN0PEZvck5vZGUqPihjdXJyZW50Tm9kZSk7CisKKyAgICAgICAgICAgICAgICBTRVRfSlVNUF9T
VEFURShGb3JOb2RlRXhlY3V0ZVRlc3RTdGF0ZSwgZm9yTm9kZSk7CisgICAgICAgICAgICAgICAg
aWYgKGZvck5vZGUtPmV4cHIzKQorICAgICAgICAgICAgICAgICAgICBQVVNIX0VWQUxVQVRFKGZv
ck5vZGUtPmV4cHIzLmdldCgpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAg
IH0KKyAgICAgICAgICAgIGNhc2UgRm9yTm9kZUV4ZWN1dGVFbmRTdGF0ZToKKyAgICAgICAgICAg
IHsKKyAgICAgICAgICAgICAgICBQT1BfVU5XSU5EX0JBUlJJRVIoQnJlYWspOworICAgICAgICAg
ICAgICAgIAorICAgICAgICAgICAgICAgIENvbXBsVHlwZSBjb21wbFR5cGUgPSBHRVRfTEFTVF9D
T01QTEVUSU9OKCkuY29tcGxUeXBlKCk7CisgICAgICAgICAgICAgICAgaWYgKGNvbXBsVHlwZSAh
PSBOb3JtYWwpIHsKKyAgICAgICAgICAgICAgICAgICAgQVNTRVJUKGNvbXBsVHlwZSA9PSBCcmVh
ayk7CisgICAgICAgICAgICAgICAgICAgIFJFU0VUX0NPTVBMRVRJT05fVE9fTk9STUFMKCk7Cisg
ICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGJyZWFr
OworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICAKKyAgICAgICAgICAg
IGNhc2UgRm9ySW5Ob2RlRXhlY3V0ZVN0YXRlOgorICAgICAgICAgICAgeworICAgICAgICAgICAg
ICAgIFBVU0hfVU5XSU5EX0JBUlJJRVIoQnJlYWssIEZvckluTm9kZUV4ZWN1dGVQb3BCcmVha1Vu
d2luZEJhcnJpZXJTdGF0ZSk7CisKKyAgICAgICAgICAgICAgICBTRVRfQ09OVElOVUVfU1RBVEUo
Rm9ySW5Ob2RlRXhlY3V0ZVN0YXRlMik7CisgICAgICAgICAgICAgICAgRm9ySW5Ob2RlKiBmb3JJ
bk5vZGUgPSBzdGF0aWNfY2FzdDxGb3JJbk5vZGUqPihjdXJyZW50Tm9kZSk7CisgICAgICAgICAg
ICAgICAgUFVTSF9FVkFMVUFURShmb3JJbk5vZGUtPmV4cHIuZ2V0KCkpOworICAgICAgICAgICAg
ICAgIGlmIChWYXJEZWNsTm9kZSogdmFyRGVjbE5vZGUgPSBmb3JJbk5vZGUtPnZhckRlY2wuZ2V0
KCkpCisgICAgICAgICAgICAgICAgICAgIFBVU0hfRVZBTFVBVEUodmFyRGVjbE5vZGUpOyAvLyBy
ZXR1cm4gaXMgaWdub3JlZC4KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0K
KyAgICAgICAgICAgIGNhc2UgRm9ySW5Ob2RlRXhlY3V0ZVN0YXRlMjoKKyAgICAgICAgICAgIHsK
KyAgICAgICAgICAgICAgICBGb3JJbk5vZGUqIGZvckluTm9kZSA9IHN0YXRpY19jYXN0PEZvcklu
Tm9kZSo+KGN1cnJlbnROb2RlKTsKKyAgICAgICAgICAgICAgICBKU1ZhbHVlKiBlID0gR0VUX1ZB
TFVFX1JFVFVSTigpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIE51bGwg
YW5kIFVuZGVmaW5lZCB3aWxsIHRocm93IGlmIHlvdSBjYWxsIHRvT2JqZWN0IG9uIHRoZW0KKyAg
ICAgICAgICAgICAgICBpZiAoZS0+aXNVbmRlZmluZWRPck51bGwoKSkgeworICAgICAgICAgICAg
ICAgICAgICBQT1BfVU5XSU5EX0JBUlJJRVIoQnJlYWspOworICAgICAgICAgICAgICAgICAgICBS
RVRVUk5fTk9STUFMX0NPTVBMRVRJT04oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAg
ICAgICAgICAgIAorICAgICAgICAgICAgICAgIEludGVycHJldGVyU3RhdGUgaW50ZXJwcmV0ZXJT
dGF0ZTsKKyAgICAgICAgICAgICAgICBpZiAoZm9ySW5Ob2RlLT5sZXhwci0+aXNSZXNvbHZlTm9k
ZSgpKQorICAgICAgICAgICAgICAgICAgICBpbnRlcnByZXRlclN0YXRlID0gRm9ySW5Ob2RlUmVz
b2x2ZU5vZGVFeGVjdXRlU3RhdGU7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoZm9ySW5Ob2Rl
LT5sZXhwci0+aXNEb3RBY2Nlc3Nvck5vZGUoKSkKKyAgICAgICAgICAgICAgICAgICAgaW50ZXJw
cmV0ZXJTdGF0ZSA9IEZvckluTm9kZURvdEFjY2Vzc29yTm9kZUV4ZWN1dGVTdGF0ZTsKKyAgICAg
ICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQVNTRVJUKGZvckluTm9kZS0+
bGV4cHItPmlzQnJhY2tldEFjY2Vzc29yTm9kZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgaW50
ZXJwcmV0ZXJTdGF0ZSA9IEZvckluTm9kZUJyYWNrZXRBY2Nlc3Nvck5vZGVFeGVjdXRlU3RhdGU7
CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAg
ICBTRVRfSlVNUF9TVEFURShGb3JJbk5vZGVFeGVjdXRlUG9wQnJlYWtVbndpbmRCYXJyaWVyU3Rh
dGUsIGN1cnJlbnROb2RlKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBKU09i
amVjdCAqbyA9IGUtPnRvT2JqZWN0KGV4ZWMpOworICAgICAgICAgICAgICAgIEtKU19DSEVDS0VY
Q0VQVElPTigpOworICAgICAgICAgICAgICAgIFN0YWNrPElkZW50aWZpZXIsIDI1Nj4gcHJvcGVy
dHlTdGFjazsKKyAgICAgICAgICAgICAgICBSZWZlcmVuY2VMaXN0IHByb3BMaXN0ID0gby0+cHJv
cExpc3QoZXhlYyk7CisgICAgICAgICAgICAgICAgUmVmZXJlbmNlTGlzdEl0ZXJhdG9yIHByb3BJ
dCA9IHByb3BMaXN0LmJlZ2luKCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKHByb3BJdCAhPSBw
cm9wTGlzdC5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVyIG5hbWUgPSBw
cm9wSXQtPmdldFByb3BlcnR5TmFtZShleGVjKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG8t
Pmhhc1Byb3BlcnR5KGV4ZWMsIG5hbWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVy
dHlTdGFjay5wdXNoKG5hbWUpOworCisgICAgICAgICAgICAgICAgICAgIHByb3BJdCsrOworICAg
ICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBTdG9yZSB0aGVzZSBp
biB0aGUgcmlnaHQgb3JkZXIsIHNvIHdlIGRvbid0IGhhdmUgdG8gcmV2ZXJzZQorICAgICAgICAg
ICAgICAgIC8vIHRoZW0gdG8gcHVzaCB0aGVtIG9udG8gdGhlIHN0YWNrCisgICAgICAgICAgICAg
ICAgc2l6ZV90IG51bVByb3BlcnRpZXMgPSBwcm9wZXJ0eVN0YWNrLnNpemUoKTsKKyAgICAgICAg
ICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVByb3BlcnRpZXM7IGkrKykgeworICAg
ICAgICAgICAgICAgICAgICBQVVNIX0xPQ0FMX1ZBTFVFKGpzU3RyaW5nKHByb3BlcnR5U3RhY2su
cG9wKCkudXN0cmluZygpKSk7CisgICAgICAgICAgICAgICAgICAgIFNFVF9KVU1QX1NUQVRFKGlu
dGVycHJldGVyU3RhdGUsIGZvckluTm9kZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAg
ICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIGNhc2UgRm9ySW5Ob2RlUmVzb2x2ZU5vZGVFeGVjdXRlU3RhdGU6CisgICAgICAgICAg
ICB7CisgICAgICAgICAgICAgICAgRm9ySW5Ob2RlKiBmb3JJbk5vZGUgPSBzdGF0aWNfY2FzdDxG
b3JJbk5vZGUqPihjdXJyZW50Tm9kZSk7CisgICAgICAgICAgICAgICAgY29uc3QgSWRlbnRpZmll
ciAmbGV4cHJJZGVudCA9IHN0YXRpY19jYXN0PFJlc29sdmVOb2RlKj4oZm9ySW5Ob2RlLT5sZXhw
ci5nZXQoKSktPmlkZW50aWZpZXIoKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAg
ICBjb25zdCBTY29wZUNoYWluJiBjaGFpbiA9IGV4ZWMtPmNvbnRleHQoKS5pbXAoKS0+c2NvcGVD
aGFpbigpOworICAgICAgICAgICAgICAgIFNjb3BlQ2hhaW5JdGVyYXRvciBpdGVyID0gY2hhaW4u
YmVnaW4oKTsKKyAgICAgICAgICAgICAgICBTY29wZUNoYWluSXRlcmF0b3IgZW5kID0gY2hhaW4u
ZW5kKCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gd2UgbXVzdCBhbHdh
eXMgaGF2ZSBzb21ldGhpbmcgaW4gdGhlIHNjb3BlIGNoYWluCisgICAgICAgICAgICAgICAgYXNz
ZXJ0KGl0ZXIgIT0gZW5kKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBKU1Zh
bHVlKiBzdHIgPSBQT1BfTE9DQUxfVkFMVUUoKTsKKyAgICAgICAgICAgICAgICBQcm9wZXJ0eVNs
b3Qgc2xvdDsKKyAgICAgICAgICAgICAgICBKU09iamVjdCogbzsKKyAgICAgICAgICAgICAgICBk
byB7IAorICAgICAgICAgICAgICAgICAgICBvID0gKml0ZXI7CisgICAgICAgICAgICAgICAgICAg
IGlmIChvLT5nZXRQcm9wZXJ0eVNsb3QoZXhlYywgbGV4cHJJZGVudCwgc2xvdCkpIHsKKyAgICAg
ICAgICAgICAgICAgICAgICAgIG8tPnB1dChleGVjLCBsZXhwcklkZW50LCBzdHIpOworICAgICAg
ICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgICAgICAgICAgKytpdGVyOworICAgICAgICAgICAgICAgIH0gd2hpbGUgKGl0ZXIgIT0gZW5k
KTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKGl0ZXIgPT0gZW5k
KQorICAgICAgICAgICAgICAgICAgICBvLT5wdXQoZXhlYywgbGV4cHJJZGVudCwgc3RyKTsKKyAg
ICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIFNFVF9KVU1QX1NUQVRFKEZv
ckluTm9kZUV4ZWN1dGVCb2R5U3RhdGUsIGN1cnJlbnROb2RlKTsKKyAgICAgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgRm9ySW5Ob2RlRG90QWNjZXNz
b3JOb2RlRXhlY3V0ZVN0YXRlOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZvcklu
Tm9kZSogZm9ySW5Ob2RlID0gc3RhdGljX2Nhc3Q8Rm9ySW5Ob2RlKj4oY3VycmVudE5vZGUpOwor
ICAgICAgICAgICAgICAgIEVWQUxVQVRFX0FORF9KVU1QKHN0YXRpY19jYXN0PERvdEFjY2Vzc29y
Tm9kZSo+KGZvckluTm9kZS0+bGV4cHIuZ2V0KCkpLT5iYXNlKCksIEZvckluTm9kZURvdEFjY2Vz
c29yTm9kZUV4ZWN1dGVTdGF0ZTEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBG
b3JJbk5vZGVEb3RBY2Nlc3Nvck5vZGVFeGVjdXRlU3RhdGUxOgorICAgICAgICAgICAgeworICAg
ICAgICAgICAgICAgIEZvckluTm9kZSogZm9ySW5Ob2RlID0gc3RhdGljX2Nhc3Q8Rm9ySW5Ob2Rl
Kj4oY3VycmVudE5vZGUpOworICAgICAgICAgICAgICAgIEpTT2JqZWN0KiBiYXNlID0gR0VUX1ZB
TFVFX1JFVFVSTigpLT50b09iamVjdChleGVjKTsKKyAgICAgICAgICAgICAgICBLSlNfQ0hFQ0tF
WENFUFRJT04oKTsKKyAgICAgICAgICAgICAgICBKU1ZhbHVlKiBzdHIgPSBQT1BfTE9DQUxfVkFM
VUUoKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBjb25zdCBJZGVudGlmaWVy
JiBsZXhwcklkZW50ID0gc3RhdGljX2Nhc3Q8RG90QWNjZXNzb3JOb2RlKj4oZm9ySW5Ob2RlLT5s
ZXhwci5nZXQoKSktPmlkZW50aWZpZXIoKTsKKyAgICAgICAgICAgICAgICBiYXNlLT5wdXQoZXhl
YywgbGV4cHJJZGVudCwgc3RyKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBT
RVRfSlVNUF9TVEFURShGb3JJbk5vZGVFeGVjdXRlQm9keVN0YXRlLCBjdXJyZW50Tm9kZSk7Cisg
ICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAg
ICAgICAgIGNhc2UgRm9ySW5Ob2RlQnJhY2tldEFjY2Vzc29yTm9kZUV4ZWN1dGVTdGF0ZToKKyAg
ICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGb3JJbk5vZGUqIGZvckluTm9kZSA9IHN0YXRp
Y19jYXN0PEZvckluTm9kZSo+KGN1cnJlbnROb2RlKTsKKyAgICAgICAgICAgICAgICBFVkFMVUFU
RV9BTkRfQ09OVElOVUUoc3RhdGljX2Nhc3Q8QnJhY2tldEFjY2Vzc29yTm9kZSo+KGZvckluTm9k
ZS0+bGV4cHIuZ2V0KCkpLT5iYXNlKCksIEZvckluTm9kZUJyYWNrZXRBY2Nlc3Nvck5vZGVFeGVj
dXRlU3RhdGUxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgRm9ySW5Ob2RlQnJh
Y2tldEFjY2Vzc29yTm9kZUV4ZWN1dGVTdGF0ZTE6CisgICAgICAgICAgICB7CisgICAgICAgICAg
ICAgICAgUFVTSF9MT0NBTF9WQUxVRShHRVRfVkFMVUVfUkVUVVJOKCkpOworICAgICAgICAgICAg
ICAgIEZvckluTm9kZSogZm9ySW5Ob2RlID0gc3RhdGljX2Nhc3Q8Rm9ySW5Ob2RlKj4oY3VycmVu
dE5vZGUpOworICAgICAgICAgICAgICAgIEVWQUxVQVRFX0FORF9DT05USU5VRShzdGF0aWNfY2Fz
dDxCcmFja2V0QWNjZXNzb3JOb2RlKj4oZm9ySW5Ob2RlLT5sZXhwci5nZXQoKSktPnN1YnNjcmlw
dCgpLCBGb3JJbk5vZGVCcmFja2V0QWNjZXNzb3JOb2RlRXhlY3V0ZVN0YXRlMik7CisgICAgICAg
ICAgICB9CisgICAgICAgICAgICBjYXNlIEZvckluTm9kZUJyYWNrZXRBY2Nlc3Nvck5vZGVFeGVj
dXRlU3RhdGUyOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEpTT2JqZWN0KiBiYXNl
ID0gUE9QX0xPQ0FMX1ZBTFVFKCktPnRvT2JqZWN0KGV4ZWMpOworICAgICAgICAgICAgICAgIEtK
U19DSEVDS0VYQ0VQVElPTigpOworICAgICAgICAgICAgICAgIEpTVmFsdWUqIHN1YnNjcmlwdCA9
IEdFVF9WQUxVRV9SRVRVUk4oKTsKKyAgICAgICAgICAgICAgICBKU1ZhbHVlKiBzdHIgPSBQT1Bf
TE9DQUxfVkFMVUUoKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB1aW50MzJf
dCBpOworICAgICAgICAgICAgICAgIGlmIChzdWJzY3JpcHQtPmdldFVJbnQzMihpKSkKKyAgICAg
ICAgICAgICAgICAgICAgYmFzZS0+cHV0KGV4ZWMsIGksIHN0cik7CisgICAgICAgICAgICAgICAg
YmFzZS0+cHV0KGV4ZWMsIElkZW50aWZpZXIoc3Vic2NyaXB0LT50b1N0cmluZyhleGVjKSksIHN0
cik7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgRkFMTF9USFJPVUdIKCk7Cisg
ICAgICAgICAgICB9ICAgICAgICAgICAgCisgICAgICAgICAgICBjYXNlIEZvckluTm9kZUV4ZWN1
dGVCb2R5U3RhdGU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFVTSF9VTldJTkRf
QkFSUklFUihDb250aW51ZSwgRm9ySW5Ob2RlRXhlY3V0ZVBvcENvbnRpbnVlVW53aW5kQmFycmll
clN0YXRlKTsKKyAgICAgICAgICAgICAgICBGb3JJbk5vZGUqIGZvckluTm9kZSA9IHN0YXRpY19j
YXN0PEZvckluTm9kZSo+KGN1cnJlbnROb2RlKTsKKyAgICAgICAgICAgICAgICBFWEVDVVRFX0FO
RF9DT05USU5VRShmb3JJbk5vZGUtPnN0YXRlbWVudC5nZXQoKSwgRm9ySW5Ob2RlRXhlY3V0ZVBv
cENvbnRpbnVlVW53aW5kQmFycmllclN0YXRlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSBGb3JJbk5vZGVFeGVjdXRlUG9wQ29udGlu
dWVVbndpbmRCYXJyaWVyU3RhdGU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYg
KEdFVF9MQVNUX0NPTVBMRVRJT04oKS5jb21wbFR5cGUoKSA9PSBDb250aW51ZSkKKyAgICAgICAg
ICAgICAgICAgICAgUkVTRVRfQ09NUExFVElPTl9UT19OT1JNQUwoKTsKKyAgICAgICAgICAgICAg
ICBBU1NFUlQoR0VUX0xBU1RfQ09NUExFVElPTigpLmNvbXBsVHlwZSgpID09IE5vcm1hbCk7Cisg
ICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgUE9QX1VOV0lORF9CQVJSSUVSKENvbnRp
bnVlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAg
IGNhc2UgRm9ySW5Ob2RlRXhlY3V0ZVBvcEJyZWFrVW53aW5kQmFycmllclN0YXRlOgorICAgICAg
ICAgICAgeworICAgICAgICAgICAgICAgIGlmIChHRVRfTEFTVF9DT01QTEVUSU9OKCkuY29tcGxU
eXBlKCkgPT0gQnJlYWspCisgICAgICAgICAgICAgICAgICAgIFJFU0VUX0NPTVBMRVRJT05fVE9f
Tk9STUFMKCk7CisgICAgICAgICAgICAgICAgQVNTRVJUKEdFVF9MQVNUX0NPTVBMRVRJT04oKS5j
b21wbFR5cGUoKSA9PSBOb3JtYWwpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAg
IFBPUF9VTldJTkRfQkFSUklFUihCcmVhayk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAg
ICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FzZSBD
b250aW51ZU5vZGVFeGVjdXRlU3RhdGU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAg
UkVUVVJOX0NPTVBMRVRJT04oQ29tcGxldGlvbihDb250aW51ZSwgMCwgc3RhdGljX2Nhc3Q8Q29u
dGludWVOb2RlKj4oY3VycmVudE5vZGUpLT5pZGVudCkpOworICAgICAgICAgICAgfQorCisgICAg
ICAgICAgICBjYXNlIEJyZWFrTm9kZUV4ZWN1dGVTdGF0ZToKKyAgICAgICAgICAgIHsKKyAgICAg
ICAgICAgICAgICBSRVRVUk5fQ09NUExFVElPTihDb21wbGV0aW9uKEJyZWFrLCAwLCBzdGF0aWNf
Y2FzdDxCcmVha05vZGUqPihjdXJyZW50Tm9kZSktPmlkZW50KSk7CisgICAgICAgICAgICB9CisK
KyAgICAgICAgICAgIGNhc2UgUmV0dXJuTm9kZUV4ZWN1dGVTdGF0ZToKKyAgICAgICAgICAgIHsK
KyAgICAgICAgICAgICAgICBSZXR1cm5Ob2RlKiByZXR1cm5Ob2RlID0gc3RhdGljX2Nhc3Q8UmV0
dXJuTm9kZSo+KGN1cnJlbnROb2RlKTsKKworICAgICAgICAgICAgICAgIENvZGVUeXBlIGNvZGVU
eXBlID0gZXhlYy0+Y29udGV4dCgpLmltcCgpLT5jb2RlVHlwZSgpOworICAgICAgICAgICAgICAg
IGlmIChjb2RlVHlwZSAhPSBGdW5jdGlvbkNvZGUgJiYgY29kZVR5cGUgIT0gQW5vbnltb3VzQ29k
ZSkKKyAgICAgICAgICAgICAgICAgICAgUkVUVVJOX0NPTVBMRVRJT04ocmV0dXJuTm9kZS0+Y3Jl
YXRlRXJyb3JDb21wbGV0aW9uKGV4ZWMsIFN5bnRheEVycm9yLCAiSW52YWxpZCByZXR1cm4gc3Rh
dGVtZW50LiIpKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAoIXJldHVy
bk5vZGUtPnZhbHVlKQorICAgICAgICAgICAgICAgICAgICBSRVRVUk5fQ09NUExFVElPTihDb21w
bGV0aW9uKFJldHVyblZhbHVlLCBqc1VuZGVmaW5lZCgpKSk7CisgICAgICAgICAgICAgICAgCisg
ICAgICAgICAgICAgICAgRVZBTFVBVEVfQU5EX0NPTlRJTlVFKHJldHVybk5vZGUtPnZhbHVlLmdl
dCgpLCBSZXR1cm5Ob2RlRXhlY3V0ZVN0YXRlMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAg
ICBjYXNlIFJldHVybk5vZGVFeGVjdXRlU3RhdGUxOgorICAgICAgICAgICAgeworICAgICAgICAg
ICAgICAgIFJFVFVSTl9DT01QTEVUSU9OKENvbXBsZXRpb24oUmV0dXJuVmFsdWUsIEdFVF9WQUxV
RV9SRVRVUk4oKSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIFdpdGhOb2Rl
RXhlY3V0ZVN0YXRlOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEVWQUxVQVRFX0FO
RF9DT05USU5VRShzdGF0aWNfY2FzdDxXaXRoTm9kZSo+KGN1cnJlbnROb2RlKS0+ZXhwci5nZXQo
KSwgV2l0aE5vZGVFeGVjdXRlU3RhdGUxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNh
c2UgV2l0aE5vZGVFeGVjdXRlU3RhdGUxOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAg
IFdpdGhOb2RlKiB3aXRoTm9kZSA9IHN0YXRpY19jYXN0PFdpdGhOb2RlKj4oY3VycmVudE5vZGUp
OworICAgICAgICAgICAgICAgIEpTVmFsdWUgKnYgPSBHRVRfVkFMVUVfUkVUVVJOKCk7CisgICAg
ICAgICAgICAgICAgSlNPYmplY3QgKm8gPSB2LT50b09iamVjdChleGVjKTsKKyAgICAgICAgICAg
ICAgICBLSlNfQ0hFQ0tFWENFUFRJT04oKTsKKyAgICAgICAgICAgICAgICBQVVNIX1VOV0lORF9C
QVJSSUVSKFNjb3BlLCBJbnRlcm5hbEVycm9yU3RhdGUpOyAvLyBzY29wZSBtYXJrZXIKKyAgICAg
ICAgICAgICAgICBleGVjLT5jb250ZXh0KCkuaW1wKCktPnB1c2hTY29wZShvKTsKKyAgICAgICAg
ICAgICAgICBFWEVDVVRFX0FORF9DT05USU5VRSh3aXRoTm9kZS0+c3RhdGVtZW50LmdldCgpLCBX
aXRoTm9kZUV4ZWN1dGVTdGF0ZTIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBX
aXRoTm9kZUV4ZWN1dGVTdGF0ZTI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZXhl
Yy0+Y29udGV4dCgpLmltcCgpLT5wb3BTY29wZSgpOworICAgICAgICAgICAgICAgIFBPUF9VTldJ
TkRfQkFSUklFUihTY29wZSk7IC8vIHNjb3BlIG1hcmtlcgorICAgICAgICAgICAgICAgIFJFVFVS
Tl9OT1JNQUxfQ09NUExFVElPTigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNl
IFN3aXRjaE5vZGVFeGVjdXRlU3RhdGU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAg
RVZBTFVBVEVfQU5EX0NPTlRJTlVFKHN0YXRpY19jYXN0PFN3aXRjaE5vZGUqPihjdXJyZW50Tm9k
ZSktPmV4cHIuZ2V0KCksIFN3aXRjaE5vZGVFeGVjdXRlU3RhdGUxKTsKKyAgICAgICAgICAgIH0K
KyAgICAgICAgICAgIGNhc2UgU3dpdGNoTm9kZUV4ZWN1dGVTdGF0ZTE6CisgICAgICAgICAgICB7
CisgICAgICAgICAgICAgICAgUFVTSF9VTldJTkRfQkFSUklFUihCcmVhaywgU3dpdGNoTm9kZUV4
ZWN1dGVTdGF0ZTIpOworICAgICAgICAgICAgICAgIFNFVF9DT05USU5VRV9TVEFURShTd2l0Y2hO
b2RlRXhlY3V0ZVN0YXRlMik7CisgICAgICAgICAgICAgICAgLy8gQ2FzZUJsb2NrTm9kZUV4ZWN1
dGVCbG9ja1dpdGhJbnB1dFZhbHVlIHVzZXMgdGhlIGxhc3QgcmV0dXJuIHZhbHVlIGFzIGFuICJh
cmd1bWVudCIKKyAgICAgICAgICAgICAgICBBU1NFUlQoc3RhdGljX2Nhc3Q8U3dpdGNoTm9kZSo+
KGN1cnJlbnROb2RlKS0+YmxvY2stPmludGVycHJldGVyU3RhdGUoKSA9PSBDYXNlQmxvY2tOb2Rl
RXhlY3V0ZUJsb2NrV2l0aElucHV0VmFsdWUpOworICAgICAgICAgICAgICAgIFBVU0hfRVhFQ1VU
RShzdGF0aWNfY2FzdDxTd2l0Y2hOb2RlKj4oY3VycmVudE5vZGUpLT5ibG9jay5nZXQoKSk7Cisg
ICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIFN3
aXRjaE5vZGVFeGVjdXRlU3RhdGUyOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBP
UF9VTldJTkRfQkFSUklFUihCcmVhayk7CisgICAgICAgICAgICAgICAgQ29tcGxldGlvbiByZXMg
PSBHRVRfTEFTVF9DT01QTEVUSU9OKCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAg
ICAgaWYgKChyZXMuY29tcGxUeXBlKCkgPT0gQnJlYWspICYmIHN0YXRpY19jYXN0PFN3aXRjaE5v
ZGUqPihjdXJyZW50Tm9kZSktPmxzLmNvbnRhaW5zKHJlcy50YXJnZXQoKSkpIHsKKyAgICAgICAg
ICAgICAgICAgICAgUkVTRVRfQ09NUExFVElPTl9UT19OT1JNQUwoKTsKKyAgICAgICAgICAgICAg
ICAgICAgUkVUVVJOX0NPTVBMRVRJT04oQ29tcGxldGlvbihOb3JtYWwsIHJlcy52YWx1ZSgpKSk7
CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAg
fQorCisgICAgICAgICAgICBjYXNlIExhYmVsTm9kZUV4ZWN1dGVTdGF0ZToKKyAgICAgICAgICAg
IHsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgUFVTSF9VTldJTkRfQkFSUklFUihC
cmVhaywgTGFiZWxOb2RlRXhlY3V0ZVN0YXRlMSk7CisgICAgICAgICAgICAgICAgU0VUX0NPTlRJ
TlVFX1NUQVRFKExhYmVsTm9kZUV4ZWN1dGVTdGF0ZTEpOworICAgICAgICAgICAgICAgIFBVU0hf
RVhFQ1VURShzdGF0aWNfY2FzdDxMYWJlbE5vZGUqPihjdXJyZW50Tm9kZSktPnN0YXRlbWVudC5n
ZXQoKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAg
ICBjYXNlIExhYmVsTm9kZUV4ZWN1dGVTdGF0ZTE6CisgICAgICAgICAgICB7CisgICAgICAgICAg
ICAgICAgUE9QX1VOV0lORF9CQVJSSUVSKEJyZWFrKTsKKyAgICAgICAgICAgICAgICBDb21wbGV0
aW9uIGUgPSBHRVRfTEFTVF9DT01QTEVUSU9OKCk7CisgICAgICAgICAgICAgICAgCisgICAgICAg
ICAgICAgICAgaWYgKChlLmNvbXBsVHlwZSgpID09IEJyZWFrKSAmJiAoZS50YXJnZXQoKSA9PSBz
dGF0aWNfY2FzdDxMYWJlbE5vZGUqPihjdXJyZW50Tm9kZSktPmxhYmVsKSkgeworICAgICAgICAg
ICAgICAgICAgICBSRVNFVF9DT01QTEVUSU9OX1RPX05PUk1BTCgpOworICAgICAgICAgICAgICAg
ICAgICBSRVRVUk5fQ09NUExFVElPTihDb21wbGV0aW9uKE5vcm1hbCwgZS52YWx1ZSgpKSk7Cisg
ICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQor
CisgICAgICAgICAgICBjYXNlIFRocm93Tm9kZUV4ZWN1dGVTdGF0ZToKKyAgICAgICAgICAgIHsK
KyAgICAgICAgICAgICAgICBFVkFMVUFURV9BTkRfQ09OVElOVUUoc3RhdGljX2Nhc3Q8VGhyb3dO
b2RlKj4oY3VycmVudE5vZGUpLT5leHByLmdldCgpLCBUaHJvd05vZGVFeGVjdXRlU3RhdGUxKTsK
KyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgVGhyb3dOb2RlRXhlY3V0ZVN0YXRlMToK
KyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBSRVRVUk5fQ09NUExFVElPTihDb21wbGV0
aW9uKFRocm93LCBHRVRfVkFMVUVfUkVUVVJOKCkpKTsKKyAgICAgICAgICAgIH0KKworICAgICAg
ICAgICAgY2FzZSBUcnlOb2RlRXhlY3V0ZVN0YXRlOgorICAgICAgICAgICAgeworICAgICAgICAg
ICAgICAgIFBVU0hfVU5XSU5EX0JBUlJJRVIoVGhyb3csIFRyeU5vZGVFeGVjdXRlRXhjZXB0aW9u
VGhyb3duU3RhdGUpOworICAgICAgICAgICAgICAgIFNFVF9KVU1QX1NUQVRFKFRyeU5vZGVFeGVj
dXRlTm9FeGNlcHRpb25UaHJvd25TdGF0ZSwgY3VycmVudE5vZGUpOworICAgICAgICAgICAgICAg
IFBVU0hfRVhFQ1VURShzdGF0aWNfY2FzdDxUcnlOb2RlKj4oY3VycmVudE5vZGUpLT50cnlCbG9j
ay5nZXQoKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAg
ICAgICBjYXNlIFRyeU5vZGVFeGVjdXRlRXhjZXB0aW9uVGhyb3duU3RhdGU6CisgICAgICAgICAg
ICB7CisgICAgICAgICAgICAgICAgVHJ5Tm9kZSogdHJ5Tm9kZSA9IHN0YXRpY19jYXN0PFRyeU5v
ZGUqPihjdXJyZW50Tm9kZSk7CisgICAgICAgICAgICAgICAgUE9QX1VOV0lORF9CQVJSSUVSKFRo
cm93KTsKKyAgICAgICAgICAgICAgICBDb21wbGV0aW9uIGMgPSBHRVRfTEFTVF9DT01QTEVUSU9O
KCk7CisgICAgICAgICAgICAgICAgaWYgKHRyeU5vZGUtPmNhdGNoQmxvY2sgJiYgYy5jb21wbFR5
cGUoKSA9PSBUaHJvdykgeworICAgICAgICAgICAgICAgICAgICBSRVNFVF9DT01QTEVUSU9OX1RP
X05PUk1BTCgpOworICAgICAgICAgICAgICAgICAgICBKU09iamVjdCAqb2JqID0gbmV3IEpTT2Jq
ZWN0OworICAgICAgICAgICAgICAgICAgICBvYmotPnB1dChleGVjLCB0cnlOb2RlLT5leGNlcHRp
b25JZGVudCwgYy52YWx1ZSgpLCBEb250RGVsZXRlKTsKKyAgICAgICAgICAgICAgICAgICAgUFVT
SF9VTldJTkRfQkFSUklFUihTY29wZSwgSW50ZXJuYWxFcnJvclN0YXRlKTsKKyAgICAgICAgICAg
ICAgICAgICAgZXhlYy0+Y29udGV4dCgpLmltcCgpLT5wdXNoU2NvcGUob2JqKTsKKyAgICAgICAg
ICAgICAgICAgICAgRVhFQ1VURV9BTkRfQ09OVElOVUUodHJ5Tm9kZS0+Y2F0Y2hCbG9jay5nZXQo
KSwgVHJ5Tm9kZUV4ZWN1dGVQb3BTY29wZUFmdGVyQ2F0Y2hCbG9ja1N0YXRlKTsKKyAgICAgICAg
ICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKHRyeU5vZGUt
PmZpbmFsbHlCbG9jaykgeworICAgICAgICAgICAgICAgICAgICAvLyBXZSB3aWxsIGhhdmUgdG8g
cmUtdGhyb3cgYWZ0ZXIgZmluYWxseSBpZiB3ZSBkaWRuJ3QgY2F0Y2ggdGhpcyBleGNlcHRpb24K
KyAgICAgICAgICAgICAgICAgICAgaWYgKEdFVF9MQVNUX0NPTVBMRVRJT04oKS5jb21wbFR5cGUo
KSA9PSBUaHJvdykgeworICAgICAgICAgICAgICAgICAgICAgICAgUFVTSF9MT0NBTF9WQUxVRShj
LnZhbHVlKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgUkVTRVRfQ09NUExFVElPTl9UT19O
T1JNQUwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9KVU1QX1NUQVRFKFRyeU5vZGVF
eGVjdXRlUmV0aHJvd0FmdGVyRmluYWxseVN0YXRlLCBjdXJyZW50Tm9kZSk7CisgICAgICAgICAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgUFVTSF9FWEVDVVRFKHRyeU5vZGUtPmZp
bmFsbHlCbG9jay5nZXQoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJy
ZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBUcnlOb2RlRXhlY3V0ZVBvcFNj
b3BlQWZ0ZXJDYXRjaEJsb2NrU3RhdGU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAg
Ly8gVGhpcyBjYXNlIGlzIG9ubHkgaGl0IGFmdGVyIHN1Y2Nlc3NmdWxseSBleGVjdXRpbmcgYSBj
YXRjaCBibG9jaworICAgICAgICAgICAgICAgIGV4ZWMtPmNvbnRleHQoKS5pbXAoKS0+cG9wU2Nv
cGUoKTsKKyAgICAgICAgICAgICAgICBQT1BfVU5XSU5EX0JBUlJJRVIoU2NvcGUpOworICAgICAg
ICAgICAgICAgIAorICAgICAgICAgICAgICAgIFRyeU5vZGUqIHRyeU5vZGUgPSBzdGF0aWNfY2Fz
dDxUcnlOb2RlKj4oY3VycmVudE5vZGUpOworICAgICAgICAgICAgICAgIGlmICh0cnlOb2RlLT5m
aW5hbGx5QmxvY2spCisgICAgICAgICAgICAgICAgICAgIFBVU0hfRVhFQ1VURSh0cnlOb2RlLT5m
aW5hbGx5QmxvY2suZ2V0KCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAg
fQorICAgICAgICAgICAgY2FzZSBUcnlOb2RlRXhlY3V0ZU5vRXhjZXB0aW9uVGhyb3duU3RhdGU6
CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gVGhpcyBjYXNlIGlzIGhpdCB3aGVu
IG5vdGhpbmcgaXMgdGhyb3duCisgICAgICAgICAgICAgICAgVHJ5Tm9kZSogdHJ5Tm9kZSA9IHN0
YXRpY19jYXN0PFRyeU5vZGUqPihjdXJyZW50Tm9kZSk7CisgICAgICAgICAgICAgICAgUE9QX1VO
V0lORF9CQVJSSUVSKFRocm93KTsKKyAgICAgICAgICAgICAgICBpZiAodHJ5Tm9kZS0+ZmluYWxs
eUJsb2NrKQorICAgICAgICAgICAgICAgICAgICBQVVNIX0VYRUNVVEUodHJ5Tm9kZS0+ZmluYWxs
eUJsb2NrLmdldCgpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgIGNhc2UgVHJ5Tm9kZUV4ZWN1dGVSZXRocm93QWZ0ZXJGaW5hbGx5U3RhdGU6Cisg
ICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUkVUVVJOX0NPTVBMRVRJT04oQ29tcGxldGlv
bihUaHJvdywgUE9QX0xPQ0FMX1ZBTFVFKCkpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAg
ICAgY2FzZSBGdW5jRGVjbE5vZGVFeGVjdXRlU3RhdGU6CisgICAgICAgICAgICB7CisgICAgICAg
ICAgICAgICAgUkVUVVJOX05PUk1BTF9DT01QTEVUSU9OKCk7CisgICAgICAgICAgICB9CisKKyAg
ICAgICAgICAgIGNhc2UgU291cmNlRWxlbWVudHNOb2RlRXhlY3V0ZVN0YXRlOgorICAgICAgICAg
ICAgeworICAgICAgICAgICAgICAgIEVYRUNVVEVfQU5EX0NPTlRJTlVFKHN0YXRpY19jYXN0PFNv
dXJjZUVsZW1lbnRzTm9kZSo+KGN1cnJlbnROb2RlKS0+bm9kZS5nZXQoKSwgU291cmNlRWxlbWVu
dHNOb2RlRXhlY3V0ZVN0YXRlMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIFNv
dXJjZUVsZW1lbnRzTm9kZUV4ZWN1dGVTdGF0ZTE6CisgICAgICAgICAgICB7CisgICAgICAgICAg
ICAgICAgQ29tcGxldGlvbiBjID0gR0VUX0xBU1RfQ09NUExFVElPTigpOworICAgICAgICAgICAg
ICAgIFNvdXJjZUVsZW1lbnRzTm9kZSogbiA9IHN0YXRpY19jYXN0PFNvdXJjZUVsZW1lbnRzTm9k
ZSo+KGN1cnJlbnROb2RlKTsKKyAgICAgICAgICAgICAgICBpZiAoKG4gPSBuLT5uZXh0LmdldCgp
KSkgeworICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRSwgd2l0aCBhIGxpdHRsZSBtb3JlIHRy
aWNrZXJ5IHRoaXMgIm1ldGhvZCIgY291bGQgYmUgb25seSAxIHN0YXRlLgorICAgICAgICAgICAg
ICAgICAgICBTRVRfSlVNUF9TVEFURShTb3VyY2VFbGVtZW50c05vZGVFeGVjdXRlU3RhdGUsIG4p
OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAg
ICAgICAgICAgCisgICAgICAgICAgICAgICAgUkVUVVJOX05PUk1BTF9DT01QTEVUSU9OKCk7Cisg
ICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBjYXNlIENhc2VCbG9j
a05vZGVFeGVjdXRlQmxvY2tXaXRoSW5wdXRWYWx1ZToKKyAgICAgICAgICAgIHsKKyAgICAgICAg
ICAgICAgICAvLyBGSVhNRTogVGhpcyBpcyB0aGUgb25seSBleGVjdXRlIGZ1bmN0aW9uIHdoaWNo
IHRha2VzIGFuIGFyZ3VtZW50IQorICAgICAgICAgICAgICAgIC8vIFRoaXMgd2FzIG9yaWdpbmFs
bHkgY2FsbGVkIENhc2VCbG9ja05vZGU6OmV2YWxCbG9jayBidXQgd2FzIHJlbmFtZWQKKyAgICAg
ICAgICAgICAgICAvLyBDYXNlQmxvY2tOb2RlRXhlY3V0ZUJsb2NrIHRvIGluZGljYXRlIHRoZSBj
b21wbGV0aW9uIHJldHVybgorICAgICAgICAgICAgICAgIFBVU0hfTE9DQUxfVkFMVUUoR0VUX1ZB
TFVFX1JFVFVSTigpKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBDYXNlQmxv
Y2tOb2RlKiBjYXNlQmxvY2tOb2RlID0gc3RhdGljX2Nhc3Q8Q2FzZUJsb2NrTm9kZSo+KGN1cnJl
bnROb2RlKTsKKyAgICAgICAgICAgICAgICAvLyBTa2lwIG92ZXIgImEiIGxvb3BzIHRvICJiIiBs
b29wcyBpZiBwb3NzaWJsZQorICAgICAgICAgICAgICAgIGlmICghY2FzZUJsb2NrTm9kZS0+bGlz
dDEpIHsKKyAgICAgICAgICAgICAgICAgICAgU0VUX0pVTVBfU1RBVEUoQ2FzZUJsb2NrTm9kZUV4
ZWN1dGVCbG9ja1dpdGhJbnB1dFZhbHVlNSwgY3VycmVudE5vZGUpOworICAgICAgICAgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAg
ICAgICAgICAgUFVTSF9OT0RFKGNhc2VCbG9ja05vZGUtPmxpc3QxLmdldCgpKTsgLy8gcHVzaCAi
YSIKKyAgICAgICAgICAgICAgICBGQUxMX1RIUk9VR0goKTsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIGNhc2UgQ2FzZUJsb2NrTm9kZUV4ZWN1dGVCbG9ja1dpdGhJbnB1dFZhbHVlMTogLy8g
dG9wIG9mIGZpcnN0ICJhIiBsb29wCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ2xh
dXNlTGlzdE5vZGUqIGEgPSBzdGF0aWNfY2FzdDxDbGF1c2VMaXN0Tm9kZSo+KFBFRUtfTk9ERSgp
KTsKKyAgICAgICAgICAgICAgICBFVkFMVUFURV9BTkRfQ09OVElOVUUoYS0+Z2V0Q2xhdXNlKCks
IENhc2VCbG9ja05vZGVFeGVjdXRlQmxvY2tXaXRoSW5wdXRWYWx1ZTIpOworICAgICAgICAgICAg
fQorICAgICAgICAgICAgY2FzZSBDYXNlQmxvY2tOb2RlRXhlY3V0ZUJsb2NrV2l0aElucHV0VmFs
dWUyOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENsYXVzZUxpc3ROb2RlKiYgYSA9
IHJlaW50ZXJwcmV0X2Nhc3Q8Q2xhdXNlTGlzdE5vZGUqJj4oUEVFS19OT0RFKCkpOworICAgICAg
ICAgICAgICAgIEpTVmFsdWUqIHYgPSBHRVRfVkFMVUVfUkVUVVJOKCk7CisgICAgICAgICAgICAg
ICAgSlNWYWx1ZSogaW5wdXQgPSBQRUVLX0xPQ0FMX1ZBTFVFKCk7CisgICAgICAgICAgICAgICAg
CisgICAgICAgICAgICAgICAgaWYgKHN0cmljdEVxdWFsKGV4ZWMsIGlucHV0LCB2KSkgeworICAg
ICAgICAgICAgICAgICAgICAvLyBtb3JlICJhIiBwb2ludGVycyB0byBldmFsdWF0ZSwganVtcCB0
byBzZWNvbmQgd2hpbGUuCisgICAgICAgICAgICAgICAgICAgIFNFVF9DT05USU5VRV9TVEFURShD
YXNlQmxvY2tOb2RlRXhlY3V0ZUJsb2NrV2l0aElucHV0VmFsdWUzKTsKKyAgICAgICAgICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAg
ICAgICAgICAgIGEgPSBhLT5nZXROZXh0KCk7CisgICAgICAgICAgICAgICAgLy8ganVtcCB0byB0
b3Agb2YgZmlyc3Qgd2hpbGUoYSkKKyAgICAgICAgICAgICAgICBpZiAoYSkgeworICAgICAgICAg
ICAgICAgICAgICBTRVRfSlVNUF9TVEFURShDYXNlQmxvY2tOb2RlRXhlY3V0ZUJsb2NrV2l0aElu
cHV0VmFsdWUxLCBjdXJyZW50Tm9kZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBQT1BfTk9E
RSgpOyAvLyB3ZSdyZSBkb25lIHdpdGggImEiCisgICAgICAgICAgICAgICAgU0VUX0pVTVBfU1RB
VEUoQ2FzZUJsb2NrTm9kZUV4ZWN1dGVCbG9ja1dpdGhJbnB1dFZhbHVlNSwgY3VycmVudE5vZGUp
OyAvLyBqdW1wIHRvIHRvcCBvZiBmaXJzdCAiYiIgbG9vcAorICAgICAgICAgICAgICAgIGJyZWFr
OworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBDYXNlQmxvY2tOb2RlRXhlY3V0ZUJs
b2NrV2l0aElucHV0VmFsdWUzOiAvLyB0b3Agb2Ygc2Vjb25kIHdoaWxlKGEpCisgICAgICAgICAg
ICB7CisgICAgICAgICAgICAgICAgQ2xhdXNlTGlzdE5vZGUqIGEgPSBzdGF0aWNfY2FzdDxDbGF1
c2VMaXN0Tm9kZSo+KFBFRUtfTk9ERSgpKTsKKyAgICAgICAgICAgICAgICAvLyBDYXNlQ2xhdXNl
Tm9kZTo6ZXZhbFN0YXRlbWVudHMoKQorICAgICAgICAgICAgICAgIGlmIChhLT5nZXRDbGF1c2Uo
KS0+bmV4dCkgeworICAgICAgICAgICAgICAgICAgICBFWEVDVVRFX0FORF9DT05USU5VRShhLT5n
ZXRDbGF1c2UoKS0+bmV4dC5nZXQoKSwgQ2FzZUJsb2NrTm9kZUV4ZWN1dGVCbG9ja1dpdGhJbnB1
dFZhbHVlNCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0K
KyAgICAgICAgICAgICAgICBGQUxMX1RIUk9VR0goKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIGNhc2UgQ2FzZUJsb2NrTm9kZUV4ZWN1dGVCbG9ja1dpdGhJbnB1dFZhbHVlNDoKKyAgICAg
ICAgICAgIHsKKyAgICAgICAgICAgICAgICBDbGF1c2VMaXN0Tm9kZSomIGEgPSByZWludGVycHJl
dF9jYXN0PENsYXVzZUxpc3ROb2RlKiY+KFBFRUtfTk9ERSgpKTsKKyAgICAgICAgICAgICAgICBh
ID0gYS0+Z2V0TmV4dCgpOworICAgICAgICAgICAgICAgIGlmIChhKSB7IC8vIHN0aWxsIG1vcmUg
ImEiIHBvaW50ZXJzIHRvIGV2YWx1YXRlLCBqdW1wIHRvIHRvcCBvZiBzZWNvbmQgd2hpbGUKKyAg
ICAgICAgICAgICAgICAgICAgU0VUX0pVTVBfU1RBVEUoQ2FzZUJsb2NrTm9kZUV4ZWN1dGVCbG9j
a1dpdGhJbnB1dFZhbHVlMywgY3VycmVudE5vZGUpOworICAgICAgICAgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAg
UE9QX05PREUoKTsgLy8gd2UncmUgZG9uZSB3aXRoICJhIgorICAgICAgICAgICAgICAgIEZBTExf
VEhST1VHSCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBDYXNlQmxvY2tOb2Rl
RXhlY3V0ZUJsb2NrV2l0aElucHV0VmFsdWU1OiAvLyBzdGFnaW5nIGFyZWEgZm9yICJiIiBsb29w
cworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENhc2VCbG9ja05vZGUqIGNhc2VCbG9j
a05vZGUgPSBzdGF0aWNfY2FzdDxDYXNlQmxvY2tOb2RlKj4oY3VycmVudE5vZGUpOworICAgICAg
ICAgICAgICAgIGlmICghY2FzZUJsb2NrTm9kZS0+bGlzdDIpIHsgLy8gbm8gImIiLCBqdW1wIHRv
IGRlZmF1bHQKKyAgICAgICAgICAgICAgICAgICAgU0VUX0pVTVBfU1RBVEUoQ2FzZUJsb2NrTm9k
ZUV4ZWN1dGVCbG9ja1dpdGhJbnB1dFZhbHVlOCwgY3VycmVudE5vZGUpOworICAgICAgICAgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgUFVTSF9O
T0RFKGNhc2VCbG9ja05vZGUtPmxpc3QyLmdldCgpKTsgLy8gcHVzaCAiYiIKKyAgICAgICAgICAg
ICAgICBGQUxMX1RIUk9VR0goKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgQ2Fz
ZUJsb2NrTm9kZUV4ZWN1dGVCbG9ja1dpdGhJbnB1dFZhbHVlNjogLy8gdG9wIG9mIGZpcnN0ICJi
IiBsb29wCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ2xhdXNlTGlzdE5vZGUqIGIg
PSBzdGF0aWNfY2FzdDxDbGF1c2VMaXN0Tm9kZSo+KFBFRUtfTk9ERSgpKTsKKyAgICAgICAgICAg
ICAgICBFVkFMVUFURV9BTkRfQ09OVElOVUUoYi0+Z2V0Q2xhdXNlKCksIENhc2VCbG9ja05vZGVF
eGVjdXRlQmxvY2tXaXRoSW5wdXRWYWx1ZTcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAg
Y2FzZSBDYXNlQmxvY2tOb2RlRXhlY3V0ZUJsb2NrV2l0aElucHV0VmFsdWU3OgorICAgICAgICAg
ICAgeworICAgICAgICAgICAgICAgIENsYXVzZUxpc3ROb2RlKiYgYiA9IHJlaW50ZXJwcmV0X2Nh
c3Q8Q2xhdXNlTGlzdE5vZGUqJj4oUEVFS19OT0RFKCkpOworICAgICAgICAgICAgICAgIEpTVmFs
dWUqIHYgPSBHRVRfVkFMVUVfUkVUVVJOKCk7CisgICAgICAgICAgICAgICAgSlNWYWx1ZSogaW5w
dXQgPSBQRUVLX0xPQ0FMX1ZBTFVFKCk7CisgICAgICAgICAgICAgICAgaWYgKHN0cmljdEVxdWFs
KGV4ZWMsIGlucHV0LCB2KSkgeworICAgICAgICAgICAgICAgICAgICAvLyBza2lwIG92ZXIgZGVm
YXVsdCBjbGF1c2UsIGV2YWx1YXRlIHN0YXRlbWVudCBibG9jayBpZiBwb3NzaWJsZS4KKyAgICAg
ICAgICAgICAgICAgICAgU0VUX0pVTVBfU1RBVEUoQ2FzZUJsb2NrTm9kZUV4ZWN1dGVCbG9ja1dp
dGhJbnB1dFZhbHVlMTAsIGN1cnJlbnROb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGIt
PmdldENsYXVzZSgpLT5uZXh0KQorICAgICAgICAgICAgICAgICAgICAgICAgUFVTSF9FWEVDVVRF
KGItPmdldENsYXVzZSgpLT5uZXh0LmdldCgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGIg
PSBiLT5nZXROZXh0KCk7CisgICAgICAgICAgICAgICAgaWYgKGIpIHsgLy8ganVtcCB0byB0b3Ag
b2YgZmlyc3QgImIiIGxvb3AKKyAgICAgICAgICAgICAgICAgICAgU0VUX0pVTVBfU1RBVEUoQ2Fz
ZUJsb2NrTm9kZUV4ZWN1dGVCbG9ja1dpdGhJbnB1dFZhbHVlNiwgY3VycmVudE5vZGUpOworICAg
ICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAg
ICAgCisgICAgICAgICAgICAgICAgUE9QX05PREUoKTsgLy8gcG9wICJiIgorICAgICAgICAgICAg
ICAgIEZBTExfVEhST1VHSCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBDYXNl
QmxvY2tOb2RlRXhlY3V0ZUJsb2NrV2l0aElucHV0VmFsdWU4OiAvLyBkZWZhdWx0IGNsYXVzZQor
ICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENhc2VCbG9ja05vZGUqIGNhc2VCbG9ja05v
ZGUgPSBzdGF0aWNfY2FzdDxDYXNlQmxvY2tOb2RlKj4oY3VycmVudE5vZGUpOworICAgICAgICAg
ICAgICAgIGlmIChjYXNlQmxvY2tOb2RlLT5saXN0MikgeworICAgICAgICAgICAgICAgICAgICBQ
VVNIX05PREUoY2FzZUJsb2NrTm9kZS0+bGlzdDIuZ2V0KCkpOyAvLyBwdXNoICJiIgorICAgICAg
ICAgICAgICAgICAgICBTRVRfQ09OVElOVUVfU1RBVEUoQ2FzZUJsb2NrTm9kZUV4ZWN1dGVCbG9j
a1dpdGhJbnB1dFZhbHVlOSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIAorICAgICAgICAgICAg
ICAgICAgICBTRVRfSlVNUF9TVEFURShDYXNlQmxvY2tOb2RlRXhlY3V0ZUJsb2NrV2l0aElucHV0
VmFsdWUxMSwgY3VycmVudE5vZGUpOworCisgICAgICAgICAgICAgICAgaWYgKGNhc2VCbG9ja05v
ZGUtPmRlZiAmJiBjYXNlQmxvY2tOb2RlLT5kZWYtPm5leHQpCisgICAgICAgICAgICAgICAgICAg
IFBVU0hfRVhFQ1VURShjYXNlQmxvY2tOb2RlLT5kZWYtPm5leHQuZ2V0KCkpOworCisgICAgICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIENhc2VCbG9j
a05vZGVFeGVjdXRlQmxvY2tXaXRoSW5wdXRWYWx1ZTk6IC8vIHRvcCBvZiBzZWNvbmQgImIiIGxv
b3AKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDbGF1c2VMaXN0Tm9kZSogYiA9IHN0
YXRpY19jYXN0PENsYXVzZUxpc3ROb2RlKj4oUEVFS19OT0RFKCkpOworICAgICAgICAgICAgICAg
IGlmIChiLT5nZXRDbGF1c2UoKS0+bmV4dCkgeworICAgICAgICAgICAgICAgICAgICBFWEVDVVRF
X0FORF9KVU1QKGItPmdldENsYXVzZSgpLT5uZXh0LmdldCgpLCBDYXNlQmxvY2tOb2RlRXhlY3V0
ZUJsb2NrV2l0aElucHV0VmFsdWUxMCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBGQUxMX1RI
Uk9VR0goKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgQ2FzZUJsb2NrTm9kZUV4
ZWN1dGVCbG9ja1dpdGhJbnB1dFZhbHVlMTA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAg
ICAgQ2xhdXNlTGlzdE5vZGUqJiBiID0gcmVpbnRlcnByZXRfY2FzdDxDbGF1c2VMaXN0Tm9kZSom
PihQRUVLX05PREUoKSk7CisgICAgICAgICAgICAgICAgYiA9IGItPmdldE5leHQoKTsKKyAgICAg
ICAgICAgICAgICBpZiAoYikgeyAvLyBqdW1wIHRvIHRvcCBvZiBzZWNvbmQgImIiIGxvb3AKKyAg
ICAgICAgICAgICAgICAgICAgU0VUX0pVTVBfU1RBVEUoQ2FzZUJsb2NrTm9kZUV4ZWN1dGVCbG9j
a1dpdGhJbnB1dFZhbHVlOSwgY3VycmVudE5vZGUpOworICAgICAgICAgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgUE9QX05PREUoKTsgLy8gZG9u
ZSB3aXRoICJiIgorICAgICAgICAgICAgfSAgICAKKyAgICAgICAgICAgIGNhc2UgQ2FzZUJsb2Nr
Tm9kZUV4ZWN1dGVCbG9ja1dpdGhJbnB1dFZhbHVlMTE6CisgICAgICAgICAgICB7CisgICAgICAg
ICAgICAgICAgUE9QX0xPQ0FMX1ZBTFVFKCk7IC8vIGRvbmUgd2l0aCAiaW5wdXQiCisgICAgICAg
ICAgICAgICAgUkVUVVJOX05PUk1BTF9DT01QTEVUSU9OKCk7CisgICAgICAgICAgICB9CisgICAg
ICAgICAgICAKKyAgICAgICAgfSAvLyBlbmQgc3dpdGNoCisgICAgICAgIAorICAgICAgICAvLyBU
aGlzIGxhYmVsIGlzIHVzZWQgYnkgUkVUVVJOX1ZBTFVFIHRvIGJyZWFrIG91dCBvZiBuZXN0ZWQg
d2hpbGUgbG9vcHMgaW4gY2FzZSBzdGF0ZW1lbnRzCitpbnRlcnByZXRlcl9zdGF0ZV9zd2l0Y2hf
ZW5kOgorICAgICAgICBpZiAoZXhlYy0+aGFkRXhjZXB0aW9uKCkpIHsKKyAgICAgICAgICAgIGlu
dGVycHJldGVyLT5yZXNldENvbXBsZXRpb25Ub05vcm1hbCgpOworICAgICAgICAgICAgaW50ZXJw
cmV0ZXItPnNldENvbXBsZXRpb25SZXR1cm4oQ29tcGxldGlvbihUaHJvdywgZXhlYy0+ZXhjZXB0
aW9uKCkpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW50ZXJwcmV0ZXItPmdldENvbXBsZXRp
b25SZXR1cm4oKS5jb21wbFR5cGUoKSAhPSBOb3JtYWwpCisgICAgICAgICAgICBpbnRlcnByZXRl
ci0+dW53aW5kVG9OZXh0QmFycmllcihleGVjLCBjdXJyZW50Tm9kZSk7CisgICAgfQorfQorCisv
LyBMZWdhY3kgZXhlY3V0aW9uIHN1cHBvcnQgLS0gY2xpZW50cyBzaG91bGQgdHJlZWNvZGUtaWZ5
IHRoZW1zZWx2ZXMKK0NvbXBsZXRpb24gY2FsbEV4ZWN1dGVPbk5vZGUoU3RhdGVtZW50Tm9kZSog
bm9kZSwgRXhlY1N0YXRlKiBleGVjKQoreworICAgIEludGVycHJldGVySW1wKiBpbnRlcnByZXRl
ciA9IGV4ZWMtPmR5bmFtaWNJbnRlcnByZXRlcigpLT5pbXAoKTsKKworICAgIC8vIEZJWE1FOiBJ
dCdzIGEgYml0IG9mIGEgaGFjayB0byB1c2UgSW50ZXJuYWxFcnJvclN0YXRlIHRvIHJlcHJlc2Vu
dCB0aGUgc3RhY2sgZnJhbWUgYmFycmllcgorICAgIGludGVycHJldGVyLT5wdXNoVW53aW5kQmFy
cmllcihBbGwsIEludGVycHJldGVySW1wOjpTdGF0ZShJbnRlcm5hbEVycm9yU3RhdGUsIDApKTsK
KworICAgIFBVU0hfRVhFQ1VURShub2RlKTsKKyAgICBydW5JbnRlcnByZXRlckxvb3AoZXhlYyk7
CisKKyAgICBQT1BfVU5XSU5EX0JBUlJJRVIoQWxsKTsKKworICAgIENvbXBsZXRpb24gYyA9IEdF
VF9MQVNUX0NPTVBMRVRJT04oKTsKKyAgICBSRVNFVF9DT01QTEVUSU9OX1RPX05PUk1BTCgpOwor
ICAgIHJldHVybiBjOworfQorCit9IC8vIG5hbWVzcGFjZSBLSlMKSW5kZXg6IEphdmFTY3JpcHRD
b3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gSmF2YVNjcmlwdENv
cmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagkocmV2aXNpb24gMTM3NDUpCisrKyBKYXZhU2Ny
aXB0Q29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCSh3b3JraW5nIGNvcHkpCkBAIC0yMjQs
NiArMjI0LDkgQEAKIAkJOTNFMjZEREMwOEIyQTRGNDAwRjg1MjI2IC8qIHBjcmVfcHJpbnRpbnQu
YyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDkzRTI2RERC
MDhCMkE0RjQwMEY4NTIyNiAvKiBwY3JlX3ByaW50aW50LmMgKi87IH07CiAJCTkzRjBCM0FCMDlC
QjREQzAwMDY4RkNFMyAvKiBQYXJzZXIuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVp
bGRGaWxlOyBmaWxlUmVmID0gOTNGMEIzQTkwOUJCNERDMDAwNjhGQ0UzIC8qIFBhcnNlci5jcHAg
Ki87IH07CiAJCTkzRjBCM0FDMDlCQjREQzAwMDY4RkNFMyAvKiBQYXJzZXIuaCBpbiBIZWFkZXJz
ICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDkzRjBCM0FBMDlCQjREQzAwMDY4
RkNFMyAvKiBQYXJzZXIuaCAqLzsgfTsKKwkJQTgwQUJBNTkwOUVBMjRGMTAwRUQyREQyIC8qIFRy
ZWVDb2RlLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBB
ODBBQkE1NzA5RUEyNEYxMDBFRDJERDIgLyogVHJlZUNvZGUuaCAqLzsgfTsKKwkJQTgwQUJBNUEw
OUVBMjRGMTAwRUQyREQyIC8qIFRyZWVDb2RlLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBC
WEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEE4MEFCQTU4MDlFQTI0RjEwMEVEMkREMiAvKiBUcmVlQ29k
ZS5jcHAgKi87IH07CisJCUE4MEFCQTVDMDlFQTI1MDQwMEVEMkREMiAvKiBJbnRlcnByZXRlclN0
YXRlLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBBODBB
QkE1QjA5RUEyNTA0MDBFRDJERDIgLyogSW50ZXJwcmV0ZXJTdGF0ZS5oICovOyB9OwogCQlFMTk1
Njc5NjA5RTdDRjEyMDBCODlEMTMgLyogVW5pY29kZUljdS5oIGluIEhlYWRlcnMgKi8gPSB7aXNh
ID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRTE5NTY3OEYwOUU3Q0YxMjAwQjg5RDEzIC8qIFVu
aWNvZGVJY3UuaCAqLzsgfTsKIAkJRTE5NTY3OTgwOUU3Q0YxMjAwQjg5RDEzIC8qIFVuaWNvZGUu
aCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEUxOTU2Nzk0
MDlFN0NGMTIwMEI4OUQxMyAvKiBVbmljb2RlLmggKi87IH07CiAJCUUxOTU2Nzk5MDlFN0NGMTIw
MEI4OUQxMyAvKiBVbmljb2RlQ2F0ZWdvcnkuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1
aWxkRmlsZTsgZmlsZVJlZiA9IEUxOTU2Nzk1MDlFN0NGMTIwMEI4OUQxMyAvKiBVbmljb2RlQ2F0
ZWdvcnkuaCAqLzsgfTsKQEAgLTQzOSw2ICs0NDIsOSBAQAogCQk5M0YwQjNBOTA5QkI0REMwMDA2
OEZDRTMgLyogUGFyc2VyLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5j
b2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9
IFBhcnNlci5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTkzRjBCM0FBMDlCQjRE
QzAwMDY4RkNFMyAvKiBQYXJzZXIuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxl
RW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0g
UGFyc2VyLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTkzRjE5ODFBMDgyNDVBQUUw
MDFFOUFCQyAvKiBrZXl3b3Jkcy50YWJsZSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBm
aWxlRW5jb2RpbmcgPSA0OyBpbmRlbnRXaWR0aCA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4
dDsgcGF0aCA9IGtleXdvcmRzLnRhYmxlOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB0YWJXaWR0
aCA9IDg7IH07CisJCUE4MEFCQTU3MDlFQTI0RjEwMEVEMkREMiAvKiBUcmVlQ29kZS5oICovID0g
e2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxl
VHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gVHJlZUNvZGUuaDsgc291cmNlVHJlZSA9ICI8
Z3JvdXA+IjsgfTsKKwkJQTgwQUJBNTgwOUVBMjRGMTAwRUQyREQyIC8qIFRyZWVDb2RlLmNwcCAq
LyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3du
RmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBUcmVlQ29kZS5jcHA7IHNvdXJj
ZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUE4MEFCQTVCMDlFQTI1MDQwMEVEMkREMiAvKiBJbnRl
cnByZXRlclN0YXRlLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5n
ID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBJbnRlcnBy
ZXRlclN0YXRlLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUUxOTU2NzhGMDlFN0NG
MTIwMEI4OUQxMyAvKiBVbmljb2RlSWN1LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsg
ZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0
aCA9IFVuaWNvZGVJY3UuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJRTE5NTY3OTQw
OUU3Q0YxMjAwQjg5RDEzIC8qIFVuaWNvZGUuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNl
OyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBw
YXRoID0gVW5pY29kZS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlFMTk1Njc5NTA5
RTdDRjEyMDBCODlEMTMgLyogVW5pY29kZUNhdGVnb3J5LmggKi8gPSB7aXNhID0gUEJYRmlsZVJl
ZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2Rl
LmMuaDsgcGF0aCA9IFVuaWNvZGVDYXRlZ29yeS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9
OwpAQCAtNzEyLDYgKzcxOCw3IEBACiAJCQkJRjY5MkE4NjIwMjU1NTk3RDAxRkY2MEY3IC8qIGlu
dGVybmFsLmggKi8sCiAJCQkJRjY5MkE4NjMwMjU1NTk3RDAxRkY2MEY3IC8qIGludGVycHJldGVy
LmNwcCAqLywKIAkJCQlGNjkyQTg2NDAyNTU1OTdEMDFGRjYwRjcgLyogaW50ZXJwcmV0ZXIuaCAq
LywKKwkJCQlBODBBQkE1QjA5RUEyNTA0MDBFRDJERDIgLyogSW50ZXJwcmV0ZXJTdGF0ZS5oICov
LAogCQkJCUY1QzI5MEU2MDI4NEY5OEUwMTg2MzVDQSAvKiBKYXZhU2NyaXB0Q29yZVByZWZpeC5o
ICovLAogCQkJCTE0NzYwODYzMDk5QzYzMzgwMDQzNzEyOCAvKiBKU0ltbWVkaWF0ZS5jcHAgKi8s
CiAJCQkJMTQ4M0I1ODkwOTlCQzE5NTAwMTZFNEYwIC8qIEpTSW1tZWRpYXRlLmggKi8sCkBAIC03
NTksNiArNzY2LDggQEAKIAkJCQlGNjkyQTg3RjAyNTU1OTdEMDFGRjYwRjcgLyogc3RyaW5nX29i
amVjdC5jcHAgKi8sCiAJCQkJRjY5MkE4ODAwMjU1NTk3RDAxRkY2MEY3IC8qIHN0cmluZ19vYmpl
Y3QuaCAqLywKIAkJCQk0NUUxMkQ4ODA2QTQ5QjBGMDBFOURGODQgLyogdGVzdGtqcy5jcHAgKi8s
CisJCQkJQTgwQUJBNTgwOUVBMjRGMTAwRUQyREQyIC8qIFRyZWVDb2RlLmNwcCAqLywKKwkJCQlB
ODBBQkE1NzA5RUEyNEYxMDBFRDJERDIgLyogVHJlZUNvZGUuaCAqLywKIAkJCQlGNjkyQTg4NDAy
NTU1OTdEMDFGRjYwRjcgLyogdHlwZXMuaCAqLywKIAkJCQlGNjkyQTg4NTAyNTU1OTdEMDFGRjYw
RjcgLyogdXN0cmluZy5jcHAgKi8sCiAJCQkJRjY5MkE4ODYwMjU1NTk3RDAxRkY2MEY3IC8qIHVz
dHJpbmcuaCAqLywKQEAgLTk0NCw2ICs5NTMsOCBAQAogCQkJCUUxOTU2Nzk2MDlFN0NGMTIwMEI4
OUQxMyAvKiBVbmljb2RlSWN1LmggaW4gSGVhZGVycyAqLywKIAkJCQlFMTk1Njc5ODA5RTdDRjEy
MDBCODlEMTMgLyogVW5pY29kZS5oIGluIEhlYWRlcnMgKi8sCiAJCQkJRTE5NTY3OTkwOUU3Q0Yx
MjAwQjg5RDEzIC8qIFVuaWNvZGVDYXRlZ29yeS5oIGluIEhlYWRlcnMgKi8sCisJCQkJQTgwQUJB
NTkwOUVBMjRGMTAwRUQyREQyIC8qIFRyZWVDb2RlLmggaW4gSGVhZGVycyAqLywKKwkJCQlBODBB
QkE1QzA5RUEyNTA0MDBFRDJERDIgLyogSW50ZXJwcmV0ZXJTdGF0ZS5oIGluIEhlYWRlcnMgKi8s
CiAJCQkpOwogCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CiAJCX07
CkBAIC0xMjEwLDYgKzEyMjEsNyBAQAogCQkJCTE0NzYwODY0MDk5QzYzMzgwMDQzNzEyOCAvKiBK
U0ltbWVkaWF0ZS5jcHAgaW4gU291cmNlcyAqLywKIAkJCQk5M0YwQjNBQjA5QkI0REMwMDA2OEZD
RTMgLyogUGFyc2VyLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTY1RkIzRjUwMDlEMTFCMjQwMEY0
OURFQiAvKiBncmFtbWFyLmNwcCBpbiBTb3VyY2VzICovLAorCQkJCUE4MEFCQTVBMDlFQTI0RjEw
MEVEMkREMiAvKiBUcmVlQ29kZS5jcHAgaW4gU291cmNlcyAqLywKIAkJCSk7CiAJCQlydW5Pbmx5
Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKIAkJfTsK
</data>

          </attachment>
      

    </bug>

</bugzilla>