<?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>195895</bug_id>
          
          <creation_ts>2019-03-18 10:53:12 -0700</creation_ts>
          <short_desc>[BMalloc] Scavenger should react to recent memory activity</short_desc>
          <delta_ts>2019-03-22 10:32:40 -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>bmalloc</component>
          <version>WebKit 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>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Michael Saboff">msaboff</reporter>
          <assigned_to name="Michael Saboff">msaboff</assigned_to>
          <cc>ggaren</cc>
    
    <cc>mcatanzaro</cc>
    
    <cc>saam</cc>
    
    <cc>webkit-bug-importer</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1517780</commentid>
    <comment_count>0</comment_count>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2019-03-18 10:53:12 -0700</bug_when>
    <thetext>The current bmalloc scavenging code code uses fixed timeouts to schedule scavenging.  It has two scavenging modes, a full scavenge and a partial scavenge.  The partial scavenge only frees LargeRanges, while the full scavenge will free objects of various sizes.

We have discussed changing the scavenger so that it adapts to the current sizes of the various freelists as well as not freeing items on a freelist if it has been recently used.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1517781</commentid>
    <comment_count>1</comment_count>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2019-03-18 10:53:22 -0700</bug_when>
    <thetext>&lt;rdar://problem/48517629&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1517814</commentid>
    <comment_count>2</comment_count>
      <attachid>365037</attachid>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2019-03-18 11:31:14 -0700</bug_when>
    <thetext>Created attachment 365037
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1517938</commentid>
    <comment_count>3</comment_count>
      <attachid>365037</attachid>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2019-03-18 14:54:25 -0700</bug_when>
    <thetext>Comment on attachment 365037
Patch

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

r=me

Please make sure this is unrelated:

** The following JSC stress test failures have been introduced:
	stress/symbol-is-destructed-before-refing-underlying-symbol-impl.js.default

&gt; Source/bmalloc/bmalloc/Chunk.h:66
&gt; +    unsigned char m_usedSinceLastScavenge: 1;

Might as well just say bool here, since we aren&apos;t saving any bits.

&gt; Source/bmalloc/bmalloc/Heap.cpp:532
&gt; +        range.setUsedSinceLastScavenge();

We don&apos;t need this explicit set because &apos;range&apos; is a temporary.

&gt; Source/bmalloc/bmalloc/LargeRange.h:60
&gt; +        , m_usedSinceLastScavenge(true)

I think m_used should default to false, and be set to true inside LargeMap::add. That&apos;s a little clearer.

In the future, we can consider whether it&apos;s really optimal for any allocation from a large range to prevent reclamation of the unused portion(s) of the large range.

&gt; Source/bmalloc/bmalloc/LargeRange.h:101
&gt; +    unsigned m_isEligible: 1;

I think m_isEligible is a leftover from the previous partial strategy. You should remove it in a follow-up patch.

&gt; Source/bmalloc/bmalloc/LargeRange.h:102
&gt; +    unsigned m_usedSinceLastScavenge: 1;

You should update the merge function to OR together the m_used bits. I don&apos;t think that changes behavior for now, but it&apos;s good hygiene.

&gt; Source/bmalloc/bmalloc/Scavenger.cpp:340
&gt; +        if (m_isInMiniMode)
&gt; +            m_waitTime = std::min(std::max(static_cast&lt;long&gt;(timeSpentScavenging) * 50L / 1000L, 25L), 500L);
&gt; +        else
&gt; +            m_waitTime = std::min(std::max(static_cast&lt;long&gt;(timeSpentScavenging) * 150L / 1000L, 100L), 10000L);

Let&apos;s do the conversion to milliseconds at the end, so that it&apos;s not embedded inside the min/max logic. Also, can we do the conversion using duration_cast rather than manual multiplication?

&gt; Source/bmalloc/bmalloc/Scavenger.h:95
&gt; +    long m_waitTime;

It looks like we always interpret m_waitTime as std::chrono::milliseconds. Can you set the datatype to std::chrono::milliseconds?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1517951</commentid>
    <comment_count>4</comment_count>
      <attachid>365037</attachid>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2019-03-18 15:20:48 -0700</bug_when>
    <thetext>Comment on attachment 365037
Patch

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

r=me

&gt; Source/bmalloc/bmalloc/Heap.cpp:188
&gt; +                if (page-&gt;usedSinceLastScavenge()) {
&gt; +                    page-&gt;clearUsedSinceLastScavenge();
&gt; +                    continue;
&gt; +                }

There&apos;s a tiny bug where we might not do another scavenge, and we might never free this memory (if no further freeing happens promptly).

You can fix that by setting our state back to RunSoon here.

&gt; Source/bmalloc/bmalloc/Heap.cpp:214
&gt; +        for (auto iter = list.begin(); iter != list.end(); ) {
&gt; +            Chunk* chunk = *iter;
&gt; +            if (chunk-&gt;usedSinceLastScavenge()) {
&gt; +                chunk-&gt;clearUsedSinceLastScavenge();
&gt; +                ++iter;
&gt; +                continue;
&gt; +            }
&gt; +            ++iter;
&gt; +            list.remove(chunk);
&gt; +            deallocateSmallChunk(chunk, &amp;list - &amp;m_chunkCache[0]);
&gt; +        }

This code will wait for four scavenges before it decommits small chunk memory: The first scavenge clears the bit; the second puts the chunk in the large free list; the third clears the bit in the large free list; and the fourth frees it.

My suggestion (possibly for a follow-up patch): There&apos;s really no reason for a Chunk to track usedSinceLastScavenge(). When we free a Chunk, we don&apos;t madvise; we just put it in the large free list. So we can do that right away.

&gt; Source/bmalloc/bmalloc/Heap.cpp:221
&gt; +        if (range.usedSinceLastScavenge()) {
&gt; +            range.clearUsedSinceLastScavenge();
&gt; +            continue;
&gt; +        }

Same comment about RunSoon.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1518335</commentid>
    <comment_count>5</comment_count>
      <attachid>365180</attachid>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2019-03-19 10:30:25 -0700</bug_when>
    <thetext>Created attachment 365180
Patch for landing</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1518336</commentid>
    <comment_count>6</comment_count>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2019-03-19 10:31:03 -0700</bug_when>
    <thetext>Committed r243144: &lt;https://trac.webkit.org/changeset/243144&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1518491</commentid>
    <comment_count>7</comment_count>
    <who name="Michael Catanzaro">mcatanzaro</who>
    <bug_when>2019-03-19 13:07:59 -0700</bug_when>
    <thetext>Committed r243165: &lt;https://trac.webkit.org/changeset/243165&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1520069</commentid>
    <comment_count>8</comment_count>
      <attachid>365037</attachid>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2019-03-21 17:44:40 -0700</bug_when>
    <thetext>Comment on attachment 365037
Patch

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

&gt;&gt; Source/bmalloc/bmalloc/Heap.cpp:214
&gt;&gt; +        }
&gt; 
&gt; This code will wait for four scavenges before it decommits small chunk memory: The first scavenge clears the bit; the second puts the chunk in the large free list; the third clears the bit in the large free list; and the fourth frees it.
&gt; 
&gt; My suggestion (possibly for a follow-up patch): There&apos;s really no reason for a Chunk to track usedSinceLastScavenge(). When we free a Chunk, we don&apos;t madvise; we just put it in the large free list. So we can do that right away.

This change is being handled in &lt;https://bugs.webkit.org/show_bug.cgi?id=196121&gt;.

&gt;&gt; Source/bmalloc/bmalloc/LargeRange.h:101
&gt;&gt; +    unsigned m_isEligible: 1;
&gt; 
&gt; I think m_isEligible is a leftover from the previous partial strategy. You should remove it in a follow-up patch.

The isEligible code is needed as it keeps track of whether or not a range is scheduled for recommitting (scavenging).  We can&apos;t merge a range that might be decommitted with one that already has been.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1520398</commentid>
    <comment_count>9</comment_count>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2019-03-22 10:32:40 -0700</bug_when>
    <thetext>&gt; &gt;&gt; Source/bmalloc/bmalloc/LargeRange.h:101
&gt; &gt;&gt; +    unsigned m_isEligible: 1;
&gt; &gt; 
&gt; &gt; I think m_isEligible is a leftover from the previous partial strategy. You should remove it in a follow-up patch.
&gt; 
&gt; The isEligible code is needed as it keeps track of whether or not a range is
&gt; scheduled for recommitting (scavenging).  We can&apos;t merge a range that might
&gt; be decommitted with one that already has been.

We don&apos;t schedule ranges for future scavenging anymore; we scavenge them synchronously while holding the malloc lock.

Also, we can merge a decommitted range with a committed range. Our strategy, encoded in the merge() function, is that we merge the ranges and, as an optimization, remember the left-most committed portion of the range. This is correct because it is OK to commit an already committed range. And it is optimal because it is very important to avoid fragmentation in large free ranges.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>365037</attachid>
            <date>2019-03-18 11:31:14 -0700</date>
            <delta_ts>2019-03-18 14:54:25 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>195895.patch</filename>
            <type>text/plain</type>
            <size>23580</size>
            <attacher name="Michael Saboff">msaboff</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9ibWFsbG9jL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvYm1h
bGxvYy9DaGFuZ2VMb2cJKHJldmlzaW9uIDI0MzA4NSkKKysrIFNvdXJjZS9ibWFsbG9jL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDU4IEBACisyMDE5LTAzLTE4ICBNaWNoYWVs
IFNhYm9mZiAgPG1zYWJvZmZAYXBwbGUuY29tPgorCisgICAgICAgIFtCTWFsbG9jXSBTY2F2ZW5n
ZXIgc2hvdWxkIHJlYWN0IHRvIHJlY2VudCBtZW1vcnkgYWN0aXZpdHkKKyAgICAgICAgaHR0cHM6
Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE5NTg5NQorCisgICAgICAgIFJldmll
d2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFRoaXMgY2hhbmdlIGFkZHMgYSByZWNl
bnRseSB1c2VkIGJpdCB0byBvYmplY3RzIHRoYXQgYXJlIHNjYXZlbmdlZC4gIFdoZW4gYW4gb2Jq
ZWN0IGlzIGFsbG9jYXRlZCwgdGhhdCBiaXQgaXMgc2V0LgorICAgICAgICBXaGVuIHdlIHNjYXZl
bmdlLCBpZiB0aGUgYml0IGlzIHNldCwgd2UgY2xlYXIgaXQuICBJZiB0aGUgYml0IHdhcyBhbHJl
YWR5IGNsZWFyLCB3ZSBkZWNvbW1pdCB0aGUgb2JqZWN0LiAgVGhlIHRpbWluZworICAgICAgICB0
byBzY2F2ZW5naW5nIGhhcyBiZWVuIGNoYW5nZWQgYXMgd2VsbC4gIFdlIHBlcmZvcm0gb3VyIGZp
cnN0IHNjYXZuZSBhbG1vc3QgaW1tZWRpYXRlbHkgYWZ0ZXIgYm1hbGxvYyBpcyBpbml0aWFsaXpl
ZAorICAgICAgICAoMTBtcyBsYXRlcikuICBTdWJzZXF1ZW50IHNjYXZlbmdpbmcgaXMgZG9uZSBh
cyBhIG11bHRpcGxlIG9mIHRoZSB0aW1lIGl0IHRvb2sgdG8gc2NhdmVuZ2UuICBXZSBib3VuZCB0
aGlzIGNvbXB1dGVkCisgICAgICAgIHRpbWUgYmV0d2VlbiBhIG1pbmltdW0gYW5kIG1heGltdW0u
ICBUaHJvdWdoIGVtcGlyaWNhbCB0ZXN0aW5nLCB0aGUgbXVsdGlwbGllciwgbWluaW11bSBhbmQg
bWF4aW11bSBhcmUKKyAgICAgICAgMTUweCwgMTAwbXMgYW5kIDEwLDAwMG1zIHJlc3BlY3RpdmVs
eS4gIEZvciBtaW5pLW1vZGUsIHdoZW4gdGhlIEpJVCBpcyBkaXNhYmxlZCwgd2UgdXNlIG11Y2gg
bW9yZSBhZ2dyZXNzaXZlIHZhbHVlcyBvZgorICAgICAgICA1MHgsIDI1bXMgYW5kIDUwMG1zLgor
CisgICAgICAgIEVsaW1pbmF0ZWQgcGFydGlhbCBzY2F2ZW5naW5nIHNpbmNlIHRoaXMgY2hhbmdl
IGFsbG93cyBmb3IgYW55IHNjYXZlbmdlIHRvIGJlIHBhcnRpYWwgb3IgZnVsbCBiYXNlZCBvbiBy
ZWNlbnQgdXNlIG9mCisgICAgICAgIHRoZSBvYmplY3RzIG9uIHRoZSB2YXJpb3VzIGZyZWUgbGlz
dHMuCisKKyAgICAgICAgKiBibWFsbG9jL0NodW5rLmg6CisgICAgICAgIChibWFsbG9jOjpDaHVu
azo6dXNlZFNpbmNlTGFzdFNjYXZlbmdlKToKKyAgICAgICAgKGJtYWxsb2M6OkNodW5rOjpjbGVh
clVzZWRTaW5jZUxhc3RTY2F2ZW5nZSk6CisgICAgICAgIChibWFsbG9jOjpDaHVuazo6c2V0VXNl
ZFNpbmNlTGFzdFNjYXZlbmdlKToKKyAgICAgICAgKiBibWFsbG9jL0hlYXAuY3BwOgorICAgICAg
ICAoYm1hbGxvYzo6SGVhcDo6c2NhdmVuZ2UpOgorICAgICAgICAoYm1hbGxvYzo6SGVhcDo6YWxs
b2NhdGVTbWFsbENodW5rKToKKyAgICAgICAgKGJtYWxsb2M6OkhlYXA6OmFsbG9jYXRlU21hbGxQ
YWdlKToKKyAgICAgICAgKGJtYWxsb2M6OkhlYXA6OnNwbGl0QW5kQWxsb2NhdGUpOgorICAgICAg
ICAoYm1hbGxvYzo6SGVhcDo6dHJ5QWxsb2NhdGVMYXJnZSk6CisgICAgICAgIChibWFsbG9jOjpI
ZWFwOjpzY2F2ZW5nZVRvSGlnaFdhdGVybWFyayk6IERlbGV0ZWQuCisgICAgICAgICogYm1hbGxv
Yy9IZWFwLmg6CisgICAgICAgICogYm1hbGxvYy9Jc29EaXJlY3RvcnkuaDoKKyAgICAgICAgKiBi
bWFsbG9jL0lzb0RpcmVjdG9yeUlubGluZXMuaDoKKyAgICAgICAgKGJtYWxsb2M6OnBhc3NlZE51
bVBhZ2VzPjo6dGFrZUZpcnN0RWxpZ2libGUpOgorICAgICAgICAoYm1hbGxvYzo6cGFzc2VkTnVt
UGFnZXM+OjpzY2F2ZW5nZSk6CisgICAgICAgIChibWFsbG9jOjpwYXNzZWROdW1QYWdlcz46OnNj
YXZlbmdlVG9IaWdoV2F0ZXJtYXJrKTogRGVsZXRlZC4KKyAgICAgICAgKiBibWFsbG9jL0lzb0hl
YXBJbXBsLmg6CisgICAgICAgICogYm1hbGxvYy9Jc29IZWFwSW1wbElubGluZXMuaDoKKyAgICAg
ICAgKGJtYWxsb2M6Oklzb0hlYXBJbXBsPENvbmZpZz46OnNjYXZlbmdlVG9IaWdoV2F0ZXJtYXJr
KTogRGVsZXRlZC4KKyAgICAgICAgKiBibWFsbG9jL0xhcmdlUmFuZ2UuaDoKKyAgICAgICAgKGJt
YWxsb2M6OkxhcmdlUmFuZ2U6OkxhcmdlUmFuZ2UpOgorICAgICAgICAoYm1hbGxvYzo6TGFyZ2VS
YW5nZTo6dXNlZFNpbmNlTGFzdFNjYXZlbmdlKToKKyAgICAgICAgKGJtYWxsb2M6OkxhcmdlUmFu
Z2U6OmNsZWFyVXNlZFNpbmNlTGFzdFNjYXZlbmdlKToKKyAgICAgICAgKGJtYWxsb2M6Okxhcmdl
UmFuZ2U6OnNldFVzZWRTaW5jZUxhc3RTY2F2ZW5nZSk6CisgICAgICAgICgpOiBEZWxldGVkLgor
ICAgICAgICAqIGJtYWxsb2MvU2NhdmVuZ2VyLmNwcDoKKyAgICAgICAgKGJtYWxsb2M6OlNjYXZl
bmdlcjo6U2NhdmVuZ2VyKToKKyAgICAgICAgKGJtYWxsb2M6OlNjYXZlbmdlcjo6dGhyZWFkUnVu
TG9vcCk6CisgICAgICAgIChibWFsbG9jOjpTY2F2ZW5nZXI6OnRpbWVTaW5jZUxhc3RQYXJ0aWFs
U2NhdmVuZ2UpOiBEZWxldGVkLgorICAgICAgICAoYm1hbGxvYzo6U2NhdmVuZ2VyOjpwYXJ0aWFs
U2NhdmVuZ2UpOiBEZWxldGVkLgorICAgICAgICAqIGJtYWxsb2MvU2NhdmVuZ2VyLmg6CisgICAg
ICAgICogYm1hbGxvYy9TbWFsbFBhZ2UuaDoKKyAgICAgICAgKGJtYWxsb2M6OlNtYWxsUGFnZTo6
dXNlZFNpbmNlTGFzdFNjYXZlbmdlKToKKyAgICAgICAgKGJtYWxsb2M6OlNtYWxsUGFnZTo6Y2xl
YXJVc2VkU2luY2VMYXN0U2NhdmVuZ2UpOgorICAgICAgICAoYm1hbGxvYzo6U21hbGxQYWdlOjpz
ZXRVc2VkU2luY2VMYXN0U2NhdmVuZ2UpOgorCiAyMDE5LTAzLTE0ICBZdXN1a2UgU3V6dWtpICA8
eXN1enVraUBhcHBsZS5jb20+CiAKICAgICAgICAgW2JtYWxsb2NdIEFkZCBTdGF0aWNQZXJQcm9j
ZXNzIGZvciBrbm93biB0eXBlcyB0byBzYXZlIHBhZ2VzCkluZGV4OiBTb3VyY2UvYm1hbGxvYy9i
bWFsbG9jL0NodW5rLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL2JtYWxsb2MvYm1hbGxvYy9DaHVu
ay5oCShyZXZpc2lvbiAyNDMwODUpCisrKyBTb3VyY2UvYm1hbGxvYy9ibWFsbG9jL0NodW5rLmgJ
KHdvcmtpbmcgY29weSkKQEAgLTQ1LDYgKzQ1LDEwIEBAIHB1YmxpYzoKICAgICB2b2lkIGRlcmVm
KCkgeyBCQVNTRVJUKG1fcmVmQ291bnQpOyAtLW1fcmVmQ291bnQ7IH0KICAgICB1bnNpZ25lZCBy
ZWZDb3VudCgpIHsgcmV0dXJuIG1fcmVmQ291bnQ7IH0KIAorICAgIGJvb2wgdXNlZFNpbmNlTGFz
dFNjYXZlbmdlKCkgeyByZXR1cm4gbV91c2VkU2luY2VMYXN0U2NhdmVuZ2U7IH0KKyAgICB2b2lk
IGNsZWFyVXNlZFNpbmNlTGFzdFNjYXZlbmdlKCkgeyBtX3VzZWRTaW5jZUxhc3RTY2F2ZW5nZSA9
IGZhbHNlOyB9CisgICAgdm9pZCBzZXRVc2VkU2luY2VMYXN0U2NhdmVuZ2UoKSB7IG1fdXNlZFNp
bmNlTGFzdFNjYXZlbmdlID0gdHJ1ZTsgfQorCiAgICAgc2l6ZV90IG9mZnNldCh2b2lkKik7CiAK
ICAgICBjaGFyKiBhZGRyZXNzKHNpemVfdCBvZmZzZXQpOwpAQCAtNTksNiArNjMsNyBAQCBwdWJs
aWM6CiAKIHByaXZhdGU6CiAgICAgc2l6ZV90IG1fcmVmQ291bnQgeyB9OworICAgIHVuc2lnbmVk
IGNoYXIgbV91c2VkU2luY2VMYXN0U2NhdmVuZ2U6IDE7CiAgICAgTGlzdDxTbWFsbFBhZ2U+IG1f
ZnJlZVBhZ2VzIHsgfTsKIAogICAgIHN0ZDo6YXJyYXk8U21hbGxMaW5lLCBjaHVua1NpemUgLyBz
bWFsbExpbmVTaXplPiBtX2xpbmVzIHsgfTsKSW5kZXg6IFNvdXJjZS9ibWFsbG9jL2JtYWxsb2Mv
SGVhcC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL2JtYWxsb2MvYm1hbGxvYy9IZWFwLmNwcAko
cmV2aXNpb24gMjQzMDg1KQorKysgU291cmNlL2JtYWxsb2MvYm1hbGxvYy9IZWFwLmNwcAkod29y
a2luZyBjb3B5KQpAQCAtMTgyLDYgKzE4MiwxMCBAQCB2b2lkIEhlYXA6OnNjYXZlbmdlKHN0ZDo6
bG9ja19ndWFyZDxNdXRlCiAgICAgICAgICAgICBmb3IgKGF1dG8qIHBhZ2UgOiBjaHVuay0+ZnJl
ZVBhZ2VzKCkpIHsKICAgICAgICAgICAgICAgICBpZiAoIXBhZ2UtPmhhc1BoeXNpY2FsUGFnZXMo
KSkKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgaWYgKHBh
Z2UtPnVzZWRTaW5jZUxhc3RTY2F2ZW5nZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHBhZ2Ut
PmNsZWFyVXNlZFNpbmNlTGFzdFNjYXZlbmdlKCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRp
bnVlOworICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIHNpemVfdCBwYWdlU2l6
ZSA9IGJtYWxsb2M6OnBhZ2VTaXplKCZsaXN0IC0gJm1fZnJlZVBhZ2VzWzBdKTsKICAgICAgICAg
ICAgICAgICBzaXplX3QgZGVjb21taXRTaXplID0gcGh5c2ljYWxQYWdlU2l6ZVNsb3BweShwYWdl
LT5iZWdpbigpLT5iZWdpbigpLCBwYWdlU2l6ZSk7CkBAIC0xODksMzYgKzE5MywzNCBAQCB2b2lk
IEhlYXA6OnNjYXZlbmdlKHN0ZDo6bG9ja19ndWFyZDxNdXRlCiAgICAgICAgICAgICAgICAgbV9m
b290cHJpbnQgLT0gZGVjb21taXRTaXplOwogICAgICAgICAgICAgICAgIGRlY29tbWl0dGVyLmFk
ZEVhZ2VyKHBhZ2UtPmJlZ2luKCktPmJlZ2luKCksIHBhZ2VTaXplKTsKICAgICAgICAgICAgICAg
ICBwYWdlLT5zZXRIYXNQaHlzaWNhbFBhZ2VzKGZhbHNlKTsKLSNpZiBFTkFCTEVfUEhZU0lDQUxf
UEFHRV9NQVAgCisjaWYgRU5BQkxFX1BIWVNJQ0FMX1BBR0VfTUFQCiAgICAgICAgICAgICAgICAg
bV9waHlzaWNhbFBhZ2VNYXAuZGVjb21taXQocGFnZS0+YmVnaW4oKS0+YmVnaW4oKSwgcGFnZVNp
emUpOwogI2VuZGlmCiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAg
ICBmb3IgKGF1dG8mIGxpc3QgOiBtX2NodW5rQ2FjaGUpIHsKLSAgICAgICAgd2hpbGUgKCFsaXN0
LmlzRW1wdHkoKSkKLSAgICAgICAgICAgIGRlYWxsb2NhdGVTbWFsbENodW5rKGxpc3QucG9wKCks
ICZsaXN0IC0gJm1fY2h1bmtDYWNoZVswXSk7CisgICAgICAgIGZvciAoYXV0byBpdGVyID0gbGlz
dC5iZWdpbigpOyBpdGVyICE9IGxpc3QuZW5kKCk7ICkgeworICAgICAgICAgICAgQ2h1bmsqIGNo
dW5rID0gKml0ZXI7CisgICAgICAgICAgICBpZiAoY2h1bmstPnVzZWRTaW5jZUxhc3RTY2F2ZW5n
ZSgpKSB7CisgICAgICAgICAgICAgICAgY2h1bmstPmNsZWFyVXNlZFNpbmNlTGFzdFNjYXZlbmdl
KCk7CisgICAgICAgICAgICAgICAgKytpdGVyOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOwor
ICAgICAgICAgICAgfQorICAgICAgICAgICAgKytpdGVyOworICAgICAgICAgICAgbGlzdC5yZW1v
dmUoY2h1bmspOworICAgICAgICAgICAgZGVhbGxvY2F0ZVNtYWxsQ2h1bmsoY2h1bmssICZsaXN0
IC0gJm1fY2h1bmtDYWNoZVswXSk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBmb3IgKExhcmdl
UmFuZ2UmIHJhbmdlIDogbV9sYXJnZUZyZWUpIHsKLSAgICAgICAgbV9oaWdoV2F0ZXJtYXJrID0g
c3RkOjptaW4obV9oaWdoV2F0ZXJtYXJrLCBzdGF0aWNfY2FzdDx2b2lkKj4ocmFuZ2UuYmVnaW4o
KSkpOworICAgICAgICBpZiAocmFuZ2UudXNlZFNpbmNlTGFzdFNjYXZlbmdlKCkpIHsKKyAgICAg
ICAgICAgIHJhbmdlLmNsZWFyVXNlZFNpbmNlTGFzdFNjYXZlbmdlKCk7CisgICAgICAgICAgICBj
b250aW51ZTsKKyAgICAgICAgfQogICAgICAgICBkZWNvbW1pdExhcmdlUmFuZ2UobG9jaywgcmFu
Z2UsIGRlY29tbWl0dGVyKTsKICAgICB9Ci0KLSAgICBtX2ZyZWVhYmxlTWVtb3J5ID0gMDsKLX0K
LQotdm9pZCBIZWFwOjpzY2F2ZW5nZVRvSGlnaFdhdGVybWFyayhzdGQ6OmxvY2tfZ3VhcmQ8TXV0
ZXg+JiBsb2NrLCBCdWxrRGVjb21taXQmIGRlY29tbWl0dGVyKQotewotICAgIHZvaWQqIG5ld0hp
Z2hXYXRlck1hcmsgPSBudWxscHRyOwotICAgIGZvciAoTGFyZ2VSYW5nZSYgcmFuZ2UgOiBtX2xh
cmdlRnJlZSkgewotICAgICAgICBpZiAocmFuZ2UuYmVnaW4oKSA8PSBtX2hpZ2hXYXRlcm1hcmsp
Ci0gICAgICAgICAgICBuZXdIaWdoV2F0ZXJNYXJrID0gc3RkOjptaW4obmV3SGlnaFdhdGVyTWFy
aywgc3RhdGljX2Nhc3Q8dm9pZCo+KHJhbmdlLmJlZ2luKCkpKTsKLSAgICAgICAgZWxzZQotICAg
ICAgICAgICAgZGVjb21taXRMYXJnZVJhbmdlKGxvY2ssIHJhbmdlLCBkZWNvbW1pdHRlcik7Ci0g
ICAgfQotICAgIG1faGlnaFdhdGVybWFyayA9IG5ld0hpZ2hXYXRlck1hcms7CiB9CiAKIHZvaWQg
SGVhcDo6ZGVhbGxvY2F0ZUxpbmVDYWNoZShzdGQ6OnVuaXF1ZV9sb2NrPE11dGV4PiYsIExpbmVD
YWNoZSYgbGluZUNhY2hlKQpAQCAtMjQ5LDYgKzI1MSw3IEBAIHZvaWQgSGVhcDo6YWxsb2NhdGVT
bWFsbENodW5rKHN0ZDo6dW5pcXUKIAogICAgICAgICBmb3JFYWNoUGFnZShjaHVuaywgcGFnZVNp
emUsIFsmXShTbWFsbFBhZ2UqIHBhZ2UpIHsKICAgICAgICAgICAgIHBhZ2UtPnNldEhhc1BoeXNp
Y2FsUGFnZXModHJ1ZSk7CisgICAgICAgICAgICBwYWdlLT5zZXRVc2VkU2luY2VMYXN0U2NhdmVu
Z2UoKTsKICAgICAgICAgICAgIHBhZ2UtPnNldEhhc0ZyZWVMaW5lcyhsb2NrLCB0cnVlKTsKICAg
ICAgICAgICAgIGNodW5rLT5mcmVlUGFnZXMoKS5wdXNoKHBhZ2UpOwogICAgICAgICB9KTsKQEAg
LTMxMCw2ICszMTMsNyBAQCBTbWFsbFBhZ2UqIEhlYXA6OmFsbG9jYXRlU21hbGxQYWdlKHN0ZDo6
CiAgICAgICAgIENodW5rKiBjaHVuayA9IG1fZnJlZVBhZ2VzW3BhZ2VDbGFzc10udGFpbCgpOwog
CiAgICAgICAgIGNodW5rLT5yZWYoKTsKKyAgICAgICAgY2h1bmstPnNldFVzZWRTaW5jZUxhc3RT
Y2F2ZW5nZSgpOwogCiAgICAgICAgIFNtYWxsUGFnZSogcGFnZSA9IGNodW5rLT5mcmVlUGFnZXMo
KS5wb3AoKTsKICAgICAgICAgaWYgKGNodW5rLT5mcmVlUGFnZXMoKS5pc0VtcHR5KCkpCkBAIC0z
MjQsMTAgKzMyOCwxMSBAQCBTbWFsbFBhZ2UqIEhlYXA6OmFsbG9jYXRlU21hbGxQYWdlKHN0ZDo6
CiAgICAgICAgICAgICBtX2Zvb3RwcmludCArPSBwaHlzaWNhbFNpemU7CiAgICAgICAgICAgICB2
bUFsbG9jYXRlUGh5c2ljYWxQYWdlc1Nsb3BweShwYWdlLT5iZWdpbigpLT5iZWdpbigpLCBwYWdl
U2l6ZSk7CiAgICAgICAgICAgICBwYWdlLT5zZXRIYXNQaHlzaWNhbFBhZ2VzKHRydWUpOwotI2lm
IEVOQUJMRV9QSFlTSUNBTF9QQUdFX01BUCAKKyNpZiBFTkFCTEVfUEhZU0lDQUxfUEFHRV9NQVAK
ICAgICAgICAgICAgIG1fcGh5c2ljYWxQYWdlTWFwLmNvbW1pdChwYWdlLT5iZWdpbigpLT5iZWdp
bigpLCBwYWdlU2l6ZSk7CiAjZW5kaWYKICAgICAgICAgfQorICAgICAgICBwYWdlLT5zZXRVc2Vk
U2luY2VMYXN0U2NhdmVuZ2UoKTsKIAogICAgICAgICByZXR1cm4gcGFnZTsKICAgICB9KCk7CkBA
IC01MjQsNiArNTI5LDcgQEAgTGFyZ2VSYW5nZSBIZWFwOjpzcGxpdEFuZEFsbG9jYXRlKHN0ZDo6
dQogICAgICAgICB2bUFsbG9jYXRlUGh5c2ljYWxQYWdlc1Nsb3BweShyYW5nZS5iZWdpbigpICsg
cmFuZ2Uuc3RhcnRQaHlzaWNhbFNpemUoKSwgcmFuZ2Uuc2l6ZSgpIC0gcmFuZ2Uuc3RhcnRQaHlz
aWNhbFNpemUoKSk7CiAgICAgICAgIHJhbmdlLnNldFN0YXJ0UGh5c2ljYWxTaXplKHJhbmdlLnNp
emUoKSk7CiAgICAgICAgIHJhbmdlLnNldFRvdGFsUGh5c2ljYWxTaXplKHJhbmdlLnNpemUoKSk7
CisgICAgICAgIHJhbmdlLnNldFVzZWRTaW5jZUxhc3RTY2F2ZW5nZSgpOwogI2lmIEVOQUJMRV9Q
SFlTSUNBTF9QQUdFX01BUCAKICAgICAgICAgbV9waHlzaWNhbFBhZ2VNYXAuY29tbWl0KHJhbmdl
LmJlZ2luKCksIHJhbmdlLnNpemUoKSk7CiAjZW5kaWYKQEAgLTU4NSw3ICs1OTEsNiBAQCB2b2lk
KiBIZWFwOjp0cnlBbGxvY2F0ZUxhcmdlKHN0ZDo6dW5pcXVlCiAgICAgbV9mcmVlYWJsZU1lbW9y
eSAtPSByYW5nZS50b3RhbFBoeXNpY2FsU2l6ZSgpOwogCiAgICAgdm9pZCogcmVzdWx0ID0gc3Bs
aXRBbmRBbGxvY2F0ZShsb2NrLCByYW5nZSwgYWxpZ25tZW50LCBzaXplKS5iZWdpbigpOwotICAg
IG1faGlnaFdhdGVybWFyayA9IHN0ZDo6bWF4KG1faGlnaFdhdGVybWFyaywgcmVzdWx0KTsKICAg
ICByZXR1cm4gcmVzdWx0OwogfQogCkluZGV4OiBTb3VyY2UvYm1hbGxvYy9ibWFsbG9jL0hlYXAu
aAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvYm1hbGxvYy9ibWFsbG9jL0hlYXAuaAkocmV2aXNpb24g
MjQzMDg1KQorKysgU291cmNlL2JtYWxsb2MvYm1hbGxvYy9IZWFwLmgJKHdvcmtpbmcgY29weSkK
QEAgLTc4LDcgKzc4LDYgQEAgcHVibGljOgogCiAgICAgdm9pZCBzY2F2ZW5nZShzdGQ6OmxvY2tf
Z3VhcmQ8TXV0ZXg+JiwgQnVsa0RlY29tbWl0Jik7CiAgICAgdm9pZCBzY2F2ZW5nZShzdGQ6Omxv
Y2tfZ3VhcmQ8TXV0ZXg+JiwgQnVsa0RlY29tbWl0Jiwgc2l6ZV90JiBmcmVlZCwgc2l6ZV90IGdv
YWwpOwotICAgIHZvaWQgc2NhdmVuZ2VUb0hpZ2hXYXRlcm1hcmsoc3RkOjpsb2NrX2d1YXJkPE11
dGV4PiYsIEJ1bGtEZWNvbW1pdCYpOwogCiAgICAgc2l6ZV90IGZyZWVhYmxlTWVtb3J5KHN0ZDo6
bG9ja19ndWFyZDxNdXRleD4mKTsKICAgICBzaXplX3QgZm9vdHByaW50KCk7CkBAIC0xNTMsOCAr
MTUyLDYgQEAgcHJpdmF0ZToKICNpZiBFTkFCTEVfUEhZU0lDQUxfUEFHRV9NQVAgCiAgICAgUGh5
c2ljYWxQYWdlTWFwIG1fcGh5c2ljYWxQYWdlTWFwOwogI2VuZGlmCi0KLSAgICB2b2lkKiBtX2hp
Z2hXYXRlcm1hcmsgeyBudWxscHRyIH07CiB9OwogCiBpbmxpbmUgdm9pZCBIZWFwOjphbGxvY2F0
ZVNtYWxsQnVtcFJhbmdlcygKSW5kZXg6IFNvdXJjZS9ibWFsbG9jL2JtYWxsb2MvSXNvRGlyZWN0
b3J5LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL2JtYWxsb2MvYm1hbGxvYy9Jc29EaXJlY3Rvcnku
aAkocmV2aXNpb24gMjQzMDg1KQorKysgU291cmNlL2JtYWxsb2MvYm1hbGxvYy9Jc29EaXJlY3Rv
cnkuaAkod29ya2luZyBjb3B5KQpAQCAtNzUsNyArNzUsNiBAQCBwdWJsaWM6CiAgICAgLy8gSXRl
cmF0ZSBvdmVyIGFsbCBlbXB0eSBhbmQgY29tbWl0dGVkIHBhZ2VzLCBhbmQgcHV0IHRoZW0gaW50
byB0aGUgdmVjdG9yLiBUaGlzIGFsc28gcmVjb3JkcyB0aGUKICAgICAvLyBwYWdlcyBhcyBiZWlu
ZyBkZWNvbW1pdHRlZC4gSXQncyB0aGUgY2FsbGVyJ3Mgam9iIHRvIGRvIHRoZSBhY3R1YWwgZGVj
b21taXR0aW5nLgogICAgIHZvaWQgc2NhdmVuZ2UoVmVjdG9yPERlZmVycmVkRGVjb21taXQ+Jik7
Ci0gICAgdm9pZCBzY2F2ZW5nZVRvSGlnaFdhdGVybWFyayhWZWN0b3I8RGVmZXJyZWREZWNvbW1p
dD4mKTsKIAogICAgIHRlbXBsYXRlPHR5cGVuYW1lIEZ1bmM+CiAgICAgdm9pZCBmb3JFYWNoQ29t
bWl0dGVkUGFnZShjb25zdCBGdW5jJik7CkBAIC05MCw3ICs4OSw2IEBAIHByaXZhdGU6CiAgICAg
Qml0czxudW1QYWdlcz4gbV9jb21taXR0ZWQ7CiAgICAgc3RkOjphcnJheTxJc29QYWdlPENvbmZp
Zz4qLCBudW1QYWdlcz4gbV9wYWdlczsKICAgICB1bnNpZ25lZCBtX2ZpcnN0RWxpZ2libGUgeyAw
IH07Ci0gICAgdW5zaWduZWQgbV9oaWdoV2F0ZXJtYXJrIHsgMCB9OwogfTsKIAogfSAvLyBuYW1l
c3BhY2UgYm1hbGxvYwpJbmRleDogU291cmNlL2JtYWxsb2MvYm1hbGxvYy9Jc29EaXJlY3RvcnlJ
bmxpbmVzLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL2JtYWxsb2MvYm1hbGxvYy9Jc29EaXJlY3Rv
cnlJbmxpbmVzLmgJKHJldmlzaW9uIDI0MzA4NSkKKysrIFNvdXJjZS9ibWFsbG9jL2JtYWxsb2Mv
SXNvRGlyZWN0b3J5SW5saW5lcy5oCSh3b3JraW5nIGNvcHkpCkBAIC01MSw4ICs1MSw2IEBAIEVs
aWdpYmlsaXR5UmVzdWx0PENvbmZpZz4gSXNvRGlyZWN0b3J5PEMKICAgICBpZiAocGFnZUluZGV4
ID49IG51bVBhZ2VzKQogICAgICAgICByZXR1cm4gRWxpZ2liaWxpdHlLaW5kOjpGdWxsOwogCi0g
ICAgbV9oaWdoV2F0ZXJtYXJrID0gc3RkOjptYXgocGFnZUluZGV4LCBtX2hpZ2hXYXRlcm1hcmsp
OwotICAgIAogICAgIFNjYXZlbmdlciYgc2NhdmVuZ2VyID0gKlNjYXZlbmdlcjo6Z2V0KCk7CiAg
ICAgc2NhdmVuZ2VyLmRpZFN0YXJ0R3Jvd2luZygpOwogICAgIApAQCAtMTQzLDE4ICsxNDEsNiBA
QCB2b2lkIElzb0RpcmVjdG9yeTxDb25maWcsIHBhc3NlZE51bVBhZ2VzCiAgICAgICAgIFsmXSAo
c2l6ZV90IGluZGV4KSB7CiAgICAgICAgICAgICBzY2F2ZW5nZVBhZ2UoaW5kZXgsIGRlY29tbWl0
cyk7CiAgICAgICAgIH0pOwotICAgIG1faGlnaFdhdGVybWFyayA9IDA7Ci19Ci0KLXRlbXBsYXRl
PHR5cGVuYW1lIENvbmZpZywgdW5zaWduZWQgcGFzc2VkTnVtUGFnZXM+Ci12b2lkIElzb0RpcmVj
dG9yeTxDb25maWcsIHBhc3NlZE51bVBhZ2VzPjo6c2NhdmVuZ2VUb0hpZ2hXYXRlcm1hcmsoVmVj
dG9yPERlZmVycmVkRGVjb21taXQ+JiBkZWNvbW1pdHMpCi17Ci0gICAgKG1fZW1wdHkgJiBtX2Nv
bW1pdHRlZCkuZm9yRWFjaFNldEJpdCgKLSAgICAgICAgWyZdIChzaXplX3QgaW5kZXgpIHsKLSAg
ICAgICAgICAgIGlmIChpbmRleCA+IG1faGlnaFdhdGVybWFyaykKLSAgICAgICAgICAgICAgICBz
Y2F2ZW5nZVBhZ2UoaW5kZXgsIGRlY29tbWl0cyk7Ci0gICAgICAgIH0pOwotICAgIG1faGlnaFdh
dGVybWFyayA9IDA7CiB9CiAKIHRlbXBsYXRlPHR5cGVuYW1lIENvbmZpZywgdW5zaWduZWQgcGFz
c2VkTnVtUGFnZXM+CkluZGV4OiBTb3VyY2UvYm1hbGxvYy9ibWFsbG9jL0lzb0hlYXBJbXBsLmgK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL2JtYWxsb2MvYm1hbGxvYy9Jc29IZWFwSW1wbC5oCShyZXZp
c2lvbiAyNDMwODUpCisrKyBTb3VyY2UvYm1hbGxvYy9ibWFsbG9jL0lzb0hlYXBJbXBsLmgJKHdv
cmtpbmcgY29weSkKQEAgLTQwLDcgKzQwLDYgQEAgcHVibGljOgogICAgIHZpcnR1YWwgfklzb0hl
YXBJbXBsQmFzZSgpOwogICAgIAogICAgIHZpcnR1YWwgdm9pZCBzY2F2ZW5nZShWZWN0b3I8RGVm
ZXJyZWREZWNvbW1pdD4mKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkIHNjYXZlbmdlVG9IaWdoV2F0
ZXJtYXJrKFZlY3RvcjxEZWZlcnJlZERlY29tbWl0PiYpID0gMDsKICAgICB2aXJ0dWFsIHNpemVf
dCBmcmVlYWJsZU1lbW9yeSgpID0gMDsKICAgICB2aXJ0dWFsIHNpemVfdCBmb290cHJpbnQoKSA9
IDA7CiAgICAgCkBAIC03Miw3ICs3MSw2IEBAIHB1YmxpYzoKICAgICB2b2lkIGRpZEJlY29tZUVs
aWdpYmxlKElzb0RpcmVjdG9yeTxDb25maWcsIElzb0RpcmVjdG9yeVBhZ2U8Q29uZmlnPjo6bnVt
UGFnZXM+Kik7CiAgICAgCiAgICAgdm9pZCBzY2F2ZW5nZShWZWN0b3I8RGVmZXJyZWREZWNvbW1p
dD4mKSBvdmVycmlkZTsKLSAgICB2b2lkIHNjYXZlbmdlVG9IaWdoV2F0ZXJtYXJrKFZlY3RvcjxE
ZWZlcnJlZERlY29tbWl0PiYpIG92ZXJyaWRlOwogCiAgICAgc2l6ZV90IGZyZWVhYmxlTWVtb3J5
KCkgb3ZlcnJpZGU7CiAKSW5kZXg6IFNvdXJjZS9ibWFsbG9jL2JtYWxsb2MvSXNvSGVhcEltcGxJ
bmxpbmVzLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL2JtYWxsb2MvYm1hbGxvYy9Jc29IZWFwSW1w
bElubGluZXMuaAkocmV2aXNpb24gMjQzMDg1KQorKysgU291cmNlL2JtYWxsb2MvYm1hbGxvYy9J
c29IZWFwSW1wbElubGluZXMuaAkod29ya2luZyBjb3B5KQpAQCAtMTEwLDE5ICsxMTAsNiBAQCB2
b2lkIElzb0hlYXBJbXBsPENvbmZpZz46OnNjYXZlbmdlKFZlY3RvCiB9CiAKIHRlbXBsYXRlPHR5
cGVuYW1lIENvbmZpZz4KLXZvaWQgSXNvSGVhcEltcGw8Q29uZmlnPjo6c2NhdmVuZ2VUb0hpZ2hX
YXRlcm1hcmsoVmVjdG9yPERlZmVycmVkRGVjb21taXQ+JiBkZWNvbW1pdHMpCi17Ci0gICAgc3Rk
Ojpsb2NrX2d1YXJkPE11dGV4PiBsb2NrZXIodGhpcy0+bG9jayk7Ci0gICAgaWYgKCFtX2RpcmVj
dG9yeUhpZ2hXYXRlcm1hcmspCi0gICAgICAgIG1faW5saW5lRGlyZWN0b3J5LnNjYXZlbmdlVG9I
aWdoV2F0ZXJtYXJrKGRlY29tbWl0cyk7Ci0gICAgZm9yIChJc29EaXJlY3RvcnlQYWdlPENvbmZp
Zz4qIHBhZ2UgPSBtX2hlYWREaXJlY3Rvcnk7IHBhZ2U7IHBhZ2UgPSBwYWdlLT5uZXh0KSB7Ci0g
ICAgICAgIGlmIChwYWdlLT5pbmRleCgpID49IG1fZGlyZWN0b3J5SGlnaFdhdGVybWFyaykKLSAg
ICAgICAgICAgIHBhZ2UtPnBheWxvYWQuc2NhdmVuZ2VUb0hpZ2hXYXRlcm1hcmsoZGVjb21taXRz
KTsKLSAgICB9Ci0gICAgbV9kaXJlY3RvcnlIaWdoV2F0ZXJtYXJrID0gMDsKLX0KLQotdGVtcGxh
dGU8dHlwZW5hbWUgQ29uZmlnPgogc2l6ZV90IElzb0hlYXBJbXBsPENvbmZpZz46OmZyZWVhYmxl
TWVtb3J5KCkKIHsKICAgICByZXR1cm4gbV9mcmVlYWJsZU1lbW9yeTsKSW5kZXg6IFNvdXJjZS9i
bWFsbG9jL2JtYWxsb2MvTGFyZ2VSYW5nZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9ibWFsbG9j
L2JtYWxsb2MvTGFyZ2VSYW5nZS5oCShyZXZpc2lvbiAyNDMwODUpCisrKyBTb3VyY2UvYm1hbGxv
Yy9ibWFsbG9jL0xhcmdlUmFuZ2UuaAkod29ya2luZyBjb3B5KQpAQCAtMzcsNiArMzcsNyBAQCBw
dWJsaWM6CiAgICAgICAgIDogUmFuZ2UoKQogICAgICAgICAsIG1fc3RhcnRQaHlzaWNhbFNpemUo
MCkKICAgICAgICAgLCBtX3RvdGFsUGh5c2ljYWxTaXplKDApCisgICAgICAgICwgbV9pc0VsaWdp
YmxlKHRydWUpCiAgICAgewogICAgIH0KIApAQCAtNDQsNiArNDUsOCBAQCBwdWJsaWM6CiAgICAg
ICAgIDogUmFuZ2Uob3RoZXIpCiAgICAgICAgICwgbV9zdGFydFBoeXNpY2FsU2l6ZShzdGFydFBo
eXNpY2FsU2l6ZSkKICAgICAgICAgLCBtX3RvdGFsUGh5c2ljYWxTaXplKHRvdGFsUGh5c2ljYWxT
aXplKQorICAgICAgICAsIG1faXNFbGlnaWJsZSh0cnVlKQorICAgICAgICAsIG1fdXNlZFNpbmNl
TGFzdFNjYXZlbmdlKHRydWUpCiAgICAgewogICAgICAgICBCQVNTRVJUKHRoaXMtPnNpemUoKSA+
PSB0aGlzLT50b3RhbFBoeXNpY2FsU2l6ZSgpKTsKICAgICAgICAgQkFTU0VSVCh0aGlzLT50b3Rh
bFBoeXNpY2FsU2l6ZSgpID49IHRoaXMtPnN0YXJ0UGh5c2ljYWxTaXplKCkpOwpAQCAtNTMsNiAr
NTYsOCBAQCBwdWJsaWM6CiAgICAgICAgIDogUmFuZ2UoYmVnaW4sIHNpemUpCiAgICAgICAgICwg
bV9zdGFydFBoeXNpY2FsU2l6ZShzdGFydFBoeXNpY2FsU2l6ZSkKICAgICAgICAgLCBtX3RvdGFs
UGh5c2ljYWxTaXplKHRvdGFsUGh5c2ljYWxTaXplKQorICAgICAgICAsIG1faXNFbGlnaWJsZSh0
cnVlKQorICAgICAgICAsIG1fdXNlZFNpbmNlTGFzdFNjYXZlbmdlKHRydWUpCiAgICAgewogICAg
ICAgICBCQVNTRVJUKHRoaXMtPnNpemUoKSA+PSB0aGlzLT50b3RhbFBoeXNpY2FsU2l6ZSgpKTsK
ICAgICAgICAgQkFTU0VSVCh0aGlzLT50b3RhbFBoeXNpY2FsU2l6ZSgpID49IHRoaXMtPnN0YXJ0
UGh5c2ljYWxTaXplKCkpOwpAQCAtODMsMTMgKzg4LDE4IEBAIHB1YmxpYzoKICAgICB2b2lkIHNl
dEVsaWdpYmxlKGJvb2wgZWxpZ2libGUpIHsgbV9pc0VsaWdpYmxlID0gZWxpZ2libGU7IH0KICAg
ICBib29sIGlzRWxpZ2liaWxlKCkgY29uc3QgeyByZXR1cm4gbV9pc0VsaWdpYmxlOyB9CiAKKyAg
ICBib29sIHVzZWRTaW5jZUxhc3RTY2F2ZW5nZSgpIHsgcmV0dXJuIG1fdXNlZFNpbmNlTGFzdFNj
YXZlbmdlOyB9CisgICAgdm9pZCBjbGVhclVzZWRTaW5jZUxhc3RTY2F2ZW5nZSgpIHsgbV91c2Vk
U2luY2VMYXN0U2NhdmVuZ2UgPSBmYWxzZTsgfQorICAgIHZvaWQgc2V0VXNlZFNpbmNlTGFzdFNj
YXZlbmdlKCkgeyBtX3VzZWRTaW5jZUxhc3RTY2F2ZW5nZSA9IHRydWU7IH0KKwogICAgIGJvb2wg
b3BlcmF0b3I8KGNvbnN0IHZvaWQqIG90aGVyKSBjb25zdCB7IHJldHVybiBiZWdpbigpIDwgb3Ro
ZXI7IH0KICAgICBib29sIG9wZXJhdG9yPChjb25zdCBMYXJnZVJhbmdlJiBvdGhlcikgY29uc3Qg
eyByZXR1cm4gYmVnaW4oKSA8IG90aGVyLmJlZ2luKCk7IH0KIAogcHJpdmF0ZToKICAgICBzaXpl
X3QgbV9zdGFydFBoeXNpY2FsU2l6ZTsKICAgICBzaXplX3QgbV90b3RhbFBoeXNpY2FsU2l6ZTsK
LSAgICBib29sIG1faXNFbGlnaWJsZSB7IHRydWUgfTsKKyAgICB1bnNpZ25lZCBtX2lzRWxpZ2li
bGU6IDE7CisgICAgdW5zaWduZWQgbV91c2VkU2luY2VMYXN0U2NhdmVuZ2U6IDE7CiB9OwogCiBp
bmxpbmUgYm9vbCBjYW5NZXJnZShjb25zdCBMYXJnZVJhbmdlJiBhLCBjb25zdCBMYXJnZVJhbmdl
JiBiKQpJbmRleDogU291cmNlL2JtYWxsb2MvYm1hbGxvYy9TY2F2ZW5nZXIuY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9ibWFsbG9jL2JtYWxsb2MvU2NhdmVuZ2VyLmNwcAkocmV2aXNpb24gMjQz
MDg1KQorKysgU291cmNlL2JtYWxsb2MvYm1hbGxvYy9TY2F2ZW5nZXIuY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC04MCw3ICs4MCw4IEBAIFNjYXZlbmdlcjo6U2NhdmVuZ2VyKHN0ZDo6bG9ja19ndWFy
ZDxNdXQKICAgICBkaXNwYXRjaF9yZXN1bWUobV9wcmVzc3VyZUhhbmRsZXJEaXNwYXRjaFNvdXJj
ZSk7CiAgICAgZGlzcGF0Y2hfcmVsZWFzZShxdWV1ZSk7CiAjZW5kaWYKLSAgICAKKyAgICBtX3dh
aXRUaW1lID0gMTA7CisKICAgICBtX3RocmVhZCA9IHN0ZDo6dGhyZWFkKCZ0aHJlYWRFbnRyeVBv
aW50LCB0aGlzKTsKIH0KIApAQCAtMTc3LDEyICsxNzgsNiBAQCBzdGQ6OmNocm9ubzo6bWlsbGlz
ZWNvbmRzIFNjYXZlbmdlcjo6dGltCiAgICAgcmV0dXJuIHN0ZDo6Y2hyb25vOjpkdXJhdGlvbl9j
YXN0PHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHM+KHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6
Om5vdygpIC0gbV9sYXN0RnVsbFNjYXZlbmdlVGltZSk7CiB9CiAKLXN0ZDo6Y2hyb25vOjptaWxs
aXNlY29uZHMgU2NhdmVuZ2VyOjp0aW1lU2luY2VMYXN0UGFydGlhbFNjYXZlbmdlKCkKLXsKLSAg
ICBzdGQ6OnVuaXF1ZV9sb2NrPE11dGV4PiBsb2NrKG1fbXV0ZXgpOwotICAgIHJldHVybiBzdGQ6
OmNocm9ubzo6ZHVyYXRpb25fY2FzdDxzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzPihzdGQ6OmNo
cm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKSAtIG1fbGFzdFBhcnRpYWxTY2F2ZW5nZVRpbWUpOwot
fQotCiB2b2lkIFNjYXZlbmdlcjo6ZW5hYmxlTWluaU1vZGUoKQogewogICAgIG1faXNJbk1pbmlN
b2RlID0gdHJ1ZTsgLy8gV2UganVzdCBzdG9yZSB0byB0aGlzIHJhY2lseS4gVGhlIHNjYXZlbmdl
ciB0aHJlYWQgd2lsbCBldmVudHVhbGx5IHBpY2sgdXAgdGhlIHJpZ2h0IHZhbHVlLgpAQCAtMjUy
LDczICsyNDcsNiBAQCB2b2lkIFNjYXZlbmdlcjo6c2NhdmVuZ2UoKQogICAgIH0KIH0KIAotdm9p
ZCBTY2F2ZW5nZXI6OnBhcnRpYWxTY2F2ZW5nZSgpCi17Ci0gICAgc3RkOjp1bmlxdWVfbG9jazxN
dXRleD4gbG9jayhtX3NjYXZlbmdpbmdNdXRleCk7Ci0KLSAgICBpZiAodmVyYm9zZSkgewotICAg
ICAgICBmcHJpbnRmKHN0ZGVyciwgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4i
KTsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICItLWJlZm9yZSBwYXJ0aWFsIHNjYXZlbmdpbmct
LVxuIik7Ci0gICAgICAgIGR1bXBTdGF0cygpOwotICAgIH0KLQotICAgIHsKLSAgICAgICAgQnVs
a0RlY29tbWl0IGRlY29tbWl0dGVyOwotICAgICAgICB7Ci0gICAgICAgICAgICBQcmludFRpbWUg
cHJpbnRUaW1lKCJcbnBhcnRpYWxTY2F2ZW5nZSB1bmRlciBsb2NrIHRpbWUiKTsKLSAgICAgICAg
ICAgIHN0ZDo6bG9ja19ndWFyZDxNdXRleD4gbG9jayhIZWFwOjptdXRleCgpKTsKLSAgICAgICAg
ICAgIGZvciAodW5zaWduZWQgaSA9IG51bUhlYXBzOyBpLS07KSB7Ci0gICAgICAgICAgICAgICAg
aWYgKCFpc0FjdGl2ZUhlYXBLaW5kKHN0YXRpY19jYXN0PEhlYXBLaW5kPihpKSkpCi0gICAgICAg
ICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIEhlYXAmIGhlYXAgPSBQZXJQ
cm9jZXNzPFBlckhlYXBLaW5kPEhlYXA+Pjo6Z2V0KCktPmF0KGkpOwotICAgICAgICAgICAgICAg
IHNpemVfdCBmcmVlYWJsZU1lbW9yeSA9IGhlYXAuZnJlZWFibGVNZW1vcnkobG9jayk7Ci0gICAg
ICAgICAgICAgICAgaWYgKGZyZWVhYmxlTWVtb3J5IDwgNCAqIE1CKQotICAgICAgICAgICAgICAg
ICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICBoZWFwLnNjYXZlbmdlVG9IaWdoV2F0ZXJt
YXJrKGxvY2ssIGRlY29tbWl0dGVyKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZGVj
b21taXR0ZXIucHJvY2Vzc0VhZ2VyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICB7Ci0gICAgICAg
ICAgICBQcmludFRpbWUgcHJpbnRUaW1lKCJwYXJ0aWFsU2NhdmVuZ2UgbGF6eSBkZWNvbW1pdCB0
aW1lIik7Ci0gICAgICAgICAgICBkZWNvbW1pdHRlci5wcm9jZXNzTGF6eSgpOwotICAgICAgICB9
Ci0KLSAgICAgICAgewotICAgICAgICAgICAgUHJpbnRUaW1lIHByaW50VGltZSgicGFydGlhbFNj
YXZlbmdlIG1hcmsgYWxsIGFzIGVsaWdpYmxlIHRpbWUiKTsKLSAgICAgICAgICAgIHN0ZDo6bG9j
a19ndWFyZDxNdXRleD4gbG9jayhIZWFwOjptdXRleCgpKTsKLSAgICAgICAgICAgIGZvciAodW5z
aWduZWQgaSA9IG51bUhlYXBzOyBpLS07KSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFpc0FjdGl2
ZUhlYXBLaW5kKHN0YXRpY19jYXN0PEhlYXBLaW5kPihpKSkpCi0gICAgICAgICAgICAgICAgICAg
IGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIEhlYXAmIGhlYXAgPSBQZXJQcm9jZXNzPFBlckhl
YXBLaW5kPEhlYXA+Pjo6Z2V0KCktPmF0KGkpOwotICAgICAgICAgICAgICAgIGhlYXAubWFya0Fs
bExhcmdlQXNFbGlnaWJpbGUobG9jayk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9
Ci0KLSAgICB7Ci0gICAgICAgIFJFTEVBU0VfQkFTU0VSVCghbV9kZWZlcnJlZERlY29tbWl0cy5z
aXplKCkpOwotICAgICAgICBBbGxJc29IZWFwczo6Z2V0KCktPmZvckVhY2goCi0gICAgICAgICAg
ICBbJl0gKElzb0hlYXBJbXBsQmFzZSYgaGVhcCkgewotICAgICAgICAgICAgICAgIGhlYXAuc2Nh
dmVuZ2VUb0hpZ2hXYXRlcm1hcmsobV9kZWZlcnJlZERlY29tbWl0cyk7Ci0gICAgICAgICAgICB9
KTsKLSAgICAgICAgSXNvSGVhcEltcGxCYXNlOjpmaW5pc2hTY2F2ZW5naW5nKG1fZGVmZXJyZWRE
ZWNvbW1pdHMpOwotICAgICAgICBtX2RlZmVycmVkRGVjb21taXRzLnNocmluaygwKTsKLSAgICB9
Ci0KLSAgICBpZiAodmVyYm9zZSkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIi0tYWZ0ZXIg
cGFydGlhbCBzY2F2ZW5naW5nLS1cbiIpOwotICAgICAgICBkdW1wU3RhdHMoKTsKLSAgICAgICAg
ZnByaW50ZihzdGRlcnIsICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7Ci0g
ICAgfQotCi0gICAgewotICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPE11dGV4PiBsb2NrKG1fbXV0
ZXgpOwotICAgICAgICBtX2xhc3RQYXJ0aWFsU2NhdmVuZ2VUaW1lID0gc3RkOjpjaHJvbm86OnN0
ZWFkeV9jbG9jazo6bm93KCk7Ci0gICAgfQotfQotCiBzaXplX3QgU2NhdmVuZ2VyOjpmcmVlYWJs
ZU1lbW9yeSgpCiB7CiAgICAgc2l6ZV90IHJlc3VsdCA9IDA7CkBAIC0zODYsNyArMzE0LDcgQEAg
dm9pZCBTY2F2ZW5nZXI6OnRocmVhZFJ1bkxvb3AoKQogICAgICAgICAKICAgICAgICAgaWYgKG1f
c3RhdGUgPT0gU3RhdGU6OlJ1blNvb24pIHsKICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8
TXV0ZXg+IGxvY2sobV9tdXRleCk7Ci0gICAgICAgICAgICBtX2NvbmRpdGlvbi53YWl0X2Zvcihs
b2NrLCBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKG1faXNJbk1pbmlNb2RlID8gMjAwIDogMjAw
MCksIFsmXSgpIHsgcmV0dXJuIG1fc3RhdGUgIT0gU3RhdGU6OlJ1blNvb247IH0pOworICAgICAg
ICAgICAgbV9jb25kaXRpb24ud2FpdF9mb3IobG9jaywgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25k
cyhtX3dhaXRUaW1lKSwgWyZdKCkgeyByZXR1cm4gbV9zdGF0ZSAhPSBTdGF0ZTo6UnVuU29vbjsg
fSk7CiAgICAgICAgIH0KICAgICAgICAgCiAgICAgICAgIG1fc3RhdGUgPSBTdGF0ZTo6U2xlZXA7
CkBAIC00MDAsNjcgKzMyOCwxOSBAQCB2b2lkIFNjYXZlbmdlcjo6dGhyZWFkUnVuTG9vcCgpCiAg
ICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tXG4iKTsKICAgICAgICAgfQogCi0gICAgICAgIGVudW0gY2xhc3MgU2NhdmVuZ2VNb2RlIHsK
LSAgICAgICAgICAgIE5vbmUsCi0gICAgICAgICAgICBQYXJ0aWFsLAotICAgICAgICAgICAgRnVs
bAotICAgICAgICB9OwotCi0gICAgICAgIHNpemVfdCBmcmVlYWJsZU1lbW9yeSA9IHRoaXMtPmZy
ZWVhYmxlTWVtb3J5KCk7Ci0KLSAgICAgICAgU2NhdmVuZ2VNb2RlIHNjYXZlbmdlTW9kZSA9IFsm
XSB7Ci0gICAgICAgICAgICBhdXRvIHRpbWVTaW5jZUxhc3RGdWxsU2NhdmVuZ2UgPSB0aGlzLT50
aW1lU2luY2VMYXN0RnVsbFNjYXZlbmdlKCk7Ci0gICAgICAgICAgICBhdXRvIHRpbWVTaW5jZUxh
c3RQYXJ0aWFsU2NhdmVuZ2UgPSB0aGlzLT50aW1lU2luY2VMYXN0UGFydGlhbFNjYXZlbmdlKCk7
Ci0gICAgICAgICAgICBhdXRvIHRpbWVTaW5jZUxhc3RTY2F2ZW5nZSA9IHN0ZDo6bWluKHRpbWVT
aW5jZUxhc3RQYXJ0aWFsU2NhdmVuZ2UsIHRpbWVTaW5jZUxhc3RGdWxsU2NhdmVuZ2UpOwotCi0g
ICAgICAgICAgICBpZiAoaXNVbmRlck1lbW9yeVByZXNzdXJlKCkgJiYgZnJlZWFibGVNZW1vcnkg
PiAxICogTUIgJiYgdGltZVNpbmNlTGFzdFNjYXZlbmdlID4gc3RkOjpjaHJvbm86Om1pbGxpc2Vj
b25kcyg1KSkKLSAgICAgICAgICAgICAgICByZXR1cm4gU2NhdmVuZ2VNb2RlOjpGdWxsOwotCi0g
ICAgICAgICAgICBpZiAoIW1faXNQcm9iYWJseUdyb3dpbmcpIHsKLSAgICAgICAgICAgICAgICBp
ZiAodGltZVNpbmNlTGFzdEZ1bGxTY2F2ZW5nZSA8IHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMo
MTAwMCkgJiYgIW1faXNJbk1pbmlNb2RlKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gU2Nh
dmVuZ2VNb2RlOjpQYXJ0aWFsOwotICAgICAgICAgICAgICAgIHJldHVybiBTY2F2ZW5nZU1vZGU6
OkZ1bGw7Ci0gICAgICAgICAgICB9CisgICAgICAgIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6
OnRpbWVfcG9pbnQgc3RhcnQgeyBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKSB9Owor
ICAgICAgICAKKyAgICAgICAgc2NhdmVuZ2UoKTsKIAotICAgICAgICAgICAgaWYgKG1faXNJbk1p
bmlNb2RlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHRpbWVTaW5jZUxhc3RGdWxsU2NhdmVuZ2Ug
PCBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDIwMCkpCi0gICAgICAgICAgICAgICAgICAgIHJl
dHVybiBTY2F2ZW5nZU1vZGU6OlBhcnRpYWw7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFNjYXZl
bmdlTW9kZTo6RnVsbDsKLSAgICAgICAgICAgIH0KKyAgICAgICAgYXV0byB0aW1lU3BlbnRTY2F2
ZW5naW5nID0gc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8c3RkOjpjaHJvbm86Om1pY3Jvc2Vj
b25kcz4oc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCkgLSBzdGFydCkuY291bnQoKTsK
IAotI2lmIEJDUFUoWDg2XzY0KQotICAgICAgICAgICAgYXV0byBwYXJ0aWFsU2NhdmVuZ2VJbnRl
cnZhbCA9IHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMTIwMDApOwotI2Vsc2UKLSAgICAgICAg
ICAgIGF1dG8gcGFydGlhbFNjYXZlbmdlSW50ZXJ2YWwgPSBzdGQ6OmNocm9ubzo6bWlsbGlzZWNv
bmRzKDgwMDApOwotI2VuZGlmCi0gICAgICAgICAgICBpZiAodGltZVNpbmNlTGFzdFNjYXZlbmdl
IDwgcGFydGlhbFNjYXZlbmdlSW50ZXJ2YWwpIHsKLSAgICAgICAgICAgICAgICAvLyBSYXRlIGxp
bWl0IHBhcnRpYWwgc2NhdmVuZ2VzLgotICAgICAgICAgICAgICAgIHJldHVybiBTY2F2ZW5nZU1v
ZGU6Ok5vbmU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZnJlZWFibGVNZW1vcnkg
PCAyNSAqIE1CKQotICAgICAgICAgICAgICAgIHJldHVybiBTY2F2ZW5nZU1vZGU6Ok5vbmU7Ci0g
ICAgICAgICAgICBpZiAoNSAqIGZyZWVhYmxlTWVtb3J5IDwgZm9vdHByaW50KCkpCi0gICAgICAg
ICAgICAgICAgcmV0dXJuIFNjYXZlbmdlTW9kZTo6Tm9uZTsKLSAgICAgICAgICAgIHJldHVybiBT
Y2F2ZW5nZU1vZGU6OlBhcnRpYWw7Ci0gICAgICAgIH0oKTsKLQotICAgICAgICBtX2lzUHJvYmFi
bHlHcm93aW5nID0gZmFsc2U7Ci0KLSAgICAgICAgc3dpdGNoIChzY2F2ZW5nZU1vZGUpIHsKLSAg
ICAgICAgY2FzZSBTY2F2ZW5nZU1vZGU6Ok5vbmU6IHsKLSAgICAgICAgICAgIHJ1blNvb24oKTsK
LSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgU2NhdmVuZ2VNb2Rl
OjpQYXJ0aWFsOiB7Ci0gICAgICAgICAgICBwYXJ0aWFsU2NhdmVuZ2UoKTsKLSAgICAgICAgICAg
IHJ1blNvb24oKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2Ug
U2NhdmVuZ2VNb2RlOjpGdWxsOiB7Ci0gICAgICAgICAgICBzY2F2ZW5nZSgpOwotICAgICAgICAg
ICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICBpZiAobV9pc0luTWluaU1v
ZGUpCisgICAgICAgICAgICBtX3dhaXRUaW1lID0gc3RkOjptaW4oc3RkOjptYXgoc3RhdGljX2Nh
c3Q8bG9uZz4odGltZVNwZW50U2NhdmVuZ2luZykgKiA1MEwgLyAxMDAwTCwgMjVMKSwgNTAwTCk7
CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1fd2FpdFRpbWUgPSBzdGQ6Om1pbihzdGQ6Om1h
eChzdGF0aWNfY2FzdDxsb25nPih0aW1lU3BlbnRTY2F2ZW5naW5nKSAqIDE1MEwgLyAxMDAwTCwg
MTAwTCksIDEwMDAwTCk7CisKKyAgICAgICAgaWYgKHZlcmJvc2UpCisgICAgICAgICAgICBmcHJp
bnRmKHN0ZGVyciwgIlRpbWUgc3BlbnQgc2NhdmVuZ2luZyAlbGZtcywgbmV3IHdhaXQgdGltZSAl
bGRtc1xuIiwgc3RhdGljX2Nhc3Q8ZG91YmxlPih0aW1lU3BlbnRTY2F2ZW5naW5nKSAvIDEwMDAs
IG1fd2FpdFRpbWUpOwogICAgIH0KIH0KIApJbmRleDogU291cmNlL2JtYWxsb2MvYm1hbGxvYy9T
Y2F2ZW5nZXIuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvYm1hbGxvYy9ibWFsbG9jL1NjYXZlbmdl
ci5oCShyZXZpc2lvbiAyNDMwODUpCisrKyBTb3VyY2UvYm1hbGxvYy9ibWFsbG9jL1NjYXZlbmdl
ci5oCSh3b3JraW5nIGNvcHkpCkBAIC04OSwxMSArODksMTAgQEAgcHJpdmF0ZToKICAgICB2b2lk
IHNldFRocmVhZE5hbWUoY29uc3QgY2hhciopOwogCiAgICAgc3RkOjpjaHJvbm86Om1pbGxpc2Vj
b25kcyB0aW1lU2luY2VMYXN0RnVsbFNjYXZlbmdlKCk7Ci0gICAgc3RkOjpjaHJvbm86Om1pbGxp
c2Vjb25kcyB0aW1lU2luY2VMYXN0UGFydGlhbFNjYXZlbmdlKCk7Ci0gICAgdm9pZCBwYXJ0aWFs
U2NhdmVuZ2UoKTsKIAogICAgIHN0ZDo6YXRvbWljPFN0YXRlPiBtX3N0YXRlIHsgU3RhdGU6OlNs
ZWVwIH07CiAgICAgc2l6ZV90IG1fc2NhdmVuZ2VyQnl0ZXMgeyAwIH07CisgICAgbG9uZyBtX3dh
aXRUaW1lOwogICAgIGJvb2wgbV9pc1Byb2JhYmx5R3Jvd2luZyB7IGZhbHNlIH07CiAgICAgYm9v
bCBtX2lzSW5NaW5pTW9kZSB7IGZhbHNlIH07CiAgICAgCkBAIC0xMDMsNyArMTAyLDYgQEAgcHJp
dmF0ZToKIAogICAgIHN0ZDo6dGhyZWFkIG1fdGhyZWFkOwogICAgIHN0ZDo6Y2hyb25vOjpzdGVh
ZHlfY2xvY2s6OnRpbWVfcG9pbnQgbV9sYXN0RnVsbFNjYXZlbmdlVGltZSB7IHN0ZDo6Y2hyb25v
OjpzdGVhZHlfY2xvY2s6Om5vdygpIH07Ci0gICAgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6
dGltZV9wb2ludCBtX2xhc3RQYXJ0aWFsU2NhdmVuZ2VUaW1lIHsgc3RkOjpjaHJvbm86OnN0ZWFk
eV9jbG9jazo6bm93KCkgfTsKICAgICAKICNpZiBCT1MoREFSV0lOKQogICAgIGRpc3BhdGNoX3Nv
dXJjZV90IG1fcHJlc3N1cmVIYW5kbGVyRGlzcGF0Y2hTb3VyY2U7CkluZGV4OiBTb3VyY2UvYm1h
bGxvYy9ibWFsbG9jL1NtYWxsUGFnZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9ibWFsbG9jL2Jt
YWxsb2MvU21hbGxQYWdlLmgJKHJldmlzaW9uIDI0MzA4NSkKKysrIFNvdXJjZS9ibWFsbG9jL2Jt
YWxsb2MvU21hbGxQYWdlLmgJKHdvcmtpbmcgY29weSkKQEAgLTUxLDYgKzUxLDEwIEBAIHB1Ymxp
YzoKICAgICBib29sIGhhc1BoeXNpY2FsUGFnZXMoKSB7IHJldHVybiBtX2hhc1BoeXNpY2FsUGFn
ZXM7IH0KICAgICB2b2lkIHNldEhhc1BoeXNpY2FsUGFnZXMoYm9vbCBoYXNQaHlzaWNhbFBhZ2Vz
KSB7IG1faGFzUGh5c2ljYWxQYWdlcyA9IGhhc1BoeXNpY2FsUGFnZXM7IH0KICAgICAKKyAgICBi
b29sIHVzZWRTaW5jZUxhc3RTY2F2ZW5nZSgpIHsgcmV0dXJuIG1fdXNlZFNpbmNlTGFzdFNjYXZl
bmdlOyB9CisgICAgdm9pZCBjbGVhclVzZWRTaW5jZUxhc3RTY2F2ZW5nZSgpIHsgbV91c2VkU2lu
Y2VMYXN0U2NhdmVuZ2UgPSBmYWxzZTsgfQorICAgIHZvaWQgc2V0VXNlZFNpbmNlTGFzdFNjYXZl
bmdlKCkgeyBtX3VzZWRTaW5jZUxhc3RTY2F2ZW5nZSA9IHRydWU7IH0KKwogICAgIFNtYWxsTGlu
ZSogYmVnaW4oKTsKIAogICAgIHVuc2lnbmVkIGNoYXIgc2xpZGUoKSBjb25zdCB7IHJldHVybiBt
X3NsaWRlOyB9CkBAIC01OSw2ICs2Myw3IEBAIHB1YmxpYzoKIHByaXZhdGU6CiAgICAgdW5zaWdu
ZWQgY2hhciBtX2hhc0ZyZWVMaW5lczogMTsKICAgICB1bnNpZ25lZCBjaGFyIG1faGFzUGh5c2lj
YWxQYWdlczogMTsKKyAgICB1bnNpZ25lZCBjaGFyIG1fdXNlZFNpbmNlTGFzdFNjYXZlbmdlOiAx
OwogICAgIHVuc2lnbmVkIGNoYXIgbV9yZWZDb3VudDogNzsKICAgICB1bnNpZ25lZCBjaGFyIG1f
c2l6ZUNsYXNzOwogICAgIHVuc2lnbmVkIGNoYXIgbV9zbGlkZTsK
</data>
<flag name="review"
          id="381545"
          type_id="1"
          status="+"
          setter="ggaren"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>365180</attachid>
            <date>2019-03-19 10:30:25 -0700</date>
            <delta_ts>2019-03-19 10:30:25 -0700</delta_ts>
            <desc>Patch for landing</desc>
            <filename>195895-pfl.patch</filename>
            <type>text/plain</type>
            <size>26645</size>
            <attacher name="Michael Saboff">msaboff</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9ibWFsbG9jL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvYm1h
bGxvYy9DaGFuZ2VMb2cJKHJldmlzaW9uIDI0MzE0MikKKysrIFNvdXJjZS9ibWFsbG9jL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDU4IEBACisyMDE5LTAzLTE4ICBNaWNoYWVs
IFNhYm9mZiAgPG1zYWJvZmZAYXBwbGUuY29tPgorCisgICAgICAgIFtCTWFsbG9jXSBTY2F2ZW5n
ZXIgc2hvdWxkIHJlYWN0IHRvIHJlY2VudCBtZW1vcnkgYWN0aXZpdHkKKyAgICAgICAgaHR0cHM6
Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE5NTg5NQorCisgICAgICAgIFJldmll
d2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFRoaXMgY2hhbmdlIGFkZHMgYSByZWNl
bnRseSB1c2VkIGJpdCB0byBvYmplY3RzIHRoYXQgYXJlIHNjYXZlbmdlZC4gIFdoZW4gYW4gb2Jq
ZWN0IGlzIGFsbG9jYXRlZCwgdGhhdCBiaXQgaXMgc2V0LgorICAgICAgICBXaGVuIHdlIHNjYXZl
bmdlLCBpZiB0aGUgYml0IGlzIHNldCwgd2UgY2xlYXIgaXQuICBJZiB0aGUgYml0IHdhcyBhbHJl
YWR5IGNsZWFyLCB3ZSBkZWNvbW1pdCB0aGUgb2JqZWN0LiAgVGhlIHRpbWluZworICAgICAgICB0
byBzY2F2ZW5naW5nIGhhcyBiZWVuIGNoYW5nZWQgYXMgd2VsbC4gIFdlIHBlcmZvcm0gb3VyIGZp
cnN0IHNjYXZuZSBhbG1vc3QgaW1tZWRpYXRlbHkgYWZ0ZXIgYm1hbGxvYyBpcyBpbml0aWFsaXpl
ZAorICAgICAgICAoMTBtcyBsYXRlcikuICBTdWJzZXF1ZW50IHNjYXZlbmdpbmcgaXMgZG9uZSBh
cyBhIG11bHRpcGxlIG9mIHRoZSB0aW1lIGl0IHRvb2sgdG8gc2NhdmVuZ2UuICBXZSBib3VuZCB0
aGlzIGNvbXB1dGVkCisgICAgICAgIHRpbWUgYmV0d2VlbiBhIG1pbmltdW0gYW5kIG1heGltdW0u
ICBUaHJvdWdoIGVtcGlyaWNhbCB0ZXN0aW5nLCB0aGUgbXVsdGlwbGllciwgbWluaW11bSBhbmQg
bWF4aW11bSBhcmUKKyAgICAgICAgMTUweCwgMTAwbXMgYW5kIDEwLDAwMG1zIHJlc3BlY3RpdmVs
eS4gIEZvciBtaW5pLW1vZGUsIHdoZW4gdGhlIEpJVCBpcyBkaXNhYmxlZCwgd2UgdXNlIG11Y2gg
bW9yZSBhZ2dyZXNzaXZlIHZhbHVlcyBvZgorICAgICAgICA1MHgsIDI1bXMgYW5kIDUwMG1zLgor
CisgICAgICAgIEVsaW1pbmF0ZWQgcGFydGlhbCBzY2F2ZW5naW5nIHNpbmNlIHRoaXMgY2hhbmdl
IGFsbG93cyBmb3IgYW55IHNjYXZlbmdlIHRvIGJlIHBhcnRpYWwgb3IgZnVsbCBiYXNlZCBvbiBy
ZWNlbnQgdXNlIG9mCisgICAgICAgIHRoZSBvYmplY3RzIG9uIHRoZSB2YXJpb3VzIGZyZWUgbGlz
dHMuCisKKyAgICAgICAgKiBibWFsbG9jL0NodW5rLmg6CisgICAgICAgIChibWFsbG9jOjpDaHVu
azo6dXNlZFNpbmNlTGFzdFNjYXZlbmdlKToKKyAgICAgICAgKGJtYWxsb2M6OkNodW5rOjpjbGVh
clVzZWRTaW5jZUxhc3RTY2F2ZW5nZSk6CisgICAgICAgIChibWFsbG9jOjpDaHVuazo6c2V0VXNl
ZFNpbmNlTGFzdFNjYXZlbmdlKToKKyAgICAgICAgKiBibWFsbG9jL0hlYXAuY3BwOgorICAgICAg
ICAoYm1hbGxvYzo6SGVhcDo6c2NhdmVuZ2UpOgorICAgICAgICAoYm1hbGxvYzo6SGVhcDo6YWxs
b2NhdGVTbWFsbENodW5rKToKKyAgICAgICAgKGJtYWxsb2M6OkhlYXA6OmFsbG9jYXRlU21hbGxQ
YWdlKToKKyAgICAgICAgKGJtYWxsb2M6OkhlYXA6OnNwbGl0QW5kQWxsb2NhdGUpOgorICAgICAg
ICAoYm1hbGxvYzo6SGVhcDo6dHJ5QWxsb2NhdGVMYXJnZSk6CisgICAgICAgIChibWFsbG9jOjpI
ZWFwOjpzY2F2ZW5nZVRvSGlnaFdhdGVybWFyayk6IERlbGV0ZWQuCisgICAgICAgICogYm1hbGxv
Yy9IZWFwLmg6CisgICAgICAgICogYm1hbGxvYy9Jc29EaXJlY3RvcnkuaDoKKyAgICAgICAgKiBi
bWFsbG9jL0lzb0RpcmVjdG9yeUlubGluZXMuaDoKKyAgICAgICAgKGJtYWxsb2M6OnBhc3NlZE51
bVBhZ2VzPjo6dGFrZUZpcnN0RWxpZ2libGUpOgorICAgICAgICAoYm1hbGxvYzo6cGFzc2VkTnVt
UGFnZXM+OjpzY2F2ZW5nZSk6CisgICAgICAgIChibWFsbG9jOjpwYXNzZWROdW1QYWdlcz46OnNj
YXZlbmdlVG9IaWdoV2F0ZXJtYXJrKTogRGVsZXRlZC4KKyAgICAgICAgKiBibWFsbG9jL0lzb0hl
YXBJbXBsLmg6CisgICAgICAgICogYm1hbGxvYy9Jc29IZWFwSW1wbElubGluZXMuaDoKKyAgICAg
ICAgKGJtYWxsb2M6Oklzb0hlYXBJbXBsPENvbmZpZz46OnNjYXZlbmdlVG9IaWdoV2F0ZXJtYXJr
KTogRGVsZXRlZC4KKyAgICAgICAgKiBibWFsbG9jL0xhcmdlUmFuZ2UuaDoKKyAgICAgICAgKGJt
YWxsb2M6OkxhcmdlUmFuZ2U6OkxhcmdlUmFuZ2UpOgorICAgICAgICAoYm1hbGxvYzo6TGFyZ2VS
YW5nZTo6dXNlZFNpbmNlTGFzdFNjYXZlbmdlKToKKyAgICAgICAgKGJtYWxsb2M6OkxhcmdlUmFu
Z2U6OmNsZWFyVXNlZFNpbmNlTGFzdFNjYXZlbmdlKToKKyAgICAgICAgKGJtYWxsb2M6Okxhcmdl
UmFuZ2U6OnNldFVzZWRTaW5jZUxhc3RTY2F2ZW5nZSk6CisgICAgICAgICgpOiBEZWxldGVkLgor
ICAgICAgICAqIGJtYWxsb2MvU2NhdmVuZ2VyLmNwcDoKKyAgICAgICAgKGJtYWxsb2M6OlNjYXZl
bmdlcjo6U2NhdmVuZ2VyKToKKyAgICAgICAgKGJtYWxsb2M6OlNjYXZlbmdlcjo6dGhyZWFkUnVu
TG9vcCk6CisgICAgICAgIChibWFsbG9jOjpTY2F2ZW5nZXI6OnRpbWVTaW5jZUxhc3RQYXJ0aWFs
U2NhdmVuZ2UpOiBEZWxldGVkLgorICAgICAgICAoYm1hbGxvYzo6U2NhdmVuZ2VyOjpwYXJ0aWFs
U2NhdmVuZ2UpOiBEZWxldGVkLgorICAgICAgICAqIGJtYWxsb2MvU2NhdmVuZ2VyLmg6CisgICAg
ICAgICogYm1hbGxvYy9TbWFsbFBhZ2UuaDoKKyAgICAgICAgKGJtYWxsb2M6OlNtYWxsUGFnZTo6
dXNlZFNpbmNlTGFzdFNjYXZlbmdlKToKKyAgICAgICAgKGJtYWxsb2M6OlNtYWxsUGFnZTo6Y2xl
YXJVc2VkU2luY2VMYXN0U2NhdmVuZ2UpOgorICAgICAgICAoYm1hbGxvYzo6U21hbGxQYWdlOjpz
ZXRVc2VkU2luY2VMYXN0U2NhdmVuZ2UpOgorCiAyMDE5LTAzLTE0ICBZdXN1a2UgU3V6dWtpICA8
eXN1enVraUBhcHBsZS5jb20+CiAKICAgICAgICAgW2JtYWxsb2NdIEFkZCBTdGF0aWNQZXJQcm9j
ZXNzIGZvciBrbm93biB0eXBlcyB0byBzYXZlIHBhZ2VzCkluZGV4OiBTb3VyY2UvYm1hbGxvYy9i
bWFsbG9jL0NodW5rLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL2JtYWxsb2MvYm1hbGxvYy9DaHVu
ay5oCShyZXZpc2lvbiAyNDMxNDIpCisrKyBTb3VyY2UvYm1hbGxvYy9ibWFsbG9jL0NodW5rLmgJ
KHdvcmtpbmcgY29weSkKQEAgLTQ1LDYgKzQ1LDEwIEBAIHB1YmxpYzoKICAgICB2b2lkIGRlcmVm
KCkgeyBCQVNTRVJUKG1fcmVmQ291bnQpOyAtLW1fcmVmQ291bnQ7IH0KICAgICB1bnNpZ25lZCBy
ZWZDb3VudCgpIHsgcmV0dXJuIG1fcmVmQ291bnQ7IH0KIAorICAgIGJvb2wgdXNlZFNpbmNlTGFz
dFNjYXZlbmdlKCkgeyByZXR1cm4gbV91c2VkU2luY2VMYXN0U2NhdmVuZ2U7IH0KKyAgICB2b2lk
IGNsZWFyVXNlZFNpbmNlTGFzdFNjYXZlbmdlKCkgeyBtX3VzZWRTaW5jZUxhc3RTY2F2ZW5nZSA9
IGZhbHNlOyB9CisgICAgdm9pZCBzZXRVc2VkU2luY2VMYXN0U2NhdmVuZ2UoKSB7IG1fdXNlZFNp
bmNlTGFzdFNjYXZlbmdlID0gdHJ1ZTsgfQorCiAgICAgc2l6ZV90IG9mZnNldCh2b2lkKik7CiAK
ICAgICBjaGFyKiBhZGRyZXNzKHNpemVfdCBvZmZzZXQpOwpAQCAtNTksNiArNjMsNyBAQCBwdWJs
aWM6CiAKIHByaXZhdGU6CiAgICAgc2l6ZV90IG1fcmVmQ291bnQgeyB9OworICAgIGJvb2wgbV91
c2VkU2luY2VMYXN0U2NhdmVuZ2U6IDE7CiAgICAgTGlzdDxTbWFsbFBhZ2U+IG1fZnJlZVBhZ2Vz
IHsgfTsKIAogICAgIHN0ZDo6YXJyYXk8U21hbGxMaW5lLCBjaHVua1NpemUgLyBzbWFsbExpbmVT
aXplPiBtX2xpbmVzIHsgfTsKSW5kZXg6IFNvdXJjZS9ibWFsbG9jL2JtYWxsb2MvSGVhcC5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL2JtYWxsb2MvYm1hbGxvYy9IZWFwLmNwcAkocmV2aXNpb24g
MjQzMTQyKQorKysgU291cmNlL2JtYWxsb2MvYm1hbGxvYy9IZWFwLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtMTc1LDEzICsxNzUsMTggQEAgdm9pZCBIZWFwOjpkZWNvbW1pdExhcmdlUmFuZ2Uoc3Rk
Ojpsb2NrXwogI2VuZGlmCiB9CiAKLXZvaWQgSGVhcDo6c2NhdmVuZ2Uoc3RkOjpsb2NrX2d1YXJk
PE11dGV4PiYgbG9jaywgQnVsa0RlY29tbWl0JiBkZWNvbW1pdHRlcikKK3ZvaWQgSGVhcDo6c2Nh
dmVuZ2Uoc3RkOjpsb2NrX2d1YXJkPE11dGV4PiYgbG9jaywgQnVsa0RlY29tbWl0JiBkZWNvbW1p
dHRlciwgc2l6ZV90JiBkZWZlcnJlZERlY29tbWl0cykKIHsKICAgICBmb3IgKGF1dG8mIGxpc3Qg
OiBtX2ZyZWVQYWdlcykgewogICAgICAgICBmb3IgKGF1dG8qIGNodW5rIDogbGlzdCkgewogICAg
ICAgICAgICAgZm9yIChhdXRvKiBwYWdlIDogY2h1bmstPmZyZWVQYWdlcygpKSB7CiAgICAgICAg
ICAgICAgICAgaWYgKCFwYWdlLT5oYXNQaHlzaWNhbFBhZ2VzKCkpCiAgICAgICAgICAgICAgICAg
ICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGlmIChwYWdlLT51c2VkU2luY2VMYXN0U2Nh
dmVuZ2UoKSkgeworICAgICAgICAgICAgICAgICAgICBwYWdlLT5jbGVhclVzZWRTaW5jZUxhc3RT
Y2F2ZW5nZSgpOworICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZERlY29tbWl0cysrOworICAg
ICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CiAKICAgICAgICAg
ICAgICAgICBzaXplX3QgcGFnZVNpemUgPSBibWFsbG9jOjpwYWdlU2l6ZSgmbGlzdCAtICZtX2Zy
ZWVQYWdlc1swXSk7CiAgICAgICAgICAgICAgICAgc2l6ZV90IGRlY29tbWl0U2l6ZSA9IHBoeXNp
Y2FsUGFnZVNpemVTbG9wcHkocGFnZS0+YmVnaW4oKS0+YmVnaW4oKSwgcGFnZVNpemUpOwpAQCAt
MTg5LDM2ICsxOTQsMzYgQEAgdm9pZCBIZWFwOjpzY2F2ZW5nZShzdGQ6OmxvY2tfZ3VhcmQ8TXV0
ZQogICAgICAgICAgICAgICAgIG1fZm9vdHByaW50IC09IGRlY29tbWl0U2l6ZTsKICAgICAgICAg
ICAgICAgICBkZWNvbW1pdHRlci5hZGRFYWdlcihwYWdlLT5iZWdpbigpLT5iZWdpbigpLCBwYWdl
U2l6ZSk7CiAgICAgICAgICAgICAgICAgcGFnZS0+c2V0SGFzUGh5c2ljYWxQYWdlcyhmYWxzZSk7
Ci0jaWYgRU5BQkxFX1BIWVNJQ0FMX1BBR0VfTUFQIAorI2lmIEVOQUJMRV9QSFlTSUNBTF9QQUdF
X01BUAogICAgICAgICAgICAgICAgIG1fcGh5c2ljYWxQYWdlTWFwLmRlY29tbWl0KHBhZ2UtPmJl
Z2luKCktPmJlZ2luKCksIHBhZ2VTaXplKTsKICNlbmRpZgogICAgICAgICAgICAgfQogICAgICAg
ICB9CiAgICAgfQotICAgIAorCiAgICAgZm9yIChhdXRvJiBsaXN0IDogbV9jaHVua0NhY2hlKSB7
Ci0gICAgICAgIHdoaWxlICghbGlzdC5pc0VtcHR5KCkpCi0gICAgICAgICAgICBkZWFsbG9jYXRl
U21hbGxDaHVuayhsaXN0LnBvcCgpLCAmbGlzdCAtICZtX2NodW5rQ2FjaGVbMF0pOworICAgICAg
ICBmb3IgKGF1dG8gaXRlciA9IGxpc3QuYmVnaW4oKTsgaXRlciAhPSBsaXN0LmVuZCgpOyApIHsK
KyAgICAgICAgICAgIENodW5rKiBjaHVuayA9ICppdGVyOworICAgICAgICAgICAgaWYgKGNodW5r
LT51c2VkU2luY2VMYXN0U2NhdmVuZ2UoKSkgeworICAgICAgICAgICAgICAgIGNodW5rLT5jbGVh
clVzZWRTaW5jZUxhc3RTY2F2ZW5nZSgpOworICAgICAgICAgICAgICAgIGRlZmVycmVkRGVjb21t
aXRzKys7CisgICAgICAgICAgICAgICAgKytpdGVyOworICAgICAgICAgICAgICAgIGNvbnRpbnVl
OworICAgICAgICAgICAgfQorICAgICAgICAgICAgKytpdGVyOworICAgICAgICAgICAgbGlzdC5y
ZW1vdmUoY2h1bmspOworICAgICAgICAgICAgZGVhbGxvY2F0ZVNtYWxsQ2h1bmsoY2h1bmssICZs
aXN0IC0gJm1fY2h1bmtDYWNoZVswXSk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBmb3IgKExh
cmdlUmFuZ2UmIHJhbmdlIDogbV9sYXJnZUZyZWUpIHsKLSAgICAgICAgbV9oaWdoV2F0ZXJtYXJr
ID0gc3RkOjptaW4obV9oaWdoV2F0ZXJtYXJrLCBzdGF0aWNfY2FzdDx2b2lkKj4ocmFuZ2UuYmVn
aW4oKSkpOworICAgICAgICBpZiAocmFuZ2UudXNlZFNpbmNlTGFzdFNjYXZlbmdlKCkpIHsKKyAg
ICAgICAgICAgIHJhbmdlLmNsZWFyVXNlZFNpbmNlTGFzdFNjYXZlbmdlKCk7CisgICAgICAgICAg
ICBkZWZlcnJlZERlY29tbWl0cysrOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0K
ICAgICAgICAgZGVjb21taXRMYXJnZVJhbmdlKGxvY2ssIHJhbmdlLCBkZWNvbW1pdHRlcik7CiAg
ICAgfQotCi0gICAgbV9mcmVlYWJsZU1lbW9yeSA9IDA7Ci19Ci0KLXZvaWQgSGVhcDo6c2NhdmVu
Z2VUb0hpZ2hXYXRlcm1hcmsoc3RkOjpsb2NrX2d1YXJkPE11dGV4PiYgbG9jaywgQnVsa0RlY29t
bWl0JiBkZWNvbW1pdHRlcikKLXsKLSAgICB2b2lkKiBuZXdIaWdoV2F0ZXJNYXJrID0gbnVsbHB0
cjsKLSAgICBmb3IgKExhcmdlUmFuZ2UmIHJhbmdlIDogbV9sYXJnZUZyZWUpIHsKLSAgICAgICAg
aWYgKHJhbmdlLmJlZ2luKCkgPD0gbV9oaWdoV2F0ZXJtYXJrKQotICAgICAgICAgICAgbmV3SGln
aFdhdGVyTWFyayA9IHN0ZDo6bWluKG5ld0hpZ2hXYXRlck1hcmssIHN0YXRpY19jYXN0PHZvaWQq
PihyYW5nZS5iZWdpbigpKSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGRlY29tbWl0TGFy
Z2VSYW5nZShsb2NrLCByYW5nZSwgZGVjb21taXR0ZXIpOwotICAgIH0KLSAgICBtX2hpZ2hXYXRl
cm1hcmsgPSBuZXdIaWdoV2F0ZXJNYXJrOwogfQogCiB2b2lkIEhlYXA6OmRlYWxsb2NhdGVMaW5l
Q2FjaGUoc3RkOjp1bmlxdWVfbG9jazxNdXRleD4mLCBMaW5lQ2FjaGUmIGxpbmVDYWNoZSkKQEAg
LTI0OSw2ICsyNTQsNyBAQCB2b2lkIEhlYXA6OmFsbG9jYXRlU21hbGxDaHVuayhzdGQ6OnVuaXF1
CiAKICAgICAgICAgZm9yRWFjaFBhZ2UoY2h1bmssIHBhZ2VTaXplLCBbJl0oU21hbGxQYWdlKiBw
YWdlKSB7CiAgICAgICAgICAgICBwYWdlLT5zZXRIYXNQaHlzaWNhbFBhZ2VzKHRydWUpOworICAg
ICAgICAgICAgcGFnZS0+c2V0VXNlZFNpbmNlTGFzdFNjYXZlbmdlKCk7CiAgICAgICAgICAgICBw
YWdlLT5zZXRIYXNGcmVlTGluZXMobG9jaywgdHJ1ZSk7CiAgICAgICAgICAgICBjaHVuay0+ZnJl
ZVBhZ2VzKCkucHVzaChwYWdlKTsKICAgICAgICAgfSk7CkBAIC0zMTAsNiArMzE2LDcgQEAgU21h
bGxQYWdlKiBIZWFwOjphbGxvY2F0ZVNtYWxsUGFnZShzdGQ6OgogICAgICAgICBDaHVuayogY2h1
bmsgPSBtX2ZyZWVQYWdlc1twYWdlQ2xhc3NdLnRhaWwoKTsKIAogICAgICAgICBjaHVuay0+cmVm
KCk7CisgICAgICAgIGNodW5rLT5zZXRVc2VkU2luY2VMYXN0U2NhdmVuZ2UoKTsKIAogICAgICAg
ICBTbWFsbFBhZ2UqIHBhZ2UgPSBjaHVuay0+ZnJlZVBhZ2VzKCkucG9wKCk7CiAgICAgICAgIGlm
IChjaHVuay0+ZnJlZVBhZ2VzKCkuaXNFbXB0eSgpKQpAQCAtMzI0LDEwICszMzEsMTEgQEAgU21h
bGxQYWdlKiBIZWFwOjphbGxvY2F0ZVNtYWxsUGFnZShzdGQ6OgogICAgICAgICAgICAgbV9mb290
cHJpbnQgKz0gcGh5c2ljYWxTaXplOwogICAgICAgICAgICAgdm1BbGxvY2F0ZVBoeXNpY2FsUGFn
ZXNTbG9wcHkocGFnZS0+YmVnaW4oKS0+YmVnaW4oKSwgcGFnZVNpemUpOwogICAgICAgICAgICAg
cGFnZS0+c2V0SGFzUGh5c2ljYWxQYWdlcyh0cnVlKTsKLSNpZiBFTkFCTEVfUEhZU0lDQUxfUEFH
RV9NQVAgCisjaWYgRU5BQkxFX1BIWVNJQ0FMX1BBR0VfTUFQCiAgICAgICAgICAgICBtX3BoeXNp
Y2FsUGFnZU1hcC5jb21taXQocGFnZS0+YmVnaW4oKS0+YmVnaW4oKSwgcGFnZVNpemUpOwogI2Vu
ZGlmCiAgICAgICAgIH0KKyAgICAgICAgcGFnZS0+c2V0VXNlZFNpbmNlTGFzdFNjYXZlbmdlKCk7
CiAKICAgICAgICAgcmV0dXJuIHBhZ2U7CiAgICAgfSgpOwpAQCAtNTg1LDcgKzU5Myw2IEBAIHZv
aWQqIEhlYXA6OnRyeUFsbG9jYXRlTGFyZ2Uoc3RkOjp1bmlxdWUKICAgICBtX2ZyZWVhYmxlTWVt
b3J5IC09IHJhbmdlLnRvdGFsUGh5c2ljYWxTaXplKCk7CiAKICAgICB2b2lkKiByZXN1bHQgPSBz
cGxpdEFuZEFsbG9jYXRlKGxvY2ssIHJhbmdlLCBhbGlnbm1lbnQsIHNpemUpLmJlZ2luKCk7Ci0g
ICAgbV9oaWdoV2F0ZXJtYXJrID0gc3RkOjptYXgobV9oaWdoV2F0ZXJtYXJrLCByZXN1bHQpOwog
ICAgIHJldHVybiByZXN1bHQ7CiB9CiAKSW5kZXg6IFNvdXJjZS9ibWFsbG9jL2JtYWxsb2MvSGVh
cC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9ibWFsbG9jL2JtYWxsb2MvSGVhcC5oCShyZXZpc2lv
biAyNDMxNDIpCisrKyBTb3VyY2UvYm1hbGxvYy9ibWFsbG9jL0hlYXAuaAkod29ya2luZyBjb3B5
KQpAQCAtNzYsOSArNzYsOCBAQCBwdWJsaWM6CiAgICAgc2l6ZV90IGxhcmdlU2l6ZShzdGQ6OnVu
aXF1ZV9sb2NrPE11dGV4PiYsIHZvaWQqKTsKICAgICB2b2lkIHNocmlua0xhcmdlKHN0ZDo6dW5p
cXVlX2xvY2s8TXV0ZXg+JiwgY29uc3QgUmFuZ2UmLCBzaXplX3QpOwogCi0gICAgdm9pZCBzY2F2
ZW5nZShzdGQ6OmxvY2tfZ3VhcmQ8TXV0ZXg+JiwgQnVsa0RlY29tbWl0Jik7CisgICAgdm9pZCBz
Y2F2ZW5nZShzdGQ6OmxvY2tfZ3VhcmQ8TXV0ZXg+JiwgQnVsa0RlY29tbWl0Jiwgc2l6ZV90JiBk
ZWZlcnJlZERlY29tbWl0cyk7CiAgICAgdm9pZCBzY2F2ZW5nZShzdGQ6OmxvY2tfZ3VhcmQ8TXV0
ZXg+JiwgQnVsa0RlY29tbWl0Jiwgc2l6ZV90JiBmcmVlZCwgc2l6ZV90IGdvYWwpOwotICAgIHZv
aWQgc2NhdmVuZ2VUb0hpZ2hXYXRlcm1hcmsoc3RkOjpsb2NrX2d1YXJkPE11dGV4PiYsIEJ1bGtE
ZWNvbW1pdCYpOwogCiAgICAgc2l6ZV90IGZyZWVhYmxlTWVtb3J5KHN0ZDo6bG9ja19ndWFyZDxN
dXRleD4mKTsKICAgICBzaXplX3QgZm9vdHByaW50KCk7CkBAIC0xNTMsOCArMTUyLDYgQEAgcHJp
dmF0ZToKICNpZiBFTkFCTEVfUEhZU0lDQUxfUEFHRV9NQVAgCiAgICAgUGh5c2ljYWxQYWdlTWFw
IG1fcGh5c2ljYWxQYWdlTWFwOwogI2VuZGlmCi0KLSAgICB2b2lkKiBtX2hpZ2hXYXRlcm1hcmsg
eyBudWxscHRyIH07CiB9OwogCiBpbmxpbmUgdm9pZCBIZWFwOjphbGxvY2F0ZVNtYWxsQnVtcFJh
bmdlcygKSW5kZXg6IFNvdXJjZS9ibWFsbG9jL2JtYWxsb2MvSXNvRGlyZWN0b3J5LmgKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL2JtYWxsb2MvYm1hbGxvYy9Jc29EaXJlY3RvcnkuaAkocmV2aXNpb24g
MjQzMTQyKQorKysgU291cmNlL2JtYWxsb2MvYm1hbGxvYy9Jc29EaXJlY3RvcnkuaAkod29ya2lu
ZyBjb3B5KQpAQCAtNzUsNyArNzUsNiBAQCBwdWJsaWM6CiAgICAgLy8gSXRlcmF0ZSBvdmVyIGFs
bCBlbXB0eSBhbmQgY29tbWl0dGVkIHBhZ2VzLCBhbmQgcHV0IHRoZW0gaW50byB0aGUgdmVjdG9y
LiBUaGlzIGFsc28gcmVjb3JkcyB0aGUKICAgICAvLyBwYWdlcyBhcyBiZWluZyBkZWNvbW1pdHRl
ZC4gSXQncyB0aGUgY2FsbGVyJ3Mgam9iIHRvIGRvIHRoZSBhY3R1YWwgZGVjb21taXR0aW5nLgog
ICAgIHZvaWQgc2NhdmVuZ2UoVmVjdG9yPERlZmVycmVkRGVjb21taXQ+Jik7Ci0gICAgdm9pZCBz
Y2F2ZW5nZVRvSGlnaFdhdGVybWFyayhWZWN0b3I8RGVmZXJyZWREZWNvbW1pdD4mKTsKIAogICAg
IHRlbXBsYXRlPHR5cGVuYW1lIEZ1bmM+CiAgICAgdm9pZCBmb3JFYWNoQ29tbWl0dGVkUGFnZShj
b25zdCBGdW5jJik7CkBAIC05MCw3ICs4OSw2IEBAIHByaXZhdGU6CiAgICAgQml0czxudW1QYWdl
cz4gbV9jb21taXR0ZWQ7CiAgICAgc3RkOjphcnJheTxJc29QYWdlPENvbmZpZz4qLCBudW1QYWdl
cz4gbV9wYWdlczsKICAgICB1bnNpZ25lZCBtX2ZpcnN0RWxpZ2libGUgeyAwIH07Ci0gICAgdW5z
aWduZWQgbV9oaWdoV2F0ZXJtYXJrIHsgMCB9OwogfTsKIAogfSAvLyBuYW1lc3BhY2UgYm1hbGxv
YwpJbmRleDogU291cmNlL2JtYWxsb2MvYm1hbGxvYy9Jc29EaXJlY3RvcnlJbmxpbmVzLmgKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL2JtYWxsb2MvYm1hbGxvYy9Jc29EaXJlY3RvcnlJbmxpbmVzLmgJ
KHJldmlzaW9uIDI0MzE0MikKKysrIFNvdXJjZS9ibWFsbG9jL2JtYWxsb2MvSXNvRGlyZWN0b3J5
SW5saW5lcy5oCSh3b3JraW5nIGNvcHkpCkBAIC01MSw4ICs1MSw2IEBAIEVsaWdpYmlsaXR5UmVz
dWx0PENvbmZpZz4gSXNvRGlyZWN0b3J5PEMKICAgICBpZiAocGFnZUluZGV4ID49IG51bVBhZ2Vz
KQogICAgICAgICByZXR1cm4gRWxpZ2liaWxpdHlLaW5kOjpGdWxsOwogCi0gICAgbV9oaWdoV2F0
ZXJtYXJrID0gc3RkOjptYXgocGFnZUluZGV4LCBtX2hpZ2hXYXRlcm1hcmspOwotICAgIAogICAg
IFNjYXZlbmdlciYgc2NhdmVuZ2VyID0gKlNjYXZlbmdlcjo6Z2V0KCk7CiAgICAgc2NhdmVuZ2Vy
LmRpZFN0YXJ0R3Jvd2luZygpOwogICAgIApAQCAtMTQzLDE4ICsxNDEsNiBAQCB2b2lkIElzb0Rp
cmVjdG9yeTxDb25maWcsIHBhc3NlZE51bVBhZ2VzCiAgICAgICAgIFsmXSAoc2l6ZV90IGluZGV4
KSB7CiAgICAgICAgICAgICBzY2F2ZW5nZVBhZ2UoaW5kZXgsIGRlY29tbWl0cyk7CiAgICAgICAg
IH0pOwotICAgIG1faGlnaFdhdGVybWFyayA9IDA7Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIENv
bmZpZywgdW5zaWduZWQgcGFzc2VkTnVtUGFnZXM+Ci12b2lkIElzb0RpcmVjdG9yeTxDb25maWcs
IHBhc3NlZE51bVBhZ2VzPjo6c2NhdmVuZ2VUb0hpZ2hXYXRlcm1hcmsoVmVjdG9yPERlZmVycmVk
RGVjb21taXQ+JiBkZWNvbW1pdHMpCi17Ci0gICAgKG1fZW1wdHkgJiBtX2NvbW1pdHRlZCkuZm9y
RWFjaFNldEJpdCgKLSAgICAgICAgWyZdIChzaXplX3QgaW5kZXgpIHsKLSAgICAgICAgICAgIGlm
IChpbmRleCA+IG1faGlnaFdhdGVybWFyaykKLSAgICAgICAgICAgICAgICBzY2F2ZW5nZVBhZ2Uo
aW5kZXgsIGRlY29tbWl0cyk7Ci0gICAgICAgIH0pOwotICAgIG1faGlnaFdhdGVybWFyayA9IDA7
CiB9CiAKIHRlbXBsYXRlPHR5cGVuYW1lIENvbmZpZywgdW5zaWduZWQgcGFzc2VkTnVtUGFnZXM+
CkluZGV4OiBTb3VyY2UvYm1hbGxvYy9ibWFsbG9jL0lzb0hlYXBJbXBsLmgKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL2JtYWxsb2MvYm1hbGxvYy9Jc29IZWFwSW1wbC5oCShyZXZpc2lvbiAyNDMxNDIp
CisrKyBTb3VyY2UvYm1hbGxvYy9ibWFsbG9jL0lzb0hlYXBJbXBsLmgJKHdvcmtpbmcgY29weSkK
QEAgLTQwLDcgKzQwLDYgQEAgcHVibGljOgogICAgIHZpcnR1YWwgfklzb0hlYXBJbXBsQmFzZSgp
OwogICAgIAogICAgIHZpcnR1YWwgdm9pZCBzY2F2ZW5nZShWZWN0b3I8RGVmZXJyZWREZWNvbW1p
dD4mKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkIHNjYXZlbmdlVG9IaWdoV2F0ZXJtYXJrKFZlY3Rv
cjxEZWZlcnJlZERlY29tbWl0PiYpID0gMDsKICAgICB2aXJ0dWFsIHNpemVfdCBmcmVlYWJsZU1l
bW9yeSgpID0gMDsKICAgICB2aXJ0dWFsIHNpemVfdCBmb290cHJpbnQoKSA9IDA7CiAgICAgCkBA
IC03Miw3ICs3MSw2IEBAIHB1YmxpYzoKICAgICB2b2lkIGRpZEJlY29tZUVsaWdpYmxlKElzb0Rp
cmVjdG9yeTxDb25maWcsIElzb0RpcmVjdG9yeVBhZ2U8Q29uZmlnPjo6bnVtUGFnZXM+Kik7CiAg
ICAgCiAgICAgdm9pZCBzY2F2ZW5nZShWZWN0b3I8RGVmZXJyZWREZWNvbW1pdD4mKSBvdmVycmlk
ZTsKLSAgICB2b2lkIHNjYXZlbmdlVG9IaWdoV2F0ZXJtYXJrKFZlY3RvcjxEZWZlcnJlZERlY29t
bWl0PiYpIG92ZXJyaWRlOwogCiAgICAgc2l6ZV90IGZyZWVhYmxlTWVtb3J5KCkgb3ZlcnJpZGU7
CiAKSW5kZXg6IFNvdXJjZS9ibWFsbG9jL2JtYWxsb2MvSXNvSGVhcEltcGxJbmxpbmVzLmgKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL2JtYWxsb2MvYm1hbGxvYy9Jc29IZWFwSW1wbElubGluZXMuaAko
cmV2aXNpb24gMjQzMTQyKQorKysgU291cmNlL2JtYWxsb2MvYm1hbGxvYy9Jc29IZWFwSW1wbElu
bGluZXMuaAkod29ya2luZyBjb3B5KQpAQCAtMTEwLDE5ICsxMTAsNiBAQCB2b2lkIElzb0hlYXBJ
bXBsPENvbmZpZz46OnNjYXZlbmdlKFZlY3RvCiB9CiAKIHRlbXBsYXRlPHR5cGVuYW1lIENvbmZp
Zz4KLXZvaWQgSXNvSGVhcEltcGw8Q29uZmlnPjo6c2NhdmVuZ2VUb0hpZ2hXYXRlcm1hcmsoVmVj
dG9yPERlZmVycmVkRGVjb21taXQ+JiBkZWNvbW1pdHMpCi17Ci0gICAgc3RkOjpsb2NrX2d1YXJk
PE11dGV4PiBsb2NrZXIodGhpcy0+bG9jayk7Ci0gICAgaWYgKCFtX2RpcmVjdG9yeUhpZ2hXYXRl
cm1hcmspCi0gICAgICAgIG1faW5saW5lRGlyZWN0b3J5LnNjYXZlbmdlVG9IaWdoV2F0ZXJtYXJr
KGRlY29tbWl0cyk7Ci0gICAgZm9yIChJc29EaXJlY3RvcnlQYWdlPENvbmZpZz4qIHBhZ2UgPSBt
X2hlYWREaXJlY3Rvcnk7IHBhZ2U7IHBhZ2UgPSBwYWdlLT5uZXh0KSB7Ci0gICAgICAgIGlmIChw
YWdlLT5pbmRleCgpID49IG1fZGlyZWN0b3J5SGlnaFdhdGVybWFyaykKLSAgICAgICAgICAgIHBh
Z2UtPnBheWxvYWQuc2NhdmVuZ2VUb0hpZ2hXYXRlcm1hcmsoZGVjb21taXRzKTsKLSAgICB9Ci0g
ICAgbV9kaXJlY3RvcnlIaWdoV2F0ZXJtYXJrID0gMDsKLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUg
Q29uZmlnPgogc2l6ZV90IElzb0hlYXBJbXBsPENvbmZpZz46OmZyZWVhYmxlTWVtb3J5KCkKIHsK
ICAgICByZXR1cm4gbV9mcmVlYWJsZU1lbW9yeTsKSW5kZXg6IFNvdXJjZS9ibWFsbG9jL2JtYWxs
b2MvTGFyZ2VNYXAuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9ibWFsbG9jL2JtYWxsb2MvTGFy
Z2VNYXAuY3BwCShyZXZpc2lvbiAyNDMxNDIpCisrKyBTb3VyY2UvYm1hbGxvYy9ibWFsbG9jL0xh
cmdlTWFwLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNzUsNyArNzUsOCBAQCB2b2lkIExhcmdlTWFw
OjphZGQoY29uc3QgTGFyZ2VSYW5nZSYgcmFuCiAKICAgICAgICAgbWVyZ2VkID0gbWVyZ2UobWVy
Z2VkLCBtX2ZyZWUucG9wKGktLSkpOwogICAgIH0KLSAgICAKKworICAgIG1lcmdlZC5zZXRVc2Vk
U2luY2VMYXN0U2NhdmVuZ2UoKTsKICAgICBtX2ZyZWUucHVzaChtZXJnZWQpOwogfQogCkluZGV4
OiBTb3VyY2UvYm1hbGxvYy9ibWFsbG9jL0xhcmdlUmFuZ2UuaAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3Vy
Y2UvYm1hbGxvYy9ibWFsbG9jL0xhcmdlUmFuZ2UuaAkocmV2aXNpb24gMjQzMTQyKQorKysgU291
cmNlL2JtYWxsb2MvYm1hbGxvYy9MYXJnZVJhbmdlLmgJKHdvcmtpbmcgY29weSkKQEAgLTM3LDYg
KzM3LDggQEAgcHVibGljOgogICAgICAgICA6IFJhbmdlKCkKICAgICAgICAgLCBtX3N0YXJ0UGh5
c2ljYWxTaXplKDApCiAgICAgICAgICwgbV90b3RhbFBoeXNpY2FsU2l6ZSgwKQorICAgICAgICAs
IG1faXNFbGlnaWJsZSh0cnVlKQorICAgICAgICAsIG1fdXNlZFNpbmNlTGFzdFNjYXZlbmdlKGZh
bHNlKQogICAgIHsKICAgICB9CiAKQEAgLTQ0LDE1ICs0NiwxOSBAQCBwdWJsaWM6CiAgICAgICAg
IDogUmFuZ2Uob3RoZXIpCiAgICAgICAgICwgbV9zdGFydFBoeXNpY2FsU2l6ZShzdGFydFBoeXNp
Y2FsU2l6ZSkKICAgICAgICAgLCBtX3RvdGFsUGh5c2ljYWxTaXplKHRvdGFsUGh5c2ljYWxTaXpl
KQorICAgICAgICAsIG1faXNFbGlnaWJsZSh0cnVlKQorICAgICAgICAsIG1fdXNlZFNpbmNlTGFz
dFNjYXZlbmdlKGZhbHNlKQogICAgIHsKICAgICAgICAgQkFTU0VSVCh0aGlzLT5zaXplKCkgPj0g
dGhpcy0+dG90YWxQaHlzaWNhbFNpemUoKSk7CiAgICAgICAgIEJBU1NFUlQodGhpcy0+dG90YWxQ
aHlzaWNhbFNpemUoKSA+PSB0aGlzLT5zdGFydFBoeXNpY2FsU2l6ZSgpKTsKICAgICB9CiAKLSAg
ICBMYXJnZVJhbmdlKHZvaWQqIGJlZ2luLCBzaXplX3Qgc2l6ZSwgc2l6ZV90IHN0YXJ0UGh5c2lj
YWxTaXplLCBzaXplX3QgdG90YWxQaHlzaWNhbFNpemUpCisgICAgTGFyZ2VSYW5nZSh2b2lkKiBi
ZWdpbiwgc2l6ZV90IHNpemUsIHNpemVfdCBzdGFydFBoeXNpY2FsU2l6ZSwgc2l6ZV90IHRvdGFs
UGh5c2ljYWxTaXplLCBib29sIHVzZWRTaW5jZUxhc3RTY2F2ZW5nZSA9IGZhbHNlKQogICAgICAg
ICA6IFJhbmdlKGJlZ2luLCBzaXplKQogICAgICAgICAsIG1fc3RhcnRQaHlzaWNhbFNpemUoc3Rh
cnRQaHlzaWNhbFNpemUpCiAgICAgICAgICwgbV90b3RhbFBoeXNpY2FsU2l6ZSh0b3RhbFBoeXNp
Y2FsU2l6ZSkKKyAgICAgICAgLCBtX2lzRWxpZ2libGUodHJ1ZSkKKyAgICAgICAgLCBtX3VzZWRT
aW5jZUxhc3RTY2F2ZW5nZSh1c2VkU2luY2VMYXN0U2NhdmVuZ2UpCiAgICAgewogICAgICAgICBC
QVNTRVJUKHRoaXMtPnNpemUoKSA+PSB0aGlzLT50b3RhbFBoeXNpY2FsU2l6ZSgpKTsKICAgICAg
ICAgQkFTU0VSVCh0aGlzLT50b3RhbFBoeXNpY2FsU2l6ZSgpID49IHRoaXMtPnN0YXJ0UGh5c2lj
YWxTaXplKCkpOwpAQCAtODMsMTMgKzg5LDE4IEBAIHB1YmxpYzoKICAgICB2b2lkIHNldEVsaWdp
YmxlKGJvb2wgZWxpZ2libGUpIHsgbV9pc0VsaWdpYmxlID0gZWxpZ2libGU7IH0KICAgICBib29s
IGlzRWxpZ2liaWxlKCkgY29uc3QgeyByZXR1cm4gbV9pc0VsaWdpYmxlOyB9CiAKKyAgICBib29s
IHVzZWRTaW5jZUxhc3RTY2F2ZW5nZSgpIGNvbnN0IHsgcmV0dXJuIG1fdXNlZFNpbmNlTGFzdFNj
YXZlbmdlOyB9CisgICAgdm9pZCBjbGVhclVzZWRTaW5jZUxhc3RTY2F2ZW5nZSgpIHsgbV91c2Vk
U2luY2VMYXN0U2NhdmVuZ2UgPSBmYWxzZTsgfQorICAgIHZvaWQgc2V0VXNlZFNpbmNlTGFzdFNj
YXZlbmdlKCkgeyBtX3VzZWRTaW5jZUxhc3RTY2F2ZW5nZSA9IHRydWU7IH0KKwogICAgIGJvb2wg
b3BlcmF0b3I8KGNvbnN0IHZvaWQqIG90aGVyKSBjb25zdCB7IHJldHVybiBiZWdpbigpIDwgb3Ro
ZXI7IH0KICAgICBib29sIG9wZXJhdG9yPChjb25zdCBMYXJnZVJhbmdlJiBvdGhlcikgY29uc3Qg
eyByZXR1cm4gYmVnaW4oKSA8IG90aGVyLmJlZ2luKCk7IH0KIAogcHJpdmF0ZToKICAgICBzaXpl
X3QgbV9zdGFydFBoeXNpY2FsU2l6ZTsKICAgICBzaXplX3QgbV90b3RhbFBoeXNpY2FsU2l6ZTsK
LSAgICBib29sIG1faXNFbGlnaWJsZSB7IHRydWUgfTsKKyAgICB1bnNpZ25lZCBtX2lzRWxpZ2li
bGU6IDE7CisgICAgdW5zaWduZWQgbV91c2VkU2luY2VMYXN0U2NhdmVuZ2U6IDE7CiB9OwogCiBp
bmxpbmUgYm9vbCBjYW5NZXJnZShjb25zdCBMYXJnZVJhbmdlJiBhLCBjb25zdCBMYXJnZVJhbmdl
JiBiKQpAQCAtMTEyLDE5ICsxMjMsMjIgQEAgaW5saW5lIGJvb2wgY2FuTWVyZ2UoY29uc3QgTGFy
Z2VSYW5nZSYgYQogaW5saW5lIExhcmdlUmFuZ2UgbWVyZ2UoY29uc3QgTGFyZ2VSYW5nZSYgYSwg
Y29uc3QgTGFyZ2VSYW5nZSYgYikKIHsKICAgICBjb25zdCBMYXJnZVJhbmdlJiBsZWZ0ID0gc3Rk
OjptaW4oYSwgYik7CisgICAgYm9vbCBtZXJnZWRVc2VkU2luY2VMYXN0U2NhdmVuZ2UgPSBhLnVz
ZWRTaW5jZUxhc3RTY2F2ZW5nZSgpIHx8IGIudXNlZFNpbmNlTGFzdFNjYXZlbmdlKCk7CiAgICAg
aWYgKGxlZnQuc2l6ZSgpID09IGxlZnQuc3RhcnRQaHlzaWNhbFNpemUoKSkgewogICAgICAgICBy
ZXR1cm4gTGFyZ2VSYW5nZSgKICAgICAgICAgICAgIGxlZnQuYmVnaW4oKSwKICAgICAgICAgICAg
IGEuc2l6ZSgpICsgYi5zaXplKCksCiAgICAgICAgICAgICBhLnN0YXJ0UGh5c2ljYWxTaXplKCkg
KyBiLnN0YXJ0UGh5c2ljYWxTaXplKCksCi0gICAgICAgICAgICBhLnRvdGFsUGh5c2ljYWxTaXpl
KCkgKyBiLnRvdGFsUGh5c2ljYWxTaXplKCkpOworICAgICAgICAgICAgYS50b3RhbFBoeXNpY2Fs
U2l6ZSgpICsgYi50b3RhbFBoeXNpY2FsU2l6ZSgpLAorICAgICAgICAgICAgbWVyZ2VkVXNlZFNp
bmNlTGFzdFNjYXZlbmdlKTsKICAgICB9CiAKICAgICByZXR1cm4gTGFyZ2VSYW5nZSgKICAgICAg
ICAgbGVmdC5iZWdpbigpLAogICAgICAgICBhLnNpemUoKSArIGIuc2l6ZSgpLAogICAgICAgICBs
ZWZ0LnN0YXJ0UGh5c2ljYWxTaXplKCksCi0gICAgICAgIGEudG90YWxQaHlzaWNhbFNpemUoKSAr
IGIudG90YWxQaHlzaWNhbFNpemUoKSk7CisgICAgICAgIGEudG90YWxQaHlzaWNhbFNpemUoKSAr
IGIudG90YWxQaHlzaWNhbFNpemUoKSwKKyAgICAgICAgbWVyZ2VkVXNlZFNpbmNlTGFzdFNjYXZl
bmdlKTsKIH0KIAogaW5saW5lIHN0ZDo6cGFpcjxMYXJnZVJhbmdlLCBMYXJnZVJhbmdlPiBMYXJn
ZVJhbmdlOjpzcGxpdChzaXplX3QgbGVmdFNpemUpIGNvbnN0CkluZGV4OiBTb3VyY2UvYm1hbGxv
Yy9ibWFsbG9jL1NjYXZlbmdlci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL2JtYWxsb2MvYm1h
bGxvYy9TY2F2ZW5nZXIuY3BwCShyZXZpc2lvbiAyNDMxNDIpCisrKyBTb3VyY2UvYm1hbGxvYy9i
bWFsbG9jL1NjYXZlbmdlci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTgwLDcgKzgwLDggQEAgU2Nh
dmVuZ2VyOjpTY2F2ZW5nZXIoc3RkOjpsb2NrX2d1YXJkPE11dAogICAgIGRpc3BhdGNoX3Jlc3Vt
ZShtX3ByZXNzdXJlSGFuZGxlckRpc3BhdGNoU291cmNlKTsKICAgICBkaXNwYXRjaF9yZWxlYXNl
KHF1ZXVlKTsKICNlbmRpZgotICAgIAorICAgIG1fd2FpdFRpbWUgPSBzdGQ6OmNocm9ubzo6bWls
bGlzZWNvbmRzKDEwKTsKKwogICAgIG1fdGhyZWFkID0gc3RkOjp0aHJlYWQoJnRocmVhZEVudHJ5
UG9pbnQsIHRoaXMpOwogfQogCkBAIC0xNzcsMTIgKzE3OCw2IEBAIHN0ZDo6Y2hyb25vOjptaWxs
aXNlY29uZHMgU2NhdmVuZ2VyOjp0aW0KICAgICByZXR1cm4gc3RkOjpjaHJvbm86OmR1cmF0aW9u
X2Nhc3Q8c3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcz4oc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9j
azo6bm93KCkgLSBtX2xhc3RGdWxsU2NhdmVuZ2VUaW1lKTsKIH0KIAotc3RkOjpjaHJvbm86Om1p
bGxpc2Vjb25kcyBTY2F2ZW5nZXI6OnRpbWVTaW5jZUxhc3RQYXJ0aWFsU2NhdmVuZ2UoKQotewot
ICAgIHN0ZDo6dW5pcXVlX2xvY2s8TXV0ZXg+IGxvY2sobV9tdXRleCk7Ci0gICAgcmV0dXJuIHN0
ZDo6Y2hyb25vOjpkdXJhdGlvbl9jYXN0PHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHM+KHN0ZDo6
Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpIC0gbV9sYXN0UGFydGlhbFNjYXZlbmdlVGltZSk7
Ci19Ci0KIHZvaWQgU2NhdmVuZ2VyOjplbmFibGVNaW5pTW9kZSgpCiB7CiAgICAgbV9pc0luTWlu
aU1vZGUgPSB0cnVlOyAvLyBXZSBqdXN0IHN0b3JlIHRvIHRoaXMgcmFjaWx5LiBUaGUgc2NhdmVu
Z2VyIHRocmVhZCB3aWxsIGV2ZW50dWFsbHkgcGljayB1cCB0aGUgcmlnaHQgdmFsdWUuCkBAIC0y
MDUsMTMgKzIwMCwxNyBAQCB2b2lkIFNjYXZlbmdlcjo6c2NhdmVuZ2UoKQogCiAgICAgICAgIHsK
ICAgICAgICAgICAgIFByaW50VGltZSBwcmludFRpbWUoIlxuZnVsbCBzY2F2ZW5nZSB1bmRlciBs
b2NrIHRpbWUiKTsKKyAgICAgICAgICAgIHNpemVfdCBkZWZlcnJlZERlY29tbWl0cyA9IDA7CiAg
ICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8TXV0ZXg+IGxvY2soSGVhcDo6bXV0ZXgoKSk7CiAg
ICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSBudW1IZWFwczsgaS0tOykgewogICAgICAgICAg
ICAgICAgIGlmICghaXNBY3RpdmVIZWFwS2luZChzdGF0aWNfY2FzdDxIZWFwS2luZD4oaSkpKQog
ICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICBQZXJQcm9jZXNz
PFBlckhlYXBLaW5kPEhlYXA+Pjo6Z2V0KCktPmF0KGkpLnNjYXZlbmdlKGxvY2ssIGRlY29tbWl0
dGVyKTsKKyAgICAgICAgICAgICAgICBQZXJQcm9jZXNzPFBlckhlYXBLaW5kPEhlYXA+Pjo6Z2V0
KCktPmF0KGkpLnNjYXZlbmdlKGxvY2ssIGRlY29tbWl0dGVyLCBkZWZlcnJlZERlY29tbWl0cyk7
CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBkZWNvbW1pdHRlci5wcm9jZXNzRWFnZXIoKTsK
KworICAgICAgICAgICAgaWYgKGRlZmVycmVkRGVjb21taXRzKQorICAgICAgICAgICAgICAgIG1f
c3RhdGUgPSBTdGF0ZTo6UnVuU29vbjsKICAgICAgICAgfQogCiAgICAgICAgIHsKQEAgLTI1Miw3
MyArMjUxLDYgQEAgdm9pZCBTY2F2ZW5nZXI6OnNjYXZlbmdlKCkKICAgICB9CiB9CiAKLXZvaWQg
U2NhdmVuZ2VyOjpwYXJ0aWFsU2NhdmVuZ2UoKQotewotICAgIHN0ZDo6dW5pcXVlX2xvY2s8TXV0
ZXg+IGxvY2sobV9zY2F2ZW5naW5nTXV0ZXgpOwotCi0gICAgaWYgKHZlcmJvc2UpIHsKLSAgICAg
ICAgZnByaW50ZihzdGRlcnIsICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7
Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiLS1iZWZvcmUgcGFydGlhbCBzY2F2ZW5naW5nLS1c
biIpOwotICAgICAgICBkdW1wU3RhdHMoKTsKLSAgICB9Ci0KLSAgICB7Ci0gICAgICAgIEJ1bGtE
ZWNvbW1pdCBkZWNvbW1pdHRlcjsKLSAgICAgICAgewotICAgICAgICAgICAgUHJpbnRUaW1lIHBy
aW50VGltZSgiXG5wYXJ0aWFsU2NhdmVuZ2UgdW5kZXIgbG9jayB0aW1lIik7Ci0gICAgICAgICAg
ICBzdGQ6OmxvY2tfZ3VhcmQ8TXV0ZXg+IGxvY2soSGVhcDo6bXV0ZXgoKSk7Ci0gICAgICAgICAg
ICBmb3IgKHVuc2lnbmVkIGkgPSBudW1IZWFwczsgaS0tOykgewotICAgICAgICAgICAgICAgIGlm
ICghaXNBY3RpdmVIZWFwS2luZChzdGF0aWNfY2FzdDxIZWFwS2luZD4oaSkpKQotICAgICAgICAg
ICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICBIZWFwJiBoZWFwID0gUGVyUHJv
Y2VzczxQZXJIZWFwS2luZDxIZWFwPj46OmdldCgpLT5hdChpKTsKLSAgICAgICAgICAgICAgICBz
aXplX3QgZnJlZWFibGVNZW1vcnkgPSBoZWFwLmZyZWVhYmxlTWVtb3J5KGxvY2spOwotICAgICAg
ICAgICAgICAgIGlmIChmcmVlYWJsZU1lbW9yeSA8IDQgKiBNQikKLSAgICAgICAgICAgICAgICAg
ICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgaGVhcC5zY2F2ZW5nZVRvSGlnaFdhdGVybWFy
ayhsb2NrLCBkZWNvbW1pdHRlcik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGRlY29t
bWl0dGVyLnByb2Nlc3NFYWdlcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgewotICAgICAgICAg
ICAgUHJpbnRUaW1lIHByaW50VGltZSgicGFydGlhbFNjYXZlbmdlIGxhenkgZGVjb21taXQgdGlt
ZSIpOwotICAgICAgICAgICAgZGVjb21taXR0ZXIucHJvY2Vzc0xhenkoKTsKLSAgICAgICAgfQot
Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFByaW50VGltZSBwcmludFRpbWUoInBhcnRpYWxTY2F2
ZW5nZSBtYXJrIGFsbCBhcyBlbGlnaWJsZSB0aW1lIik7Ci0gICAgICAgICAgICBzdGQ6OmxvY2tf
Z3VhcmQ8TXV0ZXg+IGxvY2soSGVhcDo6bXV0ZXgoKSk7Ci0gICAgICAgICAgICBmb3IgKHVuc2ln
bmVkIGkgPSBudW1IZWFwczsgaS0tOykgewotICAgICAgICAgICAgICAgIGlmICghaXNBY3RpdmVI
ZWFwS2luZChzdGF0aWNfY2FzdDxIZWFwS2luZD4oaSkpKQotICAgICAgICAgICAgICAgICAgICBj
b250aW51ZTsKLSAgICAgICAgICAgICAgICBIZWFwJiBoZWFwID0gUGVyUHJvY2VzczxQZXJIZWFw
S2luZDxIZWFwPj46OmdldCgpLT5hdChpKTsKLSAgICAgICAgICAgICAgICBoZWFwLm1hcmtBbGxM
YXJnZUFzRWxpZ2liaWxlKGxvY2spOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQot
Ci0gICAgewotICAgICAgICBSRUxFQVNFX0JBU1NFUlQoIW1fZGVmZXJyZWREZWNvbW1pdHMuc2l6
ZSgpKTsKLSAgICAgICAgQWxsSXNvSGVhcHM6OmdldCgpLT5mb3JFYWNoKAotICAgICAgICAgICAg
WyZdIChJc29IZWFwSW1wbEJhc2UmIGhlYXApIHsKLSAgICAgICAgICAgICAgICBoZWFwLnNjYXZl
bmdlVG9IaWdoV2F0ZXJtYXJrKG1fZGVmZXJyZWREZWNvbW1pdHMpOwotICAgICAgICAgICAgfSk7
Ci0gICAgICAgIElzb0hlYXBJbXBsQmFzZTo6ZmluaXNoU2NhdmVuZ2luZyhtX2RlZmVycmVkRGVj
b21taXRzKTsKLSAgICAgICAgbV9kZWZlcnJlZERlY29tbWl0cy5zaHJpbmsoMCk7Ci0gICAgfQot
Ci0gICAgaWYgKHZlcmJvc2UpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICItLWFmdGVyIHBh
cnRpYWwgc2NhdmVuZ2luZy0tXG4iKTsKLSAgICAgICAgZHVtcFN0YXRzKCk7Ci0gICAgICAgIGZw
cmludGYoc3RkZXJyLCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwotICAg
IH0KLQotICAgIHsKLSAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxNdXRleD4gbG9jayhtX211dGV4
KTsKLSAgICAgICAgbV9sYXN0UGFydGlhbFNjYXZlbmdlVGltZSA9IHN0ZDo6Y2hyb25vOjpzdGVh
ZHlfY2xvY2s6Om5vdygpOwotICAgIH0KLX0KLQogc2l6ZV90IFNjYXZlbmdlcjo6ZnJlZWFibGVN
ZW1vcnkoKQogewogICAgIHNpemVfdCByZXN1bHQgPSAwOwpAQCAtMzg2LDcgKzMxOCw3IEBAIHZv
aWQgU2NhdmVuZ2VyOjp0aHJlYWRSdW5Mb29wKCkKICAgICAgICAgCiAgICAgICAgIGlmIChtX3N0
YXRlID09IFN0YXRlOjpSdW5Tb29uKSB7CiAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPE11
dGV4PiBsb2NrKG1fbXV0ZXgpOwotICAgICAgICAgICAgbV9jb25kaXRpb24ud2FpdF9mb3IobG9j
aywgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyhtX2lzSW5NaW5pTW9kZSA/IDIwMCA6IDIwMDAp
LCBbJl0oKSB7IHJldHVybiBtX3N0YXRlICE9IFN0YXRlOjpSdW5Tb29uOyB9KTsKKyAgICAgICAg
ICAgIG1fY29uZGl0aW9uLndhaXRfZm9yKGxvY2ssIG1fd2FpdFRpbWUsIFsmXSgpIHsgcmV0dXJu
IG1fc3RhdGUgIT0gU3RhdGU6OlJ1blNvb247IH0pOwogICAgICAgICB9CiAgICAgICAgIAogICAg
ICAgICBtX3N0YXRlID0gU3RhdGU6OlNsZWVwOwpAQCAtNDAwLDY3ICszMzIsMzEgQEAgdm9pZCBT
Y2F2ZW5nZXI6OnRocmVhZFJ1bkxvb3AoKQogICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIt
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CiAgICAgICAgIH0KIAotICAgICAg
ICBlbnVtIGNsYXNzIFNjYXZlbmdlTW9kZSB7Ci0gICAgICAgICAgICBOb25lLAotICAgICAgICAg
ICAgUGFydGlhbCwKLSAgICAgICAgICAgIEZ1bGwKLSAgICAgICAgfTsKLQotICAgICAgICBzaXpl
X3QgZnJlZWFibGVNZW1vcnkgPSB0aGlzLT5mcmVlYWJsZU1lbW9yeSgpOwotCi0gICAgICAgIFNj
YXZlbmdlTW9kZSBzY2F2ZW5nZU1vZGUgPSBbJl0gewotICAgICAgICAgICAgYXV0byB0aW1lU2lu
Y2VMYXN0RnVsbFNjYXZlbmdlID0gdGhpcy0+dGltZVNpbmNlTGFzdEZ1bGxTY2F2ZW5nZSgpOwot
ICAgICAgICAgICAgYXV0byB0aW1lU2luY2VMYXN0UGFydGlhbFNjYXZlbmdlID0gdGhpcy0+dGlt
ZVNpbmNlTGFzdFBhcnRpYWxTY2F2ZW5nZSgpOwotICAgICAgICAgICAgYXV0byB0aW1lU2luY2VM
YXN0U2NhdmVuZ2UgPSBzdGQ6Om1pbih0aW1lU2luY2VMYXN0UGFydGlhbFNjYXZlbmdlLCB0aW1l
U2luY2VMYXN0RnVsbFNjYXZlbmdlKTsKLQotICAgICAgICAgICAgaWYgKGlzVW5kZXJNZW1vcnlQ
cmVzc3VyZSgpICYmIGZyZWVhYmxlTWVtb3J5ID4gMSAqIE1CICYmIHRpbWVTaW5jZUxhc3RTY2F2
ZW5nZSA+IHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoNSkpCi0gICAgICAgICAgICAgICAgcmV0
dXJuIFNjYXZlbmdlTW9kZTo6RnVsbDsKLQotICAgICAgICAgICAgaWYgKCFtX2lzUHJvYmFibHlH
cm93aW5nKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHRpbWVTaW5jZUxhc3RGdWxsU2NhdmVuZ2Ug
PCBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDEwMDApICYmICFtX2lzSW5NaW5pTW9kZSkKLSAg
ICAgICAgICAgICAgICAgICAgcmV0dXJuIFNjYXZlbmdlTW9kZTo6UGFydGlhbDsKLSAgICAgICAg
ICAgICAgICByZXR1cm4gU2NhdmVuZ2VNb2RlOjpGdWxsOwotICAgICAgICAgICAgfQorICAgICAg
ICBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjp0aW1lX3BvaW50IHN0YXJ0IHsgc3RkOjpjaHJv
bm86OnN0ZWFkeV9jbG9jazo6bm93KCkgfTsKKyAgICAgICAgCisgICAgICAgIHNjYXZlbmdlKCk7
CiAKLSAgICAgICAgICAgIGlmIChtX2lzSW5NaW5pTW9kZSkgewotICAgICAgICAgICAgICAgIGlm
ICh0aW1lU2luY2VMYXN0RnVsbFNjYXZlbmdlIDwgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygy
MDApKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gU2NhdmVuZ2VNb2RlOjpQYXJ0aWFsOwot
ICAgICAgICAgICAgICAgIHJldHVybiBTY2F2ZW5nZU1vZGU6OkZ1bGw7Ci0gICAgICAgICAgICB9
CisgICAgICAgIGF1dG8gdGltZVNwZW50U2NhdmVuZ2luZyA9IHN0ZDo6Y2hyb25vOjpzdGVhZHlf
Y2xvY2s6Om5vdygpIC0gc3RhcnQ7CiAKLSNpZiBCQ1BVKFg4Nl82NCkKLSAgICAgICAgICAgIGF1
dG8gcGFydGlhbFNjYXZlbmdlSW50ZXJ2YWwgPSBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDEy
MDAwKTsKLSNlbHNlCi0gICAgICAgICAgICBhdXRvIHBhcnRpYWxTY2F2ZW5nZUludGVydmFsID0g
c3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyg4MDAwKTsKLSNlbmRpZgotICAgICAgICAgICAgaWYg
KHRpbWVTaW5jZUxhc3RTY2F2ZW5nZSA8IHBhcnRpYWxTY2F2ZW5nZUludGVydmFsKSB7Ci0gICAg
ICAgICAgICAgICAgLy8gUmF0ZSBsaW1pdCBwYXJ0aWFsIHNjYXZlbmdlcy4KLSAgICAgICAgICAg
ICAgICByZXR1cm4gU2NhdmVuZ2VNb2RlOjpOb25lOwotICAgICAgICAgICAgfQotICAgICAgICAg
ICAgaWYgKGZyZWVhYmxlTWVtb3J5IDwgMjUgKiBNQikKLSAgICAgICAgICAgICAgICByZXR1cm4g
U2NhdmVuZ2VNb2RlOjpOb25lOwotICAgICAgICAgICAgaWYgKDUgKiBmcmVlYWJsZU1lbW9yeSA8
IGZvb3RwcmludCgpKQotICAgICAgICAgICAgICAgIHJldHVybiBTY2F2ZW5nZU1vZGU6Ok5vbmU7
Ci0gICAgICAgICAgICByZXR1cm4gU2NhdmVuZ2VNb2RlOjpQYXJ0aWFsOwotICAgICAgICB9KCk7
Ci0KLSAgICAgICAgbV9pc1Byb2JhYmx5R3Jvd2luZyA9IGZhbHNlOwotCi0gICAgICAgIHN3aXRj
aCAoc2NhdmVuZ2VNb2RlKSB7Ci0gICAgICAgIGNhc2UgU2NhdmVuZ2VNb2RlOjpOb25lOiB7Ci0g
ICAgICAgICAgICBydW5Tb29uKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAg
ICAgICBjYXNlIFNjYXZlbmdlTW9kZTo6UGFydGlhbDogewotICAgICAgICAgICAgcGFydGlhbFNj
YXZlbmdlKCk7Ci0gICAgICAgICAgICBydW5Tb29uKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAg
ICAgICAgfQotICAgICAgICBjYXNlIFNjYXZlbmdlTW9kZTo6RnVsbDogewotICAgICAgICAgICAg
c2NhdmVuZ2UoKTsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAodmVyYm9zZSkgewor
ICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJ0aW1lIHNwZW50IHNjYXZlbmdpbmcgJWxmbXNc
biIsCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8ZG91YmxlPihzdGQ6OmNocm9ubzo6ZHVy
YXRpb25fY2FzdDxzdGQ6OmNocm9ubzo6bWljcm9zZWNvbmRzPih0aW1lU3BlbnRTY2F2ZW5naW5n
KS5jb3VudCgpKSAvIDEwMDApOwogICAgICAgICB9CisKKyAgICAgICAgc3RkOjpjaHJvbm86Om1p
bGxpc2Vjb25kcyBuZXdXYWl0VGltZTsKKworICAgICAgICBpZiAobV9pc0luTWluaU1vZGUpIHsK
KyAgICAgICAgICAgIHRpbWVTcGVudFNjYXZlbmdpbmcgKj0gNTA7CisgICAgICAgICAgICBuZXdX
YWl0VGltZSA9IHN0ZDo6Y2hyb25vOjpkdXJhdGlvbl9jYXN0PHN0ZDo6Y2hyb25vOjptaWxsaXNl
Y29uZHM+KHRpbWVTcGVudFNjYXZlbmdpbmcpOworICAgICAgICAgICAgbmV3V2FpdFRpbWUgPSBz
dGQ6Om1pbihzdGQ6Om1heChuZXdXYWl0VGltZSwgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygy
NSkpLCBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDUwMCkpOworICAgICAgICB9IGVsc2Ugewor
ICAgICAgICAgICAgdGltZVNwZW50U2NhdmVuZ2luZyAqPSAxNTA7CisgICAgICAgICAgICBuZXdX
YWl0VGltZSA9IHN0ZDo6Y2hyb25vOjpkdXJhdGlvbl9jYXN0PHN0ZDo6Y2hyb25vOjptaWxsaXNl
Y29uZHM+KHRpbWVTcGVudFNjYXZlbmdpbmcpOworICAgICAgICAgICAgbV93YWl0VGltZSA9IHN0
ZDo6bWluKHN0ZDo6bWF4KG5ld1dhaXRUaW1lLCBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDEw
MCkpLCBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDEwMDAwKSk7CiAgICAgICAgIH0KKworICAg
ICAgICBpZiAodmVyYm9zZSkKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAibmV3IHdhaXQg
dGltZSAlbGxkbXNcbiIsIG1fd2FpdFRpbWUuY291bnQoKSk7CiAgICAgfQogfQogCkluZGV4OiBT
b3VyY2UvYm1hbGxvYy9ibWFsbG9jL1NjYXZlbmdlci5oCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9i
bWFsbG9jL2JtYWxsb2MvU2NhdmVuZ2VyLmgJKHJldmlzaW9uIDI0MzE0MikKKysrIFNvdXJjZS9i
bWFsbG9jL2JtYWxsb2MvU2NhdmVuZ2VyLmgJKHdvcmtpbmcgY29weSkKQEAgLTg5LDExICs4OSwx
MCBAQCBwcml2YXRlOgogICAgIHZvaWQgc2V0VGhyZWFkTmFtZShjb25zdCBjaGFyKik7CiAKICAg
ICBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzIHRpbWVTaW5jZUxhc3RGdWxsU2NhdmVuZ2UoKTsK
LSAgICBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzIHRpbWVTaW5jZUxhc3RQYXJ0aWFsU2NhdmVu
Z2UoKTsKLSAgICB2b2lkIHBhcnRpYWxTY2F2ZW5nZSgpOwogCiAgICAgc3RkOjphdG9taWM8U3Rh
dGU+IG1fc3RhdGUgeyBTdGF0ZTo6U2xlZXAgfTsKICAgICBzaXplX3QgbV9zY2F2ZW5nZXJCeXRl
cyB7IDAgfTsKKyAgICBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzIG1fd2FpdFRpbWU7CiAgICAg
Ym9vbCBtX2lzUHJvYmFibHlHcm93aW5nIHsgZmFsc2UgfTsKICAgICBib29sIG1faXNJbk1pbmlN
b2RlIHsgZmFsc2UgfTsKICAgICAKQEAgLTEwMyw3ICsxMDIsNiBAQCBwcml2YXRlOgogCiAgICAg
c3RkOjp0aHJlYWQgbV90aHJlYWQ7CiAgICAgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6dGlt
ZV9wb2ludCBtX2xhc3RGdWxsU2NhdmVuZ2VUaW1lIHsgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9j
azo6bm93KCkgfTsKLSAgICBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjp0aW1lX3BvaW50IG1f
bGFzdFBhcnRpYWxTY2F2ZW5nZVRpbWUgeyBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3co
KSB9OwogICAgIAogI2lmIEJPUyhEQVJXSU4pCiAgICAgZGlzcGF0Y2hfc291cmNlX3QgbV9wcmVz
c3VyZUhhbmRsZXJEaXNwYXRjaFNvdXJjZTsKSW5kZXg6IFNvdXJjZS9ibWFsbG9jL2JtYWxsb2Mv
U21hbGxQYWdlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL2JtYWxsb2MvYm1hbGxvYy9TbWFsbFBh
Z2UuaAkocmV2aXNpb24gMjQzMTQyKQorKysgU291cmNlL2JtYWxsb2MvYm1hbGxvYy9TbWFsbFBh
Z2UuaAkod29ya2luZyBjb3B5KQpAQCAtNTEsNiArNTEsMTAgQEAgcHVibGljOgogICAgIGJvb2wg
aGFzUGh5c2ljYWxQYWdlcygpIHsgcmV0dXJuIG1faGFzUGh5c2ljYWxQYWdlczsgfQogICAgIHZv
aWQgc2V0SGFzUGh5c2ljYWxQYWdlcyhib29sIGhhc1BoeXNpY2FsUGFnZXMpIHsgbV9oYXNQaHlz
aWNhbFBhZ2VzID0gaGFzUGh5c2ljYWxQYWdlczsgfQogICAgIAorICAgIGJvb2wgdXNlZFNpbmNl
TGFzdFNjYXZlbmdlKCkgeyByZXR1cm4gbV91c2VkU2luY2VMYXN0U2NhdmVuZ2U7IH0KKyAgICB2
b2lkIGNsZWFyVXNlZFNpbmNlTGFzdFNjYXZlbmdlKCkgeyBtX3VzZWRTaW5jZUxhc3RTY2F2ZW5n
ZSA9IGZhbHNlOyB9CisgICAgdm9pZCBzZXRVc2VkU2luY2VMYXN0U2NhdmVuZ2UoKSB7IG1fdXNl
ZFNpbmNlTGFzdFNjYXZlbmdlID0gdHJ1ZTsgfQorCiAgICAgU21hbGxMaW5lKiBiZWdpbigpOwog
CiAgICAgdW5zaWduZWQgY2hhciBzbGlkZSgpIGNvbnN0IHsgcmV0dXJuIG1fc2xpZGU7IH0KQEAg
LTU5LDYgKzYzLDcgQEAgcHVibGljOgogcHJpdmF0ZToKICAgICB1bnNpZ25lZCBjaGFyIG1faGFz
RnJlZUxpbmVzOiAxOwogICAgIHVuc2lnbmVkIGNoYXIgbV9oYXNQaHlzaWNhbFBhZ2VzOiAxOwor
ICAgIHVuc2lnbmVkIGNoYXIgbV91c2VkU2luY2VMYXN0U2NhdmVuZ2U6IDE7CiAgICAgdW5zaWdu
ZWQgY2hhciBtX3JlZkNvdW50OiA3OwogICAgIHVuc2lnbmVkIGNoYXIgbV9zaXplQ2xhc3M7CiAg
ICAgdW5zaWduZWQgY2hhciBtX3NsaWRlOwo=
</data>

          </attachment>
      

    </bug>

</bugzilla>