<?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>70364</bug_id>
          
          <creation_ts>2011-10-18 14:23:29 -0700</creation_ts>
          <short_desc>Switched ropes from malloc memory to GC memory</short_desc>
          <delta_ts>2011-10-18 19:53:28 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>New Bugs</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Geoffrey Garen">ggaren</reporter>
          <assigned_to name="Geoffrey Garen">ggaren</assigned_to>
          <cc>barraclough</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>486305</commentid>
    <comment_count>0</comment_count>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2011-10-18 14:23:29 -0700</bug_when>
    <thetext>Switched ropes from malloc memory to GC memory</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>486322</commentid>
    <comment_count>1</comment_count>
      <attachid>111507</attachid>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2011-10-18 14:48:41 -0700</bug_when>
    <thetext>Created attachment 111507
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>486499</commentid>
    <comment_count>2</comment_count>
      <attachid>111507</attachid>
    <who name="Gavin Barraclough">barraclough</who>
    <bug_when>2011-10-18 18:31:42 -0700</bug_when>
    <thetext>Comment on attachment 111507
Patch

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

Hmmm, I wonder whether we still need m_fiberCount, if a JSString is a rope, is m_value null? (to remove the test of m_fiberCount in isRope)
Still, that&apos;s a separate question really.

After this patch, will we ever be creating RopeImpls?
Should this patch not be removing RopeImpl.cpp/.h from svn?

r+, but I think you should probably be using jsNontrivialString in the case I point out, and probably remove the RopeImpl files.

&gt; Source/JavaScriptCore/runtime/JSValue.cpp:222
&gt; +        return JSString::create(exec-&gt;globalData(), UString(&quot;undefined&quot;).impl());

Maybe we should have an JSString::create(ExecState*, const char*) helper? - 
Actually, I think we have one! - this should call:

inline JSString* jsNontrivialString(JSGlobalData* globalData, const char* s)

&gt; Source/JavaScriptCore/runtime/Operations.h:96
&gt;      ALWAYS_INLINE JSValue jsString(ExecState* exec, JSValue thisValue)

This method is really poorly named (my bad, I believe :-( ) - there is nothing in the name indicating it does anything to do with arguments, we should really rename it to something more explicit.

&gt; Source/JavaScriptCore/runtime/SmallStrings.cpp:109
&gt; +    m_emptyString = JSString::createHasOtherOwner(*globalData, UString(&quot;&quot;).impl());

This could be &apos;StringImpl::empty()&apos;

&gt; Source/JavaScriptCore/runtime/StringPrototype.cpp:640
&gt; +            : jsString(exec, asString(thisValue), JSString::create(exec-&gt;globalData(), v.toString(exec).impl())));

We create JSStrings with arguments like this in quite a few places, maybe we should have an JSString::create(ExecState*, JSValue)?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>486516</commentid>
    <comment_count>3</comment_count>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2011-10-18 19:02:03 -0700</bug_when>
    <thetext>&gt; &gt; Source/JavaScriptCore/runtime/JSValue.cpp:222
&gt; &gt; +        return JSString::create(exec-&gt;globalData(), UString(&quot;undefined&quot;).impl());
&gt; 
&gt; Maybe we should have an JSString::create(ExecState*, const char*) helper? - 
&gt; Actually, I think we have one! - this should call:
&gt; 
&gt; inline JSString* jsNontrivialString(JSGlobalData* globalData, const char* s)

Ah yes. Actually, all of my direct calls to JSString::create are broken on Windows, since they miss the glorious call to fixupVPtr. I&apos;ll fix those, and fix the rest in a follow-up patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>486528</commentid>
    <comment_count>4</comment_count>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2011-10-18 19:53:28 -0700</bug_when>
    <thetext>Committed r97827: &lt;http://trac.webkit.org/changeset/97827&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>111507</attachid>
            <date>2011-10-18 14:48:41 -0700</date>
            <delta_ts>2011-10-18 18:31:42 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-70364-20111018144841.patch</filename>
            <type>text/plain</type>
            <size>54625</size>
            <attacher name="Geoffrey Garen">ggaren</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gOTc3OTApCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNzYgQEAK
KzIwMTEtMTAtMTggIEdlb2ZmcmV5IEdhcmVuICA8Z2dhcmVuQGFwcGxlLmNvbT4KKworICAgICAg
ICBTd2l0Y2hlZCByb3BlcyBmcm9tIG1hbGxvYyBtZW1vcnkgdG8gR0MgbWVtb3J5CisgICAgICAg
IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD03MDM2NAorCisgICAgICAg
IFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIH4xJSBTdW5TcGlkZXIgc3Bl
ZWR1cC4gTmV1dHJhbCBlbHNld2hlcmUuIFJlbW92ZXMgb25lIGNhdXNlIGZvciBzdHJpbmdzCisg
ICAgICAgIGhhdmluZyBDKysgZGVzdHJ1Y3RvcnMuCisKKyAgICAgICAgKiBoZWFwL01hcmtTdGFj
ay5jcHA6CisgICAgICAgIChKU0M6OnZpc2l0Q2hpbGRyZW4pOiBDYWxsIHRoZSBKU1N0cmluZyB2
aXNpdENoaWxkcmVuIGZ1bmN0aW9uIG5vdywKKyAgICAgICAgc2luY2UgaXQncyBubyBsb25nZXIg
YSBuby1vcC4KKworICAgICAgICAqIHJ1bnRpbWUvSlNTdHJpbmcuY3BwOgorICAgICAgICAoSlND
OjpKU1N0cmluZzo6fkpTU3RyaW5nKTogTW92ZWQgdGhpcyBkZXN0cnVjdG9yIG91dCBvZiBsaW5l
IGJlY2F1c2UKKyAgICAgICAgaXQncyBjYWxsZWQgdmlydHVhbGx5LCBzbyB0aGVyZSdzIG5vIHZh
bHVlIHRvIGlubGluaW5nLgorCisgICAgICAgIChKU0M6OkpTU3RyaW5nOjpSb3BlQnVpbGRlcjo6
ZXhwYW5kKTogU3dpdGNoZWQgUm9wZUJ1aWxkZXIgdG8gYmUgYSB0aGluCisgICAgICAgIGluaXRp
YWxpemluZyB3cmFwcGVyIGFyb3VuZCBKU1N0cmluZy4gSlNTdHJpbmcgbm93IHJlcHJlc2VudHMg
cm9wZXMKKyAgICAgICAgZGlyZWN0bHksIHJhdGhlciB0aGFuIHJlbHlpbmcgb24gYW4gdW5kZXJs
eWluZyBtYWxsb2Mgb2JqZWN0LgorCisgICAgICAgIChKU0M6OkpTU3RyaW5nOjp2aXNpdENoaWxk
cmVuKTogVmlzaXQgb3VyIHJvcGUgZmliZXJzLCBzaW5jZSB0aGV5J3JlIEdDCisgICAgICAgIG9i
amVjdHMgbm93LgorCisgICAgICAgIChKU0M6OkpTU3RyaW5nOjpyZXNvbHZlUm9wZSk6CisgICAg
ICAgIChKU0M6OkpTU3RyaW5nOjpyZXNvbHZlUm9wZVNsb3dDYXNlKToKKyAgICAgICAgKEpTQzo6
SlNTdHJpbmc6Om91dE9mTWVtb3J5KTogVXBkYXRlZCBmb3Igb3BlcmF0aW5nIG9uIEpTU3RyaW5n
cyBpbnN0ZWFkCisgICAgICAgIG9mIG1hbGxvYyBvYmplY3RzLgorCisgICAgICAgIChKU0M6OkpT
U3RyaW5nOjpyZXBsYWNlQ2hhcmFjdGVyKTogUmVtb3ZlZCBvcHRpbWl6YXRpb25zIGZvciBzdWJz
dHJpbmdpbmcKKyAgICAgICAgcm9wZXMgYW5kIHJlcGxhY2luZyBzdWJzZWN0aW9ucyBvZiByb3Bl
cy4gV2Ugd2FudCB0byByZWltcGxlbWVudCB2ZXJzaW9ucworICAgICAgICBvZiB0aGVzZSBvcHRp
bWl6YXRpb25zIGluIHRoZSBmdXR1cmUsIGJ1dCB0aGlzIHBhdGNoIGFscmVhZHkgaGFzIGdvb2QK
KyAgICAgICAgcGVyZm9ybWFuY2Ugd2l0aG91dCB0aGVtLgorCisgICAgICAgICogcnVudGltZS9K
U1N0cmluZy5oOgorICAgICAgICAoSlNDOjpSb3BlQnVpbGRlcjo6SlNTdHJpbmcpOgorICAgICAg
ICAoSlNDOjpSb3BlQnVpbGRlcjo6ZmluaXNoQ3JlYXRpb24pOgorICAgICAgICAoSlNDOjpSb3Bl
QnVpbGRlcjo6Y3JlYXRlTnVsbCk6CisgICAgICAgIChKU0M6OlJvcGVCdWlsZGVyOjpjcmVhdGUp
OgorICAgICAgICAoSlNDOjpSb3BlQnVpbGRlcjo6Y3JlYXRlSGFzT3RoZXJPd25lcik6CisgICAg
ICAgIChKU0M6OmpzU2luZ2xlQ2hhcmFjdGVyU3RyaW5nKToKKyAgICAgICAgKEpTQzo6anNTaW5n
bGVDaGFyYWN0ZXJTdWJzdHJpbmcpOgorICAgICAgICAoSlNDOjpqc05vbnRyaXZpYWxTdHJpbmcp
OgorICAgICAgICAoSlNDOjpqc1N0cmluZyk6CisgICAgICAgIChKU0M6OmpzU3Vic3RyaW5nKToK
KyAgICAgICAgKEpTQzo6anNPd25lZFN0cmluZyk6IExvdHMgb2YgbWVjaGFuaWNhbCBjaGFuZ2Vz
IGhlcmUuIFRoZSB0d28gaW1wb3J0YW50CisgICAgICAgIHRoaW5ncyBhcmU6ICgxKSBUaGUgZmli
ZXJzIGluIEpTU3RyaW5nOjptX2ZpYmVycyBhcmUgSlNTdHJpbmdzIG5vdywgbm90CisgICAgICAg
IG1hbGxvYyBvYmplY3RzOyAoMikgSSBzaW1wbGlmaWVkIHRoZSBKU1N0cmluZyBjb25zdHJ1Y3Rv
ciBpbnRlcmZhY2UgdG8KKyAgICAgICAgb25seSBhY2NlcHQgUGFzc1JlZlB0cjxTdHJpbmdJbXBs
PiwgaW5zdGVhZCBvZiB2YXJpYXRpb25zIG9uIHRoYXQgbGlrZQorICAgICAgICBVU3RyaW5nLCBy
ZWR1Y2luZyByZWZjb3VudCBjaHVybi4KKworICAgICAgICAqIHJ1bnRpbWUvSlNWYWx1ZS5oOgor
ICAgICAgICAqIHJ1bnRpbWUvSlNWYWx1ZS5jcHA6CisgICAgICAgIChKU0M6OkpTVmFsdWU6OnRv
UHJpbWl0aXZlU3RyaW5nKTogVXBkYXRlZCB0aGlzIGZ1bmN0aW9uIHRvIHJldHVybiBhCisgICAg
ICAgIEpTU3RyaW5nIGluc3RlYWQgb2YgYSBVU3RyaW5nLCBzaW5jZSB0aGF0J3Mgd2hhdCBjbGll
bnRzIHdhbnQgbm93LgorCisgICAgICAgICogcnVudGltZS9PcGVyYXRpb25zLmNwcDoKKyAgICAg
ICAgKEpTQzo6anNBZGRTbG93Q2FzZSk6CisgICAgICAgICogcnVudGltZS9PcGVyYXRpb25zLmg6
CisgICAgICAgIChKU0M6OmpzU3RyaW5nKToKKyAgICAgICAgKiBydW50aW1lL1NtYWxsU3RyaW5n
cy5jcHA6CisgICAgICAgIChKU0M6OlNtYWxsU3RyaW5nczo6Y3JlYXRlRW1wdHlTdHJpbmcpOiBV
cGRhdGVkIGZvciBpbnRlcmZhY2UgY2hhbmdlcyBhYm92ZS4KKworICAgICAgICAqIHJ1bnRpbWUv
U3RyaW5nQ29uc3RydWN0b3IuY3BwOgorICAgICAgICAoSlNDOjpjb25zdHJ1Y3RXaXRoU3RyaW5n
Q29uc3RydWN0b3IpOgorICAgICAgICAqIHJ1bnRpbWUvU3RyaW5nT2JqZWN0Lmg6CisgICAgICAg
IChKU0M6OlN0cmluZ09iamVjdDo6Y3JlYXRlKTogRG9uJ3QgY3JlYXRlIGEgbmV3IEpTU3RyaW5n
IGlmIHdlIGFscmVhZHkKKyAgICAgICAgaGF2ZSBhIEpTU3RyaW5nLgorCisgICAgICAgICogcnVu
dGltZS9TdHJpbmdQcm90b3R5cGUuY3BwOgorICAgICAgICAoSlNDOjpzdHJpbmdQcm90b0Z1bmND
b25jYXQpOiBVcGRhdGVkIGZvciBpbnRlcmZhY2UgY2hhbmdlcyBhYm92ZS4KKwogMjAxMS0xMC0x
OCAgQWRhbSBCYXJ0aCAgPGFiYXJ0aEB3ZWJraXQub3JnPgogCiAgICAgICAgIEFsd2F5cyBlbmFi
bGUgRU5BQkxFKFhQQVRIKQpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2hlYXAvTWFya1N0
YWNrLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvaGVhcC9NYXJrU3Rh
Y2suY3BwCShyZXZpc2lvbiA5Nzc5MCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9oZWFwL01h
cmtTdGFjay5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEwMiw4ICsxMDIsMTAgQEAgQUxXQVlTX0lO
TElORSBzdGF0aWMgdm9pZCB2aXNpdENoaWxkcmVuKAogCiAgICAgQVNTRVJUKEhlYXA6OmlzTWFy
a2VkKGNlbGwpKTsKIAotICAgIGlmIChjZWxsLT52cHRyKCkgPT0ganNTdHJpbmdWUHRyKQorICAg
IGlmIChjZWxsLT52cHRyKCkgPT0ganNTdHJpbmdWUHRyKSB7CisgICAgICAgIEpTU3RyaW5nOjp2
aXNpdENoaWxkcmVuKGNvbnN0X2Nhc3Q8SlNDZWxsKj4oY2VsbCksIHZpc2l0b3IpOwogICAgICAg
ICByZXR1cm47CisgICAgfQogCiAgICAgaWYgKGNlbGwtPnZwdHIoKSA9PSBqc0ZpbmFsT2JqZWN0
VlB0cikgewogICAgICAgICBKU09iamVjdDo6dmlzaXRDaGlsZHJlbihjb25zdF9jYXN0PEpTQ2Vs
bCo+KGNlbGwpLCB2aXNpdG9yKTsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1l
L0pTU3RyaW5nLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGlt
ZS9KU1N0cmluZy5jcHAJKHJldmlzaW9uIDk3NzkwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3Jl
L3J1bnRpbWUvSlNTdHJpbmcuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zNiw2ICszNiwyNyBAQCBz
dGF0aWMgY29uc3QgdW5zaWduZWQgc3Vic3RyaW5nRnJvbVJvcGVDCiAKIGNvbnN0IENsYXNzSW5m
byBKU1N0cmluZzo6c19pbmZvID0geyAic3RyaW5nIiwgMCwgMCwgMCwgQ1JFQVRFX01FVEhPRF9U
QUJMRShKU1N0cmluZykgfTsKIAordm9pZCBKU1N0cmluZzo6Um9wZUJ1aWxkZXI6OmV4cGFuZCgp
Cit7CisgICAgQVNTRVJUKG1fanNTdHJpbmctPm1fZmliZXJDb3VudCA9PSBKU1N0cmluZzo6c19t
YXhJbnRlcm5hbFJvcGVMZW5ndGgpOworICAgIEpTU3RyaW5nKiBqc1N0cmluZyA9IG1fanNTdHJp
bmc7CisgICAgbV9qc1N0cmluZyA9IEpTU3RyaW5nOjpjcmVhdGVOdWxsKG1fZ2xvYmFsRGF0YSk7
CisgICAgYXBwZW5kKGpzU3RyaW5nKTsKK30KKworSlNTdHJpbmc6On5KU1N0cmluZygpCit7Cisg
ICAgQVNTRVJUKHZwdHIoKSA9PSBKU0dsb2JhbERhdGE6OmpzU3RyaW5nVlB0cik7Cit9CisKK3Zv
aWQgSlNTdHJpbmc6OnZpc2l0Q2hpbGRyZW4oSlNDZWxsKiBjZWxsLCBTbG90VmlzaXRvciYgdmlz
aXRvcikKK3sKKyAgICBKU1N0cmluZyogdGhpc09iamVjdCA9IHN0YXRpY19jYXN0PEpTU3RyaW5n
Kj4oY2VsbCk7CisgICAgQmFzZTo6dmlzaXRDaGlsZHJlbih0aGlzT2JqZWN0LCB2aXNpdG9yKTsK
KyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRoaXNPYmplY3QtPm1fZmliZXJDb3VudDsgKytp
KQorICAgICAgICB2aXNpdG9yLmFwcGVuZCgmdGhpc09iamVjdC0+bV9maWJlcnNbaV0pOworfQor
CiB2b2lkIEpTU3RyaW5nOjpyZXNvbHZlUm9wZShFeGVjU3RhdGUqIGV4ZWMpIGNvbnN0CiB7CiAg
ICAgQVNTRVJUKGlzUm9wZSgpKTsKQEAgLTQ4LDM1ICs2OSwyMSBAQCB2b2lkIEpTU3RyaW5nOjpy
ZXNvbHZlUm9wZShFeGVjU3RhdGUqIGV4CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBS
b3BlSW1wbDo6RmliZXIgY3VycmVudEZpYmVyID0gbV9maWJlcnNbMF07Ci0KLSAgICBpZiAoKG1f
ZmliZXJDb3VudCA+IDIpIHx8IChSb3BlSW1wbDo6aXNSb3BlKGN1cnJlbnRGaWJlcikpIAotICAg
ICAgICB8fCAoKG1fZmliZXJDb3VudCA9PSAyKSAmJiAoUm9wZUltcGw6OmlzUm9wZShtX2ZpYmVy
c1sxXSkpKSkgewotICAgICAgICByZXNvbHZlUm9wZVNsb3dDYXNlKGV4ZWMsIGJ1ZmZlcik7Ci0g
ICAgICAgIHJldHVybjsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1fZmliZXJDb3VudDsg
KytpKSB7CisgICAgICAgIGlmIChtX2ZpYmVyc1tpXS0+aXNSb3BlKCkpCisgICAgICAgICAgICBy
ZXR1cm4gcmVzb2x2ZVJvcGVTbG93Q2FzZShleGVjLCBidWZmZXIpOwogICAgIH0KIAogICAgIFVD
aGFyKiBwb3NpdGlvbiA9IGJ1ZmZlcjsKLSAgICBTdHJpbmdJbXBsKiBzdHJpbmcgPSBzdGF0aWNf
Y2FzdDxTdHJpbmdJbXBsKj4oY3VycmVudEZpYmVyKTsKLSAgICB1bnNpZ25lZCBsZW5ndGggPSBz
dHJpbmctPmxlbmd0aCgpOwotICAgIFN0cmluZ0ltcGw6OmNvcHlDaGFycyhwb3NpdGlvbiwgc3Ry
aW5nLT5jaGFyYWN0ZXJzKCksIGxlbmd0aCk7Ci0KLSAgICBpZiAobV9maWJlckNvdW50ID4gMSkg
ewotICAgICAgICBwb3NpdGlvbiArPSBsZW5ndGg7Ci0gICAgICAgIGN1cnJlbnRGaWJlciA9IG1f
ZmliZXJzWzFdOwotICAgICAgICBzdHJpbmcgPSBzdGF0aWNfY2FzdDxTdHJpbmdJbXBsKj4oY3Vy
cmVudEZpYmVyKTsKLSAgICAgICAgbGVuZ3RoID0gc3RyaW5nLT5sZW5ndGgoKTsKKyAgICBmb3Ig
KHNpemVfdCBpID0gMDsgaSA8IG1fZmliZXJDb3VudDsgKytpKSB7CisgICAgICAgIFN0cmluZ0lt
cGwqIHN0cmluZyA9IG1fZmliZXJzW2ldLT5tX3ZhbHVlLmltcGwoKTsKKyAgICAgICAgdW5zaWdu
ZWQgbGVuZ3RoID0gc3RyaW5nLT5sZW5ndGgoKTsKICAgICAgICAgU3RyaW5nSW1wbDo6Y29weUNo
YXJzKHBvc2l0aW9uLCBzdHJpbmctPmNoYXJhY3RlcnMoKSwgbGVuZ3RoKTsKICAgICAgICAgcG9z
aXRpb24gKz0gbGVuZ3RoOwogICAgIH0KLQogICAgIEFTU0VSVCgoYnVmZmVyICsgbV9sZW5ndGgp
ID09IHBvc2l0aW9uKTsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbV9maWJlckNvdW50
OyArK2kpIHsKLSAgICAgICAgUm9wZUltcGw6OmRlcmVmKG1fZmliZXJzW2ldKTsKLSAgICAgICAg
bV9maWJlcnNbaV0gPSAwOwotICAgIH0KLSAgICBtX2ZpYmVyQ291bnQgPSAwOwogCisgICAgbV9m
aWJlckNvdW50ID0gMDsKICAgICBBU1NFUlQoIWlzUm9wZSgpKTsKIH0KIApAQCAtOTYsNDIgKzEw
MywzMiBAQCB2b2lkIEpTU3RyaW5nOjpyZXNvbHZlUm9wZVNsb3dDYXNlKEV4ZWNTCiAKICAgICBV
Q2hhciogcG9zaXRpb24gPSBidWZmZXIgKyBtX2xlbmd0aDsKIAotICAgIC8vIFN0YXJ0IHdpdGgg
dGhlIGN1cnJlbnQgUm9wZUltcGwuCi0gICAgVmVjdG9yPFJvcGVJbXBsOjpGaWJlciwgMzI+IHdv
cmtRdWV1ZTsKLSAgICBSb3BlSW1wbDo6RmliZXIgY3VycmVudEZpYmVyOworICAgIFZlY3RvcjxK
U1N0cmluZyosIDMyPiB3b3JrUXVldWU7IC8vIFRoZXNlIHN0cmluZ3MgYXJlIGtlcHQgYWxpdmUg
YnkgdGhlIHBhcmVudCByb3BlLCBzbyB1c2luZyBhIFZlY3RvciBpcyBPSy4KKyAgICBKU1N0cmlu
ZyogY3VycmVudEZpYmVyOwogICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCAobV9maWJlckNv
dW50IC0gMSk7ICsraSkKLSAgICAgICAgd29ya1F1ZXVlLmFwcGVuZChtX2ZpYmVyc1tpXSk7Ci0g
ICAgY3VycmVudEZpYmVyID0gbV9maWJlcnNbbV9maWJlckNvdW50IC0gMV07CisgICAgICAgIHdv
cmtRdWV1ZS5hcHBlbmQobV9maWJlcnNbaV0uZ2V0KCkpOworICAgIGN1cnJlbnRGaWJlciA9IG1f
ZmliZXJzW21fZmliZXJDb3VudCAtIDFdLmdldCgpOwogICAgIHdoaWxlICh0cnVlKSB7Ci0gICAg
ICAgIGlmIChSb3BlSW1wbDo6aXNSb3BlKGN1cnJlbnRGaWJlcikpIHsKLSAgICAgICAgICAgIFJv
cGVJbXBsKiByb3BlID0gc3RhdGljX2Nhc3Q8Um9wZUltcGwqPihjdXJyZW50RmliZXIpOworICAg
ICAgICBpZiAoY3VycmVudEZpYmVyLT5pc1JvcGUoKSkgewogICAgICAgICAgICAgLy8gQ29weSB0
aGUgY29udGVudHMgb2YgdGhlIGN1cnJlbnQgcm9wZSBpbnRvIHRoZSB3b3JrUXVldWUsIHdpdGgg
dGhlIGxhc3QgaXRlbSBpbiAnY3VycmVudEZpYmVyJwogICAgICAgICAgICAgLy8gKHdlIHdpbGwg
YmUgd29ya2luZyBiYWNrd2FyZHMgb3ZlciB0aGUgcm9wZSkuCi0gICAgICAgICAgICB1bnNpZ25l
ZCBmaWJlckNvdW50TWludXNPbmUgPSByb3BlLT5maWJlckNvdW50KCkgLSAxOworICAgICAgICAg
ICAgdW5zaWduZWQgZmliZXJDb3VudE1pbnVzT25lID0gY3VycmVudEZpYmVyLT5maWJlckNvdW50
KCkgLSAxOwogICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGZpYmVyQ291bnRN
aW51c09uZTsgKytpKQotICAgICAgICAgICAgICAgIHdvcmtRdWV1ZS5hcHBlbmQocm9wZS0+Zmli
ZXJzKClbaV0pOwotICAgICAgICAgICAgY3VycmVudEZpYmVyID0gcm9wZS0+ZmliZXJzKClbZmli
ZXJDb3VudE1pbnVzT25lXTsKKyAgICAgICAgICAgICAgICB3b3JrUXVldWUuYXBwZW5kKGN1cnJl
bnRGaWJlci0+bV9maWJlcnNbaV0uZ2V0KCkpOworICAgICAgICAgICAgY3VycmVudEZpYmVyID0g
Y3VycmVudEZpYmVyLT5tX2ZpYmVyc1tmaWJlckNvdW50TWludXNPbmVdLmdldCgpOwogICAgICAg
ICB9IGVsc2UgewotICAgICAgICAgICAgU3RyaW5nSW1wbCogc3RyaW5nID0gc3RhdGljX2Nhc3Q8
U3RyaW5nSW1wbCo+KGN1cnJlbnRGaWJlcik7CisgICAgICAgICAgICBTdHJpbmdJbXBsKiBzdHJp
bmcgPSBzdGF0aWNfY2FzdDxTdHJpbmdJbXBsKj4oY3VycmVudEZpYmVyLT5tX3ZhbHVlLmltcGwo
KSk7CiAgICAgICAgICAgICB1bnNpZ25lZCBsZW5ndGggPSBzdHJpbmctPmxlbmd0aCgpOwogICAg
ICAgICAgICAgcG9zaXRpb24gLT0gbGVuZ3RoOwogICAgICAgICAgICAgU3RyaW5nSW1wbDo6Y29w
eUNoYXJzKHBvc2l0aW9uLCBzdHJpbmctPmNoYXJhY3RlcnMoKSwgbGVuZ3RoKTsKIAotICAgICAg
ICAgICAgLy8gV2FzIHRoaXMgdGhlIGxhc3QgaXRlbSBpbiB0aGUgd29yayBxdWV1ZT8KICAgICAg
ICAgICAgIGlmICh3b3JrUXVldWUuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gQ3Jl
YXRlIGEgc3RyaW5nIGZyb20gdGhlIFVDaGFyIGJ1ZmZlciwgY2xlYXIgdGhlIHJvcGUgUmVmUHRy
LgotICAgICAgICAgICAgICAgIEFTU0VSVChidWZmZXIgPT0gcG9zaXRpb24pOwotICAgICAgICAg
ICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBtX2ZpYmVyQ291bnQ7ICsraSkgewotICAg
ICAgICAgICAgICAgICAgICBSb3BlSW1wbDo6ZGVyZWYobV9maWJlcnNbaV0pOwotICAgICAgICAg
ICAgICAgICAgICBtX2ZpYmVyc1tpXSA9IDA7Ci0gICAgICAgICAgICAgICAgfQogICAgICAgICAg
ICAgICAgIG1fZmliZXJDb3VudCA9IDA7Ci0gICAgICAgICAgICAgICAgCisgICAgICAgICAgICAg
ICAgQVNTRVJUKGJ1ZmZlciA9PSBwb3NpdGlvbik7CiAgICAgICAgICAgICAgICAgQVNTRVJUKCFp
c1JvcGUoKSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogCi0gICAg
ICAgICAgICAvLyBObyEgLSBzZXQgdGhlIG5leHQgaXRlbSB1cCB0byBwcm9jZXNzLgogICAgICAg
ICAgICAgY3VycmVudEZpYmVyID0gd29ya1F1ZXVlLmxhc3QoKTsKICAgICAgICAgICAgIHdvcmtR
dWV1ZS5yZW1vdmVMYXN0KCk7CiAgICAgICAgIH0KQEAgLTE0MCwxMCArMTM3LDYgQEAgdm9pZCBK
U1N0cmluZzo6cmVzb2x2ZVJvcGVTbG93Q2FzZShFeGVjUwogCiB2b2lkIEpTU3RyaW5nOjpvdXRP
Zk1lbW9yeShFeGVjU3RhdGUqIGV4ZWMpIGNvbnN0CiB7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0g
MDsgaSA8IG1fZmliZXJDb3VudDsgKytpKSB7Ci0gICAgICAgIFJvcGVJbXBsOjpkZXJlZihtX2Zp
YmVyc1tpXSk7Ci0gICAgICAgIG1fZmliZXJzW2ldID0gMDsKLSAgICB9CiAgICAgbV9maWJlckNv
dW50ID0gMDsKICAgICBBU1NFUlQoIWlzUm9wZSgpKTsKICAgICBBU1NFUlQobV92YWx1ZSA9PSBV
U3RyaW5nKCkpOwpAQCAtMTUxLDExMCArMTQ0LDEyIEBAIHZvaWQgSlNTdHJpbmc6Om91dE9mTWVt
b3J5KEV4ZWNTdGF0ZSogZXgKICAgICAgICAgdGhyb3dPdXRPZk1lbW9yeUVycm9yKGV4ZWMpOwog
fQogCi0vLyBUaGlzIGZ1bmN0aW9uIGNvbnN0cnVzdHMgYSBzdWJzdHJpbmcgb3V0IG9mIGEgcm9w
ZSB3aXRob3V0IGZsYXR0ZW5pbmcgYnkgcmV1c2luZyB0aGUgZXhpc3RpbmcgZmliZXJzLgotLy8g
VGhpcyBjYW4gcmVkdWNlIG1lbW9yeSB1c2FnZSBzdWJzdGFudGlhbGx5LiBTaW5jZSB0cmF2ZXJz
aW5nIHJvcGVzIGlzIHNsb3cgdGhlIGZ1bmN0aW9uIHdpbGwgcmV2ZXJ0IAotLy8gYmFjayB0byBm
bGF0dGVuaW5nIGlmIHRoZSByb3BlIHR1cm5zIG91dCB0byBiZSBsb25nLgotSlNTdHJpbmcqIEpT
U3RyaW5nOjpzdWJzdHJpbmdGcm9tUm9wZShFeGVjU3RhdGUqIGV4ZWMsIHVuc2lnbmVkIHN1YnN0
cmluZ1N0YXJ0LCB1bnNpZ25lZCBzdWJzdHJpbmdMZW5ndGgpCi17Ci0gICAgQVNTRVJUKGlzUm9w
ZSgpKTsKLSAgICBBU1NFUlQoc3Vic3RyaW5nTGVuZ3RoKTsKLSAgICAKLSAgICBKU0dsb2JhbERh
dGEqIGdsb2JhbERhdGEgPSAmZXhlYy0+Z2xvYmFsRGF0YSgpOwotCi0gICAgVVN0cmluZyBzdWJz
dHJpbmdGaWJlcnNbM107Ci0gICAgCi0gICAgdW5zaWduZWQgZmliZXJDb3VudCA9IDA7Ci0gICAg
dW5zaWduZWQgc3Vic3RyaW5nRmliZXJDb3VudCA9IDA7Ci0gICAgdW5zaWduZWQgc3Vic3RyaW5n
RW5kID0gc3Vic3RyaW5nU3RhcnQgKyBzdWJzdHJpbmdMZW5ndGg7Ci0gICAgdW5zaWduZWQgZmli
ZXJFbmQgPSAwOwotCi0gICAgUm9wZUl0ZXJhdG9yIGVuZDsKLSAgICBmb3IgKFJvcGVJdGVyYXRv
ciBpdChtX2ZpYmVycy5kYXRhKCksIG1fZmliZXJDb3VudCk7IGl0ICE9IGVuZDsgKytpdCkgewot
ICAgICAgICArK2ZpYmVyQ291bnQ7Ci0gICAgICAgIFN0cmluZ0ltcGwqIGZpYmVyU3RyaW5nID0g
Kml0OwotICAgICAgICB1bnNpZ25lZCBmaWJlclN0YXJ0ID0gZmliZXJFbmQ7Ci0gICAgICAgIGZp
YmVyRW5kID0gZmliZXJTdGFydCArIGZpYmVyU3RyaW5nLT5sZW5ndGgoKTsKLSAgICAgICAgaWYg
KGZpYmVyRW5kIDw9IHN1YnN0cmluZ1N0YXJ0KQotICAgICAgICAgICAgY29udGludWU7Ci0gICAg
ICAgIHVuc2lnbmVkIGNvcHlTdGFydCA9IHN0ZDo6bWF4KHN1YnN0cmluZ1N0YXJ0LCBmaWJlclN0
YXJ0KTsKLSAgICAgICAgdW5zaWduZWQgY29weUVuZCA9IHN0ZDo6bWluKHN1YnN0cmluZ0VuZCwg
ZmliZXJFbmQpOwotICAgICAgICBpZiAoY29weVN0YXJ0ID09IGZpYmVyU3RhcnQgJiYgY29weUVu
ZCA9PSBmaWJlckVuZCkKLSAgICAgICAgICAgIHN1YnN0cmluZ0ZpYmVyc1tzdWJzdHJpbmdGaWJl
ckNvdW50KytdID0gVVN0cmluZyhmaWJlclN0cmluZyk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAg
ICAgIHN1YnN0cmluZ0ZpYmVyc1tzdWJzdHJpbmdGaWJlckNvdW50KytdID0gVVN0cmluZyhTdHJp
bmdJbXBsOjpjcmVhdGUoZmliZXJTdHJpbmcsIGNvcHlTdGFydCAtIGZpYmVyU3RhcnQsIGNvcHlF
bmQgLSBjb3B5U3RhcnQpKTsKLSAgICAgICAgaWYgKGZpYmVyRW5kID49IHN1YnN0cmluZ0VuZCkK
LSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBpZiAoZmliZXJDb3VudCA+IHN1YnN0cmluZ0Zy
b21Sb3BlQ3V0b2ZmIHx8IHN1YnN0cmluZ0ZpYmVyQ291bnQgPj0gMykgewotICAgICAgICAgICAg
Ly8gVGhpcyB0dXJuZWQgb3V0IHRvIGJlIGEgcmVhbGx5IGluZWZmaWNpZW50IHJvcGUuIEp1c3Qg
ZmxhdHRlbiBpdC4KLSAgICAgICAgICAgIHJlc29sdmVSb3BlKGV4ZWMpOwotICAgICAgICAgICAg
cmV0dXJuIGpzU3Vic3RyaW5nKCZleGVjLT5nbG9iYWxEYXRhKCksIG1fdmFsdWUsIHN1YnN0cmlu
Z1N0YXJ0LCBzdWJzdHJpbmdMZW5ndGgpOwotICAgICAgICB9Ci0gICAgfQotICAgIEFTU0VSVChz
dWJzdHJpbmdGaWJlckNvdW50ICYmIHN1YnN0cmluZ0ZpYmVyQ291bnQgPD0gMyk7Ci0KLSAgICBp
ZiAoc3Vic3RyaW5nTGVuZ3RoID09IDEpIHsKLSAgICAgICAgQVNTRVJUKHN1YnN0cmluZ0ZpYmVy
Q291bnQgPT0gMSk7Ci0gICAgICAgIFVDaGFyIGMgPSBzdWJzdHJpbmdGaWJlcnNbMF1bMF07Ci0g
ICAgICAgIGlmIChjIDw9IG1heFNpbmdsZUNoYXJhY3RlclN0cmluZykKLSAgICAgICAgICAgIHJl
dHVybiBnbG9iYWxEYXRhLT5zbWFsbFN0cmluZ3Muc2luZ2xlQ2hhcmFjdGVyU3RyaW5nKGdsb2Jh
bERhdGEsIGMpOwotICAgIH0KLSAgICBpZiAoc3Vic3RyaW5nRmliZXJDb3VudCA9PSAxKQotICAg
ICAgICByZXR1cm4gSlNTdHJpbmc6OmNyZWF0ZSgqZ2xvYmFsRGF0YSwgc3Vic3RyaW5nRmliZXJz
WzBdKTsKLSAgICBpZiAoc3Vic3RyaW5nRmliZXJDb3VudCA9PSAyKQotICAgICAgICByZXR1cm4g
SlNTdHJpbmc6OmNyZWF0ZSgqZ2xvYmFsRGF0YSwgc3Vic3RyaW5nRmliZXJzWzBdLCBzdWJzdHJp
bmdGaWJlcnNbMV0pOwotICAgIHJldHVybiBKU1N0cmluZzo6Y3JlYXRlKCpnbG9iYWxEYXRhLCBz
dWJzdHJpbmdGaWJlcnNbMF0sIHN1YnN0cmluZ0ZpYmVyc1sxXSwgc3Vic3RyaW5nRmliZXJzWzJd
KTsKLX0KLQogSlNWYWx1ZSBKU1N0cmluZzo6cmVwbGFjZUNoYXJhY3RlcihFeGVjU3RhdGUqIGV4
ZWMsIFVDaGFyIGNoYXJhY3RlciwgY29uc3QgVVN0cmluZyYgcmVwbGFjZW1lbnQpCiB7Ci0gICAg
aWYgKCFpc1JvcGUoKSkgewotICAgICAgICBzaXplX3QgbWF0Y2hQb3NpdGlvbiA9IG1fdmFsdWUu
ZmluZChjaGFyYWN0ZXIpOwotICAgICAgICBpZiAobWF0Y2hQb3NpdGlvbiA9PSBub3RGb3VuZCkK
LSAgICAgICAgICAgIHJldHVybiBKU1ZhbHVlKHRoaXMpOwotICAgICAgICByZXR1cm4ganNTdHJp
bmcoZXhlYywgbV92YWx1ZS5zdWJzdHJpbmdTaGFyaW5nSW1wbCgwLCBtYXRjaFBvc2l0aW9uKSwg
cmVwbGFjZW1lbnQsIG1fdmFsdWUuc3Vic3RyaW5nU2hhcmluZ0ltcGwobWF0Y2hQb3NpdGlvbiAr
IDEpKTsKLSAgICB9Ci0KLSAgICBSb3BlSXRlcmF0b3IgZW5kOwotICAgIAotICAgIC8vIENvdW50
IHRvdGFsIGZpYmVycyBhbmQgZmluZCBtYXRjaGluZyBzdHJpbmcuCi0gICAgc2l6ZV90IGZpYmVy
Q291bnQgPSAwOwotICAgIFN0cmluZ0ltcGwqIG1hdGNoU3RyaW5nID0gMDsKLSAgICBzaXplX3Qg
bWF0Y2hQb3NpdGlvbiA9IG5vdEZvdW5kOwotICAgIGZvciAoUm9wZUl0ZXJhdG9yIGl0KG1fZmli
ZXJzLmRhdGEoKSwgbV9maWJlckNvdW50KTsgaXQgIT0gZW5kOyArK2l0KSB7Ci0gICAgICAgICsr
ZmliZXJDb3VudDsKLSAgICAgICAgaWYgKG1hdGNoU3RyaW5nKQotICAgICAgICAgICAgY29udGlu
dWU7Ci0KLSAgICAgICAgU3RyaW5nSW1wbCogc3RyaW5nID0gKml0OwotICAgICAgICBtYXRjaFBv
c2l0aW9uID0gc3RyaW5nLT5maW5kKGNoYXJhY3Rlcik7Ci0gICAgICAgIGlmIChtYXRjaFBvc2l0
aW9uID09IG5vdEZvdW5kKQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIG1hdGNoU3Ry
aW5nID0gc3RyaW5nOwotICAgIH0KLQotICAgIGlmICghbWF0Y2hTdHJpbmcpCi0gICAgICAgIHJl
dHVybiB0aGlzOwotCi0gICAgUm9wZUJ1aWxkZXIgYnVpbGRlcihyZXBsYWNlbWVudC5sZW5ndGgo
KSA/IGZpYmVyQ291bnQgKyAyIDogZmliZXJDb3VudCArIDEpOwotICAgIGlmIChVTkxJS0VMWShi
dWlsZGVyLmlzT3V0T2ZNZW1vcnkoKSkpCi0gICAgICAgIHJldHVybiB0aHJvd091dE9mTWVtb3J5
RXJyb3IoZXhlYyk7Ci0KLSAgICBmb3IgKFJvcGVJdGVyYXRvciBpdChtX2ZpYmVycy5kYXRhKCks
IG1fZmliZXJDb3VudCk7IGl0ICE9IGVuZDsgKytpdCkgewotICAgICAgICBTdHJpbmdJbXBsKiBz
dHJpbmcgPSAqaXQ7Ci0gICAgICAgIGlmIChzdHJpbmcgIT0gbWF0Y2hTdHJpbmcpIHsKLSAgICAg
ICAgICAgIGJ1aWxkZXIuYXBwZW5kKFVTdHJpbmcoc3RyaW5nKSk7Ci0gICAgICAgICAgICBjb250
aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKFVTdHJpbmcoc3RyaW5n
KS5zdWJzdHJpbmdTaGFyaW5nSW1wbCgwLCBtYXRjaFBvc2l0aW9uKSk7Ci0gICAgICAgIGlmIChy
ZXBsYWNlbWVudC5sZW5ndGgoKSkKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKHJlcGxhY2Vt
ZW50KTsKLSAgICAgICAgYnVpbGRlci5hcHBlbmQoVVN0cmluZyhzdHJpbmcpLnN1YnN0cmluZ1No
YXJpbmdJbXBsKG1hdGNoUG9zaXRpb24gKyAxKSk7Ci0gICAgICAgIG1hdGNoU3RyaW5nID0gMDsK
LSAgICB9Ci0KLSAgICBKU0dsb2JhbERhdGEqIGdsb2JhbERhdGEgPSAmZXhlYy0+Z2xvYmFsRGF0
YSgpOwotICAgIHJldHVybiBKU1ZhbHVlKEpTU3RyaW5nOjpjcmVhdGUoKmdsb2JhbERhdGEsIGJ1
aWxkZXIucmVsZWFzZSgpKSk7CisgICAgc2l6ZV90IG1hdGNoUG9zaXRpb24gPSB2YWx1ZShleGVj
KS5maW5kKGNoYXJhY3Rlcik7CisgICAgaWYgKG1hdGNoUG9zaXRpb24gPT0gbm90Rm91bmQpCisg
ICAgICAgIHJldHVybiBKU1ZhbHVlKHRoaXMpOworICAgIHJldHVybiBqc1N0cmluZyhleGVjLCBt
X3ZhbHVlLnN1YnN0cmluZ1NoYXJpbmdJbXBsKDAsIG1hdGNoUG9zaXRpb24pLCByZXBsYWNlbWVu
dCwgdmFsdWUoZXhlYykuc3Vic3RyaW5nU2hhcmluZ0ltcGwobWF0Y2hQb3NpdGlvbiArIDEpKTsK
IH0KIAogSlNTdHJpbmcqIEpTU3RyaW5nOjpnZXRJbmRleFNsb3dDYXNlKEV4ZWNTdGF0ZSogZXhl
YywgdW5zaWduZWQgaSkKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0pTU3Ry
aW5nLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvSlNTdHJp
bmcuaAkocmV2aXNpb24gOTc3OTApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9K
U1N0cmluZy5oCSh3b3JraW5nIGNvcHkpCkBAIC03MCwzNDcgKzcwLDEzMCBAQCBuYW1lc3BhY2Ug
SlNDIHsKIAogICAgICAgICBjbGFzcyBSb3BlQnVpbGRlciB7CiAgICAgICAgIHB1YmxpYzoKLSAg
ICAgICAgICAgIFJvcGVCdWlsZGVyKHVuc2lnbmVkIGZpYmVyQ291bnQpCi0gICAgICAgICAgICAg
ICAgOiBtX2luZGV4KDApCi0gICAgICAgICAgICAgICAgLCBtX3JvcGUoUm9wZUltcGw6OnRyeUNy
ZWF0ZVVuaW5pdGlhbGl6ZWQoZmliZXJDb3VudCkpCisgICAgICAgICAgICBSb3BlQnVpbGRlcihK
U0dsb2JhbERhdGEmIGdsb2JhbERhdGEpCisgICAgICAgICAgICAgICAgOiBtX2dsb2JhbERhdGEo
Z2xvYmFsRGF0YSkKKyAgICAgICAgICAgICAgICAsIG1fanNTdHJpbmcoSlNTdHJpbmc6OmNyZWF0
ZU51bGwoZ2xvYmFsRGF0YSkpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICB9CiAKLSAgICAg
ICAgICAgIGJvb2wgaXNPdXRPZk1lbW9yeSgpIHsgcmV0dXJuICFtX3JvcGU7IH0KLQotICAgICAg
ICAgICAgdm9pZCBhcHBlbmQoUm9wZUltcGw6OkZpYmVyJiBmaWJlcikKLSAgICAgICAgICAgIHsK
LSAgICAgICAgICAgICAgICBBU1NFUlQobV9yb3BlKTsKLSAgICAgICAgICAgICAgICBtX3JvcGUt
PmluaXRpYWxpemVGaWJlcihtX2luZGV4LCBmaWJlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAg
ICAgICB2b2lkIGFwcGVuZChjb25zdCBVU3RyaW5nJiBzdHJpbmcpCi0gICAgICAgICAgICB7Ci0g
ICAgICAgICAgICAgICAgQVNTRVJUKG1fcm9wZSk7Ci0gICAgICAgICAgICAgICAgbV9yb3BlLT5p
bml0aWFsaXplRmliZXIobV9pbmRleCwgc3RyaW5nLmltcGwoKSk7Ci0gICAgICAgICAgICB9CiAg
ICAgICAgICAgICB2b2lkIGFwcGVuZChKU1N0cmluZyoganNTdHJpbmcpCiAgICAgICAgICAgICB7
Ci0gICAgICAgICAgICAgICAgaWYgKGpzU3RyaW5nLT5pc1JvcGUoKSkgewotICAgICAgICAgICAg
ICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwganNTdHJpbmctPm1fZmliZXJDb3VudDsg
KytpKQotICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kKGpzU3RyaW5nLT5tX2ZpYmVyc1tp
XSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGFwcGVuZChq
c1N0cmluZy0+c3RyaW5nKCkpOworICAgICAgICAgICAgICAgIGlmIChtX2pzU3RyaW5nLT5tX2Zp
YmVyQ291bnQgPT0gSlNTdHJpbmc6OnNfbWF4SW50ZXJuYWxSb3BlTGVuZ3RoKQorICAgICAgICAg
ICAgICAgICAgICBleHBhbmQoKTsKKyAgICAgICAgICAgICAgICBtX2pzU3RyaW5nLT5tX2ZpYmVy
c1ttX2pzU3RyaW5nLT5tX2ZpYmVyQ291bnRdLnNldChtX2dsb2JhbERhdGEsIG1fanNTdHJpbmcs
IGpzU3RyaW5nKTsKKyAgICAgICAgICAgICAgICBtX2pzU3RyaW5nLT5tX2ZpYmVyQ291bnQgKz0g
MTsKKyAgICAgICAgICAgICAgICBtX2pzU3RyaW5nLT5tX2xlbmd0aCArPSBqc1N0cmluZy0+bV9s
ZW5ndGg7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIFBhc3NSZWZQdHI8Um9wZUltcGw+
IHJlbGVhc2UoKQorICAgICAgICAgICAgSlNTdHJpbmcqIHJlbGVhc2UoKQogICAgICAgICAgICAg
ewotICAgICAgICAgICAgICAgIEFTU0VSVChtX2luZGV4ID09IG1fcm9wZS0+ZmliZXJDb3VudCgp
KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbV9yb3BlLnJlbGVhc2UoKTsKKyAgICAgICAgICAg
ICAgICBKU1N0cmluZyogdG1wID0gbV9qc1N0cmluZzsKKyAgICAgICAgICAgICAgICBtX2pzU3Ry
aW5nID0gMDsKKyAgICAgICAgICAgICAgICByZXR1cm4gdG1wOwogICAgICAgICAgICAgfQogCi0g
ICAgICAgICAgICB1bnNpZ25lZCBsZW5ndGgoKSB7IHJldHVybiBtX3JvcGUtPmxlbmd0aCgpOyB9
CisgICAgICAgICAgICB1bnNpZ25lZCBsZW5ndGgoKSB7IHJldHVybiBtX2pzU3RyaW5nLT5tX2xl
bmd0aDsgfQogCiAgICAgICAgIHByaXZhdGU6Ci0gICAgICAgICAgICB1bnNpZ25lZCBtX2luZGV4
OwotICAgICAgICAgICAgUmVmUHRyPFJvcGVJbXBsPiBtX3JvcGU7Ci0gICAgICAgIH07Ci0KLSAg
ICAgICAgY2xhc3MgUm9wZUl0ZXJhdG9yIHsKLSAgICAgICAgICAgIHB1YmxpYzoKLSAgICAgICAg
ICAgICAgICBSb3BlSXRlcmF0b3IoKSB7IH0KLQotICAgICAgICAgICAgICAgIFJvcGVJdGVyYXRv
cihSb3BlSW1wbDo6RmliZXIqIGZpYmVycywgc2l6ZV90IGZpYmVyQ291bnQpCi0gICAgICAgICAg
ICAgICAgewotICAgICAgICAgICAgICAgICAgICBBU1NFUlQoZmliZXJDb3VudCk7Ci0gICAgICAg
ICAgICAgICAgICAgIG1fd29ya1F1ZXVlLmFwcGVuZChXb3JrSXRlbShmaWJlcnMsIGZpYmVyQ291
bnQpKTsKLSAgICAgICAgICAgICAgICAgICAgc2tpcFJvcGVzKCk7Ci0gICAgICAgICAgICAgICAg
fQotCi0gICAgICAgICAgICAgICAgUm9wZUl0ZXJhdG9yJiBvcGVyYXRvcisrKCkKLSAgICAgICAg
ICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFdvcmtJdGVtJiBpdGVtID0gbV93b3JrUXVl
dWUubGFzdCgpOwotICAgICAgICAgICAgICAgICAgICBBU1NFUlQoIVJvcGVJbXBsOjppc1JvcGUo
aXRlbS5maWJlcnNbaXRlbS5pXSkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoKytpdGVtLmkg
PT0gaXRlbS5maWJlckNvdW50KQotICAgICAgICAgICAgICAgICAgICAgICAgbV93b3JrUXVldWUu
cmVtb3ZlTGFzdCgpOwotICAgICAgICAgICAgICAgICAgICBza2lwUm9wZXMoKTsKLSAgICAgICAg
ICAgICAgICAgICAgcmV0dXJuICp0aGlzOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAg
ICAgICAgIFN0cmluZ0ltcGwqIG9wZXJhdG9yKigpCi0gICAgICAgICAgICAgICAgewotICAgICAg
ICAgICAgICAgICAgICBXb3JrSXRlbSYgaXRlbSA9IG1fd29ya1F1ZXVlLmxhc3QoKTsKLSAgICAg
ICAgICAgICAgICAgICAgUm9wZUltcGw6OkZpYmVyIGZpYmVyID0gaXRlbS5maWJlcnNbaXRlbS5p
XTsKLSAgICAgICAgICAgICAgICAgICAgQVNTRVJUKCFSb3BlSW1wbDo6aXNSb3BlKGZpYmVyKSk7
Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxTdHJpbmdJbXBsKj4oZmli
ZXIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGJvb2wgb3BlcmF0b3Ih
PShjb25zdCBSb3BlSXRlcmF0b3ImIG90aGVyKSBjb25zdAotICAgICAgICAgICAgICAgIHsKLSAg
ICAgICAgICAgICAgICAgICAgcmV0dXJuIG1fd29ya1F1ZXVlICE9IG90aGVyLm1fd29ya1F1ZXVl
OwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJpdmF0ZToKLSAgICAgICAgICAg
ICAgICBzdHJ1Y3QgV29ya0l0ZW0gewotICAgICAgICAgICAgICAgICAgICBXb3JrSXRlbShSb3Bl
SW1wbDo6RmliZXIqIGZpYmVycywgc2l6ZV90IGZpYmVyQ291bnQpCi0gICAgICAgICAgICAgICAg
ICAgICAgICA6IGZpYmVycyhmaWJlcnMpCi0gICAgICAgICAgICAgICAgICAgICAgICAsIGZpYmVy
Q291bnQoZmliZXJDb3VudCkKLSAgICAgICAgICAgICAgICAgICAgICAgICwgaSgwKQotICAgICAg
ICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAg
ICAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgV29ya0l0ZW0mIG90aGVyKSBjb25zdAotICAgICAg
ICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmliZXJzICE9
IG90aGVyLmZpYmVycyB8fCBmaWJlckNvdW50ICE9IG90aGVyLmZpYmVyQ291bnQgfHwgaSAhPSBv
dGhlci5pOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgUm9w
ZUltcGw6OkZpYmVyKiBmaWJlcnM7Ci0gICAgICAgICAgICAgICAgICAgIHNpemVfdCBmaWJlckNv
dW50OwotICAgICAgICAgICAgICAgICAgICBzaXplX3QgaTsKLSAgICAgICAgICAgICAgICB9Owot
Ci0gICAgICAgICAgICAgICAgdm9pZCBza2lwUm9wZXMoKQotICAgICAgICAgICAgICAgIHsKLSAg
ICAgICAgICAgICAgICAgICAgaWYgKG1fd29ya1F1ZXVlLmlzRW1wdHkoKSkKLSAgICAgICAgICAg
ICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoMSkgewot
ICAgICAgICAgICAgICAgICAgICAgICAgV29ya0l0ZW0mIGl0ZW0gPSBtX3dvcmtRdWV1ZS5sYXN0
KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBSb3BlSW1wbDo6RmliZXIgZmliZXIgPSBpdGVt
LmZpYmVyc1tpdGVtLmldOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFSb3BlSW1wbDo6
aXNSb3BlKGZpYmVyKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAg
ICAgICAgICAgICAgICAgICAgIFJvcGVJbXBsKiByb3BlID0gc3RhdGljX2Nhc3Q8Um9wZUltcGwq
PihmaWJlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKytpdGVtLmkgPT0gaXRlbS5m
aWJlckNvdW50KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fd29ya1F1ZXVlLnJlbW92
ZUxhc3QoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fd29ya1F1ZXVlLmFwcGVuZChXb3Jr
SXRlbShyb3BlLT5maWJlcnMoKSwgcm9wZS0+ZmliZXJDb3VudCgpKSk7Ci0gICAgICAgICAgICAg
ICAgICAgIH0KLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB2b2lkIGV4cGFuZCgpOwog
Ci0gICAgICAgICAgICAgICAgVmVjdG9yPFdvcmtJdGVtLCAxNj4gbV93b3JrUXVldWU7CisgICAg
ICAgICAgICBKU0dsb2JhbERhdGEmIG1fZ2xvYmFsRGF0YTsKKyAgICAgICAgICAgIEpTU3RyaW5n
KiBtX2pzU3RyaW5nOwogICAgICAgICB9OwotICAgICAgICAKKwogICAgIHByaXZhdGU6Ci0gICAg
ICAgIEFMV0FZU19JTkxJTkUgSlNTdHJpbmcoSlNHbG9iYWxEYXRhJiBnbG9iYWxEYXRhLCBjb25z
dCBVU3RyaW5nJiB2YWx1ZSkKKyAgICAgICAgSlNTdHJpbmcoSlNHbG9iYWxEYXRhJiBnbG9iYWxE
YXRhLCBQYXNzUmVmUHRyPFN0cmluZ0ltcGw+IHZhbHVlKQogICAgICAgICAgICAgOiBKU0NlbGwo
Z2xvYmFsRGF0YSwgZ2xvYmFsRGF0YS5zdHJpbmdTdHJ1Y3R1cmUuZ2V0KCkpCi0gICAgICAgICAg
ICAsIG1fbGVuZ3RoKHZhbHVlLmxlbmd0aCgpKQogICAgICAgICAgICAgLCBtX3ZhbHVlKHZhbHVl
KQogICAgICAgICAgICAgLCBtX2ZpYmVyQ291bnQoMCkKICAgICAgICAgewogICAgICAgICB9CiAK
LSAgICAgICAgZW51bSBIYXNPdGhlck93bmVyVHlwZSB7IEhhc090aGVyT3duZXIgfTsKLSAgICAg
ICAgSlNTdHJpbmcoSlNHbG9iYWxEYXRhJiBnbG9iYWxEYXRhLCBjb25zdCBVU3RyaW5nJiB2YWx1
ZSwgSGFzT3RoZXJPd25lclR5cGUpCisgICAgICAgIEpTU3RyaW5nKEpTR2xvYmFsRGF0YSYgZ2xv
YmFsRGF0YSkKICAgICAgICAgICAgIDogSlNDZWxsKGdsb2JhbERhdGEsIGdsb2JhbERhdGEuc3Ry
aW5nU3RydWN0dXJlLmdldCgpKQotICAgICAgICAgICAgLCBtX2xlbmd0aCh2YWx1ZS5sZW5ndGgo
KSkKLSAgICAgICAgICAgICwgbV92YWx1ZSh2YWx1ZSkKICAgICAgICAgICAgICwgbV9maWJlckNv
dW50KDApCiAgICAgICAgIHsKICAgICAgICAgfQotICAgICAgICBKU1N0cmluZyhKU0dsb2JhbERh
dGEmIGdsb2JhbERhdGEsIFBhc3NSZWZQdHI8U3RyaW5nSW1wbD4gdmFsdWUsIEhhc090aGVyT3du
ZXJUeXBlKQotICAgICAgICAgICAgOiBKU0NlbGwoZ2xvYmFsRGF0YSwgZ2xvYmFsRGF0YS5zdHJp
bmdTdHJ1Y3R1cmUuZ2V0KCkpCi0gICAgICAgICAgICAsIG1fbGVuZ3RoKHZhbHVlLT5sZW5ndGgo
KSkKLSAgICAgICAgICAgICwgbV92YWx1ZSh2YWx1ZSkKLSAgICAgICAgICAgICwgbV9maWJlckNv
dW50KDApCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgICAgICBKU1N0cmluZyhKU0dsb2JhbERh
dGEmIGdsb2JhbERhdGEsIFBhc3NSZWZQdHI8Um9wZUltcGw+IHJvcGUpCi0gICAgICAgICAgICA6
IEpTQ2VsbChnbG9iYWxEYXRhLCBnbG9iYWxEYXRhLnN0cmluZ1N0cnVjdHVyZS5nZXQoKSkKLSAg
ICAgICAgICAgICwgbV9sZW5ndGgocm9wZS0+bGVuZ3RoKCkpCi0gICAgICAgICAgICAsIG1fZmli
ZXJDb3VudCgxKQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gVGhpcyBjb25zdHJ1
Y3RvciBjb25zdHJ1Y3RzIGEgbmV3IHN0cmluZyBieSBjb25jYXRlbmF0aW5nIHMxICYgczIuCi0g
ICAgICAgIC8vIFRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIHdpdGggZmliZXJDb3VudCA8PSAz
LgotICAgICAgICBKU1N0cmluZyhKU0dsb2JhbERhdGEmIGdsb2JhbERhdGEsIHVuc2lnbmVkIGZp
YmVyQ291bnQsIEpTU3RyaW5nKiBzMSwgSlNTdHJpbmcqIHMyKQotICAgICAgICAgICAgOiBKU0Nl
bGwoZ2xvYmFsRGF0YSwgZ2xvYmFsRGF0YS5zdHJpbmdTdHJ1Y3R1cmUuZ2V0KCkpCi0gICAgICAg
ICAgICAsIG1fbGVuZ3RoKHMxLT5sZW5ndGgoKSArIHMyLT5sZW5ndGgoKSkKLSAgICAgICAgICAg
ICwgbV9maWJlckNvdW50KGZpYmVyQ291bnQpCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgICAg
ICAvLyBUaGlzIGNvbnN0cnVjdG9yIGNvbnN0cnVjdHMgYSBuZXcgc3RyaW5nIGJ5IGNvbmNhdGVu
YXRpbmcgczEgJiBzMi4KLSAgICAgICAgLy8gVGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgd2l0
aCBmaWJlckNvdW50IDw9IDMuCi0gICAgICAgIEpTU3RyaW5nKEpTR2xvYmFsRGF0YSYgZ2xvYmFs
RGF0YSwgdW5zaWduZWQgZmliZXJDb3VudCwgSlNTdHJpbmcqIHMxLCBjb25zdCBVU3RyaW5nJiB1
MikKLSAgICAgICAgICAgIDogSlNDZWxsKGdsb2JhbERhdGEsIGdsb2JhbERhdGEuc3RyaW5nU3Ry
dWN0dXJlLmdldCgpKQotICAgICAgICAgICAgLCBtX2xlbmd0aChzMS0+bGVuZ3RoKCkgKyB1Mi5s
ZW5ndGgoKSkKLSAgICAgICAgICAgICwgbV9maWJlckNvdW50KGZpYmVyQ291bnQpCi0gICAgICAg
IHsKLSAgICAgICAgfQotICAgICAgICAvLyBUaGlzIGNvbnN0cnVjdG9yIGNvbnN0cnVjdHMgYSBu
ZXcgc3RyaW5nIGJ5IGNvbmNhdGVuYXRpbmcgczEgJiBzMi4KLSAgICAgICAgLy8gVGhpcyBzaG91
bGQgb25seSBiZSBjYWxsZWQgd2l0aCBmaWJlckNvdW50IDw9IDMuCi0gICAgICAgIEpTU3RyaW5n
KEpTR2xvYmFsRGF0YSYgZ2xvYmFsRGF0YSwgdW5zaWduZWQgZmliZXJDb3VudCwgY29uc3QgVVN0
cmluZyYgdTEsIEpTU3RyaW5nKiBzMikKLSAgICAgICAgICAgIDogSlNDZWxsKGdsb2JhbERhdGEs
IGdsb2JhbERhdGEuc3RyaW5nU3RydWN0dXJlLmdldCgpKQotICAgICAgICAgICAgLCBtX2xlbmd0
aCh1MS5sZW5ndGgoKSArIHMyLT5sZW5ndGgoKSkKLSAgICAgICAgICAgICwgbV9maWJlckNvdW50
KGZpYmVyQ291bnQpCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgICAgICBKU1N0cmluZyhFeGVj
U3RhdGUqIGV4ZWMpCi0gICAgICAgICAgICA6IEpTQ2VsbChleGVjLT5nbG9iYWxEYXRhKCksIGV4
ZWMtPmdsb2JhbERhdGEoKS5zdHJpbmdTdHJ1Y3R1cmUuZ2V0KCkpCi0gICAgICAgICAgICAsIG1f
bGVuZ3RoKDApCi0gICAgICAgICAgICAsIG1fZmliZXJDb3VudChzX21heEludGVybmFsUm9wZUxl
bmd0aCkKLSAgICAgICAgewotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVGhpcyBjb25zdHJ1Y3Rv
ciBjb25zdHJ1Y3RzIGEgbmV3IHN0cmluZyBieSBjb25jYXRlbmF0aW5nIHUxICYgdTIuCi0gICAg
ICAgIEpTU3RyaW5nKEpTR2xvYmFsRGF0YSYgZ2xvYmFsRGF0YSwgY29uc3QgVVN0cmluZyYgdTEs
IGNvbnN0IFVTdHJpbmcmIHUyKQotICAgICAgICAgICAgOiBKU0NlbGwoZ2xvYmFsRGF0YSwgZ2xv
YmFsRGF0YS5zdHJpbmdTdHJ1Y3R1cmUuZ2V0KCkpCi0gICAgICAgICAgICAsIG1fbGVuZ3RoKHUx
Lmxlbmd0aCgpICsgdTIubGVuZ3RoKCkpCi0gICAgICAgICAgICAsIG1fZmliZXJDb3VudCgyKQot
ICAgICAgICB7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUaGlzIGNvbnN0cnVjdG9yIGNvbnN0
cnVjdHMgYSBuZXcgc3RyaW5nIGJ5IGNvbmNhdGVuYXRpbmcgdTEsIHUyICYgdTMuCi0gICAgICAg
IEpTU3RyaW5nKEpTR2xvYmFsRGF0YSYgZ2xvYmFsRGF0YSwgY29uc3QgVVN0cmluZyYgdTEsIGNv
bnN0IFVTdHJpbmcmIHUyLCBjb25zdCBVU3RyaW5nJiB1MykKLSAgICAgICAgICAgIDogSlNDZWxs
KGdsb2JhbERhdGEsIGdsb2JhbERhdGEuc3RyaW5nU3RydWN0dXJlLmdldCgpKQotICAgICAgICAg
ICAgLCBtX2xlbmd0aCh1MS5sZW5ndGgoKSArIHUyLmxlbmd0aCgpICsgdTMubGVuZ3RoKCkpCi0g
ICAgICAgICAgICAsIG1fZmliZXJDb3VudChzX21heEludGVybmFsUm9wZUxlbmd0aCkKLSAgICAg
ICAgewotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBmaW5pc2hDcmVhdGlvbihKU0dsb2JhbERh
dGEmIGdsb2JhbERhdGEsIGNvbnN0IFVTdHJpbmcmIHZhbHVlKQotICAgICAgICB7Ci0gICAgICAg
ICAgICBCYXNlOjpmaW5pc2hDcmVhdGlvbihnbG9iYWxEYXRhKTsKLSAgICAgICAgICAgIEFTU0VS
VCghbV92YWx1ZS5pc051bGwoKSk7Ci0gICAgICAgICAgICBIZWFwOjpoZWFwKHRoaXMpLT5yZXBv
cnRFeHRyYU1lbW9yeUNvc3QodmFsdWUuaW1wbCgpLT5jb3N0KCkpOwotICAgICAgICB9CiAKICAg
ICAgICAgdm9pZCBmaW5pc2hDcmVhdGlvbihKU0dsb2JhbERhdGEmIGdsb2JhbERhdGEpCiAgICAg
ICAgIHsKICAgICAgICAgICAgIEJhc2U6OmZpbmlzaENyZWF0aW9uKGdsb2JhbERhdGEpOwotICAg
ICAgICAgICAgQVNTRVJUKCFtX3ZhbHVlLmlzTnVsbCgpKTsKLSAgICAgICAgfQotCi0gICAgICAg
IHZvaWQgZmluaXNoQ3JlYXRpb24oSlNHbG9iYWxEYXRhJiBnbG9iYWxEYXRhLCBQYXNzUmVmUHRy
PFJvcGVJbXBsPiByb3BlKQotICAgICAgICB7Ci0gICAgICAgICAgICBCYXNlOjpmaW5pc2hDcmVh
dGlvbihnbG9iYWxEYXRhKTsKLSAgICAgICAgICAgIG1fZmliZXJzWzBdID0gcm9wZS5sZWFrUmVm
KCk7CisgICAgICAgICAgICBtX2xlbmd0aCA9IDA7CiAgICAgICAgIH0KIAotICAgICAgICB2b2lk
IGZpbmlzaENyZWF0aW9uKEpTR2xvYmFsRGF0YSYgZ2xvYmFsRGF0YSwgdW5zaWduZWQgZmliZXJD
b3VudCwgSlNTdHJpbmcqIHMxLCBKU1N0cmluZyogczIpCisgICAgICAgIHZvaWQgZmluaXNoQ3Jl
YXRpb24oSlNHbG9iYWxEYXRhJiBnbG9iYWxEYXRhLCBzaXplX3QgbGVuZ3RoKQogICAgICAgICB7
CisgICAgICAgICAgICBBU1NFUlQoIW1fdmFsdWUuaXNOdWxsKCkpOwogICAgICAgICAgICAgQmFz
ZTo6ZmluaXNoQ3JlYXRpb24oZ2xvYmFsRGF0YSk7Ci0gICAgICAgICAgICBBU1NFUlRfVU5VU0VE
KGZpYmVyQ291bnQsIGZpYmVyQ291bnQgPD0gc19tYXhJbnRlcm5hbFJvcGVMZW5ndGgpOwotICAg
ICAgICAgICAgdW5zaWduZWQgaW5kZXggPSAwOwotICAgICAgICAgICAgYXBwZW5kU3RyaW5nSW5D
cmVhdGUoaW5kZXgsIHMxKTsKLSAgICAgICAgICAgIGFwcGVuZFN0cmluZ0luQ3JlYXRlKGluZGV4
LCBzMik7Ci0gICAgICAgICAgICBBU1NFUlQoZmliZXJDb3VudCA9PSBpbmRleCk7CisgICAgICAg
ICAgICBtX2xlbmd0aCA9IGxlbmd0aDsKICAgICAgICAgfQogCi0gICAgICAgIHZvaWQgZmluaXNo
Q3JlYXRpb24oSlNHbG9iYWxEYXRhJiBnbG9iYWxEYXRhLCB1bnNpZ25lZCBmaWJlckNvdW50LCBK
U1N0cmluZyogczEsIGNvbnN0IFVTdHJpbmcmIHUyKQorICAgICAgICB2b2lkIGZpbmlzaENyZWF0
aW9uKEpTR2xvYmFsRGF0YSYgZ2xvYmFsRGF0YSwgc2l6ZV90IGxlbmd0aCwgc2l6ZV90IGNvc3Qp
CiAgICAgICAgIHsKKyAgICAgICAgICAgIEFTU0VSVCghbV92YWx1ZS5pc051bGwoKSk7CiAgICAg
ICAgICAgICBCYXNlOjpmaW5pc2hDcmVhdGlvbihnbG9iYWxEYXRhKTsKLSAgICAgICAgICAgIEFT
U0VSVF9VTlVTRUQoZmliZXJDb3VudCwgZmliZXJDb3VudCA8PSBzX21heEludGVybmFsUm9wZUxl
bmd0aCk7Ci0gICAgICAgICAgICB1bnNpZ25lZCBpbmRleCA9IDA7Ci0gICAgICAgICAgICBhcHBl
bmRTdHJpbmdJbkNyZWF0ZShpbmRleCwgczEpOwotICAgICAgICAgICAgYXBwZW5kU3RyaW5nSW5D
cmVhdGUoaW5kZXgsIHUyKTsKLSAgICAgICAgICAgIEFTU0VSVChmaWJlckNvdW50ID09IGluZGV4
KTsKKyAgICAgICAgICAgIG1fbGVuZ3RoID0gbGVuZ3RoOworICAgICAgICAgICAgSGVhcDo6aGVh
cCh0aGlzKS0+cmVwb3J0RXh0cmFNZW1vcnlDb3N0KGNvc3QpOwogICAgICAgICB9CiAKLSAgICAg
ICAgdm9pZCBmaW5pc2hDcmVhdGlvbihKU0dsb2JhbERhdGEmIGdsb2JhbERhdGEsIHVuc2lnbmVk
IGZpYmVyQ291bnQsIGNvbnN0IFVTdHJpbmcmIHUxLCBKU1N0cmluZyogczIpCisgICAgICAgIHZv
aWQgZmluaXNoQ3JlYXRpb24oSlNHbG9iYWxEYXRhJiBnbG9iYWxEYXRhLCBKU1N0cmluZyogczEs
IEpTU3RyaW5nKiBzMikKICAgICAgICAgewogICAgICAgICAgICAgQmFzZTo6ZmluaXNoQ3JlYXRp
b24oZ2xvYmFsRGF0YSk7Ci0gICAgICAgICAgICBBU1NFUlRfVU5VU0VEKGZpYmVyQ291bnQsIGZp
YmVyQ291bnQgPD0gc19tYXhJbnRlcm5hbFJvcGVMZW5ndGgpOwotICAgICAgICAgICAgdW5zaWdu
ZWQgaW5kZXggPSAwOwotICAgICAgICAgICAgYXBwZW5kU3RyaW5nSW5DcmVhdGUoaW5kZXgsIHUx
KTsKLSAgICAgICAgICAgIGFwcGVuZFN0cmluZ0luQ3JlYXRlKGluZGV4LCBzMik7Ci0gICAgICAg
ICAgICBBU1NFUlQoZmliZXJDb3VudCA9PSBpbmRleCk7Ci0gICAgICAgIH0KLQotICAgICAgICAv
LyBGaWxscyBpbiB0aGUgbmV3IHN0cmluZyBieSBjb25jYXRlbmF0aW5nIHYxLCB2MiAmIHYzLgot
ICAgICAgICAvLyBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aXRoIGZpYmVyQ291bnQgPD0g
MyAuLi4gd2hpY2ggc2luY2UgZXZlcnkKLSAgICAgICAgLy8gdmFsdWUgbXVzdCByZXF1aXJlIGEg
ZmliZXJDb3VudCBvZiBhdCBsZWFzdCBvbmUgaW1wbGllcyB0aGF0IHRoZSBsZW5ndGgKLSAgICAg
ICAgLy8gZm9yIGVhY2ggdmFsdWUgbXVzdCBiZSBleGFjdGx5IDEhCi0gICAgICAgIHZvaWQgZmlu
aXNoQ3JlYXRpb24oRXhlY1N0YXRlKiBleGVjLCBKU1ZhbHVlIHYxLCBKU1ZhbHVlIHYyLCBKU1Zh
bHVlIHYzKQotICAgICAgICB7Ci0gICAgICAgICAgICBCYXNlOjpmaW5pc2hDcmVhdGlvbihleGVj
LT5nbG9iYWxEYXRhKCkpOwotICAgICAgICAgICAgdW5zaWduZWQgaW5kZXggPSAwOwotICAgICAg
ICAgICAgYXBwZW5kVmFsdWVJbkNyZWF0ZUFuZEluY3JlbWVudExlbmd0aChleGVjLCBpbmRleCwg
djEpOwotICAgICAgICAgICAgYXBwZW5kVmFsdWVJbkNyZWF0ZUFuZEluY3JlbWVudExlbmd0aChl
eGVjLCBpbmRleCwgdjIpOwotICAgICAgICAgICAgYXBwZW5kVmFsdWVJbkNyZWF0ZUFuZEluY3Jl
bWVudExlbmd0aChleGVjLCBpbmRleCwgdjMpOwotICAgICAgICAgICAgQVNTRVJUKGluZGV4ID09
IHNfbWF4SW50ZXJuYWxSb3BlTGVuZ3RoKTsKKyAgICAgICAgICAgIG1fbGVuZ3RoID0gczEtPmxl
bmd0aCgpICsgczItPmxlbmd0aCgpOworICAgICAgICAgICAgbV9maWJlckNvdW50ID0gMjsKKyAg
ICAgICAgICAgIG1fZmliZXJzWzBdLnNldChnbG9iYWxEYXRhLCB0aGlzLCBzMSk7CisgICAgICAg
ICAgICBtX2ZpYmVyc1sxXS5zZXQoZ2xvYmFsRGF0YSwgdGhpcywgczIpOwogICAgICAgICB9CiAK
LSAgICAgICAgdm9pZCBmaW5pc2hDcmVhdGlvbihKU0dsb2JhbERhdGEmIGdsb2JhbERhdGEsIGNv
bnN0IFVTdHJpbmcmIHUxLCBjb25zdCBVU3RyaW5nJiB1MikKKyAgICAgICAgdm9pZCBmaW5pc2hD
cmVhdGlvbihKU0dsb2JhbERhdGEmIGdsb2JhbERhdGEsIEpTU3RyaW5nKiBzMSwgSlNTdHJpbmcq
IHMyLCBKU1N0cmluZyogczMpCiAgICAgICAgIHsKICAgICAgICAgICAgIEJhc2U6OmZpbmlzaENy
ZWF0aW9uKGdsb2JhbERhdGEpOwotICAgICAgICAgICAgdW5zaWduZWQgaW5kZXggPSAwOwotICAg
ICAgICAgICAgYXBwZW5kU3RyaW5nSW5DcmVhdGUoaW5kZXgsIHUxKTsKLSAgICAgICAgICAgIGFw
cGVuZFN0cmluZ0luQ3JlYXRlKGluZGV4LCB1Mik7Ci0gICAgICAgICAgICBBU1NFUlQoaW5kZXgg
PD0gc19tYXhJbnRlcm5hbFJvcGVMZW5ndGgpOworICAgICAgICAgICAgbV9sZW5ndGggPSBzMS0+
bGVuZ3RoKCkgKyBzMi0+bGVuZ3RoKCkgKyBzMy0+bGVuZ3RoKCk7CisgICAgICAgICAgICBtX2Zp
YmVyQ291bnQgPSAzOworICAgICAgICAgICAgbV9maWJlcnNbMF0uc2V0KGdsb2JhbERhdGEsIHRo
aXMsIHMxKTsKKyAgICAgICAgICAgIG1fZmliZXJzWzFdLnNldChnbG9iYWxEYXRhLCB0aGlzLCBz
Mik7CisgICAgICAgICAgICBtX2ZpYmVyc1syXS5zZXQoZ2xvYmFsRGF0YSwgdGhpcywgczMpOwog
ICAgICAgICB9CiAKLSAgICAgICAgdm9pZCBmaW5pc2hDcmVhdGlvbihKU0dsb2JhbERhdGEmIGds
b2JhbERhdGEsIGNvbnN0IFVTdHJpbmcmIHUxLCBjb25zdCBVU3RyaW5nJiB1MiwgY29uc3QgVVN0
cmluZyYgdTMpCisgICAgICAgIHN0YXRpYyBKU1N0cmluZyogY3JlYXRlTnVsbChKU0dsb2JhbERh
dGEmIGdsb2JhbERhdGEpCiAgICAgICAgIHsKLSAgICAgICAgICAgIEJhc2U6OmZpbmlzaENyZWF0
aW9uKGdsb2JhbERhdGEpOwotICAgICAgICAgICAgdW5zaWduZWQgaW5kZXggPSAwOwotICAgICAg
ICAgICAgYXBwZW5kU3RyaW5nSW5DcmVhdGUoaW5kZXgsIHUxKTsKLSAgICAgICAgICAgIGFwcGVu
ZFN0cmluZ0luQ3JlYXRlKGluZGV4LCB1Mik7Ci0gICAgICAgICAgICBhcHBlbmRTdHJpbmdJbkNy
ZWF0ZShpbmRleCwgdTMpOwotICAgICAgICAgICAgQVNTRVJUKGluZGV4IDw9IHNfbWF4SW50ZXJu
YWxSb3BlTGVuZ3RoKTsKKyAgICAgICAgICAgIEpTU3RyaW5nKiBuZXdTdHJpbmcgPSBuZXcgKGFs
bG9jYXRlQ2VsbDxKU1N0cmluZz4oZ2xvYmFsRGF0YS5oZWFwKSkgSlNTdHJpbmcoZ2xvYmFsRGF0
YSk7CisgICAgICAgICAgICBuZXdTdHJpbmctPmZpbmlzaENyZWF0aW9uKGdsb2JhbERhdGEpOwor
ICAgICAgICAgICAgcmV0dXJuIG5ld1N0cmluZzsKICAgICAgICAgfQogCiAgICAgcHVibGljOgot
ICAgICAgICBzdGF0aWMgSlNTdHJpbmcqIGNyZWF0ZShKU0dsb2JhbERhdGEmIGdsb2JhbERhdGEs
IGNvbnN0IFVTdHJpbmcmIHZhbHVlKQorICAgICAgICBzdGF0aWMgSlNTdHJpbmcqIGNyZWF0ZShK
U0dsb2JhbERhdGEmIGdsb2JhbERhdGEsIFBhc3NSZWZQdHI8U3RyaW5nSW1wbD4gdmFsdWUpCiAg
ICAgICAgIHsKKyAgICAgICAgICAgIEFTU0VSVCh2YWx1ZSk7CisgICAgICAgICAgICBzaXplX3Qg
bGVuZ3RoID0gdmFsdWUtPmxlbmd0aCgpOworICAgICAgICAgICAgc2l6ZV90IGNvc3QgPSB2YWx1
ZS0+Y29zdCgpOwogICAgICAgICAgICAgSlNTdHJpbmcqIG5ld1N0cmluZyA9IG5ldyAoYWxsb2Nh
dGVDZWxsPEpTU3RyaW5nPihnbG9iYWxEYXRhLmhlYXApKSBKU1N0cmluZyhnbG9iYWxEYXRhLCB2
YWx1ZSk7Ci0gICAgICAgICAgICBuZXdTdHJpbmctPmZpbmlzaENyZWF0aW9uKGdsb2JhbERhdGEs
IHZhbHVlKTsKLSAgICAgICAgICAgIHJldHVybiBuZXdTdHJpbmc7Ci0gICAgICAgIH0KLSAgICAg
ICAgc3RhdGljIEpTU3RyaW5nKiBjcmVhdGVIYXNPdGhlck93bmVyKEpTR2xvYmFsRGF0YSYgZ2xv
YmFsRGF0YSwgY29uc3QgVVN0cmluZyYgdmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEpT
U3RyaW5nKiBuZXdTdHJpbmcgPSBuZXcgKGFsbG9jYXRlQ2VsbDxKU1N0cmluZz4oZ2xvYmFsRGF0
YS5oZWFwKSkgSlNTdHJpbmcoZ2xvYmFsRGF0YSwgdmFsdWUsIEhhc090aGVyT3duZXIpOwotICAg
ICAgICAgICAgbmV3U3RyaW5nLT5maW5pc2hDcmVhdGlvbihnbG9iYWxEYXRhLCB2YWx1ZSk7Ci0g
ICAgICAgICAgICByZXR1cm4gbmV3U3RyaW5nOwotICAgICAgICB9Ci0gICAgICAgIHN0YXRpYyBK
U1N0cmluZyogY3JlYXRlSGFzT3RoZXJPd25lcihKU0dsb2JhbERhdGEmIGdsb2JhbERhdGEsIFBh
c3NSZWZQdHI8U3RyaW5nSW1wbD4gdmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEpTU3Ry
aW5nKiBuZXdTdHJpbmcgPSBuZXcgKGFsbG9jYXRlQ2VsbDxKU1N0cmluZz4oZ2xvYmFsRGF0YS5o
ZWFwKSkgSlNTdHJpbmcoZ2xvYmFsRGF0YSwgdmFsdWUsIEhhc090aGVyT3duZXIpOwotICAgICAg
ICAgICAgbmV3U3RyaW5nLT5maW5pc2hDcmVhdGlvbihnbG9iYWxEYXRhKTsKLSAgICAgICAgICAg
IHJldHVybiBuZXdTdHJpbmc7Ci0gICAgICAgIH0KLSAgICAgICAgc3RhdGljIEpTU3RyaW5nKiBj
cmVhdGUoSlNHbG9iYWxEYXRhJiBnbG9iYWxEYXRhLCBQYXNzUmVmUHRyPFJvcGVJbXBsPiByb3Bl
KQotICAgICAgICB7Ci0gICAgICAgICAgICBSZWZQdHI8Um9wZUltcGw+IHRlbXBSb3BlID0gcm9w
ZTsKLSAgICAgICAgICAgIEpTU3RyaW5nKiBuZXdTdHJpbmcgPSBuZXcgKGFsbG9jYXRlQ2VsbDxK
U1N0cmluZz4oZ2xvYmFsRGF0YS5oZWFwKSkgSlNTdHJpbmcoZ2xvYmFsRGF0YSwgdGVtcFJvcGUp
OwotICAgICAgICAgICAgbmV3U3RyaW5nLT5maW5pc2hDcmVhdGlvbihnbG9iYWxEYXRhLCB0ZW1w
Um9wZSk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3U3RyaW5nOwotICAgICAgICB9Ci0gICAgICAg
IHN0YXRpYyBKU1N0cmluZyogY3JlYXRlKEpTR2xvYmFsRGF0YSYgZ2xvYmFsRGF0YSwgdW5zaWdu
ZWQgZmliZXJDb3VudCwgSlNTdHJpbmcqIHMxLCBKU1N0cmluZyogczIpCi0gICAgICAgIHsKLSAg
ICAgICAgICAgIEpTU3RyaW5nKiBuZXdTdHJpbmcgPSBuZXcgKGFsbG9jYXRlQ2VsbDxKU1N0cmlu
Zz4oZ2xvYmFsRGF0YS5oZWFwKSkgSlNTdHJpbmcoZ2xvYmFsRGF0YSwgZmliZXJDb3VudCwgczEs
IHMyKTsKLSAgICAgICAgICAgIG5ld1N0cmluZy0+ZmluaXNoQ3JlYXRpb24oZ2xvYmFsRGF0YSwg
ZmliZXJDb3VudCwgczEsIHMyKTsKLSAgICAgICAgICAgIHJldHVybiBuZXdTdHJpbmc7Ci0gICAg
ICAgIH0KLSAgICAgICAgc3RhdGljIEpTU3RyaW5nKiBjcmVhdGUoSlNHbG9iYWxEYXRhJiBnbG9i
YWxEYXRhLCB1bnNpZ25lZCBmaWJlckNvdW50LCBKU1N0cmluZyogczEsIGNvbnN0IFVTdHJpbmcm
IHUyKQotICAgICAgICB7Ci0gICAgICAgICAgICBKU1N0cmluZyogbmV3U3RyaW5nID0gbmV3IChh
bGxvY2F0ZUNlbGw8SlNTdHJpbmc+KGdsb2JhbERhdGEuaGVhcCkpIEpTU3RyaW5nKGdsb2JhbERh
dGEsIGZpYmVyQ291bnQsIHMxLCB1Mik7Ci0gICAgICAgICAgICBuZXdTdHJpbmctPmZpbmlzaENy
ZWF0aW9uKGdsb2JhbERhdGEsIGZpYmVyQ291bnQsIHMxLCB1Mik7Ci0gICAgICAgICAgICByZXR1
cm4gbmV3U3RyaW5nOwotICAgICAgICB9Ci0gICAgICAgIHN0YXRpYyBKU1N0cmluZyogY3JlYXRl
KEpTR2xvYmFsRGF0YSYgZ2xvYmFsRGF0YSwgdW5zaWduZWQgZmliZXJDb3VudCwgY29uc3QgVVN0
cmluZyYgdTEsIEpTU3RyaW5nKiBzMikKLSAgICAgICAgewotICAgICAgICAgICAgSlNTdHJpbmcq
IG5ld1N0cmluZyA9IG5ldyAoYWxsb2NhdGVDZWxsPEpTU3RyaW5nPihnbG9iYWxEYXRhLmhlYXAp
KSBKU1N0cmluZyhnbG9iYWxEYXRhLCBmaWJlckNvdW50LCB1MSwgczIpOwotICAgICAgICAgICAg
bmV3U3RyaW5nLT5maW5pc2hDcmVhdGlvbihnbG9iYWxEYXRhLCBmaWJlckNvdW50LCB1MSwgczIp
OworICAgICAgICAgICAgbmV3U3RyaW5nLT5maW5pc2hDcmVhdGlvbihnbG9iYWxEYXRhLCBsZW5n
dGgsIGNvc3QpOwogICAgICAgICAgICAgcmV0dXJuIG5ld1N0cmluZzsKICAgICAgICAgfQotICAg
ICAgICBzdGF0aWMgSlNTdHJpbmcqIGNyZWF0ZShFeGVjU3RhdGUqIGV4ZWMsIEpTVmFsdWUgdjEs
IEpTVmFsdWUgdjIsIEpTVmFsdWUgdjMpCisgICAgICAgIHN0YXRpYyBKU1N0cmluZyogY3JlYXRl
KEpTR2xvYmFsRGF0YSYgZ2xvYmFsRGF0YSwgSlNTdHJpbmcqIHMxLCBKU1N0cmluZyogczIpCiAg
ICAgICAgIHsKLSAgICAgICAgICAgIEpTU3RyaW5nKiBuZXdTdHJpbmcgPSBuZXcgKGFsbG9jYXRl
Q2VsbDxKU1N0cmluZz4oKmV4ZWMtPmhlYXAoKSkpIEpTU3RyaW5nKGV4ZWMpOwotICAgICAgICAg
ICAgbmV3U3RyaW5nLT5maW5pc2hDcmVhdGlvbihleGVjLCB2MSwgdjIsIHYzKTsKKyAgICAgICAg
ICAgIEpTU3RyaW5nKiBuZXdTdHJpbmcgPSBuZXcgKGFsbG9jYXRlQ2VsbDxKU1N0cmluZz4oZ2xv
YmFsRGF0YS5oZWFwKSkgSlNTdHJpbmcoZ2xvYmFsRGF0YSk7CisgICAgICAgICAgICBuZXdTdHJp
bmctPmZpbmlzaENyZWF0aW9uKGdsb2JhbERhdGEsIHMxLCBzMik7CiAgICAgICAgICAgICByZXR1
cm4gbmV3U3RyaW5nOwogICAgICAgICB9Ci0gICAgICAgIHN0YXRpYyBKU1N0cmluZyogY3JlYXRl
KEpTR2xvYmFsRGF0YSYgZ2xvYmFsRGF0YSwgY29uc3QgVVN0cmluZyYgdTEsIGNvbnN0IFVTdHJp
bmcmIHUyKQorICAgICAgICBzdGF0aWMgSlNTdHJpbmcqIGNyZWF0ZShKU0dsb2JhbERhdGEmIGds
b2JhbERhdGEsIEpTU3RyaW5nKiBzMSwgSlNTdHJpbmcqIHMyLCBKU1N0cmluZyogczMpCiAgICAg
ICAgIHsKLSAgICAgICAgICAgIEpTU3RyaW5nKiBuZXdTdHJpbmcgPSBuZXcgKGFsbG9jYXRlQ2Vs
bDxKU1N0cmluZz4oZ2xvYmFsRGF0YS5oZWFwKSkgSlNTdHJpbmcoZ2xvYmFsRGF0YSwgdTEsIHUy
KTsKLSAgICAgICAgICAgIG5ld1N0cmluZy0+ZmluaXNoQ3JlYXRpb24oZ2xvYmFsRGF0YSwgdTEs
IHUyKTsKKyAgICAgICAgICAgIEpTU3RyaW5nKiBuZXdTdHJpbmcgPSBuZXcgKGFsbG9jYXRlQ2Vs
bDxKU1N0cmluZz4oZ2xvYmFsRGF0YS5oZWFwKSkgSlNTdHJpbmcoZ2xvYmFsRGF0YSk7CisgICAg
ICAgICAgICBuZXdTdHJpbmctPmZpbmlzaENyZWF0aW9uKGdsb2JhbERhdGEsIHMxLCBzMiwgczMp
OwogICAgICAgICAgICAgcmV0dXJuIG5ld1N0cmluZzsKICAgICAgICAgfQotICAgICAgICBzdGF0
aWMgSlNTdHJpbmcqIGNyZWF0ZShKU0dsb2JhbERhdGEmIGdsb2JhbERhdGEsIGNvbnN0IFVTdHJp
bmcmIHUxLCBjb25zdCBVU3RyaW5nJiB1MiwgY29uc3QgVVN0cmluZyYgdTMpCisgICAgICAgIHN0
YXRpYyBKU1N0cmluZyogY3JlYXRlSGFzT3RoZXJPd25lcihKU0dsb2JhbERhdGEmIGdsb2JhbERh
dGEsIFBhc3NSZWZQdHI8U3RyaW5nSW1wbD4gdmFsdWUpCiAgICAgICAgIHsKLSAgICAgICAgICAg
IEpTU3RyaW5nKiBuZXdTdHJpbmcgPSBuZXcgKGFsbG9jYXRlQ2VsbDxKU1N0cmluZz4oZ2xvYmFs
RGF0YS5oZWFwKSkgSlNTdHJpbmcoZ2xvYmFsRGF0YSwgdTEsIHUyLCB1Myk7Ci0gICAgICAgICAg
ICBuZXdTdHJpbmctPmZpbmlzaENyZWF0aW9uKGdsb2JhbERhdGEsIHUxLCB1MiwgdTMpOworICAg
ICAgICAgICAgQVNTRVJUKHZhbHVlKTsKKyAgICAgICAgICAgIHNpemVfdCBsZW5ndGggPSB2YWx1
ZS0+bGVuZ3RoKCk7CisgICAgICAgICAgICBKU1N0cmluZyogbmV3U3RyaW5nID0gbmV3IChhbGxv
Y2F0ZUNlbGw8SlNTdHJpbmc+KGdsb2JhbERhdGEuaGVhcCkpIEpTU3RyaW5nKGdsb2JhbERhdGEs
IHZhbHVlKTsKKyAgICAgICAgICAgIG5ld1N0cmluZy0+ZmluaXNoQ3JlYXRpb24oZ2xvYmFsRGF0
YSwgbGVuZ3RoKTsKICAgICAgICAgICAgIHJldHVybiBuZXdTdHJpbmc7CiAgICAgICAgIH0KIAot
ICAgICAgICB+SlNTdHJpbmcoKQotICAgICAgICB7Ci0gICAgICAgICAgICBBU1NFUlQodnB0cigp
ID09IEpTR2xvYmFsRGF0YTo6anNTdHJpbmdWUHRyKTsKLSAgICAgICAgICAgIGZvciAodW5zaWdu
ZWQgaSA9IDA7IGkgPCBtX2ZpYmVyQ291bnQ7ICsraSkKLSAgICAgICAgICAgICAgICBSb3BlSW1w
bDo6ZGVyZWYobV9maWJlcnNbaV0pOwotICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgfkpTU3Ry
aW5nKCk7CiAKICAgICAgICAgY29uc3QgVVN0cmluZyYgdmFsdWUoRXhlY1N0YXRlKiBleGVjKSBj
b25zdAogICAgICAgICB7CkBAIC00NTQsNiArMjM3LDggQEAgbmFtZXNwYWNlIEpTQyB7CiAKICAg
ICAgICAgc3RhdGljIGNvbnN0IENsYXNzSW5mbyBzX2luZm87CiAKKyAgICAgICAgc3RhdGljIHZv
aWQgdmlzaXRDaGlsZHJlbihKU0NlbGwqLCBTbG90VmlzaXRvciYpOworCiAgICAgcHJpdmF0ZToK
ICAgICAgICAgSlNTdHJpbmcoVlB0clN0ZWFsaW5nSGFja1R5cGUpIAogICAgICAgICAgICAgOiBK
U0NlbGwoVlB0clN0ZWFsaW5nSGFjaykKQEAgLTQ2NCw0NCArMjQ5LDYgQEAgbmFtZXNwYWNlIEpT
QyB7CiAgICAgICAgIHZvaWQgcmVzb2x2ZVJvcGUoRXhlY1N0YXRlKikgY29uc3Q7CiAgICAgICAg
IHZvaWQgcmVzb2x2ZVJvcGVTbG93Q2FzZShFeGVjU3RhdGUqLCBVQ2hhciopIGNvbnN0OwogICAg
ICAgICB2b2lkIG91dE9mTWVtb3J5KEV4ZWNTdGF0ZSopIGNvbnN0OwotICAgICAgICBKU1N0cmlu
Zyogc3Vic3RyaW5nRnJvbVJvcGUoRXhlY1N0YXRlKiwgdW5zaWduZWQgb2Zmc2V0LCB1bnNpZ25l
ZCBsZW5ndGgpOwotCi0gICAgICAgIHZvaWQgYXBwZW5kU3RyaW5nSW5DcmVhdGUodW5zaWduZWQm
IGluZGV4LCBjb25zdCBVU3RyaW5nJiBzdHJpbmcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0
cmluZ0ltcGwqIGltcGwgPSBzdHJpbmcuaW1wbCgpOwotICAgICAgICAgICAgaW1wbC0+cmVmKCk7
Ci0gICAgICAgICAgICBtX2ZpYmVyc1tpbmRleCsrXSA9IGltcGw7Ci0gICAgICAgICAgICBIZWFw
OjpoZWFwKHRoaXMpLT5yZXBvcnRFeHRyYU1lbW9yeUNvc3Qoc3RyaW5nLmltcGwoKS0+Y29zdCgp
KTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgYXBwZW5kU3RyaW5nSW5DcmVhdGUodW5zaWdu
ZWQmIGluZGV4LCBKU1N0cmluZyoganNTdHJpbmcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlm
IChqc1N0cmluZy0+aXNSb3BlKCkpIHsKLSAgICAgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkg
PSAwOyBpIDwganNTdHJpbmctPm1fZmliZXJDb3VudDsgKytpKSB7Ci0gICAgICAgICAgICAgICAg
ICAgIFJvcGVJbXBsOjpGaWJlciBmaWJlciA9IGpzU3RyaW5nLT5tX2ZpYmVyc1tpXTsKLSAgICAg
ICAgICAgICAgICAgICAgZmliZXItPnJlZigpOwotICAgICAgICAgICAgICAgICAgICBtX2ZpYmVy
c1tpbmRleCsrXSA9IGZpYmVyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxz
ZQotICAgICAgICAgICAgICAgIGFwcGVuZFN0cmluZ0luQ3JlYXRlKGluZGV4LCBqc1N0cmluZy0+
c3RyaW5nKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBhcHBlbmRWYWx1ZUluQ3JlYXRl
QW5kSW5jcmVtZW50TGVuZ3RoKEV4ZWNTdGF0ZSogZXhlYywgdW5zaWduZWQmIGluZGV4LCBKU1Zh
bHVlIHYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh2LmlzU3RyaW5nKCkpIHsKLSAgICAg
ICAgICAgICAgICBBU1NFUlQodi5hc0NlbGwoKS0+aXNTdHJpbmcoKSk7Ci0gICAgICAgICAgICAg
ICAgSlNTdHJpbmcqIHMgPSBzdGF0aWNfY2FzdDxKU1N0cmluZyo+KHYuYXNDZWxsKCkpOwotICAg
ICAgICAgICAgICAgIEFTU0VSVChzLT5maWJlckNvdW50KCkgPT0gMSk7Ci0gICAgICAgICAgICAg
ICAgYXBwZW5kU3RyaW5nSW5DcmVhdGUoaW5kZXgsIHMpOwotICAgICAgICAgICAgICAgIG1fbGVu
Z3RoICs9IHMtPmxlbmd0aCgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAg
ICBVU3RyaW5nIHUodi50b1N0cmluZyhleGVjKSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nSW1w
bCogaW1wbCA9IHUuaW1wbCgpOwotICAgICAgICAgICAgICAgIGltcGwtPnJlZigpOwotICAgICAg
ICAgICAgICAgIG1fZmliZXJzW2luZGV4KytdID0gaW1wbDsKLSAgICAgICAgICAgICAgICBtX2xl
bmd0aCArPSB1Lmxlbmd0aCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9CiAKICAgICAgICAg
dmlydHVhbCBKU09iamVjdCogdG9UaGlzT2JqZWN0KEV4ZWNTdGF0ZSopIGNvbnN0OwogCkBAIC01
MTgsMTUgKzI2NSwxMyBAQCBuYW1lc3BhY2UgSlNDIHsKICAgICAgICAgdW5zaWduZWQgbV9sZW5n
dGg7CiAgICAgICAgIG11dGFibGUgVVN0cmluZyBtX3ZhbHVlOwogICAgICAgICBtdXRhYmxlIHVu
c2lnbmVkIG1fZmliZXJDb3VudDsKLSAgICAgICAgbXV0YWJsZSBGaXhlZEFycmF5PFJvcGVJbXBs
OjpGaWJlciwgc19tYXhJbnRlcm5hbFJvcGVMZW5ndGg+IG1fZmliZXJzOworICAgICAgICBtdXRh
YmxlIEZpeGVkQXJyYXk8V3JpdGVCYXJyaWVyPEpTU3RyaW5nPiwgc19tYXhJbnRlcm5hbFJvcGVM
ZW5ndGg+IG1fZmliZXJzOwogCiAgICAgICAgIGJvb2wgaXNSb3BlKCkgY29uc3QgeyByZXR1cm4g
bV9maWJlckNvdW50OyB9CiAgICAgICAgIFVTdHJpbmcmIHN0cmluZygpIHsgQVNTRVJUKCFpc1Jv
cGUoKSk7IHJldHVybiBtX3ZhbHVlOyB9CiAgICAgICAgIHVuc2lnbmVkIGZpYmVyQ291bnQoKSB7
IHJldHVybiBtX2ZpYmVyQ291bnQgPyBtX2ZpYmVyQ291bnQgOiAxOyB9CiAKICAgICAgICAgZnJp
ZW5kIEpTVmFsdWUganNTdHJpbmcoRXhlY1N0YXRlKiBleGVjLCBKU1N0cmluZyogczEsIEpTU3Ry
aW5nKiBzMik7Ci0gICAgICAgIGZyaWVuZCBKU1ZhbHVlIGpzU3RyaW5nKEV4ZWNTdGF0ZSogZXhl
YywgY29uc3QgVVN0cmluZyYgdTEsIEpTU3RyaW5nKiBzMik7Ci0gICAgICAgIGZyaWVuZCBKU1Zh
bHVlIGpzU3RyaW5nKEV4ZWNTdGF0ZSogZXhlYywgSlNTdHJpbmcqIHMxLCBjb25zdCBVU3RyaW5n
JiB1Mik7CiAgICAgICAgIGZyaWVuZCBKU1ZhbHVlIGpzU3RyaW5nKEV4ZWNTdGF0ZSogZXhlYywg
UmVnaXN0ZXIqIHN0cmluZ3MsIHVuc2lnbmVkIGNvdW50KTsKICAgICAgICAgZnJpZW5kIEpTVmFs
dWUganNTdHJpbmcoRXhlY1N0YXRlKiBleGVjLCBKU1ZhbHVlIHRoaXNWYWx1ZSk7CiAgICAgICAg
IGZyaWVuZCBKU1N0cmluZyoganNTdWJzdHJpbmcoRXhlY1N0YXRlKiBleGVjLCBKU1N0cmluZyog
cywgdW5zaWduZWQgb2Zmc2V0LCB1bnNpZ25lZCBsZW5ndGgpOwpAQCAtNTU5LDcgKzMwNCw3IEBA
IG5hbWVzcGFjZSBKU0MgewogICAgIHsKICAgICAgICAgaWYgKGMgPD0gbWF4U2luZ2xlQ2hhcmFj
dGVyU3RyaW5nKQogICAgICAgICAgICAgcmV0dXJuIGdsb2JhbERhdGEtPnNtYWxsU3RyaW5ncy5z
aW5nbGVDaGFyYWN0ZXJTdHJpbmcoZ2xvYmFsRGF0YSwgYyk7Ci0gICAgICAgIHJldHVybiBmaXh1
cFZQdHIoZ2xvYmFsRGF0YSwgSlNTdHJpbmc6OmNyZWF0ZSgqZ2xvYmFsRGF0YSwgVVN0cmluZygm
YywgMSkpKTsKKyAgICAgICAgcmV0dXJuIGZpeHVwVlB0cihnbG9iYWxEYXRhLCBKU1N0cmluZzo6
Y3JlYXRlKCpnbG9iYWxEYXRhLCBVU3RyaW5nKCZjLCAxKS5pbXBsKCkpKTsKICAgICB9CiAKICAg
ICBpbmxpbmUgSlNTdHJpbmcqIGpzU2luZ2xlQ2hhcmFjdGVyU3Vic3RyaW5nKEV4ZWNTdGF0ZSog
ZXhlYywgY29uc3QgVVN0cmluZyYgcywgdW5zaWduZWQgb2Zmc2V0KQpAQCAtNTY5LDcgKzMxNCw3
IEBAIG5hbWVzcGFjZSBKU0MgewogICAgICAgICBVQ2hhciBjID0gc1tvZmZzZXRdOwogICAgICAg
ICBpZiAoYyA8PSBtYXhTaW5nbGVDaGFyYWN0ZXJTdHJpbmcpCiAgICAgICAgICAgICByZXR1cm4g
Z2xvYmFsRGF0YS0+c21hbGxTdHJpbmdzLnNpbmdsZUNoYXJhY3RlclN0cmluZyhnbG9iYWxEYXRh
LCBjKTsKLSAgICAgICAgcmV0dXJuIGZpeHVwVlB0cihnbG9iYWxEYXRhLCBKU1N0cmluZzo6Y3Jl
YXRlKCpnbG9iYWxEYXRhLCBVU3RyaW5nKFN0cmluZ0ltcGw6OmNyZWF0ZShzLmltcGwoKSwgb2Zm
c2V0LCAxKSkpKTsKKyAgICAgICAgcmV0dXJuIGZpeHVwVlB0cihnbG9iYWxEYXRhLCBKU1N0cmlu
Zzo6Y3JlYXRlKCpnbG9iYWxEYXRhLCBTdHJpbmdJbXBsOjpjcmVhdGUocy5pbXBsKCksIG9mZnNl
dCwgMSkpKTsKICAgICB9CiAKICAgICBpbmxpbmUgSlNTdHJpbmcqIGpzTm9udHJpdmlhbFN0cmlu
ZyhKU0dsb2JhbERhdGEqIGdsb2JhbERhdGEsIGNvbnN0IGNoYXIqIHMpCkBAIC01NzcsMTMgKzMy
MiwxMyBAQCBuYW1lc3BhY2UgSlNDIHsKICAgICAgICAgQVNTRVJUKHMpOwogICAgICAgICBBU1NF
UlQoc1swXSk7CiAgICAgICAgIEFTU0VSVChzWzFdKTsKLSAgICAgICAgcmV0dXJuIGZpeHVwVlB0
cihnbG9iYWxEYXRhLCBKU1N0cmluZzo6Y3JlYXRlKCpnbG9iYWxEYXRhLCBzKSk7CisgICAgICAg
IHJldHVybiBmaXh1cFZQdHIoZ2xvYmFsRGF0YSwgSlNTdHJpbmc6OmNyZWF0ZSgqZ2xvYmFsRGF0
YSwgVVN0cmluZyhzKS5pbXBsKCkpKTsKICAgICB9CiAKICAgICBpbmxpbmUgSlNTdHJpbmcqIGpz
Tm9udHJpdmlhbFN0cmluZyhKU0dsb2JhbERhdGEqIGdsb2JhbERhdGEsIGNvbnN0IFVTdHJpbmcm
IHMpCiAgICAgewogICAgICAgICBBU1NFUlQocy5sZW5ndGgoKSA+IDEpOwotICAgICAgICByZXR1
cm4gZml4dXBWUHRyKGdsb2JhbERhdGEsIEpTU3RyaW5nOjpjcmVhdGUoKmdsb2JhbERhdGEsIHMp
KTsKKyAgICAgICAgcmV0dXJuIGZpeHVwVlB0cihnbG9iYWxEYXRhLCBKU1N0cmluZzo6Y3JlYXRl
KCpnbG9iYWxEYXRhLCBzLmltcGwoKSkpOwogICAgIH0KIAogICAgIGlubGluZSBKU1N0cmluZyog
SlNTdHJpbmc6OmdldEluZGV4KEV4ZWNTdGF0ZSogZXhlYywgdW5zaWduZWQgaSkKQEAgLTYwNSw3
ICszNTAsNyBAQCBuYW1lc3BhY2UgSlNDIHsKICAgICAgICAgICAgIGlmIChjIDw9IG1heFNpbmds
ZUNoYXJhY3RlclN0cmluZykKICAgICAgICAgICAgICAgICByZXR1cm4gZ2xvYmFsRGF0YS0+c21h
bGxTdHJpbmdzLnNpbmdsZUNoYXJhY3RlclN0cmluZyhnbG9iYWxEYXRhLCBjKTsKICAgICAgICAg
fQotICAgICAgICByZXR1cm4gZml4dXBWUHRyKGdsb2JhbERhdGEsIEpTU3RyaW5nOjpjcmVhdGUo
Kmdsb2JhbERhdGEsIHMpKTsKKyAgICAgICAgcmV0dXJuIGZpeHVwVlB0cihnbG9iYWxEYXRhLCBK
U1N0cmluZzo6Y3JlYXRlKCpnbG9iYWxEYXRhLCBzLmltcGwoKSkpOwogICAgIH0KIAogICAgIGlu
bGluZSBKU1N0cmluZyoganNTdWJzdHJpbmcoRXhlY1N0YXRlKiBleGVjLCBKU1N0cmluZyogcywg
dW5zaWduZWQgb2Zmc2V0LCB1bnNpZ25lZCBsZW5ndGgpCkBAIC02MTYsOSArMzYxLDcgQEAgbmFt
ZXNwYWNlIEpTQyB7CiAgICAgICAgIEpTR2xvYmFsRGF0YSogZ2xvYmFsRGF0YSA9ICZleGVjLT5n
bG9iYWxEYXRhKCk7CiAgICAgICAgIGlmICghbGVuZ3RoKQogICAgICAgICAgICAgcmV0dXJuIGds
b2JhbERhdGEtPnNtYWxsU3RyaW5ncy5lbXB0eVN0cmluZyhnbG9iYWxEYXRhKTsKLSAgICAgICAg
aWYgKHMtPmlzUm9wZSgpKQotICAgICAgICAgICAgcmV0dXJuIHMtPnN1YnN0cmluZ0Zyb21Sb3Bl
KGV4ZWMsIG9mZnNldCwgbGVuZ3RoKTsKLSAgICAgICAgcmV0dXJuIGpzU3Vic3RyaW5nKGdsb2Jh
bERhdGEsIHMtPm1fdmFsdWUsIG9mZnNldCwgbGVuZ3RoKTsKKyAgICAgICAgcmV0dXJuIGpzU3Vi
c3RyaW5nKGdsb2JhbERhdGEsIHMtPnZhbHVlKGV4ZWMpLCBvZmZzZXQsIGxlbmd0aCk7CiAgICAg
fQogCiAgICAgaW5saW5lIEpTU3RyaW5nKiBqc1N1YnN0cmluZyhKU0dsb2JhbERhdGEqIGdsb2Jh
bERhdGEsIGNvbnN0IFVTdHJpbmcmIHMsIHVuc2lnbmVkIG9mZnNldCwgdW5zaWduZWQgbGVuZ3Ro
KQpAQCAtNjMzLDcgKzM3Niw3IEBAIG5hbWVzcGFjZSBKU0MgewogICAgICAgICAgICAgaWYgKGMg
PD0gbWF4U2luZ2xlQ2hhcmFjdGVyU3RyaW5nKQogICAgICAgICAgICAgICAgIHJldHVybiBnbG9i
YWxEYXRhLT5zbWFsbFN0cmluZ3Muc2luZ2xlQ2hhcmFjdGVyU3RyaW5nKGdsb2JhbERhdGEsIGMp
OwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmaXh1cFZQdHIoZ2xvYmFsRGF0YSwgSlNTdHJp
bmc6OmNyZWF0ZUhhc090aGVyT3duZXIoKmdsb2JhbERhdGEsIFVTdHJpbmcoU3RyaW5nSW1wbDo6
Y3JlYXRlKHMuaW1wbCgpLCBvZmZzZXQsIGxlbmd0aCkpKSk7CisgICAgICAgIHJldHVybiBmaXh1
cFZQdHIoZ2xvYmFsRGF0YSwgSlNTdHJpbmc6OmNyZWF0ZUhhc090aGVyT3duZXIoKmdsb2JhbERh
dGEsIFN0cmluZ0ltcGw6OmNyZWF0ZShzLmltcGwoKSwgb2Zmc2V0LCBsZW5ndGgpKSk7CiAgICAg
fQogCiAgICAgaW5saW5lIEpTU3RyaW5nKiBqc093bmVkU3RyaW5nKEpTR2xvYmFsRGF0YSogZ2xv
YmFsRGF0YSwgY29uc3QgVVN0cmluZyYgcykKQEAgLTY0Niw3ICszODksNyBAQCBuYW1lc3BhY2Ug
SlNDIHsKICAgICAgICAgICAgIGlmIChjIDw9IG1heFNpbmdsZUNoYXJhY3RlclN0cmluZykKICAg
ICAgICAgICAgICAgICByZXR1cm4gZ2xvYmFsRGF0YS0+c21hbGxTdHJpbmdzLnNpbmdsZUNoYXJh
Y3RlclN0cmluZyhnbG9iYWxEYXRhLCBjKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gZml4
dXBWUHRyKGdsb2JhbERhdGEsIEpTU3RyaW5nOjpjcmVhdGVIYXNPdGhlck93bmVyKCpnbG9iYWxE
YXRhLCBzKSk7CisgICAgICAgIHJldHVybiBmaXh1cFZQdHIoZ2xvYmFsRGF0YSwgSlNTdHJpbmc6
OmNyZWF0ZUhhc090aGVyT3duZXIoKmdsb2JhbERhdGEsIHMuaW1wbCgpKSk7CiAgICAgfQogCiAg
ICAgaW5saW5lIEpTU3RyaW5nKiBqc0VtcHR5U3RyaW5nKEV4ZWNTdGF0ZSogZXhlYykgeyByZXR1
cm4ganNFbXB0eVN0cmluZygmZXhlYy0+Z2xvYmFsRGF0YSgpKTsgfQpAQCAtNzI2LDI1ICs0Njks
NiBAQCBuYW1lc3BhY2UgSlNDIHsKICAgICAgICAgcmV0dXJuIGFzQ2VsbCgpLT50b1N0cmluZyhl
eGVjKTsKICAgICB9CiAKLSAgICBpbmxpbmUgVVN0cmluZyBKU1ZhbHVlOjp0b1ByaW1pdGl2ZVN0
cmluZyhFeGVjU3RhdGUqIGV4ZWMpIGNvbnN0Ci0gICAgewotICAgICAgICBBU1NFUlQoIWlzU3Ry
aW5nKCkpOwotICAgICAgICBpZiAoaXNJbnQzMigpKQotICAgICAgICAgICAgcmV0dXJuIGV4ZWMt
Pmdsb2JhbERhdGEoKS5udW1lcmljU3RyaW5ncy5hZGQoYXNJbnQzMigpKTsKLSAgICAgICAgaWYg
KGlzRG91YmxlKCkpCi0gICAgICAgICAgICByZXR1cm4gZXhlYy0+Z2xvYmFsRGF0YSgpLm51bWVy
aWNTdHJpbmdzLmFkZChhc0RvdWJsZSgpKTsKLSAgICAgICAgaWYgKGlzVHJ1ZSgpKQotICAgICAg
ICAgICAgcmV0dXJuICJ0cnVlIjsKLSAgICAgICAgaWYgKGlzRmFsc2UoKSkKLSAgICAgICAgICAg
IHJldHVybiAiZmFsc2UiOwotICAgICAgICBpZiAoaXNOdWxsKCkpCi0gICAgICAgICAgICByZXR1
cm4gIm51bGwiOwotICAgICAgICBpZiAoaXNVbmRlZmluZWQoKSkKLSAgICAgICAgICAgIHJldHVy
biAidW5kZWZpbmVkIjsKLSAgICAgICAgQVNTRVJUKGlzQ2VsbCgpKTsKLSAgICAgICAgcmV0dXJu
IGFzQ2VsbCgpLT50b1ByaW1pdGl2ZShleGVjLCBOb1ByZWZlcmVuY2UpLnRvU3RyaW5nKGV4ZWMp
OwotICAgIH0KLQogfSAvLyBuYW1lc3BhY2UgSlNDCiAKICNlbmRpZiAvLyBKU1N0cmluZ19oCklu
ZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9KU1ZhbHVlLmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9KU1ZhbHVlLmNwcAkocmV2aXNpb24g
OTc3OTApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9KU1ZhbHVlLmNwcAkod29y
a2luZyBjb3B5KQpAQCAtMjA0LDQgKzIwNCwyOCBAQCBib29sIEpTVmFsdWU6OmlzVmFsaWRDYWxs
ZWUoKQogICAgIHJldHVybiBhc09iamVjdChhc0NlbGwoKSktPmdsb2JhbE9iamVjdCgpOwogfQog
CitKU1N0cmluZyogSlNWYWx1ZTo6dG9QcmltaXRpdmVTdHJpbmcoRXhlY1N0YXRlKiBleGVjKSBj
b25zdAoreworICAgIGlmIChpc1N0cmluZygpKQorICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8
SlNTdHJpbmcqPihhc0NlbGwoKSk7CisgICAgaWYgKGlzSW50MzIoKSkKKyAgICAgICAgcmV0dXJu
IEpTU3RyaW5nOjpjcmVhdGUoZXhlYy0+Z2xvYmFsRGF0YSgpLCBleGVjLT5nbG9iYWxEYXRhKCku
bnVtZXJpY1N0cmluZ3MuYWRkKGFzSW50MzIoKSkuaW1wbCgpKTsKKyAgICBpZiAoaXNEb3VibGUo
KSkKKyAgICAgICAgcmV0dXJuIEpTU3RyaW5nOjpjcmVhdGUoZXhlYy0+Z2xvYmFsRGF0YSgpLCBl
eGVjLT5nbG9iYWxEYXRhKCkubnVtZXJpY1N0cmluZ3MuYWRkKGFzRG91YmxlKCkpLmltcGwoKSk7
CisgICAgaWYgKGlzVHJ1ZSgpKQorICAgICAgICByZXR1cm4gSlNTdHJpbmc6OmNyZWF0ZShleGVj
LT5nbG9iYWxEYXRhKCksIFVTdHJpbmcoInRydWUiKS5pbXBsKCkpOworICAgIGlmIChpc0ZhbHNl
KCkpCisgICAgICAgIHJldHVybiBKU1N0cmluZzo6Y3JlYXRlKGV4ZWMtPmdsb2JhbERhdGEoKSwg
VVN0cmluZygiZmFsc2UiKS5pbXBsKCkpOworICAgIGlmIChpc051bGwoKSkKKyAgICAgICAgcmV0
dXJuIEpTU3RyaW5nOjpjcmVhdGUoZXhlYy0+Z2xvYmFsRGF0YSgpLCBVU3RyaW5nKCJudWxsIiku
aW1wbCgpKTsKKyAgICBpZiAoaXNVbmRlZmluZWQoKSkKKyAgICAgICAgcmV0dXJuIEpTU3RyaW5n
OjpjcmVhdGUoZXhlYy0+Z2xvYmFsRGF0YSgpLCBVU3RyaW5nKCJ1bmRlZmluZWQiKS5pbXBsKCkp
OworCisgICAgQVNTRVJUKGlzQ2VsbCgpKTsKKyAgICBKU1ZhbHVlIHYgPSBhc0NlbGwoKS0+dG9Q
cmltaXRpdmUoZXhlYywgTm9QcmVmZXJlbmNlKTsKKyAgICBpZiAodi5pc1N0cmluZygpKQorICAg
ICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8SlNTdHJpbmcqPih2LmFzQ2VsbCgpKTsKKyAgICByZXR1
cm4gSlNTdHJpbmc6OmNyZWF0ZShleGVjLT5nbG9iYWxEYXRhKCksIHYudG9TdHJpbmcoZXhlYyku
aW1wbCgpKTsKK30KKwogfSAvLyBuYW1lc3BhY2UgSlNDCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvcnVudGltZS9KU1ZhbHVlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRD
b3JlL3J1bnRpbWUvSlNWYWx1ZS5oCShyZXZpc2lvbiA5Nzc5MCkKKysrIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9ydW50aW1lL0pTVmFsdWUuaAkod29ya2luZyBjb3B5KQpAQCAtMTkxLDcgKzE5MSw3
IEBAIG5hbWVzcGFjZSBKU0MgewogICAgICAgICAvLyBiZWVuIHNldCBpbiB0aGUgRXhlY1N0YXRl
IGFscmVhZHkuCiAgICAgICAgIGRvdWJsZSB0b051bWJlcihFeGVjU3RhdGUqKSBjb25zdDsKICAg
ICAgICAgVVN0cmluZyB0b1N0cmluZyhFeGVjU3RhdGUqKSBjb25zdDsKLSAgICAgICAgVVN0cmlu
ZyB0b1ByaW1pdGl2ZVN0cmluZyhFeGVjU3RhdGUqKSBjb25zdDsKKyAgICAgICAgSlNTdHJpbmcq
IHRvUHJpbWl0aXZlU3RyaW5nKEV4ZWNTdGF0ZSopIGNvbnN0OwogICAgICAgICBKU09iamVjdCog
dG9PYmplY3QoRXhlY1N0YXRlKikgY29uc3Q7CiAgICAgICAgIEpTT2JqZWN0KiB0b09iamVjdChF
eGVjU3RhdGUqLCBKU0dsb2JhbE9iamVjdCopIGNvbnN0OwogCkluZGV4OiBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvcnVudGltZS9PcGVyYXRpb25zLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvcnVudGltZS9PcGVyYXRpb25zLmNwcAkocmV2aXNpb24gOTc3OTApCisrKyBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9PcGVyYXRpb25zLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtNTAsMTAgKzUwLDEwIEBAIE5FVkVSX0lOTElORSBKU1ZhbHVlIGpzQWRkU2xvd0Nhc2Uo
Q2FsbEYKICAgICBpZiAocDEuaXNTdHJpbmcoKSkgewogICAgICAgICByZXR1cm4gcDIuaXNTdHJp
bmcoKQogICAgICAgICAgICAgPyBqc1N0cmluZyhjYWxsRnJhbWUsIGFzU3RyaW5nKHAxKSwgYXNT
dHJpbmcocDIpKQotICAgICAgICAgICAgOiBqc1N0cmluZyhjYWxsRnJhbWUsIGFzU3RyaW5nKHAx
KSwgcDIudG9TdHJpbmcoY2FsbEZyYW1lKSk7CisgICAgICAgICAgICA6IGpzU3RyaW5nKGNhbGxG
cmFtZSwgYXNTdHJpbmcocDEpLCBKU1N0cmluZzo6Y3JlYXRlKGNhbGxGcmFtZS0+Z2xvYmFsRGF0
YSgpLCBwMi50b1N0cmluZyhjYWxsRnJhbWUpLmltcGwoKSkpOwogICAgIH0KICAgICBpZiAocDIu
aXNTdHJpbmcoKSkKLSAgICAgICAgcmV0dXJuIGpzU3RyaW5nKGNhbGxGcmFtZSwgcDEudG9TdHJp
bmcoY2FsbEZyYW1lKSwgYXNTdHJpbmcocDIpKTsKKyAgICAgICAgcmV0dXJuIGpzU3RyaW5nKGNh
bGxGcmFtZSwgSlNTdHJpbmc6OmNyZWF0ZShjYWxsRnJhbWUtPmdsb2JhbERhdGEoKSwgcDEudG9T
dHJpbmcoY2FsbEZyYW1lKS5pbXBsKCkpLCBhc1N0cmluZyhwMikpOwogCiAgICAgcmV0dXJuIGpz
TnVtYmVyKHAxLnRvTnVtYmVyKGNhbGxGcmFtZSkgKyBwMi50b051bWJlcihjYWxsRnJhbWUpKTsK
IH0KSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL09wZXJhdGlvbnMuaAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9PcGVyYXRpb25zLmgJKHJl
dmlzaW9uIDk3NzkwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvT3BlcmF0aW9u
cy5oCSh3b3JraW5nIGNvcHkpCkBAIC0zNiw2ICszNiw4IEBAIG5hbWVzcGFjZSBKU0MgewogCiAg
ICAgQUxXQVlTX0lOTElORSBKU1ZhbHVlIGpzU3RyaW5nKEV4ZWNTdGF0ZSogZXhlYywgSlNTdHJp
bmcqIHMxLCBKU1N0cmluZyogczIpCiAgICAgeworICAgICAgICBKU0dsb2JhbERhdGEmIGdsb2Jh
bERhdGEgPSBleGVjLT5nbG9iYWxEYXRhKCk7CisKICAgICAgICAgdW5zaWduZWQgbGVuZ3RoMSA9
IHMxLT5sZW5ndGgoKTsKICAgICAgICAgaWYgKCFsZW5ndGgxKQogICAgICAgICAgICAgcmV0dXJu
IHMyOwpAQCAtNDUsMTk0ICs0Nyw3NiBAQCBuYW1lc3BhY2UgSlNDIHsKICAgICAgICAgaWYgKChs
ZW5ndGgxICsgbGVuZ3RoMikgPCBsZW5ndGgxKQogICAgICAgICAgICAgcmV0dXJuIHRocm93T3V0
T2ZNZW1vcnlFcnJvcihleGVjKTsKIAotICAgICAgICB1bnNpZ25lZCBmaWJlckNvdW50ID0gczEt
PmZpYmVyQ291bnQoKSArIHMyLT5maWJlckNvdW50KCk7Ci0gICAgICAgIEpTR2xvYmFsRGF0YSog
Z2xvYmFsRGF0YSA9ICZleGVjLT5nbG9iYWxEYXRhKCk7Ci0KLSAgICAgICAgaWYgKGZpYmVyQ291
bnQgPD0gSlNTdHJpbmc6OnNfbWF4SW50ZXJuYWxSb3BlTGVuZ3RoKQotICAgICAgICAgICAgcmV0
dXJuIEpTU3RyaW5nOjpjcmVhdGUoKmdsb2JhbERhdGEsIGZpYmVyQ291bnQsIHMxLCBzMik7Ci0K
LSAgICAgICAgSlNTdHJpbmc6OlJvcGVCdWlsZGVyIHJvcGVCdWlsZGVyKGZpYmVyQ291bnQpOwot
ICAgICAgICBpZiAoVU5MSUtFTFkocm9wZUJ1aWxkZXIuaXNPdXRPZk1lbW9yeSgpKSkKLSAgICAg
ICAgICAgIHJldHVybiB0aHJvd091dE9mTWVtb3J5RXJyb3IoZXhlYyk7Ci0gICAgICAgIHJvcGVC
dWlsZGVyLmFwcGVuZChzMSk7Ci0gICAgICAgIHJvcGVCdWlsZGVyLmFwcGVuZChzMik7Ci0gICAg
ICAgIHJldHVybiBKU1N0cmluZzo6Y3JlYXRlKCpnbG9iYWxEYXRhLCByb3BlQnVpbGRlci5yZWxl
YXNlKCkpOwotICAgIH0KLQotICAgIEFMV0FZU19JTkxJTkUgSlNWYWx1ZSBqc1N0cmluZyhFeGVj
U3RhdGUqIGV4ZWMsIGNvbnN0IFVTdHJpbmcmIHUxLCBKU1N0cmluZyogczIpCi0gICAgewotICAg
ICAgICB1bnNpZ25lZCBsZW5ndGgxID0gdTEubGVuZ3RoKCk7Ci0gICAgICAgIGlmICghbGVuZ3Ro
MSkKLSAgICAgICAgICAgIHJldHVybiBzMjsKLSAgICAgICAgdW5zaWduZWQgbGVuZ3RoMiA9IHMy
LT5sZW5ndGgoKTsKLSAgICAgICAgaWYgKCFsZW5ndGgyKQotICAgICAgICAgICAgcmV0dXJuIGpz
U3RyaW5nKGV4ZWMsIHUxKTsKLSAgICAgICAgaWYgKChsZW5ndGgxICsgbGVuZ3RoMikgPCBsZW5n
dGgxKQotICAgICAgICAgICAgcmV0dXJuIHRocm93T3V0T2ZNZW1vcnlFcnJvcihleGVjKTsKLQot
ICAgICAgICB1bnNpZ25lZCBmaWJlckNvdW50ID0gMSArIHMyLT5maWJlckNvdW50KCk7Ci0gICAg
ICAgIEpTR2xvYmFsRGF0YSogZ2xvYmFsRGF0YSA9ICZleGVjLT5nbG9iYWxEYXRhKCk7Ci0KLSAg
ICAgICAgaWYgKGZpYmVyQ291bnQgPD0gSlNTdHJpbmc6OnNfbWF4SW50ZXJuYWxSb3BlTGVuZ3Ro
KQotICAgICAgICAgICAgcmV0dXJuIEpTU3RyaW5nOjpjcmVhdGUoKmdsb2JhbERhdGEsIGZpYmVy
Q291bnQsIHUxLCBzMik7Ci0KLSAgICAgICAgSlNTdHJpbmc6OlJvcGVCdWlsZGVyIHJvcGVCdWls
ZGVyKGZpYmVyQ291bnQpOwotICAgICAgICBpZiAoVU5MSUtFTFkocm9wZUJ1aWxkZXIuaXNPdXRP
Zk1lbW9yeSgpKSkKLSAgICAgICAgICAgIHJldHVybiB0aHJvd091dE9mTWVtb3J5RXJyb3IoZXhl
Yyk7Ci0gICAgICAgIHJvcGVCdWlsZGVyLmFwcGVuZCh1MSk7Ci0gICAgICAgIHJvcGVCdWlsZGVy
LmFwcGVuZChzMik7Ci0gICAgICAgIHJldHVybiBKU1N0cmluZzo6Y3JlYXRlKCpnbG9iYWxEYXRh
LCByb3BlQnVpbGRlci5yZWxlYXNlKCkpOwotICAgIH0KLQotICAgIEFMV0FZU19JTkxJTkUgSlNW
YWx1ZSBqc1N0cmluZyhFeGVjU3RhdGUqIGV4ZWMsIEpTU3RyaW5nKiBzMSwgY29uc3QgVVN0cmlu
ZyYgdTIpCi0gICAgewotICAgICAgICB1bnNpZ25lZCBsZW5ndGgxID0gczEtPmxlbmd0aCgpOwot
ICAgICAgICBpZiAoIWxlbmd0aDEpCi0gICAgICAgICAgICByZXR1cm4ganNTdHJpbmcoZXhlYywg
dTIpOwotICAgICAgICB1bnNpZ25lZCBsZW5ndGgyID0gdTIubGVuZ3RoKCk7Ci0gICAgICAgIGlm
ICghbGVuZ3RoMikKLSAgICAgICAgICAgIHJldHVybiBzMTsKLSAgICAgICAgaWYgKChsZW5ndGgx
ICsgbGVuZ3RoMikgPCBsZW5ndGgxKQotICAgICAgICAgICAgcmV0dXJuIHRocm93T3V0T2ZNZW1v
cnlFcnJvcihleGVjKTsKLQotICAgICAgICB1bnNpZ25lZCBmaWJlckNvdW50ID0gczEtPmZpYmVy
Q291bnQoKSArIDE7Ci0gICAgICAgIEpTR2xvYmFsRGF0YSogZ2xvYmFsRGF0YSA9ICZleGVjLT5n
bG9iYWxEYXRhKCk7Ci0KLSAgICAgICAgaWYgKGZpYmVyQ291bnQgPD0gSlNTdHJpbmc6OnNfbWF4
SW50ZXJuYWxSb3BlTGVuZ3RoKQotICAgICAgICAgICAgcmV0dXJuIEpTU3RyaW5nOjpjcmVhdGUo
Kmdsb2JhbERhdGEsIGZpYmVyQ291bnQsIHMxLCB1Mik7Ci0KLSAgICAgICAgSlNTdHJpbmc6OlJv
cGVCdWlsZGVyIHJvcGVCdWlsZGVyKGZpYmVyQ291bnQpOwotICAgICAgICBpZiAoVU5MSUtFTFko
cm9wZUJ1aWxkZXIuaXNPdXRPZk1lbW9yeSgpKSkKLSAgICAgICAgICAgIHJldHVybiB0aHJvd091
dE9mTWVtb3J5RXJyb3IoZXhlYyk7Ci0gICAgICAgIHJvcGVCdWlsZGVyLmFwcGVuZChzMSk7Ci0g
ICAgICAgIHJvcGVCdWlsZGVyLmFwcGVuZCh1Mik7Ci0gICAgICAgIHJldHVybiBKU1N0cmluZzo6
Y3JlYXRlKCpnbG9iYWxEYXRhLCByb3BlQnVpbGRlci5yZWxlYXNlKCkpOwotICAgIH0KLQotICAg
IEFMV0FZU19JTkxJTkUgSlNWYWx1ZSBqc1N0cmluZyhFeGVjU3RhdGUqIGV4ZWMsIGNvbnN0IFVT
dHJpbmcmIHUxLCBjb25zdCBVU3RyaW5nJiB1MikKLSAgICB7Ci0gICAgICAgIHVuc2lnbmVkIGxl
bmd0aDEgPSB1MS5sZW5ndGgoKTsKLSAgICAgICAgaWYgKCFsZW5ndGgxKQotICAgICAgICAgICAg
cmV0dXJuIGpzU3RyaW5nKGV4ZWMsIHUyKTsKLSAgICAgICAgdW5zaWduZWQgbGVuZ3RoMiA9IHUy
Lmxlbmd0aCgpOwotICAgICAgICBpZiAoIWxlbmd0aDIpCi0gICAgICAgICAgICByZXR1cm4ganNT
dHJpbmcoZXhlYywgdTEpOwotICAgICAgICBpZiAoKGxlbmd0aDEgKyBsZW5ndGgyKSA8IGxlbmd0
aDEpCi0gICAgICAgICAgICByZXR1cm4gdGhyb3dPdXRPZk1lbW9yeUVycm9yKGV4ZWMpOwotCi0g
ICAgICAgIEpTR2xvYmFsRGF0YSogZ2xvYmFsRGF0YSA9ICZleGVjLT5nbG9iYWxEYXRhKCk7Ci0g
ICAgICAgIHJldHVybiBKU1N0cmluZzo6Y3JlYXRlKCpnbG9iYWxEYXRhLCB1MSwgdTIpOworICAg
ICAgICByZXR1cm4gSlNTdHJpbmc6OmNyZWF0ZShnbG9iYWxEYXRhLCBzMSwgczIpOwogICAgIH0K
IAogICAgIEFMV0FZU19JTkxJTkUgSlNWYWx1ZSBqc1N0cmluZyhFeGVjU3RhdGUqIGV4ZWMsIGNv
bnN0IFVTdHJpbmcmIHUxLCBjb25zdCBVU3RyaW5nJiB1MiwgY29uc3QgVVN0cmluZyYgdTMpCiAg
ICAgeworICAgICAgICBKU0dsb2JhbERhdGEmIGdsb2JhbERhdGEgPSBleGVjLT5nbG9iYWxEYXRh
KCk7CisKICAgICAgICAgdW5zaWduZWQgbGVuZ3RoMSA9IHUxLmxlbmd0aCgpOwogICAgICAgICB1
bnNpZ25lZCBsZW5ndGgyID0gdTIubGVuZ3RoKCk7CiAgICAgICAgIHVuc2lnbmVkIGxlbmd0aDMg
PSB1My5sZW5ndGgoKTsKICAgICAgICAgaWYgKCFsZW5ndGgxKQotICAgICAgICAgICAgcmV0dXJu
IGpzU3RyaW5nKGV4ZWMsIHUyLCB1Myk7CisgICAgICAgICAgICByZXR1cm4ganNTdHJpbmcoZXhl
YywgSlNTdHJpbmc6OmNyZWF0ZShnbG9iYWxEYXRhLCB1Mi5pbXBsKCkpLCBKU1N0cmluZzo6Y3Jl
YXRlKGdsb2JhbERhdGEsIHUzLmltcGwoKSkpOwogICAgICAgICBpZiAoIWxlbmd0aDIpCi0gICAg
ICAgICAgICByZXR1cm4ganNTdHJpbmcoZXhlYywgdTEsIHUzKTsKKyAgICAgICAgICAgIHJldHVy
biBqc1N0cmluZyhleGVjLCBKU1N0cmluZzo6Y3JlYXRlKGdsb2JhbERhdGEsIHUxLmltcGwoKSks
IEpTU3RyaW5nOjpjcmVhdGUoZ2xvYmFsRGF0YSwgdTMuaW1wbCgpKSk7CiAgICAgICAgIGlmICgh
bGVuZ3RoMykKLSAgICAgICAgICAgIHJldHVybiBqc1N0cmluZyhleGVjLCB1MSwgdTIpOworICAg
ICAgICAgICAgcmV0dXJuIGpzU3RyaW5nKGV4ZWMsIEpTU3RyaW5nOjpjcmVhdGUoZ2xvYmFsRGF0
YSwgdTEuaW1wbCgpKSwgSlNTdHJpbmc6OmNyZWF0ZShnbG9iYWxEYXRhLCB1Mi5pbXBsKCkpKTsK
IAogICAgICAgICBpZiAoKGxlbmd0aDEgKyBsZW5ndGgyKSA8IGxlbmd0aDEpCiAgICAgICAgICAg
ICByZXR1cm4gdGhyb3dPdXRPZk1lbW9yeUVycm9yKGV4ZWMpOwogICAgICAgICBpZiAoKGxlbmd0
aDEgKyBsZW5ndGgyICsgbGVuZ3RoMykgPCBsZW5ndGgzKQogICAgICAgICAgICAgcmV0dXJuIHRo
cm93T3V0T2ZNZW1vcnlFcnJvcihleGVjKTsKIAotICAgICAgICBKU0dsb2JhbERhdGEqIGdsb2Jh
bERhdGEgPSAmZXhlYy0+Z2xvYmFsRGF0YSgpOwotICAgICAgICByZXR1cm4gSlNTdHJpbmc6OmNy
ZWF0ZSgqZ2xvYmFsRGF0YSwgdTEsIHUyLCB1Myk7CisgICAgICAgIHJldHVybiBKU1N0cmluZzo6
Y3JlYXRlKGV4ZWMtPmdsb2JhbERhdGEoKSwgSlNTdHJpbmc6OmNyZWF0ZShnbG9iYWxEYXRhLCB1
MS5pbXBsKCkpLCBKU1N0cmluZzo6Y3JlYXRlKGdsb2JhbERhdGEsIHUyLmltcGwoKSksIEpTU3Ry
aW5nOjpjcmVhdGUoZ2xvYmFsRGF0YSwgdTMuaW1wbCgpKSk7CiAgICAgfQogCiAgICAgQUxXQVlT
X0lOTElORSBKU1ZhbHVlIGpzU3RyaW5nKEV4ZWNTdGF0ZSogZXhlYywgUmVnaXN0ZXIqIHN0cmlu
Z3MsIHVuc2lnbmVkIGNvdW50KQogICAgIHsKLSAgICAgICAgQVNTRVJUKGNvdW50ID49IDMpOwor
ICAgICAgICBKU0dsb2JhbERhdGEmIGdsb2JhbERhdGEgPSBleGVjLT5nbG9iYWxEYXRhKCk7Cisg
ICAgICAgIEpTU3RyaW5nOjpSb3BlQnVpbGRlciByb3BlQnVpbGRlcihnbG9iYWxEYXRhKTsKIAot
ICAgICAgICB1bnNpZ25lZCBmaWJlckNvdW50ID0gMDsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBp
ID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLSAgICAgICAgICAgIEpTVmFsdWUgdiA9IHN0cmluZ3Nb
aV0uanNWYWx1ZSgpOwotICAgICAgICAgICAgaWYgKExJS0VMWSh2LmlzU3RyaW5nKCkpKQotICAg
ICAgICAgICAgICAgIGZpYmVyQ291bnQgKz0gYXNTdHJpbmcodiktPmZpYmVyQ291bnQoKTsKLSAg
ICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICArK2ZpYmVyQ291bnQ7Ci0gICAgICAgIH0K
LQotICAgICAgICBKU0dsb2JhbERhdGEqIGdsb2JhbERhdGEgPSAmZXhlYy0+Z2xvYmFsRGF0YSgp
OwotICAgICAgICBpZiAoZmliZXJDb3VudCA9PSAzKQotICAgICAgICAgICAgcmV0dXJuIEpTU3Ry
aW5nOjpjcmVhdGUoZXhlYywgc3RyaW5nc1swXS5qc1ZhbHVlKCksIHN0cmluZ3NbMV0uanNWYWx1
ZSgpLCBzdHJpbmdzWzJdLmpzVmFsdWUoKSk7Ci0KLSAgICAgICAgSlNTdHJpbmc6OlJvcGVCdWls
ZGVyIHJvcGVCdWlsZGVyKGZpYmVyQ291bnQpOwotICAgICAgICBpZiAoVU5MSUtFTFkocm9wZUJ1
aWxkZXIuaXNPdXRPZk1lbW9yeSgpKSkKLSAgICAgICAgICAgIHJldHVybiB0aHJvd091dE9mTWVt
b3J5RXJyb3IoZXhlYyk7Ci0KLSAgICAgICAgdW5zaWduZWQgbGVuZ3RoID0gMDsKLSAgICAgICAg
Ym9vbCBvdmVyZmxvdyA9IGZhbHNlOworICAgICAgICB1bnNpZ25lZCBvbGRMZW5ndGggPSAwOwog
CiAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CiAgICAgICAg
ICAgICBKU1ZhbHVlIHYgPSBzdHJpbmdzW2ldLmpzVmFsdWUoKTsKLSAgICAgICAgICAgIGlmIChM
SUtFTFkodi5pc1N0cmluZygpKSkKKyAgICAgICAgICAgIGlmICh2LmlzU3RyaW5nKCkpCiAgICAg
ICAgICAgICAgICAgcm9wZUJ1aWxkZXIuYXBwZW5kKGFzU3RyaW5nKHYpKTsKICAgICAgICAgICAg
IGVsc2UKLSAgICAgICAgICAgICAgICByb3BlQnVpbGRlci5hcHBlbmQodi50b1N0cmluZyhleGVj
KSk7CisgICAgICAgICAgICAgICAgcm9wZUJ1aWxkZXIuYXBwZW5kKEpTU3RyaW5nOjpjcmVhdGUo
Z2xvYmFsRGF0YSwgdi50b1N0cmluZyhleGVjKS5pbXBsKCkpKTsKIAotICAgICAgICAgICAgdW5z
aWduZWQgbmV3TGVuZ3RoID0gcm9wZUJ1aWxkZXIubGVuZ3RoKCk7Ci0gICAgICAgICAgICBpZiAo
bmV3TGVuZ3RoIDwgbGVuZ3RoKQotICAgICAgICAgICAgICAgIG92ZXJmbG93ID0gdHJ1ZTsKLSAg
ICAgICAgICAgIGxlbmd0aCA9IG5ld0xlbmd0aDsKKyAgICAgICAgICAgIGlmIChyb3BlQnVpbGRl
ci5sZW5ndGgoKSA8IG9sZExlbmd0aCkgLy8gVHJ1ZSBmb3Igb3ZlcmZsb3cKKyAgICAgICAgICAg
ICAgICByZXR1cm4gdGhyb3dPdXRPZk1lbW9yeUVycm9yKGV4ZWMpOwogICAgICAgICB9CiAKLSAg
ICAgICAgaWYgKG92ZXJmbG93KQotICAgICAgICAgICAgcmV0dXJuIHRocm93T3V0T2ZNZW1vcnlF
cnJvcihleGVjKTsKLQotICAgICAgICByZXR1cm4gSlNTdHJpbmc6OmNyZWF0ZSgqZ2xvYmFsRGF0
YSwgcm9wZUJ1aWxkZXIucmVsZWFzZSgpKTsKKyAgICAgICAgcmV0dXJuIHJvcGVCdWlsZGVyLnJl
bGVhc2UoKTsKICAgICB9CiAKICAgICBBTFdBWVNfSU5MSU5FIEpTVmFsdWUganNTdHJpbmcoRXhl
Y1N0YXRlKiBleGVjLCBKU1ZhbHVlIHRoaXNWYWx1ZSkKICAgICB7Ci0gICAgICAgIHVuc2lnbmVk
IGZpYmVyQ291bnQgPSAwOwotICAgICAgICBpZiAoTElLRUxZKHRoaXNWYWx1ZS5pc1N0cmluZygp
KSkKLSAgICAgICAgICAgIGZpYmVyQ291bnQgKz0gYXNTdHJpbmcodGhpc1ZhbHVlKS0+ZmliZXJD
b3VudCgpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICArK2ZpYmVyQ291bnQ7Ci0gICAgICAg
IGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBleGVjLT5hcmd1bWVudENvdW50KCk7ICsraSkgewot
ICAgICAgICAgICAgSlNWYWx1ZSB2ID0gZXhlYy0+YXJndW1lbnQoaSk7Ci0gICAgICAgICAgICBp
ZiAoTElLRUxZKHYuaXNTdHJpbmcoKSkpCi0gICAgICAgICAgICAgICAgZmliZXJDb3VudCArPSBh
c1N0cmluZyh2KS0+ZmliZXJDb3VudCgpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAg
ICAgICsrZmliZXJDb3VudDsKLSAgICAgICAgfQorICAgICAgICBKU0dsb2JhbERhdGEmIGdsb2Jh
bERhdGEgPSBleGVjLT5nbG9iYWxEYXRhKCk7CisgICAgICAgIEpTU3RyaW5nOjpSb3BlQnVpbGRl
ciByb3BlQnVpbGRlcihnbG9iYWxEYXRhKTsKIAotICAgICAgICBKU1N0cmluZzo6Um9wZUJ1aWxk
ZXIgcm9wZUJ1aWxkZXIoZmliZXJDb3VudCk7Ci0gICAgICAgIGlmIChVTkxJS0VMWShyb3BlQnVp
bGRlci5pc091dE9mTWVtb3J5KCkpKQotICAgICAgICAgICAgcmV0dXJuIHRocm93T3V0T2ZNZW1v
cnlFcnJvcihleGVjKTsKLQotICAgICAgICBpZiAoTElLRUxZKHRoaXNWYWx1ZS5pc1N0cmluZygp
KSkKKyAgICAgICAgaWYgKHRoaXNWYWx1ZS5pc1N0cmluZygpKQogICAgICAgICAgICAgcm9wZUJ1
aWxkZXIuYXBwZW5kKGFzU3RyaW5nKHRoaXNWYWx1ZSkpOwogICAgICAgICBlbHNlCi0gICAgICAg
ICAgICByb3BlQnVpbGRlci5hcHBlbmQodGhpc1ZhbHVlLnRvU3RyaW5nKGV4ZWMpKTsKKyAgICAg
ICAgICAgIHJvcGVCdWlsZGVyLmFwcGVuZChKU1N0cmluZzo6Y3JlYXRlKGdsb2JhbERhdGEsIHRo
aXNWYWx1ZS50b1N0cmluZyhleGVjKS5pbXBsKCkpKTsKIAotICAgICAgICB1bnNpZ25lZCBsZW5n
dGggPSAwOwotICAgICAgICBib29sIG92ZXJmbG93ID0gZmFsc2U7CisgICAgICAgIHVuc2lnbmVk
IG9sZExlbmd0aCA9IDA7CiAKICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGV4ZWMt
PmFyZ3VtZW50Q291bnQoKTsgKytpKSB7CiAgICAgICAgICAgICBKU1ZhbHVlIHYgPSBleGVjLT5h
cmd1bWVudChpKTsKLSAgICAgICAgICAgIGlmIChMSUtFTFkodi5pc1N0cmluZygpKSkKKyAgICAg
ICAgICAgIGlmICh2LmlzU3RyaW5nKCkpCiAgICAgICAgICAgICAgICAgcm9wZUJ1aWxkZXIuYXBw
ZW5kKGFzU3RyaW5nKHYpKTsKICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByb3Bl
QnVpbGRlci5hcHBlbmQodi50b1N0cmluZyhleGVjKSk7CisgICAgICAgICAgICAgICAgcm9wZUJ1
aWxkZXIuYXBwZW5kKEpTU3RyaW5nOjpjcmVhdGUoZ2xvYmFsRGF0YSwgdi50b1N0cmluZyhleGVj
KS5pbXBsKCkpKTsKIAotICAgICAgICAgICAgdW5zaWduZWQgbmV3TGVuZ3RoID0gcm9wZUJ1aWxk
ZXIubGVuZ3RoKCk7Ci0gICAgICAgICAgICBpZiAobmV3TGVuZ3RoIDwgbGVuZ3RoKQotICAgICAg
ICAgICAgICAgIG92ZXJmbG93ID0gdHJ1ZTsKLSAgICAgICAgICAgIGxlbmd0aCA9IG5ld0xlbmd0
aDsKKyAgICAgICAgICAgIGlmIChyb3BlQnVpbGRlci5sZW5ndGgoKSA8IG9sZExlbmd0aCkgLy8g
VHJ1ZSBmb3Igb3ZlcmZsb3cKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhyb3dPdXRPZk1lbW9y
eUVycm9yKGV4ZWMpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKG92ZXJmbG93KQotICAgICAg
ICAgICAgcmV0dXJuIHRocm93T3V0T2ZNZW1vcnlFcnJvcihleGVjKTsKLQotICAgICAgICBKU0ds
b2JhbERhdGEqIGdsb2JhbERhdGEgPSAmZXhlYy0+Z2xvYmFsRGF0YSgpOwotICAgICAgICByZXR1
cm4gSlNTdHJpbmc6OmNyZWF0ZSgqZ2xvYmFsRGF0YSwgcm9wZUJ1aWxkZXIucmVsZWFzZSgpKTsK
KyAgICAgICAgcmV0dXJuIHJvcGVCdWlsZGVyLnJlbGVhc2UoKTsKICAgICB9CiAKICAgICAvLyBF
Q01BIDExLjkuMwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvU21hbGxTdHJp
bmdzLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9TbWFs
bFN0cmluZ3MuY3BwCShyZXZpc2lvbiA5Nzc5MCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9y
dW50aW1lL1NtYWxsU3RyaW5ncy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEwNiw3ICsxMDYsNyBA
QCB1bnNpZ25lZCBTbWFsbFN0cmluZ3M6OmNvdW50KCkgY29uc3QKIHZvaWQgU21hbGxTdHJpbmdz
OjpjcmVhdGVFbXB0eVN0cmluZyhKU0dsb2JhbERhdGEqIGdsb2JhbERhdGEpCiB7CiAgICAgQVNT
RVJUKCFtX2VtcHR5U3RyaW5nKTsKLSAgICBtX2VtcHR5U3RyaW5nID0gSlNTdHJpbmc6OmNyZWF0
ZUhhc090aGVyT3duZXIoKmdsb2JhbERhdGEsICIiKTsKKyAgICBtX2VtcHR5U3RyaW5nID0gSlNT
dHJpbmc6OmNyZWF0ZUhhc090aGVyT3duZXIoKmdsb2JhbERhdGEsIFVTdHJpbmcoIiIpLmltcGwo
KSk7CiB9CiAKIHZvaWQgU21hbGxTdHJpbmdzOjpjcmVhdGVTaW5nbGVDaGFyYWN0ZXJTdHJpbmco
SlNHbG9iYWxEYXRhKiBnbG9iYWxEYXRhLCB1bnNpZ25lZCBjaGFyIGNoYXJhY3RlcikKSW5kZXg6
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL1N0cmluZ0NvbnN0cnVjdG9yLmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9TdHJpbmdDb25zdHJ1Y3Rv
ci5jcHAJKHJldmlzaW9uIDk3NzkwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUv
U3RyaW5nQ29uc3RydWN0b3IuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC05OCw3ICs5OCwxMSBAQCBz
dGF0aWMgRW5jb2RlZEpTVmFsdWUgSlNDX0hPU1RfQ0FMTCBjb25zCiAgICAgSlNHbG9iYWxPYmpl
Y3QqIGdsb2JhbE9iamVjdCA9IGFzSW50ZXJuYWxGdW5jdGlvbihleGVjLT5jYWxsZWUoKSktPmds
b2JhbE9iamVjdCgpOwogICAgIGlmICghZXhlYy0+YXJndW1lbnRDb3VudCgpKQogICAgICAgICBy
ZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKFN0cmluZ09iamVjdDo6Y3JlYXRlKGV4ZWMsIGdsb2JhbE9i
amVjdC0+c3RyaW5nT2JqZWN0U3RydWN0dXJlKCkpKTsKLSAgICByZXR1cm4gSlNWYWx1ZTo6ZW5j
b2RlKFN0cmluZ09iamVjdDo6Y3JlYXRlKGV4ZWMsIGdsb2JhbE9iamVjdC0+c3RyaW5nT2JqZWN0
U3RydWN0dXJlKCksIGV4ZWMtPmFyZ3VtZW50KDApLnRvU3RyaW5nKGV4ZWMpKSk7CisgICAgCisg
ICAgSlNTdHJpbmcqIHN0cmluZyA9IGV4ZWMtPmFyZ3VtZW50KDApLmlzU3RyaW5nKCkKKyAgICAg
ICAgPyBhc1N0cmluZyhleGVjLT5hcmd1bWVudCgwKSkKKyAgICAgICAgOiBKU1N0cmluZzo6Y3Jl
YXRlKGV4ZWMtPmdsb2JhbERhdGEoKSwgZXhlYy0+YXJndW1lbnQoMCkudG9TdHJpbmcoZXhlYyku
aW1wbCgpKTsKKyAgICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKFN0cmluZ09iamVjdDo6Y3JlYXRl
KGV4ZWMsIGdsb2JhbE9iamVjdC0+c3RyaW5nT2JqZWN0U3RydWN0dXJlKCksIHN0cmluZykpOwog
fQogCiBDb25zdHJ1Y3RUeXBlIFN0cmluZ0NvbnN0cnVjdG9yOjpnZXRDb25zdHJ1Y3REYXRhVmly
dHVhbChDb25zdHJ1Y3REYXRhJiBjb25zdHJ1Y3REYXRhKQpJbmRleDogU291cmNlL0phdmFTY3Jp
cHRDb3JlL3J1bnRpbWUvU3RyaW5nT2JqZWN0LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFT
Y3JpcHRDb3JlL3J1bnRpbWUvU3RyaW5nT2JqZWN0LmgJKHJldmlzaW9uIDk3NzkwKQorKysgU291
cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvU3RyaW5nT2JqZWN0LmgJKHdvcmtpbmcgY29weSkK
QEAgLTM3LDkgKzM3LDggQEAgbmFtZXNwYWNlIEpTQyB7CiAgICAgICAgICAgICBvYmplY3QtPmZp
bmlzaENyZWF0aW9uKGV4ZWMtPmdsb2JhbERhdGEoKSwgc3RyaW5nKTsKICAgICAgICAgICAgIHJl
dHVybiBvYmplY3Q7CiAgICAgICAgIH0KLSAgICAgICAgc3RhdGljIFN0cmluZ09iamVjdCogY3Jl
YXRlKEV4ZWNTdGF0ZSogZXhlYywgU3RydWN0dXJlKiBzdHJ1Y3R1cmUsIGNvbnN0IFVTdHJpbmcm
IHN0cikKKyAgICAgICAgc3RhdGljIFN0cmluZ09iamVjdCogY3JlYXRlKEV4ZWNTdGF0ZSogZXhl
YywgU3RydWN0dXJlKiBzdHJ1Y3R1cmUsIEpTU3RyaW5nKiBzdHJpbmcpCiAgICAgICAgIHsKLSAg
ICAgICAgICAgIEpTU3RyaW5nKiBzdHJpbmcgPSBqc1N0cmluZyhleGVjLCBzdHIpOwogICAgICAg
ICAgICAgU3RyaW5nT2JqZWN0KiBvYmplY3QgPSBuZXcgKGFsbG9jYXRlQ2VsbDxTdHJpbmdPYmpl
Y3Q+KCpleGVjLT5oZWFwKCkpKSBTdHJpbmdPYmplY3QoZXhlYy0+Z2xvYmFsRGF0YSgpLCBzdHJ1
Y3R1cmUpOwogICAgICAgICAgICAgb2JqZWN0LT5maW5pc2hDcmVhdGlvbihleGVjLT5nbG9iYWxE
YXRhKCksIHN0cmluZyk7CiAgICAgICAgICAgICByZXR1cm4gb2JqZWN0OwpJbmRleDogU291cmNl
L0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvU3RyaW5nUHJvdG90eXBlLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9TdHJpbmdQcm90b3R5cGUuY3BwCShyZXZp
c2lvbiA5Nzc5MCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL1N0cmluZ1Byb3Rv
dHlwZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTYzNyw3ICs2MzcsNyBAQCBFbmNvZGVkSlNWYWx1
ZSBKU0NfSE9TVF9DQUxMIHN0cmluZ1Byb3RvCiAgICAgICAgIEpTVmFsdWUgdiA9IGV4ZWMtPmFy
Z3VtZW50KDApOwogICAgICAgICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKHYuaXNTdHJpbmcoKQog
ICAgICAgICAgICAgPyBqc1N0cmluZyhleGVjLCBhc1N0cmluZyh0aGlzVmFsdWUpLCBhc1N0cmlu
Zyh2KSkKLSAgICAgICAgICAgIDoganNTdHJpbmcoZXhlYywgYXNTdHJpbmcodGhpc1ZhbHVlKSwg
di50b1N0cmluZyhleGVjKSkpOworICAgICAgICAgICAgOiBqc1N0cmluZyhleGVjLCBhc1N0cmlu
Zyh0aGlzVmFsdWUpLCBKU1N0cmluZzo6Y3JlYXRlKGV4ZWMtPmdsb2JhbERhdGEoKSwgdi50b1N0
cmluZyhleGVjKS5pbXBsKCkpKSk7CiAgICAgfQogICAgIGlmICh0aGlzVmFsdWUuaXNVbmRlZmlu
ZWRPck51bGwoKSkgLy8gQ2hlY2tPYmplY3RDb2VyY2libGUKICAgICAgICAgcmV0dXJuIHRocm93
Vk1UeXBlRXJyb3IoZXhlYyk7Cg==
</data>
<flag name="review"
          id="109352"
          type_id="1"
          status="+"
          setter="barraclough"
    />
          </attachment>
      

    </bug>

</bugzilla>