<?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>109952</bug_id>
          
          <creation_ts>2013-02-15 10:07:15 -0800</creation_ts>
          <short_desc>Merge MainResourceLoader&apos;s didFinishLoading and dataReceived into DocumentLoader</short_desc>
          <delta_ts>2013-03-13 12:13:51 -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>WebCore Misc.</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>104969</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Nate Chapin">japhet</reporter>
          <assigned_to name="Nate Chapin">japhet</assigned_to>
          <cc>abarth</cc>
    
    <cc>aestes</cc>
    
    <cc>ap</cc>
    
    <cc>koivisto</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>834128</commentid>
    <comment_count>0</comment_count>
    <who name="Nate Chapin">japhet</who>
    <bug_when>2013-02-15 10:07:15 -0800</bug_when>
    <thetext>Also, since MainResourceLoader&apos;s content filtering is primarily implemented in these 2 functions, move the remaining references to ContentFilter as well.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>834136</commentid>
    <comment_count>1</comment_count>
      <attachid>188597</attachid>
    <who name="Nate Chapin">japhet</who>
    <bug_when>2013-02-15 10:14:20 -0800</bug_when>
    <thetext>Created attachment 188597
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>834367</commentid>
    <comment_count>2</comment_count>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2013-02-15 14:14:38 -0800</bug_when>
    <thetext>I&apos;m not sure if I understand the strategy. DocumentLoader is responsible for main resource and subresources. Why is it desirable to fold code for main resource loading into it?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>834381</commentid>
    <comment_count>3</comment_count>
    <who name="Nate Chapin">japhet</who>
    <bug_when>2013-02-15 14:37:29 -0800</bug_when>
    <thetext>(In reply to comment #2)
&gt; I&apos;m not sure if I understand the strategy. DocumentLoader is responsible for main resource and subresources. Why is it desirable to fold code for main resource loading into it?

The primary rationale is that the boundary between MainResourceLoader and DocumentLoader is very poorly defined, especially now that MainResourceLoader does not subclass ResourceLoader, and since DocumentLoader already does quite a bit of the work related to loading the main resource. It seems pretty clear (to me anyway) that we should either merge them or create a clearer sense of each class&apos;s responsibilities. I couldn&apos;t come up with clear responsibilities, so I figured merging made more sense.

Antti initially suggested the merger to me a couple months ago in #webkit. Unfortunately I appear to have lost the logs of that conversation, so I can&apos;t remember the full details of his thinking.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>834517</commentid>
    <comment_count>4</comment_count>
      <attachid>188597</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2013-02-15 17:08:29 -0800</bug_when>
    <thetext>Comment on attachment 188597
patch

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

Seems like it’s a good direction for refactoring, but I am not confident this does not change behavior, since it changes the order of operations and moves some calls that change internal state across frame loader calls that make their way all the way out to clients, at least on Mac with WebKit1.

I am torn because there is no obvious review- here, but there are a lot of questions. I am not going to say review+ or review-, but I wish I could do one or the other.

&gt; Source/WebCore/loader/DocumentLoader.h:58
&gt; +#if USE(CONTENT_FILTERING)
&gt; +    class ContentFilter;
&gt; +#endif

I think it’s overkill to put #if around forward declarations. Lets just include them unconditionally.

If you do want to put an #if around this, then please put it in a separate paragraph as it was in MainResourceLoader.h. We don’t mix #if in with sorted lists like this.

&gt; Source/WebCore/loader/DocumentLoader.h:200
&gt; +        void cancelMainResourceLoad(const ResourceError&amp; = ResourceError());

Is this really clearer than creating an empty error at the call site? I worry about default arguments like this one.

&gt; Source/WebCore/loader/MainResourceLoader.cpp:-518
&gt; -    // The additional processing can do anything including possibly removing the last
&gt; -    // reference to this object; one example of this is 3266216.
&gt; -    RefPtr&lt;MainResourceLoader&gt; protect(this);

Why is this no longer needed? I understand that this function itself no longer accesses MainResourceLoader, but removing this can change the time of destruction of various objects. How did you prove it was OK?

&gt; Source/WebCore/loader/DocumentLoader.cpp:294
&gt; +    RefPtr&lt;DocumentLoader&gt; protect(this);

Seems OK to add this, but how did you know it was needed?

&gt; Source/WebCore/loader/DocumentLoader.cpp:328
&gt; +    m_applicationCacheHost-&gt;finishedLoadingMainResource();

This is now called before removing the item from the memory cache at the call site. Is it OK to change that?

&gt; Source/WebCore/loader/DocumentLoader.cpp:443
&gt; +#if USE(CFNETWORK) || PLATFORM(MAC)
&gt; +    // Workaround for &lt;rdar://problem/6060782&gt;
&gt; +    if (m_response.isNull())
&gt; +        setResponse(ResourceResponse(KURL(), &quot;text/html&quot;, 0, String(), String()));
&gt; +#endif

This now happens after dispatchDidReceiveData, so it seems the new timing will be observable by clients. Why is that OK?

&gt; Source/WebCore/loader/DocumentLoader.cpp:448
&gt; +    ASSERT(!m_frame-&gt;page()-&gt;defersLoading());

What guarantees m_frame is non-zero?

What guarantees m_frame-&gt;page() is non-zero?

The old code didn’t rely on either of these things.

&gt; Source/WebCore/loader/DocumentLoader.cpp:467
&gt; +#if USE(CONTENT_FILTERING)
&gt; +    bool loadWasBlockedBeforeFinishing = false;
&gt; +    if (m_contentFilter &amp;&amp; m_contentFilter-&gt;needsMoreData()) {
&gt; +        m_contentFilter-&gt;addData(data, length);
&gt; +
&gt; +        if (m_contentFilter-&gt;needsMoreData()) {
&gt; +            // Since the filter still needs more data to make a decision,
&gt; +            // transition back to the committed state so that we don&apos;t partially
&gt; +            // load content that might later be blocked.
&gt; +            commitLoad(0, 0);
&gt; +            return;
&gt; +        }
&gt; +
&gt; +        data = m_contentFilter-&gt;getReplacementData(length);
&gt; +        loadWasBlockedBeforeFinishing = m_contentFilter-&gt;didBlockData();
&gt; +    }
&gt; +#endif

This now happens after dispatchDidReceiveData, so it seems the new timing will be observable by clients. Why is that OK?

&gt; Source/WebCore/loader/DocumentLoader.cpp:478
&gt; +#if USE(CONTENT_FILTERING)
&gt; +    if (loadWasBlockedBeforeFinishing)
&gt; +        cancelMainResourceLoad();
&gt; +#endif

What guarantees it’s OK to do this after calling commitLoad? Can’t the document loader be deleted as a side effect of doing that?

&gt; Source/WebCore/loader/DocumentLoader.cpp:960
&gt; -    finishedLoading();
&gt; +    finishedLoading(0);

The addition of this mysterious 0 is not good. It seems that 0 is a magic value that says “please compute the load finish time”. Concept is not new to this patch, but this call site is new, and this seems unpleasantly mysterious.

Also strange to use 0 here and 0.0 elsewhere in the same source file for the same purpose.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>836769</commentid>
    <comment_count>5</comment_count>
    <who name="Nate Chapin">japhet</who>
    <bug_when>2013-02-19 14:16:08 -0800</bug_when>
    <thetext>I tried to do a brain dump on all of the concerns, I hope I was coherent :)

Will work on a new version based on this feedback.

(In reply to comment #4)
&gt; (From update of attachment 188597 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=188597&amp;action=review
&gt; 
&gt; Seems like it’s a good direction for refactoring, but I am not confident this does not change behavior, since it changes the order of operations and moves some calls that change internal state across frame loader calls that make their way all the way out to clients, at least on Mac with WebKit1.
&gt; 
&gt; I am torn because there is no obvious review- here, but there are a lot of questions. I am not going to say review+ or review-, but I wish I could do one or the other.
&gt; 
&gt; &gt; Source/WebCore/loader/DocumentLoader.h:58
&gt; &gt; +#if USE(CONTENT_FILTERING)
&gt; &gt; +    class ContentFilter;
&gt; &gt; +#endif
&gt; 
&gt; I think it’s overkill to put #if around forward declarations. Lets just include them unconditionally.
&gt; 
&gt; If you do want to put an #if around this, then please put it in a separate paragraph as it was in MainResourceLoader.h. We don’t mix #if in with sorted lists like this.

I don&apos;t feel strongly, I had just copied the old formatting. Will fix.

&gt; 
&gt; &gt; Source/WebCore/loader/DocumentLoader.h:200
&gt; &gt; +        void cancelMainResourceLoad(const ResourceError&amp; = ResourceError());
&gt; 
&gt; Is this really clearer than creating an empty error at the call site? I worry about default arguments like this one.

Would it be better to have two versions of the function, one with 1 argument, one having 0 arguments and calling the 1-argument with a default value? That was how it was done in MainResourceLoader::cancel.

&gt; 
&gt; &gt; Source/WebCore/loader/MainResourceLoader.cpp:-518
&gt; &gt; -    // The additional processing can do anything including possibly removing the last
&gt; &gt; -    // reference to this object; one example of this is 3266216.
&gt; &gt; -    RefPtr&lt;MainResourceLoader&gt; protect(this);
&gt; 
&gt; Why is this no longer needed? I understand that this function itself no longer accesses MainResourceLoader, but removing this can change the time of destruction of various objects. How did you prove it was OK?

The only RefPtr member of MainResourceLoader is a RefPtr&lt;DocumentLoader&gt;. The layout tests pass without any RefPtr here, but it&apos;s possible there&apos;s a case that would require one. If I were to add a RefPtr here, I would say protect(this) should be sufficient.

The only other member of MainResourceLoader that could theoretically cause a problem is m_resource, but given that m_resource is private to MainResourceLoader and is protected heavily in SubresourceLoader, it shouldn&apos;t get killed if it&apos;s going to still be needed.


&gt; 
&gt; &gt; Source/WebCore/loader/DocumentLoader.cpp:294
&gt; &gt; +    RefPtr&lt;DocumentLoader&gt; protect(this);
&gt; 
&gt; Seems OK to add this, but how did you know it was needed?

This was moved from MainResourceLoader::didFinishLoading(). IIRC, I tried without it and there was a use-after-free, but I&apos;ll double-check.


&gt; 
&gt; &gt; Source/WebCore/loader/DocumentLoader.cpp:328
&gt; &gt; +    m_applicationCacheHost-&gt;finishedLoadingMainResource();
&gt; 
&gt; This is now called before removing the item from the memory cache at the call site. Is it OK to change that?

I think so, but I&apos;m not absolutely positive. The only problem would be if a main resource request for the current url was triggered from within finishedLoadingMainResource(). That is clearly impossible for chromium&apos;s ApplicationCacheHost implementation. I can&apos;t find a case where that would be possible in the WebCore/loader/appcache/ApplicationCacheHost.cpp implementation, but I might have missed something.

I will see about exposing the information required to move the memory cache removal into DocumentLoader to maintain the ordering.

&gt; 
&gt; &gt; Source/WebCore/loader/DocumentLoader.cpp:443
&gt; &gt; +#if USE(CFNETWORK) || PLATFORM(MAC)
&gt; &gt; +    // Workaround for &lt;rdar://problem/6060782&gt;
&gt; &gt; +    if (m_response.isNull())
&gt; &gt; +        setResponse(ResourceResponse(KURL(), &quot;text/html&quot;, 0, String(), String()));
&gt; &gt; +#endif
&gt; 
&gt; This now happens after dispatchDidReceiveData, so it seems the new timing will be observable by clients. Why is that OK?

I believe these cases are mutually excluseive. The dispatchDidReceiveData() call in MainResourceLoader only happens for SubstituteData loads and MemoryCache hits. The memory cache won&apos;t hit if its m_response is null and it will always set a response for a cache hit (see CachedResource::addClientToSet and CachedRawResource::didAddClient). SubstituteData loads also will set a response before sending data (see MainResourceLoader::handleSubstituteDataLoadNow).

&gt; 
&gt; &gt; Source/WebCore/loader/DocumentLoader.cpp:448
&gt; &gt; +    ASSERT(!m_frame-&gt;page()-&gt;defersLoading());
&gt; 
&gt; What guarantees m_frame is non-zero?
&gt; 
&gt; What guarantees m_frame-&gt;page() is non-zero?
&gt; 
&gt; The old code didn’t rely on either of these things.

My thought had been that neither of these callbacks should be possible in those cases. If DocumentLoader has been detached from its Frame or the Frame from its Page, that should trigger cancellation of all resource loads, which should preclude callbacks for receiving data or finishing loading. I couldn&apos;t find any case where ResourceLoader::defersLoading() and Page::defersLoading() were able to be different, but it&apos;s possible I missed something.

&gt; 
&gt; &gt; Source/WebCore/loader/DocumentLoader.cpp:467
&gt; &gt; +#if USE(CONTENT_FILTERING)
&gt; &gt; +    bool loadWasBlockedBeforeFinishing = false;
&gt; &gt; +    if (m_contentFilter &amp;&amp; m_contentFilter-&gt;needsMoreData()) {
&gt; &gt; +        m_contentFilter-&gt;addData(data, length);
&gt; &gt; +
&gt; &gt; +        if (m_contentFilter-&gt;needsMoreData()) {
&gt; &gt; +            // Since the filter still needs more data to make a decision,
&gt; &gt; +            // transition back to the committed state so that we don&apos;t partially
&gt; &gt; +            // load content that might later be blocked.
&gt; &gt; +            commitLoad(0, 0);
&gt; &gt; +            return;
&gt; &gt; +        }
&gt; &gt; +
&gt; &gt; +        data = m_contentFilter-&gt;getReplacementData(length);
&gt; &gt; +        loadWasBlockedBeforeFinishing = m_contentFilter-&gt;didBlockData();
&gt; &gt; +    }
&gt; &gt; +#endif
&gt; 
&gt; This now happens after dispatchDidReceiveData, so it seems the new timing will be observable by clients. Why is that OK?

I think the same logic for the previous dispatchDidReceiveData reordering concern still applies.  Perhaps I should expose enough information to do the call to dispatchDidReceiveData in its current order just to remove that concern, though.

&gt; 
&gt; &gt; Source/WebCore/loader/DocumentLoader.cpp:478
&gt; &gt; +#if USE(CONTENT_FILTERING)
&gt; &gt; +    if (loadWasBlockedBeforeFinishing)
&gt; &gt; +        cancelMainResourceLoad();
&gt; &gt; +#endif
&gt; 
&gt; What guarantees it’s OK to do this after calling commitLoad? Can’t the document loader be deleted as a side effect of doing that?

This ordering is already the case (though it&apos;s hidden by the MainResourceLoader/DocumentLoader boundary). I don&apos;t know enough about ContentFilter to know why this ordering was safe.

&gt; 
&gt; &gt; Source/WebCore/loader/DocumentLoader.cpp:960
&gt; &gt; -    finishedLoading();
&gt; &gt; +    finishedLoading(0);
&gt; 
&gt; The addition of this mysterious 0 is not good. It seems that 0 is a magic value that says “please compute the load finish time”. Concept is not new to this patch, but this call site is new, and this seems unpleasantly mysterious.
&gt; 
&gt; Also strange to use 0 here and 0.0 elsewhere in the same source file for the same purpose.

0 vs 0.0 : totally right
0 vs something that isn&apos;t a magic number: Perhaps I should switch this to currentTime() and see what breaks?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>836808</commentid>
    <comment_count>6</comment_count>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2013-02-19 15:02:46 -0800</bug_when>
    <thetext>(In reply to comment #3)
&gt; Antti initially suggested the merger to me a couple months ago in #webkit. Unfortunately I appear to have lost the logs of that conversation, so I can&apos;t remember the full details of his thinking.

Right, that was the reasoning. There is no point of them existing as separate entities anymore. It just creates complexity and confusion.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>836876</commentid>
    <comment_count>7</comment_count>
      <attachid>188597</attachid>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2013-02-19 15:42:12 -0800</bug_when>
    <thetext>Comment on attachment 188597
patch

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

Looks good to me.

&gt;&gt;&gt; Source/WebCore/loader/DocumentLoader.h:200
&gt;&gt;&gt; +        void cancelMainResourceLoad(const ResourceError&amp; = ResourceError());
&gt;&gt; 
&gt;&gt; Is this really clearer than creating an empty error at the call site? I worry about default arguments like this one.
&gt; 
&gt; Would it be better to have two versions of the function, one with 1 argument, one having 0 arguments and calling the 1-argument with a default value? That was how it was done in MainResourceLoader::cancel.

Providing the empty error value explicitly is probably best. It can have informative name.

&gt;&gt;&gt; Source/WebCore/loader/DocumentLoader.cpp:960
&gt;&gt;&gt;      setResponse(ResourceResponse(m_request.url(), mimeType, 0, String(), String()));
&gt;&gt;&gt; -    finishedLoading();
&gt;&gt;&gt; +    finishedLoading(0);
&gt;&gt; 
&gt;&gt; The addition of this mysterious 0 is not good. It seems that 0 is a magic value that says “please compute the load finish time”. Concept is not new to this patch, but this call site is new, and this seems unpleasantly mysterious.
&gt;&gt; 
&gt;&gt; Also strange to use 0 here and 0.0 elsewhere in the same source file for the same purpose.
&gt; 
&gt; 0 vs 0.0 : totally right
&gt; 0 vs something that isn&apos;t a magic number: Perhaps I should switch this to currentTime() and see what breaks?

monotonicallyIncreasingTime() seems like the right thing here.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>852806</commentid>
    <comment_count>8</comment_count>
      <attachid>192582</attachid>
    <who name="Nate Chapin">japhet</who>
    <bug_when>2013-03-11 15:39:50 -0700</bug_when>
    <thetext>Created attachment 192582
address comments</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>854413</commentid>
    <comment_count>9</comment_count>
      <attachid>192582</attachid>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2013-03-13 11:11:31 -0700</bug_when>
    <thetext>Comment on attachment 192582
address comments

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

&gt; Source/WebCore/loader/DocumentLoader.cpp:330
&gt; +    timing()-&gt;setResponseEnd(finishTime ? finishTime : (m_timeOfLastDataReceived ? m_timeOfLastDataReceived : monotonicallyIncreasingTime()));

A variable would be nice.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>854414</commentid>
    <comment_count>10</comment_count>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2013-03-13 11:11:49 -0700</bug_when>
    <thetext>r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>854434</commentid>
    <comment_count>11</comment_count>
      <attachid>192954</attachid>
    <who name="Nate Chapin">japhet</who>
    <bug_when>2013-03-13 11:42:23 -0700</bug_when>
    <thetext>Created attachment 192954
Patch for landing</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>854462</commentid>
    <comment_count>12</comment_count>
      <attachid>192954</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2013-03-13 12:13:48 -0700</bug_when>
    <thetext>Comment on attachment 192954
Patch for landing

Clearing flags on attachment: 192954

Committed r145734: &lt;http://trac.webkit.org/changeset/145734&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>854463</commentid>
    <comment_count>13</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2013-03-13 12:13:51 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>188597</attachid>
            <date>2013-02-15 10:14:20 -0800</date>
            <delta_ts>2013-02-21 09:38:54 -0800</delta_ts>
            <desc>patch</desc>
            <filename>dl_mrl_finish.txt</filename>
            <type>text/plain</type>
            <size>14404</size>
            <attacher name="Nate Chapin">japhet</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL2xvYWRlci9Eb2N1bWVudExvYWRlci5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9XZWJDb3JlL2xvYWRlci9Eb2N1bWVudExvYWRlci5oCShyZXZpc2lvbiAxNDI4
OTcpCisrKyBTb3VyY2UvV2ViQ29yZS9sb2FkZXIvRG9jdW1lbnRMb2FkZXIuaAkod29ya2luZyBj
b3B5KQpAQCAtNTMsNiArNTMsOSBAQAogICAgIGNsYXNzIEFyY2hpdmVSZXNvdXJjZTsKICAgICBj
bGFzcyBBcmNoaXZlUmVzb3VyY2VDb2xsZWN0aW9uOwogICAgIGNsYXNzIENhY2hlZFJlc291cmNl
TG9hZGVyOworI2lmIFVTRShDT05URU5UX0ZJTFRFUklORykKKyAgICBjbGFzcyBDb250ZW50Rmls
dGVyOworI2VuZGlmCiAgICAgY2xhc3MgRnJhbWU7CiAgICAgY2xhc3MgRnJhbWVMb2FkZXI7CiAg
ICAgY2xhc3MgTWFpblJlc291cmNlTG9hZGVyOwpAQCAtMTE3LDcgKzEyMCw3IEBACiAgICAgICAg
IGJvb2wgaXNMb2FkaW5nKCkgY29uc3QgeyByZXR1cm4gaXNMb2FkaW5nTWFpblJlc291cmNlKCkg
fHwgIW1fc3VicmVzb3VyY2VMb2FkZXJzLmlzRW1wdHkoKSB8fCAhbV9wbHVnSW5TdHJlYW1Mb2Fk
ZXJzLmlzRW1wdHkoKTsgfQogICAgICAgICB2b2lkIHJlY2VpdmVkRGF0YShjb25zdCBjaGFyKiwg
aW50KTsKICAgICAgICAgdm9pZCBzZXR1cEZvclJlcGxhY2UoKTsKLSAgICAgICAgdm9pZCBmaW5p
c2hlZExvYWRpbmcoKTsKKyAgICAgICAgdm9pZCBmaW5pc2hlZExvYWRpbmcoZG91YmxlIGZpbmlz
aFRpbWUpOwogICAgICAgICBjb25zdCBSZXNvdXJjZVJlc3BvbnNlJiByZXNwb25zZSgpIGNvbnN0
IHsgcmV0dXJuIG1fcmVzcG9uc2U7IH0KICAgICAgICAgY29uc3QgUmVzb3VyY2VFcnJvciYgbWFp
bkRvY3VtZW50RXJyb3IoKSBjb25zdCB7IHJldHVybiBtX21haW5Eb2N1bWVudEVycm9yOyB9CiAg
ICAgICAgIHZvaWQgbWFpblJlY2VpdmVkRXJyb3IoY29uc3QgUmVzb3VyY2VFcnJvciYpOwpAQCAt
MTk0LDcgKzE5Nyw3IEBACiAgICAgICAgIHZvaWQgc2V0RGVmZXJzTG9hZGluZyhib29sKTsKIAog
ICAgICAgICB2b2lkIHN0YXJ0TG9hZGluZ01haW5SZXNvdXJjZSgpOwotICAgICAgICB2b2lkIGNh
bmNlbE1haW5SZXNvdXJjZUxvYWQoY29uc3QgUmVzb3VyY2VFcnJvciYpOworICAgICAgICB2b2lk
IGNhbmNlbE1haW5SZXNvdXJjZUxvYWQoY29uc3QgUmVzb3VyY2VFcnJvciYgPSBSZXNvdXJjZUVy
cm9yKCkpOwogICAgICAgICAKICAgICAgICAgLy8gU3VwcG9ydCBpY29uRGF0YWJhc2UgaW4gc3lu
Y2hyb25vdXMgbW9kZS4KICAgICAgICAgdm9pZCBpY29uTG9hZERlY2lzaW9uQXZhaWxhYmxlKCk7
CkBAIC0yNDAsNiArMjQzLDggQEAKICAgICAgICAgRG9jdW1lbnRMb2FkVGltaW5nKiB0aW1pbmco
KSB7IHJldHVybiAmbV9kb2N1bWVudExvYWRUaW1pbmc7IH0KICAgICAgICAgdm9pZCByZXNldFRp
bWluZygpIHsgbV9kb2N1bWVudExvYWRUaW1pbmcgPSBEb2N1bWVudExvYWRUaW1pbmcoKTsgfQog
CisgICAgICAgIHZvaWQgcmVzcG9uc2VSZWNlaXZlZChjb25zdCBSZXNvdXJjZVJlc3BvbnNlJik7
CisKICAgICAgICAgLy8gVGhlIFdlYktpdCBsYXllciBjYWxscyB0aGlzIGZ1bmN0aW9uIHdoZW4g
aXQncyByZWFkeSBmb3IgdGhlIGRhdGEgdG8KICAgICAgICAgLy8gYWN0dWFsbHkgYmUgYWRkZWQg
dG8gdGhlIGRvY3VtZW50LgogICAgICAgICB2b2lkIGNvbW1pdERhdGEoY29uc3QgY2hhciogYnl0
ZXMsIHNpemVfdCBsZW5ndGgpOwpAQCAtMzUwLDEyICszNTUsMTggQEAKICAgICAgICAgYm9vbCBt
X2RpZENyZWF0ZUdsb2JhbEhpc3RvcnlFbnRyeTsKIAogICAgICAgICBEb2N1bWVudExvYWRUaW1p
bmcgbV9kb2N1bWVudExvYWRUaW1pbmc7CisKKyAgICAgICAgZG91YmxlIG1fdGltZU9mTGFzdERh
dGFSZWNlaXZlZDsKICAgICAKICAgICAgICAgUmVmUHRyPEljb25Mb2FkRGVjaXNpb25DYWxsYmFj
az4gbV9pY29uTG9hZERlY2lzaW9uQ2FsbGJhY2s7CiAgICAgICAgIFJlZlB0cjxJY29uRGF0YUNh
bGxiYWNrPiBtX2ljb25EYXRhQ2FsbGJhY2s7CiAKICAgICAgICAgZnJpZW5kIGNsYXNzIEFwcGxp
Y2F0aW9uQ2FjaGVIb3N0OyAgLy8gZm9yIHN1YnN0aXR1dGUgcmVzb3VyY2UgZGVsaXZlcnkKICAg
ICAgICAgT3duUHRyPEFwcGxpY2F0aW9uQ2FjaGVIb3N0PiBtX2FwcGxpY2F0aW9uQ2FjaGVIb3N0
OworCisjaWYgVVNFKENPTlRFTlRfRklMVEVSSU5HKQorICAgICAgICBSZWZQdHI8Q29udGVudEZp
bHRlcj4gbV9jb250ZW50RmlsdGVyOworI2VuZGlmCiAgICAgfTsKIAogICAgIGlubGluZSB2b2lk
IERvY3VtZW50TG9hZGVyOjpyZWNvcmRNZW1vcnlDYWNoZUxvYWRGb3JGdXR1cmVDbGllbnROb3Rp
ZmljYXRpb24oY29uc3QgU3RyaW5nJiB1cmwpCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9sb2FkZXIv
TWFpblJlc291cmNlTG9hZGVyLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvbG9hZGVy
L01haW5SZXNvdXJjZUxvYWRlci5oCShyZXZpc2lvbiAxNDI4OTcpCisrKyBTb3VyY2UvV2ViQ29y
ZS9sb2FkZXIvTWFpblJlc291cmNlTG9hZGVyLmgJKHdvcmtpbmcgY29weSkKQEAgLTQ2LDEwICs0
Niw2IEBACiAKIGNsYXNzIEZvcm1TdGF0ZTsKIGNsYXNzIFJlc291cmNlUmVxdWVzdDsKLSAgICAK
LSNpZiBVU0UoQ09OVEVOVF9GSUxURVJJTkcpCi1jbGFzcyBDb250ZW50RmlsdGVyOwotI2VuZGlm
CiAKIGNsYXNzIE1haW5SZXNvdXJjZUxvYWRlciA6IHB1YmxpYyBSZWZDb3VudGVkPE1haW5SZXNv
dXJjZUxvYWRlcj4sIHB1YmxpYyBDYWNoZWRSYXdSZXNvdXJjZUNsaWVudCB7CiAgICAgV1RGX01B
S0VfRkFTVF9BTExPQ0FURUQ7CkBAIC0xMjcsMTIgKzEyMyw3IEBACiAKICAgICBib29sIG1fbG9h
ZGluZ011bHRpcGFydENvbnRlbnQ7CiAgICAgYm9vbCBtX3dhaXRpbmdGb3JDb250ZW50UG9saWN5
OwotICAgIGRvdWJsZSBtX3RpbWVPZkxhc3REYXRhUmVjZWl2ZWQ7CiAgICAgdW5zaWduZWQgbG9u
ZyBtX2lkZW50aWZpZXJGb3JMb2FkV2l0aG91dFJlc291cmNlTG9hZGVyOwotCi0jaWYgVVNFKENP
TlRFTlRfRklMVEVSSU5HKQotICAgIFJlZlB0cjxDb250ZW50RmlsdGVyPiBtX2NvbnRlbnRGaWx0
ZXI7Ci0jZW5kaWYKIH07CiAKIH0KSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2xvYWRlci9NYWluUmVz
b3VyY2VMb2FkZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2xvYWRlci9NYWlu
UmVzb3VyY2VMb2FkZXIuY3BwCShyZXZpc2lvbiAxNDI4OTcpCisrKyBTb3VyY2UvV2ViQ29yZS9s
b2FkZXIvTWFpblJlc291cmNlTG9hZGVyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNjIsMTAgKzYy
LDYgQEAKICNpbmNsdWRlICJQbHVnaW5EYXRhYmFzZS5oIgogI2VuZGlmCiAKLSNpZiBVU0UoQ09O
VEVOVF9GSUxURVJJTkcpCi0jaW5jbHVkZSAiQ29udGVudEZpbHRlci5oIgotI2VuZGlmCi0KIG5h
bWVzcGFjZSBXZWJDb3JlIHsKIAogTWFpblJlc291cmNlTG9hZGVyOjpNYWluUmVzb3VyY2VMb2Fk
ZXIoRG9jdW1lbnRMb2FkZXIqIGRvY3VtZW50TG9hZGVyKQpAQCAtNzMsNyArNjksNiBAQAogICAg
ICwgbV9kb2N1bWVudExvYWRlcihkb2N1bWVudExvYWRlcikKICAgICAsIG1fbG9hZGluZ011bHRp
cGFydENvbnRlbnQoZmFsc2UpCiAgICAgLCBtX3dhaXRpbmdGb3JDb250ZW50UG9saWN5KGZhbHNl
KQotICAgICwgbV90aW1lT2ZMYXN0RGF0YVJlY2VpdmVkKDAuMCkKICAgICAsIG1faWRlbnRpZmll
ckZvckxvYWRXaXRob3V0UmVzb3VyY2VMb2FkZXIoMCkKIHsKIH0KQEAgLTQzNCw3ICs0MjksNyBA
QAogICAgIC8vIHJlZmVyZW5jZSB0byB0aGlzIG9iamVjdDsgb25lIGV4YW1wbGUgb2YgdGhpcyBp
cyAzMjY2MjE2LgogICAgIFJlZlB0cjxNYWluUmVzb3VyY2VMb2FkZXI+IHByb3RlY3QodGhpcyk7
CiAKLSAgICBtX2RvY3VtZW50TG9hZGVyLT5zZXRSZXNwb25zZShyKTsKKyAgICBtX2RvY3VtZW50
TG9hZGVyLT5yZXNwb25zZVJlY2VpdmVkKHIpOwogCiAgICAgbV9yZXNwb25zZSA9IHI7CiAKQEAg
LTQ2MCwxMTYgKzQ1NSwzNyBAQAogICAgIH0KICNlbmRpZgogCi0jaWYgVVNFKENPTlRFTlRfRklM
VEVSSU5HKQotICAgIGlmIChyLnVybCgpLnByb3RvY29sSXMoImh0dHBzIikgJiYgQ29udGVudEZp
bHRlcjo6aXNFbmFibGVkKCkpCi0gICAgICAgIG1fY29udGVudEZpbHRlciA9IENvbnRlbnRGaWx0
ZXI6OmNyZWF0ZShyKTsKLSNlbmRpZgotCiAgICAgZnJhbWVMb2FkZXIoKS0+cG9saWN5Q2hlY2tl
cigpLT5jaGVja0NvbnRlbnRQb2xpY3kobV9yZXNwb25zZSwgY2FsbENvbnRpbnVlQWZ0ZXJDb250
ZW50UG9saWN5LCB0aGlzKTsKIH0KIAogdm9pZCBNYWluUmVzb3VyY2VMb2FkZXI6OmRhdGFSZWNl
aXZlZChDYWNoZWRSZXNvdXJjZSogcmVzb3VyY2UsIGNvbnN0IGNoYXIqIGRhdGEsIGludCBsZW5n
dGgpCiB7Ci0gICAgQVNTRVJUKGRhdGEpOwotICAgIEFTU0VSVChsZW5ndGggIT0gMCk7CiAgICAg
QVNTRVJUX1VOVVNFRChyZXNvdXJjZSwgcmVzb3VyY2UgPT0gbV9yZXNvdXJjZSk7Ci0gICAgQVNT
RVJUKCFtX3Jlc3BvbnNlLmlzTnVsbCgpKTsKIAotI2lmIFVTRShDRk5FVFdPUkspIHx8IFBMQVRG
T1JNKE1BQykKLSAgICAvLyBXb3JrYXJvdW5kIGZvciA8cmRhcjovL3Byb2JsZW0vNjA2MDc4Mj4K
LSAgICBpZiAobV9yZXNwb25zZS5pc051bGwoKSkgewotICAgICAgICBtX3Jlc3BvbnNlID0gUmVz
b3VyY2VSZXNwb25zZShLVVJMKCksICJ0ZXh0L2h0bWwiLCAwLCBTdHJpbmcoKSwgU3RyaW5nKCkp
OwotICAgICAgICBpZiAoRG9jdW1lbnRMb2FkZXIqIGRvY3VtZW50TG9hZGVyID0gbV9kb2N1bWVu
dExvYWRlci5nZXQoKSkKLSAgICAgICAgICAgIGRvY3VtZW50TG9hZGVyLT5zZXRSZXNwb25zZSht
X3Jlc3BvbnNlKTsKLSAgICB9Ci0jZW5kaWYKLQotICAgIC8vIFRoZXJlIGlzIGEgYnVnIGluIENG
TmV0d29yayB3aGVyZSBjYWxsYmFja3MgY2FuIGJlIGRpc3BhdGNoZWQgZXZlbiB3aGVuIGxvYWRz
IGFyZSBkZWZlcnJlZC4KLSAgICAvLyBTZWUgPHJkYXI6Ly9wcm9ibGVtLzYzMDQ2MDA+IGZvciBt
b3JlIGRldGFpbHMuCi0jaWYgIVVTRShDRikKLSAgICBBU1NFUlQoIWRlZmVyc0xvYWRpbmcoKSk7
Ci0jZW5kaWYKLQotI2lmIFVTRShDT05URU5UX0ZJTFRFUklORykKLSAgICBib29sIGxvYWRXYXNC
bG9ja2VkQmVmb3JlRmluaXNoaW5nID0gZmFsc2U7Ci0gICAgaWYgKG1fY29udGVudEZpbHRlciAm
JiBtX2NvbnRlbnRGaWx0ZXItPm5lZWRzTW9yZURhdGEoKSkgewotICAgICAgICBtX2NvbnRlbnRG
aWx0ZXItPmFkZERhdGEoZGF0YSwgbGVuZ3RoKTsKLQotICAgICAgICBpZiAobV9jb250ZW50Rmls
dGVyLT5uZWVkc01vcmVEYXRhKCkpIHsKLSAgICAgICAgICAgIC8vIFNpbmNlIHRoZSBmaWx0ZXIg
c3RpbGwgbmVlZHMgbW9yZSBkYXRhIHRvIG1ha2UgYSBkZWNpc2lvbiwKLSAgICAgICAgICAgIC8v
IHRyYW5zaXRpb24gYmFjayB0byB0aGUgY29tbWl0dGVkIHN0YXRlIHNvIHRoYXQgd2UgZG9uJ3Qg
cGFydGlhbGx5Ci0gICAgICAgICAgICAvLyBsb2FkIGNvbnRlbnQgdGhhdCBtaWdodCBsYXRlciBi
ZSBibG9ja2VkLgotICAgICAgICAgICAgZG9jdW1lbnRMb2FkZXIoKS0+cmVjZWl2ZWREYXRhKDAs
IDApOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgZGF0YSA9IG1f
Y29udGVudEZpbHRlci0+Z2V0UmVwbGFjZW1lbnREYXRhKGxlbmd0aCk7Ci0gICAgICAgIGxvYWRX
YXNCbG9ja2VkQmVmb3JlRmluaXNoaW5nID0gbV9jb250ZW50RmlsdGVyLT5kaWRCbG9ja0RhdGEo
KTsKLSAgICB9Ci0jZW5kaWYKLQogICAgIGlmIChtX2lkZW50aWZpZXJGb3JMb2FkV2l0aG91dFJl
c291cmNlTG9hZGVyKQogICAgICAgICBmcmFtZUxvYWRlcigpLT5ub3RpZmllcigpLT5kaXNwYXRj
aERpZFJlY2VpdmVEYXRhKGRvY3VtZW50TG9hZGVyKCksIGlkZW50aWZpZXIoKSwgZGF0YSwgbGVu
Z3RoLCAtMSk7CiAKLSAgICBkb2N1bWVudExvYWRlcigpLT5hcHBsaWNhdGlvbkNhY2hlSG9zdCgp
LT5tYWluUmVzb3VyY2VEYXRhUmVjZWl2ZWQoZGF0YSwgbGVuZ3RoLCAtMSwgZmFsc2UpOwotCi0g
ICAgLy8gVGhlIGFkZGl0aW9uYWwgcHJvY2Vzc2luZyBjYW4gZG8gYW55dGhpbmcgaW5jbHVkaW5n
IHBvc3NpYmx5IHJlbW92aW5nIHRoZSBsYXN0Ci0gICAgLy8gcmVmZXJlbmNlIHRvIHRoaXMgb2Jq
ZWN0OyBvbmUgZXhhbXBsZSBvZiB0aGlzIGlzIDMyNjYyMTYuCi0gICAgUmVmUHRyPE1haW5SZXNv
dXJjZUxvYWRlcj4gcHJvdGVjdCh0aGlzKTsKLQotICAgIG1fdGltZU9mTGFzdERhdGFSZWNlaXZl
ZCA9IG1vbm90b25pY2FsbHlJbmNyZWFzaW5nVGltZSgpOwotCiAgICAgZG9jdW1lbnRMb2FkZXIo
KS0+cmVjZWl2ZWREYXRhKGRhdGEsIGxlbmd0aCk7Ci0KLSNpZiBVU0UoQ09OVEVOVF9GSUxURVJJ
TkcpCi0gICAgaWYgKGxvYWRXYXNCbG9ja2VkQmVmb3JlRmluaXNoaW5nKQotICAgICAgICBjYW5j
ZWwoKTsKLSNlbmRpZgogfQogCiB2b2lkIE1haW5SZXNvdXJjZUxvYWRlcjo6ZGlkRmluaXNoTG9h
ZGluZyhkb3VibGUgZmluaXNoVGltZSkKIHsKLSAgICAvLyBUaGVyZSBpcyBhIGJ1ZyBpbiBDRk5l
dHdvcmsgd2hlcmUgY2FsbGJhY2tzIGNhbiBiZSBkaXNwYXRjaGVkIGV2ZW4gd2hlbiBsb2FkcyBh
cmUgZGVmZXJyZWQuCi0gICAgLy8gU2VlIDxyZGFyOi8vcHJvYmxlbS82MzA0NjAwPiBmb3IgbW9y
ZSBkZXRhaWxzLgotI2lmICFVU0UoQ0YpCi0gICAgQVNTRVJUKCFkZWZlcnNMb2FkaW5nKCkgfHwg
SW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uOjppc0RlYnVnZ2VyUGF1c2VkKG1fZG9jdW1lbnRMb2Fk
ZXItPmZyYW1lKCkpKTsKLSNlbmRpZgotCiAgICAgLy8gVGhlIGFkZGl0aW9uYWwgcHJvY2Vzc2lu
ZyBjYW4gZG8gYW55dGhpbmcgaW5jbHVkaW5nIHBvc3NpYmx5IHJlbW92aW5nIHRoZSBsYXN0CiAg
ICAgLy8gcmVmZXJlbmNlIHRvIHRoaXMgb2JqZWN0LgogICAgIFJlZlB0cjxNYWluUmVzb3VyY2VM
b2FkZXI+IHByb3RlY3QodGhpcyk7Ci0gICAgUmVmUHRyPERvY3VtZW50TG9hZGVyPiBkbCA9IGRv
Y3VtZW50TG9hZGVyKCk7CiAKICAgICBpZiAobV9pZGVudGlmaWVyRm9yTG9hZFdpdGhvdXRSZXNv
dXJjZUxvYWRlcikgewogICAgICAgICBmcmFtZUxvYWRlcigpLT5ub3RpZmllcigpLT5kaXNwYXRj
aERpZEZpbmlzaExvYWRpbmcoZG9jdW1lbnRMb2FkZXIoKSwgaWRlbnRpZmllcigpLCBmaW5pc2hU
aW1lKTsKICAgICAgICAgbV9pZGVudGlmaWVyRm9yTG9hZFdpdGhvdXRSZXNvdXJjZUxvYWRlciA9
IDA7CiAgICAgfQorICAgIGRvY3VtZW50TG9hZGVyKCktPmZpbmlzaGVkTG9hZGluZyhmaW5pc2hU
aW1lKTsKIAotI2lmIFVTRShDT05URU5UX0ZJTFRFUklORykKLSAgICBpZiAobV9jb250ZW50Rmls
dGVyICYmIG1fY29udGVudEZpbHRlci0+bmVlZHNNb3JlRGF0YSgpKSB7Ci0gICAgICAgIG1fY29u
dGVudEZpbHRlci0+ZmluaXNoZWRBZGRpbmdEYXRhKCk7Ci0KLSAgICAgICAgaW50IGxlbmd0aDsK
LSAgICAgICAgY29uc3QgY2hhciogZGF0YSA9IG1fY29udGVudEZpbHRlci0+Z2V0UmVwbGFjZW1l
bnREYXRhKGxlbmd0aCk7Ci0gICAgICAgIGlmIChkYXRhKQotICAgICAgICAgICAgZGF0YVJlY2Vp
dmVkKG1fcmVzb3VyY2UuZ2V0KCksIGRhdGEsIGxlbmd0aCk7Ci0gICAgfQotI2VuZGlmCi0KLSAg
ICBpZiAobV9sb2FkaW5nTXVsdGlwYXJ0Q29udGVudCkKLSAgICAgICAgZGwtPm1heWJlRmluaXNo
TG9hZGluZ011bHRpcGFydENvbnRlbnQoKTsKLQotICAgIGRvY3VtZW50TG9hZGVyKCktPnRpbWlu
ZygpLT5zZXRSZXNwb25zZUVuZChmaW5pc2hUaW1lID8gZmluaXNoVGltZSA6IChtX3RpbWVPZkxh
c3REYXRhUmVjZWl2ZWQgPyBtX3RpbWVPZkxhc3REYXRhUmVjZWl2ZWQgOiBtb25vdG9uaWNhbGx5
SW5jcmVhc2luZ1RpbWUoKSkpOwotICAgIGRvY3VtZW50TG9hZGVyKCktPmZpbmlzaGVkTG9hZGlu
ZygpOwotCiAgICAgLy8gSWYgdGhlIGRvY3VtZW50IHNwZWNpZmllZCBhbiBhcHBsaWNhdGlvbiBj
YWNoZSBtYW5pZmVzdCwgaXQgdmlvbGF0ZXMgdGhlIGF1dGhvcidzIGludGVudCBpZiB3ZSBzdG9y
ZSBpdCBpbiB0aGUgbWVtb3J5IGNhY2hlCiAgICAgLy8gYW5kIGRlbnkgdGhlIGFwcGNhY2hlIHRo
ZSBjaGFuY2UgdG8gaW50ZXJjZXB0IGl0IGluIHRoZSBmdXR1cmUsIHNvIHJlbW92ZSBmcm9tIHRo
ZSBtZW1vcnkgY2FjaGUuCiAgICAgaWYgKEZyYW1lKiBmcmFtZSA9IGRvY3VtZW50TG9hZGVyKCkt
PmZyYW1lKCkpIHsKICAgICAgICAgaWYgKG1fcmVzb3VyY2UgJiYgZnJhbWUtPmRvY3VtZW50KCkt
Pmhhc01hbmlmZXN0KCkpCiAgICAgICAgICAgICBtZW1vcnlDYWNoZSgpLT5yZW1vdmUobV9yZXNv
dXJjZS5nZXQoKSk7CiAgICAgfQotCi0gICAgZGwtPmFwcGxpY2F0aW9uQ2FjaGVIb3N0KCktPmZp
bmlzaGVkTG9hZGluZ01haW5SZXNvdXJjZSgpOwogfQogCiB2b2lkIE1haW5SZXNvdXJjZUxvYWRl
cjo6bm90aWZ5RmluaXNoZWQoQ2FjaGVkUmVzb3VyY2UqIHJlc291cmNlKQpJbmRleDogU291cmNl
L1dlYkNvcmUvbG9hZGVyL0RvY3VtZW50TG9hZGVyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
V2ViQ29yZS9sb2FkZXIvRG9jdW1lbnRMb2FkZXIuY3BwCShyZXZpc2lvbiAxNDI4OTcpCisrKyBT
b3VyY2UvV2ViQ29yZS9sb2FkZXIvRG9jdW1lbnRMb2FkZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC02NSw2ICs2NSwxMCBAQAogI2luY2x1ZGUgIkFyY2hpdmVGYWN0b3J5LmgiCiAjZW5kaWYKIAor
I2lmIFVTRShDT05URU5UX0ZJTFRFUklORykKKyNpbmNsdWRlICJDb250ZW50RmlsdGVyLmgiCisj
ZW5kaWYKKwogbmFtZXNwYWNlIFdlYkNvcmUgewogCiBzdGF0aWMgdm9pZCBjYW5jZWxBbGwoY29u
c3QgUmVzb3VyY2VMb2FkZXJTZXQmIGxvYWRlcnMpCkBAIC0xMDMsNiArMTA3LDcgQEAKICAgICAs
IG1fc3RvcFJlY29yZGluZ1Jlc3BvbnNlcyhmYWxzZSkKICAgICAsIG1fc3Vic3RpdHV0ZVJlc291
cmNlRGVsaXZlcnlUaW1lcih0aGlzLCAmRG9jdW1lbnRMb2FkZXI6OnN1YnN0aXR1dGVSZXNvdXJj
ZURlbGl2ZXJ5VGltZXJGaXJlZCkKICAgICAsIG1fZGlkQ3JlYXRlR2xvYmFsSGlzdG9yeUVudHJ5
KGZhbHNlKQorICAgICwgbV90aW1lT2ZMYXN0RGF0YVJlY2VpdmVkKDAuMCkKICAgICAsIG1fYXBw
bGljYXRpb25DYWNoZUhvc3QoYWRvcHRQdHIobmV3IEFwcGxpY2F0aW9uQ2FjaGVIb3N0KHRoaXMp
KSkKIHsKIH0KQEAgLTI3OCw4ICsyODMsMjkgQEAKICAgICB9CiB9CiAKLXZvaWQgRG9jdW1lbnRM
b2FkZXI6OmZpbmlzaGVkTG9hZGluZygpCit2b2lkIERvY3VtZW50TG9hZGVyOjpmaW5pc2hlZExv
YWRpbmcoZG91YmxlIGZpbmlzaFRpbWUpCiB7CisgICAgLy8gVGhlcmUgaXMgYSBidWcgaW4gQ0ZO
ZXR3b3JrIHdoZXJlIGNhbGxiYWNrcyBjYW4gYmUgZGlzcGF0Y2hlZCBldmVuIHdoZW4gbG9hZHMg
YXJlIGRlZmVycmVkLgorICAgIC8vIFNlZSA8cmRhcjovL3Byb2JsZW0vNjMwNDYwMD4gZm9yIG1v
cmUgZGV0YWlscy4KKyNpZiAhVVNFKENGKQorICAgIEFTU0VSVCghbV9mcmFtZS0+cGFnZSgpLT5k
ZWZlcnNMb2FkaW5nKCkgfHwgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uOjppc0RlYnVnZ2VyUGF1
c2VkKG1fZnJhbWUpKTsKKyNlbmRpZgorCisgICAgUmVmUHRyPERvY3VtZW50TG9hZGVyPiBwcm90
ZWN0KHRoaXMpOworCisjaWYgVVNFKENPTlRFTlRfRklMVEVSSU5HKQorICAgIGlmIChtX2NvbnRl
bnRGaWx0ZXIgJiYgbV9jb250ZW50RmlsdGVyLT5uZWVkc01vcmVEYXRhKCkpIHsKKyAgICAgICAg
bV9jb250ZW50RmlsdGVyLT5maW5pc2hlZEFkZGluZ0RhdGEoKTsKKyAgICAgICAgaW50IGxlbmd0
aDsKKyAgICAgICAgY29uc3QgY2hhciogZGF0YSA9IG1fY29udGVudEZpbHRlci0+Z2V0UmVwbGFj
ZW1lbnREYXRhKGxlbmd0aCk7CisgICAgICAgIGlmIChkYXRhKQorICAgICAgICAgICAgcmVjZWl2
ZWREYXRhKGRhdGEsIGxlbmd0aCk7CisgICAgfQorI2VuZGlmCisKKyAgICBtYXliZUZpbmlzaExv
YWRpbmdNdWx0aXBhcnRDb250ZW50KCk7CisgICAgdGltaW5nKCktPnNldFJlc3BvbnNlRW5kKGZp
bmlzaFRpbWUgPyBmaW5pc2hUaW1lIDogKG1fdGltZU9mTGFzdERhdGFSZWNlaXZlZCA/IG1fdGlt
ZU9mTGFzdERhdGFSZWNlaXZlZCA6IG1vbm90b25pY2FsbHlJbmNyZWFzaW5nVGltZSgpKSk7CisK
ICAgICBjb21taXRJZlJlYWR5KCk7CiAgICAgaWYgKCFmcmFtZUxvYWRlcigpKQogICAgICAgICBy
ZXR1cm47CkBAIC0yOTgsOCArMzI0LDIxIEBACiAgICAgY2xlYXJNYWluUmVzb3VyY2VMb2FkZXIo
KTsKICAgICBpZiAoIWZyYW1lTG9hZGVyKCktPnN0YXRlTWFjaGluZSgpLT5jcmVhdGluZ0luaXRp
YWxFbXB0eURvY3VtZW50KCkpCiAgICAgICAgIGZyYW1lTG9hZGVyKCktPmNoZWNrTG9hZENvbXBs
ZXRlKCk7CisKKyAgICBtX2FwcGxpY2F0aW9uQ2FjaGVIb3N0LT5maW5pc2hlZExvYWRpbmdNYWlu
UmVzb3VyY2UoKTsKIH0KIAordm9pZCBEb2N1bWVudExvYWRlcjo6cmVzcG9uc2VSZWNlaXZlZChj
b25zdCBSZXNvdXJjZVJlc3BvbnNlJiByZXNwb25zZSkKK3sKKyAgICBzZXRSZXNwb25zZShyZXNw
b25zZSk7CisKKyNpZiBVU0UoQ09OVEVOVF9GSUxURVJJTkcpCisgICAgaWYgKHJlc3BvbnNlLnVy
bCgpLnByb3RvY29sSXMoImh0dHBzIikgJiYgQ29udGVudEZpbHRlcjo6aXNFbmFibGVkKCkpCisg
ICAgICAgIG1fY29udGVudEZpbHRlciA9IENvbnRlbnRGaWx0ZXI6OmNyZWF0ZShyZXNwb25zZSk7
CisjZW5kaWYKKworfQorCiB2b2lkIERvY3VtZW50TG9hZGVyOjpjb21taXRMb2FkKGNvbnN0IGNo
YXIqIGRhdGEsIGludCBsZW5ndGgpCiB7CiAgICAgLy8gQm90aCB1bmxvYWRpbmcgdGhlIG9sZCBw
YWdlIGFuZCBwYXJzaW5nIHRoZSBuZXcgcGFnZSBtYXkgZXhlY3V0ZSBKYXZhU2NyaXB0IHdoaWNo
IGRlc3Ryb3lzIHRoZSBkYXRhc291cmNlCkBAIC0zOTMsOCArNDMyLDUwIEBACiAKIHZvaWQgRG9j
dW1lbnRMb2FkZXI6OnJlY2VpdmVkRGF0YShjb25zdCBjaGFyKiBkYXRhLCBpbnQgbGVuZ3RoKQog
eworICAgIEFTU0VSVChkYXRhKTsKKyAgICBBU1NFUlQobGVuZ3RoKTsKKyAgICBBU1NFUlQoIW1f
cmVzcG9uc2UuaXNOdWxsKCkpOworCisjaWYgVVNFKENGTkVUV09SSykgfHwgUExBVEZPUk0oTUFD
KQorICAgIC8vIFdvcmthcm91bmQgZm9yIDxyZGFyOi8vcHJvYmxlbS82MDYwNzgyPgorICAgIGlm
IChtX3Jlc3BvbnNlLmlzTnVsbCgpKQorICAgICAgICBzZXRSZXNwb25zZShSZXNvdXJjZVJlc3Bv
bnNlKEtVUkwoKSwgInRleHQvaHRtbCIsIDAsIFN0cmluZygpLCBTdHJpbmcoKSkpOworI2VuZGlm
CisKKyAgICAvLyBUaGVyZSBpcyBhIGJ1ZyBpbiBDRk5ldHdvcmsgd2hlcmUgY2FsbGJhY2tzIGNh
biBiZSBkaXNwYXRjaGVkIGV2ZW4gd2hlbiBsb2FkcyBhcmUgZGVmZXJyZWQuCisgICAgLy8gU2Vl
IDxyZGFyOi8vcHJvYmxlbS82MzA0NjAwPiBmb3IgbW9yZSBkZXRhaWxzLgorI2lmICFVU0UoQ0Yp
CisgICAgQVNTRVJUKCFtX2ZyYW1lLT5wYWdlKCktPmRlZmVyc0xvYWRpbmcoKSk7CisjZW5kaWYK
KworI2lmIFVTRShDT05URU5UX0ZJTFRFUklORykKKyAgICBib29sIGxvYWRXYXNCbG9ja2VkQmVm
b3JlRmluaXNoaW5nID0gZmFsc2U7CisgICAgaWYgKG1fY29udGVudEZpbHRlciAmJiBtX2NvbnRl
bnRGaWx0ZXItPm5lZWRzTW9yZURhdGEoKSkgeworICAgICAgICBtX2NvbnRlbnRGaWx0ZXItPmFk
ZERhdGEoZGF0YSwgbGVuZ3RoKTsKKworICAgICAgICBpZiAobV9jb250ZW50RmlsdGVyLT5uZWVk
c01vcmVEYXRhKCkpIHsKKyAgICAgICAgICAgIC8vIFNpbmNlIHRoZSBmaWx0ZXIgc3RpbGwgbmVl
ZHMgbW9yZSBkYXRhIHRvIG1ha2UgYSBkZWNpc2lvbiwKKyAgICAgICAgICAgIC8vIHRyYW5zaXRp
b24gYmFjayB0byB0aGUgY29tbWl0dGVkIHN0YXRlIHNvIHRoYXQgd2UgZG9uJ3QgcGFydGlhbGx5
CisgICAgICAgICAgICAvLyBsb2FkIGNvbnRlbnQgdGhhdCBtaWdodCBsYXRlciBiZSBibG9ja2Vk
LgorICAgICAgICAgICAgY29tbWl0TG9hZCgwLCAwKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAg
ICAgICAgfQorCisgICAgICAgIGRhdGEgPSBtX2NvbnRlbnRGaWx0ZXItPmdldFJlcGxhY2VtZW50
RGF0YShsZW5ndGgpOworICAgICAgICBsb2FkV2FzQmxvY2tlZEJlZm9yZUZpbmlzaGluZyA9IG1f
Y29udGVudEZpbHRlci0+ZGlkQmxvY2tEYXRhKCk7CisgICAgfQorI2VuZGlmCisKKyAgICBtX2Fw
cGxpY2F0aW9uQ2FjaGVIb3N0LT5tYWluUmVzb3VyY2VEYXRhUmVjZWl2ZWQoZGF0YSwgbGVuZ3Ro
LCAtMSwgZmFsc2UpOworICAgIG1fdGltZU9mTGFzdERhdGFSZWNlaXZlZCA9IG1vbm90b25pY2Fs
bHlJbmNyZWFzaW5nVGltZSgpOworCiAgICAgaWYgKCFpc011bHRpcGFydFJlcGxhY2luZ0xvYWQo
KSkKICAgICAgICAgY29tbWl0TG9hZChkYXRhLCBsZW5ndGgpOworCisjaWYgVVNFKENPTlRFTlRf
RklMVEVSSU5HKQorICAgIGlmIChsb2FkV2FzQmxvY2tlZEJlZm9yZUZpbmlzaGluZykKKyAgICAg
ICAgY2FuY2VsTWFpblJlc291cmNlTG9hZCgpOworI2VuZGlmCiB9CiAKIHZvaWQgRG9jdW1lbnRM
b2FkZXI6OnNldHVwRm9yUmVwbGFjZSgpCkBAIC04NzYsNyArOTU3LDcgQEAKICAgICAgICAgbV9y
ZXF1ZXN0LnNldFVSTChibGFua1VSTCgpKTsKICAgICBTdHJpbmcgbWltZVR5cGUgPSBzaG91bGRM
b2FkRW1wdHkgPyAidGV4dC9odG1sIiA6IGZyYW1lTG9hZGVyKCktPmNsaWVudCgpLT5nZW5lcmF0
ZWRNSU1FVHlwZUZvclVSTFNjaGVtZShtX3JlcXVlc3QudXJsKCkucHJvdG9jb2woKSk7CiAgICAg
c2V0UmVzcG9uc2UoUmVzb3VyY2VSZXNwb25zZShtX3JlcXVlc3QudXJsKCksIG1pbWVUeXBlLCAw
LCBTdHJpbmcoKSwgU3RyaW5nKCkpKTsKLSAgICBmaW5pc2hlZExvYWRpbmcoKTsKKyAgICBmaW5p
c2hlZExvYWRpbmcoMCk7CiAgICAgcmV0dXJuIHRydWU7CiB9CiAKSW5kZXg6IFNvdXJjZS9XZWJD
b3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cJKHJl
dmlzaW9uIDE0MzAxMSkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5
KQpAQCAtMSwzICsxLDI1IEBACisyMDEzLTAyLTE1ICBOYXRlIENoYXBpbiAgPGphcGhldEBjaHJv
bWl1bS5vcmc+CisKKyAgICAgICAgTWVyZ2UgTWFpblJlc291cmNlTG9hZGVyJ3MgZGlkRmluaXNo
TG9hZGluZyBhbmQgZGF0YVJlY2VpdmVkIGludG8gRG9jdW1lbnRMb2FkZXIKKyAgICAgICAgaHR0
cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEwOTk1MgorCisgICAgICAgIFJl
dmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIE5vIG5ldyB0ZXN0cywgcmVmYWN0
b3Igb25seS4KKworICAgICAgICAqIGxvYWRlci9Eb2N1bWVudExvYWRlci5jcHA6CisgICAgICAg
IChXZWJDb3JlOjpEb2N1bWVudExvYWRlcjo6ZmluaXNoZWRMb2FkaW5nKToKKyAgICAgICAgKFdl
YkNvcmU6OkRvY3VtZW50TG9hZGVyOjpyZXNwb25zZVJlY2VpdmVkKToKKyAgICAgICAgKFdlYkNv
cmU6OkRvY3VtZW50TG9hZGVyOjpyZWNlaXZlZERhdGEpOgorICAgICAgICAoV2ViQ29yZTo6RG9j
dW1lbnRMb2FkZXI6Om1heWJlTG9hZEVtcHR5KToKKyAgICAgICAgKiBsb2FkZXIvRG9jdW1lbnRM
b2FkZXIuaDoKKyAgICAgICAgKiBsb2FkZXIvTWFpblJlc291cmNlTG9hZGVyLmNwcDoKKyAgICAg
ICAgKFdlYkNvcmU6Ok1haW5SZXNvdXJjZUxvYWRlcjo6cmVzcG9uc2VSZWNlaXZlZCk6IE1vdmUg
Y29udGVudCBmaWx0ZXJpbmcgdG8KKyAgICAgICAgICAgIERvY3VtZW50TG9hZGVyLgorICAgICAg
ICAoV2ViQ29yZTo6TWFpblJlc291cmNlTG9hZGVyOjpkYXRhUmVjZWl2ZWQpOiBNb3N0bHkgbW92
ZWQgdG8gRG9jdW1lbnRMb2FkZXIuCisgICAgICAgIChXZWJDb3JlOjpNYWluUmVzb3VyY2VMb2Fk
ZXI6OmRpZEZpbmlzaExvYWRpbmcpOiBNb3N0bHkgbW92ZWQgdG8gRG9jdW1lbnRMb2FkZXIuCisg
ICAgICAgICogbG9hZGVyL01haW5SZXNvdXJjZUxvYWRlci5oOgorCiAyMDEzLTAyLTE1ICBIYW5z
IE11bGxlciAgPGhtdWxsZXJAYWRvYmUuY29tPgogCiAgICAgICAgIFtDU1MgRXhjbHVzaW9uc10g
RW5hYmxlIHNoYXBlLWluc2lkZSBzdXBwb3J0IGZvciBjaXJjbGVzCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>192582</attachid>
            <date>2013-03-11 15:39:50 -0700</date>
            <delta_ts>2013-03-13 11:42:20 -0700</delta_ts>
            <desc>address comments</desc>
            <filename>dl_mrl_finish_0311.txt</filename>
            <type>text/plain</type>
            <size>15845</size>
            <attacher name="Nate Chapin">japhet</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDE0NTQwNSkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDI3IEBACisyMDEzLTAzLTExICBOYXRlIENo
YXBpbiAgPGphcGhldEBjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgTWVyZ2UgTWFpblJlc291cmNl
TG9hZGVyJ3MgZGlkRmluaXNoTG9hZGluZyBhbmQgZGF0YVJlY2VpdmVkIGludG8gRG9jdW1lbnRM
b2FkZXIKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEw
OTk1MgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIE5v
IG5ldyB0ZXN0cywgcmVmYWN0b3Igb25seS4KKworICAgICAgICAqIGxvYWRlci9Eb2N1bWVudExv
YWRlci5jcHA6CisgICAgICAgIChXZWJDb3JlOjpEb2N1bWVudExvYWRlcjo6RG9jdW1lbnRMb2Fk
ZXIpOgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1lbnRMb2FkZXI6OmZpbmlzaGVkTG9hZGluZyk6
CisgICAgICAgIChXZWJDb3JlOjpEb2N1bWVudExvYWRlcjo6cmVzcG9uc2VSZWNlaXZlZCk6Cisg
ICAgICAgIChXZWJDb3JlOjpEb2N1bWVudExvYWRlcjo6cmVjZWl2ZWREYXRhKToKKyAgICAgICAg
KFdlYkNvcmU6OkRvY3VtZW50TG9hZGVyOjptYXliZUxvYWRFbXB0eSk6CisgICAgICAgICogbG9h
ZGVyL0RvY3VtZW50TG9hZGVyLmg6CisgICAgICAgICogbG9hZGVyL01haW5SZXNvdXJjZUxvYWRl
ci5jcHA6CisgICAgICAgIChXZWJDb3JlOjpNYWluUmVzb3VyY2VMb2FkZXI6OnJlc3BvbnNlUmVj
ZWl2ZWQpOiBNb3ZlIGNvbnRlbnQgZmlsdGVyaW5nIHRvCisgICAgICAgICAgICBEb2N1bWVudExv
YWRlci4KKyAgICAgICAgKFdlYkNvcmU6Ok1haW5SZXNvdXJjZUxvYWRlcjo6ZGF0YVJlY2VpdmVk
KTogTW9zdGx5IG1vdmVkIHRvIERvY3VtZW50TG9hZGVyLgorICAgICAgICAoV2ViQ29yZTo6TWFp
blJlc291cmNlTG9hZGVyOjpkaWRGaW5pc2hMb2FkaW5nKTogTW9zdGx5IG1vdmVkIHRvIERvY3Vt
ZW50TG9hZGVyLgorICAgICAgICAqIGxvYWRlci9NYWluUmVzb3VyY2VMb2FkZXIuaDogRXhwb3Nl
IHNvbWUgdmFyaWFibGVzIHRoYXQgaGF2ZW4ndCBiZWVuIG1vdmVkCisgICAgICAgICAgICB0byBE
b2N1bWVudExvYWRlciB5ZXQuCisKIDIwMTMtMDMtMTEgIEphbWVzIFJvYmluc29uICA8amFtZXNy
QGNocm9taXVtLm9yZz4KIAogICAgICAgICBDb21waWxlIGZpeC4gUnViYmVyLXN0YW1wIGJ5IEVy
aWMgU2VpZGVsLgpJbmRleDogU291cmNlL1dlYkNvcmUvbG9hZGVyL0RvY3VtZW50TG9hZGVyLmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9sb2FkZXIvRG9jdW1lbnRMb2FkZXIuY3Bw
CShyZXZpc2lvbiAxNDUzNzUpCisrKyBTb3VyY2UvV2ViQ29yZS9sb2FkZXIvRG9jdW1lbnRMb2Fk
ZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00Nyw2ICs0Nyw3IEBACiAjaW5jbHVkZSAiSW5zcGVj
dG9ySW5zdHJ1bWVudGF0aW9uLmgiCiAjaW5jbHVkZSAiTG9nZ2luZy5oIgogI2luY2x1ZGUgIk1h
aW5SZXNvdXJjZUxvYWRlci5oIgorI2luY2x1ZGUgIk1lbW9yeUNhY2hlLmgiCiAjaW5jbHVkZSAi
UGFnZS5oIgogI2luY2x1ZGUgIlJlc291cmNlQnVmZmVyLmgiCiAjaW5jbHVkZSAiU2NoZW1lUmVn
aXN0cnkuaCIKQEAgLTY1LDYgKzY2LDEwIEBACiAjaW5jbHVkZSAiQXJjaGl2ZUZhY3RvcnkuaCIK
ICNlbmRpZgogCisjaWYgVVNFKENPTlRFTlRfRklMVEVSSU5HKQorI2luY2x1ZGUgIkNvbnRlbnRG
aWx0ZXIuaCIKKyNlbmRpZgorCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKIHN0YXRpYyB2b2lkIGNh
bmNlbEFsbChjb25zdCBSZXNvdXJjZUxvYWRlclNldCYgbG9hZGVycykKQEAgLTEwMyw2ICsxMDgs
NyBAQAogICAgICwgbV9zdG9wUmVjb3JkaW5nUmVzcG9uc2VzKGZhbHNlKQogICAgICwgbV9zdWJz
dGl0dXRlUmVzb3VyY2VEZWxpdmVyeVRpbWVyKHRoaXMsICZEb2N1bWVudExvYWRlcjo6c3Vic3Rp
dHV0ZVJlc291cmNlRGVsaXZlcnlUaW1lckZpcmVkKQogICAgICwgbV9kaWRDcmVhdGVHbG9iYWxI
aXN0b3J5RW50cnkoZmFsc2UpCisgICAgLCBtX3RpbWVPZkxhc3REYXRhUmVjZWl2ZWQoMC4wKQog
ICAgICwgbV9hcHBsaWNhdGlvbkNhY2hlSG9zdChhZG9wdFB0cihuZXcgQXBwbGljYXRpb25DYWNo
ZUhvc3QodGhpcykpKQogewogfQpAQCAtMjk3LDggKzMwMywzMiBAQAogICAgIHJldHVybiBpc0xv
YWRpbmdNYWluUmVzb3VyY2UoKSB8fCAhbV9zdWJyZXNvdXJjZUxvYWRlcnMuaXNFbXB0eSgpIHx8
ICFtX3BsdWdJblN0cmVhbUxvYWRlcnMuaXNFbXB0eSgpOwogfQogCi12b2lkIERvY3VtZW50TG9h
ZGVyOjpmaW5pc2hlZExvYWRpbmcoKQordm9pZCBEb2N1bWVudExvYWRlcjo6ZmluaXNoZWRMb2Fk
aW5nKGRvdWJsZSBmaW5pc2hUaW1lKQogeworICAgIC8vIFRoZXJlIGlzIGEgYnVnIGluIENGTmV0
d29yayB3aGVyZSBjYWxsYmFja3MgY2FuIGJlIGRpc3BhdGNoZWQgZXZlbiB3aGVuIGxvYWRzIGFy
ZSBkZWZlcnJlZC4KKyAgICAvLyBTZWUgPHJkYXI6Ly9wcm9ibGVtLzYzMDQ2MDA+IGZvciBtb3Jl
IGRldGFpbHMuCisjaWYgIVVTRShDRikKKyAgICBBU1NFUlQoIW1fZnJhbWUtPnBhZ2UoKS0+ZGVm
ZXJzTG9hZGluZygpIHx8IEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6aXNEZWJ1Z2dlclBhdXNl
ZChtX2ZyYW1lKSk7CisjZW5kaWYKKworICAgIGlmIChtYWluUmVzb3VyY2VMb2FkZXIoKSAmJiBt
YWluUmVzb3VyY2VMb2FkZXIoKS0+aWRlbnRpZmllckZvckxvYWRXaXRob3V0UmVzb3VyY2VMb2Fk
ZXIoKSkgeworICAgICAgICBmcmFtZUxvYWRlcigpLT5ub3RpZmllcigpLT5kaXNwYXRjaERpZEZp
bmlzaExvYWRpbmcodGhpcywgbWFpblJlc291cmNlTG9hZGVyKCktPmlkZW50aWZpZXIoKSwgZmlu
aXNoVGltZSk7CisgICAgICAgIG1haW5SZXNvdXJjZUxvYWRlcigpLT5jbGVhcklkZW50aWZpZXJG
b3JMb2FkV2l0aG91dFJlc291cmNlTG9hZGVyKCk7CisgICAgfQorCisjaWYgVVNFKENPTlRFTlRf
RklMVEVSSU5HKQorICAgIGlmIChtX2NvbnRlbnRGaWx0ZXIgJiYgbV9jb250ZW50RmlsdGVyLT5u
ZWVkc01vcmVEYXRhKCkpIHsKKyAgICAgICAgbV9jb250ZW50RmlsdGVyLT5maW5pc2hlZEFkZGlu
Z0RhdGEoKTsKKyAgICAgICAgaW50IGxlbmd0aDsKKyAgICAgICAgY29uc3QgY2hhciogZGF0YSA9
IG1fY29udGVudEZpbHRlci0+Z2V0UmVwbGFjZW1lbnREYXRhKGxlbmd0aCk7CisgICAgICAgIGlm
IChkYXRhKQorICAgICAgICAgICAgcmVjZWl2ZWREYXRhKGRhdGEsIGxlbmd0aCk7CisgICAgfQor
I2VuZGlmCisKKyAgICBtYXliZUZpbmlzaExvYWRpbmdNdWx0aXBhcnRDb250ZW50KCk7CisgICAg
dGltaW5nKCktPnNldFJlc3BvbnNlRW5kKGZpbmlzaFRpbWUgPyBmaW5pc2hUaW1lIDogKG1fdGlt
ZU9mTGFzdERhdGFSZWNlaXZlZCA/IG1fdGltZU9mTGFzdERhdGFSZWNlaXZlZCA6IG1vbm90b25p
Y2FsbHlJbmNyZWFzaW5nVGltZSgpKSk7CisKICAgICBjb21taXRJZlJlYWR5KCk7CiAgICAgaWYg
KCFmcmFtZUxvYWRlcigpKQogICAgICAgICByZXR1cm47CkBAIC0zMTcsOCArMzQ3LDI4IEBACiAg
ICAgY2xlYXJNYWluUmVzb3VyY2VMb2FkZXIoKTsKICAgICBpZiAoIWZyYW1lTG9hZGVyKCktPnN0
YXRlTWFjaGluZSgpLT5jcmVhdGluZ0luaXRpYWxFbXB0eURvY3VtZW50KCkpCiAgICAgICAgIGZy
YW1lTG9hZGVyKCktPmNoZWNrTG9hZENvbXBsZXRlKCk7CisKKworICAgIC8vIElmIHRoZSBkb2N1
bWVudCBzcGVjaWZpZWQgYW4gYXBwbGljYXRpb24gY2FjaGUgbWFuaWZlc3QsIGl0IHZpb2xhdGVz
IHRoZSBhdXRob3IncyBpbnRlbnQgaWYgd2Ugc3RvcmUgaXQgaW4gdGhlIG1lbW9yeSBjYWNoZQor
ICAgIC8vIGFuZCBkZW55IHRoZSBhcHBjYWNoZSB0aGUgY2hhbmNlIHRvIGludGVyY2VwdCBpdCBp
biB0aGUgZnV0dXJlLCBzbyByZW1vdmUgZnJvbSB0aGUgbWVtb3J5IGNhY2hlLgorICAgIGlmIChm
cmFtZSgpICYmIG1haW5SZXNvdXJjZUxvYWRlcigpKSB7CisgICAgICAgIGlmIChtYWluUmVzb3Vy
Y2VMb2FkZXIoKS0+Y2FjaGVkTWFpblJlc291cmNlKCkgJiYgZnJhbWUoKS0+ZG9jdW1lbnQoKS0+
aGFzTWFuaWZlc3QoKSkKKyAgICAgICAgICAgIG1lbW9yeUNhY2hlKCktPnJlbW92ZShtYWluUmVz
b3VyY2VMb2FkZXIoKS0+Y2FjaGVkTWFpblJlc291cmNlKCkpOworICAgIH0KKyAgICBtX2FwcGxp
Y2F0aW9uQ2FjaGVIb3N0LT5maW5pc2hlZExvYWRpbmdNYWluUmVzb3VyY2UoKTsKIH0KIAordm9p
ZCBEb2N1bWVudExvYWRlcjo6cmVzcG9uc2VSZWNlaXZlZChjb25zdCBSZXNvdXJjZVJlc3BvbnNl
JiByZXNwb25zZSkKK3sKKyAgICBzZXRSZXNwb25zZShyZXNwb25zZSk7CisKKyNpZiBVU0UoQ09O
VEVOVF9GSUxURVJJTkcpCisgICAgaWYgKHJlc3BvbnNlLnVybCgpLnByb3RvY29sSXMoImh0dHBz
IikgJiYgQ29udGVudEZpbHRlcjo6aXNFbmFibGVkKCkpCisgICAgICAgIG1fY29udGVudEZpbHRl
ciA9IENvbnRlbnRGaWx0ZXI6OmNyZWF0ZShyZXNwb25zZSk7CisjZW5kaWYKKworfQorCiB2b2lk
IERvY3VtZW50TG9hZGVyOjpjb21taXRMb2FkKGNvbnN0IGNoYXIqIGRhdGEsIGludCBsZW5ndGgp
CiB7CiAgICAgLy8gQm90aCB1bmxvYWRpbmcgdGhlIG9sZCBwYWdlIGFuZCBwYXJzaW5nIHRoZSBu
ZXcgcGFnZSBtYXkgZXhlY3V0ZSBKYXZhU2NyaXB0IHdoaWNoIGRlc3Ryb3lzIHRoZSBkYXRhc291
cmNlCkBAIC00MTIsOCArNDYyLDUzIEBACiAKIHZvaWQgRG9jdW1lbnRMb2FkZXI6OnJlY2VpdmVk
RGF0YShjb25zdCBjaGFyKiBkYXRhLCBpbnQgbGVuZ3RoKQogeworICAgIEFTU0VSVChkYXRhKTsK
KyAgICBBU1NFUlQobGVuZ3RoKTsKKyAgICBBU1NFUlQoIW1fcmVzcG9uc2UuaXNOdWxsKCkpOwor
CisjaWYgVVNFKENGTkVUV09SSykgfHwgUExBVEZPUk0oTUFDKQorICAgIC8vIFdvcmthcm91bmQg
Zm9yIDxyZGFyOi8vcHJvYmxlbS82MDYwNzgyPgorICAgIGlmIChtX3Jlc3BvbnNlLmlzTnVsbCgp
KQorICAgICAgICBzZXRSZXNwb25zZShSZXNvdXJjZVJlc3BvbnNlKEtVUkwoKSwgInRleHQvaHRt
bCIsIDAsIFN0cmluZygpLCBTdHJpbmcoKSkpOworI2VuZGlmCisKKyAgICAvLyBUaGVyZSBpcyBh
IGJ1ZyBpbiBDRk5ldHdvcmsgd2hlcmUgY2FsbGJhY2tzIGNhbiBiZSBkaXNwYXRjaGVkIGV2ZW4g
d2hlbiBsb2FkcyBhcmUgZGVmZXJyZWQuCisgICAgLy8gU2VlIDxyZGFyOi8vcHJvYmxlbS82MzA0
NjAwPiBmb3IgbW9yZSBkZXRhaWxzLgorI2lmICFVU0UoQ0YpCisgICAgQVNTRVJUKCFtX2ZyYW1l
LT5wYWdlKCktPmRlZmVyc0xvYWRpbmcoKSk7CisjZW5kaWYKKworI2lmIFVTRShDT05URU5UX0ZJ
TFRFUklORykKKyAgICBib29sIGxvYWRXYXNCbG9ja2VkQmVmb3JlRmluaXNoaW5nID0gZmFsc2U7
CisgICAgaWYgKG1fY29udGVudEZpbHRlciAmJiBtX2NvbnRlbnRGaWx0ZXItPm5lZWRzTW9yZURh
dGEoKSkgeworICAgICAgICBtX2NvbnRlbnRGaWx0ZXItPmFkZERhdGEoZGF0YSwgbGVuZ3RoKTsK
KworICAgICAgICBpZiAobV9jb250ZW50RmlsdGVyLT5uZWVkc01vcmVEYXRhKCkpIHsKKyAgICAg
ICAgICAgIC8vIFNpbmNlIHRoZSBmaWx0ZXIgc3RpbGwgbmVlZHMgbW9yZSBkYXRhIHRvIG1ha2Ug
YSBkZWNpc2lvbiwKKyAgICAgICAgICAgIC8vIHRyYW5zaXRpb24gYmFjayB0byB0aGUgY29tbWl0
dGVkIHN0YXRlIHNvIHRoYXQgd2UgZG9uJ3QgcGFydGlhbGx5CisgICAgICAgICAgICAvLyBsb2Fk
IGNvbnRlbnQgdGhhdCBtaWdodCBsYXRlciBiZSBibG9ja2VkLgorICAgICAgICAgICAgY29tbWl0
TG9hZCgwLCAwKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGRh
dGEgPSBtX2NvbnRlbnRGaWx0ZXItPmdldFJlcGxhY2VtZW50RGF0YShsZW5ndGgpOworICAgICAg
ICBsb2FkV2FzQmxvY2tlZEJlZm9yZUZpbmlzaGluZyA9IG1fY29udGVudEZpbHRlci0+ZGlkQmxv
Y2tEYXRhKCk7CisgICAgfQorI2VuZGlmCisKKyAgICBpZiAobWFpblJlc291cmNlTG9hZGVyKCkt
PmlkZW50aWZpZXJGb3JMb2FkV2l0aG91dFJlc291cmNlTG9hZGVyKCkpCisgICAgICAgIGZyYW1l
TG9hZGVyKCktPm5vdGlmaWVyKCktPmRpc3BhdGNoRGlkUmVjZWl2ZURhdGEodGhpcywgbWFpblJl
c291cmNlTG9hZGVyKCktPmlkZW50aWZpZXIoKSwgZGF0YSwgbGVuZ3RoLCAtMSk7CisKKyAgICBt
X2FwcGxpY2F0aW9uQ2FjaGVIb3N0LT5tYWluUmVzb3VyY2VEYXRhUmVjZWl2ZWQoZGF0YSwgbGVu
Z3RoLCAtMSwgZmFsc2UpOworICAgIG1fdGltZU9mTGFzdERhdGFSZWNlaXZlZCA9IG1vbm90b25p
Y2FsbHlJbmNyZWFzaW5nVGltZSgpOworCiAgICAgaWYgKCFpc011bHRpcGFydFJlcGxhY2luZ0xv
YWQoKSkKICAgICAgICAgY29tbWl0TG9hZChkYXRhLCBsZW5ndGgpOworCisjaWYgVVNFKENPTlRF
TlRfRklMVEVSSU5HKQorICAgIGlmIChsb2FkV2FzQmxvY2tlZEJlZm9yZUZpbmlzaGluZykKKyAg
ICAgICAgY2FuY2VsTWFpblJlc291cmNlTG9hZChSZXNvdXJjZUVycm9yKCkpOworI2VuZGlmCiB9
CiAKIHZvaWQgRG9jdW1lbnRMb2FkZXI6OnNldHVwRm9yUmVwbGFjZSgpCkBAIC04OTksNyArOTk0
LDcgQEAKICAgICAgICAgbV9yZXF1ZXN0LnNldFVSTChibGFua1VSTCgpKTsKICAgICBTdHJpbmcg
bWltZVR5cGUgPSBzaG91bGRMb2FkRW1wdHkgPyAidGV4dC9odG1sIiA6IGZyYW1lTG9hZGVyKCkt
PmNsaWVudCgpLT5nZW5lcmF0ZWRNSU1FVHlwZUZvclVSTFNjaGVtZShtX3JlcXVlc3QudXJsKCku
cHJvdG9jb2woKSk7CiAgICAgc2V0UmVzcG9uc2UoUmVzb3VyY2VSZXNwb25zZShtX3JlcXVlc3Qu
dXJsKCksIG1pbWVUeXBlLCAwLCBTdHJpbmcoKSwgU3RyaW5nKCkpKTsKLSAgICBmaW5pc2hlZExv
YWRpbmcoKTsKKyAgICBmaW5pc2hlZExvYWRpbmcobW9ub3RvbmljYWxseUluY3JlYXNpbmdUaW1l
KCkpOwogICAgIHJldHVybiB0cnVlOwogfQogCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9sb2FkZXIv
TWFpblJlc291cmNlTG9hZGVyLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvbG9hZGVy
L01haW5SZXNvdXJjZUxvYWRlci5oCShyZXZpc2lvbiAxNDUzNzUpCisrKyBTb3VyY2UvV2ViQ29y
ZS9sb2FkZXIvTWFpblJlc291cmNlTG9hZGVyLmgJKHdvcmtpbmcgY29weSkKQEAgLTQ2LDEwICs0
Niw2IEBACiAKIGNsYXNzIEZvcm1TdGF0ZTsKIGNsYXNzIFJlc291cmNlUmVxdWVzdDsKLSAgICAK
LSNpZiBVU0UoQ09OVEVOVF9GSUxURVJJTkcpCi1jbGFzcyBDb250ZW50RmlsdGVyOwotI2VuZGlm
CiAKIGNsYXNzIE1haW5SZXNvdXJjZUxvYWRlciA6IHB1YmxpYyBSZWZDb3VudGVkPE1haW5SZXNv
dXJjZUxvYWRlcj4sIHB1YmxpYyBDYWNoZWRSYXdSZXNvdXJjZUNsaWVudCB7CiAgICAgV1RGX01B
S0VfRkFTVF9BTExPQ0FURUQ7CkBAIC03Miw2ICs2OCwxMCBAQAogICAgIHR5cGVkZWYgVGltZXI8
TWFpblJlc291cmNlTG9hZGVyPiBNYWluUmVzb3VyY2VMb2FkZXJUaW1lcjsKICNlbmRpZgogCisg
ICAgQ2FjaGVkUmF3UmVzb3VyY2UqIGNhY2hlZE1haW5SZXNvdXJjZSgpIHsgcmV0dXJuIG1fcmVz
b3VyY2UuZ2V0KCk7IH0KKyAgICB1bnNpZ25lZCBsb25nIGlkZW50aWZpZXJGb3JMb2FkV2l0aG91
dFJlc291cmNlTG9hZGVyKCkgY29uc3QgeyByZXR1cm4gbV9pZGVudGlmaWVyRm9yTG9hZFdpdGhv
dXRSZXNvdXJjZUxvYWRlcjsgfQorICAgIHZvaWQgY2xlYXJJZGVudGlmaWVyRm9yTG9hZFdpdGhv
dXRSZXNvdXJjZUxvYWRlcigpIHsgbV9pZGVudGlmaWVyRm9yTG9hZFdpdGhvdXRSZXNvdXJjZUxv
YWRlciA9IDA7IH0KKwogICAgIHVuc2lnbmVkIGxvbmcgaWRlbnRpZmllcigpIGNvbnN0OwogICAg
IGJvb2wgaXNMb2FkaW5nTXVsdGlwYXJ0Q29udGVudCgpIGNvbnN0IHsgcmV0dXJuIG1fbG9hZGlu
Z011bHRpcGFydENvbnRlbnQ7IH0KIApAQCAtMTI3LDEyICsxMjcsNyBAQAogCiAgICAgYm9vbCBt
X2xvYWRpbmdNdWx0aXBhcnRDb250ZW50OwogICAgIGJvb2wgbV93YWl0aW5nRm9yQ29udGVudFBv
bGljeTsKLSAgICBkb3VibGUgbV90aW1lT2ZMYXN0RGF0YVJlY2VpdmVkOwogICAgIHVuc2lnbmVk
IGxvbmcgbV9pZGVudGlmaWVyRm9yTG9hZFdpdGhvdXRSZXNvdXJjZUxvYWRlcjsKLQotI2lmIFVT
RShDT05URU5UX0ZJTFRFUklORykKLSAgICBSZWZQdHI8Q29udGVudEZpbHRlcj4gbV9jb250ZW50
RmlsdGVyOwotI2VuZGlmCiB9OwogCiB9CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9sb2FkZXIvRG9j
dW1lbnRMb2FkZXIuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9sb2FkZXIvRG9jdW1l
bnRMb2FkZXIuaAkocmV2aXNpb24gMTQ1Mzc1KQorKysgU291cmNlL1dlYkNvcmUvbG9hZGVyL0Rv
Y3VtZW50TG9hZGVyLmgJKHdvcmtpbmcgY29weSkKQEAgLTUzLDYgKzUzLDcgQEAKICAgICBjbGFz
cyBBcmNoaXZlUmVzb3VyY2U7CiAgICAgY2xhc3MgQXJjaGl2ZVJlc291cmNlQ29sbGVjdGlvbjsK
ICAgICBjbGFzcyBDYWNoZWRSZXNvdXJjZUxvYWRlcjsKKyAgICBjbGFzcyBDb250ZW50RmlsdGVy
OwogICAgIGNsYXNzIEZyYW1lOwogICAgIGNsYXNzIEZyYW1lTG9hZGVyOwogICAgIGNsYXNzIE1h
aW5SZXNvdXJjZUxvYWRlcjsKQEAgLTExOCw3ICsxMTksNyBAQAogICAgICAgICBib29sIGlzTG9h
ZGluZygpIGNvbnN0OwogICAgICAgICB2b2lkIHJlY2VpdmVkRGF0YShjb25zdCBjaGFyKiwgaW50
KTsKICAgICAgICAgdm9pZCBzZXR1cEZvclJlcGxhY2UoKTsKLSAgICAgICAgdm9pZCBmaW5pc2hl
ZExvYWRpbmcoKTsKKyAgICAgICAgdm9pZCBmaW5pc2hlZExvYWRpbmcoZG91YmxlIGZpbmlzaFRp
bWUpOwogICAgICAgICBjb25zdCBSZXNvdXJjZVJlc3BvbnNlJiByZXNwb25zZSgpIGNvbnN0IHsg
cmV0dXJuIG1fcmVzcG9uc2U7IH0KICAgICAgICAgY29uc3QgUmVzb3VyY2VFcnJvciYgbWFpbkRv
Y3VtZW50RXJyb3IoKSBjb25zdCB7IHJldHVybiBtX21haW5Eb2N1bWVudEVycm9yOyB9CiAgICAg
ICAgIHZvaWQgbWFpblJlY2VpdmVkRXJyb3IoY29uc3QgUmVzb3VyY2VFcnJvciYpOwpAQCAtMjQx
LDYgKzI0Miw4IEBACiAgICAgICAgIERvY3VtZW50TG9hZFRpbWluZyogdGltaW5nKCkgeyByZXR1
cm4gJm1fZG9jdW1lbnRMb2FkVGltaW5nOyB9CiAgICAgICAgIHZvaWQgcmVzZXRUaW1pbmcoKSB7
IG1fZG9jdW1lbnRMb2FkVGltaW5nID0gRG9jdW1lbnRMb2FkVGltaW5nKCk7IH0KIAorICAgICAg
ICB2b2lkIHJlc3BvbnNlUmVjZWl2ZWQoY29uc3QgUmVzb3VyY2VSZXNwb25zZSYpOworCiAgICAg
ICAgIC8vIFRoZSBXZWJLaXQgbGF5ZXIgY2FsbHMgdGhpcyBmdW5jdGlvbiB3aGVuIGl0J3MgcmVh
ZHkgZm9yIHRoZSBkYXRhIHRvCiAgICAgICAgIC8vIGFjdHVhbGx5IGJlIGFkZGVkIHRvIHRoZSBk
b2N1bWVudC4KICAgICAgICAgdm9pZCBjb21taXREYXRhKGNvbnN0IGNoYXIqIGJ5dGVzLCBzaXpl
X3QgbGVuZ3RoKTsKQEAgLTM1MSwxMiArMzU0LDE4IEBACiAgICAgICAgIGJvb2wgbV9kaWRDcmVh
dGVHbG9iYWxIaXN0b3J5RW50cnk7CiAKICAgICAgICAgRG9jdW1lbnRMb2FkVGltaW5nIG1fZG9j
dW1lbnRMb2FkVGltaW5nOworCisgICAgICAgIGRvdWJsZSBtX3RpbWVPZkxhc3REYXRhUmVjZWl2
ZWQ7CiAgICAgCiAgICAgICAgIFJlZlB0cjxJY29uTG9hZERlY2lzaW9uQ2FsbGJhY2s+IG1faWNv
bkxvYWREZWNpc2lvbkNhbGxiYWNrOwogICAgICAgICBSZWZQdHI8SWNvbkRhdGFDYWxsYmFjaz4g
bV9pY29uRGF0YUNhbGxiYWNrOwogCiAgICAgICAgIGZyaWVuZCBjbGFzcyBBcHBsaWNhdGlvbkNh
Y2hlSG9zdDsgIC8vIGZvciBzdWJzdGl0dXRlIHJlc291cmNlIGRlbGl2ZXJ5CiAgICAgICAgIE93
blB0cjxBcHBsaWNhdGlvbkNhY2hlSG9zdD4gbV9hcHBsaWNhdGlvbkNhY2hlSG9zdDsKKworI2lm
IFVTRShDT05URU5UX0ZJTFRFUklORykKKyAgICAgICAgUmVmUHRyPENvbnRlbnRGaWx0ZXI+IG1f
Y29udGVudEZpbHRlcjsKKyNlbmRpZgogICAgIH07CiAKICAgICBpbmxpbmUgdm9pZCBEb2N1bWVu
dExvYWRlcjo6cmVjb3JkTWVtb3J5Q2FjaGVMb2FkRm9yRnV0dXJlQ2xpZW50Tm90aWZpY2F0aW9u
KGNvbnN0IFJlc291cmNlUmVxdWVzdCYgcmVxdWVzdCkKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2xv
YWRlci9NYWluUmVzb3VyY2VMb2FkZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3Jl
L2xvYWRlci9NYWluUmVzb3VyY2VMb2FkZXIuY3BwCShyZXZpc2lvbiAxNDUzNzUpCisrKyBTb3Vy
Y2UvV2ViQ29yZS9sb2FkZXIvTWFpblJlc291cmNlTG9hZGVyLmNwcAkod29ya2luZyBjb3B5KQpA
QCAtNjQsMTAgKzY0LDYgQEAKICNpbmNsdWRlICJQbHVnaW5EYXRhYmFzZS5oIgogI2VuZGlmCiAK
LSNpZiBVU0UoQ09OVEVOVF9GSUxURVJJTkcpCi0jaW5jbHVkZSAiQ29udGVudEZpbHRlci5oIgot
I2VuZGlmCi0KIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogTWFpblJlc291cmNlTG9hZGVyOjpNYWlu
UmVzb3VyY2VMb2FkZXIoRG9jdW1lbnRMb2FkZXIqIGRvY3VtZW50TG9hZGVyKQpAQCAtNzUsNyAr
NzEsNiBAQAogICAgICwgbV9kb2N1bWVudExvYWRlcihkb2N1bWVudExvYWRlcikKICAgICAsIG1f
bG9hZGluZ011bHRpcGFydENvbnRlbnQoZmFsc2UpCiAgICAgLCBtX3dhaXRpbmdGb3JDb250ZW50
UG9saWN5KGZhbHNlKQotICAgICwgbV90aW1lT2ZMYXN0RGF0YVJlY2VpdmVkKDAuMCkKICAgICAs
IG1faWRlbnRpZmllckZvckxvYWRXaXRob3V0UmVzb3VyY2VMb2FkZXIoMCkKIHsKIH0KQEAgLTQz
OCw3ICs0MzMsNyBAQAogICAgIC8vIHJlZmVyZW5jZSB0byB0aGlzIG9iamVjdDsgb25lIGV4YW1w
bGUgb2YgdGhpcyBpcyAzMjY2MjE2LgogICAgIFJlZlB0cjxNYWluUmVzb3VyY2VMb2FkZXI+IHBy
b3RlY3QodGhpcyk7CiAKLSAgICBtX2RvY3VtZW50TG9hZGVyLT5zZXRSZXNwb25zZShyKTsKKyAg
ICBtX2RvY3VtZW50TG9hZGVyLT5yZXNwb25zZVJlY2VpdmVkKHIpOwogCiAgICAgbV9yZXNwb25z
ZSA9IHI7CiAKQEAgLTQ2NCwxMTYgKzQ1OSwyMSBAQAogICAgIH0KICNlbmRpZgogCi0jaWYgVVNF
KENPTlRFTlRfRklMVEVSSU5HKQotICAgIGlmIChyLnVybCgpLnByb3RvY29sSXMoImh0dHBzIikg
JiYgQ29udGVudEZpbHRlcjo6aXNFbmFibGVkKCkpCi0gICAgICAgIG1fY29udGVudEZpbHRlciA9
IENvbnRlbnRGaWx0ZXI6OmNyZWF0ZShyKTsKLSNlbmRpZgotCiAgICAgZnJhbWVMb2FkZXIoKS0+
cG9saWN5Q2hlY2tlcigpLT5jaGVja0NvbnRlbnRQb2xpY3kobV9yZXNwb25zZSwgY2FsbENvbnRp
bnVlQWZ0ZXJDb250ZW50UG9saWN5LCB0aGlzKTsKIH0KIAogdm9pZCBNYWluUmVzb3VyY2VMb2Fk
ZXI6OmRhdGFSZWNlaXZlZChDYWNoZWRSZXNvdXJjZSogcmVzb3VyY2UsIGNvbnN0IGNoYXIqIGRh
dGEsIGludCBsZW5ndGgpCiB7Ci0gICAgQVNTRVJUKGRhdGEpOwotICAgIEFTU0VSVChsZW5ndGgg
IT0gMCk7CiAgICAgQVNTRVJUX1VOVVNFRChyZXNvdXJjZSwgcmVzb3VyY2UgPT0gbV9yZXNvdXJj
ZSk7Ci0gICAgQVNTRVJUKCFtX3Jlc3BvbnNlLmlzTnVsbCgpKTsKLQotI2lmIFVTRShDRk5FVFdP
UkspIHx8IFBMQVRGT1JNKE1BQykKLSAgICAvLyBXb3JrYXJvdW5kIGZvciA8cmRhcjovL3Byb2Js
ZW0vNjA2MDc4Mj4KLSAgICBpZiAobV9yZXNwb25zZS5pc051bGwoKSkgewotICAgICAgICBtX3Jl
c3BvbnNlID0gUmVzb3VyY2VSZXNwb25zZShLVVJMKCksICJ0ZXh0L2h0bWwiLCAwLCBTdHJpbmco
KSwgU3RyaW5nKCkpOwotICAgICAgICBpZiAoRG9jdW1lbnRMb2FkZXIqIGRvY3VtZW50TG9hZGVy
ID0gbV9kb2N1bWVudExvYWRlci5nZXQoKSkKLSAgICAgICAgICAgIGRvY3VtZW50TG9hZGVyLT5z
ZXRSZXNwb25zZShtX3Jlc3BvbnNlKTsKLSAgICB9Ci0jZW5kaWYKLQotICAgIC8vIFRoZXJlIGlz
IGEgYnVnIGluIENGTmV0d29yayB3aGVyZSBjYWxsYmFja3MgY2FuIGJlIGRpc3BhdGNoZWQgZXZl
biB3aGVuIGxvYWRzIGFyZSBkZWZlcnJlZC4KLSAgICAvLyBTZWUgPHJkYXI6Ly9wcm9ibGVtLzYz
MDQ2MDA+IGZvciBtb3JlIGRldGFpbHMuCi0jaWYgIVVTRShDRikKLSAgICBBU1NFUlQoIWRlZmVy
c0xvYWRpbmcoKSk7Ci0jZW5kaWYKLQotI2lmIFVTRShDT05URU5UX0ZJTFRFUklORykKLSAgICBi
b29sIGxvYWRXYXNCbG9ja2VkQmVmb3JlRmluaXNoaW5nID0gZmFsc2U7Ci0gICAgaWYgKG1fY29u
dGVudEZpbHRlciAmJiBtX2NvbnRlbnRGaWx0ZXItPm5lZWRzTW9yZURhdGEoKSkgewotICAgICAg
ICBtX2NvbnRlbnRGaWx0ZXItPmFkZERhdGEoZGF0YSwgbGVuZ3RoKTsKLQotICAgICAgICBpZiAo
bV9jb250ZW50RmlsdGVyLT5uZWVkc01vcmVEYXRhKCkpIHsKLSAgICAgICAgICAgIC8vIFNpbmNl
IHRoZSBmaWx0ZXIgc3RpbGwgbmVlZHMgbW9yZSBkYXRhIHRvIG1ha2UgYSBkZWNpc2lvbiwKLSAg
ICAgICAgICAgIC8vIHRyYW5zaXRpb24gYmFjayB0byB0aGUgY29tbWl0dGVkIHN0YXRlIHNvIHRo
YXQgd2UgZG9uJ3QgcGFydGlhbGx5Ci0gICAgICAgICAgICAvLyBsb2FkIGNvbnRlbnQgdGhhdCBt
aWdodCBsYXRlciBiZSBibG9ja2VkLgotICAgICAgICAgICAgZG9jdW1lbnRMb2FkZXIoKS0+cmVj
ZWl2ZWREYXRhKDAsIDApOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAg
ICAgZGF0YSA9IG1fY29udGVudEZpbHRlci0+Z2V0UmVwbGFjZW1lbnREYXRhKGxlbmd0aCk7Ci0g
ICAgICAgIGxvYWRXYXNCbG9ja2VkQmVmb3JlRmluaXNoaW5nID0gbV9jb250ZW50RmlsdGVyLT5k
aWRCbG9ja0RhdGEoKTsKLSAgICB9Ci0jZW5kaWYKLQotICAgIGlmIChtX2lkZW50aWZpZXJGb3JM
b2FkV2l0aG91dFJlc291cmNlTG9hZGVyKQotICAgICAgICBmcmFtZUxvYWRlcigpLT5ub3RpZmll
cigpLT5kaXNwYXRjaERpZFJlY2VpdmVEYXRhKGRvY3VtZW50TG9hZGVyKCksIGlkZW50aWZpZXIo
KSwgZGF0YSwgbGVuZ3RoLCAtMSk7Ci0KLSAgICBkb2N1bWVudExvYWRlcigpLT5hcHBsaWNhdGlv
bkNhY2hlSG9zdCgpLT5tYWluUmVzb3VyY2VEYXRhUmVjZWl2ZWQoZGF0YSwgbGVuZ3RoLCAtMSwg
ZmFsc2UpOwotCi0gICAgLy8gVGhlIGFkZGl0aW9uYWwgcHJvY2Vzc2luZyBjYW4gZG8gYW55dGhp
bmcgaW5jbHVkaW5nIHBvc3NpYmx5IHJlbW92aW5nIHRoZSBsYXN0Ci0gICAgLy8gcmVmZXJlbmNl
IHRvIHRoaXMgb2JqZWN0OyBvbmUgZXhhbXBsZSBvZiB0aGlzIGlzIDMyNjYyMTYuCi0gICAgUmVm
UHRyPE1haW5SZXNvdXJjZUxvYWRlcj4gcHJvdGVjdCh0aGlzKTsKLQotICAgIG1fdGltZU9mTGFz
dERhdGFSZWNlaXZlZCA9IG1vbm90b25pY2FsbHlJbmNyZWFzaW5nVGltZSgpOwotCiAgICAgZG9j
dW1lbnRMb2FkZXIoKS0+cmVjZWl2ZWREYXRhKGRhdGEsIGxlbmd0aCk7Ci0KLSNpZiBVU0UoQ09O
VEVOVF9GSUxURVJJTkcpCi0gICAgaWYgKGxvYWRXYXNCbG9ja2VkQmVmb3JlRmluaXNoaW5nKQot
ICAgICAgICBjYW5jZWwoKTsKLSNlbmRpZgogfQogCiB2b2lkIE1haW5SZXNvdXJjZUxvYWRlcjo6
ZGlkRmluaXNoTG9hZGluZyhkb3VibGUgZmluaXNoVGltZSkKIHsKLSAgICAvLyBUaGVyZSBpcyBh
IGJ1ZyBpbiBDRk5ldHdvcmsgd2hlcmUgY2FsbGJhY2tzIGNhbiBiZSBkaXNwYXRjaGVkIGV2ZW4g
d2hlbiBsb2FkcyBhcmUgZGVmZXJyZWQuCi0gICAgLy8gU2VlIDxyZGFyOi8vcHJvYmxlbS82MzA0
NjAwPiBmb3IgbW9yZSBkZXRhaWxzLgotI2lmICFVU0UoQ0YpCi0gICAgQVNTRVJUKCFkZWZlcnNM
b2FkaW5nKCkgfHwgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uOjppc0RlYnVnZ2VyUGF1c2VkKG1f
ZG9jdW1lbnRMb2FkZXItPmZyYW1lKCkpKTsKLSNlbmRpZgotCiAgICAgLy8gVGhlIGFkZGl0aW9u
YWwgcHJvY2Vzc2luZyBjYW4gZG8gYW55dGhpbmcgaW5jbHVkaW5nIHBvc3NpYmx5IHJlbW92aW5n
IHRoZSBsYXN0CiAgICAgLy8gcmVmZXJlbmNlIHRvIHRoaXMgb2JqZWN0LgogICAgIFJlZlB0cjxN
YWluUmVzb3VyY2VMb2FkZXI+IHByb3RlY3QodGhpcyk7Ci0gICAgUmVmUHRyPERvY3VtZW50TG9h
ZGVyPiBkbCA9IGRvY3VtZW50TG9hZGVyKCk7Ci0KLSAgICBpZiAobV9pZGVudGlmaWVyRm9yTG9h
ZFdpdGhvdXRSZXNvdXJjZUxvYWRlcikgewotICAgICAgICBmcmFtZUxvYWRlcigpLT5ub3RpZmll
cigpLT5kaXNwYXRjaERpZEZpbmlzaExvYWRpbmcoZG9jdW1lbnRMb2FkZXIoKSwgaWRlbnRpZmll
cigpLCBmaW5pc2hUaW1lKTsKLSAgICAgICAgbV9pZGVudGlmaWVyRm9yTG9hZFdpdGhvdXRSZXNv
dXJjZUxvYWRlciA9IDA7Ci0gICAgfQotCi0jaWYgVVNFKENPTlRFTlRfRklMVEVSSU5HKQotICAg
IGlmIChtX2NvbnRlbnRGaWx0ZXIgJiYgbV9jb250ZW50RmlsdGVyLT5uZWVkc01vcmVEYXRhKCkp
IHsKLSAgICAgICAgbV9jb250ZW50RmlsdGVyLT5maW5pc2hlZEFkZGluZ0RhdGEoKTsKLQotICAg
ICAgICBpbnQgbGVuZ3RoOwotICAgICAgICBjb25zdCBjaGFyKiBkYXRhID0gbV9jb250ZW50Rmls
dGVyLT5nZXRSZXBsYWNlbWVudERhdGEobGVuZ3RoKTsKLSAgICAgICAgaWYgKGRhdGEpCi0gICAg
ICAgICAgICBkYXRhUmVjZWl2ZWQobV9yZXNvdXJjZS5nZXQoKSwgZGF0YSwgbGVuZ3RoKTsKLSAg
ICB9Ci0jZW5kaWYKLQotICAgIGlmIChtX2xvYWRpbmdNdWx0aXBhcnRDb250ZW50KQotICAgICAg
ICBkbC0+bWF5YmVGaW5pc2hMb2FkaW5nTXVsdGlwYXJ0Q29udGVudCgpOwotCi0gICAgZG9jdW1l
bnRMb2FkZXIoKS0+dGltaW5nKCktPnNldFJlc3BvbnNlRW5kKGZpbmlzaFRpbWUgPyBmaW5pc2hU
aW1lIDogKG1fdGltZU9mTGFzdERhdGFSZWNlaXZlZCA/IG1fdGltZU9mTGFzdERhdGFSZWNlaXZl
ZCA6IG1vbm90b25pY2FsbHlJbmNyZWFzaW5nVGltZSgpKSk7Ci0gICAgZG9jdW1lbnRMb2FkZXIo
KS0+ZmluaXNoZWRMb2FkaW5nKCk7Ci0KLSAgICAvLyBJZiB0aGUgZG9jdW1lbnQgc3BlY2lmaWVk
IGFuIGFwcGxpY2F0aW9uIGNhY2hlIG1hbmlmZXN0LCBpdCB2aW9sYXRlcyB0aGUgYXV0aG9yJ3Mg
aW50ZW50IGlmIHdlIHN0b3JlIGl0IGluIHRoZSBtZW1vcnkgY2FjaGUKLSAgICAvLyBhbmQgZGVu
eSB0aGUgYXBwY2FjaGUgdGhlIGNoYW5jZSB0byBpbnRlcmNlcHQgaXQgaW4gdGhlIGZ1dHVyZSwg
c28gcmVtb3ZlIGZyb20gdGhlIG1lbW9yeSBjYWNoZS4KLSAgICBpZiAoRnJhbWUqIGZyYW1lID0g
ZG9jdW1lbnRMb2FkZXIoKS0+ZnJhbWUoKSkgewotICAgICAgICBpZiAobV9yZXNvdXJjZSAmJiBm
cmFtZS0+ZG9jdW1lbnQoKS0+aGFzTWFuaWZlc3QoKSkKLSAgICAgICAgICAgIG1lbW9yeUNhY2hl
KCktPnJlbW92ZShtX3Jlc291cmNlLmdldCgpKTsKLSAgICB9Ci0KLSAgICBkbC0+YXBwbGljYXRp
b25DYWNoZUhvc3QoKS0+ZmluaXNoZWRMb2FkaW5nTWFpblJlc291cmNlKCk7CisgICAgZG9jdW1l
bnRMb2FkZXIoKS0+ZmluaXNoZWRMb2FkaW5nKGZpbmlzaFRpbWUpOwogfQogCiB2b2lkIE1haW5S
ZXNvdXJjZUxvYWRlcjo6bm90aWZ5RmluaXNoZWQoQ2FjaGVkUmVzb3VyY2UqIHJlc291cmNlKQo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>192954</attachid>
            <date>2013-03-13 11:42:23 -0700</date>
            <delta_ts>2013-03-13 12:13:48 -0700</delta_ts>
            <desc>Patch for landing</desc>
            <filename>bug-109952-20130313113821.patch</filename>
            <type>text/plain</type>
            <size>16286</size>
            <attacher name="Nate Chapin">japhet</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDE0NTcyNykKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDI3IEBACisyMDEzLTAzLTExICBOYXRlIENo
YXBpbiAgPGphcGhldEBjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgTWVyZ2UgTWFpblJlc291cmNl
TG9hZGVyJ3MgZGlkRmluaXNoTG9hZGluZyBhbmQgZGF0YVJlY2VpdmVkIGludG8gRG9jdW1lbnRM
b2FkZXIKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEw
OTk1MgorCisgICAgICAgIFJldmlld2VkIGJ5IEFudHRpIEtvaXZpc3RvLgorCisgICAgICAgIE5v
IG5ldyB0ZXN0cywgcmVmYWN0b3Igb25seS4KKworICAgICAgICAqIGxvYWRlci9Eb2N1bWVudExv
YWRlci5jcHA6CisgICAgICAgIChXZWJDb3JlOjpEb2N1bWVudExvYWRlcjo6RG9jdW1lbnRMb2Fk
ZXIpOgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1lbnRMb2FkZXI6OmZpbmlzaGVkTG9hZGluZyk6
CisgICAgICAgIChXZWJDb3JlOjpEb2N1bWVudExvYWRlcjo6cmVzcG9uc2VSZWNlaXZlZCk6Cisg
ICAgICAgIChXZWJDb3JlOjpEb2N1bWVudExvYWRlcjo6cmVjZWl2ZWREYXRhKToKKyAgICAgICAg
KFdlYkNvcmU6OkRvY3VtZW50TG9hZGVyOjptYXliZUxvYWRFbXB0eSk6CisgICAgICAgICogbG9h
ZGVyL0RvY3VtZW50TG9hZGVyLmg6CisgICAgICAgICogbG9hZGVyL01haW5SZXNvdXJjZUxvYWRl
ci5jcHA6CisgICAgICAgIChXZWJDb3JlOjpNYWluUmVzb3VyY2VMb2FkZXI6OnJlc3BvbnNlUmVj
ZWl2ZWQpOiBNb3ZlIGNvbnRlbnQgZmlsdGVyaW5nIHRvCisgICAgICAgICAgICBEb2N1bWVudExv
YWRlci4KKyAgICAgICAgKFdlYkNvcmU6Ok1haW5SZXNvdXJjZUxvYWRlcjo6ZGF0YVJlY2VpdmVk
KTogTW9zdGx5IG1vdmVkIHRvIERvY3VtZW50TG9hZGVyLgorICAgICAgICAoV2ViQ29yZTo6TWFp
blJlc291cmNlTG9hZGVyOjpkaWRGaW5pc2hMb2FkaW5nKTogTW9zdGx5IG1vdmVkIHRvIERvY3Vt
ZW50TG9hZGVyLgorICAgICAgICAqIGxvYWRlci9NYWluUmVzb3VyY2VMb2FkZXIuaDogRXhwb3Nl
IHNvbWUgdmFyaWFibGVzIHRoYXQgaGF2ZW4ndCBiZWVuIG1vdmVkCisgICAgICAgICAgICB0byBE
b2N1bWVudExvYWRlciB5ZXQuCisKIDIwMTMtMDMtMTIgIEFuZHJleSBLb3N5YWtvdiAgPGNhc2Vx
QGNocm9taXVtLm9yZz4KIAogICAgICAgICBXZWIgSW5zcGVjdG9yOiBjb2FsZXNjZSByZXBlYXRp
bmcgdGltZWxpbmUgcmVjb3JkcwpJbmRleDogU291cmNlL1dlYkNvcmUvbG9hZGVyL0RvY3VtZW50
TG9hZGVyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9sb2FkZXIvRG9jdW1lbnRM
b2FkZXIuY3BwCShyZXZpc2lvbiAxNDU3MjcpCisrKyBTb3VyY2UvV2ViQ29yZS9sb2FkZXIvRG9j
dW1lbnRMb2FkZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00Nyw2ICs0Nyw3IEBACiAjaW5jbHVk
ZSAiSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uLmgiCiAjaW5jbHVkZSAiTG9nZ2luZy5oIgogI2lu
Y2x1ZGUgIk1haW5SZXNvdXJjZUxvYWRlci5oIgorI2luY2x1ZGUgIk1lbW9yeUNhY2hlLmgiCiAj
aW5jbHVkZSAiUGFnZS5oIgogI2luY2x1ZGUgIlJlc291cmNlQnVmZmVyLmgiCiAjaW5jbHVkZSAi
U2NoZW1lUmVnaXN0cnkuaCIKQEAgLTY1LDYgKzY2LDEwIEBACiAjaW5jbHVkZSAiQXJjaGl2ZUZh
Y3RvcnkuaCIKICNlbmRpZgogCisjaWYgVVNFKENPTlRFTlRfRklMVEVSSU5HKQorI2luY2x1ZGUg
IkNvbnRlbnRGaWx0ZXIuaCIKKyNlbmRpZgorCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKIHN0YXRp
YyB2b2lkIGNhbmNlbEFsbChjb25zdCBSZXNvdXJjZUxvYWRlclNldCYgbG9hZGVycykKQEAgLTEw
Myw2ICsxMDgsNyBAQCBEb2N1bWVudExvYWRlcjo6RG9jdW1lbnRMb2FkZXIoY29uc3QgUmVzCiAg
ICAgLCBtX3N0b3BSZWNvcmRpbmdSZXNwb25zZXMoZmFsc2UpCiAgICAgLCBtX3N1YnN0aXR1dGVS
ZXNvdXJjZURlbGl2ZXJ5VGltZXIodGhpcywgJkRvY3VtZW50TG9hZGVyOjpzdWJzdGl0dXRlUmVz
b3VyY2VEZWxpdmVyeVRpbWVyRmlyZWQpCiAgICAgLCBtX2RpZENyZWF0ZUdsb2JhbEhpc3RvcnlF
bnRyeShmYWxzZSkKKyAgICAsIG1fdGltZU9mTGFzdERhdGFSZWNlaXZlZCgwLjApCiAgICAgLCBt
X2FwcGxpY2F0aW9uQ2FjaGVIb3N0KGFkb3B0UHRyKG5ldyBBcHBsaWNhdGlvbkNhY2hlSG9zdCh0
aGlzKSkpCiB7CiB9CkBAIC0yOTcsOCArMzAzLDM4IEBAIGJvb2wgRG9jdW1lbnRMb2FkZXI6Omlz
TG9hZGluZygpIGNvbnN0CiAgICAgcmV0dXJuIGlzTG9hZGluZ01haW5SZXNvdXJjZSgpIHx8ICFt
X3N1YnJlc291cmNlTG9hZGVycy5pc0VtcHR5KCkgfHwgIW1fcGx1Z0luU3RyZWFtTG9hZGVycy5p
c0VtcHR5KCk7CiB9CiAKLXZvaWQgRG9jdW1lbnRMb2FkZXI6OmZpbmlzaGVkTG9hZGluZygpCit2
b2lkIERvY3VtZW50TG9hZGVyOjpmaW5pc2hlZExvYWRpbmcoZG91YmxlIGZpbmlzaFRpbWUpCiB7
CisgICAgLy8gVGhlcmUgaXMgYSBidWcgaW4gQ0ZOZXR3b3JrIHdoZXJlIGNhbGxiYWNrcyBjYW4g
YmUgZGlzcGF0Y2hlZCBldmVuIHdoZW4gbG9hZHMgYXJlIGRlZmVycmVkLgorICAgIC8vIFNlZSA8
cmRhcjovL3Byb2JsZW0vNjMwNDYwMD4gZm9yIG1vcmUgZGV0YWlscy4KKyNpZiAhVVNFKENGKQor
ICAgIEFTU0VSVCghbV9mcmFtZS0+cGFnZSgpLT5kZWZlcnNMb2FkaW5nKCkgfHwgSW5zcGVjdG9y
SW5zdHJ1bWVudGF0aW9uOjppc0RlYnVnZ2VyUGF1c2VkKG1fZnJhbWUpKTsKKyNlbmRpZgorCisg
ICAgaWYgKG1haW5SZXNvdXJjZUxvYWRlcigpICYmIG1haW5SZXNvdXJjZUxvYWRlcigpLT5pZGVu
dGlmaWVyRm9yTG9hZFdpdGhvdXRSZXNvdXJjZUxvYWRlcigpKSB7CisgICAgICAgIGZyYW1lTG9h
ZGVyKCktPm5vdGlmaWVyKCktPmRpc3BhdGNoRGlkRmluaXNoTG9hZGluZyh0aGlzLCBtYWluUmVz
b3VyY2VMb2FkZXIoKS0+aWRlbnRpZmllcigpLCBmaW5pc2hUaW1lKTsKKyAgICAgICAgbWFpblJl
c291cmNlTG9hZGVyKCktPmNsZWFySWRlbnRpZmllckZvckxvYWRXaXRob3V0UmVzb3VyY2VMb2Fk
ZXIoKTsKKyAgICB9CisKKyNpZiBVU0UoQ09OVEVOVF9GSUxURVJJTkcpCisgICAgaWYgKG1fY29u
dGVudEZpbHRlciAmJiBtX2NvbnRlbnRGaWx0ZXItPm5lZWRzTW9yZURhdGEoKSkgeworICAgICAg
ICBtX2NvbnRlbnRGaWx0ZXItPmZpbmlzaGVkQWRkaW5nRGF0YSgpOworICAgICAgICBpbnQgbGVu
Z3RoOworICAgICAgICBjb25zdCBjaGFyKiBkYXRhID0gbV9jb250ZW50RmlsdGVyLT5nZXRSZXBs
YWNlbWVudERhdGEobGVuZ3RoKTsKKyAgICAgICAgaWYgKGRhdGEpCisgICAgICAgICAgICByZWNl
aXZlZERhdGEoZGF0YSwgbGVuZ3RoKTsKKyAgICB9CisjZW5kaWYKKworICAgIG1heWJlRmluaXNo
TG9hZGluZ011bHRpcGFydENvbnRlbnQoKTsKKworICAgIGRvdWJsZSByZXNwb25zZUVuZFRpbWUg
PSBmaW5pc2hUaW1lOworICAgIGlmICghcmVzcG9uc2VFbmRUaW1lKQorICAgICAgICByZXNwb25z
ZUVuZFRpbWUgPSBtX3RpbWVPZkxhc3REYXRhUmVjZWl2ZWQ7CisgICAgaWYgKCFyZXNwb25zZUVu
ZFRpbWUpCisgICAgICAgIHJlc3BvbnNlRW5kVGltZSA9IG1vbm90b25pY2FsbHlJbmNyZWFzaW5n
VGltZSgpOworICAgIHRpbWluZygpLT5zZXRSZXNwb25zZUVuZChyZXNwb25zZUVuZFRpbWUpOwor
CiAgICAgY29tbWl0SWZSZWFkeSgpOwogICAgIGlmICghZnJhbWVMb2FkZXIoKSkKICAgICAgICAg
cmV0dXJuOwpAQCAtMzE3LDYgKzM1MywyNSBAQCB2b2lkIERvY3VtZW50TG9hZGVyOjpmaW5pc2hl
ZExvYWRpbmcoKQogICAgIGNsZWFyTWFpblJlc291cmNlTG9hZGVyKCk7CiAgICAgaWYgKCFmcmFt
ZUxvYWRlcigpLT5zdGF0ZU1hY2hpbmUoKS0+Y3JlYXRpbmdJbml0aWFsRW1wdHlEb2N1bWVudCgp
KQogICAgICAgICBmcmFtZUxvYWRlcigpLT5jaGVja0xvYWRDb21wbGV0ZSgpOworCisgICAgLy8g
SWYgdGhlIGRvY3VtZW50IHNwZWNpZmllZCBhbiBhcHBsaWNhdGlvbiBjYWNoZSBtYW5pZmVzdCwg
aXQgdmlvbGF0ZXMgdGhlIGF1dGhvcidzIGludGVudCBpZiB3ZSBzdG9yZSBpdCBpbiB0aGUgbWVt
b3J5IGNhY2hlCisgICAgLy8gYW5kIGRlbnkgdGhlIGFwcGNhY2hlIHRoZSBjaGFuY2UgdG8gaW50
ZXJjZXB0IGl0IGluIHRoZSBmdXR1cmUsIHNvIHJlbW92ZSBmcm9tIHRoZSBtZW1vcnkgY2FjaGUu
CisgICAgaWYgKGZyYW1lKCkgJiYgbWFpblJlc291cmNlTG9hZGVyKCkpIHsKKyAgICAgICAgaWYg
KG1haW5SZXNvdXJjZUxvYWRlcigpLT5jYWNoZWRNYWluUmVzb3VyY2UoKSAmJiBmcmFtZSgpLT5k
b2N1bWVudCgpLT5oYXNNYW5pZmVzdCgpKQorICAgICAgICAgICAgbWVtb3J5Q2FjaGUoKS0+cmVt
b3ZlKG1haW5SZXNvdXJjZUxvYWRlcigpLT5jYWNoZWRNYWluUmVzb3VyY2UoKSk7CisgICAgfQor
ICAgIG1fYXBwbGljYXRpb25DYWNoZUhvc3QtPmZpbmlzaGVkTG9hZGluZ01haW5SZXNvdXJjZSgp
OworfQorCit2b2lkIERvY3VtZW50TG9hZGVyOjpyZXNwb25zZVJlY2VpdmVkKGNvbnN0IFJlc291
cmNlUmVzcG9uc2UmIHJlc3BvbnNlKQoreworICAgIHNldFJlc3BvbnNlKHJlc3BvbnNlKTsKKwor
I2lmIFVTRShDT05URU5UX0ZJTFRFUklORykKKyAgICBpZiAocmVzcG9uc2UudXJsKCkucHJvdG9j
b2xJcygiaHR0cHMiKSAmJiBDb250ZW50RmlsdGVyOjppc0VuYWJsZWQoKSkKKyAgICAgICAgbV9j
b250ZW50RmlsdGVyID0gQ29udGVudEZpbHRlcjo6Y3JlYXRlKHJlc3BvbnNlKTsKKyNlbmRpZgor
CiB9CiAKIHZvaWQgRG9jdW1lbnRMb2FkZXI6OmNvbW1pdExvYWQoY29uc3QgY2hhciogZGF0YSwg
aW50IGxlbmd0aCkKQEAgLTQxMiw4ICs0NjcsNTMgQEAgdm9pZCBEb2N1bWVudExvYWRlcjo6cmVw
b3J0TWVtb3J5VXNhZ2UoTQogCiB2b2lkIERvY3VtZW50TG9hZGVyOjpyZWNlaXZlZERhdGEoY29u
c3QgY2hhciogZGF0YSwgaW50IGxlbmd0aCkKIHsKKyAgICBBU1NFUlQoZGF0YSk7CisgICAgQVNT
RVJUKGxlbmd0aCk7CisgICAgQVNTRVJUKCFtX3Jlc3BvbnNlLmlzTnVsbCgpKTsKKworI2lmIFVT
RShDRk5FVFdPUkspIHx8IFBMQVRGT1JNKE1BQykKKyAgICAvLyBXb3JrYXJvdW5kIGZvciA8cmRh
cjovL3Byb2JsZW0vNjA2MDc4Mj4KKyAgICBpZiAobV9yZXNwb25zZS5pc051bGwoKSkKKyAgICAg
ICAgc2V0UmVzcG9uc2UoUmVzb3VyY2VSZXNwb25zZShLVVJMKCksICJ0ZXh0L2h0bWwiLCAwLCBT
dHJpbmcoKSwgU3RyaW5nKCkpKTsKKyNlbmRpZgorCisgICAgLy8gVGhlcmUgaXMgYSBidWcgaW4g
Q0ZOZXR3b3JrIHdoZXJlIGNhbGxiYWNrcyBjYW4gYmUgZGlzcGF0Y2hlZCBldmVuIHdoZW4gbG9h
ZHMgYXJlIGRlZmVycmVkLgorICAgIC8vIFNlZSA8cmRhcjovL3Byb2JsZW0vNjMwNDYwMD4gZm9y
IG1vcmUgZGV0YWlscy4KKyNpZiAhVVNFKENGKQorICAgIEFTU0VSVCghbV9mcmFtZS0+cGFnZSgp
LT5kZWZlcnNMb2FkaW5nKCkpOworI2VuZGlmCisKKyNpZiBVU0UoQ09OVEVOVF9GSUxURVJJTkcp
CisgICAgYm9vbCBsb2FkV2FzQmxvY2tlZEJlZm9yZUZpbmlzaGluZyA9IGZhbHNlOworICAgIGlm
IChtX2NvbnRlbnRGaWx0ZXIgJiYgbV9jb250ZW50RmlsdGVyLT5uZWVkc01vcmVEYXRhKCkpIHsK
KyAgICAgICAgbV9jb250ZW50RmlsdGVyLT5hZGREYXRhKGRhdGEsIGxlbmd0aCk7CisKKyAgICAg
ICAgaWYgKG1fY29udGVudEZpbHRlci0+bmVlZHNNb3JlRGF0YSgpKSB7CisgICAgICAgICAgICAv
LyBTaW5jZSB0aGUgZmlsdGVyIHN0aWxsIG5lZWRzIG1vcmUgZGF0YSB0byBtYWtlIGEgZGVjaXNp
b24sCisgICAgICAgICAgICAvLyB0cmFuc2l0aW9uIGJhY2sgdG8gdGhlIGNvbW1pdHRlZCBzdGF0
ZSBzbyB0aGF0IHdlIGRvbid0IHBhcnRpYWxseQorICAgICAgICAgICAgLy8gbG9hZCBjb250ZW50
IHRoYXQgbWlnaHQgbGF0ZXIgYmUgYmxvY2tlZC4KKyAgICAgICAgICAgIGNvbW1pdExvYWQoMCwg
MCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBkYXRhID0gbV9j
b250ZW50RmlsdGVyLT5nZXRSZXBsYWNlbWVudERhdGEobGVuZ3RoKTsKKyAgICAgICAgbG9hZFdh
c0Jsb2NrZWRCZWZvcmVGaW5pc2hpbmcgPSBtX2NvbnRlbnRGaWx0ZXItPmRpZEJsb2NrRGF0YSgp
OworICAgIH0KKyNlbmRpZgorCisgICAgaWYgKG1haW5SZXNvdXJjZUxvYWRlcigpLT5pZGVudGlm
aWVyRm9yTG9hZFdpdGhvdXRSZXNvdXJjZUxvYWRlcigpKQorICAgICAgICBmcmFtZUxvYWRlcigp
LT5ub3RpZmllcigpLT5kaXNwYXRjaERpZFJlY2VpdmVEYXRhKHRoaXMsIG1haW5SZXNvdXJjZUxv
YWRlcigpLT5pZGVudGlmaWVyKCksIGRhdGEsIGxlbmd0aCwgLTEpOworCisgICAgbV9hcHBsaWNh
dGlvbkNhY2hlSG9zdC0+bWFpblJlc291cmNlRGF0YVJlY2VpdmVkKGRhdGEsIGxlbmd0aCwgLTEs
IGZhbHNlKTsKKyAgICBtX3RpbWVPZkxhc3REYXRhUmVjZWl2ZWQgPSBtb25vdG9uaWNhbGx5SW5j
cmVhc2luZ1RpbWUoKTsKKwogICAgIGlmICghaXNNdWx0aXBhcnRSZXBsYWNpbmdMb2FkKCkpCiAg
ICAgICAgIGNvbW1pdExvYWQoZGF0YSwgbGVuZ3RoKTsKKworI2lmIFVTRShDT05URU5UX0ZJTFRF
UklORykKKyAgICBpZiAobG9hZFdhc0Jsb2NrZWRCZWZvcmVGaW5pc2hpbmcpCisgICAgICAgIGNh
bmNlbE1haW5SZXNvdXJjZUxvYWQoUmVzb3VyY2VFcnJvcigpKTsKKyNlbmRpZgogfQogCiB2b2lk
IERvY3VtZW50TG9hZGVyOjpzZXR1cEZvclJlcGxhY2UoKQpAQCAtODk5LDcgKzk5OSw3IEBAIGJv
b2wgRG9jdW1lbnRMb2FkZXI6Om1heWJlTG9hZEVtcHR5KCkKICAgICAgICAgbV9yZXF1ZXN0LnNl
dFVSTChibGFua1VSTCgpKTsKICAgICBTdHJpbmcgbWltZVR5cGUgPSBzaG91bGRMb2FkRW1wdHkg
PyAidGV4dC9odG1sIiA6IGZyYW1lTG9hZGVyKCktPmNsaWVudCgpLT5nZW5lcmF0ZWRNSU1FVHlw
ZUZvclVSTFNjaGVtZShtX3JlcXVlc3QudXJsKCkucHJvdG9jb2woKSk7CiAgICAgc2V0UmVzcG9u
c2UoUmVzb3VyY2VSZXNwb25zZShtX3JlcXVlc3QudXJsKCksIG1pbWVUeXBlLCAwLCBTdHJpbmco
KSwgU3RyaW5nKCkpKTsKLSAgICBmaW5pc2hlZExvYWRpbmcoKTsKKyAgICBmaW5pc2hlZExvYWRp
bmcobW9ub3RvbmljYWxseUluY3JlYXNpbmdUaW1lKCkpOwogICAgIHJldHVybiB0cnVlOwogfQog
CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9sb2FkZXIvRG9jdW1lbnRMb2FkZXIuaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvV2ViQ29yZS9sb2FkZXIvRG9jdW1lbnRMb2FkZXIuaAkocmV2aXNpb24gMTQ1
NzI3KQorKysgU291cmNlL1dlYkNvcmUvbG9hZGVyL0RvY3VtZW50TG9hZGVyLmgJKHdvcmtpbmcg
Y29weSkKQEAgLTU2LDYgKzU2LDcgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogICAgIGNsYXNzIEFy
Y2hpdmVSZXNvdXJjZTsKICAgICBjbGFzcyBBcmNoaXZlUmVzb3VyY2VDb2xsZWN0aW9uOwogICAg
IGNsYXNzIENhY2hlZFJlc291cmNlTG9hZGVyOworICAgIGNsYXNzIENvbnRlbnRGaWx0ZXI7CiAg
ICAgY2xhc3MgRnJhbWU7CiAgICAgY2xhc3MgRnJhbWVMb2FkZXI7CiAgICAgY2xhc3MgTWFpblJl
c291cmNlTG9hZGVyOwpAQCAtMTIwLDcgKzEyMSw3IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAg
ICAgICAgYm9vbCBpc0xvYWRpbmcoKSBjb25zdDsKICAgICAgICAgdm9pZCByZWNlaXZlZERhdGEo
Y29uc3QgY2hhciosIGludCk7CiAgICAgICAgIHZvaWQgc2V0dXBGb3JSZXBsYWNlKCk7Ci0gICAg
ICAgIHZvaWQgZmluaXNoZWRMb2FkaW5nKCk7CisgICAgICAgIHZvaWQgZmluaXNoZWRMb2FkaW5n
KGRvdWJsZSBmaW5pc2hUaW1lKTsKICAgICAgICAgY29uc3QgUmVzb3VyY2VSZXNwb25zZSYgcmVz
cG9uc2UoKSBjb25zdCB7IHJldHVybiBtX3Jlc3BvbnNlOyB9CiAgICAgICAgIGNvbnN0IFJlc291
cmNlRXJyb3ImIG1haW5Eb2N1bWVudEVycm9yKCkgY29uc3QgeyByZXR1cm4gbV9tYWluRG9jdW1l
bnRFcnJvcjsgfQogICAgICAgICB2b2lkIG1haW5SZWNlaXZlZEVycm9yKGNvbnN0IFJlc291cmNl
RXJyb3ImKTsKQEAgLTI0Myw2ICsyNDQsOCBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAgICAgICAg
IERvY3VtZW50TG9hZFRpbWluZyogdGltaW5nKCkgeyByZXR1cm4gJm1fZG9jdW1lbnRMb2FkVGlt
aW5nOyB9CiAgICAgICAgIHZvaWQgcmVzZXRUaW1pbmcoKSB7IG1fZG9jdW1lbnRMb2FkVGltaW5n
ID0gRG9jdW1lbnRMb2FkVGltaW5nKCk7IH0KIAorICAgICAgICB2b2lkIHJlc3BvbnNlUmVjZWl2
ZWQoY29uc3QgUmVzb3VyY2VSZXNwb25zZSYpOworCiAgICAgICAgIC8vIFRoZSBXZWJLaXQgbGF5
ZXIgY2FsbHMgdGhpcyBmdW5jdGlvbiB3aGVuIGl0J3MgcmVhZHkgZm9yIHRoZSBkYXRhIHRvCiAg
ICAgICAgIC8vIGFjdHVhbGx5IGJlIGFkZGVkIHRvIHRoZSBkb2N1bWVudC4KICAgICAgICAgdm9p
ZCBjb21taXREYXRhKGNvbnN0IGNoYXIqIGJ5dGVzLCBzaXplX3QgbGVuZ3RoKTsKQEAgLTM1Mywx
MiArMzU2LDE4IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAgICAgICAgYm9vbCBtX2RpZENyZWF0
ZUdsb2JhbEhpc3RvcnlFbnRyeTsKIAogICAgICAgICBEb2N1bWVudExvYWRUaW1pbmcgbV9kb2N1
bWVudExvYWRUaW1pbmc7CisKKyAgICAgICAgZG91YmxlIG1fdGltZU9mTGFzdERhdGFSZWNlaXZl
ZDsKICAgICAKICAgICAgICAgUmVmUHRyPEljb25Mb2FkRGVjaXNpb25DYWxsYmFjaz4gbV9pY29u
TG9hZERlY2lzaW9uQ2FsbGJhY2s7CiAgICAgICAgIFJlZlB0cjxJY29uRGF0YUNhbGxiYWNrPiBt
X2ljb25EYXRhQ2FsbGJhY2s7CiAKICAgICAgICAgZnJpZW5kIGNsYXNzIEFwcGxpY2F0aW9uQ2Fj
aGVIb3N0OyAgLy8gZm9yIHN1YnN0aXR1dGUgcmVzb3VyY2UgZGVsaXZlcnkKICAgICAgICAgT3du
UHRyPEFwcGxpY2F0aW9uQ2FjaGVIb3N0PiBtX2FwcGxpY2F0aW9uQ2FjaGVIb3N0OworCisjaWYg
VVNFKENPTlRFTlRfRklMVEVSSU5HKQorICAgICAgICBSZWZQdHI8Q29udGVudEZpbHRlcj4gbV9j
b250ZW50RmlsdGVyOworI2VuZGlmCiAgICAgfTsKIAogICAgIGlubGluZSB2b2lkIERvY3VtZW50
TG9hZGVyOjpyZWNvcmRNZW1vcnlDYWNoZUxvYWRGb3JGdXR1cmVDbGllbnROb3RpZmljYXRpb24o
Y29uc3QgUmVzb3VyY2VSZXF1ZXN0JiByZXF1ZXN0KQpJbmRleDogU291cmNlL1dlYkNvcmUvbG9h
ZGVyL01haW5SZXNvdXJjZUxvYWRlci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUv
bG9hZGVyL01haW5SZXNvdXJjZUxvYWRlci5jcHAJKHJldmlzaW9uIDE0NTcyNykKKysrIFNvdXJj
ZS9XZWJDb3JlL2xvYWRlci9NYWluUmVzb3VyY2VMb2FkZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC02NCwxMCArNjQsNiBAQAogI2luY2x1ZGUgIlBsdWdpbkRhdGFiYXNlLmgiCiAjZW5kaWYKIAot
I2lmIFVTRShDT05URU5UX0ZJTFRFUklORykKLSNpbmNsdWRlICJDb250ZW50RmlsdGVyLmgiCi0j
ZW5kaWYKLQogbmFtZXNwYWNlIFdlYkNvcmUgewogCiBNYWluUmVzb3VyY2VMb2FkZXI6Ok1haW5S
ZXNvdXJjZUxvYWRlcihEb2N1bWVudExvYWRlciogZG9jdW1lbnRMb2FkZXIpCkBAIC03NSw3ICs3
MSw2IEBAIE1haW5SZXNvdXJjZUxvYWRlcjo6TWFpblJlc291cmNlTG9hZGVyKEQKICAgICAsIG1f
ZG9jdW1lbnRMb2FkZXIoZG9jdW1lbnRMb2FkZXIpCiAgICAgLCBtX2xvYWRpbmdNdWx0aXBhcnRD
b250ZW50KGZhbHNlKQogICAgICwgbV93YWl0aW5nRm9yQ29udGVudFBvbGljeShmYWxzZSkKLSAg
ICAsIG1fdGltZU9mTGFzdERhdGFSZWNlaXZlZCgwLjApCiAgICAgLCBtX2lkZW50aWZpZXJGb3JM
b2FkV2l0aG91dFJlc291cmNlTG9hZGVyKDApCiB7CiB9CkBAIC00MzgsNyArNDMzLDcgQEAgdm9p
ZCBNYWluUmVzb3VyY2VMb2FkZXI6OnJlc3BvbnNlUmVjZWl2ZQogICAgIC8vIHJlZmVyZW5jZSB0
byB0aGlzIG9iamVjdDsgb25lIGV4YW1wbGUgb2YgdGhpcyBpcyAzMjY2MjE2LgogICAgIFJlZlB0
cjxNYWluUmVzb3VyY2VMb2FkZXI+IHByb3RlY3QodGhpcyk7CiAKLSAgICBtX2RvY3VtZW50TG9h
ZGVyLT5zZXRSZXNwb25zZShyKTsKKyAgICBtX2RvY3VtZW50TG9hZGVyLT5yZXNwb25zZVJlY2Vp
dmVkKHIpOwogCiAgICAgbV9yZXNwb25zZSA9IHI7CiAKQEAgLTQ2NCwxMTYgKzQ1OSwyMSBAQCB2
b2lkIE1haW5SZXNvdXJjZUxvYWRlcjo6cmVzcG9uc2VSZWNlaXZlCiAgICAgfQogI2VuZGlmCiAK
LSNpZiBVU0UoQ09OVEVOVF9GSUxURVJJTkcpCi0gICAgaWYgKHIudXJsKCkucHJvdG9jb2xJcygi
aHR0cHMiKSAmJiBDb250ZW50RmlsdGVyOjppc0VuYWJsZWQoKSkKLSAgICAgICAgbV9jb250ZW50
RmlsdGVyID0gQ29udGVudEZpbHRlcjo6Y3JlYXRlKHIpOwotI2VuZGlmCi0KICAgICBmcmFtZUxv
YWRlcigpLT5wb2xpY3lDaGVja2VyKCktPmNoZWNrQ29udGVudFBvbGljeShtX3Jlc3BvbnNlLCBj
YWxsQ29udGludWVBZnRlckNvbnRlbnRQb2xpY3ksIHRoaXMpOwogfQogCiB2b2lkIE1haW5SZXNv
dXJjZUxvYWRlcjo6ZGF0YVJlY2VpdmVkKENhY2hlZFJlc291cmNlKiByZXNvdXJjZSwgY29uc3Qg
Y2hhciogZGF0YSwgaW50IGxlbmd0aCkKIHsKLSAgICBBU1NFUlQoZGF0YSk7Ci0gICAgQVNTRVJU
KGxlbmd0aCAhPSAwKTsKICAgICBBU1NFUlRfVU5VU0VEKHJlc291cmNlLCByZXNvdXJjZSA9PSBt
X3Jlc291cmNlKTsKLSAgICBBU1NFUlQoIW1fcmVzcG9uc2UuaXNOdWxsKCkpOwotCi0jaWYgVVNF
KENGTkVUV09SSykgfHwgUExBVEZPUk0oTUFDKQotICAgIC8vIFdvcmthcm91bmQgZm9yIDxyZGFy
Oi8vcHJvYmxlbS82MDYwNzgyPgotICAgIGlmIChtX3Jlc3BvbnNlLmlzTnVsbCgpKSB7Ci0gICAg
ICAgIG1fcmVzcG9uc2UgPSBSZXNvdXJjZVJlc3BvbnNlKEtVUkwoKSwgInRleHQvaHRtbCIsIDAs
IFN0cmluZygpLCBTdHJpbmcoKSk7Ci0gICAgICAgIGlmIChEb2N1bWVudExvYWRlciogZG9jdW1l
bnRMb2FkZXIgPSBtX2RvY3VtZW50TG9hZGVyLmdldCgpKQotICAgICAgICAgICAgZG9jdW1lbnRM
b2FkZXItPnNldFJlc3BvbnNlKG1fcmVzcG9uc2UpOwotICAgIH0KLSNlbmRpZgotCi0gICAgLy8g
VGhlcmUgaXMgYSBidWcgaW4gQ0ZOZXR3b3JrIHdoZXJlIGNhbGxiYWNrcyBjYW4gYmUgZGlzcGF0
Y2hlZCBldmVuIHdoZW4gbG9hZHMgYXJlIGRlZmVycmVkLgotICAgIC8vIFNlZSA8cmRhcjovL3By
b2JsZW0vNjMwNDYwMD4gZm9yIG1vcmUgZGV0YWlscy4KLSNpZiAhVVNFKENGKQotICAgIEFTU0VS
VCghZGVmZXJzTG9hZGluZygpKTsKLSNlbmRpZgotCi0jaWYgVVNFKENPTlRFTlRfRklMVEVSSU5H
KQotICAgIGJvb2wgbG9hZFdhc0Jsb2NrZWRCZWZvcmVGaW5pc2hpbmcgPSBmYWxzZTsKLSAgICBp
ZiAobV9jb250ZW50RmlsdGVyICYmIG1fY29udGVudEZpbHRlci0+bmVlZHNNb3JlRGF0YSgpKSB7
Ci0gICAgICAgIG1fY29udGVudEZpbHRlci0+YWRkRGF0YShkYXRhLCBsZW5ndGgpOwotCi0gICAg
ICAgIGlmIChtX2NvbnRlbnRGaWx0ZXItPm5lZWRzTW9yZURhdGEoKSkgewotICAgICAgICAgICAg
Ly8gU2luY2UgdGhlIGZpbHRlciBzdGlsbCBuZWVkcyBtb3JlIGRhdGEgdG8gbWFrZSBhIGRlY2lz
aW9uLAotICAgICAgICAgICAgLy8gdHJhbnNpdGlvbiBiYWNrIHRvIHRoZSBjb21taXR0ZWQgc3Rh
dGUgc28gdGhhdCB3ZSBkb24ndCBwYXJ0aWFsbHkKLSAgICAgICAgICAgIC8vIGxvYWQgY29udGVu
dCB0aGF0IG1pZ2h0IGxhdGVyIGJlIGJsb2NrZWQuCi0gICAgICAgICAgICBkb2N1bWVudExvYWRl
cigpLT5yZWNlaXZlZERhdGEoMCwgMCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0K
LQotICAgICAgICBkYXRhID0gbV9jb250ZW50RmlsdGVyLT5nZXRSZXBsYWNlbWVudERhdGEobGVu
Z3RoKTsKLSAgICAgICAgbG9hZFdhc0Jsb2NrZWRCZWZvcmVGaW5pc2hpbmcgPSBtX2NvbnRlbnRG
aWx0ZXItPmRpZEJsb2NrRGF0YSgpOwotICAgIH0KLSNlbmRpZgotCi0gICAgaWYgKG1faWRlbnRp
ZmllckZvckxvYWRXaXRob3V0UmVzb3VyY2VMb2FkZXIpCi0gICAgICAgIGZyYW1lTG9hZGVyKCkt
Pm5vdGlmaWVyKCktPmRpc3BhdGNoRGlkUmVjZWl2ZURhdGEoZG9jdW1lbnRMb2FkZXIoKSwgaWRl
bnRpZmllcigpLCBkYXRhLCBsZW5ndGgsIC0xKTsKLQotICAgIGRvY3VtZW50TG9hZGVyKCktPmFw
cGxpY2F0aW9uQ2FjaGVIb3N0KCktPm1haW5SZXNvdXJjZURhdGFSZWNlaXZlZChkYXRhLCBsZW5n
dGgsIC0xLCBmYWxzZSk7Ci0KLSAgICAvLyBUaGUgYWRkaXRpb25hbCBwcm9jZXNzaW5nIGNhbiBk
byBhbnl0aGluZyBpbmNsdWRpbmcgcG9zc2libHkgcmVtb3ZpbmcgdGhlIGxhc3QKLSAgICAvLyBy
ZWZlcmVuY2UgdG8gdGhpcyBvYmplY3Q7IG9uZSBleGFtcGxlIG9mIHRoaXMgaXMgMzI2NjIxNi4K
LSAgICBSZWZQdHI8TWFpblJlc291cmNlTG9hZGVyPiBwcm90ZWN0KHRoaXMpOwotCi0gICAgbV90
aW1lT2ZMYXN0RGF0YVJlY2VpdmVkID0gbW9ub3RvbmljYWxseUluY3JlYXNpbmdUaW1lKCk7Ci0K
ICAgICBkb2N1bWVudExvYWRlcigpLT5yZWNlaXZlZERhdGEoZGF0YSwgbGVuZ3RoKTsKLQotI2lm
IFVTRShDT05URU5UX0ZJTFRFUklORykKLSAgICBpZiAobG9hZFdhc0Jsb2NrZWRCZWZvcmVGaW5p
c2hpbmcpCi0gICAgICAgIGNhbmNlbCgpOwotI2VuZGlmCiB9CiAKIHZvaWQgTWFpblJlc291cmNl
TG9hZGVyOjpkaWRGaW5pc2hMb2FkaW5nKGRvdWJsZSBmaW5pc2hUaW1lKQogewotICAgIC8vIFRo
ZXJlIGlzIGEgYnVnIGluIENGTmV0d29yayB3aGVyZSBjYWxsYmFja3MgY2FuIGJlIGRpc3BhdGNo
ZWQgZXZlbiB3aGVuIGxvYWRzIGFyZSBkZWZlcnJlZC4KLSAgICAvLyBTZWUgPHJkYXI6Ly9wcm9i
bGVtLzYzMDQ2MDA+IGZvciBtb3JlIGRldGFpbHMuCi0jaWYgIVVTRShDRikKLSAgICBBU1NFUlQo
IWRlZmVyc0xvYWRpbmcoKSB8fCBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OmlzRGVidWdnZXJQ
YXVzZWQobV9kb2N1bWVudExvYWRlci0+ZnJhbWUoKSkpOwotI2VuZGlmCi0KICAgICAvLyBUaGUg
YWRkaXRpb25hbCBwcm9jZXNzaW5nIGNhbiBkbyBhbnl0aGluZyBpbmNsdWRpbmcgcG9zc2libHkg
cmVtb3ZpbmcgdGhlIGxhc3QKICAgICAvLyByZWZlcmVuY2UgdG8gdGhpcyBvYmplY3QuCiAgICAg
UmVmUHRyPE1haW5SZXNvdXJjZUxvYWRlcj4gcHJvdGVjdCh0aGlzKTsKLSAgICBSZWZQdHI8RG9j
dW1lbnRMb2FkZXI+IGRsID0gZG9jdW1lbnRMb2FkZXIoKTsKLQotICAgIGlmIChtX2lkZW50aWZp
ZXJGb3JMb2FkV2l0aG91dFJlc291cmNlTG9hZGVyKSB7Ci0gICAgICAgIGZyYW1lTG9hZGVyKCkt
Pm5vdGlmaWVyKCktPmRpc3BhdGNoRGlkRmluaXNoTG9hZGluZyhkb2N1bWVudExvYWRlcigpLCBp
ZGVudGlmaWVyKCksIGZpbmlzaFRpbWUpOwotICAgICAgICBtX2lkZW50aWZpZXJGb3JMb2FkV2l0
aG91dFJlc291cmNlTG9hZGVyID0gMDsKLSAgICB9Ci0KLSNpZiBVU0UoQ09OVEVOVF9GSUxURVJJ
TkcpCi0gICAgaWYgKG1fY29udGVudEZpbHRlciAmJiBtX2NvbnRlbnRGaWx0ZXItPm5lZWRzTW9y
ZURhdGEoKSkgewotICAgICAgICBtX2NvbnRlbnRGaWx0ZXItPmZpbmlzaGVkQWRkaW5nRGF0YSgp
OwotCi0gICAgICAgIGludCBsZW5ndGg7Ci0gICAgICAgIGNvbnN0IGNoYXIqIGRhdGEgPSBtX2Nv
bnRlbnRGaWx0ZXItPmdldFJlcGxhY2VtZW50RGF0YShsZW5ndGgpOwotICAgICAgICBpZiAoZGF0
YSkKLSAgICAgICAgICAgIGRhdGFSZWNlaXZlZChtX3Jlc291cmNlLmdldCgpLCBkYXRhLCBsZW5n
dGgpOwotICAgIH0KLSNlbmRpZgotCi0gICAgaWYgKG1fbG9hZGluZ011bHRpcGFydENvbnRlbnQp
Ci0gICAgICAgIGRsLT5tYXliZUZpbmlzaExvYWRpbmdNdWx0aXBhcnRDb250ZW50KCk7Ci0KLSAg
ICBkb2N1bWVudExvYWRlcigpLT50aW1pbmcoKS0+c2V0UmVzcG9uc2VFbmQoZmluaXNoVGltZSA/
IGZpbmlzaFRpbWUgOiAobV90aW1lT2ZMYXN0RGF0YVJlY2VpdmVkID8gbV90aW1lT2ZMYXN0RGF0
YVJlY2VpdmVkIDogbW9ub3RvbmljYWxseUluY3JlYXNpbmdUaW1lKCkpKTsKLSAgICBkb2N1bWVu
dExvYWRlcigpLT5maW5pc2hlZExvYWRpbmcoKTsKLQotICAgIC8vIElmIHRoZSBkb2N1bWVudCBz
cGVjaWZpZWQgYW4gYXBwbGljYXRpb24gY2FjaGUgbWFuaWZlc3QsIGl0IHZpb2xhdGVzIHRoZSBh
dXRob3IncyBpbnRlbnQgaWYgd2Ugc3RvcmUgaXQgaW4gdGhlIG1lbW9yeSBjYWNoZQotICAgIC8v
IGFuZCBkZW55IHRoZSBhcHBjYWNoZSB0aGUgY2hhbmNlIHRvIGludGVyY2VwdCBpdCBpbiB0aGUg
ZnV0dXJlLCBzbyByZW1vdmUgZnJvbSB0aGUgbWVtb3J5IGNhY2hlLgotICAgIGlmIChGcmFtZSog
ZnJhbWUgPSBkb2N1bWVudExvYWRlcigpLT5mcmFtZSgpKSB7Ci0gICAgICAgIGlmIChtX3Jlc291
cmNlICYmIGZyYW1lLT5kb2N1bWVudCgpLT5oYXNNYW5pZmVzdCgpKQotICAgICAgICAgICAgbWVt
b3J5Q2FjaGUoKS0+cmVtb3ZlKG1fcmVzb3VyY2UuZ2V0KCkpOwotICAgIH0KLQotICAgIGRsLT5h
cHBsaWNhdGlvbkNhY2hlSG9zdCgpLT5maW5pc2hlZExvYWRpbmdNYWluUmVzb3VyY2UoKTsKKyAg
ICBkb2N1bWVudExvYWRlcigpLT5maW5pc2hlZExvYWRpbmcoZmluaXNoVGltZSk7CiB9CiAKIHZv
aWQgTWFpblJlc291cmNlTG9hZGVyOjpub3RpZnlGaW5pc2hlZChDYWNoZWRSZXNvdXJjZSogcmVz
b3VyY2UpCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9sb2FkZXIvTWFpblJlc291cmNlTG9hZGVyLmgK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvbG9hZGVyL01haW5SZXNvdXJjZUxvYWRlci5o
CShyZXZpc2lvbiAxNDU3MjcpCisrKyBTb3VyY2UvV2ViQ29yZS9sb2FkZXIvTWFpblJlc291cmNl
TG9hZGVyLmgJKHdvcmtpbmcgY29weSkKQEAgLTQ2LDEwICs0Niw2IEBAIG5hbWVzcGFjZSBXZWJD
b3JlIHsKIAogY2xhc3MgRm9ybVN0YXRlOwogY2xhc3MgUmVzb3VyY2VSZXF1ZXN0OwotICAgIAot
I2lmIFVTRShDT05URU5UX0ZJTFRFUklORykKLWNsYXNzIENvbnRlbnRGaWx0ZXI7Ci0jZW5kaWYK
IAogY2xhc3MgTWFpblJlc291cmNlTG9hZGVyIDogcHVibGljIFJlZkNvdW50ZWQ8TWFpblJlc291
cmNlTG9hZGVyPiwgcHVibGljIENhY2hlZFJhd1Jlc291cmNlQ2xpZW50IHsKICAgICBXVEZfTUFL
RV9GQVNUX0FMTE9DQVRFRDsKQEAgLTcyLDYgKzY4LDEwIEBAIHB1YmxpYzoKICAgICB0eXBlZGVm
IFRpbWVyPE1haW5SZXNvdXJjZUxvYWRlcj4gTWFpblJlc291cmNlTG9hZGVyVGltZXI7CiAjZW5k
aWYKIAorICAgIENhY2hlZFJhd1Jlc291cmNlKiBjYWNoZWRNYWluUmVzb3VyY2UoKSB7IHJldHVy
biBtX3Jlc291cmNlLmdldCgpOyB9CisgICAgdW5zaWduZWQgbG9uZyBpZGVudGlmaWVyRm9yTG9h
ZFdpdGhvdXRSZXNvdXJjZUxvYWRlcigpIGNvbnN0IHsgcmV0dXJuIG1faWRlbnRpZmllckZvckxv
YWRXaXRob3V0UmVzb3VyY2VMb2FkZXI7IH0KKyAgICB2b2lkIGNsZWFySWRlbnRpZmllckZvckxv
YWRXaXRob3V0UmVzb3VyY2VMb2FkZXIoKSB7IG1faWRlbnRpZmllckZvckxvYWRXaXRob3V0UmVz
b3VyY2VMb2FkZXIgPSAwOyB9CisKICAgICB1bnNpZ25lZCBsb25nIGlkZW50aWZpZXIoKSBjb25z
dDsKICAgICBib29sIGlzTG9hZGluZ011bHRpcGFydENvbnRlbnQoKSBjb25zdCB7IHJldHVybiBt
X2xvYWRpbmdNdWx0aXBhcnRDb250ZW50OyB9CiAKQEAgLTEyNywxMiArMTI3LDcgQEAgcHJpdmF0
ZToKIAogICAgIGJvb2wgbV9sb2FkaW5nTXVsdGlwYXJ0Q29udGVudDsKICAgICBib29sIG1fd2Fp
dGluZ0ZvckNvbnRlbnRQb2xpY3k7Ci0gICAgZG91YmxlIG1fdGltZU9mTGFzdERhdGFSZWNlaXZl
ZDsKICAgICB1bnNpZ25lZCBsb25nIG1faWRlbnRpZmllckZvckxvYWRXaXRob3V0UmVzb3VyY2VM
b2FkZXI7Ci0KLSNpZiBVU0UoQ09OVEVOVF9GSUxURVJJTkcpCi0gICAgUmVmUHRyPENvbnRlbnRG
aWx0ZXI+IG1fY29udGVudEZpbHRlcjsKLSNlbmRpZgogfTsKIAogfQo=
</data>

          </attachment>
      

    </bug>

</bugzilla>