<?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>22740</bug_id>
          
          <creation_ts>2008-12-08 13:36:50 -0800</creation_ts>
          <short_desc>It&apos;s not possible to navigate a page using the 4 arrow keys.</short_desc>
          <delta_ts>2009-01-10 15:45:42 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebKit Qt</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>PC</rep_platform>
          <op_sys>Linux</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>DUPLICATE</resolution>
          <dup_id>18662</dup_id>
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Enhancement</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Joseph Ligman">joseph.ligman</reporter>
          <assigned_to name="Joseph Ligman">joseph.ligman</assigned_to>
          <cc>aroben</cc>
    
    <cc>darin</cc>
    
    <cc>justin.garcia</cc>
    
    <cc>sam</cc>
    
    <cc>simon.fraser</cc>
    
    <cc>sriram.yadavalli</cc>
    
    <cc>tonikitoo</cc>
    
    <cc>vestbo</cc>
    
    <cc>yongjun.zhang</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>101861</commentid>
    <comment_count>0</comment_count>
    <who name="Joseph Ligman">joseph.ligman</who>
    <bug_when>2008-12-08 13:36:50 -0800</bug_when>
    <thetext>I need a way to navigate using the focus point algorithm described here:
http://www.w3.org/TR/WICD/#nav-distance-fkt</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>101862</commentid>
    <comment_count>1</comment_count>
      <attachid>25852</attachid>
    <who name="Joseph Ligman">joseph.ligman</who>
    <bug_when>2008-12-08 13:39:56 -0800</bug_when>
    <thetext>Created attachment 25852
patch to QWebFrame to get the next focus point given a point and a direction

Added a method to QWebFrame to return the next focus point given a direction and a point. This function enables directional tab navigation. The details of the algorithm can be found at http://www.w3.org/TR/WICD/#nav-distance-fkt</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>101947</commentid>
    <comment_count>2</comment_count>
      <attachid>25852</attachid>
    <who name="Tor Arne Vestbø">vestbo</who>
    <bug_when>2008-12-09 00:32:02 -0800</bug_when>
    <thetext>Comment on attachment 25852
patch to QWebFrame to get the next focus point given a point and a direction

Good stuff Joe, but I have a few questions about the concept, let&apos;s discuss on IRC.

Some style comments, see http://webkit.org/coding/coding-style.html and http://trac.webkit.org/wiki/Coding%20Style%20Guidelines

&gt; +    //The dotDist is the euclidian distance

Spaces beteeen // and comment

&gt; + int dotDist = 0;

A better name for this?

&gt; + int Overlap = 0;
&gt; + int xdisplacement = 0;
&gt; + int ydisplacement = 0;

Variables should be lowerCaseTitleCase


&gt; +       dy = focus.y()-rect.bottom();

Spaces between operators

&gt; +    }
&gt; +    else if (direction == QWebFrame::South) {

else if on the same line as closing brace

&gt; +        else if (focus.y() &gt; rect.bottom())
&gt; +            dy = focus.y() - rect.bottom();
&gt; +
&gt; +    }

Don&apos;t need the blank line

&gt; +        //overlapping rectangles are rewarded
&gt; +        if ((rect.y()&gt;=rbound.y() &amp;&amp; rect.y()&lt;=rbound.bottom()) ||
&gt; +            (rect.bottom()&gt;=rbound.y() &amp;&amp; rect.bottom()&lt;=rbound.bottom())) {

Boolean operators aligned on the left side, not on the right
&gt; +    QPoint next = m_view-&gt;page()-&gt;mainFrame()-&gt;nextFocusPoint(QWebFrame::South,current);

Can probably store mainFrame here and use later instead of going through the view and page.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>101979</commentid>
    <comment_count>3</comment_count>
    <who name="Adam Roben (:aroben)">aroben</who>
    <bug_when>2008-12-09 08:50:48 -0800</bug_when>
    <thetext>I think this functionality should exist in WebCore, rather than in any particular port&apos;s API layer. That way all ports can benefit from the functionality.

I think it may be possible to share some of the existing code in FocusController::advanceFocus with this new functionality. I&apos;d imagine some changes like the following:

FocusDirection gains new members Up, Down, Left, Right or similar

The calls to Document::{next,previous}FocusableNode are replaced with calls to a static helper function that looks something like this:

static Node* nextFocusableNodeInDirection(Node* start, FocusDirection direction)
{
    switch (direction) {
        ...
    }
}

The rest of advanceFocus could probably remain largely the same.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>102283</commentid>
    <comment_count>4</comment_count>
      <attachid>25965</attachid>
    <who name="Joseph Ligman">joseph.ligman</who>
    <bug_when>2008-12-11 14:57:32 -0800</bug_when>
    <thetext>Created attachment 25965
focus node navigation using arrow keys

Moved functionality up so it is usable by all platforms. Form control navigation needs to be handled by the client, similar to tab navigation.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>102369</commentid>
    <comment_count>5</comment_count>
      <attachid>25965</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2008-12-12 10:36:12 -0800</bug_when>
    <thetext>Comment on attachment 25965
focus node navigation using arrow keys

This looks like a good start. Thanks for working on this!

I&apos;m a little confused about the feature you&apos;re implementing. I&apos;m not sure I understand why this should be controlled by web pages and not by the web browser. But I think it&apos;s a great step in the right direction to have the concept of navigating geometrically, especially if we can get a good implementation. And I&apos;m sure you can educate me about why this should be built into web browsers by default and controlled by a &lt;meta&gt; tag in the web page.

New features like this need some tests. You need to learn to write tests using our &quot;layout test&quot; framework and include a test of the new code in your patch.

&gt; +2008-12-11  Joe Ligman  &lt;jligman@mindspring.com&gt;
&gt; +
&gt; +        Reviewed by NOBODY (OOPS!).
&gt; +
&gt; +        Added focuspoint navigation based on http://www.w3.org/TR/WICD/#nav-distance-fkt.

Should mention the URL to the bugs.webkit.org bug in the change log entry.

&gt; +        * ../WebCore/dom/Document.cpp:
&gt; +        * ../WebCore/dom/Document.h:
&gt; +        * ../WebCore/page/EventHandler.cpp:
&gt; +        * ../WebCore/page/EventHandler.h:
&gt; +        * ../WebCore/page/FocusController.cpp:
&gt; +        * ../WebCore/page/FocusDirection.h:

The path names here should not have &apos;../WebCore&apos; in front of them. The files should have the function names in them, and good change log entries also have per-function comments with some more detail of what&apos;s being done.

&gt; +    if (direction == FocusDirectionNorth) {

We&apos;d normally use a switch statement rather than cascading if statements for cases like these.

&gt; +static int distanceFunction(FocusDirection direction, const IntRect&amp; possibleRect, const IntPoint&amp; focusPoint, const IntRect&amp; focusedRect)

This shouldn&apos;t be named &quot;distanceFunction&quot; because we name functions after their results; we don&apos;t include the word &quot;function&quot; in their names. So it could be called &quot;distance&quot; or something more specific.

&gt; +{
&gt; +    // The absolute distance (dx or dy) on the navigation axis between the opposing edges of the currently focused
&gt; +    // element and each of the canidates.

Typo here: &quot;canidates&quot;.

&gt; +    int distanceX = 0;
&gt; +    int distanceY = 0;

Why set these to 0 -- they&apos;re already set in all cases.

&gt; +
&gt; +    // The euclidian distance
&gt; +    int euclidianDist = 0;

I believe Euclidean has an &quot;e&quot;, not an &quot;i&quot;, in it.

&gt; +    IntRect focusedRect = (startNode)?startNode-&gt;getRect():IntRect(0,0,0,0);

This is not the formatting we&apos;d normally use. This should be written like this:

    IntRect focusRect = startNode ? startNode-&gt;getRect() : IntRect();

No need for the &quot;0, 0, 0, 0&quot;.

&gt; +    int distance = -1;

I suggest setting distance to std::numeric_limits&lt;int&gt;::max() instead of -1, then you won&apos;t need a special case in the if statement inside the loop.

&gt; +    IntRect focusRect;

This is a &quot;write-only&quot; variable. It is defined and set to various values, but never used. I suggest removing it.

&gt; +    Node* nextNode = 0;

I suggest calking this something like bestNode instead of nextNode. There are a lot of &quot;next&quot; nodes in this code.

&gt; +    for(Node* n = this; n != 0; n = n-&gt;traverseNextNode()) {

We use a space after the &quot;for&quot;, and &quot;n&quot; rather than &quot;n != 0&quot;. See the coding style guidelines for details.

&gt; +        if(n-&gt;isFocusable()) {

We use a space after the &quot;if&quot;.

&gt; +            if (direction == FocusDirectionNorth &amp;&amp; r.bottom() &gt;= focusPoint.y()) continue;
&gt; +            if (direction == FocusDirectionSouth &amp;&amp; r.y() &lt;= focusPoint.y()) continue;
&gt; +            if (direction == FocusDirectionEast &amp;&amp; r.x() &lt;= focusPoint.x()) continue;
&gt; +            if (direction == FocusDirectionWest &amp;&amp; r.right() &gt;= focusPoint.x()) continue;

I think this logic would read better if the check was a function, rather than four different if/continue statements. The name of the function would help explain what&apos;s going on.

&gt; +            int dis = distanceFunction(direction, r, focusPoint, focusedRect);

I think dis is an unclear name for this. I suggest calling the other one bestDistance and this one distance, instead of distance and dis.

&gt; +            if (distance == -1 || distance &gt; dis) {
&gt; +                distance = dis;
&gt; +                focusRect = r;
&gt; +                nextNode = n;
&gt; +            }
&gt; +        }
&gt; +    }
&gt; +
&gt; +    return nextNode;
&gt; +}

&gt;  #include &lt;wtf/ListHashSet.h&gt;
&gt; -
&gt; +#include &quot;FocusDirection.h&quot;
&gt;  // FIXME: We should move Mac off of the old Frame-based user stylesheet loading

You should not remove the space between the list of includes and the 

&gt;  // code and onto the new code in Page. We can&apos;t do that until the code in Page
&gt;  // supports non-file: URLs, however.
&gt; @@ -606,6 +606,18 @@ public:
&gt;       */
&gt;      Node* previousFocusableNode(Node* start, KeyboardEvent*);
&gt;  
&gt; +    /**
&gt; +     * Searches through the document, starting from the start node. chooses the next node based on a focus point 
&gt; +     * algorithm.
&gt; +     *
&gt; +     * @param FocusDirection
&gt; +     *
&gt; +     * @return The focus node to start the search
&gt; +     *
&gt; +     * See http://www.w3.org/TR/WIDC/#nav-distance-fkt
&gt; +     */
&gt; +    Node* nextFocusableNodeInDirection(FocusDirection direction, Node* startNode);

Comments are good, but you need to match the style in the rest of the source file. You&apos;ll note that the other functions in this file don&apos;t have this style of comment, and we don&apos;t want to move in that direction for the file. Please make the comment closer in style to the rest of this file. Things like the &quot;see URL&quot; can go in the .cpp file rather than the header.

We omit argument names like &quot;direction&quot; when the type of the argument already makes it clear without an argument name.

I don&apos;t understand why this function only looks in nodes that are subsequent to this one in the document. What if the node that&apos;s the best candidate is earlier in document order rather than later?

&gt; +        bool tabbed = false;
&gt; +        Document* doc = m_frame-&gt;document();
&gt; +        if (doc) {
&gt; +            RefPtr&lt;NodeList&gt; list = doc-&gt;getElementsByTagName(&quot;meta&quot;);
&gt; +            unsigned len = list-&gt;length();
&gt; +            for (unsigned i = 0; i &lt; len; i++) {
&gt; +                HTMLMetaElement* meta = static_cast&lt;HTMLMetaElement*&gt;(list-&gt;item(i));
&gt; +                if (meta-&gt;name() == &quot;navigation&quot; &amp;&amp;  meta-&gt;content() == &quot;tabbed&quot;)
&gt; +                    tabbed = true;
&gt; +            }
&gt; +        }

I think this loop should be in a separate helper function rather than right here in the event handler code. It makes the logic easier to read.

Also, is this &lt;meta&gt; tag rule really the way we want to trigger this feature? Maybe there are some web browsers that would want to trigger it based on the browser rather than on the web page content. I&apos;m not entirely 

&gt; +        if (tabbed)
&gt; +            directionalTabEventHandler(event);

I think this naming is inconsistent with other similar functions in this file. Functions like handleKeyboardSelectionMovement have verbs for their names, saying what they do. But maybe there are others named like your new one.

&gt;         // provides KB navigation and selection for enhanced accessibility users
&gt;         if (AXObjectCache::accessibilityEnhancedUserInterfaceEnabled())
&gt; -           handleKeyboardSelectionMovement(event);       
&gt; +           handleKeyboardSelectionMovement(event);  

It seems that the same event can be handled both by directionalTabEventHandler and handleKeyboardSelectionMovement -- do we need code to prevent that?

&gt; +    if (!event || event-&gt;ctrlKey() || event-&gt;metaKey() || event-&gt;altGraphKey())
&gt; +        return;

Why the check for !event here? Is it legal to call this with 0?

We really need a comment in this function explaining the high level logic about when this code should run. I&apos;m surprised about the explicit &quot;design mode&quot; check -- that won&apos;t cover the many other ways HTML editing can be turned on, and I suspect we&apos;d want this feature off in all those cases too. A comment explaining when we want this to work would help me determine if the code is correct or not.

&gt; +    if (m_frame-&gt;document()-&gt;inDesignMode())
&gt; +        return;
&gt; +
&gt; +    Page* page = m_frame-&gt;page();
&gt; +    if (!page)
&gt; +        return;
&gt; +
&gt; +    if (!page-&gt;tabKeyCyclesThroughElements())
&gt; +        return;
&gt; +
&gt; +    String key = event-&gt;keyIdentifier(); 
&gt; +
&gt; +    if (key == &quot;Up&quot; &amp;&amp; page-&gt;focusController()-&gt;advanceFocus(FocusDirectionNorth, event))
&gt; +        event-&gt;setDefaultHandled();
&gt; +
&gt; +    else if (key == &quot;Down&quot; &amp;&amp; page-&gt;focusController()-&gt;advanceFocus(FocusDirectionSouth, event))
&gt; +        event-&gt;setDefaultHandled();
&gt; +
&gt; +    else if (key == &quot;Left&quot; &amp;&amp; page-&gt;focusController()-&gt;advanceFocus(FocusDirectionWest, event))
&gt; +        event-&gt;setDefaultHandled();
&gt; +
&gt; +    else if (key == &quot;Right&quot; &amp;&amp; page-&gt;focusController()-&gt;advanceFocus(FocusDirectionEast, event))
&gt; +        event-&gt;setDefaultHandled();

I&apos;d like to see a separate function to map the key name or key event to a direction, rather than 4 separate if statements here.

&gt;      void defaultTabEventHandler(KeyboardEvent*);
&gt; +    void directionalTabEventHandler(KeyboardEvent* event);

The word &quot;Tab&quot; in the code above refers to the tab key. But this second function has nothing to do with the tab key so it should not have tab in its name. Also, the argument name event should be left out. 

&gt;  
&gt;      void allowDHTMLDrag(bool&amp; flagDHTML, bool&amp; flagUA) const;
&gt;  
&gt; -        node = (direction == FocusDirectionForward)
&gt; -            ? document-&gt;nextFocusableNode(0, event)
&gt; -            : document-&gt;previousFocusableNode(0, event);
&gt; +        if (direction == FocusDirectionForward)
&gt; +            node = document-&gt;nextFocusableNode(0, event);
&gt; +        else if (direction == FocusDirectionBackward)
&gt; +            node = document-&gt;previousFocusableNode(0, event);
&gt; +        else
&gt; +            node = document-&gt;nextFocusableNodeInDirection(direction, 0);

This seems wrong. Instead of changing the code here, nextFocusableNodeInDirection should handle the forward and backward directions.

&gt; -    Node* node = (direction == FocusDirectionForward)
&gt; -        ? document-&gt;nextFocusableNode(document-&gt;focusedNode(), event)
&gt; -        : document-&gt;previousFocusableNode(document-&gt;focusedNode(), event);
&gt; -            
&gt; +    Node* node = 0;
&gt; +    if (direction == FocusDirectionForward)
&gt; +        node = document-&gt;nextFocusableNode(document-&gt;focusedNode(), event);
&gt; +    else if (direction == FocusDirectionBackward)
&gt; +        node = document-&gt;previousFocusableNode(document-&gt;focusedNode(), event);
&gt; +    else
&gt; +        node = document-&gt;nextFocusableNodeInDirection(direction, document-&gt;focusedNode());

Same comment.

&gt; -        node = (direction == FocusDirectionForward)
&gt; -            ? parentDocument-&gt;nextFocusableNode(owner, event)
&gt; -            : parentDocument-&gt;previousFocusableNode(owner, event);
&gt; +        if (direction == FocusDirectionForward)
&gt; +            node = parentDocument-&gt;nextFocusableNode(owner, event);
&gt; +        else if (direction == FocusDirectionBackward)
&gt; +            node = parentDocument-&gt;previousFocusableNode(owner, event);
&gt; +        else
&gt; +            node = document-&gt;nextFocusableNodeInDirection(direction, owner);

And again.

&gt; +            if (direction == FocusDirectionForward)
&gt; +                node = d-&gt;nextFocusableNode(0, event);
&gt; +            else if (direction == FocusDirectionBackward)
&gt; +                node = d-&gt;previousFocusableNode(0, event);
&gt; +            else
&gt; +                node = document-&gt;nextFocusableNodeInDirection(direction, 0);
&gt; +        }

And again.

&gt; +        FocusDirectionNorth,
&gt; +        FocusDirectionSouth,
&gt; +        FocusDirectionEast,
&gt; +        FocusDirectionWest

We should call these directions &quot;up&quot;, &quot;down&quot;, &quot;right&quot;, and &quot;left&quot;. It doesn&apos;t make sense to use compass directions here.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>102562</commentid>
    <comment_count>6</comment_count>
    <who name="Joseph Ligman">joseph.ligman</who>
    <bug_when>2008-12-15 07:33:30 -0800</bug_when>
    <thetext>
(In reply to comment #5)
Thanks for taking the time to review, and adding your comments. This is really useful as it helps me get closer to being able to participate. 


&gt; I&apos;m a little confused about the feature you&apos;re implementing. I&apos;m not sure I
&gt; understand why this should be controlled by web pages and not by the web
&gt; browser. But I think it&apos;s a great step in the right direction to have the
&gt; concept of navigating geometrically, especially if we can get a good
&gt; implementation. And I&apos;m sure you can educate me about why this should be built
&gt; into web browsers by default and controlled by a &lt;meta&gt; tag in the web page.

The &lt;meta&gt; tag is non-sense (i.e. it is just the way that we want to control the feature and I will figure out a way to generalize it for each platform.)  

As far as why it should be built in to the browser, the best reason I have is that it&apos;s a requirement for an implementation that we are building on the Qt port, and it seems like I have the following options: 

1.) I can convince WebKit.org (you) to accept this.
2.) I can move the feature to the port and try and convince Qt to accept
3.) I could try and convince Qt to expose whatever functionality I need to implement the feature through their API. 
4.) Fork my own branch

This must be a common problem as 3rd parties want to implement different features, and I would guess there is no general rule so I will try all options before going to #4. 


The remaining comments are appreciated and will be addressed in the next patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>102915</commentid>
    <comment_count>7</comment_count>
      <attachid>26126</attachid>
    <who name="Joseph Ligman">joseph.ligman</who>
    <bug_when>2008-12-18 12:36:17 -0800</bug_when>
    <thetext>Created attachment 26126
directional focus node navigation patch


This patch address the comments from the last review. It also adds a layout test, however it is disabled for all platforms. Platforms need to handle navigation of the input boxes and text areas if they want to enable this feature. The meta tag check is gone and a setting is added to let platforms choose when this should be used, and if the platforms want to use this they can enable the layout test.

Please review and give comments.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>104113</commentid>
    <comment_count>8</comment_count>
    <who name="Joseph Ligman">joseph.ligman</who>
    <bug_when>2009-01-02 10:51:33 -0800</bug_when>
    <thetext>I have a couple of changes that will improve the search. I want to submit another patch, will any reviewer provide comments on what I have here? </thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>104156</commentid>
    <comment_count>9</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-01-02 12:50:10 -0800</bug_when>
    <thetext>(In reply to comment #6)
&gt; The &lt;meta&gt; tag is non-sense (i.e. it is just the way that we want to control
&gt; the feature and I will figure out a way to generalize it for each platform.)  

Who is &quot;we&quot; here? Should this be something that web sites turn on explicitly or not? Should it be controlled by the site or by the browser.

&gt; As far as why it should be built in to the browser, the best reason I have is
&gt; that it&apos;s a requirement for an implementation that we are building on the Qt
&gt; port, and it seems like I have the following options: 
&gt; 
&gt; 1.) I can convince WebKit.org (you) to accept this.
&gt; 2.) I can move the feature to the port and try and convince Qt to accept
&gt; 3.) I could try and convince Qt to expose whatever functionality I need to
&gt; implement the feature through their API. 
&gt; 4.) Fork my own branch
&gt; 
&gt; This must be a common problem as 3rd parties want to implement different
&gt; features, and I would guess there is no general rule so I will try all options
&gt; before going to #4.

Sorry, I&apos;m still mixed up about this. Your answer seems to be about the mechanics of getting the code checked in, but I&apos;m asking about the rationale for who would want this feature and under what circumstance.

You say &quot;it&apos;s a requirement for an implementation&quot;. I presume you mean a particular browser for a particular platform.

Do you think that web browsers in general should all have this feature? Or do you think it&apos;s something they&apos;d need to turn on explicitly as WebKit clients? Would users turn this on, or websites, or web browser developers?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>104158</commentid>
    <comment_count>10</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-01-02 12:51:29 -0800</bug_when>
    <thetext>(In reply to comment #7)
&gt; This patch address the comments from the last review. It also adds a layout
&gt; test, however it is disabled for all platforms. Platforms need to handle
&gt; navigation of the input boxes and text areas if they want to enable this
&gt; feature. The meta tag check is gone and a setting is added to let platforms
&gt; choose when this should be used, and if the platforms want to use this they can
&gt; enable the layout test.

I think that for testing purposes we should include this code in all platforms and offer a way to turn it on for layout tests on Mac OS X at least, and on other platforms too.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>104159</commentid>
    <comment_count>11</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-01-02 12:52:15 -0800</bug_when>
    <thetext>(In reply to comment #8)
&gt; I have a couple of changes that will improve the search. I want to submit
&gt; another patch, will any reviewer provide comments on what I have here?

I&apos;ll just review the new patch. Sorry I hadn&apos;t gotten to this yet.

Because the title of the bug says QWebFrame, it&apos;s easy to overlook the fact that this is actually a cross-platform patch. You may want to retitle the bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>104177</commentid>
    <comment_count>12</comment_count>
    <who name="Joseph Ligman">joseph.ligman</who>
    <bug_when>2009-01-02 14:11:07 -0800</bug_when>
    <thetext>(In reply to comment #9)

Thanks again for your comments. Sorry for the confusion.

 &gt; You say &quot;it&apos;s a requirement for an implementation&quot;. I presume you mean a
&gt; particular browser for a particular platform.

My particular browser is a client of the Qt port, and the Qt port does not provide an Api for this type of navigation. This is also why the title says QWebFrame, as that&apos;s where I started.

&gt; Do you think that web browsers in general should all have this feature? Or do
&gt; you think it&apos;s something they&apos;d need to turn on explicitly as WebKit clients?
&gt; Would users turn this on, or websites, or web browser developers?
&gt; 

I think this feature could be controlled by the websites, which was the idea behind the meta tag, this is how my particular browser would want turn the feature on and off, however users could enable it just as well. 

The confusing part is that web browser developers would also need to enable the feature. For these browsers, like Safari, there would be some work since they need to handle the 4 way navigation in the editor client (i.e. not to get stuck in select elements, text areas, and input boxes) if they wanted the feature. I think this is how it works for navigating using the TAB key, and this is also why I disabled the layout tests for now, the idea being I would enable the test when the feature was implemented/completed for the particular browser platform. Maybe I can find a cross platform way of handling input boxes?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>104178</commentid>
    <comment_count>13</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-01-02 14:22:30 -0800</bug_when>
    <thetext>(In reply to comment #12)
&gt; &gt; Do you think that web browsers in general should all have this feature? Or do
&gt; &gt; you think it&apos;s something they&apos;d need to turn on explicitly as WebKit clients?
&gt; &gt; Would users turn this on, or websites, or web browser developers?
&gt; 
&gt; I think this feature could be controlled by the websites, which was the idea
&gt; behind the meta tag

Sorry, I still don&apos;t understand this. Why would a website author turn this on? This doesn&apos;t seem like something a website would need to customize. Maybe you can give a specific example of when a website would need to turn it on or off and how that&apos;s helpful.

&gt; For these browsers, like Safari, there would be some work since they
&gt; need to handle the 4 way navigation in the editor client (i.e. not to get stuck
&gt; in select elements, text areas, and input boxes) if they wanted the feature.

You lost me again. Lets say this feature was on. Presumably you&apos;d have some user interface to trigger the directional navigation. What would it be? Normal keys on the keyboard? Some special key combination? A special keyboard?

I don&apos;t know what you mean about &quot;getting stuck&quot; exactly.

To me it makes sense to have a command that lets you move focus from one place to another, directionally. Even if there&apos;s no keyboard binding on a particular platform for that operation. I don&apos;t see why that would be a compile time switch. You could make it accessible from JavaScript and also bound to particular input keys on particular platforms.

So it could be tested anywhere.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>104301</commentid>
    <comment_count>14</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-01-03 20:46:34 -0800</bug_when>
    <thetext>There seems to be some overlap between this and bug 18662.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>104362</commentid>
    <comment_count>15</comment_count>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2009-01-04 10:43:31 -0800</bug_when>
    <thetext>Note that Node::getRect() does not take CSS transforms into account.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>104430</commentid>
    <comment_count>16</comment_count>
    <who name="Joseph Ligman">joseph.ligman</who>
    <bug_when>2009-01-05 07:37:59 -0800</bug_when>
    <thetext>(In reply to comment #13)

&gt; Sorry, I still don&apos;t understand this. Why would a website author turn this on?
&gt; This doesn&apos;t seem like something a website would need to customize. Maybe you
&gt; can give a specific example of when a website would need to turn it on or off
&gt; and how that&apos;s helpful.

Having a website enable this feature is only hypothetical for a specific implementation. The patch controls the feature through a new flag in the settings, so it can be enabled in whatever way makes sense for a particular browser. However, I think I understand what you mean, in that having a common way of turning this on validates it as a feature that is useful for all platforms. I suppose it&apos;s sort of critical to define this and what is the benefit of adding this code here and not implementing it somewhere else, like in the client, which is what the first patch here does.


&gt; 
&gt; &gt; For these browsers, like Safari, there would be some work since they
&gt; &gt; need to handle the 4 way navigation in the editor client (i.e. not to get stuck
&gt; &gt; in select elements, text areas, and input boxes) if they wanted the feature.
&gt; 
&gt; You lost me again. Lets say this feature was on. Presumably you&apos;d have some
&gt; user interface to trigger the directional navigation. What would it be? Normal
&gt; keys on the keyboard? Some special key combination? A special keyboard?
&gt; 
&gt; I don&apos;t know what you mean about &quot;getting stuck&quot; exactly.

Sorry, I wasn&apos;t clear. You need to modify the editor client when navigating a text box using the right left up down keyboard keys, defining some sort of precedence on when to set the key event as handled. What I do is check the cursor position in relation to the text. If you can navigate to another character or line feed do so, otherwise return without handling the key event and let the next closest node be chosen. This is a problem with other types of form controls as well, and usually comes down to leaving some functionality out if you are navigating using this feature. Maybe this is a reason for websites to enable the feature (since navigating this way generally works better with certain content). 

Thanks for spending the time, I&apos;ll keep working on defining this and take a look at bug 18662.

</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>104873</commentid>
    <comment_count>17</comment_count>
    <who name="Joseph Ligman">joseph.ligman</who>
    <bug_when>2009-01-08 08:41:16 -0800</bug_when>
    <thetext>(In reply to comment #13)
&gt; You lost me again. Lets say this feature was on. Presumably you&apos;d have some
&gt; user interface to trigger the directional navigation. What would it be? Normal
&gt; keys on the keyboard? Some special key combination? A special keyboard?
&gt; 
&gt; I don&apos;t know what you mean about &quot;getting stuck&quot; exactly.
&gt; 
&gt; To me it makes sense to have a command that lets you move focus from one place
&gt; to another, directionally. Even if there&apos;s no keyboard binding on a particular
&gt; platform for that operation. I don&apos;t see why that would be a compile time
&gt; switch. You could make it accessible from JavaScript and also bound to
&gt; particular input keys on particular platforms.
&gt; 
&gt; So it could be tested anywhere.

Sorry. I missed your point in my last comment. I was thinking of navigating using a joystick, and wanted it to be seamless across text areas. I think a special key combination could work with a joystick, I would just need a way to enter and exit the control (maybe with an extra button push). Any ideas? 
</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>104883</commentid>
    <comment_count>18</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-01-08 09:15:39 -0800</bug_when>
    <thetext>(In reply to comment #17)
&gt; I was thinking of navigating
&gt; using a joystick, and wanted it to be seamless across text areas. I think a
&gt; special key combination could work with a joystick, I would just need a way to
&gt; enter and exit the control (maybe with an extra button push). Any ideas? 

You&apos;d need to make sure these joystick events were distinguishable from other keyboard events. The new behavior would not be based on compile-time switches, but rather on the event objects themselves. So there would not be any #if in the new code.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>104884</commentid>
    <comment_count>19</comment_count>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2009-01-08 09:20:11 -0800</bug_when>
    <thetext>If you do add new events types for joystick, please generalize them so that they could apply to any directional navigation input device.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>104885</commentid>
    <comment_count>20</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-01-08 09:23:40 -0800</bug_when>
    <thetext>(In reply to comment #19)
&gt; If you do add new events types for joystick, please generalize them so that
&gt; they could apply to any directional navigation input device.

I agree, of course. We want to use a sensible abstraction of some type.

And I should clarify that these don&apos;t need to be entirely new event types. We could decide that the joystick directional events are treated as keyboard events, but somehow distinguishable by some additional setting or property on the event object.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>104897</commentid>
    <comment_count>21</comment_count>
    <who name="Joseph Ligman">joseph.ligman</who>
    <bug_when>2009-01-08 10:18:21 -0800</bug_when>
    <thetext>(In reply to comment #20)
&gt; (In reply to comment #19)
&gt; &gt; If you do add new events types for joystick, please generalize them so that
&gt; &gt; they could apply to any directional navigation input device.
&gt; 
&gt; I agree, of course. We want to use a sensible abstraction of some type.
&gt; 
&gt; And I should clarify that these don&apos;t need to be entirely new event types. We
&gt; could decide that the joystick directional events are treated as keyboard
&gt; events, but somehow distinguishable by some additional setting or property on
&gt; the event object.
&gt; 

Ok thanks, I will see what I can figure out, and will put this under a new &quot;joystick event types&quot; bug when I have something. 
</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>105155</commentid>
    <comment_count>22</comment_count>
      <attachid>26126</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-01-10 15:45:32 -0800</bug_when>
    <thetext>Comment on attachment 26126
directional focus node navigation patch

This is really the same thing as bug 18662. This patch looks pretty good, but you guys need to pool your efforts. I&apos;m going to mark this bug as a duplicate of that other one and set the review flag on this to review- for now. Please coordinate so we don&apos;t try to do the same thing twice.

There are some things stronger in your patch and some stronger in that other patch, so I&apos;m sure we can get a great result by working together.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>105156</commentid>
    <comment_count>23</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-01-10 15:45:42 -0800</bug_when>
    <thetext>

*** This bug has been marked as a duplicate of 18662 ***</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>25852</attachid>
            <date>2008-12-08 13:39:56 -0800</date>
            <delta_ts>2008-12-11 14:57:32 -0800</delta_ts>
            <desc>patch to QWebFrame to get the next focus point given a point and a direction</desc>
            <filename>nextfocusnode.patch</filename>
            <type>text/plain</type>
            <size>11522</size>
            <attacher name="Joseph Ligman">joseph.ligman</attacher>
            
              <data encoding="base64">SW5kZXg6IENoYW5nZUxvZw0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLS0tIENoYW5nZUxvZwkocmV2aXNpb24gMzkw
OTkpDQorKysgQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpDQpAQCAtMSwzICsxLDE2IEBADQorMjAw
OC0xMi0wOCAgSm9lIExpZ21hbiAgPGpsaWdtYW5AbWluZHNwcmluZy5jb20+DQorDQorICAgICAg
ICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4NCisNCisgICAgICAgIFtRVF0gQWRkZWQgYSBt
ZXRob2QgdG8gUVdlYkZyYW1lIHRvIHJldHVybiB0aGUgbmV4dCBmb2N1cyBwb2ludCBnaXZlbiBh
IGRpcmVjdGlvbiBhbmQgYSBwb2ludC4gVGhpcyANCisgICAgICAgIGZ1bmN0aW9uIGVuYWJsZXMg
ZGlyZWN0aW9uYWwgdGFiIG5hdmlnYXRpb24uIFRoZSBkZXRhaWxzIG9mIHRoZSBhbGdvcml0aG0g
Y2FuIGJlIGZvdW5kIGF0DQorICAgICAgICBodHRwOi8vd3d3LnczLm9yZy9UUi9XSUNELyNuYXYt
ZGlzdGFuY2UtZmt0DQorDQorICAgICAgICAqIHF0L0FwaS9xd2ViZnJhbWUuY3BwOg0KKyAgICAg
ICAgKiBxdC9BcGkvcXdlYmZyYW1lLmg6DQorICAgICAgICAqIHF0L0FwaS9xd2ViZnJhbWVfcC5o
Og0KKyAgICAgICAgKiBxdC90ZXN0cy9xd2ViZnJhbWUvdHN0X3F3ZWJmcmFtZS5jcHA6DQorDQog
MjAwOC0xMi0wNyAgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgIDx6ZWNrZUBzZWxmaXNoLm9y
Zz4NCiANCiAgICAgICAgIFJldmlld2VkIGJ5IEVyaWMgU2VpZGVsLg0KSW5kZXg6IFdlYktpdC9x
dC9BcGkvcXdlYmZyYW1lLmNwcA0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLS0tIFdlYktpdC9xdC9BcGkvcXdlYmZy
YW1lLmNwcAkocmV2aXNpb24gMzkwOTQpDQorKysgV2ViS2l0L3F0L0FwaS9xd2ViZnJhbWUuY3Bw
CSh3b3JraW5nIGNvcHkpDQpAQCAtMTIzLDYgKzEyMywxMDkgQEAgV2ViQ29yZTo6U2Nyb2xsYmFy
KiBRV2ViRnJhbWVQcml2YXRlOjp2ZQ0KICAgICByZXR1cm4gZnJhbWUtPnZpZXcoKS0+dmVydGlj
YWxTY3JvbGxiYXIoKTsNCiB9DQogDQoraW50IFFXZWJGcmFtZVByaXZhdGU6OmRpc3RhbmNlRnVu
Y3Rpb24oY29uc3QgUVdlYkZyYW1lOjpGb2N1c0RpcmVjdGlvbiBkaXJlY3Rpb24sIGNvbnN0IFFS
ZWN0JiByZWN0LCBjb25zdCBRUG9pbnQmIGZvY3VzKQ0KK3sNCisgICAgLy9UaGUgYWJzb2x1dGUg
ZGlzdGFuY2UgKGR4IG9yIGR5KSBvbiB0aGUgbmF2aWdhdGlvbiBheGlzIGJldHdlZW4gdGhlIG9w
cG9zaW5nIGVkZ2VzIG9mIHRoZSBjdXJyZW50bHkgZm9jdXNlZA0KKyAgICAvL2VsZW1lbnQgYW5k
IGVhY2ggb2YgdGhlIGNhbmlkYXRlcy4NCisgICAgaW50IGR4ID0gMDsNCisgICAgaW50IGR5ID0g
MDsNCisNCisgICAgLy9UaGUgZG90RGlzdCBpcyB0aGUgZXVjbGlkaWFuIGRpc3RhbmNlDQorICAg
IGludCBkb3REaXN0ID0gMDsNCisNCisgICAgLy9UaGUgb3ZlcmxhcCAoT3ZlcmxhcCkgYmV0d2Vl
biB0aGUgb3Bwb3NpbmcgZWRnZXMgb2YgY3VycmVudGx5IGZvY3VzZWQgZWxlbWVudCBhbmQgZWFj
aCBvZiBjYW5kaWRhdGVzDQorICAgIGludCBPdmVybGFwID0gMDsNCisNCisgICAgLy9UaGUgYWJz
b2x1dGUgZGlzdGFuY2UgKHhkaXNwbGFjZW1lbnQgb3IgeWRpc3BsYWNlbWVudCkgb24gdGhlIGF4
aXMgb3J0aG9nb25hbCB0byB0aGUgbmF2aWdhdGlvbiBheGlzIGJldHdlZW4NCisgICAgLy90aGUg
b3Bwb3NpbmcgZWRnZXMgb2YgY3VycmVudGx5IGZvY3VzZWQgZWxlbWVudCBhbmQgZWFjaCBvZiBj
YW5pZGF0ZXMNCisgICAgaW50IHhkaXNwbGFjZW1lbnQgPSAwOw0KKyAgICBpbnQgeWRpc3BsYWNl
bWVudCA9IDA7DQorDQorICAgIGlmIChkaXJlY3Rpb24gPT0gUVdlYkZyYW1lOjpOb3J0aCkgew0K
KyAgICAgICAgLy9hZGp1c3QgdGhlIHggZGlzdGFuY2UgYmFzZWQgb24gdGhlIGNsb3Nlc3QgZWRn
ZQ0KKyAgICAgICAgaWYgKGZvY3VzLngoKSA8IHJlY3QueCgpKSANCisgICAgICAgICAgICBkeCA9
IHJlY3QueCgpIC0gZm9jdXMueCgpOw0KKyAgICAgICAgZWxzZSBpZiAoZm9jdXMueCgpID4gcmVj
dC5yaWdodCgpKQ0KKyAgICAgICAgICAgIGR4ID0gZm9jdXMueCgpIC0gcmVjdC5yaWdodCgpOw0K
Kw0KKyAgICAgICBkeSA9IGZvY3VzLnkoKS1yZWN0LmJvdHRvbSgpOw0KKyAgICB9DQorICAgIGVs
c2UgaWYgKGRpcmVjdGlvbiA9PSBRV2ViRnJhbWU6OlNvdXRoKSB7DQorICAgICAgICAvL2FkanVz
dCB0aGUgeCBkaXN0YW5jZSBiYXNlZCBvbiB0aGUgY2xvc2VzdCBlZGdlDQorICAgICAgICBpZiAo
Zm9jdXMueCgpIDwgcmVjdC54KCkpIA0KKyAgICAgICAgICAgIGR4ID0gcmVjdC54KCkgLSBmb2N1
cy54KCk7DQorICAgICAgICBlbHNlIGlmIChmb2N1cy54KCkgPiByZWN0LnJpZ2h0KCkpDQorICAg
ICAgICAgICAgZHggPSBmb2N1cy54KCkgLSByZWN0LnJpZ2h0KCk7DQorDQorICAgICAgICBkeSA9
IHJlY3QueSgpLWZvY3VzLnkoKTsNCisgICAgfQ0KKyAgICBlbHNlIGlmIChkaXJlY3Rpb24gPT0g
UVdlYkZyYW1lOjpFYXN0KSB7DQorICAgICAgICBkeCA9IHJlY3QueCgpLWZvY3VzLngoKTsNCisg
ICAgICAgIC8vYWRqdXN0IHRoZSB5IGRpc3RhbmNlIGJhc2VkIG9uIHRoZSBjbG9zZXN0IGVkZ2UN
CisgICAgICAgIGlmIChmb2N1cy55KCkgPCByZWN0LnkoKSkNCisgICAgICAgICAgICBkeSA9IHJl
Y3QueSgpIC0gZm9jdXMueSgpOw0KKyAgICAgICAgZWxzZSBpZiAoZm9jdXMueSgpID4gcmVjdC5i
b3R0b20oKSkNCisgICAgICAgICAgICBkeSA9IGZvY3VzLnkoKSAtIHJlY3QuYm90dG9tKCk7DQor
DQorICAgIH0NCisgICAgZWxzZSBpZiAoZGlyZWN0aW9uID09IFFXZWJGcmFtZTo6V2VzdCkgew0K
KyAgICAgICAgZHggPSBmb2N1cy54KCktcmVjdC5yaWdodCgpOw0KKyAgICAgICAgLy9hZGp1c3Qg
dGhlIHkgZGlzdGFuY2UgYmFzZWQgb24gdGhlIGNsb3Nlc3QgZWRnZQ0KKyAgICAgICAgaWYgKGZv
Y3VzLnkoKSA8IHJlY3QueSgpKSANCisgICAgICAgICAgICBkeSA9IHJlY3QueSgpIC0gZm9jdXMu
eSgpOw0KKyAgICAgICAgZWxzZSBpZiAoZm9jdXMueSgpID4gcmVjdC5ib3R0b20oKSkNCisgICAg
ICAgICAgICBkeSA9IGZvY3VzLnkoKSAtIHJlY3QuYm90dG9tKCk7DQorDQorICAgIH0NCisNCisg
ICAgZG90RGlzdCA9IHNxcnQoZHgqZHggKyBkeSpkeSk7DQorDQorICAgIFFXZWJIaXRUZXN0UmVz
dWx0IGh0ciA9IHEtPmhpdFRlc3RDb250ZW50KGZvY3VzKTsNCisgICAgUVJlY3QgcmJvdW5kID0g
aHRyLmJvdW5kaW5nUmVjdCgpOw0KKw0KKyAgICBpZiAoZGlyZWN0aW9uID09IFFXZWJGcmFtZTo6
Tm9ydGggfHwgZGlyZWN0aW9uID09IFFXZWJGcmFtZTo6U291dGgpIHsNCisgICAgICAgIC8vaWYg
dGhlIHJlY3RhbmdsZXMgYXJlIG9uIHRoZSBzYW1lIHBsYW5lIHNldCB0aGUgZG90RGlzdCB0byB6
ZXJvIHRvIGZhdm9yIHRoaXMgbmF2aWdhdGlvbg0KKyAgICAgICAgaWYgKHJib3VuZC54KCkgPT0g
cmVjdC54KCkpDQorICAgICAgICAgICAgZG90RGlzdCA9IDA7DQorDQorICAgICAgICAvL292ZXJs
YXBwaW5nIHJlY3RhbmdsZXMgYXJlIHJld2FyZGVkDQorICAgICAgICBpZiAoKHJlY3QueSgpPj1y
Ym91bmQueSgpICYmIHJlY3QueSgpPD1yYm91bmQuYm90dG9tKCkpIHx8DQorICAgICAgICAgICAg
KHJlY3QuYm90dG9tKCk+PXJib3VuZC55KCkgJiYgcmVjdC5ib3R0b20oKTw9cmJvdW5kLmJvdHRv
bSgpKSkgew0KKyAgICAgICAgICAgIGludCBib3R0b20gPSBxTWF4KHJib3VuZC5ib3R0b20oKSxy
ZWN0LmJvdHRvbSgpKTsNCisgICAgICAgICAgICBpbnQgdG9wID0gcU1pbihyYm91bmQueSgpLHJl
Y3QueSgpKTsNCisgICAgICAgICAgICBPdmVybGFwID0gYm90dG9tLXRvcDsNCisgICAgICAgIH0N
CisgICAgICAgIC8vZGlzcGxhY2VtZW50IGlzIHN1YnRyYWN0ZWQgZm9yIGJlaW5nIG9ydGhvZ29u
YWxseSBmYXIgZnJvbSB0aGUgY3VycmVudCByZWN0YW5nbGUuDQorICAgICAgICBpZiAocmVjdC54
KCk+cmJvdW5kLnJpZ2h0KCkpDQorICAgICAgICAgICAgeWRpc3BsYWNlbWVudCA9IHJlY3QueCgp
LXJib3VuZC5yaWdodCgpOw0KKyAgICAgICAgaWYgKHJlY3QucmlnaHQoKTxyYm91bmQueCgpKQ0K
KyAgICAgICAgICAgIHlkaXNwbGFjZW1lbnQgPSByYm91bmQueCgpLXJlY3QucmlnaHQoKTsNCisN
CisgICAgfQ0KKyAgICBlbHNlIGlmIChkaXJlY3Rpb24gPT0gUVdlYkZyYW1lOjpFYXN0IHx8IGRp
cmVjdGlvbiA9PSBRV2ViRnJhbWU6Oldlc3QpIHsNCisgICAgICAgIC8vaWYgdGhlIHJlY3Rhbmds
ZXMgYXJlIG9uIHRoZSBzYW1lIHBsYW5lIHNldCB0aGUgZG90RGlzdCB0byB6ZXJvIHRvIGZhdm9y
IHRoaXMgbmF2aWdhdGlvbg0KKyAgICAgICAgaWYgKHJib3VuZC55KCkgPT0gcmVjdC55KCkpDQor
ICAgICAgICAgICAgZG90RGlzdCA9IDA7DQorDQorICAgICAgICAvL292ZXJsYXBwaW5nIHJlY3Rh
bmdsZXMgYXJlIHJld2FyZGVkDQorICAgICAgICBpZiAoKHJlY3QueCgpPj1yYm91bmQueCgpICYm
IHJlY3QueCgpPD1yYm91bmQucmlnaHQoKSkgfHwNCisgICAgICAgICAgICAocmVjdC5yaWdodCgp
Pj1yYm91bmQueCgpICYmIHJlY3QucmlnaHQoKTw9cmJvdW5kLnJpZ2h0KCkpKSB7DQorICAgICAg
ICAgICAgaW50IGxlZnQgPSBxTWF4KHJib3VuZC54KCkscmVjdC54KCkpOw0KKyAgICAgICAgICAg
IGludCByaWdodCA9IHFNaW4ocmJvdW5kLnJpZ2h0KCkscmVjdC5yaWdodCgpKTsNCisgICAgICAg
ICAgICBPdmVybGFwID0gcmlnaHQtbGVmdDsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vZGlz
cGxhY2VtZW50IGlzIHN1YnRyYWN0ZWQgZm9yIGJlaW5nIG9ydGhvZ29uYWxseSBmYXIgZnJvbSB0
aGUgY3VycmVudCByZWN0YW5nbGUuDQorICAgICAgICBpZiAocmVjdC55KCk+cmJvdW5kLmJvdHRv
bSgpKQ0KKyAgICAgICAgICAgIHlkaXNwbGFjZW1lbnQgPSByZWN0LnkoKS1yYm91bmQuYm90dG9t
KCk7DQorICAgICAgICBpZiAocmVjdC5ib3R0b20oKTxyYm91bmQueSgpKQ0KKyAgICAgICAgICAg
IHlkaXNwbGFjZW1lbnQgPSByYm91bmQueSgpLXJlY3QuYm90dG9tKCk7DQorDQorICAgIH0NCisN
CisgICAgcmV0dXJuIGRvdERpc3QgKyBkeCArIGR5ICsgMiAqICh4ZGlzcGxhY2VtZW50ICsgeWRp
c3BsYWNlbWVudCkgLSBzcXJ0KE92ZXJsYXApOw0KK30NCisNCiAvKiENCiAgICAgXGNsYXNzIFFX
ZWJGcmFtZQ0KICAgICBcc2luY2UgNC40DQpAQCAtNTYzLDYgKzY2Niw2NyBAQCBRTGlzdDxRV2Vi
RnJhbWUqPiBRV2ViRnJhbWU6OmNoaWxkRnJhbWVzDQogfQ0KIA0KIC8qIQ0KKyAgICBHZXRzIHRo
ZSBuZXh0IGZvY3VzYWJsZSBwb2ludCBpbiB0aGUgZGlyZWN0aW9uIHNwZWNpZmllZA0KKyAgICBc
YSBGb2N1c0RpcmVjdGlvbiBkZXRlcm1pbmUgd2hlcmUgdG8gZmluZCB0aGUgbmV4dCBmb2N1c2Fi
bGUgZWxlbWVudC4NCisgICAgXGEgUVBvaW50IGN1cnJlbnQgcG9pbnQgb2YgZm9jdXMNCisgICAg
UmV0dXJucyBwb2ludCBvZiBuZXh0IGZvY3VzYWJsZSBlbGVtZW50Lg0KKyovDQorUVBvaW50IFFX
ZWJGcmFtZTo6bmV4dEZvY3VzUG9pbnQoY29uc3QgRm9jdXNEaXJlY3Rpb24gZGlyZWN0aW9uLCBj
b25zdCBRUG9pbnQmIGZvY3VzKQ0KK3sNCisgICAgaW50IGRpc3RhbmNlID0gLTE7DQorICAgIFFS
ZWN0IGZvY3VzUmVjdDsgDQorICAgIGZvcihXZWJDb3JlOjpOb2RlKiBuID0gZC0+ZnJhbWUtPmRv
Y3VtZW50KCk7IG4gIT0gMDsgbiA9IG4tPnRyYXZlcnNlTmV4dE5vZGUoKSkgew0KKyAgICAgICAg
aWYobi0+aXNGb2N1c2FibGUoKSkgew0KKyAgICAgICAgICAgIFFSZWN0IHIgPSBuLT5nZXRSZWN0
KCk7DQorICAgICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSBRV2ViRnJhbWU6Ok5vcnRoICYmIHIu
Ym90dG9tKCkgPj0gZm9jdXMueSgpKSBjb250aW51ZTsNCisgICAgICAgICAgICBpZiAoZGlyZWN0
aW9uID09IFFXZWJGcmFtZTo6U291dGggJiYgci55KCkgPD0gZm9jdXMueSgpKSBjb250aW51ZTsN
CisgICAgICAgICAgICBpZiAoZGlyZWN0aW9uID09IFFXZWJGcmFtZTo6RWFzdCAmJiByLngoKSA8
PSBmb2N1cy54KCkpIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIGlmIChkaXJlY3Rpb24gPT0gUVdl
YkZyYW1lOjpXZXN0ICYmIHIucmlnaHQoKSA+PSBmb2N1cy54KCkpIGNvbnRpbnVlOw0KKw0KKyAg
ICAgICAgICAgIGludCBkaXMgPSBkLT5kaXN0YW5jZUZ1bmN0aW9uKGRpcmVjdGlvbiwgciwgZm9j
dXMpOw0KKyAgICAgICAgICAgIGlmIChkaXN0YW5jZSA9PSAtMSB8fCBkaXN0YW5jZSA+IGRpcykg
ew0KKyAgICAgICAgICAgICAgICBkaXN0YW5jZSA9IGRpczsNCisgICAgICAgICAgICAgICAgZm9j
dXNSZWN0ID0gcjsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAg
UVBvaW50IGZvY3VzUG9pbnQgPSBmb2N1czsNCisgICAgaWYoIWZvY3VzUmVjdC5pc051bGwoKSkg
ew0KKyAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSBRV2ViRnJhbWU6Ok5vcnRoKSB7DQorICAgICAg
ICAgICAgaWYgKGZvY3VzUG9pbnQueCgpIDwgZm9jdXNSZWN0LngoKSkgDQorICAgICAgICAgICAg
ICAgIGZvY3VzUG9pbnQuc2V0WChmb2N1c1JlY3QueCgpKTsNCisgICAgICAgICAgICBlbHNlIGlm
IChmb2N1c1BvaW50LngoKSA+IGZvY3VzUmVjdC5yaWdodCgpKQ0KKyAgICAgICAgICAgICAgICBm
b2N1c1BvaW50LnNldFgoZm9jdXNSZWN0LnJpZ2h0KCkpOw0KKyAgICAgICAgICAgIGZvY3VzUG9p
bnQuc2V0WShmb2N1c1JlY3QuYm90dG9tKCkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZWxzZSBp
ZiAoZGlyZWN0aW9uID09IFFXZWJGcmFtZTo6U291dGgpIHsNCisgICAgICAgICAgICBpZiAoZm9j
dXNQb2ludC54KCkgPCBmb2N1c1JlY3QueCgpKSANCisgICAgICAgICAgICAgICAgZm9jdXNQb2lu
dC5zZXRYKGZvY3VzUmVjdC54KCkpOw0KKyAgICAgICAgICAgIGVsc2UgaWYgKGZvY3VzUG9pbnQu
eCgpID4gZm9jdXNSZWN0LnJpZ2h0KCkpDQorICAgICAgICAgICAgICAgIGZvY3VzUG9pbnQuc2V0
WChmb2N1c1JlY3QucmlnaHQoKSk7DQorICAgICAgICAgICAgZm9jdXNQb2ludC5zZXRZKGZvY3Vz
UmVjdC55KCkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZWxzZSBpZiAoZGlyZWN0aW9uID09IFFX
ZWJGcmFtZTo6RWFzdCkgew0KKyAgICAgICAgICAgIGZvY3VzUG9pbnQuc2V0WChmb2N1c1JlY3Qu
eCgpKTsNCisgICAgICAgICAgICBpZiAoZm9jdXNQb2ludC55KCkgPCBmb2N1c1JlY3QueSgpKQ0K
KyAgICAgICAgICAgICAgICBmb2N1c1BvaW50LnNldFkoZm9jdXNSZWN0LnkoKSk7DQorICAgICAg
ICAgICAgZWxzZSBpZiAoZm9jdXNQb2ludC55KCkgPiBmb2N1c1JlY3QuYm90dG9tKCkpDQorICAg
ICAgICAgICAgICAgIGZvY3VzUG9pbnQuc2V0WShmb2N1c1JlY3QuYm90dG9tKCkpOw0KKyAgICAg
ICAgfQ0KKyAgICAgICAgZWxzZSBpZiAoZGlyZWN0aW9uID09IFFXZWJGcmFtZTo6V2VzdCkgew0K
KyAgICAgICAgICAgIGZvY3VzUG9pbnQuc2V0WChmb2N1c1JlY3QucmlnaHQoKSk7DQorICAgICAg
ICAgICAgaWYgKGZvY3VzUG9pbnQueSgpIDwgZm9jdXNSZWN0LnkoKSkNCisgICAgICAgICAgICAg
ICAgZm9jdXNQb2ludC5zZXRZKGZvY3VzUmVjdC55KCkpOw0KKyAgICAgICAgICAgIGVsc2UgaWYg
KGZvY3VzUG9pbnQueSgpID4gZm9jdXNSZWN0LmJvdHRvbSgpKQ0KKyAgICAgICAgICAgICAgICBm
b2N1c1BvaW50LnNldFkoZm9jdXNSZWN0LmJvdHRvbSgpKTsNCisgICAgICAgIH0NCisgICAgfQ0K
Kw0KKyAgICByZXR1cm4gZm9jdXNQb2ludDsNCit9DQorDQorLyohDQogICAgIFJldHVybnMgdGhl
IHNjcm9sbGJhciBwb2xpY3kgZm9yIHRoZSBzY3JvbGxiYXIgZGVmaW5lZCBieSBcYSBvcmllbnRh
dGlvbi4NCiAqLw0KIFF0OjpTY3JvbGxCYXJQb2xpY3kgUVdlYkZyYW1lOjpzY3JvbGxCYXJQb2xp
Y3koUXQ6Ok9yaWVudGF0aW9uIG9yaWVudGF0aW9uKSBjb25zdA0KSW5kZXg6IFdlYktpdC9xdC9B
cGkvcXdlYmZyYW1lLmgNCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0tLSBXZWJLaXQvcXQvQXBpL3F3ZWJmcmFtZS5o
CShyZXZpc2lvbiAzOTA5NCkNCisrKyBXZWJLaXQvcXQvQXBpL3F3ZWJmcmFtZS5oCSh3b3JraW5n
IGNvcHkpDQpAQCAtMTQxLDYgKzE0MSwxNiBAQCBwdWJsaWM6DQogICAgIFFXZWJGcmFtZSAqcGFy
ZW50RnJhbWUoKSBjb25zdDsNCiAgICAgUUxpc3Q8UVdlYkZyYW1lKj4gY2hpbGRGcmFtZXMoKSBj
b25zdDsNCiANCisNCisgICAgZW51bSBGb2N1c0RpcmVjdGlvbiB7DQorICAgICAgICBOb3J0aCwN
CisgICAgICAgIFNvdXRoLA0KKyAgICAgICAgRWFzdCwNCisgICAgICAgIFdlc3QNCisgICAgfTsN
CisNCisgICAgUVBvaW50IG5leHRGb2N1c1BvaW50KGNvbnN0IEZvY3VzRGlyZWN0aW9uIGRpciwg
Y29uc3QgUVBvaW50JiBmb2N1cyk7DQorDQogICAgIFF0OjpTY3JvbGxCYXJQb2xpY3kgc2Nyb2xs
QmFyUG9saWN5KFF0OjpPcmllbnRhdGlvbiBvcmllbnRhdGlvbikgY29uc3Q7DQogICAgIHZvaWQg
c2V0U2Nyb2xsQmFyUG9saWN5KFF0OjpPcmllbnRhdGlvbiBvcmllbnRhdGlvbiwgUXQ6OlNjcm9s
bEJhclBvbGljeSBwb2xpY3kpOw0KIA0KSW5kZXg6IFdlYktpdC9xdC9BcGkvcXdlYmZyYW1lX3Au
aA0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQ0KLS0tIFdlYktpdC9xdC9BcGkvcXdlYmZyYW1lX3AuaAkocmV2aXNpb24g
MzkwOTQpDQorKysgV2ViS2l0L3F0L0FwaS9xd2ViZnJhbWVfcC5oCSh3b3JraW5nIGNvcHkpDQpA
QCAtNzUsNiArNzUsOCBAQCBwdWJsaWM6DQogICAgIFdlYkNvcmU6OlNjcm9sbGJhciogaG9yaXpv
bnRhbFNjcm9sbEJhcigpIGNvbnN0Ow0KICAgICBXZWJDb3JlOjpTY3JvbGxiYXIqIHZlcnRpY2Fs
U2Nyb2xsQmFyKCkgY29uc3Q7DQogDQorICAgIGludCBkaXN0YW5jZUZ1bmN0aW9uKGNvbnN0IFFX
ZWJGcmFtZTo6Rm9jdXNEaXJlY3Rpb24gZGlyZWN0aW9uLCBjb25zdCBRUmVjdCYgcmVjdCwgY29u
c3QgUVBvaW50JiBmb2N1cyk7DQorDQogICAgIFF0OjpTY3JvbGxCYXJQb2xpY3kgaG9yaXpvbnRh
bFNjcm9sbEJhclBvbGljeTsNCiAgICAgUXQ6OlNjcm9sbEJhclBvbGljeSB2ZXJ0aWNhbFNjcm9s
bEJhclBvbGljeTsgDQogDQpJbmRleDogV2ViS2l0L3F0L3Rlc3RzL3F3ZWJmcmFtZS90c3RfcXdl
YmZyYW1lLmNwcA0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQ0KLS0tIFdlYktpdC9xdC90ZXN0cy9xd2ViZnJhbWUvdHN0
X3F3ZWJmcmFtZS5jcHAJKHJldmlzaW9uIDM5MDk0KQ0KKysrIFdlYktpdC9xdC90ZXN0cy9xd2Vi
ZnJhbWUvdHN0X3F3ZWJmcmFtZS5jcHAJKHdvcmtpbmcgY29weSkNCkBAIC01NjcsNiArNTY3LDcg
QEAgcHJpdmF0ZSBzbG90czoNCiAgICAgdm9pZCBzZXRIdG1sV2l0aFJlc291cmNlKCk7DQogICAg
IHZvaWQgaXB2Nkhvc3RFbmNvZGluZygpOw0KICAgICB2b2lkIG1ldGFEYXRhKCk7DQorICAgIHZv
aWQgbmV4dEZvY3VzUG9pbnQoKTsNCiBwcml2YXRlOg0KICAgICBRU3RyaW5nICBldmFsSlMoY29u
c3QgUVN0cmluZyZzKSB7DQogICAgICAgICAvLyBDb252ZXJ0IGFuIHVuZGVmaW5lZCByZXR1cm4g
dmFyaWFudCB0byB0aGUgc3RyaW5nICJ1bmRlZmluZWQiDQpAQCAtMjE3Myw1ICsyMTc0LDQzIEBA
IHZvaWQgdHN0X1FXZWJGcmFtZTo6bWV0YURhdGEoKQ0KICAgICBRQ09NUEFSRShtZXRhRGF0YS52
YWx1ZSgibm9uZXhpc3RhbnQiKSwgUVN0cmluZygpKTsNCiB9DQogDQordm9pZCB0c3RfUVdlYkZy
YW1lOjpuZXh0Rm9jdXNQb2ludCgpDQorew0KKyAgICBtX3ZpZXctPnNldEh0bWwoIjxodG1sPiBc
DQorICAgICAgICAgICAgICAgICAgICA8Ym9keT4gXA0KKyAgICAgICAgICAgICAgICAgICAgPGEg
aHJlZj0nYSc+IGE8L2E+IDxhIGhyZWY9J2InPiBiPC9hPiBcDQorICAgICAgICAgICAgICAgICAg
ICA8YnI+IFwNCisgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9J2MnPiBjPC9hPiA8YSBocmVm
PSdkJz5kPC9hPiBcDQorICAgICAgICAgICAgICAgICAgICA8L2JvZHk+IFwNCisgICAgICAgICAg
ICAgICAgICAgIDwvaHRtbD4iKTsNCisNCisgICAgUVBvaW50IGN1cnJlbnQ7DQorICAgIFFQb2lu
dCBuZXh0ID0gbV92aWV3LT5wYWdlKCktPm1haW5GcmFtZSgpLT5uZXh0Rm9jdXNQb2ludChRV2Vi
RnJhbWU6OlNvdXRoLGN1cnJlbnQpOw0KKyAgICBRVkVSSUZZKG5leHQgIT0gY3VycmVudCk7DQor
ICAgIFFXZWJIaXRUZXN0UmVzdWx0IGh0ciA9ICBtX3ZpZXctPnBhZ2UoKS0+bWFpbkZyYW1lKCkt
PmhpdFRlc3RDb250ZW50KG5leHQpOw0KKyAgICBRQ09NUEFSRShodHIubGlua1VybCgpLnRvU3Ry
aW5nKCksIFFTdHJpbmcoImEiKSk7DQorDQorICAgIG5leHQgPSBtX3ZpZXctPnBhZ2UoKS0+bWFp
bkZyYW1lKCktPm5leHRGb2N1c1BvaW50KFFXZWJGcmFtZTo6U291dGgsbmV4dCk7DQorICAgIFFW
RVJJRlkobmV4dCAhPSBjdXJyZW50KTsNCisgICAgaHRyID0gIG1fdmlldy0+cGFnZSgpLT5tYWlu
RnJhbWUoKS0+aGl0VGVzdENvbnRlbnQobmV4dCk7DQorICAgIFFDT01QQVJFKGh0ci5saW5rVXJs
KCkudG9TdHJpbmcoKSwgUVN0cmluZygiYyIpKTsNCisNCisgICAgbmV4dCA9IG1fdmlldy0+cGFn
ZSgpLT5tYWluRnJhbWUoKS0+bmV4dEZvY3VzUG9pbnQoUVdlYkZyYW1lOjpFYXN0LG5leHQpOw0K
KyAgICBRVkVSSUZZKG5leHQgIT0gY3VycmVudCk7DQorICAgIGh0ciA9ICBtX3ZpZXctPnBhZ2Uo
KS0+bWFpbkZyYW1lKCktPmhpdFRlc3RDb250ZW50KG5leHQpOw0KKyAgICBRQ09NUEFSRShodHIu
bGlua1VybCgpLnRvU3RyaW5nKCksIFFTdHJpbmcoImQiKSk7DQorDQorICAgIG5leHQgPSBtX3Zp
ZXctPnBhZ2UoKS0+bWFpbkZyYW1lKCktPm5leHRGb2N1c1BvaW50KFFXZWJGcmFtZTo6Tm9ydGgs
bmV4dCk7DQorICAgIFFWRVJJRlkobmV4dCAhPSBjdXJyZW50KTsNCisgICAgaHRyID0gIG1fdmll
dy0+cGFnZSgpLT5tYWluRnJhbWUoKS0+aGl0VGVzdENvbnRlbnQobmV4dCk7DQorICAgIFFDT01Q
QVJFKGh0ci5saW5rVXJsKCkudG9TdHJpbmcoKSwgUVN0cmluZygiYiIpKTsNCisNCisgICAgbmV4
dCA9IG1fdmlldy0+cGFnZSgpLT5tYWluRnJhbWUoKS0+bmV4dEZvY3VzUG9pbnQoUVdlYkZyYW1l
OjpXZXN0LG5leHQpOw0KKyAgICBRVkVSSUZZKG5leHQgIT0gY3VycmVudCk7DQorICAgIGh0ciA9
ICBtX3ZpZXctPnBhZ2UoKS0+bWFpbkZyYW1lKCktPmhpdFRlc3RDb250ZW50KG5leHQpOw0KKyAg
ICBRQ09NUEFSRShodHIubGlua1VybCgpLnRvU3RyaW5nKCksIFFTdHJpbmcoImEiKSk7DQorDQor
fQ0KKw0KIFFURVNUX01BSU4odHN0X1FXZWJGcmFtZSkNCiAjaW5jbHVkZSAidHN0X3F3ZWJmcmFt
ZS5tb2MiDQo=
</data>
<flag name="review"
          id="12124"
          type_id="1"
          status="-"
          setter="vestbo"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>25965</attachid>
            <date>2008-12-11 14:57:32 -0800</date>
            <delta_ts>2008-12-18 12:36:17 -0800</delta_ts>
            <desc>focus node navigation using arrow keys</desc>
            <filename>focuspoint.patch</filename>
            <type>text/plain</type>
            <size>17533</size>
            <attacher name="Joseph Ligman">joseph.ligman</attacher>
            
              <data encoding="base64">SW5kZXg6IENoYW5nZUxvZw0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLS0tIENoYW5nZUxvZwkocmV2aXNpb24gMzky
MTcpDQorKysgQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpDQpAQCAtMSwzICsxLDE2IEBADQorMjAw
OC0xMi0xMSAgSm9lIExpZ21hbiAgPGpsaWdtYW5AbWluZHNwcmluZy5jb20+DQorDQorICAgICAg
ICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4NCisNCisgICAgICAgIEFkZGVkIGZvY3VzcG9p
bnQgbmF2aWdhdGlvbiBiYXNlZCBvbiBodHRwOi8vd3d3LnczLm9yZy9UUi9XSUNELyNuYXYtZGlz
dGFuY2UtZmt0Lg0KKw0KKyAgICAgICAgKiAuLi9XZWJDb3JlL2RvbS9Eb2N1bWVudC5jcHA6DQor
ICAgICAgICAqIC4uL1dlYkNvcmUvZG9tL0RvY3VtZW50Lmg6DQorICAgICAgICAqIC4uL1dlYkNv
cmUvcGFnZS9FdmVudEhhbmRsZXIuY3BwOg0KKyAgICAgICAgKiAuLi9XZWJDb3JlL3BhZ2UvRXZl
bnRIYW5kbGVyLmg6DQorICAgICAgICAqIC4uL1dlYkNvcmUvcGFnZS9Gb2N1c0NvbnRyb2xsZXIu
Y3BwOg0KKyAgICAgICAgKiAuLi9XZWJDb3JlL3BhZ2UvRm9jdXNEaXJlY3Rpb24uaDoNCisNCiAy
MDA4LTEyLTA3ICBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciAgPHplY2tlQHNlbGZpc2gub3Jn
Pg0KIA0KICAgICAgICAgUmV2aWV3ZWQgYnkgRXJpYyBTZWlkZWwuDQpJbmRleDogV2ViQ29yZS9k
b20vRG9jdW1lbnQuY3BwDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotLS0gV2ViQ29yZS9kb20vRG9jdW1lbnQuY3Bw
CShyZXZpc2lvbiAzOTIxNikNCisrKyBXZWJDb3JlL2RvbS9Eb2N1bWVudC5jcHAJKHdvcmtpbmcg
Y29weSkNCkBAIC0xOTE0LDYgKzE5MTQsMTYwIEBAIE5vZGUqIERvY3VtZW50OjpwcmV2aW91c0Zv
Y3VzYWJsZU5vZGUoTm8NCiAgICAgcmV0dXJuIHByZXZpb3VzTm9kZVdpdGhMb3dlclRhYkluZGV4
KGxhc3QsIHN0YXJ0aW5nVGFiSW5kZXgsIGV2ZW50KTsNCiB9DQogDQorc3RhdGljIEludFBvaW50
IGNhbGN1bGF0ZUZvY3VzUG9pbnQoRm9jdXNEaXJlY3Rpb24gZGlyZWN0aW9uLCBjb25zdCBJbnRS
ZWN0JiBmb2N1c2VkUmVjdCkNCit7DQorICAgIEludFBvaW50IGZvY3VzUG9pbnQ7DQorDQorICAg
IGlmIChkaXJlY3Rpb24gPT0gRm9jdXNEaXJlY3Rpb25Ob3J0aCkgew0KKyAgICAgICAgaWYgKGZv
Y3VzUG9pbnQueCgpIDwgZm9jdXNlZFJlY3QueCgpKSANCisgICAgICAgICAgICBmb2N1c1BvaW50
LnNldFgoZm9jdXNlZFJlY3QueCgpKTsNCisgICAgICAgIGVsc2UgaWYgKGZvY3VzUG9pbnQueCgp
ID4gZm9jdXNlZFJlY3QucmlnaHQoKSkNCisgICAgICAgICAgICBmb2N1c1BvaW50LnNldFgoZm9j
dXNlZFJlY3QucmlnaHQoKSk7DQorICAgICAgICBmb2N1c1BvaW50LnNldFkoZm9jdXNlZFJlY3Qu
Ym90dG9tKCkpOw0KKyAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PSBGb2N1c0RpcmVjdGlvblNv
dXRoKSB7DQorICAgICAgICBpZiAoZm9jdXNQb2ludC54KCkgPCBmb2N1c2VkUmVjdC54KCkpIA0K
KyAgICAgICAgICAgIGZvY3VzUG9pbnQuc2V0WChmb2N1c2VkUmVjdC54KCkpOw0KKyAgICAgICAg
ZWxzZSBpZiAoZm9jdXNQb2ludC54KCkgPiBmb2N1c2VkUmVjdC5yaWdodCgpKQ0KKyAgICAgICAg
ICAgIGZvY3VzUG9pbnQuc2V0WChmb2N1c2VkUmVjdC5yaWdodCgpKTsNCisgICAgICAgIGZvY3Vz
UG9pbnQuc2V0WShmb2N1c2VkUmVjdC55KCkpOw0KKyAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9
PSBGb2N1c0RpcmVjdGlvbkVhc3QpIHsNCisgICAgICAgIGZvY3VzUG9pbnQuc2V0WChmb2N1c2Vk
UmVjdC54KCkpOw0KKyAgICAgICAgaWYgKGZvY3VzUG9pbnQueSgpIDwgZm9jdXNlZFJlY3QueSgp
KQ0KKyAgICAgICAgICAgIGZvY3VzUG9pbnQuc2V0WShmb2N1c2VkUmVjdC55KCkpOw0KKyAgICAg
ICAgZWxzZSBpZiAoZm9jdXNQb2ludC55KCkgPiBmb2N1c2VkUmVjdC5ib3R0b20oKSkNCisgICAg
ICAgICAgICBmb2N1c1BvaW50LnNldFkoZm9jdXNlZFJlY3QuYm90dG9tKCkpOw0KKyAgICB9IGVs
c2UgaWYgKGRpcmVjdGlvbiA9PSBGb2N1c0RpcmVjdGlvbldlc3QpIHsNCisgICAgICAgIGZvY3Vz
UG9pbnQuc2V0WChmb2N1c2VkUmVjdC5yaWdodCgpKTsNCisgICAgICAgIGlmIChmb2N1c1BvaW50
LnkoKSA8IGZvY3VzZWRSZWN0LnkoKSkNCisgICAgICAgICAgICBmb2N1c1BvaW50LnNldFkoZm9j
dXNlZFJlY3QueSgpKTsNCisgICAgICAgIGVsc2UgaWYgKGZvY3VzUG9pbnQueSgpID4gZm9jdXNl
ZFJlY3QuYm90dG9tKCkpDQorICAgICAgICAgICAgZm9jdXNQb2ludC5zZXRZKGZvY3VzZWRSZWN0
LmJvdHRvbSgpKTsNCisgICAgfQ0KKw0KKyAgICByZXR1cm4gZm9jdXNQb2ludDsNCit9DQorDQor
c3RhdGljIGludCBkaXN0YW5jZUZ1bmN0aW9uKEZvY3VzRGlyZWN0aW9uIGRpcmVjdGlvbiwgY29u
c3QgSW50UmVjdCYgcG9zc2libGVSZWN0LCBjb25zdCBJbnRQb2ludCYgZm9jdXNQb2ludCwgY29u
c3QgSW50UmVjdCYgZm9jdXNlZFJlY3QpDQorew0KKyAgICAvLyBUaGUgYWJzb2x1dGUgZGlzdGFu
Y2UgKGR4IG9yIGR5KSBvbiB0aGUgbmF2aWdhdGlvbiBheGlzIGJldHdlZW4gdGhlIG9wcG9zaW5n
IGVkZ2VzIG9mIHRoZSBjdXJyZW50bHkgZm9jdXNlZA0KKyAgICAvLyBlbGVtZW50IGFuZCBlYWNo
IG9mIHRoZSBjYW5pZGF0ZXMuDQorICAgIGludCBkaXN0YW5jZVggPSAwOw0KKyAgICBpbnQgZGlz
dGFuY2VZID0gMDsNCisNCisgICAgLy8gVGhlIGV1Y2xpZGlhbiBkaXN0YW5jZQ0KKyAgICBpbnQg
ZXVjbGlkaWFuRGlzdCA9IDA7DQorDQorICAgIC8vIFRoZSByZWN0YW5nbGUgb3ZlcmxhcCBiZXR3
ZWVuIHRoZSBvcHBvc2luZyBlZGdlcyBvZiBjdXJyZW50bHkgZm9jdXNlZCBlbGVtZW50IGFuZCBl
YWNoIG9mIGNhbmRpZGF0ZXMNCisgICAgaW50IHJlY3RPdmVybGFwID0gMDsNCisNCisgICAgLy8g
VGhlIGFic29sdXRlIGRpc3RhbmNlIG9uIHRoZSBheGlzIG9ydGhvZ29uYWwgdG8gdGhlIG5hdmln
YXRpb24gYXhpcyBiZXR3ZWVuDQorICAgIC8vIHRoZSBvcHBvc2luZyBlZGdlcyBvZiBjdXJyZW50
bHkgZm9jdXNlZCBlbGVtZW50IGFuZCBlYWNoIG9mIGNhbmlkYXRlcw0KKyAgICBpbnQgZGlzcGxh
Y2VtZW50ID0gMDsNCisNCisgICAgaWYgKGRpcmVjdGlvbiA9PSBGb2N1c0RpcmVjdGlvbk5vcnRo
KSB7DQorICAgICAgICAvLyBhZGp1c3QgdGhlIHggZGlzdGFuY2UgYmFzZWQgb24gdGhlIGNsb3Nl
c3QgZWRnZQ0KKyAgICAgICAgaWYgKGZvY3VzUG9pbnQueCgpIDwgcG9zc2libGVSZWN0LngoKSkg
DQorICAgICAgICAgICAgZGlzdGFuY2VYID0gcG9zc2libGVSZWN0LngoKSAtIGZvY3VzUG9pbnQu
eCgpOw0KKyAgICAgICAgZWxzZSBpZiAoZm9jdXNQb2ludC54KCkgPiBwb3NzaWJsZVJlY3Qucmln
aHQoKSkNCisgICAgICAgICAgICBkaXN0YW5jZVggPSBmb2N1c1BvaW50LngoKSAtIHBvc3NpYmxl
UmVjdC5yaWdodCgpOw0KKw0KKyAgICAgICBkaXN0YW5jZVkgPSBmb2N1c1BvaW50LnkoKSAtIHBv
c3NpYmxlUmVjdC5ib3R0b20oKTsNCisgICAgfSBlbHNlIGlmIChkaXJlY3Rpb24gPT0gRm9jdXNE
aXJlY3Rpb25Tb3V0aCkgew0KKyAgICAgICAgLy8gYWRqdXN0IHRoZSB4IGRpc3RhbmNlIGJhc2Vk
IG9uIHRoZSBjbG9zZXN0IGVkZ2UNCisgICAgICAgIGlmIChmb2N1c1BvaW50LngoKSA8IHBvc3Np
YmxlUmVjdC54KCkpIA0KKyAgICAgICAgICAgIGRpc3RhbmNlWCA9IHBvc3NpYmxlUmVjdC54KCkg
LSBmb2N1c1BvaW50LngoKTsNCisgICAgICAgIGVsc2UgaWYgKGZvY3VzUG9pbnQueCgpID4gcG9z
c2libGVSZWN0LnJpZ2h0KCkpDQorICAgICAgICAgICAgZGlzdGFuY2VYID0gZm9jdXNQb2ludC54
KCkgLSBwb3NzaWJsZVJlY3QucmlnaHQoKTsNCisNCisgICAgICAgIGRpc3RhbmNlWSA9IHBvc3Np
YmxlUmVjdC55KCkgLSBmb2N1c1BvaW50LnkoKTsNCisgICAgfSBlbHNlIGlmIChkaXJlY3Rpb24g
PT0gRm9jdXNEaXJlY3Rpb25FYXN0KSB7DQorICAgICAgICBkaXN0YW5jZVggPSBwb3NzaWJsZVJl
Y3QueCgpIC0gZm9jdXNQb2ludC54KCk7DQorICAgICAgICAvLyBhZGp1c3QgdGhlIHkgZGlzdGFu
Y2UgYmFzZWQgb24gdGhlIGNsb3Nlc3QgZWRnZQ0KKyAgICAgICAgaWYgKGZvY3VzUG9pbnQueSgp
IDwgcG9zc2libGVSZWN0LnkoKSkNCisgICAgICAgICAgICBkaXN0YW5jZVkgPSBwb3NzaWJsZVJl
Y3QueSgpIC0gZm9jdXNQb2ludC55KCk7DQorICAgICAgICBlbHNlIGlmIChmb2N1c1BvaW50Lnko
KSA+IHBvc3NpYmxlUmVjdC5ib3R0b20oKSkNCisgICAgICAgICAgICBkaXN0YW5jZVkgPSBmb2N1
c1BvaW50LnkoKSAtIHBvc3NpYmxlUmVjdC5ib3R0b20oKTsNCisgICAgfSBlbHNlIGlmIChkaXJl
Y3Rpb24gPT0gRm9jdXNEaXJlY3Rpb25XZXN0KSB7DQorICAgICAgICBkaXN0YW5jZVggPSBmb2N1
c1BvaW50LngoKSAtIHBvc3NpYmxlUmVjdC5yaWdodCgpOw0KKyAgICAgICAgLy8gYWRqdXN0IHRo
ZSB5IGRpc3RhbmNlIGJhc2VkIG9uIHRoZSBjbG9zZXN0IGVkZ2UNCisgICAgICAgIGlmIChmb2N1
c1BvaW50LnkoKSA8IHBvc3NpYmxlUmVjdC55KCkpIA0KKyAgICAgICAgICAgIGRpc3RhbmNlWSA9
IHBvc3NpYmxlUmVjdC55KCkgLSBmb2N1c1BvaW50LnkoKTsNCisgICAgICAgIGVsc2UgaWYgKGZv
Y3VzUG9pbnQueSgpID4gcG9zc2libGVSZWN0LmJvdHRvbSgpKQ0KKyAgICAgICAgICAgIGRpc3Rh
bmNlWSA9IGZvY3VzUG9pbnQueSgpIC0gcG9zc2libGVSZWN0LmJvdHRvbSgpOw0KKyAgICB9DQor
DQorICAgIGV1Y2xpZGlhbkRpc3QgPSBzcXJ0KGRpc3RhbmNlWCAqIGRpc3RhbmNlWCArIGRpc3Rh
bmNlWSAqIGRpc3RhbmNlWSk7DQorDQorICAgIGlmIChkaXJlY3Rpb24gPT0gRm9jdXNEaXJlY3Rp
b25Ob3J0aCB8fCBkaXJlY3Rpb24gPT0gRm9jdXNEaXJlY3Rpb25Tb3V0aCkgew0KKyAgICAgICAg
Ly8gaWYgdGhlIHJlY3RhbmdsZXMgYXJlIG9uIHRoZSBzYW1lIHBsYW5lIHNldCB0aGUgZXVjbGlk
aWFuRGlzdCB0byB6ZXJvIHRvIGZhdm9yIHRoaXMgbmF2aWdhdGlvbg0KKyAgICAgICAgaWYgKGZv
Y3VzZWRSZWN0LngoKSA9PSBwb3NzaWJsZVJlY3QueCgpKQ0KKyAgICAgICAgICAgIGV1Y2xpZGlh
bkRpc3QgPSAwOw0KKw0KKyAgICAgICAgLy8gb3ZlcmxhcHBpbmcgcmVjdGFuZ2xlcyBhcmUgcmV3
YXJkZWQNCisgICAgICAgIGlmICgocG9zc2libGVSZWN0LnkoKSA+PSBmb2N1c2VkUmVjdC55KCkg
JiYgcG9zc2libGVSZWN0LnkoKSA8PSBmb2N1c2VkUmVjdC5ib3R0b20oKSkgDQorICAgICAgICAg
ICAgfHwgKHBvc3NpYmxlUmVjdC5ib3R0b20oKSA+PSBmb2N1c2VkUmVjdC55KCkgJiYgcG9zc2li
bGVSZWN0LmJvdHRvbSgpIDw9IGZvY3VzZWRSZWN0LmJvdHRvbSgpKSkgew0KKyAgICAgICAgICAg
IGludCBib3R0b20gPSBtYXgoZm9jdXNlZFJlY3QuYm90dG9tKCkscG9zc2libGVSZWN0LmJvdHRv
bSgpKTsNCisgICAgICAgICAgICBpbnQgdG9wID0gbWluKGZvY3VzZWRSZWN0LnkoKSxwb3NzaWJs
ZVJlY3QueSgpKTsNCisgICAgICAgICAgICByZWN0T3ZlcmxhcCA9IGJvdHRvbS10b3A7DQorICAg
ICAgICB9DQorICAgICAgICAvLyBkaXNwbGFjZW1lbnQgaXMgc3VidHJhY3RlZCBmb3IgYmVpbmcg
b3J0aG9nb25hbGx5IGZhciBmcm9tIHRoZSBjdXJyZW50IHJlY3RhbmdsZS4NCisgICAgICAgIGlm
IChwb3NzaWJsZVJlY3QueCgpID4gZm9jdXNlZFJlY3QucmlnaHQoKSkNCisgICAgICAgICAgICBk
aXNwbGFjZW1lbnQgPSBwb3NzaWJsZVJlY3QueCgpIC0gZm9jdXNlZFJlY3QucmlnaHQoKTsNCisg
ICAgICAgIGlmIChwb3NzaWJsZVJlY3QucmlnaHQoKSA8IGZvY3VzZWRSZWN0LngoKSkNCisgICAg
ICAgICAgICBkaXNwbGFjZW1lbnQgPSBmb2N1c2VkUmVjdC54KCkgLSBwb3NzaWJsZVJlY3Qucmln
aHQoKTsNCisNCisgICAgfSBlbHNlIGlmIChkaXJlY3Rpb24gPT0gRm9jdXNEaXJlY3Rpb25FYXN0
IHx8IGRpcmVjdGlvbiA9PSBGb2N1c0RpcmVjdGlvbldlc3QpIHsNCisNCisgICAgICAgIC8vIGlm
IHRoZSByZWN0YW5nbGVzIGFyZSBvbiB0aGUgc2FtZSBwbGFuZSBzZXQgdGhlIGV1Y2xpZGlhbkRp
c3QgdG8gemVybyB0byBmYXZvciB0aGlzIG5hdmlnYXRpb24NCisgICAgICAgIGlmIChmb2N1c2Vk
UmVjdC55KCkgPT0gcG9zc2libGVSZWN0LnkoKSkNCisgICAgICAgICAgICBldWNsaWRpYW5EaXN0
ID0gMDsNCisNCisgICAgICAgIC8vIG92ZXJsYXBwaW5nIHJlY3RhbmdsZXMgYXJlIHJld2FyZGVk
DQorICAgICAgICBpZiAoKHBvc3NpYmxlUmVjdC54KCkgPj0gZm9jdXNlZFJlY3QueCgpICYmIHBv
c3NpYmxlUmVjdC54KCkgPD0gZm9jdXNlZFJlY3QucmlnaHQoKSkgDQorICAgICAgICAgICAgfHwg
KHBvc3NpYmxlUmVjdC5yaWdodCgpID49IGZvY3VzZWRSZWN0LngoKSAmJiBwb3NzaWJsZVJlY3Qu
cmlnaHQoKSA8PSBmb2N1c2VkUmVjdC5yaWdodCgpKSkgew0KKyAgICAgICAgICAgIGludCBsZWZ0
ID0gbWF4KGZvY3VzZWRSZWN0LngoKSxwb3NzaWJsZVJlY3QueCgpKTsNCisgICAgICAgICAgICBp
bnQgcmlnaHQgPSBtaW4oZm9jdXNlZFJlY3QucmlnaHQoKSxwb3NzaWJsZVJlY3QucmlnaHQoKSk7
DQorICAgICAgICAgICAgcmVjdE92ZXJsYXAgPSByaWdodC1sZWZ0Ow0KKyAgICAgICAgfQ0KKw0K
KyAgICAgICAgLy8gZGlzcGxhY2VtZW50IGlzIHN1YnRyYWN0ZWQgZm9yIGJlaW5nIG9ydGhvZ29u
YWxseSBmYXIgZnJvbSB0aGUgY3VycmVudCByZWN0YW5nbGUuDQorICAgICAgICBpZiAocG9zc2li
bGVSZWN0LnkoKSA+IGZvY3VzZWRSZWN0LmJvdHRvbSgpKQ0KKyAgICAgICAgICAgIGRpc3BsYWNl
bWVudCA9IHBvc3NpYmxlUmVjdC55KCkgLSBmb2N1c2VkUmVjdC5ib3R0b20oKTsNCisgICAgICAg
IGlmIChwb3NzaWJsZVJlY3QuYm90dG9tKCkgPCBmb2N1c2VkUmVjdC55KCkpDQorICAgICAgICAg
ICAgZGlzcGxhY2VtZW50ID0gZm9jdXNlZFJlY3QueSgpIC0gcG9zc2libGVSZWN0LmJvdHRvbSgp
Ow0KKyAgICB9DQorDQorICAgIHJldHVybiBldWNsaWRpYW5EaXN0ICsgZGlzdGFuY2VYICsgZGlz
dGFuY2VZICsgMiAqIChkaXNwbGFjZW1lbnQpIC0gc3FydChyZWN0T3ZlcmxhcCk7DQorfQ0KKw0K
K05vZGUqIERvY3VtZW50OjpuZXh0Rm9jdXNhYmxlTm9kZUluRGlyZWN0aW9uKEZvY3VzRGlyZWN0
aW9uIGRpcmVjdGlvbiwgTm9kZSogc3RhcnROb2RlKQ0KK3sNCisgICAgSW50UmVjdCBmb2N1c2Vk
UmVjdCA9IChzdGFydE5vZGUpP3N0YXJ0Tm9kZS0+Z2V0UmVjdCgpOkludFJlY3QoMCwwLDAsMCk7
DQorICAgIEludFBvaW50IGZvY3VzUG9pbnQgPSBjYWxjdWxhdGVGb2N1c1BvaW50KGRpcmVjdGlv
biwgZm9jdXNlZFJlY3QpOw0KKw0KKyAgICBpbnQgZGlzdGFuY2UgPSAtMTsNCisgICAgSW50UmVj
dCBmb2N1c1JlY3Q7IA0KKyAgICBOb2RlKiBuZXh0Tm9kZSA9IDA7DQorICAgIGZvcihOb2RlKiBu
ID0gdGhpczsgbiAhPSAwOyBuID0gbi0+dHJhdmVyc2VOZXh0Tm9kZSgpKSB7DQorICAgICAgICBp
ZihuLT5pc0ZvY3VzYWJsZSgpKSB7DQorICAgICAgICAgICAgSW50UmVjdCByID0gbi0+Z2V0UmVj
dCgpOw0KKyAgICAgICAgICAgIGlmIChkaXJlY3Rpb24gPT0gRm9jdXNEaXJlY3Rpb25Ob3J0aCAm
JiByLmJvdHRvbSgpID49IGZvY3VzUG9pbnQueSgpKSBjb250aW51ZTsNCisgICAgICAgICAgICBp
ZiAoZGlyZWN0aW9uID09IEZvY3VzRGlyZWN0aW9uU291dGggJiYgci55KCkgPD0gZm9jdXNQb2lu
dC55KCkpIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIGlmIChkaXJlY3Rpb24gPT0gRm9jdXNEaXJl
Y3Rpb25FYXN0ICYmIHIueCgpIDw9IGZvY3VzUG9pbnQueCgpKSBjb250aW51ZTsNCisgICAgICAg
ICAgICBpZiAoZGlyZWN0aW9uID09IEZvY3VzRGlyZWN0aW9uV2VzdCAmJiByLnJpZ2h0KCkgPj0g
Zm9jdXNQb2ludC54KCkpIGNvbnRpbnVlOw0KKw0KKyAgICAgICAgICAgIGludCBkaXMgPSBkaXN0
YW5jZUZ1bmN0aW9uKGRpcmVjdGlvbiwgciwgZm9jdXNQb2ludCwgZm9jdXNlZFJlY3QpOw0KKyAg
ICAgICAgICAgIGlmIChkaXN0YW5jZSA9PSAtMSB8fCBkaXN0YW5jZSA+IGRpcykgew0KKyAgICAg
ICAgICAgICAgICBkaXN0YW5jZSA9IGRpczsNCisgICAgICAgICAgICAgICAgZm9jdXNSZWN0ID0g
cjsNCisgICAgICAgICAgICAgICAgbmV4dE5vZGUgPSBuOw0KKyAgICAgICAgICAgIH0NCisgICAg
ICAgIH0NCisgICAgfQ0KKw0KKyAgICByZXR1cm4gbmV4dE5vZGU7DQorfQ0KKw0KIGludCBEb2N1
bWVudDo6bm9kZUFic0luZGV4KE5vZGUgKm5vZGUpDQogew0KICAgICBBU1NFUlQobm9kZS0+ZG9j
dW1lbnQoKSA9PSB0aGlzKTsNCkluZGV4OiBXZWJDb3JlL2RvbS9Eb2N1bWVudC5oDQo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09DQotLS0gV2ViQ29yZS9kb20vRG9jdW1lbnQuaAkocmV2aXNpb24gMzkyMTYpDQorKysgV2Vi
Q29yZS9kb20vRG9jdW1lbnQuaAkod29ya2luZyBjb3B5KQ0KQEAgLTM5LDcgKzM5LDcgQEANCiAj
aW5jbHVkZSAiVGltZXIuaCINCiAjaW5jbHVkZSA8d3RmL0hhc2hDb3VudGVkU2V0Lmg+DQogI2lu
Y2x1ZGUgPHd0Zi9MaXN0SGFzaFNldC5oPg0KLQ0KKyNpbmNsdWRlICJGb2N1c0RpcmVjdGlvbi5o
Ig0KIC8vIEZJWE1FOiBXZSBzaG91bGQgbW92ZSBNYWMgb2ZmIG9mIHRoZSBvbGQgRnJhbWUtYmFz
ZWQgdXNlciBzdHlsZXNoZWV0IGxvYWRpbmcNCiAvLyBjb2RlIGFuZCBvbnRvIHRoZSBuZXcgY29k
ZSBpbiBQYWdlLiBXZSBjYW4ndCBkbyB0aGF0IHVudGlsIHRoZSBjb2RlIGluIFBhZ2UNCiAvLyBz
dXBwb3J0cyBub24tZmlsZTogVVJMcywgaG93ZXZlci4NCkBAIC02MDYsNiArNjA2LDE4IEBAIHB1
YmxpYzoNCiAgICAgICovDQogICAgIE5vZGUqIHByZXZpb3VzRm9jdXNhYmxlTm9kZShOb2RlKiBz
dGFydCwgS2V5Ym9hcmRFdmVudCopOw0KIA0KKyAgICAvKioNCisgICAgICogU2VhcmNoZXMgdGhy
b3VnaCB0aGUgZG9jdW1lbnQsIHN0YXJ0aW5nIGZyb20gdGhlIHN0YXJ0IG5vZGUuIGNob29zZXMg
dGhlIG5leHQgbm9kZSBiYXNlZCBvbiBhIGZvY3VzIHBvaW50IA0KKyAgICAgKiBhbGdvcml0aG0u
DQorICAgICAqDQorICAgICAqIEBwYXJhbSBGb2N1c0RpcmVjdGlvbg0KKyAgICAgKg0KKyAgICAg
KiBAcmV0dXJuIFRoZSBmb2N1cyBub2RlIHRvIHN0YXJ0IHRoZSBzZWFyY2gNCisgICAgICoNCisg
ICAgICogU2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL1dJREMvI25hdi1kaXN0YW5jZS1ma3QNCisg
ICAgICovDQorICAgIE5vZGUqIG5leHRGb2N1c2FibGVOb2RlSW5EaXJlY3Rpb24oRm9jdXNEaXJl
Y3Rpb24gZGlyZWN0aW9uLCBOb2RlKiBzdGFydE5vZGUpOw0KKw0KICAgICBpbnQgbm9kZUFic0lu
ZGV4KE5vZGUqKTsNCiAgICAgTm9kZSogbm9kZVdpdGhBYnNJbmRleChpbnQgYWJzSW5kZXgpOw0K
IA0KSW5kZXg6IFdlYkNvcmUvcGFnZS9FdmVudEhhbmRsZXIuY3BwDQo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotLS0g
V2ViQ29yZS9wYWdlL0V2ZW50SGFuZGxlci5jcHAJKHJldmlzaW9uIDM5MjE2KQ0KKysrIFdlYkNv
cmUvcGFnZS9FdmVudEhhbmRsZXIuY3BwCSh3b3JraW5nIGNvcHkpDQpAQCAtNDcsNiArNDcsNyBA
QA0KICNpbmNsdWRlICJIVE1MRnJhbWVTZXRFbGVtZW50LmgiDQogI2luY2x1ZGUgIkhUTUxGcmFt
ZUVsZW1lbnRCYXNlLmgiDQogI2luY2x1ZGUgIkhUTUxJbnB1dEVsZW1lbnQuaCINCisjaW5jbHVk
ZSAiSFRNTE1ldGFFbGVtZW50LmgiDQogI2luY2x1ZGUgIkhUTUxOYW1lcy5oIg0KICNpbmNsdWRl
ICJJbWFnZS5oIg0KICNpbmNsdWRlICJJbnNwZWN0b3JDb250cm9sbGVyLmgiDQpAQCAtNTQsNiAr
NTUsNyBAQA0KICNpbmNsdWRlICJNb3VzZUV2ZW50LmgiDQogI2luY2x1ZGUgIk1vdXNlRXZlbnRX
aXRoSGl0VGVzdFJlc3VsdHMuaCINCiAjaW5jbHVkZSAiUGFnZS5oIg0KKyNpbmNsdWRlICJOb2Rl
TGlzdC5oIg0KICNpbmNsdWRlICJQbGF0Zm9ybUtleWJvYXJkRXZlbnQuaCINCiAjaW5jbHVkZSAi
UGxhdGZvcm1XaGVlbEV2ZW50LmgiDQogI2luY2x1ZGUgIlJlbmRlckZyYW1lU2V0LmgiDQpAQCAt
NjUsNiArNjcsNyBAQA0KICNpbmNsdWRlICJUZXh0RXZlbnQuaCINCiAjaW5jbHVkZSA8d3RmL1N0
ZExpYkV4dHJhcy5oPg0KIA0KKw0KICNpZiBFTkFCTEUoU1ZHKQ0KICNpbmNsdWRlICJTVkdEb2N1
bWVudC5oIg0KICNpbmNsdWRlICJTVkdFbGVtZW50SW5zdGFuY2UuaCINCkBAIC0xODY4LDkgKzE4
NzEsOSBAQCB2b2lkIEV2ZW50SGFuZGxlcjo6aGFuZGxlS2V5Ym9hcmRTZWxlY3RpDQogICAgIGVs
c2UgaWYgKGtleSA9PSAiUmlnaHQiKSB7DQogICAgICAgICBtX2ZyYW1lLT5zZWxlY3Rpb24oKS0+
bW9kaWZ5KChpc1NoaWZ0ZWQpID8gU2VsZWN0aW9uQ29udHJvbGxlcjo6RVhURU5EIDogU2VsZWN0
aW9uQ29udHJvbGxlcjo6TU9WRSwgU2VsZWN0aW9uQ29udHJvbGxlcjo6UklHSFQsIChpc09wdGlv
bmVkKSA/IFdvcmRHcmFudWxhcml0eSA6IENoYXJhY3RlckdyYW51bGFyaXR5LCB0cnVlKTsNCiAg
ICAgICAgIGV2ZW50LT5zZXREZWZhdWx0SGFuZGxlZCgpOw0KLSAgICB9ICAgIA0KKyAgICB9DQog
fQ0KLSAgICANCisNCiB2b2lkIEV2ZW50SGFuZGxlcjo6ZGVmYXVsdEtleWJvYXJkRXZlbnRIYW5k
bGVyKEtleWJvYXJkRXZlbnQqIGV2ZW50KQ0KIHsNCiAgICBpZiAoZXZlbnQtPnR5cGUoKSA9PSBl
dmVudE5hbWVzKCkua2V5ZG93bkV2ZW50KSB7DQpAQCAtMTg4MCw5ICsxODgzLDI0IEBAIHZvaWQg
RXZlbnRIYW5kbGVyOjpkZWZhdWx0S2V5Ym9hcmRFdmVudEgNCiAgICAgICAgIGlmIChldmVudC0+
a2V5SWRlbnRpZmllcigpID09ICJVKzAwMDkiKQ0KICAgICAgICAgICAgIGRlZmF1bHRUYWJFdmVu
dEhhbmRsZXIoZXZlbnQpOw0KIA0KKyAgICAgICAgYm9vbCB0YWJiZWQgPSBmYWxzZTsNCisgICAg
ICAgIERvY3VtZW50KiBkb2MgPSBtX2ZyYW1lLT5kb2N1bWVudCgpOw0KKyAgICAgICAgaWYgKGRv
Yykgew0KKyAgICAgICAgICAgIFJlZlB0cjxOb2RlTGlzdD4gbGlzdCA9IGRvYy0+Z2V0RWxlbWVu
dHNCeVRhZ05hbWUoIm1ldGEiKTsNCisgICAgICAgICAgICB1bnNpZ25lZCBsZW4gPSBsaXN0LT5s
ZW5ndGgoKTsNCisgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbGVuOyBpKysp
IHsNCisgICAgICAgICAgICAgICAgSFRNTE1ldGFFbGVtZW50KiBtZXRhID0gc3RhdGljX2Nhc3Q8
SFRNTE1ldGFFbGVtZW50Kj4obGlzdC0+aXRlbShpKSk7DQorICAgICAgICAgICAgICAgIGlmICht
ZXRhLT5uYW1lKCkgPT0gIm5hdmlnYXRpb24iICYmICBtZXRhLT5jb250ZW50KCkgPT0gInRhYmJl
ZCIpDQorICAgICAgICAgICAgICAgICAgICB0YWJiZWQgPSB0cnVlOw0KKyAgICAgICAgICAgIH0N
CisgICAgICAgIH0NCisNCisgICAgICAgIGlmICh0YWJiZWQpDQorICAgICAgICAgICAgZGlyZWN0
aW9uYWxUYWJFdmVudEhhbmRsZXIoZXZlbnQpOw0KKw0KICAgICAgICAvLyBwcm92aWRlcyBLQiBu
YXZpZ2F0aW9uIGFuZCBzZWxlY3Rpb24gZm9yIGVuaGFuY2VkIGFjY2Vzc2liaWxpdHkgdXNlcnMN
CiAgICAgICAgaWYgKEFYT2JqZWN0Q2FjaGU6OmFjY2Vzc2liaWxpdHlFbmhhbmNlZFVzZXJJbnRl
cmZhY2VFbmFibGVkKCkpDQotICAgICAgICAgICBoYW5kbGVLZXlib2FyZFNlbGVjdGlvbk1vdmVt
ZW50KGV2ZW50KTsgICAgICAgDQorICAgICAgICAgICBoYW5kbGVLZXlib2FyZFNlbGVjdGlvbk1v
dmVtZW50KGV2ZW50KTsgIA0KICAgIH0NCiAgICBpZiAoZXZlbnQtPnR5cGUoKSA9PSBldmVudE5h
bWVzKCkua2V5cHJlc3NFdmVudCkgew0KICAgICAgICAgbV9mcmFtZS0+ZWRpdG9yKCktPmhhbmRs
ZUtleWJvYXJkRXZlbnQoZXZlbnQpOw0KQEAgLTIxNjgsNiArMjE4NiwzNyBAQCB2b2lkIEV2ZW50
SGFuZGxlcjo6ZGVmYXVsdFRhYkV2ZW50SGFuZGxlDQogICAgICAgICBldmVudC0+c2V0RGVmYXVs
dEhhbmRsZWQoKTsNCiB9DQogDQordm9pZCBFdmVudEhhbmRsZXI6OmRpcmVjdGlvbmFsVGFiRXZl
bnRIYW5kbGVyKEtleWJvYXJkRXZlbnQqIGV2ZW50KQ0KK3sNCisgICAgaWYgKCFldmVudCB8fCBl
dmVudC0+Y3RybEtleSgpIHx8IGV2ZW50LT5tZXRhS2V5KCkgfHwgZXZlbnQtPmFsdEdyYXBoS2V5
KCkpDQorICAgICAgICByZXR1cm47DQorDQorICAgIGlmIChtX2ZyYW1lLT5kb2N1bWVudCgpLT5p
bkRlc2lnbk1vZGUoKSkNCisgICAgICAgIHJldHVybjsNCisNCisgICAgUGFnZSogcGFnZSA9IG1f
ZnJhbWUtPnBhZ2UoKTsNCisgICAgaWYgKCFwYWdlKQ0KKyAgICAgICAgcmV0dXJuOw0KKw0KKyAg
ICBpZiAoIXBhZ2UtPnRhYktleUN5Y2xlc1Rocm91Z2hFbGVtZW50cygpKQ0KKyAgICAgICAgcmV0
dXJuOw0KKw0KKyAgICBTdHJpbmcga2V5ID0gZXZlbnQtPmtleUlkZW50aWZpZXIoKTsgDQorDQor
ICAgIGlmIChrZXkgPT0gIlVwIiAmJiBwYWdlLT5mb2N1c0NvbnRyb2xsZXIoKS0+YWR2YW5jZUZv
Y3VzKEZvY3VzRGlyZWN0aW9uTm9ydGgsIGV2ZW50KSkNCisgICAgICAgIGV2ZW50LT5zZXREZWZh
dWx0SGFuZGxlZCgpOw0KKw0KKyAgICBlbHNlIGlmIChrZXkgPT0gIkRvd24iICYmIHBhZ2UtPmZv
Y3VzQ29udHJvbGxlcigpLT5hZHZhbmNlRm9jdXMoRm9jdXNEaXJlY3Rpb25Tb3V0aCwgZXZlbnQp
KQ0KKyAgICAgICAgZXZlbnQtPnNldERlZmF1bHRIYW5kbGVkKCk7DQorDQorICAgIGVsc2UgaWYg
KGtleSA9PSAiTGVmdCIgJiYgcGFnZS0+Zm9jdXNDb250cm9sbGVyKCktPmFkdmFuY2VGb2N1cyhG
b2N1c0RpcmVjdGlvbldlc3QsIGV2ZW50KSkNCisgICAgICAgIGV2ZW50LT5zZXREZWZhdWx0SGFu
ZGxlZCgpOw0KKw0KKyAgICBlbHNlIGlmIChrZXkgPT0gIlJpZ2h0IiAmJiBwYWdlLT5mb2N1c0Nv
bnRyb2xsZXIoKS0+YWR2YW5jZUZvY3VzKEZvY3VzRGlyZWN0aW9uRWFzdCwgZXZlbnQpKQ0KKyAg
ICAgICAgZXZlbnQtPnNldERlZmF1bHRIYW5kbGVkKCk7DQorDQorfQ0KKw0KIHZvaWQgRXZlbnRI
YW5kbGVyOjpjYXBzTG9ja1N0YXRlTWF5SGF2ZUNoYW5nZWQoKQ0KIHsNCiAgICAgaWYgKERvY3Vt
ZW50KiBkID0gbV9mcmFtZS0+ZG9jdW1lbnQoKSkNCkluZGV4OiBXZWJDb3JlL3BhZ2UvRXZlbnRI
YW5kbGVyLmgNCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0NCi0tLSBXZWJDb3JlL3BhZ2UvRXZlbnRIYW5kbGVyLmgJKHJl
dmlzaW9uIDM5MjE2KQ0KKysrIFdlYkNvcmUvcGFnZS9FdmVudEhhbmRsZXIuaAkod29ya2luZyBj
b3B5KQ0KQEAgLTI2Niw2ICsyNjYsNyBAQCBwcml2YXRlOg0KICAgICBib29sIHBhc3NXaGVlbEV2
ZW50VG9XaWRnZXQoUGxhdGZvcm1XaGVlbEV2ZW50JiwgV2lkZ2V0Kik7DQogDQogICAgIHZvaWQg
ZGVmYXVsdFRhYkV2ZW50SGFuZGxlcihLZXlib2FyZEV2ZW50Kik7DQorICAgIHZvaWQgZGlyZWN0
aW9uYWxUYWJFdmVudEhhbmRsZXIoS2V5Ym9hcmRFdmVudCogZXZlbnQpOw0KIA0KICAgICB2b2lk
IGFsbG93REhUTUxEcmFnKGJvb2wmIGZsYWdESFRNTCwgYm9vbCYgZmxhZ1VBKSBjb25zdDsNCiAN
CkluZGV4OiBXZWJDb3JlL3BhZ2UvRm9jdXNDb250cm9sbGVyLmNwcA0KPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLS0t
IFdlYkNvcmUvcGFnZS9Gb2N1c0NvbnRyb2xsZXIuY3BwCShyZXZpc2lvbiAzOTIxNikNCisrKyBX
ZWJDb3JlL3BhZ2UvRm9jdXNDb250cm9sbGVyLmNwcAkod29ya2luZyBjb3B5KQ0KQEAgLTkzLDkg
KzkzLDEyIEBAIHN0YXRpYyBOb2RlKiBkZWVwRm9jdXNhYmxlTm9kZShGb2N1c0RpcmUNCiAgICAg
ICAgIGlmICghZG9jdW1lbnQpDQogICAgICAgICAgICAgYnJlYWs7DQogDQotICAgICAgICBub2Rl
ID0gKGRpcmVjdGlvbiA9PSBGb2N1c0RpcmVjdGlvbkZvcndhcmQpDQotICAgICAgICAgICAgPyBk
b2N1bWVudC0+bmV4dEZvY3VzYWJsZU5vZGUoMCwgZXZlbnQpDQotICAgICAgICAgICAgOiBkb2N1
bWVudC0+cHJldmlvdXNGb2N1c2FibGVOb2RlKDAsIGV2ZW50KTsNCisgICAgICAgIGlmIChkaXJl
Y3Rpb24gPT0gRm9jdXNEaXJlY3Rpb25Gb3J3YXJkKQ0KKyAgICAgICAgICAgIG5vZGUgPSBkb2N1
bWVudC0+bmV4dEZvY3VzYWJsZU5vZGUoMCwgZXZlbnQpOw0KKyAgICAgICAgZWxzZSBpZiAoZGly
ZWN0aW9uID09IEZvY3VzRGlyZWN0aW9uQmFja3dhcmQpDQorICAgICAgICAgICAgbm9kZSA9IGRv
Y3VtZW50LT5wcmV2aW91c0ZvY3VzYWJsZU5vZGUoMCwgZXZlbnQpOw0KKyAgICAgICAgZWxzZQ0K
KyAgICAgICAgICAgIG5vZGUgPSBkb2N1bWVudC0+bmV4dEZvY3VzYWJsZU5vZGVJbkRpcmVjdGlv
bihkaXJlY3Rpb24sIDApOw0KICAgICAgICAgaWYgKCFub2RlKSB7DQogICAgICAgICAgICAgbm9k
ZSA9IG93bmVyOw0KICAgICAgICAgICAgIGJyZWFrOw0KQEAgLTExOCwxMCArMTIxLDE0IEBAIGJv
b2wgRm9jdXNDb250cm9sbGVyOjphZHZhbmNlRm9jdXMoRm9jdXMNCiAgICAgaWYgKCFkb2N1bWVu
dCkNCiAgICAgICAgIHJldHVybiBmYWxzZTsNCiANCi0gICAgTm9kZSogbm9kZSA9IChkaXJlY3Rp
b24gPT0gRm9jdXNEaXJlY3Rpb25Gb3J3YXJkKQ0KLSAgICAgICAgPyBkb2N1bWVudC0+bmV4dEZv
Y3VzYWJsZU5vZGUoZG9jdW1lbnQtPmZvY3VzZWROb2RlKCksIGV2ZW50KQ0KLSAgICAgICAgOiBk
b2N1bWVudC0+cHJldmlvdXNGb2N1c2FibGVOb2RlKGRvY3VtZW50LT5mb2N1c2VkTm9kZSgpLCBl
dmVudCk7DQotICAgICAgICAgICAgDQorICAgIE5vZGUqIG5vZGUgPSAwOw0KKyAgICBpZiAoZGly
ZWN0aW9uID09IEZvY3VzRGlyZWN0aW9uRm9yd2FyZCkNCisgICAgICAgIG5vZGUgPSBkb2N1bWVu
dC0+bmV4dEZvY3VzYWJsZU5vZGUoZG9jdW1lbnQtPmZvY3VzZWROb2RlKCksIGV2ZW50KTsNCisg
ICAgZWxzZSBpZiAoZGlyZWN0aW9uID09IEZvY3VzRGlyZWN0aW9uQmFja3dhcmQpDQorICAgICAg
ICBub2RlID0gZG9jdW1lbnQtPnByZXZpb3VzRm9jdXNhYmxlTm9kZShkb2N1bWVudC0+Zm9jdXNl
ZE5vZGUoKSwgZXZlbnQpOw0KKyAgICBlbHNlDQorICAgICAgICBub2RlID0gZG9jdW1lbnQtPm5l
eHRGb2N1c2FibGVOb2RlSW5EaXJlY3Rpb24oZGlyZWN0aW9uLCBkb2N1bWVudC0+Zm9jdXNlZE5v
ZGUoKSk7DQorDQogICAgIC8vIElmIHRoZXJlJ3Mgbm8gZm9jdXNhYmxlIG5vZGUgdG8gYWR2YW5j
ZSB0bywgbW92ZSB1cCB0aGUgZnJhbWUgdHJlZSB1bnRpbCB3ZSBmaW5kIG9uZS4NCiAgICAgd2hp
bGUgKCFub2RlICYmIGZyYW1lKSB7DQogICAgICAgICBGcmFtZSogcGFyZW50RnJhbWUgPSBmcmFt
ZS0+dHJlZSgpLT5wYXJlbnQoKTsNCkBAIC0xMzYsOSArMTQzLDEyIEBAIGJvb2wgRm9jdXNDb250
cm9sbGVyOjphZHZhbmNlRm9jdXMoRm9jdXMNCiAgICAgICAgIGlmICghb3duZXIpDQogICAgICAg
ICAgICAgYnJlYWs7DQogDQotICAgICAgICBub2RlID0gKGRpcmVjdGlvbiA9PSBGb2N1c0RpcmVj
dGlvbkZvcndhcmQpDQotICAgICAgICAgICAgPyBwYXJlbnREb2N1bWVudC0+bmV4dEZvY3VzYWJs
ZU5vZGUob3duZXIsIGV2ZW50KQ0KLSAgICAgICAgICAgIDogcGFyZW50RG9jdW1lbnQtPnByZXZp
b3VzRm9jdXNhYmxlTm9kZShvd25lciwgZXZlbnQpOw0KKyAgICAgICAgaWYgKGRpcmVjdGlvbiA9
PSBGb2N1c0RpcmVjdGlvbkZvcndhcmQpDQorICAgICAgICAgICAgbm9kZSA9IHBhcmVudERvY3Vt
ZW50LT5uZXh0Rm9jdXNhYmxlTm9kZShvd25lciwgZXZlbnQpOw0KKyAgICAgICAgZWxzZSBpZiAo
ZGlyZWN0aW9uID09IEZvY3VzRGlyZWN0aW9uQmFja3dhcmQpDQorICAgICAgICAgICAgbm9kZSA9
IHBhcmVudERvY3VtZW50LT5wcmV2aW91c0ZvY3VzYWJsZU5vZGUob3duZXIsIGV2ZW50KTsNCisg
ICAgICAgIGVsc2UNCisgICAgICAgICAgICBub2RlID0gZG9jdW1lbnQtPm5leHRGb2N1c2FibGVO
b2RlSW5EaXJlY3Rpb24oZGlyZWN0aW9uLCBvd25lcik7DQogDQogICAgICAgICBmcmFtZSA9IHBh
cmVudEZyYW1lOw0KICAgICB9DQpAQCAtMTU1LDExICsxNjUsMTQgQEAgYm9vbCBGb2N1c0NvbnRy
b2xsZXI6OmFkdmFuY2VGb2N1cyhGb2N1cw0KICAgICAgICAgfQ0KIA0KICAgICAgICAgLy8gQ2hy
b21lIGRvZXNuJ3Qgd2FudCBmb2N1cywgc28gd2Ugc2hvdWxkIHdyYXAgZm9jdXMuDQotICAgICAg
ICBpZiAoRG9jdW1lbnQqIGQgPSBtX3BhZ2UtPm1haW5GcmFtZSgpLT5kb2N1bWVudCgpKQ0KLSAg
ICAgICAgICAgIG5vZGUgPSAoZGlyZWN0aW9uID09IEZvY3VzRGlyZWN0aW9uRm9yd2FyZCkNCi0g
ICAgICAgICAgICAgICAgPyBkLT5uZXh0Rm9jdXNhYmxlTm9kZSgwLCBldmVudCkNCi0gICAgICAg
ICAgICAgICAgOiBkLT5wcmV2aW91c0ZvY3VzYWJsZU5vZGUoMCwgZXZlbnQpOw0KLQ0KKyAgICAg
ICAgaWYgKERvY3VtZW50KiBkID0gbV9wYWdlLT5tYWluRnJhbWUoKS0+ZG9jdW1lbnQoKSkgew0K
KyAgICAgICAgICAgIGlmIChkaXJlY3Rpb24gPT0gRm9jdXNEaXJlY3Rpb25Gb3J3YXJkKQ0KKyAg
ICAgICAgICAgICAgICBub2RlID0gZC0+bmV4dEZvY3VzYWJsZU5vZGUoMCwgZXZlbnQpOw0KKyAg
ICAgICAgICAgIGVsc2UgaWYgKGRpcmVjdGlvbiA9PSBGb2N1c0RpcmVjdGlvbkJhY2t3YXJkKQ0K
KyAgICAgICAgICAgICAgICBub2RlID0gZC0+cHJldmlvdXNGb2N1c2FibGVOb2RlKDAsIGV2ZW50
KTsNCisgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgIG5vZGUgPSBkb2N1bWVudC0+
bmV4dEZvY3VzYWJsZU5vZGVJbkRpcmVjdGlvbihkaXJlY3Rpb24sIDApOw0KKyAgICAgICAgfQ0K
ICAgICAgICAgbm9kZSA9IGRlZXBGb2N1c2FibGVOb2RlKGRpcmVjdGlvbiwgbm9kZSwgZXZlbnQp
Ow0KIA0KICAgICAgICAgaWYgKCFub2RlKQ0KSW5kZXg6IFdlYkNvcmUvcGFnZS9Gb2N1c0RpcmVj
dGlvbi5oDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09DQotLS0gV2ViQ29yZS9wYWdlL0ZvY3VzRGlyZWN0aW9uLmgJKHJl
dmlzaW9uIDM5MjE2KQ0KKysrIFdlYkNvcmUvcGFnZS9Gb2N1c0RpcmVjdGlvbi5oCSh3b3JraW5n
IGNvcHkpDQpAQCAtMjksNyArMjksMTEgQEANCiBuYW1lc3BhY2UgV2ViQ29yZSB7DQogICAgIGVu
dW0gRm9jdXNEaXJlY3Rpb24gew0KICAgICAgICAgRm9jdXNEaXJlY3Rpb25Gb3J3YXJkID0gMCwN
Ci0gICAgICAgIEZvY3VzRGlyZWN0aW9uQmFja3dhcmQNCisgICAgICAgIEZvY3VzRGlyZWN0aW9u
QmFja3dhcmQsDQorICAgICAgICBGb2N1c0RpcmVjdGlvbk5vcnRoLA0KKyAgICAgICAgRm9jdXNE
aXJlY3Rpb25Tb3V0aCwNCisgICAgICAgIEZvY3VzRGlyZWN0aW9uRWFzdCwNCisgICAgICAgIEZv
Y3VzRGlyZWN0aW9uV2VzdA0KICAgICB9Ow0KIH0NCiANCg==
</data>
<flag name="review"
          id="12206"
          type_id="1"
          status="-"
          setter="darin"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>26126</attachid>
            <date>2008-12-18 12:36:17 -0800</date>
            <delta_ts>2009-01-10 15:45:32 -0800</delta_ts>
            <desc>directional focus node navigation patch</desc>
            <filename>focusnodeafterreview.patch</filename>
            <type>text/plain</type>
            <size>24782</size>
            <attacher name="Joseph Ligman">joseph.ligman</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotLS0gV2ViQ29yZS9DaGFuZ2VM
b2cJKHJldmlzaW9uIDM5Mzc3KQ0KKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkp
DQpAQCAtMSwzICsxLDM0IEBADQorMjAwOC0xMi0xOCAgSm9lIExpZ21hbiAgPGpsaWdtYW5AbWlu
ZHNwcmluZy5jb20+DQorDQorICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4NCisN
CisgICAgICAgIEJ1ZyAyMjc0MDogSXQncyBub3QgcG9zc2libGUgZm9yIGNsaWVudHMgb2YgUVdl
YkZyYW1lIHRvIGltcGxlbWVudCBkaXJlY3Rpb25hbCANCisgICAgICAgIGZvY3VzIG5vZGUgbmF2
aWdhdGlvbg0KKyAgICAgICAgPGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9p
ZD0yMjc0MD4NCisNCisgICAgICAgIEFkZGVkIGZvY3VzIHBvaW50IG5hdmlnYXRpb24gYmFzZWQg
b24gaHR0cDovL3d3dy53My5vcmcvVFIvV0lDRC8jbmF2LWRpc3RhbmNlLWZrdC4NCisgICAgICAg
IFRoZSBhbGdvcml0aG0gaW1wbGVtZW50cyB0d28gZGltZW5zaW9uYWwgZm9jdXMgdHJhdmVyc2Fs
LiBJdCBhbGxvd3MgZm9yIG5hdHVyYWwgdHJhdmVyc2FsIA0KKyAgICAgICAgb3ZlciByYW5kb21s
eSBhcnJhbmdlZCBmb2N1cy1hYmxlIGVsZW1lbnRzLg0KKw0KKyAgICAgICAgKiBkb20vRG9jdW1l
bnQuY3BwOg0KKyAgICAgICAgKFdlYkNvcmU6OmNhbGN1bGF0ZUZvY3VzUG9pbnQpOg0KKyAgICAg
ICAgKFdlYkNvcmU6OmNhbGN1bGF0ZURpc3RhbmNlKToNCisgICAgICAgIChXZWJDb3JlOjpEb2N1
bWVudDo6bmV4dEZvY3VzYWJsZU5vZGVJbkRpcmVjdGlvbik6DQorICAgICAgICAqIGRvbS9Eb2N1
bWVudC5oOg0KKyAgICAgICAgKiBwYWdlL0V2ZW50SGFuZGxlci5jcHA6DQorICAgICAgICAoV2Vi
Q29yZTo6RXZlbnRIYW5kbGVyOjpoYW5kbGVLZXlib2FyZFNlbGVjdGlvbk1vdmVtZW50KToNCisg
ICAgICAgIChXZWJDb3JlOjpFdmVudEhhbmRsZXI6OmRlZmF1bHRLZXlib2FyZEV2ZW50SGFuZGxl
cik6DQorICAgICAgICAqIHBhZ2UvRm9jdXNDb250cm9sbGVyLmNwcDoNCisgICAgICAgIChXZWJD
b3JlOjpkZWVwRm9jdXNhYmxlTm9kZSk6DQorICAgICAgICAoV2ViQ29yZTo6Rm9jdXNDb250cm9s
bGVyOjphZHZhbmNlRm9jdXMpOg0KKyAgICAgICAgKiBwYWdlL0ZvY3VzRGlyZWN0aW9uLmg6DQor
ICAgICAgICAoV2ViQ29yZTo6KToNCisgICAgICAgICogcGFnZS9TZXR0aW5ncy5jcHA6DQorICAg
ICAgICAoV2ViQ29yZTo6U2V0dGluZ3M6OlNldHRpbmdzKToNCisgICAgICAgIChXZWJDb3JlOjpT
ZXR0aW5nczo6c2V0RGlyZWN0aW9uYWxGb2N1c05hdmlnYXRpb24pOg0KKyAgICAgICAgKiBwYWdl
L1NldHRpbmdzLmg6DQorICAgICAgICAoV2ViQ29yZTo6U2V0dGluZ3M6OmRpcmVjdGlvbmFsRm9j
dXNOYXZpZ2F0aW9uKToNCisNCiAyMDA4LTEyLTE4ICBDYW1lcm9uIFp3YXJpY2ggIDx6d2FyaWNo
QGFwcGxlLmNvbT4NCiANCiAgICAgICAgIFJldmlld2VkIGJ5IEdlb2ZmIEdhcmVuLg0KSW5kZXg6
IFdlYkNvcmUvZG9tL0RvY3VtZW50LmNwcA0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLS0tIFdlYkNvcmUvZG9tL0Rv
Y3VtZW50LmNwcAkocmV2aXNpb24gMzkzNzcpDQorKysgV2ViQ29yZS9kb20vRG9jdW1lbnQuY3Bw
CSh3b3JraW5nIGNvcHkpDQpAQCAtMTkyMCw2ICsxOTIwLDE0OSBAQCBOb2RlKiBEb2N1bWVudDo6
cHJldmlvdXNGb2N1c2FibGVOb2RlKE5vDQogICAgIHJldHVybiBwcmV2aW91c05vZGVXaXRoTG93
ZXJUYWJJbmRleChsYXN0LCBzdGFydGluZ1RhYkluZGV4LCBldmVudCk7DQogfQ0KIA0KK3N0YXRp
YyBJbnRQb2ludCBjYWxjdWxhdGVGb2N1c1BvaW50KEZvY3VzRGlyZWN0aW9uIGRpcmVjdGlvbiwg
Y29uc3QgSW50UmVjdCYgZm9jdXNlZFJlY3QsIGNvbnN0IEludFBvaW50JiBmb2N1c1BvaW50KQ0K
K3sNCisgICAgSW50UG9pbnQgbmV4dEZvY3VzUG9pbnQoZm9jdXNQb2ludCk7DQorICAgIHN3aXRj
aCAoZGlyZWN0aW9uKSB7DQorICAgIGNhc2UgRm9jdXNEaXJlY3Rpb25VcDoNCisgICAgICAgIGlm
IChmb2N1c1BvaW50LngoKSA8IGZvY3VzZWRSZWN0LngoKSkgDQorICAgICAgICAgICAgbmV4dEZv
Y3VzUG9pbnQuc2V0WChmb2N1c2VkUmVjdC54KCkpOw0KKyAgICAgICAgZWxzZSBpZiAoZm9jdXNQ
b2ludC54KCkgPiBmb2N1c2VkUmVjdC5yaWdodCgpKQ0KKyAgICAgICAgICAgIG5leHRGb2N1c1Bv
aW50LnNldFgoZm9jdXNlZFJlY3QucmlnaHQoKSk7DQorICAgICAgICBuZXh0Rm9jdXNQb2ludC5z
ZXRZKGZvY3VzZWRSZWN0LmJvdHRvbSgpKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICBjYXNlIEZv
Y3VzRGlyZWN0aW9uRG93bjoNCisgICAgICAgIGlmIChmb2N1c1BvaW50LngoKSA8IGZvY3VzZWRS
ZWN0LngoKSkgDQorICAgICAgICAgICAgbmV4dEZvY3VzUG9pbnQuc2V0WChmb2N1c2VkUmVjdC54
KCkpOw0KKyAgICAgICAgZWxzZSBpZiAoZm9jdXNQb2ludC54KCkgPiBmb2N1c2VkUmVjdC5yaWdo
dCgpKQ0KKyAgICAgICAgICAgIG5leHRGb2N1c1BvaW50LnNldFgoZm9jdXNlZFJlY3QucmlnaHQo
KSk7DQorICAgICAgICBuZXh0Rm9jdXNQb2ludC5zZXRZKGZvY3VzZWRSZWN0LnkoKSk7DQorICAg
ICAgICBicmVhazsNCisgICAgY2FzZSBGb2N1c0RpcmVjdGlvblJpZ2h0Og0KKyAgICAgICAgbmV4
dEZvY3VzUG9pbnQuc2V0WChmb2N1c2VkUmVjdC54KCkpOw0KKyAgICAgICAgaWYgKGZvY3VzUG9p
bnQueSgpIDwgZm9jdXNlZFJlY3QueSgpKQ0KKyAgICAgICAgICAgIG5leHRGb2N1c1BvaW50LnNl
dFkoZm9jdXNlZFJlY3QueSgpKTsNCisgICAgICAgIGVsc2UgaWYgKGZvY3VzUG9pbnQueSgpID4g
Zm9jdXNlZFJlY3QuYm90dG9tKCkpDQorICAgICAgICAgICAgbmV4dEZvY3VzUG9pbnQuc2V0WShm
b2N1c2VkUmVjdC5ib3R0b20oKSk7DQorICAgICAgICBicmVhazsNCisgICAgY2FzZSBGb2N1c0Rp
cmVjdGlvbkxlZnQ6DQorICAgICAgICBuZXh0Rm9jdXNQb2ludC5zZXRYKGZvY3VzZWRSZWN0LnJp
Z2h0KCkpOw0KKyAgICAgICAgaWYgKGZvY3VzUG9pbnQueSgpIDwgZm9jdXNlZFJlY3QueSgpKQ0K
KyAgICAgICAgICAgIG5leHRGb2N1c1BvaW50LnNldFkoZm9jdXNlZFJlY3QueSgpKTsNCisgICAg
ICAgIGVsc2UgaWYgKGZvY3VzUG9pbnQueSgpID4gZm9jdXNlZFJlY3QuYm90dG9tKCkpDQorICAg
ICAgICAgICAgbmV4dEZvY3VzUG9pbnQuc2V0WShmb2N1c2VkUmVjdC5ib3R0b20oKSk7DQorICAg
ICAgICBicmVhazsNCisgICAgZGVmYXVsdDoNCisgICAgICAgIGJyZWFrOw0KKyAgICB9DQorDQor
ICAgIHJldHVybiBuZXh0Rm9jdXNQb2ludDsNCit9DQorDQorc3RhdGljIGludCBjYWxjdWxhdGVE
aXN0YW5jZShGb2N1c0RpcmVjdGlvbiBkaXJlY3Rpb24sIGNvbnN0IEludFJlY3QmIHBvc3NpYmxl
UmVjdCwgY29uc3QgSW50UG9pbnQmIGZvY3VzUG9pbnQsIGNvbnN0IEludFJlY3QmIGZvY3VzZWRS
ZWN0KQ0KK3sNCisgICAgLy8gTWFrZSBzdXJlIHRoZSByZWN0YW5nbGUgZmFsbHMgd2l0aGluIHRo
ZSBzZWFyY2ggYXJlYQ0KKyAgICBpZiAoZGlyZWN0aW9uID09IEZvY3VzRGlyZWN0aW9uVXAgJiYg
cG9zc2libGVSZWN0LmJvdHRvbSgpID49IGZvY3VzUG9pbnQueSgpDQorICAgICAgICB8fCBkaXJl
Y3Rpb24gPT0gRm9jdXNEaXJlY3Rpb25Eb3duICYmIHBvc3NpYmxlUmVjdC55KCkgPD0gZm9jdXNQ
b2ludC55KCkNCisgICAgICAgIHx8IGRpcmVjdGlvbiA9PSBGb2N1c0RpcmVjdGlvblJpZ2h0ICYm
IHBvc3NpYmxlUmVjdC54KCkgPD0gZm9jdXNQb2ludC54KCkNCisgICAgICAgIHx8IGRpcmVjdGlv
biA9PSBGb2N1c0RpcmVjdGlvbkxlZnQgJiYgcG9zc2libGVSZWN0LnJpZ2h0KCkgPj0gZm9jdXNQ
b2ludC54KCkpDQorICAgICAgICByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptYXgo
KTsNCisNCisgICAgLy8gVGhlIGFic29sdXRlIGRpc3RhbmNlIChkeCBvciBkeSkgb24gdGhlIG5h
dmlnYXRpb24gYXhpcyBiZXR3ZWVuIHRoZSBvcHBvc2luZyBlZGdlcyBvZiB0aGUgY3VycmVudGx5
IGZvY3VzZWQNCisgICAgLy8gZWxlbWVudCBhbmQgZWFjaCBvZiB0aGUgY2FuZGlkYXRlcy4NCisg
ICAgaW50IGRpc3RhbmNlWCA9IDA7DQorICAgIGludCBkaXN0YW5jZVkgPSAwOw0KKw0KKyAgICBp
ZiAoZGlyZWN0aW9uID09IEZvY3VzRGlyZWN0aW9uVXApIHsNCisgICAgICAgIC8vIGFkanVzdCB0
aGUgeCBkaXN0YW5jZSBiYXNlZCBvbiB0aGUgY2xvc2VzdCBlZGdlDQorICAgICAgICBpZiAoZm9j
dXNQb2ludC54KCkgPCBwb3NzaWJsZVJlY3QueCgpKSANCisgICAgICAgICAgICBkaXN0YW5jZVgg
PSBwb3NzaWJsZVJlY3QueCgpIC0gZm9jdXNQb2ludC54KCk7DQorICAgICAgICBlbHNlIGlmIChm
b2N1c1BvaW50LngoKSA+IHBvc3NpYmxlUmVjdC5yaWdodCgpKQ0KKyAgICAgICAgICAgIGRpc3Rh
bmNlWCA9IGZvY3VzUG9pbnQueCgpIC0gcG9zc2libGVSZWN0LnJpZ2h0KCk7DQorICAgICAgIGRp
c3RhbmNlWSA9IGZvY3VzUG9pbnQueSgpIC0gcG9zc2libGVSZWN0LmJvdHRvbSgpOw0KKyAgICB9
IGVsc2UgaWYgKGRpcmVjdGlvbiA9PSBGb2N1c0RpcmVjdGlvbkRvd24pIHsNCisgICAgICAgIC8v
IGFkanVzdCB0aGUgeCBkaXN0YW5jZSBiYXNlZCBvbiB0aGUgY2xvc2VzdCBlZGdlDQorICAgICAg
ICBpZiAoZm9jdXNQb2ludC54KCkgPCBwb3NzaWJsZVJlY3QueCgpKSANCisgICAgICAgICAgICBk
aXN0YW5jZVggPSBwb3NzaWJsZVJlY3QueCgpIC0gZm9jdXNQb2ludC54KCk7DQorICAgICAgICBl
bHNlIGlmIChmb2N1c1BvaW50LngoKSA+IHBvc3NpYmxlUmVjdC5yaWdodCgpKQ0KKyAgICAgICAg
ICAgIGRpc3RhbmNlWCA9IGZvY3VzUG9pbnQueCgpIC0gcG9zc2libGVSZWN0LnJpZ2h0KCk7DQor
ICAgICAgICBkaXN0YW5jZVkgPSBwb3NzaWJsZVJlY3QueSgpIC0gZm9jdXNQb2ludC55KCk7DQor
ICAgIH0gZWxzZSBpZiAoZGlyZWN0aW9uID09IEZvY3VzRGlyZWN0aW9uUmlnaHQpIHsNCisgICAg
ICAgIGRpc3RhbmNlWCA9IHBvc3NpYmxlUmVjdC54KCkgLSBmb2N1c1BvaW50LngoKTsNCisgICAg
ICAgIC8vIGFkanVzdCB0aGUgeSBkaXN0YW5jZSBiYXNlZCBvbiB0aGUgY2xvc2VzdCBlZGdlDQor
ICAgICAgICBpZiAoZm9jdXNQb2ludC55KCkgPCBwb3NzaWJsZVJlY3QueSgpKQ0KKyAgICAgICAg
ICAgIGRpc3RhbmNlWSA9IHBvc3NpYmxlUmVjdC55KCkgLSBmb2N1c1BvaW50LnkoKTsNCisgICAg
ICAgIGVsc2UgaWYgKGZvY3VzUG9pbnQueSgpID4gcG9zc2libGVSZWN0LmJvdHRvbSgpKQ0KKyAg
ICAgICAgICAgIGRpc3RhbmNlWSA9IGZvY3VzUG9pbnQueSgpIC0gcG9zc2libGVSZWN0LmJvdHRv
bSgpOw0KKyAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PSBGb2N1c0RpcmVjdGlvbkxlZnQpIHsN
CisgICAgICAgIGRpc3RhbmNlWCA9IGZvY3VzUG9pbnQueCgpIC0gcG9zc2libGVSZWN0LnJpZ2h0
KCk7DQorICAgICAgICAvLyBhZGp1c3QgdGhlIHkgZGlzdGFuY2UgYmFzZWQgb24gdGhlIGNsb3Nl
c3QgZWRnZQ0KKyAgICAgICAgaWYgKGZvY3VzUG9pbnQueSgpIDwgcG9zc2libGVSZWN0LnkoKSkg
DQorICAgICAgICAgICAgZGlzdGFuY2VZID0gcG9zc2libGVSZWN0LnkoKSAtIGZvY3VzUG9pbnQu
eSgpOw0KKyAgICAgICAgZWxzZSBpZiAoZm9jdXNQb2ludC55KCkgPiBwb3NzaWJsZVJlY3QuYm90
dG9tKCkpDQorICAgICAgICAgICAgZGlzdGFuY2VZID0gZm9jdXNQb2ludC55KCkgLSBwb3NzaWJs
ZVJlY3QuYm90dG9tKCk7DQorICAgIH0NCisNCisgICAgLy8gVGhlIGFic29sdXRlIGRpc3RhbmNl
IG9uIHRoZSBheGlzIG9ydGhvZ29uYWwgdG8gdGhlIG5hdmlnYXRpb24gYXhpcyBiZXR3ZWVuDQor
ICAgIC8vIHRoZSBvcHBvc2luZyBlZGdlcyBvZiBjdXJyZW50bHkgZm9jdXNlZCBlbGVtZW50IGFu
ZCBlYWNoIG9mIGNhbmRpZGF0ZXMNCisgICAgaW50IGRpc3BsYWNlbWVudCA9IDA7DQorDQorICAg
IC8vIFRoZSBldWNsaWRlYW4gZGlzdGFuY2UNCisgICAgaW50IGV1Y2xpZGVhbkRpc3QgPSBzcXJ0
KGRpc3RhbmNlWCAqIGRpc3RhbmNlWCArIGRpc3RhbmNlWSAqIGRpc3RhbmNlWSk7DQorDQorICAg
IGlmIChkaXJlY3Rpb24gPT0gRm9jdXNEaXJlY3Rpb25VcCB8fCBkaXJlY3Rpb24gPT0gRm9jdXNE
aXJlY3Rpb25Eb3duKSB7DQorICAgICAgICAvLyBpZiB0aGUgcmVjdGFuZ2xlcyBhcmUgb24gdGhl
IHNhbWUgcGxhbmUgc2V0IHRoZSBldWNsaWRlYW5EaXN0IHRvIHplcm8gdG8gZmF2b3IgdGhpcyBu
YXZpZ2F0aW9uDQorICAgICAgICBpZiAoZm9jdXNlZFJlY3QueCgpID09IHBvc3NpYmxlUmVjdC54
KCkpDQorICAgICAgICAgICAgZXVjbGlkZWFuRGlzdCA9IDA7DQorDQorICAgICAgICAvLyBkaXNw
bGFjZW1lbnQgaXMgc3VidHJhY3RlZCBmb3IgYmVpbmcgb3J0aG9nb25hbGx5IGZhciBmcm9tIHRo
ZSBjdXJyZW50IHJlY3RhbmdsZS4NCisgICAgICAgIGlmIChwb3NzaWJsZVJlY3QueCgpID4gZm9j
dXNlZFJlY3QucmlnaHQoKSkNCisgICAgICAgICAgICBkaXNwbGFjZW1lbnQgPSBwb3NzaWJsZVJl
Y3QueCgpIC0gZm9jdXNlZFJlY3QucmlnaHQoKTsNCisgICAgICAgIGlmIChwb3NzaWJsZVJlY3Qu
cmlnaHQoKSA8IGZvY3VzZWRSZWN0LngoKSkNCisgICAgICAgICAgICBkaXNwbGFjZW1lbnQgPSBm
b2N1c2VkUmVjdC54KCkgLSBwb3NzaWJsZVJlY3QucmlnaHQoKTsNCisNCisgICAgfSBlbHNlIGlm
IChkaXJlY3Rpb24gPT0gRm9jdXNEaXJlY3Rpb25MZWZ0IHx8IGRpcmVjdGlvbiA9PSBGb2N1c0Rp
cmVjdGlvblJpZ2h0KSB7DQorDQorICAgICAgICAvLyBpZiB0aGUgcmVjdGFuZ2xlcyBhcmUgb24g
dGhlIHNhbWUgcGxhbmUgc2V0IHRoZSBldWNsaWRlYW5EaXN0IHRvIHplcm8gdG8gZmF2b3IgdGhp
cyBuYXZpZ2F0aW9uDQorICAgICAgICBpZiAoZm9jdXNlZFJlY3QueSgpID09IHBvc3NpYmxlUmVj
dC55KCkpDQorICAgICAgICAgICAgZXVjbGlkZWFuRGlzdCA9IDA7DQorDQorICAgICAgICAvLyBk
aXNwbGFjZW1lbnQgaXMgc3VidHJhY3RlZCBmb3IgYmVpbmcgb3J0aG9nb25hbGx5IGZhciBmcm9t
IHRoZSBjdXJyZW50IHJlY3RhbmdsZS4NCisgICAgICAgIGlmIChwb3NzaWJsZVJlY3QueSgpID4g
Zm9jdXNlZFJlY3QuYm90dG9tKCkpDQorICAgICAgICAgICAgZGlzcGxhY2VtZW50ID0gcG9zc2li
bGVSZWN0LnkoKSAtIGZvY3VzZWRSZWN0LmJvdHRvbSgpOw0KKyAgICAgICAgaWYgKHBvc3NpYmxl
UmVjdC5ib3R0b20oKSA8IGZvY3VzZWRSZWN0LnkoKSkNCisgICAgICAgICAgICBkaXNwbGFjZW1l
bnQgPSBmb2N1c2VkUmVjdC55KCkgLSBwb3NzaWJsZVJlY3QuYm90dG9tKCk7DQorICAgIH0NCisN
CisgICAgcmV0dXJuIGV1Y2xpZGVhbkRpc3QgKyBkaXN0YW5jZVggKyBkaXN0YW5jZVkgKyAyICog
KGRpc3BsYWNlbWVudCk7DQorfQ0KKw0KK05vZGUqIERvY3VtZW50OjpuZXh0Rm9jdXNhYmxlTm9k
ZUluRGlyZWN0aW9uKEZvY3VzRGlyZWN0aW9uIGRpcmVjdGlvbiwgTm9kZSogc3RhcnROb2RlLCBL
ZXlib2FyZEV2ZW50KiBldmVudCkNCit7DQorDQorICAgIGlmIChkaXJlY3Rpb24gPT0gRm9jdXNE
aXJlY3Rpb25Gb3J3YXJkKQ0KKyAgICAgICAgcmV0dXJuIG5leHRGb2N1c2FibGVOb2RlKHN0YXJ0
Tm9kZSwgZXZlbnQpOw0KKyAgICBlbHNlIGlmIChkaXJlY3Rpb24gPT0gRm9jdXNEaXJlY3Rpb25C
YWNrd2FyZCkNCisgICAgICAgIHJldHVybiBwcmV2aW91c0ZvY3VzYWJsZU5vZGUoc3RhcnROb2Rl
LCBldmVudCk7DQorDQorICAgIEludFJlY3QgZm9jdXNlZFJlY3QoKHN0YXJ0Tm9kZSkgPyBzdGFy
dE5vZGUtPmdldFJlY3QoKSA6IEludFJlY3QoKSk7DQorICAgIG1fZm9jdXNQb2ludCA9IGNhbGN1
bGF0ZUZvY3VzUG9pbnQoZGlyZWN0aW9uLCBmb2N1c2VkUmVjdCwgbV9mb2N1c1BvaW50KTsNCisN
CisgICAgTm9kZSogYmVzdE5vZGUgPSAwOw0KKyAgICBpbnQgYmVzdERpc3RhbmNlID0gc3RkOjpu
dW1lcmljX2xpbWl0czxpbnQ+OjptYXgoKTsNCisgICAgZm9yIChOb2RlKiBuID0gdGhpczsgbjsg
biA9IG4tPnRyYXZlcnNlTmV4dE5vZGUoKSkgew0KKyAgICAgICAgaWYgKG4tPmlzRm9jdXNhYmxl
KCkpIHsNCisgICAgICAgICAgICBpbnQgZGlzdGFuY2UgPSBjYWxjdWxhdGVEaXN0YW5jZSAoZGly
ZWN0aW9uLCBuLT5nZXRSZWN0KCksIG1fZm9jdXNQb2ludCwgZm9jdXNlZFJlY3QpOw0KKyAgICAg
ICAgICAgIGlmIChiZXN0RGlzdGFuY2UgPiBkaXN0YW5jZSkgew0KKyAgICAgICAgICAgICAgICBi
ZXN0RGlzdGFuY2UgPSBkaXN0YW5jZTsNCisgICAgICAgICAgICAgICAgYmVzdE5vZGUgPSBuOw0K
KyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICByZXR1cm4gYmVzdE5v
ZGU7DQorfQ0KKw0KIGludCBEb2N1bWVudDo6bm9kZUFic0luZGV4KE5vZGUgKm5vZGUpDQogew0K
ICAgICBBU1NFUlQobm9kZS0+ZG9jdW1lbnQoKSA9PSB0aGlzKTsNCkluZGV4OiBXZWJDb3JlL2Rv
bS9Eb2N1bWVudC5oDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09DQotLS0gV2ViQ29yZS9kb20vRG9jdW1lbnQuaAkocmV2
aXNpb24gMzkzNzcpDQorKysgV2ViQ29yZS9kb20vRG9jdW1lbnQuaAkod29ya2luZyBjb3B5KQ0K
QEAgLTM4LDYgKzM4LDcgQEANCiAjaW5jbHVkZSAiVGltZXIuaCINCiAjaW5jbHVkZSA8d3RmL0hh
c2hDb3VudGVkU2V0Lmg+DQogI2luY2x1ZGUgPHd0Zi9MaXN0SGFzaFNldC5oPg0KKyNpbmNsdWRl
ICJGb2N1c0RpcmVjdGlvbi5oIg0KIA0KIC8vIEZJWE1FOiBXZSBzaG91bGQgbW92ZSBNYWMgb2Zm
IG9mIHRoZSBvbGQgRnJhbWUtYmFzZWQgdXNlciBzdHlsZXNoZWV0IGxvYWRpbmcNCiAvLyBjb2Rl
IGFuZCBvbnRvIHRoZSBuZXcgY29kZSBpbiBQYWdlLiBXZSBjYW4ndCBkbyB0aGF0IHVudGlsIHRo
ZSBjb2RlIGluIFBhZ2UNCkBAIC02MDUsNiArNjA2LDggQEAgcHVibGljOg0KICAgICAgKi8NCiAg
ICAgTm9kZSogcHJldmlvdXNGb2N1c2FibGVOb2RlKE5vZGUqIHN0YXJ0LCBLZXlib2FyZEV2ZW50
Kik7DQogDQorICAgIE5vZGUqIG5leHRGb2N1c2FibGVOb2RlSW5EaXJlY3Rpb24oRm9jdXNEaXJl
Y3Rpb24sIE5vZGUqLCBLZXlib2FyZEV2ZW50Kik7DQorDQogICAgIGludCBub2RlQWJzSW5kZXgo
Tm9kZSopOw0KICAgICBOb2RlKiBub2RlV2l0aEFic0luZGV4KGludCBhYnNJbmRleCk7DQogDQpA
QCAtOTM5LDYgKzk0Miw3IEBAIHByaXZhdGU6DQogICAgIGJvb2wgbV94bWxTdGFuZGFsb25lOw0K
IA0KICAgICBTdHJpbmcgbV9jb250ZW50TGFuZ3VhZ2U7DQorICAgIEludFBvaW50IG1fZm9jdXNQ
b2ludDsNCiANCiBwdWJsaWM6DQogICAgIGJvb2wgaW5QYWdlQ2FjaGUoKTsNCkluZGV4OiBXZWJD
b3JlL3BhZ2UvRXZlbnRIYW5kbGVyLmNwcA0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLS0tIFdlYkNvcmUvcGFnZS9F
dmVudEhhbmRsZXIuY3BwCShyZXZpc2lvbiAzOTM3NykNCisrKyBXZWJDb3JlL3BhZ2UvRXZlbnRI
YW5kbGVyLmNwcAkod29ya2luZyBjb3B5KQ0KQEAgLTE4NTQsMjMgKzE4NTQsNDMgQEAgdm9pZCBF
dmVudEhhbmRsZXI6OmhhbmRsZUtleWJvYXJkU2VsZWN0aQ0KICAgICBib29sIGlzT3B0aW9uZWQg
PSBldmVudC0+Z2V0TW9kaWZpZXJTdGF0ZSgiQWx0Iik7DQogICAgIA0KICAgICBpZiAoa2V5ID09
ICJVcCIpIHsNCi0gICAgICAgIG1fZnJhbWUtPnNlbGVjdGlvbigpLT5tb2RpZnkoKGlzU2hpZnRl
ZCkgPyBTZWxlY3Rpb25Db250cm9sbGVyOjpFWFRFTkQgOiBTZWxlY3Rpb25Db250cm9sbGVyOjpN
T1ZFLCBTZWxlY3Rpb25Db250cm9sbGVyOjpCQUNLV0FSRCwgTGluZUdyYW51bGFyaXR5LCB0cnVl
KTsNCi0gICAgICAgIGV2ZW50LT5zZXREZWZhdWx0SGFuZGxlZCgpOw0KKyAgICAgICAgaWYgKEFY
T2JqZWN0Q2FjaGU6OmFjY2Vzc2liaWxpdHlFbmhhbmNlZFVzZXJJbnRlcmZhY2VFbmFibGVkKCkp
IHsNCisgICAgICAgICAgICBtX2ZyYW1lLT5zZWxlY3Rpb24oKS0+bW9kaWZ5KChpc1NoaWZ0ZWQp
ID8gU2VsZWN0aW9uQ29udHJvbGxlcjo6RVhURU5EIDogU2VsZWN0aW9uQ29udHJvbGxlcjo6TU9W
RSwgU2VsZWN0aW9uQ29udHJvbGxlcjo6QkFDS1dBUkQsIExpbmVHcmFudWxhcml0eSwgdHJ1ZSk7
DQorICAgICAgICAgICAgZXZlbnQtPnNldERlZmF1bHRIYW5kbGVkKCk7DQorICAgICAgICB9IGVs
c2UgaWYgKG1fZnJhbWUtPnNldHRpbmdzKCktPmRpcmVjdGlvbmFsRm9jdXNOYXZpZ2F0aW9uKCkp
IHsNCisgICAgICAgICAgICBtX2ZyYW1lLT5wYWdlKCktPmZvY3VzQ29udHJvbGxlcigpLT5hZHZh
bmNlRm9jdXMoRm9jdXNEaXJlY3Rpb25VcCwgZXZlbnQpOw0KKyAgICAgICAgICAgIGV2ZW50LT5z
ZXREZWZhdWx0SGFuZGxlZCgpOw0KKyAgICAgICAgfQ0KICAgICB9DQotICAgIGVsc2UgaWYgKGtl
eSA9PSAiRG93biIpIHsgDQotICAgICAgICBtX2ZyYW1lLT5zZWxlY3Rpb24oKS0+bW9kaWZ5KChp
c1NoaWZ0ZWQpID8gU2VsZWN0aW9uQ29udHJvbGxlcjo6RVhURU5EIDogU2VsZWN0aW9uQ29udHJv
bGxlcjo6TU9WRSwgU2VsZWN0aW9uQ29udHJvbGxlcjo6Rk9SV0FSRCwgTGluZUdyYW51bGFyaXR5
LCB0cnVlKTsNCi0gICAgICAgIGV2ZW50LT5zZXREZWZhdWx0SGFuZGxlZCgpOw0KKyAgICBlbHNl
IGlmIChrZXkgPT0gIkRvd24iKSB7DQorICAgICAgICBpZiAoQVhPYmplY3RDYWNoZTo6YWNjZXNz
aWJpbGl0eUVuaGFuY2VkVXNlckludGVyZmFjZUVuYWJsZWQoKSkgew0KKyAgICAgICAgICAgIG1f
ZnJhbWUtPnNlbGVjdGlvbigpLT5tb2RpZnkoKGlzU2hpZnRlZCkgPyBTZWxlY3Rpb25Db250cm9s
bGVyOjpFWFRFTkQgOiBTZWxlY3Rpb25Db250cm9sbGVyOjpNT1ZFLCBTZWxlY3Rpb25Db250cm9s
bGVyOjpGT1JXQVJELCBMaW5lR3JhbnVsYXJpdHksIHRydWUpOw0KKyAgICAgICAgICAgIGV2ZW50
LT5zZXREZWZhdWx0SGFuZGxlZCgpOw0KKyAgICAgICAgfSBlbHNlIGlmIChtX2ZyYW1lLT5zZXR0
aW5ncygpLT5kaXJlY3Rpb25hbEZvY3VzTmF2aWdhdGlvbigpKSB7DQorICAgICAgICAgICAgbV9m
cmFtZS0+cGFnZSgpLT5mb2N1c0NvbnRyb2xsZXIoKS0+YWR2YW5jZUZvY3VzKEZvY3VzRGlyZWN0
aW9uRG93biwgZXZlbnQpOw0KKyAgICAgICAgICAgIGV2ZW50LT5zZXREZWZhdWx0SGFuZGxlZCgp
Ow0KKyAgICAgICAgfQ0KICAgICB9DQogICAgIGVsc2UgaWYgKGtleSA9PSAiTGVmdCIpIHsNCi0g
ICAgICAgIG1fZnJhbWUtPnNlbGVjdGlvbigpLT5tb2RpZnkoKGlzU2hpZnRlZCkgPyBTZWxlY3Rp
b25Db250cm9sbGVyOjpFWFRFTkQgOiBTZWxlY3Rpb25Db250cm9sbGVyOjpNT1ZFLCBTZWxlY3Rp
b25Db250cm9sbGVyOjpMRUZULCAoaXNPcHRpb25lZCkgPyBXb3JkR3JhbnVsYXJpdHkgOiBDaGFy
YWN0ZXJHcmFudWxhcml0eSwgdHJ1ZSk7DQotICAgICAgICBldmVudC0+c2V0RGVmYXVsdEhhbmRs
ZWQoKTsNCisgICAgICAgIGlmIChBWE9iamVjdENhY2hlOjphY2Nlc3NpYmlsaXR5RW5oYW5jZWRV
c2VySW50ZXJmYWNlRW5hYmxlZCgpKSB7DQorICAgICAgICAgICAgbV9mcmFtZS0+c2VsZWN0aW9u
KCktPm1vZGlmeSgoaXNTaGlmdGVkKSA/IFNlbGVjdGlvbkNvbnRyb2xsZXI6OkVYVEVORCA6IFNl
bGVjdGlvbkNvbnRyb2xsZXI6Ok1PVkUsIFNlbGVjdGlvbkNvbnRyb2xsZXI6OkxFRlQsIChpc09w
dGlvbmVkKSA/IFdvcmRHcmFudWxhcml0eSA6IENoYXJhY3RlckdyYW51bGFyaXR5LCB0cnVlKTsN
CisgICAgICAgICAgICBldmVudC0+c2V0RGVmYXVsdEhhbmRsZWQoKTsNCisgICAgICAgIH0gZWxz
ZSBpZiAobV9mcmFtZS0+c2V0dGluZ3MoKS0+ZGlyZWN0aW9uYWxGb2N1c05hdmlnYXRpb24oKSkg
ew0KKyAgICAgICAgICAgIG1fZnJhbWUtPnBhZ2UoKS0+Zm9jdXNDb250cm9sbGVyKCktPmFkdmFu
Y2VGb2N1cyhGb2N1c0RpcmVjdGlvbkxlZnQsIGV2ZW50KTsNCisgICAgICAgICAgICBldmVudC0+
c2V0RGVmYXVsdEhhbmRsZWQoKTsNCisgICAgICAgfQ0KICAgICB9DQogICAgIGVsc2UgaWYgKGtl
eSA9PSAiUmlnaHQiKSB7DQotICAgICAgICBtX2ZyYW1lLT5zZWxlY3Rpb24oKS0+bW9kaWZ5KChp
c1NoaWZ0ZWQpID8gU2VsZWN0aW9uQ29udHJvbGxlcjo6RVhURU5EIDogU2VsZWN0aW9uQ29udHJv
bGxlcjo6TU9WRSwgU2VsZWN0aW9uQ29udHJvbGxlcjo6UklHSFQsIChpc09wdGlvbmVkKSA/IFdv
cmRHcmFudWxhcml0eSA6IENoYXJhY3RlckdyYW51bGFyaXR5LCB0cnVlKTsNCi0gICAgICAgIGV2
ZW50LT5zZXREZWZhdWx0SGFuZGxlZCgpOw0KLSAgICB9ICAgIA0KKyAgICAgICAgaWYgKEFYT2Jq
ZWN0Q2FjaGU6OmFjY2Vzc2liaWxpdHlFbmhhbmNlZFVzZXJJbnRlcmZhY2VFbmFibGVkKCkpIHsN
CisgICAgICAgICAgICBtX2ZyYW1lLT5zZWxlY3Rpb24oKS0+bW9kaWZ5KChpc1NoaWZ0ZWQpID8g
U2VsZWN0aW9uQ29udHJvbGxlcjo6RVhURU5EIDogU2VsZWN0aW9uQ29udHJvbGxlcjo6TU9WRSwg
U2VsZWN0aW9uQ29udHJvbGxlcjo6UklHSFQsIChpc09wdGlvbmVkKSA/IFdvcmRHcmFudWxhcml0
eSA6IENoYXJhY3RlckdyYW51bGFyaXR5LCB0cnVlKTsNCisgICAgICAgICAgICBldmVudC0+c2V0
RGVmYXVsdEhhbmRsZWQoKTsNCisgICAgICAgIH0gZWxzZSBpZiAobV9mcmFtZS0+c2V0dGluZ3Mo
KS0+ZGlyZWN0aW9uYWxGb2N1c05hdmlnYXRpb24oKSkgew0KKyAgICAgICAgICAgIG1fZnJhbWUt
PnBhZ2UoKS0+Zm9jdXNDb250cm9sbGVyKCktPmFkdmFuY2VGb2N1cyhGb2N1c0RpcmVjdGlvblJp
Z2h0LCBldmVudCk7DQorICAgICAgICAgICAgZXZlbnQtPnNldERlZmF1bHRIYW5kbGVkKCk7DQor
ICAgICAgIH0NCisgICAgfQ0KIH0NCi0gICAgDQorDQogdm9pZCBFdmVudEhhbmRsZXI6OmRlZmF1
bHRLZXlib2FyZEV2ZW50SGFuZGxlcihLZXlib2FyZEV2ZW50KiBldmVudCkNCiB7DQogICAgaWYg
KGV2ZW50LT50eXBlKCkgPT0gZXZlbnROYW1lcygpLmtleWRvd25FdmVudCkgew0KQEAgLTE4ODEs
OCArMTkwMSw3IEBAIHZvaWQgRXZlbnRIYW5kbGVyOjpkZWZhdWx0S2V5Ym9hcmRFdmVudEgNCiAg
ICAgICAgICAgICBkZWZhdWx0VGFiRXZlbnRIYW5kbGVyKGV2ZW50KTsNCiANCiAgICAgICAgLy8g
cHJvdmlkZXMgS0IgbmF2aWdhdGlvbiBhbmQgc2VsZWN0aW9uIGZvciBlbmhhbmNlZCBhY2Nlc3Np
YmlsaXR5IHVzZXJzDQotICAgICAgIGlmIChBWE9iamVjdENhY2hlOjphY2Nlc3NpYmlsaXR5RW5o
YW5jZWRVc2VySW50ZXJmYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgaGFuZGxlS2V5Ym9hcmRT
ZWxlY3Rpb25Nb3ZlbWVudChldmVudCk7ICAgICAgIA0KKyAgICAgICBoYW5kbGVLZXlib2FyZFNl
bGVjdGlvbk1vdmVtZW50KGV2ZW50KTsNCiAgICB9DQogICAgaWYgKGV2ZW50LT50eXBlKCkgPT0g
ZXZlbnROYW1lcygpLmtleXByZXNzRXZlbnQpIHsNCiAgICAgICAgIG1fZnJhbWUtPmVkaXRvcigp
LT5oYW5kbGVLZXlib2FyZEV2ZW50KGV2ZW50KTsNCkluZGV4OiBXZWJDb3JlL3BhZ2UvRm9jdXND
b250cm9sbGVyLmNwcA0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLS0tIFdlYkNvcmUvcGFnZS9Gb2N1c0NvbnRyb2xs
ZXIuY3BwCShyZXZpc2lvbiAzOTM3NykNCisrKyBXZWJDb3JlL3BhZ2UvRm9jdXNDb250cm9sbGVy
LmNwcAkod29ya2luZyBjb3B5KQ0KQEAgLTkzLDkgKzkzLDcgQEAgc3RhdGljIE5vZGUqIGRlZXBG
b2N1c2FibGVOb2RlKEZvY3VzRGlyZQ0KICAgICAgICAgaWYgKCFkb2N1bWVudCkNCiAgICAgICAg
ICAgICBicmVhazsNCiANCi0gICAgICAgIG5vZGUgPSAoZGlyZWN0aW9uID09IEZvY3VzRGlyZWN0
aW9uRm9yd2FyZCkNCi0gICAgICAgICAgICA/IGRvY3VtZW50LT5uZXh0Rm9jdXNhYmxlTm9kZSgw
LCBldmVudCkNCi0gICAgICAgICAgICA6IGRvY3VtZW50LT5wcmV2aW91c0ZvY3VzYWJsZU5vZGUo
MCwgZXZlbnQpOw0KKyAgICAgICAgbm9kZSA9IGRvY3VtZW50LT5uZXh0Rm9jdXNhYmxlTm9kZUlu
RGlyZWN0aW9uKGRpcmVjdGlvbiwgMCwgZXZlbnQpOw0KICAgICAgICAgaWYgKCFub2RlKSB7DQog
ICAgICAgICAgICAgbm9kZSA9IG93bmVyOw0KICAgICAgICAgICAgIGJyZWFrOw0KQEAgLTExOCwx
MCArMTE2LDcgQEAgYm9vbCBGb2N1c0NvbnRyb2xsZXI6OmFkdmFuY2VGb2N1cyhGb2N1cw0KICAg
ICBpZiAoIWRvY3VtZW50KQ0KICAgICAgICAgcmV0dXJuIGZhbHNlOw0KIA0KLSAgICBOb2RlKiBu
b2RlID0gKGRpcmVjdGlvbiA9PSBGb2N1c0RpcmVjdGlvbkZvcndhcmQpDQotICAgICAgICA/IGRv
Y3VtZW50LT5uZXh0Rm9jdXNhYmxlTm9kZShkb2N1bWVudC0+Zm9jdXNlZE5vZGUoKSwgZXZlbnQp
DQotICAgICAgICA6IGRvY3VtZW50LT5wcmV2aW91c0ZvY3VzYWJsZU5vZGUoZG9jdW1lbnQtPmZv
Y3VzZWROb2RlKCksIGV2ZW50KTsNCi0gICAgICAgICAgICANCisgICAgTm9kZSogbm9kZSA9IGRv
Y3VtZW50LT5uZXh0Rm9jdXNhYmxlTm9kZUluRGlyZWN0aW9uKGRpcmVjdGlvbiwgZG9jdW1lbnQt
PmZvY3VzZWROb2RlKCksIGV2ZW50KTsNCiAgICAgLy8gSWYgdGhlcmUncyBubyBmb2N1c2FibGUg
bm9kZSB0byBhZHZhbmNlIHRvLCBtb3ZlIHVwIHRoZSBmcmFtZSB0cmVlIHVudGlsIHdlIGZpbmQg
b25lLg0KICAgICB3aGlsZSAoIW5vZGUgJiYgZnJhbWUpIHsNCiAgICAgICAgIEZyYW1lKiBwYXJl
bnRGcmFtZSA9IGZyYW1lLT50cmVlKCktPnBhcmVudCgpOw0KQEAgLTEzNiwxMyArMTMxLDkgQEAg
Ym9vbCBGb2N1c0NvbnRyb2xsZXI6OmFkdmFuY2VGb2N1cyhGb2N1cw0KICAgICAgICAgaWYgKCFv
d25lcikNCiAgICAgICAgICAgICBicmVhazsNCiANCi0gICAgICAgIG5vZGUgPSAoZGlyZWN0aW9u
ID09IEZvY3VzRGlyZWN0aW9uRm9yd2FyZCkNCi0gICAgICAgICAgICA/IHBhcmVudERvY3VtZW50
LT5uZXh0Rm9jdXNhYmxlTm9kZShvd25lciwgZXZlbnQpDQotICAgICAgICAgICAgOiBwYXJlbnRE
b2N1bWVudC0+cHJldmlvdXNGb2N1c2FibGVOb2RlKG93bmVyLCBldmVudCk7DQotDQorICAgICAg
ICBub2RlID0gZG9jdW1lbnQtPm5leHRGb2N1c2FibGVOb2RlSW5EaXJlY3Rpb24oZGlyZWN0aW9u
LCBvd25lciwgZXZlbnQpOw0KICAgICAgICAgZnJhbWUgPSBwYXJlbnRGcmFtZTsNCiAgICAgfQ0K
LQ0KICAgICBub2RlID0gZGVlcEZvY3VzYWJsZU5vZGUoZGlyZWN0aW9uLCBub2RlLCBldmVudCk7
DQogDQogICAgIGlmICghbm9kZSkgew0KQEAgLTE1NiwxMCArMTQ3LDcgQEAgYm9vbCBGb2N1c0Nv
bnRyb2xsZXI6OmFkdmFuY2VGb2N1cyhGb2N1cw0KIA0KICAgICAgICAgLy8gQ2hyb21lIGRvZXNu
J3Qgd2FudCBmb2N1cywgc28gd2Ugc2hvdWxkIHdyYXAgZm9jdXMuDQogICAgICAgICBpZiAoRG9j
dW1lbnQqIGQgPSBtX3BhZ2UtPm1haW5GcmFtZSgpLT5kb2N1bWVudCgpKQ0KLSAgICAgICAgICAg
IG5vZGUgPSAoZGlyZWN0aW9uID09IEZvY3VzRGlyZWN0aW9uRm9yd2FyZCkNCi0gICAgICAgICAg
ICAgICAgPyBkLT5uZXh0Rm9jdXNhYmxlTm9kZSgwLCBldmVudCkNCi0gICAgICAgICAgICAgICAg
OiBkLT5wcmV2aW91c0ZvY3VzYWJsZU5vZGUoMCwgZXZlbnQpOw0KLQ0KKyAgICAgICAgICAgIG5v
ZGUgPSBkb2N1bWVudC0+bmV4dEZvY3VzYWJsZU5vZGVJbkRpcmVjdGlvbihkaXJlY3Rpb24sIDAs
IGV2ZW50KTsNCiAgICAgICAgIG5vZGUgPSBkZWVwRm9jdXNhYmxlTm9kZShkaXJlY3Rpb24sIG5v
ZGUsIGV2ZW50KTsNCiANCiAgICAgICAgIGlmICghbm9kZSkNCkluZGV4OiBXZWJDb3JlL3BhZ2Uv
Rm9jdXNEaXJlY3Rpb24uaA0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLS0tIFdlYkNvcmUvcGFnZS9Gb2N1c0RpcmVj
dGlvbi5oCShyZXZpc2lvbiAzOTM3NykNCisrKyBXZWJDb3JlL3BhZ2UvRm9jdXNEaXJlY3Rpb24u
aAkod29ya2luZyBjb3B5KQ0KQEAgLTI5LDcgKzI5LDExIEBADQogbmFtZXNwYWNlIFdlYkNvcmUg
ew0KICAgICBlbnVtIEZvY3VzRGlyZWN0aW9uIHsNCiAgICAgICAgIEZvY3VzRGlyZWN0aW9uRm9y
d2FyZCA9IDAsDQotICAgICAgICBGb2N1c0RpcmVjdGlvbkJhY2t3YXJkDQorICAgICAgICBGb2N1
c0RpcmVjdGlvbkJhY2t3YXJkLA0KKyAgICAgICAgRm9jdXNEaXJlY3Rpb25VcCwNCisgICAgICAg
IEZvY3VzRGlyZWN0aW9uRG93biwNCisgICAgICAgIEZvY3VzRGlyZWN0aW9uUmlnaHQsDQorICAg
ICAgICBGb2N1c0RpcmVjdGlvbkxlZnQNCiAgICAgfTsNCiB9DQogDQpJbmRleDogV2ViQ29yZS9w
YWdlL1NldHRpbmdzLmNwcA0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLS0tIFdlYkNvcmUvcGFnZS9TZXR0aW5ncy5j
cHAJKHJldmlzaW9uIDM5Mzc3KQ0KKysrIFdlYkNvcmUvcGFnZS9TZXR0aW5ncy5jcHAJKHdvcmtp
bmcgY29weSkNCkBAIC04NCw2ICs4NCw3IEBAIFNldHRpbmdzOjpTZXR0aW5ncyhQYWdlKiBwYWdl
KQ0KICAgICAsIG1fem9vbXNUZXh0T25seShmYWxzZSkNCiAgICAgLCBtX2VuZm9yY2VDU1NNSU1F
VHlwZUluU3RyaWN0TW9kZSh0cnVlKQ0KICAgICAsIG1fbWF4aW11bURlY29kZWRJbWFnZVNpemUo
c3RkOjpudW1lcmljX2xpbWl0czxzaXplX3Q+OjptYXgoKSkNCisgICAgLCBtX2RpcmVjdGlvbmFs
Rm9jdXNOYXZpZ2F0aW9uKGZhbHNlKQ0KIHsNCiAgICAgLy8gQSBGcmFtZSBtYXkgbm90IGhhdmUg
YmVlbiBjcmVhdGVkIHlldCwgc28gd2UgaW5pdGlhbGl6ZSB0aGUgQXRvbWljU3RyaW5nIA0KICAg
ICAvLyBoYXNoIGJlZm9yZSB0cnlpbmcgdG8gdXNlIGl0Lg0KQEAgLTM5Nyw2ICszOTgsMTEgQEAg
dm9pZCBTZXR0aW5nczo6c2V0RW5mb3JjZUNTU01JTUVUeXBlSW5TdA0KICAgICBtX2VuZm9yY2VD
U1NNSU1FVHlwZUluU3RyaWN0TW9kZSA9IGVuZm9yY2VDU1NNSU1FVHlwZUluU3RyaWN0TW9kZTsN
CiB9DQogDQordm9pZCBTZXR0aW5nczo6c2V0RGlyZWN0aW9uYWxGb2N1c05hdmlnYXRpb24oYm9v
bCBkaXJlY3Rpb25hbEZvY3VzTmF2aWdhdGlvbikNCit7DQorICAgIG1fZGlyZWN0aW9uYWxGb2N1
c05hdmlnYXRpb24gPSBkaXJlY3Rpb25hbEZvY3VzTmF2aWdhdGlvbjsNCit9DQorDQogI2lmIFVT
RShTQUZBUklfVEhFTUUpDQogdm9pZCBTZXR0aW5nczo6c2V0U2hvdWxkUGFpbnROYXRpdmVDb250
cm9scyhib29sIHNob3VsZFBhaW50TmF0aXZlQ29udHJvbHMpDQogew0KSW5kZXg6IFdlYkNvcmUv
cGFnZS9TZXR0aW5ncy5oDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotLS0gV2ViQ29yZS9wYWdlL1NldHRpbmdzLmgJ
KHJldmlzaW9uIDM5Mzc3KQ0KKysrIFdlYkNvcmUvcGFnZS9TZXR0aW5ncy5oCSh3b3JraW5nIGNv
cHkpDQpAQCAtMTkzLDYgKzE5Myw5IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsNCiAgICAgICAgIHZv
aWQgc2V0TWF4aW11bURlY29kZWRJbWFnZVNpemUoc2l6ZV90IHNpemUpIHsgbV9tYXhpbXVtRGVj
b2RlZEltYWdlU2l6ZSA9IHNpemU7IH0NCiAgICAgICAgIHNpemVfdCBtYXhpbXVtRGVjb2RlZElt
YWdlU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fbWF4aW11bURlY29kZWRJbWFnZVNpemU7IH0NCiAN
CisgICAgICAgIGJvb2wgZGlyZWN0aW9uYWxGb2N1c05hdmlnYXRpb24oKSBjb25zdCB7IHJldHVy
biBtX2RpcmVjdGlvbmFsRm9jdXNOYXZpZ2F0aW9uOyB9DQorICAgICAgICB2b2lkIHNldERpcmVj
dGlvbmFsRm9jdXNOYXZpZ2F0aW9uKGJvb2wpOw0KKw0KICNpZiBVU0UoU0FGQVJJX1RIRU1FKQ0K
ICAgICAgICAgLy8gV2luZG93cyBkZWJ1Z2dpbmcgcHJlZiAoZ2xvYmFsKSBmb3Igc3dpdGNoaW5n
IGJldHdlZW4gdGhlIEFxdWEgbG9vayBhbmQgYSBuYXRpdmUgd2luZG93cyBsb29rLg0KICAgICAg
ICAgc3RhdGljIHZvaWQgc2V0U2hvdWxkUGFpbnROYXRpdmVDb250cm9scyhib29sKTsNCkBAIC0y
NTAsNiArMjUzLDcgQEAgbmFtZXNwYWNlIFdlYkNvcmUgew0KICAgICAgICAgYm9vbCBtX3pvb21z
VGV4dE9ubHkgOiAxOw0KICAgICAgICAgYm9vbCBtX2VuZm9yY2VDU1NNSU1FVHlwZUluU3RyaWN0
TW9kZSA6IDE7DQogICAgICAgICBzaXplX3QgbV9tYXhpbXVtRGVjb2RlZEltYWdlU2l6ZTsNCisg
ICAgICAgIGJvb2wgbV9kaXJlY3Rpb25hbEZvY3VzTmF2aWdhdGlvbiA6IDE7DQogDQogI2lmIFVT
RShTQUZBUklfVEhFTUUpDQogICAgICAgICBzdGF0aWMgYm9vbCBnU2hvdWxkUGFpbnROYXRpdmVD
b250cm9sczsNCkluZGV4OiBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cNCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0tLSBM
YXlvdXRUZXN0cy9DaGFuZ2VMb2cJKHJldmlzaW9uIDM5Mzc3KQ0KKysrIExheW91dFRlc3RzL0No
YW5nZUxvZwkod29ya2luZyBjb3B5KQ0KQEAgLTEsMyArMSwyMiBAQA0KKzIwMDgtMTItMTggIEpv
ZSBMaWdtYW4gIDxqbGlnbWFuQG1pbmRzcHJpbmcuY29tPg0KKw0KKyAgICAgICAgUmV2aWV3ZWQg
YnkgTk9CT0RZIChPT1BTISkuDQorDQorICAgICAgICBBZGQgdGVzdHMgZm9yIGJ1ZyAyMjc0MDog
SXQncyBub3QgcG9zc2libGUgZm9yIGNsaWVudHMgb2YgUVdlYkZyYW1lIHRvIGltcGxlbWVudCBk
aXJlY3Rpb25hbCANCisgICAgICAgIGZvY3VzIG5vZGUgbmF2aWdhdGlvbiANCisgICAgICAgIDxo
dHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjI3NDA+DQorDQorICAgICAg
ICBUaGlzIHRlc3QgbmF2aWdhdGVzIHRoZSA0IGRpcmVjdGlvbnMuIFRoZSBmZWF0dXJlcyBuZWVk
cyB3aWxsIHJlcXVpcmUgc29tZSBwbGF0Zm9ybSBpbXBsZW1lbnRhdGlvbiwgDQorICAgICAgICBz
byB0aGUgdGVzdCBpcyBub3cgc2tpcHBlZCBmb3IgYWxsIHBsYXRmb3Jtcw0KKw0KKyAgICAgICAg
KiBmYXN0L2V2ZW50cy9hcnJvdy1mb2N1c25vZGUtbmF2aWdhdGlvbi5odG1sOiBBZGRlZC4NCisg
ICAgICAgICogcGxhdGZvcm0vZ3RrL1NraXBwZWQ6DQorICAgICAgICAqIHBsYXRmb3JtL21hYy1s
ZW9wYXJkL1NraXBwZWQ6DQorICAgICAgICAqIHBsYXRmb3JtL21hYy10aWdlci9Ta2lwcGVkOg0K
KyAgICAgICAgKiBwbGF0Zm9ybS9tYWMvU2tpcHBlZDoNCisgICAgICAgICogcGxhdGZvcm0vcXQv
U2tpcHBlZDoNCisgICAgICAgICogcGxhdGZvcm0vd2luL1NraXBwZWQ6DQorDQogMjAwOC0xMi0x
OCAgQ2FtZXJvbiBad2FyaWNoICA8endhcmljaEBhcHBsZS5jb20+DQogDQogICAgICAgICBSZXZp
ZXdlZCBieSBHZW9mZiBHYXJlbi4NCkluZGV4OiBMYXlvdXRUZXN0cy9mYXN0L2V2ZW50cy9hcnJv
dy1mb2N1c25vZGUtbmF2aWdhdGlvbi5odG1sDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotLS0gTGF5b3V0VGVzdHMv
ZmFzdC9ldmVudHMvYXJyb3ctZm9jdXNub2RlLW5hdmlnYXRpb24uaHRtbAkocmV2aXNpb24gMCkN
CisrKyBMYXlvdXRUZXN0cy9mYXN0L2V2ZW50cy9hcnJvdy1mb2N1c25vZGUtbmF2aWdhdGlvbi5o
dG1sCShyZXZpc2lvbiAwKQ0KQEAgLTAsMCArMSw1MSBAQA0KKzxzY3JpcHQ+DQorZnVuY3Rpb24g
Zm9jdXNMaXN0ZW5lcihldmVudCkNCit7DQorICAgIGxvZygnZm9jdXNlZCBub2RlOiAnICsgZXZl
bnQudGFyZ2V0Lm5hbWUpOw0KK30NCisNCitmdW5jdGlvbiBhZGRFdmVudExpc3RlbmVycygpDQor
ew0KKyAgICB2YXIgYW5jaG9ycyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdhJyk7
DQorICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYW5jaG9ycy5sZW5ndGg7ICsraSkgew0KKyAgICAg
ICAgYW5jaG9yc1tpXS5hZGRFdmVudExpc3RlbmVyKCdmb2N1cycsIGZvY3VzTGlzdGVuZXIsIGZh
bHNlKTsNCisgICAgfQ0KKyAgICBhbmNob3JzWzBdLmZvY3VzKCk7DQorfQ0KKw0KK2Z1bmN0aW9u
IHRlc3QoKQ0KK3sNCisgICAgaWYgKHdpbmRvdy5sYXlvdXRUZXN0Q29udHJvbGxlcikNCisgICAg
ICAgIGxheW91dFRlc3RDb250cm9sbGVyLmR1bXBBc1RleHQoKTsNCisNCisgICAgYWRkRXZlbnRM
aXN0ZW5lcnMoKTsNCisNCisgICAgbW92ZWZvY3VzKCJSaWdodCIpOw0KKyAgICBtb3ZlZm9jdXMo
IkRvd24iKTsNCisgICAgbW92ZWZvY3VzKCJMZWZ0Iik7DQorICAgIG1vdmVmb2N1cygiVXAiKTsN
Cit9DQorDQorZnVuY3Rpb24gbW92ZWZvY3VzKGtleSkNCit7DQorICAgIHZhciBldmVudCA9IGRv
Y3VtZW50LmNyZWF0ZUV2ZW50KCdLZXlib2FyZEV2ZW50cycpOw0KKyAgICBldmVudC5pbml0S2V5
Ym9hcmRFdmVudCgna2V5ZG93bicsIHRydWUsIHRydWUsIGRvY3VtZW50LmRlZmF1bHRWaWV3LCBr
ZXksIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7DQorICAgIGRvY3VtZW50
LmRpc3BhdGNoRXZlbnQoZXZlbnQpOw0KK30NCisNCitmdW5jdGlvbiBsb2cobXNnKQ0KK3sNCisg
ICAgdmFyIHJlc3VsdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXN1bHQnKTsNCisgICAg
cmVzdWx0LmlubmVySFRNTCA9IHJlc3VsdC5pbm5lckhUTUwgKyBtc2cgKyAiPGJyPiI7DQorDQor
fQ0KKzwvc2NyaXB0Pg0KKzxib2R5IG9ubG9hZD0idGVzdCgpIj4NCitUaGlzIHRlc3RzIHRoYXQg
eW91IGNhbiB1c2UgYXJyb3cga2V5cyB0byBuYXZpZ2F0ZSBieSBmb2N1c2FibGUgZWxlbWVudHMu
PGJyPg0KKzxhIGhyZWY9ImEiIG5hbWU9ImEiPmE8L2E+IDxhIGhyZWY9ImIiIG5hbWU9ImIiPmI8
L2E+IDxicj4NCis8YSBocmVmPSJkIiBuYW1lPSJkIj5jPC9hPiA8YSBocmVmPSJjIiBuYW1lPSJj
Ij5kPC9hPg0KKzxicj4NCis8YnI+DQorVGhlIG9yZGVyIG9mIG5hdmlnYXRpb24gc2hvdWxkIGJl
IGEsIGIsIGMsIGQsIGENCis8ZGl2IGlkPSJyZXN1bHQiPjwvZGl2Pg0KKzwvYm9keT4NCkluZGV4
OiBMYXlvdXRUZXN0cy9wbGF0Zm9ybS9ndGsvU2tpcHBlZA0KPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLS0tIExheW91
dFRlc3RzL3BsYXRmb3JtL2d0ay9Ta2lwcGVkCShyZXZpc2lvbiAzOTM3NykNCisrKyBMYXlvdXRU
ZXN0cy9wbGF0Zm9ybS9ndGsvU2tpcHBlZAkod29ya2luZyBjb3B5KQ0KQEAgLTgyLDYgKzgyLDcg
QEAgZmFzdC9ldmVudHMvYW5jaG9yLWVtcHR5LWZvY3VzLmh0bWwNCiBmYXN0L2V2ZW50cy9hbmNo
b3ItaW1hZ2Utc2Nyb2xsZWQteC15Lmh0bWwNCiBmYXN0L2V2ZW50cy9hcnJvdy1rZXlzLW9uLWJv
ZHkuaHRtbA0KIGZhc3QvZXZlbnRzL2Fycm93LW5hdmlnYXRpb24uaHRtbA0KK2Zhc3QvZXZlbnRz
L2Fycm93LWZvY3Vzbm9kZS1uYXZpZ2F0aW9uLmh0bWwNCiBmYXN0L2V2ZW50cy9hdHRlbXB0LXNj
cm9sbC13aXRoLW5vLXNjcm9sbGJhcnMuaHRtbA0KIGZhc3QvZXZlbnRzL2F1dG9zY3JvbGwtaW4t
dGV4dGZpZWxkLmh0bWwNCiBmYXN0L2V2ZW50cy9hdXRvc2Nyb2xsLW5vbnNjcm9sbGFibGUtaWZy
YW1lLWluLXNjcm9sbGFibGUtZGl2Lmh0bWwNCkluZGV4OiBMYXlvdXRUZXN0cy9wbGF0Zm9ybS9t
YWMtbGVvcGFyZC9Ta2lwcGVkDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotLS0gTGF5b3V0VGVzdHMvcGxhdGZvcm0v
bWFjLWxlb3BhcmQvU2tpcHBlZAkocmV2aXNpb24gMzkzNzcpDQorKysgTGF5b3V0VGVzdHMvcGxh
dGZvcm0vbWFjLWxlb3BhcmQvU2tpcHBlZAkod29ya2luZyBjb3B5KQ0KQEAgLTcsMyArNyw2IEBA
IHN2Zy9jc3MvZ2x5cGgtb3JpZW50YXRpb24tcm91bmRpbmctdGVzdC4NCiANCiAjIDxyZGFyOi8v
cHJvYmxlbS81NTM5ODIyPiBSRUdSRVNTSU9OIChMZW9wYXJkKTogc3ZnL2N1c3RvbS9zdHJva2Ut
d2lkdGgtY2xpY2suc3ZnIHRlc3QgZmFpbGluZw0KIHN2Zy9jdXN0b20vc3Ryb2tlLXdpZHRoLWNs
aWNrLnN2Zw0KKw0KKyMgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTIy
NzQwIFRoaXMgZmVhdHVyZSBzaG91bGQgYmUgZW5hYmxlZCBieSB0aGUgcGxhdGZvcm0NCitmYXN0
L2V2ZW50cy9hcnJvdy1mb2N1c25vZGUtbmF2aWdhdGlvbi5odG1sDQpcIE5vIG5ld2xpbmUgYXQg
ZW5kIG9mIGZpbGUNCkluZGV4OiBMYXlvdXRUZXN0cy9wbGF0Zm9ybS9tYWMtdGlnZXIvU2tpcHBl
ZA0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQ0KLS0tIExheW91dFRlc3RzL3BsYXRmb3JtL21hYy10aWdlci9Ta2lwcGVk
CShyZXZpc2lvbiAzOTM3NykNCisrKyBMYXlvdXRUZXN0cy9wbGF0Zm9ybS9tYWMtdGlnZXIvU2tp
cHBlZAkod29ya2luZyBjb3B5KQ0KQEAgLTIyLDMgKzIyLDYgQEAgaHR0cC90ZXN0cy94bWxodHRw
cmVxdWVzdC91cGxvYWQtb25sb2FkLQ0KIGh0dHAvdGVzdHMveG1saHR0cHJlcXVlc3QvdXBsb2Fk
LW9ubG9hZHN0YXJ0LWV2ZW50Lmh0bWwNCiBodHRwL3Rlc3RzL3htbGh0dHByZXF1ZXN0L3VwbG9h
ZC1vbnByb2dyZXNzLWV2ZW50Lmh0bWwNCiBodHRwL3Rlc3RzL3htbGh0dHByZXF1ZXN0L3VwbG9h
ZC1wcm9ncmVzcy1ldmVudHMuaHRtbA0KKw0KKyMgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hv
d19idWcuY2dpP2lkPTIyNzQwIFRoaXMgZmVhdHVyZSBzaG91bGQgYmUgZW5hYmxlZCBieSB0aGUg
cGxhdGZvcm0NCitmYXN0L2V2ZW50cy9hcnJvdy1mb2N1c25vZGUtbmF2aWdhdGlvbi5odG1sDQpc
IE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUNCkluZGV4OiBMYXlvdXRUZXN0cy9wbGF0Zm9ybS9t
YWMvU2tpcHBlZA0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQ0KLS0tIExheW91dFRlc3RzL3BsYXRmb3JtL21hYy9Ta2lw
cGVkCShyZXZpc2lvbiAzOTM3NykNCisrKyBMYXlvdXRUZXN0cy9wbGF0Zm9ybS9tYWMvU2tpcHBl
ZAkod29ya2luZyBjb3B5KQ0KQEAgLTQ2LDMgKzQ2LDYgQEAgdGFibGVzL21vemlsbGFfZXhwZWN0
ZWRfZmFpbHVyZXMvYnVncy9idQ0KIA0KICMgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19i
dWcuY2dpP2lkPTIxOTEzIFJlcGFpbnQgcGl4ZWwgdGVzdCBmYWlsdXJlDQogZmFzdC9yZXBhaW50
L2JvZHktYmFja2dyb3VuZC1pbWFnZS5odG1sDQorDQorIyBodHRwczovL2J1Z3Mud2Via2l0Lm9y
Zy9zaG93X2J1Zy5jZ2k/aWQ9MjI3NDAgVGhpcyBmZWF0dXJlIHNob3VsZCBiZSBlbmFibGVkIGJ5
IHRoZSBwbGF0Zm9ybQ0KK2Zhc3QvZXZlbnRzL2Fycm93LWZvY3Vzbm9kZS1uYXZpZ2F0aW9uLmh0
bWwNClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQ0KSW5kZXg6IExheW91dFRlc3RzL3BsYXRm
b3JtL3F0L1NraXBwZWQNCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0tLSBMYXlvdXRUZXN0cy9wbGF0Zm9ybS9xdC9T
a2lwcGVkCShyZXZpc2lvbiAzOTM3NykNCisrKyBMYXlvdXRUZXN0cy9wbGF0Zm9ybS9xdC9Ta2lw
cGVkCSh3b3JraW5nIGNvcHkpDQpAQCAtNyw2ICs3LDcgQEAgZWRpdGluZy9zZWxlY3Rpb24vNTM1
NDQ1NS0xLmh0bWwNCiBlZGl0aW5nL3NlbGVjdGlvbi81MzU0NDU1LTIuaHRtbA0KIGVkaXRpbmcv
c2VsZWN0aW9uL2NhcmV0LWFuZC1mb2N1cy1yaW5nLmh0bWwNCiBmYXN0L2V2ZW50cy9wb3B1cC1i
bG9ja2luZy1jbGljay1pbi1pZnJhbWUuaHRtbA0KK2Zhc3QvZXZlbnRzL2Fycm93LWZvY3Vzbm9k
ZS1uYXZpZ2F0aW9uLmh0bWwNCiANCiAjIC0tLS0tLS0tIGNyYXNoZXMNCiBmYXN0L2V2ZW50cy9v
YmpjLWtleWJvYXJkLWV2ZW50LWNyZWF0aW9uLmh0bWwNCkluZGV4OiBMYXlvdXRUZXN0cy9wbGF0
Zm9ybS93aW4vU2tpcHBlZA0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLS0tIExheW91dFRlc3RzL3BsYXRmb3JtL3dp
bi9Ta2lwcGVkCShyZXZpc2lvbiAzOTM3NykNCisrKyBMYXlvdXRUZXN0cy9wbGF0Zm9ybS93aW4v
U2tpcHBlZAkod29ya2luZyBjb3B5KQ0KQEAgLTExNiw2ICsxMTYsOSBAQCBmYXN0L2pzL2tkZS9O
dW1iZXIuaHRtbA0KICM8cmRhcjovL3Byb2JsZW0vNTIyNDI3MT4gU29tZSBMYXlvdXRUZXN0cyBm
YWlsIHdoZW4gbm90IHJ1biBieSB0aGVtc2VsdmVzLg0KIGh0dHAvdGVzdHMvbmF2aWdhdGlvbi9h
bmNob3ItZnJhbWVzLmh0bWwNCiANCisjIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVn
LmNnaT9pZD0yMjc0MCBUaGlzIGZlYXR1cmUgc2hvdWxkIGJlIGVuYWJsZWQgYnkgdGhlIHBsYXRm
b3JtDQorZmFzdC9ldmVudHMvYXJyb3ctZm9jdXNub2RlLW5hdmlnYXRpb24uaHRtbA0KKw0KICMg
Tm8gYnVpbHQtaW4gcGx1Z2luIGluIERSVCA8cmRhcjovL3Byb2JsZW0vNTA3NDQxMT4NCiBwbHVn
aW5zL2NhbGwtYXMtZnVuY3Rpb24tdGVzdC5odG1sDQogcGx1Z2lucy9nZXQtdXJsLXRoYXQtdGhl
LXJlc291cmNlLWxvYWQtZGVsZWdhdGUtd2lsbC1kaXNhbGxvdy5odG1sDQo=
</data>
<flag name="review"
          id="12331"
          type_id="1"
          status="-"
          setter="darin"
    />
          </attachment>
      

    </bug>

</bugzilla>