<?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>236279</bug_id>
          
          <creation_ts>2022-02-07 19:42:47 -0800</creation_ts>
          <short_desc>AudioBuffer should take a lock while visiting m_channelWrappers</short_desc>
          <delta_ts>2022-02-09 13:34:00 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Web Audio</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          <see_also>https://bugs.webkit.org/show_bug.cgi?id=236277</see_also>
    
    <see_also>https://bugs.webkit.org/show_bug.cgi?id=236353</see_also>
          <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="Yusuke Suzuki">ysuzuki</reporter>
          <assigned_to name="Yusuke Suzuki">ysuzuki</assigned_to>
          <cc>cdumez</cc>
    
    <cc>darin</cc>
    
    <cc>eric.carlson</cc>
    
    <cc>esprehn+autocc</cc>
    
    <cc>ews-watchlist</cc>
    
    <cc>glenn</cc>
    
    <cc>jer.noble</cc>
    
    <cc>kangil.han</cc>
    
    <cc>keith_miller</cc>
    
    <cc>philipj</cc>
    
    <cc>sergio</cc>
    
    <cc>webkit-bug-importer</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1838496</commentid>
    <comment_count>0</comment_count>
    <who name="Yusuke Suzuki">ysuzuki</who>
    <bug_when>2022-02-07 19:42:47 -0800</bug_when>
    <thetext>Since the vector is cleared in releaseMemory.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1839054</commentid>
    <comment_count>1</comment_count>
      <attachid>451347</attachid>
    <who name="Yusuke Suzuki">ysuzuki</who>
    <bug_when>2022-02-09 01:31:10 -0800</bug_when>
    <thetext>Created attachment 451347
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1839124</commentid>
    <comment_count>2</comment_count>
      <attachid>451347</attachid>
    <who name="Keith Miller">keith_miller</who>
    <bug_when>2022-02-09 07:02:22 -0800</bug_when>
    <thetext>Comment on attachment 451347
Patch

r=me.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1839137</commentid>
    <comment_count>3</comment_count>
      <attachid>451347</attachid>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2022-02-09 07:26:42 -0800</bug_when>
    <thetext>Comment on attachment 451347
Patch

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

&gt; Source/WebCore/Modules/webaudio/AudioBuffer.cpp:95
&gt; +    channels.reserveCapacity(numberOfChannels);

should be reserveInitialCapacity()

&gt; Source/WebCore/Modules/webaudio/AudioBuffer.cpp:107
&gt; +        channels.append(WTFMove(channelDataArray));

could use uncheckedAppend() since you reserve capacity.

&gt; Source/WebCore/Modules/webaudio/AudioBuffer.cpp:126
&gt; +    channels.reserveCapacity(numberOfChannels);

ditto.

&gt; Source/WebCore/Modules/webaudio/AudioBuffer.cpp:135
&gt; +        channels.append(WTFMove(channelDataArray));

ditto.

&gt; Source/WebCore/Modules/webaudio/AudioBuffer.h:102
&gt; +    FixedVector&lt;RefPtr&lt;Float32Array&gt;&gt; m_channels;

Would be nice to use WTF_GUARDED_BY_LOCK(m_channelsLock);

&gt; Source/WebCore/Modules/webaudio/AudioBuffer.h:103
&gt; +    FixedVector&lt;JSValueInWrappedObject&gt; m_channelWrappers;

ditto.

&gt; Source/WebCore/dom/MessageEvent.h:104
&gt; +    mutable Lock m_concurrentDataAccessLock;

Can we use clang thread safety annotations?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1839190</commentid>
    <comment_count>4</comment_count>
      <attachid>451347</attachid>
    <who name="Yusuke Suzuki">ysuzuki</who>
    <bug_when>2022-02-09 08:56:19 -0800</bug_when>
    <thetext>Comment on attachment 451347
Patch

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

&gt;&gt; Source/WebCore/Modules/webaudio/AudioBuffer.cpp:95
&gt;&gt; +    channels.reserveCapacity(numberOfChannels);
&gt; 
&gt; should be reserveInitialCapacity()

Fixed.

&gt;&gt; Source/WebCore/Modules/webaudio/AudioBuffer.cpp:107
&gt;&gt; +        channels.append(WTFMove(channelDataArray));
&gt; 
&gt; could use uncheckedAppend() since you reserve capacity.

Fixed.

&gt;&gt; Source/WebCore/Modules/webaudio/AudioBuffer.cpp:126
&gt;&gt; +    channels.reserveCapacity(numberOfChannels);
&gt; 
&gt; ditto.

Fixed.

&gt;&gt; Source/WebCore/Modules/webaudio/AudioBuffer.cpp:135
&gt;&gt; +        channels.append(WTFMove(channelDataArray));
&gt; 
&gt; ditto.

Fixed.

&gt;&gt; Source/WebCore/Modules/webaudio/AudioBuffer.h:102
&gt;&gt; +    FixedVector&lt;RefPtr&lt;Float32Array&gt;&gt; m_channels;
&gt; 
&gt; Would be nice to use WTF_GUARDED_BY_LOCK(m_channelsLock);

Probably, TSan does not work well here since,
1. We are not taking a lock in the main thread read since we know that any other threads except the main thread will not change it.
2. But we take a lock when reading it from concurrent threads since it can be modified from the main thread.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1839200</commentid>
    <comment_count>5</comment_count>
    <who name="Yusuke Suzuki">ysuzuki</who>
    <bug_when>2022-02-09 09:06:27 -0800</bug_when>
    <thetext>Committed r289476 (247019@trunk): &lt;https://commits.webkit.org/247019@trunk&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1839201</commentid>
    <comment_count>6</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2022-02-09 09:07:17 -0800</bug_when>
    <thetext>&lt;rdar://problem/88693354&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1839202</commentid>
    <comment_count>7</comment_count>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2022-02-09 09:08:36 -0800</bug_when>
    <thetext>(In reply to Yusuke Suzuki from comment #4)
&gt; Comment on attachment 451347 [details]
&gt; Patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=451347&amp;action=review
&gt; 
&gt; &gt;&gt; Source/WebCore/Modules/webaudio/AudioBuffer.cpp:95
&gt; &gt;&gt; +    channels.reserveCapacity(numberOfChannels);
&gt; &gt; 
&gt; &gt; should be reserveInitialCapacity()
&gt; 
&gt; Fixed.
&gt; 
&gt; &gt;&gt; Source/WebCore/Modules/webaudio/AudioBuffer.cpp:107
&gt; &gt;&gt; +        channels.append(WTFMove(channelDataArray));
&gt; &gt; 
&gt; &gt; could use uncheckedAppend() since you reserve capacity.
&gt; 
&gt; Fixed.
&gt; 
&gt; &gt;&gt; Source/WebCore/Modules/webaudio/AudioBuffer.cpp:126
&gt; &gt;&gt; +    channels.reserveCapacity(numberOfChannels);
&gt; &gt; 
&gt; &gt; ditto.
&gt; 
&gt; Fixed.
&gt; 
&gt; &gt;&gt; Source/WebCore/Modules/webaudio/AudioBuffer.cpp:135
&gt; &gt;&gt; +        channels.append(WTFMove(channelDataArray));
&gt; &gt; 
&gt; &gt; ditto.
&gt; 
&gt; Fixed.
&gt; 
&gt; &gt;&gt; Source/WebCore/Modules/webaudio/AudioBuffer.h:102
&gt; &gt;&gt; +    FixedVector&lt;RefPtr&lt;Float32Array&gt;&gt; m_channels;
&gt; &gt; 
&gt; &gt; Would be nice to use WTF_GUARDED_BY_LOCK(m_channelsLock);
&gt; 
&gt; Probably, TSan does not work well here since,
&gt; 1. We are not taking a lock in the main thread read since we know that any
&gt; other threads except the main thread will not change it.
&gt; 2. But we take a lock when reading it from concurrent threads since it can
&gt; be modified from the main thread.

For what it&apos;s worth, this is an example of case where I would use annotations but add WTF_IGNORES_THREAD_SAFETY_ANALYSIS on the functions that fail to lock (with a comment explaining WHY this is ok/safe). I worked hard on adopting annotations in existing code, we should use them in new code too.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1839387</commentid>
    <comment_count>8</comment_count>
      <attachid>451347</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2022-02-09 13:34:00 -0800</bug_when>
    <thetext>Comment on attachment 451347
Patch

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

&gt; Source/WebCore/bindings/js/JSValueInWrappedObject.h:41
&gt; +    WTF_MAKE_NONMOVABLE(JSValueInWrappedObject);

This does nothing. WTF_MAKE_NONCOPYABLE already makes things non-movable. There should not be a second macro.

&gt; Source/WebCore/bindings/js/JSValueInWrappedObject.h:-45
&gt; -    // FIXME: Remove them once AudioBuffer&apos;s m_channelWrappers bug is fixed.
&gt; -    // https://bugs.webkit.org/show_bug.cgi?id=236279
&gt; -    JSValueInWrappedObject(JSValueInWrappedObject&amp;&amp;) = default;
&gt; -    JSValueInWrappedObject&amp; operator=(JSValueInWrappedObject&amp;&amp;) = default;

Removing this is sufficient to make the thing non-movable.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>451347</attachid>
            <date>2022-02-09 01:31:10 -0800</date>
            <delta_ts>2022-02-09 07:02:22 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-236279-20220209013110.patch</filename>
            <type>text/plain</type>
            <size>16857</size>
            <attacher name="Yusuke Suzuki">ysuzuki</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjg5NDYyCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggNTlkODg5ZjcyNGQ3YmM2
NjdlODkxOWFiZTBmZmZkY2Q5NzZlYzNmZC4uMmM3MTg0ZjViNDAxNzYyNzU3MDUwMWI1NWVmOGVh
ZDA1ZDM5Y2Y5OCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDQ2IEBACisyMDIyLTAyLTA5ICBZdXN1
a2UgU3V6dWtpICA8eXN1enVraUBhcHBsZS5jb20+CisKKyAgICAgICAgQXVkaW9CdWZmZXIgc2hv
dWxkIHRha2UgYSBsb2NrIHdoaWxlIHZpc2l0aW5nIG1fY2hhbm5lbFdyYXBwZXJzCisgICAgICAg
IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yMzYyNzkKKworICAgICAg
ICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBUaGlzIHBhdGNoIGZpeGVz
IEF1ZGlvQnVmZmVyJ3MgbV9jaGFubmVsV3JhcHBlcnMgY29uY3VycmVuY3kgYnVnIGFuZCByZWxh
dGVkIGlzc3Vlcy4KKworICAgICAgICAxLiBUaGlzIHBhdGNoIHJlbW92ZXMgcHJvYmxlbWF0aWMg
KGFuZCBhbG1vc3QgYWx3YXlzIHdyb25nKSBtb3ZlIG9wZXJhdG9yIG9mIEpTVmFsdWVJbldyYXBw
ZWRPYmplY3QuCisgICAgICAgICAgIFRvIGRvIHRoYXQsIHdlIGZpeGVkIEF1ZGlvQnVmZmVyJ3Mg
Y29uY3VycmVuY3kgaXNzdWUgd2hlcmUgd2UgYWNjZXNzIG1fY2hhbm5lbFdyYXBwZXJzIHdoaWxl
IGl0CisgICAgICAgICAgIGNhbiBiZSBjbGVhcmVkIGNvbmN1cnJlbnRseSBpbiBBdWRpb0J1ZmZl
cjo6cmVsZWFzZU1lbW9yeS4KKyAgICAgICAgMi4gTWVzc2FnZUV2ZW50J3MgbV9kYXRhIGFjY2Vz
cyBpcyBicm9rZW4gd2l0aCBjb25jdXJyZW50IEdDIHRocmVhZC4gV2UgbXVzdCB0YWtlIGEgbG9j
ay4gQW5kIHdlIG11c3QKKyAgICAgICAgICAgbm90IHVzZSBKU1ZhbHVlSW5XcmFwcGVkT2JqZWN0
IGluIHN0ZDo6dmFyaWFudCBpZiBpdCBjYW4gYmUgY2hhbmdlZCBhZnRlciBjb25zdHJ1Y3RvciBp
bnZvY2F0aW9uLgorICAgICAgICAzLiBVc2UgSlNWYWx1ZUluV3JhcHBlZE9iamVjdDo6Y2xlYXIg
aW5zdGVhZCBvZiBtb3ZlIHdpdGggZW1wdHkgdmFsdWUuCisgICAgICAgIDQuIEZpbGUgaHR0cHM6
Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTIzNjM1My4gQWJvcnRTaWduYWwsIE1l
c3NhZ2VFdmVudCwgYW5kIEN1c3RvbUV2ZW50IG1pc3MKKyAgICAgICAgICAgd3JpdGUtYmFycmll
ciwgd2hpY2ggaXMgc2VtYW50aWNhbGx5IHdyb25nLgorCisgICAgICAgICogTW9kdWxlcy93ZWJh
dWRpby9BdWRpb0J1ZmZlci5jcHA6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb0J1ZmZlcjo6QXVk
aW9CdWZmZXIpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9CdWZmZXI6OnJlbGVhc2VNZW1vcnkp
OgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9CdWZmZXI6OnZpc2l0Q2hhbm5lbFdyYXBwZXJzKToK
KyAgICAgICAgKiBNb2R1bGVzL3dlYmF1ZGlvL0F1ZGlvQnVmZmVyLmg6CisgICAgICAgICogTW9k
dWxlcy93ZWJhdWRpby9BdWRpb1dvcmtsZXRQcm9jZXNzb3IuY3BwOgorICAgICAgICAoV2ViQ29y
ZTo6QXVkaW9Xb3JrbGV0UHJvY2Vzc29yOjpidWlsZEpTQXJndW1lbnRzKToKKyAgICAgICAgKiBi
aW5kaW5ncy9qcy9KU01lc3NhZ2VFdmVudEN1c3RvbS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpK
U01lc3NhZ2VFdmVudDo6ZGF0YSBjb25zdCk6CisgICAgICAgIChXZWJDb3JlOjpKU01lc3NhZ2VF
dmVudDo6dmlzaXRBZGRpdGlvbmFsQ2hpbGRyZW4pOgorICAgICAgICAqIGJpbmRpbmdzL2pzL0pT
VmFsdWVJbldyYXBwZWRPYmplY3QuaDoKKyAgICAgICAgKiBkb20vQWJvcnRTaWduYWwuY3BwOgor
ICAgICAgICAoV2ViQ29yZTo6QWJvcnRTaWduYWw6OnNpZ25hbEFib3J0KToKKyAgICAgICAgKiBk
b20vQ3VzdG9tRXZlbnQuY3BwOgorICAgICAgICAoV2ViQ29yZTo6Q3VzdG9tRXZlbnQ6OmluaXRD
dXN0b21FdmVudCk6CisgICAgICAgICogZG9tL01lc3NhZ2VFdmVudC5jcHA6CisgICAgICAgIChX
ZWJDb3JlOjpNZXNzYWdlRXZlbnQ6Ok1lc3NhZ2VFdmVudCk6CisgICAgICAgIChXZWJDb3JlOjpt
X2pzRGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpNZXNzYWdlRXZlbnQ6OmluaXRNZXNzYWdlRXZl
bnQpOgorICAgICAgICAoV2ViQ29yZTo6TWVzc2FnZUV2ZW50OjptZW1vcnlDb3N0IGNvbnN0KToK
KyAgICAgICAgKFdlYkNvcmU6Om1fcG9ydHMpOiBEZWxldGVkLgorICAgICAgICAqIGRvbS9NZXNz
YWdlRXZlbnQuaDoKKyAgICAgICAgKiBwYWdlL0hpc3RvcnkuY3BwOgorICAgICAgICAoV2ViQ29y
ZTo6SGlzdG9yeTo6c3RhdGVPYmplY3RBZGRlZCk6CisKIDIwMjItMDItMDkgIFNhYW0gQmFyYXRp
ICA8c2JhcmF0aUBhcHBsZS5jb20+CiAKICAgICAgICAgRG9uJ3QgcmV0dXJuIGFuIGVtcHR5IHZh
bHVlIGZyb20gQWJvcnRDb250cm9sbGVyLnNpZ25hbC5yZWFzb24gYW5kIG1ha2UgaXQgaGFyZGVy
IHRvIHJldHVybiBlbXB0eSB2YWx1ZXMgZnJvbSBKU1ZhbHVlSW5XcmFwcGVkT2JqZWN0CmRpZmYg
LS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL3dlYmF1ZGlvL0F1ZGlvQnVmZmVyLmNwcCBi
L1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvd2ViYXVkaW8vQXVkaW9CdWZmZXIuY3BwCmluZGV4IGY1
MzUwMWJkODY2NzA3OWUzYzZlNjgzZmEwMDI5MzBhYjkzNmNiMTQuLmQ5ZmMzYTY4M2YzMTRiM2Qy
OWU2NGRiZmZkYTFkNmExMTlkNDNjZDcgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL01vZHVs
ZXMvd2ViYXVkaW8vQXVkaW9CdWZmZXIuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMv
d2ViYXVkaW8vQXVkaW9CdWZmZXIuY3BwCkBAIC05MSw3ICs5MSw4IEBAIEF1ZGlvQnVmZmVyOjpB
dWRpb0J1ZmZlcih1bnNpZ25lZCBudW1iZXJPZkNoYW5uZWxzLCBzaXplX3QgbGVuZ3RoLCBmbG9h
dCBzYW1wbGVSCiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBtX2NoYW5uZWxzLnJlc2Vy
dmVDYXBhY2l0eShudW1iZXJPZkNoYW5uZWxzKTsKKyAgICBWZWN0b3I8UmVmUHRyPEZsb2F0MzJB
cnJheT4+IGNoYW5uZWxzOworICAgIGNoYW5uZWxzLnJlc2VydmVDYXBhY2l0eShudW1iZXJPZkNo
YW5uZWxzKTsKIAogICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBudW1iZXJPZkNoYW5uZWxz
OyArK2kpIHsKICAgICAgICAgYXV0byBjaGFubmVsRGF0YUFycmF5ID0gRmxvYXQzMkFycmF5Ojp0
cnlDcmVhdGUobV9vcmlnaW5hbExlbmd0aCk7CkBAIC0xMDMsOSArMTA0LDExIEBAIEF1ZGlvQnVm
ZmVyOjpBdWRpb0J1ZmZlcih1bnNpZ25lZCBudW1iZXJPZkNoYW5uZWxzLCBzaXplX3QgbGVuZ3Ro
LCBmbG9hdCBzYW1wbGVSCiAgICAgICAgIGlmIChwcmV2ZW50RGV0YWNoaW5nID09IExlZ2FjeVBy
ZXZlbnREZXRhY2hpbmc6OlllcykKICAgICAgICAgICAgIGNoYW5uZWxEYXRhQXJyYXktPnNldERl
dGFjaGFibGUoZmFsc2UpOwogCi0gICAgICAgIG1fY2hhbm5lbHMuYXBwZW5kKFdURk1vdmUoY2hh
bm5lbERhdGFBcnJheSkpOworICAgICAgICBjaGFubmVscy5hcHBlbmQoV1RGTW92ZShjaGFubmVs
RGF0YUFycmF5KSk7CiAgICAgfQotICAgIG1fY2hhbm5lbFdyYXBwZXJzLnJlc2l6ZShtX2NoYW5u
ZWxzLnNpemUoKSk7CisKKyAgICBtX2NoYW5uZWxzID0gV1RGTW92ZShjaGFubmVscyk7CisgICAg
bV9jaGFubmVsV3JhcHBlcnMgPSBGaXhlZFZlY3RvcjxKU1ZhbHVlSW5XcmFwcGVkT2JqZWN0PiB7
IG1fY2hhbm5lbHMuc2l6ZSgpIH07CiB9CiAKIEF1ZGlvQnVmZmVyOjpBdWRpb0J1ZmZlcihBdWRp
b0J1cyYgYnVzKQpAQCAtMTE5LDcgKzEyMiw4IEBAIEF1ZGlvQnVmZmVyOjpBdWRpb0J1ZmZlcihB
dWRpb0J1cyYgYnVzKQogCiAgICAgLy8gQ29weSBhdWRpbyBkYXRhIGZyb20gdGhlIGJ1cyB0byB0
aGUgRmxvYXQzMkFycmF5cyB3ZSBtYW5hZ2UuCiAgICAgdW5zaWduZWQgbnVtYmVyT2ZDaGFubmVs
cyA9IGJ1cy5udW1iZXJPZkNoYW5uZWxzKCk7Ci0gICAgbV9jaGFubmVscy5yZXNlcnZlQ2FwYWNp
dHkobnVtYmVyT2ZDaGFubmVscyk7CisgICAgVmVjdG9yPFJlZlB0cjxGbG9hdDMyQXJyYXk+PiBj
aGFubmVsczsKKyAgICBjaGFubmVscy5yZXNlcnZlQ2FwYWNpdHkobnVtYmVyT2ZDaGFubmVscyk7
CiAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG51bWJlck9mQ2hhbm5lbHM7ICsraSkgewog
ICAgICAgICBhdXRvIGNoYW5uZWxEYXRhQXJyYXkgPSBGbG9hdDMyQXJyYXk6OnRyeUNyZWF0ZSht
X29yaWdpbmFsTGVuZ3RoKTsKICAgICAgICAgaWYgKCFjaGFubmVsRGF0YUFycmF5KSB7CkBAIC0x
MjgsOSArMTMyLDExIEBAIEF1ZGlvQnVmZmVyOjpBdWRpb0J1ZmZlcihBdWRpb0J1cyYgYnVzKQog
ICAgICAgICB9CiAKICAgICAgICAgY2hhbm5lbERhdGFBcnJheS0+c2V0UmFuZ2UoYnVzLmNoYW5u
ZWwoaSktPmRhdGEoKSwgbV9vcmlnaW5hbExlbmd0aCwgMCk7Ci0gICAgICAgIG1fY2hhbm5lbHMu
YXBwZW5kKFdURk1vdmUoY2hhbm5lbERhdGFBcnJheSkpOworICAgICAgICBjaGFubmVscy5hcHBl
bmQoV1RGTW92ZShjaGFubmVsRGF0YUFycmF5KSk7CiAgICAgfQotICAgIG1fY2hhbm5lbFdyYXBw
ZXJzLnJlc2l6ZShtX2NoYW5uZWxzLnNpemUoKSk7CisKKyAgICBtX2NoYW5uZWxzID0gV1RGTW92
ZShjaGFubmVscyk7CisgICAgbV9jaGFubmVsV3JhcHBlcnMgPSBGaXhlZFZlY3RvcjxKU1ZhbHVl
SW5XcmFwcGVkT2JqZWN0PiB7IG1fY2hhbm5lbHMuc2l6ZSgpIH07CiB9CiAKIHZvaWQgQXVkaW9C
dWZmZXI6OmludmFsaWRhdGUoKQpAQCAtMTQyLDggKzE0OCw4IEBAIHZvaWQgQXVkaW9CdWZmZXI6
OmludmFsaWRhdGUoKQogdm9pZCBBdWRpb0J1ZmZlcjo6cmVsZWFzZU1lbW9yeSgpCiB7CiAgICAg
TG9ja2VyIGxvY2tlciB7IG1fY2hhbm5lbHNMb2NrIH07Ci0gICAgbV9jaGFubmVscy5jbGVhcigp
OwotICAgIG1fY2hhbm5lbFdyYXBwZXJzLmNsZWFyKCk7CisgICAgbV9jaGFubmVscyA9IHsgfTsK
KyAgICBtX2NoYW5uZWxXcmFwcGVycyA9IHsgfTsKIH0KIAogRXhjZXB0aW9uT3I8SlNDOjpKU1Zh
bHVlPiBBdWRpb0J1ZmZlcjo6Z2V0Q2hhbm5lbERhdGEoSlNET01HbG9iYWxPYmplY3QmIGdsb2Jh
bE9iamVjdCwgdW5zaWduZWQgY2hhbm5lbEluZGV4KQpAQCAtMTY4LDggKzE3NCw3IEBAIEV4Y2Vw
dGlvbk9yPEpTQzo6SlNWYWx1ZT4gQXVkaW9CdWZmZXI6OmdldENoYW5uZWxEYXRhKEpTRE9NR2xv
YmFsT2JqZWN0JiBnbG9iYWxPCiB0ZW1wbGF0ZTx0eXBlbmFtZSBWaXNpdG9yPgogdm9pZCBBdWRp
b0J1ZmZlcjo6dmlzaXRDaGFubmVsV3JhcHBlcnMoVmlzaXRvciYgdmlzaXRvcikKIHsKLSAgICAv
LyBGSVhNRTogQXVkaW9CdWZmZXI6OnJlbGVhc2VNZW1vcnkgY2FuIGNsZWFyIHRoaXMgYnVmZmVy
IHdoaWxlIHZpc2l0aW5nIGl0IGZyb20gY29uY3VycmVudCBHQyB0aHJlYWQuCi0gICAgLy8gaHR0
cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTIzNjI3OQorICAgIExvY2tlciBs
b2NrZXIgeyBtX2NoYW5uZWxzTG9jayB9OwogICAgIGZvciAoYXV0byYgY2hhbm5lbFdyYXBwZXIg
OiBtX2NoYW5uZWxXcmFwcGVycykKICAgICAgICAgY2hhbm5lbFdyYXBwZXIudmlzaXQodmlzaXRv
cik7CiB9CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL3dlYmF1ZGlvL0F1ZGlv
QnVmZmVyLmggYi9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL3dlYmF1ZGlvL0F1ZGlvQnVmZmVyLmgK
aW5kZXggYzUwYzYzZWFkNGFmNjkzMTY3MTkxZWNmZTEzMGNkODMyOGIwNDA2OC4uYmZhN2ZjOWNi
MTk4ZjQwY2ZhNzI2NjhkNjgwOTEzMWYyNzgxNzQ1NyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNv
cmUvTW9kdWxlcy93ZWJhdWRpby9BdWRpb0J1ZmZlci5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL01v
ZHVsZXMvd2ViYXVkaW8vQXVkaW9CdWZmZXIuaApAQCAtOTgsMTEgKzk4LDExIEBAIGNsYXNzIEF1
ZGlvQnVmZmVyIDogcHVibGljIFJlZkNvdW50ZWQ8QXVkaW9CdWZmZXI+IHsKICAgICBzdGF0aWMg
Y29uc3RleHByIHVpbnQ2NF90IHNfbWF4TGVuZ3RoID0gKDF1bGwgPDwgMzIpIC8gc2l6ZW9mKGZs
b2F0KTsKIAogICAgIGZsb2F0IG1fc2FtcGxlUmF0ZTsKLSAgICBtdXRhYmxlIExvY2sgbV9jaGFu
bmVsc0xvY2s7CiAgICAgc2l6ZV90IG1fb3JpZ2luYWxMZW5ndGg7Ci0gICAgVmVjdG9yPFJlZlB0
cjxGbG9hdDMyQXJyYXk+PiBtX2NoYW5uZWxzOwotICAgIFZlY3RvcjxKU1ZhbHVlSW5XcmFwcGVk
T2JqZWN0PiBtX2NoYW5uZWxXcmFwcGVyczsKKyAgICBGaXhlZFZlY3RvcjxSZWZQdHI8RmxvYXQz
MkFycmF5Pj4gbV9jaGFubmVsczsKKyAgICBGaXhlZFZlY3RvcjxKU1ZhbHVlSW5XcmFwcGVkT2Jq
ZWN0PiBtX2NoYW5uZWxXcmFwcGVyczsKICAgICBib29sIG1faXNEZXRhY2hhYmxlIHsgdHJ1ZSB9
OworICAgIG11dGFibGUgTG9jayBtX2NoYW5uZWxzTG9jazsKIH07CiAKIH0gLy8gbmFtZXNwYWNl
IFdlYkNvcmUKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvd2ViYXVkaW8vQXVk
aW9Xb3JrbGV0UHJvY2Vzc29yLmNwcCBiL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvd2ViYXVkaW8v
QXVkaW9Xb3JrbGV0UHJvY2Vzc29yLmNwcAppbmRleCAwNmFiOThhMzVkNTgzZjQyMTdiYmQ2ZjFh
N2NjZTczMGU4NzJiOGZhLi5jOGM0ODZhNmU5YTZjNTQxNzExODQ5Y2M1YzMxOTk4MTg2ZWEwYTk4
IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL3dlYmF1ZGlvL0F1ZGlvV29ya2xl
dFByb2Nlc3Nvci5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvTW9kdWxlcy93ZWJhdWRpby9BdWRp
b1dvcmtsZXRQcm9jZXNzb3IuY3BwCkBAIC0yMjIsMTUgKzIyMiwxNSBAQCB2b2lkIEF1ZGlvV29y
a2xldFByb2Nlc3Nvcjo6YnVpbGRKU0FyZ3VtZW50cyhWTSYgdm0sIEpTR2xvYmFsT2JqZWN0JiBn
bG9iYWxPYmplYwogewogICAgIC8vIEZvciBwZXJmb3JtYW5jZSByZWFzb25zLCB3ZSBjYWNoZSB0
aGUgYXJyYXlzIHBhc3NlZCB0byBKUyBhbmQgcmVjb25zdHJ1Y3QgdGhlbSBvbmx5IHdoZW4gdGhl
IHRvcG9sb2d5IGNoYW5nZXMuCiAgICAgaWYgKCFjb3B5RGF0YUZyb21CdXNlc1RvSlNBcnJheSh2
bSwgZ2xvYmFsT2JqZWN0LCBpbnB1dHMsIHRvSlNBcnJheShtX2pzSW5wdXRzKSkpCi0gICAgICAg
IG1fanNJbnB1dHMgPSB7IGNvbnN0cnVjdEZyb3plbkpTQXJyYXkodm0sIGdsb2JhbE9iamVjdCwg
aW5wdXRzLCBTaG91bGRQb3B1bGF0ZVdpdGhCdXNEYXRhOjpZZXMpIH07CisgICAgICAgIG1fanNJ
bnB1dHMuc2V0V2Vha2x5KGNvbnN0cnVjdEZyb3plbkpTQXJyYXkodm0sIGdsb2JhbE9iamVjdCwg
aW5wdXRzLCBTaG91bGRQb3B1bGF0ZVdpdGhCdXNEYXRhOjpZZXMpKTsKICAgICBhcmdzLmFwcGVu
ZChtX2pzSW5wdXRzLmdldFZhbHVlKCkpOwogCiAgICAgaWYgKCF6ZXJvSlNBcnJheSh2bSwgZ2xv
YmFsT2JqZWN0LCBvdXRwdXRzLCB0b0pTQXJyYXkobV9qc091dHB1dHMpKSkKLSAgICAgICAgbV9q
c091dHB1dHMgPSB7IGNvbnN0cnVjdEZyb3plbkpTQXJyYXkodm0sIGdsb2JhbE9iamVjdCwgb3V0
cHV0cywgU2hvdWxkUG9wdWxhdGVXaXRoQnVzRGF0YTo6Tm8pIH07CisgICAgICAgIG1fanNPdXRw
dXRzLnNldFdlYWtseShjb25zdHJ1Y3RGcm96ZW5KU0FycmF5KHZtLCBnbG9iYWxPYmplY3QsIG91
dHB1dHMsIFNob3VsZFBvcHVsYXRlV2l0aEJ1c0RhdGE6Ok5vKSk7CiAgICAgYXJncy5hcHBlbmQo
bV9qc091dHB1dHMuZ2V0VmFsdWUoKSk7CiAKICAgICBpZiAoIWNvcHlEYXRhRnJvbVBhcmFtZXRl
ck1hcFRvSlNPYmplY3Qodm0sIGdsb2JhbE9iamVjdCwgcGFyYW1WYWx1ZXNNYXAsIHRvSlNPYmpl
Y3QobV9qc1BhcmFtVmFsdWVzKSkpCi0gICAgICAgIG1fanNQYXJhbVZhbHVlcyA9IHsgY29uc3Ry
dWN0RnJvemVuS2V5VmFsdWVPYmplY3Qodm0sIGdsb2JhbE9iamVjdCwgcGFyYW1WYWx1ZXNNYXAp
IH07CisgICAgICAgIG1fanNQYXJhbVZhbHVlcy5zZXRXZWFrbHkoY29uc3RydWN0RnJvemVuS2V5
VmFsdWVPYmplY3Qodm0sIGdsb2JhbE9iamVjdCwgcGFyYW1WYWx1ZXNNYXApKTsKICAgICBhcmdz
LmFwcGVuZChtX2pzUGFyYW1WYWx1ZXMuZ2V0VmFsdWUoKSk7CiB9CiAKZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJDb3JlL2JpbmRpbmdzL2pzL0pTTWVzc2FnZUV2ZW50Q3VzdG9tLmNwcCBiL1NvdXJj
ZS9XZWJDb3JlL2JpbmRpbmdzL2pzL0pTTWVzc2FnZUV2ZW50Q3VzdG9tLmNwcAppbmRleCBiYWJk
YzY1NDI1ZGE1NzUwYzAwM2M1Y2RlMThhMTU0NDEyNWNkZTgzLi41NDMyMTk1NjdjMWNiNmI0NGEw
MzZhZDRkMjZlYzM3NGNhY2FhODYwIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9iaW5kaW5n
cy9qcy9KU01lc3NhZ2VFdmVudEN1c3RvbS5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvYmluZGlu
Z3MvanMvSlNNZXNzYWdlRXZlbnRDdXN0b20uY3BwCkBAIC01NSw4ICs1NSw4IEBAIEpTQzo6SlNW
YWx1ZSBKU01lc3NhZ2VFdmVudDo6cG9ydHMoSlNDOjpKU0dsb2JhbE9iamVjdCYgbGV4aWNhbEds
b2JhbE9iamVjdCkgY29uCiBKU0M6OkpTVmFsdWUgSlNNZXNzYWdlRXZlbnQ6OmRhdGEoSlNDOjpK
U0dsb2JhbE9iamVjdCYgbGV4aWNhbEdsb2JhbE9iamVjdCkgY29uc3QKIHsKICAgICByZXR1cm4g
Y2FjaGVkUHJvcGVydHlWYWx1ZShsZXhpY2FsR2xvYmFsT2JqZWN0LCAqdGhpcywgd3JhcHBlZCgp
LmNhY2hlZERhdGEoKSwgW3RoaXMsICZsZXhpY2FsR2xvYmFsT2JqZWN0XSB7Ci0gICAgICAgIHJl
dHVybiBXVEY6OnN3aXRjaE9uKHdyYXBwZWQoKS5kYXRhKCksIFtdIChjb25zdCBKU1ZhbHVlSW5X
cmFwcGVkT2JqZWN0JiBkYXRhKSB7Ci0gICAgICAgICAgICByZXR1cm4gZGF0YS5nZXRWYWx1ZShK
U0M6OmpzTnVsbCgpKTsKKyAgICAgICAgcmV0dXJuIFdURjo6c3dpdGNoT24od3JhcHBlZCgpLmRh
dGEoKSwgW3RoaXNdIChNZXNzYWdlRXZlbnQ6OkpTVmFsdWVUYWcpIC0+IEpTQzo6SlNWYWx1ZSB7
CisgICAgICAgICAgICByZXR1cm4gd3JhcHBlZCgpLmpzRGF0YSgpLmdldFZhbHVlKEpTQzo6anNO
dWxsKCkpOwogICAgICAgICB9LCBbdGhpcywgJmxleGljYWxHbG9iYWxPYmplY3RdIChjb25zdCBS
ZWY8U2VyaWFsaXplZFNjcmlwdFZhbHVlPiYgZGF0YSkgewogICAgICAgICAgICAgLy8gRklYTUU6
IElzIGl0IGJlc3QgdG8gaGFuZGxlIGVycm9ycyBieSByZXR1cm5pbmcgbnVsbCByYXRoZXIgdGhh
biB0aHJvd2luZyBhbiBleGNlcHRpb24/CiAgICAgICAgICAgICByZXR1cm4gZGF0YS0+ZGVzZXJp
YWxpemUobGV4aWNhbEdsb2JhbE9iamVjdCwgZ2xvYmFsT2JqZWN0KCksIHdyYXBwZWQoKS5wb3J0
cygpLCBTZXJpYWxpemF0aW9uRXJyb3JNb2RlOjpOb25UaHJvd2luZyk7CkBAIC03MywxNCArNzMs
NyBAQCBKU0M6OkpTVmFsdWUgSlNNZXNzYWdlRXZlbnQ6OmRhdGEoSlNDOjpKU0dsb2JhbE9iamVj
dCYgbGV4aWNhbEdsb2JhbE9iamVjdCkgY29ucwogdGVtcGxhdGU8dHlwZW5hbWUgVmlzaXRvcj4K
IHZvaWQgSlNNZXNzYWdlRXZlbnQ6OnZpc2l0QWRkaXRpb25hbENoaWxkcmVuKFZpc2l0b3ImIHZp
c2l0b3IpCiB7Ci0gICAgV1RGOjpzd2l0Y2hPbih3cmFwcGVkKCkuZGF0YSgpLCBbJnZpc2l0b3Jd
IChjb25zdCBKU1ZhbHVlSW5XcmFwcGVkT2JqZWN0JiBkYXRhKSB7Ci0gICAgICAgIGRhdGEudmlz
aXQodmlzaXRvcik7Ci0gICAgfSwgW10gKGNvbnN0IFJlZjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+
JikgewotICAgIH0sIFtdIChjb25zdCBTdHJpbmcmKSB7Ci0gICAgfSwgW10gKGNvbnN0IFJlZjxC
bG9iPiYpIHsKLSAgICB9LCBbXSAoY29uc3QgUmVmPEFycmF5QnVmZmVyPiYpIHsKLSAgICB9KTsK
LQorICAgIHdyYXBwZWQoKS5qc0RhdGEoKS52aXNpdCh2aXNpdG9yKTsKICAgICB3cmFwcGVkKCku
Y2FjaGVkRGF0YSgpLnZpc2l0KHZpc2l0b3IpOwogICAgIHdyYXBwZWQoKS5jYWNoZWRQb3J0cygp
LnZpc2l0KHZpc2l0b3IpOwogfQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvYmluZGluZ3Mv
anMvSlNWYWx1ZUluV3JhcHBlZE9iamVjdC5oIGIvU291cmNlL1dlYkNvcmUvYmluZGluZ3MvanMv
SlNWYWx1ZUluV3JhcHBlZE9iamVjdC5oCmluZGV4IGZlNmViOWNkZmQ0NmYyY2Q3ODY5NjQ5Y2I1
MTk0YzY2MTM1NmM4YTYuLjRjODgxZGZjYzIyOTIzN2FjN2I0OWU4MzFhYmY1MjM0MmQzMzcwNjgg
MTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL2JpbmRpbmdzL2pzL0pTVmFsdWVJbldyYXBwZWRP
YmplY3QuaAorKysgYi9Tb3VyY2UvV2ViQ29yZS9iaW5kaW5ncy9qcy9KU1ZhbHVlSW5XcmFwcGVk
T2JqZWN0LmgKQEAgLTMzLDE3ICszMywxNSBAQAogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKKy8v
IFRoaXMgY2xhc3MgaW5jbHVkZXMgYSBsb3Qgb2YgR0MgcmVsYXRlZCBzdWJ0bGUgdGhpbmdzLCBh
bmQgY2hhbmdpbmcgdGhpcyBjbGFzcyBlYXNpbHkgY2F1c2VzIEdDIGNyYXNoZXMuCisvLyBBbnkg
Y2hhbmdlcyBvbiB0aGlzIGNsYXNzIG11c3QgYmUgcmV2aWV3ZWQgYnkgSmF2YVNjcmlwdENvcmUg
cmV2aWV3ZXJzIHRvby4KIGNsYXNzIEpTVmFsdWVJbldyYXBwZWRPYmplY3QgewotICAgIC8vIEl0
IG11c3Qgbm90IGJlIGNvcHlhYmxlLiBDaGFuZ2luZyB0aGlzIHdpbGwgYnJlYWsgY29uY3VycmVu
dCBHQy4KKyAgICAvLyBJdCBtdXN0IGJlIG5laXRoZXIgY29weWFibGUgbm9yIG1vdmFibGUuIENo
YW5naW5nIHRoaXMgd2lsbCBicmVhayBjb25jdXJyZW50IEdDLgogICAgIFdURl9NQUtFX05PTkNP
UFlBQkxFKEpTVmFsdWVJbldyYXBwZWRPYmplY3QpOworICAgIFdURl9NQUtFX05PTk1PVkFCTEUo
SlNWYWx1ZUluV3JhcHBlZE9iamVjdCk7CiBwdWJsaWM6CiAgICAgSlNWYWx1ZUluV3JhcHBlZE9i
amVjdChKU0M6OkpTVmFsdWUgPSB7IH0pOwogCi0gICAgLy8gRklYTUU6IFJlbW92ZSB0aGVtIG9u
Y2UgQXVkaW9CdWZmZXIncyBtX2NoYW5uZWxXcmFwcGVycyBidWcgaXMgZml4ZWQuCi0gICAgLy8g
aHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTIzNjI3OQotICAgIEpTVmFs
dWVJbldyYXBwZWRPYmplY3QoSlNWYWx1ZUluV3JhcHBlZE9iamVjdCYmKSA9IGRlZmF1bHQ7Ci0g
ICAgSlNWYWx1ZUluV3JhcHBlZE9iamVjdCYgb3BlcmF0b3I9KEpTVmFsdWVJbldyYXBwZWRPYmpl
Y3QmJikgPSBkZWZhdWx0OwotCiAgICAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0Owog
ICAgIHRlbXBsYXRlPHR5cGVuYW1lIFZpc2l0b3I+IHZvaWQgdmlzaXQoVmlzaXRvciYpIGNvbnN0
OwogICAgIHZvaWQgY2xlYXIoKTsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2RvbS9BYm9y
dFNpZ25hbC5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9kb20vQWJvcnRTaWduYWwuY3BwCmluZGV4IDY0
NjgwZWZmOTQ3NzcxNDExYWY0YTExNDRiMmExNDZhNzVkMGFjNDIuLmIyODA5ZTNjZGI3YzFmZjc2
Y2NlY2Q2MGI3ZmJjMWUzYTY5M2M2YzggMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL2RvbS9B
Ym9ydFNpZ25hbC5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvZG9tL0Fib3J0U2lnbmFsLmNwcApA
QCAtOTUsOCArOTUsMTAgQEAgdm9pZCBBYm9ydFNpZ25hbDo6c2lnbmFsQWJvcnQoSlNDOjpKU1Zh
bHVlIHJlYXNvbikKICAgICAvLyAyLiBTZXQgc2lnbmFs4oCZcyBhYm9ydGVkIGZsYWcuCiAgICAg
bV9hYm9ydGVkID0gdHJ1ZTsKIAorICAgIC8vIEZJWE1FOiBUaGlzIGNvZGUgaXMgd3Jvbmc6IHdl
IHNob3VsZCBlbWl0IGEgd3JpdGUtYmFycmllci4gT3RoZXJ3aXNlLCBHQyBjYW4gY29sbGVjdCBp
dC4KKyAgICAvLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjM2MzUz
CiAgICAgQVNTRVJUKHJlYXNvbik7Ci0gICAgbV9yZWFzb24gPSByZWFzb247CisgICAgbV9yZWFz
b24uc2V0V2Vha2x5KHJlYXNvbik7CiAKICAgICBSZWYgcHJvdGVjdGVkVGhpcyB7ICp0aGlzIH07
CiAgICAgYXV0byBhbGdvcml0aG1zID0gc3RkOjpleGNoYW5nZShtX2FsZ29yaXRobXMsIHsgfSk7
CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9kb20vQ3VzdG9tRXZlbnQuY3BwIGIvU291cmNl
L1dlYkNvcmUvZG9tL0N1c3RvbUV2ZW50LmNwcAppbmRleCA5YzRlMzhhNjk4M2NjNTE3ZTA5OWFm
ODRjYjRjMDNiZjhlMTU2MDk2Li5jZGEyZTVmOGU2ZWNkNzM5OTliMGJkZGJkYzdlMmY3ZjEyNTZh
M2ExIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9kb20vQ3VzdG9tRXZlbnQuY3BwCisrKyBi
L1NvdXJjZS9XZWJDb3JlL2RvbS9DdXN0b21FdmVudC5jcHAKQEAgLTY0LDggKzY0LDEwIEBAIHZv
aWQgQ3VzdG9tRXZlbnQ6OmluaXRDdXN0b21FdmVudChjb25zdCBBdG9tU3RyaW5nJiB0eXBlLCBi
b29sIGNhbkJ1YmJsZSwgYm9vbCBjCiAKICAgICBpbml0RXZlbnQodHlwZSwgY2FuQnViYmxlLCBj
YW5jZWxhYmxlKTsKIAotICAgIG1fZGV0YWlsID0gZGV0YWlsOwotICAgIG1fY2FjaGVkRGV0YWls
ID0geyB9OworICAgIC8vIEZJWE1FOiBUaGlzIGNvZGUgaXMgd3Jvbmc6IHdlIHNob3VsZCBlbWl0
IGEgd3JpdGUtYmFycmllci4gT3RoZXJ3aXNlLCBHQyBjYW4gY29sbGVjdCBpdC4KKyAgICAvLyBo
dHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjM2MzUzCisgICAgbV9kZXRh
aWwuc2V0V2Vha2x5KGRldGFpbCk7CisgICAgbV9jYWNoZWREZXRhaWwuY2xlYXIoKTsKIH0KIAog
RXZlbnRJbnRlcmZhY2UgQ3VzdG9tRXZlbnQ6OmV2ZW50SW50ZXJmYWNlKCkgY29uc3QKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJDb3JlL2RvbS9NZXNzYWdlRXZlbnQuY3BwIGIvU291cmNlL1dlYkNv
cmUvZG9tL01lc3NhZ2VFdmVudC5jcHAKaW5kZXggZTRmMTk0YmZhMmIyZjI4OWEyZjhkMzNkMTI5
MTcyMzM3N2VlZGNjMS4uMjg4ZjQ2Mjg2MmE5YjVkZjQ3MDNiN2Q1NzQ1ZTUzYmY3NGEyYTU0MiAx
MDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvZG9tL01lc3NhZ2VFdmVudC5jcHAKKysrIGIvU291
cmNlL1dlYkNvcmUvZG9tL01lc3NhZ2VFdmVudC5jcHAKQEAgLTQzLDExICs0MywxMiBAQCBNZXNz
YWdlRXZlbnQ6Ok1lc3NhZ2VFdmVudCgpID0gZGVmYXVsdDsKIAogaW5saW5lIE1lc3NhZ2VFdmVu
dDo6TWVzc2FnZUV2ZW50KGNvbnN0IEF0b21TdHJpbmcmIHR5cGUsIEluaXQmJiBpbml0aWFsaXpl
ciwgSXNUcnVzdGVkIGlzVHJ1c3RlZCkKICAgICA6IEV2ZW50KHR5cGUsIGluaXRpYWxpemVyLCBp
c1RydXN0ZWQpCi0gICAgLCBtX2RhdGEoSlNWYWx1ZUluV3JhcHBlZE9iamVjdCB7IGluaXRpYWxp
emVyLmRhdGEgfSkKKyAgICAsIG1fZGF0YShKU1ZhbHVlVGFnIHsgfSkKICAgICAsIG1fb3JpZ2lu
KGluaXRpYWxpemVyLm9yaWdpbikKICAgICAsIG1fbGFzdEV2ZW50SWQoaW5pdGlhbGl6ZXIubGFz
dEV2ZW50SWQpCiAgICAgLCBtX3NvdXJjZShXVEZNb3ZlKGluaXRpYWxpemVyLnNvdXJjZSkpCiAg
ICAgLCBtX3BvcnRzKFdURk1vdmUoaW5pdGlhbGl6ZXIucG9ydHMpKQorICAgICwgbV9qc0RhdGEo
aW5pdGlhbGl6ZXIuZGF0YSkKIHsKIH0KIApAQCAtMTEzLDEzICsxMTQsMTkgQEAgdm9pZCBNZXNz
YWdlRXZlbnQ6OmluaXRNZXNzYWdlRXZlbnQoY29uc3QgQXRvbVN0cmluZyYgdHlwZSwgYm9vbCBj
YW5CdWJibGUsIGJvb2wKIAogICAgIGluaXRFdmVudCh0eXBlLCBjYW5CdWJibGUsIGNhbmNlbGFi
bGUpOwogCi0gICAgbV9kYXRhID0gSlNWYWx1ZUluV3JhcHBlZE9iamVjdCB7IGRhdGEgfTsKLSAg
ICBtX2NhY2hlZERhdGEgPSB7IH07CisgICAgeworICAgICAgICBMb2NrZXIgeyBtX2NvbmN1cnJl
bnREYXRhQWNjZXNzTG9jayB9OworICAgICAgICBtX2RhdGEgPSBKU1ZhbHVlVGFnIHsgfTsKKyAg
ICB9CisgICAgLy8gRklYTUU6IFRoaXMgY29kZSBpcyB3cm9uZzogd2Ugc2hvdWxkIGVtaXQgYSB3
cml0ZS1iYXJyaWVyLiBPdGhlcndpc2UsIEdDIGNhbiBjb2xsZWN0IGl0LgorICAgIC8vIGh0dHBz
Oi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yMzYzNTMKKyAgICBtX2pzRGF0YS5z
ZXRXZWFrbHkoZGF0YSk7CisgICAgbV9jYWNoZWREYXRhLmNsZWFyKCk7CiAgICAgbV9vcmlnaW4g
PSBvcmlnaW47CiAgICAgbV9sYXN0RXZlbnRJZCA9IGxhc3RFdmVudElkOwogICAgIG1fc291cmNl
ID0gV1RGTW92ZShzb3VyY2UpOwogICAgIG1fcG9ydHMgPSBXVEZNb3ZlKHBvcnRzKTsKLSAgICBt
X2NhY2hlZFBvcnRzID0geyB9OworICAgIG1fY2FjaGVkUG9ydHMuY2xlYXIoKTsKIH0KIAogRXZl
bnRJbnRlcmZhY2UgTWVzc2FnZUV2ZW50OjpldmVudEludGVyZmFjZSgpIGNvbnN0CkBAIC0xMjks
NyArMTM2LDggQEAgRXZlbnRJbnRlcmZhY2UgTWVzc2FnZUV2ZW50OjpldmVudEludGVyZmFjZSgp
IGNvbnN0CiAKIHNpemVfdCBNZXNzYWdlRXZlbnQ6Om1lbW9yeUNvc3QoKSBjb25zdAogewotICAg
IHJldHVybiBXVEY6OnN3aXRjaE9uKG1fZGF0YSwgW10gKGNvbnN0IEpTVmFsdWVJbldyYXBwZWRP
YmplY3QmKSAtPiBzaXplX3QgeworICAgIExvY2tlciB7IG1fY29uY3VycmVudERhdGFBY2Nlc3NM
b2NrIH07CisgICAgcmV0dXJuIFdURjo6c3dpdGNoT24obV9kYXRhLCBbXSAoSlNWYWx1ZVRhZykg
LT4gc2l6ZV90IHsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfSwgW10gKGNvbnN0IFJlZjxTZXJp
YWxpemVkU2NyaXB0VmFsdWU+JiBkYXRhKSAtPiBzaXplX3QgewogICAgICAgICByZXR1cm4gZGF0
YS0+bWVtb3J5Q29zdCgpOwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvZG9tL01lc3NhZ2VF
dmVudC5oIGIvU291cmNlL1dlYkNvcmUvZG9tL01lc3NhZ2VFdmVudC5oCmluZGV4IDczZTA3MGVl
ZDQxNzJjOWI5NzA2Yzc4OGUxOGExYTJiODQwNjFmNjkuLjY1MTA2OTk0MjQwMDI5YjQ2NDYyNjA3
NWZmMzZjNmU1NmQ2ZmFhZDcgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL2RvbS9NZXNzYWdl
RXZlbnQuaAorKysgYi9Tb3VyY2UvV2ViQ29yZS9kb20vTWVzc2FnZUV2ZW50LmgKQEAgLTczLDkg
KzczLDExIEBAIGNsYXNzIE1lc3NhZ2VFdmVudCBmaW5hbCA6IHB1YmxpYyBFdmVudCB7CiAgICAg
Y29uc3Qgc3RkOjpvcHRpb25hbDxNZXNzYWdlRXZlbnRTb3VyY2U+JiBzb3VyY2UoKSBjb25zdCB7
IHJldHVybiBtX3NvdXJjZTsgfQogICAgIGNvbnN0IFZlY3RvcjxSZWZQdHI8TWVzc2FnZVBvcnQ+
PiYgcG9ydHMoKSBjb25zdCB7IHJldHVybiBtX3BvcnRzOyB9CiAKLSAgICB1c2luZyBEYXRhVHlw
ZSA9IHN0ZDo6dmFyaWFudDxKU1ZhbHVlSW5XcmFwcGVkT2JqZWN0LCBSZWY8U2VyaWFsaXplZFNj
cmlwdFZhbHVlPiwgU3RyaW5nLCBSZWY8QmxvYj4sIFJlZjxBcnJheUJ1ZmZlcj4+OworICAgIHN0
cnVjdCBKU1ZhbHVlVGFnIHsgfTsKKyAgICB1c2luZyBEYXRhVHlwZSA9IHN0ZDo6dmFyaWFudDxK
U1ZhbHVlVGFnLCBSZWY8U2VyaWFsaXplZFNjcmlwdFZhbHVlPiwgU3RyaW5nLCBSZWY8QmxvYj4s
IFJlZjxBcnJheUJ1ZmZlcj4+OwogICAgIGNvbnN0IERhdGFUeXBlJiBkYXRhKCkgY29uc3QgeyBy
ZXR1cm4gbV9kYXRhOyB9CiAKKyAgICBKU1ZhbHVlSW5XcmFwcGVkT2JqZWN0JiBqc0RhdGEoKSB7
IHJldHVybiBtX2pzRGF0YTsgfQogICAgIEpTVmFsdWVJbldyYXBwZWRPYmplY3QmIGNhY2hlZERh
dGEoKSB7IHJldHVybiBtX2NhY2hlZERhdGE7IH0KICAgICBKU1ZhbHVlSW5XcmFwcGVkT2JqZWN0
JiBjYWNoZWRQb3J0cygpIHsgcmV0dXJuIG1fY2FjaGVkUG9ydHM7IH0KIApAQCAtOTUsOCArOTcs
MTEgQEAgY2xhc3MgTWVzc2FnZUV2ZW50IGZpbmFsIDogcHVibGljIEV2ZW50IHsKICAgICBzdGQ6
Om9wdGlvbmFsPE1lc3NhZ2VFdmVudFNvdXJjZT4gbV9zb3VyY2U7CiAgICAgVmVjdG9yPFJlZlB0
cjxNZXNzYWdlUG9ydD4+IG1fcG9ydHM7CiAKKyAgICBKU1ZhbHVlSW5XcmFwcGVkT2JqZWN0IG1f
anNEYXRhOwogICAgIEpTVmFsdWVJbldyYXBwZWRPYmplY3QgbV9jYWNoZWREYXRhOwogICAgIEpT
VmFsdWVJbldyYXBwZWRPYmplY3QgbV9jYWNoZWRQb3J0czsKKworICAgIG11dGFibGUgTG9jayBt
X2NvbmN1cnJlbnREYXRhQWNjZXNzTG9jazsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUK
ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BhZ2UvSGlzdG9yeS5jcHAgYi9Tb3VyY2UvV2Vi
Q29yZS9wYWdlL0hpc3RvcnkuY3BwCmluZGV4IDUxNzk0MGY5MWU4MWY3ODk5YWQ3NTRjOTJjMzg2
YzM0MGFlZjNiMmYuLmYxZGEyYzg1YTAwODQ3NmZmMDg4MzJmM2EwYjhlN2M0MDViYjk3NjQgMTAw
NjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BhZ2UvSGlzdG9yeS5jcHAKKysrIGIvU291cmNlL1dl
YkNvcmUvcGFnZS9IaXN0b3J5LmNwcApAQCAtMTgwLDcgKzE4MCw3IEBAIFVSTCBIaXN0b3J5Ojp1
cmxGb3JTdGF0ZShjb25zdCBTdHJpbmcmIHVybFN0cmluZykKIAogRXhjZXB0aW9uT3I8dm9pZD4g
SGlzdG9yeTo6c3RhdGVPYmplY3RBZGRlZChSZWZQdHI8U2VyaWFsaXplZFNjcmlwdFZhbHVlPiYm
IGRhdGEsIGNvbnN0IFN0cmluZyYgdGl0bGUsIGNvbnN0IFN0cmluZyYgdXJsU3RyaW5nLCBTdGF0
ZU9iamVjdFR5cGUgc3RhdGVPYmplY3RUeXBlKQogewotICAgIG1fY2FjaGVkU3RhdGUgPSB7IH07
CisgICAgbV9jYWNoZWRTdGF0ZS5jbGVhcigpOwogCiAgICAgLy8gRWFjaCB1bmlxdWUgbWFpbi1m
cmFtZSBkb2N1bWVudCBpcyBvbmx5IGFsbG93ZWQgdG8gc2VuZCA2NE1CIG9mIHN0YXRlIG9iamVj
dCBwYXlsb2FkIHRvIHRoZSBVSSBjbGllbnQvcHJvY2Vzcy4KICAgICBzdGF0aWMgdWludDMyX3Qg
dG90YWxTdGF0ZU9iamVjdFBheWxvYWRMaW1pdCA9IDB4NDAwMDAwMDsK
</data>
<flag name="review"
          id="478062"
          type_id="1"
          status="+"
          setter="keith_miller"
    />
          </attachment>
      

    </bug>

</bugzilla>