<?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>106834</bug_id>
          
          <creation_ts>2013-01-14 15:18:42 -0800</creation_ts>
          <short_desc>Add new API for text search in WebKit2</short_desc>
          <delta_ts>2013-01-15 18:05:03 -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>WebKit2</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Enrica Casucci">enrica</reporter>
          <assigned_to name="Enrica Casucci">enrica</assigned_to>
          <cc>andersca</cc>
    
    <cc>benjamin</cc>
    
    <cc>gyuyoung.kim</cc>
    
    <cc>mifenton</cc>
    
    <cc>sam</cc>
    
    <cc>simon.fraser</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>806679</commentid>
    <comment_count>0</comment_count>
    <who name="Enrica Casucci">enrica</who>
    <bug_when>2013-01-14 15:18:42 -0800</bug_when>
    <thetext>This is a new API that implements text search without any user interface and provides all the necessary information to implement a custom UI.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>806680</commentid>
    <comment_count>1</comment_count>
    <who name="Enrica Casucci">enrica</who>
    <bug_when>2013-01-14 15:18:58 -0800</bug_when>
    <thetext>&lt;rdar://problem/12597159&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>806704</commentid>
    <comment_count>2</comment_count>
      <attachid>182642</attachid>
    <who name="Enrica Casucci">enrica</who>
    <bug_when>2013-01-14 15:53:37 -0800</bug_when>
    <thetext>Created attachment 182642
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>806710</commentid>
    <comment_count>3</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2013-01-14 15:55:54 -0800</bug_when>
    <thetext>Attachment 182642 did not pass style-queue:

Failed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;Source/WebCore/ChangeLog&apos;, u&apos;Source/WebCor...&quot; exit_code: 1
Source/WebKit2/WebProcess/WebPage/FindController.h:76:  The parameter name &quot;frame&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit2/WebProcess/WebPage/FindController.h:76:  The parameter name &quot;handle&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit2/UIProcess/API/C/WKPage.h:331:  enum members should use InterCaps with an initial capital letter.  [readability/enum_casing] [4]
Total errors found: 3 in 24 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>806740</commentid>
    <comment_count>4</comment_count>
      <attachid>182642</attachid>
    <who name="EFL EWS Bot">eflews.bot</who>
    <bug_when>2013-01-14 16:22:47 -0800</bug_when>
    <thetext>Comment on attachment 182642
Patch

Attachment 182642 did not pass efl-ews (efl):
Output: http://queues.webkit.org/results/15875707</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>806837</commentid>
    <comment_count>5</comment_count>
      <attachid>182642</attachid>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2013-01-14 17:46:56 -0800</bug_when>
    <thetext>Comment on attachment 182642
Patch

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

No clue about the patch, just some small comments:

&gt; Source/WebCore/page/Page.cpp:575
&gt; +    if (target.isEmpty() || !mainFrame())

It is safe to call Editor::countMatchesForText() with an empty target.

Since it is uncommon, you may not want the branch here.

&gt; Source/WebCore/page/Page.cpp:646
&gt; +        matches += frame-&gt;editor()-&gt;countMatchesForText(target, 0, options, limit ? (limit - matches) : 0, true, 0);

Naming the two null literals would be nice.

&gt; Source/WebKit2/WebProcess/WebPage/FindController.cpp:201
&gt; +    if (string.isEmpty()) {
&gt; +        m_webPage-&gt;send(Messages::WebPageProxy::DidFindStringMatches(string, Vector&lt;Vector&lt;IntRect&gt; &gt;(), 0));
&gt; +        return;
&gt; +    }

I have the feeling this would be better handled on the WebPageProxy to avoid a round trip by the WebProcess.

&gt; Source/WebKit2/WebProcess/WebPage/FindController.cpp:210
&gt; +    if (m_findMatches.isEmpty()) {
&gt; +        m_webPage-&gt;send(Messages::WebPageProxy::DidFindStringMatches(string, Vector&lt;Vector&lt;IntRect&gt; &gt;(), 0));
&gt; +        return;
&gt; +    }

Is this branch really needed? Shouldn&apos;t the code bellow give you the exact same outcome?

&gt; Source/WebKit2/WebProcess/WebPage/FindController.cpp:285
&gt; +    Frame* frame = m_findMatches[matchIndex]-&gt;startContainer()-&gt;document()-&gt;frame();
&gt; +    if (!frame)
&gt; +        return;
&gt; +    frame-&gt;selection()-&gt;setSelection(VisibleSelection(m_findMatches[matchIndex].get()));

if (Frame* frame = m_findMatches[matchIndex]-&gt;startContainer()-&gt;document()-&gt;frame())
    frame-&gt;selection()-&gt;setSelection(VisibleSelection(m_findMatches[matchIndex].get()));

?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>807360</commentid>
    <comment_count>6</comment_count>
      <attachid>182642</attachid>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2013-01-15 09:10:15 -0800</bug_when>
    <thetext>Comment on attachment 182642
Patch

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

It&apos;s mostly good but I&apos;d like to see one more round.

&gt; Source/WebCore/editing/Editor.cpp:2745
&gt; +unsigned Editor::countMatchesForText(const String&amp; target, Range* range, FindOptions options, unsigned limit, bool markMatches, Vector&lt;RefPtr&lt;Range&gt; &gt;* matches)

Could Range* be a const Range*, to make it clear that it&apos;s an &quot;in&quot; param and unchanged by this function?

&gt; Source/WebCore/page/Page.cpp:579
&gt; +    Frame* selectedFrame = 0;

I think this would be clearer as frameWithSelection.

&gt; Source/WebCore/page/Page.cpp:585
&gt; +    do {
&gt; +        frame-&gt;editor()-&gt;countMatchesForText(target, 0, options, limit ? (limit - matchRanges-&gt;size()) : 0, true, matchRanges);
&gt; +        if (frame-&gt;selection()-&gt;isRange())
&gt; +            selectedFrame = frame;
&gt; +        frame = incrementFrame(frame, true, false);
&gt; +    } while (frame);

frame = incrementFrame(frame, true, false); is pretty unreadable. I think it would be clearer to use the FrameTree functions directly in a for loop.

&gt; Source/WebCore/page/Page.cpp:599
&gt; +        for (size_t i = 0; i &lt; matchRanges-&gt;size(); ++i) {
&gt; +            ExceptionCode ec;
&gt; +            if (selectedRange-&gt;compareBoundaryPoints(Range::START_TO_END, matchRanges-&gt;at(i).get(), ec) &lt; 0) {
&gt; +                indexForSelection = i;
&gt; +                break;
&gt; +            }
&gt; +        }

Not sure what this is doing. I&apos;m confused by the fact that matchRanges may contain Ranges from different frames. Why compareBoundaryPoints() &lt; 0?

&gt; Source/WebCore/page/Page.h:239
&gt; +        void findStringMatchingRanges(const String&amp;, FindOptions, int maxCount, Vector&lt;RefPtr&lt;Range&gt; &gt;*, int&amp; indexForSelection);

indexForSelection is an index into the Vector&lt;RefPtr&lt;Range&gt; &gt;? Would be nice to clarify that with a comment or clearer naming.

&gt; Source/WebKit2/UIProcess/WebFindClient.h:49
&gt; +    void didFindStringMatches(WebPageProxy*, const String&amp;, ImmutableArray*, int);
&gt; +    void didGetImageForMatchResult(WebPageProxy*, WebImage*, uint32_t);

Why int for one and uint32_t for the other? What does this index mean?

&gt; Source/WebKit2/UIProcess/API/C/WKPage.h:469
&gt;  WK_EXPORT void WKPageCountStringMatches(WKPageRef page, WKStringRef string, WKFindOptions findOptions, unsigned maxMatchCount);
&gt; +WK_EXPORT void WKPageFindStringMatches(WKPageRef page, WKStringRef string, WKFindOptions findOptions, unsigned maxMatchCount);

The fact that these have the same signature makes me wonder if we should just piggyback on WKPageCountStringMatches, and use a WKFindOption, or presence of a FindMatchesClient, to control the behavior?

&gt; Source/WebKit2/WebProcess/WebPage/FindController.cpp:271
&gt; +    if (!getFindIndicatorBitmapAndRect(frame, handle, selectionRect))
&gt; +        return;

Don&apos;t you want to reset the selection before returning, and maybe send the didGetImage message with a null image?

&gt; Source/WebKit2/WebProcess/WebPage/FindController.h:55
&gt; +    void findStringMatches(const String&amp;, FindOptions, unsigned maxMatchCount);
&gt; +    void getImageForFindMatch(uint32_t matchIndex);

Why the different unsigned types?

&gt; Source/WebKit2/WebProcess/WebPage/FindController.h:88
&gt; +    Vector&lt;RefPtr&lt;WebCore::Range&gt; &gt; m_findMatches;

How long-lived is the FindController? Is it OK to hold onto these Ranges for its lifetime? Should hideFindUI or something clear them?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>807425</commentid>
    <comment_count>7</comment_count>
      <attachid>182642</attachid>
    <who name="Enrica Casucci">enrica</who>
    <bug_when>2013-01-15 10:26:51 -0800</bug_when>
    <thetext>Comment on attachment 182642
Patch

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

I&apos;ll post a new patch that addresses the feedback.

&gt;&gt; Source/WebCore/editing/Editor.cpp:2745
&gt;&gt; +unsigned Editor::countMatchesForText(const String&amp; target, Range* range, FindOptions options, unsigned limit, bool markMatches, Vector&lt;RefPtr&lt;Range&gt; &gt;* matches)
&gt; 
&gt; Could Range* be a const Range*, to make it clear that it&apos;s an &quot;in&quot; param and unchanged by this function?

Sure. It was already like this I just added the matches parameter.

&gt;&gt; Source/WebCore/page/Page.cpp:575
&gt;&gt; +    if (target.isEmpty() || !mainFrame())
&gt; 
&gt; It is safe to call Editor::countMatchesForText() with an empty target.
&gt; 
&gt; Since it is uncommon, you may not want the branch here.

Ok.

&gt;&gt; Source/WebCore/page/Page.cpp:579
&gt;&gt; +    Frame* selectedFrame = 0;
&gt; 
&gt; I think this would be clearer as frameWithSelection.

No problem.

&gt;&gt; Source/WebCore/page/Page.cpp:585
&gt;&gt; +    } while (frame);
&gt; 
&gt; frame = incrementFrame(frame, true, false); is pretty unreadable. I think it would be clearer to use the FrameTree functions directly in a for loop.

I used the same style used in findString that used incrementFrame.

&gt;&gt; Source/WebCore/page/Page.cpp:599
&gt;&gt; +        }
&gt; 
&gt; Not sure what this is doing. I&apos;m confused by the fact that matchRanges may contain Ranges from different frames. Why compareBoundaryPoints() &lt; 0?

I want to return the first matching range after the current selection.

&gt;&gt; Source/WebCore/page/Page.cpp:646
&gt;&gt; +        matches += frame-&gt;editor()-&gt;countMatchesForText(target, 0, options, limit ? (limit - matches) : 0, true, 0);
&gt; 
&gt; Naming the two null literals would be nice.

These are two null pointers. What can I do here?

&gt;&gt; Source/WebCore/page/Page.h:239
&gt;&gt; +        void findStringMatchingRanges(const String&amp;, FindOptions, int maxCount, Vector&lt;RefPtr&lt;Range&gt; &gt;*, int&amp; indexForSelection);
&gt; 
&gt; indexForSelection is an index into the Vector&lt;RefPtr&lt;Range&gt; &gt;? Would be nice to clarify that with a comment or clearer naming.

This value represents the default selected find match. This is 0 if there is no user selection or it is the index of the first matching range after the user selection. If there are no matching ranges after the user selection the value is -1. There is an explanation in the WebKit2/ChangeLog but I&apos;ll add a comment in the code as well.

&gt;&gt; Source/WebKit2/UIProcess/WebFindClient.h:49
&gt;&gt; +    void didGetImageForMatchResult(WebPageProxy*, WebImage*, uint32_t);
&gt; 
&gt; Why int for one and uint32_t for the other? What does this index mean?

I use int for the case where the value can be -1 (see comment above) . When the value is passed in to indicate a find match it can never be negative.

&gt;&gt; Source/WebKit2/UIProcess/API/C/WKPage.h:331
&gt;&gt; +enum { kWKPageFindMatchesClientCurrentVersion = 0 };
&gt; 
&gt; enum members should use InterCaps with an initial capital letter.  [readability/enum_casing] [4]

I followed the style of the other existing enums in this file.

&gt;&gt; Source/WebKit2/UIProcess/API/C/WKPage.h:469
&gt;&gt; +WK_EXPORT void WKPageFindStringMatches(WKPageRef page, WKStringRef string, WKFindOptions findOptions, unsigned maxMatchCount);
&gt; 
&gt; The fact that these have the same signature makes me wonder if we should just piggyback on WKPageCountStringMatches, and use a WKFindOption, or presence of a FindMatchesClient, to control the behavior?

I thought about this, but I decided against, since this API also requires a different client to be used to receive callbacks.

&gt;&gt; Source/WebKit2/WebProcess/WebPage/FindController.cpp:201
&gt;&gt; +    }
&gt; 
&gt; I have the feeling this would be better handled on the WebPageProxy to avoid a round trip by the WebProcess.

Sure.

&gt;&gt; Source/WebKit2/WebProcess/WebPage/FindController.cpp:210
&gt;&gt; +    }
&gt; 
&gt; Is this branch really needed? Shouldn&apos;t the code bellow give you the exact same outcome?

Yes.

&gt;&gt; Source/WebKit2/WebProcess/WebPage/FindController.cpp:271
&gt;&gt; +        return;
&gt; 
&gt; Don&apos;t you want to reset the selection before returning, and maybe send the didGetImage message with a null image?

Makes sense.

&gt;&gt; Source/WebKit2/WebProcess/WebPage/FindController.cpp:285
&gt;&gt; +    frame-&gt;selection()-&gt;setSelection(VisibleSelection(m_findMatches[matchIndex].get()));
&gt; 
&gt; if (Frame* frame = m_findMatches[matchIndex]-&gt;startContainer()-&gt;document()-&gt;frame())
&gt;     frame-&gt;selection()-&gt;setSelection(VisibleSelection(m_findMatches[matchIndex].get()));
&gt; 
&gt; ?

Not sure I understand what you mean here...

&gt;&gt; Source/WebKit2/WebProcess/WebPage/FindController.h:55
&gt;&gt; +    void getImageForFindMatch(uint32_t matchIndex);
&gt; 
&gt; Why the different unsigned types?

See my comment above.

&gt;&gt;&gt; Source/WebKit2/WebProcess/WebPage/FindController.h:76
&gt;&gt;&gt; +    bool getFindIndicatorBitmapAndRect(WebCore::Frame* frame, ShareableBitmap::Handle&amp; handle, WebCore::IntRect&amp; selectionRect);
&gt;&gt; 
&gt;&gt; The parameter name &quot;frame&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
&gt; 
&gt; The parameter name &quot;handle&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]

Already fixed.

&gt;&gt; Source/WebKit2/WebProcess/WebPage/FindController.h:88
&gt;&gt; +    Vector&lt;RefPtr&lt;WebCore::Range&gt; &gt; m_findMatches;
&gt; 
&gt; How long-lived is the FindController? Is it OK to hold onto these Ranges for its lifetime? Should hideFindUI or something clear them?

Yes. Its lifetime is the same as the page.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>807487</commentid>
    <comment_count>8</comment_count>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2013-01-15 11:14:03 -0800</bug_when>
    <thetext>(In reply to comment #7)

&gt; &gt;&gt; Source/WebCore/page/Page.h:239
&gt; &gt;&gt; +        void findStringMatchingRanges(const String&amp;, FindOptions, int maxCount, Vector&lt;RefPtr&lt;Range&gt; &gt;*, int&amp; indexForSelection);
&gt; &gt; 
&gt; &gt; indexForSelection is an index into the Vector&lt;RefPtr&lt;Range&gt; &gt;? Would be nice to clarify that with a comment or clearer naming.
&gt; 
&gt; This value represents the default selected find match. This is 0 if there is no user selection 
&gt; &gt;&gt; Source/WebKit2/WebProcess/WebPage/FindController.h:88
&gt; &gt;&gt; +    Vector&lt;RefPtr&lt;WebCore::Range&gt; &gt; m_findMatches;
&gt; &gt; 
&gt; &gt; How long-lived is the FindController? Is it OK to hold onto these Ranges for its lifetime? Should hideFindUI or something clear them?
&gt; 
&gt; Yes. Its lifetime is the same as the page.

That worries me a bit. I think we should try to clear these Ranges when the is done finished. Otherwise they might entrain expensive Nodes (e.g. video element) for a long time.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>807489</commentid>
    <comment_count>9</comment_count>
    <who name="Enrica Casucci">enrica</who>
    <bug_when>2013-01-15 11:16:28 -0800</bug_when>
    <thetext>(In reply to comment #8)
&gt; (In reply to comment #7)
&gt; 
&gt; &gt; &gt;&gt; Source/WebCore/page/Page.h:239
&gt; &gt; &gt;&gt; +        void findStringMatchingRanges(const String&amp;, FindOptions, int maxCount, Vector&lt;RefPtr&lt;Range&gt; &gt;*, int&amp; indexForSelection);
&gt; &gt; &gt; 
&gt; &gt; &gt; indexForSelection is an index into the Vector&lt;RefPtr&lt;Range&gt; &gt;? Would be nice to clarify that with a comment or clearer naming.
&gt; &gt; 
&gt; &gt; This value represents the default selected find match. This is 0 if there is no user selection 
&gt; &gt; &gt;&gt; Source/WebKit2/WebProcess/WebPage/FindController.h:88
&gt; &gt; &gt;&gt; +    Vector&lt;RefPtr&lt;WebCore::Range&gt; &gt; m_findMatches;
&gt; &gt; &gt; 
&gt; &gt; &gt; How long-lived is the FindController? Is it OK to hold onto these Ranges for its lifetime? Should hideFindUI or something clear them?
&gt; &gt; 
&gt; &gt; Yes. Its lifetime is the same as the page.
&gt; 
&gt; That worries me a bit. I think we should try to clear these Ranges when the is done finished. Otherwise they might entrain expensive Nodes (e.g. video element) for a long time.

Sorry, maybe I wasn&apos;t clear enough. The ranges are clears whenever we call WKPageHideFindUI, which signals we are done with search.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>807515</commentid>
    <comment_count>10</comment_count>
      <attachid>182817</attachid>
    <who name="Enrica Casucci">enrica</who>
    <bug_when>2013-01-15 11:36:15 -0800</bug_when>
    <thetext>Created attachment 182817
Patch2</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>807520</commentid>
    <comment_count>11</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2013-01-15 11:41:56 -0800</bug_when>
    <thetext>Attachment 182817 did not pass style-queue:

Failed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;Source/WebCore/ChangeLog&apos;, u&apos;Source/WebCor...&quot; exit_code: 1
Source/WebKit2/UIProcess/WebPageProxy.cpp:1694:  Missing space after ,  [whitespace/comma] [3]
Source/WebKit2/UIProcess/API/C/WKPage.h:331:  enum members should use InterCaps with an initial capital letter.  [readability/enum_casing] [4]
Total errors found: 2 in 24 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>807648</commentid>
    <comment_count>12</comment_count>
      <attachid>182817</attachid>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2013-01-15 13:40:09 -0800</bug_when>
    <thetext>Comment on attachment 182817
Patch2

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

&gt; Source/WebCore/page/Page.cpp:578
&gt; +    // find all the Ranges for the matching text.
&gt; +    // Upon return, indexForSelection will be one of the following:
&gt; +    // 0 if there is no user selection
&gt; +    // the index of the first range after the user selection
&gt; +    // -1 if there is no matching text after the user selection.

I think this comment is more appropriate for the header. You could use an enum for the special values.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>807662</commentid>
    <comment_count>13</comment_count>
      <attachid>182817</attachid>
    <who name="EFL EWS Bot">eflews.bot</who>
    <bug_when>2013-01-15 13:51:11 -0800</bug_when>
    <thetext>Comment on attachment 182817
Patch2

Attachment 182817 did not pass efl-ews (efl):
Output: http://queues.webkit.org/results/15873984</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>807721</commentid>
    <comment_count>14</comment_count>
    <who name="Enrica Casucci">enrica</who>
    <bug_when>2013-01-15 15:03:08 -0800</bug_when>
    <thetext>Committed revision 139796.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>807731</commentid>
    <comment_count>15</comment_count>
      <attachid>182817</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2013-01-15 15:16:54 -0800</bug_when>
    <thetext>Comment on attachment 182817
Patch2

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

&gt; Source/WebKit2/UIProcess/WebPageProxy.cpp:3069
&gt; +void WebPageProxy::didFindStringMatches(const String&amp; string, Vector&lt;Vector&lt;WebCore::IntRect&gt; &gt; matchRects, int32_t firstIndexAfterSelection)

Normally we would pass a const Vector&amp; rather than a Vector to a function like this; that avoids one additional unwanted copy of the vector.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>807881</commentid>
    <comment_count>16</comment_count>
    <who name="Gyuyoung Kim">gyuyoung.kim</who>
    <bug_when>2013-01-15 18:05:03 -0800</bug_when>
    <thetext>Fix efl port build break on http://trac.webkit.org/changeset/139816</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>182642</attachid>
            <date>2013-01-14 15:53:37 -0800</date>
            <delta_ts>2013-01-15 11:36:15 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>findAPI.txt</filename>
            <type>text/plain</type>
            <size>48070</size>
            <attacher name="Enrica Casucci">enrica</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDEzOTY3NSkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDMwIEBACisyMDEzLTAxLTE0ICBFbnJpY2Eg
Q2FzdWNjaSAgPGVucmljYUBhcHBsZS5jb20+CisKKyAgICAgICAgQWRkIGEgbmV3IHNldCBvZiBX
ZWJLaXQyIEFQSXMgZm9yIHRleHQgc2VhcmNoIGFuZAorICAgICAgICBzZWFyY2ggcmVzdWx0cyBt
YW5hZ2VtZW50LgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/
aWQ9MTA2ODM0LgorICAgICAgICA8cmRhcjovL3Byb2JsZW0vMTI1OTcxNTk+CisKKyAgICAgICAg
UmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisgICAgICAgIAorICAgICAgICBBZGRpbmcgbmV3
IEFQSSB0byBwZXJmb3JtIHRleHQgc2VhcmNoIGluIFdlYktpdDIgd2l0aG91dCB1c2luZworICAg
ICAgICB0aGUgc3RvY2sgVUkuIFRoZSBuZXcgaW50ZXJmYWNlIHByb3ZpZGVzIGFsbCB0aGUgaW5m
b3JtYXRpb24KKyAgICAgICAgbmVjZXNzYXJ5IHRvIHdyaXRlIGEgY3VzdG9tIFVJIGZvciBzZWFy
Y2guCisKKyAgICAgICAgQWRkZWQgbmV3IFRleHRXZWJLaXRBUEkgdGVzdC4KKworICAgICAgICAq
IFdlYkNvcmUuZXhwLmluOiBBZGRlZCBuZXcgZXhwb3J0ZWQgbWV0aG9kcy4KKyAgICAgICAgKiBl
ZGl0aW5nL0VkaXRvci5jcHA6CisgICAgICAgIChXZWJDb3JlOjpFZGl0b3I6OmNvdW50TWF0Y2hl
c0ZvclRleHQpOiBBZGRlZCBuZXcgcGFyYW1ldGVyIHRvIHN0b3JlCisgICAgICAgIGFsbCB0aGUg
cmFuZ2VzIHJlbGF0aXZlIHRvIHRoZSBtYXRjaGVzIGZvdW5kLgorICAgICAgICAqIGVkaXRpbmcv
RWRpdG9yLmg6IE1vZGlmaWVkIHRoZSBpbnRlcmZhY2Ugb2YgY291bnRNYXRjaGVzRm9yVGV4dCBh
bmQgcmVtb3ZlZAorICAgICAgICB0aGUgb3RoZXIgZGVmaW5pdGlvbiBvZiBjb3VudE1hdGNoZXNG
b3JUZXh0IHdpdGggYSBkaWZmZXJlbnQgc2lnbmF0dXJlLgorICAgICAgICAqIHBhZ2UvUGFnZS5j
cHA6CisgICAgICAgIChXZWJDb3JlOjpQYWdlOjpmaW5kU3RyaW5nTWF0Y2hpbmdSYW5nZXMpOiBB
ZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlBhZ2U6Om1hcmtBbGxNYXRjaGVzRm9yVGV4dCk6IENo
YW5nZWQgdG8gdXNlIHRoZSBuZXcgdW5pZmllZAorICAgICAgICBjb3VudE1hdGNoZXNGb3JUZXh0
LgorICAgICAgICAqIHBhZ2UvUGFnZS5oOgorCiAyMDEzLTAxLTE0ICBIdWFuZyBEb25nc3VuZyAg
PGx1eHRlbGxhQGNvbXBhbnkxMDAubmV0PgogCiAgICAgICAgIFtUZXhNYXBdIFVzZSBhIHByZW11
bGlwbGllZCBjb2xvciBpbiBUZXh0dXJlTWFwcGVyR0wuCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9X
ZWJDb3JlLmV4cC5pbgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9XZWJDb3JlLmV4cC5p
bgkocmV2aXNpb24gMTM5NjM1KQorKysgU291cmNlL1dlYkNvcmUvV2ViQ29yZS5leHAuaW4JKHdv
cmtpbmcgY29weSkKQEAgLTc2Miw2ICs3NjIsNyBAQCBfX1pON1dlYkNvcmU0UGFnZTIxbWFya0Fs
bE1hdGNoZXNGb3JUZXh0CiBfX1pON1dlYkNvcmU0UGFnZTIyYWxsVmlzaXRlZFN0YXRlQ2hhbmdl
ZEVQTlNfOVBhZ2VHcm91cEUKIF9fWk43V2ViQ29yZTRQYWdlMjJub25GYXN0U2Nyb2xsYWJsZVJl
Y3RzRVBLTlNfNUZyYW1lRQogX19aTjdXZWJDb3JlNFBhZ2UyM2NsZWFyVW5kb1JlZG9PcGVyYXRp
b25zRXYKK19fWk43V2ViQ29yZTRQYWdlMjRmaW5kU3RyaW5nTWF0Y2hpbmdSYW5nZXNFUktOM1dU
RjZTdHJpbmdFamlQTlMxXzZWZWN0b3JJTlMxXzZSZWZQdHJJTlNfNVJhbmdlRUVFTG0wRUVFUmkK
IF9fWk43V2ViQ29yZTRQYWdlMjRyZXN1bWVTY3JpcHRlZEFuaW1hdGlvbnNFdgogX19aTjdXZWJD
b3JlNFBhZ2UyNHNjcm9sbGluZ1N0YXRlVHJlZUFzVGV4dEV2CiBfX1pON1dlYkNvcmU0UGFnZTI1
c3VzcGVuZFNjcmlwdGVkQW5pbWF0aW9uc0V2CkBAIC04MzgsNyArODM5LDYgQEAgX19aTjdXZWJD
b3JlNkVkaXRvcjE3aW5zZXJ0T3JkZXJlZExpc3RFdgogX19aTjdXZWJDb3JlNkVkaXRvcjE4Y29u
ZmlybUNvbXBvc2l0aW9uRVJLTjNXVEY2U3RyaW5nRQogX19aTjdXZWJDb3JlNkVkaXRvcjE4Y29u
ZmlybUNvbXBvc2l0aW9uRXYKIF9fWk43V2ViQ29yZTZFZGl0b3IxOGluc2VydERpY3RhdGVkVGV4
dEVSS04zV1RGNlN0cmluZ0VSS05TMV82VmVjdG9ySU5TXzIwRGljdGF0aW9uQWx0ZXJuYXRpdmVF
TG0wRUVFUE5TXzVFdmVudEUKLV9fWk43V2ViQ29yZTZFZGl0b3IxOWNvdW50TWF0Y2hlc0ZvclRl
eHRFUktOM1dURjZTdHJpbmdFUE5TXzVSYW5nZUVqamIKIF9fWk43V2ViQ29yZTZFZGl0b3IxOWRl
bGV0ZVdpdGhEaXJlY3Rpb25FTlNfMThTZWxlY3Rpb25EaXJlY3Rpb25FTlNfMTVUZXh0R3JhbnVs
YXJpdHlFYmIKIF9fWk43V2ViQ29yZTZFZGl0b3IxOWluc2VydFVub3JkZXJlZExpc3RFdgogX19a
TjdXZWJDb3JlNkVkaXRvcjIxYXBwbHlTdHlsZVRvU2VsZWN0aW9uRVBOU18xNlN0eWxlUHJvcGVy
dHlTZXRFTlNfMTBFZGl0QWN0aW9uRQpAQCAtODY4LDYgKzg2OCw3IEBAIF9fWk43V2ViQ29yZTZF
ZGl0b3I2aW5kZW50RXYKIF9fWk43V2ViQ29yZTZFZGl0b3I3Q29tbWFuZEMxRXYKIF9fWk43V2Vi
Q29yZTZFZGl0b3I3Y29tbWFuZEVSS04zV1RGNlN0cmluZ0UKIF9fWk43V2ViQ29yZTZFZGl0b3I3
b3V0ZGVudEV2CitfX1pON1dlYkNvcmU2RWRpdG9yMTljb3VudE1hdGNoZXNGb3JUZXh0RVJLTjNX
VEY2U3RyaW5nRVBOU181UmFuZ2VFampiUE5TMV82VmVjdG9ySU5TMV82UmVmUHRySVM1X0VFTG0w
RUVFCiBfX1pON1dlYkNvcmU2SlNOb2RlNnNfaW5mb0UKIF9fWk43V2ViQ29yZTZSZWdpb241dW5p
dGVFUktTMF8KIF9fWk43V2ViQ29yZTZSZWdpb244c3VidHJhY3RFUktTMF8KSW5kZXg6IFNvdXJj
ZS9XZWJDb3JlL2VkaXRpbmcvRWRpdG9yLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29y
ZS9lZGl0aW5nL0VkaXRvci5jcHAJKHJldmlzaW9uIDEzOTYzNSkKKysrIFNvdXJjZS9XZWJDb3Jl
L2VkaXRpbmcvRWRpdG9yLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjc0MiwxMiArMjc0Miw3IEBA
IHN0YXRpYyBib29sIGlzRnJhbWVJblJhbmdlKEZyYW1lKiBmcmFtZSwKICAgICByZXR1cm4gaW5S
YW5nZTsKIH0KIAotdW5zaWduZWQgRWRpdG9yOjpjb3VudE1hdGNoZXNGb3JUZXh0KGNvbnN0IFN0
cmluZyYgdGFyZ2V0LCBGaW5kT3B0aW9ucyBvcHRpb25zLCB1bnNpZ25lZCBsaW1pdCwgYm9vbCBt
YXJrTWF0Y2hlcykKLXsKLSAgICByZXR1cm4gY291bnRNYXRjaGVzRm9yVGV4dCh0YXJnZXQsIDAs
IG9wdGlvbnMsIGxpbWl0LCBtYXJrTWF0Y2hlcyk7Ci19Ci0KLXVuc2lnbmVkIEVkaXRvcjo6Y291
bnRNYXRjaGVzRm9yVGV4dChjb25zdCBTdHJpbmcmIHRhcmdldCwgUmFuZ2UqIHJhbmdlLCBGaW5k
T3B0aW9ucyBvcHRpb25zLCB1bnNpZ25lZCBsaW1pdCwgYm9vbCBtYXJrTWF0Y2hlcykKK3Vuc2ln
bmVkIEVkaXRvcjo6Y291bnRNYXRjaGVzRm9yVGV4dChjb25zdCBTdHJpbmcmIHRhcmdldCwgUmFu
Z2UqIHJhbmdlLCBGaW5kT3B0aW9ucyBvcHRpb25zLCB1bnNpZ25lZCBsaW1pdCwgYm9vbCBtYXJr
TWF0Y2hlcywgVmVjdG9yPFJlZlB0cjxSYW5nZT4gPiogbWF0Y2hlcykKIHsKICAgICBpZiAodGFy
Z2V0LmlzRW1wdHkoKSkKICAgICAgICAgcmV0dXJuIDA7CkBAIC0yNzc5LDYgKzI3NzQsOSBAQCB1
bnNpZ25lZCBFZGl0b3I6OmNvdW50TWF0Y2hlc0ZvclRleHQoY29uCiAgICAgICAgIH0KIAogICAg
ICAgICArK21hdGNoQ291bnQ7CisgICAgICAgIGlmIChtYXRjaGVzKQorICAgICAgICAgICAgbWF0
Y2hlcy0+YXBwZW5kKHJlc3VsdFJhbmdlKTsKKyAgICAgICAgCiAgICAgICAgIGlmIChtYXJrTWF0
Y2hlcykKICAgICAgICAgICAgIG1fZnJhbWUtPmRvY3VtZW50KCktPm1hcmtlcnMoKS0+YWRkTWFy
a2VyKHJlc3VsdFJhbmdlLmdldCgpLCBEb2N1bWVudE1hcmtlcjo6VGV4dE1hdGNoKTsKIApAQCAt
Mjc5Nyw3ICsyNzk1LDcgQEAgdW5zaWduZWQgRWRpdG9yOjpjb3VudE1hdGNoZXNGb3JUZXh0KGNv
bgogICAgICAgICAgICAgc2VhcmNoUmFuZ2UtPnNldEVuZChzaGFkb3dUcmVlUm9vdCwgc2hhZG93
VHJlZVJvb3QtPmNoaWxkTm9kZUNvdW50KCksIGV4Y2VwdGlvbik7CiAgICAgfSB3aGlsZSAodHJ1
ZSk7CiAKLSAgICBpZiAobWFya01hdGNoZXMpIHsKKyAgICBpZiAobWFya01hdGNoZXMgfHwgbWF0
Y2hlcykgewogICAgICAgICAvLyBEbyBhICJmYWtlIiBwYWludCBpbiBvcmRlciB0byBleGVjdXRl
IHRoZSBjb2RlIHRoYXQgY29tcHV0ZXMgdGhlIHJlbmRlcmVkIHJlY3QgZm9yIGVhY2ggdGV4dCBt
YXRjaC4KICAgICAgICAgaWYgKG1fZnJhbWUtPnZpZXcoKSAmJiBtX2ZyYW1lLT5jb250ZW50UmVu
ZGVyZXIoKSkgewogICAgICAgICAgICAgbV9mcmFtZS0+ZG9jdW1lbnQoKS0+dXBkYXRlTGF5b3V0
KCk7IC8vIEVuc3VyZSBsYXlvdXQgaXMgdXAgdG8gZGF0ZS4KSW5kZXg6IFNvdXJjZS9XZWJDb3Jl
L2VkaXRpbmcvRWRpdG9yLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvZWRpdGluZy9F
ZGl0b3IuaAkocmV2aXNpb24gMTM5NjM1KQorKysgU291cmNlL1dlYkNvcmUvZWRpdGluZy9FZGl0
b3IuaAkod29ya2luZyBjb3B5KQpAQCAtMzYxLDggKzM2MSw3IEBAIHB1YmxpYzoKIAogICAgIHZv
aWQgcmVzcG9uZFRvQ2hhbmdlZFNlbGVjdGlvbihjb25zdCBWaXNpYmxlU2VsZWN0aW9uJiBvbGRT
ZWxlY3Rpb24sIEZyYW1lU2VsZWN0aW9uOjpTZXRTZWxlY3Rpb25PcHRpb25zKTsKICAgICBib29s
IHNob3VsZENoYW5nZVNlbGVjdGlvbihjb25zdCBWaXNpYmxlU2VsZWN0aW9uJiBvbGRTZWxlY3Rp
b24sIGNvbnN0IFZpc2libGVTZWxlY3Rpb24mIG5ld1NlbGVjdGlvbiwgRUFmZmluaXR5LCBib29s
IHN0aWxsU2VsZWN0aW5nKSBjb25zdDsKLSAgICB1bnNpZ25lZCBjb3VudE1hdGNoZXNGb3JUZXh0
KGNvbnN0IFN0cmluZyYsIEZpbmRPcHRpb25zLCB1bnNpZ25lZCBsaW1pdCwgYm9vbCBtYXJrTWF0
Y2hlcyk7Ci0gICAgdW5zaWduZWQgY291bnRNYXRjaGVzRm9yVGV4dChjb25zdCBTdHJpbmcmLCBS
YW5nZSosIEZpbmRPcHRpb25zLCB1bnNpZ25lZCBsaW1pdCwgYm9vbCBtYXJrTWF0Y2hlcyk7Cisg
ICAgdW5zaWduZWQgY291bnRNYXRjaGVzRm9yVGV4dChjb25zdCBTdHJpbmcmLCBSYW5nZSosIEZp
bmRPcHRpb25zLCB1bnNpZ25lZCBsaW1pdCwgYm9vbCBtYXJrTWF0Y2hlcywgVmVjdG9yPFJlZlB0
cjxSYW5nZT4gPiopOwogICAgIGJvb2wgbWFya2VkVGV4dE1hdGNoZXNBcmVIaWdobGlnaHRlZCgp
IGNvbnN0OwogICAgIHZvaWQgc2V0TWFya2VkVGV4dE1hdGNoZXNBcmVIaWdobGlnaHRlZChib29s
KTsKIApJbmRleDogU291cmNlL1dlYkNvcmUvcGFnZS9QYWdlLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvV2ViQ29yZS9wYWdlL1BhZ2UuY3BwCShyZXZpc2lvbiAxMzk2MzUpCisrKyBTb3VyY2Uv
V2ViQ29yZS9wYWdlL1BhZ2UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01NjksNiArNTY5LDM3IEBA
IGJvb2wgUGFnZTo6ZmluZFN0cmluZyhjb25zdCBTdHJpbmcmIHRhcmcKICAgICByZXR1cm4gZmFs
c2U7CiB9CiAKK3ZvaWQgUGFnZTo6ZmluZFN0cmluZ01hdGNoaW5nUmFuZ2VzKGNvbnN0IFN0cmlu
ZyYgdGFyZ2V0LCBGaW5kT3B0aW9ucyBvcHRpb25zLCBpbnQgbGltaXQsIFZlY3RvcjxSZWZQdHI8
UmFuZ2U+ID4qIG1hdGNoUmFuZ2VzLCBpbnQmIGluZGV4Rm9yU2VsZWN0aW9uKQoreworICAgIGlu
ZGV4Rm9yU2VsZWN0aW9uID0gMDsKKyAgICBpZiAodGFyZ2V0LmlzRW1wdHkoKSB8fCAhbWFpbkZy
YW1lKCkpCisgICAgICAgIHJldHVybjsKKworICAgIEZyYW1lKiBmcmFtZSA9IG1haW5GcmFtZSgp
OworICAgIEZyYW1lKiBzZWxlY3RlZEZyYW1lID0gMDsKKyAgICBkbyB7CisgICAgICAgIGZyYW1l
LT5lZGl0b3IoKS0+Y291bnRNYXRjaGVzRm9yVGV4dCh0YXJnZXQsIDAsIG9wdGlvbnMsIGxpbWl0
ID8gKGxpbWl0IC0gbWF0Y2hSYW5nZXMtPnNpemUoKSkgOiAwLCB0cnVlLCBtYXRjaFJhbmdlcyk7
CisgICAgICAgIGlmIChmcmFtZS0+c2VsZWN0aW9uKCktPmlzUmFuZ2UoKSkKKyAgICAgICAgICAg
IHNlbGVjdGVkRnJhbWUgPSBmcmFtZTsKKyAgICAgICAgZnJhbWUgPSBpbmNyZW1lbnRGcmFtZShm
cmFtZSwgdHJ1ZSwgZmFsc2UpOworICAgIH0gd2hpbGUgKGZyYW1lKTsKKworICAgIGlmIChtYXRj
aFJhbmdlcy0+aXNFbXB0eSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoc2VsZWN0ZWRG
cmFtZSkgeworICAgICAgICBpbmRleEZvclNlbGVjdGlvbiA9IC0xOworICAgICAgICBSZWZQdHI8
UmFuZ2U+IHNlbGVjdGVkUmFuZ2UgPSBzZWxlY3RlZEZyYW1lLT5zZWxlY3Rpb24oKS0+c2VsZWN0
aW9uKCkuZmlyc3RSYW5nZSgpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1hdGNo
UmFuZ2VzLT5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgRXhjZXB0aW9uQ29kZSBlYzsKKyAg
ICAgICAgICAgIGlmIChzZWxlY3RlZFJhbmdlLT5jb21wYXJlQm91bmRhcnlQb2ludHMoUmFuZ2U6
OlNUQVJUX1RPX0VORCwgbWF0Y2hSYW5nZXMtPmF0KGkpLmdldCgpLCBlYykgPCAwKSB7CisgICAg
ICAgICAgICAgICAgaW5kZXhGb3JTZWxlY3Rpb24gPSBpOworICAgICAgICAgICAgICAgIGJyZWFr
OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCiBQYXNzUmVmUHRyPFJhbmdl
PiBQYWdlOjpyYW5nZU9mU3RyaW5nKGNvbnN0IFN0cmluZyYgdGFyZ2V0LCBSYW5nZSogcmVmZXJl
bmNlUmFuZ2UsIEZpbmRPcHRpb25zIG9wdGlvbnMpCiB7CiAgICAgaWYgKHRhcmdldC5pc0VtcHR5
KCkgfHwgIW1haW5GcmFtZSgpKQpAQCAtNjEyLDcgKzY0Myw3IEBAIHVuc2lnbmVkIGludCBQYWdl
OjptYXJrQWxsTWF0Y2hlc0ZvclRleHQKICAgICBGcmFtZSogZnJhbWUgPSBtYWluRnJhbWUoKTsK
ICAgICBkbyB7CiAgICAgICAgIGZyYW1lLT5lZGl0b3IoKS0+c2V0TWFya2VkVGV4dE1hdGNoZXNB
cmVIaWdobGlnaHRlZChzaG91bGRIaWdobGlnaHQpOwotICAgICAgICBtYXRjaGVzICs9IGZyYW1l
LT5lZGl0b3IoKS0+Y291bnRNYXRjaGVzRm9yVGV4dCh0YXJnZXQsIG9wdGlvbnMsIGxpbWl0ID8g
KGxpbWl0IC0gbWF0Y2hlcykgOiAwLCB0cnVlKTsKKyAgICAgICAgbWF0Y2hlcyArPSBmcmFtZS0+
ZWRpdG9yKCktPmNvdW50TWF0Y2hlc0ZvclRleHQodGFyZ2V0LCAwLCBvcHRpb25zLCBsaW1pdCA/
IChsaW1pdCAtIG1hdGNoZXMpIDogMCwgdHJ1ZSwgMCk7CiAgICAgICAgIGZyYW1lID0gaW5jcmVt
ZW50RnJhbWUoZnJhbWUsIHRydWUsIGZhbHNlKTsKICAgICB9IHdoaWxlIChmcmFtZSk7CiAKSW5k
ZXg6IFNvdXJjZS9XZWJDb3JlL3BhZ2UvUGFnZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJD
b3JlL3BhZ2UvUGFnZS5oCShyZXZpc2lvbiAxMzk2MzUpCisrKyBTb3VyY2UvV2ViQ29yZS9wYWdl
L1BhZ2UuaAkod29ya2luZyBjb3B5KQpAQCAtMjM2LDYgKzIzNiw3IEBAIG5hbWVzcGFjZSBXZWJD
b3JlIHsKICAgICAgICAgdW5zaWduZWQgbWFya0FsbE1hdGNoZXNGb3JUZXh0KGNvbnN0IFN0cmlu
ZyYsIFRleHRDYXNlU2Vuc2l0aXZpdHksIGJvb2wgc2hvdWxkSGlnaGxpZ2h0LCB1bnNpZ25lZCk7
CiAgICAgICAgIHZvaWQgdW5tYXJrQWxsVGV4dE1hdGNoZXMoKTsKIAorICAgICAgICB2b2lkIGZp
bmRTdHJpbmdNYXRjaGluZ1Jhbmdlcyhjb25zdCBTdHJpbmcmLCBGaW5kT3B0aW9ucywgaW50IG1h
eENvdW50LCBWZWN0b3I8UmVmUHRyPFJhbmdlPiA+KiwgaW50JiBpbmRleEZvclNlbGVjdGlvbik7
CiAjaWYgUExBVEZPUk0oTUFDKQogICAgICAgICB2b2lkIGFkZFNjaGVkdWxlUGFpcihQYXNzUmVm
UHRyPFNjaGVkdWxlUGFpcj4pOwogICAgICAgICB2b2lkIHJlbW92ZVNjaGVkdWxlUGFpcihQYXNz
UmVmUHRyPFNjaGVkdWxlUGFpcj4pOwpJbmRleDogU291cmNlL1dlYktpdDIvQ2hhbmdlTG9nCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQyL0NoYW5nZUxvZwkocmV2aXNpb24gMTM5Njc1KQor
KysgU291cmNlL1dlYktpdDIvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNjgg
QEAKKzIwMTMtMDEtMTQgIEVucmljYSBDYXN1Y2NpICA8ZW5yaWNhQGFwcGxlLmNvbT4KKworICAg
ICAgICBBZGQgYSBuZXcgc2V0IG9mIFdlYktpdDIgQVBJcyBmb3IgdGV4dCBzZWFyY2ggYW5kCisg
ICAgICAgIHNlYXJjaCByZXN1bHRzIG1hbmFnZW1lbnQuCisgICAgICAgIGh0dHBzOi8vYnVncy53
ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMDY4MzQuCisgICAgICAgIDxyZGFyOi8vcHJvYmxl
bS8xMjU5NzE1OT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKyAgICAg
ICAgCisgICAgICAgIEFkZGluZyBuZXcgQVBJIHRvIHBlcmZvcm0gdGV4dCBzZWFyY2ggaW4gV2Vi
S2l0MiB3aXRob3V0IHVzaW5nCisgICAgICAgIHRoZSBzdG9jayBVSS4gVGhlIG5ldyBpbnRlcmZh
Y2UgcHJvdmlkZXMgYWxsIHRoZSBpbmZvcm1hdGlvbgorICAgICAgICBuZWNlc3NhcnkgdG8gd3Jp
dGUgYSBjdXN0b20gVUkgZm9yIHNlYXJjaC4gVGhlIG1haW4gbG9naWMgaXMKKyAgICAgICAgaW1w
bGVtZW50ZWQgaW4gdGhlIG5ldyBmdW5jdGlvbnMgYWRkZWQgdG8gRmluZENvbnRyb2xsZXIuCisK
KyAgICAgICAgQWRkZWQgbmV3IFRleHRXZWJLaXRBUEkgdGVzdC4KKworICAgICAgICAqIFVJUHJv
Y2Vzcy9BUEkvQy9XS1BhZ2UuY3BwOgorICAgICAgICAoV0tQYWdlRmluZFN0cmluZ01hdGNoZXMp
OiBBZGRlZC4KKyAgICAgICAgKFdLUGFnZUdldEltYWdlRm9yRmluZE1hdGNoKTogQWRkZWQuCisg
ICAgICAgIChXS1BhZ2VTZWxlY3RGaW5kTWF0Y2gpOiBBZGRlZC4KKyAgICAgICAgKFdLUGFnZVNl
dFBhZ2VGaW5kTWF0Y2hlc0NsaWVudCk6IEFkZGVkLgorICAgICAgICAqIFVJUHJvY2Vzcy9BUEkv
Qy9XS1BhZ2UuaDogQWRkZWQgdGhlIG5ldyBBUEkgZGVmaW5pdGlvbnMuCisgICAgICAgICogVUlQ
cm9jZXNzL1dlYkZpbmRDbGllbnQuY3BwOiBBZGRlZCBuZXcgY2xpZW50IGNhbGxiYWNrcy4KKyAg
ICAgICAgKFdlYktpdDo6V2ViRmluZE1hdGNoZXNDbGllbnQ6OmRpZEZpbmRTdHJpbmdNYXRjaGVz
KToKKyAgICAgICAgKFdlYktpdDo6V2ViRmluZE1hdGNoZXNDbGllbnQ6OmRpZEdldEltYWdlRm9y
TWF0Y2hSZXN1bHQpOgorICAgICAgICAqIFVJUHJvY2Vzcy9XZWJGaW5kQ2xpZW50Lmg6CisgICAg
ICAgIChXZWJGaW5kTWF0Y2hlc0NsaWVudCk6IEFkZGVkLgorICAgICAgICAqIFVJUHJvY2Vzcy9X
ZWJQYWdlUHJveHkuY3BwOiBBZGRlZCBwcm94eSBtZXRob2RzLgorICAgICAgICAoV2ViS2l0OjpX
ZWJQYWdlUHJveHk6OmluaXRpYWxpemVGaW5kTWF0Y2hlc0NsaWVudCk6CisgICAgICAgIChXZWJL
aXQ6OldlYlBhZ2VQcm94eTo6ZmluZFN0cmluZ01hdGNoZXMpOgorICAgICAgICAoV2ViS2l0OjpX
ZWJQYWdlUHJveHk6OmdldEltYWdlRm9yRmluZE1hdGNoKToKKyAgICAgICAgKFdlYktpdDo6V2Vi
UGFnZVByb3h5OjpzZWxlY3RGaW5kTWF0Y2gpOgorICAgICAgICAoV2ViS2l0OjpXZWJQYWdlUHJv
eHk6OmRpZEdldEltYWdlRm9yRmluZE1hdGNoKToKKyAgICAgICAgKFdlYktpdDo6V2ViUGFnZVBy
b3h5OjpkaWRGaW5kU3RyaW5nTWF0Y2hlcyk6CisgICAgICAgICogVUlQcm9jZXNzL1dlYlBhZ2VQ
cm94eS5oOgorICAgICAgICAqIFVJUHJvY2Vzcy9XZWJQYWdlUHJveHkubWVzc2FnZXMuaW46Cisg
ICAgICAgICogV2ViUHJvY2Vzcy9XZWJQYWdlL0ZpbmRDb250cm9sbGVyLmNwcDoKKyAgICAgICAg
KFdlYktpdDo6RmluZENvbnRyb2xsZXI6OmZpbmRTdHJpbmdNYXRjaGVzKTogRmluZHMgYWxsIHRo
ZSBtYXRjaGluZworICAgICAgICB0ZXh0IGFjY29yZGluZyB0byB0aGUgZmluZCBvcHRpb25zLiBB
bGwgdGhlIG1hdGNoaW5nIHRleHQgcmFuZ2VzIGFyZQorICAgICAgICBzdG9yZWQgaW4gYSB2ZWN0
b3IgdW50aWwgdGhlIG5leHQgY2FsbCB0byBmaW5kU3RyaW5nTWF0Y2hlcyBvciB1bnRpbAorICAg
ICAgICBoaWRlRmluZFVJIGlzIGNhbGxlZC4gVGhlIG1lc3NhZ2UgdGhhdCBpcyBzZW50IGJhY2sg
dG8gdGhlIFVJIHByb2Nlc3MKKyAgICAgICAgY29udGFpbnMgYSB2ZWN0b3IgY29udGFpbmluZyBh
biBlbnRyeSBmb3IgZWFjaCBmaW5kIG1hdGNoIChpLmUuIGZvciBlYWNoCisgICAgICAgIHJhbmdl
KSBhbmQgZWFjaCBlbnRyeSBpcyByZXByZXNlbnRlZCBieSBhIHZlY3RvciBvZiB0aGUgY29ycmVz
cG9uZGluZworICAgICAgICB0ZXh0IHJlY3RzLiBJdCBhbHNvIHJldHVybnMgdGhlIGluZGV4IGlu
IHRoZSB2ZWN0b3Igb2YgbWF0Y2hlcyBjb3JyZXNwb25kaW5nCisgICAgICAgIHRvIHRoZSBmaXJz
dCBtYXRjaCBhZnRlciB0aGUgdXNlciBzZWxlY3Rpb24uCisgICAgICAgIElmIHRoZXJlIGlzIG5v
IHNlbGVjdGlvbiB0aGUgaW5kZXggaXMgYWx3YXlzIDAgYW5kIGlmIHRoZXJlIGFyZSBubworICAg
ICAgICBtYXRjaGVzIGFmdGVyIHRoZSB1c2VyIHNlbGVjdGlvbiwgdGhlIGluZGV4IHJldHVybmVk
IGlzIC0xLgorICAgICAgICAoV2ViS2l0OjpGaW5kQ29udHJvbGxlcjo6Z2V0RmluZEluZGljYXRv
ckJpdG1hcEFuZFJlY3QpOiBIZWxwZXIgZnVuY3Rpb24KKyAgICAgICAgdG8gc2hhcmUgY29kZSBi
ZXR3ZWVuIHVwZGF0ZUZpbmRJbmRpY2F0b3IgYW5kIGdldEltYWdlRm9yRmluZE1hdGNoLgorICAg
ICAgICAoV2ViS2l0OjpGaW5kQ29udHJvbGxlcjo6Z2V0SW1hZ2VGb3JGaW5kTWF0Y2gpOiBDcmVh
dGVzIHRoZSBpbWFnZSBjb3JyZXNwb25kaW5nCisgICAgICAgIHRvIHRoZSB0ZXh0IG1hdGNoZWQg
YXQgdGhlIGdpdmVuIG1hdGNoIGluZGV4LgorICAgICAgICAoV2ViS2l0OjpGaW5kQ29udHJvbGxl
cjo6c2VsZWN0RmluZE1hdGNoKTogY3JlYXRlcyBhIHNlbGVjdGlvbiBmb3IgdGhlIHJhbmdlCisg
ICAgICAgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIG1hdGNoIGluZGV4LgorICAgICAgICAo
V2ViS2l0OjpGaW5kQ29udHJvbGxlcjo6aGlkZUZpbmRVSSk6IEFkZGVkIGxvZ2ljIHRvIGNsZWFy
IHRoZSB2ZWN0b3IKKyAgICAgICAgb2YgbWF0Y2hlZCByYW5nZXMuCisgICAgICAgIChXZWJLaXQ6
OkZpbmRDb250cm9sbGVyOjp1cGRhdGVGaW5kSW5kaWNhdG9yKTogVXBkYXRlZCB0byB1c2UgdGhl
CisgICAgICAgIG5ldyBoZWxwZXIgZnVuY3Rpb24gZ2V0RmluZEluZGljYXRvckJpdG1hcEFuZFJl
Y3QuCisgICAgICAgICogV2ViUHJvY2Vzcy9XZWJQYWdlL0ZpbmRDb250cm9sbGVyLmg6CisgICAg
ICAgICogV2ViUHJvY2Vzcy9XZWJQYWdlL1dlYlBhZ2UuY3BwOgorICAgICAgICAoV2ViS2l0OjpX
ZWJQYWdlOjpmaW5kU3RyaW5nTWF0Y2hlcyk6CisgICAgICAgIChXZWJLaXQ6OldlYlBhZ2U6Omdl
dEltYWdlRm9yRmluZE1hdGNoKToKKyAgICAgICAgKFdlYktpdDo6V2ViUGFnZTo6c2VsZWN0Rmlu
ZE1hdGNoKToKKyAgICAgICAgKiBXZWJQcm9jZXNzL1dlYlBhZ2UvV2ViUGFnZS5oOgorICAgICAg
ICAqIFdlYlByb2Nlc3MvV2ViUGFnZS9XZWJQYWdlLm1lc3NhZ2VzLmluOgorCiAyMDEzLTAxLTE0
ICBIdWFuZyBEb25nc3VuZyAgPGx1eHRlbGxhQGNvbXBhbnkxMDAubmV0PgogCiAgICAgICAgIFtF
RkxdIFJFR1JFU1NJT04ocjEzOTE4OSk6IE1pbmlCcm93c2VyIHJlbmRlcnMgYWJub3JtYWxseSB3
aXRoIC1yIG9wdGlvbi4KSW5kZXg6IFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9XZWJGaW5kQ2xp
ZW50LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvV2ViRmluZENs
aWVudC5jcHAJKHJldmlzaW9uIDEzOTYzNSkKKysrIFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9X
ZWJGaW5kQ2xpZW50LmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTUsNSArNTUsMjAgQEAgdm9pZCBX
ZWJGaW5kQ2xpZW50OjpkaWRDb3VudFN0cmluZ01hdGNoZQogICAgIG1fY2xpZW50LmRpZENvdW50
U3RyaW5nTWF0Y2hlcyh0b0FQSShwYWdlKSwgdG9BUEkoc3RyaW5nLmltcGwoKSksIG1hdGNoQ291
bnQsIG1fY2xpZW50LmNsaWVudEluZm8pOwogfQogCit2b2lkIFdlYkZpbmRNYXRjaGVzQ2xpZW50
OjpkaWRGaW5kU3RyaW5nTWF0Y2hlcyhXZWJQYWdlUHJveHkqIHBhZ2UsIGNvbnN0IFN0cmluZyYg
c3RyaW5nLCBJbW11dGFibGVBcnJheSogbWF0Y2hlcywgaW50IGZpcnN0SW5kZXgpCit7CisgICAg
aWYgKCFtX2NsaWVudC5kaWRGaW5kU3RyaW5nTWF0Y2hlcykKKyAgICAgICAgcmV0dXJuOworCisg
ICAgbV9jbGllbnQuZGlkRmluZFN0cmluZ01hdGNoZXModG9BUEkocGFnZSksIHRvQVBJKHN0cmlu
Zy5pbXBsKCkpLCB0b0FQSShtYXRjaGVzKSwgZmlyc3RJbmRleCwgbV9jbGllbnQuY2xpZW50SW5m
byk7Cit9CisKK3ZvaWQgV2ViRmluZE1hdGNoZXNDbGllbnQ6OmRpZEdldEltYWdlRm9yTWF0Y2hS
ZXN1bHQoV2ViUGFnZVByb3h5KiBwYWdlLCBXZWJJbWFnZSogaW1hZ2UsIHVpbnQzMl90IGluZGV4
KQoreworICAgIGlmICghbV9jbGllbnQuZGlkR2V0SW1hZ2VGb3JNYXRjaFJlc3VsdCkKKyAgICAg
ICAgcmV0dXJuOworICAgIG1fY2xpZW50LmRpZEdldEltYWdlRm9yTWF0Y2hSZXN1bHQodG9BUEko
cGFnZSksIHRvQVBJKGltYWdlKSwgaW5kZXgsIG1fY2xpZW50LmNsaWVudEluZm8pOworfQorCiB9
IC8vIG5hbWVzcGFjZSBXZWJLaXQKIApJbmRleDogU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL1dl
YkZpbmRDbGllbnQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvV2Vi
RmluZENsaWVudC5oCShyZXZpc2lvbiAxMzk2MzUpCisrKyBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nl
c3MvV2ViRmluZENsaWVudC5oCSh3b3JraW5nIGNvcHkpCkBAIC0zMiw3ICszMiw5IEBACiAKIG5h
bWVzcGFjZSBXZWJLaXQgewogCitjbGFzcyBJbW11dGFibGVBcnJheTsKIGNsYXNzIFdlYlBhZ2VQ
cm94eTsKK2NsYXNzIFdlYkltYWdlOwogCiBjbGFzcyBXZWJGaW5kQ2xpZW50IDogcHVibGljIEFQ
SUNsaWVudDxXS1BhZ2VGaW5kQ2xpZW50LCBrV0tQYWdlRmluZENsaWVudEN1cnJlbnRWZXJzaW9u
PiB7CiBwdWJsaWM6CkBAIC00MSw2ICs0MywxMiBAQCBwdWJsaWM6CiAgICAgdm9pZCBkaWRDb3Vu
dFN0cmluZ01hdGNoZXMoV2ViUGFnZVByb3h5KiwgY29uc3QgU3RyaW5nJiwgdWludDMyX3QgbWF0
Y2hDb3VudCk7CiB9OwogCitjbGFzcyBXZWJGaW5kTWF0Y2hlc0NsaWVudCA6IHB1YmxpYyBBUElD
bGllbnQ8V0tQYWdlRmluZE1hdGNoZXNDbGllbnQsIGtXS1BhZ2VGaW5kTWF0Y2hlc0NsaWVudEN1
cnJlbnRWZXJzaW9uPiB7CitwdWJsaWM6CisgICAgdm9pZCBkaWRGaW5kU3RyaW5nTWF0Y2hlcyhX
ZWJQYWdlUHJveHkqLCBjb25zdCBTdHJpbmcmLCBJbW11dGFibGVBcnJheSosIGludCk7CisgICAg
dm9pZCBkaWRHZXRJbWFnZUZvck1hdGNoUmVzdWx0KFdlYlBhZ2VQcm94eSosIFdlYkltYWdlKiwg
dWludDMyX3QpOworfTsKKwogfSAvLyBuYW1lc3BhY2UgV2ViS2l0CiAKICNlbmRpZiAvLyBXZWJG
aW5kQ2xpZW50X2gKSW5kZXg6IFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9XZWJQYWdlUHJveHku
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9XZWJQYWdlUHJveHku
Y3BwCShyZXZpc2lvbiAxMzk2MzUpCisrKyBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvV2ViUGFn
ZVByb3h5LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzQsNiArMzQsNyBAQAogI2luY2x1ZGUgIkRy
YXdpbmdBcmVhUHJveHkuaCIKICNpbmNsdWRlICJFdmVudERpc3BhdGNoZXJNZXNzYWdlcy5oIgog
I2luY2x1ZGUgIkZpbmRJbmRpY2F0b3IuaCIKKyNpbmNsdWRlICJJbW11dGFibGVBcnJheS5oIgog
I2luY2x1ZGUgIkxvZ2dpbmcuaCIKICNpbmNsdWRlICJNZXNzYWdlSUQuaCIKICNpbmNsdWRlICJO
YXRpdmVXZWJLZXlib2FyZEV2ZW50LmgiCkBAIC0zNjcsNiArMzY4LDExIEBAIHZvaWQgV2ViUGFn
ZVByb3h5Ojppbml0aWFsaXplRmluZENsaWVudCgKICAgICBtX2ZpbmRDbGllbnQuaW5pdGlhbGl6
ZShjbGllbnQpOwogfQogCit2b2lkIFdlYlBhZ2VQcm94eTo6aW5pdGlhbGl6ZUZpbmRNYXRjaGVz
Q2xpZW50KGNvbnN0IFdLUGFnZUZpbmRNYXRjaGVzQ2xpZW50KiBjbGllbnQpCit7CisgICAgbV9m
aW5kTWF0Y2hlc0NsaWVudC5pbml0aWFsaXplKGNsaWVudCk7Cit9CisKICNpZiBFTkFCTEUoQ09O
VEVYVF9NRU5VUykKIHZvaWQgV2ViUGFnZVByb3h5Ojppbml0aWFsaXplQ29udGV4dE1lbnVDbGll
bnQoY29uc3QgV0tQYWdlQ29udGV4dE1lbnVDbGllbnQqIGNsaWVudCkKIHsKQEAgLTE2ODIsNiAr
MTY4OCwxMSBAQCB2b2lkIFdlYlBhZ2VQcm94eTo6c2V0TWVtb3J5Q2FjaGVDbGllbnRDCiAgICAg
bV9wcm9jZXNzLT5zZW5kKE1lc3NhZ2VzOjpXZWJQYWdlOjpTZXRNZW1vcnlDYWNoZU1lc3NhZ2Vz
RW5hYmxlZChtZW1vcnlDYWNoZUNsaWVudENhbGxzRW5hYmxlZCksIG1fcGFnZUlEKTsKIH0KIAor
dm9pZCBXZWJQYWdlUHJveHk6OmZpbmRTdHJpbmdNYXRjaGVzKGNvbnN0IFN0cmluZyYgc3RyaW5n
LCBGaW5kT3B0aW9ucyBvcHRpb25zLCB1bnNpZ25lZCBtYXhNYXRjaENvdW50KQoreworICAgIG1f
cHJvY2Vzcy0+c2VuZChNZXNzYWdlczo6V2ViUGFnZTo6RmluZFN0cmluZ01hdGNoZXMoc3RyaW5n
LCBvcHRpb25zLCBtYXhNYXRjaENvdW50KSwgbV9wYWdlSUQpOworfQorCiB2b2lkIFdlYlBhZ2VQ
cm94eTo6ZmluZFN0cmluZyhjb25zdCBTdHJpbmcmIHN0cmluZywgRmluZE9wdGlvbnMgb3B0aW9u
cywgdW5zaWduZWQgbWF4TWF0Y2hDb3VudCkKIHsKICAgICBpZiAobV9tYWluRnJhbWVIYXNDdXN0
b21SZXByZXNlbnRhdGlvbikKQEAgLTE2OTAsNiArMTcwMSwxNiBAQCB2b2lkIFdlYlBhZ2VQcm94
eTo6ZmluZFN0cmluZyhjb25zdCBTdHJpCiAgICAgICAgIG1fcHJvY2Vzcy0+c2VuZChNZXNzYWdl
czo6V2ViUGFnZTo6RmluZFN0cmluZyhzdHJpbmcsIG9wdGlvbnMsIG1heE1hdGNoQ291bnQpLCBt
X3BhZ2VJRCk7CiB9CiAKK3ZvaWQgV2ViUGFnZVByb3h5OjpnZXRJbWFnZUZvckZpbmRNYXRjaChp
bnQzMl90IG1hdGNoSW5kZXgpCit7CisgICAgbV9wcm9jZXNzLT5zZW5kKE1lc3NhZ2VzOjpXZWJQ
YWdlOjpHZXRJbWFnZUZvckZpbmRNYXRjaChtYXRjaEluZGV4KSwgbV9wYWdlSUQpOworfQorCit2
b2lkIFdlYlBhZ2VQcm94eTo6c2VsZWN0RmluZE1hdGNoKGludDMyX3QgbWF0Y2hJbmRleCkKK3sK
KyAgICBtX3Byb2Nlc3MtPnNlbmQoTWVzc2FnZXM6OldlYlBhZ2U6OlNlbGVjdEZpbmRNYXRjaCht
YXRjaEluZGV4KSwgbV9wYWdlSUQpOworfQorCiB2b2lkIFdlYlBhZ2VQcm94eTo6aGlkZUZpbmRV
SSgpCiB7CiAgICAgbV9wcm9jZXNzLT5zZW5kKE1lc3NhZ2VzOjpXZWJQYWdlOjpIaWRlRmluZFVJ
KCksIG1fcGFnZUlEKTsKQEAgLTMwMjQsNiArMzA0NSwxMSBAQCB2b2lkIFdlYlBhZ2VQcm94eTo6
ZGlkQ291bnRTdHJpbmdNYXRjaGVzCiAgICAgbV9maW5kQ2xpZW50LmRpZENvdW50U3RyaW5nTWF0
Y2hlcyh0aGlzLCBzdHJpbmcsIG1hdGNoQ291bnQpOwogfQogCit2b2lkIFdlYlBhZ2VQcm94eTo6
ZGlkR2V0SW1hZ2VGb3JGaW5kTWF0Y2goY29uc3QgU2hhcmVhYmxlQml0bWFwOjpIYW5kbGUmIGNv
bnRlbnRJbWFnZUhhbmRsZSwgdWludDMyX3QgbWF0Y2hJbmRleCkKK3sKKyAgICBtX2ZpbmRNYXRj
aGVzQ2xpZW50LmRpZEdldEltYWdlRm9yTWF0Y2hSZXN1bHQodGhpcywgV2ViSW1hZ2U6OmNyZWF0
ZShTaGFyZWFibGVCaXRtYXA6OmNyZWF0ZShjb250ZW50SW1hZ2VIYW5kbGUpKS5nZXQoKSwgbWF0
Y2hJbmRleCk7Cit9CisKIHZvaWQgV2ViUGFnZVByb3h5OjpzZXRGaW5kSW5kaWNhdG9yKGNvbnN0
IEZsb2F0UmVjdCYgc2VsZWN0aW9uUmVjdEluV2luZG93Q29vcmRpbmF0ZXMsIGNvbnN0IFZlY3Rv
cjxGbG9hdFJlY3Q+JiB0ZXh0UmVjdHNJblNlbGVjdGlvblJlY3RDb29yZGluYXRlcywgZmxvYXQg
Y29udGVudEltYWdlU2NhbGVGYWN0b3IsIGNvbnN0IFNoYXJlYWJsZUJpdG1hcDo6SGFuZGxlJiBj
b250ZW50SW1hZ2VIYW5kbGUsIGJvb2wgZmFkZU91dCwgYm9vbCBhbmltYXRlKQogewogICAgIFJl
ZlB0cjxGaW5kSW5kaWNhdG9yPiBmaW5kSW5kaWNhdG9yID0gRmluZEluZGljYXRvcjo6Y3JlYXRl
KHNlbGVjdGlvblJlY3RJbldpbmRvd0Nvb3JkaW5hdGVzLCB0ZXh0UmVjdHNJblNlbGVjdGlvblJl
Y3RDb29yZGluYXRlcywgY29udGVudEltYWdlU2NhbGVGYWN0b3IsIGNvbnRlbnRJbWFnZUhhbmRs
ZSk7CkBAIC0zMDM1LDYgKzMwNjEsMjQgQEAgdm9pZCBXZWJQYWdlUHJveHk6OmRpZEZpbmRTdHJp
bmcoY29uc3QgUwogICAgIG1fZmluZENsaWVudC5kaWRGaW5kU3RyaW5nKHRoaXMsIHN0cmluZywg
bWF0Y2hDb3VudCk7CiB9CiAKK3ZvaWQgV2ViUGFnZVByb3h5OjpkaWRGaW5kU3RyaW5nTWF0Y2hl
cyhjb25zdCBTdHJpbmcmIHN0cmluZywgVmVjdG9yPFZlY3RvcjxXZWJDb3JlOjpJbnRSZWN0PiA+
IG1hdGNoUmVjdHMsIGludDMyX3QgZmlyc3RJbmRleEFmdGVyU2VsZWN0aW9uKQoreworICAgIFZl
Y3RvcjxSZWZQdHI8QVBJT2JqZWN0PiA+IG1hdGNoZXM7CisgICAgbWF0Y2hlcy5yZXNlcnZlSW5p
dGlhbENhcGFjaXR5KG1hdGNoUmVjdHMuc2l6ZSgpKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAw
OyBpIDwgbWF0Y2hSZWN0cy5zaXplKCk7ICsraSkgeworICAgICAgICBjb25zdCBWZWN0b3I8V2Vi
Q29yZTo6SW50UmVjdD4mIHJlY3RzID0gbWF0Y2hSZWN0c1tpXTsKKyAgICAgICAgc2l6ZV90IG51
bVJlY3RzID0gbWF0Y2hSZWN0c1tpXS5zaXplKCk7CisgICAgICAgIFZlY3RvcjxSZWZQdHI8QVBJ
T2JqZWN0PiA+IGFwaVJlY3RzOworICAgICAgICBhcGlSZWN0cy5yZXNlcnZlSW5pdGlhbENhcGFj
aXR5KG51bVJlY3RzKTsKKworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVJlY3Rz
OyArK2kpCisgICAgICAgICAgICBhcGlSZWN0cy51bmNoZWNrZWRBcHBlbmQoV2ViUmVjdDo6Y3Jl
YXRlKHRvQVBJKHJlY3RzW2ldKSkpOworICAgICAgICBtYXRjaGVzLnVuY2hlY2tlZEFwcGVuZChJ
bW11dGFibGVBcnJheTo6YWRvcHQoYXBpUmVjdHMpKTsKKyAgICB9CisgICAgbV9maW5kTWF0Y2hl
c0NsaWVudC5kaWRGaW5kU3RyaW5nTWF0Y2hlcyh0aGlzLCBzdHJpbmcsIEltbXV0YWJsZUFycmF5
OjphZG9wdChtYXRjaGVzKS5nZXQoKSwgZmlyc3RJbmRleEFmdGVyU2VsZWN0aW9uKTsKK30KKwog
dm9pZCBXZWJQYWdlUHJveHk6OmRpZEZhaWxUb0ZpbmRTdHJpbmcoY29uc3QgU3RyaW5nJiBzdHJp
bmcpCiB7CiAgICAgbV9maW5kQ2xpZW50LmRpZEZhaWxUb0ZpbmRTdHJpbmcodGhpcywgc3RyaW5n
KTsKSW5kZXg6IFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9XZWJQYWdlUHJveHkuaAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvV2ViUGFnZVByb3h5LmgJKHJldmlzaW9u
IDEzOTYzNSkKKysrIFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9XZWJQYWdlUHJveHkuaAkod29y
a2luZyBjb3B5KQpAQCAtMjc3LDYgKzI3Nyw3IEBAIHB1YmxpYzoKICAgICB2b2lkIGluaXRpYWxp
emVDb250ZXh0TWVudUNsaWVudChjb25zdCBXS1BhZ2VDb250ZXh0TWVudUNsaWVudCopOwogI2Vu
ZGlmCiAgICAgdm9pZCBpbml0aWFsaXplRmluZENsaWVudChjb25zdCBXS1BhZ2VGaW5kQ2xpZW50
Kik7CisgICAgdm9pZCBpbml0aWFsaXplRmluZE1hdGNoZXNDbGllbnQoY29uc3QgV0tQYWdlRmlu
ZE1hdGNoZXNDbGllbnQqKTsKICAgICB2b2lkIGluaXRpYWxpemVGb3JtQ2xpZW50KGNvbnN0IFdL
UGFnZUZvcm1DbGllbnQqKTsKICAgICB2b2lkIGluaXRpYWxpemVMb2FkZXJDbGllbnQoY29uc3Qg
V0tQYWdlTG9hZGVyQ2xpZW50Kik7CiAgICAgdm9pZCBpbml0aWFsaXplUG9saWN5Q2xpZW50KGNv
bnN0IFdLUGFnZVBvbGljeUNsaWVudCopOwpAQCAtNTM0LDEyICs1MzUsMTcgQEAgcHVibGljOgog
CiAgICAgLy8gRmluZC4KICAgICB2b2lkIGZpbmRTdHJpbmcoY29uc3QgU3RyaW5nJiwgRmluZE9w
dGlvbnMsIHVuc2lnbmVkIG1heE1hdGNoQ291bnQpOworICAgIHZvaWQgZmluZFN0cmluZ01hdGNo
ZXMoY29uc3QgU3RyaW5nJiwgRmluZE9wdGlvbnMsIHVuc2lnbmVkIG1heE1hdGNoQ291bnQpOwor
ICAgIHZvaWQgZ2V0SW1hZ2VGb3JGaW5kTWF0Y2goaW50MzJfdCBtYXRjaEluZGV4KTsKKyAgICB2
b2lkIHNlbGVjdEZpbmRNYXRjaChpbnQzMl90IG1hdGNoSW5kZXgpOworICAgIHZvaWQgZGlkR2V0
SW1hZ2VGb3JGaW5kTWF0Y2goY29uc3QgU2hhcmVhYmxlQml0bWFwOjpIYW5kbGUmIGNvbnRlbnRJ
bWFnZUhhbmRsZSwgdWludDMyX3QgbWF0Y2hJbmRleCk7CiAgICAgdm9pZCBoaWRlRmluZFVJKCk7
CiAgICAgdm9pZCBjb3VudFN0cmluZ01hdGNoZXMoY29uc3QgU3RyaW5nJiwgRmluZE9wdGlvbnMs
IHVuc2lnbmVkIG1heE1hdGNoQ291bnQpOwogICAgIHZvaWQgZGlkQ291bnRTdHJpbmdNYXRjaGVz
KGNvbnN0IFN0cmluZyYsIHVpbnQzMl90IG1hdGNoQ291bnQpOwogICAgIHZvaWQgc2V0RmluZElu
ZGljYXRvcihjb25zdCBXZWJDb3JlOjpGbG9hdFJlY3QmIHNlbGVjdGlvblJlY3RJbldpbmRvd0Nv
b3JkaW5hdGVzLCBjb25zdCBWZWN0b3I8V2ViQ29yZTo6RmxvYXRSZWN0PiYgdGV4dFJlY3RzSW5T
ZWxlY3Rpb25SZWN0Q29vcmRpbmF0ZXMsIGZsb2F0IGNvbnRlbnRJbWFnZVNjYWxlRmFjdG9yLCBj
b25zdCBTaGFyZWFibGVCaXRtYXA6OkhhbmRsZSYgY29udGVudEltYWdlSGFuZGxlLCBib29sIGZh
ZGVPdXQsIGJvb2wgYW5pbWF0ZSk7CiAgICAgdm9pZCBkaWRGaW5kU3RyaW5nKGNvbnN0IFN0cmlu
ZyYsIHVpbnQzMl90IG1hdGNoQ291bnQpOwogICAgIHZvaWQgZGlkRmFpbFRvRmluZFN0cmluZyhj
b25zdCBTdHJpbmcmKTsKKyAgICB2b2lkIGRpZEZpbmRTdHJpbmdNYXRjaGVzKGNvbnN0IFN0cmlu
ZyYsIFZlY3RvcjxWZWN0b3I8V2ViQ29yZTo6SW50UmVjdD4gPiBtYXRjaFJlY3RzLCBpbnQzMl90
IGZpcnN0SW5kZXhBZnRlclNlbGVjdGlvbik7CiAKICAgICB2b2lkIGdldENvbnRlbnRzQXNTdHJp
bmcoUGFzc1JlZlB0cjxTdHJpbmdDYWxsYmFjaz4pOwogI2lmIEVOQUJMRShNSFRNTCkKQEAgLTEw
NDEsNiArMTA0Nyw3IEBAIHByaXZhdGU6CiAgICAgV2ViUmVzb3VyY2VMb2FkQ2xpZW50IG1fcmVz
b3VyY2VMb2FkQ2xpZW50OwogICAgIFdlYlVJQ2xpZW50IG1fdWlDbGllbnQ7CiAgICAgV2ViRmlu
ZENsaWVudCBtX2ZpbmRDbGllbnQ7CisgICAgV2ViRmluZE1hdGNoZXNDbGllbnQgbV9maW5kTWF0
Y2hlc0NsaWVudDsKICNpZiBFTkFCTEUoQ09OVEVYVF9NRU5VUykKICAgICBXZWJQYWdlQ29udGV4
dE1lbnVDbGllbnQgbV9jb250ZXh0TWVudUNsaWVudDsKICNlbmRpZgpJbmRleDogU291cmNlL1dl
YktpdDIvVUlQcm9jZXNzL1dlYlBhZ2VQcm94eS5tZXNzYWdlcy5pbgo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvV2ViUGFnZVByb3h5Lm1lc3NhZ2VzLmluCShyZXZpc2lv
biAxMzk2MzUpCisrKyBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvV2ViUGFnZVByb3h5Lm1lc3Nh
Z2VzLmluCSh3b3JraW5nIGNvcHkpCkBAIC0yMTMsNiArMjEzLDggQEAgbWVzc2FnZXMgLT4gV2Vi
UGFnZVByb3h5IHsKICAgICBTZXRGaW5kSW5kaWNhdG9yKFdlYkNvcmU6OkZsb2F0UmVjdCBzZWxl
Y3Rpb25SZWN0LCBWZWN0b3I8V2ViQ29yZTo6RmxvYXRSZWN0PiB0ZXh0UmVjdHMsIGZsb2F0IGNv
bnRlbnRJbWFnZVNjYWxlRmFjdG9yLCBXZWJLaXQ6OlNoYXJlYWJsZUJpdG1hcDo6SGFuZGxlIGNv
bnRlbnRJbWFnZUhhbmRsZSwgYm9vbCBmYWRlT3V0LCBib29sIGFuaW1hdGUpCiAgICAgRGlkRmlu
ZFN0cmluZyhXVEY6OlN0cmluZyBzdHJpbmcsIHVpbnQzMl90IG1hdGNoQ291bnQpCiAgICAgRGlk
RmFpbFRvRmluZFN0cmluZyhXVEY6OlN0cmluZyBzdHJpbmcpCisgICAgRGlkRmluZFN0cmluZ01h
dGNoZXMoV1RGOjpTdHJpbmcgc3RyaW5nLCBWZWN0b3I8VmVjdG9yPFdlYkNvcmU6OkludFJlY3Q+
ID4gbWF0Y2hlcywgaW50MzJfdCBmaXJzdEluZGV4QWZ0ZXJTZWxlY3Rpb24pCisgICAgRGlkR2V0
SW1hZ2VGb3JGaW5kTWF0Y2goV2ViS2l0OjpTaGFyZWFibGVCaXRtYXA6OkhhbmRsZSBjb250ZW50
SW1hZ2VIYW5kbGUsIHVpbnQzMl90IG1hdGNoSW5kZXgpCiAKICAgICAjIFBvcHVwTWVudSBtZXNz
YWdlcwogICAgIFNob3dQb3B1cE1lbnUoV2ViQ29yZTo6SW50UmVjdCByZWN0LCB1aW50NjRfdCB0
ZXh0RGlyZWN0aW9uLCBWZWN0b3I8V2ViS2l0OjpXZWJQb3B1cEl0ZW0+IGl0ZW1zLCBpbnQzMl90
IHNlbGVjdGVkSW5kZXgsIFdlYktpdDo6UGxhdGZvcm1Qb3B1cE1lbnVEYXRhIGRhdGEpCkluZGV4
OiBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL0MvV0tQYWdlLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL0MvV0tQYWdlLmNwcAkocmV2aXNpb24gMTM5
NjM1KQorKysgU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9DL1dLUGFnZS5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTQ5Myw2ICs0OTMsMjEgQEAgdm9pZCBXS1BhZ2VDZW50ZXJTZWxlY3Rpb25J
blZpc2libGVBcmVhKAogICAgIHJldHVybiB0b0ltcGwocGFnZVJlZiktPmNlbnRlclNlbGVjdGlv
bkluVmlzaWJsZUFyZWEoKTsKIH0KIAordm9pZCBXS1BhZ2VGaW5kU3RyaW5nTWF0Y2hlcyhXS1Bh
Z2VSZWYgcGFnZVJlZiwgV0tTdHJpbmdSZWYgc3RyaW5nLCBXS0ZpbmRPcHRpb25zIG9wdGlvbnMs
IHVuc2lnbmVkIG1heE1hdGNoQ291bnQpCit7CisgICAgdG9JbXBsKHBhZ2VSZWYpLT5maW5kU3Ry
aW5nTWF0Y2hlcyh0b0ltcGwoc3RyaW5nKS0+c3RyaW5nKCksIHRvRmluZE9wdGlvbnMob3B0aW9u
cyksIG1heE1hdGNoQ291bnQpOworfQorCit2b2lkIFdLUGFnZUdldEltYWdlRm9yRmluZE1hdGNo
KFdLUGFnZVJlZiBwYWdlUmVmLCBpbnQzMl90IG1hdGNoSW5kZXgpCit7CisgICAgdG9JbXBsKHBh
Z2VSZWYpLT5nZXRJbWFnZUZvckZpbmRNYXRjaChtYXRjaEluZGV4KTsKK30KKwordm9pZCBXS1Bh
Z2VTZWxlY3RGaW5kTWF0Y2goV0tQYWdlUmVmIHBhZ2VSZWYsIGludDMyX3QgbWF0Y2hJbmRleCkK
K3sKKyAgICB0b0ltcGwocGFnZVJlZiktPnNlbGVjdEZpbmRNYXRjaChtYXRjaEluZGV4KTsKK30K
Kwogdm9pZCBXS1BhZ2VGaW5kU3RyaW5nKFdLUGFnZVJlZiBwYWdlUmVmLCBXS1N0cmluZ1JlZiBz
dHJpbmcsIFdLRmluZE9wdGlvbnMgb3B0aW9ucywgdW5zaWduZWQgbWF4TWF0Y2hDb3VudCkKIHsK
ICAgICB0b0ltcGwocGFnZVJlZiktPmZpbmRTdHJpbmcodG9JbXBsKHN0cmluZyktPnN0cmluZygp
LCB0b0ZpbmRPcHRpb25zKG9wdGlvbnMpLCBtYXhNYXRjaENvdW50KTsKQEAgLTUyMCw2ICs1MzUs
MTEgQEAgdm9pZCBXS1BhZ2VTZXRQYWdlRmluZENsaWVudChXS1BhZ2VSZWYgcAogICAgIHRvSW1w
bChwYWdlUmVmKS0+aW5pdGlhbGl6ZUZpbmRDbGllbnQod2tDbGllbnQpOwogfQogCit2b2lkIFdL
UGFnZVNldFBhZ2VGaW5kTWF0Y2hlc0NsaWVudChXS1BhZ2VSZWYgcGFnZVJlZiwgY29uc3QgV0tQ
YWdlRmluZE1hdGNoZXNDbGllbnQqIHdrQ2xpZW50KQoreworICAgIHRvSW1wbChwYWdlUmVmKS0+
aW5pdGlhbGl6ZUZpbmRNYXRjaGVzQ2xpZW50KHdrQ2xpZW50KTsKK30KKwogdm9pZCBXS1BhZ2VT
ZXRQYWdlRm9ybUNsaWVudChXS1BhZ2VSZWYgcGFnZVJlZiwgY29uc3QgV0tQYWdlRm9ybUNsaWVu
dCogd2tDbGllbnQpCiB7CiAgICAgdG9JbXBsKHBhZ2VSZWYpLT5pbml0aWFsaXplRm9ybUNsaWVu
dCh3a0NsaWVudCk7CkluZGV4OiBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL0MvV0tQYWdl
LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9DL1dLUGFnZS5o
CShyZXZpc2lvbiAxMzk2MzUpCisrKyBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL0MvV0tQ
YWdlLmgJKHdvcmtpbmcgY29weSkKQEAgLTMxNiw2ICszMTYsMjAgQEAgZW51bSB7CiAgICAga1dL
TW9yZVRoYW5NYXhpbXVtTWF0Y2hDb3VudCA9IC0xCiB9OwogCisvLyBGaW5kIG1hdGNoIGNsaWVu
dC4KK3R5cGVkZWYgdm9pZCAoKldLUGFnZURpZEZpbmRTdHJpbmdNYXRjaGVzQ2FsbGJhY2spKFdL
UGFnZVJlZiBwYWdlLCBXS1N0cmluZ1JlZiBzdHJpbmcsIFdLQXJyYXlSZWYgbWF0Y2hlcywgaW50
IGZpcnN0SW5kZXgsIGNvbnN0IHZvaWQqIGNsaWVudEluZm8pOwordHlwZWRlZiB2b2lkICgqV0tQ
YWdlRGlkR2V0SW1hZ2VGb3JNYXRjaFJlc3VsdENhbGxiYWNrKShXS1BhZ2VSZWYgcGFnZSwgV0tJ
bWFnZVJlZiBpbWFnZSwgdWludDMyX3QgaW5kZXgsIGNvbnN0IHZvaWQqIGNsaWVudEluZm8pOwor
CitzdHJ1Y3QgV0tQYWdlRmluZE1hdGNoZXNDbGllbnQgeworICAgIGludCAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lv
bjsKKyAgICBjb25zdCB2b2lkICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGNsaWVudEluZm87CisgICAgV0tQYWdlRGlkRmluZFN0cmluZ01h
dGNoZXNDYWxsYmFjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWRGaW5kU3Ry
aW5nTWF0Y2hlczsKKyAgICBXS1BhZ2VEaWRHZXRJbWFnZUZvck1hdGNoUmVzdWx0Q2FsbGJhY2sg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZEdldEltYWdlRm9yTWF0Y2hSZXN1bHQ7Cit9
OwordHlwZWRlZiBzdHJ1Y3QgV0tQYWdlRmluZE1hdGNoZXNDbGllbnQgV0tQYWdlRmluZE1hdGNo
ZXNDbGllbnQ7CisKK2VudW0geyBrV0tQYWdlRmluZE1hdGNoZXNDbGllbnRDdXJyZW50VmVyc2lv
biA9IDAgfTsKKwogLy8gQ29udGV4dE1lbnUgY2xpZW50CiB0eXBlZGVmIHZvaWQgKCpXS1BhZ2VH
ZXRDb250ZXh0TWVudUZyb21Qcm9wb3NlZENvbnRleHRNZW51Q2FsbGJhY2spKFdLUGFnZVJlZiBw
YWdlLCBXS0FycmF5UmVmIHByb3Bvc2VkTWVudSwgV0tBcnJheVJlZiogbmV3TWVudSwgV0tIaXRU
ZXN0UmVzdWx0UmVmIGhpdFRlc3RSZXN1bHQsIFdLVHlwZVJlZiB1c2VyRGF0YSwgY29uc3Qgdm9p
ZCogY2xpZW50SW5mbyk7CiB0eXBlZGVmIHZvaWQgKCpXS1BhZ2VDdXN0b21Db250ZXh0TWVudUl0
ZW1TZWxlY3RlZENhbGxiYWNrKShXS1BhZ2VSZWYgcGFnZSwgV0tDb250ZXh0TWVudUl0ZW1SZWYg
Y29udGV4dE1lbnVJdGVtLCBjb25zdCB2b2lkKiBjbGllbnRJbmZvKTsKQEAgLTQ1Miw5ICs0NjYs
MTMgQEAgV0tfRVhQT1JUIHZvaWQgV0tQYWdlQ2VudGVyU2VsZWN0aW9uSW5WaQogV0tfRVhQT1JU
IHZvaWQgV0tQYWdlRmluZFN0cmluZyhXS1BhZ2VSZWYgcGFnZSwgV0tTdHJpbmdSZWYgc3RyaW5n
LCBXS0ZpbmRPcHRpb25zIGZpbmRPcHRpb25zLCB1bnNpZ25lZCBtYXhNYXRjaENvdW50KTsKIFdL
X0VYUE9SVCB2b2lkIFdLUGFnZUhpZGVGaW5kVUkoV0tQYWdlUmVmIHBhZ2UpOwogV0tfRVhQT1JU
IHZvaWQgV0tQYWdlQ291bnRTdHJpbmdNYXRjaGVzKFdLUGFnZVJlZiBwYWdlLCBXS1N0cmluZ1Jl
ZiBzdHJpbmcsIFdLRmluZE9wdGlvbnMgZmluZE9wdGlvbnMsIHVuc2lnbmVkIG1heE1hdGNoQ291
bnQpOworV0tfRVhQT1JUIHZvaWQgV0tQYWdlRmluZFN0cmluZ01hdGNoZXMoV0tQYWdlUmVmIHBh
Z2UsIFdLU3RyaW5nUmVmIHN0cmluZywgV0tGaW5kT3B0aW9ucyBmaW5kT3B0aW9ucywgdW5zaWdu
ZWQgbWF4TWF0Y2hDb3VudCk7CitXS19FWFBPUlQgdm9pZCBXS1BhZ2VHZXRJbWFnZUZvckZpbmRN
YXRjaChXS1BhZ2VSZWYgcGFnZSwgaW50MzJfdCBtYXRjaEluZGV4KTsKK1dLX0VYUE9SVCB2b2lk
IFdLUGFnZVNlbGVjdEZpbmRNYXRjaChXS1BhZ2VSZWYgcGFnZSwgaW50MzJfdCBtYXRjaEluZGV4
KTsKIAogV0tfRVhQT1JUIHZvaWQgV0tQYWdlU2V0UGFnZUNvbnRleHRNZW51Q2xpZW50KFdLUGFn
ZVJlZiBwYWdlLCBjb25zdCBXS1BhZ2VDb250ZXh0TWVudUNsaWVudCogY2xpZW50KTsKIFdLX0VY
UE9SVCB2b2lkIFdLUGFnZVNldFBhZ2VGaW5kQ2xpZW50KFdLUGFnZVJlZiBwYWdlLCBjb25zdCBX
S1BhZ2VGaW5kQ2xpZW50KiBjbGllbnQpOworV0tfRVhQT1JUIHZvaWQgV0tQYWdlU2V0UGFnZUZp
bmRNYXRjaGVzQ2xpZW50KFdLUGFnZVJlZiBwYWdlLCBjb25zdCBXS1BhZ2VGaW5kTWF0Y2hlc0Ns
aWVudCogY2xpZW50KTsKIFdLX0VYUE9SVCB2b2lkIFdLUGFnZVNldFBhZ2VGb3JtQ2xpZW50KFdL
UGFnZVJlZiBwYWdlLCBjb25zdCBXS1BhZ2VGb3JtQ2xpZW50KiBjbGllbnQpOwogV0tfRVhQT1JU
IHZvaWQgV0tQYWdlU2V0UGFnZUxvYWRlckNsaWVudChXS1BhZ2VSZWYgcGFnZSwgY29uc3QgV0tQ
YWdlTG9hZGVyQ2xpZW50KiBjbGllbnQpOwogV0tfRVhQT1JUIHZvaWQgV0tQYWdlU2V0UGFnZVBv
bGljeUNsaWVudChXS1BhZ2VSZWYgcGFnZSwgY29uc3QgV0tQYWdlUG9saWN5Q2xpZW50KiBjbGll
bnQpOwpJbmRleDogU291cmNlL1dlYktpdDIvV2ViUHJvY2Vzcy9XZWJQYWdlL0ZpbmRDb250cm9s
bGVyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9XZWJQcm9jZXNzL1dlYlBhZ2Uv
RmluZENvbnRyb2xsZXIuY3BwCShyZXZpc2lvbiAxMzk2MzUpCisrKyBTb3VyY2UvV2ViS2l0Mi9X
ZWJQcm9jZXNzL1dlYlBhZ2UvRmluZENvbnRyb2xsZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0x
OTMsMzggKzE5Myw0MCBAQCB2b2lkIEZpbmRDb250cm9sbGVyOjpmaW5kU3RyaW5nKGNvbnN0IFN0
CiAgICAgbV93ZWJQYWdlLT5kcmF3aW5nQXJlYSgpLT5kaXNwYXRjaEFmdGVyRW5zdXJpbmdVcGRh
dGVkU2Nyb2xsUG9zaXRpb24oV1RGOjpiaW5kKCZGaW5kQ29udHJvbGxlcjo6dXBkYXRlRmluZFVJ
QWZ0ZXJQYWdlU2Nyb2xsLCB0aGlzLCBmb3VuZCwgc3RyaW5nLCBvcHRpb25zLCBtYXhNYXRjaENv
dW50KSk7CiB9CiAKLXZvaWQgRmluZENvbnRyb2xsZXI6OmhpZGVGaW5kVUkoKQordm9pZCBGaW5k
Q29udHJvbGxlcjo6ZmluZFN0cmluZ01hdGNoZXMoY29uc3QgU3RyaW5nJiBzdHJpbmcsIEZpbmRP
cHRpb25zIG9wdGlvbnMsIHVuc2lnbmVkIG1heE1hdGNoQ291bnQpCiB7Ci0gICAgaWYgKG1fZmlu
ZFBhZ2VPdmVybGF5KQotICAgICAgICBtX3dlYlBhZ2UtPnVuaW5zdGFsbFBhZ2VPdmVybGF5KG1f
ZmluZFBhZ2VPdmVybGF5LCBmYWxzZSk7CisgICAgaWYgKHN0cmluZy5pc0VtcHR5KCkpIHsKKyAg
ICAgICAgbV93ZWJQYWdlLT5zZW5kKE1lc3NhZ2VzOjpXZWJQYWdlUHJveHk6OkRpZEZpbmRTdHJp
bmdNYXRjaGVzKHN0cmluZywgVmVjdG9yPFZlY3RvcjxJbnRSZWN0PiA+KCksIDApKTsKKyAgICAg
ICAgcmV0dXJuOworICAgIH0KIAotICAgIFBsdWdpblZpZXcqIHBsdWdpblZpZXcgPSBwbHVnaW5W
aWV3Rm9yRnJhbWUobV93ZWJQYWdlLT5tYWluRnJhbWUoKSk7Ci0gICAgCi0gICAgaWYgKHBsdWdp
blZpZXcpCi0gICAgICAgIHBsdWdpblZpZXctPmZpbmRTdHJpbmcoZW1wdHlTdHJpbmcoKSwgMCwg
MCk7Ci0gICAgZWxzZQotICAgICAgICBtX3dlYlBhZ2UtPmNvcmVQYWdlKCktPnVubWFya0FsbFRl
eHRNYXRjaGVzKCk7Ci0gICAgCi0gICAgaGlkZUZpbmRJbmRpY2F0b3IoKTsKKyAgICBtX2ZpbmRN
YXRjaGVzLmNsZWFyKCk7CisgICAgaW50IGluZGV4Rm9yU2VsZWN0aW9uOworCisgICAgbV93ZWJQ
YWdlLT5jb3JlUGFnZSgpLT5maW5kU3RyaW5nTWF0Y2hpbmdSYW5nZXMoc3RyaW5nLCBjb3JlKG9w
dGlvbnMpLCBtYXhNYXRjaENvdW50LCAmbV9maW5kTWF0Y2hlcywgaW5kZXhGb3JTZWxlY3Rpb24p
OworICAgIGlmIChtX2ZpbmRNYXRjaGVzLmlzRW1wdHkoKSkgeworICAgICAgICBtX3dlYlBhZ2Ut
PnNlbmQoTWVzc2FnZXM6OldlYlBhZ2VQcm94eTo6RGlkRmluZFN0cmluZ01hdGNoZXMoc3RyaW5n
LCBWZWN0b3I8VmVjdG9yPEludFJlY3Q+ID4oKSwgMCkpOworICAgICAgICByZXR1cm47CisgICAg
fQorCisgICAgVmVjdG9yPFZlY3RvcjxJbnRSZWN0PiA+IG1hdGNoUmVjdHM7CisgICAgZm9yIChz
aXplX3QgaSA9IDA7IGkgPCBtX2ZpbmRNYXRjaGVzLnNpemUoKTsgKytpKSB7CisgICAgICAgIFZl
Y3RvcjxJbnRSZWN0PiByZWN0czsKKyAgICAgICAgbV9maW5kTWF0Y2hlc1tpXS0+dGV4dFJlY3Rz
KHJlY3RzKTsKKyAgICAgICAgbWF0Y2hSZWN0cy5hcHBlbmQocmVjdHMpOworICAgIH0KKworICAg
IG1fd2ViUGFnZS0+c2VuZChNZXNzYWdlczo6V2ViUGFnZVByb3h5OjpEaWRGaW5kU3RyaW5nTWF0
Y2hlcyhzdHJpbmcsIG1hdGNoUmVjdHMsIGluZGV4Rm9yU2VsZWN0aW9uKSk7CiB9CiAKLWJvb2wg
RmluZENvbnRyb2xsZXI6OnVwZGF0ZUZpbmRJbmRpY2F0b3IoRnJhbWUqIHNlbGVjdGVkRnJhbWUs
IGJvb2wgaXNTaG93aW5nT3ZlcmxheSwgYm9vbCBzaG91bGRBbmltYXRlKQorYm9vbCBGaW5kQ29u
dHJvbGxlcjo6Z2V0RmluZEluZGljYXRvckJpdG1hcEFuZFJlY3QoRnJhbWUqIGZyYW1lLCBTaGFy
ZWFibGVCaXRtYXA6OkhhbmRsZSYgaGFuZGxlLCBJbnRSZWN0JiBzZWxlY3Rpb25SZWN0KQogewot
ICAgIGlmICghc2VsZWN0ZWRGcmFtZSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHNlbGVj
dGlvblJlY3QgPSBlbmNsb3NpbmdJbnRSZWN0KGZyYW1lLT5zZWxlY3Rpb24oKS0+Ym91bmRzKCkp
OwogCi0gICAgSW50UmVjdCBzZWxlY3Rpb25SZWN0ID0gZW5jbG9zaW5nSW50UmVjdChzZWxlY3Rl
ZEZyYW1lLT5zZWxlY3Rpb24oKS0+Ym91bmRzKCkpOwotICAgIAogICAgIC8vIFNlbGVjdGlvbiBy
ZWN0IGNhbiBiZSBlbXB0eSBmb3IgbWF0Y2hlcyB0aGF0IGFyZSBjdXJyZW50bHkgb2JzY3VyZWQg
ZnJvbSB2aWV3LgogICAgIGlmIChzZWxlY3Rpb25SZWN0LmlzRW1wdHkoKSkKICAgICAgICAgcmV0
dXJuIGZhbHNlOwogCi0gICAgLy8gV2Ugd2FudCB0aGUgc2VsZWN0aW9uIHJlY3QgaW4gd2luZG93
IGNvb3JkaW5hdGVzLgotICAgIEludFJlY3Qgc2VsZWN0aW9uUmVjdEluV2luZG93Q29vcmRpbmF0
ZXMgPSBzZWxlY3RlZEZyYW1lLT52aWV3KCktPmNvbnRlbnRzVG9XaW5kb3coc2VsZWN0aW9uUmVj
dCk7Ci0gICAgCi0gICAgVmVjdG9yPEZsb2F0UmVjdD4gdGV4dFJlY3RzOwotICAgIHNlbGVjdGVk
RnJhbWUtPnNlbGVjdGlvbigpLT5nZXRDbGlwcGVkVmlzaWJsZVRleHRSZWN0YW5nbGVzKHRleHRS
ZWN0cyk7Ci0KICAgICBJbnRTaXplIGJhY2tpbmdTdG9yZVNpemUgPSBzZWxlY3Rpb25SZWN0LnNp
emUoKTsKICAgICBiYWNraW5nU3RvcmVTaXplLnNjYWxlKG1fd2ViUGFnZS0+Y29yZVBhZ2UoKS0+
ZGV2aWNlU2NhbGVGYWN0b3IoKSk7CiAKQEAgLTIzMiwyNSArMjM0LDg5IEBAIGJvb2wgRmluZENv
bnRyb2xsZXI6OnVwZGF0ZUZpbmRJbmRpY2F0b3IKICAgICBSZWZQdHI8U2hhcmVhYmxlQml0bWFw
PiBmaW5kSW5kaWNhdG9yVGV4dEJhY2tpbmdTdG9yZSA9IFNoYXJlYWJsZUJpdG1hcDo6Y3JlYXRl
U2hhcmVhYmxlKGJhY2tpbmdTdG9yZVNpemUsIFNoYXJlYWJsZUJpdG1hcDo6U3VwcG9ydHNBbHBo
YSk7CiAgICAgaWYgKCFmaW5kSW5kaWNhdG9yVGV4dEJhY2tpbmdTdG9yZSkKICAgICAgICAgcmV0
dXJuIGZhbHNlOwotICAgIAorCiAgICAgT3duUHRyPEdyYXBoaWNzQ29udGV4dD4gZ3JhcGhpY3ND
b250ZXh0ID0gZmluZEluZGljYXRvclRleHRCYWNraW5nU3RvcmUtPmNyZWF0ZUdyYXBoaWNzQ29u
dGV4dCgpOwogICAgIGdyYXBoaWNzQ29udGV4dC0+c2NhbGUoRmxvYXRTaXplKG1fd2ViUGFnZS0+
Y29yZVBhZ2UoKS0+ZGV2aWNlU2NhbGVGYWN0b3IoKSwgbV93ZWJQYWdlLT5jb3JlUGFnZSgpLT5k
ZXZpY2VTY2FsZUZhY3RvcigpKSk7CiAKICAgICBJbnRSZWN0IHBhaW50UmVjdCA9IHNlbGVjdGlv
blJlY3Q7Ci0gICAgcGFpbnRSZWN0Lm1vdmUoc2VsZWN0ZWRGcmFtZS0+dmlldygpLT5mcmFtZVJl
Y3QoKS54KCksIHNlbGVjdGVkRnJhbWUtPnZpZXcoKS0+ZnJhbWVSZWN0KCkueSgpKTsKLSAgICBw
YWludFJlY3QubW92ZSgtc2VsZWN0ZWRGcmFtZS0+dmlldygpLT5zY3JvbGxPZmZzZXQoKSk7Cisg
ICAgcGFpbnRSZWN0Lm1vdmUoZnJhbWUtPnZpZXcoKS0+ZnJhbWVSZWN0KCkueCgpLCBmcmFtZS0+
dmlldygpLT5mcmFtZVJlY3QoKS55KCkpOworICAgIHBhaW50UmVjdC5tb3ZlKC1mcmFtZS0+dmll
dygpLT5zY3JvbGxPZmZzZXQoKSk7CiAKICAgICBncmFwaGljc0NvbnRleHQtPnRyYW5zbGF0ZSgt
cGFpbnRSZWN0LngoKSwgLXBhaW50UmVjdC55KCkpOwotICAgIHNlbGVjdGVkRnJhbWUtPnZpZXco
KS0+c2V0UGFpbnRCZWhhdmlvcihQYWludEJlaGF2aW9yU2VsZWN0aW9uT25seSB8IFBhaW50QmVo
YXZpb3JGb3JjZUJsYWNrVGV4dCB8IFBhaW50QmVoYXZpb3JGbGF0dGVuQ29tcG9zaXRpbmdMYXll
cnMpOwotICAgIHNlbGVjdGVkRnJhbWUtPmRvY3VtZW50KCktPnVwZGF0ZUxheW91dCgpOworICAg
IGZyYW1lLT52aWV3KCktPnNldFBhaW50QmVoYXZpb3IoUGFpbnRCZWhhdmlvclNlbGVjdGlvbk9u
bHkgfCBQYWludEJlaGF2aW9yRm9yY2VCbGFja1RleHQgfCBQYWludEJlaGF2aW9yRmxhdHRlbkNv
bXBvc2l0aW5nTGF5ZXJzKTsKKyAgICBmcmFtZS0+ZG9jdW1lbnQoKS0+dXBkYXRlTGF5b3V0KCk7
CisKKyAgICBmcmFtZS0+dmlldygpLT5wYWludChncmFwaGljc0NvbnRleHQuZ2V0KCksIHBhaW50
UmVjdCk7CisgICAgZnJhbWUtPnZpZXcoKS0+c2V0UGFpbnRCZWhhdmlvcihQYWludEJlaGF2aW9y
Tm9ybWFsKTsKKworICAgIGlmICghZmluZEluZGljYXRvclRleHRCYWNraW5nU3RvcmUtPmNyZWF0
ZUhhbmRsZShoYW5kbGUpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIHRydWU7
Cit9CiAKLSAgICBzZWxlY3RlZEZyYW1lLT52aWV3KCktPnBhaW50KGdyYXBoaWNzQ29udGV4dC5n
ZXQoKSwgcGFpbnRSZWN0KTsKLSAgICBzZWxlY3RlZEZyYW1lLT52aWV3KCktPnNldFBhaW50QmVo
YXZpb3IoUGFpbnRCZWhhdmlvck5vcm1hbCk7Cit2b2lkIEZpbmRDb250cm9sbGVyOjpnZXRJbWFn
ZUZvckZpbmRNYXRjaCh1aW50MzJfdCBtYXRjaEluZGV4KQoreworICAgIGlmIChtYXRjaEluZGV4
ID49IG1fZmluZE1hdGNoZXMuc2l6ZSgpKQorICAgICAgICByZXR1cm47CisgICAgRnJhbWUqIGZy
YW1lID0gbV9maW5kTWF0Y2hlc1ttYXRjaEluZGV4XS0+c3RhcnRDb250YWluZXIoKS0+ZG9jdW1l
bnQoKS0+ZnJhbWUoKTsKKyAgICBpZiAoIWZyYW1lKQorICAgICAgICByZXR1cm47CisKKyAgICBW
aXNpYmxlU2VsZWN0aW9uIG9sZFNlbGVjdGlvbiA9IGZyYW1lLT5zZWxlY3Rpb24oKS0+c2VsZWN0
aW9uKCk7CisgICAgZnJhbWUtPnNlbGVjdGlvbigpLT5zZXRTZWxlY3Rpb24oVmlzaWJsZVNlbGVj
dGlvbihtX2ZpbmRNYXRjaGVzW21hdGNoSW5kZXhdLmdldCgpKSk7CisKKyAgICBJbnRSZWN0IHNl
bGVjdGlvblJlY3Q7CisgICAgU2hhcmVhYmxlQml0bWFwOjpIYW5kbGUgaGFuZGxlOworICAgIGlm
ICghZ2V0RmluZEluZGljYXRvckJpdG1hcEFuZFJlY3QoZnJhbWUsIGhhbmRsZSwgc2VsZWN0aW9u
UmVjdCkpCisgICAgICAgIHJldHVybjsKKworICAgIGZyYW1lLT5zZWxlY3Rpb24oKS0+c2V0U2Vs
ZWN0aW9uKG9sZFNlbGVjdGlvbik7CisKKyAgICBtX3dlYlBhZ2UtPnNlbmQoTWVzc2FnZXM6Oldl
YlBhZ2VQcm94eTo6RGlkR2V0SW1hZ2VGb3JGaW5kTWF0Y2goaGFuZGxlLCBtYXRjaEluZGV4KSk7
Cit9CisKK3ZvaWQgRmluZENvbnRyb2xsZXI6OnNlbGVjdEZpbmRNYXRjaCh1aW50MzJfdCBtYXRj
aEluZGV4KQoreworICAgIGlmIChtYXRjaEluZGV4ID49IG1fZmluZE1hdGNoZXMuc2l6ZSgpKQor
ICAgICAgICByZXR1cm47CisgICAgRnJhbWUqIGZyYW1lID0gbV9maW5kTWF0Y2hlc1ttYXRjaElu
ZGV4XS0+c3RhcnRDb250YWluZXIoKS0+ZG9jdW1lbnQoKS0+ZnJhbWUoKTsKKyAgICBpZiAoIWZy
YW1lKQorICAgICAgICByZXR1cm47CisgICAgZnJhbWUtPnNlbGVjdGlvbigpLT5zZXRTZWxlY3Rp
b24oVmlzaWJsZVNlbGVjdGlvbihtX2ZpbmRNYXRjaGVzW21hdGNoSW5kZXhdLmdldCgpKSk7Cit9
CisKK3ZvaWQgRmluZENvbnRyb2xsZXI6OmhpZGVGaW5kVUkoKQoreworICAgIG1fZmluZE1hdGNo
ZXMuY2xlYXIoKTsKKyAgICBpZiAobV9maW5kUGFnZU92ZXJsYXkpCisgICAgICAgIG1fd2ViUGFn
ZS0+dW5pbnN0YWxsUGFnZU92ZXJsYXkobV9maW5kUGFnZU92ZXJsYXksIGZhbHNlKTsKKworICAg
IFBsdWdpblZpZXcqIHBsdWdpblZpZXcgPSBwbHVnaW5WaWV3Rm9yRnJhbWUobV93ZWJQYWdlLT5t
YWluRnJhbWUoKSk7CiAgICAgCisgICAgaWYgKHBsdWdpblZpZXcpCisgICAgICAgIHBsdWdpblZp
ZXctPmZpbmRTdHJpbmcoZW1wdHlTdHJpbmcoKSwgMCwgMCk7CisgICAgZWxzZQorICAgICAgICBt
X3dlYlBhZ2UtPmNvcmVQYWdlKCktPnVubWFya0FsbFRleHRNYXRjaGVzKCk7CisgICAgCisgICAg
aGlkZUZpbmRJbmRpY2F0b3IoKTsKK30KKworYm9vbCBGaW5kQ29udHJvbGxlcjo6dXBkYXRlRmlu
ZEluZGljYXRvcihGcmFtZSogc2VsZWN0ZWRGcmFtZSwgYm9vbCBpc1Nob3dpbmdPdmVybGF5LCBi
b29sIHNob3VsZEFuaW1hdGUpCit7CisgICAgaWYgKCFzZWxlY3RlZEZyYW1lKQorICAgICAgICBy
ZXR1cm4gZmFsc2U7CisKKyAgICBJbnRSZWN0IHNlbGVjdGlvblJlY3Q7CiAgICAgU2hhcmVhYmxl
Qml0bWFwOjpIYW5kbGUgaGFuZGxlOwotICAgIGlmICghZmluZEluZGljYXRvclRleHRCYWNraW5n
U3RvcmUtPmNyZWF0ZUhhbmRsZShoYW5kbGUpKQorICAgIGlmICghZ2V0RmluZEluZGljYXRvckJp
dG1hcEFuZFJlY3Qoc2VsZWN0ZWRGcmFtZSwgaGFuZGxlLCBzZWxlY3Rpb25SZWN0KSkKICAgICAg
ICAgcmV0dXJuIGZhbHNlOwogCisgICAgLy8gV2Ugd2FudCB0aGUgc2VsZWN0aW9uIHJlY3QgaW4g
d2luZG93IGNvb3JkaW5hdGVzLgorICAgIEludFJlY3Qgc2VsZWN0aW9uUmVjdEluV2luZG93Q29v
cmRpbmF0ZXMgPSBzZWxlY3RlZEZyYW1lLT52aWV3KCktPmNvbnRlbnRzVG9XaW5kb3coc2VsZWN0
aW9uUmVjdCk7CisKKyAgICBWZWN0b3I8RmxvYXRSZWN0PiB0ZXh0UmVjdHM7CisgICAgc2VsZWN0
ZWRGcmFtZS0+c2VsZWN0aW9uKCktPmdldENsaXBwZWRWaXNpYmxlVGV4dFJlY3RhbmdsZXModGV4
dFJlY3RzKTsKKwogICAgIC8vIFdlIHdhbnQgdGhlIHRleHQgcmVjdHMgaW4gc2VsZWN0aW9uIHJl
Y3QgY29vcmRpbmF0ZXMuCiAgICAgVmVjdG9yPEZsb2F0UmVjdD4gdGV4dFJlY3RzSW5TZWxlY3Rp
b25SZWN0Q29vcmRpbmF0ZXM7CiAgICAgCkluZGV4OiBTb3VyY2UvV2ViS2l0Mi9XZWJQcm9jZXNz
L1dlYlBhZ2UvRmluZENvbnRyb2xsZXIuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9X
ZWJQcm9jZXNzL1dlYlBhZ2UvRmluZENvbnRyb2xsZXIuaAkocmV2aXNpb24gMTM5NjM1KQorKysg
U291cmNlL1dlYktpdDIvV2ViUHJvY2Vzcy9XZWJQYWdlL0ZpbmRDb250cm9sbGVyLmgJKHdvcmtp
bmcgY29weSkKQEAgLTI3LDYgKzI3LDcgQEAKICNkZWZpbmUgRmluZENvbnRyb2xsZXJfaAogCiAj
aW5jbHVkZSAiUGFnZU92ZXJsYXkuaCIKKyNpbmNsdWRlICJTaGFyZWFibGVCaXRtYXAuaCIKICNp
bmNsdWRlICJXZWJGaW5kT3B0aW9ucy5oIgogI2luY2x1ZGUgPFdlYkNvcmUvSW50UmVjdC5oPgog
I2luY2x1ZGUgPHd0Zi9Gb3J3YXJkLmg+CkBAIC0zNSw2ICszNiw3IEBACiAKIG5hbWVzcGFjZSBX
ZWJDb3JlIHsKICAgICBjbGFzcyBGcmFtZTsKKyAgICBjbGFzcyBSYW5nZTsKIH0KIAogbmFtZXNw
YWNlIFdlYktpdCB7CkBAIC00OSw2ICs1MSw5IEBAIHB1YmxpYzoKICAgICB2aXJ0dWFsIH5GaW5k
Q29udHJvbGxlcigpOwogCiAgICAgdm9pZCBmaW5kU3RyaW5nKGNvbnN0IFN0cmluZyYsIEZpbmRP
cHRpb25zLCB1bnNpZ25lZCBtYXhNYXRjaENvdW50KTsKKyAgICB2b2lkIGZpbmRTdHJpbmdNYXRj
aGVzKGNvbnN0IFN0cmluZyYsIEZpbmRPcHRpb25zLCB1bnNpZ25lZCBtYXhNYXRjaENvdW50KTsK
KyAgICB2b2lkIGdldEltYWdlRm9yRmluZE1hdGNoKHVpbnQzMl90IG1hdGNoSW5kZXgpOworICAg
IHZvaWQgc2VsZWN0RmluZE1hdGNoKHVpbnQzMl90IG1hdGNoSW5kZXgpOwogICAgIHZvaWQgaGlk
ZUZpbmRVSSgpOwogICAgIHZvaWQgY291bnRTdHJpbmdNYXRjaGVzKGNvbnN0IFN0cmluZyYsIEZp
bmRPcHRpb25zLCB1bnNpZ25lZCBtYXhNYXRjaENvdW50KTsKICAgICAKQEAgLTY4LDYgKzczLDcg
QEAgcHJpdmF0ZToKICAgICB2aXJ0dWFsIHZvaWQgZHJhd1JlY3QoUGFnZU92ZXJsYXkqLCBXZWJD
b3JlOjpHcmFwaGljc0NvbnRleHQmLCBjb25zdCBXZWJDb3JlOjpJbnRSZWN0JiBkaXJ0eVJlY3Qp
OwogCiAgICAgVmVjdG9yPFdlYkNvcmU6OkludFJlY3Q+IHJlY3RzRm9yVGV4dE1hdGNoZXMoKTsK
KyAgICBib29sIGdldEZpbmRJbmRpY2F0b3JCaXRtYXBBbmRSZWN0KFdlYkNvcmU6OkZyYW1lKiBm
cmFtZSwgU2hhcmVhYmxlQml0bWFwOjpIYW5kbGUmIGhhbmRsZSwgV2ViQ29yZTo6SW50UmVjdCYg
c2VsZWN0aW9uUmVjdCk7CiAgICAgYm9vbCB1cGRhdGVGaW5kSW5kaWNhdG9yKFdlYkNvcmU6OkZy
YW1lKiBzZWxlY3RlZEZyYW1lLCBib29sIGlzU2hvd2luZ092ZXJsYXksIGJvb2wgc2hvdWxkQW5p
bWF0ZSA9IHRydWUpOwogCiAgICAgdm9pZCB1cGRhdGVGaW5kVUlBZnRlclBhZ2VTY3JvbGwoYm9v
bCBmb3VuZCwgY29uc3QgU3RyaW5nJiwgRmluZE9wdGlvbnMsIHVuc2lnbmVkIG1heE1hdGNoQ291
bnQpOwpAQCAtNzksNiArODUsNyBAQCBwcml2YXRlOgogICAgIC8vIHRoZSBmaW5kIGluZGljYXRv
ciBpc24ndCBzaG93aW5nLCBidXQgaXQgd2lsbCBuZXZlciBiZSBmYWxzZSB3aGVuIGl0IGlzIHNo
b3dpbmcuCiAgICAgYm9vbCBtX2lzU2hvd2luZ0ZpbmRJbmRpY2F0b3I7CiAgICAgV2ViQ29yZTo6
SW50UmVjdCBtX2ZpbmRJbmRpY2F0b3JSZWN0OworICAgIFZlY3RvcjxSZWZQdHI8V2ViQ29yZTo6
UmFuZ2U+ID4gbV9maW5kTWF0Y2hlczsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIFdlYktpdApJbmRl
eDogU291cmNlL1dlYktpdDIvV2ViUHJvY2Vzcy9XZWJQYWdlL1dlYlBhZ2UuY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9XZWJLaXQyL1dlYlByb2Nlc3MvV2ViUGFnZS9XZWJQYWdlLmNwcAkocmV2
aXNpb24gMTM5NjM1KQorKysgU291cmNlL1dlYktpdDIvV2ViUHJvY2Vzcy9XZWJQYWdlL1dlYlBh
Z2UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNjgwLDYgKzI2ODAsMjEgQEAgdm9pZCBXZWJQYWdl
OjpmaW5kU3RyaW5nKGNvbnN0IFN0cmluZyYgcwogICAgIG1fZmluZENvbnRyb2xsZXIuZmluZFN0
cmluZyhzdHJpbmcsIHN0YXRpY19jYXN0PEZpbmRPcHRpb25zPihvcHRpb25zKSwgbWF4TWF0Y2hD
b3VudCk7CiB9CiAKK3ZvaWQgV2ViUGFnZTo6ZmluZFN0cmluZ01hdGNoZXMoY29uc3QgU3RyaW5n
JiBzdHJpbmcsIHVpbnQzMl90IG9wdGlvbnMsIHVpbnQzMl90IG1heE1hdGNoQ291bnQpCit7Cisg
ICAgbV9maW5kQ29udHJvbGxlci5maW5kU3RyaW5nTWF0Y2hlcyhzdHJpbmcsIHN0YXRpY19jYXN0
PEZpbmRPcHRpb25zPihvcHRpb25zKSwgbWF4TWF0Y2hDb3VudCk7Cit9CisKK3ZvaWQgV2ViUGFn
ZTo6Z2V0SW1hZ2VGb3JGaW5kTWF0Y2godWludDMyX3QgbWF0Y2hJbmRleCkKK3sKKyAgICBtX2Zp
bmRDb250cm9sbGVyLmdldEltYWdlRm9yRmluZE1hdGNoKG1hdGNoSW5kZXgpOworfQorCit2b2lk
IFdlYlBhZ2U6OnNlbGVjdEZpbmRNYXRjaCh1aW50MzJfdCBtYXRjaEluZGV4KQoreworICAgIG1f
ZmluZENvbnRyb2xsZXIuc2VsZWN0RmluZE1hdGNoKG1hdGNoSW5kZXgpOworfQorCiB2b2lkIFdl
YlBhZ2U6OmhpZGVGaW5kVUkoKQogewogICAgIG1fZmluZENvbnRyb2xsZXIuaGlkZUZpbmRVSSgp
OwpJbmRleDogU291cmNlL1dlYktpdDIvV2ViUHJvY2Vzcy9XZWJQYWdlL1dlYlBhZ2UuaAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9XZWJQcm9jZXNzL1dlYlBhZ2UvV2ViUGFnZS5oCShy
ZXZpc2lvbiAxMzk2MzUpCisrKyBTb3VyY2UvV2ViS2l0Mi9XZWJQcm9jZXNzL1dlYlBhZ2UvV2Vi
UGFnZS5oCSh3b3JraW5nIGNvcHkpCkBAIC03MjksNiArNzI5LDkgQEAgcHJpdmF0ZToKICAgICB2
b2lkIGRpZFJlbW92ZUVkaXRDb21tYW5kKHVpbnQ2NF90IGNvbW1hbmRJRCk7CiAKICAgICB2b2lk
IGZpbmRTdHJpbmcoY29uc3QgU3RyaW5nJiwgdWludDMyX3QgZmluZE9wdGlvbnMsIHVpbnQzMl90
IG1heE1hdGNoQ291bnQpOworICAgIHZvaWQgZmluZFN0cmluZ01hdGNoZXMoY29uc3QgU3RyaW5n
JiwgdWludDMyX3QgZmluZE9wdGlvbnMsIHVpbnQzMl90IG1heE1hdGNoQ291bnQpOworICAgIHZv
aWQgZ2V0SW1hZ2VGb3JGaW5kTWF0Y2godWludDMyX3QgbWF0Y2hJbmRleCk7CisgICAgdm9pZCBz
ZWxlY3RGaW5kTWF0Y2godWludDMyX3QgbWF0Y2hJbmRleCk7CiAgICAgdm9pZCBoaWRlRmluZFVJ
KCk7CiAgICAgdm9pZCBjb3VudFN0cmluZ01hdGNoZXMoY29uc3QgU3RyaW5nJiwgdWludDMyX3Qg
ZmluZE9wdGlvbnMsIHVpbnQzMl90IG1heE1hdGNoQ291bnQpOwogCkluZGV4OiBTb3VyY2UvV2Vi
S2l0Mi9XZWJQcm9jZXNzL1dlYlBhZ2UvV2ViUGFnZS5tZXNzYWdlcy5pbgo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvV2ViS2l0Mi9XZWJQcm9jZXNzL1dlYlBhZ2UvV2ViUGFnZS5tZXNzYWdlcy5pbgko
cmV2aXNpb24gMTM5NjM1KQorKysgU291cmNlL1dlYktpdDIvV2ViUHJvY2Vzcy9XZWJQYWdlL1dl
YlBhZ2UubWVzc2FnZXMuaW4JKHdvcmtpbmcgY29weSkKQEAgLTE1MSw2ICsxNTEsOSBAQCBtZXNz
YWdlcyAtPiBXZWJQYWdlIHsKIAogICAgICMgRmluZC4KICAgICBGaW5kU3RyaW5nKFdURjo6U3Ry
aW5nIHN0cmluZywgdWludDMyX3QgZmluZE9wdGlvbnMsIHVuc2lnbmVkIG1heE1hdGNoQ291bnQp
CisgICAgRmluZFN0cmluZ01hdGNoZXMoV1RGOjpTdHJpbmcgc3RyaW5nLCB1aW50MzJfdCBmaW5k
T3B0aW9ucywgdW5zaWduZWQgbWF4TWF0Y2hDb3VudCkKKyAgICBHZXRJbWFnZUZvckZpbmRNYXRj
aCh1aW50MzJfdCBtYXRjaEluZGV4KQorICAgIFNlbGVjdEZpbmRNYXRjaCh1aW50MzJfdCBtYXRj
aEluZGV4KQogICAgIEhpZGVGaW5kVUkoKQogICAgIENvdW50U3RyaW5nTWF0Y2hlcyhXVEY6OlN0
cmluZyBzdHJpbmcsIHVpbnQzMl90IGZpbmRPcHRpb25zLCB1bnNpZ25lZCBtYXhNYXRjaENvdW50
KQogCkluZGV4OiBTb3VyY2UvV2ViS2l0L21hYy9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL1dlYktpdC9tYWMvQ2hhbmdlTG9nCShyZXZpc2lvbiAxMzk2NzUpCisrKyBTb3VyY2UvV2Vi
S2l0L21hYy9DaGFuZ2VMb2cJKHdvcmtpbmcgY29weSkKQEAgLTEsMyArMSwyMiBAQAorMjAxMy0w
MS0xNCAgRW5yaWNhIENhc3VjY2kgIDxlbnJpY2FAYXBwbGUuY29tPgorCisgICAgICAgIEFkZCBh
IG5ldyBzZXQgb2YgV2ViS2l0MiBBUElzIGZvciB0ZXh0IHNlYXJjaCBhbmQKKyAgICAgICAgc2Vh
cmNoIHJlc3VsdHMgbWFuYWdlbWVudC4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcv
c2hvd19idWcuY2dpP2lkPTEwNjgzNC4KKyAgICAgICAgPHJkYXI6Ly9wcm9ibGVtLzEyNTk3MTU5
PgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorICAgICAgICAKKyAgICAg
ICAgQWRkaW5nIG5ldyBBUEkgdG8gcGVyZm9ybSB0ZXh0IHNlYXJjaCBpbiBXZWJLaXQyIHdpdGhv
dXQgdXNpbmcKKyAgICAgICAgdGhlIHN0b2NrIFVJLiBUaGUgbmV3IGludGVyZmFjZSBwcm92aWRl
cyBhbGwgdGhlIGluZm9ybWF0aW9uCisgICAgICAgIG5lY2Vzc2FyeSB0byB3cml0ZSBhIGN1c3Rv
bSBVSSBmb3Igc2VhcmNoLgorCisgICAgICAgIEFkZGVkIG5ldyBUZXh0V2ViS2l0QVBJIHRlc3Qu
CisKKyAgICAgICAgKiBXZWJWaWV3L1dlYkhUTUxWaWV3Lm1tOgorICAgICAgICAoLVtXZWJIVE1M
VmlldyBjb3VudE1hdGNoZXNGb3JUZXh0OmluRE9NUmFuZ2U6b3B0aW9uczpsaW1pdDptYXJrTWF0
Y2hlczpdKToKKyAgICAgICAgTW9kaWZpZWQgdG8gcmVmbGVjdCB0aGUgY2hhbmdlcyB0byBFZGl0
b3I6OmNvdW50TWF0Y2hlc0ZvclRleHQgaW50ZXJmYWNlLgorCiAyMDEzLTAxLTEwICBaYW4gRG9i
ZXJzZWsgIDx6YW5kb2JlcnNla0BnbWFpbC5jb20+CiAKICAgICAgICAgUmVtb3ZlIHRoZSBFTkFC
TEVfQU5JTUFUSU9OX0FQSSBmZWF0dXJlIGRlZmluZSBvY2N1cmVuY2VzCkluZGV4OiBTb3VyY2Uv
V2ViS2l0L21hYy9XZWJWaWV3L1dlYkhUTUxWaWV3Lm1tCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9X
ZWJLaXQvbWFjL1dlYlZpZXcvV2ViSFRNTFZpZXcubW0JKHJldmlzaW9uIDEzOTYzNSkKKysrIFNv
dXJjZS9XZWJLaXQvbWFjL1dlYlZpZXcvV2ViSFRNTFZpZXcubW0JKHdvcmtpbmcgY29weSkKQEAg
LTYyMTQsNyArNjIxNCw3IEBAIC0gKE5TVUludGVnZXIpY291bnRNYXRjaGVzRm9yVGV4dDooTlNT
dHIKICAgICBpZiAoIWNvcmVGcmFtZSkKICAgICAgICAgcmV0dXJuIDA7CiAKLSAgICByZXR1cm4g
Y29yZUZyYW1lLT5lZGl0b3IoKS0+Y291bnRNYXRjaGVzRm9yVGV4dChzdHJpbmcsIGNvcmUocmFu
Z2UpLCBjb3JlT3B0aW9ucyhvcHRpb25zKSwgbGltaXQsIG1hcmtNYXRjaGVzKTsKKyAgICByZXR1
cm4gY29yZUZyYW1lLT5lZGl0b3IoKS0+Y291bnRNYXRjaGVzRm9yVGV4dChzdHJpbmcsIGNvcmUo
cmFuZ2UpLCBjb3JlT3B0aW9ucyhvcHRpb25zKSwgbGltaXQsIG1hcmtNYXRjaGVzLCAwKTsKIH0K
IAogLSAodm9pZClzZXRNYXJrZWRUZXh0TWF0Y2hlc0FyZUhpZ2hsaWdodGVkOihCT09MKW5ld1Zh
bHVlCkluZGV4OiBUb29scy9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQ2hhbmdlTG9n
CShyZXZpc2lvbiAxMzk2NzUpCisrKyBUb29scy9DaGFuZ2VMb2cJKHdvcmtpbmcgY29weSkKQEAg
LTEsMyArMSwxOCBAQAorMjAxMy0wMS0xNCAgRW5yaWNhIENhc3VjY2kgIDxlbnJpY2FAYXBwbGUu
Y29tPgorCisgICAgICAgIEFkZCBhIG5ldyBzZXQgb2YgV2ViS2l0MiBBUElzIGZvciB0ZXh0IHNl
YXJjaCBhbmQKKyAgICAgICAgc2VhcmNoIHJlc3VsdHMgbWFuYWdlbWVudC4KKyAgICAgICAgaHR0
cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEwNjgzNC4KKyAgICAgICAgPHJk
YXI6Ly9wcm9ibGVtLzEyNTk3MTU5PgorCisgICAgICAgIEFkZGVkIG5ldyB0ZXN0IGZvciB0aGUg
bmV3IFdlYktpdDIgQVBJIGZvcgorICAgICAgICB0ZXh0IHNlYXJjaC4KKyAgICAgICAgCisgICAg
ICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgICogVGVzdFdlYktpdEFQ
SS9UZXN0V2ViS2l0QVBJLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2o6CisgICAgICAgICogVGVz
dFdlYktpdEFQSS9UZXN0cy9XZWJLaXQyL0ZpbmRNYXRjaGVzLm1tOiBBZGRlZC4KKwogMjAxMy0w
MS0xNCAgRG9taW5pYyBNYXp6b25pICA8ZG1henpvbmlAZ29vZ2xlLmNvbT4KIAogICAgICAgICBB
WDogTmVlZCB0byBpbXBsZW1lbnQgQ29sb3JXZWxsUm9sZQpJbmRleDogVG9vbHMvVGVzdFdlYktp
dEFQSS9UZXN0V2ViS2l0QVBJLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gVG9vbHMvVGVzdFdlYktpdEFQSS9UZXN0V2ViS2l0QVBJLnhjb2RlcHJvai9wcm9qZWN0LnBi
eHByb2oJKHJldmlzaW9uIDEzOTYzNSkKKysrIFRvb2xzL1Rlc3RXZWJLaXRBUEkvVGVzdFdlYktp
dEFQSS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCSh3b3JraW5nIGNvcHkpCkBAIC0xNzcsNiAr
MTc3LDcgQEAKIAkJQzBDNUQzQkUxNDU5OEI2RjAwQTgwMkE2IC8qIEdldEJhY2tpbmdTY2FsZUZh
Y3Rvci5tbSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEMw
QzVEM0JDMTQ1OThCNkYwMEE4MDJBNiAvKiBHZXRCYWNraW5nU2NhbGVGYWN0b3IubW0gKi87IH07
CiAJCUMwQzVEM0M2MTQ1OTkxMjkwMEE4MDJBNiAvKiBHZXRCYWNraW5nU2NhbGVGYWN0b3JfQnVu
ZGxlLm1tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQzBD
NUQzQkQxNDU5OEI2RjAwQTgwMkE2IC8qIEdldEJhY2tpbmdTY2FsZUZhY3Rvcl9CdW5kbGUubW0g
Ki87IH07CiAJCUM1MDdFOEE3MTRDNjU0NUIwMDVENkIzQiAvKiBJbnNwZWN0b3JCYXIubW0gaW4g
U291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBDNTA3RThBNjE0QzY1
NDVCMDA1RDZCM0IgLyogSW5zcGVjdG9yQmFyLm1tICovOyB9OworCQlDNTFBRkI5OTE2OUY0OUZG
MDA5Q0NGNjYgLyogRmluZE1hdGNoZXMubW0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWls
ZEZpbGU7IGZpbGVSZWYgPSBDNTFBRkI5ODE2OUY0OUZGMDA5Q0NGNjYgLyogRmluZE1hdGNoZXMu
bW0gKi87IH07CiAJCUM1NDBGNzc2MTUyRTREQTAwMEE0MEM4QyAvKiBTaW1wbGlmeU1hcmt1cC5t
bSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEM1NDBGNzc1
MTUyRTREQTAwMEE0MEM4QyAvKiBTaW1wbGlmeU1hcmt1cC5tbSAqLzsgfTsKIAkJQzU0MEY3ODQx
NTJFNUE5QTAwQTQwQzhDIC8qIHZlcmJvc2VNYXJrdXAuaHRtbCBpbiBDb3B5IFJlc291cmNlcyAq
LyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBDNTQwRjc4MzE1MkU1QTc4MDBBNDBD
OEMgLyogdmVyYm9zZU1hcmt1cC5odG1sICovOyB9OwogCQlDRDU0OTdCNDE1ODU3RjBDMDBCNUJD
MzAgLyogTWVkaWFUaW1lLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsg
ZmlsZVJlZiA9IENENTQ5N0IzMTU4NTdGMEMwMEI1QkMzMCAvKiBNZWRpYVRpbWUuY3BwICovOyB9
OwpAQCAtNDQ1LDYgKzQ0Niw3IEBACiAJCUMwQzVEM0JDMTQ1OThCNkYwMEE4MDJBNiAvKiBHZXRC
YWNraW5nU2NhbGVGYWN0b3IubW0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVu
Y29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5vYmpjcHA7IHBh
dGggPSBHZXRCYWNraW5nU2NhbGVGYWN0b3IubW07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07
CiAJCUMwQzVEM0JEMTQ1OThCNkYwMEE4MDJBNiAvKiBHZXRCYWNraW5nU2NhbGVGYWN0b3JfQnVu
ZGxlLm1tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxh
c3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAub2JqY3BwOyBwYXRoID0gR2V0QmFja2lu
Z1NjYWxlRmFjdG9yX0J1bmRsZS5tbTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJQzUw
N0U4QTYxNEM2NTQ1QjAwNUQ2QjNCIC8qIEluc3BlY3RvckJhci5tbSAqLyA9IHtpc2EgPSBQQlhG
aWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJj
ZWNvZGUuY3BwLm9iamNwcDsgcGF0aCA9IEluc3BlY3RvckJhci5tbTsgc291cmNlVHJlZSA9ICI8
Z3JvdXA+IjsgfTsKKwkJQzUxQUZCOTgxNjlGNDlGRjAwOUNDRjY2IC8qIEZpbmRNYXRjaGVzLm1t
ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93
bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAub2JqY3BwOyBwYXRoID0gRmluZE1hdGNoZXMubW07
IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUM1NDBGNzc1MTUyRTREQTAwMEE0MEM4QyAv
KiBTaW1wbGlmeU1hcmt1cC5tbSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5j
b2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLm9iamNwcDsgcGF0
aCA9IFNpbXBsaWZ5TWFya3VwLm1tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlDNTQw
Rjc4MzE1MkU1QTc4MDBBNDBDOEMgLyogdmVyYm9zZU1hcmt1cC5odG1sICovID0ge2lzYSA9IFBC
WEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4
dC5odG1sOyBwYXRoID0gdmVyYm9zZU1hcmt1cC5odG1sOyBzb3VyY2VUcmVlID0gIjxncm91cD4i
OyB9OwogCQlDRDU0OTdCMzE1ODU3RjBDMDBCNUJDMzAgLyogTWVkaWFUaW1lLmNwcCAqLyA9IHtp
c2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlw
ZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgbmFtZSA9IE1lZGlhVGltZS5jcHA7IHBhdGggPSBXVEYv
TWVkaWFUaW1lLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKQEAgLTYxNCw2ICs2MTYs
NyBAQAogCQkJCTFBNUZFRkRDMTI3MEUyQTMwMDBFMjkyMSAvKiBFdmFsdWF0ZUphdmFTY3JpcHQu
Y3BwICovLAogCQkJCUJDQzhCOTVBMTI2MTFGNDcwMERFNDZBNCAvKiBGYWlsZWRMb2FkLmNwcCAq
LywKIAkJCQkxQTAyQzg0RTEyNUQ0QTg0MDBFM0Y0QkQgLyogRmluZC5jcHAgKi8sCisJCQkJQzUx
QUZCOTgxNjlGNDlGRjAwOUNDRjY2IC8qIEZpbmRNYXRjaGVzLm1tICovLAogCQkJCTFBREJFRkFE
MTMwQzY4OUMwMEQ2MUQxOSAvKiBGb3JjZVJlcGFpbnQuY3BwICovLAogCQkJCUJDQkQzNzBGMTI1
QUEyRUIwMEQyQzI5RiAvKiBGcmFtZU1JTUVUeXBlSFRNTC5jcHAgKi8sCiAJCQkJQkNCRDM3NjAx
MjVBQkNGRTAwRDJDMjlGIC8qIEZyYW1lTUlNRVR5cGVQTkcuY3BwICovLApAQCAtMTA1OCw2ICsx
MDYxLDcgQEAKIAkJCQlCQzkwOTk1RTEyNTY3QkMxMDAwODM3NTYgLyogV0tTdHJpbmcuY3BwIGlu
IFNvdXJjZXMgKi8sCiAJCQkJQkM5MDk5OTQxMjU2QUNGMTAwMDgzNzU2IC8qIFdLU3RyaW5nSlNT
dHJpbmcuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJMjY1QUY1NTAxNUQxRTQ4QTAwQjBDQjRBIC8q
IFdURlN0cmluZy5jcHAgaW4gU291cmNlcyAqLywKKwkJCQlDNTFBRkI5OTE2OUY0OUZGMDA5Q0NG
NjYgLyogRmluZE1hdGNoZXMubW0gaW4gU291cmNlcyAqLywKIAkJCSk7CiAJCQlydW5Pbmx5Rm9y
RGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKIAkJfTsKSW5kZXg6IFRvb2xzL1Rlc3RXZWJL
aXRBUEkvVGVzdHMvV2ViS2l0Mi9GaW5kTWF0Y2hlcy5tbQo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9U
ZXN0V2ViS2l0QVBJL1Rlc3RzL1dlYktpdDIvRmluZE1hdGNoZXMubW0JKHJldmlzaW9uIDApCisr
KyBUb29scy9UZXN0V2ViS2l0QVBJL1Rlc3RzL1dlYktpdDIvRmluZE1hdGNoZXMubW0JKHJldmlz
aW9uIDApCkBAIC0wLDAgKzEsMTQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIEFwcGxl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycn
CisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NM
QUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUwor
ICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lB
TCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICog
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJ
VFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5o
IgorI2luY2x1ZGUgIlBsYXRmb3JtVXRpbGl0aWVzLmgiCisjaW5jbHVkZSAiUGxhdGZvcm1XZWJW
aWV3LmgiCisjaW1wb3J0IDxXZWJLaXQvV2ViRG9jdW1lbnRQcml2YXRlLmg+CisjaW1wb3J0IDxX
ZWJLaXQvRE9NUHJpdmF0ZS5oPgorI2luY2x1ZGUgPFdlYktpdDIvV0tJbWFnZS5oPgorI2ltcG9y
dCA8d3RmL1JldGFpblB0ci5oPgorCitAaW50ZXJmYWNlIEZpbmRNYXRjaGVzV0sxRnJhbWVMb2Fk
RGVsZWdhdGUgOiBOU09iamVjdCB7Cit9CitAZW5kCisKK3N0YXRpYyBib29sIGRpZEZpbmlzaExv
YWRXSzE7CisKK0BpbXBsZW1lbnRhdGlvbiBGaW5kTWF0Y2hlc1dLMUZyYW1lTG9hZERlbGVnYXRl
CisKKy0gKHZvaWQpd2ViVmlldzooV2ViVmlldyAqKXNlbmRlciBkaWRGaW5pc2hMb2FkRm9yRnJh
bWU6KFdlYkZyYW1lICopZnJhbWUKK3sKKyAgICBkaWRGaW5pc2hMb2FkV0sxID0gdHJ1ZTsKK30K
KworQGVuZAorCituYW1lc3BhY2UgVGVzdFdlYktpdEFQSSB7CisKK3N0YXRpYyBib29sIGRpZEZp
bmlzaExvYWQgPSBmYWxzZTsKK3N0YXRpYyBib29sIGRpZENhbGxGaW5kU3RyaW5nTWF0Y2hlcyA9
IGZhbHNlOworc3RhdGljIGJvb2wgZGlkQ2FsbEdldEltYWdlID0gZmFsc2U7CisKK1JldGFpblB0
cjxXZWJWaWV3PiB3ZWJraXQxVmlldzsKKworc3RhdGljIHZvaWQgZGlkRmluaXNoTG9hZEZvckZy
YW1lKFdLUGFnZVJlZiBwYWdlLCBXS0ZyYW1lUmVmIGZyYW1lLCBXS1R5cGVSZWYgdXNlckRhdGEs
IGNvbnN0IHZvaWQqIGNsaWVudEluZm8pCit7CisgICAgZGlkRmluaXNoTG9hZCA9IHRydWU7Cit9
CisKK3N0YXRpYyB2b2lkIGRpZEZpbmRTdHJpbmdNYXRjaGVzKFdLUGFnZVJlZiBwYWdlLCBXS1N0
cmluZ1JlZiBzdHJpbmcsIFdLQXJyYXlSZWYgbWF0Y2hlcywgaW50IGZpcnN0SW5kZXgsIGNvbnN0
IHZvaWQqIGNsaWVudEluZm8pCit7CisgICAgRVhQRUNUX1dLX1NUUkVRKCJIZWxsbyIsIHN0cmlu
Zyk7CisgICAgc2l6ZV90IG51bU1hdGNoZXMgPSBXS0FycmF5R2V0U2l6ZShtYXRjaGVzKTsKKyAg
ICBFWFBFQ1RfRVEoM3UsIG51bU1hdGNoZXMpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkg
PCBudW1NYXRjaGVzOyArK2kpIHsKKyAgICAgICAgV0tUeXBlUmVmIGl0ZW1zID0gV0tBcnJheUdl
dEl0ZW1BdEluZGV4KG1hdGNoZXMsIGkpOworICAgICAgICBXS1R5cGVJRCB0eXBlID0gV0tHZXRU
eXBlSUQoaXRlbXMpOworICAgICAgICBFWFBFQ1RfRVEodHlwZSwgV0tBcnJheUdldFR5cGVJRCgp
KTsKKyAgICAgICAgV0tBcnJheVJlZiByZWN0cyA9IHJlaW50ZXJwcmV0X2Nhc3Q8V0tBcnJheVJl
Zj4oaXRlbXMpOworICAgICAgICBzaXplX3QgbnVtUmVjdHMgPSBXS0FycmF5R2V0U2l6ZShyZWN0
cyk7CisgICAgICAgIEVYUEVDVF9FUSgxdSwgbnVtUmVjdHMpOworICAgICAgICBpdGVtcyA9IFdL
QXJyYXlHZXRJdGVtQXRJbmRleChyZWN0cywgMCk7CisgICAgICAgIHR5cGUgPSBXS0dldFR5cGVJ
RChpdGVtcyk7CisgICAgICAgIEVYUEVDVF9FUSh0eXBlLCBXS1JlY3RHZXRUeXBlSUQoKSk7Cisg
ICAgICAgIFdLUmVjdCByZWN0ID0gV0tSZWN0R2V0VmFsdWUocmVpbnRlcnByZXRfY2FzdDxXS1Jl
Y3RSZWY+KGl0ZW1zKSk7CisgICAgICAgIHJlY3QgPSByZWN0OworICAgIH0KKyAgICBkaWRDYWxs
RmluZFN0cmluZ01hdGNoZXMgPSB0cnVlOworfQorCitzdGF0aWMgdm9pZCBkaWRHZXRJbWFnZUZv
ck1hdGNoUmVzdWx0KFdLUGFnZVJlZiBwYWdlLCBXS0ltYWdlUmVmIGltYWdlLCB1aW50MzJfdCBp
bmRleCwgY29uc3Qgdm9pZCogY2xpZW50SW5mbykKK3sKKyAgICBXS1NpemUgc2l6ZSA9IFdLSW1h
Z2VHZXRTaXplKGltYWdlKTsKKworICAgIERPTURvY3VtZW50ICpkb2N1bWVudCA9IHdlYmtpdDFW
aWV3LmdldCgpLm1haW5GcmFtZURvY3VtZW50OworICAgIERPTVJhbmdlICpyYW5nZSA9IFtkb2N1
bWVudCBjcmVhdGVSYW5nZV07CisgICAgRE9NTm9kZSAqdGFyZ2V0ID0gW2RvY3VtZW50IGdldEVs
ZW1lbnRCeUlkOkAidGFyZ2V0Il07CisgICAgW3JhbmdlIHNlbGVjdE5vZGU6dGFyZ2V0XTsKKyAg
ICBOU0ltYWdlICpleHBlY3RlZEltYWdlID0gW3JhbmdlIHJlbmRlcmVkSW1hZ2VGb3JjaW5nQmxh
Y2tUZXh0OllFU107CisgICAgTlNTaXplIGV4cGVjdGVkU2l6ZSA9IFtleHBlY3RlZEltYWdlIHNp
emVdOworICAgIEVYUEVDVF9FUShzaXplLndpZHRoLCBleHBlY3RlZFNpemUud2lkdGgpOworICAg
IEVYUEVDVF9FUShzaXplLmhlaWdodCwgZXhwZWN0ZWRTaXplLmhlaWdodCk7CisgICAgZGlkQ2Fs
bEdldEltYWdlID0gdHJ1ZTsKK30KKworVEVTVChXZWJLaXQyLCBGaW5kTWF0Y2hlcykKK3sKKyAg
ICBXS1JldGFpblB0cjxXS0NvbnRleHRSZWY+IGNvbnRleHQoQWRvcHRXSywgV0tDb250ZXh0Q3Jl
YXRlKCkpOworICAgIFBsYXRmb3JtV2ViVmlldyB3ZWJWaWV3KGNvbnRleHQuZ2V0KCkpOworICAg
IAorICAgIFdLUGFnZUxvYWRlckNsaWVudCBsb2FkZXJDbGllbnQ7CisgICAgbWVtc2V0KCZsb2Fk
ZXJDbGllbnQsIDAsIHNpemVvZihsb2FkZXJDbGllbnQpKTsKKyAgICAKKyAgICBsb2FkZXJDbGll
bnQudmVyc2lvbiA9IDA7CisgICAgbG9hZGVyQ2xpZW50LmRpZEZpbmlzaExvYWRGb3JGcmFtZSA9
IGRpZEZpbmlzaExvYWRGb3JGcmFtZTsKKyAgICBXS1BhZ2VTZXRQYWdlTG9hZGVyQ2xpZW50KHdl
YlZpZXcucGFnZSgpLCAmbG9hZGVyQ2xpZW50KTsKKworICAgIFdLUGFnZUZpbmRNYXRjaGVzQ2xp
ZW50IGZpbmRNYXRjaGVzQ2xpZW50OworICAgIG1lbXNldCgmZmluZE1hdGNoZXNDbGllbnQsIDAs
IHNpemVvZihmaW5kTWF0Y2hlc0NsaWVudCkpOworCisgICAgZmluZE1hdGNoZXNDbGllbnQudmVy
c2lvbiA9IDA7CisgICAgZmluZE1hdGNoZXNDbGllbnQuZGlkRmluZFN0cmluZ01hdGNoZXMgPSBk
aWRGaW5kU3RyaW5nTWF0Y2hlczsKKyAgICBmaW5kTWF0Y2hlc0NsaWVudC5kaWRHZXRJbWFnZUZv
ck1hdGNoUmVzdWx0ID0gZGlkR2V0SW1hZ2VGb3JNYXRjaFJlc3VsdDsKKworICAgIFdLUGFnZVNl
dFBhZ2VGaW5kTWF0Y2hlc0NsaWVudCh3ZWJWaWV3LnBhZ2UoKSwgJmZpbmRNYXRjaGVzQ2xpZW50
KTsKKworICAgIFdLUmV0YWluUHRyPFdLVVJMUmVmPiB1cmwoQWRvcHRXSywgVXRpbDo6Y3JlYXRl
VVJMRm9yUmVzb3VyY2UoImZpbmQiLCAiaHRtbCIpKTsKKyAgICBXS1BhZ2VMb2FkVVJMKHdlYlZp
ZXcucGFnZSgpLCB1cmwuZ2V0KCkpOworCisgICAgVXRpbDo6cnVuKCZkaWRGaW5pc2hMb2FkKTsK
KworICAgIFdLUmV0YWluUHRyPFdLU3RyaW5nUmVmPiBmaW5kU3RyaW5nKEFkb3B0V0ssIFdLU3Ry
aW5nQ3JlYXRlV2l0aFVURjhDU3RyaW5nKCJIZWxsbyIpKTsKKyAKKyAgICBXS1BhZ2VGaW5kU3Ry
aW5nTWF0Y2hlcyh3ZWJWaWV3LnBhZ2UoKSwgZmluZFN0cmluZy5nZXQoKSwgdHJ1ZSwgMTAwKTsK
KyAgICBVdGlsOjpydW4oJmRpZENhbGxGaW5kU3RyaW5nTWF0Y2hlcyk7CisKKyAgICB3ZWJraXQx
Vmlldy5hZG9wdE5TKFtbV2ViVmlldyBhbGxvY10gaW5pdFdpdGhGcmFtZTpOU01ha2VSZWN0KDAs
IDAsIDEyMCwgMjAwKSBmcmFtZU5hbWU6bmlsIGdyb3VwTmFtZTpuaWxdKTsKKyAgICBSZXRhaW5Q
dHI8RmluZE1hdGNoZXNXSzFGcmFtZUxvYWREZWxlZ2F0ZT4gZnJhbWVMb2FkRGVsZWdhdGUoQWRv
cHROUywgW0ZpbmRNYXRjaGVzV0sxRnJhbWVMb2FkRGVsZWdhdGUgbmV3XSk7CisKKyAgICB3ZWJr
aXQxVmlldy5nZXQoKS5mcmFtZUxvYWREZWxlZ2F0ZSA9IGZyYW1lTG9hZERlbGVnYXRlLmdldCgp
OworICAgIFt3ZWJraXQxVmlldy5nZXQoKS5tYWluRnJhbWUgbG9hZEhUTUxTdHJpbmc6QCJUZXN0
IHNlYXJjaC4gSGVsbG8gPHNwYW4gaWQ9XCJ0YXJnZXRcIj5IZWxsbzwvc3Bhbj4gSGVsbG8hIiBi
YXNlVVJMOltOU1VSTCBVUkxXaXRoU3RyaW5nOkAiYWJvdXQ6YmxhbmsiXV07CisKKyAgICBVdGls
OjpydW4oJmRpZEZpbmlzaExvYWRXSzEpOworCisgICAgV0tQYWdlR2V0SW1hZ2VGb3JGaW5kTWF0
Y2god2ViVmlldy5wYWdlKCksIDApOworICAgIFV0aWw6OnJ1bigmZGlkQ2FsbEdldEltYWdlKTsK
KworICAgIFdLUGFnZUhpZGVGaW5kVUkod2ViVmlldy5wYWdlKCkpOworfQorCit9IC8vIG5hbWVz
cGFjZSBUZXN0V2ViS2l0QVBJCg==
</data>
<flag name="review"
          id="200732"
          type_id="1"
          status="-"
          setter="simon.fraser"
    />
    <flag name="commit-queue"
          id="200742"
          type_id="3"
          status="-"
          setter="eflews.bot"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>182817</attachid>
            <date>2013-01-15 11:36:15 -0800</date>
            <delta_ts>2013-01-15 15:16:54 -0800</delta_ts>
            <desc>Patch2</desc>
            <filename>findAPI.txt</filename>
            <type>text/plain</type>
            <size>48122</size>
            <attacher name="Enrica Casucci">enrica</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDEzOTY3NSkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDMwIEBACisyMDEzLTAxLTE0ICBFbnJpY2Eg
Q2FzdWNjaSAgPGVucmljYUBhcHBsZS5jb20+CisKKyAgICAgICAgQWRkIGEgbmV3IHNldCBvZiBX
ZWJLaXQyIEFQSXMgZm9yIHRleHQgc2VhcmNoIGFuZAorICAgICAgICBzZWFyY2ggcmVzdWx0cyBt
YW5hZ2VtZW50LgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/
aWQ9MTA2ODM0LgorICAgICAgICA8cmRhcjovL3Byb2JsZW0vMTI1OTcxNTk+CisKKyAgICAgICAg
UmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisgICAgICAgIAorICAgICAgICBBZGRpbmcgbmV3
IEFQSSB0byBwZXJmb3JtIHRleHQgc2VhcmNoIGluIFdlYktpdDIgd2l0aG91dCB1c2luZworICAg
ICAgICB0aGUgc3RvY2sgVUkuIFRoZSBuZXcgaW50ZXJmYWNlIHByb3ZpZGVzIGFsbCB0aGUgaW5m
b3JtYXRpb24KKyAgICAgICAgbmVjZXNzYXJ5IHRvIHdyaXRlIGEgY3VzdG9tIFVJIGZvciBzZWFy
Y2guCisKKyAgICAgICAgQWRkZWQgbmV3IFRleHRXZWJLaXRBUEkgdGVzdC4KKworICAgICAgICAq
IFdlYkNvcmUuZXhwLmluOiBBZGRlZCBuZXcgZXhwb3J0ZWQgbWV0aG9kcy4KKyAgICAgICAgKiBl
ZGl0aW5nL0VkaXRvci5jcHA6CisgICAgICAgIChXZWJDb3JlOjpFZGl0b3I6OmNvdW50TWF0Y2hl
c0ZvclRleHQpOiBBZGRlZCBuZXcgcGFyYW1ldGVyIHRvIHN0b3JlCisgICAgICAgIGFsbCB0aGUg
cmFuZ2VzIHJlbGF0aXZlIHRvIHRoZSBtYXRjaGVzIGZvdW5kLgorICAgICAgICAqIGVkaXRpbmcv
RWRpdG9yLmg6IE1vZGlmaWVkIHRoZSBpbnRlcmZhY2Ugb2YgY291bnRNYXRjaGVzRm9yVGV4dCBh
bmQgcmVtb3ZlZAorICAgICAgICB0aGUgb3RoZXIgZGVmaW5pdGlvbiBvZiBjb3VudE1hdGNoZXNG
b3JUZXh0IHdpdGggYSBkaWZmZXJlbnQgc2lnbmF0dXJlLgorICAgICAgICAqIHBhZ2UvUGFnZS5j
cHA6CisgICAgICAgIChXZWJDb3JlOjpQYWdlOjpmaW5kU3RyaW5nTWF0Y2hpbmdSYW5nZXMpOiBB
ZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlBhZ2U6Om1hcmtBbGxNYXRjaGVzRm9yVGV4dCk6IENo
YW5nZWQgdG8gdXNlIHRoZSBuZXcgdW5pZmllZAorICAgICAgICBjb3VudE1hdGNoZXNGb3JUZXh0
LgorICAgICAgICAqIHBhZ2UvUGFnZS5oOgorCiAyMDEzLTAxLTE0ICBIdWFuZyBEb25nc3VuZyAg
PGx1eHRlbGxhQGNvbXBhbnkxMDAubmV0PgogCiAgICAgICAgIFtUZXhNYXBdIFVzZSBhIHByZW11
bGlwbGllZCBjb2xvciBpbiBUZXh0dXJlTWFwcGVyR0wuCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9X
ZWJDb3JlLmV4cC5pbgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9XZWJDb3JlLmV4cC5p
bgkocmV2aXNpb24gMTM5NjM1KQorKysgU291cmNlL1dlYkNvcmUvV2ViQ29yZS5leHAuaW4JKHdv
cmtpbmcgY29weSkKQEAgLTc2Miw2ICs3NjIsNyBAQCBfX1pON1dlYkNvcmU0UGFnZTIxbWFya0Fs
bE1hdGNoZXNGb3JUZXh0CiBfX1pON1dlYkNvcmU0UGFnZTIyYWxsVmlzaXRlZFN0YXRlQ2hhbmdl
ZEVQTlNfOVBhZ2VHcm91cEUKIF9fWk43V2ViQ29yZTRQYWdlMjJub25GYXN0U2Nyb2xsYWJsZVJl
Y3RzRVBLTlNfNUZyYW1lRQogX19aTjdXZWJDb3JlNFBhZ2UyM2NsZWFyVW5kb1JlZG9PcGVyYXRp
b25zRXYKK19fWk43V2ViQ29yZTRQYWdlMjRmaW5kU3RyaW5nTWF0Y2hpbmdSYW5nZXNFUktOM1dU
RjZTdHJpbmdFamlQTlMxXzZWZWN0b3JJTlMxXzZSZWZQdHJJTlNfNVJhbmdlRUVFTG0wRUVFUmkK
IF9fWk43V2ViQ29yZTRQYWdlMjRyZXN1bWVTY3JpcHRlZEFuaW1hdGlvbnNFdgogX19aTjdXZWJD
b3JlNFBhZ2UyNHNjcm9sbGluZ1N0YXRlVHJlZUFzVGV4dEV2CiBfX1pON1dlYkNvcmU0UGFnZTI1
c3VzcGVuZFNjcmlwdGVkQW5pbWF0aW9uc0V2CkBAIC04MzgsNyArODM5LDYgQEAgX19aTjdXZWJD
b3JlNkVkaXRvcjE3aW5zZXJ0T3JkZXJlZExpc3RFdgogX19aTjdXZWJDb3JlNkVkaXRvcjE4Y29u
ZmlybUNvbXBvc2l0aW9uRVJLTjNXVEY2U3RyaW5nRQogX19aTjdXZWJDb3JlNkVkaXRvcjE4Y29u
ZmlybUNvbXBvc2l0aW9uRXYKIF9fWk43V2ViQ29yZTZFZGl0b3IxOGluc2VydERpY3RhdGVkVGV4
dEVSS04zV1RGNlN0cmluZ0VSS05TMV82VmVjdG9ySU5TXzIwRGljdGF0aW9uQWx0ZXJuYXRpdmVF
TG0wRUVFUE5TXzVFdmVudEUKLV9fWk43V2ViQ29yZTZFZGl0b3IxOWNvdW50TWF0Y2hlc0ZvclRl
eHRFUktOM1dURjZTdHJpbmdFUE5TXzVSYW5nZUVqamIKIF9fWk43V2ViQ29yZTZFZGl0b3IxOWRl
bGV0ZVdpdGhEaXJlY3Rpb25FTlNfMThTZWxlY3Rpb25EaXJlY3Rpb25FTlNfMTVUZXh0R3JhbnVs
YXJpdHlFYmIKIF9fWk43V2ViQ29yZTZFZGl0b3IxOWluc2VydFVub3JkZXJlZExpc3RFdgogX19a
TjdXZWJDb3JlNkVkaXRvcjIxYXBwbHlTdHlsZVRvU2VsZWN0aW9uRVBOU18xNlN0eWxlUHJvcGVy
dHlTZXRFTlNfMTBFZGl0QWN0aW9uRQpAQCAtODY4LDYgKzg2OCw3IEBAIF9fWk43V2ViQ29yZTZF
ZGl0b3I2aW5kZW50RXYKIF9fWk43V2ViQ29yZTZFZGl0b3I3Q29tbWFuZEMxRXYKIF9fWk43V2Vi
Q29yZTZFZGl0b3I3Y29tbWFuZEVSS04zV1RGNlN0cmluZ0UKIF9fWk43V2ViQ29yZTZFZGl0b3I3
b3V0ZGVudEV2CitfX1pON1dlYkNvcmU2RWRpdG9yMTljb3VudE1hdGNoZXNGb3JUZXh0RVJLTjNX
VEY2U3RyaW5nRVBOU181UmFuZ2VFampiUE5TMV82VmVjdG9ySU5TMV82UmVmUHRySVM1X0VFTG0w
RUVFCiBfX1pON1dlYkNvcmU2SlNOb2RlNnNfaW5mb0UKIF9fWk43V2ViQ29yZTZSZWdpb241dW5p
dGVFUktTMF8KIF9fWk43V2ViQ29yZTZSZWdpb244c3VidHJhY3RFUktTMF8KSW5kZXg6IFNvdXJj
ZS9XZWJDb3JlL2VkaXRpbmcvRWRpdG9yLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29y
ZS9lZGl0aW5nL0VkaXRvci5jcHAJKHJldmlzaW9uIDEzOTYzNSkKKysrIFNvdXJjZS9XZWJDb3Jl
L2VkaXRpbmcvRWRpdG9yLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjc0MiwxMiArMjc0Miw3IEBA
IHN0YXRpYyBib29sIGlzRnJhbWVJblJhbmdlKEZyYW1lKiBmcmFtZSwKICAgICByZXR1cm4gaW5S
YW5nZTsKIH0KIAotdW5zaWduZWQgRWRpdG9yOjpjb3VudE1hdGNoZXNGb3JUZXh0KGNvbnN0IFN0
cmluZyYgdGFyZ2V0LCBGaW5kT3B0aW9ucyBvcHRpb25zLCB1bnNpZ25lZCBsaW1pdCwgYm9vbCBt
YXJrTWF0Y2hlcykKLXsKLSAgICByZXR1cm4gY291bnRNYXRjaGVzRm9yVGV4dCh0YXJnZXQsIDAs
IG9wdGlvbnMsIGxpbWl0LCBtYXJrTWF0Y2hlcyk7Ci19Ci0KLXVuc2lnbmVkIEVkaXRvcjo6Y291
bnRNYXRjaGVzRm9yVGV4dChjb25zdCBTdHJpbmcmIHRhcmdldCwgUmFuZ2UqIHJhbmdlLCBGaW5k
T3B0aW9ucyBvcHRpb25zLCB1bnNpZ25lZCBsaW1pdCwgYm9vbCBtYXJrTWF0Y2hlcykKK3Vuc2ln
bmVkIEVkaXRvcjo6Y291bnRNYXRjaGVzRm9yVGV4dChjb25zdCBTdHJpbmcmIHRhcmdldCwgUmFu
Z2UqIHJhbmdlLCBGaW5kT3B0aW9ucyBvcHRpb25zLCB1bnNpZ25lZCBsaW1pdCwgYm9vbCBtYXJr
TWF0Y2hlcywgVmVjdG9yPFJlZlB0cjxSYW5nZT4gPiogbWF0Y2hlcykKIHsKICAgICBpZiAodGFy
Z2V0LmlzRW1wdHkoKSkKICAgICAgICAgcmV0dXJuIDA7CkBAIC0yNzc5LDYgKzI3NzQsOSBAQCB1
bnNpZ25lZCBFZGl0b3I6OmNvdW50TWF0Y2hlc0ZvclRleHQoY29uCiAgICAgICAgIH0KIAogICAg
ICAgICArK21hdGNoQ291bnQ7CisgICAgICAgIGlmIChtYXRjaGVzKQorICAgICAgICAgICAgbWF0
Y2hlcy0+YXBwZW5kKHJlc3VsdFJhbmdlKTsKKyAgICAgICAgCiAgICAgICAgIGlmIChtYXJrTWF0
Y2hlcykKICAgICAgICAgICAgIG1fZnJhbWUtPmRvY3VtZW50KCktPm1hcmtlcnMoKS0+YWRkTWFy
a2VyKHJlc3VsdFJhbmdlLmdldCgpLCBEb2N1bWVudE1hcmtlcjo6VGV4dE1hdGNoKTsKIApAQCAt
Mjc5Nyw3ICsyNzk1LDcgQEAgdW5zaWduZWQgRWRpdG9yOjpjb3VudE1hdGNoZXNGb3JUZXh0KGNv
bgogICAgICAgICAgICAgc2VhcmNoUmFuZ2UtPnNldEVuZChzaGFkb3dUcmVlUm9vdCwgc2hhZG93
VHJlZVJvb3QtPmNoaWxkTm9kZUNvdW50KCksIGV4Y2VwdGlvbik7CiAgICAgfSB3aGlsZSAodHJ1
ZSk7CiAKLSAgICBpZiAobWFya01hdGNoZXMpIHsKKyAgICBpZiAobWFya01hdGNoZXMgfHwgbWF0
Y2hlcykgewogICAgICAgICAvLyBEbyBhICJmYWtlIiBwYWludCBpbiBvcmRlciB0byBleGVjdXRl
IHRoZSBjb2RlIHRoYXQgY29tcHV0ZXMgdGhlIHJlbmRlcmVkIHJlY3QgZm9yIGVhY2ggdGV4dCBt
YXRjaC4KICAgICAgICAgaWYgKG1fZnJhbWUtPnZpZXcoKSAmJiBtX2ZyYW1lLT5jb250ZW50UmVu
ZGVyZXIoKSkgewogICAgICAgICAgICAgbV9mcmFtZS0+ZG9jdW1lbnQoKS0+dXBkYXRlTGF5b3V0
KCk7IC8vIEVuc3VyZSBsYXlvdXQgaXMgdXAgdG8gZGF0ZS4KSW5kZXg6IFNvdXJjZS9XZWJDb3Jl
L2VkaXRpbmcvRWRpdG9yLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvZWRpdGluZy9F
ZGl0b3IuaAkocmV2aXNpb24gMTM5NjM1KQorKysgU291cmNlL1dlYkNvcmUvZWRpdGluZy9FZGl0
b3IuaAkod29ya2luZyBjb3B5KQpAQCAtMzYxLDggKzM2MSw3IEBAIHB1YmxpYzoKIAogICAgIHZv
aWQgcmVzcG9uZFRvQ2hhbmdlZFNlbGVjdGlvbihjb25zdCBWaXNpYmxlU2VsZWN0aW9uJiBvbGRT
ZWxlY3Rpb24sIEZyYW1lU2VsZWN0aW9uOjpTZXRTZWxlY3Rpb25PcHRpb25zKTsKICAgICBib29s
IHNob3VsZENoYW5nZVNlbGVjdGlvbihjb25zdCBWaXNpYmxlU2VsZWN0aW9uJiBvbGRTZWxlY3Rp
b24sIGNvbnN0IFZpc2libGVTZWxlY3Rpb24mIG5ld1NlbGVjdGlvbiwgRUFmZmluaXR5LCBib29s
IHN0aWxsU2VsZWN0aW5nKSBjb25zdDsKLSAgICB1bnNpZ25lZCBjb3VudE1hdGNoZXNGb3JUZXh0
KGNvbnN0IFN0cmluZyYsIEZpbmRPcHRpb25zLCB1bnNpZ25lZCBsaW1pdCwgYm9vbCBtYXJrTWF0
Y2hlcyk7Ci0gICAgdW5zaWduZWQgY291bnRNYXRjaGVzRm9yVGV4dChjb25zdCBTdHJpbmcmLCBS
YW5nZSosIEZpbmRPcHRpb25zLCB1bnNpZ25lZCBsaW1pdCwgYm9vbCBtYXJrTWF0Y2hlcyk7Cisg
ICAgdW5zaWduZWQgY291bnRNYXRjaGVzRm9yVGV4dChjb25zdCBTdHJpbmcmLCBSYW5nZSosIEZp
bmRPcHRpb25zLCB1bnNpZ25lZCBsaW1pdCwgYm9vbCBtYXJrTWF0Y2hlcywgVmVjdG9yPFJlZlB0
cjxSYW5nZT4gPiopOwogICAgIGJvb2wgbWFya2VkVGV4dE1hdGNoZXNBcmVIaWdobGlnaHRlZCgp
IGNvbnN0OwogICAgIHZvaWQgc2V0TWFya2VkVGV4dE1hdGNoZXNBcmVIaWdobGlnaHRlZChib29s
KTsKIApJbmRleDogU291cmNlL1dlYkNvcmUvcGFnZS9QYWdlLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvV2ViQ29yZS9wYWdlL1BhZ2UuY3BwCShyZXZpc2lvbiAxMzk2MzUpCisrKyBTb3VyY2Uv
V2ViQ29yZS9wYWdlL1BhZ2UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01NjksNiArNTY5LDQzIEBA
IGJvb2wgUGFnZTo6ZmluZFN0cmluZyhjb25zdCBTdHJpbmcmIHRhcmcKICAgICByZXR1cm4gZmFs
c2U7CiB9CiAKK3ZvaWQgUGFnZTo6ZmluZFN0cmluZ01hdGNoaW5nUmFuZ2VzKGNvbnN0IFN0cmlu
ZyYgdGFyZ2V0LCBGaW5kT3B0aW9ucyBvcHRpb25zLCBpbnQgbGltaXQsIFZlY3RvcjxSZWZQdHI8
UmFuZ2U+ID4qIG1hdGNoUmFuZ2VzLCBpbnQmIGluZGV4Rm9yU2VsZWN0aW9uKQoreworICAgIC8v
IGZpbmQgYWxsIHRoZSBSYW5nZXMgZm9yIHRoZSBtYXRjaGluZyB0ZXh0LgorICAgIC8vIFVwb24g
cmV0dXJuLCBpbmRleEZvclNlbGVjdGlvbiB3aWxsIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgor
ICAgIC8vIDAgaWYgdGhlcmUgaXMgbm8gdXNlciBzZWxlY3Rpb24KKyAgICAvLyB0aGUgaW5kZXgg
b2YgdGhlIGZpcnN0IHJhbmdlIGFmdGVyIHRoZSB1c2VyIHNlbGVjdGlvbgorICAgIC8vIC0xIGlm
IHRoZXJlIGlzIG5vIG1hdGNoaW5nIHRleHQgYWZ0ZXIgdGhlIHVzZXIgc2VsZWN0aW9uLgorCisg
ICAgaW5kZXhGb3JTZWxlY3Rpb24gPSAwOworICAgIGlmICghbWFpbkZyYW1lKCkpCisgICAgICAg
IHJldHVybjsKKworICAgIEZyYW1lKiBmcmFtZSA9IG1haW5GcmFtZSgpOworICAgIEZyYW1lKiBm
cmFtZVdpdGhTZWxlY3Rpb24gPSAwOworICAgIGRvIHsKKyAgICAgICAgZnJhbWUtPmVkaXRvcigp
LT5jb3VudE1hdGNoZXNGb3JUZXh0KHRhcmdldCwgMCwgb3B0aW9ucywgbGltaXQgPyAobGltaXQg
LSBtYXRjaFJhbmdlcy0+c2l6ZSgpKSA6IDAsIHRydWUsIG1hdGNoUmFuZ2VzKTsKKyAgICAgICAg
aWYgKGZyYW1lLT5zZWxlY3Rpb24oKS0+aXNSYW5nZSgpKQorICAgICAgICAgICAgZnJhbWVXaXRo
U2VsZWN0aW9uID0gZnJhbWU7CisgICAgICAgIGZyYW1lID0gaW5jcmVtZW50RnJhbWUoZnJhbWUs
IHRydWUsIGZhbHNlKTsKKyAgICB9IHdoaWxlIChmcmFtZSk7CisKKyAgICBpZiAobWF0Y2hSYW5n
ZXMtPmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKGZyYW1lV2l0aFNlbGVj
dGlvbikgeworICAgICAgICBpbmRleEZvclNlbGVjdGlvbiA9IC0xOworICAgICAgICBSZWZQdHI8
UmFuZ2U+IHNlbGVjdGVkUmFuZ2UgPSBmcmFtZVdpdGhTZWxlY3Rpb24tPnNlbGVjdGlvbigpLT5z
ZWxlY3Rpb24oKS5maXJzdFJhbmdlKCk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwg
bWF0Y2hSYW5nZXMtPnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBFeGNlcHRpb25Db2RlIGVj
OworICAgICAgICAgICAgaWYgKHNlbGVjdGVkUmFuZ2UtPmNvbXBhcmVCb3VuZGFyeVBvaW50cyhS
YW5nZTo6U1RBUlRfVE9fRU5ELCBtYXRjaFJhbmdlcy0+YXQoaSkuZ2V0KCksIGVjKSA8IDApIHsK
KyAgICAgICAgICAgICAgICBpbmRleEZvclNlbGVjdGlvbiA9IGk7CisgICAgICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKIFBhc3NSZWZQdHI8
UmFuZ2U+IFBhZ2U6OnJhbmdlT2ZTdHJpbmcoY29uc3QgU3RyaW5nJiB0YXJnZXQsIFJhbmdlKiBy
ZWZlcmVuY2VSYW5nZSwgRmluZE9wdGlvbnMgb3B0aW9ucykKIHsKICAgICBpZiAodGFyZ2V0Lmlz
RW1wdHkoKSB8fCAhbWFpbkZyYW1lKCkpCkBAIC02MTIsNyArNjQ5LDcgQEAgdW5zaWduZWQgaW50
IFBhZ2U6Om1hcmtBbGxNYXRjaGVzRm9yVGV4dAogICAgIEZyYW1lKiBmcmFtZSA9IG1haW5GcmFt
ZSgpOwogICAgIGRvIHsKICAgICAgICAgZnJhbWUtPmVkaXRvcigpLT5zZXRNYXJrZWRUZXh0TWF0
Y2hlc0FyZUhpZ2hsaWdodGVkKHNob3VsZEhpZ2hsaWdodCk7Ci0gICAgICAgIG1hdGNoZXMgKz0g
ZnJhbWUtPmVkaXRvcigpLT5jb3VudE1hdGNoZXNGb3JUZXh0KHRhcmdldCwgb3B0aW9ucywgbGlt
aXQgPyAobGltaXQgLSBtYXRjaGVzKSA6IDAsIHRydWUpOworICAgICAgICBtYXRjaGVzICs9IGZy
YW1lLT5lZGl0b3IoKS0+Y291bnRNYXRjaGVzRm9yVGV4dCh0YXJnZXQsIDAsIG9wdGlvbnMsIGxp
bWl0ID8gKGxpbWl0IC0gbWF0Y2hlcykgOiAwLCB0cnVlLCAwKTsKICAgICAgICAgZnJhbWUgPSBp
bmNyZW1lbnRGcmFtZShmcmFtZSwgdHJ1ZSwgZmFsc2UpOwogICAgIH0gd2hpbGUgKGZyYW1lKTsK
IApJbmRleDogU291cmNlL1dlYkNvcmUvcGFnZS9QYWdlLmgKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L1dlYkNvcmUvcGFnZS9QYWdlLmgJKHJldmlzaW9uIDEzOTYzNSkKKysrIFNvdXJjZS9XZWJDb3Jl
L3BhZ2UvUGFnZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0yMzYsNiArMjM2LDcgQEAgbmFtZXNwYWNl
IFdlYkNvcmUgewogICAgICAgICB1bnNpZ25lZCBtYXJrQWxsTWF0Y2hlc0ZvclRleHQoY29uc3Qg
U3RyaW5nJiwgVGV4dENhc2VTZW5zaXRpdml0eSwgYm9vbCBzaG91bGRIaWdobGlnaHQsIHVuc2ln
bmVkKTsKICAgICAgICAgdm9pZCB1bm1hcmtBbGxUZXh0TWF0Y2hlcygpOwogCisgICAgICAgIHZv
aWQgZmluZFN0cmluZ01hdGNoaW5nUmFuZ2VzKGNvbnN0IFN0cmluZyYsIEZpbmRPcHRpb25zLCBp
bnQgbWF4Q291bnQsIFZlY3RvcjxSZWZQdHI8UmFuZ2U+ID4qLCBpbnQmIGluZGV4Rm9yU2VsZWN0
aW9uKTsKICNpZiBQTEFURk9STShNQUMpCiAgICAgICAgIHZvaWQgYWRkU2NoZWR1bGVQYWlyKFBh
c3NSZWZQdHI8U2NoZWR1bGVQYWlyPik7CiAgICAgICAgIHZvaWQgcmVtb3ZlU2NoZWR1bGVQYWly
KFBhc3NSZWZQdHI8U2NoZWR1bGVQYWlyPik7CkluZGV4OiBTb3VyY2UvV2ViS2l0Mi9DaGFuZ2VM
b2cKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdDIvQ2hhbmdlTG9nCShyZXZpc2lvbiAxMzk2
NzUpCisrKyBTb3VyY2UvV2ViS2l0Mi9DaGFuZ2VMb2cJKHdvcmtpbmcgY29weSkKQEAgLTEsMyAr
MSw2OCBAQAorMjAxMy0wMS0xNCAgRW5yaWNhIENhc3VjY2kgIDxlbnJpY2FAYXBwbGUuY29tPgor
CisgICAgICAgIEFkZCBhIG5ldyBzZXQgb2YgV2ViS2l0MiBBUElzIGZvciB0ZXh0IHNlYXJjaCBh
bmQKKyAgICAgICAgc2VhcmNoIHJlc3VsdHMgbWFuYWdlbWVudC4KKyAgICAgICAgaHR0cHM6Ly9i
dWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEwNjgzNC4KKyAgICAgICAgPHJkYXI6Ly9w
cm9ibGVtLzEyNTk3MTU5PgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgor
ICAgICAgICAKKyAgICAgICAgQWRkaW5nIG5ldyBBUEkgdG8gcGVyZm9ybSB0ZXh0IHNlYXJjaCBp
biBXZWJLaXQyIHdpdGhvdXQgdXNpbmcKKyAgICAgICAgdGhlIHN0b2NrIFVJLiBUaGUgbmV3IGlu
dGVyZmFjZSBwcm92aWRlcyBhbGwgdGhlIGluZm9ybWF0aW9uCisgICAgICAgIG5lY2Vzc2FyeSB0
byB3cml0ZSBhIGN1c3RvbSBVSSBmb3Igc2VhcmNoLiBUaGUgbWFpbiBsb2dpYyBpcworICAgICAg
ICBpbXBsZW1lbnRlZCBpbiB0aGUgbmV3IGZ1bmN0aW9ucyBhZGRlZCB0byBGaW5kQ29udHJvbGxl
ci4KKworICAgICAgICBBZGRlZCBuZXcgVGV4dFdlYktpdEFQSSB0ZXN0LgorCisgICAgICAgICog
VUlQcm9jZXNzL0FQSS9DL1dLUGFnZS5jcHA6CisgICAgICAgIChXS1BhZ2VGaW5kU3RyaW5nTWF0
Y2hlcyk6IEFkZGVkLgorICAgICAgICAoV0tQYWdlR2V0SW1hZ2VGb3JGaW5kTWF0Y2gpOiBBZGRl
ZC4KKyAgICAgICAgKFdLUGFnZVNlbGVjdEZpbmRNYXRjaCk6IEFkZGVkLgorICAgICAgICAoV0tQ
YWdlU2V0UGFnZUZpbmRNYXRjaGVzQ2xpZW50KTogQWRkZWQuCisgICAgICAgICogVUlQcm9jZXNz
L0FQSS9DL1dLUGFnZS5oOiBBZGRlZCB0aGUgbmV3IEFQSSBkZWZpbml0aW9ucy4KKyAgICAgICAg
KiBVSVByb2Nlc3MvV2ViRmluZENsaWVudC5jcHA6IEFkZGVkIG5ldyBjbGllbnQgY2FsbGJhY2tz
LgorICAgICAgICAoV2ViS2l0OjpXZWJGaW5kTWF0Y2hlc0NsaWVudDo6ZGlkRmluZFN0cmluZ01h
dGNoZXMpOgorICAgICAgICAoV2ViS2l0OjpXZWJGaW5kTWF0Y2hlc0NsaWVudDo6ZGlkR2V0SW1h
Z2VGb3JNYXRjaFJlc3VsdCk6CisgICAgICAgICogVUlQcm9jZXNzL1dlYkZpbmRDbGllbnQuaDoK
KyAgICAgICAgKFdlYkZpbmRNYXRjaGVzQ2xpZW50KTogQWRkZWQuCisgICAgICAgICogVUlQcm9j
ZXNzL1dlYlBhZ2VQcm94eS5jcHA6IEFkZGVkIHByb3h5IG1ldGhvZHMuCisgICAgICAgIChXZWJL
aXQ6OldlYlBhZ2VQcm94eTo6aW5pdGlhbGl6ZUZpbmRNYXRjaGVzQ2xpZW50KToKKyAgICAgICAg
KFdlYktpdDo6V2ViUGFnZVByb3h5OjpmaW5kU3RyaW5nTWF0Y2hlcyk6CisgICAgICAgIChXZWJL
aXQ6OldlYlBhZ2VQcm94eTo6Z2V0SW1hZ2VGb3JGaW5kTWF0Y2gpOgorICAgICAgICAoV2ViS2l0
OjpXZWJQYWdlUHJveHk6OnNlbGVjdEZpbmRNYXRjaCk6CisgICAgICAgIChXZWJLaXQ6OldlYlBh
Z2VQcm94eTo6ZGlkR2V0SW1hZ2VGb3JGaW5kTWF0Y2gpOgorICAgICAgICAoV2ViS2l0OjpXZWJQ
YWdlUHJveHk6OmRpZEZpbmRTdHJpbmdNYXRjaGVzKToKKyAgICAgICAgKiBVSVByb2Nlc3MvV2Vi
UGFnZVByb3h5Lmg6CisgICAgICAgICogVUlQcm9jZXNzL1dlYlBhZ2VQcm94eS5tZXNzYWdlcy5p
bjoKKyAgICAgICAgKiBXZWJQcm9jZXNzL1dlYlBhZ2UvRmluZENvbnRyb2xsZXIuY3BwOgorICAg
ICAgICAoV2ViS2l0OjpGaW5kQ29udHJvbGxlcjo6ZmluZFN0cmluZ01hdGNoZXMpOiBGaW5kcyBh
bGwgdGhlIG1hdGNoaW5nCisgICAgICAgIHRleHQgYWNjb3JkaW5nIHRvIHRoZSBmaW5kIG9wdGlv
bnMuIEFsbCB0aGUgbWF0Y2hpbmcgdGV4dCByYW5nZXMgYXJlCisgICAgICAgIHN0b3JlZCBpbiBh
IHZlY3RvciB1bnRpbCB0aGUgbmV4dCBjYWxsIHRvIGZpbmRTdHJpbmdNYXRjaGVzIG9yIHVudGls
CisgICAgICAgIGhpZGVGaW5kVUkgaXMgY2FsbGVkLiBUaGUgbWVzc2FnZSB0aGF0IGlzIHNlbnQg
YmFjayB0byB0aGUgVUkgcHJvY2VzcworICAgICAgICBjb250YWlucyBhIHZlY3RvciBjb250YWlu
aW5nIGFuIGVudHJ5IGZvciBlYWNoIGZpbmQgbWF0Y2ggKGkuZS4gZm9yIGVhY2gKKyAgICAgICAg
cmFuZ2UpIGFuZCBlYWNoIGVudHJ5IGlzIHJlcHJlc2VudGVkIGJ5IGEgdmVjdG9yIG9mIHRoZSBj
b3JyZXNwb25kaW5nCisgICAgICAgIHRleHQgcmVjdHMuIEl0IGFsc28gcmV0dXJucyB0aGUgaW5k
ZXggaW4gdGhlIHZlY3RvciBvZiBtYXRjaGVzIGNvcnJlc3BvbmRpbmcKKyAgICAgICAgdG8gdGhl
IGZpcnN0IG1hdGNoIGFmdGVyIHRoZSB1c2VyIHNlbGVjdGlvbi4KKyAgICAgICAgSWYgdGhlcmUg
aXMgbm8gc2VsZWN0aW9uIHRoZSBpbmRleCBpcyBhbHdheXMgMCBhbmQgaWYgdGhlcmUgYXJlIG5v
CisgICAgICAgIG1hdGNoZXMgYWZ0ZXIgdGhlIHVzZXIgc2VsZWN0aW9uLCB0aGUgaW5kZXggcmV0
dXJuZWQgaXMgLTEuCisgICAgICAgIChXZWJLaXQ6OkZpbmRDb250cm9sbGVyOjpnZXRGaW5kSW5k
aWNhdG9yQml0bWFwQW5kUmVjdCk6IEhlbHBlciBmdW5jdGlvbgorICAgICAgICB0byBzaGFyZSBj
b2RlIGJldHdlZW4gdXBkYXRlRmluZEluZGljYXRvciBhbmQgZ2V0SW1hZ2VGb3JGaW5kTWF0Y2gu
CisgICAgICAgIChXZWJLaXQ6OkZpbmRDb250cm9sbGVyOjpnZXRJbWFnZUZvckZpbmRNYXRjaCk6
IENyZWF0ZXMgdGhlIGltYWdlIGNvcnJlc3BvbmRpbmcKKyAgICAgICAgdG8gdGhlIHRleHQgbWF0
Y2hlZCBhdCB0aGUgZ2l2ZW4gbWF0Y2ggaW5kZXguCisgICAgICAgIChXZWJLaXQ6OkZpbmRDb250
cm9sbGVyOjpzZWxlY3RGaW5kTWF0Y2gpOiBjcmVhdGVzIGEgc2VsZWN0aW9uIGZvciB0aGUgcmFu
Z2UKKyAgICAgICAgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gbWF0Y2ggaW5kZXguCisgICAg
ICAgIChXZWJLaXQ6OkZpbmRDb250cm9sbGVyOjpoaWRlRmluZFVJKTogQWRkZWQgbG9naWMgdG8g
Y2xlYXIgdGhlIHZlY3RvcgorICAgICAgICBvZiBtYXRjaGVkIHJhbmdlcy4KKyAgICAgICAgKFdl
YktpdDo6RmluZENvbnRyb2xsZXI6OnVwZGF0ZUZpbmRJbmRpY2F0b3IpOiBVcGRhdGVkIHRvIHVz
ZSB0aGUKKyAgICAgICAgbmV3IGhlbHBlciBmdW5jdGlvbiBnZXRGaW5kSW5kaWNhdG9yQml0bWFw
QW5kUmVjdC4KKyAgICAgICAgKiBXZWJQcm9jZXNzL1dlYlBhZ2UvRmluZENvbnRyb2xsZXIuaDoK
KyAgICAgICAgKiBXZWJQcm9jZXNzL1dlYlBhZ2UvV2ViUGFnZS5jcHA6CisgICAgICAgIChXZWJL
aXQ6OldlYlBhZ2U6OmZpbmRTdHJpbmdNYXRjaGVzKToKKyAgICAgICAgKFdlYktpdDo6V2ViUGFn
ZTo6Z2V0SW1hZ2VGb3JGaW5kTWF0Y2gpOgorICAgICAgICAoV2ViS2l0OjpXZWJQYWdlOjpzZWxl
Y3RGaW5kTWF0Y2gpOgorICAgICAgICAqIFdlYlByb2Nlc3MvV2ViUGFnZS9XZWJQYWdlLmg6Cisg
ICAgICAgICogV2ViUHJvY2Vzcy9XZWJQYWdlL1dlYlBhZ2UubWVzc2FnZXMuaW46CisKIDIwMTMt
MDEtMTQgIEh1YW5nIERvbmdzdW5nICA8bHV4dGVsbGFAY29tcGFueTEwMC5uZXQ+CiAKICAgICAg
ICAgW0VGTF0gUkVHUkVTU0lPTihyMTM5MTg5KTogTWluaUJyb3dzZXIgcmVuZGVycyBhYm5vcm1h
bGx5IHdpdGggLXIgb3B0aW9uLgpJbmRleDogU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL1dlYkZp
bmRDbGllbnQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9XZWJG
aW5kQ2xpZW50LmNwcAkocmV2aXNpb24gMTM5NjM1KQorKysgU291cmNlL1dlYktpdDIvVUlQcm9j
ZXNzL1dlYkZpbmRDbGllbnQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01NSw1ICs1NSwyMCBAQCB2
b2lkIFdlYkZpbmRDbGllbnQ6OmRpZENvdW50U3RyaW5nTWF0Y2hlCiAgICAgbV9jbGllbnQuZGlk
Q291bnRTdHJpbmdNYXRjaGVzKHRvQVBJKHBhZ2UpLCB0b0FQSShzdHJpbmcuaW1wbCgpKSwgbWF0
Y2hDb3VudCwgbV9jbGllbnQuY2xpZW50SW5mbyk7CiB9CiAKK3ZvaWQgV2ViRmluZE1hdGNoZXND
bGllbnQ6OmRpZEZpbmRTdHJpbmdNYXRjaGVzKFdlYlBhZ2VQcm94eSogcGFnZSwgY29uc3QgU3Ry
aW5nJiBzdHJpbmcsIEltbXV0YWJsZUFycmF5KiBtYXRjaGVzLCBpbnQgZmlyc3RJbmRleCkKK3sK
KyAgICBpZiAoIW1fY2xpZW50LmRpZEZpbmRTdHJpbmdNYXRjaGVzKQorICAgICAgICByZXR1cm47
CisKKyAgICBtX2NsaWVudC5kaWRGaW5kU3RyaW5nTWF0Y2hlcyh0b0FQSShwYWdlKSwgdG9BUEko
c3RyaW5nLmltcGwoKSksIHRvQVBJKG1hdGNoZXMpLCBmaXJzdEluZGV4LCBtX2NsaWVudC5jbGll
bnRJbmZvKTsKK30KKwordm9pZCBXZWJGaW5kTWF0Y2hlc0NsaWVudDo6ZGlkR2V0SW1hZ2VGb3JN
YXRjaFJlc3VsdChXZWJQYWdlUHJveHkqIHBhZ2UsIFdlYkltYWdlKiBpbWFnZSwgdWludDMyX3Qg
aW5kZXgpCit7CisgICAgaWYgKCFtX2NsaWVudC5kaWRHZXRJbWFnZUZvck1hdGNoUmVzdWx0KQor
ICAgICAgICByZXR1cm47CisgICAgbV9jbGllbnQuZGlkR2V0SW1hZ2VGb3JNYXRjaFJlc3VsdCh0
b0FQSShwYWdlKSwgdG9BUEkoaW1hZ2UpLCBpbmRleCwgbV9jbGllbnQuY2xpZW50SW5mbyk7Cit9
CisKIH0gLy8gbmFtZXNwYWNlIFdlYktpdAogCkluZGV4OiBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nl
c3MvV2ViRmluZENsaWVudC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vz
cy9XZWJGaW5kQ2xpZW50LmgJKHJldmlzaW9uIDEzOTYzNSkKKysrIFNvdXJjZS9XZWJLaXQyL1VJ
UHJvY2Vzcy9XZWJGaW5kQ2xpZW50LmgJKHdvcmtpbmcgY29weSkKQEAgLTMyLDcgKzMyLDkgQEAK
IAogbmFtZXNwYWNlIFdlYktpdCB7CiAKK2NsYXNzIEltbXV0YWJsZUFycmF5OwogY2xhc3MgV2Vi
UGFnZVByb3h5OworY2xhc3MgV2ViSW1hZ2U7CiAKIGNsYXNzIFdlYkZpbmRDbGllbnQgOiBwdWJs
aWMgQVBJQ2xpZW50PFdLUGFnZUZpbmRDbGllbnQsIGtXS1BhZ2VGaW5kQ2xpZW50Q3VycmVudFZl
cnNpb24+IHsKIHB1YmxpYzoKQEAgLTQxLDYgKzQzLDEyIEBAIHB1YmxpYzoKICAgICB2b2lkIGRp
ZENvdW50U3RyaW5nTWF0Y2hlcyhXZWJQYWdlUHJveHkqLCBjb25zdCBTdHJpbmcmLCB1aW50MzJf
dCBtYXRjaENvdW50KTsKIH07CiAKK2NsYXNzIFdlYkZpbmRNYXRjaGVzQ2xpZW50IDogcHVibGlj
IEFQSUNsaWVudDxXS1BhZ2VGaW5kTWF0Y2hlc0NsaWVudCwga1dLUGFnZUZpbmRNYXRjaGVzQ2xp
ZW50Q3VycmVudFZlcnNpb24+IHsKK3B1YmxpYzoKKyAgICB2b2lkIGRpZEZpbmRTdHJpbmdNYXRj
aGVzKFdlYlBhZ2VQcm94eSosIGNvbnN0IFN0cmluZyYsIEltbXV0YWJsZUFycmF5KiwgaW50KTsK
KyAgICB2b2lkIGRpZEdldEltYWdlRm9yTWF0Y2hSZXN1bHQoV2ViUGFnZVByb3h5KiwgV2ViSW1h
Z2UqLCB1aW50MzJfdCk7Cit9OworCiB9IC8vIG5hbWVzcGFjZSBXZWJLaXQKIAogI2VuZGlmIC8v
IFdlYkZpbmRDbGllbnRfaApJbmRleDogU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL1dlYlBhZ2VQ
cm94eS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL1dlYlBhZ2VQ
cm94eS5jcHAJKHJldmlzaW9uIDEzOTYzNSkKKysrIFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9X
ZWJQYWdlUHJveHkuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zNCw2ICszNCw3IEBACiAjaW5jbHVk
ZSAiRHJhd2luZ0FyZWFQcm94eS5oIgogI2luY2x1ZGUgIkV2ZW50RGlzcGF0Y2hlck1lc3NhZ2Vz
LmgiCiAjaW5jbHVkZSAiRmluZEluZGljYXRvci5oIgorI2luY2x1ZGUgIkltbXV0YWJsZUFycmF5
LmgiCiAjaW5jbHVkZSAiTG9nZ2luZy5oIgogI2luY2x1ZGUgIk1lc3NhZ2VJRC5oIgogI2luY2x1
ZGUgIk5hdGl2ZVdlYktleWJvYXJkRXZlbnQuaCIKQEAgLTM2Nyw2ICszNjgsMTEgQEAgdm9pZCBX
ZWJQYWdlUHJveHk6OmluaXRpYWxpemVGaW5kQ2xpZW50KAogICAgIG1fZmluZENsaWVudC5pbml0
aWFsaXplKGNsaWVudCk7CiB9CiAKK3ZvaWQgV2ViUGFnZVByb3h5Ojppbml0aWFsaXplRmluZE1h
dGNoZXNDbGllbnQoY29uc3QgV0tQYWdlRmluZE1hdGNoZXNDbGllbnQqIGNsaWVudCkKK3sKKyAg
ICBtX2ZpbmRNYXRjaGVzQ2xpZW50LmluaXRpYWxpemUoY2xpZW50KTsKK30KKwogI2lmIEVOQUJM
RShDT05URVhUX01FTlVTKQogdm9pZCBXZWJQYWdlUHJveHk6OmluaXRpYWxpemVDb250ZXh0TWVu
dUNsaWVudChjb25zdCBXS1BhZ2VDb250ZXh0TWVudUNsaWVudCogY2xpZW50KQogewpAQCAtMTY4
Miw2ICsxNjg4LDE2IEBAIHZvaWQgV2ViUGFnZVByb3h5OjpzZXRNZW1vcnlDYWNoZUNsaWVudEMK
ICAgICBtX3Byb2Nlc3MtPnNlbmQoTWVzc2FnZXM6OldlYlBhZ2U6OlNldE1lbW9yeUNhY2hlTWVz
c2FnZXNFbmFibGVkKG1lbW9yeUNhY2hlQ2xpZW50Q2FsbHNFbmFibGVkKSwgbV9wYWdlSUQpOwog
fQogCit2b2lkIFdlYlBhZ2VQcm94eTo6ZmluZFN0cmluZ01hdGNoZXMoY29uc3QgU3RyaW5nJiBz
dHJpbmcsIEZpbmRPcHRpb25zIG9wdGlvbnMsIHVuc2lnbmVkIG1heE1hdGNoQ291bnQpCit7Cisg
ICAgaWYgKHN0cmluZy5pc0VtcHR5KCkpIHsKKyAgICAgICAgZGlkRmluZFN0cmluZ01hdGNoZXMo
c3RyaW5nLFZlY3RvcjxWZWN0b3I8V2ViQ29yZTo6SW50UmVjdD4gPiAoKSwgMCk7CisgICAgICAg
IHJldHVybjsKKyAgICB9CisKKyAgICBtX3Byb2Nlc3MtPnNlbmQoTWVzc2FnZXM6OldlYlBhZ2U6
OkZpbmRTdHJpbmdNYXRjaGVzKHN0cmluZywgb3B0aW9ucywgbWF4TWF0Y2hDb3VudCksIG1fcGFn
ZUlEKTsKK30KKwogdm9pZCBXZWJQYWdlUHJveHk6OmZpbmRTdHJpbmcoY29uc3QgU3RyaW5nJiBz
dHJpbmcsIEZpbmRPcHRpb25zIG9wdGlvbnMsIHVuc2lnbmVkIG1heE1hdGNoQ291bnQpCiB7CiAg
ICAgaWYgKG1fbWFpbkZyYW1lSGFzQ3VzdG9tUmVwcmVzZW50YXRpb24pCkBAIC0xNjkwLDYgKzE3
MDYsMTYgQEAgdm9pZCBXZWJQYWdlUHJveHk6OmZpbmRTdHJpbmcoY29uc3QgU3RyaQogICAgICAg
ICBtX3Byb2Nlc3MtPnNlbmQoTWVzc2FnZXM6OldlYlBhZ2U6OkZpbmRTdHJpbmcoc3RyaW5nLCBv
cHRpb25zLCBtYXhNYXRjaENvdW50KSwgbV9wYWdlSUQpOwogfQogCit2b2lkIFdlYlBhZ2VQcm94
eTo6Z2V0SW1hZ2VGb3JGaW5kTWF0Y2goaW50MzJfdCBtYXRjaEluZGV4KQoreworICAgIG1fcHJv
Y2Vzcy0+c2VuZChNZXNzYWdlczo6V2ViUGFnZTo6R2V0SW1hZ2VGb3JGaW5kTWF0Y2gobWF0Y2hJ
bmRleCksIG1fcGFnZUlEKTsKK30KKwordm9pZCBXZWJQYWdlUHJveHk6OnNlbGVjdEZpbmRNYXRj
aChpbnQzMl90IG1hdGNoSW5kZXgpCit7CisgICAgbV9wcm9jZXNzLT5zZW5kKE1lc3NhZ2VzOjpX
ZWJQYWdlOjpTZWxlY3RGaW5kTWF0Y2gobWF0Y2hJbmRleCksIG1fcGFnZUlEKTsKK30KKwogdm9p
ZCBXZWJQYWdlUHJveHk6OmhpZGVGaW5kVUkoKQogewogICAgIG1fcHJvY2Vzcy0+c2VuZChNZXNz
YWdlczo6V2ViUGFnZTo6SGlkZUZpbmRVSSgpLCBtX3BhZ2VJRCk7CkBAIC0zMDI0LDYgKzMwNTAs
MTEgQEAgdm9pZCBXZWJQYWdlUHJveHk6OmRpZENvdW50U3RyaW5nTWF0Y2hlcwogICAgIG1fZmlu
ZENsaWVudC5kaWRDb3VudFN0cmluZ01hdGNoZXModGhpcywgc3RyaW5nLCBtYXRjaENvdW50KTsK
IH0KIAordm9pZCBXZWJQYWdlUHJveHk6OmRpZEdldEltYWdlRm9yRmluZE1hdGNoKGNvbnN0IFNo
YXJlYWJsZUJpdG1hcDo6SGFuZGxlJiBjb250ZW50SW1hZ2VIYW5kbGUsIHVpbnQzMl90IG1hdGNo
SW5kZXgpCit7CisgICAgbV9maW5kTWF0Y2hlc0NsaWVudC5kaWRHZXRJbWFnZUZvck1hdGNoUmVz
dWx0KHRoaXMsIFdlYkltYWdlOjpjcmVhdGUoU2hhcmVhYmxlQml0bWFwOjpjcmVhdGUoY29udGVu
dEltYWdlSGFuZGxlKSkuZ2V0KCksIG1hdGNoSW5kZXgpOworfQorCiB2b2lkIFdlYlBhZ2VQcm94
eTo6c2V0RmluZEluZGljYXRvcihjb25zdCBGbG9hdFJlY3QmIHNlbGVjdGlvblJlY3RJbldpbmRv
d0Nvb3JkaW5hdGVzLCBjb25zdCBWZWN0b3I8RmxvYXRSZWN0PiYgdGV4dFJlY3RzSW5TZWxlY3Rp
b25SZWN0Q29vcmRpbmF0ZXMsIGZsb2F0IGNvbnRlbnRJbWFnZVNjYWxlRmFjdG9yLCBjb25zdCBT
aGFyZWFibGVCaXRtYXA6OkhhbmRsZSYgY29udGVudEltYWdlSGFuZGxlLCBib29sIGZhZGVPdXQs
IGJvb2wgYW5pbWF0ZSkKIHsKICAgICBSZWZQdHI8RmluZEluZGljYXRvcj4gZmluZEluZGljYXRv
ciA9IEZpbmRJbmRpY2F0b3I6OmNyZWF0ZShzZWxlY3Rpb25SZWN0SW5XaW5kb3dDb29yZGluYXRl
cywgdGV4dFJlY3RzSW5TZWxlY3Rpb25SZWN0Q29vcmRpbmF0ZXMsIGNvbnRlbnRJbWFnZVNjYWxl
RmFjdG9yLCBjb250ZW50SW1hZ2VIYW5kbGUpOwpAQCAtMzAzNSw2ICszMDY2LDI0IEBAIHZvaWQg
V2ViUGFnZVByb3h5OjpkaWRGaW5kU3RyaW5nKGNvbnN0IFMKICAgICBtX2ZpbmRDbGllbnQuZGlk
RmluZFN0cmluZyh0aGlzLCBzdHJpbmcsIG1hdGNoQ291bnQpOwogfQogCit2b2lkIFdlYlBhZ2VQ
cm94eTo6ZGlkRmluZFN0cmluZ01hdGNoZXMoY29uc3QgU3RyaW5nJiBzdHJpbmcsIFZlY3RvcjxW
ZWN0b3I8V2ViQ29yZTo6SW50UmVjdD4gPiBtYXRjaFJlY3RzLCBpbnQzMl90IGZpcnN0SW5kZXhB
ZnRlclNlbGVjdGlvbikKK3sKKyAgICBWZWN0b3I8UmVmUHRyPEFQSU9iamVjdD4gPiBtYXRjaGVz
OworICAgIG1hdGNoZXMucmVzZXJ2ZUluaXRpYWxDYXBhY2l0eShtYXRjaFJlY3RzLnNpemUoKSk7
CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1hdGNoUmVjdHMuc2l6ZSgpOyArK2kpIHsK
KyAgICAgICAgY29uc3QgVmVjdG9yPFdlYkNvcmU6OkludFJlY3Q+JiByZWN0cyA9IG1hdGNoUmVj
dHNbaV07CisgICAgICAgIHNpemVfdCBudW1SZWN0cyA9IG1hdGNoUmVjdHNbaV0uc2l6ZSgpOwor
ICAgICAgICBWZWN0b3I8UmVmUHRyPEFQSU9iamVjdD4gPiBhcGlSZWN0czsKKyAgICAgICAgYXBp
UmVjdHMucmVzZXJ2ZUluaXRpYWxDYXBhY2l0eShudW1SZWN0cyk7CisKKyAgICAgICAgZm9yIChz
aXplX3QgaSA9IDA7IGkgPCBudW1SZWN0czsgKytpKQorICAgICAgICAgICAgYXBpUmVjdHMudW5j
aGVja2VkQXBwZW5kKFdlYlJlY3Q6OmNyZWF0ZSh0b0FQSShyZWN0c1tpXSkpKTsKKyAgICAgICAg
bWF0Y2hlcy51bmNoZWNrZWRBcHBlbmQoSW1tdXRhYmxlQXJyYXk6OmFkb3B0KGFwaVJlY3RzKSk7
CisgICAgfQorICAgIG1fZmluZE1hdGNoZXNDbGllbnQuZGlkRmluZFN0cmluZ01hdGNoZXModGhp
cywgc3RyaW5nLCBJbW11dGFibGVBcnJheTo6YWRvcHQobWF0Y2hlcykuZ2V0KCksIGZpcnN0SW5k
ZXhBZnRlclNlbGVjdGlvbik7Cit9CisKIHZvaWQgV2ViUGFnZVByb3h5OjpkaWRGYWlsVG9GaW5k
U3RyaW5nKGNvbnN0IFN0cmluZyYgc3RyaW5nKQogewogICAgIG1fZmluZENsaWVudC5kaWRGYWls
VG9GaW5kU3RyaW5nKHRoaXMsIHN0cmluZyk7CkluZGV4OiBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nl
c3MvV2ViUGFnZVByb3h5LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdDIvVUlQcm9jZXNz
L1dlYlBhZ2VQcm94eS5oCShyZXZpc2lvbiAxMzk2MzUpCisrKyBTb3VyY2UvV2ViS2l0Mi9VSVBy
b2Nlc3MvV2ViUGFnZVByb3h5LmgJKHdvcmtpbmcgY29weSkKQEAgLTI3Nyw2ICsyNzcsNyBAQCBw
dWJsaWM6CiAgICAgdm9pZCBpbml0aWFsaXplQ29udGV4dE1lbnVDbGllbnQoY29uc3QgV0tQYWdl
Q29udGV4dE1lbnVDbGllbnQqKTsKICNlbmRpZgogICAgIHZvaWQgaW5pdGlhbGl6ZUZpbmRDbGll
bnQoY29uc3QgV0tQYWdlRmluZENsaWVudCopOworICAgIHZvaWQgaW5pdGlhbGl6ZUZpbmRNYXRj
aGVzQ2xpZW50KGNvbnN0IFdLUGFnZUZpbmRNYXRjaGVzQ2xpZW50Kik7CiAgICAgdm9pZCBpbml0
aWFsaXplRm9ybUNsaWVudChjb25zdCBXS1BhZ2VGb3JtQ2xpZW50Kik7CiAgICAgdm9pZCBpbml0
aWFsaXplTG9hZGVyQ2xpZW50KGNvbnN0IFdLUGFnZUxvYWRlckNsaWVudCopOwogICAgIHZvaWQg
aW5pdGlhbGl6ZVBvbGljeUNsaWVudChjb25zdCBXS1BhZ2VQb2xpY3lDbGllbnQqKTsKQEAgLTUz
NCwxMiArNTM1LDE3IEBAIHB1YmxpYzoKIAogICAgIC8vIEZpbmQuCiAgICAgdm9pZCBmaW5kU3Ry
aW5nKGNvbnN0IFN0cmluZyYsIEZpbmRPcHRpb25zLCB1bnNpZ25lZCBtYXhNYXRjaENvdW50KTsK
KyAgICB2b2lkIGZpbmRTdHJpbmdNYXRjaGVzKGNvbnN0IFN0cmluZyYsIEZpbmRPcHRpb25zLCB1
bnNpZ25lZCBtYXhNYXRjaENvdW50KTsKKyAgICB2b2lkIGdldEltYWdlRm9yRmluZE1hdGNoKGlu
dDMyX3QgbWF0Y2hJbmRleCk7CisgICAgdm9pZCBzZWxlY3RGaW5kTWF0Y2goaW50MzJfdCBtYXRj
aEluZGV4KTsKKyAgICB2b2lkIGRpZEdldEltYWdlRm9yRmluZE1hdGNoKGNvbnN0IFNoYXJlYWJs
ZUJpdG1hcDo6SGFuZGxlJiBjb250ZW50SW1hZ2VIYW5kbGUsIHVpbnQzMl90IG1hdGNoSW5kZXgp
OwogICAgIHZvaWQgaGlkZUZpbmRVSSgpOwogICAgIHZvaWQgY291bnRTdHJpbmdNYXRjaGVzKGNv
bnN0IFN0cmluZyYsIEZpbmRPcHRpb25zLCB1bnNpZ25lZCBtYXhNYXRjaENvdW50KTsKICAgICB2
b2lkIGRpZENvdW50U3RyaW5nTWF0Y2hlcyhjb25zdCBTdHJpbmcmLCB1aW50MzJfdCBtYXRjaENv
dW50KTsKICAgICB2b2lkIHNldEZpbmRJbmRpY2F0b3IoY29uc3QgV2ViQ29yZTo6RmxvYXRSZWN0
JiBzZWxlY3Rpb25SZWN0SW5XaW5kb3dDb29yZGluYXRlcywgY29uc3QgVmVjdG9yPFdlYkNvcmU6
OkZsb2F0UmVjdD4mIHRleHRSZWN0c0luU2VsZWN0aW9uUmVjdENvb3JkaW5hdGVzLCBmbG9hdCBj
b250ZW50SW1hZ2VTY2FsZUZhY3RvciwgY29uc3QgU2hhcmVhYmxlQml0bWFwOjpIYW5kbGUmIGNv
bnRlbnRJbWFnZUhhbmRsZSwgYm9vbCBmYWRlT3V0LCBib29sIGFuaW1hdGUpOwogICAgIHZvaWQg
ZGlkRmluZFN0cmluZyhjb25zdCBTdHJpbmcmLCB1aW50MzJfdCBtYXRjaENvdW50KTsKICAgICB2
b2lkIGRpZEZhaWxUb0ZpbmRTdHJpbmcoY29uc3QgU3RyaW5nJik7CisgICAgdm9pZCBkaWRGaW5k
U3RyaW5nTWF0Y2hlcyhjb25zdCBTdHJpbmcmLCBWZWN0b3I8VmVjdG9yPFdlYkNvcmU6OkludFJl
Y3Q+ID4gbWF0Y2hSZWN0cywgaW50MzJfdCBmaXJzdEluZGV4QWZ0ZXJTZWxlY3Rpb24pOwogCiAg
ICAgdm9pZCBnZXRDb250ZW50c0FzU3RyaW5nKFBhc3NSZWZQdHI8U3RyaW5nQ2FsbGJhY2s+KTsK
ICNpZiBFTkFCTEUoTUhUTUwpCkBAIC0xMDQxLDYgKzEwNDcsNyBAQCBwcml2YXRlOgogICAgIFdl
YlJlc291cmNlTG9hZENsaWVudCBtX3Jlc291cmNlTG9hZENsaWVudDsKICAgICBXZWJVSUNsaWVu
dCBtX3VpQ2xpZW50OwogICAgIFdlYkZpbmRDbGllbnQgbV9maW5kQ2xpZW50OworICAgIFdlYkZp
bmRNYXRjaGVzQ2xpZW50IG1fZmluZE1hdGNoZXNDbGllbnQ7CiAjaWYgRU5BQkxFKENPTlRFWFRf
TUVOVVMpCiAgICAgV2ViUGFnZUNvbnRleHRNZW51Q2xpZW50IG1fY29udGV4dE1lbnVDbGllbnQ7
CiAjZW5kaWYKSW5kZXg6IFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9XZWJQYWdlUHJveHkubWVz
c2FnZXMuaW4KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL1dlYlBhZ2VQ
cm94eS5tZXNzYWdlcy5pbgkocmV2aXNpb24gMTM5NjM1KQorKysgU291cmNlL1dlYktpdDIvVUlQ
cm9jZXNzL1dlYlBhZ2VQcm94eS5tZXNzYWdlcy5pbgkod29ya2luZyBjb3B5KQpAQCAtMjEzLDYg
KzIxMyw4IEBAIG1lc3NhZ2VzIC0+IFdlYlBhZ2VQcm94eSB7CiAgICAgU2V0RmluZEluZGljYXRv
cihXZWJDb3JlOjpGbG9hdFJlY3Qgc2VsZWN0aW9uUmVjdCwgVmVjdG9yPFdlYkNvcmU6OkZsb2F0
UmVjdD4gdGV4dFJlY3RzLCBmbG9hdCBjb250ZW50SW1hZ2VTY2FsZUZhY3RvciwgV2ViS2l0OjpT
aGFyZWFibGVCaXRtYXA6OkhhbmRsZSBjb250ZW50SW1hZ2VIYW5kbGUsIGJvb2wgZmFkZU91dCwg
Ym9vbCBhbmltYXRlKQogICAgIERpZEZpbmRTdHJpbmcoV1RGOjpTdHJpbmcgc3RyaW5nLCB1aW50
MzJfdCBtYXRjaENvdW50KQogICAgIERpZEZhaWxUb0ZpbmRTdHJpbmcoV1RGOjpTdHJpbmcgc3Ry
aW5nKQorICAgIERpZEZpbmRTdHJpbmdNYXRjaGVzKFdURjo6U3RyaW5nIHN0cmluZywgVmVjdG9y
PFZlY3RvcjxXZWJDb3JlOjpJbnRSZWN0PiA+IG1hdGNoZXMsIGludDMyX3QgZmlyc3RJbmRleEFm
dGVyU2VsZWN0aW9uKQorICAgIERpZEdldEltYWdlRm9yRmluZE1hdGNoKFdlYktpdDo6U2hhcmVh
YmxlQml0bWFwOjpIYW5kbGUgY29udGVudEltYWdlSGFuZGxlLCB1aW50MzJfdCBtYXRjaEluZGV4
KQogCiAgICAgIyBQb3B1cE1lbnUgbWVzc2FnZXMKICAgICBTaG93UG9wdXBNZW51KFdlYkNvcmU6
OkludFJlY3QgcmVjdCwgdWludDY0X3QgdGV4dERpcmVjdGlvbiwgVmVjdG9yPFdlYktpdDo6V2Vi
UG9wdXBJdGVtPiBpdGVtcywgaW50MzJfdCBzZWxlY3RlZEluZGV4LCBXZWJLaXQ6OlBsYXRmb3Jt
UG9wdXBNZW51RGF0YSBkYXRhKQpJbmRleDogU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9D
L1dLUGFnZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9D
L1dLUGFnZS5jcHAJKHJldmlzaW9uIDEzOTYzNSkKKysrIFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vz
cy9BUEkvQy9XS1BhZ2UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00OTMsNiArNDkzLDIxIEBAIHZv
aWQgV0tQYWdlQ2VudGVyU2VsZWN0aW9uSW5WaXNpYmxlQXJlYSgKICAgICByZXR1cm4gdG9JbXBs
KHBhZ2VSZWYpLT5jZW50ZXJTZWxlY3Rpb25JblZpc2libGVBcmVhKCk7CiB9CiAKK3ZvaWQgV0tQ
YWdlRmluZFN0cmluZ01hdGNoZXMoV0tQYWdlUmVmIHBhZ2VSZWYsIFdLU3RyaW5nUmVmIHN0cmlu
ZywgV0tGaW5kT3B0aW9ucyBvcHRpb25zLCB1bnNpZ25lZCBtYXhNYXRjaENvdW50KQoreworICAg
IHRvSW1wbChwYWdlUmVmKS0+ZmluZFN0cmluZ01hdGNoZXModG9JbXBsKHN0cmluZyktPnN0cmlu
ZygpLCB0b0ZpbmRPcHRpb25zKG9wdGlvbnMpLCBtYXhNYXRjaENvdW50KTsKK30KKwordm9pZCBX
S1BhZ2VHZXRJbWFnZUZvckZpbmRNYXRjaChXS1BhZ2VSZWYgcGFnZVJlZiwgaW50MzJfdCBtYXRj
aEluZGV4KQoreworICAgIHRvSW1wbChwYWdlUmVmKS0+Z2V0SW1hZ2VGb3JGaW5kTWF0Y2gobWF0
Y2hJbmRleCk7Cit9CisKK3ZvaWQgV0tQYWdlU2VsZWN0RmluZE1hdGNoKFdLUGFnZVJlZiBwYWdl
UmVmLCBpbnQzMl90IG1hdGNoSW5kZXgpCit7CisgICAgdG9JbXBsKHBhZ2VSZWYpLT5zZWxlY3RG
aW5kTWF0Y2gobWF0Y2hJbmRleCk7Cit9CisKIHZvaWQgV0tQYWdlRmluZFN0cmluZyhXS1BhZ2VS
ZWYgcGFnZVJlZiwgV0tTdHJpbmdSZWYgc3RyaW5nLCBXS0ZpbmRPcHRpb25zIG9wdGlvbnMsIHVu
c2lnbmVkIG1heE1hdGNoQ291bnQpCiB7CiAgICAgdG9JbXBsKHBhZ2VSZWYpLT5maW5kU3RyaW5n
KHRvSW1wbChzdHJpbmcpLT5zdHJpbmcoKSwgdG9GaW5kT3B0aW9ucyhvcHRpb25zKSwgbWF4TWF0
Y2hDb3VudCk7CkBAIC01MjAsNiArNTM1LDExIEBAIHZvaWQgV0tQYWdlU2V0UGFnZUZpbmRDbGll
bnQoV0tQYWdlUmVmIHAKICAgICB0b0ltcGwocGFnZVJlZiktPmluaXRpYWxpemVGaW5kQ2xpZW50
KHdrQ2xpZW50KTsKIH0KIAordm9pZCBXS1BhZ2VTZXRQYWdlRmluZE1hdGNoZXNDbGllbnQoV0tQ
YWdlUmVmIHBhZ2VSZWYsIGNvbnN0IFdLUGFnZUZpbmRNYXRjaGVzQ2xpZW50KiB3a0NsaWVudCkK
K3sKKyAgICB0b0ltcGwocGFnZVJlZiktPmluaXRpYWxpemVGaW5kTWF0Y2hlc0NsaWVudCh3a0Ns
aWVudCk7Cit9CisKIHZvaWQgV0tQYWdlU2V0UGFnZUZvcm1DbGllbnQoV0tQYWdlUmVmIHBhZ2VS
ZWYsIGNvbnN0IFdLUGFnZUZvcm1DbGllbnQqIHdrQ2xpZW50KQogewogICAgIHRvSW1wbChwYWdl
UmVmKS0+aW5pdGlhbGl6ZUZvcm1DbGllbnQod2tDbGllbnQpOwpJbmRleDogU291cmNlL1dlYktp
dDIvVUlQcm9jZXNzL0FQSS9DL1dLUGFnZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQy
L1VJUHJvY2Vzcy9BUEkvQy9XS1BhZ2UuaAkocmV2aXNpb24gMTM5NjM1KQorKysgU291cmNlL1dl
YktpdDIvVUlQcm9jZXNzL0FQSS9DL1dLUGFnZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0zMTYsNiAr
MzE2LDIwIEBAIGVudW0gewogICAgIGtXS01vcmVUaGFuTWF4aW11bU1hdGNoQ291bnQgPSAtMQog
fTsKIAorLy8gRmluZCBtYXRjaCBjbGllbnQuCit0eXBlZGVmIHZvaWQgKCpXS1BhZ2VEaWRGaW5k
U3RyaW5nTWF0Y2hlc0NhbGxiYWNrKShXS1BhZ2VSZWYgcGFnZSwgV0tTdHJpbmdSZWYgc3RyaW5n
LCBXS0FycmF5UmVmIG1hdGNoZXMsIGludCBmaXJzdEluZGV4LCBjb25zdCB2b2lkKiBjbGllbnRJ
bmZvKTsKK3R5cGVkZWYgdm9pZCAoKldLUGFnZURpZEdldEltYWdlRm9yTWF0Y2hSZXN1bHRDYWxs
YmFjaykoV0tQYWdlUmVmIHBhZ2UsIFdLSW1hZ2VSZWYgaW1hZ2UsIHVpbnQzMl90IGluZGV4LCBj
b25zdCB2b2lkKiBjbGllbnRJbmZvKTsKKworc3RydWN0IFdLUGFnZUZpbmRNYXRjaGVzQ2xpZW50
IHsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHZlcnNpb247CisgICAgY29uc3Qgdm9pZCAqICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRJbmZvOwor
ICAgIFdLUGFnZURpZEZpbmRTdHJpbmdNYXRjaGVzQ2FsbGJhY2sgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgZGlkRmluZFN0cmluZ01hdGNoZXM7CisgICAgV0tQYWdlRGlkR2V0SW1h
Z2VGb3JNYXRjaFJlc3VsdENhbGxiYWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWRH
ZXRJbWFnZUZvck1hdGNoUmVzdWx0OworfTsKK3R5cGVkZWYgc3RydWN0IFdLUGFnZUZpbmRNYXRj
aGVzQ2xpZW50IFdLUGFnZUZpbmRNYXRjaGVzQ2xpZW50OworCitlbnVtIHsga1dLUGFnZUZpbmRN
YXRjaGVzQ2xpZW50Q3VycmVudFZlcnNpb24gPSAwIH07CisKIC8vIENvbnRleHRNZW51IGNsaWVu
dAogdHlwZWRlZiB2b2lkICgqV0tQYWdlR2V0Q29udGV4dE1lbnVGcm9tUHJvcG9zZWRDb250ZXh0
TWVudUNhbGxiYWNrKShXS1BhZ2VSZWYgcGFnZSwgV0tBcnJheVJlZiBwcm9wb3NlZE1lbnUsIFdL
QXJyYXlSZWYqIG5ld01lbnUsIFdLSGl0VGVzdFJlc3VsdFJlZiBoaXRUZXN0UmVzdWx0LCBXS1R5
cGVSZWYgdXNlckRhdGEsIGNvbnN0IHZvaWQqIGNsaWVudEluZm8pOwogdHlwZWRlZiB2b2lkICgq
V0tQYWdlQ3VzdG9tQ29udGV4dE1lbnVJdGVtU2VsZWN0ZWRDYWxsYmFjaykoV0tQYWdlUmVmIHBh
Z2UsIFdLQ29udGV4dE1lbnVJdGVtUmVmIGNvbnRleHRNZW51SXRlbSwgY29uc3Qgdm9pZCogY2xp
ZW50SW5mbyk7CkBAIC00NTIsOSArNDY2LDEzIEBAIFdLX0VYUE9SVCB2b2lkIFdLUGFnZUNlbnRl
clNlbGVjdGlvbkluVmkKIFdLX0VYUE9SVCB2b2lkIFdLUGFnZUZpbmRTdHJpbmcoV0tQYWdlUmVm
IHBhZ2UsIFdLU3RyaW5nUmVmIHN0cmluZywgV0tGaW5kT3B0aW9ucyBmaW5kT3B0aW9ucywgdW5z
aWduZWQgbWF4TWF0Y2hDb3VudCk7CiBXS19FWFBPUlQgdm9pZCBXS1BhZ2VIaWRlRmluZFVJKFdL
UGFnZVJlZiBwYWdlKTsKIFdLX0VYUE9SVCB2b2lkIFdLUGFnZUNvdW50U3RyaW5nTWF0Y2hlcyhX
S1BhZ2VSZWYgcGFnZSwgV0tTdHJpbmdSZWYgc3RyaW5nLCBXS0ZpbmRPcHRpb25zIGZpbmRPcHRp
b25zLCB1bnNpZ25lZCBtYXhNYXRjaENvdW50KTsKK1dLX0VYUE9SVCB2b2lkIFdLUGFnZUZpbmRT
dHJpbmdNYXRjaGVzKFdLUGFnZVJlZiBwYWdlLCBXS1N0cmluZ1JlZiBzdHJpbmcsIFdLRmluZE9w
dGlvbnMgZmluZE9wdGlvbnMsIHVuc2lnbmVkIG1heE1hdGNoQ291bnQpOworV0tfRVhQT1JUIHZv
aWQgV0tQYWdlR2V0SW1hZ2VGb3JGaW5kTWF0Y2goV0tQYWdlUmVmIHBhZ2UsIGludDMyX3QgbWF0
Y2hJbmRleCk7CitXS19FWFBPUlQgdm9pZCBXS1BhZ2VTZWxlY3RGaW5kTWF0Y2goV0tQYWdlUmVm
IHBhZ2UsIGludDMyX3QgbWF0Y2hJbmRleCk7CiAKIFdLX0VYUE9SVCB2b2lkIFdLUGFnZVNldFBh
Z2VDb250ZXh0TWVudUNsaWVudChXS1BhZ2VSZWYgcGFnZSwgY29uc3QgV0tQYWdlQ29udGV4dE1l
bnVDbGllbnQqIGNsaWVudCk7CiBXS19FWFBPUlQgdm9pZCBXS1BhZ2VTZXRQYWdlRmluZENsaWVu
dChXS1BhZ2VSZWYgcGFnZSwgY29uc3QgV0tQYWdlRmluZENsaWVudCogY2xpZW50KTsKK1dLX0VY
UE9SVCB2b2lkIFdLUGFnZVNldFBhZ2VGaW5kTWF0Y2hlc0NsaWVudChXS1BhZ2VSZWYgcGFnZSwg
Y29uc3QgV0tQYWdlRmluZE1hdGNoZXNDbGllbnQqIGNsaWVudCk7CiBXS19FWFBPUlQgdm9pZCBX
S1BhZ2VTZXRQYWdlRm9ybUNsaWVudChXS1BhZ2VSZWYgcGFnZSwgY29uc3QgV0tQYWdlRm9ybUNs
aWVudCogY2xpZW50KTsKIFdLX0VYUE9SVCB2b2lkIFdLUGFnZVNldFBhZ2VMb2FkZXJDbGllbnQo
V0tQYWdlUmVmIHBhZ2UsIGNvbnN0IFdLUGFnZUxvYWRlckNsaWVudCogY2xpZW50KTsKIFdLX0VY
UE9SVCB2b2lkIFdLUGFnZVNldFBhZ2VQb2xpY3lDbGllbnQoV0tQYWdlUmVmIHBhZ2UsIGNvbnN0
IFdLUGFnZVBvbGljeUNsaWVudCogY2xpZW50KTsKSW5kZXg6IFNvdXJjZS9XZWJLaXQyL1dlYlBy
b2Nlc3MvV2ViUGFnZS9GaW5kQ29udHJvbGxlci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dl
YktpdDIvV2ViUHJvY2Vzcy9XZWJQYWdlL0ZpbmRDb250cm9sbGVyLmNwcAkocmV2aXNpb24gMTM5
NjM1KQorKysgU291cmNlL1dlYktpdDIvV2ViUHJvY2Vzcy9XZWJQYWdlL0ZpbmRDb250cm9sbGVy
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTkzLDM4ICsxOTMsMzEgQEAgdm9pZCBGaW5kQ29udHJv
bGxlcjo6ZmluZFN0cmluZyhjb25zdCBTdAogICAgIG1fd2ViUGFnZS0+ZHJhd2luZ0FyZWEoKS0+
ZGlzcGF0Y2hBZnRlckVuc3VyaW5nVXBkYXRlZFNjcm9sbFBvc2l0aW9uKFdURjo6YmluZCgmRmlu
ZENvbnRyb2xsZXI6OnVwZGF0ZUZpbmRVSUFmdGVyUGFnZVNjcm9sbCwgdGhpcywgZm91bmQsIHN0
cmluZywgb3B0aW9ucywgbWF4TWF0Y2hDb3VudCkpOwogfQogCi12b2lkIEZpbmRDb250cm9sbGVy
OjpoaWRlRmluZFVJKCkKK3ZvaWQgRmluZENvbnRyb2xsZXI6OmZpbmRTdHJpbmdNYXRjaGVzKGNv
bnN0IFN0cmluZyYgc3RyaW5nLCBGaW5kT3B0aW9ucyBvcHRpb25zLCB1bnNpZ25lZCBtYXhNYXRj
aENvdW50KQogewotICAgIGlmIChtX2ZpbmRQYWdlT3ZlcmxheSkKLSAgICAgICAgbV93ZWJQYWdl
LT51bmluc3RhbGxQYWdlT3ZlcmxheShtX2ZpbmRQYWdlT3ZlcmxheSwgZmFsc2UpOworICAgIG1f
ZmluZE1hdGNoZXMuY2xlYXIoKTsKKyAgICBpbnQgaW5kZXhGb3JTZWxlY3Rpb247CiAKLSAgICBQ
bHVnaW5WaWV3KiBwbHVnaW5WaWV3ID0gcGx1Z2luVmlld0ZvckZyYW1lKG1fd2ViUGFnZS0+bWFp
bkZyYW1lKCkpOwotICAgIAotICAgIGlmIChwbHVnaW5WaWV3KQotICAgICAgICBwbHVnaW5WaWV3
LT5maW5kU3RyaW5nKGVtcHR5U3RyaW5nKCksIDAsIDApOwotICAgIGVsc2UKLSAgICAgICAgbV93
ZWJQYWdlLT5jb3JlUGFnZSgpLT51bm1hcmtBbGxUZXh0TWF0Y2hlcygpOwotICAgIAotICAgIGhp
ZGVGaW5kSW5kaWNhdG9yKCk7CisgICAgbV93ZWJQYWdlLT5jb3JlUGFnZSgpLT5maW5kU3RyaW5n
TWF0Y2hpbmdSYW5nZXMoc3RyaW5nLCBjb3JlKG9wdGlvbnMpLCBtYXhNYXRjaENvdW50LCAmbV9m
aW5kTWF0Y2hlcywgaW5kZXhGb3JTZWxlY3Rpb24pOworCisgICAgVmVjdG9yPFZlY3RvcjxJbnRS
ZWN0PiA+IG1hdGNoUmVjdHM7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX2ZpbmRNYXRj
aGVzLnNpemUoKTsgKytpKSB7CisgICAgICAgIFZlY3RvcjxJbnRSZWN0PiByZWN0czsKKyAgICAg
ICAgbV9maW5kTWF0Y2hlc1tpXS0+dGV4dFJlY3RzKHJlY3RzKTsKKyAgICAgICAgbWF0Y2hSZWN0
cy5hcHBlbmQocmVjdHMpOworICAgIH0KKworICAgIG1fd2ViUGFnZS0+c2VuZChNZXNzYWdlczo6
V2ViUGFnZVByb3h5OjpEaWRGaW5kU3RyaW5nTWF0Y2hlcyhzdHJpbmcsIG1hdGNoUmVjdHMsIGlu
ZGV4Rm9yU2VsZWN0aW9uKSk7CiB9CiAKLWJvb2wgRmluZENvbnRyb2xsZXI6OnVwZGF0ZUZpbmRJ
bmRpY2F0b3IoRnJhbWUqIHNlbGVjdGVkRnJhbWUsIGJvb2wgaXNTaG93aW5nT3ZlcmxheSwgYm9v
bCBzaG91bGRBbmltYXRlKQorYm9vbCBGaW5kQ29udHJvbGxlcjo6Z2V0RmluZEluZGljYXRvckJp
dG1hcEFuZFJlY3QoRnJhbWUqIGZyYW1lLCBTaGFyZWFibGVCaXRtYXA6OkhhbmRsZSYgaGFuZGxl
LCBJbnRSZWN0JiBzZWxlY3Rpb25SZWN0KQogewotICAgIGlmICghc2VsZWN0ZWRGcmFtZSkKLSAg
ICAgICAgcmV0dXJuIGZhbHNlOworICAgIHNlbGVjdGlvblJlY3QgPSBlbmNsb3NpbmdJbnRSZWN0
KGZyYW1lLT5zZWxlY3Rpb24oKS0+Ym91bmRzKCkpOwogCi0gICAgSW50UmVjdCBzZWxlY3Rpb25S
ZWN0ID0gZW5jbG9zaW5nSW50UmVjdChzZWxlY3RlZEZyYW1lLT5zZWxlY3Rpb24oKS0+Ym91bmRz
KCkpOwotICAgIAogICAgIC8vIFNlbGVjdGlvbiByZWN0IGNhbiBiZSBlbXB0eSBmb3IgbWF0Y2hl
cyB0aGF0IGFyZSBjdXJyZW50bHkgb2JzY3VyZWQgZnJvbSB2aWV3LgogICAgIGlmIChzZWxlY3Rp
b25SZWN0LmlzRW1wdHkoKSkKICAgICAgICAgcmV0dXJuIGZhbHNlOwogCi0gICAgLy8gV2Ugd2Fu
dCB0aGUgc2VsZWN0aW9uIHJlY3QgaW4gd2luZG93IGNvb3JkaW5hdGVzLgotICAgIEludFJlY3Qg
c2VsZWN0aW9uUmVjdEluV2luZG93Q29vcmRpbmF0ZXMgPSBzZWxlY3RlZEZyYW1lLT52aWV3KCkt
PmNvbnRlbnRzVG9XaW5kb3coc2VsZWN0aW9uUmVjdCk7Ci0gICAgCi0gICAgVmVjdG9yPEZsb2F0
UmVjdD4gdGV4dFJlY3RzOwotICAgIHNlbGVjdGVkRnJhbWUtPnNlbGVjdGlvbigpLT5nZXRDbGlw
cGVkVmlzaWJsZVRleHRSZWN0YW5nbGVzKHRleHRSZWN0cyk7Ci0KICAgICBJbnRTaXplIGJhY2tp
bmdTdG9yZVNpemUgPSBzZWxlY3Rpb25SZWN0LnNpemUoKTsKICAgICBiYWNraW5nU3RvcmVTaXpl
LnNjYWxlKG1fd2ViUGFnZS0+Y29yZVBhZ2UoKS0+ZGV2aWNlU2NhbGVGYWN0b3IoKSk7CiAKQEAg
LTIzMiwyNSArMjI1LDg4IEBAIGJvb2wgRmluZENvbnRyb2xsZXI6OnVwZGF0ZUZpbmRJbmRpY2F0
b3IKICAgICBSZWZQdHI8U2hhcmVhYmxlQml0bWFwPiBmaW5kSW5kaWNhdG9yVGV4dEJhY2tpbmdT
dG9yZSA9IFNoYXJlYWJsZUJpdG1hcDo6Y3JlYXRlU2hhcmVhYmxlKGJhY2tpbmdTdG9yZVNpemUs
IFNoYXJlYWJsZUJpdG1hcDo6U3VwcG9ydHNBbHBoYSk7CiAgICAgaWYgKCFmaW5kSW5kaWNhdG9y
VGV4dEJhY2tpbmdTdG9yZSkKICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIAorCiAgICAgT3du
UHRyPEdyYXBoaWNzQ29udGV4dD4gZ3JhcGhpY3NDb250ZXh0ID0gZmluZEluZGljYXRvclRleHRC
YWNraW5nU3RvcmUtPmNyZWF0ZUdyYXBoaWNzQ29udGV4dCgpOwogICAgIGdyYXBoaWNzQ29udGV4
dC0+c2NhbGUoRmxvYXRTaXplKG1fd2ViUGFnZS0+Y29yZVBhZ2UoKS0+ZGV2aWNlU2NhbGVGYWN0
b3IoKSwgbV93ZWJQYWdlLT5jb3JlUGFnZSgpLT5kZXZpY2VTY2FsZUZhY3RvcigpKSk7CiAKICAg
ICBJbnRSZWN0IHBhaW50UmVjdCA9IHNlbGVjdGlvblJlY3Q7Ci0gICAgcGFpbnRSZWN0Lm1vdmUo
c2VsZWN0ZWRGcmFtZS0+dmlldygpLT5mcmFtZVJlY3QoKS54KCksIHNlbGVjdGVkRnJhbWUtPnZp
ZXcoKS0+ZnJhbWVSZWN0KCkueSgpKTsKLSAgICBwYWludFJlY3QubW92ZSgtc2VsZWN0ZWRGcmFt
ZS0+dmlldygpLT5zY3JvbGxPZmZzZXQoKSk7CisgICAgcGFpbnRSZWN0Lm1vdmUoZnJhbWUtPnZp
ZXcoKS0+ZnJhbWVSZWN0KCkueCgpLCBmcmFtZS0+dmlldygpLT5mcmFtZVJlY3QoKS55KCkpOwor
ICAgIHBhaW50UmVjdC5tb3ZlKC1mcmFtZS0+dmlldygpLT5zY3JvbGxPZmZzZXQoKSk7CiAKICAg
ICBncmFwaGljc0NvbnRleHQtPnRyYW5zbGF0ZSgtcGFpbnRSZWN0LngoKSwgLXBhaW50UmVjdC55
KCkpOwotICAgIHNlbGVjdGVkRnJhbWUtPnZpZXcoKS0+c2V0UGFpbnRCZWhhdmlvcihQYWludEJl
aGF2aW9yU2VsZWN0aW9uT25seSB8IFBhaW50QmVoYXZpb3JGb3JjZUJsYWNrVGV4dCB8IFBhaW50
QmVoYXZpb3JGbGF0dGVuQ29tcG9zaXRpbmdMYXllcnMpOwotICAgIHNlbGVjdGVkRnJhbWUtPmRv
Y3VtZW50KCktPnVwZGF0ZUxheW91dCgpOworICAgIGZyYW1lLT52aWV3KCktPnNldFBhaW50QmVo
YXZpb3IoUGFpbnRCZWhhdmlvclNlbGVjdGlvbk9ubHkgfCBQYWludEJlaGF2aW9yRm9yY2VCbGFj
a1RleHQgfCBQYWludEJlaGF2aW9yRmxhdHRlbkNvbXBvc2l0aW5nTGF5ZXJzKTsKKyAgICBmcmFt
ZS0+ZG9jdW1lbnQoKS0+dXBkYXRlTGF5b3V0KCk7CisKKyAgICBmcmFtZS0+dmlldygpLT5wYWlu
dChncmFwaGljc0NvbnRleHQuZ2V0KCksIHBhaW50UmVjdCk7CisgICAgZnJhbWUtPnZpZXcoKS0+
c2V0UGFpbnRCZWhhdmlvcihQYWludEJlaGF2aW9yTm9ybWFsKTsKKworICAgIGlmICghZmluZElu
ZGljYXRvclRleHRCYWNraW5nU3RvcmUtPmNyZWF0ZUhhbmRsZShoYW5kbGUpKQorICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgRmluZENvbnRyb2xsZXI6
OmdldEltYWdlRm9yRmluZE1hdGNoKHVpbnQzMl90IG1hdGNoSW5kZXgpCit7CisgICAgaWYgKG1h
dGNoSW5kZXggPj0gbV9maW5kTWF0Y2hlcy5zaXplKCkpCisgICAgICAgIHJldHVybjsKKyAgICBG
cmFtZSogZnJhbWUgPSBtX2ZpbmRNYXRjaGVzW21hdGNoSW5kZXhdLT5zdGFydENvbnRhaW5lcigp
LT5kb2N1bWVudCgpLT5mcmFtZSgpOworICAgIGlmICghZnJhbWUpCisgICAgICAgIHJldHVybjsK
KworICAgIFZpc2libGVTZWxlY3Rpb24gb2xkU2VsZWN0aW9uID0gZnJhbWUtPnNlbGVjdGlvbigp
LT5zZWxlY3Rpb24oKTsKKyAgICBmcmFtZS0+c2VsZWN0aW9uKCktPnNldFNlbGVjdGlvbihWaXNp
YmxlU2VsZWN0aW9uKG1fZmluZE1hdGNoZXNbbWF0Y2hJbmRleF0uZ2V0KCkpKTsKIAotICAgIHNl
bGVjdGVkRnJhbWUtPnZpZXcoKS0+cGFpbnQoZ3JhcGhpY3NDb250ZXh0LmdldCgpLCBwYWludFJl
Y3QpOwotICAgIHNlbGVjdGVkRnJhbWUtPnZpZXcoKS0+c2V0UGFpbnRCZWhhdmlvcihQYWludEJl
aGF2aW9yTm9ybWFsKTsKKyAgICBJbnRSZWN0IHNlbGVjdGlvblJlY3Q7CisgICAgU2hhcmVhYmxl
Qml0bWFwOjpIYW5kbGUgaGFuZGxlOworICAgIGdldEZpbmRJbmRpY2F0b3JCaXRtYXBBbmRSZWN0
KGZyYW1lLCBoYW5kbGUsIHNlbGVjdGlvblJlY3QpOworCisgICAgZnJhbWUtPnNlbGVjdGlvbigp
LT5zZXRTZWxlY3Rpb24ob2xkU2VsZWN0aW9uKTsKKworICAgIG1fd2ViUGFnZS0+c2VuZChNZXNz
YWdlczo6V2ViUGFnZVByb3h5OjpEaWRHZXRJbWFnZUZvckZpbmRNYXRjaChoYW5kbGUsIG1hdGNo
SW5kZXgpKTsKK30KKwordm9pZCBGaW5kQ29udHJvbGxlcjo6c2VsZWN0RmluZE1hdGNoKHVpbnQz
Ml90IG1hdGNoSW5kZXgpCit7CisgICAgaWYgKG1hdGNoSW5kZXggPj0gbV9maW5kTWF0Y2hlcy5z
aXplKCkpCisgICAgICAgIHJldHVybjsKKyAgICBGcmFtZSogZnJhbWUgPSBtX2ZpbmRNYXRjaGVz
W21hdGNoSW5kZXhdLT5zdGFydENvbnRhaW5lcigpLT5kb2N1bWVudCgpLT5mcmFtZSgpOworICAg
IGlmICghZnJhbWUpCisgICAgICAgIHJldHVybjsKKyAgICBmcmFtZS0+c2VsZWN0aW9uKCktPnNl
dFNlbGVjdGlvbihWaXNpYmxlU2VsZWN0aW9uKG1fZmluZE1hdGNoZXNbbWF0Y2hJbmRleF0uZ2V0
KCkpKTsKK30KKwordm9pZCBGaW5kQ29udHJvbGxlcjo6aGlkZUZpbmRVSSgpCit7CisgICAgbV9m
aW5kTWF0Y2hlcy5jbGVhcigpOworICAgIGlmIChtX2ZpbmRQYWdlT3ZlcmxheSkKKyAgICAgICAg
bV93ZWJQYWdlLT51bmluc3RhbGxQYWdlT3ZlcmxheShtX2ZpbmRQYWdlT3ZlcmxheSwgZmFsc2Up
OworCisgICAgUGx1Z2luVmlldyogcGx1Z2luVmlldyA9IHBsdWdpblZpZXdGb3JGcmFtZShtX3dl
YlBhZ2UtPm1haW5GcmFtZSgpKTsKKyAgICAKKyAgICBpZiAocGx1Z2luVmlldykKKyAgICAgICAg
cGx1Z2luVmlldy0+ZmluZFN0cmluZyhlbXB0eVN0cmluZygpLCAwLCAwKTsKKyAgICBlbHNlCisg
ICAgICAgIG1fd2ViUGFnZS0+Y29yZVBhZ2UoKS0+dW5tYXJrQWxsVGV4dE1hdGNoZXMoKTsKICAg
ICAKKyAgICBoaWRlRmluZEluZGljYXRvcigpOworfQorCitib29sIEZpbmRDb250cm9sbGVyOjp1
cGRhdGVGaW5kSW5kaWNhdG9yKEZyYW1lKiBzZWxlY3RlZEZyYW1lLCBib29sIGlzU2hvd2luZ092
ZXJsYXksIGJvb2wgc2hvdWxkQW5pbWF0ZSkKK3sKKyAgICBpZiAoIXNlbGVjdGVkRnJhbWUpCisg
ICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIEludFJlY3Qgc2VsZWN0aW9uUmVjdDsKICAgICBT
aGFyZWFibGVCaXRtYXA6OkhhbmRsZSBoYW5kbGU7Ci0gICAgaWYgKCFmaW5kSW5kaWNhdG9yVGV4
dEJhY2tpbmdTdG9yZS0+Y3JlYXRlSGFuZGxlKGhhbmRsZSkpCisgICAgaWYgKCFnZXRGaW5kSW5k
aWNhdG9yQml0bWFwQW5kUmVjdChzZWxlY3RlZEZyYW1lLCBoYW5kbGUsIHNlbGVjdGlvblJlY3Qp
KQogICAgICAgICByZXR1cm4gZmFsc2U7CiAKKyAgICAvLyBXZSB3YW50IHRoZSBzZWxlY3Rpb24g
cmVjdCBpbiB3aW5kb3cgY29vcmRpbmF0ZXMuCisgICAgSW50UmVjdCBzZWxlY3Rpb25SZWN0SW5X
aW5kb3dDb29yZGluYXRlcyA9IHNlbGVjdGVkRnJhbWUtPnZpZXcoKS0+Y29udGVudHNUb1dpbmRv
dyhzZWxlY3Rpb25SZWN0KTsKKworICAgIFZlY3RvcjxGbG9hdFJlY3Q+IHRleHRSZWN0czsKKyAg
ICBzZWxlY3RlZEZyYW1lLT5zZWxlY3Rpb24oKS0+Z2V0Q2xpcHBlZFZpc2libGVUZXh0UmVjdGFu
Z2xlcyh0ZXh0UmVjdHMpOworCiAgICAgLy8gV2Ugd2FudCB0aGUgdGV4dCByZWN0cyBpbiBzZWxl
Y3Rpb24gcmVjdCBjb29yZGluYXRlcy4KICAgICBWZWN0b3I8RmxvYXRSZWN0PiB0ZXh0UmVjdHNJ
blNlbGVjdGlvblJlY3RDb29yZGluYXRlczsKICAgICAKSW5kZXg6IFNvdXJjZS9XZWJLaXQyL1dl
YlByb2Nlc3MvV2ViUGFnZS9GaW5kQ29udHJvbGxlci5oCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9X
ZWJLaXQyL1dlYlByb2Nlc3MvV2ViUGFnZS9GaW5kQ29udHJvbGxlci5oCShyZXZpc2lvbiAxMzk2
MzUpCisrKyBTb3VyY2UvV2ViS2l0Mi9XZWJQcm9jZXNzL1dlYlBhZ2UvRmluZENvbnRyb2xsZXIu
aAkod29ya2luZyBjb3B5KQpAQCAtMjcsNiArMjcsNyBAQAogI2RlZmluZSBGaW5kQ29udHJvbGxl
cl9oCiAKICNpbmNsdWRlICJQYWdlT3ZlcmxheS5oIgorI2luY2x1ZGUgIlNoYXJlYWJsZUJpdG1h
cC5oIgogI2luY2x1ZGUgIldlYkZpbmRPcHRpb25zLmgiCiAjaW5jbHVkZSA8V2ViQ29yZS9JbnRS
ZWN0Lmg+CiAjaW5jbHVkZSA8d3RmL0ZvcndhcmQuaD4KQEAgLTM1LDYgKzM2LDcgQEAKIAogbmFt
ZXNwYWNlIFdlYkNvcmUgewogICAgIGNsYXNzIEZyYW1lOworICAgIGNsYXNzIFJhbmdlOwogfQog
CiBuYW1lc3BhY2UgV2ViS2l0IHsKQEAgLTQ5LDYgKzUxLDkgQEAgcHVibGljOgogICAgIHZpcnR1
YWwgfkZpbmRDb250cm9sbGVyKCk7CiAKICAgICB2b2lkIGZpbmRTdHJpbmcoY29uc3QgU3RyaW5n
JiwgRmluZE9wdGlvbnMsIHVuc2lnbmVkIG1heE1hdGNoQ291bnQpOworICAgIHZvaWQgZmluZFN0
cmluZ01hdGNoZXMoY29uc3QgU3RyaW5nJiwgRmluZE9wdGlvbnMsIHVuc2lnbmVkIG1heE1hdGNo
Q291bnQpOworICAgIHZvaWQgZ2V0SW1hZ2VGb3JGaW5kTWF0Y2godWludDMyX3QgbWF0Y2hJbmRl
eCk7CisgICAgdm9pZCBzZWxlY3RGaW5kTWF0Y2godWludDMyX3QgbWF0Y2hJbmRleCk7CiAgICAg
dm9pZCBoaWRlRmluZFVJKCk7CiAgICAgdm9pZCBjb3VudFN0cmluZ01hdGNoZXMoY29uc3QgU3Ry
aW5nJiwgRmluZE9wdGlvbnMsIHVuc2lnbmVkIG1heE1hdGNoQ291bnQpOwogICAgIApAQCAtNjgs
NiArNzMsNyBAQCBwcml2YXRlOgogICAgIHZpcnR1YWwgdm9pZCBkcmF3UmVjdChQYWdlT3Zlcmxh
eSosIFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dCYsIGNvbnN0IFdlYkNvcmU6OkludFJlY3QmIGRp
cnR5UmVjdCk7CiAKICAgICBWZWN0b3I8V2ViQ29yZTo6SW50UmVjdD4gcmVjdHNGb3JUZXh0TWF0
Y2hlcygpOworICAgIGJvb2wgZ2V0RmluZEluZGljYXRvckJpdG1hcEFuZFJlY3QoV2ViQ29yZTo6
RnJhbWUqLCBTaGFyZWFibGVCaXRtYXA6OkhhbmRsZSYsIFdlYkNvcmU6OkludFJlY3QmIHNlbGVj
dGlvblJlY3QpOwogICAgIGJvb2wgdXBkYXRlRmluZEluZGljYXRvcihXZWJDb3JlOjpGcmFtZSog
c2VsZWN0ZWRGcmFtZSwgYm9vbCBpc1Nob3dpbmdPdmVybGF5LCBib29sIHNob3VsZEFuaW1hdGUg
PSB0cnVlKTsKIAogICAgIHZvaWQgdXBkYXRlRmluZFVJQWZ0ZXJQYWdlU2Nyb2xsKGJvb2wgZm91
bmQsIGNvbnN0IFN0cmluZyYsIEZpbmRPcHRpb25zLCB1bnNpZ25lZCBtYXhNYXRjaENvdW50KTsK
QEAgLTc5LDYgKzg1LDcgQEAgcHJpdmF0ZToKICAgICAvLyB0aGUgZmluZCBpbmRpY2F0b3IgaXNu
J3Qgc2hvd2luZywgYnV0IGl0IHdpbGwgbmV2ZXIgYmUgZmFsc2Ugd2hlbiBpdCBpcyBzaG93aW5n
LgogICAgIGJvb2wgbV9pc1Nob3dpbmdGaW5kSW5kaWNhdG9yOwogICAgIFdlYkNvcmU6OkludFJl
Y3QgbV9maW5kSW5kaWNhdG9yUmVjdDsKKyAgICBWZWN0b3I8UmVmUHRyPFdlYkNvcmU6OlJhbmdl
PiA+IG1fZmluZE1hdGNoZXM7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBXZWJLaXQKSW5kZXg6IFNv
dXJjZS9XZWJLaXQyL1dlYlByb2Nlc3MvV2ViUGFnZS9XZWJQYWdlLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvV2ViS2l0Mi9XZWJQcm9jZXNzL1dlYlBhZ2UvV2ViUGFnZS5jcHAJKHJldmlzaW9u
IDEzOTYzNSkKKysrIFNvdXJjZS9XZWJLaXQyL1dlYlByb2Nlc3MvV2ViUGFnZS9XZWJQYWdlLmNw
cAkod29ya2luZyBjb3B5KQpAQCAtMjY4MCw2ICsyNjgwLDIxIEBAIHZvaWQgV2ViUGFnZTo6Zmlu
ZFN0cmluZyhjb25zdCBTdHJpbmcmIHMKICAgICBtX2ZpbmRDb250cm9sbGVyLmZpbmRTdHJpbmco
c3RyaW5nLCBzdGF0aWNfY2FzdDxGaW5kT3B0aW9ucz4ob3B0aW9ucyksIG1heE1hdGNoQ291bnQp
OwogfQogCit2b2lkIFdlYlBhZ2U6OmZpbmRTdHJpbmdNYXRjaGVzKGNvbnN0IFN0cmluZyYgc3Ry
aW5nLCB1aW50MzJfdCBvcHRpb25zLCB1aW50MzJfdCBtYXhNYXRjaENvdW50KQoreworICAgIG1f
ZmluZENvbnRyb2xsZXIuZmluZFN0cmluZ01hdGNoZXMoc3RyaW5nLCBzdGF0aWNfY2FzdDxGaW5k
T3B0aW9ucz4ob3B0aW9ucyksIG1heE1hdGNoQ291bnQpOworfQorCit2b2lkIFdlYlBhZ2U6Omdl
dEltYWdlRm9yRmluZE1hdGNoKHVpbnQzMl90IG1hdGNoSW5kZXgpCit7CisgICAgbV9maW5kQ29u
dHJvbGxlci5nZXRJbWFnZUZvckZpbmRNYXRjaChtYXRjaEluZGV4KTsKK30KKwordm9pZCBXZWJQ
YWdlOjpzZWxlY3RGaW5kTWF0Y2godWludDMyX3QgbWF0Y2hJbmRleCkKK3sKKyAgICBtX2ZpbmRD
b250cm9sbGVyLnNlbGVjdEZpbmRNYXRjaChtYXRjaEluZGV4KTsKK30KKwogdm9pZCBXZWJQYWdl
OjpoaWRlRmluZFVJKCkKIHsKICAgICBtX2ZpbmRDb250cm9sbGVyLmhpZGVGaW5kVUkoKTsKSW5k
ZXg6IFNvdXJjZS9XZWJLaXQyL1dlYlByb2Nlc3MvV2ViUGFnZS9XZWJQYWdlLmgKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL1dlYktpdDIvV2ViUHJvY2Vzcy9XZWJQYWdlL1dlYlBhZ2UuaAkocmV2aXNp
b24gMTM5NjM1KQorKysgU291cmNlL1dlYktpdDIvV2ViUHJvY2Vzcy9XZWJQYWdlL1dlYlBhZ2Uu
aAkod29ya2luZyBjb3B5KQpAQCAtNzI5LDYgKzcyOSw5IEBAIHByaXZhdGU6CiAgICAgdm9pZCBk
aWRSZW1vdmVFZGl0Q29tbWFuZCh1aW50NjRfdCBjb21tYW5kSUQpOwogCiAgICAgdm9pZCBmaW5k
U3RyaW5nKGNvbnN0IFN0cmluZyYsIHVpbnQzMl90IGZpbmRPcHRpb25zLCB1aW50MzJfdCBtYXhN
YXRjaENvdW50KTsKKyAgICB2b2lkIGZpbmRTdHJpbmdNYXRjaGVzKGNvbnN0IFN0cmluZyYsIHVp
bnQzMl90IGZpbmRPcHRpb25zLCB1aW50MzJfdCBtYXhNYXRjaENvdW50KTsKKyAgICB2b2lkIGdl
dEltYWdlRm9yRmluZE1hdGNoKHVpbnQzMl90IG1hdGNoSW5kZXgpOworICAgIHZvaWQgc2VsZWN0
RmluZE1hdGNoKHVpbnQzMl90IG1hdGNoSW5kZXgpOwogICAgIHZvaWQgaGlkZUZpbmRVSSgpOwog
ICAgIHZvaWQgY291bnRTdHJpbmdNYXRjaGVzKGNvbnN0IFN0cmluZyYsIHVpbnQzMl90IGZpbmRP
cHRpb25zLCB1aW50MzJfdCBtYXhNYXRjaENvdW50KTsKIApJbmRleDogU291cmNlL1dlYktpdDIv
V2ViUHJvY2Vzcy9XZWJQYWdlL1dlYlBhZ2UubWVzc2FnZXMuaW4KPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL1dlYktpdDIvV2ViUHJvY2Vzcy9XZWJQYWdlL1dlYlBhZ2UubWVzc2FnZXMuaW4JKHJldmlz
aW9uIDEzOTYzNSkKKysrIFNvdXJjZS9XZWJLaXQyL1dlYlByb2Nlc3MvV2ViUGFnZS9XZWJQYWdl
Lm1lc3NhZ2VzLmluCSh3b3JraW5nIGNvcHkpCkBAIC0xNTEsNiArMTUxLDkgQEAgbWVzc2FnZXMg
LT4gV2ViUGFnZSB7CiAKICAgICAjIEZpbmQuCiAgICAgRmluZFN0cmluZyhXVEY6OlN0cmluZyBz
dHJpbmcsIHVpbnQzMl90IGZpbmRPcHRpb25zLCB1bnNpZ25lZCBtYXhNYXRjaENvdW50KQorICAg
IEZpbmRTdHJpbmdNYXRjaGVzKFdURjo6U3RyaW5nIHN0cmluZywgdWludDMyX3QgZmluZE9wdGlv
bnMsIHVuc2lnbmVkIG1heE1hdGNoQ291bnQpCisgICAgR2V0SW1hZ2VGb3JGaW5kTWF0Y2godWlu
dDMyX3QgbWF0Y2hJbmRleCkKKyAgICBTZWxlY3RGaW5kTWF0Y2godWludDMyX3QgbWF0Y2hJbmRl
eCkKICAgICBIaWRlRmluZFVJKCkKICAgICBDb3VudFN0cmluZ01hdGNoZXMoV1RGOjpTdHJpbmcg
c3RyaW5nLCB1aW50MzJfdCBmaW5kT3B0aW9ucywgdW5zaWduZWQgbWF4TWF0Y2hDb3VudCkKIApJ
bmRleDogU291cmNlL1dlYktpdC9tYWMvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9X
ZWJLaXQvbWFjL0NoYW5nZUxvZwkocmV2aXNpb24gMTM5Njc1KQorKysgU291cmNlL1dlYktpdC9t
YWMvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMjIgQEAKKzIwMTMtMDEtMTQg
IEVucmljYSBDYXN1Y2NpICA8ZW5yaWNhQGFwcGxlLmNvbT4KKworICAgICAgICBBZGQgYSBuZXcg
c2V0IG9mIFdlYktpdDIgQVBJcyBmb3IgdGV4dCBzZWFyY2ggYW5kCisgICAgICAgIHNlYXJjaCBy
ZXN1bHRzIG1hbmFnZW1lbnQuCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3df
YnVnLmNnaT9pZD0xMDY4MzQuCisgICAgICAgIDxyZGFyOi8vcHJvYmxlbS8xMjU5NzE1OT4KKwor
ICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKyAgICAgICAgCisgICAgICAgIEFk
ZGluZyBuZXcgQVBJIHRvIHBlcmZvcm0gdGV4dCBzZWFyY2ggaW4gV2ViS2l0MiB3aXRob3V0IHVz
aW5nCisgICAgICAgIHRoZSBzdG9jayBVSS4gVGhlIG5ldyBpbnRlcmZhY2UgcHJvdmlkZXMgYWxs
IHRoZSBpbmZvcm1hdGlvbgorICAgICAgICBuZWNlc3NhcnkgdG8gd3JpdGUgYSBjdXN0b20gVUkg
Zm9yIHNlYXJjaC4KKworICAgICAgICBBZGRlZCBuZXcgVGV4dFdlYktpdEFQSSB0ZXN0LgorCisg
ICAgICAgICogV2ViVmlldy9XZWJIVE1MVmlldy5tbToKKyAgICAgICAgKC1bV2ViSFRNTFZpZXcg
Y291bnRNYXRjaGVzRm9yVGV4dDppbkRPTVJhbmdlOm9wdGlvbnM6bGltaXQ6bWFya01hdGNoZXM6
XSk6CisgICAgICAgIE1vZGlmaWVkIHRvIHJlZmxlY3QgdGhlIGNoYW5nZXMgdG8gRWRpdG9yOjpj
b3VudE1hdGNoZXNGb3JUZXh0IGludGVyZmFjZS4KKwogMjAxMy0wMS0xMCAgWmFuIERvYmVyc2Vr
ICA8emFuZG9iZXJzZWtAZ21haWwuY29tPgogCiAgICAgICAgIFJlbW92ZSB0aGUgRU5BQkxFX0FO
SU1BVElPTl9BUEkgZmVhdHVyZSBkZWZpbmUgb2NjdXJlbmNlcwpJbmRleDogU291cmNlL1dlYktp
dC9tYWMvV2ViVmlldy9XZWJIVE1MVmlldy5tbQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0
L21hYy9XZWJWaWV3L1dlYkhUTUxWaWV3Lm1tCShyZXZpc2lvbiAxMzk2MzUpCisrKyBTb3VyY2Uv
V2ViS2l0L21hYy9XZWJWaWV3L1dlYkhUTUxWaWV3Lm1tCSh3b3JraW5nIGNvcHkpCkBAIC02MjE0
LDcgKzYyMTQsNyBAQCAtIChOU1VJbnRlZ2VyKWNvdW50TWF0Y2hlc0ZvclRleHQ6KE5TU3RyCiAg
ICAgaWYgKCFjb3JlRnJhbWUpCiAgICAgICAgIHJldHVybiAwOwogCi0gICAgcmV0dXJuIGNvcmVG
cmFtZS0+ZWRpdG9yKCktPmNvdW50TWF0Y2hlc0ZvclRleHQoc3RyaW5nLCBjb3JlKHJhbmdlKSwg
Y29yZU9wdGlvbnMob3B0aW9ucyksIGxpbWl0LCBtYXJrTWF0Y2hlcyk7CisgICAgcmV0dXJuIGNv
cmVGcmFtZS0+ZWRpdG9yKCktPmNvdW50TWF0Y2hlc0ZvclRleHQoc3RyaW5nLCBjb3JlKHJhbmdl
KSwgY29yZU9wdGlvbnMob3B0aW9ucyksIGxpbWl0LCBtYXJrTWF0Y2hlcywgMCk7CiB9CiAKIC0g
KHZvaWQpc2V0TWFya2VkVGV4dE1hdGNoZXNBcmVIaWdobGlnaHRlZDooQk9PTCluZXdWYWx1ZQpJ
bmRleDogVG9vbHMvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0NoYW5nZUxvZwkocmV2
aXNpb24gMTM5Njc1KQorKysgVG9vbHMvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMg
KzEsMTggQEAKKzIwMTMtMDEtMTQgIEVucmljYSBDYXN1Y2NpICA8ZW5yaWNhQGFwcGxlLmNvbT4K
KworICAgICAgICBBZGQgYSBuZXcgc2V0IG9mIFdlYktpdDIgQVBJcyBmb3IgdGV4dCBzZWFyY2gg
YW5kCisgICAgICAgIHNlYXJjaCByZXN1bHRzIG1hbmFnZW1lbnQuCisgICAgICAgIGh0dHBzOi8v
YnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMDY4MzQuCisgICAgICAgIDxyZGFyOi8v
cHJvYmxlbS8xMjU5NzE1OT4KKworICAgICAgICBBZGRlZCBuZXcgdGVzdCBmb3IgdGhlIG5ldyBX
ZWJLaXQyIEFQSSBmb3IKKyAgICAgICAgdGV4dCBzZWFyY2guCisgICAgICAgIAorICAgICAgICBS
ZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICAqIFRlc3RXZWJLaXRBUEkvVGVz
dFdlYktpdEFQSS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qOgorICAgICAgICAqIFRlc3RXZWJL
aXRBUEkvVGVzdHMvV2ViS2l0Mi9GaW5kTWF0Y2hlcy5tbTogQWRkZWQuCisKIDIwMTMtMDEtMTQg
IERvbWluaWMgTWF6em9uaSAgPGRtYXp6b25pQGdvb2dsZS5jb20+CiAKICAgICAgICAgQVg6IE5l
ZWQgdG8gaW1wbGVtZW50IENvbG9yV2VsbFJvbGUKSW5kZXg6IFRvb2xzL1Rlc3RXZWJLaXRBUEkv
VGVzdFdlYktpdEFQSS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRv
b2xzL1Rlc3RXZWJLaXRBUEkvVGVzdFdlYktpdEFQSS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9q
CShyZXZpc2lvbiAxMzk2MzUpCisrKyBUb29scy9UZXN0V2ViS2l0QVBJL1Rlc3RXZWJLaXRBUEku
eGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagkod29ya2luZyBjb3B5KQpAQCAtMTc3LDYgKzE3Nyw3
IEBACiAJCUMwQzVEM0JFMTQ1OThCNkYwMEE4MDJBNiAvKiBHZXRCYWNraW5nU2NhbGVGYWN0b3Iu
bW0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBDMEM1RDNC
QzE0NTk4QjZGMDBBODAyQTYgLyogR2V0QmFja2luZ1NjYWxlRmFjdG9yLm1tICovOyB9OwogCQlD
MEM1RDNDNjE0NTk5MTI5MDBBODAyQTYgLyogR2V0QmFja2luZ1NjYWxlRmFjdG9yX0J1bmRsZS5t
bSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEMwQzVEM0JE
MTQ1OThCNkYwMEE4MDJBNiAvKiBHZXRCYWNraW5nU2NhbGVGYWN0b3JfQnVuZGxlLm1tICovOyB9
OwogCQlDNTA3RThBNzE0QzY1NDVCMDA1RDZCM0IgLyogSW5zcGVjdG9yQmFyLm1tIGluIFNvdXJj
ZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQzUwN0U4QTYxNEM2NTQ1QjAw
NUQ2QjNCIC8qIEluc3BlY3RvckJhci5tbSAqLzsgfTsKKwkJQzUxQUZCOTkxNjlGNDlGRjAwOUND
RjY2IC8qIEZpbmRNYXRjaGVzLm1tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxl
OyBmaWxlUmVmID0gQzUxQUZCOTgxNjlGNDlGRjAwOUNDRjY2IC8qIEZpbmRNYXRjaGVzLm1tICov
OyB9OwogCQlDNTQwRjc3NjE1MkU0REEwMDBBNDBDOEMgLyogU2ltcGxpZnlNYXJrdXAubW0gaW4g
U291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBDNTQwRjc3NTE1MkU0
REEwMDBBNDBDOEMgLyogU2ltcGxpZnlNYXJrdXAubW0gKi87IH07CiAJCUM1NDBGNzg0MTUyRTVB
OUEwMEE0MEM4QyAvKiB2ZXJib3NlTWFya3VwLmh0bWwgaW4gQ29weSBSZXNvdXJjZXMgKi8gPSB7
aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQzU0MEY3ODMxNTJFNUE3ODAwQTQwQzhDIC8q
IHZlcmJvc2VNYXJrdXAuaHRtbCAqLzsgfTsKIAkJQ0Q1NDk3QjQxNTg1N0YwQzAwQjVCQzMwIC8q
IE1lZGlhVGltZS5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVS
ZWYgPSBDRDU0OTdCMzE1ODU3RjBDMDBCNUJDMzAgLyogTWVkaWFUaW1lLmNwcCAqLzsgfTsKQEAg
LTQ0NSw2ICs0NDYsNyBAQAogCQlDMEM1RDNCQzE0NTk4QjZGMDBBODAyQTYgLyogR2V0QmFja2lu
Z1NjYWxlRmFjdG9yLm1tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGlu
ZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAub2JqY3BwOyBwYXRoID0g
R2V0QmFja2luZ1NjYWxlRmFjdG9yLm1tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlD
MEM1RDNCRDE0NTk4QjZGMDBBODAyQTYgLyogR2V0QmFja2luZ1NjYWxlRmFjdG9yX0J1bmRsZS5t
bSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25v
d25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLm9iamNwcDsgcGF0aCA9IEdldEJhY2tpbmdTY2Fs
ZUZhY3Rvcl9CdW5kbGUubW07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUM1MDdFOEE2
MTRDNjU0NUIwMDVENkIzQiAvKiBJbnNwZWN0b3JCYXIubW0gKi8gPSB7aXNhID0gUEJYRmlsZVJl
ZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2Rl
LmNwcC5vYmpjcHA7IHBhdGggPSBJbnNwZWN0b3JCYXIubW07IHNvdXJjZVRyZWUgPSAiPGdyb3Vw
PiI7IH07CisJCUM1MUFGQjk4MTY5RjQ5RkYwMDlDQ0Y2NiAvKiBGaW5kTWF0Y2hlcy5tbSAqLyA9
IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxl
VHlwZSA9IHNvdXJjZWNvZGUuY3BwLm9iamNwcDsgcGF0aCA9IEZpbmRNYXRjaGVzLm1tOyBzb3Vy
Y2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlDNTQwRjc3NTE1MkU0REEwMDBBNDBDOEMgLyogU2lt
cGxpZnlNYXJrdXAubW0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5n
ID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5vYmpjcHA7IHBhdGggPSBT
aW1wbGlmeU1hcmt1cC5tbTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJQzU0MEY3ODMx
NTJFNUE3ODAwQTQwQzhDIC8qIHZlcmJvc2VNYXJrdXAuaHRtbCAqLyA9IHtpc2EgPSBQQlhGaWxl
UmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQuaHRt
bDsgcGF0aCA9IHZlcmJvc2VNYXJrdXAuaHRtbDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsK
IAkJQ0Q1NDk3QjMxNTg1N0YwQzAwQjVCQzMwIC8qIE1lZGlhVGltZS5jcHAgKi8gPSB7aXNhID0g
UEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBz
b3VyY2Vjb2RlLmNwcC5jcHA7IG5hbWUgPSBNZWRpYVRpbWUuY3BwOyBwYXRoID0gV1RGL01lZGlh
VGltZS5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CkBAIC02MTQsNiArNjE2LDcgQEAK
IAkJCQkxQTVGRUZEQzEyNzBFMkEzMDAwRTI5MjEgLyogRXZhbHVhdGVKYXZhU2NyaXB0LmNwcCAq
LywKIAkJCQlCQ0M4Qjk1QTEyNjExRjQ3MDBERTQ2QTQgLyogRmFpbGVkTG9hZC5jcHAgKi8sCiAJ
CQkJMUEwMkM4NEUxMjVENEE4NDAwRTNGNEJEIC8qIEZpbmQuY3BwICovLAorCQkJCUM1MUFGQjk4
MTY5RjQ5RkYwMDlDQ0Y2NiAvKiBGaW5kTWF0Y2hlcy5tbSAqLywKIAkJCQkxQURCRUZBRDEzMEM2
ODlDMDBENjFEMTkgLyogRm9yY2VSZXBhaW50LmNwcCAqLywKIAkJCQlCQ0JEMzcwRjEyNUFBMkVC
MDBEMkMyOUYgLyogRnJhbWVNSU1FVHlwZUhUTUwuY3BwICovLAogCQkJCUJDQkQzNzYwMTI1QUJD
RkUwMEQyQzI5RiAvKiBGcmFtZU1JTUVUeXBlUE5HLmNwcCAqLywKQEAgLTEwNTgsNiArMTA2MSw3
IEBACiAJCQkJQkM5MDk5NUUxMjU2N0JDMTAwMDgzNzU2IC8qIFdLU3RyaW5nLmNwcCBpbiBTb3Vy
Y2VzICovLAogCQkJCUJDOTA5OTk0MTI1NkFDRjEwMDA4Mzc1NiAvKiBXS1N0cmluZ0pTU3RyaW5n
LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTI2NUFGNTUwMTVEMUU0OEEwMEIwQ0I0QSAvKiBXVEZT
dHJpbmcuY3BwIGluIFNvdXJjZXMgKi8sCisJCQkJQzUxQUZCOTkxNjlGNDlGRjAwOUNDRjY2IC8q
IEZpbmRNYXRjaGVzLm1tIGluIFNvdXJjZXMgKi8sCiAJCQkpOwogCQkJcnVuT25seUZvckRlcGxv
eW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CiAJCX07CkluZGV4OiBUb29scy9UZXN0V2ViS2l0QVBJ
L1Rlc3RzL1dlYktpdDIvRmluZE1hdGNoZXMubW0KPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvVGVzdFdl
YktpdEFQSS9UZXN0cy9XZWJLaXQyL0ZpbmRNYXRjaGVzLm1tCShyZXZpc2lvbiAwKQorKysgVG9v
bHMvVGVzdFdlYktpdEFQSS9UZXN0cy9XZWJLaXQyL0ZpbmRNYXRjaGVzLm1tCShyZXZpc2lvbiAw
KQpAQCAtMCwwICsxLDE0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBBcHBsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAq
IGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICog
QU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVY
RU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNp
bmNsdWRlICJQbGF0Zm9ybVV0aWxpdGllcy5oIgorI2luY2x1ZGUgIlBsYXRmb3JtV2ViVmlldy5o
IgorI2ltcG9ydCA8V2ViS2l0L1dlYkRvY3VtZW50UHJpdmF0ZS5oPgorI2ltcG9ydCA8V2ViS2l0
L0RPTVByaXZhdGUuaD4KKyNpbmNsdWRlIDxXZWJLaXQyL1dLSW1hZ2UuaD4KKyNpbXBvcnQgPHd0
Zi9SZXRhaW5QdHIuaD4KKworQGludGVyZmFjZSBGaW5kTWF0Y2hlc1dLMUZyYW1lTG9hZERlbGVn
YXRlIDogTlNPYmplY3QgeworfQorQGVuZAorCitzdGF0aWMgYm9vbCBkaWRGaW5pc2hMb2FkV0sx
OworCitAaW1wbGVtZW50YXRpb24gRmluZE1hdGNoZXNXSzFGcmFtZUxvYWREZWxlZ2F0ZQorCist
ICh2b2lkKXdlYlZpZXc6KFdlYlZpZXcgKilzZW5kZXIgZGlkRmluaXNoTG9hZEZvckZyYW1lOihX
ZWJGcmFtZSAqKWZyYW1lCit7CisgICAgZGlkRmluaXNoTG9hZFdLMSA9IHRydWU7Cit9CisKK0Bl
bmQKKworbmFtZXNwYWNlIFRlc3RXZWJLaXRBUEkgeworCitzdGF0aWMgYm9vbCBkaWRGaW5pc2hM
b2FkID0gZmFsc2U7CitzdGF0aWMgYm9vbCBkaWRDYWxsRmluZFN0cmluZ01hdGNoZXMgPSBmYWxz
ZTsKK3N0YXRpYyBib29sIGRpZENhbGxHZXRJbWFnZSA9IGZhbHNlOworCitSZXRhaW5QdHI8V2Vi
Vmlldz4gd2Via2l0MVZpZXc7CisKK3N0YXRpYyB2b2lkIGRpZEZpbmlzaExvYWRGb3JGcmFtZShX
S1BhZ2VSZWYgcGFnZSwgV0tGcmFtZVJlZiBmcmFtZSwgV0tUeXBlUmVmIHVzZXJEYXRhLCBjb25z
dCB2b2lkKiBjbGllbnRJbmZvKQoreworICAgIGRpZEZpbmlzaExvYWQgPSB0cnVlOworfQorCitz
dGF0aWMgdm9pZCBkaWRGaW5kU3RyaW5nTWF0Y2hlcyhXS1BhZ2VSZWYgcGFnZSwgV0tTdHJpbmdS
ZWYgc3RyaW5nLCBXS0FycmF5UmVmIG1hdGNoZXMsIGludCBmaXJzdEluZGV4LCBjb25zdCB2b2lk
KiBjbGllbnRJbmZvKQoreworICAgIEVYUEVDVF9XS19TVFJFUSgiSGVsbG8iLCBzdHJpbmcpOwor
ICAgIHNpemVfdCBudW1NYXRjaGVzID0gV0tBcnJheUdldFNpemUobWF0Y2hlcyk7CisgICAgRVhQ
RUNUX0VRKDN1LCBudW1NYXRjaGVzKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVt
TWF0Y2hlczsgKytpKSB7CisgICAgICAgIFdLVHlwZVJlZiBpdGVtcyA9IFdLQXJyYXlHZXRJdGVt
QXRJbmRleChtYXRjaGVzLCBpKTsKKyAgICAgICAgV0tUeXBlSUQgdHlwZSA9IFdLR2V0VHlwZUlE
KGl0ZW1zKTsKKyAgICAgICAgRVhQRUNUX0VRKHR5cGUsIFdLQXJyYXlHZXRUeXBlSUQoKSk7Cisg
ICAgICAgIFdLQXJyYXlSZWYgcmVjdHMgPSByZWludGVycHJldF9jYXN0PFdLQXJyYXlSZWY+KGl0
ZW1zKTsKKyAgICAgICAgc2l6ZV90IG51bVJlY3RzID0gV0tBcnJheUdldFNpemUocmVjdHMpOwor
ICAgICAgICBFWFBFQ1RfRVEoMXUsIG51bVJlY3RzKTsKKyAgICAgICAgaXRlbXMgPSBXS0FycmF5
R2V0SXRlbUF0SW5kZXgocmVjdHMsIDApOworICAgICAgICB0eXBlID0gV0tHZXRUeXBlSUQoaXRl
bXMpOworICAgICAgICBFWFBFQ1RfRVEodHlwZSwgV0tSZWN0R2V0VHlwZUlEKCkpOworICAgICAg
ICBXS1JlY3QgcmVjdCA9IFdLUmVjdEdldFZhbHVlKHJlaW50ZXJwcmV0X2Nhc3Q8V0tSZWN0UmVm
PihpdGVtcykpOworICAgICAgICByZWN0ID0gcmVjdDsKKyAgICB9CisgICAgZGlkQ2FsbEZpbmRT
dHJpbmdNYXRjaGVzID0gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgZGlkR2V0SW1hZ2VGb3JNYXRj
aFJlc3VsdChXS1BhZ2VSZWYgcGFnZSwgV0tJbWFnZVJlZiBpbWFnZSwgdWludDMyX3QgaW5kZXgs
IGNvbnN0IHZvaWQqIGNsaWVudEluZm8pCit7CisgICAgV0tTaXplIHNpemUgPSBXS0ltYWdlR2V0
U2l6ZShpbWFnZSk7CisKKyAgICBET01Eb2N1bWVudCAqZG9jdW1lbnQgPSB3ZWJraXQxVmlldy5n
ZXQoKS5tYWluRnJhbWVEb2N1bWVudDsKKyAgICBET01SYW5nZSAqcmFuZ2UgPSBbZG9jdW1lbnQg
Y3JlYXRlUmFuZ2VdOworICAgIERPTU5vZGUgKnRhcmdldCA9IFtkb2N1bWVudCBnZXRFbGVtZW50
QnlJZDpAInRhcmdldCJdOworICAgIFtyYW5nZSBzZWxlY3ROb2RlOnRhcmdldF07CisgICAgTlNJ
bWFnZSAqZXhwZWN0ZWRJbWFnZSA9IFtyYW5nZSByZW5kZXJlZEltYWdlRm9yY2luZ0JsYWNrVGV4
dDpZRVNdOworICAgIE5TU2l6ZSBleHBlY3RlZFNpemUgPSBbZXhwZWN0ZWRJbWFnZSBzaXplXTsK
KyAgICBFWFBFQ1RfRVEoc2l6ZS53aWR0aCwgZXhwZWN0ZWRTaXplLndpZHRoKTsKKyAgICBFWFBF
Q1RfRVEoc2l6ZS5oZWlnaHQsIGV4cGVjdGVkU2l6ZS5oZWlnaHQpOworICAgIGRpZENhbGxHZXRJ
bWFnZSA9IHRydWU7Cit9CisKK1RFU1QoV2ViS2l0MiwgRmluZE1hdGNoZXMpCit7CisgICAgV0tS
ZXRhaW5QdHI8V0tDb250ZXh0UmVmPiBjb250ZXh0KEFkb3B0V0ssIFdLQ29udGV4dENyZWF0ZSgp
KTsKKyAgICBQbGF0Zm9ybVdlYlZpZXcgd2ViVmlldyhjb250ZXh0LmdldCgpKTsKKyAgICAKKyAg
ICBXS1BhZ2VMb2FkZXJDbGllbnQgbG9hZGVyQ2xpZW50OworICAgIG1lbXNldCgmbG9hZGVyQ2xp
ZW50LCAwLCBzaXplb2YobG9hZGVyQ2xpZW50KSk7CisgICAgCisgICAgbG9hZGVyQ2xpZW50LnZl
cnNpb24gPSAwOworICAgIGxvYWRlckNsaWVudC5kaWRGaW5pc2hMb2FkRm9yRnJhbWUgPSBkaWRG
aW5pc2hMb2FkRm9yRnJhbWU7CisgICAgV0tQYWdlU2V0UGFnZUxvYWRlckNsaWVudCh3ZWJWaWV3
LnBhZ2UoKSwgJmxvYWRlckNsaWVudCk7CisKKyAgICBXS1BhZ2VGaW5kTWF0Y2hlc0NsaWVudCBm
aW5kTWF0Y2hlc0NsaWVudDsKKyAgICBtZW1zZXQoJmZpbmRNYXRjaGVzQ2xpZW50LCAwLCBzaXpl
b2YoZmluZE1hdGNoZXNDbGllbnQpKTsKKworICAgIGZpbmRNYXRjaGVzQ2xpZW50LnZlcnNpb24g
PSAwOworICAgIGZpbmRNYXRjaGVzQ2xpZW50LmRpZEZpbmRTdHJpbmdNYXRjaGVzID0gZGlkRmlu
ZFN0cmluZ01hdGNoZXM7CisgICAgZmluZE1hdGNoZXNDbGllbnQuZGlkR2V0SW1hZ2VGb3JNYXRj
aFJlc3VsdCA9IGRpZEdldEltYWdlRm9yTWF0Y2hSZXN1bHQ7CisKKyAgICBXS1BhZ2VTZXRQYWdl
RmluZE1hdGNoZXNDbGllbnQod2ViVmlldy5wYWdlKCksICZmaW5kTWF0Y2hlc0NsaWVudCk7CisK
KyAgICBXS1JldGFpblB0cjxXS1VSTFJlZj4gdXJsKEFkb3B0V0ssIFV0aWw6OmNyZWF0ZVVSTEZv
clJlc291cmNlKCJmaW5kIiwgImh0bWwiKSk7CisgICAgV0tQYWdlTG9hZFVSTCh3ZWJWaWV3LnBh
Z2UoKSwgdXJsLmdldCgpKTsKKworICAgIFV0aWw6OnJ1bigmZGlkRmluaXNoTG9hZCk7CisKKyAg
ICBXS1JldGFpblB0cjxXS1N0cmluZ1JlZj4gZmluZFN0cmluZyhBZG9wdFdLLCBXS1N0cmluZ0Ny
ZWF0ZVdpdGhVVEY4Q1N0cmluZygiSGVsbG8iKSk7CisgCisgICAgV0tQYWdlRmluZFN0cmluZ01h
dGNoZXMod2ViVmlldy5wYWdlKCksIGZpbmRTdHJpbmcuZ2V0KCksIHRydWUsIDEwMCk7CisgICAg
VXRpbDo6cnVuKCZkaWRDYWxsRmluZFN0cmluZ01hdGNoZXMpOworCisgICAgd2Via2l0MVZpZXcu
YWRvcHROUyhbW1dlYlZpZXcgYWxsb2NdIGluaXRXaXRoRnJhbWU6TlNNYWtlUmVjdCgwLCAwLCAx
MjAsIDIwMCkgZnJhbWVOYW1lOm5pbCBncm91cE5hbWU6bmlsXSk7CisgICAgUmV0YWluUHRyPEZp
bmRNYXRjaGVzV0sxRnJhbWVMb2FkRGVsZWdhdGU+IGZyYW1lTG9hZERlbGVnYXRlKEFkb3B0TlMs
IFtGaW5kTWF0Y2hlc1dLMUZyYW1lTG9hZERlbGVnYXRlIG5ld10pOworCisgICAgd2Via2l0MVZp
ZXcuZ2V0KCkuZnJhbWVMb2FkRGVsZWdhdGUgPSBmcmFtZUxvYWREZWxlZ2F0ZS5nZXQoKTsKKyAg
ICBbd2Via2l0MVZpZXcuZ2V0KCkubWFpbkZyYW1lIGxvYWRIVE1MU3RyaW5nOkAiVGVzdCBzZWFy
Y2guIEhlbGxvIDxzcGFuIGlkPVwidGFyZ2V0XCI+SGVsbG88L3NwYW4+IEhlbGxvISIgYmFzZVVS
TDpbTlNVUkwgVVJMV2l0aFN0cmluZzpAImFib3V0OmJsYW5rIl1dOworCisgICAgVXRpbDo6cnVu
KCZkaWRGaW5pc2hMb2FkV0sxKTsKKworICAgIFdLUGFnZUdldEltYWdlRm9yRmluZE1hdGNoKHdl
YlZpZXcucGFnZSgpLCAwKTsKKyAgICBVdGlsOjpydW4oJmRpZENhbGxHZXRJbWFnZSk7CisKKyAg
ICBXS1BhZ2VIaWRlRmluZFVJKHdlYlZpZXcucGFnZSgpKTsKK30KKworfSAvLyBuYW1lc3BhY2Ug
VGVzdFdlYktpdEFQSQo=
</data>
<flag name="review"
          id="200964"
          type_id="1"
          status="+"
          setter="simon.fraser"
    />
    <flag name="commit-queue"
          id="201000"
          type_id="3"
          status="-"
          setter="eflews.bot"
    />
          </attachment>
      

    </bug>

</bugzilla>