<?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>93514</bug_id>
          
          <creation_ts>2012-08-08 13:39:11 -0700</creation_ts>
          <short_desc>[chromium] Tie WebFlingAnimator into the compositor</short_desc>
          <delta_ts>2012-10-05 11:44:00 -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>WebKit Misc.</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>WONTFIX</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>66687</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Nate Chapin">japhet</reporter>
          <assigned_to name="Nate Chapin">japhet</assigned_to>
          <cc>abarth</cc>
    
    <cc>aelias</cc>
    
    <cc>cc-bugs</cc>
    
    <cc>epenner</cc>
    
    <cc>jamesr</cc>
    
    <cc>skyostil</cc>
    
    <cc>trchen</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>690682</commentid>
    <comment_count>0</comment_count>
    <who name="Nate Chapin">japhet</who>
    <bug_when>2012-08-08 13:39:11 -0700</bug_when>
    <thetext>WebFlingAnimator was added in https://bugs.webkit.org/show_bug.cgi?id=92900, but currently doesn&apos;t do anything.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>690685</commentid>
    <comment_count>1</comment_count>
      <attachid>157281</attachid>
    <who name="Nate Chapin">japhet</who>
    <bug_when>2012-08-08 13:43:41 -0700</bug_when>
    <thetext>Created attachment 157281
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>690710</commentid>
    <comment_count>2</comment_count>
      <attachid>157281</attachid>
    <who name="Build Bot">buildbot</who>
    <bug_when>2012-08-08 14:11:25 -0700</bug_when>
    <thetext>Comment on attachment 157281
patch

Attachment 157281 did not pass win-ews (win):
Output: http://queues.webkit.org/results/13463111</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>699909</commentid>
    <comment_count>3</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2012-08-20 13:56:27 -0700</bug_when>
    <thetext>Nate: What&apos;s the status of this patch?  Are we waiting on jamesr to review?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>699915</commentid>
    <comment_count>4</comment_count>
    <who name="Nate Chapin">japhet</who>
    <bug_when>2012-08-20 13:58:42 -0700</bug_when>
    <thetext>(In reply to comment #3)
&gt; Nate: What&apos;s the status of this patch?  Are we waiting on jamesr to review?

I believe so, ergo...

jamesr: ping :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>700078</commentid>
    <comment_count>5</comment_count>
      <attachid>157281</attachid>
    <who name="James Robinson">jamesr</who>
    <bug_when>2012-08-20 15:37:20 -0700</bug_when>
    <thetext>Comment on attachment 157281
patch

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

I can&apos;t tell what this patch&apos;s relationship with non-root layer scrolling is supposed to be.  We have support for that in CCLayerTreeHostImpl and it seems that this should have at least the same level of support.

Could someone familiar with this code on the android branch offer to answer questions/etc?  I suspect one of aelias/trchen/skyostil is the right person for this, but I&apos;m not sure who.

&gt; Source/WebKit/chromium/src/WebCompositorInputHandlerImpl.cpp:274
&gt; +        OwnPtr&lt;PlatformGestureCurve&gt; flingCurve = PlatformGestureCurveFactory::get()-&gt;createCurve(FloatPoint(gestureEvent.deltaX, gestureEvent.deltaY), m_inputHandlerClient-&gt;scrollRange());
&gt;          m_wheelFlingAnimation = CCActiveGestureAnimation::create(PlatformGestureToCCGestureAdapter::create(flingCurve.release()), this);

OS(ANDROID) shouldn&apos;t be creating something called m_wheelFlingAnimation, android doesn&apos;t have wheel flings.  If you want to reuse this logic (which seems reasonable) I think you also need to figure out proper generic names for things that express their cross-platform meaning.

&gt; Source/WebKit/chromium/tests/WebCompositorInputHandlerImplTest.cpp:68
&gt; +    WebCore::IntRect scrollRange() const { return WebCore::IntRect(); }

this looks like an override of a virtual in the base class - can you add virtual and OVERRIDE keywords?

&gt; Source/WebKit/chromium/tests/WebCompositorInputHandlerImplTest.cpp:128
&gt; +        m_velocity = WebCore::IntSize((int)velocity.x, (int)velocity.y);

use C++ casts (e.g. static_cast&lt;type&gt;()), not C-style.

a &apos;using WebCore::IntSize&apos; at the top of this file would help make this file a lot more readable

&gt; Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostImpl.h:84
&gt; +    virtual IntRect scrollRange() const OVERRIDE;

Could you document what this function does and what interface the OVERRIDE is from? If it&apos;s from CCInputHandlerClient, why is there a blank line between it and the rest of the functions? Could this go next to the other scroll-related functions, perhaps?

&gt; Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp:932
&gt; +static void expandScrollRange(IntRect&amp; scrollRange, float scale, IntPoint scrollPosition, IntSize maxScrollPosition)

This function doesn&apos;t appear to be aware of scrollable sublayers. I think what it&apos;s trying to do is figure out how far a fling would go if it went in a given direction.  There&apos;s some not-so-trivial logic in ::scrollBy() to figure out which layer should take a scroll in a given direction with a given layer tree - it seems like this is too simple to be correct.

Should this instead take a given direction and then mimic (or hopefully reuse) the scrollBy() logic to get a real extrema for a given direction?

&gt; Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp:959
&gt; +    const CCLayerImpl* layerImpl = m_rootScrollLayerImpl;

shouldn&apos;t this be looking at the m_currentlyScrollingLayerImpl, not the root?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>700152</commentid>
    <comment_count>6</comment_count>
    <who name="Tien-Ren Chen">trchen</who>
    <bug_when>2012-08-20 16:34:11 -0700</bug_when>
    <thetext>(In reply to comment #5)
&gt; (From update of attachment 157281 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=157281&amp;action=review
&gt; 
&gt; I can&apos;t tell what this patch&apos;s relationship with non-root layer scrolling is supposed to be.  We have support for that in CCLayerTreeHostImpl and it seems that this should have at least the same level of support.
&gt; 
&gt; Could someone familiar with this code on the android branch offer to answer questions/etc?  I suspect one of aelias/trchen/skyostil is the right person for this, but I&apos;m not sure who.

skyostil@ is the main author of the code, and I&apos;m quite familiar with it too.

&gt; &gt; Source/WebKit/chromium/src/WebCompositorInputHandlerImpl.cpp:274
&gt; &gt; +        OwnPtr&lt;PlatformGestureCurve&gt; flingCurve = PlatformGestureCurveFactory::get()-&gt;createCurve(FloatPoint(gestureEvent.deltaX, gestureEvent.deltaY), m_inputHandlerClient-&gt;scrollRange());
&gt; &gt;          m_wheelFlingAnimation = CCActiveGestureAnimation::create(PlatformGestureToCCGestureAdapter::create(flingCurve.release()), this);
&gt; 
&gt; OS(ANDROID) shouldn&apos;t be creating something called m_wheelFlingAnimation, android doesn&apos;t have wheel flings.  If you want to reuse this logic (which seems reasonable) I think you also need to figure out proper generic names for things that express their cross-platform meaning.
&gt; 
&gt; &gt; Source/WebKit/chromium/tests/WebCompositorInputHandlerImplTest.cpp:68
&gt; &gt; +    WebCore::IntRect scrollRange() const { return WebCore::IntRect(); }
&gt; 
&gt; this looks like an override of a virtual in the base class - can you add virtual and OVERRIDE keywords?
&gt; 
&gt; &gt; Source/WebKit/chromium/tests/WebCompositorInputHandlerImplTest.cpp:128
&gt; &gt; +        m_velocity = WebCore::IntSize((int)velocity.x, (int)velocity.y);
&gt; 
&gt; use C++ casts (e.g. static_cast&lt;type&gt;()), not C-style.
&gt; 
&gt; a &apos;using WebCore::IntSize&apos; at the top of this file would help make this file a lot more readable
&gt; 
&gt; &gt; Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostImpl.h:84
&gt; &gt; +    virtual IntRect scrollRange() const OVERRIDE;
&gt; 
&gt; Could you document what this function does and what interface the OVERRIDE is from? If it&apos;s from CCInputHandlerClient, why is there a blank line between it and the rest of the functions? Could this go next to the other scroll-related functions, perhaps?
&gt; 
&gt; &gt; Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp:932
&gt; &gt; +static void expandScrollRange(IntRect&amp; scrollRange, float scale, IntPoint scrollPosition, IntSize maxScrollPosition)
&gt; 
&gt; This function doesn&apos;t appear to be aware of scrollable sublayers. I think what it&apos;s trying to do is figure out how far a fling would go if it went in a given direction.  There&apos;s some not-so-trivial logic in ::scrollBy() to figure out which layer should take a scroll in a given direction with a given layer tree - it seems like this is too simple to be correct.

What scrollRange() is trying to achieve is that, for each of the 4 directions, try to find the innermost layer which can be scrolled for that direction. The idea is that we don&apos;t propagate up the fling when we hit the edge of a layer.

The implementation works by starting from the current scrolling layer. We look at 4 direction of current scroll range, if all of them are scrollable already (isValidScrollRange) then we stop. Otherwise we continue to the parent layer and try to make the rest directions scrollable (expandScrollRange).

That&apos;s why expandScrollRange only looks at one layer at a time, and it only updates the direction that is currently non-scrollable.

I think the real problem with this implementation is that it ignores transformation. I believe the extra logic in scrollBy() takes care of the transformation. However, if we want to keep the same logic that a fling never propagates up while supporting transformation, then scroll range can become convex polygon instead of rectilinear rectangle.

IMO the right way to do it is to pass in the fling velocity to scrollRange(), and the function returns the target scroll layer and the reverse-transformed fling velocity. Then later on we do everything in the layer&apos;s coordinates instead of window coordinates.

&gt; Should this instead take a given direction and then mimic (or hopefully reuse) the scrollBy() logic to get a real extrema for a given direction?
&gt; 
&gt; &gt; Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp:959
&gt; &gt; +    const CCLayerImpl* layerImpl = m_rootScrollLayerImpl;
&gt; 
&gt; shouldn&apos;t this be looking at the m_currentlyScrollingLayerImpl, not the root?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>700198</commentid>
    <comment_count>7</comment_count>
    <who name="James Robinson">jamesr</who>
    <bug_when>2012-08-20 17:01:12 -0700</bug_when>
    <thetext>(In reply to comment #6)
&gt; (In reply to comment #5)
&gt; &gt; This function doesn&apos;t appear to be aware of scrollable sublayers. I think what it&apos;s trying to do is figure out how far a fling would go if it went in a given direction.  There&apos;s some not-so-trivial logic in ::scrollBy() to figure out which layer should take a scroll in a given direction with a given layer tree - it seems like this is too simple to be correct.
&gt; 
&gt; What scrollRange() is trying to achieve is that, for each of the 4 directions, try to find the innermost layer which can be scrolled for that direction. The idea is that we don&apos;t propagate up the fling when we hit the edge of a layer.
&gt; 
&gt; The implementation works by starting from the current scrolling layer. We look at 4 direction of current scroll range, if all of them are scrollable already (isValidScrollRange) then we stop. Otherwise we continue to the parent layer and try to make the rest directions scrollable (expandScrollRange).
&gt; 
&gt; That&apos;s why expandScrollRange only looks at one layer at a time, and it only updates the direction that is currently non-scrollable.
&gt; 
&gt; I think the real problem with this implementation is that it ignores transformation. I believe the extra logic in scrollBy() takes care of the transformation. However, if we want to keep the same logic that a fling never propagates up while supporting transformation, then scroll range can become convex polygon instead of rectilinear rectangle.
&gt; 
&gt; IMO the right way to do it is to pass in the fling velocity to scrollRange(), and the function returns the target scroll layer and the reverse-transformed fling velocity. Then later on we do everything in the layer&apos;s coordinates instead of window coordinates.

I like this idea a lot.  Could you take over this patch and try that, or is Sami a better owner?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>701854</commentid>
    <comment_count>8</comment_count>
    <who name="Sami Kyöstilä">skyostil</who>
    <bug_when>2012-08-22 06:40:01 -0700</bug_when>
    <thetext>(In reply to comment #7)
&gt; &gt; I think the real problem with this implementation is that it ignores transformation. I believe the extra logic in scrollBy() takes care of the transformation. However, if we want to keep the same logic that a fling never propagates up while supporting transformation, then scroll range can become convex polygon instead of rectilinear rectangle.
&gt; &gt; 
&gt; &gt; IMO the right way to do it is to pass in the fling velocity to scrollRange(), and the function returns the target scroll layer and the reverse-transformed fling velocity. Then later on we do everything in the layer&apos;s coordinates instead of window coordinates.

Right, the original code doesn&apos;t work with transforms. Having scrollRange() transform the fling into local layer coordinates sounds good, although we need to be a little careful about selecting which layer is flung -- it could be m_currentlyScrollingLayer or any of its parents. I&apos;m also wondering whether we can always guarantee that the fling only affects one layer.

&gt; I like this idea a lot.  Could you take over this patch and try that, or is Sami a better owner?

If anyone wants to go for it, be my guest. Otherwise I could look into this after 91117 et al are sorted.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>706503</commentid>
    <comment_count>9</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2012-08-28 10:46:05 -0700</bug_when>
    <thetext>*** Bug 77068 has been marked as a duplicate of this bug. ***</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>711394</commentid>
    <comment_count>10</comment_count>
    <who name="Alexandre Elias">aelias</who>
    <bug_when>2012-09-04 13:25:15 -0700</bug_when>
    <thetext>It looks like the fling upstreaming is not going to be finished before CC moves.   Should we delete the downstream fling code to ensure an easy transition?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>711424</commentid>
    <comment_count>11</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2012-09-04 13:51:36 -0700</bug_when>
    <thetext>&gt; It looks like the fling upstreaming is not going to be finished before CC moves.   Should we delete the downstream fling code to ensure an easy transition?

That&apos;s ok with me if that works for you.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>735832</commentid>
    <comment_count>12</comment_count>
    <who name="Nate Chapin">japhet</who>
    <bug_when>2012-10-05 11:44:00 -0700</bug_when>
    <thetext>Looks like this is obsolete.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>157281</attachid>
            <date>2012-08-08 13:43:41 -0700</date>
            <delta_ts>2012-08-20 15:37:19 -0700</delta_ts>
            <desc>patch</desc>
            <filename>fling.txt</filename>
            <type>text/plain</type>
            <size>12483</size>
            <attacher name="Nate Chapin">japhet</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9XZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9nCShyZXZpc2lvbiAxMjUwNzMpCisrKyBTb3Vy
Y2UvV2ViS2l0L2Nocm9taXVtL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDI3
IEBACisyMDEyLTA4LTA3ICBOYXRlIENoYXBpbiAgPGphcGhldEBjaHJvbWl1bS5vcmc+CisKKyAg
ICAgICAgW2Nocm9taXVtXSBUaWUgV2ViRmxpbmdBbmltYXRvciBpbnRvIHRoZSBjb21wb3NpdG9y
CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD05MzUxNAor
CisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFRlc3RzIGlu
IGNocm9taXVtJ3MgV2ViQ29tcG9zaXRvcklucHV0SGFuZGxlckltcGxUZXN0LgorCisgICAgICAg
ICogc3JjL1dlYkNvbXBvc2l0b3JJbnB1dEhhbmRsZXJJbXBsLmNwcDoKKyAgICAgICAgKFdlYktp
dDo6V2ViQ29tcG9zaXRvcklucHV0SGFuZGxlckltcGw6OmhhbmRsZUdlc3R1cmVGbGluZyk6Cisg
ICAgICAgIChXZWJLaXQ6OldlYkNvbXBvc2l0b3JJbnB1dEhhbmRsZXJJbXBsOjpjYW5jZWxDdXJy
ZW50RmxpbmcpOgorICAgICAgICAoV2ViS2l0OjpXZWJDb21wb3NpdG9ySW5wdXRIYW5kbGVySW1w
bDo6c2Nyb2xsQnkpOgorICAgICAgICAqIHRlc3RzL1dlYkNvbXBvc2l0b3JJbnB1dEhhbmRsZXJJ
bXBsVGVzdC5jcHA6CisgICAgICAgIChXZWJLaXQ6Ok1vY2tDQ0lucHV0SGFuZGxlckNsaWVudDo6
c2Nyb2xsUmFuZ2UpOgorICAgICAgICAoTW9ja0NDSW5wdXRIYW5kbGVyQ2xpZW50KToKKyAgICAg
ICAgKFRlc3RGbGluZ0FuaW1hdG9yKToKKyAgICAgICAgKFdlYktpdDo6VGVzdEZsaW5nQW5pbWF0
b3I6OnN0YXJ0RmxpbmcpOgorICAgICAgICAoV2ViS2l0OjpUZXN0RmxpbmdBbmltYXRvcjo6dXBk
YXRlUG9zaXRpb24pOgorICAgICAgICAoV2ViS2l0OjpUZXN0RmxpbmdBbmltYXRvcjo6Z2V0Q3Vy
cmVudFBvc2l0aW9uKToKKyAgICAgICAgKFdlYktpdDo6VGVzdEZsaW5nQW5pbWF0b3I6OmNhbmNl
bEZsaW5nKToKKyAgICAgICAgKFdlYktpdCk6CisgICAgICAgIChXZWJLaXQ6OlRFU1RfRik6CisK
IDIwMTItMDgtMDcgIEpvc2h1YSBCZWxsICA8anNiZWxsQGNocm9taXVtLm9yZz4KIAogICAgICAg
ICBMYXlvdXQgVGVzdCBzdG9yYWdlL2luZGV4ZWRkYi9pbnR2ZXJzaW9uLW9taXQtcGFyYW1ldGVy
Lmh0bWwgaXMgZmxha3kKSW5kZXg6IFNvdXJjZS9XZWJLaXQvY2hyb21pdW0vc3JjL1dlYkNvbXBv
c2l0b3JJbnB1dEhhbmRsZXJJbXBsLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0L2No
cm9taXVtL3NyYy9XZWJDb21wb3NpdG9ySW5wdXRIYW5kbGVySW1wbC5jcHAJKHJldmlzaW9uIDEy
NTA3MykKKysrIFNvdXJjZS9XZWJLaXQvY2hyb21pdW0vc3JjL1dlYkNvbXBvc2l0b3JJbnB1dEhh
bmRsZXJJbXBsLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjcsNiArMjcsNyBAQAogCiAjaW5jbHVk
ZSAiV2ViQ29tcG9zaXRvcklucHV0SGFuZGxlckltcGwuaCIKIAorI2luY2x1ZGUgIlBsYXRmb3Jt
R2VzdHVyZUN1cnZlRmFjdG9yeS5oIgogI2luY2x1ZGUgIlBsYXRmb3JtR2VzdHVyZUN1cnZlVGFy
Z2V0LmgiCiAjaW5jbHVkZSAiVG91Y2hwYWRGbGluZ1BsYXRmb3JtR2VzdHVyZUN1cnZlLmgiCiAj
aW5jbHVkZSAiVHJhY2VFdmVudC5oIgpAQCAtMjY5LDcgKzI3MCw3IEBACiAgICAgc3dpdGNoIChz
Y3JvbGxTdGF0dXMpIHsKICAgICBjYXNlIENDSW5wdXRIYW5kbGVyQ2xpZW50OjpTY3JvbGxTdGFy
dGVkOiB7CiAgICAgICAgIFRSQUNFX0VWRU5UX0lOU1RBTlQwKCJjYyIsICJXZWJDb21wb3NpdG9y
SW5wdXRIYW5kbGVySW1wbDo6aGFuZGxlR2VzdHVyZUZsaW5nOjpzdGFydGVkIik7Ci0gICAgICAg
IE93blB0cjxQbGF0Zm9ybUdlc3R1cmVDdXJ2ZT4gZmxpbmdDdXJ2ZSA9IFRvdWNocGFkRmxpbmdQ
bGF0Zm9ybUdlc3R1cmVDdXJ2ZTo6Y3JlYXRlKEZsb2F0UG9pbnQoZ2VzdHVyZUV2ZW50LmRlbHRh
WCwgZ2VzdHVyZUV2ZW50LmRlbHRhWSkpOworICAgICAgICBPd25QdHI8UGxhdGZvcm1HZXN0dXJl
Q3VydmU+IGZsaW5nQ3VydmUgPSBQbGF0Zm9ybUdlc3R1cmVDdXJ2ZUZhY3Rvcnk6OmdldCgpLT5j
cmVhdGVDdXJ2ZShGbG9hdFBvaW50KGdlc3R1cmVFdmVudC5kZWx0YVgsIGdlc3R1cmVFdmVudC5k
ZWx0YVkpLCBtX2lucHV0SGFuZGxlckNsaWVudC0+c2Nyb2xsUmFuZ2UoKSk7CiAgICAgICAgIG1f
d2hlZWxGbGluZ0FuaW1hdGlvbiA9IENDQWN0aXZlR2VzdHVyZUFuaW1hdGlvbjo6Y3JlYXRlKFBs
YXRmb3JtR2VzdHVyZVRvQ0NHZXN0dXJlQWRhcHRlcjo6Y3JlYXRlKGZsaW5nQ3VydmUucmVsZWFz
ZSgpKSwgdGhpcyk7CiAgICAgICAgIG1fd2hlZWxGbGluZ1BhcmFtZXRlcnMuZGVsdGEgPSBXZWJG
bG9hdFBvaW50KGdlc3R1cmVFdmVudC5kZWx0YVgsIGdlc3R1cmVFdmVudC5kZWx0YVkpOwogICAg
ICAgICBtX3doZWVsRmxpbmdQYXJhbWV0ZXJzLnBvaW50ID0gV2ViUG9pbnQoZ2VzdHVyZUV2ZW50
LngsIGdlc3R1cmVFdmVudC55KTsKQEAgLTMyMCw2ICszMjEsMTAgQEAKICAgICBUUkFDRV9FVkVO
VF9JTlNUQU5UMSgiY2MiLCAiV2ViQ29tcG9zaXRvcklucHV0SGFuZGxlckltcGw6OmNhbmNlbEN1
cnJlbnRGbGluZyIsICJoYWRGbGluZ0FuaW1hdGlvbiIsIGhhZEZsaW5nQW5pbWF0aW9uKTsKICAg
ICBtX3doZWVsRmxpbmdBbmltYXRpb24uY2xlYXIoKTsKICAgICBtX3doZWVsRmxpbmdQYXJhbWV0
ZXJzID0gV2ViQWN0aXZlV2hlZWxGbGluZ1BhcmFtZXRlcnMoKTsKKyNpZiBPUyhBTkRST0lEKQor
ICAgIGlmIChoYWRGbGluZ0FuaW1hdGlvbikKKyAgICAgICAgbV9pbnB1dEhhbmRsZXJDbGllbnQt
PnNjcm9sbEVuZCgpOworI2VuZGlmCiAgICAgcmV0dXJuIGhhZEZsaW5nQW5pbWF0aW9uOwogfQog
CkBAIC0zMjgsNiArMzMzLDExIEBACiAgICAgaWYgKGluY3JlbWVudCA9PSBJbnRQb2ludDo6emVy
bygpKQogICAgICAgICByZXR1cm47CiAKKyNpZiBPUyhBTkRST0lEKQorICAgIG1faW5wdXRIYW5k
bGVyQ2xpZW50LT5zY3JvbGxCeShJbnRTaXplKGluY3JlbWVudC54KCksIGluY3JlbWVudC55KCkp
KTsKKyAgICByZXR1cm47CisjZW5kaWYKKwogICAgIFRSQUNFX0VWRU5UMigiY2MiLCAiV2ViQ29t
cG9zaXRvcklucHV0SGFuZGxlckltcGw6OnNjcm9sbEJ5IiwgIngiLCBpbmNyZW1lbnQueCgpLCAi
eSIsIGluY3JlbWVudC55KCkpOwogICAgIFdlYk1vdXNlV2hlZWxFdmVudCBzeW50aGV0aWNXaGVl
bDsKICAgICBzeW50aGV0aWNXaGVlbC50eXBlID0gV2ViSW5wdXRFdmVudDo6TW91c2VXaGVlbDsK
SW5kZXg6IFNvdXJjZS9XZWJLaXQvY2hyb21pdW0vdGVzdHMvV2ViQ29tcG9zaXRvcklucHV0SGFu
ZGxlckltcGxUZXN0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0L2Nocm9taXVtL3Rl
c3RzL1dlYkNvbXBvc2l0b3JJbnB1dEhhbmRsZXJJbXBsVGVzdC5jcHAJKHJldmlzaW9uIDEyNTA3
MykKKysrIFNvdXJjZS9XZWJLaXQvY2hyb21pdW0vdGVzdHMvV2ViQ29tcG9zaXRvcklucHV0SGFu
ZGxlckltcGxUZXN0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjcsNiArMjcsOCBAQAogCiAjaW5j
bHVkZSAiV2ViQ29tcG9zaXRvcklucHV0SGFuZGxlckltcGwuaCIKIAorI2luY2x1ZGUgIkludFJl
Y3QuaCIKKyNpbmNsdWRlICJQbGF0Zm9ybUdlc3R1cmVDdXJ2ZUZhY3RvcnkuaCIKICNpbmNsdWRl
ICJXZWJDb21wb3NpdG9yLmgiCiAjaW5jbHVkZSAiV2ViQ29tcG9zaXRvcklucHV0SGFuZGxlckNs
aWVudC5oIgogI2luY2x1ZGUgIldlYklucHV0RXZlbnQuaCIKQEAgLTYzLDYgKzY1LDggQEAKICAg
ICBNT0NLX01FVEhPRDEoc2Nyb2xsQnksIHZvaWQoY29uc3QgV2ViQ29yZTo6SW50U2l6ZSYpKTsK
ICAgICBNT0NLX01FVEhPRDAoc2Nyb2xsRW5kLCB2b2lkKCkpOwogCisgICAgV2ViQ29yZTo6SW50
UmVjdCBzY3JvbGxSYW5nZSgpIGNvbnN0IHsgcmV0dXJuIFdlYkNvcmU6OkludFJlY3QoKTsgfQor
CiBwcml2YXRlOgogICAgIHZpcnR1YWwgdm9pZCBzdGFydFBhZ2VTY2FsZUFuaW1hdGlvbihjb25z
dCBXZWJDb3JlOjpJbnRTaXplJiB0YXJnZXRQb3NpdGlvbiwKICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgYm9vbCBhbmNob3JQb2ludCwKQEAgLTExNyw2ICsxMjEsMzQg
QEAKICAgICBXZWJDb21wb3NpdG9yOjpzaHV0ZG93bigpOwogfQogCitjbGFzcyBUZXN0RmxpbmdB
bmltYXRvciA6IHB1YmxpYyBXZWJLaXQ6OldlYkZsaW5nQW5pbWF0b3IgeworcHVibGljOgorICAg
IHZpcnR1YWwgdm9pZCBzdGFydEZsaW5nKGNvbnN0IFdlYkZsb2F0UG9pbnQmIHZlbG9jaXR5LCBj
b25zdCBXZWJSZWN0JiByYW5nZSkKKyAgICB7CisgICAgICAgIG1fdmVsb2NpdHkgPSBXZWJDb3Jl
OjpJbnRTaXplKChpbnQpdmVsb2NpdHkueCwgKGludCl2ZWxvY2l0eS55KTsKKyAgICB9CisKKyAg
ICB2aXJ0dWFsIGJvb2wgdXBkYXRlUG9zaXRpb24oKQorICAgIHsKKyAgICAgICAgLy8gU2Nyb2xs
IGZvcmV2ZXIgb25jZSBzdGFydGVkIGZvciB0aGUgcHVycG9zZSBvZiB0aGVzZSB0ZXN0cy4KKyAg
ICAgICAgLy8gV2UgZG9uJ3Qgd2FudCB0byBtYWtlIHRoZW0gdGltaW5nLXNlbnNpdGl2ZSBhbnl3
YXlzLgorICAgICAgICByZXR1cm4gbV92ZWxvY2l0eS53aWR0aCgpID4gMCB8fCBtX3ZlbG9jaXR5
LmhlaWdodCgpID4gMDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIFdlYlBvaW50IGdldEN1cnJlbnRQ
b3NpdGlvbigpCisgICAgeworICAgICAgICByZXR1cm4gbV9sYXN0UG9zaXRpb24gKz0gbV92ZWxv
Y2l0eTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgY2FuY2VsRmxpbmcoKQorICAgIHsKKyAg
ICAgICAgbV92ZWxvY2l0eSA9IFdlYkNvcmU6OkludFNpemUoKTsKKyAgICB9Citwcml2YXRlOgor
ICAgIFdlYkNvcmU6OkludFBvaW50IG1fbGFzdFBvc2l0aW9uOworICAgIFdlYkNvcmU6OkludFNp
emUgbV92ZWxvY2l0eTsKK307CisKIGNsYXNzIFdlYkNvbXBvc2l0b3JJbnB1dEhhbmRsZXJJbXBs
VGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKIHB1YmxpYzoKICAgICBXZWJDb21wb3NpdG9y
SW5wdXRIYW5kbGVySW1wbFRlc3QoKQpAQCAtMzM2LDEyICszNjgsNDIgQEAKICAgICBtX2lucHV0
SGFuZGxlci0+aGFuZGxlSW5wdXRFdmVudChnZXN0dXJlKTsKIH0KIAorI2lmIE9TKEFORFJPSUQp
CisvLyBGSVhNRTogU29ydCBvdXQgd2hldGhlciBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRvdWNoIGFu
ZCB3aGVlbCBmbGluZyBhcmUgbmVlZGVkLgorLy8gV2Ugc2hvdWxkIGVpdGhlciBoYXZlIGRpZmZl
cmVudCBjb25jZXB0cyBvZiB0b3VjaCBhbmQgbW91c2Ugd2hlZWwgZmxpbmcgYmFzZWQgb24gYSBt
YWNybywKKy8vIGFuZCB0aGVuIHJ1biBhIGRpZmZlcmVudCB0ZXN0IGhlcmUgYmFzZWQgb24gdGhh
dC4gT3IgdW5pZnkgdGhlIGNvZGUgYW5kIGhhbmRsZSB0aGUKKy8vIGRpZmZlcmVuY2VzIGluIHNj
cm9sbCBiZWhhdmlvciBhdCBhIGRpZmZlcmVudCBsZXZlbC4KKy8vIFRoZSBjdXJyZW50IGRpZmZl
cmVuY2VzIGNvbWUgZG93biB0byBtb3VzZSB3aGVlbCBmbGluZyB3cmFwcGluZyBlYWNoIGZsaW5n
IHVwZGF0ZSBpbgorLy8gYSBiZWdpbi9lbmQgcGFpciBpbiB0aGUgb3RoZXIgdmVyc2lvbiBvZiB0
aGUgdGVzdCBmdXJ0aGVyIGRvd24uCiBURVNUX0YoV2ViQ29tcG9zaXRvcklucHV0SGFuZGxlcklt
cGxUZXN0LCBnZXN0dXJlRmxpbmdBbmltYXRlcykKIHsKKyAgICBQbGF0Zm9ybUdlc3R1cmVDdXJ2
ZUZhY3Rvcnk6OmdldCgpLT5zZXRXZWJGbGluZ0FuaW1hdG9yRm9yVGVzdChhZG9wdFB0cihuZXcg
VGVzdEZsaW5nQW5pbWF0b3IpKTsKKwogICAgIC8vIFdlIHNob3VsZG4ndCBzZW5kIGFueSBldmVu
dHMgdG8gdGhlIHdpZGdldCBmb3IgdGhpcyBnZXN0dXJlLgogICAgIG1fZXhwZWN0ZWREaXNwb3Np
dGlvbiA9IERpZEhhbmRsZTsKICAgICBWRVJJRllfQU5EX1JFU0VUX01PQ0tTKCk7CisgICAgCisg
ICAgZ2VzdHVyZS50eXBlID0gV2ViS2l0OjpXZWJJbnB1dEV2ZW50OjpHZXN0dXJlRmxpbmdTdGFy
dDsKKyAgICBnZXN0dXJlLmRlbHRhWCA9IDEwMDA7CisgICAgRVhQRUNUX0NBTEwobV9tb2NrQ0NJ
bnB1dEhhbmRsZXJDbGllbnQsIHNjaGVkdWxlQW5pbWF0aW9uKCkpOworICAgIEVYUEVDVF9DQUxM
KG1fbW9ja0NDSW5wdXRIYW5kbGVyQ2xpZW50LCBzY3JvbGxCZWdpbih0ZXN0aW5nOjpfLCB0ZXN0
aW5nOjpfKSkKKyAgICAuV2lsbE9uY2UodGVzdGluZzo6UmV0dXJuKFdlYkNvcmU6OkNDSW5wdXRI
YW5kbGVyQ2xpZW50OjpTY3JvbGxTdGFydGVkKSk7CisgICAgbV9pbnB1dEhhbmRsZXItPmhhbmRs
ZUlucHV0RXZlbnQoZ2VzdHVyZSk7CisgICAgCisgICAgdGVzdGluZzo6TW9jazo6VmVyaWZ5QW5k
Q2xlYXJFeHBlY3RhdGlvbnMoJm1fbW9ja0NDSW5wdXRIYW5kbGVyQ2xpZW50KTsKKyAgICBFWFBF
Q1RfQ0FMTChtX21vY2tDQ0lucHV0SGFuZGxlckNsaWVudCwgc2NoZWR1bGVBbmltYXRpb24oKSk7
CisgICAgRVhQRUNUX0NBTEwobV9tb2NrQ0NJbnB1dEhhbmRsZXJDbGllbnQsIHNjcm9sbEJlZ2lu
KHRlc3Rpbmc6Ol8sIHRlc3Rpbmc6Ol8pKS5UaW1lcygwKTsKKyAgICBFWFBFQ1RfQ0FMTChtX21v
Y2tDQ0lucHV0SGFuZGxlckNsaWVudCwgc2Nyb2xsQnkodGVzdGluZzo6UHJvcGVydHkoJldlYkNv
cmU6OkludFNpemU6OndpZHRoLCB0ZXN0aW5nOjpHdCgwKSkpKS5UaW1lcygxKTsKKyAgICBtX2lu
cHV0SGFuZGxlci0+YW5pbWF0ZSgxMCk7Cit9CiAKKyNlbHNlCitURVNUX0YoV2ViQ29tcG9zaXRv
cklucHV0SGFuZGxlckltcGxUZXN0LCBnZXN0dXJlRmxpbmdBbmltYXRlcykKK3sKKyAgICAvLyBX
ZSBzaG91bGRuJ3Qgc2VuZCBhbnkgZXZlbnRzIHRvIHRoZSB3aWRnZXQgZm9yIHRoaXMgZ2VzdHVy
ZS4KKyAgICBtX2V4cGVjdGVkRGlzcG9zaXRpb24gPSBEaWRIYW5kbGU7CisgICAgVkVSSUZZX0FO
RF9SRVNFVF9NT0NLUygpOworCiAgICAgLy8gT24gdGhlIGZsaW5nIHN0YXJ0LCB3ZSBzaG91bGQg
c2NoZWR1bGUgYW4gYW5pbWF0aW9uIGJ1dCBub3QgYWN0dWFsbHkgc3RhcnQKICAgICAvLyBzY3Jv
bGxpbmcuCiAgICAgZ2VzdHVyZS50eXBlID0gV2ViSW5wdXRFdmVudDo6R2VzdHVyZUZsaW5nU3Rh
cnQ7CkBAIC01NjEsNSArNjIzLDYgQEAKICAgICAgICAgICAgIHRlc3Rpbmc6OkZpZWxkKCZXZWJT
aXplOjpoZWlnaHQsIHRlc3Rpbmc6Okx0KDApKSkpKSk7CiAgICAgbV9pbnB1dEhhbmRsZXItPmFu
aW1hdGUoMzAuMik7CiB9CisjZW5kaWYKIAogfQpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NMYXllclRyZWVIb3N0SW1wbC5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDTGF5ZXJU
cmVlSG9zdEltcGwuaAkocmV2aXNpb24gMTI1MDczKQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NMYXllclRyZWVIb3N0SW1wbC5oCSh3b3JraW5nIGNv
cHkpCkBAIC04MSw2ICs4MSw4IEBACiAgICAgdmlydHVhbCB2b2lkIHNldEFjdGl2ZUdlc3R1cmVB
bmltYXRpb24oUGFzc093blB0cjxDQ0FjdGl2ZUdlc3R1cmVBbmltYXRpb24+KSBPVkVSUklERTsK
ICAgICB2aXJ0dWFsIHZvaWQgc2NoZWR1bGVBbmltYXRpb24oKSBPVkVSUklERTsKIAorICAgIHZp
cnR1YWwgSW50UmVjdCBzY3JvbGxSYW5nZSgpIGNvbnN0IE9WRVJSSURFOworCiAgICAgc3RydWN0
IEZyYW1lRGF0YSB7CiAgICAgICAgIFZlY3RvcjxJbnRSZWN0PiBvY2NsdWRpbmdTY3JlZW5TcGFj
ZVJlY3RzOwogICAgICAgICBDQ1JlbmRlclBhc3NMaXN0IHJlbmRlclBhc3NlczsKSW5kZXg6IFNv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDTGF5ZXJUcmVlSG9z
dEltcGwuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L2Nocm9taXVtL2NjL0NDTGF5ZXJUcmVlSG9zdEltcGwuY3BwCShyZXZpc2lvbiAxMjUwNzMpCisr
KyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ0xheWVyVHJl
ZUhvc3RJbXBsLmNwcAkod29ya2luZyBjb3B5KQpAQCAtOTI0LDYgKzkyNCw1MCBAQAogICAgIGNs
ZWFyQ3VycmVudGx5U2Nyb2xsaW5nTGF5ZXIoKTsKIH0KIAorc3RhdGljIGJvb2wgaXNWYWxpZFNj
cm9sbFJhbmdlKGNvbnN0IEludFJlY3QmIHNjcm9sbFJhbmdlKQoreworICAgIHJldHVybiBzY3Jv
bGxSYW5nZS54KCkgPCAwICYmIHNjcm9sbFJhbmdlLnkoKSA8IDAgJiYgc2Nyb2xsUmFuZ2UubWF4
WCgpID4gMCAmJiBzY3JvbGxSYW5nZS5tYXhZKCkgPiAwOworfQorCitzdGF0aWMgdm9pZCBleHBh
bmRTY3JvbGxSYW5nZShJbnRSZWN0JiBzY3JvbGxSYW5nZSwgZmxvYXQgc2NhbGUsIEludFBvaW50
IHNjcm9sbFBvc2l0aW9uLCBJbnRTaXplIG1heFNjcm9sbFBvc2l0aW9uKQoreworICAgIHNjcm9s
bFBvc2l0aW9uLnNjYWxlKHNjYWxlLCBzY2FsZSk7CisgICAgbWF4U2Nyb2xsUG9zaXRpb24uc2Nh
bGUoc2NhbGUpOworICAgIHNjcm9sbFBvc2l0aW9uLmNsYW1wTmVnYXRpdmVUb1plcm8oKTsKKyAg
ICBtYXhTY3JvbGxQb3NpdGlvbiA9IG1heFNjcm9sbFBvc2l0aW9uLmV4cGFuZGVkVG8odG9TaXpl
KHNjcm9sbFBvc2l0aW9uKSk7CisgICAgLy8gT25seSBleHBhbmQgdGhlIHNjcm9sbCByYW5nZSBh
bG9uZyBhbiBheGlzIGlmIHRoZXJlIHByZXZpb3VzbHkgd2FzIG5vIHJvb20gdG8gc2Nyb2xsIGlu
IHRoYXQgZGlyZWN0aW9uLgorICAgIC8vIFRoaXMgaXMgdG8gZW5zdXJlIHRoYXQgZmxpbmdzIGRv
IG5vdCBvdmVyc2hvb3QgdGhlIGJvdW5kYXJpZXMgb2YgYSBzY3JvbGxhYmxlIGVsZW1lbnQgYW5k
IHN0YXJ0IHNjcm9sbGluZworICAgIC8vIGl0cyBwYXJlbnQgaW5zdGVhZC4KKyAgICBpZiAoIXNj
cm9sbFJhbmdlLngoKSkgeworICAgICAgICBzY3JvbGxSYW5nZS5zZXRYKC1zY3JvbGxQb3NpdGlv
bi54KCkpOworICAgICAgICBzY3JvbGxSYW5nZS5zZXRXaWR0aChzY3JvbGxSYW5nZS53aWR0aCgp
ICsgc2Nyb2xsUG9zaXRpb24ueCgpKTsKKyAgICB9CisgICAgaWYgKCFzY3JvbGxSYW5nZS55KCkp
IHsKKyAgICAgICAgc2Nyb2xsUmFuZ2Uuc2V0WSgtc2Nyb2xsUG9zaXRpb24ueSgpKTsKKyAgICAg
ICAgc2Nyb2xsUmFuZ2Uuc2V0SGVpZ2h0KHNjcm9sbFJhbmdlLmhlaWdodCgpICsgc2Nyb2xsUG9z
aXRpb24ueSgpKTsKKyAgICB9CisgICAgaWYgKCFzY3JvbGxSYW5nZS5tYXhYKCkpCisgICAgICAg
IHNjcm9sbFJhbmdlLnNldFdpZHRoKG1heFNjcm9sbFBvc2l0aW9uLndpZHRoKCkgLSBzY3JvbGxQ
b3NpdGlvbi54KCkgLSBzY3JvbGxSYW5nZS54KCkpOworICAgIGlmICghc2Nyb2xsUmFuZ2UubWF4
WSgpKQorICAgICAgICBzY3JvbGxSYW5nZS5zZXRIZWlnaHQobWF4U2Nyb2xsUG9zaXRpb24uaGVp
Z2h0KCkgLSBzY3JvbGxQb3NpdGlvbi55KCkgLSBzY3JvbGxSYW5nZS55KCkpOworICAgIEFTU0VS
VChzY3JvbGxSYW5nZS54KCkgPD0gMCAmJiBzY3JvbGxSYW5nZS5tYXhYKCkgPj0gMCk7CisgICAg
QVNTRVJUKHNjcm9sbFJhbmdlLnkoKSA8PSAwICYmIHNjcm9sbFJhbmdlLm1heFkoKSA+PSAwKTsK
K30KKworSW50UmVjdCBDQ0xheWVyVHJlZUhvc3RJbXBsOjpzY3JvbGxSYW5nZSgpIGNvbnN0Cit7
CisgICAgY29uc3QgQ0NMYXllckltcGwqIGxheWVySW1wbCA9IG1fcm9vdFNjcm9sbExheWVySW1w
bDsKKyAgICBJbnRSZWN0IHNjcm9sbFJhbmdlOworCisgICAgaWYgKGxheWVySW1wbCAmJiAhaXNW
YWxpZFNjcm9sbFJhbmdlKHNjcm9sbFJhbmdlKSkgeworICAgICAgICBpZiAobGF5ZXJJbXBsLT5z
Y3JvbGxhYmxlKCkpIHsKKyAgICAgICAgICAgIEludFBvaW50IHNjcm9sbFBvc2l0aW9uKGZsb29y
ZWRJbnRQb2ludChsYXllckltcGwtPnNjcm9sbFBvc2l0aW9uKCkgKyBsYXllckltcGwtPnNjcm9s
bERlbHRhKCkpKTsKKyAgICAgICAgICAgIGV4cGFuZFNjcm9sbFJhbmdlKHNjcm9sbFJhbmdlLCBt
X3BhZ2VTY2FsZURlbHRhLCBzY3JvbGxQb3NpdGlvbiwgbGF5ZXJJbXBsLT5tYXhTY3JvbGxQb3Np
dGlvbigpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2Nyb2xsUmFuZ2U7Cit9CisK
IHZvaWQgQ0NMYXllclRyZWVIb3N0SW1wbDo6cGluY2hHZXN0dXJlQmVnaW4oKQogewogICAgIG1f
cGluY2hHZXN0dXJlQWN0aXZlID0gdHJ1ZTsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDSW5wdXRIYW5kbGVyLmgKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NJbnB1dEhhbmRsZXIu
aAkocmV2aXNpb24gMTI1MDczKQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
Y2hyb21pdW0vY2MvQ0NJbnB1dEhhbmRsZXIuaAkod29ya2luZyBjb3B5KQpAQCAtMjQsNiArMjQs
NyBAQAogI2lmbmRlZiBDQ0lucHV0SGFuZGxlcl9oCiAjZGVmaW5lIENDSW5wdXRIYW5kbGVyX2gK
IAorI2luY2x1ZGUgIkludFJlY3QuaCIKICNpbmNsdWRlIDx3dGYvTm9uY29weWFibGUuaD4KICNp
bmNsdWRlIDx3dGYvUGFzc093blB0ci5oPgogCkBAIC02NSw2ICs2NiwxMCBAQAogICAgIC8vIGNh
bGxlZCBpZiBzY3JvbGxCZWdpbigpIHJldHVybmVkIFNjcm9sbFN0YXJ0ZWQuCiAgICAgdmlydHVh
bCB2b2lkIHNjcm9sbEVuZCgpID0gMDsKIAorICAgIC8vIFJldHVybiB0aGUgc2Nyb2xsIHJhbmdl
IHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uLiB0b3AvbGVmdAorICAgIC8vIHZhbHVl
IDw9IDAsIGFuZCBib3R0b20vcmlnaHQgdmFsdWUgPj0gMC4KKyAgICB2aXJ0dWFsIEludFJlY3Qg
c2Nyb2xsUmFuZ2UoKSBjb25zdCA9IDA7CisKICAgICB2aXJ0dWFsIHZvaWQgcGluY2hHZXN0dXJl
QmVnaW4oKSA9IDA7CiAgICAgdmlydHVhbCB2b2lkIHBpbmNoR2VzdHVyZVVwZGF0ZShmbG9hdCBt
YWduaWZ5RGVsdGEsIGNvbnN0IEludFBvaW50JiBhbmNob3IpID0gMDsKICAgICB2aXJ0dWFsIHZv
aWQgcGluY2hHZXN0dXJlRW5kKCkgPSAwOwpJbmRleDogU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9n
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMTI1MDgx
KQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEs
MjAgQEAKKzIwMTItMDgtMDggIE5hdGUgQ2hhcGluICA8amFwaGV0QGNocm9taXVtLm9yZz4KKwor
ICAgICAgICBbY2hyb21pdW1dIFRpZSBXZWJGbGluZ0FuaW1hdG9yIGludG8gdGhlIGNvbXBvc2l0
b3IKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTkzNTE0
CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgVGVzdHMg
aW4gY2hyb21pdW0ncyBXZWJDb21wb3NpdG9ySW5wdXRIYW5kbGVySW1wbFRlc3QuCisKKyAgICAg
ICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ0lucHV0SGFuZGxlci5oOgorICAg
ICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDTGF5ZXJUcmVlSG9zdEltcGwu
Y3BwOgorICAgICAgICAoV2ViQ29yZTo6aXNWYWxpZFNjcm9sbFJhbmdlKToKKyAgICAgICAgKFdl
YkNvcmUpOgorICAgICAgICAoV2ViQ29yZTo6ZXhwYW5kU2Nyb2xsUmFuZ2UpOgorICAgICAgICAo
V2ViQ29yZTo6Q0NMYXllclRyZWVIb3N0SW1wbDo6c2Nyb2xsUmFuZ2UpOgorICAgICAgICAqIHBs
YXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDTGF5ZXJUcmVlSG9zdEltcGwuaDoKKwogMjAx
Mi0wOC0wOCAgUGF2ZWwgRmVsZG1hbiAgPHBmZWxkbWFuQGNocm9taXVtLm9yZz4KIAogICAgICAg
ICBSRUdSRVNTSU9OKHIxMjUwNDYpOiBCcmVha3MgZGVidWcgYnVpbGQgKGFzc2VydGlvbiBpbiBw
cm90b2NvbCB0eXBlIGNoZWNrcykgKFJlcXVlc3RlZCBieSBwZmVsZG1hbiBvbiAjd2Via2l0KS4K
</data>
<flag name="review"
          id="167160"
          type_id="1"
          status="-"
          setter="jamesr"
    />
    <flag name="commit-queue"
          id="167171"
          type_id="3"
          status="-"
          setter="buildbot"
    />
          </attachment>
      

    </bug>

</bugzilla>