<?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>65724</bug_id>
          
          <creation_ts>2011-08-04 15:12:16 -0700</creation_ts>
          <short_desc>Need to handle kCACFContextNeedsFlushNotification notifications that arrive after the AVFWrapper has been disposed</short_desc>
          <delta_ts>2011-08-12 11:42:30 -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>Media</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>PC</rep_platform>
          <op_sys>All</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="Jeff Miller">jeffm</reporter>
          <assigned_to name="Jeff Miller">jeffm</assigned_to>
          <cc>eric.carlson</cc>
    
    <cc>webkit-bug-importer</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>446818</commentid>
    <comment_count>0</comment_count>
    <who name="Jeff Miller">jeffm</who>
    <bug_when>2011-08-04 15:12:16 -0700</bug_when>
    <thetext>Unlike AVCFPlayerItem notifications, the kCACFContextNeedsFlushNotification is associated with a CACFContext, not a AVCFPlayerItem. As a result, even though we clean up the AVFWrapper on the same dispatch queue used for AVCFPlayerItem notifications, this won&apos;t prevent additional kCACFContextNeedsFlushNotifications from being received. We need to stop using the AVFWrapper* as the observer for these notifications, and identify the AVFWrapper by id instead so we can determine when to ignore a notification for a stale AVFWrapper.

Currently, we&apos;re working around this by leaking the ACFWrapper object (while cleaning up its ivars).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>446820</commentid>
    <comment_count>1</comment_count>
    <who name="Jeff Miller">jeffm</who>
    <bug_when>2011-08-04 15:12:58 -0700</bug_when>
    <thetext>&lt;rdar://problem/9900100&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>450193</commentid>
    <comment_count>2</comment_count>
      <attachid>103713</attachid>
    <who name="Jeff Miller">jeffm</who>
    <bug_when>2011-08-11 17:39:22 -0700</bug_when>
    <thetext>Created attachment 103713
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>450447</commentid>
    <comment_count>3</comment_count>
      <attachid>103713</attachid>
    <who name="Eric Carlson">eric.carlson</who>
    <bug_when>2011-08-12 09:01:28 -0700</bug_when>
    <thetext>Comment on attachment 103713
Patch

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

&gt; Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundationCF.cpp:124
&gt; +    inline void* callbackContext() const { return reinterpret_cast&lt;void*&gt;(m_objectID); }

It looks like this is only used within this class, can it be made private?

Nit: Is there any reason to call it &quot;callbackContext&quot; instead of &quot;objectID&quot;?


&gt; Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundationCF.cpp:131
&gt; +    static Mutex&amp; avfWrapperMapLock();
&gt; +    static HashMap&lt;uintptr_t, AVFWrapper*&gt;&amp; avfWrapperMap();
&gt; +    static AVFWrapper* avfWrapperForCallbackContext(void*);
&gt; +    void addToAVFWrapperMap();
&gt; +    void removeFromAVFWrapperMap() const;

Nit: These are all private to the AVFWrapper class, so I don&apos;t think having &quot;AVFWrapper&quot; in the names is helpful.


&gt; Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundationCF.cpp:865
&gt; +    // HashMap doesn&apos;t like a key of 0.
&gt; +    if (!m_objectID)
&gt; +        m_objectID = s_nextAVFWrapperObjectID++;
&gt; +    

This *could* reuse the ID of an existing wrapper. It isn&apos;t likely but it is definitely possible - imagine a page that has a static &lt;video&gt; element but also uses one-shot &lt;audio&gt; elements for sound effects. You might as well look up the &quot;new&quot; ID in the map to make sure it isn&apos;t already in use.


&gt; Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundationCF.cpp:927
&gt; +    // Assumes caller has locked avfWrapperMapLock().    
&gt; +    HashMap&lt;uintptr_t, AVFWrapper*&gt;::iterator it = avfWrapperMap().find(reinterpret_cast&lt;uintptr_t&gt;(context));
&gt; +    if (it == avfWrapperMap().end())
&gt; +        return 0;
&gt; +
&gt; +    return it-&gt;second;

You might as well ASSERT that the map is locked in a debug build.


&gt; Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundationCF.cpp:1028
&gt; +    MutexLocker locker(avfWrapperMapLock());
&gt; +    AVFWrapper* self = avfWrapperForCallbackContext(context);
&gt; +    if (!self) {
&gt; +        LOG(Media, &quot;AVFWrapper::periodicTimeObserverCallback invoked for deleted AVFWrapper %d&quot;, reinterpret_cast&lt;uintptr_t&gt;(context));
&gt;          return;
&gt; +    }
&gt;  
&gt;      double time = std::max(0.0, CMTimeGetSeconds(cmTime)); // Clamp to zero, negative values are sometimes reported.
&gt;      self-&gt;m_owner-&gt;scheduleMainThreadNotification(MediaPlayerPrivateAVFoundation::Notification::PlayerTimeChanged, time);

Is it safe/necessary to hold the lock when calling outside of the class?


&gt; Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundationCF.cpp:1038
&gt; +    MutexLocker locker(avfWrapperMapLock());
&gt; +    AVFWrapper* self = avfWrapperForCallbackContext(observer);
&gt;      
&gt; -    if (!self-&gt;m_owner)
&gt; +    if (!self) {
&gt; +        LOG(Media, &quot;AVFWrapper::notificationCallback invoked for deleted AVFWrapper %d&quot;, reinterpret_cast&lt;uintptr_t&gt;(observer));
&gt;          return;

Ditto.


&gt; Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundationCF.cpp:1082
&gt; +    MutexLocker locker(avfWrapperMapLock());
&gt; +    AVFWrapper* self = avfWrapperForCallbackContext(context);
&gt; +    if (!self) {
&gt; +        LOG(Media, &quot;AVFWrapper::loadPlayableCompletionCallback invoked for deleted AVFWrapper %d&quot;, reinterpret_cast&lt;uintptr_t&gt;(context));
&gt;          return;
&gt; +    }
&gt; +
&gt; +    LOG(Media, &quot;AVFWrapper::loadPlayableCompletionCallback(%p)&quot;, self);
&gt;      self-&gt;m_owner-&gt;scheduleMainThreadNotification(MediaPlayerPrivateAVFoundation::Notification::AssetPlayabilityKnown);

Ditto.


&gt; Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundationCF.cpp:1110
&gt; +    MutexLocker locker(avfWrapperMapLock());
&gt; +    AVFWrapper* self = avfWrapperForCallbackContext(context);
&gt; +    if (!self) {
&gt; +        LOG(Media, &quot;AVFWrapper::loadMetadataCompletionCallback invoked for deleted AVFWrapper %d&quot;, reinterpret_cast&lt;uintptr_t&gt;(context));
&gt;          return;
&gt; +    }
&gt; +
&gt; +    LOG(Media, &quot;AVFWrapper::loadMetadataCompletionCallback(%p)&quot;, self);
&gt;      self-&gt;m_owner-&gt;scheduleMainThreadNotification(MediaPlayerPrivateAVFoundation::Notification::AssetMetadataLoaded);

Ditto.


&gt; Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundationCF.cpp:1130
&gt; +    MutexLocker locker(avfWrapperMapLock());
&gt; +    AVFWrapper* self = avfWrapperForCallbackContext(context);
&gt; +    if (!self) {
&gt; +        LOG(Media, &quot;AVFWrapper::seekCompletedCallback invoked for deleted AVFWrapper %d&quot;, reinterpret_cast&lt;uintptr_t&gt;(context));
&gt;          return;
&gt; +    }
&gt;  
&gt; +    LOG(Media, &quot;AVFWrapper::seekCompletedCallback(%p)&quot;, self);
&gt;      self-&gt;m_owner-&gt;scheduleMainThreadNotification(MediaPlayerPrivateAVFoundation::Notification::SeekCompleted, static_cast&lt;bool&gt;(finished));

Ditto.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>450482</commentid>
    <comment_count>4</comment_count>
      <attachid>103713</attachid>
    <who name="Jeff Miller">jeffm</who>
    <bug_when>2011-08-12 10:21:43 -0700</bug_when>
    <thetext>Comment on attachment 103713
Patch

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

&gt;&gt; Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundationCF.cpp:124
&gt;&gt; +    inline void* callbackContext() const { return reinterpret_cast&lt;void*&gt;(m_objectID); }
&gt; 
&gt; It looks like this is only used within this class, can it be made private?
&gt; 
&gt; Nit: Is there any reason to call it &quot;callbackContext&quot; instead of &quot;objectID&quot;?

I&apos;ll make it private.  I chose callbackContext() because it makes sense in all the call sites that use it, since they don&apos;t need to know that it&apos;s actually the objectID. Plus, m_objectID is a uintptr_t, and we need a void* for the callback context.

&gt;&gt; Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundationCF.cpp:131
&gt;&gt; +    void removeFromAVFWrapperMap() const;
&gt; 
&gt; Nit: These are all private to the AVFWrapper class, so I don&apos;t think having &quot;AVFWrapper&quot; in the names is helpful.

Fixed.

&gt;&gt; Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundationCF.cpp:865
&gt;&gt; +    
&gt; 
&gt; This *could* reuse the ID of an existing wrapper. It isn&apos;t likely but it is definitely possible - imagine a page that has a static &lt;video&gt; element but also uses one-shot &lt;audio&gt; elements for sound effects. You might as well look up the &quot;new&quot; ID in the map to make sure it isn&apos;t already in use.

I don&apos;t know enough about media elements to understand the one-shot &lt;audio&gt; element example. I can add code to check for the ID already being in use, but it seems like if we did hit the case where we wrapped around and encountered an ID that was still in use, it would be equally likely that all the other IDs are also in use, in which case there&apos;s not much we could do.

&gt;&gt; Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundationCF.cpp:927
&gt;&gt; +    return it-&gt;second;
&gt; 
&gt; You might as well ASSERT that the map is locked in a debug build.

Good point, will do.

&gt;&gt; Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundationCF.cpp:1028
&gt;&gt;      self-&gt;m_owner-&gt;scheduleMainThreadNotification(MediaPlayerPrivateAVFoundation::Notification::PlayerTimeChanged, time);
&gt; 
&gt; Is it safe/necessary to hold the lock when calling outside of the class?

Yes, we need to make sure the MediaPlayerPrivateAVFoundationCF object in m_owner remains valid during the call to its scheduleMainThreadNotification() method. Since the lock prevents the AVFWrapper from being torn down, which is done during the MediaPlayerPrivateAVFoundationCF destructor, holding it also prevents m_owner from being deleted.

&gt;&gt; Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundationCF.cpp:1038
&gt;&gt;          return;
&gt; 
&gt; Ditto.

See my comment above.

&gt;&gt; Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundationCF.cpp:1082
&gt;&gt;      self-&gt;m_owner-&gt;scheduleMainThreadNotification(MediaPlayerPrivateAVFoundation::Notification::AssetPlayabilityKnown);
&gt; 
&gt; Ditto.

See my comment above.

&gt;&gt; Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundationCF.cpp:1110
&gt;&gt;      self-&gt;m_owner-&gt;scheduleMainThreadNotification(MediaPlayerPrivateAVFoundation::Notification::AssetMetadataLoaded);
&gt; 
&gt; Ditto.

See my comment above.

&gt;&gt; Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundationCF.cpp:1130
&gt;&gt;      self-&gt;m_owner-&gt;scheduleMainThreadNotification(MediaPlayerPrivateAVFoundation::Notification::SeekCompleted, static_cast&lt;bool&gt;(finished));
&gt; 
&gt; Ditto.

See my comment above.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>450487</commentid>
    <comment_count>5</comment_count>
      <attachid>103713</attachid>
    <who name="Jeff Miller">jeffm</who>
    <bug_when>2011-08-12 10:25:32 -0700</bug_when>
    <thetext>Comment on attachment 103713
Patch

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

&gt;&gt;&gt; Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundationCF.cpp:927
&gt;&gt;&gt; +    return it-&gt;second;
&gt;&gt; 
&gt;&gt; You might as well ASSERT that the map is locked in a debug build.
&gt; 
&gt; Good point, will do.

Actually, there isn&apos;t a way to test if a Mutex is locked by the current thread, so I can&apos;t ASSERT here.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>450494</commentid>
    <comment_count>6</comment_count>
      <attachid>103713</attachid>
    <who name="Jeff Miller">jeffm</who>
    <bug_when>2011-08-12 10:33:30 -0700</bug_when>
    <thetext>Comment on attachment 103713
Patch

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

&gt;&gt;&gt; Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundationCF.cpp:865
&gt;&gt;&gt; +    
&gt;&gt; 
&gt;&gt; This *could* reuse the ID of an existing wrapper. It isn&apos;t likely but it is definitely possible - imagine a page that has a static &lt;video&gt; element but also uses one-shot &lt;audio&gt; elements for sound effects. You might as well look up the &quot;new&quot; ID in the map to make sure it isn&apos;t already in use.
&gt; 
&gt; I don&apos;t know enough about media elements to understand the one-shot &lt;audio&gt; element example. I can add code to check for the ID already being in use, but it seems like if we did hit the case where we wrapped around and encountered an ID that was still in use, it would be equally likely that all the other IDs are also in use, in which case there&apos;s not much we could do.

I think that for now, I&apos;ll just assert in the function that adds to the map that the ID isn&apos;t already in use.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>450522</commentid>
    <comment_count>7</comment_count>
      <attachid>103713</attachid>
    <who name="Jeff Miller">jeffm</who>
    <bug_when>2011-08-12 11:28:45 -0700</bug_when>
    <thetext>Comment on attachment 103713
Patch

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

&gt;&gt;&gt;&gt; Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundationCF.cpp:865
&gt;&gt;&gt;&gt; +    
&gt;&gt;&gt; 
&gt;&gt;&gt; This *could* reuse the ID of an existing wrapper. It isn&apos;t likely but it is definitely possible - imagine a page that has a static &lt;video&gt; element but also uses one-shot &lt;audio&gt; elements for sound effects. You might as well look up the &quot;new&quot; ID in the map to make sure it isn&apos;t already in use.
&gt;&gt; 
&gt;&gt; I don&apos;t know enough about media elements to understand the one-shot &lt;audio&gt; element example. I can add code to check for the ID already being in use, but it seems like if we did hit the case where we wrapped around and encountered an ID that was still in use, it would be equally likely that all the other IDs are also in use, in which case there&apos;s not much we could do.
&gt; 
&gt; I think that for now, I&apos;ll just assert in the function that adds to the map that the ID isn&apos;t already in use.

I talked to Eric some more, and I now understand the use case he was describing.  A page could have a long-lived media element and also create and tear down many short-lived one-shot &lt;audio&gt; elements. The ID space wouldn&apos;t be exhausted, but eventually a one-shot element could try to re-use the same ID as the long-lived media element.  I agree with Eric, we should make sure we handle this case.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>450528</commentid>
    <comment_count>8</comment_count>
    <who name="Jeff Miller">jeffm</who>
    <bug_when>2011-08-12 11:42:30 -0700</bug_when>
    <thetext>Committed r92977: &lt;http://trac.webkit.org/changeset/92977&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>103713</attachid>
            <date>2011-08-11 17:39:22 -0700</date>
            <delta_ts>2011-08-12 11:28:45 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-65724-20110811173921.patch</filename>
            <type>text/plain</type>
            <size>20958</size>
            <attacher name="Jeff Miller">jeffm</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDkyODk1KQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNDAgQEAKKzIwMTEtMDgtMTEgIEplZmYgTWls
bGVyICA8amVmZm1AYXBwbGUuY29tPgorCisgICAgICAgIE5lZWQgdG8gaGFuZGxlIGtDQUNGQ29u
dGV4dE5lZWRzRmx1c2hOb3RpZmljYXRpb24gbm90aWZpY2F0aW9ucyB0aGF0IGFycml2ZSBhZnRl
ciB0aGUgQVZGV3JhcHBlciBoYXMgYmVlbiBkaXNwb3NlZAorICAgICAgICBodHRwczovL2J1Z3Mu
d2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjU3MjQKKyAgICAgICAgCisgICAgICAgIEluc3Rl
YWQgb2YgdXNpbmcgYSBwb2ludGVyIHRvIHRoZSBBVkZXcmFwcGVyIG9iamVjdCBhcyB0aGUgY29u
dGV4dCBmb3IgdmFyaW91cyBjYWxsYmFja3MsIGFzc2lnbiBlYWNoIG9iamVjdCBhbgorICAgICAg
ICBJRCBhbmQgdXNlIHRoYXQgaW5zdGVhZC4gS2VlcCB0cmFjayBvZiB0aGUgbWFwcGluZyBiZXR3
ZWVuIG9iamVjdCBJRHMgYW5kIEFWRldyYXBwZXIgb2JqZWN0cyBpbiBhIEhhc2hNYXAsIGFuZCBt
YW5hZ2UKKyAgICAgICAgYWNjZXNzIHRvIHRoaXMgbWFwIHVzaW5nIGEgTXV0ZXggc2luY2UgaXQg
Y2FuIGJlIGFjY2Vzc2VkIGZyb20gbXVsdGlwbGUgdGhyZWFkcy4gVGhpcyBhbGxvd3MgdXMgdG8g
YWN0dWFsbHkgZGVsZXRlCisgICAgICAgIEFWRldyYXBwZXIgb2JqZWN0cyBpbnN0ZWFkIG9mIGxl
YWtpbmcgdGhlbSAod2hpY2ggd2Ugd2VyZSBkb2luZyBiZWZvcmUgdG8gcHJldmVudCBjcmFzaGVz
KS4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBObyBu
ZXcgdGVzdHMsIHVzZXMgZXhpc3RpbmcgbWVkaWEgdGVzdHMuCisKKyAgICAgICAgKiBwbGF0Zm9y
bS9ncmFwaGljcy9hdmZvdW5kYXRpb24vTWVkaWFQbGF5ZXJQcml2YXRlQVZGb3VuZGF0aW9uQ0Yu
Y3BwOgorICAgICAgICAoV2ViQ29yZTo6QVZGV3JhcHBlcjo6Y2FsbGJhY2tDb250ZXh0KTogQWRk
ZWQuCisgICAgICAgIChXZWJDb3JlOjpBVkZXcmFwcGVyOjpBVkZXcmFwcGVyKTogSW5pdGlhbGl6
ZSBtX29iamVjdElEIGFuZCBhZGQgaXQgdG8gdGhlIEhhc2hNYXAuCisgICAgICAgIChXZWJDb3Jl
OjpBVkZXcmFwcGVyOjp+QVZGV3JhcHBlcik6IExvZyBvYmplY3QgSUQgYW5kIHJlbW92ZSBvYnNv
bGV0ZSBhc3NlcnQuCisgICAgICAgIChXZWJDb3JlOjpBVkZXcmFwcGVyOjphdmZXcmFwcGVyTWFw
TG9jayk6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6QVZGV3JhcHBlcjo6YXZmV3JhcHBlck1h
cCk6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6QVZGV3JhcHBlcjo6YWRkVG9BVkZXcmFwcGVy
TWFwKTogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpBVkZXcmFwcGVyOjpyZW1vdmVGcm9tQVZG
V3JhcHBlck1hcCk6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6QVZGV3JhcHBlcjo6YXZmV3Jh
cHBlckZvckNhbGxiYWNrQ29udGV4dCk6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6QVZGV3Jh
cHBlcjo6c2NoZWR1bGVEaXNjb25uZWN0QW5kRGVsZXRlKTogUmVtb3ZlIEFWRldyYXBwZXIgZnJv
bSBIYXNoTWFwIGluc3RlYWQgb2YgemVyb2luZyBtX293bmVyLgorICAgICAgICAoV2ViQ29yZTo6
QVZGV3JhcHBlcjo6ZGlzY29ubmVjdEFuZERlbGV0ZUFWRldyYXBwZXIpOiBVc2UgY2FsbGJhY2tD
b250ZXh0KCksIGRlbGV0ZSB0aGUgQVZGV3JhcHBlciBoZXJlLgorICAgICAgICAoV2ViQ29yZTo6
QVZGV3JhcHBlcjo6Y3JlYXRlUGxheWVyKTogVXNlIGNhbGxiYWNrQ29udGV4dCgpLgorICAgICAg
ICAoV2ViQ29yZTo6QVZGV3JhcHBlcjo6Y3JlYXRlUGxheWVySXRlbSk6IFVzZSBjYWxsYmFja0Nv
bnRleHQoKS4KKyAgICAgICAgKFdlYkNvcmU6OkFWRldyYXBwZXI6OnBlcmlvZGljVGltZU9ic2Vy
dmVyQ2FsbGJhY2spOiBSZXRyaWV2ZSBBVkZXcmFwcGVyIHVzaW5nIHRoZSBIYXNoTWFwLgorICAg
ICAgICAoV2ViQ29yZTo6QVZGV3JhcHBlcjo6bm90aWZpY2F0aW9uQ2FsbGJhY2spOiBSZXRyaWV2
ZSBBVkZXcmFwcGVyIHVzaW5nIHRoZSBIYXNoTWFwLgorICAgICAgICAoV2ViQ29yZTo6QVZGV3Jh
cHBlcjo6bG9hZFBsYXlhYmxlQ29tcGxldGlvbkNhbGxiYWNrKTogUmV0cmlldmUgQVZGV3JhcHBl
ciB1c2luZyB0aGUgSGFzaE1hcC4KKyAgICAgICAgKFdlYkNvcmU6OkFWRldyYXBwZXI6OmNoZWNr
UGxheWFiaWxpdHkpOiBVc2UgY2FsbGJhY2tDb250ZXh0KCkuCisgICAgICAgIChXZWJDb3JlOjpB
VkZXcmFwcGVyOjpsb2FkTWV0YWRhdGFDb21wbGV0aW9uQ2FsbGJhY2spOiBSZXRyaWV2ZSBBVkZX
cmFwcGVyIHVzaW5nIHRoZSBIYXNoTWFwLgorICAgICAgICAoV2ViQ29yZTo6QVZGV3JhcHBlcjo6
YmVnaW5Mb2FkaW5nTWV0YWRhdGEpOiBVc2UgY2FsbGJhY2tDb250ZXh0KCkuCisgICAgICAgIChX
ZWJDb3JlOjpBVkZXcmFwcGVyOjpzZWVrQ29tcGxldGVkQ2FsbGJhY2spOiBSZXRyaWV2ZSBBVkZX
cmFwcGVyIHVzaW5nIHRoZSBIYXNoTWFwLgorICAgICAgICAoV2ViQ29yZTo6QVZGV3JhcHBlcjo6
c2Vla1RvVGltZSk6IFVzZSBjYWxsYmFja0NvbnRleHQoKS4KKyAgICAgICAgKFdlYkNvcmU6OkFW
RldyYXBwZXI6OnBsYXRmb3JtTGF5ZXIpOiBSZW1vdmUgb3Zlcmx5IG5vaXN5IExPRygpLgorCiAy
MDExLTA4LTA1ICBOYXQgRHVjYSAgPG5kdWNhQGNocm9taXVtLm9yZz4KIAogICAgICAgICBbY2hy
b21pdW1dIE1ha2UgV2ViVmlld0ltcGwgcG9pbnQgYXQgQ0NMYXllclRyZWVIb3N0IGFuZCByZWxh
dGVkIHNlcGFyYXRpb24KSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2F2
Zm91bmRhdGlvbi9NZWRpYVBsYXllclByaXZhdGVBVkZvdW5kYXRpb25DRi5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvYXZmb3VuZGF0aW9uL01lZGlh
UGxheWVyUHJpdmF0ZUFWRm91bmRhdGlvbkNGLmNwcAkocmV2aXNpb24gOTI4OTQpCisrKyBTb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9hdmZvdW5kYXRpb24vTWVkaWFQbGF5ZXJQcml2
YXRlQVZGb3VuZGF0aW9uQ0YuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00NSw2ICs0NSw3IEBACiAK
ICNpbmNsdWRlIDxkZWxheWltcC5oPgogI2luY2x1ZGUgPGRpc3BhdGNoL2Rpc3BhdGNoLmg+Cisj
aW5jbHVkZSA8d3RmL0hhc2hNYXAuaD4KICNpbmNsdWRlIDx3dGYvVGhyZWFkaW5nLmg+CiAjaW5j
bHVkZSA8d3RmL1VudXNlZFBhcmFtLmg+CiAKQEAgLTEyMCwxMCArMTIxLDE5IEBAIHB1YmxpYzoK
ICAgICBpbmxpbmUgQVZDRlBsYXllck9ic2VydmVyUmVmIHRpbWVPYnNlcnZlcigpIGNvbnN0IHsg
cmV0dXJuIChBVkNGUGxheWVyT2JzZXJ2ZXJSZWYpbV90aW1lT2JzZXJ2ZXIuZ2V0KCk7IH0KICAg
ICBpbmxpbmUgQVZDRkFzc2V0SW1hZ2VHZW5lcmF0b3JSZWYgaW1hZ2VHZW5lcmF0b3IoKSBjb25z
dCB7IHJldHVybiBtX2ltYWdlR2VuZXJhdG9yLmdldCgpOyB9CiAgICAgaW5saW5lIGRpc3BhdGNo
X3F1ZXVlX3QgZGlzcGF0Y2hRdWV1ZSgpIGNvbnN0IHsgcmV0dXJuIG1fbm90aWZpY2F0aW9uUXVl
dWU7IH0KKyAgICBpbmxpbmUgdm9pZCogY2FsbGJhY2tDb250ZXh0KCkgY29uc3QgeyByZXR1cm4g
cmVpbnRlcnByZXRfY2FzdDx2b2lkKj4obV9vYmplY3RJRCk7IH0KIAogcHJpdmF0ZToKKyAgICBz
dGF0aWMgTXV0ZXgmIGF2ZldyYXBwZXJNYXBMb2NrKCk7CisgICAgc3RhdGljIEhhc2hNYXA8dWlu
dHB0cl90LCBBVkZXcmFwcGVyKj4mIGF2ZldyYXBwZXJNYXAoKTsKKyAgICBzdGF0aWMgQVZGV3Jh
cHBlciogYXZmV3JhcHBlckZvckNhbGxiYWNrQ29udGV4dCh2b2lkKik7CisgICAgdm9pZCBhZGRU
b0FWRldyYXBwZXJNYXAoKTsKKyAgICB2b2lkIHJlbW92ZUZyb21BVkZXcmFwcGVyTWFwKCkgY29u
c3Q7CisKICAgICBzdGF0aWMgdm9pZCBkaXNjb25uZWN0QW5kRGVsZXRlQVZGV3JhcHBlcih2b2lk
Kik7Ci0gICAgc3RhdGljIHZvaWQgZGVsZXRlQVZGV3JhcHBlcih2b2lkKik7CisKKyAgICBzdGF0
aWMgdWludHB0cl90IHNfbmV4dEFWRldyYXBwZXJPYmplY3RJRDsKKyAgICB1aW50cHRyX3QgbV9v
YmplY3RJRDsKIAogICAgIE1lZGlhUGxheWVyUHJpdmF0ZUFWRm91bmRhdGlvbkNGKiBtX293bmVy
OwogCkBAIC0xNDEsNiArMTUxLDggQEAgcHJpdmF0ZToKICAgICBPd25QdHI8TGF5ZXJDbGllbnQ+
IG1fbGF5ZXJDbGllbnQ7CiB9OwogCit1aW50cHRyX3QgQVZGV3JhcHBlcjo6c19uZXh0QVZGV3Jh
cHBlck9iamVjdElEOworCiBjbGFzcyBMYXllckNsaWVudCA6IHB1YmxpYyBQbGF0Zm9ybUNBTGF5
ZXJDbGllbnQgewogcHVibGljOgogICAgIExheWVyQ2xpZW50KEFWRldyYXBwZXIqIHBhcmVudCkg
OiBtX3BhcmVudChwYXJlbnQpIHsgfQpAQCAtODQ1LDE2ICs4NTcsMjEgQEAgdm9pZCBNZWRpYVBs
YXllclByaXZhdGVBVkZvdW5kYXRpb25DRjo6YwogCiBBVkZXcmFwcGVyOjpBVkZXcmFwcGVyKE1l
ZGlhUGxheWVyUHJpdmF0ZUFWRm91bmRhdGlvbkNGKiBvd25lcikKICAgICA6IG1fb3duZXIob3du
ZXIpCisgICAgLCBtX29iamVjdElEKHNfbmV4dEFWRldyYXBwZXJPYmplY3RJRCsrKQogewotICAg
IExPRyhNZWRpYSwgIkFWRldyYXBwZXI6OkFWRldyYXBwZXIoJXApIiwgdGhpcyk7CisgICAgLy8g
SGFzaE1hcCBkb2Vzbid0IGxpa2UgYSBrZXkgb2YgMC4KKyAgICBpZiAoIW1fb2JqZWN0SUQpCisg
ICAgICAgIG1fb2JqZWN0SUQgPSBzX25leHRBVkZXcmFwcGVyT2JqZWN0SUQrKzsKKyAgICAKKyAg
ICBMT0coTWVkaWEsICJBVkZXcmFwcGVyOjpBVkZXcmFwcGVyKCVwICVkKSIsIHRoaXMsIG1fb2Jq
ZWN0SUQpOwogCiAgICAgbV9ub3RpZmljYXRpb25RdWV1ZSA9IGRpc3BhdGNoX3F1ZXVlX2NyZWF0
ZSgiTWVkaWFQbGF5ZXJQcml2YXRlQVZGb3VuZGF0aW9uQ0Yubm90aWZpY2F0aW9uUXVldWUiLCAw
KTsKKyAgICBhZGRUb0FWRldyYXBwZXJNYXAoKTsKIH0KIAogQVZGV3JhcHBlcjo6fkFWRldyYXBw
ZXIoKQogewotICAgIExPRyhNZWRpYSwgIkFWRldyYXBwZXI6On5BVkZXcmFwcGVyKCVwKSIsIHRo
aXMpOwotICAgIEFTU0VSVCghbV9vd25lcik7CisgICAgTE9HKE1lZGlhLCAiQVZGV3JhcHBlcjo6
fkFWRldyYXBwZXIoJXAgJWQpIiwgdGhpcywgbV9vYmplY3RJRCk7CiAKICAgICBkZXN0cm95Vmlk
ZW9MYXllcigpOwogICAgIGRlc3Ryb3lJbWFnZUdlbmVyYXRvcigpOwpAQCAtODcyLDEwICs4ODks
NDkgQEAgQVZGV3JhcHBlcjo6fkFWRldyYXBwZXIoKQogICAgIG1fYXZQbGF5ZXIgPSAwOwogfQog
CitNdXRleCYgQVZGV3JhcHBlcjo6YXZmV3JhcHBlck1hcExvY2soKQoreworICAgIHN0YXRpYyBN
dXRleCBhdmZXcmFwcGVyTWFwTG9jazsKKyAgICByZXR1cm4gYXZmV3JhcHBlck1hcExvY2s7Cit9
CisKK0hhc2hNYXA8dWludHB0cl90LCBBVkZXcmFwcGVyKj4mIEFWRldyYXBwZXI6OmF2ZldyYXBw
ZXJNYXAoKQoreworICAgIHN0YXRpYyBIYXNoTWFwPHVpbnRwdHJfdCwgQVZGV3JhcHBlcio+JiBh
dmZXcmFwcGVyTWFwID0gKm5ldyBIYXNoTWFwPHVpbnRwdHJfdCwgQVZGV3JhcHBlcio+OworICAg
IHJldHVybiBhdmZXcmFwcGVyTWFwOworfQorCit2b2lkIEFWRldyYXBwZXI6OmFkZFRvQVZGV3Jh
cHBlck1hcCgpCit7CisgICAgTE9HKE1lZGlhLCAiQVZGV3JhcHBlcjo6YWRkVG9BVkZXcmFwcGVy
TWFwKCVwICVkKSIsIHRoaXMsIG1fb2JqZWN0SUQpOworCisgICAgTXV0ZXhMb2NrZXIgbG9ja2Vy
KGF2ZldyYXBwZXJNYXBMb2NrKCkpOworICAgIGF2ZldyYXBwZXJNYXAoKS5hZGQobV9vYmplY3RJ
RCwgdGhpcyk7Cit9CisKK3ZvaWQgQVZGV3JhcHBlcjo6cmVtb3ZlRnJvbUFWRldyYXBwZXJNYXAo
KSBjb25zdAoreworICAgIExPRyhNZWRpYSwgIkFWRldyYXBwZXI6OnJlbW92ZUZyb21BVkZXcmFw
cGVyTWFwKCVwICVkKSIsIHRoaXMsIG1fb2JqZWN0SUQpOworCisgICAgTXV0ZXhMb2NrZXIgbG9j
a2VyKGF2ZldyYXBwZXJNYXBMb2NrKCkpOworICAgIGF2ZldyYXBwZXJNYXAoKS5yZW1vdmUobV9v
YmplY3RJRCk7Cit9CisKK0FWRldyYXBwZXIqIEFWRldyYXBwZXI6OmF2ZldyYXBwZXJGb3JDYWxs
YmFja0NvbnRleHQodm9pZCogY29udGV4dCkKK3sKKyAgICAvLyBBc3N1bWVzIGNhbGxlciBoYXMg
bG9ja2VkIGF2ZldyYXBwZXJNYXBMb2NrKCkuICAgIAorICAgIEhhc2hNYXA8dWludHB0cl90LCBB
VkZXcmFwcGVyKj46Oml0ZXJhdG9yIGl0ID0gYXZmV3JhcHBlck1hcCgpLmZpbmQocmVpbnRlcnBy
ZXRfY2FzdDx1aW50cHRyX3Q+KGNvbnRleHQpKTsKKyAgICBpZiAoaXQgPT0gYXZmV3JhcHBlck1h
cCgpLmVuZCgpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiBpdC0+c2Vjb25kOwor
fQorCiB2b2lkIEFWRldyYXBwZXI6OnNjaGVkdWxlRGlzY29ubmVjdEFuZERlbGV0ZSgpCiB7CiAg
ICAgLy8gSWdub3JlIGFueSBzdWJzZXF1ZW50IG5vdGlmaWNhdGlvbnMgd2UgbWlnaHQgcmVjZWl2
ZSBpbiBub3RpZmljYXRpb25DYWxsYmFjaygpLgotICAgIG1fb3duZXIgPSAwOworICAgIHJlbW92
ZUZyb21BVkZXcmFwcGVyTWFwKCk7CisKICAgICBkaXNwYXRjaF9hc3luY19mKGRpc3BhdGNoUXVl
dWUoKSwgdGhpcywgZGlzY29ubmVjdEFuZERlbGV0ZUFWRldyYXBwZXIpOwogfQogCkBAIC04ODcs
NTAgKzk0MywyNSBAQCB2b2lkIEFWRldyYXBwZXI6OmRpc2Nvbm5lY3RBbmREZWxldGVBVkZXCiAK
ICAgICBpZiAoYXZmV3JhcHBlci0+YXZQbGF5ZXJJdGVtKCkpIHsKICAgICAgICAgQ0ZOb3RpZmlj
YXRpb25DZW50ZXJSZWYgY2VudGVyID0gQ0ZOb3RpZmljYXRpb25DZW50ZXJHZXRMb2NhbENlbnRl
cigpOwotICAgICAgICBDRk5vdGlmaWNhdGlvbkNlbnRlclJlbW92ZU9ic2VydmVyKGNlbnRlciwg
YXZmV3JhcHBlciwgQVZDRlBsYXllckl0ZW1EaWRQbGF5VG9FbmRUaW1lTm90aWZpY2F0aW9uLCBh
dmZXcmFwcGVyLT5hdlBsYXllckl0ZW0oKSk7Ci0gICAgICAgIENGTm90aWZpY2F0aW9uQ2VudGVy
UmVtb3ZlT2JzZXJ2ZXIoY2VudGVyLCBhdmZXcmFwcGVyLCBBVkNGUGxheWVySXRlbVN0YXR1c0No
YW5nZWROb3RpZmljYXRpb24sIGF2ZldyYXBwZXItPmF2UGxheWVySXRlbSgpKTsKLSAgICAgICAg
Q0ZOb3RpZmljYXRpb25DZW50ZXJSZW1vdmVPYnNlcnZlcihjZW50ZXIsIGF2ZldyYXBwZXIsIEFW
Q0ZQbGF5ZXJJdGVtVHJhY2tzQ2hhbmdlZE5vdGlmaWNhdGlvbiwgYXZmV3JhcHBlci0+YXZQbGF5
ZXJJdGVtKCkpOwotICAgICAgICBDRk5vdGlmaWNhdGlvbkNlbnRlclJlbW92ZU9ic2VydmVyKGNl
bnRlciwgYXZmV3JhcHBlciwgQVZDRlBsYXllckl0ZW1TZWVrYWJsZVRpbWVSYW5nZXNDaGFuZ2Vk
Tm90aWZpY2F0aW9uLCBhdmZXcmFwcGVyLT5hdlBsYXllckl0ZW0oKSk7Ci0gICAgICAgIENGTm90
aWZpY2F0aW9uQ2VudGVyUmVtb3ZlT2JzZXJ2ZXIoY2VudGVyLCBhdmZXcmFwcGVyLCBBVkNGUGxh
eWVySXRlbUxvYWRlZFRpbWVSYW5nZXNDaGFuZ2VkTm90aWZpY2F0aW9uLCBhdmZXcmFwcGVyLT5h
dlBsYXllckl0ZW0oKSk7Ci0gICAgICAgIENGTm90aWZpY2F0aW9uQ2VudGVyUmVtb3ZlT2JzZXJ2
ZXIoY2VudGVyLCBhdmZXcmFwcGVyLCBBVkNGUGxheWVySXRlbUlzUGxheWJhY2tMaWtlbHlUb0tl
ZXBVcENoYW5nZWROb3RpZmljYXRpb24sIGF2ZldyYXBwZXItPmF2UGxheWVySXRlbSgpKTsKLSAg
ICAgICAgQ0ZOb3RpZmljYXRpb25DZW50ZXJSZW1vdmVPYnNlcnZlcihjZW50ZXIsIGF2ZldyYXBw
ZXIsIEFWQ0ZQbGF5ZXJJdGVtSXNQbGF5YmFja0J1ZmZlckVtcHR5Q2hhbmdlZE5vdGlmaWNhdGlv
biwgYXZmV3JhcHBlci0+YXZQbGF5ZXJJdGVtKCkpOwotICAgICAgICBDRk5vdGlmaWNhdGlvbkNl
bnRlclJlbW92ZU9ic2VydmVyKGNlbnRlciwgYXZmV3JhcHBlciwgQVZDRlBsYXllckl0ZW1Jc1Bs
YXliYWNrQnVmZmVyRnVsbENoYW5nZWROb3RpZmljYXRpb24sIGF2ZldyYXBwZXItPmF2UGxheWVy
SXRlbSgpKTsKLSAgICAgICAgQ0ZOb3RpZmljYXRpb25DZW50ZXJSZW1vdmVPYnNlcnZlcihjZW50
ZXIsIGF2ZldyYXBwZXIsIENBQ0ZDb250ZXh0TmVlZHNGbHVzaE5vdGlmaWNhdGlvbigpLCAwKTsK
KyAgICAgICAgQ0ZOb3RpZmljYXRpb25DZW50ZXJSZW1vdmVPYnNlcnZlcihjZW50ZXIsIGF2Zldy
YXBwZXItPmNhbGxiYWNrQ29udGV4dCgpLCBBVkNGUGxheWVySXRlbURpZFBsYXlUb0VuZFRpbWVO
b3RpZmljYXRpb24sIGF2ZldyYXBwZXItPmF2UGxheWVySXRlbSgpKTsKKyAgICAgICAgQ0ZOb3Rp
ZmljYXRpb25DZW50ZXJSZW1vdmVPYnNlcnZlcihjZW50ZXIsIGF2ZldyYXBwZXItPmNhbGxiYWNr
Q29udGV4dCgpLCBBVkNGUGxheWVySXRlbVN0YXR1c0NoYW5nZWROb3RpZmljYXRpb24sIGF2Zldy
YXBwZXItPmF2UGxheWVySXRlbSgpKTsKKyAgICAgICAgQ0ZOb3RpZmljYXRpb25DZW50ZXJSZW1v
dmVPYnNlcnZlcihjZW50ZXIsIGF2ZldyYXBwZXItPmNhbGxiYWNrQ29udGV4dCgpLCBBVkNGUGxh
eWVySXRlbVRyYWNrc0NoYW5nZWROb3RpZmljYXRpb24sIGF2ZldyYXBwZXItPmF2UGxheWVySXRl
bSgpKTsKKyAgICAgICAgQ0ZOb3RpZmljYXRpb25DZW50ZXJSZW1vdmVPYnNlcnZlcihjZW50ZXIs
IGF2ZldyYXBwZXItPmNhbGxiYWNrQ29udGV4dCgpLCBBVkNGUGxheWVySXRlbVNlZWthYmxlVGlt
ZVJhbmdlc0NoYW5nZWROb3RpZmljYXRpb24sIGF2ZldyYXBwZXItPmF2UGxheWVySXRlbSgpKTsK
KyAgICAgICAgQ0ZOb3RpZmljYXRpb25DZW50ZXJSZW1vdmVPYnNlcnZlcihjZW50ZXIsIGF2Zldy
YXBwZXItPmNhbGxiYWNrQ29udGV4dCgpLCBBVkNGUGxheWVySXRlbUxvYWRlZFRpbWVSYW5nZXND
aGFuZ2VkTm90aWZpY2F0aW9uLCBhdmZXcmFwcGVyLT5hdlBsYXllckl0ZW0oKSk7CisgICAgICAg
IENGTm90aWZpY2F0aW9uQ2VudGVyUmVtb3ZlT2JzZXJ2ZXIoY2VudGVyLCBhdmZXcmFwcGVyLT5j
YWxsYmFja0NvbnRleHQoKSwgQVZDRlBsYXllckl0ZW1Jc1BsYXliYWNrTGlrZWx5VG9LZWVwVXBD
aGFuZ2VkTm90aWZpY2F0aW9uLCBhdmZXcmFwcGVyLT5hdlBsYXllckl0ZW0oKSk7CisgICAgICAg
IENGTm90aWZpY2F0aW9uQ2VudGVyUmVtb3ZlT2JzZXJ2ZXIoY2VudGVyLCBhdmZXcmFwcGVyLT5j
YWxsYmFja0NvbnRleHQoKSwgQVZDRlBsYXllckl0ZW1Jc1BsYXliYWNrQnVmZmVyRW1wdHlDaGFu
Z2VkTm90aWZpY2F0aW9uLCBhdmZXcmFwcGVyLT5hdlBsYXllckl0ZW0oKSk7CisgICAgICAgIENG
Tm90aWZpY2F0aW9uQ2VudGVyUmVtb3ZlT2JzZXJ2ZXIoY2VudGVyLCBhdmZXcmFwcGVyLT5jYWxs
YmFja0NvbnRleHQoKSwgQVZDRlBsYXllckl0ZW1Jc1BsYXliYWNrQnVmZmVyRnVsbENoYW5nZWRO
b3RpZmljYXRpb24sIGF2ZldyYXBwZXItPmF2UGxheWVySXRlbSgpKTsKKyAgICAgICAgQ0ZOb3Rp
ZmljYXRpb25DZW50ZXJSZW1vdmVPYnNlcnZlcihjZW50ZXIsIGF2ZldyYXBwZXItPmNhbGxiYWNr
Q29udGV4dCgpLCBDQUNGQ29udGV4dE5lZWRzRmx1c2hOb3RpZmljYXRpb24oKSwgMCk7CiAgICAg
fQogCiAgICAgaWYgKGF2ZldyYXBwZXItPmF2UGxheWVyKCkpIHsKICAgICAgICAgaWYgKGF2Zldy
YXBwZXItPnRpbWVPYnNlcnZlcigpKQogICAgICAgICAgICAgQVZDRlBsYXllclJlbW92ZU9ic2Vy
dmVyKGF2ZldyYXBwZXItPmF2UGxheWVyKCksIGF2ZldyYXBwZXItPnRpbWVPYnNlcnZlcigpKTsK
IAotICAgICAgICBDRk5vdGlmaWNhdGlvbkNlbnRlclJlbW92ZU9ic2VydmVyKENGTm90aWZpY2F0
aW9uQ2VudGVyR2V0TG9jYWxDZW50ZXIoKSwgYXZmV3JhcHBlciwgQVZDRlBsYXllclJhdGVDaGFu
Z2VkTm90aWZpY2F0aW9uLCBhdmZXcmFwcGVyLT5hdlBsYXllcigpKTsKLSAgICB9Ci0KLSAgICBk
aXNwYXRjaF9hc3luY19mKGF2ZldyYXBwZXItPmRpc3BhdGNoUXVldWUoKSwgYXZmV3JhcHBlciwg
ZGVsZXRlQVZGV3JhcHBlcik7Ci19Ci0KLXZvaWQgQVZGV3JhcHBlcjo6ZGVsZXRlQVZGV3JhcHBl
cih2b2lkKiBjb250ZXh0KQotewotICAgIEFWRldyYXBwZXIqIGF2ZldyYXBwZXIgPSBzdGF0aWNf
Y2FzdDxBVkZXcmFwcGVyKj4oY29udGV4dCk7Ci0gICAgTE9HKE1lZGlhLCAiQVZGV3JhcHBlcjo6
ZGVsZXRlQVZGV3JhcHBlciglcCkiLCBhdmZXcmFwcGVyKTsKLSAgICAKLSAgICAvLyBGSVhNRTog
TGVhayBBVkZXcmFwcGVyIHVudGlsIDxyZGFyOi8vcHJvYmxlbS85ODg1NTA1PiBpcyBmaXhlZCwg
YnV0IGNsZWFuIHVwIGl0cyBpdmFycy4KLSAgICAvLyBkZWxldGUgYXZmV3JhcHBlcjsKLSAgICBh
dmZXcmFwcGVyLT5kZXN0cm95VmlkZW9MYXllcigpOwotICAgIGF2ZldyYXBwZXItPmRlc3Ryb3lJ
bWFnZUdlbmVyYXRvcigpOwotCi0gICAgaWYgKGF2ZldyYXBwZXItPm1fbm90aWZpY2F0aW9uUXVl
dWUpIHsKLSAgICAgICAgZGlzcGF0Y2hfcmVsZWFzZShhdmZXcmFwcGVyLT5tX25vdGlmaWNhdGlv
blF1ZXVlKTsKLSAgICAgICAgYXZmV3JhcHBlci0+bV9ub3RpZmljYXRpb25RdWV1ZSA9IDA7Ci0g
ICAgfQotCi0gICAgaWYgKGF2ZldyYXBwZXItPmF2QXNzZXQoKSkgewotICAgICAgICBBVkNGQXNz
ZXRDYW5jZWxMb2FkaW5nKGF2ZldyYXBwZXItPmF2QXNzZXQoKSk7Ci0gICAgICAgIGF2ZldyYXBw
ZXItPm1fYXZBc3NldCA9IDA7CisgICAgICAgIENGTm90aWZpY2F0aW9uQ2VudGVyUmVtb3ZlT2Jz
ZXJ2ZXIoQ0ZOb3RpZmljYXRpb25DZW50ZXJHZXRMb2NhbENlbnRlcigpLCBhdmZXcmFwcGVyLT5j
YWxsYmFja0NvbnRleHQoKSwgQVZDRlBsYXllclJhdGVDaGFuZ2VkTm90aWZpY2F0aW9uLCBhdmZX
cmFwcGVyLT5hdlBsYXllcigpKTsKICAgICB9CiAKLSAgICBhdmZXcmFwcGVyLT5tX2F2UGxheWVy
SXRlbSA9IDA7Ci0gICAgYXZmV3JhcHBlci0+bV90aW1lT2JzZXJ2ZXIgPSAwOwotICAgIGF2Zldy
YXBwZXItPm1fYXZQbGF5ZXIgPSAwOworICAgIGRlbGV0ZSBhdmZXcmFwcGVyOwogfQogCiB2b2lk
IEFWRldyYXBwZXI6OmNyZWF0ZUFzc2V0Rm9yVVJMKGNvbnN0IFN0cmluZyYgdXJsKQpAQCAtOTUz
LDEyICs5ODQsMTIgQEAgdm9pZCBBVkZXcmFwcGVyOjpjcmVhdGVQbGF5ZXIoKQogICAgIENGTm90
aWZpY2F0aW9uQ2VudGVyUmVmIGNlbnRlciA9IENGTm90aWZpY2F0aW9uQ2VudGVyR2V0TG9jYWxD
ZW50ZXIoKTsKICAgICBBU1NFUlQoY2VudGVyKTsKIAotICAgIENGTm90aWZpY2F0aW9uQ2VudGVy
QWRkT2JzZXJ2ZXIoY2VudGVyLCB0aGlzLCBub3RpZmljYXRpb25DYWxsYmFjaywgQVZDRlBsYXll
clJhdGVDaGFuZ2VkTm90aWZpY2F0aW9uLCBwbGF5ZXJSZWYsIENGTm90aWZpY2F0aW9uU3VzcGVu
c2lvbkJlaGF2aW9yRGVsaXZlckltbWVkaWF0ZWx5KTsKKyAgICBDRk5vdGlmaWNhdGlvbkNlbnRl
ckFkZE9ic2VydmVyKGNlbnRlciwgY2FsbGJhY2tDb250ZXh0KCksIG5vdGlmaWNhdGlvbkNhbGxi
YWNrLCBBVkNGUGxheWVyUmF0ZUNoYW5nZWROb3RpZmljYXRpb24sIHBsYXllclJlZiwgQ0ZOb3Rp
ZmljYXRpb25TdXNwZW5zaW9uQmVoYXZpb3JEZWxpdmVySW1tZWRpYXRlbHkpOwogCiAgICAgLy8g
QWRkIGEgdGltZSBvYnNlcnZlciwgYXNrIHRvIGJlIGNhbGxlZCBpbmZyZXF1ZW50bHkgYmVjYXVz
ZSB3ZSBkb24ndCByZWFsbHkgd2FudCBwZXJpb2RpYyBjYWxsYmFja3MgYnV0CiAgICAgLy8gb3Vy
IG9ic2VydmVyIHdpbGwgYWxzbyBiZSBjYWxsZWQgd2hlbmV2ZXIgYSBzZWVrIGhhcHBlbnMuCiAg
ICAgY29uc3QgZG91YmxlIHZlcnlMb25nSW50ZXJ2YWwgPSA2MCo2MCo2MCoyNCozMDsKLSAgICBt
X3RpbWVPYnNlcnZlci5hZG9wdENGKEFWQ0ZQbGF5ZXJDcmVhdGVQZXJpb2RpY1RpbWVPYnNlcnZl
ckZvckludGVydmFsKHBsYXllclJlZiwgQ01UaW1lTWFrZSh2ZXJ5TG9uZ0ludGVydmFsLCAxMCks
IG1fbm90aWZpY2F0aW9uUXVldWUsICZwZXJpb2RpY1RpbWVPYnNlcnZlckNhbGxiYWNrLCB0aGlz
KSk7CisgICAgbV90aW1lT2JzZXJ2ZXIuYWRvcHRDRihBVkNGUGxheWVyQ3JlYXRlUGVyaW9kaWNU
aW1lT2JzZXJ2ZXJGb3JJbnRlcnZhbChwbGF5ZXJSZWYsIENNVGltZU1ha2UodmVyeUxvbmdJbnRl
cnZhbCwgMTApLCBtX25vdGlmaWNhdGlvblF1ZXVlLCAmcGVyaW9kaWNUaW1lT2JzZXJ2ZXJDYWxs
YmFjaywgY2FsbGJhY2tDb250ZXh0KCkpKTsKIH0KIAogdm9pZCBBVkZXcmFwcGVyOjpjcmVhdGVQ
bGF5ZXJJdGVtKCkKQEAgLTk3MiwyMyArMTAwMywyNiBAQCB2b2lkIEFWRldyYXBwZXI6OmNyZWF0
ZVBsYXllckl0ZW0oKQogICAgIENGTm90aWZpY2F0aW9uQ2VudGVyUmVmIGNlbnRlciA9IENGTm90
aWZpY2F0aW9uQ2VudGVyR2V0TG9jYWxDZW50ZXIoKTsKICAgICBBU1NFUlQoY2VudGVyKTsKIAot
ICAgIENGTm90aWZpY2F0aW9uQ2VudGVyQWRkT2JzZXJ2ZXIoY2VudGVyLCB0aGlzLCBub3RpZmlj
YXRpb25DYWxsYmFjaywgQVZDRlBsYXllckl0ZW1EaWRQbGF5VG9FbmRUaW1lTm90aWZpY2F0aW9u
LCBpdGVtUmVmLCBDRk5vdGlmaWNhdGlvblN1c3BlbnNpb25CZWhhdmlvckRlbGl2ZXJJbW1lZGlh
dGVseSk7Ci0gICAgQ0ZOb3RpZmljYXRpb25DZW50ZXJBZGRPYnNlcnZlcihjZW50ZXIsIHRoaXMs
IG5vdGlmaWNhdGlvbkNhbGxiYWNrLCBBVkNGUGxheWVySXRlbVN0YXR1c0NoYW5nZWROb3RpZmlj
YXRpb24sIGl0ZW1SZWYsIENGTm90aWZpY2F0aW9uU3VzcGVuc2lvbkJlaGF2aW9yRGVsaXZlcklt
bWVkaWF0ZWx5KTsKLSAgICBDRk5vdGlmaWNhdGlvbkNlbnRlckFkZE9ic2VydmVyKGNlbnRlciwg
dGhpcywgbm90aWZpY2F0aW9uQ2FsbGJhY2ssIEFWQ0ZQbGF5ZXJJdGVtVHJhY2tzQ2hhbmdlZE5v
dGlmaWNhdGlvbiwgaXRlbVJlZiwgQ0ZOb3RpZmljYXRpb25TdXNwZW5zaW9uQmVoYXZpb3JEZWxp
dmVySW1tZWRpYXRlbHkpOwotICAgIENGTm90aWZpY2F0aW9uQ2VudGVyQWRkT2JzZXJ2ZXIoY2Vu
dGVyLCB0aGlzLCBub3RpZmljYXRpb25DYWxsYmFjaywgQVZDRlBsYXllckl0ZW1TZWVrYWJsZVRp
bWVSYW5nZXNDaGFuZ2VkTm90aWZpY2F0aW9uLCBpdGVtUmVmLCBDRk5vdGlmaWNhdGlvblN1c3Bl
bnNpb25CZWhhdmlvckRlbGl2ZXJJbW1lZGlhdGVseSk7Ci0gICAgQ0ZOb3RpZmljYXRpb25DZW50
ZXJBZGRPYnNlcnZlcihjZW50ZXIsIHRoaXMsIG5vdGlmaWNhdGlvbkNhbGxiYWNrLCBBVkNGUGxh
eWVySXRlbUxvYWRlZFRpbWVSYW5nZXNDaGFuZ2VkTm90aWZpY2F0aW9uLCBpdGVtUmVmLCBDRk5v
dGlmaWNhdGlvblN1c3BlbnNpb25CZWhhdmlvckRlbGl2ZXJJbW1lZGlhdGVseSk7Ci0gICAgQ0ZO
b3RpZmljYXRpb25DZW50ZXJBZGRPYnNlcnZlcihjZW50ZXIsIHRoaXMsIG5vdGlmaWNhdGlvbkNh
bGxiYWNrLCBBVkNGUGxheWVySXRlbUlzUGxheWJhY2tMaWtlbHlUb0tlZXBVcENoYW5nZWROb3Rp
ZmljYXRpb24sIGl0ZW1SZWYsIENGTm90aWZpY2F0aW9uU3VzcGVuc2lvbkJlaGF2aW9yRGVsaXZl
ckltbWVkaWF0ZWx5KTsKLSAgICBDRk5vdGlmaWNhdGlvbkNlbnRlckFkZE9ic2VydmVyKGNlbnRl
ciwgdGhpcywgbm90aWZpY2F0aW9uQ2FsbGJhY2ssIEFWQ0ZQbGF5ZXJJdGVtSXNQbGF5YmFja0J1
ZmZlckVtcHR5Q2hhbmdlZE5vdGlmaWNhdGlvbiwgaXRlbVJlZiwgQ0ZOb3RpZmljYXRpb25TdXNw
ZW5zaW9uQmVoYXZpb3JEZWxpdmVySW1tZWRpYXRlbHkpOwotICAgIENGTm90aWZpY2F0aW9uQ2Vu
dGVyQWRkT2JzZXJ2ZXIoY2VudGVyLCB0aGlzLCBub3RpZmljYXRpb25DYWxsYmFjaywgQVZDRlBs
YXllckl0ZW1Jc1BsYXliYWNrQnVmZmVyRnVsbENoYW5nZWROb3RpZmljYXRpb24sIGl0ZW1SZWYs
IENGTm90aWZpY2F0aW9uU3VzcGVuc2lvbkJlaGF2aW9yRGVsaXZlckltbWVkaWF0ZWx5KTsKKyAg
ICBDRk5vdGlmaWNhdGlvbkNlbnRlckFkZE9ic2VydmVyKGNlbnRlciwgY2FsbGJhY2tDb250ZXh0
KCksIG5vdGlmaWNhdGlvbkNhbGxiYWNrLCBBVkNGUGxheWVySXRlbURpZFBsYXlUb0VuZFRpbWVO
b3RpZmljYXRpb24sIGl0ZW1SZWYsIENGTm90aWZpY2F0aW9uU3VzcGVuc2lvbkJlaGF2aW9yRGVs
aXZlckltbWVkaWF0ZWx5KTsKKyAgICBDRk5vdGlmaWNhdGlvbkNlbnRlckFkZE9ic2VydmVyKGNl
bnRlciwgY2FsbGJhY2tDb250ZXh0KCksIG5vdGlmaWNhdGlvbkNhbGxiYWNrLCBBVkNGUGxheWVy
SXRlbVN0YXR1c0NoYW5nZWROb3RpZmljYXRpb24sIGl0ZW1SZWYsIENGTm90aWZpY2F0aW9uU3Vz
cGVuc2lvbkJlaGF2aW9yRGVsaXZlckltbWVkaWF0ZWx5KTsKKyAgICBDRk5vdGlmaWNhdGlvbkNl
bnRlckFkZE9ic2VydmVyKGNlbnRlciwgY2FsbGJhY2tDb250ZXh0KCksIG5vdGlmaWNhdGlvbkNh
bGxiYWNrLCBBVkNGUGxheWVySXRlbVRyYWNrc0NoYW5nZWROb3RpZmljYXRpb24sIGl0ZW1SZWYs
IENGTm90aWZpY2F0aW9uU3VzcGVuc2lvbkJlaGF2aW9yRGVsaXZlckltbWVkaWF0ZWx5KTsKKyAg
ICBDRk5vdGlmaWNhdGlvbkNlbnRlckFkZE9ic2VydmVyKGNlbnRlciwgY2FsbGJhY2tDb250ZXh0
KCksIG5vdGlmaWNhdGlvbkNhbGxiYWNrLCBBVkNGUGxheWVySXRlbVNlZWthYmxlVGltZVJhbmdl
c0NoYW5nZWROb3RpZmljYXRpb24sIGl0ZW1SZWYsIENGTm90aWZpY2F0aW9uU3VzcGVuc2lvbkJl
aGF2aW9yRGVsaXZlckltbWVkaWF0ZWx5KTsKKyAgICBDRk5vdGlmaWNhdGlvbkNlbnRlckFkZE9i
c2VydmVyKGNlbnRlciwgY2FsbGJhY2tDb250ZXh0KCksIG5vdGlmaWNhdGlvbkNhbGxiYWNrLCBB
VkNGUGxheWVySXRlbUxvYWRlZFRpbWVSYW5nZXNDaGFuZ2VkTm90aWZpY2F0aW9uLCBpdGVtUmVm
LCBDRk5vdGlmaWNhdGlvblN1c3BlbnNpb25CZWhhdmlvckRlbGl2ZXJJbW1lZGlhdGVseSk7Cisg
ICAgQ0ZOb3RpZmljYXRpb25DZW50ZXJBZGRPYnNlcnZlcihjZW50ZXIsIGNhbGxiYWNrQ29udGV4
dCgpLCBub3RpZmljYXRpb25DYWxsYmFjaywgQVZDRlBsYXllckl0ZW1Jc1BsYXliYWNrTGlrZWx5
VG9LZWVwVXBDaGFuZ2VkTm90aWZpY2F0aW9uLCBpdGVtUmVmLCBDRk5vdGlmaWNhdGlvblN1c3Bl
bnNpb25CZWhhdmlvckRlbGl2ZXJJbW1lZGlhdGVseSk7CisgICAgQ0ZOb3RpZmljYXRpb25DZW50
ZXJBZGRPYnNlcnZlcihjZW50ZXIsIGNhbGxiYWNrQ29udGV4dCgpLCBub3RpZmljYXRpb25DYWxs
YmFjaywgQVZDRlBsYXllckl0ZW1Jc1BsYXliYWNrQnVmZmVyRW1wdHlDaGFuZ2VkTm90aWZpY2F0
aW9uLCBpdGVtUmVmLCBDRk5vdGlmaWNhdGlvblN1c3BlbnNpb25CZWhhdmlvckRlbGl2ZXJJbW1l
ZGlhdGVseSk7CisgICAgQ0ZOb3RpZmljYXRpb25DZW50ZXJBZGRPYnNlcnZlcihjZW50ZXIsIGNh
bGxiYWNrQ29udGV4dCgpLCBub3RpZmljYXRpb25DYWxsYmFjaywgQVZDRlBsYXllckl0ZW1Jc1Bs
YXliYWNrQnVmZmVyRnVsbENoYW5nZWROb3RpZmljYXRpb24sIGl0ZW1SZWYsIENGTm90aWZpY2F0
aW9uU3VzcGVuc2lvbkJlaGF2aW9yRGVsaXZlckltbWVkaWF0ZWx5KTsKIAotICAgIENGTm90aWZp
Y2F0aW9uQ2VudGVyQWRkT2JzZXJ2ZXIoY2VudGVyLCB0aGlzLCBub3RpZmljYXRpb25DYWxsYmFj
aywgQ0FDRkNvbnRleHROZWVkc0ZsdXNoTm90aWZpY2F0aW9uKCksIDAsIENGTm90aWZpY2F0aW9u
U3VzcGVuc2lvbkJlaGF2aW9yRGVsaXZlckltbWVkaWF0ZWx5KTsKKyAgICBDRk5vdGlmaWNhdGlv
bkNlbnRlckFkZE9ic2VydmVyKGNlbnRlciwgY2FsbGJhY2tDb250ZXh0KCksIG5vdGlmaWNhdGlv
bkNhbGxiYWNrLCBDQUNGQ29udGV4dE5lZWRzRmx1c2hOb3RpZmljYXRpb24oKSwgMCwgQ0ZOb3Rp
ZmljYXRpb25TdXNwZW5zaW9uQmVoYXZpb3JEZWxpdmVySW1tZWRpYXRlbHkpOwogfQogCiB2b2lk
IEFWRldyYXBwZXI6OnBlcmlvZGljVGltZU9ic2VydmVyQ2FsbGJhY2soQVZDRlBsYXllclJlZiwg
Q01UaW1lIGNtVGltZSwgdm9pZCogY29udGV4dCkKIHsKLSAgICBBVkZXcmFwcGVyKiBzZWxmID0g
c3RhdGljX2Nhc3Q8QVZGV3JhcHBlcio+KGNvbnRleHQpOwotICAgIGlmICghc2VsZi0+bV9vd25l
cikKKyAgICBNdXRleExvY2tlciBsb2NrZXIoYXZmV3JhcHBlck1hcExvY2soKSk7CisgICAgQVZG
V3JhcHBlciogc2VsZiA9IGF2ZldyYXBwZXJGb3JDYWxsYmFja0NvbnRleHQoY29udGV4dCk7Cisg
ICAgaWYgKCFzZWxmKSB7CisgICAgICAgIExPRyhNZWRpYSwgIkFWRldyYXBwZXI6OnBlcmlvZGlj
VGltZU9ic2VydmVyQ2FsbGJhY2sgaW52b2tlZCBmb3IgZGVsZXRlZCBBVkZXcmFwcGVyICVkIiwg
cmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KGNvbnRleHQpKTsKICAgICAgICAgcmV0dXJuOwor
ICAgIH0KIAogICAgIGRvdWJsZSB0aW1lID0gc3RkOjptYXgoMC4wLCBDTVRpbWVHZXRTZWNvbmRz
KGNtVGltZSkpOyAvLyBDbGFtcCB0byB6ZXJvLCBuZWdhdGl2ZSB2YWx1ZXMgYXJlIHNvbWV0aW1l
cyByZXBvcnRlZC4KICAgICBzZWxmLT5tX293bmVyLT5zY2hlZHVsZU1haW5UaHJlYWROb3RpZmlj
YXRpb24oTWVkaWFQbGF5ZXJQcml2YXRlQVZGb3VuZGF0aW9uOjpOb3RpZmljYXRpb246OlBsYXll
clRpbWVDaGFuZ2VkLCB0aW1lKTsKQEAgLTk5NiwxMCArMTAzMCwxMyBAQCB2b2lkIEFWRldyYXBw
ZXI6OnBlcmlvZGljVGltZU9ic2VydmVyQ2FsCiAKIHZvaWQgQVZGV3JhcHBlcjo6bm90aWZpY2F0
aW9uQ2FsbGJhY2soQ0ZOb3RpZmljYXRpb25DZW50ZXJSZWYsIHZvaWQqIG9ic2VydmVyLCBDRlN0
cmluZ1JlZiBwcm9wZXJ0eU5hbWUsIGNvbnN0IHZvaWQqIG9iamVjdCwgQ0ZEaWN0aW9uYXJ5UmVm
KQogewotICAgIEFWRldyYXBwZXIqIHNlbGYgPSBzdGF0aWNfY2FzdDxBVkZXcmFwcGVyKj4ob2Jz
ZXJ2ZXIpOworICAgIE11dGV4TG9ja2VyIGxvY2tlcihhdmZXcmFwcGVyTWFwTG9jaygpKTsKKyAg
ICBBVkZXcmFwcGVyKiBzZWxmID0gYXZmV3JhcHBlckZvckNhbGxiYWNrQ29udGV4dChvYnNlcnZl
cik7CiAgICAgCi0gICAgaWYgKCFzZWxmLT5tX293bmVyKQorICAgIGlmICghc2VsZikgeworICAg
ICAgICBMT0coTWVkaWEsICJBVkZXcmFwcGVyOjpub3RpZmljYXRpb25DYWxsYmFjayBpbnZva2Vk
IGZvciBkZWxldGVkIEFWRldyYXBwZXIgJWQiLCByZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4o
b2JzZXJ2ZXIpKTsKICAgICAgICAgcmV0dXJuOworICAgIH0KIAogICAgIExPRyhNZWRpYSwgIkFW
RldyYXBwZXI6Om5vdGlmaWNhdGlvbkNhbGxiYWNrKCVwKSIsIHNlbGYpOwogCkBAIC0xMDM0LDEw
ICsxMDcxLDE0IEBAIHZvaWQgQVZGV3JhcHBlcjo6bm90aWZpY2F0aW9uQ2FsbGJhY2soQ0YKIAog
dm9pZCBBVkZXcmFwcGVyOjpsb2FkUGxheWFibGVDb21wbGV0aW9uQ2FsbGJhY2soQVZDRkFzc2V0
UmVmLCB2b2lkKiBjb250ZXh0KQogewotICAgIEFWRldyYXBwZXIqIHNlbGYgPSBzdGF0aWNfY2Fz
dDxBVkZXcmFwcGVyKj4oY29udGV4dCk7Ci0KLSAgICBpZiAoIXNlbGYtPm1fb3duZXIpCisgICAg
TXV0ZXhMb2NrZXIgbG9ja2VyKGF2ZldyYXBwZXJNYXBMb2NrKCkpOworICAgIEFWRldyYXBwZXIq
IHNlbGYgPSBhdmZXcmFwcGVyRm9yQ2FsbGJhY2tDb250ZXh0KGNvbnRleHQpOworICAgIGlmICgh
c2VsZikgeworICAgICAgICBMT0coTWVkaWEsICJBVkZXcmFwcGVyOjpsb2FkUGxheWFibGVDb21w
bGV0aW9uQ2FsbGJhY2sgaW52b2tlZCBmb3IgZGVsZXRlZCBBVkZXcmFwcGVyICVkIiwgcmVpbnRl
cnByZXRfY2FzdDx1aW50cHRyX3Q+KGNvbnRleHQpKTsKICAgICAgICAgcmV0dXJuOworICAgIH0K
KworICAgIExPRyhNZWRpYSwgIkFWRldyYXBwZXI6OmxvYWRQbGF5YWJsZUNvbXBsZXRpb25DYWxs
YmFjayglcCkiLCBzZWxmKTsKICAgICBzZWxmLT5tX293bmVyLT5zY2hlZHVsZU1haW5UaHJlYWRO
b3RpZmljYXRpb24oTWVkaWFQbGF5ZXJQcml2YXRlQVZGb3VuZGF0aW9uOjpOb3RpZmljYXRpb246
OkFzc2V0UGxheWFiaWxpdHlLbm93bik7CiB9CiAKQEAgLTEwNTMsMTYgKzEwOTQsMTkgQEAgdm9p
ZCBBVkZXcmFwcGVyOjpjaGVja1BsYXlhYmlsaXR5KCkKICAgICAgICAgcHJvcGVydHlLZXlOYW1l
ID0gQ0ZBcnJheUNyZWF0ZSgwLCAoY29uc3Qgdm9pZCoqKWtleU5hbWVzLCBzaXplb2Yoa2V5TmFt
ZXMpIC8gc2l6ZW9mKGtleU5hbWVzWzBdKSwgJmtDRlR5cGVBcnJheUNhbGxCYWNrcyk7CiAgICAg
fQogCi0gICAgQVZDRkFzc2V0TG9hZFZhbHVlc0FzeW5jaHJvbm91c2x5Rm9yUHJvcGVydGllcyhh
dkFzc2V0KCksIHByb3BlcnR5S2V5TmFtZSwgbG9hZFBsYXlhYmxlQ29tcGxldGlvbkNhbGxiYWNr
LCB0aGlzKTsKKyAgICBBVkNGQXNzZXRMb2FkVmFsdWVzQXN5bmNocm9ub3VzbHlGb3JQcm9wZXJ0
aWVzKGF2QXNzZXQoKSwgcHJvcGVydHlLZXlOYW1lLCBsb2FkUGxheWFibGVDb21wbGV0aW9uQ2Fs
bGJhY2ssIGNhbGxiYWNrQ29udGV4dCgpKTsKIH0KIAogdm9pZCBBVkZXcmFwcGVyOjpsb2FkTWV0
YWRhdGFDb21wbGV0aW9uQ2FsbGJhY2soQVZDRkFzc2V0UmVmLCB2b2lkKiBjb250ZXh0KQogewot
ICAgIExPRyhNZWRpYSwgIkFWRldyYXBwZXI6OmxvYWRNZXRhZGF0YUNvbXBsZXRpb25DYWxsYmFj
ayglcCkiLCBjb250ZXh0KTsKLSAgICBBVkZXcmFwcGVyKiBzZWxmID0gc3RhdGljX2Nhc3Q8QVZG
V3JhcHBlcio+KGNvbnRleHQpOwotCi0gICAgaWYgKCFzZWxmLT5tX293bmVyKQorICAgIE11dGV4
TG9ja2VyIGxvY2tlcihhdmZXcmFwcGVyTWFwTG9jaygpKTsKKyAgICBBVkZXcmFwcGVyKiBzZWxm
ID0gYXZmV3JhcHBlckZvckNhbGxiYWNrQ29udGV4dChjb250ZXh0KTsKKyAgICBpZiAoIXNlbGYp
IHsKKyAgICAgICAgTE9HKE1lZGlhLCAiQVZGV3JhcHBlcjo6bG9hZE1ldGFkYXRhQ29tcGxldGlv
bkNhbGxiYWNrIGludm9rZWQgZm9yIGRlbGV0ZWQgQVZGV3JhcHBlciAlZCIsIHJlaW50ZXJwcmV0
X2Nhc3Q8dWludHB0cl90Pihjb250ZXh0KSk7CiAgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAg
ICBMT0coTWVkaWEsICJBVkZXcmFwcGVyOjpsb2FkTWV0YWRhdGFDb21wbGV0aW9uQ2FsbGJhY2so
JXApIiwgc2VsZik7CiAgICAgc2VsZi0+bV9vd25lci0+c2NoZWR1bGVNYWluVGhyZWFkTm90aWZp
Y2F0aW9uKE1lZGlhUGxheWVyUHJpdmF0ZUFWRm91bmRhdGlvbjo6Tm90aWZpY2F0aW9uOjpBc3Nl
dE1ldGFkYXRhTG9hZGVkKTsKIH0KIApAQCAtMTA3MCwxNSArMTExNCwxOSBAQCB2b2lkIEFWRldy
YXBwZXI6OmJlZ2luTG9hZGluZ01ldGFkYXRhKCkKIHsKICAgICBBU1NFUlQoYXZBc3NldCgpKTsK
ICAgICBMT0coTWVkaWEsICJBVkZXcmFwcGVyOjpiZWdpbkxvYWRpbmdNZXRhZGF0YSglcCkgLSBy
ZXF1ZXN0aW5nIG1ldGFkYXRhIGxvYWRpbmciLCB0aGlzKTsKLSAgICBBVkNGQXNzZXRMb2FkVmFs
dWVzQXN5bmNocm9ub3VzbHlGb3JQcm9wZXJ0aWVzKGF2QXNzZXQoKSwgbWV0YWRhdGFLZXlOYW1l
cygpLCBsb2FkTWV0YWRhdGFDb21wbGV0aW9uQ2FsbGJhY2ssIHRoaXMpOworICAgIEFWQ0ZBc3Nl
dExvYWRWYWx1ZXNBc3luY2hyb25vdXNseUZvclByb3BlcnRpZXMoYXZBc3NldCgpLCBtZXRhZGF0
YUtleU5hbWVzKCksIGxvYWRNZXRhZGF0YUNvbXBsZXRpb25DYWxsYmFjaywgY2FsbGJhY2tDb250
ZXh0KCkpOwogfQogCiB2b2lkIEFWRldyYXBwZXI6OnNlZWtDb21wbGV0ZWRDYWxsYmFjayhBVkNG
UGxheWVySXRlbVJlZiwgQm9vbGVhbiBmaW5pc2hlZCwgdm9pZCogY29udGV4dCkKIHsKLSAgICBB
VkZXcmFwcGVyKiBzZWxmID0gc3RhdGljX2Nhc3Q8QVZGV3JhcHBlcio+KGNvbnRleHQpOwotICAg
IGlmICghc2VsZi0+bV9vd25lcikKKyAgICBNdXRleExvY2tlciBsb2NrZXIoYXZmV3JhcHBlck1h
cExvY2soKSk7CisgICAgQVZGV3JhcHBlciogc2VsZiA9IGF2ZldyYXBwZXJGb3JDYWxsYmFja0Nv
bnRleHQoY29udGV4dCk7CisgICAgaWYgKCFzZWxmKSB7CisgICAgICAgIExPRyhNZWRpYSwgIkFW
RldyYXBwZXI6OnNlZWtDb21wbGV0ZWRDYWxsYmFjayBpbnZva2VkIGZvciBkZWxldGVkIEFWRldy
YXBwZXIgJWQiLCByZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oY29udGV4dCkpOwogICAgICAg
ICByZXR1cm47CisgICAgfQogCisgICAgTE9HKE1lZGlhLCAiQVZGV3JhcHBlcjo6c2Vla0NvbXBs
ZXRlZENhbGxiYWNrKCVwKSIsIHNlbGYpOwogICAgIHNlbGYtPm1fb3duZXItPnNjaGVkdWxlTWFp
blRocmVhZE5vdGlmaWNhdGlvbihNZWRpYVBsYXllclByaXZhdGVBVkZvdW5kYXRpb246Ok5vdGlm
aWNhdGlvbjo6U2Vla0NvbXBsZXRlZCwgc3RhdGljX2Nhc3Q8Ym9vbD4oZmluaXNoZWQpKTsKIH0K
IApAQCAtMTA4Niw3ICsxMTM0LDcgQEAgdm9pZCBBVkZXcmFwcGVyOjpzZWVrVG9UaW1lKGZsb2F0
IHRpbWUpCiB7CiAgICAgQVNTRVJUKGF2UGxheWVySXRlbSgpKTsKICAgICBBVkNGUGxheWVySXRl
bVNlZWtUb1RpbWVXaXRoVG9sZXJhbmNlQW5kQ29tcGxldGlvbkNhbGxiYWNrKGF2UGxheWVySXRl
bSgpLCBDTVRpbWVNYWtlV2l0aFNlY29uZHModGltZSwgNjAwKSwKLSAgICAgICAga0NNVGltZVpl
cm8sIGtDTVRpbWVaZXJvLCAmc2Vla0NvbXBsZXRlZENhbGxiYWNrLCB0aGlzKTsKKyAgICAgICAg
a0NNVGltZVplcm8sIGtDTVRpbWVaZXJvLCAmc2Vla0NvbXBsZXRlZENhbGxiYWNrLCBjYWxsYmFj
a0NvbnRleHQoKSk7CiB9CiAKIHZvaWQgQVZGV3JhcHBlcjo6c2V0QXNzZXQoQVZDRlVSTEFzc2V0
UmVmIGFzc2V0KQpAQCAtMTEwMCw4ICsxMTQ4LDYgQEAgdm9pZCBBVkZXcmFwcGVyOjpzZXRBc3Nl
dChBVkNGVVJMQXNzZXRSZQogCiBQbGF0Zm9ybUxheWVyKiBBVkZXcmFwcGVyOjpwbGF0Zm9ybUxh
eWVyKCkKIHsKLSAgICBMT0coTWVkaWEsICJBVkZXcmFwcGVyOjpwbGF0Zm9ybUxheWVyKCVwKSIs
IHRoaXMpOwotCiAgICAgaWYgKG1fdmlkZW9MYXllcldyYXBwZXIpCiAgICAgICAgIHJldHVybiBt
X3ZpZGVvTGF5ZXJXcmFwcGVyLT5wbGF0Zm9ybUxheWVyKCk7CiAK
</data>
<flag name="review"
          id="99403"
          type_id="1"
          status="+"
          setter="eric.carlson"
    />
          </attachment>
      

    </bug>

</bugzilla>