<?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>73533</bug_id>
          
          <creation_ts>2011-11-30 23:58:29 -0800</creation_ts>
          <short_desc>Upstream the multipart feature in blackberry port</short_desc>
          <delta_ts>2011-12-21 18:50:42 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Platform</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>73144</blocked>
          <everconfirmed>0</everconfirmed>
          <reporter name="Chris.Guan">logingx</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>charles.wei</cc>
    
    <cc>dbates</cc>
    
    <cc>eric</cc>
    
    <cc>eroman</cc>
    
    <cc>fishd</cc>
    
    <cc>leo.yang</cc>
    
    <cc>rwlbuis</cc>
    
    <cc>staikos</cc>
    
    <cc>tonikitoo</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>512548</commentid>
    <comment_count>0</comment_count>
    <who name="Chris.Guan">logingx</who>
    <bug_when>2011-11-30 23:58:29 -0800</bug_when>
    <thetext>this is to upstream the Blackberry implement of Multipart delegate</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>512581</commentid>
    <comment_count>1</comment_count>
      <attachid>117369</attachid>
    <who name="Chris.Guan">logingx</who>
    <bug_when>2011-12-01 00:34:34 -0800</bug_when>
    <thetext>Created attachment 117369
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>512611</commentid>
    <comment_count>2</comment_count>
      <attachid>117369</attachid>
    <who name="Leo Yang">leo.yang</who>
    <bug_when>2011-12-01 01:22:47 -0800</bug_when>
    <thetext>Comment on attachment 117369
Patch

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

This is an informal review.

&gt; Source/WebCore/ChangeLog:8
&gt; +
&gt; +        No new tests. (OOPS!)

Please explain why no new tests.

&gt; Source/WebCore/platform/network/blackberry/MultipartResponseDelegate.cpp:57
&gt; +static TRIMPOSITIONS trimStringT(const std::string&amp; input,
&gt; +                                 const std::string::value_type trimChars[],
&gt; +                                 TRIMPOSITIONS positions,
&gt; +                                 std::string&amp; output)

Why name it trimStringT? Why T?

&gt; Source/WebCore/platform/network/blackberry/MultipartResponseDelegate.cpp:111
&gt; +static std::string getSpecificHeader(const std::string&amp; headers, const std::string&amp; name)
&gt; +{
&gt; +    // We want to grab the Value from the &quot;Key: Value&quot; pairs in the headers,
&gt; +    // which should look like this (no leading spaces, \n-separated) (we format
&gt; +    // them this way in url_request_inet.cc):
&gt; +    //    HTTP/1.1 200 OK\n
&gt; +    //    ETag: &quot;6d0b8-947-24f35ec0&quot;\n
&gt; +    //    Content-Length: 2375\n
&gt; +    //    Content-Type: text/html; charset=UTF-8\n
&gt; +    //    Last-Modified: Sun, 03 Sep 2006 04:34:43 GMT\n
&gt; +    if (headers.empty())
&gt; +        return std::string();
&gt; +
&gt; +    std::string match(&apos;\n&apos; + name + &apos;:&apos;);

So you aren&apos;t handling &apos;name : value&apos; case (one or more white space after name)? Should we support this?

&gt; Source/WebCore/platform/network/blackberry/MultipartResponseDelegate.cpp:138
&gt; +static size_t findStringEnd(const std::string&amp; line, size_t start, char delim)
&gt; +{

Minor: delim --&gt; delimiter.

&gt; Source/WebCore/platform/network/blackberry/MultipartResponseDelegate.cpp:139
&gt; +    const char set[] = { delim, &apos;\\&apos;, &apos;\0&apos; };

Ditto.

&gt; Source/WebCore/platform/network/blackberry/MultipartResponseDelegate.cpp:161
&gt; +    // NOTREACHED();

Add ASSERT_NOT_REACHED()?

&gt; Source/WebCore/platform/network/blackberry/MultipartResponseDelegate.cpp:170
&gt; +        const char delimStr[] = { delimiter, &apos;&quot;&apos;, &apos;\&apos;&apos;, &apos;\0&apos; };

delimStr --&gt; delimiterSet.

&gt; Source/WebCore/platform/network/blackberry/MultipartResponseDelegate.cpp:172
&gt; +        if (curDelimPos == std::string::npos)

curDelimPos --&gt; currentDelimiterPosition.

&gt; Source/WebCore/platform/network/blackberry/MultipartResponseDelegate.cpp:200
&gt; +static void parseContentType(const std::string&amp; contentTypeStr,
&gt; +                             std::string&amp; mimeType, std::string&amp; charset,
&gt; +                             bool&amp; hadCharset)

contentTypeStr --&gt; contentType.

&gt; Source/WebCore/platform/network/blackberry/MultipartResponseDelegate.cpp:211
&gt; +    size_t charsetVal = 0;

charsetVal --&gt; charsetValue.

&gt; Source/WebCore/platform/network/blackberry/MultipartResponseDelegate.cpp:216
&gt; +    size_t paramStart = contentTypeStr.find_first_of(&apos;;&apos;, typeEnd);

paramStart --&gt; parameterStart.

&gt; Source/WebCore/platform/network/blackberry/MultipartResponseDelegate.cpp:221
&gt; +            size_t curParamEnd = findDelimiter(contentTypeStr, curParamStart, &apos;;&apos;);

curParamEnd --&gt; currentParameterEnd.

&gt; Source/WebCore/platform/network/blackberry/MultipartResponseDelegate.cpp:223
&gt; +            size_t paramNameStart = contentTypeStr.find_first_not_of(&quot; \t&quot;, curParamStart);

paramNameStart --&gt; parameterNameStart

&gt; Source/WebCore/platform/network/blackberry/MultipartResponseDelegate.cpp:226
&gt; +            static const char charsetStr[] = &quot;charset=&quot;;

charsetStr --&gt; charsetString.

&gt; Source/WebCore/platform/network/blackberry/MultipartResponseDelegate.cpp:252
&gt; +        } else {
&gt; +            charsetEnd = std::min(contentTypeStr.find_first_of(&quot; \t&quot; &quot;;(&quot;, charsetVal),
&gt; +                                   charsetEnd);
&gt; +        }

Wrap the std::min call to one line and remove curve brackets?

&gt; Source/WebCore/platform/network/blackberry/MultipartResponseDelegate.cpp:255
&gt; +    // if the server sent &quot;*/*&quot;, it is meaningless, so do not store it.

if --&gt; If

&gt; Source/WebCore/platform/network/blackberry/MultipartResponseDelegate.cpp:269
&gt; +        bool eq = !mimeType.empty()
&gt; +                  &amp;&amp; lowerCaseEqualsASCII(contentTypeStr.begin() + typeVal,
&gt; +                                          contentTypeStr.begin() + typeEnd,
&gt; +                                          mimeType.data());

eq --&gt; equation.

&gt; Source/WebCore/platform/network/blackberry/MultipartResponseDelegate.cpp:272
&gt; +            mimeType.assign(contentTypeStr.begin() + typeVal,
&gt; +                              contentTypeStr.begin() + typeEnd);

Wrap to one line or fix indent issue.

&gt; Source/WebCore/platform/network/blackberry/MultipartResponseDelegate.cpp:278
&gt; +            charset.assign(contentTypeStr.begin() + charsetVal,
&gt; +                            contentTypeStr.begin() + charsetEnd);

Ditto.

&gt; Source/WebCore/platform/network/blackberry/MultipartResponseDelegate.cpp:287
&gt; +static int pushOverLine(const std::string&amp; data, size_t pos)
&gt; +{

pos --&gt; position.

&gt; Source/WebCore/platform/network/blackberry/MultipartResponseDelegate.cpp:338
&gt; +void MultipartResponseDelegate::onReceivedData(const char* data,
&gt; +                                               int datalen,
&gt; +                                               int encodedDataLength)
&gt; +{

datalen --&gt; length.

&gt; Source/WebCore/platform/network/blackberry/MultipartResponseDelegate.cpp:371
&gt; +        int pos = pushOverLine(m_data, 0);

pos --&gt; position.

&gt; Source/WebCore/platform/network/blackberry/MultipartResponseDelegate.cpp:384
&gt; +    size_t boundaryPos;

boundaryPos --&gt; boundaryPosition.

&gt; Source/WebCore/platform/network/blackberry/MultipartResponseDelegate.cpp:389
&gt; +            int datalength = boundaryPos;

datalength --&gt; dataLength.

&gt; Source/WebCore/platform/network/blackberry/MultipartResponseDelegate.cpp:404
&gt; +        size_t boundaryEndPos = boundaryPos + m_boundary.length();

boundaryEndPos --&gt; boundaryEndPosition.

&gt; Source/WebCore/platform/network/blackberry/MultipartResponseDelegate.cpp:459
&gt; +    size_t lineStartPos = 0;

lineStartPos --&gt; lineStartPosition.

&gt; Source/WebCore/platform/network/blackberry/MultipartResponseDelegate.cpp:460
&gt; +    size_t lineEndPos = m_data.find(&apos;\n&apos;);

lineEndPos --&gt; lineEndPosition.

&gt; Source/WebCore/platform/network/blackberry/MultipartResponseDelegate.cpp:505
&gt; +        bool isNeedAdd = true;

isNeedAdd --&gt; needsAdd.

&gt; Source/WebCore/platform/network/blackberry/MultipartResponseDelegate.cpp:521
&gt; +            response.setHTTPHeaderField(WTF::String::fromUTF8(name.data()),
&gt; +                                        WTF::String::fromUTF8(value.data()));

WTF::String --&gt; String.

&gt; Source/WebCore/platform/network/blackberry/MultipartResponseDelegate.cpp:538
&gt; +    size_t boundaryPos = m_data.find(m_boundary);

boundaryPos --&gt; boundaryPosition.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>513604</commentid>
    <comment_count>3</comment_count>
      <attachid>117589</attachid>
    <who name="Chris.Guan">logingx</who>
    <bug_when>2011-12-02 01:10:14 -0800</bug_when>
    <thetext>Created attachment 117589
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>514582</commentid>
    <comment_count>4</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2011-12-03 14:19:41 -0800</bug_when>
    <thetext>Why is this needed in WebCore?  Isn&apos;t this provided by the network layer?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>514834</commentid>
    <comment_count>5</comment_count>
    <who name="Chris.Guan">logingx</who>
    <bug_when>2011-12-04 19:12:01 -0800</bug_when>
    <thetext>(In reply to comment #4)
&gt; Why is this needed in WebCore?  Isn&apos;t this provided by the network layer?

NetworkJob on Blackberry port in NetWorkManager of WebCore used it. BlackBerry dose not define the public Apis for NetworkJob handled sendResponseIfNeeded().  so It makes sense to keep it in WebCore. NetworkJob is upstreaming soon.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>516614</commentid>
    <comment_count>6</comment_count>
      <attachid>117589</attachid>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2011-12-07 06:47:54 -0800</bug_when>
    <thetext>Comment on attachment 117589
Patch

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

&gt; Source/WebCore/platform/network/blackberry/MultipartResponseDelegate.cpp:128
&gt; +                                 const char* b)

b does not seem very descriptive here.

&gt; Source/WebCore/platform/network/blackberry/MultipartResponseDelegate.h:95
&gt; +    // true until we get our first on received data call

&quot;Make comments look like sentences by starting with a capital letter and ending with a period (punctation).&quot;

&gt; Source/WebCore/platform/network/blackberry/MultipartResponseDelegate.h:102
&gt; +    // true if we&apos;re truncated in the middle of a header

Ditto.

&gt; Source/WebCore/platform/network/blackberry/MultipartResponseDelegate.h:108
&gt; +    // processing AddData requests.

Ditto.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>517131</commentid>
    <comment_count>7</comment_count>
      <attachid>118314</attachid>
    <who name="Chris.Guan">logingx</who>
    <bug_when>2011-12-07 19:56:45 -0800</bug_when>
    <thetext>Created attachment 118314
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>517136</commentid>
    <comment_count>8</comment_count>
      <attachid>118318</attachid>
    <who name="Chris.Guan">logingx</who>
    <bug_when>2011-12-07 20:05:29 -0800</bug_when>
    <thetext>Created attachment 118318
patch 

fix Rob&apos;s comments</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>517195</commentid>
    <comment_count>9</comment_count>
      <attachid>118318</attachid>
    <who name="Leo Yang">leo.yang</who>
    <bug_when>2011-12-07 22:49:46 -0800</bug_when>
    <thetext>Comment on attachment 118318
patch 

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

Informal review.

&gt; Source/WebCore/platform/network/blackberry/MultipartResponseDelegate.cpp:219
&gt; +        size_t curParamStart = parameterStart + 1;

curParamStart --&gt; currentParamterStart
And the corresponding usages should be updated.

&gt; Source/WebCore/platform/network/blackberry/MultipartResponseDelegate.cpp:351
&gt; +        // Eat leading \r\n

You are missing a &apos;.&apos; at the end.

&gt; Source/WebCore/platform/network/blackberry/MultipartResponseDelegate.cpp:354
&gt; +        int pos = pushOverLine(m_data, 0);
&gt; +        if (pos)
&gt; +            m_data = m_data.substr(pos);

pos --&gt; position

&gt; Source/WebCore/platform/network/blackberry/MultipartResponseDelegate.cpp:372
&gt; +        int pos = pushOverLine(m_data, 0);
&gt; +        if (pos)
&gt; +            m_data = m_data.substr(pos);

pos --&gt; position.

&gt; Source/WebCore/platform/network/blackberry/MultipartResponseDelegate.cpp:415
&gt; +        // Ok, back to parsing headers

You are missing a &apos;.&apos; at the end.

&gt; Source/WebCore/platform/network/blackberry/MultipartResponseDelegate.cpp:469
&gt; +            // A blank line, end of headers

You are missing a &apos;.&apos; at the end.

&gt; Source/WebCore/platform/network/blackberry/MultipartResponseDelegate.cpp:481
&gt; +    // Eat headers

Ditto.

&gt; Source/WebCore/platform/network/blackberry/MultipartResponseDelegate.h:76
&gt; +    // Checks to see if data[pos] character is a line break; handles crlf, lflf,
&gt; +    // lf, or cr. Returns the number of characters to skip over (0, 1 or 2).
&gt; +

What&apos;s this for?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>517270</commentid>
    <comment_count>10</comment_count>
      <attachid>118353</attachid>
    <who name="Chris.Guan">logingx</who>
    <bug_when>2011-12-08 02:14:15 -0800</bug_when>
    <thetext>Created attachment 118353
patch 

fix Leo&apos;s comments</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>517725</commentid>
    <comment_count>11</comment_count>
      <attachid>118353</attachid>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2011-12-08 13:18:56 -0800</bug_when>
    <thetext>Comment on attachment 118353
patch 

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

I wonder if we could convert std::string to WTF::String and then utilize WTF::String for more of the string manipulation code instead of rolling our own around std::string.

&gt; Source/WebCore/platform/network/blackberry/MultipartResponseDelegate.cpp:2
&gt; +

Nit: Remove this empty line. It doesn&apos;t help improve the readability of the license information in this file.

&gt; Source/WebCore/platform/network/blackberry/MultipartResponseDelegate.cpp:23
&gt; +// That gcc wants both of these prototypes seems mysterious. VC, for
&gt; +// its part, can&apos;t decide which to use (another mystery). Matching of
&gt; +// template overloads: the final frontier.
&gt; +#ifndef _MSC_VER
&gt; +template &lt;typename T, size_t N&gt;
&gt; +char (&amp;ArraySizeHelper(const T (&amp;array)[N]))[N];
&gt; +#endif
&gt; +
&gt; +#define arraysize(array) (sizeof(ArraySizeHelper(array)))

This code is a similar to the code for WTF_ARRAY_LENGTH() in JavaScriptCore/wtf/StdLibExtras.h: &lt;http://trac.webkit.org/browser/trunk/Source/JavaScriptCore/wtf/StdLibExtras.h?rev=97675#L142&gt;. We should #include &lt;wtf/StdLibExtras.h&gt; and use WTF_ARRAY_LENGTH() instead of duplicating its functionality in this file.

&gt; Source/WebCore/platform/network/blackberry/MultipartResponseDelegate.cpp:52
&gt; +enum TRIMPOSITIONS {
&gt; +    TRIM_NONE     = 0,
&gt; +    TRIM_LEADING  = 1 &lt;&lt; 0,
&gt; +    TRIM_TRAILING = 1 &lt;&lt; 1,
&gt; +    TRIM_ALL      = TRIM_LEADING | TRIM_TRAILING,
&gt; +};

The enum name and its values don&apos;t conform to the naming conventions described in the WebKit Code Style Guidelines.

Also, I suggest making the name of this enum singular (i.e. TrimPosition) to improve the readability of the code when used.

On another note, we seem to be using variables of type TRIMPOSITIONS as a bitmask instead of as a enum since we bitwise-OR enum values both on line 51 and 83. Instead, I suggest we define an anonymous enum with values TrimNone, TrimLeading, and TrimTrailing. Then add &quot;typedef unsigned TrimPosition;&quot; and define a &quot;const unsigned TrimLeadingAndTrailing = TrimLeading | TrimTrailing;&quot;. By taking this approach we don&apos;t get into a position where a variable has a static type of an enum but its value is a bitwise-OR of enum values (i.e. doesn&apos;t correspond to a single enum value) should there not exist an enum value with such a composition.

&gt; Source/WebCore/platform/network/blackberry/MultipartResponseDelegate.cpp:57
&gt; +static TRIMPOSITIONS trimString(const std::string&amp; input,
&gt; +                                 const std::string::value_type trimChars[],
&gt; +                                 TRIMPOSITIONS positions,
&gt; +                                 std::string&amp; output)

The indentation of lines 55 through 57 appears to be off by a space. That being said, we usually write function signatures on one line.

&gt; Source/WebCore/platform/network/blackberry/MultipartResponseDelegate.cpp:59
&gt; +    // Find the edges of leading/trailing whitespace as desired.

This comment is incorrect. Depending on the characters we are trimming (i.e. contents of trimChars) we may or may not be trimming white space characters. Moreover, this comment doesn&apos;t add much value even it were correct. Hence, I suggest removing this comment.

&gt; Source/WebCore/platform/network/blackberry/MultipartResponseDelegate.cpp:64
&gt; +    const std::string::size_type lastChar = input.length() - 1;
&gt; +    const std::string::size_type firstGoodChar = (positions &amp; TRIM_LEADING) ?
&gt; +              input.find_first_not_of(trimChars) : 0;
&gt; +    const std::string::size_type lastGoodChar = (positions &amp; TRIM_TRAILING) ?
&gt; +              input.find_last_not_of(trimChars) : lastChar;

Nit: Instead of repeating std::string::size_type, I suggest adding the declaration &quot;using std::string::size_type&quot; in the body of this function. Then you can reference this type as size_type.

The parentheses on line 61 and 63 aren&apos;t necessary because the bitwise AND (&amp;) operator has a higher precedence than the ternary operator (?:). Also, I would write lines 61-62 on one line instead of breaking it over two lines. Similarly, I would do the same for lines 63-64.

&gt; Source/WebCore/platform/network/blackberry/MultipartResponseDelegate.cpp:68
&gt; +    // When the string was all whitespace, report that we stripped off whitespace
&gt; +    // from whichever position the caller was interested in. For empty input, we
&gt; +    // stripped no whitespace, but we still need to clear |output|.

This comment doesn&apos;t explain anything that couldn&apos;t otherwise be understood from reading the code below. Therefore, I suggest we remove this comment.

&gt; Source/WebCore/platform/network/blackberry/MultipartResponseDelegate.cpp:71
&gt; +        || (firstGoodChar == std::string::npos)
&gt; +        || (lastGoodChar == std::string::npos)) {

Nit: The inner parentheses are not necessary since the == operator has higher precedence than the || operator. Also, I would write this on one line instead of breaking the if-statement condition over three lines.

&gt; Source/WebCore/platform/network/blackberry/MultipartResponseDelegate.cpp:77
&gt; +    // Trim the whitespace.

Please remove this comment as it&apos;s inane.

&gt; Source/WebCore/platform/network/blackberry/MultipartResponseDelegate.cpp:80
&gt; +    // Return where we trimmed from.

Remove this comment since it&apos;s inane.

&gt; Source/WebCore/platform/network/blackberry/MultipartResponseDelegate.cpp:96
&gt; +static const char WhitespaceASCII[] = {
&gt; +    // &lt;control-0009&gt; to &lt;control-000D&gt;
&gt; +    0x09,
&gt; +    0x0A,
&gt; +    0x0B,
&gt; +    0x0C,
&gt; +    0x0D,
&gt; +    // Space
&gt; +    0x20,
&gt; +    0
&gt; +};

This variable is only used in getSpecificHeader() below. Hence, I suggest moving this definition into that function.
Moreover, I would write it as const C-String instead of a mutable array of characters because we aren&apos;t changing this list of characters at run-time and by declaring this as a C-String we can omit the trailing null character (which isn&apos;t a character we actually want to trim but is present as artifact of our usage of std::string::{find_first_not_of, find_last_not_of}(). In getSpecificHeader(), I would write:

static const char* WhitespaceASCII = &quot;\t\n\v\f\r &quot;;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>518160</commentid>
    <comment_count>12</comment_count>
      <attachid>118543</attachid>
    <who name="Chris.Guan">logingx</who>
    <bug_when>2011-12-09 00:37:32 -0800</bug_when>
    <thetext>Created attachment 118543
patch 

fix Daniel&apos;s nice comments.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>518768</commentid>
    <comment_count>13</comment_count>
      <attachid>118543</attachid>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2011-12-10 01:16:20 -0800</bug_when>
    <thetext>Comment on attachment 118543
patch 

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

Hm, I&apos;m stopping my initial review with a question: Do we have the time to refactor this right now to avoid std::string. I don&apos;t want to delay the initial upstreaming, hence I&apos;m asking. If we agree to clean it up later, no problem with me, but maybe with others :-)

&gt; Source/WebCore/ChangeLog:9
&gt; +        Test cases:
&gt; +        http://avhs.axis.com

This needs a more detailed ChangeLog, at least one or two descriptive lines. Also listing this testcase doesn&apos;t help a lot.

&gt; Source/WebCore/platform/network/blackberry/MultipartResponseDelegate.cpp:4
&gt; +// Copyright (C) 2011 Research In Motion Limited. All rights reserved.
&gt; +// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
&gt; +// Use of this source code is governed by a BSD-style license that can be
&gt; +// found in the LICENSE file.

We normally include licenses inline - why is it different here? Can you change it?

&gt; Source/WebCore/platform/network/blackberry/MultipartResponseDelegate.cpp:15
&gt; +static bool compareChar(char x, char y)

For example: s/compareChar/doCharactersMatchCaseInsensitive/. Anything descriptive should be used, compareChar is mystic, what does it do if you read this name on a call-site? :-)

&gt; Source/WebCore/platform/network/blackberry/MultipartResponseDelegate.cpp:24
&gt; +static void stringToLowerASCII(std::string&amp; s)
&gt; +{
&gt; +    for (std::string::iterator i = s.begin(); i != s.end(); ++i)
&gt; +        *i = toASCIILower(*i);
&gt; +}

This looks very slow.
IMHO the whole code should move away from std::string. I&apos;d highly recommend to convert this to WTF::String natively.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>518958</commentid>
    <comment_count>14</comment_count>
    <who name="Chris.Guan">logingx</who>
    <bug_when>2011-12-11 18:06:01 -0800</bug_when>
    <thetext>(In reply to comment #13)
&gt; (From update of attachment 118543 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=118543&amp;action=review
&gt; 
&gt; Hm, I&apos;m stopping my initial review with a question: Do we have the time to refactor this right now to avoid std::string. I don&apos;t want to delay the initial upstreaming, hence I&apos;m asking. If we agree to clean it up later, no problem with me, but maybe with others :-)
I sent you an email to explain it. I think we can keep std::string in initial upstream and refactor later.:)
&gt; 
&gt; &gt; Source/WebCore/ChangeLog:9
&gt; &gt; +        Test cases:
&gt; &gt; +        http://avhs.axis.com
&gt; 
&gt; This needs a more detailed ChangeLog, at least one or two descriptive lines. Also listing this testcase doesn&apos;t help a lot.
yes, it needs a username and password, I am not sure that I can mark them in it. So I may remove this test cases in initial upstream. agree? 

&gt; 
&gt; &gt; Source/WebCore/platform/network/blackberry/MultipartResponseDelegate.cpp:4
&gt; &gt; +// Copyright (C) 2011 Research In Motion Limited. All rights reserved.
&gt; &gt; +// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
&gt; &gt; +// Use of this source code is governed by a BSD-style license that can be
&gt; &gt; +// found in the LICENSE file.
&gt; 
&gt; We normally include licenses inline - why is it different here? Can you change it?
my multipart code referred to Google chromium&apos;s code, so I kept the license. please instruct me how to change it? 
&gt; 
&gt; &gt; Source/WebCore/platform/network/blackberry/MultipartResponseDelegate.cpp:15
&gt; &gt; +static bool compareChar(char x, char y)
&gt; 
&gt; For example: s/compareChar/doCharactersMatchCaseInsensitive/. Anything descriptive should be used, compareChar is mystic, what does it do if you read this name on a call-site? :-)
yes, agree, thanks.
&gt; 
&gt; &gt; Source/WebCore/platform/network/blackberry/MultipartResponseDelegate.cpp:24
&gt; &gt; +static void stringToLowerASCII(std::string&amp; s)
&gt; &gt; +{
&gt; &gt; +    for (std::string::iterator i = s.begin(); i != s.end(); ++i)
&gt; &gt; +        *i = toASCIILower(*i);
&gt; &gt; +}
&gt; 
&gt; This looks very slow.
&gt; IMHO the whole code should move away from std::string. I&apos;d highly recommend to convert this to WTF::String natively.
Yes, refactor later.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>519777</commentid>
    <comment_count>15</comment_count>
      <attachid>118932</attachid>
    <who name="Chris.Guan">logingx</who>
    <bug_when>2011-12-12 18:56:35 -0800</bug_when>
    <thetext>Created attachment 118932
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>524404</commentid>
    <comment_count>16</comment_count>
      <attachid>119979</attachid>
    <who name="Chris.Guan">logingx</who>
    <bug_when>2011-12-19 20:32:03 -0800</bug_when>
    <thetext>Created attachment 119979
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>524768</commentid>
    <comment_count>17</comment_count>
      <attachid>119979</attachid>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2011-12-20 12:58:18 -0800</bug_when>
    <thetext>Comment on attachment 119979
Patch

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

Looks good, some variable names need to be fixed though.

&gt; Source/WebCore/platform/network/blackberry/NetworkJob.cpp:341
&gt; +            bool needsAdd = true;

Can you come up with a clearer name?

&gt; Source/WebCore/platform/network/blackberry/NetworkJob.cpp:342
&gt; +            int replaceHedearIndex = 0;

I think replaceHeaderIndex is meant here.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>525021</commentid>
    <comment_count>18</comment_count>
      <attachid>120128</attachid>
    <who name="Chris.Guan">logingx</who>
    <bug_when>2011-12-20 17:53:49 -0800</bug_when>
    <thetext>Created attachment 120128
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>525898</commentid>
    <comment_count>19</comment_count>
      <attachid>120128</attachid>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2011-12-21 18:09:39 -0800</bug_when>
    <thetext>Comment on attachment 120128
Patch

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

Looks great, just fix the one nit before landing :)

&gt; Source/WebCore/platform/network/blackberry/NetworkJob.cpp:345
&gt; +                    needsCopyfromOriginalResponse= false;

needsCopyfromOriginalResponse = false;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>525911</commentid>
    <comment_count>20</comment_count>
      <attachid>120128</attachid>
    <who name="Leo Yang">leo.yang</who>
    <bug_when>2011-12-21 18:22:20 -0800</bug_when>
    <thetext>Comment on attachment 120128
Patch

I&apos;ll help fix the last comment and land it manually.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>525924</commentid>
    <comment_count>21</comment_count>
    <who name="Leo Yang">leo.yang</who>
    <bug_when>2011-12-21 18:50:42 -0800</bug_when>
    <thetext>Committed r103487: &lt;http://trac.webkit.org/changeset/103487&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>117369</attachid>
            <date>2011-12-01 00:34:34 -0800</date>
            <delta_ts>2011-12-02 01:10:04 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-73533-20111201163431.patch</filename>
            <type>text/plain</type>
            <size>28104</size>
            <attacher name="Chris.Guan">logingx</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTAxNTk1CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggNGQxNzVmNzc2Y2E3NWMx
ZTQzNzY5NTVjZDNjOGE5ZmQ4NjU2ZGU2Ny4uMzk5YzVhMDA5ZDVlMDExOTYzNzZkOWM3NmRhZTYz
ODc3YWI4NTdjNCAxMDA3NTUKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDMwIEBACisyMDExLTEyLTAxICBDaHJp
cyBHdWFuICA8Y2hyaXMuZ3VhbkB0b3JjaG1vYmlsZS5jb20uY24+CisKKyAgICAgICAgVXBzdHJl
YW0gdGhlIEJsYWNrQmVycnkgcG9ydGluZyBvZiBtdWx0aXBhcnQgZGVsZWdhdGUKKyAgICAgICAg
aHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTczNTMzCisKKyAgICAgICAg
UmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgTm8gbmV3IHRlc3RzLiAoT09Q
UyEpCisKKyAgICAgICAgKiBwbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvTXVsdGlwYXJ0UmVz
cG9uc2VEZWxlZ2F0ZS5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6Y29tcGFyZUNoYXIp
OgorICAgICAgICAoV2ViQ29yZTo6c3RyaW5nVG9Mb3dlckFTQ0lJKToKKyAgICAgICAgKFdlYkNv
cmU6OnRyaW1TdHJpbmdUKToKKyAgICAgICAgKFdlYkNvcmU6OmdldFNwZWNpZmljSGVhZGVyKToK
KyAgICAgICAgKFdlYkNvcmU6Omxvd2VyQ2FzZUVxdWFsc0FTQ0lJKToKKyAgICAgICAgKFdlYkNv
cmU6OmZpbmRTdHJpbmdFbmQpOgorICAgICAgICAoV2ViQ29yZTo6ZmluZERlbGltaXRlcik6Cisg
ICAgICAgIChXZWJDb3JlOjpwYXJzZUNvbnRlbnRUeXBlKToKKyAgICAgICAgKFdlYkNvcmU6OnB1
c2hPdmVyTGluZSk6CisgICAgICAgIChXZWJDb3JlOjpNdWx0aXBhcnRSZXNwb25zZURlbGVnYXRl
OjpNdWx0aXBhcnRSZXNwb25zZURlbGVnYXRlKToKKyAgICAgICAgKFdlYkNvcmU6Ok11bHRpcGFy
dFJlc3BvbnNlRGVsZWdhdGU6OnJlYWRNdWx0aXBhcnRCb3VuZGFyeSk6CisgICAgICAgIChXZWJD
b3JlOjpNdWx0aXBhcnRSZXNwb25zZURlbGVnYXRlOjpvblJlY2VpdmVkRGF0YSk6CisgICAgICAg
IChXZWJDb3JlOjpNdWx0aXBhcnRSZXNwb25zZURlbGVnYXRlOjpvbkNvbXBsZXRlZFJlcXVlc3Qp
OgorICAgICAgICAoV2ViQ29yZTo6TXVsdGlwYXJ0UmVzcG9uc2VEZWxlZ2F0ZTo6cGFyc2VIZWFk
ZXJzKToKKyAgICAgICAgKFdlYkNvcmU6Ok11bHRpcGFydFJlc3BvbnNlRGVsZWdhdGU6OmZpbmRC
b3VuZGFyeSk6CisgICAgICAgICogcGxhdGZvcm0vbmV0d29yay9ibGFja2JlcnJ5L011bHRpcGFy
dFJlc3BvbnNlRGVsZWdhdGUuaDogQWRkZWQuCisKIDIwMTEtMTEtMzAgIFRha2FzaGkgVG95b3No
aW1hICA8dG95b3NoaW1AY2hyb21pdW0ub3JnPgogCiAgICAgICAgIEFkZCBPVkVSUklERSB0byBX
ZWJTb2NrZXQgcmVsYXRlZCBzb3VyY2VzIGZvciBzYWZlIGluaGVyaXRhbmNlcy4KZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvYmxhY2tiZXJyeS9NdWx0aXBhcnRS
ZXNwb25zZURlbGVnYXRlLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvYmxh
Y2tiZXJyeS9NdWx0aXBhcnRSZXNwb25zZURlbGVnYXRlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0
NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi42YjAyNjJi
ZmM0MDhhMGNiMGI4ZWQzNTgxODQ1MzUwYjFmMGJiMzNiCi0tLSAvZGV2L251bGwKKysrIGIvU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9ibGFja2JlcnJ5L011bHRpcGFydFJlc3BvbnNl
RGVsZWdhdGUuY3BwCkBAIC0wLDAgKzEsNTUzIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTEgUmVz
ZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKy8vIENvcHly
aWdodCAoYykgMjAwNi0yMDA4IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5
bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKwor
I2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIk11bHRpcGFydFJlc3BvbnNlRGVsZWdhdGUu
aCIKKworI2luY2x1ZGUgIlJlc291cmNlSGFuZGxlQ2xpZW50LmgiCisjaW5jbHVkZSA8d3RmL0FT
Q0lJQ1R5cGUuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCisvLyBUaGF0IGdjYyB3YW50cyBi
b3RoIG9mIHRoZXNlIHByb3RvdHlwZXMgc2VlbXMgbXlzdGVyaW91cy4gVkMsIGZvcgorLy8gaXRz
IHBhcnQsIGNhbid0IGRlY2lkZSB3aGljaCB0byB1c2UgKGFub3RoZXIgbXlzdGVyeSkuIE1hdGNo
aW5nIG9mCisvLyB0ZW1wbGF0ZSBvdmVybG9hZHM6IHRoZSBmaW5hbCBmcm9udGllci4KKyNpZm5k
ZWYgX01TQ19WRVIKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCBzaXplX3QgTj4KK2NoYXIgKCZBcnJh
eVNpemVIZWxwZXIoY29uc3QgVCAoJmFycmF5KVtOXSkpW05dOworI2VuZGlmCisKKyNkZWZpbmUg
YXJyYXlzaXplKGFycmF5KSAoc2l6ZW9mKEFycmF5U2l6ZUhlbHBlcihhcnJheSkpKQorCisvLyBU
aGUgbGlzdCBvZiByZXNwb25zZSBoZWFkZXJzIHRoYXQgd2UgZG8gbm90IGNvcHkgZnJvbSB0aGUg
b3JpZ2luYWwKKy8vIHJlc3BvbnNlIHdoZW4gZ2VuZXJhdGluZyBhIHJlc3Bvc2UuCitzdGF0aWMg
Y29uc3QgY2hhciogUmVwbGFjZUhlYWRlcnNbXSA9IHsKKyAgICAiY29udGVudC10eXBlIiwKKyAg
ICAiY29udGVudC1sZW5ndGgiLAorICAgICJjb250ZW50LWRpc3Bvc2l0aW9uIiwKKyAgICAiY29u
dGVudC1yYW5nZSIsCisgICAgInJhbmdlIiwKKyAgICAic2V0LWNvb2tpZSIKK307CisKK3N0YXRp
YyBib29sIGNvbXBhcmVDaGFyKGNoYXIgeCwgY2hhciB5KQoreworICAgIHJldHVybiB0b0FTQ0lJ
TG93ZXIoeCkgPT0gdG9BU0NJSUxvd2VyKHkpOworfQorCitzdGF0aWMgdm9pZCBzdHJpbmdUb0xv
d2VyQVNDSUkoc3RkOjpzdHJpbmcmIHMpCit7CisgICAgZm9yIChzdGQ6OnN0cmluZzo6aXRlcmF0
b3IgaSA9IHMuYmVnaW4oKTsgaSAhPSBzLmVuZCgpOyArK2kpCisgICAgICAgICppID0gdG9BU0NJ
SUxvd2VyKCppKTsKK30KKworZW51bSBUUklNUE9TSVRJT05TIHsKKyAgICBUUklNX05PTkUgICAg
ID0gMCwKKyAgICBUUklNX0xFQURJTkcgID0gMSA8PCAwLAorICAgIFRSSU1fVFJBSUxJTkcgPSAx
IDw8IDEsCisgICAgVFJJTV9BTEwgICAgICA9IFRSSU1fTEVBRElORyB8IFRSSU1fVFJBSUxJTkcs
Cit9OworCitzdGF0aWMgVFJJTVBPU0lUSU9OUyB0cmltU3RyaW5nVChjb25zdCBzdGQ6OnN0cmlu
ZyYgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0
cmluZzo6dmFsdWVfdHlwZSB0cmltQ2hhcnNbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIFRSSU1QT1NJVElPTlMgcG9zaXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgc3RkOjpzdHJpbmcmIG91dHB1dCkKK3sKKyAgICAvLyBGaW5kIHRoZSBlZGdlcyBv
ZiBsZWFkaW5nL3RyYWlsaW5nIHdoaXRlc3BhY2UgYXMgZGVzaXJlZC4KKyAgICBjb25zdCBzdGQ6
OnN0cmluZzo6c2l6ZV90eXBlIGxhc3RDaGFyID0gaW5wdXQubGVuZ3RoKCkgLSAxOworICAgIGNv
bnN0IHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgZmlyc3RHb29kQ2hhciA9IChwb3NpdGlvbnMgJiBU
UklNX0xFQURJTkcpID8KKyAgICAgICAgICAgICAgaW5wdXQuZmluZF9maXJzdF9ub3Rfb2YodHJp
bUNoYXJzKSA6IDA7CisgICAgY29uc3Qgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBsYXN0R29vZENo
YXIgPSAocG9zaXRpb25zICYgVFJJTV9UUkFJTElORykgPworICAgICAgICAgICAgICBpbnB1dC5m
aW5kX2xhc3Rfbm90X29mKHRyaW1DaGFycykgOiBsYXN0Q2hhcjsKKworICAgIC8vIFdoZW4gdGhl
IHN0cmluZyB3YXMgYWxsIHdoaXRlc3BhY2UsIHJlcG9ydCB0aGF0IHdlIHN0cmlwcGVkIG9mZiB3
aGl0ZXNwYWNlCisgICAgLy8gZnJvbSB3aGljaGV2ZXIgcG9zaXRpb24gdGhlIGNhbGxlciB3YXMg
aW50ZXJlc3RlZCBpbi4gRm9yIGVtcHR5IGlucHV0LCB3ZQorICAgIC8vIHN0cmlwcGVkIG5vIHdo
aXRlc3BhY2UsIGJ1dCB3ZSBzdGlsbCBuZWVkIHRvIGNsZWFyIHxvdXRwdXR8LgorICAgIGlmIChp
bnB1dC5lbXB0eSgpCisgICAgICAgIHx8IChmaXJzdEdvb2RDaGFyID09IHN0ZDo6c3RyaW5nOjpu
cG9zKQorICAgICAgICB8fCAobGFzdEdvb2RDaGFyID09IHN0ZDo6c3RyaW5nOjpucG9zKSkgewor
ICAgICAgICBib29sIGlucHV0V2FzRW1wdHkgPSBpbnB1dC5lbXB0eSgpOworICAgICAgICBvdXRw
dXQuY2xlYXIoKTsKKyAgICAgICAgcmV0dXJuIGlucHV0V2FzRW1wdHkgPyBUUklNX05PTkUgOiBw
b3NpdGlvbnM7CisgICAgfQorCisgICAgLy8gVHJpbSB0aGUgd2hpdGVzcGFjZS4KKyAgICBvdXRw
dXQgPSBpbnB1dC5zdWJzdHIoZmlyc3RHb29kQ2hhciwgbGFzdEdvb2RDaGFyIC0gZmlyc3RHb29k
Q2hhciArIDEpOworCisgICAgLy8gUmV0dXJuIHdoZXJlIHdlIHRyaW1tZWQgZnJvbS4KKyAgICBy
ZXR1cm4gc3RhdGljX2Nhc3Q8VFJJTVBPU0lUSU9OUz4oCisgICAgICAgICgoIWZpcnN0R29vZENo
YXIpID8gVFJJTV9OT05FIDogVFJJTV9MRUFESU5HKQorICAgICAgICB8ICgobGFzdEdvb2RDaGFy
ID09IGxhc3RDaGFyKSA/IFRSSU1fTk9ORSA6IFRSSU1fVFJBSUxJTkcpKTsKK30KKworc3RhdGlj
IGNvbnN0IGNoYXIgV2hpdGVzcGFjZUFTQ0lJW10gPSB7CisgICAgLy8gPGNvbnRyb2wtMDAwOT4g
dG8gPGNvbnRyb2wtMDAwRD4KKyAgICAweDA5LAorICAgIDB4MEEsCisgICAgMHgwQiwKKyAgICAw
eDBDLAorICAgIDB4MEQsCisgICAgLy8gU3BhY2UKKyAgICAweDIwLAorICAgIDAKK307CisKK3N0
YXRpYyBzdGQ6OnN0cmluZyBnZXRTcGVjaWZpY0hlYWRlcihjb25zdCBzdGQ6OnN0cmluZyYgaGVh
ZGVycywgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpCit7CisgICAgLy8gV2Ugd2FudCB0byBncmFi
IHRoZSBWYWx1ZSBmcm9tIHRoZSAiS2V5OiBWYWx1ZSIgcGFpcnMgaW4gdGhlIGhlYWRlcnMsCisg
ICAgLy8gd2hpY2ggc2hvdWxkIGxvb2sgbGlrZSB0aGlzIChubyBsZWFkaW5nIHNwYWNlcywgXG4t
c2VwYXJhdGVkKSAod2UgZm9ybWF0CisgICAgLy8gdGhlbSB0aGlzIHdheSBpbiB1cmxfcmVxdWVz
dF9pbmV0LmNjKToKKyAgICAvLyAgICBIVFRQLzEuMSAyMDAgT0tcbgorICAgIC8vICAgIEVUYWc6
ICI2ZDBiOC05NDctMjRmMzVlYzAiXG4KKyAgICAvLyAgICBDb250ZW50LUxlbmd0aDogMjM3NVxu
CisgICAgLy8gICAgQ29udGVudC1UeXBlOiB0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLThcbgorICAg
IC8vICAgIExhc3QtTW9kaWZpZWQ6IFN1biwgMDMgU2VwIDIwMDYgMDQ6MzQ6NDMgR01UXG4KKyAg
ICBpZiAoaGVhZGVycy5lbXB0eSgpKQorICAgICAgICByZXR1cm4gc3RkOjpzdHJpbmcoKTsKKwor
ICAgIHN0ZDo6c3RyaW5nIG1hdGNoKCdcbicgKyBuYW1lICsgJzonKTsKKworICAgIHN0ZDo6c3Ry
aW5nOjpjb25zdF9pdGVyYXRvciBiZWdpbiA9CisgICAgICAgIHN0ZDo6c2VhcmNoKGhlYWRlcnMu
YmVnaW4oKSwgaGVhZGVycy5lbmQoKSwgbWF0Y2guYmVnaW4oKSwgbWF0Y2guZW5kKCksCisgICAg
ICAgICAgICAgICAgICAgIGNvbXBhcmVDaGFyKTsKKworICAgIGlmIChiZWdpbiA9PSBoZWFkZXJz
LmVuZCgpKQorICAgICAgICByZXR1cm4gc3RkOjpzdHJpbmcoKTsKKworICAgIGJlZ2luICs9IG1h
dGNoLmxlbmd0aCgpOworICAgIHN0ZDo6c3RyaW5nIHJldDsKKyAgICB0cmltU3RyaW5nVChzdGQ6
OnN0cmluZyhiZWdpbiwgZmluZChiZWdpbiwgaGVhZGVycy5lbmQoKSwgJ1xuJykpLCBXaGl0ZXNw
YWNlQVNDSUksIFRSSU1fQUxMLCByZXQpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBi
b29sIGxvd2VyQ2FzZUVxdWFsc0FTQ0lJKHN0ZDo6c3RyaW5nOjpjb25zdF9pdGVyYXRvciBiZWdp
biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nOjpjb25zdF9p
dGVyYXRvciBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFy
KiBiKQoreworICAgIGZvciAoc3RkOjpzdHJpbmc6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gYmVnaW47
IGl0ICE9IGVuZDsgKytpdCwgKytiKSB7CisgICAgICAgIGlmICghKmIgfHwgdG9BU0NJSUxvd2Vy
KCppdCkgIT0gKmIpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVy
biAhKCpiKTsKK30KKworc3RhdGljIHNpemVfdCBmaW5kU3RyaW5nRW5kKGNvbnN0IHN0ZDo6c3Ry
aW5nJiBsaW5lLCBzaXplX3Qgc3RhcnQsIGNoYXIgZGVsaW0pCit7CisgICAgY29uc3QgY2hhciBz
ZXRbXSA9IHsgZGVsaW0sICdcXCcsICdcMCcgfTsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIC8v
IHN0YXJ0IHBvaW50cyB0byBlaXRoZXIgdGhlIHN0YXJ0IHF1b3RlIG9yIHRoZSBsYXN0CisgICAg
ICAgIC8vIGVzY2FwZWQgY2hhciAodGhlIGNoYXIgZm9sbG93aW5nIGEgJ1xcJykKKworICAgICAg
ICBzaXplX3QgZW5kID0gbGluZS5maW5kX2ZpcnN0X29mKHNldCwgc3RhcnQgKyAxKTsKKyAgICAg
ICAgaWYgKGVuZCA9PSBzdGQ6OnN0cmluZzo6bnBvcykKKyAgICAgICAgICAgIHJldHVybiBsaW5l
Lmxlbmd0aCgpOworCisgICAgICAgIGlmIChsaW5lW2VuZF0gPT0gJ1xcJykgeworICAgICAgICAg
ICAgLy8gSGl0IGEgYmFja3NsYXNoLWVzY2FwZWQgY2hhci4gTmVlZCB0byBza2lwIG92ZXIgaXQu
CisgICAgICAgICAgICBzdGFydCA9IGVuZCArIDE7CisgICAgICAgICAgICBpZiAoc3RhcnQgPT0g
bGluZS5sZW5ndGgoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhcnQ7CisKKyAgICAgICAg
ICAgIC8vIEdvIGJhY2sgdG8gbG9va2luZyBmb3IgdGhlIG5leHQgZXNjYXBlIG9yIHRoZSBzdHJp
bmcgZW5kCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVy
biBlbmQ7CisgICAgfQorCisgICAgLy8gTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBsaW5lLmxl
bmd0aCgpOworfQorCitzdGF0aWMgc2l6ZV90IGZpbmREZWxpbWl0ZXIoY29uc3Qgc3RkOjpzdHJp
bmcmIGxpbmUsIHNpemVfdCBzZWFyY2hTdGFydCwgY2hhciBkZWxpbWl0ZXIpCit7CisgICAgZG8g
eworICAgICAgICAvLyBzZWFyY2hTdGFydCBwb2ludHMgdG8gdGhlIHNwb3QgZnJvbSB3aGljaCB3
ZSBzaG91bGQgc3RhcnQgbG9va2luZworICAgICAgICAvLyBmb3IgdGhlIGRlbGltaXRlci4KKyAg
ICAgICAgY29uc3QgY2hhciBkZWxpbVN0cltdID0geyBkZWxpbWl0ZXIsICciJywgJ1wnJywgJ1ww
JyB9OworICAgICAgICBzaXplX3QgY3VyRGVsaW1Qb3MgPSBsaW5lLmZpbmRfZmlyc3Rfb2YoZGVs
aW1TdHIsIHNlYXJjaFN0YXJ0KTsKKyAgICAgICAgaWYgKGN1ckRlbGltUG9zID09IHN0ZDo6c3Ry
aW5nOjpucG9zKQorICAgICAgICAgICAgcmV0dXJuIGxpbmUubGVuZ3RoKCk7CisKKyAgICAgICAg
Y2hhciBjaCA9IGxpbmVbY3VyRGVsaW1Qb3NdOworICAgICAgICBpZiAoY2ggPT0gZGVsaW1pdGVy
KSB7CisgICAgICAgICAgICAvLyBGb3VuZCBkZWxpbWl0ZXIKKyAgICAgICAgICAgIHJldHVybiBj
dXJEZWxpbVBvczsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFdlIGhpdCB0aGUgc3RhcnQgb2Yg
YSBxdW90ZWQgc3RyaW5nLiBMb29rIGZvciBpdHMgZW5kLgorICAgICAgICBzZWFyY2hTdGFydCA9
IGZpbmRTdHJpbmdFbmQobGluZSwgY3VyRGVsaW1Qb3MsIGNoKTsKKyAgICAgICAgaWYgKHNlYXJj
aFN0YXJ0ID09IGxpbmUubGVuZ3RoKCkpCisgICAgICAgICAgICByZXR1cm4gc2VhcmNoU3RhcnQ7
CisKKyAgICAgICAgKytzZWFyY2hTdGFydDsKKworICAgICAgICAvLyBzZWFyY2hTdGFydCBub3cg
cG9pbnRzIHRvIHRoZSBmaXJzdCBjaGFyIGFmdGVyIHRoZSBlbmQgb2YgdGhlCisgICAgICAgIC8v
IHN0cmluZywgc28ganVzdCBnbyBiYWNrIHRvIHRoZSB0b3Agb2YgdGhlIGxvb3AgYW5kIGxvb2sg
Zm9yCisgICAgICAgIC8vIHxkZWxpbWl0ZXJ8IGFnYWluLgorICAgIH0gd2hpbGUgKHRydWUpOwor
CisgICAgcmV0dXJuIGxpbmUubGVuZ3RoKCk7Cit9CisKKworCitzdGF0aWMgdm9pZCBwYXJzZUNv
bnRlbnRUeXBlKGNvbnN0IHN0ZDo6c3RyaW5nJiBjb250ZW50VHlwZVN0ciwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcmIG1pbWVUeXBlLCBzdGQ6OnN0cmluZyYgY2hh
cnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCYgaGFkQ2hhcnNldCkKK3sK
KyAgICAvLyBUcmltIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UgZnJvbSB0eXBlLiBX
ZSBpbmNsdWRlICcoJyBpbgorICAgIC8vIHRoZSB0cmFpbGluZyB0cmltIHNldCB0byBjYXRjaCBt
ZWRpYS10eXBlIGNvbW1lbnRzLCB3aGljaCBhcmUgbm90IGF0IGFsbAorICAgIC8vIHN0YW5kYXJk
LCBidXQgbWF5IG9jY3VyIGluIHJhcmUgY2FzZXMuCisgICAgc2l6ZV90IHR5cGVWYWwgPSBjb250
ZW50VHlwZVN0ci5maW5kX2ZpcnN0X25vdF9vZigiIFx0Iik7CisgICAgdHlwZVZhbCA9IHN0ZDo6
bWluKHR5cGVWYWwsIGNvbnRlbnRUeXBlU3RyLmxlbmd0aCgpKTsKKyAgICBzaXplX3QgdHlwZUVu
ZCA9IGNvbnRlbnRUeXBlU3RyLmZpbmRfZmlyc3Rfb2YoIiBcdCIiOygiLCB0eXBlVmFsKTsKKyAg
ICBpZiAoc3RkOjpzdHJpbmc6Om5wb3MgPT0gdHlwZUVuZCkKKyAgICAgICAgdHlwZUVuZCA9IGNv
bnRlbnRUeXBlU3RyLmxlbmd0aCgpOworCisgICAgc2l6ZV90IGNoYXJzZXRWYWwgPSAwOworICAg
IHNpemVfdCBjaGFyc2V0RW5kID0gMDsKKworICAgIC8vIEl0ZXJhdGUgb3ZlciBwYXJhbWV0ZXJz
CisgICAgYm9vbCB0eXBlSGFzQ2hhcnNldCA9IGZhbHNlOworICAgIHNpemVfdCBwYXJhbVN0YXJ0
ID0gY29udGVudFR5cGVTdHIuZmluZF9maXJzdF9vZignOycsIHR5cGVFbmQpOworICAgIGlmIChw
YXJhbVN0YXJ0ICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIC8vIFdlIGhhdmUgcGFy
YW1ldGVycy4gSXRlcmF0ZSBvdmVyIHRoZW0uCisgICAgICAgIHNpemVfdCBjdXJQYXJhbVN0YXJ0
ID0gcGFyYW1TdGFydCArIDE7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHNpemVfdCBjdXJQ
YXJhbUVuZCA9IGZpbmREZWxpbWl0ZXIoY29udGVudFR5cGVTdHIsIGN1clBhcmFtU3RhcnQsICc7
Jyk7CisKKyAgICAgICAgICAgIHNpemVfdCBwYXJhbU5hbWVTdGFydCA9IGNvbnRlbnRUeXBlU3Ry
LmZpbmRfZmlyc3Rfbm90X29mKCIgXHQiLCBjdXJQYXJhbVN0YXJ0KTsKKyAgICAgICAgICAgIHBh
cmFtTmFtZVN0YXJ0ID0gc3RkOjptaW4ocGFyYW1OYW1lU3RhcnQsIGN1clBhcmFtRW5kKTsKKwor
ICAgICAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgY2hhcnNldFN0cltdID0gImNoYXJzZXQ9IjsK
KyAgICAgICAgICAgIHNpemVfdCBjaGFyc2V0RW5kT2Zmc2V0ID0gc3RkOjptaW4ocGFyYW1OYW1l
U3RhcnQgKyBzaXplb2YoY2hhcnNldFN0cikgLSAxLCBjdXJQYXJhbUVuZCk7CisgICAgICAgICAg
ICBpZiAobG93ZXJDYXNlRXF1YWxzQVNDSUkoY29udGVudFR5cGVTdHIuYmVnaW4oKSArIHBhcmFt
TmFtZVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRU
eXBlU3RyLmJlZ2luKCkgKyBjaGFyc2V0RW5kT2Zmc2V0LCBjaGFyc2V0U3RyKSkgeworICAgICAg
ICAgICAgICAgIGNoYXJzZXRWYWwgPSBwYXJhbU5hbWVTdGFydCArIHNpemVvZihjaGFyc2V0U3Ry
KSAtIDE7CisgICAgICAgICAgICAgICAgY2hhcnNldEVuZCA9IGN1clBhcmFtRW5kOworICAgICAg
ICAgICAgICAgIHR5cGVIYXNDaGFyc2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAg
ICAgICAgY3VyUGFyYW1TdGFydCA9IGN1clBhcmFtRW5kICsgMTsKKyAgICAgICAgfSB3aGlsZSAo
Y3VyUGFyYW1TdGFydCA8IGNvbnRlbnRUeXBlU3RyLmxlbmd0aCgpKTsKKyAgICB9CisKKyAgICBp
ZiAodHlwZUhhc0NoYXJzZXQpIHsKKyAgICAgICAgLy8gVHJpbSBsZWFkaW5nIGFuZCB0cmFpbGlu
ZyB3aGl0ZXNwYWNlIGZyb20gY2hhcnNldFZhbC4gV2UgaW5jbHVkZQorICAgICAgICAvLyAnKCcg
aW4gdGhlIHRyYWlsaW5nIHRyaW0gc2V0IHRvIGNhdGNoIG1lZGlhLXR5cGUgY29tbWVudHMsIHdo
aWNoIGFyZQorICAgICAgICAvLyBub3QgYXQgYWxsIHN0YW5kYXJkLCBidXQgbWF5IG9jY3VyIGlu
IHJhcmUgY2FzZXMuCisgICAgICAgIGNoYXJzZXRWYWwgPSBjb250ZW50VHlwZVN0ci5maW5kX2Zp
cnN0X25vdF9vZigiIFx0IiwgY2hhcnNldFZhbCk7CisgICAgICAgIGNoYXJzZXRWYWwgPSBzdGQ6
Om1pbihjaGFyc2V0VmFsLCBjaGFyc2V0RW5kKTsKKyAgICAgICAgY2hhciBmaXJzdENoYXIgPSBj
b250ZW50VHlwZVN0cltjaGFyc2V0VmFsXTsKKyAgICAgICAgaWYgKGZpcnN0Q2hhciA9PSAnIicg
fHwgZmlyc3RDaGFyID09ICdcJycpIHsKKyAgICAgICAgICAgIGNoYXJzZXRFbmQgPSBmaW5kU3Ry
aW5nRW5kKGNvbnRlbnRUeXBlU3RyLCBjaGFyc2V0VmFsLCBmaXJzdENoYXIpOworICAgICAgICAg
ICAgKytjaGFyc2V0VmFsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2hhcnNldEVu
ZCA9IHN0ZDo6bWluKGNvbnRlbnRUeXBlU3RyLmZpbmRfZmlyc3Rfb2YoIiBcdCIgIjsoIiwgY2hh
cnNldFZhbCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzZXRFbmQp
OworICAgICAgICB9CisgICAgfQorCisgICAgLy8gaWYgdGhlIHNlcnZlciBzZW50ICIqLyoiLCBp
dCBpcyBtZWFuaW5nbGVzcywgc28gZG8gbm90IHN0b3JlIGl0LgorICAgIC8vIGFsc28sIGlmIHR5
cGVWYWwgaXMgdGhlIHNhbWUgYXMgbWltZVR5cGUsIHRoZW4ganVzdCB1cGRhdGUgdGhlCisgICAg
Ly8gY2hhcnNldC4gaG93ZXZlciwgaWYgY2hhcnNldCBpcyBlbXB0eSBhbmQgbWltZVR5cGUgaGFz
bid0CisgICAgLy8gY2hhbmdlZCwgdGhlbiBkb24ndCB3aXBlLW91dCBhbiBleGlzdGluZyBjaGFy
c2V0LiBXZQorICAgIC8vIGFsc28gd2FudCB0byByZWplY3QgYSBtaW1lLXR5cGUgaWYgaXQgZG9l
cyBub3QgaW5jbHVkZSBhIHNsYXNoLgorICAgIC8vIHNvbWUgc2VydmVycyBnaXZlIGp1bmsgYWZ0
ZXIgdGhlIGNoYXJzZXQgcGFyYW1ldGVyLCB3aGljaCBtYXkKKyAgICAvLyBpbmNsdWRlIGEgY29t
bWEsIHNvIHRoaXMgY2hlY2sgbWFrZXMgdXMgYSBiaXQgbW9yZSB0b2xlcmFudC4KKyAgICBpZiAo
Y29udGVudFR5cGVTdHIubGVuZ3RoKCkKKyAgICAgICAgJiYgY29udGVudFR5cGVTdHIgIT0gIiov
KiIKKyAgICAgICAgJiYgY29udGVudFR5cGVTdHIuZmluZF9maXJzdF9vZignLycpICE9IHN0ZDo6
c3RyaW5nOjpucG9zKSB7CisgICAgICAgIC8vIENvbW1vbiBjYXNlIGhlcmUgaXMgdGhhdCBtaW1l
VHlwZSBpcyBlbXB0eQorICAgICAgICBib29sIGVxID0gIW1pbWVUeXBlLmVtcHR5KCkKKyAgICAg
ICAgICAgICAgICAgICYmIGxvd2VyQ2FzZUVxdWFsc0FTQ0lJKGNvbnRlbnRUeXBlU3RyLmJlZ2lu
KCkgKyB0eXBlVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
Y29udGVudFR5cGVTdHIuYmVnaW4oKSArIHR5cGVFbmQsCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBtaW1lVHlwZS5kYXRhKCkpOworICAgICAgICBpZiAoIWVxKSB7
CisgICAgICAgICAgICBtaW1lVHlwZS5hc3NpZ24oY29udGVudFR5cGVTdHIuYmVnaW4oKSArIHR5
cGVWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VHlwZVN0ci5iZWdp
bigpICsgdHlwZUVuZCk7CisgICAgICAgICAgICBzdHJpbmdUb0xvd2VyQVNDSUkobWltZVR5cGUp
OworICAgICAgICB9CisgICAgICAgIGlmICghZXEgfHwgdHlwZUhhc0NoYXJzZXQpIHsKKyAgICAg
ICAgICAgIGhhZENoYXJzZXQgPSB0cnVlOworICAgICAgICAgICAgY2hhcnNldC5hc3NpZ24oY29u
dGVudFR5cGVTdHIuYmVnaW4oKSArIGNoYXJzZXRWYWwsCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgY29udGVudFR5cGVTdHIuYmVnaW4oKSArIGNoYXJzZXRFbmQpOworICAgICAgICAgICAg
c3RyaW5nVG9Mb3dlckFTQ0lJKGNoYXJzZXQpOworICAgICAgICB9CisgICAgfQorfQorCisvLyBD
aGVja3MgdG8gc2VlIGlmIGRhdGFbcG9zXSBjaGFyYWN0ZXIgaXMgYSBsaW5lIGJyZWFrOyBoYW5k
bGVzIGNybGYsIGxmbGYsCisvLyBsZiwgb3IgY3IuIFJldHVybnMgdGhlIG51bWJlciBvZiBjaGFy
YWN0ZXJzIHRvIHNraXAgb3ZlciAoMCwgMSBvciAyKS4KK3N0YXRpYyBpbnQgcHVzaE92ZXJMaW5l
KGNvbnN0IHN0ZDo6c3RyaW5nJiBkYXRhLCBzaXplX3QgcG9zKQoreworICAgIGludCBvZmZzZXQg
PSAwOworICAgIGlmIChwb3MgPCBkYXRhLmxlbmd0aCgpICYmIChkYXRhW3Bvc10gPT0gJ1xyJyB8
fCBkYXRhW3Bvc10gPT0gJ1xuJykpIHsKKyAgICAgICAgKytvZmZzZXQ7CisgICAgICAgIGlmIChw
b3MgKyAxIDwgZGF0YS5sZW5ndGgoKSAmJiBkYXRhW3BvcyArIDFdID09ICdcbicpCisgICAgICAg
ICAgICArK29mZnNldDsKKyAgICB9CisgICAgcmV0dXJuIG9mZnNldDsKK30KKworTXVsdGlwYXJ0
UmVzcG9uc2VEZWxlZ2F0ZTo6TXVsdGlwYXJ0UmVzcG9uc2VEZWxlZ2F0ZShQYXNzUmVmUHRyPFJl
c291cmNlSGFuZGxlPiByZXNvdWNlSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZXNvdXJjZVJlc3BvbnNlJiByZXNwb25z
ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
Y29uc3Qgc3RkOjpzdHJpbmcmIGJvdW5kYXJ5KQorICAgIDogbV9ib3VuZGFyeShib3VuZGFyeSkK
KyAgICAsIG1fZW5jb2RlZERhdGFMZW5ndGgoMCkKKyAgICAsIG1fZmlyc3RSZWNlaXZlZERhdGEo
dHJ1ZSkKKyAgICAsIG1fb3JpZ2luYWxSZXNwb25zZShyZXNwb25zZSkKKyAgICAsIG1fcHJvY2Vz
c2luZ0hlYWRlcnMoZmFsc2UpCisgICAgLCBtX3Jlc291cmNlSGFuZGxlKHJlc291Y2VIYW5kbGUp
CisgICAgLCBtX3N0b3BTZW5kaW5nKGZhbHNlKQoreworICAgIHN0ZDo6c3RyaW5nIHNlYXJjaCA9
ICItLSI7CisgICAgaWYgKG1fYm91bmRhcnkuY29tcGFyZSgwLCBzZWFyY2gubGVuZ3RoKCksIHNl
YXJjaCkpCisgICAgICAgIG1fYm91bmRhcnkgPSBzZWFyY2ggKyBtX2JvdW5kYXJ5OworfQorCiti
b29sIE11bHRpcGFydFJlc3BvbnNlRGVsZWdhdGU6OnJlYWRNdWx0aXBhcnRCb3VuZGFyeShjb25z
dCBzdGQ6OnN0cmluZyYgY29udGVudFR5cGUsIHN0ZDo6c3RyaW5nJiBtdWx0aXBhcnRCb3VuZGFy
eSkKK3sKKyAgICBzaXplX3QgYm91bmRhcnlTdGFydE9mZnNldCA9IGNvbnRlbnRUeXBlLmZpbmQo
ImJvdW5kYXJ5PSIpOworICAgIGlmIChib3VuZGFyeVN0YXJ0T2Zmc2V0ID09IHN0ZDo6c3RyaW5n
OjpucG9zKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBib3VuZGFyeVN0YXJ0T2Zmc2V0
ICs9IHN0cmxlbigiYm91bmRhcnk9Iik7CisgICAgc2l6ZV90IGJvdW5kYXJ5RW5kT2Zmc2V0ID0g
Y29udGVudFR5cGUuZmluZCgnOycsIGJvdW5kYXJ5U3RhcnRPZmZzZXQpOworCisgICAgaWYgKGJv
dW5kYXJ5RW5kT2Zmc2V0ID09IHN0ZDo6c3RyaW5nOjpucG9zKQorICAgICAgICBib3VuZGFyeUVu
ZE9mZnNldCA9IGNvbnRlbnRUeXBlLmxlbmd0aCgpOworCisgICAgc2l6ZV90IGJvdW5kYXJ5TGVu
Z3RoID0gYm91bmRhcnlFbmRPZmZzZXQgLSBib3VuZGFyeVN0YXJ0T2Zmc2V0OworICAgIG11bHRp
cGFydEJvdW5kYXJ5ID0gY29udGVudFR5cGUuc3Vic3RyKGJvdW5kYXJ5U3RhcnRPZmZzZXQsIGJv
dW5kYXJ5TGVuZ3RoKTsKKworICAgIC8vIFRoZSBieXRlIHJhbmdlIHJlc3BvbnNlIGNhbiBoYXZl
IHF1b3RlZCBib3VuZGFyeSBzdHJpbmdzLiBUaGlzIGlzIGxlZ2FsCisgICAgLy8gYXMgcGVyIE1J
TUUgc3BlY2lmaWNhdGlvbnMuIEluZGl2aWR1YWwgZGF0YSBmcmFnZW1lbnRzIGhvd2V2ZXIgZG9u
J3QKKyAgICAvLyBjb250YWluIHF1b3RlZCBib3VuZGFyeSBzdHJpbmdzLgorICAgIHRyaW1TdHJp
bmdUKG11bHRpcGFydEJvdW5kYXJ5LCAiXCIiLCBUUklNX0FMTCwgbXVsdGlwYXJ0Qm91bmRhcnkp
OworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIE11bHRpcGFydFJlc3BvbnNlRGVsZWdhdGU6
Om9uUmVjZWl2ZWREYXRhKGNvbnN0IGNoYXIqIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkYXRhbGVuLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZW5jb2RlZERhdGFMZW5ndGgpCit7Cisg
ICAgLy8gbV9zdG9wU2VuZGluZyBtZWFucyB0aGF0IHdlJ3ZlIGFscmVhZHkgcmVjZWl2ZWQgdGhl
IGZpbmFsIGJvdW5kYXJ5IHRva2VuLgorICAgIC8vIFRoZSBzZXJ2ZXIgc2hvdWxkIHN0b3Agc2Vu
ZGluZyB1cyBkYXRhIGF0IHRoaXMgcG9pbnQsIGJ1dCBpZiBpdCBkb2VzLCB3ZQorICAgIC8vIGp1
c3QgdGhyb3cgaXQgYXdheS4KKyAgICBpZiAobV9zdG9wU2VuZGluZykKKyAgICAgICAgcmV0dXJu
OworCisgICAgbV9kYXRhLmFwcGVuZChkYXRhLCBkYXRhbGVuKTsKKyAgICBtX2VuY29kZWREYXRh
TGVuZ3RoICs9IGVuY29kZWREYXRhTGVuZ3RoOworICAgIGlmIChtX2ZpcnN0UmVjZWl2ZWREYXRh
KSB7CisgICAgICAgIC8vIFNvbWUgc2VydmVycyBkb24ndCBzZW5kIGEgYm91bmRhcnkgdG9rZW4g
YmVmb3JlIHRoZSBmaXJzdCBjaHVuayBvZgorICAgICAgICAvLyBkYXRhLiBXZSBoYW5kbGUgdGhp
cyBjYXNlIGFueXdheSAoR2Vja28gZG9lcyB0b28pLgorICAgICAgICBtX2ZpcnN0UmVjZWl2ZWRE
YXRhID0gZmFsc2U7CisKKyAgICAgICAgLy8gRWF0IGxlYWRpbmcgXHJcbgorICAgICAgICBpbnQg
cG9zID0gcHVzaE92ZXJMaW5lKG1fZGF0YSwgMCk7CisgICAgICAgIGlmIChwb3MpCisgICAgICAg
ICAgICBtX2RhdGEgPSBtX2RhdGEuc3Vic3RyKHBvcyk7CisKKyAgICAgICAgaWYgKG1fZGF0YS5s
ZW5ndGgoKSA8IG1fYm91bmRhcnkubGVuZ3RoKCkgKyAyKSB7CisgICAgICAgICAgICAvLyBXZSBk
b24ndCBoYXZlIGVub3VnaCBkYXRhIHlldCB0byBtYWtlIGEgYm91bmRhcnkgdG9rZW4uIEp1c3Qg
d2FpdAorICAgICAgICAgICAgLy8gdW50aWwgdGhlIG5leHQgY2h1bmsgb2YgZGF0YSBhcnJpdmVz
LgorICAgICAgICAgICAgbV9maXJzdFJlY2VpdmVkRGF0YSA9IHRydWU7CisgICAgICAgICAgICBy
ZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAobV9kYXRhLmNvbXBhcmUoMCwgbV9ib3Vu
ZGFyeS5sZW5ndGgoKSwgbV9ib3VuZGFyeSkpCisgICAgICAgICAgICBtX2RhdGEgPSBtX2JvdW5k
YXJ5ICsgIlxuIiArIG1fZGF0YTsKKyAgICB9CisKKyAgICAvLyBIZWFkZXJzCisgICAgaWYgKG1f
cHJvY2Vzc2luZ0hlYWRlcnMpIHsKKyAgICAgICAgLy8gRWF0IGxlYWRpbmcgXHJcbgorICAgICAg
ICBpbnQgcG9zID0gcHVzaE92ZXJMaW5lKG1fZGF0YSwgMCk7CisgICAgICAgIGlmIChwb3MpCisg
ICAgICAgICAgICBtX2RhdGEgPSBtX2RhdGEuc3Vic3RyKHBvcyk7CisKKyAgICAgICAgaWYgKHBh
cnNlSGVhZGVycygpKSB7CisgICAgICAgICAgICAvLyBTdWNjZXNzZnVsbHkgcGFyc2VkIGhlYWRl
cnMuCisgICAgICAgICAgICBtX3Byb2Nlc3NpbmdIZWFkZXJzID0gZmFsc2U7CisgICAgICAgIH0g
ZWxzZSB7CisgICAgICAgICAgICAvLyBHZXQgbW9yZSBkYXRhIGJlZm9yZSB0cnlpbmcgYWdhaW4u
CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzaXplX3QgYm91
bmRhcnlQb3M7CisgICAgd2hpbGUgKChib3VuZGFyeVBvcyA9IGZpbmRCb3VuZGFyeSgpKSAhPSBz
dGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICBpZiAobV9yZXNvdXJjZUhhbmRsZSAmJiAgbV9y
ZXNvdXJjZUhhbmRsZS0+Y2xpZW50KCkpIHsKKyAgICAgICAgICAgIC8vIFN0cmlwIG91dCB0cmFp
bGluZyBcblxyIGNoYXJhY3RlcnMgaW4gdGhlIGJ1ZmZlciBwcmVjZWRpbmcgdGhlCisgICAgICAg
ICAgICAvLyBib3VuZGFyeSBvbiB0aGUgc2FtZSBsaW5lcyBhcyBGaXJlZm94LgorICAgICAgICAg
ICAgaW50IGRhdGFsZW5ndGggPSBib3VuZGFyeVBvczsKKyAgICAgICAgICAgIGlmIChib3VuZGFy
eVBvcyA+IDAgJiYgbV9kYXRhW2JvdW5kYXJ5UG9zIC0gMV0gPT0gJ1xuJykgeworICAgICAgICAg
ICAgICAgIGRhdGFsZW5ndGgtLTsKKyAgICAgICAgICAgICAgICBpZiAoYm91bmRhcnlQb3MgPiAx
ICYmIG1fZGF0YVtib3VuZGFyeVBvcyAtIDJdID09ICdccicpCisgICAgICAgICAgICAgICAgICAg
IGRhdGFsZW5ndGgtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChkYXRhbGVuZ3Ro
ID4gMCkgeworICAgICAgICAgICAgICAgIC8vIFNlbmQgdGhlIGxhc3QgZGF0YSBjaHVuay4KKyAg
ICAgICAgICAgICAgICBtX3Jlc291cmNlSGFuZGxlLT5jbGllbnQoKS0+ZGlkUmVjZWl2ZURhdGEo
bV9yZXNvdXJjZUhhbmRsZS5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9kYXRhLmRhdGEoKSwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWxlbmd0aCwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgbV9lbmNvZGVkRGF0YUxlbmd0aCk7CisgICAgICAgICAgICAgICAgbV9lbmNvZGVkRGF0YUxl
bmd0aCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc2l6ZV90IGJvdW5k
YXJ5RW5kUG9zID0gYm91bmRhcnlQb3MgKyBtX2JvdW5kYXJ5Lmxlbmd0aCgpOworICAgICAgICBp
ZiAoYm91bmRhcnlFbmRQb3MgPCBtX2RhdGEubGVuZ3RoKCkgJiYgJy0nID09IG1fZGF0YVtib3Vu
ZGFyeUVuZFBvc10pIHsKKyAgICAgICAgICAgIC8vIFRoaXMgd2FzIHRoZSBsYXN0IGJvdW5kYXJ5
IHNvIHdlIGNhbiBzdG9wIHByb2Nlc3NpbmcuCisgICAgICAgICAgICBtX3N0b3BTZW5kaW5nID0g
dHJ1ZTsKKyAgICAgICAgICAgIG1fZGF0YS5jbGVhcigpOworICAgICAgICAgICAgcmV0dXJuOwor
ICAgICAgICB9CisKKyAgICAgICAgLy8gV2UgY2FuIG5vdyB0aHJvdyBvdXQgZGF0YSB1cCB0aHJv
dWdoIHRoZSBib3VuZGFyeQorICAgICAgICBpbnQgb2Zmc2V0ID0gcHVzaE92ZXJMaW5lKG1fZGF0
YSwgYm91bmRhcnlFbmRQb3MpOworICAgICAgICBtX2RhdGEgPSBtX2RhdGEuc3Vic3RyKGJvdW5k
YXJ5RW5kUG9zICsgb2Zmc2V0KTsKKworICAgICAgICAvLyBPaywgYmFjayB0byBwYXJzaW5nIGhl
YWRlcnMKKyAgICAgICAgaWYgKCFwYXJzZUhlYWRlcnMoKSkgeworICAgICAgICAgICAgbV9wcm9j
ZXNzaW5nSGVhZGVycyA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAg
IH0KKworICAgIC8vIEF0IHRoaXMgcG9pbnQsIHdlIHNob3VsZCBzZW5kIG92ZXIgYW55IGRhdGEg
d2UgaGF2ZSwgYnV0IGtlZXAgZW5vdWdoIGRhdGEKKyAgICAvLyBidWZmZXJlZCB0byBoYW5kbGUg
YSBib3VuZGFyeSB0aGF0IG1heSBoYXZlIGJlZW4gdHJ1bmNhdGVkLgorICAgIGlmICghbV9wcm9j
ZXNzaW5nSGVhZGVycyAmJiBtX2RhdGEubGVuZ3RoKCkgPiBtX2JvdW5kYXJ5Lmxlbmd0aCgpKSB7
CisgICAgICAgIC8vIElmIHRoZSBsYXN0IGNoYXJhY3RlciBpcyBhIG5ldyBsaW5lIGNoYXJhY3Rl
ciwgZ28gYWhlYWQgYW5kIGp1c3Qgc2VuZAorICAgICAgICAvLyBldmVyeXRoaW5nIHdlIGhhdmUg
YnVmZmVyZWQuIFRoaXMgbWF0Y2hlcyBhbiBvcHRpbWl6YXRpb24gaW4gR2Vja28uCisgICAgICAg
IGludCBzZW5kTGVuZ3RoID0gbV9kYXRhLmxlbmd0aCgpIC0gbV9ib3VuZGFyeS5sZW5ndGgoKTsK
KyAgICAgICAgaWYgKG1fZGF0YVttX2RhdGEubGVuZ3RoKCkgLSAxXSA9PSAnXG4nKQorICAgICAg
ICAgICAgc2VuZExlbmd0aCA9IG1fZGF0YS5sZW5ndGgoKTsKKyAgICAgICAgaWYgKG1fcmVzb3Vy
Y2VIYW5kbGUgJiYgbV9yZXNvdXJjZUhhbmRsZS0+Y2xpZW50KCkpCisgICAgICAgICAgICBtX3Jl
c291cmNlSGFuZGxlLT5jbGllbnQoKS0+ZGlkUmVjZWl2ZURhdGEobV9yZXNvdXJjZUhhbmRsZS5n
ZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBtX2RhdGEuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHNlbmRMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9lbmNvZGVkRGF0YUxlbmd0aCk7CisgICAg
ICAgIG1fZGF0YSA9IG1fZGF0YS5zdWJzdHIoc2VuZExlbmd0aCk7CisgICAgICAgIG1fZW5jb2Rl
ZERhdGFMZW5ndGggPSAwOworICAgIH0KK30KKwordm9pZCBNdWx0aXBhcnRSZXNwb25zZURlbGVn
YXRlOjpvbkNvbXBsZXRlZFJlcXVlc3QoKQoreworICAgIC8vIElmIHdlIGhhdmUgYW55IHBlbmRp
bmcgZGF0YSBhbmQgd2UncmUgbm90IGluIGEgaGVhZGVyLCBnbyBhaGVhZCBhbmQgc2VuZAorICAg
IC8vIGl0IHRvIFdlYkNvcmUuCisgICAgaWYgKCFtX3Byb2Nlc3NpbmdIZWFkZXJzICYmICFtX2Rh
dGEuZW1wdHkoKSAmJiAhbV9zdG9wU2VuZGluZyAmJiBtX3Jlc291cmNlSGFuZGxlICYmIG1fcmVz
b3VyY2VIYW5kbGUtPmNsaWVudCgpKSB7CisgICAgICAgIG1fcmVzb3VyY2VIYW5kbGUtPmNsaWVu
dCgpLT5kaWRSZWNlaXZlRGF0YShtX3Jlc291cmNlSGFuZGxlLmdldCgpLAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9kYXRhLmRhdGEoKSwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZGF0YS5s
ZW5ndGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIG1fZW5jb2RlZERhdGFMZW5ndGgpOworICAgICAgICBtX2VuY29kZWREYXRhTGVuZ3RoID0g
MDsKKyAgICB9Cit9CisKK2Jvb2wgTXVsdGlwYXJ0UmVzcG9uc2VEZWxlZ2F0ZTo6cGFyc2VIZWFk
ZXJzKCkKK3sKKyAgICBpbnQgbGluZUZlZWRJbmNyZW1lbnQgPSAxOworCisgICAgLy8gR3JhYiB0
aGUgaGVhZGVycyBiZWluZyBsaWJlcmFsIGFib3V0IGxpbmUgZW5kaW5ncy4KKyAgICBzaXplX3Qg
bGluZVN0YXJ0UG9zID0gMDsKKyAgICBzaXplX3QgbGluZUVuZFBvcyA9IG1fZGF0YS5maW5kKCdc
bicpOworICAgIHdoaWxlIChsaW5lRW5kUG9zICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAg
ICAgIC8vIEhhbmRsZSBDUkxGCisgICAgICAgIGlmIChsaW5lRW5kUG9zID4gbGluZVN0YXJ0UG9z
ICYmIG1fZGF0YVtsaW5lRW5kUG9zIC0gMV0gPT0gJ1xyJykgeworICAgICAgICAgICAgbGluZUZl
ZWRJbmNyZW1lbnQgPSAyOworICAgICAgICAgICAgLS1saW5lRW5kUG9zOworICAgICAgICB9IGVs
c2UKKyAgICAgICAgICAgIGxpbmVGZWVkSW5jcmVtZW50ID0gMTsKKworICAgICAgICBpZiAobGlu
ZVN0YXJ0UG9zID09IGxpbmVFbmRQb3MpIHsKKyAgICAgICAgICAgIC8vIEEgYmxhbmsgbGluZSwg
ZW5kIG9mIGhlYWRlcnMKKyAgICAgICAgICAgIGxpbmVFbmRQb3MgKz0gbGluZUZlZWRJbmNyZW1l
bnQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAvLyBGaW5kIHRoZSBu
ZXh0IGhlYWRlciBsaW5lLgorICAgICAgICBsaW5lU3RhcnRQb3MgPSBsaW5lRW5kUG9zICsgbGlu
ZUZlZWRJbmNyZW1lbnQ7CisgICAgICAgIGxpbmVFbmRQb3MgPSBtX2RhdGEuZmluZCgnXG4nLCBs
aW5lU3RhcnRQb3MpOworICAgIH0KKyAgICAvLyBUcnVuY2F0ZWQgaW4gdGhlIG1pZGRsZSBvZiBh
IGhlYWRlciwgc3RvcCBwYXJzaW5nLgorICAgIGlmIChsaW5lRW5kUG9zID09IHN0ZDo6c3RyaW5n
OjpucG9zKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBFYXQgaGVhZGVycworICAg
IHN0ZDo6c3RyaW5nIGhlYWRlcnMoIlxuIik7CisgICAgaGVhZGVycy5hcHBlbmQobV9kYXRhLCAw
LCBsaW5lRW5kUG9zKTsKKyAgICBtX2RhdGEgPSBtX2RhdGEuc3Vic3RyKGxpbmVFbmRQb3MpOwor
CisgICAgLy8gQ3JlYXRlIGEgV2ViVVJMUmVzcG9uc2UgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHNl
dCBvZiBoZWFkZXJzICsgdGhlCisgICAgLy8gcmVwbGFjZW1lbnQgaGVhZGVycy4gV2Ugb25seSBy
ZXBsYWNlIHRoZSBzYW1lIGZldyBoZWFkZXJzIHRoYXQgZ2Vja28KKyAgICAvLyBkb2VzLiBTZWUg
bmV0d2Vyay9zdHJlYW1jb252L2NvbnZlcnRlcnMvbnNNdWx0aU1peGVkQ29udi5jcHAuCisKKyAg
ICBzdGQ6OnN0cmluZyBjb250ZW50VHlwZSA9IGdldFNwZWNpZmljSGVhZGVyKGhlYWRlcnMsICJj
b250ZW50LXR5cGUiKTsKKyAgICBzdGQ6OnN0cmluZyBtaW1lVHlwZTsKKyAgICBzdGQ6OnN0cmlu
ZyBjaGFyc2V0OworICAgIGJvb2wgaGFzQ2hhcnNldCA9IGZhbHNlOworCisgICAgcGFyc2VDb250
ZW50VHlwZShjb250ZW50VHlwZSwgbWltZVR5cGUsIGNoYXJzZXQsIGhhc0NoYXJzZXQpOworICAg
IFJlc291cmNlUmVzcG9uc2UgcmVzcG9uc2U7CisgICAgcmVzcG9uc2Uuc2V0VVJMKG1fb3JpZ2lu
YWxSZXNwb25zZS51cmwoKSk7CisgICAgcmVzcG9uc2Uuc2V0TWltZVR5cGUoV1RGOjpTdHJpbmc6
OmZyb21VVEY4KG1pbWVUeXBlLmRhdGEoKSkpOworICAgIGlmIChoYXNDaGFyc2V0KQorICAgICAg
ICByZXNwb25zZS5zZXRUZXh0RW5jb2RpbmdOYW1lKFdURjo6U3RyaW5nOjpmcm9tVVRGOChjaGFy
c2V0LmRhdGEoKSkpOworCisgICAgY29uc3QgV2ViQ29yZTo6SFRUUEhlYWRlck1hcCYgbWFwID0g
bV9vcmlnaW5hbFJlc3BvbnNlLmh0dHBIZWFkZXJGaWVsZHMoKTsKKyAgICBmb3IgKFdlYkNvcmU6
OkhUVFBIZWFkZXJNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbWFwLmJlZ2luKCk7IGl0ICE9IG1h
cC5lbmQoKTsgKytpdCkgeworICAgICAgICBib29sIGlzTmVlZEFkZCA9IHRydWU7CisgICAgICAg
IGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXJyYXlzaXplKFJlcGxhY2VIZWFkZXJzKTsgKytpKSB7
CisgICAgICAgICAgICBpZiAoaXQtPmZpcnN0Lmxvd2VyKCkgPT0gUmVwbGFjZUhlYWRlcnNbaV0p
IHsKKyAgICAgICAgICAgICAgICBpc05lZWRBZGQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoaXNOZWVkQWRkKQor
ICAgICAgICAgICAgcmVzcG9uc2Uuc2V0SFRUUEhlYWRlckZpZWxkKGl0LT5maXJzdCwgaXQtPnNl
Y29uZCk7CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhcnJheXNpemUoUmVw
bGFjZUhlYWRlcnMpOyArK2kpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgbmFtZShSZXBsYWNlSGVh
ZGVyc1tpXSk7CisgICAgICAgIHN0ZDo6c3RyaW5nIHZhbHVlID0gZ2V0U3BlY2lmaWNIZWFkZXIo
aGVhZGVycywgbmFtZSk7CisgICAgICAgIGlmICghdmFsdWUuZW1wdHkoKSkgeworICAgICAgICAg
ICAgcmVzcG9uc2Uuc2V0SFRUUEhlYWRlckZpZWxkKFdURjo6U3RyaW5nOjpmcm9tVVRGOChuYW1l
LmRhdGEoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1RGOjpT
dHJpbmc6OmZyb21VVEY4KHZhbHVlLmRhdGEoKSkpOworICAgICAgICB9CisgICAgfQorCisgICAg
aWYgKG1fcmVzb3VyY2VIYW5kbGUgJiYgbV9yZXNvdXJjZUhhbmRsZS0+Y2xpZW50KCkpIHsKKyAg
ICAgICAgLy8gQWZ0ZXIgcGFyc2VkIHRoZSBoZWFkZXJzIHN1Y2Nlc3NmdWxseSwgdGhlIG11bHRp
cGFydCBwYWdlcyB3aWxsIG5vdCBiZSBzdG9yZWQgaW4gcGFnZQorICAgICAgICAvLyBjYWNoZSBh
bnkgbW9yZSwgYmVjYXVzZSBnbyBiYWNrL2ZvcndhcmQgYWN0aW9ucyBuZWVkIGdldHRpbmcgdGhl
IGxhdGVzdCBkYXRhIGZyb20gc2VydmVyLgorICAgICAgICByZXNwb25zZS5zZXRJc011bHRpcGFy
dFBheWxvYWQodHJ1ZSk7CisgICAgICAgIG1fcmVzb3VyY2VIYW5kbGUtPmNsaWVudCgpLT5kaWRS
ZWNlaXZlUmVzcG9uc2UobV9yZXNvdXJjZUhhbmRsZS5nZXQoKSwgcmVzcG9uc2UpOworICAgIH0K
KyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQm91bmRhcmllcyBhcmUgc3VwcG9zZWQgdG8gYmUg
cHJlY2VlZGVkIHdpdGggLS0sIGJ1dCBpdCBsb29rcyBsaWtlIGdlY2tvCisvLyBkb2Vzbid0IHJl
cXVpcmUgdGhlIGRhc2hlcyB0byBleGlzdC4gU2VlIG5zTXVsdGlNaXhlZENvbnY6OkZpbmRUb2tl
bi4KK3NpemVfdCBNdWx0aXBhcnRSZXNwb25zZURlbGVnYXRlOjpmaW5kQm91bmRhcnkoKQorewor
ICAgIHNpemVfdCBib3VuZGFyeVBvcyA9IG1fZGF0YS5maW5kKG1fYm91bmRhcnkpOworICAgIGlm
IChib3VuZGFyeVBvcyAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAvLyBCYWNrIHVw
IG92ZXIgLS0gZm9yIGJhY2t3YXJkcyBjb21wYXQKKyAgICAgICAgLy8gRklYTUUodGMpOiBEb24n
dCB3ZSBvbmx5IHdhbnQgdG8gZG8gdGhpcyBvbmNlPyBHZWNrbyBjb2RlIGRvZXNuJ3Qgc2VlbQor
ICAgICAgICAvLyB0byBjYXJlLgorICAgICAgICBpZiAoYm91bmRhcnlQb3MgPj0gMikgeworICAg
ICAgICAgICAgaWYgKCctJyA9PSBtX2RhdGFbYm91bmRhcnlQb3MgLSAxXSAmJiAnLScgPT0gbV9k
YXRhW2JvdW5kYXJ5UG9zIC0gMl0pIHsKKyAgICAgICAgICAgICAgICBib3VuZGFyeVBvcyAtPSAy
OworICAgICAgICAgICAgICAgIG1fYm91bmRhcnkgPSAiLS0iICsgbV9ib3VuZGFyeTsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYm91bmRhcnlQb3M7Cit9CisK
K30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL25ldHdvcmsvYmxhY2tiZXJyeS9NdWx0aXBhcnRSZXNwb25zZURlbGVnYXRlLmggYi9Tb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvTXVsdGlwYXJ0UmVzcG9uc2VE
ZWxlZ2F0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAuLjJkNDVjODA0YWUwOWEyYTQ3YjU3NGQwZjE2OTE2ZDU1YmJj
MzI0ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3Jr
L2JsYWNrYmVycnkvTXVsdGlwYXJ0UmVzcG9uc2VEZWxlZ2F0ZS5oCkBAIC0wLDAgKzEsMTE0IEBA
CisvLyBDb3B5cmlnaHQgKEMpIDIwMTEgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisvLyBNb3N0IG9mIGxvZ2ljIGFuZCBmdW5jdGlvbnMgYXJlIGJhc2Ug
b24gQ2hyb21pdW0gYnJvd3NlcidzIGltcGxlbWFudGlvbnMgaW4KKy8vIHdlYmtpdC9nbHVlL211
bHRpcGFydF9yZXNwb25zZV9kZWxlZ2F0ZS5jYworCisKKy8vIENvcHlyaWdodCAoYykgMjAwNi0y
MDA5IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9m
IHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0
IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vCisvLyBBIGRlbGVnYXRl
IGNsYXNzIG9mIFdlYlVSTExvYWRlckltcGwgdGhhdCBoYW5kbGVzIG11bHRpcGFydC94LW1peGVk
LXJlcGxhY2UKKy8vIGRhdGEuIFdlIHNwZWNpYWwgY2FzZSBtdWx0aXBhcnQveC1taXhlZC1yZXBs
YWNlIGJlY2F1c2UgV2ViQ29yZSBleHBlY3RzIGEKKy8vIHNlcGFyYXRlIGRpZFJlY2VpdmVSZXNw
b25zZSBmb3IgZWFjaCBuZXcgbWVzc2FnZSBwYXJ0LgorLy8KKy8vIE1vc3Qgb2YgdGhlIGxvZ2lj
IGFuZCBlZGdlIGNhc2UgaGFuZGxpbmcgYXJlIGJhc2VkIG9uIHRoZSBNb3ppbGxhJ3MKKy8vIGlt
cGxlbWVudGF0aW9uIGluIG5ldHdlcmsvc3RyZWFtY29udi9jb252ZXJ0ZXJzL25zTXVsdGlNaXhl
ZENvbnYuY3BwLgorLy8gVGhpcyBzZWVtcyBsaWtlIGEgZGVyaXZhdGl2ZSB3b3JrLCBzbyBoZXJl
J3MgdGhlIG9yaWdpbmFsIGxpY2Vuc2U6CisKKy8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sg
KioqKioKKyAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQorICoKKyAqIFRoZSBj
b250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExp
Y2Vuc2UgVmVyc2lvbgorICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRo
aXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gWW91IG1h
eSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiBodHRwOi8vd3d3Lm1vemlsbGEu
b3JnL01QTC8KKyAqCisgKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBp
cyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAorICogV0lUSE9VVCBXQVJSQU5UWSBP
RiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCisg
KiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRp
b25zIHVuZGVyIHRoZQorICogTGljZW5zZS4KKyAqCisgKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBt
b3ppbGxhLm9yZyBjb2RlLgorICoKKyAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3Jp
Z2luYWwgQ29kZSBpcworICogTmV0c2NhcGUgQ29tbXVuaWNhdGlvbnMgQ29ycG9yYXRpb24uCisg
KiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0
IChDKSAxOTk4CisgKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQu
CisgKgorICogQ29udHJpYnV0b3Iocyk6CisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRl
bnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGVpdGhl
ciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUg
IkdQTCIpLCBvcgorICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJz
aW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCisgKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92
aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAorICog
b2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24g
b2YgdGhpcyBmaWxlIG9ubHkKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBv
ciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KKyAqIHVzZSB5b3VyIHZlcnNp
b24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3Vy
CisgKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFj
ZSB0aGVtIHdpdGggdGhlIG5vdGljZQorICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQg
YnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKKyAqIHRoZSBwcm92
aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZp
bGUgdW5kZXIKKyAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3Ig
dGhlIExHUEwuCisgKgorICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KKworI2lm
bmRlZiBNdWx0aXBhcnRSZXNwb25zZURlbGVnYXRlX2gKKyNkZWZpbmUgTXVsdGlwYXJ0UmVzcG9u
c2VEZWxlZ2F0ZV9oCisKKyNpbmNsdWRlICJSZXNvdXJjZUhhbmRsZS5oIgorI2luY2x1ZGUgIlJl
c291cmNlUmVzcG9uc2UuaCIKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBXZWJDb3Jl
IHsKKworY2xhc3MgTXVsdGlwYXJ0UmVzcG9uc2VEZWxlZ2F0ZSB7CitwdWJsaWM6CisgICAgTXVs
dGlwYXJ0UmVzcG9uc2VEZWxlZ2F0ZShQYXNzUmVmUHRyPFJlc291cmNlSGFuZGxlPiByZXNvdWNl
SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVzb3VyY2VSZXNw
b25zZSYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYg
Ym91bmRhcnkpOworICAgIHN0YXRpYyBib29sIHJlYWRNdWx0aXBhcnRCb3VuZGFyeShjb25zdCBz
dGQ6OnN0cmluZyYgY29udGVudFR5cGUsIHN0ZDo6c3RyaW5nJiBtdWx0aXBhcnRCb3VuZGFyeSk7
CisgICAgdm9pZCBvblJlY2VpdmVkRGF0YShjb25zdCBjaGFyKiBkYXRhLCBpbnQgZGF0YUxlbmd0
aCwgaW50IGVuY29kZWREYXRhTGVuZ3RoKTsKKyAgICB2b2lkIG9uQ29tcGxldGVkUmVxdWVzdCgp
OworCitwcml2YXRlOgorCisgICAgLy8gQ2hlY2tzIHRvIHNlZSBpZiBkYXRhW3Bvc10gY2hhcmFj
dGVyIGlzIGEgbGluZSBicmVhazsgaGFuZGxlcyBjcmxmLCBsZmxmLAorICAgIC8vIGxmLCBvciBj
ci4gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gc2tpcCBvdmVyICgwLCAxIG9y
IDIpLgorCisgICAgLy8gVHJpZXMgdG8gcGFyc2UgaHR0cCBoZWFkZXJzIGZyb20gdGhlIHN0YXJ0
IG9mIGRhdGFfLiBSZXR1cm5zIHRydWUgaWYgaXQKKyAgICAvLyBzdWNjZWVkcyBhbmQgc2VuZHMg
YSBkaWRSZWNlaXZlUmVzcG9uc2UgdG8gbV9jbGllbnQuIFJldHVybnMgZmFsc2UgaWYKKyAgICAv
LyB0aGUgaGVhZGVyIGlzIGluY29tcGxldGUgKGluIHdoaWNoIGNhc2Ugd2UganVzdCB3YWl0IGZv
ciBtb3JlIGRhdGEpLgorICAgIGJvb2wgcGFyc2VIZWFkZXJzKCk7CisKKyAgICAvLyBGaW5kIHRo
ZSBuZXh0IGJvdW5kYXJ5IGluIGRhdGFfLiBSZXR1cm5zIHN0ZDo6c3RyaW5nOjpucG9zIGlmIHRo
ZXJlJ3Mgbm8KKyAgICAvLyBmdWxsIHRva2VuLgorICAgIHNpemVfdCBmaW5kQm91bmRhcnkoKTsK
KworICAgIC8vIE11bHRpcGFydCBib3VuZGFyeSB0b2tlbgorICAgIHN0ZDo6c3RyaW5nIG1fYm91
bmRhcnk7CisKKyAgICAvLyBBIHRlbXBvcmFyeSBidWZmZXIgdG8gaG9sZCBkYXRhIGJldHdlZW4g
cmVhZHMgZm9yIG11bHRpcGFydCBkYXRhIHRoYXQKKyAgICAvLyBnZXRzIHNwbGl0IGluIHRoZSBt
aWRkbGUgb2YgYSBoZWFkZXIuCisgICAgc3RkOjpzdHJpbmcgbV9kYXRhOworCisgICAgaW50IG1f
ZW5jb2RlZERhdGFMZW5ndGg7CisKKyAgICAvLyB0cnVlIHVudGlsIHdlIGdldCBvdXIgZmlyc3Qg
b24gcmVjZWl2ZWQgZGF0YSBjYWxsCisgICAgYm9vbCBtX2ZpcnN0UmVjZWl2ZWREYXRhOworCisg
ICAgLy8gVGhlIG9yaWdpbmFsIHJlc291cmNlIHJlc3BvbnNlIGZvciB0aGlzIHJlcXVlc3QuIFdl
IHVzZSB0aGlzIGFzIGEKKyAgICAvLyBzdGFydGluZyBwb2ludCBmb3IgZWFjaCBwYXJ0cyByZXNw
b25zZS4KKyAgICBjb25zdCBSZXNvdXJjZVJlc3BvbnNlJiBtX29yaWdpbmFsUmVzcG9uc2U7CisK
KyAgICAvLyB0cnVlIGlmIHdlJ3JlIHRydW5jYXRlZCBpbiB0aGUgbWlkZGxlIG9mIGEgaGVhZGVy
CisgICAgYm9vbCBtX3Byb2Nlc3NpbmdIZWFkZXJzOworCisgICAgUmVmUHRyPFJlc291cmNlSGFu
ZGxlPiBtX3Jlc291cmNlSGFuZGxlOworCisgICAgLy8gdHJ1ZSB3aGVuIHdlJ3JlIGRvbmUgc2Vu
ZGluZyBpbmZvcm1hdGlvbi4gQXQgdGhhdCBwb2ludCwgd2Ugc3RvcAorICAgIC8vIHByb2Nlc3Np
bmcgQWRkRGF0YSByZXF1ZXN0cy4KKyAgICBib29sIG1fc3RvcFNlbmRpbmc7Cit9OworCit9IC8v
IG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBNdWx0aXBhcnRSZXNwb25zZURlbGVnYXRl
X2gK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>117589</attachid>
            <date>2011-12-02 01:10:14 -0800</date>
            <delta_ts>2011-12-07 19:56:26 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-73533-20111202171011.patch</filename>
            <type>text/plain</type>
            <size>28446</size>
            <attacher name="Chris.Guan">logingx</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTAxNTk1CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggNGQxNzVmNzc2Y2E3NWMx
ZTQzNzY5NTVjZDNjOGE5ZmQ4NjU2ZGU2Ny4uMDBkYTEwMmYxOGEyZGY0ODE3YzcyZTgzMmFiZGRm
NDE5MTE3ZWJmMiAxMDA3NTUKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDMxIEBACisyMDExLTEyLTAyICBDaHJp
cyBHdWFuICA8Y2hyaXMuZ3VhbkB0b3JjaG1vYmlsZS5jb20uY24+CisKKyAgICAgICAgVXBzdHJl
YW0gdGhlIEJsYWNrYmVycnkgcG9ydGluZyBvZiBtdWx0aXBhcnQgZGVsZWdhdGUKKyAgICAgICAg
aHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTczNTMzCisKKyAgICAgICAg
UmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgVGVzdCBjYXNlczoKKyAgICAg
ICAgaHR0cDovL2F2aHMuYXhpcy5jb20KKworICAgICAgICAqIHBsYXRmb3JtL25ldHdvcmsvYmxh
Y2tiZXJyeS9NdWx0aXBhcnRSZXNwb25zZURlbGVnYXRlLmNwcDogQWRkZWQuCisgICAgICAgIChX
ZWJDb3JlOjpjb21wYXJlQ2hhcik6CisgICAgICAgIChXZWJDb3JlOjpzdHJpbmdUb0xvd2VyQVND
SUkpOgorICAgICAgICAoV2ViQ29yZTo6dHJpbVN0cmluZyk6CisgICAgICAgIChXZWJDb3JlOjpn
ZXRTcGVjaWZpY0hlYWRlcik6CisgICAgICAgIChXZWJDb3JlOjpsb3dlckNhc2VFcXVhbHNBU0NJ
SSk6CisgICAgICAgIChXZWJDb3JlOjpmaW5kU3RyaW5nRW5kKToKKyAgICAgICAgKFdlYkNvcmU6
OmZpbmREZWxpbWl0ZXIpOgorICAgICAgICAoV2ViQ29yZTo6cGFyc2VDb250ZW50VHlwZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpwdXNoT3ZlckxpbmUpOgorICAgICAgICAoV2ViQ29yZTo6TXVsdGlw
YXJ0UmVzcG9uc2VEZWxlZ2F0ZTo6TXVsdGlwYXJ0UmVzcG9uc2VEZWxlZ2F0ZSk6CisgICAgICAg
IChXZWJDb3JlOjpNdWx0aXBhcnRSZXNwb25zZURlbGVnYXRlOjpyZWFkTXVsdGlwYXJ0Qm91bmRh
cnkpOgorICAgICAgICAoV2ViQ29yZTo6TXVsdGlwYXJ0UmVzcG9uc2VEZWxlZ2F0ZTo6b25SZWNl
aXZlZERhdGEpOgorICAgICAgICAoV2ViQ29yZTo6TXVsdGlwYXJ0UmVzcG9uc2VEZWxlZ2F0ZTo6
b25Db21wbGV0ZWRSZXF1ZXN0KToKKyAgICAgICAgKFdlYkNvcmU6Ok11bHRpcGFydFJlc3BvbnNl
RGVsZWdhdGU6OnBhcnNlSGVhZGVycyk6CisgICAgICAgIChXZWJDb3JlOjpNdWx0aXBhcnRSZXNw
b25zZURlbGVnYXRlOjpmaW5kQm91bmRhcnkpOgorICAgICAgICAqIHBsYXRmb3JtL25ldHdvcmsv
YmxhY2tiZXJyeS9NdWx0aXBhcnRSZXNwb25zZURlbGVnYXRlLmg6IEFkZGVkLgorCiAyMDExLTEx
LTMwICBUYWthc2hpIFRveW9zaGltYSAgPHRveW9zaGltQGNocm9taXVtLm9yZz4KIAogICAgICAg
ICBBZGQgT1ZFUlJJREUgdG8gV2ViU29ja2V0IHJlbGF0ZWQgc291cmNlcyBmb3Igc2FmZSBpbmhl
cml0YW5jZXMuCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2Js
YWNrYmVycnkvTXVsdGlwYXJ0UmVzcG9uc2VEZWxlZ2F0ZS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvTXVsdGlwYXJ0UmVzcG9uc2VEZWxlZ2F0ZS5jcHAK
bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMC4uODY5ODg1YzdjYWM4OTQ0ZmQ3NTIyZjA3MzhkYjNmNTdkMmNlMWVmZAotLS0g
L2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvYmxhY2tiZXJy
eS9NdWx0aXBhcnRSZXNwb25zZURlbGVnYXRlLmNwcApAQCAtMCwwICsxLDU1MiBAQAorLy8gQ29w
eXJpZ2h0IChDKSAyMDExIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwOCBUaGUgQ2hyb21pdW0gQXV0aG9y
cy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdv
dmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRo
ZSBMSUNFTlNFIGZpbGUuCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJNdWx0aXBh
cnRSZXNwb25zZURlbGVnYXRlLmgiCisKKyNpbmNsdWRlICJSZXNvdXJjZUhhbmRsZUNsaWVudC5o
IgorI2luY2x1ZGUgPHd0Zi9BU0NJSUNUeXBlLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKwor
Ly8gVGhhdCBnY2Mgd2FudHMgYm90aCBvZiB0aGVzZSBwcm90b3R5cGVzIHNlZW1zIG15c3Rlcmlv
dXMuIFZDLCBmb3IKKy8vIGl0cyBwYXJ0LCBjYW4ndCBkZWNpZGUgd2hpY2ggdG8gdXNlIChhbm90
aGVyIG15c3RlcnkpLiBNYXRjaGluZyBvZgorLy8gdGVtcGxhdGUgb3ZlcmxvYWRzOiB0aGUgZmlu
YWwgZnJvbnRpZXIuCisjaWZuZGVmIF9NU0NfVkVSCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc2l6
ZV90IE4+CitjaGFyICgmQXJyYXlTaXplSGVscGVyKGNvbnN0IFQgKCZhcnJheSlbTl0pKVtOXTsK
KyNlbmRpZgorCisjZGVmaW5lIGFycmF5c2l6ZShhcnJheSkgKHNpemVvZihBcnJheVNpemVIZWxw
ZXIoYXJyYXkpKSkKKworLy8gVGhlIGxpc3Qgb2YgcmVzcG9uc2UgaGVhZGVycyB0aGF0IHdlIGRv
IG5vdCBjb3B5IGZyb20gdGhlIG9yaWdpbmFsCisvLyByZXNwb25zZSB3aGVuIGdlbmVyYXRpbmcg
YSByZXNwb3NlLgorc3RhdGljIGNvbnN0IGNoYXIqIFJlcGxhY2VIZWFkZXJzW10gPSB7CisgICAg
ImNvbnRlbnQtdHlwZSIsCisgICAgImNvbnRlbnQtbGVuZ3RoIiwKKyAgICAiY29udGVudC1kaXNw
b3NpdGlvbiIsCisgICAgImNvbnRlbnQtcmFuZ2UiLAorICAgICJyYW5nZSIsCisgICAgInNldC1j
b29raWUiCit9OworCitzdGF0aWMgYm9vbCBjb21wYXJlQ2hhcihjaGFyIHgsIGNoYXIgeSkKK3sK
KyAgICByZXR1cm4gdG9BU0NJSUxvd2VyKHgpID09IHRvQVNDSUlMb3dlcih5KTsKK30KKworc3Rh
dGljIHZvaWQgc3RyaW5nVG9Mb3dlckFTQ0lJKHN0ZDo6c3RyaW5nJiBzKQoreworICAgIGZvciAo
c3RkOjpzdHJpbmc6Oml0ZXJhdG9yIGkgPSBzLmJlZ2luKCk7IGkgIT0gcy5lbmQoKTsgKytpKQor
ICAgICAgICAqaSA9IHRvQVNDSUlMb3dlcigqaSk7Cit9CisKK2VudW0gVFJJTVBPU0lUSU9OUyB7
CisgICAgVFJJTV9OT05FICAgICA9IDAsCisgICAgVFJJTV9MRUFESU5HICA9IDEgPDwgMCwKKyAg
ICBUUklNX1RSQUlMSU5HID0gMSA8PCAxLAorICAgIFRSSU1fQUxMICAgICAgPSBUUklNX0xFQURJ
TkcgfCBUUklNX1RSQUlMSU5HLAorfTsKKworc3RhdGljIFRSSU1QT1NJVElPTlMgdHJpbVN0cmlu
Zyhjb25zdCBzdGQ6OnN0cmluZyYgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBjb25zdCBzdGQ6OnN0cmluZzo6dmFsdWVfdHlwZSB0cmltQ2hhcnNbXSwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIFRSSU1QT1NJVElPTlMgcG9zaXRpb25zLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcmIG91dHB1dCkKK3sKKyAgICAv
LyBGaW5kIHRoZSBlZGdlcyBvZiBsZWFkaW5nL3RyYWlsaW5nIHdoaXRlc3BhY2UgYXMgZGVzaXJl
ZC4KKyAgICBjb25zdCBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGxhc3RDaGFyID0gaW5wdXQubGVu
Z3RoKCkgLSAxOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgZmlyc3RHb29kQ2hh
ciA9IChwb3NpdGlvbnMgJiBUUklNX0xFQURJTkcpID8KKyAgICAgICAgICAgICAgaW5wdXQuZmlu
ZF9maXJzdF9ub3Rfb2YodHJpbUNoYXJzKSA6IDA7CisgICAgY29uc3Qgc3RkOjpzdHJpbmc6OnNp
emVfdHlwZSBsYXN0R29vZENoYXIgPSAocG9zaXRpb25zICYgVFJJTV9UUkFJTElORykgPworICAg
ICAgICAgICAgICBpbnB1dC5maW5kX2xhc3Rfbm90X29mKHRyaW1DaGFycykgOiBsYXN0Q2hhcjsK
KworICAgIC8vIFdoZW4gdGhlIHN0cmluZyB3YXMgYWxsIHdoaXRlc3BhY2UsIHJlcG9ydCB0aGF0
IHdlIHN0cmlwcGVkIG9mZiB3aGl0ZXNwYWNlCisgICAgLy8gZnJvbSB3aGljaGV2ZXIgcG9zaXRp
b24gdGhlIGNhbGxlciB3YXMgaW50ZXJlc3RlZCBpbi4gRm9yIGVtcHR5IGlucHV0LCB3ZQorICAg
IC8vIHN0cmlwcGVkIG5vIHdoaXRlc3BhY2UsIGJ1dCB3ZSBzdGlsbCBuZWVkIHRvIGNsZWFyIHxv
dXRwdXR8LgorICAgIGlmIChpbnB1dC5lbXB0eSgpCisgICAgICAgIHx8IChmaXJzdEdvb2RDaGFy
ID09IHN0ZDo6c3RyaW5nOjpucG9zKQorICAgICAgICB8fCAobGFzdEdvb2RDaGFyID09IHN0ZDo6
c3RyaW5nOjpucG9zKSkgeworICAgICAgICBib29sIGlucHV0V2FzRW1wdHkgPSBpbnB1dC5lbXB0
eSgpOworICAgICAgICBvdXRwdXQuY2xlYXIoKTsKKyAgICAgICAgcmV0dXJuIGlucHV0V2FzRW1w
dHkgPyBUUklNX05PTkUgOiBwb3NpdGlvbnM7CisgICAgfQorCisgICAgLy8gVHJpbSB0aGUgd2hp
dGVzcGFjZS4KKyAgICBvdXRwdXQgPSBpbnB1dC5zdWJzdHIoZmlyc3RHb29kQ2hhciwgbGFzdEdv
b2RDaGFyIC0gZmlyc3RHb29kQ2hhciArIDEpOworCisgICAgLy8gUmV0dXJuIHdoZXJlIHdlIHRy
aW1tZWQgZnJvbS4KKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VFJJTVBPU0lUSU9OUz4oCisgICAg
ICAgICgoIWZpcnN0R29vZENoYXIpID8gVFJJTV9OT05FIDogVFJJTV9MRUFESU5HKQorICAgICAg
ICB8ICgobGFzdEdvb2RDaGFyID09IGxhc3RDaGFyKSA/IFRSSU1fTk9ORSA6IFRSSU1fVFJBSUxJ
TkcpKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgV2hpdGVzcGFjZUFTQ0lJW10gPSB7CisgICAg
Ly8gPGNvbnRyb2wtMDAwOT4gdG8gPGNvbnRyb2wtMDAwRD4KKyAgICAweDA5LAorICAgIDB4MEEs
CisgICAgMHgwQiwKKyAgICAweDBDLAorICAgIDB4MEQsCisgICAgLy8gU3BhY2UKKyAgICAweDIw
LAorICAgIDAKK307CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBnZXRTcGVjaWZpY0hlYWRlcihjb25z
dCBzdGQ6OnN0cmluZyYgaGVhZGVycywgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpCit7CisgICAg
Ly8gV2Ugd2FudCB0byBncmFiIHRoZSBWYWx1ZSBmcm9tIHRoZSAiS2V5OiBWYWx1ZSIgcGFpcnMg
aW4gdGhlIGhlYWRlcnMsCisgICAgLy8gd2hpY2ggc2hvdWxkIGxvb2sgbGlrZSB0aGlzIChubyBs
ZWFkaW5nIHNwYWNlcywgXG4tc2VwYXJhdGVkKSAod2UgZm9ybWF0CisgICAgLy8gdGhlbSB0aGlz
IHdheSBpbiB1cmxfcmVxdWVzdF9pbmV0LmNjKToKKyAgICAvLyAgICBIVFRQLzEuMSAyMDAgT0tc
bgorICAgIC8vICAgIEVUYWc6ICI2ZDBiOC05NDctMjRmMzVlYzAiXG4KKyAgICAvLyAgICBDb250
ZW50LUxlbmd0aDogMjM3NVxuCisgICAgLy8gICAgQ29udGVudC1UeXBlOiB0ZXh0L2h0bWw7IGNo
YXJzZXQ9VVRGLThcbgorICAgIC8vICAgIExhc3QtTW9kaWZpZWQ6IFN1biwgMDMgU2VwIDIwMDYg
MDQ6MzQ6NDMgR01UXG4KKyAgICBpZiAoaGVhZGVycy5lbXB0eSgpKQorICAgICAgICByZXR1cm4g
c3RkOjpzdHJpbmcoKTsKKworICAgIHN0ZDo6c3RyaW5nIG1hdGNoKCdcbicgKyBuYW1lICsgJzon
KTsKKworICAgIHN0ZDo6c3RyaW5nOjpjb25zdF9pdGVyYXRvciBiZWdpbiA9CisgICAgICAgIHN0
ZDo6c2VhcmNoKGhlYWRlcnMuYmVnaW4oKSwgaGVhZGVycy5lbmQoKSwgbWF0Y2guYmVnaW4oKSwg
bWF0Y2guZW5kKCksCisgICAgICAgICAgICAgICAgICAgIGNvbXBhcmVDaGFyKTsKKworICAgIGlm
IChiZWdpbiA9PSBoZWFkZXJzLmVuZCgpKQorICAgICAgICByZXR1cm4gc3RkOjpzdHJpbmcoKTsK
KworICAgIGJlZ2luICs9IG1hdGNoLmxlbmd0aCgpOworICAgIHN0ZDo6c3RyaW5nIHJldDsKKyAg
ICB0cmltU3RyaW5nKHN0ZDo6c3RyaW5nKGJlZ2luLCBmaW5kKGJlZ2luLCBoZWFkZXJzLmVuZCgp
LCAnXG4nKSksIFdoaXRlc3BhY2VBU0NJSSwgVFJJTV9BTEwsIHJldCk7CisgICAgcmV0dXJuIHJl
dDsKK30KKworc3RhdGljIGJvb2wgbG93ZXJDYXNlRXF1YWxzQVNDSUkoc3RkOjpzdHJpbmc6OmNv
bnN0X2l0ZXJhdG9yIGJlZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rk
OjpzdHJpbmc6OmNvbnN0X2l0ZXJhdG9yIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGNvbnN0IGNoYXIqIGIpCit7CisgICAgZm9yIChzdGQ6OnN0cmluZzo6Y29uc3RfaXRl
cmF0b3IgaXQgPSBiZWdpbjsgaXQgIT0gZW5kOyArK2l0LCArK2IpIHsKKyAgICAgICAgaWYgKCEq
YiB8fCB0b0FTQ0lJTG93ZXIoKml0KSAhPSAqYikKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
KyAgICB9CisgICAgcmV0dXJuICEoKmIpOworfQorCitzdGF0aWMgc2l6ZV90IGZpbmRTdHJpbmdF
bmQoY29uc3Qgc3RkOjpzdHJpbmcmIGxpbmUsIHNpemVfdCBzdGFydCwgY2hhciBkZWxpbWl0ZXIp
Cit7CisgICAgY29uc3QgY2hhciBzZXRbXSA9IHsgZGVsaW1pdGVyLCAnXFwnLCAnXDAnIH07Cisg
ICAgZm9yICg7OykgeworICAgICAgICAvLyBzdGFydCBwb2ludHMgdG8gZWl0aGVyIHRoZSBzdGFy
dCBxdW90ZSBvciB0aGUgbGFzdAorICAgICAgICAvLyBlc2NhcGVkIGNoYXIgKHRoZSBjaGFyIGZv
bGxvd2luZyBhICdcXCcpCisKKyAgICAgICAgc2l6ZV90IGVuZCA9IGxpbmUuZmluZF9maXJzdF9v
ZihzZXQsIHN0YXJ0ICsgMSk7CisgICAgICAgIGlmIChlbmQgPT0gc3RkOjpzdHJpbmc6Om5wb3Mp
CisgICAgICAgICAgICByZXR1cm4gbGluZS5sZW5ndGgoKTsKKworICAgICAgICBpZiAobGluZVtl
bmRdID09ICdcXCcpIHsKKyAgICAgICAgICAgIC8vIEhpdCBhIGJhY2tzbGFzaC1lc2NhcGVkIGNo
YXIuIE5lZWQgdG8gc2tpcCBvdmVyIGl0LgorICAgICAgICAgICAgc3RhcnQgPSBlbmQgKyAxOwor
ICAgICAgICAgICAgaWYgKHN0YXJ0ID09IGxpbmUubGVuZ3RoKCkpCisgICAgICAgICAgICAgICAg
cmV0dXJuIHN0YXJ0OworCisgICAgICAgICAgICAvLyBHbyBiYWNrIHRvIGxvb2tpbmcgZm9yIHRo
ZSBuZXh0IGVzY2FwZSBvciB0aGUgc3RyaW5nIGVuZAorICAgICAgICAgICAgY29udGludWU7Cisg
ICAgICAgIH0KKworICAgICAgICByZXR1cm4gZW5kOworICAgIH0KKworICAgIC8vIHNob3VsZCBu
b3QgcmVhY2ggaGVyZQorICAgIHJldHVybiBsaW5lLmxlbmd0aCgpOworfQorCitzdGF0aWMgc2l6
ZV90IGZpbmREZWxpbWl0ZXIoY29uc3Qgc3RkOjpzdHJpbmcmIGxpbmUsIHNpemVfdCBzZWFyY2hT
dGFydCwgY2hhciBkZWxpbWl0ZXIpCit7CisgICAgZG8geworICAgICAgICAvLyBzZWFyY2hTdGFy
dCBwb2ludHMgdG8gdGhlIHNwb3QgZnJvbSB3aGljaCB3ZSBzaG91bGQgc3RhcnQgbG9va2luZwor
ICAgICAgICAvLyBmb3IgdGhlIGRlbGltaXRlci4KKyAgICAgICAgY29uc3QgY2hhciBkZWxpbWl0
ZXJTZXRbXSA9IHsgZGVsaW1pdGVyLCAnIicsICdcJycsICdcMCcgfTsKKyAgICAgICAgc2l6ZV90
IGN1cnJlbnREZWxpbWl0ZXJQb3NpdGlvbiA9IGxpbmUuZmluZF9maXJzdF9vZihkZWxpbWl0ZXJT
ZXQsIHNlYXJjaFN0YXJ0KTsKKyAgICAgICAgaWYgKGN1cnJlbnREZWxpbWl0ZXJQb3NpdGlvbiA9
PSBzdGQ6OnN0cmluZzo6bnBvcykKKyAgICAgICAgICAgIHJldHVybiBsaW5lLmxlbmd0aCgpOwor
CisgICAgICAgIGNoYXIgY2ggPSBsaW5lW2N1cnJlbnREZWxpbWl0ZXJQb3NpdGlvbl07CisgICAg
ICAgIGlmIChjaCA9PSBkZWxpbWl0ZXIpIHsKKyAgICAgICAgICAgIC8vIEZvdW5kIGRlbGltaXRl
cgorICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnREZWxpbWl0ZXJQb3NpdGlvbjsKKyAgICAgICAg
fQorCisgICAgICAgIC8vIFdlIGhpdCB0aGUgc3RhcnQgb2YgYSBxdW90ZWQgc3RyaW5nLiBMb29r
IGZvciBpdHMgZW5kLgorICAgICAgICBzZWFyY2hTdGFydCA9IGZpbmRTdHJpbmdFbmQobGluZSwg
Y3VycmVudERlbGltaXRlclBvc2l0aW9uLCBjaCk7CisgICAgICAgIGlmIChzZWFyY2hTdGFydCA9
PSBsaW5lLmxlbmd0aCgpKQorICAgICAgICAgICAgcmV0dXJuIHNlYXJjaFN0YXJ0OworCisgICAg
ICAgICsrc2VhcmNoU3RhcnQ7CisKKyAgICAgICAgLy8gc2VhcmNoU3RhcnQgbm93IHBvaW50cyB0
byB0aGUgZmlyc3QgY2hhciBhZnRlciB0aGUgZW5kIG9mIHRoZQorICAgICAgICAvLyBzdHJpbmcs
IHNvIGp1c3QgZ28gYmFjayB0byB0aGUgdG9wIG9mIHRoZSBsb29wIGFuZCBsb29rIGZvcgorICAg
ICAgICAvLyB8ZGVsaW1pdGVyfCBhZ2Fpbi4KKyAgICB9IHdoaWxlICh0cnVlKTsKKworICAgIHJl
dHVybiBsaW5lLmxlbmd0aCgpOworfQorCisKKworc3RhdGljIHZvaWQgcGFyc2VDb250ZW50VHlw
ZShjb25zdCBzdGQ6OnN0cmluZyYgY29udGVudFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHN0ZDo6c3RyaW5nJiBtaW1lVHlwZSwgc3RkOjpzdHJpbmcmIGNoYXJzZXQsCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wmIGhhZENoYXJzZXQpCit7CisgICAgLy8gVHJp
bSBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlIGZyb20gdHlwZS4gV2UgaW5jbHVkZSAn
KCcgaW4KKyAgICAvLyB0aGUgdHJhaWxpbmcgdHJpbSBzZXQgdG8gY2F0Y2ggbWVkaWEtdHlwZSBj
b21tZW50cywgd2hpY2ggYXJlIG5vdCBhdCBhbGwKKyAgICAvLyBzdGFuZGFyZCwgYnV0IG1heSBv
Y2N1ciBpbiByYXJlIGNhc2VzLgorICAgIHNpemVfdCB0eXBlVmFsdWUgPSBjb250ZW50VHlwZS5m
aW5kX2ZpcnN0X25vdF9vZigiIFx0Iik7CisgICAgdHlwZVZhbHVlID0gc3RkOjptaW4odHlwZVZh
bHVlLCBjb250ZW50VHlwZS5sZW5ndGgoKSk7CisgICAgc2l6ZV90IHR5cGVFbmQgPSBjb250ZW50
VHlwZS5maW5kX2ZpcnN0X29mKCIgXHQiIjsoIiwgdHlwZVZhbHVlKTsKKyAgICBpZiAoc3RkOjpz
dHJpbmc6Om5wb3MgPT0gdHlwZUVuZCkKKyAgICAgICAgdHlwZUVuZCA9IGNvbnRlbnRUeXBlLmxl
bmd0aCgpOworCisgICAgc2l6ZV90IGNoYXJzZXRWYWx1ZSA9IDA7CisgICAgc2l6ZV90IGNoYXJz
ZXRFbmQgPSAwOworCisgICAgLy8gSXRlcmF0ZSBvdmVyIHBhcmFtZXRlcnMKKyAgICBib29sIHR5
cGVIYXNDaGFyc2V0ID0gZmFsc2U7CisgICAgc2l6ZV90IHBhcmFtZXRlclN0YXJ0ID0gY29udGVu
dFR5cGUuZmluZF9maXJzdF9vZignOycsIHR5cGVFbmQpOworICAgIGlmIChwYXJhbWV0ZXJTdGFy
dCAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAvLyBXZSBoYXZlIHBhcmFtZXRlcnMu
IEl0ZXJhdGUgb3ZlciB0aGVtLgorICAgICAgICBzaXplX3QgY3VyUGFyYW1TdGFydCA9IHBhcmFt
ZXRlclN0YXJ0ICsgMTsKKyAgICAgICAgZG8geworICAgICAgICAgICAgc2l6ZV90IGN1cnJlbnRQ
YXJhbWV0ZXJFbmQgPSBmaW5kRGVsaW1pdGVyKGNvbnRlbnRUeXBlLCBjdXJQYXJhbVN0YXJ0LCAn
OycpOworCisgICAgICAgICAgICBzaXplX3QgcGFyYW1ldGVyTmFtZVN0YXJ0ID0gY29udGVudFR5
cGUuZmluZF9maXJzdF9ub3Rfb2YoIiBcdCIsIGN1clBhcmFtU3RhcnQpOworICAgICAgICAgICAg
cGFyYW1ldGVyTmFtZVN0YXJ0ID0gc3RkOjptaW4ocGFyYW1ldGVyTmFtZVN0YXJ0LCBjdXJyZW50
UGFyYW1ldGVyRW5kKTsKKworICAgICAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgY2hhcnNldFN0
cmluZ1tdID0gImNoYXJzZXQ9IjsKKyAgICAgICAgICAgIHNpemVfdCBjaGFyc2V0RW5kT2Zmc2V0
ID0gc3RkOjptaW4ocGFyYW1ldGVyTmFtZVN0YXJ0ICsgc2l6ZW9mKGNoYXJzZXRTdHJpbmcpIC0g
MSwgY3VycmVudFBhcmFtZXRlckVuZCk7CisgICAgICAgICAgICBpZiAobG93ZXJDYXNlRXF1YWxz
QVNDSUkoY29udGVudFR5cGUuYmVnaW4oKSArIHBhcmFtZXRlck5hbWVTdGFydCwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VHlwZS5iZWdpbigpICsgY2hhcnNl
dEVuZE9mZnNldCwgY2hhcnNldFN0cmluZykpIHsKKyAgICAgICAgICAgICAgICBjaGFyc2V0VmFs
dWUgPSBwYXJhbWV0ZXJOYW1lU3RhcnQgKyBzaXplb2YoY2hhcnNldFN0cmluZykgLSAxOworICAg
ICAgICAgICAgICAgIGNoYXJzZXRFbmQgPSBjdXJyZW50UGFyYW1ldGVyRW5kOworICAgICAgICAg
ICAgICAgIHR5cGVIYXNDaGFyc2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAg
ICAgY3VyUGFyYW1TdGFydCA9IGN1cnJlbnRQYXJhbWV0ZXJFbmQgKyAxOworICAgICAgICB9IHdo
aWxlIChjdXJQYXJhbVN0YXJ0IDwgY29udGVudFR5cGUubGVuZ3RoKCkpOworICAgIH0KKworICAg
IGlmICh0eXBlSGFzQ2hhcnNldCkgeworICAgICAgICAvLyBUcmltIGxlYWRpbmcgYW5kIHRyYWls
aW5nIHdoaXRlc3BhY2UgZnJvbSBjaGFyc2V0VmFsdWUuIFdlIGluY2x1ZGUKKyAgICAgICAgLy8g
JygnIGluIHRoZSB0cmFpbGluZyB0cmltIHNldCB0byBjYXRjaCBtZWRpYS10eXBlIGNvbW1lbnRz
LCB3aGljaCBhcmUKKyAgICAgICAgLy8gbm90IGF0IGFsbCBzdGFuZGFyZCwgYnV0IG1heSBvY2N1
ciBpbiByYXJlIGNhc2VzLgorICAgICAgICBjaGFyc2V0VmFsdWUgPSBjb250ZW50VHlwZS5maW5k
X2ZpcnN0X25vdF9vZigiIFx0IiwgY2hhcnNldFZhbHVlKTsKKyAgICAgICAgY2hhcnNldFZhbHVl
ID0gc3RkOjptaW4oY2hhcnNldFZhbHVlLCBjaGFyc2V0RW5kKTsKKyAgICAgICAgY2hhciBmaXJz
dENoYXIgPSBjb250ZW50VHlwZVtjaGFyc2V0VmFsdWVdOworICAgICAgICBpZiAoZmlyc3RDaGFy
ID09ICciJyB8fCBmaXJzdENoYXIgPT0gJ1wnJykgeworICAgICAgICAgICAgY2hhcnNldEVuZCA9
IGZpbmRTdHJpbmdFbmQoY29udGVudFR5cGUsIGNoYXJzZXRWYWx1ZSwgZmlyc3RDaGFyKTsKKyAg
ICAgICAgICAgICsrY2hhcnNldFZhbHVlOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGNo
YXJzZXRFbmQgPSBzdGQ6Om1pbihjb250ZW50VHlwZS5maW5kX2ZpcnN0X29mKCIgXHQiICI7KCIs
IGNoYXJzZXRWYWx1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnNl
dEVuZCk7CisgICAgfQorCisgICAgLy8gSWYgdGhlIHNlcnZlciBzZW50ICIqLyoiLCBpdCBpcyBt
ZWFuaW5nbGVzcywgc28gZG8gbm90IHN0b3JlIGl0LgorICAgIC8vIGFsc28sIGlmIHR5cGVWYWx1
ZSBpcyB0aGUgc2FtZSBhcyBtaW1lVHlwZSwgdGhlbiBqdXN0IHVwZGF0ZSB0aGUKKyAgICAvLyBj
aGFyc2V0LiBob3dldmVyLCBpZiBjaGFyc2V0IGlzIGVtcHR5IGFuZCBtaW1lVHlwZSBoYXNuJ3QK
KyAgICAvLyBjaGFuZ2VkLCB0aGVuIGRvbid0IHdpcGUtb3V0IGFuIGV4aXN0aW5nIGNoYXJzZXQu
IFdlCisgICAgLy8gYWxzbyB3YW50IHRvIHJlamVjdCBhIG1pbWUtdHlwZSBpZiBpdCBkb2VzIG5v
dCBpbmNsdWRlIGEgc2xhc2guCisgICAgLy8gc29tZSBzZXJ2ZXJzIGdpdmUganVuayBhZnRlciB0
aGUgY2hhcnNldCBwYXJhbWV0ZXIsIHdoaWNoIG1heQorICAgIC8vIGluY2x1ZGUgYSBjb21tYSwg
c28gdGhpcyBjaGVjayBtYWtlcyB1cyBhIGJpdCBtb3JlIHRvbGVyYW50LgorICAgIGlmIChjb250
ZW50VHlwZS5sZW5ndGgoKQorICAgICAgICAmJiBjb250ZW50VHlwZSAhPSAiKi8qIgorICAgICAg
ICAmJiBjb250ZW50VHlwZS5maW5kX2ZpcnN0X29mKCcvJykgIT0gc3RkOjpzdHJpbmc6Om5wb3Mp
IHsKKyAgICAgICAgLy8gQ29tbW9uIGNhc2UgaGVyZSBpcyB0aGF0IG1pbWVUeXBlIGlzIGVtcHR5
CisgICAgICAgIGJvb2wgZXF1YWwgPSAhbWltZVR5cGUuZW1wdHkoKQorICAgICAgICAgICAgICAg
ICAgJiYgbG93ZXJDYXNlRXF1YWxzQVNDSUkoY29udGVudFR5cGUuYmVnaW4oKSArIHR5cGVWYWx1
ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBl
LmJlZ2luKCkgKyB0eXBlRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgbWltZVR5cGUuZGF0YSgpKTsKKyAgICAgICAgaWYgKCFlcXVhbCkgeworICAgICAgICAg
ICAgbWltZVR5cGUuYXNzaWduKGNvbnRlbnRUeXBlLmJlZ2luKCkgKyB0eXBlVmFsdWUsCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFR5cGUuYmVnaW4oKSArIHR5cGVFbmQpOwor
ICAgICAgICAgICAgc3RyaW5nVG9Mb3dlckFTQ0lJKG1pbWVUeXBlKTsKKyAgICAgICAgfQorICAg
ICAgICBpZiAoIWVxdWFsIHx8IHR5cGVIYXNDaGFyc2V0KSB7CisgICAgICAgICAgICBoYWRDaGFy
c2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGNoYXJzZXQuYXNzaWduKGNvbnRlbnRUeXBlLmJlZ2lu
KCkgKyBjaGFyc2V0VmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VHlw
ZS5iZWdpbigpICsgY2hhcnNldEVuZCk7CisgICAgICAgICAgICBzdHJpbmdUb0xvd2VyQVNDSUko
Y2hhcnNldCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIENoZWNrcyB0byBzZWUgaWYgZGF0
YVtwb3NpdGlvbl0gY2hhcmFjdGVyIGlzIGEgbGluZSBicmVhazsgaGFuZGxlcyBjcmxmLCBsZmxm
LAorLy8gbGYsIG9yIGNyLiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBza2lw
IG92ZXIgKDAsIDEgb3IgMikuCitzdGF0aWMgaW50IHB1c2hPdmVyTGluZShjb25zdCBzdGQ6OnN0
cmluZyYgZGF0YSwgc2l6ZV90IHBvc2l0aW9uKQoreworICAgIGludCBvZmZzZXQgPSAwOworICAg
IGlmIChwb3NpdGlvbiA8IGRhdGEubGVuZ3RoKCkgJiYgKGRhdGFbcG9zaXRpb25dID09ICdccicg
fHwgZGF0YVtwb3NpdGlvbl0gPT0gJ1xuJykpIHsKKyAgICAgICAgKytvZmZzZXQ7CisgICAgICAg
IGlmIChwb3NpdGlvbiArIDEgPCBkYXRhLmxlbmd0aCgpICYmIGRhdGFbcG9zaXRpb24gKyAxXSA9
PSAnXG4nKQorICAgICAgICAgICAgKytvZmZzZXQ7CisgICAgfQorICAgIHJldHVybiBvZmZzZXQ7
Cit9CisKK011bHRpcGFydFJlc3BvbnNlRGVsZWdhdGU6Ok11bHRpcGFydFJlc3BvbnNlRGVsZWdh
dGUoUGFzc1JlZlB0cjxSZXNvdXJjZUhhbmRsZT4gcmVzb3VjZUhhbmRsZSwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVzb3VyY2VS
ZXNwb25zZSYgcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBib3VuZGFyeSkKKyAgICA6IG1fYm91
bmRhcnkoYm91bmRhcnkpCisgICAgLCBtX2VuY29kZWREYXRhTGVuZ3RoKDApCisgICAgLCBtX2Zp
cnN0UmVjZWl2ZWREYXRhKHRydWUpCisgICAgLCBtX29yaWdpbmFsUmVzcG9uc2UocmVzcG9uc2Up
CisgICAgLCBtX3Byb2Nlc3NpbmdIZWFkZXJzKGZhbHNlKQorICAgICwgbV9yZXNvdXJjZUhhbmRs
ZShyZXNvdWNlSGFuZGxlKQorICAgICwgbV9zdG9wU2VuZGluZyhmYWxzZSkKK3sKKyAgICBzdGQ6
OnN0cmluZyBzZWFyY2ggPSAiLS0iOworICAgIGlmIChtX2JvdW5kYXJ5LmNvbXBhcmUoMCwgc2Vh
cmNoLmxlbmd0aCgpLCBzZWFyY2gpKQorICAgICAgICBtX2JvdW5kYXJ5ID0gc2VhcmNoICsgbV9i
b3VuZGFyeTsKK30KKworYm9vbCBNdWx0aXBhcnRSZXNwb25zZURlbGVnYXRlOjpyZWFkTXVsdGlw
YXJ0Qm91bmRhcnkoY29uc3Qgc3RkOjpzdHJpbmcmIGNvbnRlbnRUeXBlLCBzdGQ6OnN0cmluZyYg
bXVsdGlwYXJ0Qm91bmRhcnkpCit7CisgICAgc2l6ZV90IGJvdW5kYXJ5U3RhcnRPZmZzZXQgPSBj
b250ZW50VHlwZS5maW5kKCJib3VuZGFyeT0iKTsKKyAgICBpZiAoYm91bmRhcnlTdGFydE9mZnNl
dCA9PSBzdGQ6OnN0cmluZzo6bnBvcykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgYm91
bmRhcnlTdGFydE9mZnNldCArPSBzdHJsZW4oImJvdW5kYXJ5PSIpOworICAgIHNpemVfdCBib3Vu
ZGFyeUVuZE9mZnNldCA9IGNvbnRlbnRUeXBlLmZpbmQoJzsnLCBib3VuZGFyeVN0YXJ0T2Zmc2V0
KTsKKworICAgIGlmIChib3VuZGFyeUVuZE9mZnNldCA9PSBzdGQ6OnN0cmluZzo6bnBvcykKKyAg
ICAgICAgYm91bmRhcnlFbmRPZmZzZXQgPSBjb250ZW50VHlwZS5sZW5ndGgoKTsKKworICAgIHNp
emVfdCBib3VuZGFyeUxlbmd0aCA9IGJvdW5kYXJ5RW5kT2Zmc2V0IC0gYm91bmRhcnlTdGFydE9m
ZnNldDsKKyAgICBtdWx0aXBhcnRCb3VuZGFyeSA9IGNvbnRlbnRUeXBlLnN1YnN0cihib3VuZGFy
eVN0YXJ0T2Zmc2V0LCBib3VuZGFyeUxlbmd0aCk7CisKKyAgICAvLyBUaGUgYnl0ZSByYW5nZSBy
ZXNwb25zZSBjYW4gaGF2ZSBxdW90ZWQgYm91bmRhcnkgc3RyaW5ncy4gVGhpcyBpcyBsZWdhbAor
ICAgIC8vIGFzIHBlciBNSU1FIHNwZWNpZmljYXRpb25zLiBJbmRpdmlkdWFsIGRhdGEgZnJhZ2Vt
ZW50cyBob3dldmVyIGRvbid0CisgICAgLy8gY29udGFpbiBxdW90ZWQgYm91bmRhcnkgc3RyaW5n
cy4KKyAgICB0cmltU3RyaW5nKG11bHRpcGFydEJvdW5kYXJ5LCAiXCIiLCBUUklNX0FMTCwgbXVs
dGlwYXJ0Qm91bmRhcnkpOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIE11bHRpcGFydFJl
c3BvbnNlRGVsZWdhdGU6Om9uUmVjZWl2ZWREYXRhKGNvbnN0IGNoYXIqIGRhdGEsCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGgsCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlbmNvZGVkRGF0
YUxlbmd0aCkKK3sKKyAgICAvLyBtX3N0b3BTZW5kaW5nIG1lYW5zIHRoYXQgd2UndmUgYWxyZWFk
eSByZWNlaXZlZCB0aGUgZmluYWwgYm91bmRhcnkgdG9rZW4uCisgICAgLy8gVGhlIHNlcnZlciBz
aG91bGQgc3RvcCBzZW5kaW5nIHVzIGRhdGEgYXQgdGhpcyBwb2ludCwgYnV0IGlmIGl0IGRvZXMs
IHdlCisgICAgLy8ganVzdCB0aHJvdyBpdCBhd2F5LgorICAgIGlmIChtX3N0b3BTZW5kaW5nKQor
ICAgICAgICByZXR1cm47CisKKyAgICBtX2RhdGEuYXBwZW5kKGRhdGEsIGxlbmd0aCk7CisgICAg
bV9lbmNvZGVkRGF0YUxlbmd0aCArPSBlbmNvZGVkRGF0YUxlbmd0aDsKKyAgICBpZiAobV9maXJz
dFJlY2VpdmVkRGF0YSkgeworICAgICAgICAvLyBTb21lIHNlcnZlcnMgZG9uJ3Qgc2VuZCBhIGJv
dW5kYXJ5IHRva2VuIGJlZm9yZSB0aGUgZmlyc3QgY2h1bmsgb2YKKyAgICAgICAgLy8gZGF0YS4g
V2UgaGFuZGxlIHRoaXMgY2FzZSBhbnl3YXkgKEdlY2tvIGRvZXMgdG9vKS4KKyAgICAgICAgbV9m
aXJzdFJlY2VpdmVkRGF0YSA9IGZhbHNlOworCisgICAgICAgIC8vIEVhdCBsZWFkaW5nIFxyXG4K
KyAgICAgICAgaW50IHBvcyA9IHB1c2hPdmVyTGluZShtX2RhdGEsIDApOworICAgICAgICBpZiAo
cG9zKQorICAgICAgICAgICAgbV9kYXRhID0gbV9kYXRhLnN1YnN0cihwb3MpOworCisgICAgICAg
IGlmIChtX2RhdGEubGVuZ3RoKCkgPCBtX2JvdW5kYXJ5Lmxlbmd0aCgpICsgMikgeworICAgICAg
ICAgICAgLy8gV2UgZG9uJ3QgaGF2ZSBlbm91Z2ggZGF0YSB5ZXQgdG8gbWFrZSBhIGJvdW5kYXJ5
IHRva2VuLiBKdXN0IHdhaXQKKyAgICAgICAgICAgIC8vIHVudGlsIHRoZSBuZXh0IGNodW5rIG9m
IGRhdGEgYXJyaXZlcy4KKyAgICAgICAgICAgIG1fZmlyc3RSZWNlaXZlZERhdGEgPSB0cnVlOwor
ICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1fZGF0YS5jb21w
YXJlKDAsIG1fYm91bmRhcnkubGVuZ3RoKCksIG1fYm91bmRhcnkpKQorICAgICAgICAgICAgbV9k
YXRhID0gbV9ib3VuZGFyeSArICJcbiIgKyBtX2RhdGE7CisgICAgfQorCisgICAgLy8gSGVhZGVy
cworICAgIGlmIChtX3Byb2Nlc3NpbmdIZWFkZXJzKSB7CisgICAgICAgIC8vIEVhdCBsZWFkaW5n
IFxyXG4KKyAgICAgICAgaW50IHBvcyA9IHB1c2hPdmVyTGluZShtX2RhdGEsIDApOworICAgICAg
ICBpZiAocG9zKQorICAgICAgICAgICAgbV9kYXRhID0gbV9kYXRhLnN1YnN0cihwb3MpOworCisg
ICAgICAgIGlmIChwYXJzZUhlYWRlcnMoKSkgeworICAgICAgICAgICAgLy8gU3VjY2Vzc2Z1bGx5
IHBhcnNlZCBoZWFkZXJzLgorICAgICAgICAgICAgbV9wcm9jZXNzaW5nSGVhZGVycyA9IGZhbHNl
OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gR2V0IG1vcmUgZGF0YSBiZWZvcmUg
dHJ5aW5nIGFnYWluLgorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisg
ICAgc2l6ZV90IGJvdW5kYXJ5UG9zaXRpb247CisgICAgd2hpbGUgKChib3VuZGFyeVBvc2l0aW9u
ID0gZmluZEJvdW5kYXJ5KCkpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIGlmICht
X3Jlc291cmNlSGFuZGxlICYmICBtX3Jlc291cmNlSGFuZGxlLT5jbGllbnQoKSkgeworICAgICAg
ICAgICAgLy8gU3RyaXAgb3V0IHRyYWlsaW5nIFxuXHIgY2hhcmFjdGVycyBpbiB0aGUgYnVmZmVy
IHByZWNlZGluZyB0aGUKKyAgICAgICAgICAgIC8vIGJvdW5kYXJ5IG9uIHRoZSBzYW1lIGxpbmVz
IGFzIEZpcmVmb3guCisgICAgICAgICAgICBpbnQgZGF0YUxlbmd0aCA9IGJvdW5kYXJ5UG9zaXRp
b247CisgICAgICAgICAgICBpZiAoYm91bmRhcnlQb3NpdGlvbiA+IDAgJiYgbV9kYXRhW2JvdW5k
YXJ5UG9zaXRpb24gLSAxXSA9PSAnXG4nKSB7CisgICAgICAgICAgICAgICAgZGF0YUxlbmd0aC0t
OworICAgICAgICAgICAgICAgIGlmIChib3VuZGFyeVBvc2l0aW9uID4gMSAmJiBtX2RhdGFbYm91
bmRhcnlQb3NpdGlvbiAtIDJdID09ICdccicpCisgICAgICAgICAgICAgICAgICAgIGRhdGFMZW5n
dGgtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChkYXRhTGVuZ3RoID4gMCkgewor
ICAgICAgICAgICAgICAgIC8vIFNlbmQgdGhlIGxhc3QgZGF0YSBjaHVuay4KKyAgICAgICAgICAg
ICAgICBtX3Jlc291cmNlSGFuZGxlLT5jbGllbnQoKS0+ZGlkUmVjZWl2ZURhdGEobV9yZXNvdXJj
ZUhhbmRsZS5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgbV9kYXRhLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUxlbmd0aCwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9lbmNv
ZGVkRGF0YUxlbmd0aCk7CisgICAgICAgICAgICAgICAgbV9lbmNvZGVkRGF0YUxlbmd0aCA9IDA7
CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc2l6ZV90IGJvdW5kYXJ5RW5kUG9z
aXRpb24gPSBib3VuZGFyeVBvc2l0aW9uICsgbV9ib3VuZGFyeS5sZW5ndGgoKTsKKyAgICAgICAg
aWYgKGJvdW5kYXJ5RW5kUG9zaXRpb24gPCBtX2RhdGEubGVuZ3RoKCkgJiYgJy0nID09IG1fZGF0
YVtib3VuZGFyeUVuZFBvc2l0aW9uXSkgeworICAgICAgICAgICAgLy8gVGhpcyB3YXMgdGhlIGxh
c3QgYm91bmRhcnkgc28gd2UgY2FuIHN0b3AgcHJvY2Vzc2luZy4KKyAgICAgICAgICAgIG1fc3Rv
cFNlbmRpbmcgPSB0cnVlOworICAgICAgICAgICAgbV9kYXRhLmNsZWFyKCk7CisgICAgICAgICAg
ICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBXZSBjYW4gbm93IHRocm93IG91dCBk
YXRhIHVwIHRocm91Z2ggdGhlIGJvdW5kYXJ5CisgICAgICAgIGludCBvZmZzZXQgPSBwdXNoT3Zl
ckxpbmUobV9kYXRhLCBib3VuZGFyeUVuZFBvc2l0aW9uKTsKKyAgICAgICAgbV9kYXRhID0gbV9k
YXRhLnN1YnN0cihib3VuZGFyeUVuZFBvc2l0aW9uICsgb2Zmc2V0KTsKKworICAgICAgICAvLyBP
aywgYmFjayB0byBwYXJzaW5nIGhlYWRlcnMKKyAgICAgICAgaWYgKCFwYXJzZUhlYWRlcnMoKSkg
eworICAgICAgICAgICAgbV9wcm9jZXNzaW5nSGVhZGVycyA9IHRydWU7CisgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEF0IHRoaXMgcG9pbnQsIHdlIHNob3Vs
ZCBzZW5kIG92ZXIgYW55IGRhdGEgd2UgaGF2ZSwgYnV0IGtlZXAgZW5vdWdoIGRhdGEKKyAgICAv
LyBidWZmZXJlZCB0byBoYW5kbGUgYSBib3VuZGFyeSB0aGF0IG1heSBoYXZlIGJlZW4gdHJ1bmNh
dGVkLgorICAgIGlmICghbV9wcm9jZXNzaW5nSGVhZGVycyAmJiBtX2RhdGEubGVuZ3RoKCkgPiBt
X2JvdW5kYXJ5Lmxlbmd0aCgpKSB7CisgICAgICAgIC8vIElmIHRoZSBsYXN0IGNoYXJhY3RlciBp
cyBhIG5ldyBsaW5lIGNoYXJhY3RlciwgZ28gYWhlYWQgYW5kIGp1c3Qgc2VuZAorICAgICAgICAv
LyBldmVyeXRoaW5nIHdlIGhhdmUgYnVmZmVyZWQuIFRoaXMgbWF0Y2hlcyBhbiBvcHRpbWl6YXRp
b24gaW4gR2Vja28uCisgICAgICAgIGludCBzZW5kTGVuZ3RoID0gbV9kYXRhLmxlbmd0aCgpIC0g
bV9ib3VuZGFyeS5sZW5ndGgoKTsKKyAgICAgICAgaWYgKG1fZGF0YVttX2RhdGEubGVuZ3RoKCkg
LSAxXSA9PSAnXG4nKQorICAgICAgICAgICAgc2VuZExlbmd0aCA9IG1fZGF0YS5sZW5ndGgoKTsK
KyAgICAgICAgaWYgKG1fcmVzb3VyY2VIYW5kbGUgJiYgbV9yZXNvdXJjZUhhbmRsZS0+Y2xpZW50
KCkpCisgICAgICAgICAgICBtX3Jlc291cmNlSGFuZGxlLT5jbGllbnQoKS0+ZGlkUmVjZWl2ZURh
dGEobV9yZXNvdXJjZUhhbmRsZS5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBtX2RhdGEuZGF0YSgpLAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRMZW5ndGgsCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9lbmNv
ZGVkRGF0YUxlbmd0aCk7CisgICAgICAgIG1fZGF0YSA9IG1fZGF0YS5zdWJzdHIoc2VuZExlbmd0
aCk7CisgICAgICAgIG1fZW5jb2RlZERhdGFMZW5ndGggPSAwOworICAgIH0KK30KKwordm9pZCBN
dWx0aXBhcnRSZXNwb25zZURlbGVnYXRlOjpvbkNvbXBsZXRlZFJlcXVlc3QoKQoreworICAgIC8v
IElmIHdlIGhhdmUgYW55IHBlbmRpbmcgZGF0YSBhbmQgd2UncmUgbm90IGluIGEgaGVhZGVyLCBn
byBhaGVhZCBhbmQgc2VuZAorICAgIC8vIGl0IHRvIFdlYkNvcmUuCisgICAgaWYgKCFtX3Byb2Nl
c3NpbmdIZWFkZXJzICYmICFtX2RhdGEuZW1wdHkoKSAmJiAhbV9zdG9wU2VuZGluZyAmJiBtX3Jl
c291cmNlSGFuZGxlICYmIG1fcmVzb3VyY2VIYW5kbGUtPmNsaWVudCgpKSB7CisgICAgICAgIG1f
cmVzb3VyY2VIYW5kbGUtPmNsaWVudCgpLT5kaWRSZWNlaXZlRGF0YShtX3Jlc291cmNlSGFuZGxl
LmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgbV9kYXRhLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIG1fZGF0YS5sZW5ndGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIG1fZW5jb2RlZERhdGFMZW5ndGgpOworICAgICAgICBt
X2VuY29kZWREYXRhTGVuZ3RoID0gMDsKKyAgICB9Cit9CisKK2Jvb2wgTXVsdGlwYXJ0UmVzcG9u
c2VEZWxlZ2F0ZTo6cGFyc2VIZWFkZXJzKCkKK3sKKyAgICBpbnQgbGluZUZlZWRJbmNyZW1lbnQg
PSAxOworCisgICAgLy8gR3JhYiB0aGUgaGVhZGVycyBiZWluZyBsaWJlcmFsIGFib3V0IGxpbmUg
ZW5kaW5ncy4KKyAgICBzaXplX3QgbGluZVN0YXJ0UG9zaXRpb24gPSAwOworICAgIHNpemVfdCBs
aW5lRW5kUG9zaXRpb24gPSBtX2RhdGEuZmluZCgnXG4nKTsKKyAgICB3aGlsZSAobGluZUVuZFBv
c2l0aW9uICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIC8vIEhhbmRsZSBDUkxGCisg
ICAgICAgIGlmIChsaW5lRW5kUG9zaXRpb24gPiBsaW5lU3RhcnRQb3NpdGlvbiAmJiBtX2RhdGFb
bGluZUVuZFBvc2l0aW9uIC0gMV0gPT0gJ1xyJykgeworICAgICAgICAgICAgbGluZUZlZWRJbmNy
ZW1lbnQgPSAyOworICAgICAgICAgICAgLS1saW5lRW5kUG9zaXRpb247CisgICAgICAgIH0gZWxz
ZQorICAgICAgICAgICAgbGluZUZlZWRJbmNyZW1lbnQgPSAxOworCisgICAgICAgIGlmIChsaW5l
U3RhcnRQb3NpdGlvbiA9PSBsaW5lRW5kUG9zaXRpb24pIHsKKyAgICAgICAgICAgIC8vIEEgYmxh
bmsgbGluZSwgZW5kIG9mIGhlYWRlcnMKKyAgICAgICAgICAgIGxpbmVFbmRQb3NpdGlvbiArPSBs
aW5lRmVlZEluY3JlbWVudDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAg
IC8vIEZpbmQgdGhlIG5leHQgaGVhZGVyIGxpbmUuCisgICAgICAgIGxpbmVTdGFydFBvc2l0aW9u
ID0gbGluZUVuZFBvc2l0aW9uICsgbGluZUZlZWRJbmNyZW1lbnQ7CisgICAgICAgIGxpbmVFbmRQ
b3NpdGlvbiA9IG1fZGF0YS5maW5kKCdcbicsIGxpbmVTdGFydFBvc2l0aW9uKTsKKyAgICB9Cisg
ICAgLy8gVHJ1bmNhdGVkIGluIHRoZSBtaWRkbGUgb2YgYSBoZWFkZXIsIHN0b3AgcGFyc2luZy4K
KyAgICBpZiAobGluZUVuZFBvc2l0aW9uID09IHN0ZDo6c3RyaW5nOjpucG9zKQorICAgICAgICBy
ZXR1cm4gZmFsc2U7CisKKyAgICAvLyBFYXQgaGVhZGVycworICAgIHN0ZDo6c3RyaW5nIGhlYWRl
cnMoIlxuIik7CisgICAgaGVhZGVycy5hcHBlbmQobV9kYXRhLCAwLCBsaW5lRW5kUG9zaXRpb24p
OworICAgIG1fZGF0YSA9IG1fZGF0YS5zdWJzdHIobGluZUVuZFBvc2l0aW9uKTsKKworICAgIC8v
IENyZWF0ZSBhIFdlYlVSTFJlc3BvbnNlIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCBzZXQgb2YgaGVh
ZGVycyArIHRoZQorICAgIC8vIHJlcGxhY2VtZW50IGhlYWRlcnMuIFdlIG9ubHkgcmVwbGFjZSB0
aGUgc2FtZSBmZXcgaGVhZGVycyB0aGF0IGdlY2tvCisgICAgLy8gZG9lcy4gU2VlIG5ldHdlcmsv
c3RyZWFtY29udi9jb252ZXJ0ZXJzL25zTXVsdGlNaXhlZENvbnYuY3BwLgorCisgICAgc3RkOjpz
dHJpbmcgY29udGVudFR5cGUgPSBnZXRTcGVjaWZpY0hlYWRlcihoZWFkZXJzLCAiY29udGVudC10
eXBlIik7CisgICAgc3RkOjpzdHJpbmcgbWltZVR5cGU7CisgICAgc3RkOjpzdHJpbmcgY2hhcnNl
dDsKKyAgICBib29sIGhhc0NoYXJzZXQgPSBmYWxzZTsKKworICAgIHBhcnNlQ29udGVudFR5cGUo
Y29udGVudFR5cGUsIG1pbWVUeXBlLCBjaGFyc2V0LCBoYXNDaGFyc2V0KTsKKyAgICBSZXNvdXJj
ZVJlc3BvbnNlIHJlc3BvbnNlOworICAgIHJlc3BvbnNlLnNldFVSTChtX29yaWdpbmFsUmVzcG9u
c2UudXJsKCkpOworICAgIHJlc3BvbnNlLnNldE1pbWVUeXBlKFN0cmluZzo6ZnJvbVVURjgobWlt
ZVR5cGUuZGF0YSgpKSk7CisgICAgaWYgKGhhc0NoYXJzZXQpCisgICAgICAgIHJlc3BvbnNlLnNl
dFRleHRFbmNvZGluZ05hbWUoU3RyaW5nOjpmcm9tVVRGOChjaGFyc2V0LmRhdGEoKSkpOworCisg
ICAgY29uc3QgV2ViQ29yZTo6SFRUUEhlYWRlck1hcCYgbWFwID0gbV9vcmlnaW5hbFJlc3BvbnNl
Lmh0dHBIZWFkZXJGaWVsZHMoKTsKKyAgICBmb3IgKFdlYkNvcmU6OkhUVFBIZWFkZXJNYXA6OmNv
bnN0X2l0ZXJhdG9yIGl0ID0gbWFwLmJlZ2luKCk7IGl0ICE9IG1hcC5lbmQoKTsgKytpdCkgewor
ICAgICAgICBib29sIG5lZWRzQWRkID0gdHJ1ZTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7
IGkgPCBhcnJheXNpemUoUmVwbGFjZUhlYWRlcnMpOyArK2kpIHsKKyAgICAgICAgICAgIGlmIChp
dC0+Zmlyc3QubG93ZXIoKSA9PSBSZXBsYWNlSGVhZGVyc1tpXSkgeworICAgICAgICAgICAgICAg
IG5lZWRzQWRkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9
CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5lZWRzQWRkKQorICAgICAgICAgICAgcmVzcG9uc2Uu
c2V0SFRUUEhlYWRlckZpZWxkKGl0LT5maXJzdCwgaXQtPnNlY29uZCk7CisgICAgfQorCisgICAg
Zm9yIChzaXplX3QgaSA9IDA7IGkgPCBhcnJheXNpemUoUmVwbGFjZUhlYWRlcnMpOyArK2kpIHsK
KyAgICAgICAgc3RkOjpzdHJpbmcgbmFtZShSZXBsYWNlSGVhZGVyc1tpXSk7CisgICAgICAgIHN0
ZDo6c3RyaW5nIHZhbHVlID0gZ2V0U3BlY2lmaWNIZWFkZXIoaGVhZGVycywgbmFtZSk7CisgICAg
ICAgIGlmICghdmFsdWUuZW1wdHkoKSkgeworICAgICAgICAgICAgcmVzcG9uc2Uuc2V0SFRUUEhl
YWRlckZpZWxkKFN0cmluZzo6ZnJvbVVURjgobmFtZS5kYXRhKCkpLAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzo6ZnJvbVVURjgodmFsdWUuZGF0YSgpKSk7
CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobV9yZXNvdXJjZUhhbmRsZSAmJiBtX3Jlc291
cmNlSGFuZGxlLT5jbGllbnQoKSkgeworICAgICAgICAvLyBBZnRlciBwYXJzZWQgdGhlIGhlYWRl
cnMgc3VjY2Vzc2Z1bGx5LCB0aGUgbXVsdGlwYXJ0IHBhZ2VzIHdpbGwgbm90IGJlIHN0b3JlZCBp
biBwYWdlCisgICAgICAgIC8vIGNhY2hlIGFueSBtb3JlLCBiZWNhdXNlIGdvIGJhY2svZm9yd2Fy
ZCBhY3Rpb25zIG5lZWQgZ2V0dGluZyB0aGUgbGF0ZXN0IGRhdGEgZnJvbSBzZXJ2ZXIuCisgICAg
ICAgIHJlc3BvbnNlLnNldElzTXVsdGlwYXJ0UGF5bG9hZCh0cnVlKTsKKyAgICAgICAgbV9yZXNv
dXJjZUhhbmRsZS0+Y2xpZW50KCktPmRpZFJlY2VpdmVSZXNwb25zZShtX3Jlc291cmNlSGFuZGxl
LmdldCgpLCByZXNwb25zZSk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvLyBCb3Vu
ZGFyaWVzIGFyZSBzdXBwb3NlZCB0byBiZSBwcmVjZWVkZWQgd2l0aCAtLSwgYnV0IGl0IGxvb2tz
IGxpa2UgZ2Vja28KKy8vIGRvZXNuJ3QgcmVxdWlyZSB0aGUgZGFzaGVzIHRvIGV4aXN0LiBTZWUg
bnNNdWx0aU1peGVkQ29udjo6RmluZFRva2VuLgorc2l6ZV90IE11bHRpcGFydFJlc3BvbnNlRGVs
ZWdhdGU6OmZpbmRCb3VuZGFyeSgpCit7CisgICAgc2l6ZV90IGJvdW5kYXJ5UG9zaXRpb24gPSBt
X2RhdGEuZmluZChtX2JvdW5kYXJ5KTsKKyAgICBpZiAoYm91bmRhcnlQb3NpdGlvbiAhPSBzdGQ6
OnN0cmluZzo6bnBvcykgeworICAgICAgICAvLyBCYWNrIHVwIG92ZXIgLS0gZm9yIGJhY2t3YXJk
cyBjb21wYXQKKyAgICAgICAgLy8gRklYTUUodGMpOiBEb24ndCB3ZSBvbmx5IHdhbnQgdG8gZG8g
dGhpcyBvbmNlPyBHZWNrbyBjb2RlIGRvZXNuJ3Qgc2VlbQorICAgICAgICAvLyB0byBjYXJlLgor
ICAgICAgICBpZiAoYm91bmRhcnlQb3NpdGlvbiA+PSAyKSB7CisgICAgICAgICAgICBpZiAoJy0n
ID09IG1fZGF0YVtib3VuZGFyeVBvc2l0aW9uIC0gMV0gJiYgJy0nID09IG1fZGF0YVtib3VuZGFy
eVBvc2l0aW9uIC0gMl0pIHsKKyAgICAgICAgICAgICAgICBib3VuZGFyeVBvc2l0aW9uIC09IDI7
CisgICAgICAgICAgICAgICAgbV9ib3VuZGFyeSA9ICItLSIgKyBtX2JvdW5kYXJ5OworICAgICAg
ICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBib3VuZGFyeVBvc2l0aW9uOwor
fQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvTXVsdGlwYXJ0UmVzcG9uc2VEZWxlZ2F0ZS5oIGIv
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9ibGFja2JlcnJ5L011bHRpcGFydFJlc3Bv
bnNlRGVsZWdhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi41ZDk1YWJhOGVmMTZjMjU3NmZmNGQ5Y2M1NjFkY2E2
MzAwMzYzMjNkCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0
d29yay9ibGFja2JlcnJ5L011bHRpcGFydFJlc3BvbnNlRGVsZWdhdGUuaApAQCAtMCwwICsxLDEx
NCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDExIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgorLy8gTW9zdCBvZiBsb2dpYyBhbmQgZnVuY3Rpb25zIGFyZSBi
YXNlIG9uIENocm9taXVtIGJyb3dzZXIncyBpbXBsZW1hbnRpb25zIGluCisvLyB3ZWJraXQvZ2x1
ZS9tdWx0aXBhcnRfcmVzcG9uc2VfZGVsZWdhdGUuY2MKKworCisvLyBDb3B5cmlnaHQgKGMpIDIw
MDYtMjAwOSBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVz
ZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2Ug
dGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisvLworLy8gQSBkZWxl
Z2F0ZSBjbGFzcyBvZiBXZWJVUkxMb2FkZXJJbXBsIHRoYXQgaGFuZGxlcyBtdWx0aXBhcnQveC1t
aXhlZC1yZXBsYWNlCisvLyBkYXRhLiBXZSBzcGVjaWFsIGNhc2UgbXVsdGlwYXJ0L3gtbWl4ZWQt
cmVwbGFjZSBiZWNhdXNlIFdlYkNvcmUgZXhwZWN0cyBhCisvLyBzZXBhcmF0ZSBkaWRSZWNlaXZl
UmVzcG9uc2UgZm9yIGVhY2ggbmV3IG1lc3NhZ2UgcGFydC4KKy8vCisvLyBNb3N0IG9mIHRoZSBs
b2dpYyBhbmQgZWRnZSBjYXNlIGhhbmRsaW5nIGFyZSBiYXNlZCBvbiB0aGUgTW96aWxsYSdzCisv
LyBpbXBsZW1lbnRhdGlvbiBpbiBuZXR3ZXJrL3N0cmVhbWNvbnYvY29udmVydGVycy9uc011bHRp
TWl4ZWRDb252LmNwcC4KKy8vIFRoaXMgc2VlbXMgbGlrZSBhIGRlcml2YXRpdmUgd29yaywgc28g
aGVyZSdzIHRoZSBvcmlnaW5hbCBsaWNlbnNlOgorCisvKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJM
T0NLICoqKioqCisgKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKKyAqCisgKiBU
aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1Ymxp
YyBMaWNlbnNlIFZlcnNpb24KKyAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVz
ZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuIFlv
dSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogaHR0cDovL3d3dy5tb3pp
bGxhLm9yZy9NUEwvCisgKgorICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vu
c2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKKyAqIFdJVEhPVVQgV0FSUkFO
VFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5z
ZQorICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1p
dGF0aW9ucyB1bmRlciB0aGUKKyAqIExpY2Vuc2UuCisgKgorICogVGhlIE9yaWdpbmFsIENvZGUg
aXMgbW96aWxsYS5vcmcgY29kZS4KKyAqCisgKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhl
IE9yaWdpbmFsIENvZGUgaXMKKyAqIE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9u
LgorICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHly
aWdodCAoQykgMTk5OAorICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2Vy
dmVkLgorICoKKyAqIENvbnRyaWJ1dG9yKHMpOgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoZSBj
b250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBl
aXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAo
dGhlICJHUEwiKSwgb3IKKyAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ug
VmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAorICogaW4gd2hpY2ggY2FzZSB0aGUg
cHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQK
KyAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJz
aW9uIG9mIHRoaXMgZmlsZSBvbmx5CisgKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBH
UEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCisgKiB1c2UgeW91ciB2
ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUg
eW91cgorICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJl
cGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKKyAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVp
cmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCisgKiB0aGUg
cHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhp
cyBmaWxlIHVuZGVyCisgKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BM
IG9yIHRoZSBMR1BMLgorICoKKyAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCisK
KyNpZm5kZWYgTXVsdGlwYXJ0UmVzcG9uc2VEZWxlZ2F0ZV9oCisjZGVmaW5lIE11bHRpcGFydFJl
c3BvbnNlRGVsZWdhdGVfaAorCisjaW5jbHVkZSAiUmVzb3VyY2VIYW5kbGUuaCIKKyNpbmNsdWRl
ICJSZXNvdXJjZVJlc3BvbnNlLmgiCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgV2Vi
Q29yZSB7CisKK2NsYXNzIE11bHRpcGFydFJlc3BvbnNlRGVsZWdhdGUgeworcHVibGljOgorICAg
IE11bHRpcGFydFJlc3BvbnNlRGVsZWdhdGUoUGFzc1JlZlB0cjxSZXNvdXJjZUhhbmRsZT4gcmVz
b3VjZUhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlc291cmNl
UmVzcG9uc2UmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJp
bmcmIGJvdW5kYXJ5KTsKKyAgICBzdGF0aWMgYm9vbCByZWFkTXVsdGlwYXJ0Qm91bmRhcnkoY29u
c3Qgc3RkOjpzdHJpbmcmIGNvbnRlbnRUeXBlLCBzdGQ6OnN0cmluZyYgbXVsdGlwYXJ0Qm91bmRh
cnkpOworICAgIHZvaWQgb25SZWNlaXZlZERhdGEoY29uc3QgY2hhciogZGF0YSwgaW50IGxlbmd0
aCwgaW50IGVuY29kZWREYXRhTGVuZ3RoKTsKKyAgICB2b2lkIG9uQ29tcGxldGVkUmVxdWVzdCgp
OworCitwcml2YXRlOgorCisgICAgLy8gQ2hlY2tzIHRvIHNlZSBpZiBkYXRhW3Bvc10gY2hhcmFj
dGVyIGlzIGEgbGluZSBicmVhazsgaGFuZGxlcyBjcmxmLCBsZmxmLAorICAgIC8vIGxmLCBvciBj
ci4gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gc2tpcCBvdmVyICgwLCAxIG9y
IDIpLgorCisgICAgLy8gVHJpZXMgdG8gcGFyc2UgaHR0cCBoZWFkZXJzIGZyb20gdGhlIHN0YXJ0
IG9mIGRhdGFfLiBSZXR1cm5zIHRydWUgaWYgaXQKKyAgICAvLyBzdWNjZWVkcyBhbmQgc2VuZHMg
YSBkaWRSZWNlaXZlUmVzcG9uc2UgdG8gbV9jbGllbnQuIFJldHVybnMgZmFsc2UgaWYKKyAgICAv
LyB0aGUgaGVhZGVyIGlzIGluY29tcGxldGUgKGluIHdoaWNoIGNhc2Ugd2UganVzdCB3YWl0IGZv
ciBtb3JlIGRhdGEpLgorICAgIGJvb2wgcGFyc2VIZWFkZXJzKCk7CisKKyAgICAvLyBGaW5kIHRo
ZSBuZXh0IGJvdW5kYXJ5IGluIGRhdGFfLiBSZXR1cm5zIHN0ZDo6c3RyaW5nOjpucG9zIGlmIHRo
ZXJlJ3Mgbm8KKyAgICAvLyBmdWxsIHRva2VuLgorICAgIHNpemVfdCBmaW5kQm91bmRhcnkoKTsK
KworICAgIC8vIE11bHRpcGFydCBib3VuZGFyeSB0b2tlbgorICAgIHN0ZDo6c3RyaW5nIG1fYm91
bmRhcnk7CisKKyAgICAvLyBBIHRlbXBvcmFyeSBidWZmZXIgdG8gaG9sZCBkYXRhIGJldHdlZW4g
cmVhZHMgZm9yIG11bHRpcGFydCBkYXRhIHRoYXQKKyAgICAvLyBnZXRzIHNwbGl0IGluIHRoZSBt
aWRkbGUgb2YgYSBoZWFkZXIuCisgICAgc3RkOjpzdHJpbmcgbV9kYXRhOworCisgICAgaW50IG1f
ZW5jb2RlZERhdGFMZW5ndGg7CisKKyAgICAvLyB0cnVlIHVudGlsIHdlIGdldCBvdXIgZmlyc3Qg
b24gcmVjZWl2ZWQgZGF0YSBjYWxsCisgICAgYm9vbCBtX2ZpcnN0UmVjZWl2ZWREYXRhOworCisg
ICAgLy8gVGhlIG9yaWdpbmFsIHJlc291cmNlIHJlc3BvbnNlIGZvciB0aGlzIHJlcXVlc3QuIFdl
IHVzZSB0aGlzIGFzIGEKKyAgICAvLyBzdGFydGluZyBwb2ludCBmb3IgZWFjaCBwYXJ0cyByZXNw
b25zZS4KKyAgICBjb25zdCBSZXNvdXJjZVJlc3BvbnNlJiBtX29yaWdpbmFsUmVzcG9uc2U7CisK
KyAgICAvLyB0cnVlIGlmIHdlJ3JlIHRydW5jYXRlZCBpbiB0aGUgbWlkZGxlIG9mIGEgaGVhZGVy
CisgICAgYm9vbCBtX3Byb2Nlc3NpbmdIZWFkZXJzOworCisgICAgUmVmUHRyPFJlc291cmNlSGFu
ZGxlPiBtX3Jlc291cmNlSGFuZGxlOworCisgICAgLy8gdHJ1ZSB3aGVuIHdlJ3JlIGRvbmUgc2Vu
ZGluZyBpbmZvcm1hdGlvbi4gQXQgdGhhdCBwb2ludCwgd2Ugc3RvcAorICAgIC8vIHByb2Nlc3Np
bmcgQWRkRGF0YSByZXF1ZXN0cy4KKyAgICBib29sIG1fc3RvcFNlbmRpbmc7Cit9OworCit9IC8v
IG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBNdWx0aXBhcnRSZXNwb25zZURlbGVnYXRl
X2gK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>118314</attachid>
            <date>2011-12-07 19:56:45 -0800</date>
            <delta_ts>2011-12-07 19:59:03 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-73533-20111208115641.patch</filename>
            <type>text/plain</type>
            <size>28446</size>
            <attacher name="Chris.Guan">logingx</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTAxNTk1CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggNGQxNzVmNzc2Y2E3NWMx
ZTQzNzY5NTVjZDNjOGE5ZmQ4NjU2ZGU2Ny4uMDBkYTEwMmYxOGEyZGY0ODE3YzcyZTgzMmFiZGRm
NDE5MTE3ZWJmMiAxMDA3NTUKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDMxIEBACisyMDExLTEyLTAyICBDaHJp
cyBHdWFuICA8Y2hyaXMuZ3VhbkB0b3JjaG1vYmlsZS5jb20uY24+CisKKyAgICAgICAgVXBzdHJl
YW0gdGhlIEJsYWNrYmVycnkgcG9ydGluZyBvZiBtdWx0aXBhcnQgZGVsZWdhdGUKKyAgICAgICAg
aHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTczNTMzCisKKyAgICAgICAg
UmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgVGVzdCBjYXNlczoKKyAgICAg
ICAgaHR0cDovL2F2aHMuYXhpcy5jb20KKworICAgICAgICAqIHBsYXRmb3JtL25ldHdvcmsvYmxh
Y2tiZXJyeS9NdWx0aXBhcnRSZXNwb25zZURlbGVnYXRlLmNwcDogQWRkZWQuCisgICAgICAgIChX
ZWJDb3JlOjpjb21wYXJlQ2hhcik6CisgICAgICAgIChXZWJDb3JlOjpzdHJpbmdUb0xvd2VyQVND
SUkpOgorICAgICAgICAoV2ViQ29yZTo6dHJpbVN0cmluZyk6CisgICAgICAgIChXZWJDb3JlOjpn
ZXRTcGVjaWZpY0hlYWRlcik6CisgICAgICAgIChXZWJDb3JlOjpsb3dlckNhc2VFcXVhbHNBU0NJ
SSk6CisgICAgICAgIChXZWJDb3JlOjpmaW5kU3RyaW5nRW5kKToKKyAgICAgICAgKFdlYkNvcmU6
OmZpbmREZWxpbWl0ZXIpOgorICAgICAgICAoV2ViQ29yZTo6cGFyc2VDb250ZW50VHlwZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpwdXNoT3ZlckxpbmUpOgorICAgICAgICAoV2ViQ29yZTo6TXVsdGlw
YXJ0UmVzcG9uc2VEZWxlZ2F0ZTo6TXVsdGlwYXJ0UmVzcG9uc2VEZWxlZ2F0ZSk6CisgICAgICAg
IChXZWJDb3JlOjpNdWx0aXBhcnRSZXNwb25zZURlbGVnYXRlOjpyZWFkTXVsdGlwYXJ0Qm91bmRh
cnkpOgorICAgICAgICAoV2ViQ29yZTo6TXVsdGlwYXJ0UmVzcG9uc2VEZWxlZ2F0ZTo6b25SZWNl
aXZlZERhdGEpOgorICAgICAgICAoV2ViQ29yZTo6TXVsdGlwYXJ0UmVzcG9uc2VEZWxlZ2F0ZTo6
b25Db21wbGV0ZWRSZXF1ZXN0KToKKyAgICAgICAgKFdlYkNvcmU6Ok11bHRpcGFydFJlc3BvbnNl
RGVsZWdhdGU6OnBhcnNlSGVhZGVycyk6CisgICAgICAgIChXZWJDb3JlOjpNdWx0aXBhcnRSZXNw
b25zZURlbGVnYXRlOjpmaW5kQm91bmRhcnkpOgorICAgICAgICAqIHBsYXRmb3JtL25ldHdvcmsv
YmxhY2tiZXJyeS9NdWx0aXBhcnRSZXNwb25zZURlbGVnYXRlLmg6IEFkZGVkLgorCiAyMDExLTEx
LTMwICBUYWthc2hpIFRveW9zaGltYSAgPHRveW9zaGltQGNocm9taXVtLm9yZz4KIAogICAgICAg
ICBBZGQgT1ZFUlJJREUgdG8gV2ViU29ja2V0IHJlbGF0ZWQgc291cmNlcyBmb3Igc2FmZSBpbmhl
cml0YW5jZXMuCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2Js
YWNrYmVycnkvTXVsdGlwYXJ0UmVzcG9uc2VEZWxlZ2F0ZS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvTXVsdGlwYXJ0UmVzcG9uc2VEZWxlZ2F0ZS5jcHAK
bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMC4uODc1MjEyNDIyZjA3NzYyYWE5ODFhNTljNDc1ZTU5ZTBlOTJiNjg0ZAotLS0g
L2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvYmxhY2tiZXJy
eS9NdWx0aXBhcnRSZXNwb25zZURlbGVnYXRlLmNwcApAQCAtMCwwICsxLDU1MiBAQAorLy8gQ29w
eXJpZ2h0IChDKSAyMDExIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwOCBUaGUgQ2hyb21pdW0gQXV0aG9y
cy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdv
dmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRo
ZSBMSUNFTlNFIGZpbGUuCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJNdWx0aXBh
cnRSZXNwb25zZURlbGVnYXRlLmgiCisKKyNpbmNsdWRlICJSZXNvdXJjZUhhbmRsZUNsaWVudC5o
IgorI2luY2x1ZGUgPHd0Zi9BU0NJSUNUeXBlLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKwor
Ly8gVGhhdCBnY2Mgd2FudHMgYm90aCBvZiB0aGVzZSBwcm90b3R5cGVzIHNlZW1zIG15c3Rlcmlv
dXMuIFZDLCBmb3IKKy8vIGl0cyBwYXJ0LCBjYW4ndCBkZWNpZGUgd2hpY2ggdG8gdXNlIChhbm90
aGVyIG15c3RlcnkpLiBNYXRjaGluZyBvZgorLy8gdGVtcGxhdGUgb3ZlcmxvYWRzOiB0aGUgZmlu
YWwgZnJvbnRpZXIuCisjaWZuZGVmIF9NU0NfVkVSCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc2l6
ZV90IE4+CitjaGFyICgmQXJyYXlTaXplSGVscGVyKGNvbnN0IFQgKCZhcnJheSlbTl0pKVtOXTsK
KyNlbmRpZgorCisjZGVmaW5lIGFycmF5c2l6ZShhcnJheSkgKHNpemVvZihBcnJheVNpemVIZWxw
ZXIoYXJyYXkpKSkKKworLy8gVGhlIGxpc3Qgb2YgcmVzcG9uc2UgaGVhZGVycyB0aGF0IHdlIGRv
IG5vdCBjb3B5IGZyb20gdGhlIG9yaWdpbmFsCisvLyByZXNwb25zZSB3aGVuIGdlbmVyYXRpbmcg
YSByZXNwb3NlLgorc3RhdGljIGNvbnN0IGNoYXIqIFJlcGxhY2VIZWFkZXJzW10gPSB7CisgICAg
ImNvbnRlbnQtdHlwZSIsCisgICAgImNvbnRlbnQtbGVuZ3RoIiwKKyAgICAiY29udGVudC1kaXNw
b3NpdGlvbiIsCisgICAgImNvbnRlbnQtcmFuZ2UiLAorICAgICJyYW5nZSIsCisgICAgInNldC1j
b29raWUiCit9OworCitzdGF0aWMgYm9vbCBjb21wYXJlQ2hhcihjaGFyIHgsIGNoYXIgeSkKK3sK
KyAgICByZXR1cm4gdG9BU0NJSUxvd2VyKHgpID09IHRvQVNDSUlMb3dlcih5KTsKK30KKworc3Rh
dGljIHZvaWQgc3RyaW5nVG9Mb3dlckFTQ0lJKHN0ZDo6c3RyaW5nJiBzKQoreworICAgIGZvciAo
c3RkOjpzdHJpbmc6Oml0ZXJhdG9yIGkgPSBzLmJlZ2luKCk7IGkgIT0gcy5lbmQoKTsgKytpKQor
ICAgICAgICAqaSA9IHRvQVNDSUlMb3dlcigqaSk7Cit9CisKK2VudW0gVFJJTVBPU0lUSU9OUyB7
CisgICAgVFJJTV9OT05FICAgICA9IDAsCisgICAgVFJJTV9MRUFESU5HICA9IDEgPDwgMCwKKyAg
ICBUUklNX1RSQUlMSU5HID0gMSA8PCAxLAorICAgIFRSSU1fQUxMICAgICAgPSBUUklNX0xFQURJ
TkcgfCBUUklNX1RSQUlMSU5HLAorfTsKKworc3RhdGljIFRSSU1QT1NJVElPTlMgdHJpbVN0cmlu
Zyhjb25zdCBzdGQ6OnN0cmluZyYgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBjb25zdCBzdGQ6OnN0cmluZzo6dmFsdWVfdHlwZSB0cmltQ2hhcnNbXSwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIFRSSU1QT1NJVElPTlMgcG9zaXRpb25zLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcmIG91dHB1dCkKK3sKKyAgICAv
LyBGaW5kIHRoZSBlZGdlcyBvZiBsZWFkaW5nL3RyYWlsaW5nIHdoaXRlc3BhY2UgYXMgZGVzaXJl
ZC4KKyAgICBjb25zdCBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGxhc3RDaGFyID0gaW5wdXQubGVu
Z3RoKCkgLSAxOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgZmlyc3RHb29kQ2hh
ciA9IChwb3NpdGlvbnMgJiBUUklNX0xFQURJTkcpID8KKyAgICAgICAgICAgICAgaW5wdXQuZmlu
ZF9maXJzdF9ub3Rfb2YodHJpbUNoYXJzKSA6IDA7CisgICAgY29uc3Qgc3RkOjpzdHJpbmc6OnNp
emVfdHlwZSBsYXN0R29vZENoYXIgPSAocG9zaXRpb25zICYgVFJJTV9UUkFJTElORykgPworICAg
ICAgICAgICAgICBpbnB1dC5maW5kX2xhc3Rfbm90X29mKHRyaW1DaGFycykgOiBsYXN0Q2hhcjsK
KworICAgIC8vIFdoZW4gdGhlIHN0cmluZyB3YXMgYWxsIHdoaXRlc3BhY2UsIHJlcG9ydCB0aGF0
IHdlIHN0cmlwcGVkIG9mZiB3aGl0ZXNwYWNlCisgICAgLy8gZnJvbSB3aGljaGV2ZXIgcG9zaXRp
b24gdGhlIGNhbGxlciB3YXMgaW50ZXJlc3RlZCBpbi4gRm9yIGVtcHR5IGlucHV0LCB3ZQorICAg
IC8vIHN0cmlwcGVkIG5vIHdoaXRlc3BhY2UsIGJ1dCB3ZSBzdGlsbCBuZWVkIHRvIGNsZWFyIHxv
dXRwdXR8LgorICAgIGlmIChpbnB1dC5lbXB0eSgpCisgICAgICAgIHx8IChmaXJzdEdvb2RDaGFy
ID09IHN0ZDo6c3RyaW5nOjpucG9zKQorICAgICAgICB8fCAobGFzdEdvb2RDaGFyID09IHN0ZDo6
c3RyaW5nOjpucG9zKSkgeworICAgICAgICBib29sIGlucHV0V2FzRW1wdHkgPSBpbnB1dC5lbXB0
eSgpOworICAgICAgICBvdXRwdXQuY2xlYXIoKTsKKyAgICAgICAgcmV0dXJuIGlucHV0V2FzRW1w
dHkgPyBUUklNX05PTkUgOiBwb3NpdGlvbnM7CisgICAgfQorCisgICAgLy8gVHJpbSB0aGUgd2hp
dGVzcGFjZS4KKyAgICBvdXRwdXQgPSBpbnB1dC5zdWJzdHIoZmlyc3RHb29kQ2hhciwgbGFzdEdv
b2RDaGFyIC0gZmlyc3RHb29kQ2hhciArIDEpOworCisgICAgLy8gUmV0dXJuIHdoZXJlIHdlIHRy
aW1tZWQgZnJvbS4KKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VFJJTVBPU0lUSU9OUz4oCisgICAg
ICAgICgoIWZpcnN0R29vZENoYXIpID8gVFJJTV9OT05FIDogVFJJTV9MRUFESU5HKQorICAgICAg
ICB8ICgobGFzdEdvb2RDaGFyID09IGxhc3RDaGFyKSA/IFRSSU1fTk9ORSA6IFRSSU1fVFJBSUxJ
TkcpKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgV2hpdGVzcGFjZUFTQ0lJW10gPSB7CisgICAg
Ly8gPGNvbnRyb2wtMDAwOT4gdG8gPGNvbnRyb2wtMDAwRD4KKyAgICAweDA5LAorICAgIDB4MEEs
CisgICAgMHgwQiwKKyAgICAweDBDLAorICAgIDB4MEQsCisgICAgLy8gU3BhY2UKKyAgICAweDIw
LAorICAgIDAKK307CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBnZXRTcGVjaWZpY0hlYWRlcihjb25z
dCBzdGQ6OnN0cmluZyYgaGVhZGVycywgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpCit7CisgICAg
Ly8gV2Ugd2FudCB0byBncmFiIHRoZSBWYWx1ZSBmcm9tIHRoZSAiS2V5OiBWYWx1ZSIgcGFpcnMg
aW4gdGhlIGhlYWRlcnMsCisgICAgLy8gd2hpY2ggc2hvdWxkIGxvb2sgbGlrZSB0aGlzIChubyBs
ZWFkaW5nIHNwYWNlcywgXG4tc2VwYXJhdGVkKSAod2UgZm9ybWF0CisgICAgLy8gdGhlbSB0aGlz
IHdheSBpbiB1cmxfcmVxdWVzdF9pbmV0LmNjKToKKyAgICAvLyAgICBIVFRQLzEuMSAyMDAgT0tc
bgorICAgIC8vICAgIEVUYWc6ICI2ZDBiOC05NDctMjRmMzVlYzAiXG4KKyAgICAvLyAgICBDb250
ZW50LUxlbmd0aDogMjM3NVxuCisgICAgLy8gICAgQ29udGVudC1UeXBlOiB0ZXh0L2h0bWw7IGNo
YXJzZXQ9VVRGLThcbgorICAgIC8vICAgIExhc3QtTW9kaWZpZWQ6IFN1biwgMDMgU2VwIDIwMDYg
MDQ6MzQ6NDMgR01UXG4KKyAgICBpZiAoaGVhZGVycy5lbXB0eSgpKQorICAgICAgICByZXR1cm4g
c3RkOjpzdHJpbmcoKTsKKworICAgIHN0ZDo6c3RyaW5nIG1hdGNoKCdcbicgKyBuYW1lICsgJzon
KTsKKworICAgIHN0ZDo6c3RyaW5nOjpjb25zdF9pdGVyYXRvciBiZWdpbiA9CisgICAgICAgIHN0
ZDo6c2VhcmNoKGhlYWRlcnMuYmVnaW4oKSwgaGVhZGVycy5lbmQoKSwgbWF0Y2guYmVnaW4oKSwg
bWF0Y2guZW5kKCksCisgICAgICAgICAgICAgICAgICAgIGNvbXBhcmVDaGFyKTsKKworICAgIGlm
IChiZWdpbiA9PSBoZWFkZXJzLmVuZCgpKQorICAgICAgICByZXR1cm4gc3RkOjpzdHJpbmcoKTsK
KworICAgIGJlZ2luICs9IG1hdGNoLmxlbmd0aCgpOworICAgIHN0ZDo6c3RyaW5nIHJldDsKKyAg
ICB0cmltU3RyaW5nKHN0ZDo6c3RyaW5nKGJlZ2luLCBmaW5kKGJlZ2luLCBoZWFkZXJzLmVuZCgp
LCAnXG4nKSksIFdoaXRlc3BhY2VBU0NJSSwgVFJJTV9BTEwsIHJldCk7CisgICAgcmV0dXJuIHJl
dDsKK30KKworc3RhdGljIGJvb2wgbG93ZXJDYXNlRXF1YWxzQVNDSUkoc3RkOjpzdHJpbmc6OmNv
bnN0X2l0ZXJhdG9yIGJlZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rk
OjpzdHJpbmc6OmNvbnN0X2l0ZXJhdG9yIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGNvbnN0IGNoYXIqIHMpCit7CisgICAgZm9yIChzdGQ6OnN0cmluZzo6Y29uc3RfaXRl
cmF0b3IgaXQgPSBiZWdpbjsgaXQgIT0gZW5kOyArK2l0LCArK3MpIHsKKyAgICAgICAgaWYgKCEq
cyB8fCB0b0FTQ0lJTG93ZXIoKml0KSAhPSAqcykKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
KyAgICB9CisgICAgcmV0dXJuICEoKnMpOworfQorCitzdGF0aWMgc2l6ZV90IGZpbmRTdHJpbmdF
bmQoY29uc3Qgc3RkOjpzdHJpbmcmIGxpbmUsIHNpemVfdCBzdGFydCwgY2hhciBkZWxpbWl0ZXIp
Cit7CisgICAgY29uc3QgY2hhciBzZXRbXSA9IHsgZGVsaW1pdGVyLCAnXFwnLCAnXDAnIH07Cisg
ICAgZm9yICg7OykgeworICAgICAgICAvLyBzdGFydCBwb2ludHMgdG8gZWl0aGVyIHRoZSBzdGFy
dCBxdW90ZSBvciB0aGUgbGFzdAorICAgICAgICAvLyBlc2NhcGVkIGNoYXIgKHRoZSBjaGFyIGZv
bGxvd2luZyBhICdcXCcpCisKKyAgICAgICAgc2l6ZV90IGVuZCA9IGxpbmUuZmluZF9maXJzdF9v
ZihzZXQsIHN0YXJ0ICsgMSk7CisgICAgICAgIGlmIChlbmQgPT0gc3RkOjpzdHJpbmc6Om5wb3Mp
CisgICAgICAgICAgICByZXR1cm4gbGluZS5sZW5ndGgoKTsKKworICAgICAgICBpZiAobGluZVtl
bmRdID09ICdcXCcpIHsKKyAgICAgICAgICAgIC8vIEhpdCBhIGJhY2tzbGFzaC1lc2NhcGVkIGNo
YXIuIE5lZWQgdG8gc2tpcCBvdmVyIGl0LgorICAgICAgICAgICAgc3RhcnQgPSBlbmQgKyAxOwor
ICAgICAgICAgICAgaWYgKHN0YXJ0ID09IGxpbmUubGVuZ3RoKCkpCisgICAgICAgICAgICAgICAg
cmV0dXJuIHN0YXJ0OworCisgICAgICAgICAgICAvLyBHbyBiYWNrIHRvIGxvb2tpbmcgZm9yIHRo
ZSBuZXh0IGVzY2FwZSBvciB0aGUgc3RyaW5nIGVuZAorICAgICAgICAgICAgY29udGludWU7Cisg
ICAgICAgIH0KKworICAgICAgICByZXR1cm4gZW5kOworICAgIH0KKworICAgIC8vIHNob3VsZCBu
b3QgcmVhY2ggaGVyZQorICAgIHJldHVybiBsaW5lLmxlbmd0aCgpOworfQorCitzdGF0aWMgc2l6
ZV90IGZpbmREZWxpbWl0ZXIoY29uc3Qgc3RkOjpzdHJpbmcmIGxpbmUsIHNpemVfdCBzZWFyY2hT
dGFydCwgY2hhciBkZWxpbWl0ZXIpCit7CisgICAgZG8geworICAgICAgICAvLyBzZWFyY2hTdGFy
dCBwb2ludHMgdG8gdGhlIHNwb3QgZnJvbSB3aGljaCB3ZSBzaG91bGQgc3RhcnQgbG9va2luZwor
ICAgICAgICAvLyBmb3IgdGhlIGRlbGltaXRlci4KKyAgICAgICAgY29uc3QgY2hhciBkZWxpbWl0
ZXJTZXRbXSA9IHsgZGVsaW1pdGVyLCAnIicsICdcJycsICdcMCcgfTsKKyAgICAgICAgc2l6ZV90
IGN1cnJlbnREZWxpbWl0ZXJQb3NpdGlvbiA9IGxpbmUuZmluZF9maXJzdF9vZihkZWxpbWl0ZXJT
ZXQsIHNlYXJjaFN0YXJ0KTsKKyAgICAgICAgaWYgKGN1cnJlbnREZWxpbWl0ZXJQb3NpdGlvbiA9
PSBzdGQ6OnN0cmluZzo6bnBvcykKKyAgICAgICAgICAgIHJldHVybiBsaW5lLmxlbmd0aCgpOwor
CisgICAgICAgIGNoYXIgY2ggPSBsaW5lW2N1cnJlbnREZWxpbWl0ZXJQb3NpdGlvbl07CisgICAg
ICAgIGlmIChjaCA9PSBkZWxpbWl0ZXIpIHsKKyAgICAgICAgICAgIC8vIEZvdW5kIGRlbGltaXRl
cgorICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnREZWxpbWl0ZXJQb3NpdGlvbjsKKyAgICAgICAg
fQorCisgICAgICAgIC8vIFdlIGhpdCB0aGUgc3RhcnQgb2YgYSBxdW90ZWQgc3RyaW5nLiBMb29r
IGZvciBpdHMgZW5kLgorICAgICAgICBzZWFyY2hTdGFydCA9IGZpbmRTdHJpbmdFbmQobGluZSwg
Y3VycmVudERlbGltaXRlclBvc2l0aW9uLCBjaCk7CisgICAgICAgIGlmIChzZWFyY2hTdGFydCA9
PSBsaW5lLmxlbmd0aCgpKQorICAgICAgICAgICAgcmV0dXJuIHNlYXJjaFN0YXJ0OworCisgICAg
ICAgICsrc2VhcmNoU3RhcnQ7CisKKyAgICAgICAgLy8gc2VhcmNoU3RhcnQgbm93IHBvaW50cyB0
byB0aGUgZmlyc3QgY2hhciBhZnRlciB0aGUgZW5kIG9mIHRoZQorICAgICAgICAvLyBzdHJpbmcs
IHNvIGp1c3QgZ28gYmFjayB0byB0aGUgdG9wIG9mIHRoZSBsb29wIGFuZCBsb29rIGZvcgorICAg
ICAgICAvLyB8ZGVsaW1pdGVyfCBhZ2Fpbi4KKyAgICB9IHdoaWxlICh0cnVlKTsKKworICAgIHJl
dHVybiBsaW5lLmxlbmd0aCgpOworfQorCisKKworc3RhdGljIHZvaWQgcGFyc2VDb250ZW50VHlw
ZShjb25zdCBzdGQ6OnN0cmluZyYgY29udGVudFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHN0ZDo6c3RyaW5nJiBtaW1lVHlwZSwgc3RkOjpzdHJpbmcmIGNoYXJzZXQsCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wmIGhhZENoYXJzZXQpCit7CisgICAgLy8gVHJp
bSBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlIGZyb20gdHlwZS4gV2UgaW5jbHVkZSAn
KCcgaW4KKyAgICAvLyB0aGUgdHJhaWxpbmcgdHJpbSBzZXQgdG8gY2F0Y2ggbWVkaWEtdHlwZSBj
b21tZW50cywgd2hpY2ggYXJlIG5vdCBhdCBhbGwKKyAgICAvLyBzdGFuZGFyZCwgYnV0IG1heSBv
Y2N1ciBpbiByYXJlIGNhc2VzLgorICAgIHNpemVfdCB0eXBlVmFsdWUgPSBjb250ZW50VHlwZS5m
aW5kX2ZpcnN0X25vdF9vZigiIFx0Iik7CisgICAgdHlwZVZhbHVlID0gc3RkOjptaW4odHlwZVZh
bHVlLCBjb250ZW50VHlwZS5sZW5ndGgoKSk7CisgICAgc2l6ZV90IHR5cGVFbmQgPSBjb250ZW50
VHlwZS5maW5kX2ZpcnN0X29mKCIgXHQiIjsoIiwgdHlwZVZhbHVlKTsKKyAgICBpZiAoc3RkOjpz
dHJpbmc6Om5wb3MgPT0gdHlwZUVuZCkKKyAgICAgICAgdHlwZUVuZCA9IGNvbnRlbnRUeXBlLmxl
bmd0aCgpOworCisgICAgc2l6ZV90IGNoYXJzZXRWYWx1ZSA9IDA7CisgICAgc2l6ZV90IGNoYXJz
ZXRFbmQgPSAwOworCisgICAgLy8gSXRlcmF0ZSBvdmVyIHBhcmFtZXRlcnMKKyAgICBib29sIHR5
cGVIYXNDaGFyc2V0ID0gZmFsc2U7CisgICAgc2l6ZV90IHBhcmFtZXRlclN0YXJ0ID0gY29udGVu
dFR5cGUuZmluZF9maXJzdF9vZignOycsIHR5cGVFbmQpOworICAgIGlmIChwYXJhbWV0ZXJTdGFy
dCAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAvLyBXZSBoYXZlIHBhcmFtZXRlcnMu
IEl0ZXJhdGUgb3ZlciB0aGVtLgorICAgICAgICBzaXplX3QgY3VyUGFyYW1TdGFydCA9IHBhcmFt
ZXRlclN0YXJ0ICsgMTsKKyAgICAgICAgZG8geworICAgICAgICAgICAgc2l6ZV90IGN1cnJlbnRQ
YXJhbWV0ZXJFbmQgPSBmaW5kRGVsaW1pdGVyKGNvbnRlbnRUeXBlLCBjdXJQYXJhbVN0YXJ0LCAn
OycpOworCisgICAgICAgICAgICBzaXplX3QgcGFyYW1ldGVyTmFtZVN0YXJ0ID0gY29udGVudFR5
cGUuZmluZF9maXJzdF9ub3Rfb2YoIiBcdCIsIGN1clBhcmFtU3RhcnQpOworICAgICAgICAgICAg
cGFyYW1ldGVyTmFtZVN0YXJ0ID0gc3RkOjptaW4ocGFyYW1ldGVyTmFtZVN0YXJ0LCBjdXJyZW50
UGFyYW1ldGVyRW5kKTsKKworICAgICAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgY2hhcnNldFN0
cmluZ1tdID0gImNoYXJzZXQ9IjsKKyAgICAgICAgICAgIHNpemVfdCBjaGFyc2V0RW5kT2Zmc2V0
ID0gc3RkOjptaW4ocGFyYW1ldGVyTmFtZVN0YXJ0ICsgc2l6ZW9mKGNoYXJzZXRTdHJpbmcpIC0g
MSwgY3VycmVudFBhcmFtZXRlckVuZCk7CisgICAgICAgICAgICBpZiAobG93ZXJDYXNlRXF1YWxz
QVNDSUkoY29udGVudFR5cGUuYmVnaW4oKSArIHBhcmFtZXRlck5hbWVTdGFydCwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VHlwZS5iZWdpbigpICsgY2hhcnNl
dEVuZE9mZnNldCwgY2hhcnNldFN0cmluZykpIHsKKyAgICAgICAgICAgICAgICBjaGFyc2V0VmFs
dWUgPSBwYXJhbWV0ZXJOYW1lU3RhcnQgKyBzaXplb2YoY2hhcnNldFN0cmluZykgLSAxOworICAg
ICAgICAgICAgICAgIGNoYXJzZXRFbmQgPSBjdXJyZW50UGFyYW1ldGVyRW5kOworICAgICAgICAg
ICAgICAgIHR5cGVIYXNDaGFyc2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAg
ICAgY3VyUGFyYW1TdGFydCA9IGN1cnJlbnRQYXJhbWV0ZXJFbmQgKyAxOworICAgICAgICB9IHdo
aWxlIChjdXJQYXJhbVN0YXJ0IDwgY29udGVudFR5cGUubGVuZ3RoKCkpOworICAgIH0KKworICAg
IGlmICh0eXBlSGFzQ2hhcnNldCkgeworICAgICAgICAvLyBUcmltIGxlYWRpbmcgYW5kIHRyYWls
aW5nIHdoaXRlc3BhY2UgZnJvbSBjaGFyc2V0VmFsdWUuIFdlIGluY2x1ZGUKKyAgICAgICAgLy8g
JygnIGluIHRoZSB0cmFpbGluZyB0cmltIHNldCB0byBjYXRjaCBtZWRpYS10eXBlIGNvbW1lbnRz
LCB3aGljaCBhcmUKKyAgICAgICAgLy8gbm90IGF0IGFsbCBzdGFuZGFyZCwgYnV0IG1heSBvY2N1
ciBpbiByYXJlIGNhc2VzLgorICAgICAgICBjaGFyc2V0VmFsdWUgPSBjb250ZW50VHlwZS5maW5k
X2ZpcnN0X25vdF9vZigiIFx0IiwgY2hhcnNldFZhbHVlKTsKKyAgICAgICAgY2hhcnNldFZhbHVl
ID0gc3RkOjptaW4oY2hhcnNldFZhbHVlLCBjaGFyc2V0RW5kKTsKKyAgICAgICAgY2hhciBmaXJz
dENoYXIgPSBjb250ZW50VHlwZVtjaGFyc2V0VmFsdWVdOworICAgICAgICBpZiAoZmlyc3RDaGFy
ID09ICciJyB8fCBmaXJzdENoYXIgPT0gJ1wnJykgeworICAgICAgICAgICAgY2hhcnNldEVuZCA9
IGZpbmRTdHJpbmdFbmQoY29udGVudFR5cGUsIGNoYXJzZXRWYWx1ZSwgZmlyc3RDaGFyKTsKKyAg
ICAgICAgICAgICsrY2hhcnNldFZhbHVlOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGNo
YXJzZXRFbmQgPSBzdGQ6Om1pbihjb250ZW50VHlwZS5maW5kX2ZpcnN0X29mKCIgXHQiICI7KCIs
IGNoYXJzZXRWYWx1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnNl
dEVuZCk7CisgICAgfQorCisgICAgLy8gSWYgdGhlIHNlcnZlciBzZW50ICIqLyoiLCBpdCBpcyBt
ZWFuaW5nbGVzcywgc28gZG8gbm90IHN0b3JlIGl0LgorICAgIC8vIGFsc28sIGlmIHR5cGVWYWx1
ZSBpcyB0aGUgc2FtZSBhcyBtaW1lVHlwZSwgdGhlbiBqdXN0IHVwZGF0ZSB0aGUKKyAgICAvLyBj
aGFyc2V0LiBob3dldmVyLCBpZiBjaGFyc2V0IGlzIGVtcHR5IGFuZCBtaW1lVHlwZSBoYXNuJ3QK
KyAgICAvLyBjaGFuZ2VkLCB0aGVuIGRvbid0IHdpcGUtb3V0IGFuIGV4aXN0aW5nIGNoYXJzZXQu
IFdlCisgICAgLy8gYWxzbyB3YW50IHRvIHJlamVjdCBhIG1pbWUtdHlwZSBpZiBpdCBkb2VzIG5v
dCBpbmNsdWRlIGEgc2xhc2guCisgICAgLy8gc29tZSBzZXJ2ZXJzIGdpdmUganVuayBhZnRlciB0
aGUgY2hhcnNldCBwYXJhbWV0ZXIsIHdoaWNoIG1heQorICAgIC8vIGluY2x1ZGUgYSBjb21tYSwg
c28gdGhpcyBjaGVjayBtYWtlcyB1cyBhIGJpdCBtb3JlIHRvbGVyYW50LgorICAgIGlmIChjb250
ZW50VHlwZS5sZW5ndGgoKQorICAgICAgICAmJiBjb250ZW50VHlwZSAhPSAiKi8qIgorICAgICAg
ICAmJiBjb250ZW50VHlwZS5maW5kX2ZpcnN0X29mKCcvJykgIT0gc3RkOjpzdHJpbmc6Om5wb3Mp
IHsKKyAgICAgICAgLy8gQ29tbW9uIGNhc2UgaGVyZSBpcyB0aGF0IG1pbWVUeXBlIGlzIGVtcHR5
CisgICAgICAgIGJvb2wgZXF1YWwgPSAhbWltZVR5cGUuZW1wdHkoKQorICAgICAgICAgICAgICAg
ICAgJiYgbG93ZXJDYXNlRXF1YWxzQVNDSUkoY29udGVudFR5cGUuYmVnaW4oKSArIHR5cGVWYWx1
ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBl
LmJlZ2luKCkgKyB0eXBlRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgbWltZVR5cGUuZGF0YSgpKTsKKyAgICAgICAgaWYgKCFlcXVhbCkgeworICAgICAgICAg
ICAgbWltZVR5cGUuYXNzaWduKGNvbnRlbnRUeXBlLmJlZ2luKCkgKyB0eXBlVmFsdWUsCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFR5cGUuYmVnaW4oKSArIHR5cGVFbmQpOwor
ICAgICAgICAgICAgc3RyaW5nVG9Mb3dlckFTQ0lJKG1pbWVUeXBlKTsKKyAgICAgICAgfQorICAg
ICAgICBpZiAoIWVxdWFsIHx8IHR5cGVIYXNDaGFyc2V0KSB7CisgICAgICAgICAgICBoYWRDaGFy
c2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGNoYXJzZXQuYXNzaWduKGNvbnRlbnRUeXBlLmJlZ2lu
KCkgKyBjaGFyc2V0VmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VHlw
ZS5iZWdpbigpICsgY2hhcnNldEVuZCk7CisgICAgICAgICAgICBzdHJpbmdUb0xvd2VyQVNDSUko
Y2hhcnNldCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIENoZWNrcyB0byBzZWUgaWYgZGF0
YVtwb3NpdGlvbl0gY2hhcmFjdGVyIGlzIGEgbGluZSBicmVhazsgaGFuZGxlcyBjcmxmLCBsZmxm
LAorLy8gbGYsIG9yIGNyLiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBza2lw
IG92ZXIgKDAsIDEgb3IgMikuCitzdGF0aWMgaW50IHB1c2hPdmVyTGluZShjb25zdCBzdGQ6OnN0
cmluZyYgZGF0YSwgc2l6ZV90IHBvc2l0aW9uKQoreworICAgIGludCBvZmZzZXQgPSAwOworICAg
IGlmIChwb3NpdGlvbiA8IGRhdGEubGVuZ3RoKCkgJiYgKGRhdGFbcG9zaXRpb25dID09ICdccicg
fHwgZGF0YVtwb3NpdGlvbl0gPT0gJ1xuJykpIHsKKyAgICAgICAgKytvZmZzZXQ7CisgICAgICAg
IGlmIChwb3NpdGlvbiArIDEgPCBkYXRhLmxlbmd0aCgpICYmIGRhdGFbcG9zaXRpb24gKyAxXSA9
PSAnXG4nKQorICAgICAgICAgICAgKytvZmZzZXQ7CisgICAgfQorICAgIHJldHVybiBvZmZzZXQ7
Cit9CisKK011bHRpcGFydFJlc3BvbnNlRGVsZWdhdGU6Ok11bHRpcGFydFJlc3BvbnNlRGVsZWdh
dGUoUGFzc1JlZlB0cjxSZXNvdXJjZUhhbmRsZT4gcmVzb3VjZUhhbmRsZSwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVzb3VyY2VS
ZXNwb25zZSYgcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBib3VuZGFyeSkKKyAgICA6IG1fYm91
bmRhcnkoYm91bmRhcnkpCisgICAgLCBtX2VuY29kZWREYXRhTGVuZ3RoKDApCisgICAgLCBtX2Zp
cnN0UmVjZWl2ZWREYXRhKHRydWUpCisgICAgLCBtX29yaWdpbmFsUmVzcG9uc2UocmVzcG9uc2Up
CisgICAgLCBtX3Byb2Nlc3NpbmdIZWFkZXJzKGZhbHNlKQorICAgICwgbV9yZXNvdXJjZUhhbmRs
ZShyZXNvdWNlSGFuZGxlKQorICAgICwgbV9zdG9wU2VuZGluZyhmYWxzZSkKK3sKKyAgICBzdGQ6
OnN0cmluZyBzZWFyY2ggPSAiLS0iOworICAgIGlmIChtX2JvdW5kYXJ5LmNvbXBhcmUoMCwgc2Vh
cmNoLmxlbmd0aCgpLCBzZWFyY2gpKQorICAgICAgICBtX2JvdW5kYXJ5ID0gc2VhcmNoICsgbV9i
b3VuZGFyeTsKK30KKworYm9vbCBNdWx0aXBhcnRSZXNwb25zZURlbGVnYXRlOjpyZWFkTXVsdGlw
YXJ0Qm91bmRhcnkoY29uc3Qgc3RkOjpzdHJpbmcmIGNvbnRlbnRUeXBlLCBzdGQ6OnN0cmluZyYg
bXVsdGlwYXJ0Qm91bmRhcnkpCit7CisgICAgc2l6ZV90IGJvdW5kYXJ5U3RhcnRPZmZzZXQgPSBj
b250ZW50VHlwZS5maW5kKCJib3VuZGFyeT0iKTsKKyAgICBpZiAoYm91bmRhcnlTdGFydE9mZnNl
dCA9PSBzdGQ6OnN0cmluZzo6bnBvcykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgYm91
bmRhcnlTdGFydE9mZnNldCArPSBzdHJsZW4oImJvdW5kYXJ5PSIpOworICAgIHNpemVfdCBib3Vu
ZGFyeUVuZE9mZnNldCA9IGNvbnRlbnRUeXBlLmZpbmQoJzsnLCBib3VuZGFyeVN0YXJ0T2Zmc2V0
KTsKKworICAgIGlmIChib3VuZGFyeUVuZE9mZnNldCA9PSBzdGQ6OnN0cmluZzo6bnBvcykKKyAg
ICAgICAgYm91bmRhcnlFbmRPZmZzZXQgPSBjb250ZW50VHlwZS5sZW5ndGgoKTsKKworICAgIHNp
emVfdCBib3VuZGFyeUxlbmd0aCA9IGJvdW5kYXJ5RW5kT2Zmc2V0IC0gYm91bmRhcnlTdGFydE9m
ZnNldDsKKyAgICBtdWx0aXBhcnRCb3VuZGFyeSA9IGNvbnRlbnRUeXBlLnN1YnN0cihib3VuZGFy
eVN0YXJ0T2Zmc2V0LCBib3VuZGFyeUxlbmd0aCk7CisKKyAgICAvLyBUaGUgYnl0ZSByYW5nZSBy
ZXNwb25zZSBjYW4gaGF2ZSBxdW90ZWQgYm91bmRhcnkgc3RyaW5ncy4gVGhpcyBpcyBsZWdhbAor
ICAgIC8vIGFzIHBlciBNSU1FIHNwZWNpZmljYXRpb25zLiBJbmRpdmlkdWFsIGRhdGEgZnJhZ2Vt
ZW50cyBob3dldmVyIGRvbid0CisgICAgLy8gY29udGFpbiBxdW90ZWQgYm91bmRhcnkgc3RyaW5n
cy4KKyAgICB0cmltU3RyaW5nKG11bHRpcGFydEJvdW5kYXJ5LCAiXCIiLCBUUklNX0FMTCwgbXVs
dGlwYXJ0Qm91bmRhcnkpOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIE11bHRpcGFydFJl
c3BvbnNlRGVsZWdhdGU6Om9uUmVjZWl2ZWREYXRhKGNvbnN0IGNoYXIqIGRhdGEsCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGgsCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlbmNvZGVkRGF0
YUxlbmd0aCkKK3sKKyAgICAvLyBtX3N0b3BTZW5kaW5nIG1lYW5zIHRoYXQgd2UndmUgYWxyZWFk
eSByZWNlaXZlZCB0aGUgZmluYWwgYm91bmRhcnkgdG9rZW4uCisgICAgLy8gVGhlIHNlcnZlciBz
aG91bGQgc3RvcCBzZW5kaW5nIHVzIGRhdGEgYXQgdGhpcyBwb2ludCwgYnV0IGlmIGl0IGRvZXMs
IHdlCisgICAgLy8ganVzdCB0aHJvdyBpdCBhd2F5LgorICAgIGlmIChtX3N0b3BTZW5kaW5nKQor
ICAgICAgICByZXR1cm47CisKKyAgICBtX2RhdGEuYXBwZW5kKGRhdGEsIGxlbmd0aCk7CisgICAg
bV9lbmNvZGVkRGF0YUxlbmd0aCArPSBlbmNvZGVkRGF0YUxlbmd0aDsKKyAgICBpZiAobV9maXJz
dFJlY2VpdmVkRGF0YSkgeworICAgICAgICAvLyBTb21lIHNlcnZlcnMgZG9uJ3Qgc2VuZCBhIGJv
dW5kYXJ5IHRva2VuIGJlZm9yZSB0aGUgZmlyc3QgY2h1bmsgb2YKKyAgICAgICAgLy8gZGF0YS4g
V2UgaGFuZGxlIHRoaXMgY2FzZSBhbnl3YXkgKEdlY2tvIGRvZXMgdG9vKS4KKyAgICAgICAgbV9m
aXJzdFJlY2VpdmVkRGF0YSA9IGZhbHNlOworCisgICAgICAgIC8vIEVhdCBsZWFkaW5nIFxyXG4K
KyAgICAgICAgaW50IHBvcyA9IHB1c2hPdmVyTGluZShtX2RhdGEsIDApOworICAgICAgICBpZiAo
cG9zKQorICAgICAgICAgICAgbV9kYXRhID0gbV9kYXRhLnN1YnN0cihwb3MpOworCisgICAgICAg
IGlmIChtX2RhdGEubGVuZ3RoKCkgPCBtX2JvdW5kYXJ5Lmxlbmd0aCgpICsgMikgeworICAgICAg
ICAgICAgLy8gV2UgZG9uJ3QgaGF2ZSBlbm91Z2ggZGF0YSB5ZXQgdG8gbWFrZSBhIGJvdW5kYXJ5
IHRva2VuLiBKdXN0IHdhaXQKKyAgICAgICAgICAgIC8vIHVudGlsIHRoZSBuZXh0IGNodW5rIG9m
IGRhdGEgYXJyaXZlcy4KKyAgICAgICAgICAgIG1fZmlyc3RSZWNlaXZlZERhdGEgPSB0cnVlOwor
ICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1fZGF0YS5jb21w
YXJlKDAsIG1fYm91bmRhcnkubGVuZ3RoKCksIG1fYm91bmRhcnkpKQorICAgICAgICAgICAgbV9k
YXRhID0gbV9ib3VuZGFyeSArICJcbiIgKyBtX2RhdGE7CisgICAgfQorCisgICAgLy8gSGVhZGVy
cworICAgIGlmIChtX3Byb2Nlc3NpbmdIZWFkZXJzKSB7CisgICAgICAgIC8vIEVhdCBsZWFkaW5n
IFxyXG4KKyAgICAgICAgaW50IHBvcyA9IHB1c2hPdmVyTGluZShtX2RhdGEsIDApOworICAgICAg
ICBpZiAocG9zKQorICAgICAgICAgICAgbV9kYXRhID0gbV9kYXRhLnN1YnN0cihwb3MpOworCisg
ICAgICAgIGlmIChwYXJzZUhlYWRlcnMoKSkgeworICAgICAgICAgICAgLy8gU3VjY2Vzc2Z1bGx5
IHBhcnNlZCBoZWFkZXJzLgorICAgICAgICAgICAgbV9wcm9jZXNzaW5nSGVhZGVycyA9IGZhbHNl
OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gR2V0IG1vcmUgZGF0YSBiZWZvcmUg
dHJ5aW5nIGFnYWluLgorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisg
ICAgc2l6ZV90IGJvdW5kYXJ5UG9zaXRpb247CisgICAgd2hpbGUgKChib3VuZGFyeVBvc2l0aW9u
ID0gZmluZEJvdW5kYXJ5KCkpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIGlmICht
X3Jlc291cmNlSGFuZGxlICYmICBtX3Jlc291cmNlSGFuZGxlLT5jbGllbnQoKSkgeworICAgICAg
ICAgICAgLy8gU3RyaXAgb3V0IHRyYWlsaW5nIFxuXHIgY2hhcmFjdGVycyBpbiB0aGUgYnVmZmVy
IHByZWNlZGluZyB0aGUKKyAgICAgICAgICAgIC8vIGJvdW5kYXJ5IG9uIHRoZSBzYW1lIGxpbmVz
IGFzIEZpcmVmb3guCisgICAgICAgICAgICBpbnQgZGF0YUxlbmd0aCA9IGJvdW5kYXJ5UG9zaXRp
b247CisgICAgICAgICAgICBpZiAoYm91bmRhcnlQb3NpdGlvbiA+IDAgJiYgbV9kYXRhW2JvdW5k
YXJ5UG9zaXRpb24gLSAxXSA9PSAnXG4nKSB7CisgICAgICAgICAgICAgICAgZGF0YUxlbmd0aC0t
OworICAgICAgICAgICAgICAgIGlmIChib3VuZGFyeVBvc2l0aW9uID4gMSAmJiBtX2RhdGFbYm91
bmRhcnlQb3NpdGlvbiAtIDJdID09ICdccicpCisgICAgICAgICAgICAgICAgICAgIGRhdGFMZW5n
dGgtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChkYXRhTGVuZ3RoID4gMCkgewor
ICAgICAgICAgICAgICAgIC8vIFNlbmQgdGhlIGxhc3QgZGF0YSBjaHVuay4KKyAgICAgICAgICAg
ICAgICBtX3Jlc291cmNlSGFuZGxlLT5jbGllbnQoKS0+ZGlkUmVjZWl2ZURhdGEobV9yZXNvdXJj
ZUhhbmRsZS5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgbV9kYXRhLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUxlbmd0aCwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9lbmNv
ZGVkRGF0YUxlbmd0aCk7CisgICAgICAgICAgICAgICAgbV9lbmNvZGVkRGF0YUxlbmd0aCA9IDA7
CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc2l6ZV90IGJvdW5kYXJ5RW5kUG9z
aXRpb24gPSBib3VuZGFyeVBvc2l0aW9uICsgbV9ib3VuZGFyeS5sZW5ndGgoKTsKKyAgICAgICAg
aWYgKGJvdW5kYXJ5RW5kUG9zaXRpb24gPCBtX2RhdGEubGVuZ3RoKCkgJiYgJy0nID09IG1fZGF0
YVtib3VuZGFyeUVuZFBvc2l0aW9uXSkgeworICAgICAgICAgICAgLy8gVGhpcyB3YXMgdGhlIGxh
c3QgYm91bmRhcnkgc28gd2UgY2FuIHN0b3AgcHJvY2Vzc2luZy4KKyAgICAgICAgICAgIG1fc3Rv
cFNlbmRpbmcgPSB0cnVlOworICAgICAgICAgICAgbV9kYXRhLmNsZWFyKCk7CisgICAgICAgICAg
ICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBXZSBjYW4gbm93IHRocm93IG91dCBk
YXRhIHVwIHRocm91Z2ggdGhlIGJvdW5kYXJ5CisgICAgICAgIGludCBvZmZzZXQgPSBwdXNoT3Zl
ckxpbmUobV9kYXRhLCBib3VuZGFyeUVuZFBvc2l0aW9uKTsKKyAgICAgICAgbV9kYXRhID0gbV9k
YXRhLnN1YnN0cihib3VuZGFyeUVuZFBvc2l0aW9uICsgb2Zmc2V0KTsKKworICAgICAgICAvLyBP
aywgYmFjayB0byBwYXJzaW5nIGhlYWRlcnMKKyAgICAgICAgaWYgKCFwYXJzZUhlYWRlcnMoKSkg
eworICAgICAgICAgICAgbV9wcm9jZXNzaW5nSGVhZGVycyA9IHRydWU7CisgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEF0IHRoaXMgcG9pbnQsIHdlIHNob3Vs
ZCBzZW5kIG92ZXIgYW55IGRhdGEgd2UgaGF2ZSwgYnV0IGtlZXAgZW5vdWdoIGRhdGEKKyAgICAv
LyBidWZmZXJlZCB0byBoYW5kbGUgYSBib3VuZGFyeSB0aGF0IG1heSBoYXZlIGJlZW4gdHJ1bmNh
dGVkLgorICAgIGlmICghbV9wcm9jZXNzaW5nSGVhZGVycyAmJiBtX2RhdGEubGVuZ3RoKCkgPiBt
X2JvdW5kYXJ5Lmxlbmd0aCgpKSB7CisgICAgICAgIC8vIElmIHRoZSBsYXN0IGNoYXJhY3RlciBp
cyBhIG5ldyBsaW5lIGNoYXJhY3RlciwgZ28gYWhlYWQgYW5kIGp1c3Qgc2VuZAorICAgICAgICAv
LyBldmVyeXRoaW5nIHdlIGhhdmUgYnVmZmVyZWQuIFRoaXMgbWF0Y2hlcyBhbiBvcHRpbWl6YXRp
b24gaW4gR2Vja28uCisgICAgICAgIGludCBzZW5kTGVuZ3RoID0gbV9kYXRhLmxlbmd0aCgpIC0g
bV9ib3VuZGFyeS5sZW5ndGgoKTsKKyAgICAgICAgaWYgKG1fZGF0YVttX2RhdGEubGVuZ3RoKCkg
LSAxXSA9PSAnXG4nKQorICAgICAgICAgICAgc2VuZExlbmd0aCA9IG1fZGF0YS5sZW5ndGgoKTsK
KyAgICAgICAgaWYgKG1fcmVzb3VyY2VIYW5kbGUgJiYgbV9yZXNvdXJjZUhhbmRsZS0+Y2xpZW50
KCkpCisgICAgICAgICAgICBtX3Jlc291cmNlSGFuZGxlLT5jbGllbnQoKS0+ZGlkUmVjZWl2ZURh
dGEobV9yZXNvdXJjZUhhbmRsZS5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBtX2RhdGEuZGF0YSgpLAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRMZW5ndGgsCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9lbmNv
ZGVkRGF0YUxlbmd0aCk7CisgICAgICAgIG1fZGF0YSA9IG1fZGF0YS5zdWJzdHIoc2VuZExlbmd0
aCk7CisgICAgICAgIG1fZW5jb2RlZERhdGFMZW5ndGggPSAwOworICAgIH0KK30KKwordm9pZCBN
dWx0aXBhcnRSZXNwb25zZURlbGVnYXRlOjpvbkNvbXBsZXRlZFJlcXVlc3QoKQoreworICAgIC8v
IElmIHdlIGhhdmUgYW55IHBlbmRpbmcgZGF0YSBhbmQgd2UncmUgbm90IGluIGEgaGVhZGVyLCBn
byBhaGVhZCBhbmQgc2VuZAorICAgIC8vIGl0IHRvIFdlYkNvcmUuCisgICAgaWYgKCFtX3Byb2Nl
c3NpbmdIZWFkZXJzICYmICFtX2RhdGEuZW1wdHkoKSAmJiAhbV9zdG9wU2VuZGluZyAmJiBtX3Jl
c291cmNlSGFuZGxlICYmIG1fcmVzb3VyY2VIYW5kbGUtPmNsaWVudCgpKSB7CisgICAgICAgIG1f
cmVzb3VyY2VIYW5kbGUtPmNsaWVudCgpLT5kaWRSZWNlaXZlRGF0YShtX3Jlc291cmNlSGFuZGxl
LmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgbV9kYXRhLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIG1fZGF0YS5sZW5ndGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIG1fZW5jb2RlZERhdGFMZW5ndGgpOworICAgICAgICBt
X2VuY29kZWREYXRhTGVuZ3RoID0gMDsKKyAgICB9Cit9CisKK2Jvb2wgTXVsdGlwYXJ0UmVzcG9u
c2VEZWxlZ2F0ZTo6cGFyc2VIZWFkZXJzKCkKK3sKKyAgICBpbnQgbGluZUZlZWRJbmNyZW1lbnQg
PSAxOworCisgICAgLy8gR3JhYiB0aGUgaGVhZGVycyBiZWluZyBsaWJlcmFsIGFib3V0IGxpbmUg
ZW5kaW5ncy4KKyAgICBzaXplX3QgbGluZVN0YXJ0UG9zaXRpb24gPSAwOworICAgIHNpemVfdCBs
aW5lRW5kUG9zaXRpb24gPSBtX2RhdGEuZmluZCgnXG4nKTsKKyAgICB3aGlsZSAobGluZUVuZFBv
c2l0aW9uICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIC8vIEhhbmRsZSBDUkxGCisg
ICAgICAgIGlmIChsaW5lRW5kUG9zaXRpb24gPiBsaW5lU3RhcnRQb3NpdGlvbiAmJiBtX2RhdGFb
bGluZUVuZFBvc2l0aW9uIC0gMV0gPT0gJ1xyJykgeworICAgICAgICAgICAgbGluZUZlZWRJbmNy
ZW1lbnQgPSAyOworICAgICAgICAgICAgLS1saW5lRW5kUG9zaXRpb247CisgICAgICAgIH0gZWxz
ZQorICAgICAgICAgICAgbGluZUZlZWRJbmNyZW1lbnQgPSAxOworCisgICAgICAgIGlmIChsaW5l
U3RhcnRQb3NpdGlvbiA9PSBsaW5lRW5kUG9zaXRpb24pIHsKKyAgICAgICAgICAgIC8vIEEgYmxh
bmsgbGluZSwgZW5kIG9mIGhlYWRlcnMKKyAgICAgICAgICAgIGxpbmVFbmRQb3NpdGlvbiArPSBs
aW5lRmVlZEluY3JlbWVudDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAg
IC8vIEZpbmQgdGhlIG5leHQgaGVhZGVyIGxpbmUuCisgICAgICAgIGxpbmVTdGFydFBvc2l0aW9u
ID0gbGluZUVuZFBvc2l0aW9uICsgbGluZUZlZWRJbmNyZW1lbnQ7CisgICAgICAgIGxpbmVFbmRQ
b3NpdGlvbiA9IG1fZGF0YS5maW5kKCdcbicsIGxpbmVTdGFydFBvc2l0aW9uKTsKKyAgICB9Cisg
ICAgLy8gVHJ1bmNhdGVkIGluIHRoZSBtaWRkbGUgb2YgYSBoZWFkZXIsIHN0b3AgcGFyc2luZy4K
KyAgICBpZiAobGluZUVuZFBvc2l0aW9uID09IHN0ZDo6c3RyaW5nOjpucG9zKQorICAgICAgICBy
ZXR1cm4gZmFsc2U7CisKKyAgICAvLyBFYXQgaGVhZGVycworICAgIHN0ZDo6c3RyaW5nIGhlYWRl
cnMoIlxuIik7CisgICAgaGVhZGVycy5hcHBlbmQobV9kYXRhLCAwLCBsaW5lRW5kUG9zaXRpb24p
OworICAgIG1fZGF0YSA9IG1fZGF0YS5zdWJzdHIobGluZUVuZFBvc2l0aW9uKTsKKworICAgIC8v
IENyZWF0ZSBhIFdlYlVSTFJlc3BvbnNlIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCBzZXQgb2YgaGVh
ZGVycyArIHRoZQorICAgIC8vIHJlcGxhY2VtZW50IGhlYWRlcnMuIFdlIG9ubHkgcmVwbGFjZSB0
aGUgc2FtZSBmZXcgaGVhZGVycyB0aGF0IGdlY2tvCisgICAgLy8gZG9lcy4gU2VlIG5ldHdlcmsv
c3RyZWFtY29udi9jb252ZXJ0ZXJzL25zTXVsdGlNaXhlZENvbnYuY3BwLgorCisgICAgc3RkOjpz
dHJpbmcgY29udGVudFR5cGUgPSBnZXRTcGVjaWZpY0hlYWRlcihoZWFkZXJzLCAiY29udGVudC10
eXBlIik7CisgICAgc3RkOjpzdHJpbmcgbWltZVR5cGU7CisgICAgc3RkOjpzdHJpbmcgY2hhcnNl
dDsKKyAgICBib29sIGhhc0NoYXJzZXQgPSBmYWxzZTsKKworICAgIHBhcnNlQ29udGVudFR5cGUo
Y29udGVudFR5cGUsIG1pbWVUeXBlLCBjaGFyc2V0LCBoYXNDaGFyc2V0KTsKKyAgICBSZXNvdXJj
ZVJlc3BvbnNlIHJlc3BvbnNlOworICAgIHJlc3BvbnNlLnNldFVSTChtX29yaWdpbmFsUmVzcG9u
c2UudXJsKCkpOworICAgIHJlc3BvbnNlLnNldE1pbWVUeXBlKFN0cmluZzo6ZnJvbVVURjgobWlt
ZVR5cGUuZGF0YSgpKSk7CisgICAgaWYgKGhhc0NoYXJzZXQpCisgICAgICAgIHJlc3BvbnNlLnNl
dFRleHRFbmNvZGluZ05hbWUoU3RyaW5nOjpmcm9tVVRGOChjaGFyc2V0LmRhdGEoKSkpOworCisg
ICAgY29uc3QgV2ViQ29yZTo6SFRUUEhlYWRlck1hcCYgbWFwID0gbV9vcmlnaW5hbFJlc3BvbnNl
Lmh0dHBIZWFkZXJGaWVsZHMoKTsKKyAgICBmb3IgKFdlYkNvcmU6OkhUVFBIZWFkZXJNYXA6OmNv
bnN0X2l0ZXJhdG9yIGl0ID0gbWFwLmJlZ2luKCk7IGl0ICE9IG1hcC5lbmQoKTsgKytpdCkgewor
ICAgICAgICBib29sIG5lZWRzQWRkID0gdHJ1ZTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7
IGkgPCBhcnJheXNpemUoUmVwbGFjZUhlYWRlcnMpOyArK2kpIHsKKyAgICAgICAgICAgIGlmIChp
dC0+Zmlyc3QubG93ZXIoKSA9PSBSZXBsYWNlSGVhZGVyc1tpXSkgeworICAgICAgICAgICAgICAg
IG5lZWRzQWRkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9
CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5lZWRzQWRkKQorICAgICAgICAgICAgcmVzcG9uc2Uu
c2V0SFRUUEhlYWRlckZpZWxkKGl0LT5maXJzdCwgaXQtPnNlY29uZCk7CisgICAgfQorCisgICAg
Zm9yIChzaXplX3QgaSA9IDA7IGkgPCBhcnJheXNpemUoUmVwbGFjZUhlYWRlcnMpOyArK2kpIHsK
KyAgICAgICAgc3RkOjpzdHJpbmcgbmFtZShSZXBsYWNlSGVhZGVyc1tpXSk7CisgICAgICAgIHN0
ZDo6c3RyaW5nIHZhbHVlID0gZ2V0U3BlY2lmaWNIZWFkZXIoaGVhZGVycywgbmFtZSk7CisgICAg
ICAgIGlmICghdmFsdWUuZW1wdHkoKSkgeworICAgICAgICAgICAgcmVzcG9uc2Uuc2V0SFRUUEhl
YWRlckZpZWxkKFN0cmluZzo6ZnJvbVVURjgobmFtZS5kYXRhKCkpLAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzo6ZnJvbVVURjgodmFsdWUuZGF0YSgpKSk7
CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobV9yZXNvdXJjZUhhbmRsZSAmJiBtX3Jlc291
cmNlSGFuZGxlLT5jbGllbnQoKSkgeworICAgICAgICAvLyBBZnRlciBwYXJzZWQgdGhlIGhlYWRl
cnMgc3VjY2Vzc2Z1bGx5LCB0aGUgbXVsdGlwYXJ0IHBhZ2VzIHdpbGwgbm90IGJlIHN0b3JlZCBp
biBwYWdlCisgICAgICAgIC8vIGNhY2hlIGFueSBtb3JlLCBiZWNhdXNlIGdvIGJhY2svZm9yd2Fy
ZCBhY3Rpb25zIG5lZWQgZ2V0dGluZyB0aGUgbGF0ZXN0IGRhdGEgZnJvbSBzZXJ2ZXIuCisgICAg
ICAgIHJlc3BvbnNlLnNldElzTXVsdGlwYXJ0UGF5bG9hZCh0cnVlKTsKKyAgICAgICAgbV9yZXNv
dXJjZUhhbmRsZS0+Y2xpZW50KCktPmRpZFJlY2VpdmVSZXNwb25zZShtX3Jlc291cmNlSGFuZGxl
LmdldCgpLCByZXNwb25zZSk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvLyBCb3Vu
ZGFyaWVzIGFyZSBzdXBwb3NlZCB0byBiZSBwcmVjZWVkZWQgd2l0aCAtLSwgYnV0IGl0IGxvb2tz
IGxpa2UgZ2Vja28KKy8vIGRvZXNuJ3QgcmVxdWlyZSB0aGUgZGFzaGVzIHRvIGV4aXN0LiBTZWUg
bnNNdWx0aU1peGVkQ29udjo6RmluZFRva2VuLgorc2l6ZV90IE11bHRpcGFydFJlc3BvbnNlRGVs
ZWdhdGU6OmZpbmRCb3VuZGFyeSgpCit7CisgICAgc2l6ZV90IGJvdW5kYXJ5UG9zaXRpb24gPSBt
X2RhdGEuZmluZChtX2JvdW5kYXJ5KTsKKyAgICBpZiAoYm91bmRhcnlQb3NpdGlvbiAhPSBzdGQ6
OnN0cmluZzo6bnBvcykgeworICAgICAgICAvLyBCYWNrIHVwIG92ZXIgLS0gZm9yIGJhY2t3YXJk
cyBjb21wYXQKKyAgICAgICAgLy8gRklYTUUodGMpOiBEb24ndCB3ZSBvbmx5IHdhbnQgdG8gZG8g
dGhpcyBvbmNlPyBHZWNrbyBjb2RlIGRvZXNuJ3Qgc2VlbQorICAgICAgICAvLyB0byBjYXJlLgor
ICAgICAgICBpZiAoYm91bmRhcnlQb3NpdGlvbiA+PSAyKSB7CisgICAgICAgICAgICBpZiAoJy0n
ID09IG1fZGF0YVtib3VuZGFyeVBvc2l0aW9uIC0gMV0gJiYgJy0nID09IG1fZGF0YVtib3VuZGFy
eVBvc2l0aW9uIC0gMl0pIHsKKyAgICAgICAgICAgICAgICBib3VuZGFyeVBvc2l0aW9uIC09IDI7
CisgICAgICAgICAgICAgICAgbV9ib3VuZGFyeSA9ICItLSIgKyBtX2JvdW5kYXJ5OworICAgICAg
ICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBib3VuZGFyeVBvc2l0aW9uOwor
fQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvTXVsdGlwYXJ0UmVzcG9uc2VEZWxlZ2F0ZS5oIGIv
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9ibGFja2JlcnJ5L011bHRpcGFydFJlc3Bv
bnNlRGVsZWdhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5lOTQ1ZTI3NmRlNWEzOTI3MDY4ZTcyNThhOGJiMjgw
YTZmYTRjZDA2Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0
d29yay9ibGFja2JlcnJ5L011bHRpcGFydFJlc3BvbnNlRGVsZWdhdGUuaApAQCAtMCwwICsxLDEx
NCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDExIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgorLy8gTW9zdCBvZiBsb2dpYyBhbmQgZnVuY3Rpb25zIGFyZSBi
YXNlIG9uIENocm9taXVtIGJyb3dzZXIncyBpbXBsZW1hbnRpb25zIGluCisvLyB3ZWJraXQvZ2x1
ZS9tdWx0aXBhcnRfcmVzcG9uc2VfZGVsZWdhdGUuY2MKKworCisvLyBDb3B5cmlnaHQgKGMpIDIw
MDYtMjAwOSBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVz
ZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2Ug
dGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisvLworLy8gQSBkZWxl
Z2F0ZSBjbGFzcyBvZiBXZWJVUkxMb2FkZXJJbXBsIHRoYXQgaGFuZGxlcyBtdWx0aXBhcnQveC1t
aXhlZC1yZXBsYWNlCisvLyBkYXRhLiBXZSBzcGVjaWFsIGNhc2UgbXVsdGlwYXJ0L3gtbWl4ZWQt
cmVwbGFjZSBiZWNhdXNlIFdlYkNvcmUgZXhwZWN0cyBhCisvLyBzZXBhcmF0ZSBkaWRSZWNlaXZl
UmVzcG9uc2UgZm9yIGVhY2ggbmV3IG1lc3NhZ2UgcGFydC4KKy8vCisvLyBNb3N0IG9mIHRoZSBs
b2dpYyBhbmQgZWRnZSBjYXNlIGhhbmRsaW5nIGFyZSBiYXNlZCBvbiB0aGUgTW96aWxsYSdzCisv
LyBpbXBsZW1lbnRhdGlvbiBpbiBuZXR3ZXJrL3N0cmVhbWNvbnYvY29udmVydGVycy9uc011bHRp
TWl4ZWRDb252LmNwcC4KKy8vIFRoaXMgc2VlbXMgbGlrZSBhIGRlcml2YXRpdmUgd29yaywgc28g
aGVyZSdzIHRoZSBvcmlnaW5hbCBsaWNlbnNlOgorCisvKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJM
T0NLICoqKioqCisgKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKKyAqCisgKiBU
aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1Ymxp
YyBMaWNlbnNlIFZlcnNpb24KKyAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVz
ZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuIFlv
dSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogaHR0cDovL3d3dy5tb3pp
bGxhLm9yZy9NUEwvCisgKgorICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vu
c2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKKyAqIFdJVEhPVVQgV0FSUkFO
VFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5z
ZQorICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1p
dGF0aW9ucyB1bmRlciB0aGUKKyAqIExpY2Vuc2UuCisgKgorICogVGhlIE9yaWdpbmFsIENvZGUg
aXMgbW96aWxsYS5vcmcgY29kZS4KKyAqCisgKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhl
IE9yaWdpbmFsIENvZGUgaXMKKyAqIE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9u
LgorICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHly
aWdodCAoQykgMTk5OAorICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2Vy
dmVkLgorICoKKyAqIENvbnRyaWJ1dG9yKHMpOgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoZSBj
b250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBl
aXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAo
dGhlICJHUEwiKSwgb3IKKyAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ug
VmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAorICogaW4gd2hpY2ggY2FzZSB0aGUg
cHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQK
KyAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJz
aW9uIG9mIHRoaXMgZmlsZSBvbmx5CisgKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBH
UEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCisgKiB1c2UgeW91ciB2
ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUg
eW91cgorICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJl
cGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKKyAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVp
cmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCisgKiB0aGUg
cHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhp
cyBmaWxlIHVuZGVyCisgKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BM
IG9yIHRoZSBMR1BMLgorICoKKyAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCisK
KyNpZm5kZWYgTXVsdGlwYXJ0UmVzcG9uc2VEZWxlZ2F0ZV9oCisjZGVmaW5lIE11bHRpcGFydFJl
c3BvbnNlRGVsZWdhdGVfaAorCisjaW5jbHVkZSAiUmVzb3VyY2VIYW5kbGUuaCIKKyNpbmNsdWRl
ICJSZXNvdXJjZVJlc3BvbnNlLmgiCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgV2Vi
Q29yZSB7CisKK2NsYXNzIE11bHRpcGFydFJlc3BvbnNlRGVsZWdhdGUgeworcHVibGljOgorICAg
IE11bHRpcGFydFJlc3BvbnNlRGVsZWdhdGUoUGFzc1JlZlB0cjxSZXNvdXJjZUhhbmRsZT4gcmVz
b3VjZUhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlc291cmNl
UmVzcG9uc2UmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJp
bmcmIGJvdW5kYXJ5KTsKKyAgICBzdGF0aWMgYm9vbCByZWFkTXVsdGlwYXJ0Qm91bmRhcnkoY29u
c3Qgc3RkOjpzdHJpbmcmIGNvbnRlbnRUeXBlLCBzdGQ6OnN0cmluZyYgbXVsdGlwYXJ0Qm91bmRh
cnkpOworICAgIHZvaWQgb25SZWNlaXZlZERhdGEoY29uc3QgY2hhciogZGF0YSwgaW50IGxlbmd0
aCwgaW50IGVuY29kZWREYXRhTGVuZ3RoKTsKKyAgICB2b2lkIG9uQ29tcGxldGVkUmVxdWVzdCgp
OworCitwcml2YXRlOgorCisgICAgLy8gQ2hlY2tzIHRvIHNlZSBpZiBkYXRhW3Bvc10gY2hhcmFj
dGVyIGlzIGEgbGluZSBicmVhazsgaGFuZGxlcyBjcmxmLCBsZmxmLAorICAgIC8vIGxmLCBvciBj
ci4gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gc2tpcCBvdmVyICgwLCAxIG9y
IDIpLgorCisgICAgLy8gVHJpZXMgdG8gcGFyc2UgaHR0cCBoZWFkZXJzIGZyb20gdGhlIHN0YXJ0
IG9mIGRhdGFfLiBSZXR1cm5zIHRydWUgaWYgaXQKKyAgICAvLyBzdWNjZWVkcyBhbmQgc2VuZHMg
YSBkaWRSZWNlaXZlUmVzcG9uc2UgdG8gbV9jbGllbnQuIFJldHVybnMgZmFsc2UgaWYKKyAgICAv
LyB0aGUgaGVhZGVyIGlzIGluY29tcGxldGUgKGluIHdoaWNoIGNhc2Ugd2UganVzdCB3YWl0IGZv
ciBtb3JlIGRhdGEpLgorICAgIGJvb2wgcGFyc2VIZWFkZXJzKCk7CisKKyAgICAvLyBGaW5kIHRo
ZSBuZXh0IGJvdW5kYXJ5IGluIGRhdGFfLiBSZXR1cm5zIHN0ZDo6c3RyaW5nOjpucG9zIGlmIHRo
ZXJlJ3Mgbm8KKyAgICAvLyBmdWxsIHRva2VuLgorICAgIHNpemVfdCBmaW5kQm91bmRhcnkoKTsK
KworICAgIC8vIE11bHRpcGFydCBib3VuZGFyeSB0b2tlbgorICAgIHN0ZDo6c3RyaW5nIG1fYm91
bmRhcnk7CisKKyAgICAvLyBBIHRlbXBvcmFyeSBidWZmZXIgdG8gaG9sZCBkYXRhIGJldHdlZW4g
cmVhZHMgZm9yIG11bHRpcGFydCBkYXRhIHRoYXQKKyAgICAvLyBnZXRzIHNwbGl0IGluIHRoZSBt
aWRkbGUgb2YgYSBoZWFkZXIuCisgICAgc3RkOjpzdHJpbmcgbV9kYXRhOworCisgICAgaW50IG1f
ZW5jb2RlZERhdGFMZW5ndGg7CisKKyAgICAvLyBUcnVlIHVudGlsIHdlIGdldCBvdXIgZmlyc3Qg
b24gcmVjZWl2ZWQgZGF0YSBjYWxsCisgICAgYm9vbCBtX2ZpcnN0UmVjZWl2ZWREYXRhOworCisg
ICAgLy8gVGhlIG9yaWdpbmFsIHJlc291cmNlIHJlc3BvbnNlIGZvciB0aGlzIHJlcXVlc3QuIFdl
IHVzZSB0aGlzIGFzIGEKKyAgICAvLyBzdGFydGluZyBwb2ludCBmb3IgZWFjaCBwYXJ0cyByZXNw
b25zZS4KKyAgICBjb25zdCBSZXNvdXJjZVJlc3BvbnNlJiBtX29yaWdpbmFsUmVzcG9uc2U7CisK
KyAgICAvLyB0cnVlIGlmIHdlJ3JlIHRydW5jYXRlZCBpbiB0aGUgbWlkZGxlIG9mIGEgaGVhZGVy
CisgICAgYm9vbCBtX3Byb2Nlc3NpbmdIZWFkZXJzOworCisgICAgUmVmUHRyPFJlc291cmNlSGFu
ZGxlPiBtX3Jlc291cmNlSGFuZGxlOworCisgICAgLy8gdHJ1ZSB3aGVuIHdlJ3JlIGRvbmUgc2Vu
ZGluZyBpbmZvcm1hdGlvbi4gQXQgdGhhdCBwb2ludCwgd2Ugc3RvcAorICAgIC8vIHByb2Nlc3Np
bmcgQWRkRGF0YSByZXF1ZXN0cy4KKyAgICBib29sIG1fc3RvcFNlbmRpbmc7Cit9OworCit9IC8v
IG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBNdWx0aXBhcnRSZXNwb25zZURlbGVnYXRl
X2gK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>118318</attachid>
            <date>2011-12-07 20:05:29 -0800</date>
            <delta_ts>2011-12-08 02:14:15 -0800</delta_ts>
            <desc>patch </desc>
            <filename>0001-Upstream-the-Blackberry-porting-of-multipart-delegat.patch</filename>
            <type>text/plain</type>
            <size>29735</size>
            <attacher name="Chris.Guan">logingx</attacher>
            
              <data encoding="base64">RnJvbSA0NDJlZGNhMjQzMmExOTE1MmU3OTY2ZGExODhmMjJkZTMyNTE0ZjBlIE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBDaHJpcyBHdWFuIDxjaHJpcy5ndWFuQHRvcmNobW9iaWxlLmNv
bS5jbj4KRGF0ZTogVGh1LCA4IERlYyAyMDExIDEyOjAyOjIyICswODAwClN1YmplY3Q6IFtQQVRD
SF0gVXBzdHJlYW0gdGhlIEJsYWNrYmVycnkgcG9ydGluZyBvZiBtdWx0aXBhcnQgZGVsZWdhdGUK
IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD03MzUzMwoKUmV2aWV3ZWQg
YnkgTk9CT0RZIChPT1BTISkuCgpUZXN0IGNhc2VzOgpodHRwOi8vYXZocy5heGlzLmNvbQoKKiBw
bGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvTXVsdGlwYXJ0UmVzcG9uc2VEZWxlZ2F0ZS5jcHA6
IEFkZGVkLgooV2ViQ29yZTo6Y29tcGFyZUNoYXIpOgooV2ViQ29yZTo6c3RyaW5nVG9Mb3dlckFT
Q0lJKToKKFdlYkNvcmU6OnRyaW1TdHJpbmcpOgooV2ViQ29yZTo6Z2V0U3BlY2lmaWNIZWFkZXIp
OgooV2ViQ29yZTo6bG93ZXJDYXNlRXF1YWxzQVNDSUkpOgooV2ViQ29yZTo6ZmluZFN0cmluZ0Vu
ZCk6CihXZWJDb3JlOjpmaW5kRGVsaW1pdGVyKToKKFdlYkNvcmU6OnBhcnNlQ29udGVudFR5cGUp
OgooV2ViQ29yZTo6cHVzaE92ZXJMaW5lKToKKFdlYkNvcmU6Ok11bHRpcGFydFJlc3BvbnNlRGVs
ZWdhdGU6Ok11bHRpcGFydFJlc3BvbnNlRGVsZWdhdGUpOgooV2ViQ29yZTo6TXVsdGlwYXJ0UmVz
cG9uc2VEZWxlZ2F0ZTo6cmVhZE11bHRpcGFydEJvdW5kYXJ5KToKKFdlYkNvcmU6Ok11bHRpcGFy
dFJlc3BvbnNlRGVsZWdhdGU6Om9uUmVjZWl2ZWREYXRhKToKKFdlYkNvcmU6Ok11bHRpcGFydFJl
c3BvbnNlRGVsZWdhdGU6Om9uQ29tcGxldGVkUmVxdWVzdCk6CihXZWJDb3JlOjpNdWx0aXBhcnRS
ZXNwb25zZURlbGVnYXRlOjpwYXJzZUhlYWRlcnMpOgooV2ViQ29yZTo6TXVsdGlwYXJ0UmVzcG9u
c2VEZWxlZ2F0ZTo6ZmluZEJvdW5kYXJ5KToKKiBwbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkv
TXVsdGlwYXJ0UmVzcG9uc2VEZWxlZ2F0ZS5oOiBBZGRlZC4KLS0tCiBTb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgMjggKwogLi4uL2JsYWNrYmVy
cnkvTXVsdGlwYXJ0UmVzcG9uc2VEZWxlZ2F0ZS5jcHAgICAgICAgfCAgNTUyICsrKysrKysrKysr
KysrKysrKysrCiAuLi4vbmV0d29yay9ibGFja2JlcnJ5L011bHRpcGFydFJlc3BvbnNlRGVsZWdh
dGUuaCB8ICAxMTQgKysrKwogMyBmaWxlcyBjaGFuZ2VkLCA2OTQgaW5zZXJ0aW9ucygrKSwgMCBk
ZWxldGlvbnMoLSkKIGNyZWF0ZSBtb2RlIDEwMDY0NCBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9u
ZXR3b3JrL2JsYWNrYmVycnkvTXVsdGlwYXJ0UmVzcG9uc2VEZWxlZ2F0ZS5jcHAKIGNyZWF0ZSBt
b2RlIDEwMDY0NCBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvTXVs
dGlwYXJ0UmVzcG9uc2VEZWxlZ2F0ZS5oCgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvQ2hh
bmdlTG9nIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCmluZGV4IDRkMTc1ZjcuLjAwZGExMDIg
MTAwNzU1Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZworKysgYi9Tb3VyY2UvV2ViQ29y
ZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwzMSBAQAorMjAxMS0xMi0wMiAgQ2hyaXMgR3VhbiAgPGNo
cmlzLmd1YW5AdG9yY2htb2JpbGUuY29tLmNuPgorCisgICAgICAgIFVwc3RyZWFtIHRoZSBCbGFj
a2JlcnJ5IHBvcnRpbmcgb2YgbXVsdGlwYXJ0IGRlbGVnYXRlCisgICAgICAgIGh0dHBzOi8vYnVn
cy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD03MzUzMworCisgICAgICAgIFJldmlld2VkIGJ5
IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFRlc3QgY2FzZXM6CisgICAgICAgIGh0dHA6Ly9h
dmhzLmF4aXMuY29tCisKKyAgICAgICAgKiBwbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvTXVs
dGlwYXJ0UmVzcG9uc2VEZWxlZ2F0ZS5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6Y29t
cGFyZUNoYXIpOgorICAgICAgICAoV2ViQ29yZTo6c3RyaW5nVG9Mb3dlckFTQ0lJKToKKyAgICAg
ICAgKFdlYkNvcmU6OnRyaW1TdHJpbmcpOgorICAgICAgICAoV2ViQ29yZTo6Z2V0U3BlY2lmaWNI
ZWFkZXIpOgorICAgICAgICAoV2ViQ29yZTo6bG93ZXJDYXNlRXF1YWxzQVNDSUkpOgorICAgICAg
ICAoV2ViQ29yZTo6ZmluZFN0cmluZ0VuZCk6CisgICAgICAgIChXZWJDb3JlOjpmaW5kRGVsaW1p
dGVyKToKKyAgICAgICAgKFdlYkNvcmU6OnBhcnNlQ29udGVudFR5cGUpOgorICAgICAgICAoV2Vi
Q29yZTo6cHVzaE92ZXJMaW5lKToKKyAgICAgICAgKFdlYkNvcmU6Ok11bHRpcGFydFJlc3BvbnNl
RGVsZWdhdGU6Ok11bHRpcGFydFJlc3BvbnNlRGVsZWdhdGUpOgorICAgICAgICAoV2ViQ29yZTo6
TXVsdGlwYXJ0UmVzcG9uc2VEZWxlZ2F0ZTo6cmVhZE11bHRpcGFydEJvdW5kYXJ5KToKKyAgICAg
ICAgKFdlYkNvcmU6Ok11bHRpcGFydFJlc3BvbnNlRGVsZWdhdGU6Om9uUmVjZWl2ZWREYXRhKToK
KyAgICAgICAgKFdlYkNvcmU6Ok11bHRpcGFydFJlc3BvbnNlRGVsZWdhdGU6Om9uQ29tcGxldGVk
UmVxdWVzdCk6CisgICAgICAgIChXZWJDb3JlOjpNdWx0aXBhcnRSZXNwb25zZURlbGVnYXRlOjpw
YXJzZUhlYWRlcnMpOgorICAgICAgICAoV2ViQ29yZTo6TXVsdGlwYXJ0UmVzcG9uc2VEZWxlZ2F0
ZTo6ZmluZEJvdW5kYXJ5KToKKyAgICAgICAgKiBwbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkv
TXVsdGlwYXJ0UmVzcG9uc2VEZWxlZ2F0ZS5oOiBBZGRlZC4KKwogMjAxMS0xMS0zMCAgVGFrYXNo
aSBUb3lvc2hpbWEgIDx0b3lvc2hpbUBjaHJvbWl1bS5vcmc+CiAKICAgICAgICAgQWRkIE9WRVJS
SURFIHRvIFdlYlNvY2tldCByZWxhdGVkIHNvdXJjZXMgZm9yIHNhZmUgaW5oZXJpdGFuY2VzLgpk
aWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9ibGFja2JlcnJ5L011
bHRpcGFydFJlc3BvbnNlRGVsZWdhdGUuY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0
d29yay9ibGFja2JlcnJ5L011bHRpcGFydFJlc3BvbnNlRGVsZWdhdGUuY3BwCm5ldyBmaWxlIG1v
ZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3NTIxMjQKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvTXVsdGlwYXJ0UmVzcG9uc2VE
ZWxlZ2F0ZS5jcHAKQEAgLTAsMCArMSw1NTIgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMSBSZXNl
YXJjaCBJbiBNb3Rpb24gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworLy8gQ29weXJp
Z2h0IChjKSAyMDA2LTIwMDggVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHls
ZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisj
aW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiTXVsdGlwYXJ0UmVzcG9uc2VEZWxlZ2F0ZS5o
IgorCisjaW5jbHVkZSAiUmVzb3VyY2VIYW5kbGVDbGllbnQuaCIKKyNpbmNsdWRlIDx3dGYvQVND
SUlDVHlwZS5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKKy8vIFRoYXQgZ2NjIHdhbnRzIGJv
dGggb2YgdGhlc2UgcHJvdG90eXBlcyBzZWVtcyBteXN0ZXJpb3VzLiBWQywgZm9yCisvLyBpdHMg
cGFydCwgY2FuJ3QgZGVjaWRlIHdoaWNoIHRvIHVzZSAoYW5vdGhlciBteXN0ZXJ5KS4gTWF0Y2hp
bmcgb2YKKy8vIHRlbXBsYXRlIG92ZXJsb2FkczogdGhlIGZpbmFsIGZyb250aWVyLgorI2lmbmRl
ZiBfTVNDX1ZFUgordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHNpemVfdCBOPgorY2hhciAoJkFycmF5
U2l6ZUhlbHBlcihjb25zdCBUICgmYXJyYXkpW05dKSlbTl07CisjZW5kaWYKKworI2RlZmluZSBh
cnJheXNpemUoYXJyYXkpIChzaXplb2YoQXJyYXlTaXplSGVscGVyKGFycmF5KSkpCisKKy8vIFRo
ZSBsaXN0IG9mIHJlc3BvbnNlIGhlYWRlcnMgdGhhdCB3ZSBkbyBub3QgY29weSBmcm9tIHRoZSBv
cmlnaW5hbAorLy8gcmVzcG9uc2Ugd2hlbiBnZW5lcmF0aW5nIGEgcmVzcG9zZS4KK3N0YXRpYyBj
b25zdCBjaGFyKiBSZXBsYWNlSGVhZGVyc1tdID0geworICAgICJjb250ZW50LXR5cGUiLAorICAg
ICJjb250ZW50LWxlbmd0aCIsCisgICAgImNvbnRlbnQtZGlzcG9zaXRpb24iLAorICAgICJjb250
ZW50LXJhbmdlIiwKKyAgICAicmFuZ2UiLAorICAgICJzZXQtY29va2llIgorfTsKKworc3RhdGlj
IGJvb2wgY29tcGFyZUNoYXIoY2hhciB4LCBjaGFyIHkpCit7CisgICAgcmV0dXJuIHRvQVNDSUlM
b3dlcih4KSA9PSB0b0FTQ0lJTG93ZXIoeSk7Cit9CisKK3N0YXRpYyB2b2lkIHN0cmluZ1RvTG93
ZXJBU0NJSShzdGQ6OnN0cmluZyYgcykKK3sKKyAgICBmb3IgKHN0ZDo6c3RyaW5nOjppdGVyYXRv
ciBpID0gcy5iZWdpbigpOyBpICE9IHMuZW5kKCk7ICsraSkKKyAgICAgICAgKmkgPSB0b0FTQ0lJ
TG93ZXIoKmkpOworfQorCitlbnVtIFRSSU1QT1NJVElPTlMgeworICAgIFRSSU1fTk9ORSAgICAg
PSAwLAorICAgIFRSSU1fTEVBRElORyAgPSAxIDw8IDAsCisgICAgVFJJTV9UUkFJTElORyA9IDEg
PDwgMSwKKyAgICBUUklNX0FMTCAgICAgID0gVFJJTV9MRUFESU5HIHwgVFJJTV9UUkFJTElORywK
K307CisKK3N0YXRpYyBUUklNUE9TSVRJT05TIHRyaW1TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcm
IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJp
bmc6OnZhbHVlX3R5cGUgdHJpbUNoYXJzW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBUUklNUE9TSVRJT05TIHBvc2l0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHN0ZDo6c3RyaW5nJiBvdXRwdXQpCit7CisgICAgLy8gRmluZCB0aGUgZWRnZXMgb2Yg
bGVhZGluZy90cmFpbGluZyB3aGl0ZXNwYWNlIGFzIGRlc2lyZWQuCisgICAgY29uc3Qgc3RkOjpz
dHJpbmc6OnNpemVfdHlwZSBsYXN0Q2hhciA9IGlucHV0Lmxlbmd0aCgpIC0gMTsKKyAgICBjb25z
dCBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGZpcnN0R29vZENoYXIgPSAocG9zaXRpb25zICYgVFJJ
TV9MRUFESU5HKSA/CisgICAgICAgICAgICAgIGlucHV0LmZpbmRfZmlyc3Rfbm90X29mKHRyaW1D
aGFycykgOiAwOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgbGFzdEdvb2RDaGFy
ID0gKHBvc2l0aW9ucyAmIFRSSU1fVFJBSUxJTkcpID8KKyAgICAgICAgICAgICAgaW5wdXQuZmlu
ZF9sYXN0X25vdF9vZih0cmltQ2hhcnMpIDogbGFzdENoYXI7CisKKyAgICAvLyBXaGVuIHRoZSBz
dHJpbmcgd2FzIGFsbCB3aGl0ZXNwYWNlLCByZXBvcnQgdGhhdCB3ZSBzdHJpcHBlZCBvZmYgd2hp
dGVzcGFjZQorICAgIC8vIGZyb20gd2hpY2hldmVyIHBvc2l0aW9uIHRoZSBjYWxsZXIgd2FzIGlu
dGVyZXN0ZWQgaW4uIEZvciBlbXB0eSBpbnB1dCwgd2UKKyAgICAvLyBzdHJpcHBlZCBubyB3aGl0
ZXNwYWNlLCBidXQgd2Ugc3RpbGwgbmVlZCB0byBjbGVhciB8b3V0cHV0fC4KKyAgICBpZiAoaW5w
dXQuZW1wdHkoKQorICAgICAgICB8fCAoZmlyc3RHb29kQ2hhciA9PSBzdGQ6OnN0cmluZzo6bnBv
cykKKyAgICAgICAgfHwgKGxhc3RHb29kQ2hhciA9PSBzdGQ6OnN0cmluZzo6bnBvcykpIHsKKyAg
ICAgICAgYm9vbCBpbnB1dFdhc0VtcHR5ID0gaW5wdXQuZW1wdHkoKTsKKyAgICAgICAgb3V0cHV0
LmNsZWFyKCk7CisgICAgICAgIHJldHVybiBpbnB1dFdhc0VtcHR5ID8gVFJJTV9OT05FIDogcG9z
aXRpb25zOworICAgIH0KKworICAgIC8vIFRyaW0gdGhlIHdoaXRlc3BhY2UuCisgICAgb3V0cHV0
ID0gaW5wdXQuc3Vic3RyKGZpcnN0R29vZENoYXIsIGxhc3RHb29kQ2hhciAtIGZpcnN0R29vZENo
YXIgKyAxKTsKKworICAgIC8vIFJldHVybiB3aGVyZSB3ZSB0cmltbWVkIGZyb20uCisgICAgcmV0
dXJuIHN0YXRpY19jYXN0PFRSSU1QT1NJVElPTlM+KAorICAgICAgICAoKCFmaXJzdEdvb2RDaGFy
KSA/IFRSSU1fTk9ORSA6IFRSSU1fTEVBRElORykKKyAgICAgICAgfCAoKGxhc3RHb29kQ2hhciA9
PSBsYXN0Q2hhcikgPyBUUklNX05PTkUgOiBUUklNX1RSQUlMSU5HKSk7Cit9CisKK3N0YXRpYyBj
b25zdCBjaGFyIFdoaXRlc3BhY2VBU0NJSVtdID0geworICAgIC8vIDxjb250cm9sLTAwMDk+IHRv
IDxjb250cm9sLTAwMEQ+CisgICAgMHgwOSwKKyAgICAweDBBLAorICAgIDB4MEIsCisgICAgMHgw
QywKKyAgICAweDBELAorICAgIC8vIFNwYWNlCisgICAgMHgyMCwKKyAgICAwCit9OworCitzdGF0
aWMgc3RkOjpzdHJpbmcgZ2V0U3BlY2lmaWNIZWFkZXIoY29uc3Qgc3RkOjpzdHJpbmcmIGhlYWRl
cnMsIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKQoreworICAgIC8vIFdlIHdhbnQgdG8gZ3JhYiB0
aGUgVmFsdWUgZnJvbSB0aGUgIktleTogVmFsdWUiIHBhaXJzIGluIHRoZSBoZWFkZXJzLAorICAg
IC8vIHdoaWNoIHNob3VsZCBsb29rIGxpa2UgdGhpcyAobm8gbGVhZGluZyBzcGFjZXMsIFxuLXNl
cGFyYXRlZCkgKHdlIGZvcm1hdAorICAgIC8vIHRoZW0gdGhpcyB3YXkgaW4gdXJsX3JlcXVlc3Rf
aW5ldC5jYyk6CisgICAgLy8gICAgSFRUUC8xLjEgMjAwIE9LXG4KKyAgICAvLyAgICBFVGFnOiAi
NmQwYjgtOTQ3LTI0ZjM1ZWMwIlxuCisgICAgLy8gICAgQ29udGVudC1MZW5ndGg6IDIzNzVcbgor
ICAgIC8vICAgIENvbnRlbnQtVHlwZTogdGV4dC9odG1sOyBjaGFyc2V0PVVURi04XG4KKyAgICAv
LyAgICBMYXN0LU1vZGlmaWVkOiBTdW4sIDAzIFNlcCAyMDA2IDA0OjM0OjQzIEdNVFxuCisgICAg
aWYgKGhlYWRlcnMuZW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCk7CisKKyAg
ICBzdGQ6OnN0cmluZyBtYXRjaCgnXG4nICsgbmFtZSArICc6Jyk7CisKKyAgICBzdGQ6OnN0cmlu
Zzo6Y29uc3RfaXRlcmF0b3IgYmVnaW4gPQorICAgICAgICBzdGQ6OnNlYXJjaChoZWFkZXJzLmJl
Z2luKCksIGhlYWRlcnMuZW5kKCksIG1hdGNoLmJlZ2luKCksIG1hdGNoLmVuZCgpLAorICAgICAg
ICAgICAgICAgICAgICBjb21wYXJlQ2hhcik7CisKKyAgICBpZiAoYmVnaW4gPT0gaGVhZGVycy5l
bmQoKSkKKyAgICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCk7CisKKyAgICBiZWdpbiArPSBtYXRj
aC5sZW5ndGgoKTsKKyAgICBzdGQ6OnN0cmluZyByZXQ7CisgICAgdHJpbVN0cmluZyhzdGQ6OnN0
cmluZyhiZWdpbiwgZmluZChiZWdpbiwgaGVhZGVycy5lbmQoKSwgJ1xuJykpLCBXaGl0ZXNwYWNl
QVNDSUksIFRSSU1fQUxMLCByZXQpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBib29s
IGxvd2VyQ2FzZUVxdWFsc0FTQ0lJKHN0ZDo6c3RyaW5nOjpjb25zdF9pdGVyYXRvciBiZWdpbiwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nOjpjb25zdF9pdGVy
YXRvciBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBz
KQoreworICAgIGZvciAoc3RkOjpzdHJpbmc6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gYmVnaW47IGl0
ICE9IGVuZDsgKytpdCwgKytzKSB7CisgICAgICAgIGlmICghKnMgfHwgdG9BU0NJSUxvd2VyKCpp
dCkgIT0gKnMpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiAh
KCpzKTsKK30KKworc3RhdGljIHNpemVfdCBmaW5kU3RyaW5nRW5kKGNvbnN0IHN0ZDo6c3RyaW5n
JiBsaW5lLCBzaXplX3Qgc3RhcnQsIGNoYXIgZGVsaW1pdGVyKQoreworICAgIGNvbnN0IGNoYXIg
c2V0W10gPSB7IGRlbGltaXRlciwgJ1xcJywgJ1wwJyB9OworICAgIGZvciAoOzspIHsKKyAgICAg
ICAgLy8gc3RhcnQgcG9pbnRzIHRvIGVpdGhlciB0aGUgc3RhcnQgcXVvdGUgb3IgdGhlIGxhc3QK
KyAgICAgICAgLy8gZXNjYXBlZCBjaGFyICh0aGUgY2hhciBmb2xsb3dpbmcgYSAnXFwnKQorCisg
ICAgICAgIHNpemVfdCBlbmQgPSBsaW5lLmZpbmRfZmlyc3Rfb2Yoc2V0LCBzdGFydCArIDEpOwor
ICAgICAgICBpZiAoZW5kID09IHN0ZDo6c3RyaW5nOjpucG9zKQorICAgICAgICAgICAgcmV0dXJu
IGxpbmUubGVuZ3RoKCk7CisKKyAgICAgICAgaWYgKGxpbmVbZW5kXSA9PSAnXFwnKSB7CisgICAg
ICAgICAgICAvLyBIaXQgYSBiYWNrc2xhc2gtZXNjYXBlZCBjaGFyLiBOZWVkIHRvIHNraXAgb3Zl
ciBpdC4KKyAgICAgICAgICAgIHN0YXJ0ID0gZW5kICsgMTsKKyAgICAgICAgICAgIGlmIChzdGFy
dCA9PSBsaW5lLmxlbmd0aCgpKQorICAgICAgICAgICAgICAgIHJldHVybiBzdGFydDsKKworICAg
ICAgICAgICAgLy8gR28gYmFjayB0byBsb29raW5nIGZvciB0aGUgbmV4dCBlc2NhcGUgb3IgdGhl
IHN0cmluZyBlbmQKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAg
cmV0dXJuIGVuZDsKKyAgICB9CisKKyAgICAvLyBzaG91bGQgbm90IHJlYWNoIGhlcmUKKyAgICBy
ZXR1cm4gbGluZS5sZW5ndGgoKTsKK30KKworc3RhdGljIHNpemVfdCBmaW5kRGVsaW1pdGVyKGNv
bnN0IHN0ZDo6c3RyaW5nJiBsaW5lLCBzaXplX3Qgc2VhcmNoU3RhcnQsIGNoYXIgZGVsaW1pdGVy
KQoreworICAgIGRvIHsKKyAgICAgICAgLy8gc2VhcmNoU3RhcnQgcG9pbnRzIHRvIHRoZSBzcG90
IGZyb20gd2hpY2ggd2Ugc2hvdWxkIHN0YXJ0IGxvb2tpbmcKKyAgICAgICAgLy8gZm9yIHRoZSBk
ZWxpbWl0ZXIuCisgICAgICAgIGNvbnN0IGNoYXIgZGVsaW1pdGVyU2V0W10gPSB7IGRlbGltaXRl
ciwgJyInLCAnXCcnLCAnXDAnIH07CisgICAgICAgIHNpemVfdCBjdXJyZW50RGVsaW1pdGVyUG9z
aXRpb24gPSBsaW5lLmZpbmRfZmlyc3Rfb2YoZGVsaW1pdGVyU2V0LCBzZWFyY2hTdGFydCk7Cisg
ICAgICAgIGlmIChjdXJyZW50RGVsaW1pdGVyUG9zaXRpb24gPT0gc3RkOjpzdHJpbmc6Om5wb3Mp
CisgICAgICAgICAgICByZXR1cm4gbGluZS5sZW5ndGgoKTsKKworICAgICAgICBjaGFyIGNoID0g
bGluZVtjdXJyZW50RGVsaW1pdGVyUG9zaXRpb25dOworICAgICAgICBpZiAoY2ggPT0gZGVsaW1p
dGVyKSB7CisgICAgICAgICAgICAvLyBGb3VuZCBkZWxpbWl0ZXIKKyAgICAgICAgICAgIHJldHVy
biBjdXJyZW50RGVsaW1pdGVyUG9zaXRpb247CisgICAgICAgIH0KKworICAgICAgICAvLyBXZSBo
aXQgdGhlIHN0YXJ0IG9mIGEgcXVvdGVkIHN0cmluZy4gTG9vayBmb3IgaXRzIGVuZC4KKyAgICAg
ICAgc2VhcmNoU3RhcnQgPSBmaW5kU3RyaW5nRW5kKGxpbmUsIGN1cnJlbnREZWxpbWl0ZXJQb3Np
dGlvbiwgY2gpOworICAgICAgICBpZiAoc2VhcmNoU3RhcnQgPT0gbGluZS5sZW5ndGgoKSkKKyAg
ICAgICAgICAgIHJldHVybiBzZWFyY2hTdGFydDsKKworICAgICAgICArK3NlYXJjaFN0YXJ0Owor
CisgICAgICAgIC8vIHNlYXJjaFN0YXJ0IG5vdyBwb2ludHMgdG8gdGhlIGZpcnN0IGNoYXIgYWZ0
ZXIgdGhlIGVuZCBvZiB0aGUKKyAgICAgICAgLy8gc3RyaW5nLCBzbyBqdXN0IGdvIGJhY2sgdG8g
dGhlIHRvcCBvZiB0aGUgbG9vcCBhbmQgbG9vayBmb3IKKyAgICAgICAgLy8gfGRlbGltaXRlcnwg
YWdhaW4uCisgICAgfSB3aGlsZSAodHJ1ZSk7CisKKyAgICByZXR1cm4gbGluZS5sZW5ndGgoKTsK
K30KKworCisKK3N0YXRpYyB2b2lkIHBhcnNlQ29udGVudFR5cGUoY29uc3Qgc3RkOjpzdHJpbmcm
IGNvbnRlbnRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyYg
bWltZVR5cGUsIHN0ZDo6c3RyaW5nJiBjaGFyc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBib29sJiBoYWRDaGFyc2V0KQoreworICAgIC8vIFRyaW0gbGVhZGluZyBhbmQgdHJhaWxp
bmcgd2hpdGVzcGFjZSBmcm9tIHR5cGUuIFdlIGluY2x1ZGUgJygnIGluCisgICAgLy8gdGhlIHRy
YWlsaW5nIHRyaW0gc2V0IHRvIGNhdGNoIG1lZGlhLXR5cGUgY29tbWVudHMsIHdoaWNoIGFyZSBu
b3QgYXQgYWxsCisgICAgLy8gc3RhbmRhcmQsIGJ1dCBtYXkgb2NjdXIgaW4gcmFyZSBjYXNlcy4K
KyAgICBzaXplX3QgdHlwZVZhbHVlID0gY29udGVudFR5cGUuZmluZF9maXJzdF9ub3Rfb2YoIiBc
dCIpOworICAgIHR5cGVWYWx1ZSA9IHN0ZDo6bWluKHR5cGVWYWx1ZSwgY29udGVudFR5cGUubGVu
Z3RoKCkpOworICAgIHNpemVfdCB0eXBlRW5kID0gY29udGVudFR5cGUuZmluZF9maXJzdF9vZigi
IFx0IiI7KCIsIHR5cGVWYWx1ZSk7CisgICAgaWYgKHN0ZDo6c3RyaW5nOjpucG9zID09IHR5cGVF
bmQpCisgICAgICAgIHR5cGVFbmQgPSBjb250ZW50VHlwZS5sZW5ndGgoKTsKKworICAgIHNpemVf
dCBjaGFyc2V0VmFsdWUgPSAwOworICAgIHNpemVfdCBjaGFyc2V0RW5kID0gMDsKKworICAgIC8v
IEl0ZXJhdGUgb3ZlciBwYXJhbWV0ZXJzCisgICAgYm9vbCB0eXBlSGFzQ2hhcnNldCA9IGZhbHNl
OworICAgIHNpemVfdCBwYXJhbWV0ZXJTdGFydCA9IGNvbnRlbnRUeXBlLmZpbmRfZmlyc3Rfb2Yo
JzsnLCB0eXBlRW5kKTsKKyAgICBpZiAocGFyYW1ldGVyU3RhcnQgIT0gc3RkOjpzdHJpbmc6Om5w
b3MpIHsKKyAgICAgICAgLy8gV2UgaGF2ZSBwYXJhbWV0ZXJzLiBJdGVyYXRlIG92ZXIgdGhlbS4K
KyAgICAgICAgc2l6ZV90IGN1clBhcmFtU3RhcnQgPSBwYXJhbWV0ZXJTdGFydCArIDE7CisgICAg
ICAgIGRvIHsKKyAgICAgICAgICAgIHNpemVfdCBjdXJyZW50UGFyYW1ldGVyRW5kID0gZmluZERl
bGltaXRlcihjb250ZW50VHlwZSwgY3VyUGFyYW1TdGFydCwgJzsnKTsKKworICAgICAgICAgICAg
c2l6ZV90IHBhcmFtZXRlck5hbWVTdGFydCA9IGNvbnRlbnRUeXBlLmZpbmRfZmlyc3Rfbm90X29m
KCIgXHQiLCBjdXJQYXJhbVN0YXJ0KTsKKyAgICAgICAgICAgIHBhcmFtZXRlck5hbWVTdGFydCA9
IHN0ZDo6bWluKHBhcmFtZXRlck5hbWVTdGFydCwgY3VycmVudFBhcmFtZXRlckVuZCk7CisKKyAg
ICAgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIGNoYXJzZXRTdHJpbmdbXSA9ICJjaGFyc2V0PSI7
CisgICAgICAgICAgICBzaXplX3QgY2hhcnNldEVuZE9mZnNldCA9IHN0ZDo6bWluKHBhcmFtZXRl
ck5hbWVTdGFydCArIHNpemVvZihjaGFyc2V0U3RyaW5nKSAtIDEsIGN1cnJlbnRQYXJhbWV0ZXJF
bmQpOworICAgICAgICAgICAgaWYgKGxvd2VyQ2FzZUVxdWFsc0FTQ0lJKGNvbnRlbnRUeXBlLmJl
Z2luKCkgKyBwYXJhbWV0ZXJOYW1lU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgY29udGVudFR5cGUuYmVnaW4oKSArIGNoYXJzZXRFbmRPZmZzZXQsIGNoYXJzZXRT
dHJpbmcpKSB7CisgICAgICAgICAgICAgICAgY2hhcnNldFZhbHVlID0gcGFyYW1ldGVyTmFtZVN0
YXJ0ICsgc2l6ZW9mKGNoYXJzZXRTdHJpbmcpIC0gMTsKKyAgICAgICAgICAgICAgICBjaGFyc2V0
RW5kID0gY3VycmVudFBhcmFtZXRlckVuZDsKKyAgICAgICAgICAgICAgICB0eXBlSGFzQ2hhcnNl
dCA9IHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGN1clBhcmFtU3RhcnQgPSBj
dXJyZW50UGFyYW1ldGVyRW5kICsgMTsKKyAgICAgICAgfSB3aGlsZSAoY3VyUGFyYW1TdGFydCA8
IGNvbnRlbnRUeXBlLmxlbmd0aCgpKTsKKyAgICB9CisKKyAgICBpZiAodHlwZUhhc0NoYXJzZXQp
IHsKKyAgICAgICAgLy8gVHJpbSBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlIGZyb20g
Y2hhcnNldFZhbHVlLiBXZSBpbmNsdWRlCisgICAgICAgIC8vICcoJyBpbiB0aGUgdHJhaWxpbmcg
dHJpbSBzZXQgdG8gY2F0Y2ggbWVkaWEtdHlwZSBjb21tZW50cywgd2hpY2ggYXJlCisgICAgICAg
IC8vIG5vdCBhdCBhbGwgc3RhbmRhcmQsIGJ1dCBtYXkgb2NjdXIgaW4gcmFyZSBjYXNlcy4KKyAg
ICAgICAgY2hhcnNldFZhbHVlID0gY29udGVudFR5cGUuZmluZF9maXJzdF9ub3Rfb2YoIiBcdCIs
IGNoYXJzZXRWYWx1ZSk7CisgICAgICAgIGNoYXJzZXRWYWx1ZSA9IHN0ZDo6bWluKGNoYXJzZXRW
YWx1ZSwgY2hhcnNldEVuZCk7CisgICAgICAgIGNoYXIgZmlyc3RDaGFyID0gY29udGVudFR5cGVb
Y2hhcnNldFZhbHVlXTsKKyAgICAgICAgaWYgKGZpcnN0Q2hhciA9PSAnIicgfHwgZmlyc3RDaGFy
ID09ICdcJycpIHsKKyAgICAgICAgICAgIGNoYXJzZXRFbmQgPSBmaW5kU3RyaW5nRW5kKGNvbnRl
bnRUeXBlLCBjaGFyc2V0VmFsdWUsIGZpcnN0Q2hhcik7CisgICAgICAgICAgICArK2NoYXJzZXRW
YWx1ZTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBjaGFyc2V0RW5kID0gc3RkOjptaW4o
Y29udGVudFR5cGUuZmluZF9maXJzdF9vZigiIFx0IiAiOygiLCBjaGFyc2V0VmFsdWUpLAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzZXRFbmQpOworICAgIH0KKworICAg
IC8vIElmIHRoZSBzZXJ2ZXIgc2VudCAiKi8qIiwgaXQgaXMgbWVhbmluZ2xlc3MsIHNvIGRvIG5v
dCBzdG9yZSBpdC4KKyAgICAvLyBhbHNvLCBpZiB0eXBlVmFsdWUgaXMgdGhlIHNhbWUgYXMgbWlt
ZVR5cGUsIHRoZW4ganVzdCB1cGRhdGUgdGhlCisgICAgLy8gY2hhcnNldC4gaG93ZXZlciwgaWYg
Y2hhcnNldCBpcyBlbXB0eSBhbmQgbWltZVR5cGUgaGFzbid0CisgICAgLy8gY2hhbmdlZCwgdGhl
biBkb24ndCB3aXBlLW91dCBhbiBleGlzdGluZyBjaGFyc2V0LiBXZQorICAgIC8vIGFsc28gd2Fu
dCB0byByZWplY3QgYSBtaW1lLXR5cGUgaWYgaXQgZG9lcyBub3QgaW5jbHVkZSBhIHNsYXNoLgor
ICAgIC8vIHNvbWUgc2VydmVycyBnaXZlIGp1bmsgYWZ0ZXIgdGhlIGNoYXJzZXQgcGFyYW1ldGVy
LCB3aGljaCBtYXkKKyAgICAvLyBpbmNsdWRlIGEgY29tbWEsIHNvIHRoaXMgY2hlY2sgbWFrZXMg
dXMgYSBiaXQgbW9yZSB0b2xlcmFudC4KKyAgICBpZiAoY29udGVudFR5cGUubGVuZ3RoKCkKKyAg
ICAgICAgJiYgY29udGVudFR5cGUgIT0gIiovKiIKKyAgICAgICAgJiYgY29udGVudFR5cGUuZmlu
ZF9maXJzdF9vZignLycpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIC8vIENvbW1v
biBjYXNlIGhlcmUgaXMgdGhhdCBtaW1lVHlwZSBpcyBlbXB0eQorICAgICAgICBib29sIGVxdWFs
ID0gIW1pbWVUeXBlLmVtcHR5KCkKKyAgICAgICAgICAgICAgICAgICYmIGxvd2VyQ2FzZUVxdWFs
c0FTQ0lJKGNvbnRlbnRUeXBlLmJlZ2luKCkgKyB0eXBlVmFsdWUsCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VHlwZS5iZWdpbigpICsgdHlwZUVuZCwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbWVUeXBlLmRhdGEo
KSk7CisgICAgICAgIGlmICghZXF1YWwpIHsKKyAgICAgICAgICAgIG1pbWVUeXBlLmFzc2lnbihj
b250ZW50VHlwZS5iZWdpbigpICsgdHlwZVZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGNvbnRlbnRUeXBlLmJlZ2luKCkgKyB0eXBlRW5kKTsKKyAgICAgICAgICAgIHN0cmluZ1Rv
TG93ZXJBU0NJSShtaW1lVHlwZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFlcXVhbCB8fCB0
eXBlSGFzQ2hhcnNldCkgeworICAgICAgICAgICAgaGFkQ2hhcnNldCA9IHRydWU7CisgICAgICAg
ICAgICBjaGFyc2V0LmFzc2lnbihjb250ZW50VHlwZS5iZWdpbigpICsgY2hhcnNldFZhbHVlLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFR5cGUuYmVnaW4oKSArIGNoYXJzZXRF
bmQpOworICAgICAgICAgICAgc3RyaW5nVG9Mb3dlckFTQ0lJKGNoYXJzZXQpOworICAgICAgICB9
CisgICAgfQorfQorCisvLyBDaGVja3MgdG8gc2VlIGlmIGRhdGFbcG9zaXRpb25dIGNoYXJhY3Rl
ciBpcyBhIGxpbmUgYnJlYWs7IGhhbmRsZXMgY3JsZiwgbGZsZiwKKy8vIGxmLCBvciBjci4gUmV0
dXJucyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gc2tpcCBvdmVyICgwLCAxIG9yIDIpLgor
c3RhdGljIGludCBwdXNoT3ZlckxpbmUoY29uc3Qgc3RkOjpzdHJpbmcmIGRhdGEsIHNpemVfdCBw
b3NpdGlvbikKK3sKKyAgICBpbnQgb2Zmc2V0ID0gMDsKKyAgICBpZiAocG9zaXRpb24gPCBkYXRh
Lmxlbmd0aCgpICYmIChkYXRhW3Bvc2l0aW9uXSA9PSAnXHInIHx8IGRhdGFbcG9zaXRpb25dID09
ICdcbicpKSB7CisgICAgICAgICsrb2Zmc2V0OworICAgICAgICBpZiAocG9zaXRpb24gKyAxIDwg
ZGF0YS5sZW5ndGgoKSAmJiBkYXRhW3Bvc2l0aW9uICsgMV0gPT0gJ1xuJykKKyAgICAgICAgICAg
ICsrb2Zmc2V0OworICAgIH0KKyAgICByZXR1cm4gb2Zmc2V0OworfQorCitNdWx0aXBhcnRSZXNw
b25zZURlbGVnYXRlOjpNdWx0aXBhcnRSZXNwb25zZURlbGVnYXRlKFBhc3NSZWZQdHI8UmVzb3Vy
Y2VIYW5kbGU+IHJlc291Y2VIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlc291cmNlUmVzcG9uc2UmIHJlc3BvbnNlLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25z
dCBzdGQ6OnN0cmluZyYgYm91bmRhcnkpCisgICAgOiBtX2JvdW5kYXJ5KGJvdW5kYXJ5KQorICAg
ICwgbV9lbmNvZGVkRGF0YUxlbmd0aCgwKQorICAgICwgbV9maXJzdFJlY2VpdmVkRGF0YSh0cnVl
KQorICAgICwgbV9vcmlnaW5hbFJlc3BvbnNlKHJlc3BvbnNlKQorICAgICwgbV9wcm9jZXNzaW5n
SGVhZGVycyhmYWxzZSkKKyAgICAsIG1fcmVzb3VyY2VIYW5kbGUocmVzb3VjZUhhbmRsZSkKKyAg
ICAsIG1fc3RvcFNlbmRpbmcoZmFsc2UpCit7CisgICAgc3RkOjpzdHJpbmcgc2VhcmNoID0gIi0t
IjsKKyAgICBpZiAobV9ib3VuZGFyeS5jb21wYXJlKDAsIHNlYXJjaC5sZW5ndGgoKSwgc2VhcmNo
KSkKKyAgICAgICAgbV9ib3VuZGFyeSA9IHNlYXJjaCArIG1fYm91bmRhcnk7Cit9CisKK2Jvb2wg
TXVsdGlwYXJ0UmVzcG9uc2VEZWxlZ2F0ZTo6cmVhZE11bHRpcGFydEJvdW5kYXJ5KGNvbnN0IHN0
ZDo6c3RyaW5nJiBjb250ZW50VHlwZSwgc3RkOjpzdHJpbmcmIG11bHRpcGFydEJvdW5kYXJ5KQor
eworICAgIHNpemVfdCBib3VuZGFyeVN0YXJ0T2Zmc2V0ID0gY29udGVudFR5cGUuZmluZCgiYm91
bmRhcnk9Iik7CisgICAgaWYgKGJvdW5kYXJ5U3RhcnRPZmZzZXQgPT0gc3RkOjpzdHJpbmc6Om5w
b3MpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGJvdW5kYXJ5U3RhcnRPZmZzZXQgKz0g
c3RybGVuKCJib3VuZGFyeT0iKTsKKyAgICBzaXplX3QgYm91bmRhcnlFbmRPZmZzZXQgPSBjb250
ZW50VHlwZS5maW5kKCc7JywgYm91bmRhcnlTdGFydE9mZnNldCk7CisKKyAgICBpZiAoYm91bmRh
cnlFbmRPZmZzZXQgPT0gc3RkOjpzdHJpbmc6Om5wb3MpCisgICAgICAgIGJvdW5kYXJ5RW5kT2Zm
c2V0ID0gY29udGVudFR5cGUubGVuZ3RoKCk7CisKKyAgICBzaXplX3QgYm91bmRhcnlMZW5ndGgg
PSBib3VuZGFyeUVuZE9mZnNldCAtIGJvdW5kYXJ5U3RhcnRPZmZzZXQ7CisgICAgbXVsdGlwYXJ0
Qm91bmRhcnkgPSBjb250ZW50VHlwZS5zdWJzdHIoYm91bmRhcnlTdGFydE9mZnNldCwgYm91bmRh
cnlMZW5ndGgpOworCisgICAgLy8gVGhlIGJ5dGUgcmFuZ2UgcmVzcG9uc2UgY2FuIGhhdmUgcXVv
dGVkIGJvdW5kYXJ5IHN0cmluZ3MuIFRoaXMgaXMgbGVnYWwKKyAgICAvLyBhcyBwZXIgTUlNRSBz
cGVjaWZpY2F0aW9ucy4gSW5kaXZpZHVhbCBkYXRhIGZyYWdlbWVudHMgaG93ZXZlciBkb24ndAor
ICAgIC8vIGNvbnRhaW4gcXVvdGVkIGJvdW5kYXJ5IHN0cmluZ3MuCisgICAgdHJpbVN0cmluZyht
dWx0aXBhcnRCb3VuZGFyeSwgIlwiIiwgVFJJTV9BTEwsIG11bHRpcGFydEJvdW5kYXJ5KTsKKyAg
ICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBNdWx0aXBhcnRSZXNwb25zZURlbGVnYXRlOjpvblJl
Y2VpdmVkRGF0YShjb25zdCBjaGFyKiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBpbnQgZW5jb2RlZERhdGFMZW5ndGgpCit7CisgICAgLy8g
bV9zdG9wU2VuZGluZyBtZWFucyB0aGF0IHdlJ3ZlIGFscmVhZHkgcmVjZWl2ZWQgdGhlIGZpbmFs
IGJvdW5kYXJ5IHRva2VuLgorICAgIC8vIFRoZSBzZXJ2ZXIgc2hvdWxkIHN0b3Agc2VuZGluZyB1
cyBkYXRhIGF0IHRoaXMgcG9pbnQsIGJ1dCBpZiBpdCBkb2VzLCB3ZQorICAgIC8vIGp1c3QgdGhy
b3cgaXQgYXdheS4KKyAgICBpZiAobV9zdG9wU2VuZGluZykKKyAgICAgICAgcmV0dXJuOworCisg
ICAgbV9kYXRhLmFwcGVuZChkYXRhLCBsZW5ndGgpOworICAgIG1fZW5jb2RlZERhdGFMZW5ndGgg
Kz0gZW5jb2RlZERhdGFMZW5ndGg7CisgICAgaWYgKG1fZmlyc3RSZWNlaXZlZERhdGEpIHsKKyAg
ICAgICAgLy8gU29tZSBzZXJ2ZXJzIGRvbid0IHNlbmQgYSBib3VuZGFyeSB0b2tlbiBiZWZvcmUg
dGhlIGZpcnN0IGNodW5rIG9mCisgICAgICAgIC8vIGRhdGEuIFdlIGhhbmRsZSB0aGlzIGNhc2Ug
YW55d2F5IChHZWNrbyBkb2VzIHRvbykuCisgICAgICAgIG1fZmlyc3RSZWNlaXZlZERhdGEgPSBm
YWxzZTsKKworICAgICAgICAvLyBFYXQgbGVhZGluZyBcclxuCisgICAgICAgIGludCBwb3MgPSBw
dXNoT3ZlckxpbmUobV9kYXRhLCAwKTsKKyAgICAgICAgaWYgKHBvcykKKyAgICAgICAgICAgIG1f
ZGF0YSA9IG1fZGF0YS5zdWJzdHIocG9zKTsKKworICAgICAgICBpZiAobV9kYXRhLmxlbmd0aCgp
IDwgbV9ib3VuZGFyeS5sZW5ndGgoKSArIDIpIHsKKyAgICAgICAgICAgIC8vIFdlIGRvbid0IGhh
dmUgZW5vdWdoIGRhdGEgeWV0IHRvIG1ha2UgYSBib3VuZGFyeSB0b2tlbi4gSnVzdCB3YWl0Cisg
ICAgICAgICAgICAvLyB1bnRpbCB0aGUgbmV4dCBjaHVuayBvZiBkYXRhIGFycml2ZXMuCisgICAg
ICAgICAgICBtX2ZpcnN0UmVjZWl2ZWREYXRhID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybjsK
KyAgICAgICAgfQorCisgICAgICAgIGlmIChtX2RhdGEuY29tcGFyZSgwLCBtX2JvdW5kYXJ5Lmxl
bmd0aCgpLCBtX2JvdW5kYXJ5KSkKKyAgICAgICAgICAgIG1fZGF0YSA9IG1fYm91bmRhcnkgKyAi
XG4iICsgbV9kYXRhOworICAgIH0KKworICAgIC8vIEhlYWRlcnMKKyAgICBpZiAobV9wcm9jZXNz
aW5nSGVhZGVycykgeworICAgICAgICAvLyBFYXQgbGVhZGluZyBcclxuCisgICAgICAgIGludCBw
b3MgPSBwdXNoT3ZlckxpbmUobV9kYXRhLCAwKTsKKyAgICAgICAgaWYgKHBvcykKKyAgICAgICAg
ICAgIG1fZGF0YSA9IG1fZGF0YS5zdWJzdHIocG9zKTsKKworICAgICAgICBpZiAocGFyc2VIZWFk
ZXJzKCkpIHsKKyAgICAgICAgICAgIC8vIFN1Y2Nlc3NmdWxseSBwYXJzZWQgaGVhZGVycy4KKyAg
ICAgICAgICAgIG1fcHJvY2Vzc2luZ0hlYWRlcnMgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsK
KyAgICAgICAgICAgIC8vIEdldCBtb3JlIGRhdGEgYmVmb3JlIHRyeWluZyBhZ2Fpbi4KKyAgICAg
ICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHNpemVfdCBib3VuZGFyeVBv
c2l0aW9uOworICAgIHdoaWxlICgoYm91bmRhcnlQb3NpdGlvbiA9IGZpbmRCb3VuZGFyeSgpKSAh
PSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICBpZiAobV9yZXNvdXJjZUhhbmRsZSAmJiAg
bV9yZXNvdXJjZUhhbmRsZS0+Y2xpZW50KCkpIHsKKyAgICAgICAgICAgIC8vIFN0cmlwIG91dCB0
cmFpbGluZyBcblxyIGNoYXJhY3RlcnMgaW4gdGhlIGJ1ZmZlciBwcmVjZWRpbmcgdGhlCisgICAg
ICAgICAgICAvLyBib3VuZGFyeSBvbiB0aGUgc2FtZSBsaW5lcyBhcyBGaXJlZm94LgorICAgICAg
ICAgICAgaW50IGRhdGFMZW5ndGggPSBib3VuZGFyeVBvc2l0aW9uOworICAgICAgICAgICAgaWYg
KGJvdW5kYXJ5UG9zaXRpb24gPiAwICYmIG1fZGF0YVtib3VuZGFyeVBvc2l0aW9uIC0gMV0gPT0g
J1xuJykgeworICAgICAgICAgICAgICAgIGRhdGFMZW5ndGgtLTsKKyAgICAgICAgICAgICAgICBp
ZiAoYm91bmRhcnlQb3NpdGlvbiA+IDEgJiYgbV9kYXRhW2JvdW5kYXJ5UG9zaXRpb24gLSAyXSA9
PSAnXHInKQorICAgICAgICAgICAgICAgICAgICBkYXRhTGVuZ3RoLS07CisgICAgICAgICAgICB9
CisgICAgICAgICAgICBpZiAoZGF0YUxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICAvLyBT
ZW5kIHRoZSBsYXN0IGRhdGEgY2h1bmsuCisgICAgICAgICAgICAgICAgbV9yZXNvdXJjZUhhbmRs
ZS0+Y2xpZW50KCktPmRpZFJlY2VpdmVEYXRhKG1fcmVzb3VyY2VIYW5kbGUuZ2V0KCksCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1f
ZGF0YS5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGRhdGFMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZW5jb2RlZERhdGFMZW5ndGgpOworICAg
ICAgICAgICAgICAgIG1fZW5jb2RlZERhdGFMZW5ndGggPSAwOworICAgICAgICAgICAgfQorICAg
ICAgICB9CisgICAgICAgIHNpemVfdCBib3VuZGFyeUVuZFBvc2l0aW9uID0gYm91bmRhcnlQb3Np
dGlvbiArIG1fYm91bmRhcnkubGVuZ3RoKCk7CisgICAgICAgIGlmIChib3VuZGFyeUVuZFBvc2l0
aW9uIDwgbV9kYXRhLmxlbmd0aCgpICYmICctJyA9PSBtX2RhdGFbYm91bmRhcnlFbmRQb3NpdGlv
bl0pIHsKKyAgICAgICAgICAgIC8vIFRoaXMgd2FzIHRoZSBsYXN0IGJvdW5kYXJ5IHNvIHdlIGNh
biBzdG9wIHByb2Nlc3NpbmcuCisgICAgICAgICAgICBtX3N0b3BTZW5kaW5nID0gdHJ1ZTsKKyAg
ICAgICAgICAgIG1fZGF0YS5jbGVhcigpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9
CisKKyAgICAgICAgLy8gV2UgY2FuIG5vdyB0aHJvdyBvdXQgZGF0YSB1cCB0aHJvdWdoIHRoZSBi
b3VuZGFyeQorICAgICAgICBpbnQgb2Zmc2V0ID0gcHVzaE92ZXJMaW5lKG1fZGF0YSwgYm91bmRh
cnlFbmRQb3NpdGlvbik7CisgICAgICAgIG1fZGF0YSA9IG1fZGF0YS5zdWJzdHIoYm91bmRhcnlF
bmRQb3NpdGlvbiArIG9mZnNldCk7CisKKyAgICAgICAgLy8gT2ssIGJhY2sgdG8gcGFyc2luZyBo
ZWFkZXJzCisgICAgICAgIGlmICghcGFyc2VIZWFkZXJzKCkpIHsKKyAgICAgICAgICAgIG1fcHJv
Y2Vzc2luZ0hlYWRlcnMgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAg
ICB9CisKKyAgICAvLyBBdCB0aGlzIHBvaW50LCB3ZSBzaG91bGQgc2VuZCBvdmVyIGFueSBkYXRh
IHdlIGhhdmUsIGJ1dCBrZWVwIGVub3VnaCBkYXRhCisgICAgLy8gYnVmZmVyZWQgdG8gaGFuZGxl
IGEgYm91bmRhcnkgdGhhdCBtYXkgaGF2ZSBiZWVuIHRydW5jYXRlZC4KKyAgICBpZiAoIW1fcHJv
Y2Vzc2luZ0hlYWRlcnMgJiYgbV9kYXRhLmxlbmd0aCgpID4gbV9ib3VuZGFyeS5sZW5ndGgoKSkg
eworICAgICAgICAvLyBJZiB0aGUgbGFzdCBjaGFyYWN0ZXIgaXMgYSBuZXcgbGluZSBjaGFyYWN0
ZXIsIGdvIGFoZWFkIGFuZCBqdXN0IHNlbmQKKyAgICAgICAgLy8gZXZlcnl0aGluZyB3ZSBoYXZl
IGJ1ZmZlcmVkLiBUaGlzIG1hdGNoZXMgYW4gb3B0aW1pemF0aW9uIGluIEdlY2tvLgorICAgICAg
ICBpbnQgc2VuZExlbmd0aCA9IG1fZGF0YS5sZW5ndGgoKSAtIG1fYm91bmRhcnkubGVuZ3RoKCk7
CisgICAgICAgIGlmIChtX2RhdGFbbV9kYXRhLmxlbmd0aCgpIC0gMV0gPT0gJ1xuJykKKyAgICAg
ICAgICAgIHNlbmRMZW5ndGggPSBtX2RhdGEubGVuZ3RoKCk7CisgICAgICAgIGlmIChtX3Jlc291
cmNlSGFuZGxlICYmIG1fcmVzb3VyY2VIYW5kbGUtPmNsaWVudCgpKQorICAgICAgICAgICAgbV9y
ZXNvdXJjZUhhbmRsZS0+Y2xpZW50KCktPmRpZFJlY2VpdmVEYXRhKG1fcmVzb3VyY2VIYW5kbGUu
Z2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgbV9kYXRhLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBzZW5kTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZW5jb2RlZERhdGFMZW5ndGgpOworICAg
ICAgICBtX2RhdGEgPSBtX2RhdGEuc3Vic3RyKHNlbmRMZW5ndGgpOworICAgICAgICBtX2VuY29k
ZWREYXRhTGVuZ3RoID0gMDsKKyAgICB9Cit9CisKK3ZvaWQgTXVsdGlwYXJ0UmVzcG9uc2VEZWxl
Z2F0ZTo6b25Db21wbGV0ZWRSZXF1ZXN0KCkKK3sKKyAgICAvLyBJZiB3ZSBoYXZlIGFueSBwZW5k
aW5nIGRhdGEgYW5kIHdlJ3JlIG5vdCBpbiBhIGhlYWRlciwgZ28gYWhlYWQgYW5kIHNlbmQKKyAg
ICAvLyBpdCB0byBXZWJDb3JlLgorICAgIGlmICghbV9wcm9jZXNzaW5nSGVhZGVycyAmJiAhbV9k
YXRhLmVtcHR5KCkgJiYgIW1fc3RvcFNlbmRpbmcgJiYgbV9yZXNvdXJjZUhhbmRsZSAmJiBtX3Jl
c291cmNlSGFuZGxlLT5jbGllbnQoKSkgeworICAgICAgICBtX3Jlc291cmNlSGFuZGxlLT5jbGll
bnQoKS0+ZGlkUmVjZWl2ZURhdGEobV9yZXNvdXJjZUhhbmRsZS5nZXQoKSwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZGF0YS5kYXRhKCksCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2RhdGEu
bGVuZ3RoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBtX2VuY29kZWREYXRhTGVuZ3RoKTsKKyAgICAgICAgbV9lbmNvZGVkRGF0YUxlbmd0aCA9
IDA7CisgICAgfQorfQorCitib29sIE11bHRpcGFydFJlc3BvbnNlRGVsZWdhdGU6OnBhcnNlSGVh
ZGVycygpCit7CisgICAgaW50IGxpbmVGZWVkSW5jcmVtZW50ID0gMTsKKworICAgIC8vIEdyYWIg
dGhlIGhlYWRlcnMgYmVpbmcgbGliZXJhbCBhYm91dCBsaW5lIGVuZGluZ3MuCisgICAgc2l6ZV90
IGxpbmVTdGFydFBvc2l0aW9uID0gMDsKKyAgICBzaXplX3QgbGluZUVuZFBvc2l0aW9uID0gbV9k
YXRhLmZpbmQoJ1xuJyk7CisgICAgd2hpbGUgKGxpbmVFbmRQb3NpdGlvbiAhPSBzdGQ6OnN0cmlu
Zzo6bnBvcykgeworICAgICAgICAvLyBIYW5kbGUgQ1JMRgorICAgICAgICBpZiAobGluZUVuZFBv
c2l0aW9uID4gbGluZVN0YXJ0UG9zaXRpb24gJiYgbV9kYXRhW2xpbmVFbmRQb3NpdGlvbiAtIDFd
ID09ICdccicpIHsKKyAgICAgICAgICAgIGxpbmVGZWVkSW5jcmVtZW50ID0gMjsKKyAgICAgICAg
ICAgIC0tbGluZUVuZFBvc2l0aW9uOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGxpbmVG
ZWVkSW5jcmVtZW50ID0gMTsKKworICAgICAgICBpZiAobGluZVN0YXJ0UG9zaXRpb24gPT0gbGlu
ZUVuZFBvc2l0aW9uKSB7CisgICAgICAgICAgICAvLyBBIGJsYW5rIGxpbmUsIGVuZCBvZiBoZWFk
ZXJzCisgICAgICAgICAgICBsaW5lRW5kUG9zaXRpb24gKz0gbGluZUZlZWRJbmNyZW1lbnQ7Cisg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAvLyBGaW5kIHRoZSBuZXh0IGhl
YWRlciBsaW5lLgorICAgICAgICBsaW5lU3RhcnRQb3NpdGlvbiA9IGxpbmVFbmRQb3NpdGlvbiAr
IGxpbmVGZWVkSW5jcmVtZW50OworICAgICAgICBsaW5lRW5kUG9zaXRpb24gPSBtX2RhdGEuZmlu
ZCgnXG4nLCBsaW5lU3RhcnRQb3NpdGlvbik7CisgICAgfQorICAgIC8vIFRydW5jYXRlZCBpbiB0
aGUgbWlkZGxlIG9mIGEgaGVhZGVyLCBzdG9wIHBhcnNpbmcuCisgICAgaWYgKGxpbmVFbmRQb3Np
dGlvbiA9PSBzdGQ6OnN0cmluZzo6bnBvcykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAg
Ly8gRWF0IGhlYWRlcnMKKyAgICBzdGQ6OnN0cmluZyBoZWFkZXJzKCJcbiIpOworICAgIGhlYWRl
cnMuYXBwZW5kKG1fZGF0YSwgMCwgbGluZUVuZFBvc2l0aW9uKTsKKyAgICBtX2RhdGEgPSBtX2Rh
dGEuc3Vic3RyKGxpbmVFbmRQb3NpdGlvbik7CisKKyAgICAvLyBDcmVhdGUgYSBXZWJVUkxSZXNw
b25zZSBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgc2V0IG9mIGhlYWRlcnMgKyB0aGUKKyAgICAvLyBy
ZXBsYWNlbWVudCBoZWFkZXJzLiBXZSBvbmx5IHJlcGxhY2UgdGhlIHNhbWUgZmV3IGhlYWRlcnMg
dGhhdCBnZWNrbworICAgIC8vIGRvZXMuIFNlZSBuZXR3ZXJrL3N0cmVhbWNvbnYvY29udmVydGVy
cy9uc011bHRpTWl4ZWRDb252LmNwcC4KKworICAgIHN0ZDo6c3RyaW5nIGNvbnRlbnRUeXBlID0g
Z2V0U3BlY2lmaWNIZWFkZXIoaGVhZGVycywgImNvbnRlbnQtdHlwZSIpOworICAgIHN0ZDo6c3Ry
aW5nIG1pbWVUeXBlOworICAgIHN0ZDo6c3RyaW5nIGNoYXJzZXQ7CisgICAgYm9vbCBoYXNDaGFy
c2V0ID0gZmFsc2U7CisKKyAgICBwYXJzZUNvbnRlbnRUeXBlKGNvbnRlbnRUeXBlLCBtaW1lVHlw
ZSwgY2hhcnNldCwgaGFzQ2hhcnNldCk7CisgICAgUmVzb3VyY2VSZXNwb25zZSByZXNwb25zZTsK
KyAgICByZXNwb25zZS5zZXRVUkwobV9vcmlnaW5hbFJlc3BvbnNlLnVybCgpKTsKKyAgICByZXNw
b25zZS5zZXRNaW1lVHlwZShTdHJpbmc6OmZyb21VVEY4KG1pbWVUeXBlLmRhdGEoKSkpOworICAg
IGlmIChoYXNDaGFyc2V0KQorICAgICAgICByZXNwb25zZS5zZXRUZXh0RW5jb2RpbmdOYW1lKFN0
cmluZzo6ZnJvbVVURjgoY2hhcnNldC5kYXRhKCkpKTsKKworICAgIGNvbnN0IFdlYkNvcmU6OkhU
VFBIZWFkZXJNYXAmIG1hcCA9IG1fb3JpZ2luYWxSZXNwb25zZS5odHRwSGVhZGVyRmllbGRzKCk7
CisgICAgZm9yIChXZWJDb3JlOjpIVFRQSGVhZGVyTWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IG1h
cC5iZWdpbigpOyBpdCAhPSBtYXAuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgYm9vbCBuZWVkc0Fk
ZCA9IHRydWU7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXJyYXlzaXplKFJlcGxh
Y2VIZWFkZXJzKTsgKytpKSB7CisgICAgICAgICAgICBpZiAoaXQtPmZpcnN0Lmxvd2VyKCkgPT0g
UmVwbGFjZUhlYWRlcnNbaV0pIHsKKyAgICAgICAgICAgICAgICBuZWVkc0FkZCA9IGZhbHNlOwor
ICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAg
IGlmIChuZWVkc0FkZCkKKyAgICAgICAgICAgIHJlc3BvbnNlLnNldEhUVFBIZWFkZXJGaWVsZChp
dC0+Zmlyc3QsIGl0LT5zZWNvbmQpOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBp
IDwgYXJyYXlzaXplKFJlcGxhY2VIZWFkZXJzKTsgKytpKSB7CisgICAgICAgIHN0ZDo6c3RyaW5n
IG5hbWUoUmVwbGFjZUhlYWRlcnNbaV0pOworICAgICAgICBzdGQ6OnN0cmluZyB2YWx1ZSA9IGdl
dFNwZWNpZmljSGVhZGVyKGhlYWRlcnMsIG5hbWUpOworICAgICAgICBpZiAoIXZhbHVlLmVtcHR5
KCkpIHsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNldEhUVFBIZWFkZXJGaWVsZChTdHJpbmc6OmZy
b21VVEY4KG5hbWUuZGF0YSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBTdHJpbmc6OmZyb21VVEY4KHZhbHVlLmRhdGEoKSkpOworICAgICAgICB9CisgICAgfQor
CisgICAgaWYgKG1fcmVzb3VyY2VIYW5kbGUgJiYgbV9yZXNvdXJjZUhhbmRsZS0+Y2xpZW50KCkp
IHsKKyAgICAgICAgLy8gQWZ0ZXIgcGFyc2VkIHRoZSBoZWFkZXJzIHN1Y2Nlc3NmdWxseSwgdGhl
IG11bHRpcGFydCBwYWdlcyB3aWxsIG5vdCBiZSBzdG9yZWQgaW4gcGFnZQorICAgICAgICAvLyBj
YWNoZSBhbnkgbW9yZSwgYmVjYXVzZSBnbyBiYWNrL2ZvcndhcmQgYWN0aW9ucyBuZWVkIGdldHRp
bmcgdGhlIGxhdGVzdCBkYXRhIGZyb20gc2VydmVyLgorICAgICAgICByZXNwb25zZS5zZXRJc011
bHRpcGFydFBheWxvYWQodHJ1ZSk7CisgICAgICAgIG1fcmVzb3VyY2VIYW5kbGUtPmNsaWVudCgp
LT5kaWRSZWNlaXZlUmVzcG9uc2UobV9yZXNvdXJjZUhhbmRsZS5nZXQoKSwgcmVzcG9uc2UpOwor
ICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQm91bmRhcmllcyBhcmUgc3VwcG9zZWQg
dG8gYmUgcHJlY2VlZGVkIHdpdGggLS0sIGJ1dCBpdCBsb29rcyBsaWtlIGdlY2tvCisvLyBkb2Vz
bid0IHJlcXVpcmUgdGhlIGRhc2hlcyB0byBleGlzdC4gU2VlIG5zTXVsdGlNaXhlZENvbnY6OkZp
bmRUb2tlbi4KK3NpemVfdCBNdWx0aXBhcnRSZXNwb25zZURlbGVnYXRlOjpmaW5kQm91bmRhcnko
KQoreworICAgIHNpemVfdCBib3VuZGFyeVBvc2l0aW9uID0gbV9kYXRhLmZpbmQobV9ib3VuZGFy
eSk7CisgICAgaWYgKGJvdW5kYXJ5UG9zaXRpb24gIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAg
ICAgICAgLy8gQmFjayB1cCBvdmVyIC0tIGZvciBiYWNrd2FyZHMgY29tcGF0CisgICAgICAgIC8v
IEZJWE1FKHRjKTogRG9uJ3Qgd2Ugb25seSB3YW50IHRvIGRvIHRoaXMgb25jZT8gR2Vja28gY29k
ZSBkb2Vzbid0IHNlZW0KKyAgICAgICAgLy8gdG8gY2FyZS4KKyAgICAgICAgaWYgKGJvdW5kYXJ5
UG9zaXRpb24gPj0gMikgeworICAgICAgICAgICAgaWYgKCctJyA9PSBtX2RhdGFbYm91bmRhcnlQ
b3NpdGlvbiAtIDFdICYmICctJyA9PSBtX2RhdGFbYm91bmRhcnlQb3NpdGlvbiAtIDJdKSB7Cisg
ICAgICAgICAgICAgICAgYm91bmRhcnlQb3NpdGlvbiAtPSAyOworICAgICAgICAgICAgICAgIG1f
Ym91bmRhcnkgPSAiLS0iICsgbV9ib3VuZGFyeTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQor
ICAgIH0KKyAgICByZXR1cm4gYm91bmRhcnlQb3NpdGlvbjsKK30KKworfSAvLyBuYW1lc3BhY2Ug
V2ViQ29yZQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9ibGFj
a2JlcnJ5L011bHRpcGFydFJlc3BvbnNlRGVsZWdhdGUuaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL25ldHdvcmsvYmxhY2tiZXJyeS9NdWx0aXBhcnRSZXNwb25zZURlbGVnYXRlLmgKbmV3IGZp
bGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZlYTk3YwotLS0gL2Rldi9udWxsCisrKyBi
L1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvYmxhY2tiZXJyeS9NdWx0aXBhcnRSZXNw
b25zZURlbGVnYXRlLmgKQEAgLTAsMCArMSwxMTQgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMSBS
ZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIE1vc3Qg
b2YgbG9naWMgYW5kIGZ1bmN0aW9ucyBhcmUgYmFzZSBvbiBDaHJvbWl1bSBicm93c2VyJ3MgaW1w
bGVtYW50aW9ucyBpbgorLy8gd2Via2l0L2dsdWUvbXVsdGlwYXJ0X3Jlc3BvbnNlX2RlbGVnYXRl
LmNjCisKKworLy8gQ29weXJpZ2h0IChjKSAyMDA2LTIwMDkgVGhlIENocm9taXVtIEF1dGhvcnMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zl
cm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUg
TElDRU5TRSBmaWxlLgorLy8KKy8vIEEgZGVsZWdhdGUgY2xhc3Mgb2YgV2ViVVJMTG9hZGVySW1w
bCB0aGF0IGhhbmRsZXMgbXVsdGlwYXJ0L3gtbWl4ZWQtcmVwbGFjZQorLy8gZGF0YS4gV2Ugc3Bl
Y2lhbCBjYXNlIG11bHRpcGFydC94LW1peGVkLXJlcGxhY2UgYmVjYXVzZSBXZWJDb3JlIGV4cGVj
dHMgYQorLy8gc2VwYXJhdGUgZGlkUmVjZWl2ZVJlc3BvbnNlIGZvciBlYWNoIG5ldyBtZXNzYWdl
IHBhcnQuCisvLworLy8gTW9zdCBvZiB0aGUgbG9naWMgYW5kIGVkZ2UgY2FzZSBoYW5kbGluZyBh
cmUgYmFzZWQgb24gdGhlIE1vemlsbGEncworLy8gaW1wbGVtZW50YXRpb24gaW4gbmV0d2Vyay9z
dHJlYW1jb252L2NvbnZlcnRlcnMvbnNNdWx0aU1peGVkQ29udi5jcHAuCisvLyBUaGlzIHNlZW1z
IGxpa2UgYSBkZXJpdmF0aXZlIHdvcmssIHNvIGhlcmUncyB0aGUgb3JpZ2luYWwgbGljZW5zZToK
KworLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgorICogVmVyc2lvbjogTVBMIDEu
MS9HUEwgMi4wL0xHUEwgMi4xCisgKgorICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUg
c3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCisgKiAxLjEgKHRo
ZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlh
bmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExp
Y2Vuc2UgYXQKKyAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLworICoKKyAqIFNvZnR3YXJl
IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJ
UyIgYmFzaXMsCisgKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVz
cyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKKyAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3Vh
Z2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCisgKiBMaWNlbnNl
LgorICoKKyAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIG1vemlsbGEub3JnIGNvZGUuCisgKgorICog
VGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCisgKiBOZXRzY2Fw
ZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbi4KKyAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhl
IEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDE5OTgKKyAqIHRoZSBJbml0aWFs
IERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBDb250cmlidXRvcihzKToK
KyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1
c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMg
TGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCisgKiB0aGUgR05VIExl
c3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxH
UEwiKSwKKyAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUg
TEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCisgKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdp
c2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQorICogdW5k
ZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFs
bG93IG90aGVycyB0bworICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhl
IHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKKyAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5n
IHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCisg
KiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJ
ZiB5b3UgZG8gbm90IGRlbGV0ZQorICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50
IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgorICogdGhlIHRlcm1zIG9m
IGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KKyAqCisgKiAqKioqKiBF
TkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLworCisjaWZuZGVmIE11bHRpcGFydFJlc3BvbnNlRGVs
ZWdhdGVfaAorI2RlZmluZSBNdWx0aXBhcnRSZXNwb25zZURlbGVnYXRlX2gKKworI2luY2x1ZGUg
IlJlc291cmNlSGFuZGxlLmgiCisjaW5jbHVkZSAiUmVzb3VyY2VSZXNwb25zZS5oIgorI2luY2x1
ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBNdWx0aXBhcnRSZXNw
b25zZURlbGVnYXRlIHsKK3B1YmxpYzoKKyAgICBNdWx0aXBhcnRSZXNwb25zZURlbGVnYXRlKFBh
c3NSZWZQdHI8UmVzb3VyY2VIYW5kbGU+IHJlc291Y2VIYW5kbGUsCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBjb25zdCBSZXNvdXJjZVJlc3BvbnNlJiwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBib3VuZGFyeSk7CisgICAgc3RhdGljIGJv
b2wgcmVhZE11bHRpcGFydEJvdW5kYXJ5KGNvbnN0IHN0ZDo6c3RyaW5nJiBjb250ZW50VHlwZSwg
c3RkOjpzdHJpbmcmIG11bHRpcGFydEJvdW5kYXJ5KTsKKyAgICB2b2lkIG9uUmVjZWl2ZWREYXRh
KGNvbnN0IGNoYXIqIGRhdGEsIGludCBsZW5ndGgsIGludCBlbmNvZGVkRGF0YUxlbmd0aCk7Cisg
ICAgdm9pZCBvbkNvbXBsZXRlZFJlcXVlc3QoKTsKKworcHJpdmF0ZToKKworICAgIC8vIENoZWNr
cyB0byBzZWUgaWYgZGF0YVtwb3NdIGNoYXJhY3RlciBpcyBhIGxpbmUgYnJlYWs7IGhhbmRsZXMg
Y3JsZiwgbGZsZiwKKyAgICAvLyBsZiwgb3IgY3IuIFJldHVybnMgdGhlIG51bWJlciBvZiBjaGFy
YWN0ZXJzIHRvIHNraXAgb3ZlciAoMCwgMSBvciAyKS4KKworICAgIC8vIFRyaWVzIHRvIHBhcnNl
IGh0dHAgaGVhZGVycyBmcm9tIHRoZSBzdGFydCBvZiBkYXRhXy4gUmV0dXJucyB0cnVlIGlmIGl0
CisgICAgLy8gc3VjY2VlZHMgYW5kIHNlbmRzIGEgZGlkUmVjZWl2ZVJlc3BvbnNlIHRvIG1fY2xp
ZW50LiBSZXR1cm5zIGZhbHNlIGlmCisgICAgLy8gdGhlIGhlYWRlciBpcyBpbmNvbXBsZXRlIChp
biB3aGljaCBjYXNlIHdlIGp1c3Qgd2FpdCBmb3IgbW9yZSBkYXRhKS4KKyAgICBib29sIHBhcnNl
SGVhZGVycygpOworCisgICAgLy8gRmluZCB0aGUgbmV4dCBib3VuZGFyeSBpbiBkYXRhXy4gUmV0
dXJucyBzdGQ6OnN0cmluZzo6bnBvcyBpZiB0aGVyZSdzIG5vCisgICAgLy8gZnVsbCB0b2tlbi4K
KyAgICBzaXplX3QgZmluZEJvdW5kYXJ5KCk7CisKKyAgICAvLyBNdWx0aXBhcnQgYm91bmRhcnkg
dG9rZW4uCisgICAgc3RkOjpzdHJpbmcgbV9ib3VuZGFyeTsKKworICAgIC8vIEEgdGVtcG9yYXJ5
IGJ1ZmZlciB0byBob2xkIGRhdGEgYmV0d2VlbiByZWFkcyBmb3IgbXVsdGlwYXJ0IGRhdGEgdGhh
dAorICAgIC8vIGdldHMgc3BsaXQgaW4gdGhlIG1pZGRsZSBvZiBhIGhlYWRlci4KKyAgICBzdGQ6
OnN0cmluZyBtX2RhdGE7CisKKyAgICBpbnQgbV9lbmNvZGVkRGF0YUxlbmd0aDsKKworICAgIC8v
IFRydWUgdW50aWwgd2UncmUgcmVjZWl2ZWQgdGhlIGZpcnN0IGRhdGEuCisgICAgYm9vbCBtX2Zp
cnN0UmVjZWl2ZWREYXRhOworCisgICAgLy8gVGhlIG9yaWdpbmFsIHJlc291cmNlIHJlc3BvbnNl
IGZvciB0aGlzIHJlcXVlc3QuIFdlIHVzZSB0aGlzIGFzIGEKKyAgICAvLyBzdGFydGluZyBwb2lu
dCBmb3IgZWFjaCBwYXJ0cyByZXNwb25zZS4KKyAgICBjb25zdCBSZXNvdXJjZVJlc3BvbnNlJiBt
X29yaWdpbmFsUmVzcG9uc2U7CisKKyAgICAvLyBUcnVlIGlmIHdlJ3JlIHRydW5jYXRlZCBpbiB0
aGUgbWlkZGxlIG9mIGEgaGVhZGVyLgorICAgIGJvb2wgbV9wcm9jZXNzaW5nSGVhZGVyczsKKwor
ICAgIFJlZlB0cjxSZXNvdXJjZUhhbmRsZT4gbV9yZXNvdXJjZUhhbmRsZTsKKworICAgIC8vIFRy
dWUgd2hlbiB3ZSdyZSBkb25lIHNlbmRpbmcgaW5mb3JtYXRpb24uIEF0IHRoYXQgcG9pbnQsIHdl
IHN0b3AKKyAgICAvLyBwcm9jZXNzaW5nIEFkZERhdGEgcmVxdWVzdHMuCisgICAgYm9vbCBtX3N0
b3BTZW5kaW5nOworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gTXVs
dGlwYXJ0UmVzcG9uc2VEZWxlZ2F0ZV9oCi0tIAoxLjcuNS40Cgo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>118353</attachid>
            <date>2011-12-08 02:14:15 -0800</date>
            <delta_ts>2011-12-09 00:37:32 -0800</delta_ts>
            <desc>patch </desc>
            <filename>0001-Upstream-the-Blackberry-porting-of-multipart-delegat.patch</filename>
            <type>text/plain</type>
            <size>29698</size>
            <attacher name="Chris.Guan">logingx</attacher>
            
              <data encoding="base64">RnJvbSBhOTAyZTMxZTNlMjYzMTMwYTYxZTEwOTc1NWQ2NWZjNzI2MWExNjYxIE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBDaHJpcyBHdWFuIDxjaHJpcy5ndWFuQHRvcmNobW9iaWxlLmNv
bS5jbj4KRGF0ZTogVGh1LCA4IERlYyAyMDExIDEyOjAyOjIyICswODAwClN1YmplY3Q6IFtQQVRD
SF0gVXBzdHJlYW0gdGhlIEJsYWNrYmVycnkgcG9ydGluZyBvZiBtdWx0aXBhcnQgZGVsZWdhdGUK
IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD03MzUzMwoKUmV2aWV3ZWQg
YnkgTk9CT0RZIChPT1BTISkuCgpUZXN0IGNhc2VzOgpodHRwOi8vYXZocy5heGlzLmNvbQoKKiBw
bGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvTXVsdGlwYXJ0UmVzcG9uc2VEZWxlZ2F0ZS5jcHA6
IEFkZGVkLgooV2ViQ29yZTo6Y29tcGFyZUNoYXIpOgooV2ViQ29yZTo6c3RyaW5nVG9Mb3dlckFT
Q0lJKToKKFdlYkNvcmU6OnRyaW1TdHJpbmcpOgooV2ViQ29yZTo6Z2V0U3BlY2lmaWNIZWFkZXIp
OgooV2ViQ29yZTo6bG93ZXJDYXNlRXF1YWxzQVNDSUkpOgooV2ViQ29yZTo6ZmluZFN0cmluZ0Vu
ZCk6CihXZWJDb3JlOjpmaW5kRGVsaW1pdGVyKToKKFdlYkNvcmU6OnBhcnNlQ29udGVudFR5cGUp
OgooV2ViQ29yZTo6cHVzaE92ZXJMaW5lKToKKFdlYkNvcmU6Ok11bHRpcGFydFJlc3BvbnNlRGVs
ZWdhdGU6Ok11bHRpcGFydFJlc3BvbnNlRGVsZWdhdGUpOgooV2ViQ29yZTo6TXVsdGlwYXJ0UmVz
cG9uc2VEZWxlZ2F0ZTo6cmVhZE11bHRpcGFydEJvdW5kYXJ5KToKKFdlYkNvcmU6Ok11bHRpcGFy
dFJlc3BvbnNlRGVsZWdhdGU6Om9uUmVjZWl2ZWREYXRhKToKKFdlYkNvcmU6Ok11bHRpcGFydFJl
c3BvbnNlRGVsZWdhdGU6Om9uQ29tcGxldGVkUmVxdWVzdCk6CihXZWJDb3JlOjpNdWx0aXBhcnRS
ZXNwb25zZURlbGVnYXRlOjpwYXJzZUhlYWRlcnMpOgooV2ViQ29yZTo6TXVsdGlwYXJ0UmVzcG9u
c2VEZWxlZ2F0ZTo6ZmluZEJvdW5kYXJ5KToKKiBwbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkv
TXVsdGlwYXJ0UmVzcG9uc2VEZWxlZ2F0ZS5oOiBBZGRlZC4KLS0tCiBTb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgMjggKwogLi4uL2JsYWNrYmVy
cnkvTXVsdGlwYXJ0UmVzcG9uc2VEZWxlZ2F0ZS5jcHAgICAgICAgfCAgNTUyICsrKysrKysrKysr
KysrKysrKysrCiAuLi4vbmV0d29yay9ibGFja2JlcnJ5L011bHRpcGFydFJlc3BvbnNlRGVsZWdh
dGUuaCB8ICAxMTEgKysrKwogMyBmaWxlcyBjaGFuZ2VkLCA2OTEgaW5zZXJ0aW9ucygrKSwgMCBk
ZWxldGlvbnMoLSkKIGNyZWF0ZSBtb2RlIDEwMDY0NCBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9u
ZXR3b3JrL2JsYWNrYmVycnkvTXVsdGlwYXJ0UmVzcG9uc2VEZWxlZ2F0ZS5jcHAKIGNyZWF0ZSBt
b2RlIDEwMDY0NCBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvTXVs
dGlwYXJ0UmVzcG9uc2VEZWxlZ2F0ZS5oCgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvQ2hh
bmdlTG9nIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCmluZGV4IDRkMTc1ZjcuLjAwZGExMDIg
MTAwNzU1Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZworKysgYi9Tb3VyY2UvV2ViQ29y
ZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwzMSBAQAorMjAxMS0xMi0wMiAgQ2hyaXMgR3VhbiAgPGNo
cmlzLmd1YW5AdG9yY2htb2JpbGUuY29tLmNuPgorCisgICAgICAgIFVwc3RyZWFtIHRoZSBCbGFj
a2JlcnJ5IHBvcnRpbmcgb2YgbXVsdGlwYXJ0IGRlbGVnYXRlCisgICAgICAgIGh0dHBzOi8vYnVn
cy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD03MzUzMworCisgICAgICAgIFJldmlld2VkIGJ5
IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFRlc3QgY2FzZXM6CisgICAgICAgIGh0dHA6Ly9h
dmhzLmF4aXMuY29tCisKKyAgICAgICAgKiBwbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvTXVs
dGlwYXJ0UmVzcG9uc2VEZWxlZ2F0ZS5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6Y29t
cGFyZUNoYXIpOgorICAgICAgICAoV2ViQ29yZTo6c3RyaW5nVG9Mb3dlckFTQ0lJKToKKyAgICAg
ICAgKFdlYkNvcmU6OnRyaW1TdHJpbmcpOgorICAgICAgICAoV2ViQ29yZTo6Z2V0U3BlY2lmaWNI
ZWFkZXIpOgorICAgICAgICAoV2ViQ29yZTo6bG93ZXJDYXNlRXF1YWxzQVNDSUkpOgorICAgICAg
ICAoV2ViQ29yZTo6ZmluZFN0cmluZ0VuZCk6CisgICAgICAgIChXZWJDb3JlOjpmaW5kRGVsaW1p
dGVyKToKKyAgICAgICAgKFdlYkNvcmU6OnBhcnNlQ29udGVudFR5cGUpOgorICAgICAgICAoV2Vi
Q29yZTo6cHVzaE92ZXJMaW5lKToKKyAgICAgICAgKFdlYkNvcmU6Ok11bHRpcGFydFJlc3BvbnNl
RGVsZWdhdGU6Ok11bHRpcGFydFJlc3BvbnNlRGVsZWdhdGUpOgorICAgICAgICAoV2ViQ29yZTo6
TXVsdGlwYXJ0UmVzcG9uc2VEZWxlZ2F0ZTo6cmVhZE11bHRpcGFydEJvdW5kYXJ5KToKKyAgICAg
ICAgKFdlYkNvcmU6Ok11bHRpcGFydFJlc3BvbnNlRGVsZWdhdGU6Om9uUmVjZWl2ZWREYXRhKToK
KyAgICAgICAgKFdlYkNvcmU6Ok11bHRpcGFydFJlc3BvbnNlRGVsZWdhdGU6Om9uQ29tcGxldGVk
UmVxdWVzdCk6CisgICAgICAgIChXZWJDb3JlOjpNdWx0aXBhcnRSZXNwb25zZURlbGVnYXRlOjpw
YXJzZUhlYWRlcnMpOgorICAgICAgICAoV2ViQ29yZTo6TXVsdGlwYXJ0UmVzcG9uc2VEZWxlZ2F0
ZTo6ZmluZEJvdW5kYXJ5KToKKyAgICAgICAgKiBwbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkv
TXVsdGlwYXJ0UmVzcG9uc2VEZWxlZ2F0ZS5oOiBBZGRlZC4KKwogMjAxMS0xMS0zMCAgVGFrYXNo
aSBUb3lvc2hpbWEgIDx0b3lvc2hpbUBjaHJvbWl1bS5vcmc+CiAKICAgICAgICAgQWRkIE9WRVJS
SURFIHRvIFdlYlNvY2tldCByZWxhdGVkIHNvdXJjZXMgZm9yIHNhZmUgaW5oZXJpdGFuY2VzLgpk
aWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9ibGFja2JlcnJ5L011
bHRpcGFydFJlc3BvbnNlRGVsZWdhdGUuY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0
d29yay9ibGFja2JlcnJ5L011bHRpcGFydFJlc3BvbnNlRGVsZWdhdGUuY3BwCm5ldyBmaWxlIG1v
ZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhMGMxYWMKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvTXVsdGlwYXJ0UmVzcG9uc2VE
ZWxlZ2F0ZS5jcHAKQEAgLTAsMCArMSw1NTIgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMSBSZXNl
YXJjaCBJbiBNb3Rpb24gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworLy8gQ29weXJp
Z2h0IChjKSAyMDA2LTIwMDggVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHls
ZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisj
aW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiTXVsdGlwYXJ0UmVzcG9uc2VEZWxlZ2F0ZS5o
IgorCisjaW5jbHVkZSAiUmVzb3VyY2VIYW5kbGVDbGllbnQuaCIKKyNpbmNsdWRlIDx3dGYvQVND
SUlDVHlwZS5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKKy8vIFRoYXQgZ2NjIHdhbnRzIGJv
dGggb2YgdGhlc2UgcHJvdG90eXBlcyBzZWVtcyBteXN0ZXJpb3VzLiBWQywgZm9yCisvLyBpdHMg
cGFydCwgY2FuJ3QgZGVjaWRlIHdoaWNoIHRvIHVzZSAoYW5vdGhlciBteXN0ZXJ5KS4gTWF0Y2hp
bmcgb2YKKy8vIHRlbXBsYXRlIG92ZXJsb2FkczogdGhlIGZpbmFsIGZyb250aWVyLgorI2lmbmRl
ZiBfTVNDX1ZFUgordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHNpemVfdCBOPgorY2hhciAoJkFycmF5
U2l6ZUhlbHBlcihjb25zdCBUICgmYXJyYXkpW05dKSlbTl07CisjZW5kaWYKKworI2RlZmluZSBh
cnJheXNpemUoYXJyYXkpIChzaXplb2YoQXJyYXlTaXplSGVscGVyKGFycmF5KSkpCisKKy8vIFRo
ZSBsaXN0IG9mIHJlc3BvbnNlIGhlYWRlcnMgdGhhdCB3ZSBkbyBub3QgY29weSBmcm9tIHRoZSBv
cmlnaW5hbAorLy8gcmVzcG9uc2Ugd2hlbiBnZW5lcmF0aW5nIGEgcmVzcG9zZS4KK3N0YXRpYyBj
b25zdCBjaGFyKiBSZXBsYWNlSGVhZGVyc1tdID0geworICAgICJjb250ZW50LXR5cGUiLAorICAg
ICJjb250ZW50LWxlbmd0aCIsCisgICAgImNvbnRlbnQtZGlzcG9zaXRpb24iLAorICAgICJjb250
ZW50LXJhbmdlIiwKKyAgICAicmFuZ2UiLAorICAgICJzZXQtY29va2llIgorfTsKKworc3RhdGlj
IGJvb2wgY29tcGFyZUNoYXIoY2hhciB4LCBjaGFyIHkpCit7CisgICAgcmV0dXJuIHRvQVNDSUlM
b3dlcih4KSA9PSB0b0FTQ0lJTG93ZXIoeSk7Cit9CisKK3N0YXRpYyB2b2lkIHN0cmluZ1RvTG93
ZXJBU0NJSShzdGQ6OnN0cmluZyYgcykKK3sKKyAgICBmb3IgKHN0ZDo6c3RyaW5nOjppdGVyYXRv
ciBpID0gcy5iZWdpbigpOyBpICE9IHMuZW5kKCk7ICsraSkKKyAgICAgICAgKmkgPSB0b0FTQ0lJ
TG93ZXIoKmkpOworfQorCitlbnVtIFRSSU1QT1NJVElPTlMgeworICAgIFRSSU1fTk9ORSAgICAg
PSAwLAorICAgIFRSSU1fTEVBRElORyAgPSAxIDw8IDAsCisgICAgVFJJTV9UUkFJTElORyA9IDEg
PDwgMSwKKyAgICBUUklNX0FMTCAgICAgID0gVFJJTV9MRUFESU5HIHwgVFJJTV9UUkFJTElORywK
K307CisKK3N0YXRpYyBUUklNUE9TSVRJT05TIHRyaW1TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcm
IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJp
bmc6OnZhbHVlX3R5cGUgdHJpbUNoYXJzW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBUUklNUE9TSVRJT05TIHBvc2l0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHN0ZDo6c3RyaW5nJiBvdXRwdXQpCit7CisgICAgLy8gRmluZCB0aGUgZWRnZXMgb2Yg
bGVhZGluZy90cmFpbGluZyB3aGl0ZXNwYWNlIGFzIGRlc2lyZWQuCisgICAgY29uc3Qgc3RkOjpz
dHJpbmc6OnNpemVfdHlwZSBsYXN0Q2hhciA9IGlucHV0Lmxlbmd0aCgpIC0gMTsKKyAgICBjb25z
dCBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGZpcnN0R29vZENoYXIgPSAocG9zaXRpb25zICYgVFJJ
TV9MRUFESU5HKSA/CisgICAgICAgICAgICAgIGlucHV0LmZpbmRfZmlyc3Rfbm90X29mKHRyaW1D
aGFycykgOiAwOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgbGFzdEdvb2RDaGFy
ID0gKHBvc2l0aW9ucyAmIFRSSU1fVFJBSUxJTkcpID8KKyAgICAgICAgICAgICAgaW5wdXQuZmlu
ZF9sYXN0X25vdF9vZih0cmltQ2hhcnMpIDogbGFzdENoYXI7CisKKyAgICAvLyBXaGVuIHRoZSBz
dHJpbmcgd2FzIGFsbCB3aGl0ZXNwYWNlLCByZXBvcnQgdGhhdCB3ZSBzdHJpcHBlZCBvZmYgd2hp
dGVzcGFjZQorICAgIC8vIGZyb20gd2hpY2hldmVyIHBvc2l0aW9uIHRoZSBjYWxsZXIgd2FzIGlu
dGVyZXN0ZWQgaW4uIEZvciBlbXB0eSBpbnB1dCwgd2UKKyAgICAvLyBzdHJpcHBlZCBubyB3aGl0
ZXNwYWNlLCBidXQgd2Ugc3RpbGwgbmVlZCB0byBjbGVhciB8b3V0cHV0fC4KKyAgICBpZiAoaW5w
dXQuZW1wdHkoKQorICAgICAgICB8fCAoZmlyc3RHb29kQ2hhciA9PSBzdGQ6OnN0cmluZzo6bnBv
cykKKyAgICAgICAgfHwgKGxhc3RHb29kQ2hhciA9PSBzdGQ6OnN0cmluZzo6bnBvcykpIHsKKyAg
ICAgICAgYm9vbCBpbnB1dFdhc0VtcHR5ID0gaW5wdXQuZW1wdHkoKTsKKyAgICAgICAgb3V0cHV0
LmNsZWFyKCk7CisgICAgICAgIHJldHVybiBpbnB1dFdhc0VtcHR5ID8gVFJJTV9OT05FIDogcG9z
aXRpb25zOworICAgIH0KKworICAgIC8vIFRyaW0gdGhlIHdoaXRlc3BhY2UuCisgICAgb3V0cHV0
ID0gaW5wdXQuc3Vic3RyKGZpcnN0R29vZENoYXIsIGxhc3RHb29kQ2hhciAtIGZpcnN0R29vZENo
YXIgKyAxKTsKKworICAgIC8vIFJldHVybiB3aGVyZSB3ZSB0cmltbWVkIGZyb20uCisgICAgcmV0
dXJuIHN0YXRpY19jYXN0PFRSSU1QT1NJVElPTlM+KAorICAgICAgICAoKCFmaXJzdEdvb2RDaGFy
KSA/IFRSSU1fTk9ORSA6IFRSSU1fTEVBRElORykKKyAgICAgICAgfCAoKGxhc3RHb29kQ2hhciA9
PSBsYXN0Q2hhcikgPyBUUklNX05PTkUgOiBUUklNX1RSQUlMSU5HKSk7Cit9CisKK3N0YXRpYyBj
b25zdCBjaGFyIFdoaXRlc3BhY2VBU0NJSVtdID0geworICAgIC8vIDxjb250cm9sLTAwMDk+IHRv
IDxjb250cm9sLTAwMEQ+CisgICAgMHgwOSwKKyAgICAweDBBLAorICAgIDB4MEIsCisgICAgMHgw
QywKKyAgICAweDBELAorICAgIC8vIFNwYWNlCisgICAgMHgyMCwKKyAgICAwCit9OworCitzdGF0
aWMgc3RkOjpzdHJpbmcgZ2V0U3BlY2lmaWNIZWFkZXIoY29uc3Qgc3RkOjpzdHJpbmcmIGhlYWRl
cnMsIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKQoreworICAgIC8vIFdlIHdhbnQgdG8gZ3JhYiB0
aGUgVmFsdWUgZnJvbSB0aGUgIktleTogVmFsdWUiIHBhaXJzIGluIHRoZSBoZWFkZXJzLAorICAg
IC8vIHdoaWNoIHNob3VsZCBsb29rIGxpa2UgdGhpcyAobm8gbGVhZGluZyBzcGFjZXMsIFxuLXNl
cGFyYXRlZCkgKHdlIGZvcm1hdAorICAgIC8vIHRoZW0gdGhpcyB3YXkgaW4gdXJsX3JlcXVlc3Rf
aW5ldC5jYyk6CisgICAgLy8gICAgSFRUUC8xLjEgMjAwIE9LXG4KKyAgICAvLyAgICBFVGFnOiAi
NmQwYjgtOTQ3LTI0ZjM1ZWMwIlxuCisgICAgLy8gICAgQ29udGVudC1MZW5ndGg6IDIzNzVcbgor
ICAgIC8vICAgIENvbnRlbnQtVHlwZTogdGV4dC9odG1sOyBjaGFyc2V0PVVURi04XG4KKyAgICAv
LyAgICBMYXN0LU1vZGlmaWVkOiBTdW4sIDAzIFNlcCAyMDA2IDA0OjM0OjQzIEdNVFxuCisgICAg
aWYgKGhlYWRlcnMuZW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCk7CisKKyAg
ICBzdGQ6OnN0cmluZyBtYXRjaCgnXG4nICsgbmFtZSArICc6Jyk7CisKKyAgICBzdGQ6OnN0cmlu
Zzo6Y29uc3RfaXRlcmF0b3IgYmVnaW4gPQorICAgICAgICBzdGQ6OnNlYXJjaChoZWFkZXJzLmJl
Z2luKCksIGhlYWRlcnMuZW5kKCksIG1hdGNoLmJlZ2luKCksIG1hdGNoLmVuZCgpLAorICAgICAg
ICAgICAgICAgICAgICBjb21wYXJlQ2hhcik7CisKKyAgICBpZiAoYmVnaW4gPT0gaGVhZGVycy5l
bmQoKSkKKyAgICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCk7CisKKyAgICBiZWdpbiArPSBtYXRj
aC5sZW5ndGgoKTsKKyAgICBzdGQ6OnN0cmluZyByZXR1cm5TdHJpbmc7CisgICAgdHJpbVN0cmlu
ZyhzdGQ6OnN0cmluZyhiZWdpbiwgZmluZChiZWdpbiwgaGVhZGVycy5lbmQoKSwgJ1xuJykpLCBX
aGl0ZXNwYWNlQVNDSUksIFRSSU1fQUxMLCByZXR1cm5TdHJpbmcpOworICAgIHJldHVybiByZXR1
cm5TdHJpbmc7Cit9CisKK3N0YXRpYyBib29sIGxvd2VyQ2FzZUVxdWFsc0FTQ0lJKHN0ZDo6c3Ry
aW5nOjpjb25zdF9pdGVyYXRvciBiZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIHN0ZDo6c3RyaW5nOjpjb25zdF9pdGVyYXRvciBlbmQsCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzKQoreworICAgIGZvciAoc3RkOjpzdHJpbmc6OmNv
bnN0X2l0ZXJhdG9yIGl0ID0gYmVnaW47IGl0ICE9IGVuZDsgKytpdCwgKytzKSB7CisgICAgICAg
IGlmICghKnMgfHwgdG9BU0NJSUxvd2VyKCppdCkgIT0gKnMpCisgICAgICAgICAgICByZXR1cm4g
ZmFsc2U7CisgICAgfQorICAgIHJldHVybiAhKCpzKTsKK30KKworc3RhdGljIHNpemVfdCBmaW5k
U3RyaW5nRW5kKGNvbnN0IHN0ZDo6c3RyaW5nJiBsaW5lLCBzaXplX3Qgc3RhcnQsIGNoYXIgZGVs
aW1pdGVyKQoreworICAgIGNvbnN0IGNoYXIgc2V0W10gPSB7IGRlbGltaXRlciwgJ1xcJywgJ1ww
JyB9OworICAgIGZvciAoOzspIHsKKyAgICAgICAgLy8gU3RhcnQgcG9pbnRzIHRvIGVpdGhlciB0
aGUgc3RhcnQgcXVvdGUgb3IgdGhlIGxhc3QKKyAgICAgICAgLy8gZXNjYXBlZCBjaGFyICh0aGUg
Y2hhciBmb2xsb3dpbmcgYSAnXFwnKS4KKworICAgICAgICBzaXplX3QgZW5kID0gbGluZS5maW5k
X2ZpcnN0X29mKHNldCwgc3RhcnQgKyAxKTsKKyAgICAgICAgaWYgKGVuZCA9PSBzdGQ6OnN0cmlu
Zzo6bnBvcykKKyAgICAgICAgICAgIHJldHVybiBsaW5lLmxlbmd0aCgpOworCisgICAgICAgIGlm
IChsaW5lW2VuZF0gPT0gJ1xcJykgeworICAgICAgICAgICAgLy8gSGl0IGEgYmFja3NsYXNoLWVz
Y2FwZWQgY2hhci4gTmVlZCB0byBza2lwIG92ZXIgaXQuCisgICAgICAgICAgICBzdGFydCA9IGVu
ZCArIDE7CisgICAgICAgICAgICBpZiAoc3RhcnQgPT0gbGluZS5sZW5ndGgoKSkKKyAgICAgICAg
ICAgICAgICByZXR1cm4gc3RhcnQ7CisKKyAgICAgICAgICAgIC8vIEdvIGJhY2sgdG8gbG9va2lu
ZyBmb3IgdGhlIG5leHQgZXNjYXBlIG9yIHRoZSBzdHJpbmcgZW5kLgorICAgICAgICAgICAgY29u
dGludWU7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZW5kOworICAgIH0KKworICAgIC8v
IHNob3VsZCBub3QgcmVhY2ggaGVyZS4KKyAgICByZXR1cm4gbGluZS5sZW5ndGgoKTsKK30KKwor
c3RhdGljIHNpemVfdCBmaW5kRGVsaW1pdGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBsaW5lLCBzaXpl
X3Qgc2VhcmNoU3RhcnQsIGNoYXIgZGVsaW1pdGVyKQoreworICAgIGRvIHsKKyAgICAgICAgLy8g
c2VhcmNoU3RhcnQgcG9pbnRzIHRvIHRoZSBzcG90IGZyb20gd2hpY2ggd2Ugc2hvdWxkIHN0YXJ0
IGxvb2tpbmcKKyAgICAgICAgLy8gZm9yIHRoZSBkZWxpbWl0ZXIuCisgICAgICAgIGNvbnN0IGNo
YXIgZGVsaW1pdGVyU2V0W10gPSB7IGRlbGltaXRlciwgJyInLCAnXCcnLCAnXDAnIH07CisgICAg
ICAgIHNpemVfdCBjdXJyZW50RGVsaW1pdGVyUG9zaXRpb24gPSBsaW5lLmZpbmRfZmlyc3Rfb2Yo
ZGVsaW1pdGVyU2V0LCBzZWFyY2hTdGFydCk7CisgICAgICAgIGlmIChjdXJyZW50RGVsaW1pdGVy
UG9zaXRpb24gPT0gc3RkOjpzdHJpbmc6Om5wb3MpCisgICAgICAgICAgICByZXR1cm4gbGluZS5s
ZW5ndGgoKTsKKworICAgICAgICBjaGFyIGN1cnJlbnRDaGFyID0gbGluZVtjdXJyZW50RGVsaW1p
dGVyUG9zaXRpb25dOworICAgICAgICBpZiAoY3VycmVudENoYXIgPT0gZGVsaW1pdGVyKSB7Cisg
ICAgICAgICAgICAvLyBGb3VuZCBkZWxpbWl0ZXIuCisgICAgICAgICAgICByZXR1cm4gY3VycmVu
dERlbGltaXRlclBvc2l0aW9uOworICAgICAgICB9CisKKyAgICAgICAgLy8gV2UgaGl0IHRoZSBz
dGFydCBvZiBhIHF1b3RlZCBzdHJpbmcuIExvb2sgZm9yIGl0cyBlbmQuCisgICAgICAgIHNlYXJj
aFN0YXJ0ID0gZmluZFN0cmluZ0VuZChsaW5lLCBjdXJyZW50RGVsaW1pdGVyUG9zaXRpb24sIGN1
cnJlbnRDaGFyKTsKKyAgICAgICAgaWYgKHNlYXJjaFN0YXJ0ID09IGxpbmUubGVuZ3RoKCkpCisg
ICAgICAgICAgICByZXR1cm4gc2VhcmNoU3RhcnQ7CisKKyAgICAgICAgKytzZWFyY2hTdGFydDsK
KworICAgICAgICAvLyBzZWFyY2hTdGFydCBub3cgcG9pbnRzIHRvIHRoZSBmaXJzdCBjaGFyIGFm
dGVyIHRoZSBlbmQgb2YgdGhlCisgICAgICAgIC8vIHN0cmluZywgc28ganVzdCBnbyBiYWNrIHRv
IHRoZSB0b3Agb2YgdGhlIGxvb3AgYW5kIGxvb2sgZm9yCisgICAgICAgIC8vIHxkZWxpbWl0ZXJ8
IGFnYWluLgorICAgIH0gd2hpbGUgKHRydWUpOworCisgICAgcmV0dXJuIGxpbmUubGVuZ3RoKCk7
Cit9CisKKworCitzdGF0aWMgdm9pZCBwYXJzZUNvbnRlbnRUeXBlKGNvbnN0IHN0ZDo6c3RyaW5n
JiBjb250ZW50VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcm
IG1pbWVUeXBlLCBzdGQ6OnN0cmluZyYgY2hhcnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgYm9vbCYgaGFkQ2hhcnNldCkKK3sKKyAgICAvLyBUcmltIGxlYWRpbmcgYW5kIHRyYWls
aW5nIHdoaXRlc3BhY2UgZnJvbSB0eXBlLiBXZSBpbmNsdWRlICcoJyBpbgorICAgIC8vIHRoZSB0
cmFpbGluZyB0cmltIHNldCB0byBjYXRjaCBtZWRpYS10eXBlIGNvbW1lbnRzLCB3aGljaCBhcmUg
bm90IGF0IGFsbAorICAgIC8vIHN0YW5kYXJkLCBidXQgbWF5IG9jY3VyIGluIHJhcmUgY2FzZXMu
CisgICAgc2l6ZV90IHR5cGVWYWx1ZSA9IGNvbnRlbnRUeXBlLmZpbmRfZmlyc3Rfbm90X29mKCIg
XHQiKTsKKyAgICB0eXBlVmFsdWUgPSBzdGQ6Om1pbih0eXBlVmFsdWUsIGNvbnRlbnRUeXBlLmxl
bmd0aCgpKTsKKyAgICBzaXplX3QgdHlwZUVuZCA9IGNvbnRlbnRUeXBlLmZpbmRfZmlyc3Rfb2Yo
IiBcdCIiOygiLCB0eXBlVmFsdWUpOworICAgIGlmIChzdGQ6OnN0cmluZzo6bnBvcyA9PSB0eXBl
RW5kKQorICAgICAgICB0eXBlRW5kID0gY29udGVudFR5cGUubGVuZ3RoKCk7CisKKyAgICBzaXpl
X3QgY2hhcnNldFZhbHVlID0gMDsKKyAgICBzaXplX3QgY2hhcnNldEVuZCA9IDA7CisKKyAgICAv
LyBJdGVyYXRlIG92ZXIgcGFyYW1ldGVycworICAgIGJvb2wgdHlwZUhhc0NoYXJzZXQgPSBmYWxz
ZTsKKyAgICBzaXplX3QgcGFyYW1ldGVyU3RhcnQgPSBjb250ZW50VHlwZS5maW5kX2ZpcnN0X29m
KCc7JywgdHlwZUVuZCk7CisgICAgaWYgKHBhcmFtZXRlclN0YXJ0ICE9IHN0ZDo6c3RyaW5nOjpu
cG9zKSB7CisgICAgICAgIC8vIFdlIGhhdmUgcGFyYW1ldGVycy4gSXRlcmF0ZSBvdmVyIHRoZW0u
CisgICAgICAgIHNpemVfdCBjdXJyZW50UGFyYW1TdGFydCA9IHBhcmFtZXRlclN0YXJ0ICsgMTsK
KyAgICAgICAgZG8geworICAgICAgICAgICAgc2l6ZV90IGN1cnJlbnRQYXJhbWV0ZXJFbmQgPSBm
aW5kRGVsaW1pdGVyKGNvbnRlbnRUeXBlLCBjdXJyZW50UGFyYW1TdGFydCwgJzsnKTsKKworICAg
ICAgICAgICAgc2l6ZV90IHBhcmFtZXRlck5hbWVTdGFydCA9IGNvbnRlbnRUeXBlLmZpbmRfZmly
c3Rfbm90X29mKCIgXHQiLCBjdXJyZW50UGFyYW1TdGFydCk7CisgICAgICAgICAgICBwYXJhbWV0
ZXJOYW1lU3RhcnQgPSBzdGQ6Om1pbihwYXJhbWV0ZXJOYW1lU3RhcnQsIGN1cnJlbnRQYXJhbWV0
ZXJFbmQpOworCisgICAgICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBjaGFyc2V0U3RyaW5nW10g
PSAiY2hhcnNldD0iOworICAgICAgICAgICAgc2l6ZV90IGNoYXJzZXRFbmRPZmZzZXQgPSBzdGQ6
Om1pbihwYXJhbWV0ZXJOYW1lU3RhcnQgKyBzaXplb2YoY2hhcnNldFN0cmluZykgLSAxLCBjdXJy
ZW50UGFyYW1ldGVyRW5kKTsKKyAgICAgICAgICAgIGlmIChsb3dlckNhc2VFcXVhbHNBU0NJSShj
b250ZW50VHlwZS5iZWdpbigpICsgcGFyYW1ldGVyTmFtZVN0YXJ0LAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlLmJlZ2luKCkgKyBjaGFyc2V0RW5kT2Zm
c2V0LCBjaGFyc2V0U3RyaW5nKSkgeworICAgICAgICAgICAgICAgIGNoYXJzZXRWYWx1ZSA9IHBh
cmFtZXRlck5hbWVTdGFydCArIHNpemVvZihjaGFyc2V0U3RyaW5nKSAtIDE7CisgICAgICAgICAg
ICAgICAgY2hhcnNldEVuZCA9IGN1cnJlbnRQYXJhbWV0ZXJFbmQ7CisgICAgICAgICAgICAgICAg
dHlwZUhhc0NoYXJzZXQgPSB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjdXJy
ZW50UGFyYW1TdGFydCA9IGN1cnJlbnRQYXJhbWV0ZXJFbmQgKyAxOworICAgICAgICB9IHdoaWxl
IChjdXJyZW50UGFyYW1TdGFydCA8IGNvbnRlbnRUeXBlLmxlbmd0aCgpKTsKKyAgICB9CisKKyAg
ICBpZiAodHlwZUhhc0NoYXJzZXQpIHsKKyAgICAgICAgLy8gVHJpbSBsZWFkaW5nIGFuZCB0cmFp
bGluZyB3aGl0ZXNwYWNlIGZyb20gY2hhcnNldFZhbHVlLiBXZSBpbmNsdWRlCisgICAgICAgIC8v
ICcoJyBpbiB0aGUgdHJhaWxpbmcgdHJpbSBzZXQgdG8gY2F0Y2ggbWVkaWEtdHlwZSBjb21tZW50
cywgd2hpY2ggYXJlCisgICAgICAgIC8vIG5vdCBhdCBhbGwgc3RhbmRhcmQsIGJ1dCBtYXkgb2Nj
dXIgaW4gcmFyZSBjYXNlcy4KKyAgICAgICAgY2hhcnNldFZhbHVlID0gY29udGVudFR5cGUuZmlu
ZF9maXJzdF9ub3Rfb2YoIiBcdCIsIGNoYXJzZXRWYWx1ZSk7CisgICAgICAgIGNoYXJzZXRWYWx1
ZSA9IHN0ZDo6bWluKGNoYXJzZXRWYWx1ZSwgY2hhcnNldEVuZCk7CisgICAgICAgIGNoYXIgZmly
c3RDaGFyID0gY29udGVudFR5cGVbY2hhcnNldFZhbHVlXTsKKyAgICAgICAgaWYgKGZpcnN0Q2hh
ciA9PSAnIicgfHwgZmlyc3RDaGFyID09ICdcJycpIHsKKyAgICAgICAgICAgIGNoYXJzZXRFbmQg
PSBmaW5kU3RyaW5nRW5kKGNvbnRlbnRUeXBlLCBjaGFyc2V0VmFsdWUsIGZpcnN0Q2hhcik7Cisg
ICAgICAgICAgICArK2NoYXJzZXRWYWx1ZTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBj
aGFyc2V0RW5kID0gc3RkOjptaW4oY29udGVudFR5cGUuZmluZF9maXJzdF9vZigiIFx0IiAiOygi
LCBjaGFyc2V0VmFsdWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJz
ZXRFbmQpOworICAgIH0KKworICAgIC8vIElmIHRoZSBzZXJ2ZXIgc2VudCAiKi8qIiwgaXQgaXMg
bWVhbmluZ2xlc3MsIHNvIGRvIG5vdCBzdG9yZSBpdC4KKyAgICAvLyBhbHNvLCBpZiB0eXBlVmFs
dWUgaXMgdGhlIHNhbWUgYXMgbWltZVR5cGUsIHRoZW4ganVzdCB1cGRhdGUgdGhlCisgICAgLy8g
Y2hhcnNldC4gaG93ZXZlciwgaWYgY2hhcnNldCBpcyBlbXB0eSBhbmQgbWltZVR5cGUgaGFzbid0
CisgICAgLy8gY2hhbmdlZCwgdGhlbiBkb24ndCB3aXBlLW91dCBhbiBleGlzdGluZyBjaGFyc2V0
LiBXZQorICAgIC8vIGFsc28gd2FudCB0byByZWplY3QgYSBtaW1lLXR5cGUgaWYgaXQgZG9lcyBu
b3QgaW5jbHVkZSBhIHNsYXNoLgorICAgIC8vIHNvbWUgc2VydmVycyBnaXZlIGp1bmsgYWZ0ZXIg
dGhlIGNoYXJzZXQgcGFyYW1ldGVyLCB3aGljaCBtYXkKKyAgICAvLyBpbmNsdWRlIGEgY29tbWEs
IHNvIHRoaXMgY2hlY2sgbWFrZXMgdXMgYSBiaXQgbW9yZSB0b2xlcmFudC4KKyAgICBpZiAoY29u
dGVudFR5cGUubGVuZ3RoKCkKKyAgICAgICAgJiYgY29udGVudFR5cGUgIT0gIiovKiIKKyAgICAg
ICAgJiYgY29udGVudFR5cGUuZmluZF9maXJzdF9vZignLycpICE9IHN0ZDo6c3RyaW5nOjpucG9z
KSB7CisgICAgICAgIC8vIENvbW1vbiBjYXNlIGhlcmUgaXMgdGhhdCBtaW1lVHlwZSBpcyBlbXB0
eQorICAgICAgICBib29sIGVxdWFsID0gIW1pbWVUeXBlLmVtcHR5KCkKKyAgICAgICAgICAgICAg
ICAgICAgICYmIGxvd2VyQ2FzZUVxdWFsc0FTQ0lJKGNvbnRlbnRUeXBlLmJlZ2luKCkgKyB0eXBl
VmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250
ZW50VHlwZS5iZWdpbigpICsgdHlwZUVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIG1pbWVUeXBlLmRhdGEoKSk7CisgICAgICAgIGlmICghZXF1YWwpIHsK
KyAgICAgICAgICAgIG1pbWVUeXBlLmFzc2lnbihjb250ZW50VHlwZS5iZWdpbigpICsgdHlwZVZh
bHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlLmJlZ2luKCkgKyB0
eXBlRW5kKTsKKyAgICAgICAgICAgIHN0cmluZ1RvTG93ZXJBU0NJSShtaW1lVHlwZSk7CisgICAg
ICAgIH0KKyAgICAgICAgaWYgKCFlcXVhbCB8fCB0eXBlSGFzQ2hhcnNldCkgeworICAgICAgICAg
ICAgaGFkQ2hhcnNldCA9IHRydWU7CisgICAgICAgICAgICBjaGFyc2V0LmFzc2lnbihjb250ZW50
VHlwZS5iZWdpbigpICsgY2hhcnNldFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
Y29udGVudFR5cGUuYmVnaW4oKSArIGNoYXJzZXRFbmQpOworICAgICAgICAgICAgc3RyaW5nVG9M
b3dlckFTQ0lJKGNoYXJzZXQpOworICAgICAgICB9CisgICAgfQorfQorCisvLyBDaGVja3MgdG8g
c2VlIGlmIGRhdGFbcG9zaXRpb25dIGNoYXJhY3RlciBpcyBhIGxpbmUgYnJlYWs7IGhhbmRsZXMg
Y3JsZiwgbGZsZiwKKy8vIGxmLCBvciBjci4gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoYXJhY3Rl
cnMgdG8gc2tpcCBvdmVyICgwLCAxIG9yIDIpLgorc3RhdGljIGludCBwdXNoT3ZlckxpbmUoY29u
c3Qgc3RkOjpzdHJpbmcmIGRhdGEsIHNpemVfdCBwb3NpdGlvbikKK3sKKyAgICBpbnQgb2Zmc2V0
ID0gMDsKKyAgICBpZiAocG9zaXRpb24gPCBkYXRhLmxlbmd0aCgpICYmIChkYXRhW3Bvc2l0aW9u
XSA9PSAnXHInIHx8IGRhdGFbcG9zaXRpb25dID09ICdcbicpKSB7CisgICAgICAgICsrb2Zmc2V0
OworICAgICAgICBpZiAocG9zaXRpb24gKyAxIDwgZGF0YS5sZW5ndGgoKSAmJiBkYXRhW3Bvc2l0
aW9uICsgMV0gPT0gJ1xuJykKKyAgICAgICAgICAgICsrb2Zmc2V0OworICAgIH0KKyAgICByZXR1
cm4gb2Zmc2V0OworfQorCitNdWx0aXBhcnRSZXNwb25zZURlbGVnYXRlOjpNdWx0aXBhcnRSZXNw
b25zZURlbGVnYXRlKFBhc3NSZWZQdHI8UmVzb3VyY2VIYW5kbGU+IHJlc291Y2VIYW5kbGUsCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0
IFJlc291cmNlUmVzcG9uc2UmIHJlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYm91bmRhcnkpCisg
ICAgOiBtX2JvdW5kYXJ5KGJvdW5kYXJ5KQorICAgICwgbV9lbmNvZGVkRGF0YUxlbmd0aCgwKQor
ICAgICwgbV9maXJzdFJlY2VpdmVkRGF0YSh0cnVlKQorICAgICwgbV9vcmlnaW5hbFJlc3BvbnNl
KHJlc3BvbnNlKQorICAgICwgbV9wcm9jZXNzaW5nSGVhZGVycyhmYWxzZSkKKyAgICAsIG1fcmVz
b3VyY2VIYW5kbGUocmVzb3VjZUhhbmRsZSkKKyAgICAsIG1fc3RvcFNlbmRpbmcoZmFsc2UpCit7
CisgICAgc3RkOjpzdHJpbmcgc2VhcmNoID0gIi0tIjsKKyAgICBpZiAobV9ib3VuZGFyeS5jb21w
YXJlKDAsIHNlYXJjaC5sZW5ndGgoKSwgc2VhcmNoKSkKKyAgICAgICAgbV9ib3VuZGFyeSA9IHNl
YXJjaCArIG1fYm91bmRhcnk7Cit9CisKK2Jvb2wgTXVsdGlwYXJ0UmVzcG9uc2VEZWxlZ2F0ZTo6
cmVhZE11bHRpcGFydEJvdW5kYXJ5KGNvbnN0IHN0ZDo6c3RyaW5nJiBjb250ZW50VHlwZSwgc3Rk
OjpzdHJpbmcmIG11bHRpcGFydEJvdW5kYXJ5KQoreworICAgIHNpemVfdCBib3VuZGFyeVN0YXJ0
T2Zmc2V0ID0gY29udGVudFR5cGUuZmluZCgiYm91bmRhcnk9Iik7CisgICAgaWYgKGJvdW5kYXJ5
U3RhcnRPZmZzZXQgPT0gc3RkOjpzdHJpbmc6Om5wb3MpCisgICAgICAgIHJldHVybiBmYWxzZTsK
KworICAgIGJvdW5kYXJ5U3RhcnRPZmZzZXQgKz0gc3RybGVuKCJib3VuZGFyeT0iKTsKKyAgICBz
aXplX3QgYm91bmRhcnlFbmRPZmZzZXQgPSBjb250ZW50VHlwZS5maW5kKCc7JywgYm91bmRhcnlT
dGFydE9mZnNldCk7CisKKyAgICBpZiAoYm91bmRhcnlFbmRPZmZzZXQgPT0gc3RkOjpzdHJpbmc6
Om5wb3MpCisgICAgICAgIGJvdW5kYXJ5RW5kT2Zmc2V0ID0gY29udGVudFR5cGUubGVuZ3RoKCk7
CisKKyAgICBzaXplX3QgYm91bmRhcnlMZW5ndGggPSBib3VuZGFyeUVuZE9mZnNldCAtIGJvdW5k
YXJ5U3RhcnRPZmZzZXQ7CisgICAgbXVsdGlwYXJ0Qm91bmRhcnkgPSBjb250ZW50VHlwZS5zdWJz
dHIoYm91bmRhcnlTdGFydE9mZnNldCwgYm91bmRhcnlMZW5ndGgpOworCisgICAgLy8gVGhlIGJ5
dGUgcmFuZ2UgcmVzcG9uc2UgY2FuIGhhdmUgcXVvdGVkIGJvdW5kYXJ5IHN0cmluZ3MuIFRoaXMg
aXMgbGVnYWwKKyAgICAvLyBhcyBwZXIgTUlNRSBzcGVjaWZpY2F0aW9ucy4gSW5kaXZpZHVhbCBk
YXRhIGZyYWdlbWVudHMgaG93ZXZlciBkb24ndAorICAgIC8vIGNvbnRhaW4gcXVvdGVkIGJvdW5k
YXJ5IHN0cmluZ3MuCisgICAgdHJpbVN0cmluZyhtdWx0aXBhcnRCb3VuZGFyeSwgIlwiIiwgVFJJ
TV9BTEwsIG11bHRpcGFydEJvdW5kYXJ5KTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBN
dWx0aXBhcnRSZXNwb25zZURlbGVnYXRlOjpvblJlY2VpdmVkRGF0YShjb25zdCBjaGFyKiBkYXRh
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVu
Z3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQg
ZW5jb2RlZERhdGFMZW5ndGgpCit7CisgICAgLy8gbV9zdG9wU2VuZGluZyBtZWFucyB0aGF0IHdl
J3ZlIGFscmVhZHkgcmVjZWl2ZWQgdGhlIGZpbmFsIGJvdW5kYXJ5IHRva2VuLgorICAgIC8vIFRo
ZSBzZXJ2ZXIgc2hvdWxkIHN0b3Agc2VuZGluZyB1cyBkYXRhIGF0IHRoaXMgcG9pbnQsIGJ1dCBp
ZiBpdCBkb2VzLCB3ZQorICAgIC8vIGp1c3QgdGhyb3cgaXQgYXdheS4KKyAgICBpZiAobV9zdG9w
U2VuZGluZykKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9kYXRhLmFwcGVuZChkYXRhLCBsZW5n
dGgpOworICAgIG1fZW5jb2RlZERhdGFMZW5ndGggKz0gZW5jb2RlZERhdGFMZW5ndGg7CisgICAg
aWYgKG1fZmlyc3RSZWNlaXZlZERhdGEpIHsKKyAgICAgICAgLy8gU29tZSBzZXJ2ZXJzIGRvbid0
IHNlbmQgYSBib3VuZGFyeSB0b2tlbiBiZWZvcmUgdGhlIGZpcnN0IGNodW5rIG9mCisgICAgICAg
IC8vIGRhdGEuIFdlIGhhbmRsZSB0aGlzIGNhc2UgYW55d2F5IChHZWNrbyBkb2VzIHRvbykuCisg
ICAgICAgIG1fZmlyc3RSZWNlaXZlZERhdGEgPSBmYWxzZTsKKworICAgICAgICAvLyBFYXQgbGVh
ZGluZyBcclxuLgorICAgICAgICBpbnQgcG9zaXRpb24gPSBwdXNoT3ZlckxpbmUobV9kYXRhLCAw
KTsKKyAgICAgICAgaWYgKHBvc2l0aW9uKQorICAgICAgICAgICAgbV9kYXRhID0gbV9kYXRhLnN1
YnN0cihwb3NpdGlvbik7CisKKyAgICAgICAgaWYgKG1fZGF0YS5sZW5ndGgoKSA8IG1fYm91bmRh
cnkubGVuZ3RoKCkgKyAyKSB7CisgICAgICAgICAgICAvLyBXZSBkb24ndCBoYXZlIGVub3VnaCBk
YXRhIHlldCB0byBtYWtlIGEgYm91bmRhcnkgdG9rZW4uIEp1c3Qgd2FpdAorICAgICAgICAgICAg
Ly8gdW50aWwgdGhlIG5leHQgY2h1bmsgb2YgZGF0YSBhcnJpdmVzLgorICAgICAgICAgICAgbV9m
aXJzdFJlY2VpdmVkRGF0YSA9IHRydWU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0K
KworICAgICAgICBpZiAobV9kYXRhLmNvbXBhcmUoMCwgbV9ib3VuZGFyeS5sZW5ndGgoKSwgbV9i
b3VuZGFyeSkpCisgICAgICAgICAgICBtX2RhdGEgPSBtX2JvdW5kYXJ5ICsgIlxuIiArIG1fZGF0
YTsKKyAgICB9CisKKyAgICAvLyBIZWFkZXJzCisgICAgaWYgKG1fcHJvY2Vzc2luZ0hlYWRlcnMp
IHsKKyAgICAgICAgLy8gRWF0IGxlYWRpbmcgXHJcbi4KKyAgICAgICAgaW50IHBvc2l0aW9uID0g
cHVzaE92ZXJMaW5lKG1fZGF0YSwgMCk7CisgICAgICAgIGlmIChwb3NpdGlvbikKKyAgICAgICAg
ICAgIG1fZGF0YSA9IG1fZGF0YS5zdWJzdHIocG9zaXRpb24pOworCisgICAgICAgIGlmIChwYXJz
ZUhlYWRlcnMoKSkgeworICAgICAgICAgICAgLy8gU3VjY2Vzc2Z1bGx5IHBhcnNlZCBoZWFkZXJz
LgorICAgICAgICAgICAgbV9wcm9jZXNzaW5nSGVhZGVycyA9IGZhbHNlOworICAgICAgICB9IGVs
c2UgeworICAgICAgICAgICAgLy8gR2V0IG1vcmUgZGF0YSBiZWZvcmUgdHJ5aW5nIGFnYWluLgor
ICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgc2l6ZV90IGJvdW5k
YXJ5UG9zaXRpb247CisgICAgd2hpbGUgKChib3VuZGFyeVBvc2l0aW9uID0gZmluZEJvdW5kYXJ5
KCkpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIGlmIChtX3Jlc291cmNlSGFuZGxl
ICYmICBtX3Jlc291cmNlSGFuZGxlLT5jbGllbnQoKSkgeworICAgICAgICAgICAgLy8gU3RyaXAg
b3V0IHRyYWlsaW5nIFxuXHIgY2hhcmFjdGVycyBpbiB0aGUgYnVmZmVyIHByZWNlZGluZyB0aGUK
KyAgICAgICAgICAgIC8vIGJvdW5kYXJ5IG9uIHRoZSBzYW1lIGxpbmVzIGFzIEZpcmVmb3guCisg
ICAgICAgICAgICBpbnQgZGF0YUxlbmd0aCA9IGJvdW5kYXJ5UG9zaXRpb247CisgICAgICAgICAg
ICBpZiAoYm91bmRhcnlQb3NpdGlvbiA+IDAgJiYgbV9kYXRhW2JvdW5kYXJ5UG9zaXRpb24gLSAx
XSA9PSAnXG4nKSB7CisgICAgICAgICAgICAgICAgZGF0YUxlbmd0aC0tOworICAgICAgICAgICAg
ICAgIGlmIChib3VuZGFyeVBvc2l0aW9uID4gMSAmJiBtX2RhdGFbYm91bmRhcnlQb3NpdGlvbiAt
IDJdID09ICdccicpCisgICAgICAgICAgICAgICAgICAgIGRhdGFMZW5ndGgtLTsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgIGlmIChkYXRhTGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAg
IC8vIFNlbmQgdGhlIGxhc3QgZGF0YSBjaHVuay4KKyAgICAgICAgICAgICAgICBtX3Jlc291cmNl
SGFuZGxlLT5jbGllbnQoKS0+ZGlkUmVjZWl2ZURhdGEobV9yZXNvdXJjZUhhbmRsZS5nZXQoKSwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgbV9kYXRhLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgZGF0YUxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9lbmNvZGVkRGF0YUxlbmd0aCk7
CisgICAgICAgICAgICAgICAgbV9lbmNvZGVkRGF0YUxlbmd0aCA9IDA7CisgICAgICAgICAgICB9
CisgICAgICAgIH0KKyAgICAgICAgc2l6ZV90IGJvdW5kYXJ5RW5kUG9zaXRpb24gPSBib3VuZGFy
eVBvc2l0aW9uICsgbV9ib3VuZGFyeS5sZW5ndGgoKTsKKyAgICAgICAgaWYgKGJvdW5kYXJ5RW5k
UG9zaXRpb24gPCBtX2RhdGEubGVuZ3RoKCkgJiYgJy0nID09IG1fZGF0YVtib3VuZGFyeUVuZFBv
c2l0aW9uXSkgeworICAgICAgICAgICAgLy8gVGhpcyB3YXMgdGhlIGxhc3QgYm91bmRhcnkgc28g
d2UgY2FuIHN0b3AgcHJvY2Vzc2luZy4KKyAgICAgICAgICAgIG1fc3RvcFNlbmRpbmcgPSB0cnVl
OworICAgICAgICAgICAgbV9kYXRhLmNsZWFyKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAg
ICAgIH0KKworICAgICAgICAvLyBXZSBjYW4gbm93IHRocm93IG91dCBkYXRhIHVwIHRocm91Z2gg
dGhlIGJvdW5kYXJ5LgorICAgICAgICBpbnQgb2Zmc2V0ID0gcHVzaE92ZXJMaW5lKG1fZGF0YSwg
Ym91bmRhcnlFbmRQb3NpdGlvbik7CisgICAgICAgIG1fZGF0YSA9IG1fZGF0YS5zdWJzdHIoYm91
bmRhcnlFbmRQb3NpdGlvbiArIG9mZnNldCk7CisKKyAgICAgICAgLy8gT2ssIGJhY2sgdG8gcGFy
c2luZyBoZWFkZXJzLgorICAgICAgICBpZiAoIXBhcnNlSGVhZGVycygpKSB7CisgICAgICAgICAg
ICBtX3Byb2Nlc3NpbmdIZWFkZXJzID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICB9CisgICAgfQorCisgICAgLy8gQXQgdGhpcyBwb2ludCwgd2Ugc2hvdWxkIHNlbmQgb3ZlciBh
bnkgZGF0YSB3ZSBoYXZlLCBidXQga2VlcCBlbm91Z2ggZGF0YQorICAgIC8vIGJ1ZmZlcmVkIHRv
IGhhbmRsZSBhIGJvdW5kYXJ5IHRoYXQgbWF5IGhhdmUgYmVlbiB0cnVuY2F0ZWQuCisgICAgaWYg
KCFtX3Byb2Nlc3NpbmdIZWFkZXJzICYmIG1fZGF0YS5sZW5ndGgoKSA+IG1fYm91bmRhcnkubGVu
Z3RoKCkpIHsKKyAgICAgICAgLy8gSWYgdGhlIGxhc3QgY2hhcmFjdGVyIGlzIGEgbmV3IGxpbmUg
Y2hhcmFjdGVyLCBnbyBhaGVhZCBhbmQganVzdCBzZW5kCisgICAgICAgIC8vIGV2ZXJ5dGhpbmcg
d2UgaGF2ZSBidWZmZXJlZC4gVGhpcyBtYXRjaGVzIGFuIG9wdGltaXphdGlvbiBpbiBHZWNrby4K
KyAgICAgICAgaW50IHNlbmRMZW5ndGggPSBtX2RhdGEubGVuZ3RoKCkgLSBtX2JvdW5kYXJ5Lmxl
bmd0aCgpOworICAgICAgICBpZiAobV9kYXRhW21fZGF0YS5sZW5ndGgoKSAtIDFdID09ICdcbicp
CisgICAgICAgICAgICBzZW5kTGVuZ3RoID0gbV9kYXRhLmxlbmd0aCgpOworICAgICAgICBpZiAo
bV9yZXNvdXJjZUhhbmRsZSAmJiBtX3Jlc291cmNlSGFuZGxlLT5jbGllbnQoKSkKKyAgICAgICAg
ICAgIG1fcmVzb3VyY2VIYW5kbGUtPmNsaWVudCgpLT5kaWRSZWNlaXZlRGF0YShtX3Jlc291cmNl
SGFuZGxlLmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIG1fZGF0YS5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZExlbmd0aCwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2VuY29kZWREYXRhTGVuZ3Ro
KTsKKyAgICAgICAgbV9kYXRhID0gbV9kYXRhLnN1YnN0cihzZW5kTGVuZ3RoKTsKKyAgICAgICAg
bV9lbmNvZGVkRGF0YUxlbmd0aCA9IDA7CisgICAgfQorfQorCit2b2lkIE11bHRpcGFydFJlc3Bv
bnNlRGVsZWdhdGU6Om9uQ29tcGxldGVkUmVxdWVzdCgpCit7CisgICAgLy8gSWYgd2UgaGF2ZSBh
bnkgcGVuZGluZyBkYXRhIGFuZCB3ZSdyZSBub3QgaW4gYSBoZWFkZXIsIGdvIGFoZWFkIGFuZCBz
ZW5kCisgICAgLy8gaXQgdG8gV2ViQ29yZS4KKyAgICBpZiAoIW1fcHJvY2Vzc2luZ0hlYWRlcnMg
JiYgIW1fZGF0YS5lbXB0eSgpICYmICFtX3N0b3BTZW5kaW5nICYmIG1fcmVzb3VyY2VIYW5kbGUg
JiYgbV9yZXNvdXJjZUhhbmRsZS0+Y2xpZW50KCkpIHsKKyAgICAgICAgbV9yZXNvdXJjZUhhbmRs
ZS0+Y2xpZW50KCktPmRpZFJlY2VpdmVEYXRhKG1fcmVzb3VyY2VIYW5kbGUuZ2V0KCksCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2RhdGEuZGF0
YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
bV9kYXRhLmxlbmd0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgbV9lbmNvZGVkRGF0YUxlbmd0aCk7CisgICAgICAgIG1fZW5jb2RlZERhdGFM
ZW5ndGggPSAwOworICAgIH0KK30KKworYm9vbCBNdWx0aXBhcnRSZXNwb25zZURlbGVnYXRlOjpw
YXJzZUhlYWRlcnMoKQoreworICAgIGludCBsaW5lRmVlZEluY3JlbWVudCA9IDE7CisKKyAgICAv
LyBHcmFiIHRoZSBoZWFkZXJzIGJlaW5nIGxpYmVyYWwgYWJvdXQgbGluZSBlbmRpbmdzLgorICAg
IHNpemVfdCBsaW5lU3RhcnRQb3NpdGlvbiA9IDA7CisgICAgc2l6ZV90IGxpbmVFbmRQb3NpdGlv
biA9IG1fZGF0YS5maW5kKCdcbicpOworICAgIHdoaWxlIChsaW5lRW5kUG9zaXRpb24gIT0gc3Rk
OjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgLy8gSGFuZGxlIENSTEYKKyAgICAgICAgaWYgKGxp
bmVFbmRQb3NpdGlvbiA+IGxpbmVTdGFydFBvc2l0aW9uICYmIG1fZGF0YVtsaW5lRW5kUG9zaXRp
b24gLSAxXSA9PSAnXHInKSB7CisgICAgICAgICAgICBsaW5lRmVlZEluY3JlbWVudCA9IDI7Cisg
ICAgICAgICAgICAtLWxpbmVFbmRQb3NpdGlvbjsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAg
ICBsaW5lRmVlZEluY3JlbWVudCA9IDE7CisKKyAgICAgICAgaWYgKGxpbmVTdGFydFBvc2l0aW9u
ID09IGxpbmVFbmRQb3NpdGlvbikgeworICAgICAgICAgICAgLy8gQSBibGFuayBsaW5lLCBlbmQg
b2YgaGVhZGVycy4KKyAgICAgICAgICAgIGxpbmVFbmRQb3NpdGlvbiArPSBsaW5lRmVlZEluY3Jl
bWVudDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIC8vIEZpbmQgdGhl
IG5leHQgaGVhZGVyIGxpbmUuCisgICAgICAgIGxpbmVTdGFydFBvc2l0aW9uID0gbGluZUVuZFBv
c2l0aW9uICsgbGluZUZlZWRJbmNyZW1lbnQ7CisgICAgICAgIGxpbmVFbmRQb3NpdGlvbiA9IG1f
ZGF0YS5maW5kKCdcbicsIGxpbmVTdGFydFBvc2l0aW9uKTsKKyAgICB9CisgICAgLy8gVHJ1bmNh
dGVkIGluIHRoZSBtaWRkbGUgb2YgYSBoZWFkZXIsIHN0b3AgcGFyc2luZy4KKyAgICBpZiAobGlu
ZUVuZFBvc2l0aW9uID09IHN0ZDo6c3RyaW5nOjpucG9zKQorICAgICAgICByZXR1cm4gZmFsc2U7
CisKKyAgICAvLyBFYXQgaGVhZGVycy4KKyAgICBzdGQ6OnN0cmluZyBoZWFkZXJzKCJcbiIpOwor
ICAgIGhlYWRlcnMuYXBwZW5kKG1fZGF0YSwgMCwgbGluZUVuZFBvc2l0aW9uKTsKKyAgICBtX2Rh
dGEgPSBtX2RhdGEuc3Vic3RyKGxpbmVFbmRQb3NpdGlvbik7CisKKyAgICAvLyBDcmVhdGUgYSBX
ZWJVUkxSZXNwb25zZSBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgc2V0IG9mIGhlYWRlcnMgKyB0aGUK
KyAgICAvLyByZXBsYWNlbWVudCBoZWFkZXJzLiBXZSBvbmx5IHJlcGxhY2UgdGhlIHNhbWUgZmV3
IGhlYWRlcnMgdGhhdCBnZWNrbworICAgIC8vIGRvZXMuIFNlZSBuZXR3ZXJrL3N0cmVhbWNvbnYv
Y29udmVydGVycy9uc011bHRpTWl4ZWRDb252LmNwcC4KKworICAgIHN0ZDo6c3RyaW5nIGNvbnRl
bnRUeXBlID0gZ2V0U3BlY2lmaWNIZWFkZXIoaGVhZGVycywgImNvbnRlbnQtdHlwZSIpOworICAg
IHN0ZDo6c3RyaW5nIG1pbWVUeXBlOworICAgIHN0ZDo6c3RyaW5nIGNoYXJzZXQ7CisgICAgYm9v
bCBoYXNDaGFyc2V0ID0gZmFsc2U7CisKKyAgICBwYXJzZUNvbnRlbnRUeXBlKGNvbnRlbnRUeXBl
LCBtaW1lVHlwZSwgY2hhcnNldCwgaGFzQ2hhcnNldCk7CisgICAgUmVzb3VyY2VSZXNwb25zZSBy
ZXNwb25zZTsKKyAgICByZXNwb25zZS5zZXRVUkwobV9vcmlnaW5hbFJlc3BvbnNlLnVybCgpKTsK
KyAgICByZXNwb25zZS5zZXRNaW1lVHlwZShTdHJpbmc6OmZyb21VVEY4KG1pbWVUeXBlLmRhdGEo
KSkpOworICAgIGlmIChoYXNDaGFyc2V0KQorICAgICAgICByZXNwb25zZS5zZXRUZXh0RW5jb2Rp
bmdOYW1lKFN0cmluZzo6ZnJvbVVURjgoY2hhcnNldC5kYXRhKCkpKTsKKworICAgIGNvbnN0IFdl
YkNvcmU6OkhUVFBIZWFkZXJNYXAmIG1hcCA9IG1fb3JpZ2luYWxSZXNwb25zZS5odHRwSGVhZGVy
RmllbGRzKCk7CisgICAgZm9yIChXZWJDb3JlOjpIVFRQSGVhZGVyTWFwOjpjb25zdF9pdGVyYXRv
ciBpdCA9IG1hcC5iZWdpbigpOyBpdCAhPSBtYXAuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgYm9v
bCBuZWVkc0FkZCA9IHRydWU7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXJyYXlz
aXplKFJlcGxhY2VIZWFkZXJzKTsgKytpKSB7CisgICAgICAgICAgICBpZiAoaXQtPmZpcnN0Lmxv
d2VyKCkgPT0gUmVwbGFjZUhlYWRlcnNbaV0pIHsKKyAgICAgICAgICAgICAgICBuZWVkc0FkZCA9
IGZhbHNlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9
CisgICAgICAgIGlmIChuZWVkc0FkZCkKKyAgICAgICAgICAgIHJlc3BvbnNlLnNldEhUVFBIZWFk
ZXJGaWVsZChpdC0+Zmlyc3QsIGl0LT5zZWNvbmQpOworICAgIH0KKworICAgIGZvciAoc2l6ZV90
IGkgPSAwOyBpIDwgYXJyYXlzaXplKFJlcGxhY2VIZWFkZXJzKTsgKytpKSB7CisgICAgICAgIHN0
ZDo6c3RyaW5nIG5hbWUoUmVwbGFjZUhlYWRlcnNbaV0pOworICAgICAgICBzdGQ6OnN0cmluZyB2
YWx1ZSA9IGdldFNwZWNpZmljSGVhZGVyKGhlYWRlcnMsIG5hbWUpOworICAgICAgICBpZiAoIXZh
bHVlLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNldEhUVFBIZWFkZXJGaWVsZChT
dHJpbmc6OmZyb21VVEY4KG5hbWUuZGF0YSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBTdHJpbmc6OmZyb21VVEY4KHZhbHVlLmRhdGEoKSkpOworICAgICAgICB9
CisgICAgfQorCisgICAgaWYgKG1fcmVzb3VyY2VIYW5kbGUgJiYgbV9yZXNvdXJjZUhhbmRsZS0+
Y2xpZW50KCkpIHsKKyAgICAgICAgLy8gQWZ0ZXIgcGFyc2VkIHRoZSBoZWFkZXJzIHN1Y2Nlc3Nm
dWxseSwgdGhlIG11bHRpcGFydCBwYWdlcyB3aWxsIG5vdCBiZSBzdG9yZWQgaW4gcGFnZQorICAg
ICAgICAvLyBjYWNoZSBhbnkgbW9yZSwgYmVjYXVzZSBnbyBiYWNrL2ZvcndhcmQgYWN0aW9ucyBu
ZWVkIGdldHRpbmcgdGhlIGxhdGVzdCBkYXRhIGZyb20gc2VydmVyLgorICAgICAgICByZXNwb25z
ZS5zZXRJc011bHRpcGFydFBheWxvYWQodHJ1ZSk7CisgICAgICAgIG1fcmVzb3VyY2VIYW5kbGUt
PmNsaWVudCgpLT5kaWRSZWNlaXZlUmVzcG9uc2UobV9yZXNvdXJjZUhhbmRsZS5nZXQoKSwgcmVz
cG9uc2UpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQm91bmRhcmllcyBhcmUg
c3VwcG9zZWQgdG8gYmUgcHJlY2VlZGVkIHdpdGggLS0sIGJ1dCBpdCBsb29rcyBsaWtlIGdlY2tv
CisvLyBkb2Vzbid0IHJlcXVpcmUgdGhlIGRhc2hlcyB0byBleGlzdC4gU2VlIG5zTXVsdGlNaXhl
ZENvbnY6OkZpbmRUb2tlbi4KK3NpemVfdCBNdWx0aXBhcnRSZXNwb25zZURlbGVnYXRlOjpmaW5k
Qm91bmRhcnkoKQoreworICAgIHNpemVfdCBib3VuZGFyeVBvc2l0aW9uID0gbV9kYXRhLmZpbmQo
bV9ib3VuZGFyeSk7CisgICAgaWYgKGJvdW5kYXJ5UG9zaXRpb24gIT0gc3RkOjpzdHJpbmc6Om5w
b3MpIHsKKyAgICAgICAgLy8gQmFjayB1cCBvdmVyIC0tIGZvciBiYWNrd2FyZHMgY29tcGF0Cisg
ICAgICAgIC8vIEZJWE1FKHRjKTogRG9uJ3Qgd2Ugb25seSB3YW50IHRvIGRvIHRoaXMgb25jZT8g
R2Vja28gY29kZSBkb2Vzbid0IHNlZW0KKyAgICAgICAgLy8gdG8gY2FyZS4KKyAgICAgICAgaWYg
KGJvdW5kYXJ5UG9zaXRpb24gPj0gMikgeworICAgICAgICAgICAgaWYgKCctJyA9PSBtX2RhdGFb
Ym91bmRhcnlQb3NpdGlvbiAtIDFdICYmICctJyA9PSBtX2RhdGFbYm91bmRhcnlQb3NpdGlvbiAt
IDJdKSB7CisgICAgICAgICAgICAgICAgYm91bmRhcnlQb3NpdGlvbiAtPSAyOworICAgICAgICAg
ICAgICAgIG1fYm91bmRhcnkgPSAiLS0iICsgbV9ib3VuZGFyeTsKKyAgICAgICAgICAgIH0KKyAg
ICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYm91bmRhcnlQb3NpdGlvbjsKK30KKworfSAvLyBu
YW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0
d29yay9ibGFja2JlcnJ5L011bHRpcGFydFJlc3BvbnNlRGVsZWdhdGUuaCBiL1NvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL25ldHdvcmsvYmxhY2tiZXJyeS9NdWx0aXBhcnRSZXNwb25zZURlbGVnYXRl
LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI3MjQ5ZgotLS0gL2Rldi9u
dWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvYmxhY2tiZXJyeS9NdWx0
aXBhcnRSZXNwb25zZURlbGVnYXRlLmgKQEAgLTAsMCArMSwxMTEgQEAKKy8vIENvcHlyaWdodCAo
QykgMjAxMSBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
Ky8vIE1vc3Qgb2YgbG9naWMgYW5kIGZ1bmN0aW9ucyBhcmUgYmFzZSBvbiBDaHJvbWl1bSBicm93
c2VyJ3MgaW1wbGVtYW50aW9ucyBpbgorLy8gd2Via2l0L2dsdWUvbXVsdGlwYXJ0X3Jlc3BvbnNl
X2RlbGVnYXRlLmNjCisKKworLy8gQ29weXJpZ2h0IChjKSAyMDA2LTIwMDkgVGhlIENocm9taXVt
IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29k
ZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3Vu
ZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorLy8KKy8vIEEgZGVsZWdhdGUgY2xhc3Mgb2YgV2ViVVJM
TG9hZGVySW1wbCB0aGF0IGhhbmRsZXMgbXVsdGlwYXJ0L3gtbWl4ZWQtcmVwbGFjZQorLy8gZGF0
YS4gV2Ugc3BlY2lhbCBjYXNlIG11bHRpcGFydC94LW1peGVkLXJlcGxhY2UgYmVjYXVzZSBXZWJD
b3JlIGV4cGVjdHMgYQorLy8gc2VwYXJhdGUgZGlkUmVjZWl2ZVJlc3BvbnNlIGZvciBlYWNoIG5l
dyBtZXNzYWdlIHBhcnQuCisvLworLy8gTW9zdCBvZiB0aGUgbG9naWMgYW5kIGVkZ2UgY2FzZSBo
YW5kbGluZyBhcmUgYmFzZWQgb24gdGhlIE1vemlsbGEncworLy8gaW1wbGVtZW50YXRpb24gaW4g
bmV0d2Vyay9zdHJlYW1jb252L2NvbnZlcnRlcnMvbnNNdWx0aU1peGVkQ29udi5jcHAuCisvLyBU
aGlzIHNlZW1zIGxpa2UgYSBkZXJpdmF0aXZlIHdvcmssIHNvIGhlcmUncyB0aGUgb3JpZ2luYWwg
bGljZW5zZToKKworLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgorICogVmVyc2lv
bjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCisgKgorICogVGhlIGNvbnRlbnRzIG9mIHRoaXMg
ZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCisg
KiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBp
biBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkg
b2YgdGhlIExpY2Vuc2UgYXQKKyAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLworICoKKyAq
IFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9u
IGFuICJBUyBJUyIgYmFzaXMsCisgKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRo
ZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKKyAqIGZvciB0aGUgc3BlY2lm
aWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCisg
KiBMaWNlbnNlLgorICoKKyAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIG1vemlsbGEub3JnIGNvZGUu
CisgKgorICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCisg
KiBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbi4KKyAqIFBvcnRpb25zIGNyZWF0
ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDE5OTgKKyAqIHRo
ZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBDb250cmli
dXRvcihzKToKKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxl
IG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogZWl0aGVyIHRoZSBHTlUgR2VuZXJh
bCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCisgKiB0
aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVy
ICh0aGUgIkxHUEwiKSwKKyAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQ
TCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCisgKiBvZiB0aG9zZSBhYm92ZS4g
SWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25s
eQorICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQg
bm90IHRvIGFsbG93IG90aGVycyB0bworICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUg
dW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKKyAqIGRlY2lzaW9uIGJ5
IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUg
bm90aWNlCisgKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRo
ZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQorICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEg
cmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgorICogdGhl
IHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KKyAqCisg
KiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLworCisjaWZuZGVmIE11bHRpcGFydFJl
c3BvbnNlRGVsZWdhdGVfaAorI2RlZmluZSBNdWx0aXBhcnRSZXNwb25zZURlbGVnYXRlX2gKKwor
I2luY2x1ZGUgIlJlc291cmNlSGFuZGxlLmgiCisjaW5jbHVkZSAiUmVzb3VyY2VSZXNwb25zZS5o
IgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBNdWx0
aXBhcnRSZXNwb25zZURlbGVnYXRlIHsKK3B1YmxpYzoKKyAgICBNdWx0aXBhcnRSZXNwb25zZURl
bGVnYXRlKFBhc3NSZWZQdHI8UmVzb3VyY2VIYW5kbGU+IHJlc291Y2VIYW5kbGUsCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZXNvdXJjZVJlc3BvbnNlJiwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBib3VuZGFyeSk7CisgICAg
c3RhdGljIGJvb2wgcmVhZE11bHRpcGFydEJvdW5kYXJ5KGNvbnN0IHN0ZDo6c3RyaW5nJiBjb250
ZW50VHlwZSwgc3RkOjpzdHJpbmcmIG11bHRpcGFydEJvdW5kYXJ5KTsKKyAgICB2b2lkIG9uUmVj
ZWl2ZWREYXRhKGNvbnN0IGNoYXIqIGRhdGEsIGludCBsZW5ndGgsIGludCBlbmNvZGVkRGF0YUxl
bmd0aCk7CisgICAgdm9pZCBvbkNvbXBsZXRlZFJlcXVlc3QoKTsKKworcHJpdmF0ZToKKworICAg
IC8vIFRyaWVzIHRvIHBhcnNlIGh0dHAgaGVhZGVycyBmcm9tIHRoZSBzdGFydCBvZiBtX2RhdGEu
IFJldHVybnMgdHJ1ZSBpZiBpdAorICAgIC8vIHN1Y2NlZWRzIGFuZCBzZW5kcyBhIGRpZFJlY2Vp
dmVSZXNwb25zZSB0byBtX2NsaWVudC4gUmV0dXJucyBmYWxzZSBpZgorICAgIC8vIHRoZSBoZWFk
ZXIgaXMgaW5jb21wbGV0ZSAoaW4gd2hpY2ggY2FzZSB3ZSBqdXN0IHdhaXQgZm9yIG1vcmUgZGF0
YSkuCisgICAgYm9vbCBwYXJzZUhlYWRlcnMoKTsKKworICAgIC8vIEZpbmQgdGhlIG5leHQgYm91
bmRhcnkgaW4gbV9kYXRhLiBSZXR1cm5zIHN0ZDo6c3RyaW5nOjpucG9zIGlmIHRoZXJlJ3Mgbm8K
KyAgICAvLyBmdWxsIHRva2VuLgorICAgIHNpemVfdCBmaW5kQm91bmRhcnkoKTsKKworICAgIC8v
IE11bHRpcGFydCBib3VuZGFyeSB0b2tlbi4KKyAgICBzdGQ6OnN0cmluZyBtX2JvdW5kYXJ5Owor
CisgICAgLy8gQSB0ZW1wb3JhcnkgYnVmZmVyIHRvIGhvbGQgZGF0YSBiZXR3ZWVuIHJlYWRzIGZv
ciBtdWx0aXBhcnQgZGF0YSB0aGF0CisgICAgLy8gZ2V0cyBzcGxpdCBpbiB0aGUgbWlkZGxlIG9m
IGEgaGVhZGVyLgorICAgIHN0ZDo6c3RyaW5nIG1fZGF0YTsKKworICAgIGludCBtX2VuY29kZWRE
YXRhTGVuZ3RoOworCisgICAgLy8gVHJ1ZSB1bnRpbCB3ZSdyZSByZWNlaXZlZCB0aGUgZmlyc3Qg
ZGF0YS4KKyAgICBib29sIG1fZmlyc3RSZWNlaXZlZERhdGE7CisKKyAgICAvLyBUaGUgb3JpZ2lu
YWwgcmVzb3VyY2UgcmVzcG9uc2UgZm9yIHRoaXMgcmVxdWVzdC4gV2UgdXNlIHRoaXMgYXMgYQor
ICAgIC8vIHN0YXJ0aW5nIHBvaW50IGZvciBlYWNoIHBhcnRzIHJlc3BvbnNlLgorICAgIGNvbnN0
IFJlc291cmNlUmVzcG9uc2UmIG1fb3JpZ2luYWxSZXNwb25zZTsKKworICAgIC8vIFRydWUgaWYg
d2UncmUgdHJ1bmNhdGVkIGluIHRoZSBtaWRkbGUgb2YgYSBoZWFkZXIuCisgICAgYm9vbCBtX3By
b2Nlc3NpbmdIZWFkZXJzOworCisgICAgUmVmUHRyPFJlc291cmNlSGFuZGxlPiBtX3Jlc291cmNl
SGFuZGxlOworCisgICAgLy8gVHJ1ZSB3aGVuIHdlJ3JlIGRvbmUgc2VuZGluZyBpbmZvcm1hdGlv
bi4gQXQgdGhhdCBwb2ludCwgd2Ugc3RvcAorICAgIC8vIHByb2Nlc3NpbmcgQWRkRGF0YSByZXF1
ZXN0cy4KKyAgICBib29sIG1fc3RvcFNlbmRpbmc7Cit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJD
b3JlCisKKyNlbmRpZiAvLyBNdWx0aXBhcnRSZXNwb25zZURlbGVnYXRlX2gKLS0gCjEuNy41LjQK
Cg==
</data>
<flag name="review"
          id="118075"
          type_id="1"
          status="-"
          setter="dbates"
    />
    <flag name="commit-queue"
          id="118076"
          type_id="3"
          status="-"
          setter="dbates"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>118543</attachid>
            <date>2011-12-09 00:37:32 -0800</date>
            <delta_ts>2011-12-12 18:56:25 -0800</delta_ts>
            <desc>patch </desc>
            <filename>0001-Upstream-the-Blackberry-porting-of-multipart-delegat.patch</filename>
            <type>text/plain</type>
            <size>28762</size>
            <attacher name="Chris.Guan">logingx</attacher>
            
              <data encoding="base64">RnJvbSAxMWEwODhlZjhhYzcxYzg4ZjE3MmU2ZTg2NjZjNzU2YjlmZmQyZDY2IE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBDaHJpcyBHdWFuIDxjaHJpcy5ndWFuQHRvcmNobW9iaWxlLmNv
bS5jbj4KRGF0ZTogVGh1LCA4IERlYyAyMDExIDEyOjAyOjIyICswODAwClN1YmplY3Q6IFtQQVRD
SF0gVXBzdHJlYW0gdGhlIEJsYWNrYmVycnkgcG9ydGluZyBvZiBtdWx0aXBhcnQgZGVsZWdhdGUK
IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD03MzUzMwoKUmV2aWV3ZWQg
YnkgTk9CT0RZIChPT1BTISkuCgpUZXN0IGNhc2VzOgpodHRwOi8vYXZocy5heGlzLmNvbQoKKiBw
bGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvTXVsdGlwYXJ0UmVzcG9uc2VEZWxlZ2F0ZS5jcHA6
IEFkZGVkLgooV2ViQ29yZTo6Y29tcGFyZUNoYXIpOgooV2ViQ29yZTo6c3RyaW5nVG9Mb3dlckFT
Q0lJKToKKFdlYkNvcmU6OnRyaW1TdHJpbmcpOgooV2ViQ29yZTo6Z2V0U3BlY2lmaWNIZWFkZXIp
OgooV2ViQ29yZTo6bG93ZXJDYXNlRXF1YWxzQVNDSUkpOgooV2ViQ29yZTo6ZmluZFN0cmluZ0Vu
ZCk6CihXZWJDb3JlOjpmaW5kRGVsaW1pdGVyKToKKFdlYkNvcmU6OnBhcnNlQ29udGVudFR5cGUp
OgooV2ViQ29yZTo6cHVzaE92ZXJMaW5lKToKKFdlYkNvcmU6Ok11bHRpcGFydFJlc3BvbnNlRGVs
ZWdhdGU6Ok11bHRpcGFydFJlc3BvbnNlRGVsZWdhdGUpOgooV2ViQ29yZTo6TXVsdGlwYXJ0UmVz
cG9uc2VEZWxlZ2F0ZTo6cmVhZE11bHRpcGFydEJvdW5kYXJ5KToKKFdlYkNvcmU6Ok11bHRpcGFy
dFJlc3BvbnNlRGVsZWdhdGU6Om9uUmVjZWl2ZWREYXRhKToKKFdlYkNvcmU6Ok11bHRpcGFydFJl
c3BvbnNlRGVsZWdhdGU6Om9uQ29tcGxldGVkUmVxdWVzdCk6CihXZWJDb3JlOjpNdWx0aXBhcnRS
ZXNwb25zZURlbGVnYXRlOjpwYXJzZUhlYWRlcnMpOgooV2ViQ29yZTo6TXVsdGlwYXJ0UmVzcG9u
c2VEZWxlZ2F0ZTo6ZmluZEJvdW5kYXJ5KToKKiBwbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkv
TXVsdGlwYXJ0UmVzcG9uc2VEZWxlZ2F0ZS5oOiBBZGRlZC4KLS0tCiBTb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgMjggKysKIC4uLi9ibGFja2Jl
cnJ5L011bHRpcGFydFJlc3BvbnNlRGVsZWdhdGUuY3BwICAgICAgIHwgIDUxMiArKysrKysrKysr
KysrKysrKysrKwogLi4uL25ldHdvcmsvYmxhY2tiZXJyeS9NdWx0aXBhcnRSZXNwb25zZURlbGVn
YXRlLmggfCAgMTExICsrKysrCiAzIGZpbGVzIGNoYW5nZWQsIDY1MSBpbnNlcnRpb25zKCspLCAw
IGRlbGV0aW9ucygtKQogY3JlYXRlIG1vZGUgMTAwNjQ0IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L25ldHdvcmsvYmxhY2tiZXJyeS9NdWx0aXBhcnRSZXNwb25zZURlbGVnYXRlLmNwcAogY3JlYXRl
IG1vZGUgMTAwNjQ0IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvYmxhY2tiZXJyeS9N
dWx0aXBhcnRSZXNwb25zZURlbGVnYXRlLmgKCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggNGQxNzVmNy4uMDBkYTEw
MiAxMDA3NTUKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9XZWJD
b3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDMxIEBACisyMDExLTEyLTAyICBDaHJpcyBHdWFuICA8
Y2hyaXMuZ3VhbkB0b3JjaG1vYmlsZS5jb20uY24+CisKKyAgICAgICAgVXBzdHJlYW0gdGhlIEJs
YWNrYmVycnkgcG9ydGluZyBvZiBtdWx0aXBhcnQgZGVsZWdhdGUKKyAgICAgICAgaHR0cHM6Ly9i
dWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTczNTMzCisKKyAgICAgICAgUmV2aWV3ZWQg
YnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgVGVzdCBjYXNlczoKKyAgICAgICAgaHR0cDov
L2F2aHMuYXhpcy5jb20KKworICAgICAgICAqIHBsYXRmb3JtL25ldHdvcmsvYmxhY2tiZXJyeS9N
dWx0aXBhcnRSZXNwb25zZURlbGVnYXRlLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpj
b21wYXJlQ2hhcik6CisgICAgICAgIChXZWJDb3JlOjpzdHJpbmdUb0xvd2VyQVNDSUkpOgorICAg
ICAgICAoV2ViQ29yZTo6dHJpbVN0cmluZyk6CisgICAgICAgIChXZWJDb3JlOjpnZXRTcGVjaWZp
Y0hlYWRlcik6CisgICAgICAgIChXZWJDb3JlOjpsb3dlckNhc2VFcXVhbHNBU0NJSSk6CisgICAg
ICAgIChXZWJDb3JlOjpmaW5kU3RyaW5nRW5kKToKKyAgICAgICAgKFdlYkNvcmU6OmZpbmREZWxp
bWl0ZXIpOgorICAgICAgICAoV2ViQ29yZTo6cGFyc2VDb250ZW50VHlwZSk6CisgICAgICAgIChX
ZWJDb3JlOjpwdXNoT3ZlckxpbmUpOgorICAgICAgICAoV2ViQ29yZTo6TXVsdGlwYXJ0UmVzcG9u
c2VEZWxlZ2F0ZTo6TXVsdGlwYXJ0UmVzcG9uc2VEZWxlZ2F0ZSk6CisgICAgICAgIChXZWJDb3Jl
OjpNdWx0aXBhcnRSZXNwb25zZURlbGVnYXRlOjpyZWFkTXVsdGlwYXJ0Qm91bmRhcnkpOgorICAg
ICAgICAoV2ViQ29yZTo6TXVsdGlwYXJ0UmVzcG9uc2VEZWxlZ2F0ZTo6b25SZWNlaXZlZERhdGEp
OgorICAgICAgICAoV2ViQ29yZTo6TXVsdGlwYXJ0UmVzcG9uc2VEZWxlZ2F0ZTo6b25Db21wbGV0
ZWRSZXF1ZXN0KToKKyAgICAgICAgKFdlYkNvcmU6Ok11bHRpcGFydFJlc3BvbnNlRGVsZWdhdGU6
OnBhcnNlSGVhZGVycyk6CisgICAgICAgIChXZWJDb3JlOjpNdWx0aXBhcnRSZXNwb25zZURlbGVn
YXRlOjpmaW5kQm91bmRhcnkpOgorICAgICAgICAqIHBsYXRmb3JtL25ldHdvcmsvYmxhY2tiZXJy
eS9NdWx0aXBhcnRSZXNwb25zZURlbGVnYXRlLmg6IEFkZGVkLgorCiAyMDExLTExLTMwICBUYWth
c2hpIFRveW9zaGltYSAgPHRveW9zaGltQGNocm9taXVtLm9yZz4KIAogICAgICAgICBBZGQgT1ZF
UlJJREUgdG8gV2ViU29ja2V0IHJlbGF0ZWQgc291cmNlcyBmb3Igc2FmZSBpbmhlcml0YW5jZXMu
CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkv
TXVsdGlwYXJ0UmVzcG9uc2VEZWxlZ2F0ZS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9u
ZXR3b3JrL2JsYWNrYmVycnkvTXVsdGlwYXJ0UmVzcG9uc2VEZWxlZ2F0ZS5jcHAKbmV3IGZpbGUg
bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE3NWU4YwotLS0gL2Rldi9udWxsCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvYmxhY2tiZXJyeS9NdWx0aXBhcnRSZXNwb25z
ZURlbGVnYXRlLmNwcApAQCAtMCwwICsxLDUxMiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDExIFJl
c2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gQ29weXJp
Z2h0IChjKSAyMDA2LTIwMDggVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHls
ZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisj
aW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiTXVsdGlwYXJ0UmVzcG9uc2VEZWxlZ2F0ZS5o
IgorCisjaW5jbHVkZSAiUmVzb3VyY2VIYW5kbGVDbGllbnQuaCIKKyNpbmNsdWRlIDx3dGYvQVND
SUlDVHlwZS5oPgorI2luY2x1ZGUgPHd0Zi9TdGRMaWJFeHRyYXMuaD4KKworbmFtZXNwYWNlIFdl
YkNvcmUgeworCitzdGF0aWMgYm9vbCBjb21wYXJlQ2hhcihjaGFyIHgsIGNoYXIgeSkKK3sKKyAg
ICByZXR1cm4gdG9BU0NJSUxvd2VyKHgpID09IHRvQVNDSUlMb3dlcih5KTsKK30KKworc3RhdGlj
IHZvaWQgc3RyaW5nVG9Mb3dlckFTQ0lJKHN0ZDo6c3RyaW5nJiBzKQoreworICAgIGZvciAoc3Rk
OjpzdHJpbmc6Oml0ZXJhdG9yIGkgPSBzLmJlZ2luKCk7IGkgIT0gcy5lbmQoKTsgKytpKQorICAg
ICAgICAqaSA9IHRvQVNDSUlMb3dlcigqaSk7Cit9CisKK2VudW0geworICAgIFRyaW1Ob25lICAg
ICA9IDAsCisgICAgVHJpbUxlYWRpbmcgID0gMSA8PCAwLAorICAgIFRyaW1UcmFpbGluZyA9IDEg
PDwgMSwKK307CisKK3R5cGVkZWYgdW5zaWduZWQgVHJpbVBvc2l0aW9uOworCitzdGF0aWMgVHJp
bVBvc2l0aW9uIHRyaW1TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIGlucHV0LCBjb25zdCBzdGQ6
OnN0cmluZzo6dmFsdWVfdHlwZSB0cmltQ2hhcnNbXSwgVHJpbVBvc2l0aW9uIHBvc2l0aW9uLCBz
dGQ6OnN0cmluZyYgb3V0cHV0KQoreworICAgIC8vIEZpbmQgdGhlIGVkZ2VzIG9mIGxlYWRpbmcv
dHJhaWxpbmcgd2hpdGVzcGFjZSBhcyBkZXNpcmVkLgorICAgIGNvbnN0IHN0ZDo6c3RyaW5nOjpz
aXplX3R5cGUgbGFzdENoYXIgPSBpbnB1dC5sZW5ndGgoKSAtIDE7CisgICAgY29uc3Qgc3RkOjpz
dHJpbmc6OnNpemVfdHlwZSBmaXJzdEdvb2RDaGFyID0gKHBvc2l0aW9uICYgVHJpbUxlYWRpbmcp
ID8gaW5wdXQuZmluZF9maXJzdF9ub3Rfb2YodHJpbUNoYXJzKSA6IDA7CisgICAgY29uc3Qgc3Rk
OjpzdHJpbmc6OnNpemVfdHlwZSBsYXN0R29vZENoYXIgPSAocG9zaXRpb24gJiBUcmltVHJhaWxp
bmcpID8gaW5wdXQuZmluZF9sYXN0X25vdF9vZih0cmltQ2hhcnMpIDogbGFzdENoYXI7CisKKyAg
ICAvLyBXaGVuIHRoZSBzdHJpbmcgd2FzIGFsbCB3aGl0ZXNwYWNlLCByZXBvcnQgdGhhdCB3ZSBz
dHJpcHBlZCBvZmYgd2hpdGVzcGFjZQorICAgIC8vIGZyb20gd2hpY2hldmVyIHBvc2l0aW9uIHRo
ZSBjYWxsZXIgd2FzIGludGVyZXN0ZWQgaW4uIEZvciBlbXB0eSBpbnB1dCwgd2UKKyAgICAvLyBz
dHJpcHBlZCBubyB3aGl0ZXNwYWNlLCBidXQgd2Ugc3RpbGwgbmVlZCB0byBjbGVhciB8b3V0cHV0
fC4KKyAgICBpZiAoaW5wdXQuZW1wdHkoKSB8fCBmaXJzdEdvb2RDaGFyID09IHN0ZDo6c3RyaW5n
OjpucG9zIHx8IGxhc3RHb29kQ2hhciA9PSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICBi
b29sIGlucHV0V2FzRW1wdHkgPSBpbnB1dC5lbXB0eSgpOworICAgICAgICBvdXRwdXQuY2xlYXIo
KTsKKyAgICAgICAgcmV0dXJuIGlucHV0V2FzRW1wdHkgPyBUcmltTm9uZSA6IHBvc2l0aW9uOwor
ICAgIH0KKworICAgIG91dHB1dCA9IGlucHV0LnN1YnN0cihmaXJzdEdvb2RDaGFyLCBsYXN0R29v
ZENoYXIgLSBmaXJzdEdvb2RDaGFyICsgMSk7CisKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VHJp
bVBvc2l0aW9uPigKKyAgICAgICAgKCFmaXJzdEdvb2RDaGFyID8gVHJpbU5vbmUgOiBUcmltTGVh
ZGluZykgfCAobGFzdEdvb2RDaGFyID09IGxhc3RDaGFyID8gVHJpbU5vbmUgOiBUcmltVHJhaWxp
bmcpKTsKK30KKworc3RhdGljIHN0ZDo6c3RyaW5nIGdldFNwZWNpZmljSGVhZGVyKGNvbnN0IHN0
ZDo6c3RyaW5nJiBoZWFkZXJzLCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkKK3sKKyAgICAvLyBX
ZSB3YW50IHRvIGdyYWIgdGhlIFZhbHVlIGZyb20gdGhlICJLZXk6IFZhbHVlIiBwYWlycyBpbiB0
aGUgaGVhZGVycywKKyAgICAvLyB3aGljaCBzaG91bGQgbG9vayBsaWtlIHRoaXMgKG5vIGxlYWRp
bmcgc3BhY2VzLCBcbi1zZXBhcmF0ZWQpICh3ZSBmb3JtYXQKKyAgICAvLyB0aGVtIHRoaXMgd2F5
IGluIHVybF9yZXF1ZXN0X2luZXQuY2MpOgorICAgIC8vICAgIEhUVFAvMS4xIDIwMCBPS1xuCisg
ICAgLy8gICAgRVRhZzogIjZkMGI4LTk0Ny0yNGYzNWVjMCJcbgorICAgIC8vICAgIENvbnRlbnQt
TGVuZ3RoOiAyMzc1XG4KKyAgICAvLyAgICBDb250ZW50LVR5cGU6IHRleHQvaHRtbDsgY2hhcnNl
dD1VVEYtOFxuCisgICAgLy8gICAgTGFzdC1Nb2RpZmllZDogU3VuLCAwMyBTZXAgMjAwNiAwNDoz
NDo0MyBHTVRcbgorICAgIGlmIChoZWFkZXJzLmVtcHR5KCkpCisgICAgICAgIHJldHVybiBzdGQ6
OnN0cmluZygpOworCisgICAgc3RkOjpzdHJpbmcgbWF0Y2goJ1xuJyArIG5hbWUgKyAnOicpOwor
CisgICAgc3RkOjpzdHJpbmc6OmNvbnN0X2l0ZXJhdG9yIGJlZ2luID0KKyAgICAgICAgc3RkOjpz
ZWFyY2goaGVhZGVycy5iZWdpbigpLCBoZWFkZXJzLmVuZCgpLCBtYXRjaC5iZWdpbigpLCBtYXRj
aC5lbmQoKSwgY29tcGFyZUNoYXIpOworCisgICAgaWYgKGJlZ2luID09IGhlYWRlcnMuZW5kKCkp
CisgICAgICAgIHJldHVybiBzdGQ6OnN0cmluZygpOworCisgICAgYmVnaW4gKz0gbWF0Y2gubGVu
Z3RoKCk7CisgICAgc3RkOjpzdHJpbmcgcmV0dXJuU3RyaW5nOworICAgIHN0YXRpYyBjb25zdCBj
aGFyKiB3aGl0ZXNwYWNlQVNDSUkgPSAiXHRcblx2XGZcciAiOworICAgIHRyaW1TdHJpbmcoc3Rk
OjpzdHJpbmcoYmVnaW4sIGZpbmQoYmVnaW4sIGhlYWRlcnMuZW5kKCksICdcbicpKSwgd2hpdGVz
cGFjZUFTQ0lJLCBUcmltTGVhZGluZyB8IFRyaW1UcmFpbGluZywgcmV0dXJuU3RyaW5nKTsKKyAg
ICByZXR1cm4gcmV0dXJuU3RyaW5nOworfQorCitzdGF0aWMgYm9vbCBsb3dlckNhc2VFcXVhbHNB
U0NJSShzdGQ6OnN0cmluZzo6Y29uc3RfaXRlcmF0b3IgYmVnaW4sIHN0ZDo6c3RyaW5nOjpjb25z
dF9pdGVyYXRvciBlbmQsIGNvbnN0IGNoYXIqIHMpCit7CisgICAgZm9yIChzdGQ6OnN0cmluZzo6
Y29uc3RfaXRlcmF0b3IgaXQgPSBiZWdpbjsgaXQgIT0gZW5kOyArK2l0LCArK3MpIHsKKyAgICAg
ICAgaWYgKCEqcyB8fCB0b0FTQ0lJTG93ZXIoKml0KSAhPSAqcykKKyAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuICEqczsKK30KKworc3RhdGljIHNpemVfdCBmaW5k
U3RyaW5nRW5kKGNvbnN0IHN0ZDo6c3RyaW5nJiBsaW5lLCBzaXplX3Qgc3RhcnQsIGNoYXIgZGVs
aW1pdGVyKQoreworICAgIGNvbnN0IGNoYXIgc2V0W10gPSB7IGRlbGltaXRlciwgJ1xcJywgJ1ww
JyB9OworICAgIGZvciAoOzspIHsKKyAgICAgICAgLy8gU3RhcnQgcG9pbnRzIHRvIGVpdGhlciB0
aGUgc3RhcnQgcXVvdGUgb3IgdGhlIGxhc3QKKyAgICAgICAgLy8gZXNjYXBlZCBjaGFyICh0aGUg
Y2hhciBmb2xsb3dpbmcgYSAnXFwnKS4KKworICAgICAgICBzaXplX3QgZW5kID0gbGluZS5maW5k
X2ZpcnN0X29mKHNldCwgc3RhcnQgKyAxKTsKKyAgICAgICAgaWYgKGVuZCA9PSBzdGQ6OnN0cmlu
Zzo6bnBvcykKKyAgICAgICAgICAgIHJldHVybiBsaW5lLmxlbmd0aCgpOworCisgICAgICAgIGlm
IChsaW5lW2VuZF0gPT0gJ1xcJykgeworICAgICAgICAgICAgLy8gSGl0IGEgYmFja3NsYXNoLWVz
Y2FwZWQgY2hhci4gTmVlZCB0byBza2lwIG92ZXIgaXQuCisgICAgICAgICAgICBzdGFydCA9IGVu
ZCArIDE7CisgICAgICAgICAgICBpZiAoc3RhcnQgPT0gbGluZS5sZW5ndGgoKSkKKyAgICAgICAg
ICAgICAgICByZXR1cm4gc3RhcnQ7CisKKyAgICAgICAgICAgIC8vIEdvIGJhY2sgdG8gbG9va2lu
ZyBmb3IgdGhlIG5leHQgZXNjYXBlIG9yIHRoZSBzdHJpbmcgZW5kLgorICAgICAgICAgICAgY29u
dGludWU7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZW5kOworICAgIH0KKworICAgIC8v
IHNob3VsZCBub3QgcmVhY2ggaGVyZS4KKyAgICByZXR1cm4gbGluZS5sZW5ndGgoKTsKK30KKwor
c3RhdGljIHNpemVfdCBmaW5kRGVsaW1pdGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBsaW5lLCBzaXpl
X3Qgc2VhcmNoU3RhcnQsIGNoYXIgZGVsaW1pdGVyKQoreworICAgIGRvIHsKKyAgICAgICAgLy8g
c2VhcmNoU3RhcnQgcG9pbnRzIHRvIHRoZSBzcG90IGZyb20gd2hpY2ggd2Ugc2hvdWxkIHN0YXJ0
IGxvb2tpbmcKKyAgICAgICAgLy8gZm9yIHRoZSBkZWxpbWl0ZXIuCisgICAgICAgIGNvbnN0IGNo
YXIgZGVsaW1pdGVyU2V0W10gPSB7IGRlbGltaXRlciwgJyInLCAnXCcnLCAnXDAnIH07CisgICAg
ICAgIHNpemVfdCBjdXJyZW50RGVsaW1pdGVyUG9zaXRpb24gPSBsaW5lLmZpbmRfZmlyc3Rfb2Yo
ZGVsaW1pdGVyU2V0LCBzZWFyY2hTdGFydCk7CisgICAgICAgIGlmIChjdXJyZW50RGVsaW1pdGVy
UG9zaXRpb24gPT0gc3RkOjpzdHJpbmc6Om5wb3MpCisgICAgICAgICAgICByZXR1cm4gbGluZS5s
ZW5ndGgoKTsKKworICAgICAgICBjaGFyIGN1cnJlbnRDaGFyID0gbGluZVtjdXJyZW50RGVsaW1p
dGVyUG9zaXRpb25dOworICAgICAgICBpZiAoY3VycmVudENoYXIgPT0gZGVsaW1pdGVyKSB7Cisg
ICAgICAgICAgICAvLyBGb3VuZCBkZWxpbWl0ZXIuCisgICAgICAgICAgICByZXR1cm4gY3VycmVu
dERlbGltaXRlclBvc2l0aW9uOworICAgICAgICB9CisKKyAgICAgICAgLy8gV2UgaGl0IHRoZSBz
dGFydCBvZiBhIHF1b3RlZCBzdHJpbmcuIExvb2sgZm9yIGl0cyBlbmQuCisgICAgICAgIHNlYXJj
aFN0YXJ0ID0gZmluZFN0cmluZ0VuZChsaW5lLCBjdXJyZW50RGVsaW1pdGVyUG9zaXRpb24sIGN1
cnJlbnRDaGFyKTsKKyAgICAgICAgaWYgKHNlYXJjaFN0YXJ0ID09IGxpbmUubGVuZ3RoKCkpCisg
ICAgICAgICAgICByZXR1cm4gc2VhcmNoU3RhcnQ7CisKKyAgICAgICAgKytzZWFyY2hTdGFydDsK
KworICAgICAgICAvLyBzZWFyY2hTdGFydCBub3cgcG9pbnRzIHRvIHRoZSBmaXJzdCBjaGFyIGFm
dGVyIHRoZSBlbmQgb2YgdGhlCisgICAgICAgIC8vIHN0cmluZywgc28ganVzdCBnbyBiYWNrIHRv
IHRoZSB0b3Agb2YgdGhlIGxvb3AgYW5kIGxvb2sgZm9yCisgICAgICAgIC8vIHxkZWxpbWl0ZXJ8
IGFnYWluLgorICAgIH0gd2hpbGUgKHRydWUpOworCisgICAgcmV0dXJuIGxpbmUubGVuZ3RoKCk7
Cit9CisKK3N0YXRpYyB2b2lkIHBhcnNlQ29udGVudFR5cGUoY29uc3Qgc3RkOjpzdHJpbmcmIGNv
bnRlbnRUeXBlLCBzdGQ6OnN0cmluZyYgbWltZVR5cGUsIHN0ZDo6c3RyaW5nJiBjaGFyc2V0LCBi
b29sJiBoYWRDaGFyc2V0KQoreworICAgIC8vIFRyaW0gbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hp
dGVzcGFjZSBmcm9tIHR5cGUuIFdlIGluY2x1ZGUgJygnIGluCisgICAgLy8gdGhlIHRyYWlsaW5n
IHRyaW0gc2V0IHRvIGNhdGNoIG1lZGlhLXR5cGUgY29tbWVudHMsIHdoaWNoIGFyZSBub3QgYXQg
YWxsCisgICAgLy8gc3RhbmRhcmQsIGJ1dCBtYXkgb2NjdXIgaW4gcmFyZSBjYXNlcy4KKyAgICBz
aXplX3QgdHlwZVZhbHVlID0gY29udGVudFR5cGUuZmluZF9maXJzdF9ub3Rfb2YoIiBcdCIpOwor
ICAgIHR5cGVWYWx1ZSA9IHN0ZDo6bWluKHR5cGVWYWx1ZSwgY29udGVudFR5cGUubGVuZ3RoKCkp
OworICAgIHNpemVfdCB0eXBlRW5kID0gY29udGVudFR5cGUuZmluZF9maXJzdF9vZigiIFx0IiI7
KCIsIHR5cGVWYWx1ZSk7CisgICAgaWYgKHN0ZDo6c3RyaW5nOjpucG9zID09IHR5cGVFbmQpCisg
ICAgICAgIHR5cGVFbmQgPSBjb250ZW50VHlwZS5sZW5ndGgoKTsKKworICAgIHNpemVfdCBjaGFy
c2V0VmFsdWUgPSAwOworICAgIHNpemVfdCBjaGFyc2V0RW5kID0gMDsKKworICAgIC8vIEl0ZXJh
dGUgb3ZlciBwYXJhbWV0ZXJzCisgICAgYm9vbCB0eXBlSGFzQ2hhcnNldCA9IGZhbHNlOworICAg
IHNpemVfdCBwYXJhbWV0ZXJTdGFydCA9IGNvbnRlbnRUeXBlLmZpbmRfZmlyc3Rfb2YoJzsnLCB0
eXBlRW5kKTsKKyAgICBpZiAocGFyYW1ldGVyU3RhcnQgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsK
KyAgICAgICAgLy8gV2UgaGF2ZSBwYXJhbWV0ZXJzLiBJdGVyYXRlIG92ZXIgdGhlbS4KKyAgICAg
ICAgc2l6ZV90IGN1cnJlbnRQYXJhbVN0YXJ0ID0gcGFyYW1ldGVyU3RhcnQgKyAxOworICAgICAg
ICBkbyB7CisgICAgICAgICAgICBzaXplX3QgY3VycmVudFBhcmFtZXRlckVuZCA9IGZpbmREZWxp
bWl0ZXIoY29udGVudFR5cGUsIGN1cnJlbnRQYXJhbVN0YXJ0LCAnOycpOworCisgICAgICAgICAg
ICBzaXplX3QgcGFyYW1ldGVyTmFtZVN0YXJ0ID0gY29udGVudFR5cGUuZmluZF9maXJzdF9ub3Rf
b2YoIiBcdCIsIGN1cnJlbnRQYXJhbVN0YXJ0KTsKKyAgICAgICAgICAgIHBhcmFtZXRlck5hbWVT
dGFydCA9IHN0ZDo6bWluKHBhcmFtZXRlck5hbWVTdGFydCwgY3VycmVudFBhcmFtZXRlckVuZCk7
CisKKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIGNoYXJzZXRTdHJpbmdbXSA9ICJjaGFy
c2V0PSI7CisgICAgICAgICAgICBzaXplX3QgY2hhcnNldEVuZE9mZnNldCA9IHN0ZDo6bWluKHBh
cmFtZXRlck5hbWVTdGFydCArIHNpemVvZihjaGFyc2V0U3RyaW5nKSAtIDEsIGN1cnJlbnRQYXJh
bWV0ZXJFbmQpOworICAgICAgICAgICAgaWYgKGxvd2VyQ2FzZUVxdWFsc0FTQ0lJKGNvbnRlbnRU
eXBlLmJlZ2luKCkgKyBwYXJhbWV0ZXJOYW1lU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgY29udGVudFR5cGUuYmVnaW4oKSArIGNoYXJzZXRFbmRPZmZzZXQsIGNo
YXJzZXRTdHJpbmcpKSB7CisgICAgICAgICAgICAgICAgY2hhcnNldFZhbHVlID0gcGFyYW1ldGVy
TmFtZVN0YXJ0ICsgc2l6ZW9mKGNoYXJzZXRTdHJpbmcpIC0gMTsKKyAgICAgICAgICAgICAgICBj
aGFyc2V0RW5kID0gY3VycmVudFBhcmFtZXRlckVuZDsKKyAgICAgICAgICAgICAgICB0eXBlSGFz
Q2hhcnNldCA9IHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGN1cnJlbnRQYXJh
bVN0YXJ0ID0gY3VycmVudFBhcmFtZXRlckVuZCArIDE7CisgICAgICAgIH0gd2hpbGUgKGN1cnJl
bnRQYXJhbVN0YXJ0IDwgY29udGVudFR5cGUubGVuZ3RoKCkpOworICAgIH0KKworICAgIGlmICh0
eXBlSGFzQ2hhcnNldCkgeworICAgICAgICAvLyBUcmltIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdo
aXRlc3BhY2UgZnJvbSBjaGFyc2V0VmFsdWUuIFdlIGluY2x1ZGUKKyAgICAgICAgLy8gJygnIGlu
IHRoZSB0cmFpbGluZyB0cmltIHNldCB0byBjYXRjaCBtZWRpYS10eXBlIGNvbW1lbnRzLCB3aGlj
aCBhcmUKKyAgICAgICAgLy8gbm90IGF0IGFsbCBzdGFuZGFyZCwgYnV0IG1heSBvY2N1ciBpbiBy
YXJlIGNhc2VzLgorICAgICAgICBjaGFyc2V0VmFsdWUgPSBjb250ZW50VHlwZS5maW5kX2ZpcnN0
X25vdF9vZigiIFx0IiwgY2hhcnNldFZhbHVlKTsKKyAgICAgICAgY2hhcnNldFZhbHVlID0gc3Rk
OjptaW4oY2hhcnNldFZhbHVlLCBjaGFyc2V0RW5kKTsKKyAgICAgICAgY2hhciBmaXJzdENoYXIg
PSBjb250ZW50VHlwZVtjaGFyc2V0VmFsdWVdOworICAgICAgICBpZiAoZmlyc3RDaGFyID09ICci
JyB8fCBmaXJzdENoYXIgPT0gJ1wnJykgeworICAgICAgICAgICAgY2hhcnNldEVuZCA9IGZpbmRT
dHJpbmdFbmQoY29udGVudFR5cGUsIGNoYXJzZXRWYWx1ZSwgZmlyc3RDaGFyKTsKKyAgICAgICAg
ICAgICsrY2hhcnNldFZhbHVlOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGNoYXJzZXRF
bmQgPSBzdGQ6Om1pbihjb250ZW50VHlwZS5maW5kX2ZpcnN0X29mKCIgXHQiICI7KCIsIGNoYXJz
ZXRWYWx1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnNldEVuZCk7
CisgICAgfQorCisgICAgLy8gSWYgdGhlIHNlcnZlciBzZW50ICIqLyoiLCBpdCBpcyBtZWFuaW5n
bGVzcywgc28gZG8gbm90IHN0b3JlIGl0LgorICAgIC8vIGFsc28sIGlmIHR5cGVWYWx1ZSBpcyB0
aGUgc2FtZSBhcyBtaW1lVHlwZSwgdGhlbiBqdXN0IHVwZGF0ZSB0aGUKKyAgICAvLyBjaGFyc2V0
LiBob3dldmVyLCBpZiBjaGFyc2V0IGlzIGVtcHR5IGFuZCBtaW1lVHlwZSBoYXNuJ3QKKyAgICAv
LyBjaGFuZ2VkLCB0aGVuIGRvbid0IHdpcGUtb3V0IGFuIGV4aXN0aW5nIGNoYXJzZXQuIFdlCisg
ICAgLy8gYWxzbyB3YW50IHRvIHJlamVjdCBhIG1pbWUtdHlwZSBpZiBpdCBkb2VzIG5vdCBpbmNs
dWRlIGEgc2xhc2guCisgICAgLy8gc29tZSBzZXJ2ZXJzIGdpdmUganVuayBhZnRlciB0aGUgY2hh
cnNldCBwYXJhbWV0ZXIsIHdoaWNoIG1heQorICAgIC8vIGluY2x1ZGUgYSBjb21tYSwgc28gdGhp
cyBjaGVjayBtYWtlcyB1cyBhIGJpdCBtb3JlIHRvbGVyYW50LgorICAgIGlmIChjb250ZW50VHlw
ZS5sZW5ndGgoKQorICAgICAgICAmJiBjb250ZW50VHlwZSAhPSAiKi8qIgorICAgICAgICAmJiBj
b250ZW50VHlwZS5maW5kX2ZpcnN0X29mKCcvJykgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAg
ICAgICAgLy8gQ29tbW9uIGNhc2UgaGVyZSBpcyB0aGF0IG1pbWVUeXBlIGlzIGVtcHR5CisgICAg
ICAgIGJvb2wgZXF1YWwgPSAhbWltZVR5cGUuZW1wdHkoKQorICAgICAgICAgICAgICAgICAgICAg
JiYgbG93ZXJDYXNlRXF1YWxzQVNDSUkoY29udGVudFR5cGUuYmVnaW4oKSArIHR5cGVWYWx1ZSwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBl
LmJlZ2luKCkgKyB0eXBlRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgbWltZVR5cGUuZGF0YSgpKTsKKyAgICAgICAgaWYgKCFlcXVhbCkgeworICAgICAg
ICAgICAgbWltZVR5cGUuYXNzaWduKGNvbnRlbnRUeXBlLmJlZ2luKCkgKyB0eXBlVmFsdWUsIGNv
bnRlbnRUeXBlLmJlZ2luKCkgKyB0eXBlRW5kKTsKKyAgICAgICAgICAgIHN0cmluZ1RvTG93ZXJB
U0NJSShtaW1lVHlwZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFlcXVhbCB8fCB0eXBlSGFz
Q2hhcnNldCkgeworICAgICAgICAgICAgaGFkQ2hhcnNldCA9IHRydWU7CisgICAgICAgICAgICBj
aGFyc2V0LmFzc2lnbihjb250ZW50VHlwZS5iZWdpbigpICsgY2hhcnNldFZhbHVlLCBjb250ZW50
VHlwZS5iZWdpbigpICsgY2hhcnNldEVuZCk7CisgICAgICAgICAgICBzdHJpbmdUb0xvd2VyQVND
SUkoY2hhcnNldCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIENoZWNrcyB0byBzZWUgaWYg
ZGF0YVtwb3NpdGlvbl0gY2hhcmFjdGVyIGlzIGEgbGluZSBicmVhazsgaGFuZGxlcyBjcmxmLCBs
ZmxmLAorLy8gbGYsIG9yIGNyLiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBz
a2lwIG92ZXIgKDAsIDEgb3IgMikuCitzdGF0aWMgaW50IHB1c2hPdmVyTGluZShjb25zdCBzdGQ6
OnN0cmluZyYgZGF0YSwgc2l6ZV90IHBvc2l0aW9uKQoreworICAgIGludCBvZmZzZXQgPSAwOwor
ICAgIGlmIChwb3NpdGlvbiA8IGRhdGEubGVuZ3RoKCkgJiYgKGRhdGFbcG9zaXRpb25dID09ICdc
cicgfHwgZGF0YVtwb3NpdGlvbl0gPT0gJ1xuJykpIHsKKyAgICAgICAgKytvZmZzZXQ7CisgICAg
ICAgIGlmIChwb3NpdGlvbiArIDEgPCBkYXRhLmxlbmd0aCgpICYmIGRhdGFbcG9zaXRpb24gKyAx
XSA9PSAnXG4nKQorICAgICAgICAgICAgKytvZmZzZXQ7CisgICAgfQorICAgIHJldHVybiBvZmZz
ZXQ7Cit9CisKK011bHRpcGFydFJlc3BvbnNlRGVsZWdhdGU6Ok11bHRpcGFydFJlc3BvbnNlRGVs
ZWdhdGUoUGFzc1JlZlB0cjxSZXNvdXJjZUhhbmRsZT4gcmVzb3VjZUhhbmRsZSwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVzb3Vy
Y2VSZXNwb25zZSYgcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBib3VuZGFyeSkKKyAgICA6IG1f
Ym91bmRhcnkoYm91bmRhcnkpCisgICAgLCBtX2VuY29kZWREYXRhTGVuZ3RoKDApCisgICAgLCBt
X2ZpcnN0UmVjZWl2ZWREYXRhKHRydWUpCisgICAgLCBtX29yaWdpbmFsUmVzcG9uc2UocmVzcG9u
c2UpCisgICAgLCBtX3Byb2Nlc3NpbmdIZWFkZXJzKGZhbHNlKQorICAgICwgbV9yZXNvdXJjZUhh
bmRsZShyZXNvdWNlSGFuZGxlKQorICAgICwgbV9zdG9wU2VuZGluZyhmYWxzZSkKK3sKKyAgICBz
dGQ6OnN0cmluZyBzZWFyY2ggPSAiLS0iOworICAgIGlmIChtX2JvdW5kYXJ5LmNvbXBhcmUoMCwg
c2VhcmNoLmxlbmd0aCgpLCBzZWFyY2gpKQorICAgICAgICBtX2JvdW5kYXJ5ID0gc2VhcmNoICsg
bV9ib3VuZGFyeTsKK30KKworYm9vbCBNdWx0aXBhcnRSZXNwb25zZURlbGVnYXRlOjpyZWFkTXVs
dGlwYXJ0Qm91bmRhcnkoY29uc3Qgc3RkOjpzdHJpbmcmIGNvbnRlbnRUeXBlLCBzdGQ6OnN0cmlu
ZyYgbXVsdGlwYXJ0Qm91bmRhcnkpCit7CisgICAgc2l6ZV90IGJvdW5kYXJ5U3RhcnRPZmZzZXQg
PSBjb250ZW50VHlwZS5maW5kKCJib3VuZGFyeT0iKTsKKyAgICBpZiAoYm91bmRhcnlTdGFydE9m
ZnNldCA9PSBzdGQ6OnN0cmluZzo6bnBvcykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAg
Ym91bmRhcnlTdGFydE9mZnNldCArPSBzdHJsZW4oImJvdW5kYXJ5PSIpOworICAgIHNpemVfdCBi
b3VuZGFyeUVuZE9mZnNldCA9IGNvbnRlbnRUeXBlLmZpbmQoJzsnLCBib3VuZGFyeVN0YXJ0T2Zm
c2V0KTsKKworICAgIGlmIChib3VuZGFyeUVuZE9mZnNldCA9PSBzdGQ6OnN0cmluZzo6bnBvcykK
KyAgICAgICAgYm91bmRhcnlFbmRPZmZzZXQgPSBjb250ZW50VHlwZS5sZW5ndGgoKTsKKworICAg
IHNpemVfdCBib3VuZGFyeUxlbmd0aCA9IGJvdW5kYXJ5RW5kT2Zmc2V0IC0gYm91bmRhcnlTdGFy
dE9mZnNldDsKKyAgICBtdWx0aXBhcnRCb3VuZGFyeSA9IGNvbnRlbnRUeXBlLnN1YnN0cihib3Vu
ZGFyeVN0YXJ0T2Zmc2V0LCBib3VuZGFyeUxlbmd0aCk7CisKKyAgICAvLyBUaGUgYnl0ZSByYW5n
ZSByZXNwb25zZSBjYW4gaGF2ZSBxdW90ZWQgYm91bmRhcnkgc3RyaW5ncy4gVGhpcyBpcyBsZWdh
bAorICAgIC8vIGFzIHBlciBNSU1FIHNwZWNpZmljYXRpb25zLiBJbmRpdmlkdWFsIGRhdGEgZnJh
Z2VtZW50cyBob3dldmVyIGRvbid0CisgICAgLy8gY29udGFpbiBxdW90ZWQgYm91bmRhcnkgc3Ry
aW5ncy4KKyAgICB0cmltU3RyaW5nKG11bHRpcGFydEJvdW5kYXJ5LCAiXCIiLCBUcmltTGVhZGlu
ZyB8IFRyaW1UcmFpbGluZywgbXVsdGlwYXJ0Qm91bmRhcnkpOworICAgIHJldHVybiB0cnVlOwor
fQorCit2b2lkIE11bHRpcGFydFJlc3BvbnNlRGVsZWdhdGU6Om9uUmVjZWl2ZWREYXRhKGNvbnN0
IGNoYXIqIGRhdGEsIGludCBsZW5ndGgsIGludCBlbmNvZGVkRGF0YUxlbmd0aCkKK3sKKyAgICAv
LyBtX3N0b3BTZW5kaW5nIG1lYW5zIHRoYXQgd2UndmUgYWxyZWFkeSByZWNlaXZlZCB0aGUgZmlu
YWwgYm91bmRhcnkgdG9rZW4uCisgICAgLy8gVGhlIHNlcnZlciBzaG91bGQgc3RvcCBzZW5kaW5n
IHVzIGRhdGEgYXQgdGhpcyBwb2ludCwgYnV0IGlmIGl0IGRvZXMsIHdlCisgICAgLy8ganVzdCB0
aHJvdyBpdCBhd2F5LgorICAgIGlmIChtX3N0b3BTZW5kaW5nKQorICAgICAgICByZXR1cm47CisK
KyAgICBtX2RhdGEuYXBwZW5kKGRhdGEsIGxlbmd0aCk7CisgICAgbV9lbmNvZGVkRGF0YUxlbmd0
aCArPSBlbmNvZGVkRGF0YUxlbmd0aDsKKyAgICBpZiAobV9maXJzdFJlY2VpdmVkRGF0YSkgewor
ICAgICAgICAvLyBTb21lIHNlcnZlcnMgZG9uJ3Qgc2VuZCBhIGJvdW5kYXJ5IHRva2VuIGJlZm9y
ZSB0aGUgZmlyc3QgY2h1bmsgb2YKKyAgICAgICAgLy8gZGF0YS4gV2UgaGFuZGxlIHRoaXMgY2Fz
ZSBhbnl3YXkgKEdlY2tvIGRvZXMgdG9vKS4KKyAgICAgICAgbV9maXJzdFJlY2VpdmVkRGF0YSA9
IGZhbHNlOworCisgICAgICAgIC8vIEVhdCBsZWFkaW5nIFxyXG4uCisgICAgICAgIGludCBwb3Np
dGlvbiA9IHB1c2hPdmVyTGluZShtX2RhdGEsIDApOworICAgICAgICBpZiAocG9zaXRpb24pCisg
ICAgICAgICAgICBtX2RhdGEgPSBtX2RhdGEuc3Vic3RyKHBvc2l0aW9uKTsKKworICAgICAgICBp
ZiAobV9kYXRhLmxlbmd0aCgpIDwgbV9ib3VuZGFyeS5sZW5ndGgoKSArIDIpIHsKKyAgICAgICAg
ICAgIC8vIFdlIGRvbid0IGhhdmUgZW5vdWdoIGRhdGEgeWV0IHRvIG1ha2UgYSBib3VuZGFyeSB0
b2tlbi4gSnVzdCB3YWl0CisgICAgICAgICAgICAvLyB1bnRpbCB0aGUgbmV4dCBjaHVuayBvZiBk
YXRhIGFycml2ZXMuCisgICAgICAgICAgICBtX2ZpcnN0UmVjZWl2ZWREYXRhID0gdHJ1ZTsKKyAg
ICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtX2RhdGEuY29tcGFy
ZSgwLCBtX2JvdW5kYXJ5Lmxlbmd0aCgpLCBtX2JvdW5kYXJ5KSkKKyAgICAgICAgICAgIG1fZGF0
YSA9IG1fYm91bmRhcnkgKyAiXG4iICsgbV9kYXRhOworICAgIH0KKworICAgIC8vIEhlYWRlcnMK
KyAgICBpZiAobV9wcm9jZXNzaW5nSGVhZGVycykgeworICAgICAgICAvLyBFYXQgbGVhZGluZyBc
clxuLgorICAgICAgICBpbnQgcG9zaXRpb24gPSBwdXNoT3ZlckxpbmUobV9kYXRhLCAwKTsKKyAg
ICAgICAgaWYgKHBvc2l0aW9uKQorICAgICAgICAgICAgbV9kYXRhID0gbV9kYXRhLnN1YnN0cihw
b3NpdGlvbik7CisKKyAgICAgICAgaWYgKHBhcnNlSGVhZGVycygpKSB7CisgICAgICAgICAgICAv
LyBTdWNjZXNzZnVsbHkgcGFyc2VkIGhlYWRlcnMuCisgICAgICAgICAgICBtX3Byb2Nlc3NpbmdI
ZWFkZXJzID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBHZXQgbW9y
ZSBkYXRhIGJlZm9yZSB0cnlpbmcgYWdhaW4uCisgICAgICAgICAgICByZXR1cm47CisgICAgICAg
IH0KKyAgICB9CisKKyAgICBzaXplX3QgYm91bmRhcnlQb3NpdGlvbjsKKyAgICB3aGlsZSAoKGJv
dW5kYXJ5UG9zaXRpb24gPSBmaW5kQm91bmRhcnkoKSkgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsK
KyAgICAgICAgaWYgKG1fcmVzb3VyY2VIYW5kbGUgJiYgIG1fcmVzb3VyY2VIYW5kbGUtPmNsaWVu
dCgpKSB7CisgICAgICAgICAgICAvLyBTdHJpcCBvdXQgdHJhaWxpbmcgXG5cciBjaGFyYWN0ZXJz
IGluIHRoZSBidWZmZXIgcHJlY2VkaW5nIHRoZQorICAgICAgICAgICAgLy8gYm91bmRhcnkgb24g
dGhlIHNhbWUgbGluZXMgYXMgRmlyZWZveC4KKyAgICAgICAgICAgIGludCBkYXRhTGVuZ3RoID0g
Ym91bmRhcnlQb3NpdGlvbjsKKyAgICAgICAgICAgIGlmIChib3VuZGFyeVBvc2l0aW9uID4gMCAm
JiBtX2RhdGFbYm91bmRhcnlQb3NpdGlvbiAtIDFdID09ICdcbicpIHsKKyAgICAgICAgICAgICAg
ICBkYXRhTGVuZ3RoLS07CisgICAgICAgICAgICAgICAgaWYgKGJvdW5kYXJ5UG9zaXRpb24gPiAx
ICYmIG1fZGF0YVtib3VuZGFyeVBvc2l0aW9uIC0gMl0gPT0gJ1xyJykKKyAgICAgICAgICAgICAg
ICAgICAgZGF0YUxlbmd0aC0tOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGRhdGFM
ZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgLy8gU2VuZCB0aGUgbGFzdCBkYXRhIGNodW5r
LgorICAgICAgICAgICAgICAgIG1fcmVzb3VyY2VIYW5kbGUtPmNsaWVudCgpLT5kaWRSZWNlaXZl
RGF0YShtX3Jlc291cmNlSGFuZGxlLmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2RhdGEuZGF0YSgpLAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhTGVu
Z3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBtX2VuY29kZWREYXRhTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBtX2VuY29kZWRE
YXRhTGVuZ3RoID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzaXplX3Qg
Ym91bmRhcnlFbmRQb3NpdGlvbiA9IGJvdW5kYXJ5UG9zaXRpb24gKyBtX2JvdW5kYXJ5Lmxlbmd0
aCgpOworICAgICAgICBpZiAoYm91bmRhcnlFbmRQb3NpdGlvbiA8IG1fZGF0YS5sZW5ndGgoKSAm
JiAnLScgPT0gbV9kYXRhW2JvdW5kYXJ5RW5kUG9zaXRpb25dKSB7CisgICAgICAgICAgICAvLyBU
aGlzIHdhcyB0aGUgbGFzdCBib3VuZGFyeSBzbyB3ZSBjYW4gc3RvcCBwcm9jZXNzaW5nLgorICAg
ICAgICAgICAgbV9zdG9wU2VuZGluZyA9IHRydWU7CisgICAgICAgICAgICBtX2RhdGEuY2xlYXIo
KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFdlIGNhbiBu
b3cgdGhyb3cgb3V0IGRhdGEgdXAgdGhyb3VnaCB0aGUgYm91bmRhcnkuCisgICAgICAgIGludCBv
ZmZzZXQgPSBwdXNoT3ZlckxpbmUobV9kYXRhLCBib3VuZGFyeUVuZFBvc2l0aW9uKTsKKyAgICAg
ICAgbV9kYXRhID0gbV9kYXRhLnN1YnN0cihib3VuZGFyeUVuZFBvc2l0aW9uICsgb2Zmc2V0KTsK
KworICAgICAgICAvLyBPaywgYmFjayB0byBwYXJzaW5nIGhlYWRlcnMuCisgICAgICAgIGlmICgh
cGFyc2VIZWFkZXJzKCkpIHsKKyAgICAgICAgICAgIG1fcHJvY2Vzc2luZ0hlYWRlcnMgPSB0cnVl
OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBBdCB0aGlz
IHBvaW50LCB3ZSBzaG91bGQgc2VuZCBvdmVyIGFueSBkYXRhIHdlIGhhdmUsIGJ1dCBrZWVwIGVu
b3VnaCBkYXRhCisgICAgLy8gYnVmZmVyZWQgdG8gaGFuZGxlIGEgYm91bmRhcnkgdGhhdCBtYXkg
aGF2ZSBiZWVuIHRydW5jYXRlZC4KKyAgICBpZiAoIW1fcHJvY2Vzc2luZ0hlYWRlcnMgJiYgbV9k
YXRhLmxlbmd0aCgpID4gbV9ib3VuZGFyeS5sZW5ndGgoKSkgeworICAgICAgICAvLyBJZiB0aGUg
bGFzdCBjaGFyYWN0ZXIgaXMgYSBuZXcgbGluZSBjaGFyYWN0ZXIsIGdvIGFoZWFkIGFuZCBqdXN0
IHNlbmQKKyAgICAgICAgLy8gZXZlcnl0aGluZyB3ZSBoYXZlIGJ1ZmZlcmVkLiBUaGlzIG1hdGNo
ZXMgYW4gb3B0aW1pemF0aW9uIGluIEdlY2tvLgorICAgICAgICBpbnQgc2VuZExlbmd0aCA9IG1f
ZGF0YS5sZW5ndGgoKSAtIG1fYm91bmRhcnkubGVuZ3RoKCk7CisgICAgICAgIGlmIChtX2RhdGFb
bV9kYXRhLmxlbmd0aCgpIC0gMV0gPT0gJ1xuJykKKyAgICAgICAgICAgIHNlbmRMZW5ndGggPSBt
X2RhdGEubGVuZ3RoKCk7CisgICAgICAgIGlmIChtX3Jlc291cmNlSGFuZGxlICYmIG1fcmVzb3Vy
Y2VIYW5kbGUtPmNsaWVudCgpKQorICAgICAgICAgICAgbV9yZXNvdXJjZUhhbmRsZS0+Y2xpZW50
KCktPmRpZFJlY2VpdmVEYXRhKG1fcmVzb3VyY2VIYW5kbGUuZ2V0KCksCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9kYXRhLmRhdGEoKSwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBz
ZW5kTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIG1fZW5jb2RlZERhdGFMZW5ndGgpOworICAgICAgICBtX2RhdGEgPSBtX2RhdGEu
c3Vic3RyKHNlbmRMZW5ndGgpOworICAgICAgICBtX2VuY29kZWREYXRhTGVuZ3RoID0gMDsKKyAg
ICB9Cit9CisKK3ZvaWQgTXVsdGlwYXJ0UmVzcG9uc2VEZWxlZ2F0ZTo6b25Db21wbGV0ZWRSZXF1
ZXN0KCkKK3sKKyAgICAvLyBJZiB3ZSBoYXZlIGFueSBwZW5kaW5nIGRhdGEgYW5kIHdlJ3JlIG5v
dCBpbiBhIGhlYWRlciwgZ28gYWhlYWQgYW5kIHNlbmQKKyAgICAvLyBpdCB0byBXZWJDb3JlLgor
ICAgIGlmICghbV9wcm9jZXNzaW5nSGVhZGVycyAmJiAhbV9kYXRhLmVtcHR5KCkgJiYgIW1fc3Rv
cFNlbmRpbmcgJiYgbV9yZXNvdXJjZUhhbmRsZSAmJiBtX3Jlc291cmNlSGFuZGxlLT5jbGllbnQo
KSkgeworICAgICAgICBtX3Jlc291cmNlSGFuZGxlLT5jbGllbnQoKS0+ZGlkUmVjZWl2ZURhdGEo
bV9yZXNvdXJjZUhhbmRsZS5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIG1fZGF0YS5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2RhdGEubGVuZ3RoKCksCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2VuY29kZWREYXRhTGVu
Z3RoKTsKKyAgICAgICAgbV9lbmNvZGVkRGF0YUxlbmd0aCA9IDA7CisgICAgfQorfQorCitib29s
IE11bHRpcGFydFJlc3BvbnNlRGVsZWdhdGU6OnBhcnNlSGVhZGVycygpCit7CisgICAgaW50IGxp
bmVGZWVkSW5jcmVtZW50ID0gMTsKKworICAgIC8vIEdyYWIgdGhlIGhlYWRlcnMgYmVpbmcgbGli
ZXJhbCBhYm91dCBsaW5lIGVuZGluZ3MuCisgICAgc2l6ZV90IGxpbmVTdGFydFBvc2l0aW9uID0g
MDsKKyAgICBzaXplX3QgbGluZUVuZFBvc2l0aW9uID0gbV9kYXRhLmZpbmQoJ1xuJyk7CisgICAg
d2hpbGUgKGxpbmVFbmRQb3NpdGlvbiAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAv
LyBIYW5kbGUgQ1JMRgorICAgICAgICBpZiAobGluZUVuZFBvc2l0aW9uID4gbGluZVN0YXJ0UG9z
aXRpb24gJiYgbV9kYXRhW2xpbmVFbmRQb3NpdGlvbiAtIDFdID09ICdccicpIHsKKyAgICAgICAg
ICAgIGxpbmVGZWVkSW5jcmVtZW50ID0gMjsKKyAgICAgICAgICAgIC0tbGluZUVuZFBvc2l0aW9u
OworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGxpbmVGZWVkSW5jcmVtZW50ID0gMTsKKwor
ICAgICAgICBpZiAobGluZVN0YXJ0UG9zaXRpb24gPT0gbGluZUVuZFBvc2l0aW9uKSB7CisgICAg
ICAgICAgICAvLyBBIGJsYW5rIGxpbmUsIGVuZCBvZiBoZWFkZXJzLgorICAgICAgICAgICAgbGlu
ZUVuZFBvc2l0aW9uICs9IGxpbmVGZWVkSW5jcmVtZW50OworICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgIH0KKyAgICAgICAgLy8gRmluZCB0aGUgbmV4dCBoZWFkZXIgbGluZS4KKyAgICAgICAg
bGluZVN0YXJ0UG9zaXRpb24gPSBsaW5lRW5kUG9zaXRpb24gKyBsaW5lRmVlZEluY3JlbWVudDsK
KyAgICAgICAgbGluZUVuZFBvc2l0aW9uID0gbV9kYXRhLmZpbmQoJ1xuJywgbGluZVN0YXJ0UG9z
aXRpb24pOworICAgIH0KKyAgICAvLyBUcnVuY2F0ZWQgaW4gdGhlIG1pZGRsZSBvZiBhIGhlYWRl
ciwgc3RvcCBwYXJzaW5nLgorICAgIGlmIChsaW5lRW5kUG9zaXRpb24gPT0gc3RkOjpzdHJpbmc6
Om5wb3MpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIEVhdCBoZWFkZXJzLgorICAg
IHN0ZDo6c3RyaW5nIGhlYWRlcnMoIlxuIik7CisgICAgaGVhZGVycy5hcHBlbmQobV9kYXRhLCAw
LCBsaW5lRW5kUG9zaXRpb24pOworICAgIG1fZGF0YSA9IG1fZGF0YS5zdWJzdHIobGluZUVuZFBv
c2l0aW9uKTsKKworICAgIC8vIENyZWF0ZSBhIFdlYlVSTFJlc3BvbnNlIGJhc2VkIG9uIHRoZSBv
cmlnaW5hbCBzZXQgb2YgaGVhZGVycyArIHRoZQorICAgIC8vIHJlcGxhY2VtZW50IGhlYWRlcnMu
IFdlIG9ubHkgcmVwbGFjZSB0aGUgc2FtZSBmZXcgaGVhZGVycyB0aGF0IGdlY2tvCisgICAgLy8g
ZG9lcy4gU2VlIG5ldHdlcmsvc3RyZWFtY29udi9jb252ZXJ0ZXJzL25zTXVsdGlNaXhlZENvbnYu
Y3BwLgorCisgICAgc3RkOjpzdHJpbmcgY29udGVudFR5cGUgPSBnZXRTcGVjaWZpY0hlYWRlciho
ZWFkZXJzLCAiY29udGVudC10eXBlIik7CisgICAgc3RkOjpzdHJpbmcgbWltZVR5cGU7CisgICAg
c3RkOjpzdHJpbmcgY2hhcnNldDsKKyAgICBib29sIGhhc0NoYXJzZXQgPSBmYWxzZTsKKworICAg
IHBhcnNlQ29udGVudFR5cGUoY29udGVudFR5cGUsIG1pbWVUeXBlLCBjaGFyc2V0LCBoYXNDaGFy
c2V0KTsKKyAgICBSZXNvdXJjZVJlc3BvbnNlIHJlc3BvbnNlOworICAgIHJlc3BvbnNlLnNldFVS
TChtX29yaWdpbmFsUmVzcG9uc2UudXJsKCkpOworICAgIHJlc3BvbnNlLnNldE1pbWVUeXBlKFN0
cmluZzo6ZnJvbVVURjgobWltZVR5cGUuZGF0YSgpKSk7CisgICAgaWYgKGhhc0NoYXJzZXQpCisg
ICAgICAgIHJlc3BvbnNlLnNldFRleHRFbmNvZGluZ05hbWUoU3RyaW5nOjpmcm9tVVRGOChjaGFy
c2V0LmRhdGEoKSkpOworCisgICAgY29uc3QgV2ViQ29yZTo6SFRUUEhlYWRlck1hcCYgbWFwID0g
bV9vcmlnaW5hbFJlc3BvbnNlLmh0dHBIZWFkZXJGaWVsZHMoKTsKKworICAgIC8vIFRoZSBsaXN0
IG9mIHJlc3BvbnNlIGhlYWRlcnMgdGhhdCB3ZSBkbyBub3QgY29weSBmcm9tIHRoZSBvcmlnaW5h
bAorICAgIC8vIHJlc3BvbnNlIHdoZW4gZ2VuZXJhdGluZyBhIHJlc3Bvc2UuCisgICAgc3RhdGlj
IGNvbnN0IGNoYXIqIFJlcGxhY2VIZWFkZXJzW10gPSB7CisgICAgICAgICAiY29udGVudC10eXBl
IiwKKyAgICAgICAgICJjb250ZW50LWxlbmd0aCIsCisgICAgICAgICAiY29udGVudC1kaXNwb3Np
dGlvbiIsCisgICAgICAgICAiY29udGVudC1yYW5nZSIsCisgICAgICAgICAicmFuZ2UiLAorICAg
ICAgICAgInNldC1jb29raWUiCisgICAgfTsKKworICAgIGZvciAoV2ViQ29yZTo6SFRUUEhlYWRl
ck1hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtYXAuYmVnaW4oKTsgaXQgIT0gbWFwLmVuZCgpOyAr
K2l0KSB7CisgICAgICAgIGJvb2wgbmVlZHNBZGQgPSB0cnVlOworICAgICAgICBmb3IgKHNpemVf
dCBpID0gMDsgaSA8IFdURl9BUlJBWV9MRU5HVEgoUmVwbGFjZUhlYWRlcnMpOyArK2kpIHsKKyAg
ICAgICAgICAgIGlmIChpdC0+Zmlyc3QubG93ZXIoKSA9PSBSZXBsYWNlSGVhZGVyc1tpXSkgewor
ICAgICAgICAgICAgICAgIG5lZWRzQWRkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5lZWRzQWRkKQorICAgICAg
ICAgICAgcmVzcG9uc2Uuc2V0SFRUUEhlYWRlckZpZWxkKGl0LT5maXJzdCwgaXQtPnNlY29uZCk7
CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBXVEZfQVJSQVlfTEVOR1RIKFJl
cGxhY2VIZWFkZXJzKTsgKytpKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUoUmVwbGFjZUhl
YWRlcnNbaV0pOworICAgICAgICBzdGQ6OnN0cmluZyB2YWx1ZSA9IGdldFNwZWNpZmljSGVhZGVy
KGhlYWRlcnMsIG5hbWUpOworICAgICAgICBpZiAoIXZhbHVlLmVtcHR5KCkpIHsKKyAgICAgICAg
ICAgIHJlc3BvbnNlLnNldEhUVFBIZWFkZXJGaWVsZChTdHJpbmc6OmZyb21VVEY4KG5hbWUuZGF0
YSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc6OmZy
b21VVEY4KHZhbHVlLmRhdGEoKSkpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1fcmVz
b3VyY2VIYW5kbGUgJiYgbV9yZXNvdXJjZUhhbmRsZS0+Y2xpZW50KCkpIHsKKyAgICAgICAgLy8g
QWZ0ZXIgcGFyc2VkIHRoZSBoZWFkZXJzIHN1Y2Nlc3NmdWxseSwgdGhlIG11bHRpcGFydCBwYWdl
cyB3aWxsIG5vdCBiZSBzdG9yZWQgaW4gcGFnZQorICAgICAgICAvLyBjYWNoZSBhbnkgbW9yZSwg
YmVjYXVzZSBnbyBiYWNrL2ZvcndhcmQgYWN0aW9ucyBuZWVkIGdldHRpbmcgdGhlIGxhdGVzdCBk
YXRhIGZyb20gc2VydmVyLgorICAgICAgICByZXNwb25zZS5zZXRJc011bHRpcGFydFBheWxvYWQo
dHJ1ZSk7CisgICAgICAgIG1fcmVzb3VyY2VIYW5kbGUtPmNsaWVudCgpLT5kaWRSZWNlaXZlUmVz
cG9uc2UobV9yZXNvdXJjZUhhbmRsZS5nZXQoKSwgcmVzcG9uc2UpOworICAgIH0KKyAgICByZXR1
cm4gdHJ1ZTsKK30KKworLy8gQm91bmRhcmllcyBhcmUgc3VwcG9zZWQgdG8gYmUgcHJlY2VlZGVk
IHdpdGggLS0sIGJ1dCBpdCBsb29rcyBsaWtlIGdlY2tvCisvLyBkb2Vzbid0IHJlcXVpcmUgdGhl
IGRhc2hlcyB0byBleGlzdC4gU2VlIG5zTXVsdGlNaXhlZENvbnY6OkZpbmRUb2tlbi4KK3NpemVf
dCBNdWx0aXBhcnRSZXNwb25zZURlbGVnYXRlOjpmaW5kQm91bmRhcnkoKQoreworICAgIHNpemVf
dCBib3VuZGFyeVBvc2l0aW9uID0gbV9kYXRhLmZpbmQobV9ib3VuZGFyeSk7CisgICAgaWYgKGJv
dW5kYXJ5UG9zaXRpb24gIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgLy8gQmFjayB1
cCBvdmVyIC0tIGZvciBiYWNrd2FyZHMgY29tcGF0CisgICAgICAgIC8vIEZJWE1FKHRjKTogRG9u
J3Qgd2Ugb25seSB3YW50IHRvIGRvIHRoaXMgb25jZT8gR2Vja28gY29kZSBkb2Vzbid0IHNlZW0K
KyAgICAgICAgLy8gdG8gY2FyZS4KKyAgICAgICAgaWYgKGJvdW5kYXJ5UG9zaXRpb24gPj0gMikg
eworICAgICAgICAgICAgaWYgKCctJyA9PSBtX2RhdGFbYm91bmRhcnlQb3NpdGlvbiAtIDFdICYm
ICctJyA9PSBtX2RhdGFbYm91bmRhcnlQb3NpdGlvbiAtIDJdKSB7CisgICAgICAgICAgICAgICAg
Ym91bmRhcnlQb3NpdGlvbiAtPSAyOworICAgICAgICAgICAgICAgIG1fYm91bmRhcnkgPSAiLS0i
ICsgbV9ib3VuZGFyeTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1
cm4gYm91bmRhcnlQb3NpdGlvbjsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0t
Z2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9ibGFja2JlcnJ5L011bHRpcGFy
dFJlc3BvbnNlRGVsZWdhdGUuaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvYmxh
Y2tiZXJyeS9NdWx0aXBhcnRSZXNwb25zZURlbGVnYXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQK
aW5kZXggMDAwMDAwMC4uYzI3MjQ5ZgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL25ldHdvcmsvYmxhY2tiZXJyeS9NdWx0aXBhcnRSZXNwb25zZURlbGVnYXRlLmgK
QEAgLTAsMCArMSwxMTEgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMSBSZXNlYXJjaCBJbiBNb3Rp
b24gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIE1vc3Qgb2YgbG9naWMgYW5kIGZ1
bmN0aW9ucyBhcmUgYmFzZSBvbiBDaHJvbWl1bSBicm93c2VyJ3MgaW1wbGVtYW50aW9ucyBpbgor
Ly8gd2Via2l0L2dsdWUvbXVsdGlwYXJ0X3Jlc3BvbnNlX2RlbGVnYXRlLmNjCisKKworLy8gQ29w
eXJpZ2h0IChjKSAyMDA2LTIwMDkgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1z
dHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgor
Ly8KKy8vIEEgZGVsZWdhdGUgY2xhc3Mgb2YgV2ViVVJMTG9hZGVySW1wbCB0aGF0IGhhbmRsZXMg
bXVsdGlwYXJ0L3gtbWl4ZWQtcmVwbGFjZQorLy8gZGF0YS4gV2Ugc3BlY2lhbCBjYXNlIG11bHRp
cGFydC94LW1peGVkLXJlcGxhY2UgYmVjYXVzZSBXZWJDb3JlIGV4cGVjdHMgYQorLy8gc2VwYXJh
dGUgZGlkUmVjZWl2ZVJlc3BvbnNlIGZvciBlYWNoIG5ldyBtZXNzYWdlIHBhcnQuCisvLworLy8g
TW9zdCBvZiB0aGUgbG9naWMgYW5kIGVkZ2UgY2FzZSBoYW5kbGluZyBhcmUgYmFzZWQgb24gdGhl
IE1vemlsbGEncworLy8gaW1wbGVtZW50YXRpb24gaW4gbmV0d2Vyay9zdHJlYW1jb252L2NvbnZl
cnRlcnMvbnNNdWx0aU1peGVkQ29udi5jcHAuCisvLyBUaGlzIHNlZW1zIGxpa2UgYSBkZXJpdmF0
aXZlIHdvcmssIHNvIGhlcmUncyB0aGUgb3JpZ2luYWwgbGljZW5zZToKKworLyogKioqKiogQkVH
SU4gTElDRU5TRSBCTE9DSyAqKioqKgorICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwg
Mi4xCisgKgorICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUg
TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCisgKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5
b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRo
ZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIGh0
dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLworICoKKyAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVu
ZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCisgKiBX
SVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBT
ZWUgdGhlIExpY2Vuc2UKKyAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJp
Z2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCisgKiBMaWNlbnNlLgorICoKKyAqIFRoZSBP
cmlnaW5hbCBDb2RlIGlzIG1vemlsbGEub3JnIGNvZGUuCisgKgorICogVGhlIEluaXRpYWwgRGV2
ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCisgKiBOZXRzY2FwZSBDb21tdW5pY2F0aW9u
cyBDb3Jwb3JhdGlvbi4KKyAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxv
cGVyIGFyZSBDb3B5cmlnaHQgKEMpIDE5OTgKKyAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxs
IFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBDb250cmlidXRvcihzKToKKyAqCisgKiBBbHRlcm5h
dGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0
ZXJtcyBvZgorICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9u
IDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCisgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1
YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKKyAqIGluIHdo
aWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGlj
YWJsZSBpbnN0ZWFkCisgKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNl
IG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQorICogdW5kZXIgdGhlIHRlcm1zIG9m
IGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwor
ICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBN
UEwsIGluZGljYXRlIHlvdXIKKyAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25z
IGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCisgKiBhbmQgb3RoZXIgcHJv
dmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRl
bGV0ZQorICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2
ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgorICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhl
IE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KKyAqCisgKiAqKioqKiBFTkQgTElDRU5TRSBCTE9D
SyAqKioqKiAqLworCisjaWZuZGVmIE11bHRpcGFydFJlc3BvbnNlRGVsZWdhdGVfaAorI2RlZmlu
ZSBNdWx0aXBhcnRSZXNwb25zZURlbGVnYXRlX2gKKworI2luY2x1ZGUgIlJlc291cmNlSGFuZGxl
LmgiCisjaW5jbHVkZSAiUmVzb3VyY2VSZXNwb25zZS5oIgorI2luY2x1ZGUgPHN0cmluZz4KKwor
bmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBNdWx0aXBhcnRSZXNwb25zZURlbGVnYXRlIHsK
K3B1YmxpYzoKKyAgICBNdWx0aXBhcnRSZXNwb25zZURlbGVnYXRlKFBhc3NSZWZQdHI8UmVzb3Vy
Y2VIYW5kbGU+IHJlc291Y2VIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBj
b25zdCBSZXNvdXJjZVJlc3BvbnNlJiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNv
bnN0IHN0ZDo6c3RyaW5nJiBib3VuZGFyeSk7CisgICAgc3RhdGljIGJvb2wgcmVhZE11bHRpcGFy
dEJvdW5kYXJ5KGNvbnN0IHN0ZDo6c3RyaW5nJiBjb250ZW50VHlwZSwgc3RkOjpzdHJpbmcmIG11
bHRpcGFydEJvdW5kYXJ5KTsKKyAgICB2b2lkIG9uUmVjZWl2ZWREYXRhKGNvbnN0IGNoYXIqIGRh
dGEsIGludCBsZW5ndGgsIGludCBlbmNvZGVkRGF0YUxlbmd0aCk7CisgICAgdm9pZCBvbkNvbXBs
ZXRlZFJlcXVlc3QoKTsKKworcHJpdmF0ZToKKworICAgIC8vIFRyaWVzIHRvIHBhcnNlIGh0dHAg
aGVhZGVycyBmcm9tIHRoZSBzdGFydCBvZiBtX2RhdGEuIFJldHVybnMgdHJ1ZSBpZiBpdAorICAg
IC8vIHN1Y2NlZWRzIGFuZCBzZW5kcyBhIGRpZFJlY2VpdmVSZXNwb25zZSB0byBtX2NsaWVudC4g
UmV0dXJucyBmYWxzZSBpZgorICAgIC8vIHRoZSBoZWFkZXIgaXMgaW5jb21wbGV0ZSAoaW4gd2hp
Y2ggY2FzZSB3ZSBqdXN0IHdhaXQgZm9yIG1vcmUgZGF0YSkuCisgICAgYm9vbCBwYXJzZUhlYWRl
cnMoKTsKKworICAgIC8vIEZpbmQgdGhlIG5leHQgYm91bmRhcnkgaW4gbV9kYXRhLiBSZXR1cm5z
IHN0ZDo6c3RyaW5nOjpucG9zIGlmIHRoZXJlJ3Mgbm8KKyAgICAvLyBmdWxsIHRva2VuLgorICAg
IHNpemVfdCBmaW5kQm91bmRhcnkoKTsKKworICAgIC8vIE11bHRpcGFydCBib3VuZGFyeSB0b2tl
bi4KKyAgICBzdGQ6OnN0cmluZyBtX2JvdW5kYXJ5OworCisgICAgLy8gQSB0ZW1wb3JhcnkgYnVm
ZmVyIHRvIGhvbGQgZGF0YSBiZXR3ZWVuIHJlYWRzIGZvciBtdWx0aXBhcnQgZGF0YSB0aGF0Cisg
ICAgLy8gZ2V0cyBzcGxpdCBpbiB0aGUgbWlkZGxlIG9mIGEgaGVhZGVyLgorICAgIHN0ZDo6c3Ry
aW5nIG1fZGF0YTsKKworICAgIGludCBtX2VuY29kZWREYXRhTGVuZ3RoOworCisgICAgLy8gVHJ1
ZSB1bnRpbCB3ZSdyZSByZWNlaXZlZCB0aGUgZmlyc3QgZGF0YS4KKyAgICBib29sIG1fZmlyc3RS
ZWNlaXZlZERhdGE7CisKKyAgICAvLyBUaGUgb3JpZ2luYWwgcmVzb3VyY2UgcmVzcG9uc2UgZm9y
IHRoaXMgcmVxdWVzdC4gV2UgdXNlIHRoaXMgYXMgYQorICAgIC8vIHN0YXJ0aW5nIHBvaW50IGZv
ciBlYWNoIHBhcnRzIHJlc3BvbnNlLgorICAgIGNvbnN0IFJlc291cmNlUmVzcG9uc2UmIG1fb3Jp
Z2luYWxSZXNwb25zZTsKKworICAgIC8vIFRydWUgaWYgd2UncmUgdHJ1bmNhdGVkIGluIHRoZSBt
aWRkbGUgb2YgYSBoZWFkZXIuCisgICAgYm9vbCBtX3Byb2Nlc3NpbmdIZWFkZXJzOworCisgICAg
UmVmUHRyPFJlc291cmNlSGFuZGxlPiBtX3Jlc291cmNlSGFuZGxlOworCisgICAgLy8gVHJ1ZSB3
aGVuIHdlJ3JlIGRvbmUgc2VuZGluZyBpbmZvcm1hdGlvbi4gQXQgdGhhdCBwb2ludCwgd2Ugc3Rv
cAorICAgIC8vIHByb2Nlc3NpbmcgQWRkRGF0YSByZXF1ZXN0cy4KKyAgICBib29sIG1fc3RvcFNl
bmRpbmc7Cit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBNdWx0aXBh
cnRSZXNwb25zZURlbGVnYXRlX2gKLS0gCjEuNy41LjQKCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="0"
              isprivate="0"
          >
            <attachid>118932</attachid>
            <date>2011-12-12 18:56:35 -0800</date>
            <delta_ts>2011-12-13 19:04:33 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-73533-20111213105630.patch</filename>
            <type>text/plain</type>
            <size>30569</size>
            <attacher name="Chris.Guan">logingx</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTAyNjQ5CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggZDIxMjBhN2VlMWEzZWRk
ZTczMjJlZjk5ZWEzOWI3YzE4NGVmZDU0Mi4uZDczYWI3ZTc2NTQyYjgyN2E0NTQ2N2YzMmM1Mjc1
MTVjZmFiYzUzZCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDMwIEBACisyMDExLTEyLTEyICBDaHJp
cyBHdWFuICA8Y2hyaXMuZ3VhbkB0b3JjaG1vYmlsZS5jb20uY24+CisKKyAgICAgICAgVXBzdHJl
YW0gdGhlIEJsYWNrYmVycnkgcG9ydGluZyBvZiBtdWx0aXBhcnQgZGVsZWdhdGUKKyAgICAgICAg
aHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTczNTMzCisKKyAgICAgICAg
UmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgSW5pdGlhbCB1cHN0cmVhbSwg
bm8gbmV3IHRlc3RzLgorCisgICAgICAgICogcGxhdGZvcm0vbmV0d29yay9ibGFja2JlcnJ5L011
bHRpcGFydFJlc3BvbnNlRGVsZWdhdGUuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OmRv
Q2hhcmFjdGVyc01hdGNoQ2FzZUluc2Vuc2l0aXZlKToKKyAgICAgICAgKFdlYkNvcmU6OnN0cmlu
Z1RvTG93ZXJBU0NJSSk6CisgICAgICAgIChXZWJDb3JlOjp0cmltU3RyaW5nKToKKyAgICAgICAg
KFdlYkNvcmU6OmdldFNwZWNpZmljSGVhZGVyKToKKyAgICAgICAgKFdlYkNvcmU6Omxvd2VyQ2Fz
ZUVxdWFsc0FTQ0lJKToKKyAgICAgICAgKFdlYkNvcmU6OmZpbmRTdHJpbmdFbmQpOgorICAgICAg
ICAoV2ViQ29yZTo6ZmluZERlbGltaXRlcik6CisgICAgICAgIChXZWJDb3JlOjpwYXJzZUNvbnRl
bnRUeXBlKToKKyAgICAgICAgKFdlYkNvcmU6OnB1c2hPdmVyTGluZSk6CisgICAgICAgIChXZWJD
b3JlOjpNdWx0aXBhcnRSZXNwb25zZURlbGVnYXRlOjpNdWx0aXBhcnRSZXNwb25zZURlbGVnYXRl
KToKKyAgICAgICAgKFdlYkNvcmU6Ok11bHRpcGFydFJlc3BvbnNlRGVsZWdhdGU6OnJlYWRNdWx0
aXBhcnRCb3VuZGFyeSk6CisgICAgICAgIChXZWJDb3JlOjpNdWx0aXBhcnRSZXNwb25zZURlbGVn
YXRlOjpvblJlY2VpdmVkRGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpNdWx0aXBhcnRSZXNwb25z
ZURlbGVnYXRlOjpvbkNvbXBsZXRlZFJlcXVlc3QpOgorICAgICAgICAoV2ViQ29yZTo6TXVsdGlw
YXJ0UmVzcG9uc2VEZWxlZ2F0ZTo6cGFyc2VIZWFkZXJzKToKKyAgICAgICAgKFdlYkNvcmU6Ok11
bHRpcGFydFJlc3BvbnNlRGVsZWdhdGU6OmZpbmRCb3VuZGFyeSk6CisgICAgICAgICogcGxhdGZv
cm0vbmV0d29yay9ibGFja2JlcnJ5L011bHRpcGFydFJlc3BvbnNlRGVsZWdhdGUuaDogQWRkZWQu
CisKIDIwMTEtMTItMTIgIEFkcmllbm5lIFdhbGtlciAgPGVubmVAZ29vZ2xlLmNvbT4KIAogICAg
ICAgICBpZnJhbWUgZmFpbHMgdG8gc2Nyb2xsIGluIGNvbXBvc2l0ZWQgcGFnZQpkaWZmIC0tZ2l0
IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9ibGFja2JlcnJ5L011bHRpcGFydFJl
c3BvbnNlRGVsZWdhdGUuY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9ibGFj
a2JlcnJ5L011bHRpcGFydFJlc3BvbnNlRGVsZWdhdGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0
CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjVhZmVmMmM3
Y2Y2NTQwMjFiMWIwNjE5ODA1ZjQ1ZTJlNzFiYjQ5NzMKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvTXVsdGlwYXJ0UmVzcG9uc2VE
ZWxlZ2F0ZS5jcHAKQEAgLTAsMCArMSw1MzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEg
UmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5
cmlnaHQgKGMpIDIwMDYtMjAwOCBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNl
cnZlZAorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICogCisg
KiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4g
dGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUg
SW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRv
IGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdh
cmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiAKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05U
UklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisg
KiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1Ig
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8K
KworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIk11bHRpcGFydFJlc3BvbnNlRGVsZWdh
dGUuaCIKKworI2luY2x1ZGUgIlJlc291cmNlSGFuZGxlQ2xpZW50LmgiCisjaW5jbHVkZSA8d3Rm
L0FTQ0lJQ1R5cGUuaD4KKyNpbmNsdWRlIDx3dGYvU3RkTGliRXh0cmFzLmg+CisKK25hbWVzcGFj
ZSBXZWJDb3JlIHsKKworc3RhdGljIGJvb2wgZG9DaGFyYWN0ZXJzTWF0Y2hDYXNlSW5zZW5zaXRp
dmUoY2hhciB4LCBjaGFyIHkpCit7CisgICAgcmV0dXJuIHRvQVNDSUlMb3dlcih4KSA9PSB0b0FT
Q0lJTG93ZXIoeSk7Cit9CisKK3N0YXRpYyB2b2lkIHN0cmluZ1RvTG93ZXJBU0NJSShzdGQ6OnN0
cmluZyYgcykKK3sKKyAgICBmb3IgKHN0ZDo6c3RyaW5nOjppdGVyYXRvciBpID0gcy5iZWdpbigp
OyBpICE9IHMuZW5kKCk7ICsraSkKKyAgICAgICAgKmkgPSB0b0FTQ0lJTG93ZXIoKmkpOworfQor
CitlbnVtIHsKKyAgICBUcmltTm9uZSAgICAgPSAwLAorICAgIFRyaW1MZWFkaW5nICA9IDEgPDwg
MCwKKyAgICBUcmltVHJhaWxpbmcgPSAxIDw8IDEsCit9OworCit0eXBlZGVmIHVuc2lnbmVkIFRy
aW1Qb3NpdGlvbjsKKworc3RhdGljIFRyaW1Qb3NpdGlvbiB0cmltU3RyaW5nKGNvbnN0IHN0ZDo6
c3RyaW5nJiBpbnB1dCwgY29uc3Qgc3RkOjpzdHJpbmc6OnZhbHVlX3R5cGUgdHJpbUNoYXJzW10s
IFRyaW1Qb3NpdGlvbiBwb3NpdGlvbiwgc3RkOjpzdHJpbmcmIG91dHB1dCkKK3sKKyAgICAvLyBG
aW5kIHRoZSBlZGdlcyBvZiBsZWFkaW5nL3RyYWlsaW5nIHdoaXRlc3BhY2UgYXMgZGVzaXJlZC4K
KyAgICBjb25zdCBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGxhc3RDaGFyID0gaW5wdXQubGVuZ3Ro
KCkgLSAxOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgZmlyc3RHb29kQ2hhciA9
IChwb3NpdGlvbiAmIFRyaW1MZWFkaW5nKSA/IGlucHV0LmZpbmRfZmlyc3Rfbm90X29mKHRyaW1D
aGFycykgOiAwOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgbGFzdEdvb2RDaGFy
ID0gKHBvc2l0aW9uICYgVHJpbVRyYWlsaW5nKSA/IGlucHV0LmZpbmRfbGFzdF9ub3Rfb2YodHJp
bUNoYXJzKSA6IGxhc3RDaGFyOworCisgICAgLy8gV2hlbiB0aGUgc3RyaW5nIHdhcyBhbGwgd2hp
dGVzcGFjZSwgcmVwb3J0IHRoYXQgd2Ugc3RyaXBwZWQgb2ZmIHdoaXRlc3BhY2UKKyAgICAvLyBm
cm9tIHdoaWNoZXZlciBwb3NpdGlvbiB0aGUgY2FsbGVyIHdhcyBpbnRlcmVzdGVkIGluLiBGb3Ig
ZW1wdHkgaW5wdXQsIHdlCisgICAgLy8gc3RyaXBwZWQgbm8gd2hpdGVzcGFjZSwgYnV0IHdlIHN0
aWxsIG5lZWQgdG8gY2xlYXIgfG91dHB1dHwuCisgICAgaWYgKGlucHV0LmVtcHR5KCkgfHwgZmly
c3RHb29kQ2hhciA9PSBzdGQ6OnN0cmluZzo6bnBvcyB8fCBsYXN0R29vZENoYXIgPT0gc3RkOjpz
dHJpbmc6Om5wb3MpIHsKKyAgICAgICAgYm9vbCBpbnB1dFdhc0VtcHR5ID0gaW5wdXQuZW1wdHko
KTsKKyAgICAgICAgb3V0cHV0LmNsZWFyKCk7CisgICAgICAgIHJldHVybiBpbnB1dFdhc0VtcHR5
ID8gVHJpbU5vbmUgOiBwb3NpdGlvbjsKKyAgICB9CisKKyAgICBvdXRwdXQgPSBpbnB1dC5zdWJz
dHIoZmlyc3RHb29kQ2hhciwgbGFzdEdvb2RDaGFyIC0gZmlyc3RHb29kQ2hhciArIDEpOworCisg
ICAgcmV0dXJuIHN0YXRpY19jYXN0PFRyaW1Qb3NpdGlvbj4oCisgICAgICAgICghZmlyc3RHb29k
Q2hhciA/IFRyaW1Ob25lIDogVHJpbUxlYWRpbmcpIHwgKGxhc3RHb29kQ2hhciA9PSBsYXN0Q2hh
ciA/IFRyaW1Ob25lIDogVHJpbVRyYWlsaW5nKSk7Cit9CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBn
ZXRTcGVjaWZpY0hlYWRlcihjb25zdCBzdGQ6OnN0cmluZyYgaGVhZGVycywgY29uc3Qgc3RkOjpz
dHJpbmcmIG5hbWUpCit7CisgICAgLy8gV2Ugd2FudCB0byBncmFiIHRoZSBWYWx1ZSBmcm9tIHRo
ZSAiS2V5OiBWYWx1ZSIgcGFpcnMgaW4gdGhlIGhlYWRlcnMsCisgICAgLy8gd2hpY2ggc2hvdWxk
IGxvb2sgbGlrZSB0aGlzIChubyBsZWFkaW5nIHNwYWNlcywgXG4tc2VwYXJhdGVkKSAod2UgZm9y
bWF0CisgICAgLy8gdGhlbSB0aGlzIHdheSBpbiB1cmxfcmVxdWVzdF9pbmV0LmNjKToKKyAgICAv
LyAgICBIVFRQLzEuMSAyMDAgT0tcbgorICAgIC8vICAgIEVUYWc6ICI2ZDBiOC05NDctMjRmMzVl
YzAiXG4KKyAgICAvLyAgICBDb250ZW50LUxlbmd0aDogMjM3NVxuCisgICAgLy8gICAgQ29udGVu
dC1UeXBlOiB0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLThcbgorICAgIC8vICAgIExhc3QtTW9kaWZp
ZWQ6IFN1biwgMDMgU2VwIDIwMDYgMDQ6MzQ6NDMgR01UXG4KKyAgICBpZiAoaGVhZGVycy5lbXB0
eSgpKQorICAgICAgICByZXR1cm4gc3RkOjpzdHJpbmcoKTsKKworICAgIHN0ZDo6c3RyaW5nIG1h
dGNoKCdcbicgKyBuYW1lICsgJzonKTsKKworICAgIHN0ZDo6c3RyaW5nOjpjb25zdF9pdGVyYXRv
ciBiZWdpbiA9CisgICAgICAgIHN0ZDo6c2VhcmNoKGhlYWRlcnMuYmVnaW4oKSwgaGVhZGVycy5l
bmQoKSwgbWF0Y2guYmVnaW4oKSwgbWF0Y2guZW5kKCksIGRvQ2hhcmFjdGVyc01hdGNoQ2FzZUlu
c2Vuc2l0aXZlKTsKKworICAgIGlmIChiZWdpbiA9PSBoZWFkZXJzLmVuZCgpKQorICAgICAgICBy
ZXR1cm4gc3RkOjpzdHJpbmcoKTsKKworICAgIGJlZ2luICs9IG1hdGNoLmxlbmd0aCgpOworICAg
IHN0ZDo6c3RyaW5nIHJldHVyblN0cmluZzsKKyAgICBzdGF0aWMgY29uc3QgY2hhciogd2hpdGVz
cGFjZUFTQ0lJID0gIlx0XG5cdlxmXHIgIjsKKyAgICB0cmltU3RyaW5nKHN0ZDo6c3RyaW5nKGJl
Z2luLCBmaW5kKGJlZ2luLCBoZWFkZXJzLmVuZCgpLCAnXG4nKSksIHdoaXRlc3BhY2VBU0NJSSwg
VHJpbUxlYWRpbmcgfCBUcmltVHJhaWxpbmcsIHJldHVyblN0cmluZyk7CisgICAgcmV0dXJuIHJl
dHVyblN0cmluZzsKK30KKworc3RhdGljIGJvb2wgbG93ZXJDYXNlRXF1YWxzQVNDSUkoc3RkOjpz
dHJpbmc6OmNvbnN0X2l0ZXJhdG9yIGJlZ2luLCBzdGQ6OnN0cmluZzo6Y29uc3RfaXRlcmF0b3Ig
ZW5kLCBjb25zdCBjaGFyKiBzKQoreworICAgIGZvciAoc3RkOjpzdHJpbmc6OmNvbnN0X2l0ZXJh
dG9yIGl0ID0gYmVnaW47IGl0ICE9IGVuZDsgKytpdCwgKytzKSB7CisgICAgICAgIGlmICghKnMg
fHwgdG9BU0NJSUxvd2VyKCppdCkgIT0gKnMpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgfQorICAgIHJldHVybiAhKnM7Cit9CisKK3N0YXRpYyBzaXplX3QgZmluZFN0cmluZ0VuZChj
b25zdCBzdGQ6OnN0cmluZyYgbGluZSwgc2l6ZV90IHN0YXJ0LCBjaGFyIGRlbGltaXRlcikKK3sK
KyAgICBjb25zdCBjaGFyIHNldFtdID0geyBkZWxpbWl0ZXIsICdcXCcsICdcMCcgfTsKKyAgICBm
b3IgKDs7KSB7CisgICAgICAgIC8vIFN0YXJ0IHBvaW50cyB0byBlaXRoZXIgdGhlIHN0YXJ0IHF1
b3RlIG9yIHRoZSBsYXN0CisgICAgICAgIC8vIGVzY2FwZWQgY2hhciAodGhlIGNoYXIgZm9sbG93
aW5nIGEgJ1xcJykuCisKKyAgICAgICAgc2l6ZV90IGVuZCA9IGxpbmUuZmluZF9maXJzdF9vZihz
ZXQsIHN0YXJ0ICsgMSk7CisgICAgICAgIGlmIChlbmQgPT0gc3RkOjpzdHJpbmc6Om5wb3MpCisg
ICAgICAgICAgICByZXR1cm4gbGluZS5sZW5ndGgoKTsKKworICAgICAgICBpZiAobGluZVtlbmRd
ID09ICdcXCcpIHsKKyAgICAgICAgICAgIC8vIEhpdCBhIGJhY2tzbGFzaC1lc2NhcGVkIGNoYXIu
IE5lZWQgdG8gc2tpcCBvdmVyIGl0LgorICAgICAgICAgICAgc3RhcnQgPSBlbmQgKyAxOworICAg
ICAgICAgICAgaWYgKHN0YXJ0ID09IGxpbmUubGVuZ3RoKCkpCisgICAgICAgICAgICAgICAgcmV0
dXJuIHN0YXJ0OworCisgICAgICAgICAgICAvLyBHbyBiYWNrIHRvIGxvb2tpbmcgZm9yIHRoZSBu
ZXh0IGVzY2FwZSBvciB0aGUgc3RyaW5nIGVuZC4KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAg
ICAgICB9CisKKyAgICAgICAgcmV0dXJuIGVuZDsKKyAgICB9CisKKyAgICAvLyBzaG91bGQgbm90
IHJlYWNoIGhlcmUuCisgICAgcmV0dXJuIGxpbmUubGVuZ3RoKCk7Cit9CisKK3N0YXRpYyBzaXpl
X3QgZmluZERlbGltaXRlcihjb25zdCBzdGQ6OnN0cmluZyYgbGluZSwgc2l6ZV90IHNlYXJjaFN0
YXJ0LCBjaGFyIGRlbGltaXRlcikKK3sKKyAgICBkbyB7CisgICAgICAgIC8vIHNlYXJjaFN0YXJ0
IHBvaW50cyB0byB0aGUgc3BvdCBmcm9tIHdoaWNoIHdlIHNob3VsZCBzdGFydCBsb29raW5nCisg
ICAgICAgIC8vIGZvciB0aGUgZGVsaW1pdGVyLgorICAgICAgICBjb25zdCBjaGFyIGRlbGltaXRl
clNldFtdID0geyBkZWxpbWl0ZXIsICciJywgJ1wnJywgJ1wwJyB9OworICAgICAgICBzaXplX3Qg
Y3VycmVudERlbGltaXRlclBvc2l0aW9uID0gbGluZS5maW5kX2ZpcnN0X29mKGRlbGltaXRlclNl
dCwgc2VhcmNoU3RhcnQpOworICAgICAgICBpZiAoY3VycmVudERlbGltaXRlclBvc2l0aW9uID09
IHN0ZDo6c3RyaW5nOjpucG9zKQorICAgICAgICAgICAgcmV0dXJuIGxpbmUubGVuZ3RoKCk7CisK
KyAgICAgICAgY2hhciBjdXJyZW50Q2hhciA9IGxpbmVbY3VycmVudERlbGltaXRlclBvc2l0aW9u
XTsKKyAgICAgICAgaWYgKGN1cnJlbnRDaGFyID09IGRlbGltaXRlcikgeworICAgICAgICAgICAg
Ly8gRm91bmQgZGVsaW1pdGVyLgorICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnREZWxpbWl0ZXJQ
b3NpdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFdlIGhpdCB0aGUgc3RhcnQgb2YgYSBx
dW90ZWQgc3RyaW5nLiBMb29rIGZvciBpdHMgZW5kLgorICAgICAgICBzZWFyY2hTdGFydCA9IGZp
bmRTdHJpbmdFbmQobGluZSwgY3VycmVudERlbGltaXRlclBvc2l0aW9uLCBjdXJyZW50Q2hhcik7
CisgICAgICAgIGlmIChzZWFyY2hTdGFydCA9PSBsaW5lLmxlbmd0aCgpKQorICAgICAgICAgICAg
cmV0dXJuIHNlYXJjaFN0YXJ0OworCisgICAgICAgICsrc2VhcmNoU3RhcnQ7CisKKyAgICAgICAg
Ly8gc2VhcmNoU3RhcnQgbm93IHBvaW50cyB0byB0aGUgZmlyc3QgY2hhciBhZnRlciB0aGUgZW5k
IG9mIHRoZQorICAgICAgICAvLyBzdHJpbmcsIHNvIGp1c3QgZ28gYmFjayB0byB0aGUgdG9wIG9m
IHRoZSBsb29wIGFuZCBsb29rIGZvcgorICAgICAgICAvLyB8ZGVsaW1pdGVyfCBhZ2Fpbi4KKyAg
ICB9IHdoaWxlICh0cnVlKTsKKworICAgIHJldHVybiBsaW5lLmxlbmd0aCgpOworfQorCitzdGF0
aWMgdm9pZCBwYXJzZUNvbnRlbnRUeXBlKGNvbnN0IHN0ZDo6c3RyaW5nJiBjb250ZW50VHlwZSwg
c3RkOjpzdHJpbmcmIG1pbWVUeXBlLCBzdGQ6OnN0cmluZyYgY2hhcnNldCwgYm9vbCYgaGFkQ2hh
cnNldCkKK3sKKyAgICAvLyBUcmltIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UgZnJv
bSB0eXBlLiBXZSBpbmNsdWRlICcoJyBpbgorICAgIC8vIHRoZSB0cmFpbGluZyB0cmltIHNldCB0
byBjYXRjaCBtZWRpYS10eXBlIGNvbW1lbnRzLCB3aGljaCBhcmUgbm90IGF0IGFsbAorICAgIC8v
IHN0YW5kYXJkLCBidXQgbWF5IG9jY3VyIGluIHJhcmUgY2FzZXMuCisgICAgc2l6ZV90IHR5cGVW
YWx1ZSA9IGNvbnRlbnRUeXBlLmZpbmRfZmlyc3Rfbm90X29mKCIgXHQiKTsKKyAgICB0eXBlVmFs
dWUgPSBzdGQ6Om1pbih0eXBlVmFsdWUsIGNvbnRlbnRUeXBlLmxlbmd0aCgpKTsKKyAgICBzaXpl
X3QgdHlwZUVuZCA9IGNvbnRlbnRUeXBlLmZpbmRfZmlyc3Rfb2YoIiBcdCIiOygiLCB0eXBlVmFs
dWUpOworICAgIGlmIChzdGQ6OnN0cmluZzo6bnBvcyA9PSB0eXBlRW5kKQorICAgICAgICB0eXBl
RW5kID0gY29udGVudFR5cGUubGVuZ3RoKCk7CisKKyAgICBzaXplX3QgY2hhcnNldFZhbHVlID0g
MDsKKyAgICBzaXplX3QgY2hhcnNldEVuZCA9IDA7CisKKyAgICAvLyBJdGVyYXRlIG92ZXIgcGFy
YW1ldGVycworICAgIGJvb2wgdHlwZUhhc0NoYXJzZXQgPSBmYWxzZTsKKyAgICBzaXplX3QgcGFy
YW1ldGVyU3RhcnQgPSBjb250ZW50VHlwZS5maW5kX2ZpcnN0X29mKCc7JywgdHlwZUVuZCk7Cisg
ICAgaWYgKHBhcmFtZXRlclN0YXJ0ICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIC8v
IFdlIGhhdmUgcGFyYW1ldGVycy4gSXRlcmF0ZSBvdmVyIHRoZW0uCisgICAgICAgIHNpemVfdCBj
dXJyZW50UGFyYW1TdGFydCA9IHBhcmFtZXRlclN0YXJ0ICsgMTsKKyAgICAgICAgZG8geworICAg
ICAgICAgICAgc2l6ZV90IGN1cnJlbnRQYXJhbWV0ZXJFbmQgPSBmaW5kRGVsaW1pdGVyKGNvbnRl
bnRUeXBlLCBjdXJyZW50UGFyYW1TdGFydCwgJzsnKTsKKworICAgICAgICAgICAgc2l6ZV90IHBh
cmFtZXRlck5hbWVTdGFydCA9IGNvbnRlbnRUeXBlLmZpbmRfZmlyc3Rfbm90X29mKCIgXHQiLCBj
dXJyZW50UGFyYW1TdGFydCk7CisgICAgICAgICAgICBwYXJhbWV0ZXJOYW1lU3RhcnQgPSBzdGQ6
Om1pbihwYXJhbWV0ZXJOYW1lU3RhcnQsIGN1cnJlbnRQYXJhbWV0ZXJFbmQpOworCisgICAgICAg
ICAgICBzdGF0aWMgY29uc3QgY2hhciBjaGFyc2V0U3RyaW5nW10gPSAiY2hhcnNldD0iOworICAg
ICAgICAgICAgc2l6ZV90IGNoYXJzZXRFbmRPZmZzZXQgPSBzdGQ6Om1pbihwYXJhbWV0ZXJOYW1l
U3RhcnQgKyBzaXplb2YoY2hhcnNldFN0cmluZykgLSAxLCBjdXJyZW50UGFyYW1ldGVyRW5kKTsK
KyAgICAgICAgICAgIGlmIChsb3dlckNhc2VFcXVhbHNBU0NJSShjb250ZW50VHlwZS5iZWdpbigp
ICsgcGFyYW1ldGVyTmFtZVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGNvbnRlbnRUeXBlLmJlZ2luKCkgKyBjaGFyc2V0RW5kT2Zmc2V0LCBjaGFyc2V0U3RyaW5n
KSkgeworICAgICAgICAgICAgICAgIGNoYXJzZXRWYWx1ZSA9IHBhcmFtZXRlck5hbWVTdGFydCAr
IHNpemVvZihjaGFyc2V0U3RyaW5nKSAtIDE7CisgICAgICAgICAgICAgICAgY2hhcnNldEVuZCA9
IGN1cnJlbnRQYXJhbWV0ZXJFbmQ7CisgICAgICAgICAgICAgICAgdHlwZUhhc0NoYXJzZXQgPSB0
cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjdXJyZW50UGFyYW1TdGFydCA9IGN1
cnJlbnRQYXJhbWV0ZXJFbmQgKyAxOworICAgICAgICB9IHdoaWxlIChjdXJyZW50UGFyYW1TdGFy
dCA8IGNvbnRlbnRUeXBlLmxlbmd0aCgpKTsKKyAgICB9CisKKyAgICBpZiAodHlwZUhhc0NoYXJz
ZXQpIHsKKyAgICAgICAgLy8gVHJpbSBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlIGZy
b20gY2hhcnNldFZhbHVlLiBXZSBpbmNsdWRlCisgICAgICAgIC8vICcoJyBpbiB0aGUgdHJhaWxp
bmcgdHJpbSBzZXQgdG8gY2F0Y2ggbWVkaWEtdHlwZSBjb21tZW50cywgd2hpY2ggYXJlCisgICAg
ICAgIC8vIG5vdCBhdCBhbGwgc3RhbmRhcmQsIGJ1dCBtYXkgb2NjdXIgaW4gcmFyZSBjYXNlcy4K
KyAgICAgICAgY2hhcnNldFZhbHVlID0gY29udGVudFR5cGUuZmluZF9maXJzdF9ub3Rfb2YoIiBc
dCIsIGNoYXJzZXRWYWx1ZSk7CisgICAgICAgIGNoYXJzZXRWYWx1ZSA9IHN0ZDo6bWluKGNoYXJz
ZXRWYWx1ZSwgY2hhcnNldEVuZCk7CisgICAgICAgIGNoYXIgZmlyc3RDaGFyID0gY29udGVudFR5
cGVbY2hhcnNldFZhbHVlXTsKKyAgICAgICAgaWYgKGZpcnN0Q2hhciA9PSAnIicgfHwgZmlyc3RD
aGFyID09ICdcJycpIHsKKyAgICAgICAgICAgIGNoYXJzZXRFbmQgPSBmaW5kU3RyaW5nRW5kKGNv
bnRlbnRUeXBlLCBjaGFyc2V0VmFsdWUsIGZpcnN0Q2hhcik7CisgICAgICAgICAgICArK2NoYXJz
ZXRWYWx1ZTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBjaGFyc2V0RW5kID0gc3RkOjpt
aW4oY29udGVudFR5cGUuZmluZF9maXJzdF9vZigiIFx0IiAiOygiLCBjaGFyc2V0VmFsdWUpLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzZXRFbmQpOworICAgIH0KKwor
ICAgIC8vIElmIHRoZSBzZXJ2ZXIgc2VudCAiKi8qIiwgaXQgaXMgbWVhbmluZ2xlc3MsIHNvIGRv
IG5vdCBzdG9yZSBpdC4KKyAgICAvLyBhbHNvLCBpZiB0eXBlVmFsdWUgaXMgdGhlIHNhbWUgYXMg
bWltZVR5cGUsIHRoZW4ganVzdCB1cGRhdGUgdGhlCisgICAgLy8gY2hhcnNldC4gaG93ZXZlciwg
aWYgY2hhcnNldCBpcyBlbXB0eSBhbmQgbWltZVR5cGUgaGFzbid0CisgICAgLy8gY2hhbmdlZCwg
dGhlbiBkb24ndCB3aXBlLW91dCBhbiBleGlzdGluZyBjaGFyc2V0LiBXZQorICAgIC8vIGFsc28g
d2FudCB0byByZWplY3QgYSBtaW1lLXR5cGUgaWYgaXQgZG9lcyBub3QgaW5jbHVkZSBhIHNsYXNo
LgorICAgIC8vIHNvbWUgc2VydmVycyBnaXZlIGp1bmsgYWZ0ZXIgdGhlIGNoYXJzZXQgcGFyYW1l
dGVyLCB3aGljaCBtYXkKKyAgICAvLyBpbmNsdWRlIGEgY29tbWEsIHNvIHRoaXMgY2hlY2sgbWFr
ZXMgdXMgYSBiaXQgbW9yZSB0b2xlcmFudC4KKyAgICBpZiAoY29udGVudFR5cGUubGVuZ3RoKCkK
KyAgICAgICAgJiYgY29udGVudFR5cGUgIT0gIiovKiIKKyAgICAgICAgJiYgY29udGVudFR5cGUu
ZmluZF9maXJzdF9vZignLycpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIC8vIENv
bW1vbiBjYXNlIGhlcmUgaXMgdGhhdCBtaW1lVHlwZSBpcyBlbXB0eQorICAgICAgICBib29sIGVx
dWFsID0gIW1pbWVUeXBlLmVtcHR5KCkKKyAgICAgICAgICAgICAgICAgICAgICYmIGxvd2VyQ2Fz
ZUVxdWFsc0FTQ0lJKGNvbnRlbnRUeXBlLmJlZ2luKCkgKyB0eXBlVmFsdWUsCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VHlwZS5iZWdpbigpICsg
dHlwZUVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1p
bWVUeXBlLmRhdGEoKSk7CisgICAgICAgIGlmICghZXF1YWwpIHsKKyAgICAgICAgICAgIG1pbWVU
eXBlLmFzc2lnbihjb250ZW50VHlwZS5iZWdpbigpICsgdHlwZVZhbHVlLCBjb250ZW50VHlwZS5i
ZWdpbigpICsgdHlwZUVuZCk7CisgICAgICAgICAgICBzdHJpbmdUb0xvd2VyQVNDSUkobWltZVR5
cGUpOworICAgICAgICB9CisgICAgICAgIGlmICghZXF1YWwgfHwgdHlwZUhhc0NoYXJzZXQpIHsK
KyAgICAgICAgICAgIGhhZENoYXJzZXQgPSB0cnVlOworICAgICAgICAgICAgY2hhcnNldC5hc3Np
Z24oY29udGVudFR5cGUuYmVnaW4oKSArIGNoYXJzZXRWYWx1ZSwgY29udGVudFR5cGUuYmVnaW4o
KSArIGNoYXJzZXRFbmQpOworICAgICAgICAgICAgc3RyaW5nVG9Mb3dlckFTQ0lJKGNoYXJzZXQp
OworICAgICAgICB9CisgICAgfQorfQorCisvLyBDaGVja3MgdG8gc2VlIGlmIGRhdGFbcG9zaXRp
b25dIGNoYXJhY3RlciBpcyBhIGxpbmUgYnJlYWs7IGhhbmRsZXMgY3JsZiwgbGZsZiwKKy8vIGxm
LCBvciBjci4gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gc2tpcCBvdmVyICgw
LCAxIG9yIDIpLgorc3RhdGljIGludCBwdXNoT3ZlckxpbmUoY29uc3Qgc3RkOjpzdHJpbmcmIGRh
dGEsIHNpemVfdCBwb3NpdGlvbikKK3sKKyAgICBpbnQgb2Zmc2V0ID0gMDsKKyAgICBpZiAocG9z
aXRpb24gPCBkYXRhLmxlbmd0aCgpICYmIChkYXRhW3Bvc2l0aW9uXSA9PSAnXHInIHx8IGRhdGFb
cG9zaXRpb25dID09ICdcbicpKSB7CisgICAgICAgICsrb2Zmc2V0OworICAgICAgICBpZiAocG9z
aXRpb24gKyAxIDwgZGF0YS5sZW5ndGgoKSAmJiBkYXRhW3Bvc2l0aW9uICsgMV0gPT0gJ1xuJykK
KyAgICAgICAgICAgICsrb2Zmc2V0OworICAgIH0KKyAgICByZXR1cm4gb2Zmc2V0OworfQorCitN
dWx0aXBhcnRSZXNwb25zZURlbGVnYXRlOjpNdWx0aXBhcnRSZXNwb25zZURlbGVnYXRlKFBhc3NS
ZWZQdHI8UmVzb3VyY2VIYW5kbGU+IHJlc291Y2VIYW5kbGUsCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlc291cmNlUmVzcG9uc2Um
IHJlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYm91bmRhcnkpCisgICAgOiBtX2JvdW5kYXJ5KGJv
dW5kYXJ5KQorICAgICwgbV9lbmNvZGVkRGF0YUxlbmd0aCgwKQorICAgICwgbV9maXJzdFJlY2Vp
dmVkRGF0YSh0cnVlKQorICAgICwgbV9vcmlnaW5hbFJlc3BvbnNlKHJlc3BvbnNlKQorICAgICwg
bV9wcm9jZXNzaW5nSGVhZGVycyhmYWxzZSkKKyAgICAsIG1fcmVzb3VyY2VIYW5kbGUocmVzb3Vj
ZUhhbmRsZSkKKyAgICAsIG1fc3RvcFNlbmRpbmcoZmFsc2UpCit7CisgICAgc3RkOjpzdHJpbmcg
c2VhcmNoID0gIi0tIjsKKyAgICBpZiAobV9ib3VuZGFyeS5jb21wYXJlKDAsIHNlYXJjaC5sZW5n
dGgoKSwgc2VhcmNoKSkKKyAgICAgICAgbV9ib3VuZGFyeSA9IHNlYXJjaCArIG1fYm91bmRhcnk7
Cit9CisKK2Jvb2wgTXVsdGlwYXJ0UmVzcG9uc2VEZWxlZ2F0ZTo6cmVhZE11bHRpcGFydEJvdW5k
YXJ5KGNvbnN0IHN0ZDo6c3RyaW5nJiBjb250ZW50VHlwZSwgc3RkOjpzdHJpbmcmIG11bHRpcGFy
dEJvdW5kYXJ5KQoreworICAgIHNpemVfdCBib3VuZGFyeVN0YXJ0T2Zmc2V0ID0gY29udGVudFR5
cGUuZmluZCgiYm91bmRhcnk9Iik7CisgICAgaWYgKGJvdW5kYXJ5U3RhcnRPZmZzZXQgPT0gc3Rk
OjpzdHJpbmc6Om5wb3MpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGJvdW5kYXJ5U3Rh
cnRPZmZzZXQgKz0gc3RybGVuKCJib3VuZGFyeT0iKTsKKyAgICBzaXplX3QgYm91bmRhcnlFbmRP
ZmZzZXQgPSBjb250ZW50VHlwZS5maW5kKCc7JywgYm91bmRhcnlTdGFydE9mZnNldCk7CisKKyAg
ICBpZiAoYm91bmRhcnlFbmRPZmZzZXQgPT0gc3RkOjpzdHJpbmc6Om5wb3MpCisgICAgICAgIGJv
dW5kYXJ5RW5kT2Zmc2V0ID0gY29udGVudFR5cGUubGVuZ3RoKCk7CisKKyAgICBzaXplX3QgYm91
bmRhcnlMZW5ndGggPSBib3VuZGFyeUVuZE9mZnNldCAtIGJvdW5kYXJ5U3RhcnRPZmZzZXQ7Cisg
ICAgbXVsdGlwYXJ0Qm91bmRhcnkgPSBjb250ZW50VHlwZS5zdWJzdHIoYm91bmRhcnlTdGFydE9m
ZnNldCwgYm91bmRhcnlMZW5ndGgpOworCisgICAgLy8gVGhlIGJ5dGUgcmFuZ2UgcmVzcG9uc2Ug
Y2FuIGhhdmUgcXVvdGVkIGJvdW5kYXJ5IHN0cmluZ3MuIFRoaXMgaXMgbGVnYWwKKyAgICAvLyBh
cyBwZXIgTUlNRSBzcGVjaWZpY2F0aW9ucy4gSW5kaXZpZHVhbCBkYXRhIGZyYWdlbWVudHMgaG93
ZXZlciBkb24ndAorICAgIC8vIGNvbnRhaW4gcXVvdGVkIGJvdW5kYXJ5IHN0cmluZ3MuCisgICAg
dHJpbVN0cmluZyhtdWx0aXBhcnRCb3VuZGFyeSwgIlwiIiwgVHJpbUxlYWRpbmcgfCBUcmltVHJh
aWxpbmcsIG11bHRpcGFydEJvdW5kYXJ5KTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBN
dWx0aXBhcnRSZXNwb25zZURlbGVnYXRlOjpvblJlY2VpdmVkRGF0YShjb25zdCBjaGFyKiBkYXRh
LCBpbnQgbGVuZ3RoLCBpbnQgZW5jb2RlZERhdGFMZW5ndGgpCit7CisgICAgLy8gbV9zdG9wU2Vu
ZGluZyBtZWFucyB0aGF0IHdlJ3ZlIGFscmVhZHkgcmVjZWl2ZWQgdGhlIGZpbmFsIGJvdW5kYXJ5
IHRva2VuLgorICAgIC8vIFRoZSBzZXJ2ZXIgc2hvdWxkIHN0b3Agc2VuZGluZyB1cyBkYXRhIGF0
IHRoaXMgcG9pbnQsIGJ1dCBpZiBpdCBkb2VzLCB3ZQorICAgIC8vIGp1c3QgdGhyb3cgaXQgYXdh
eS4KKyAgICBpZiAobV9zdG9wU2VuZGluZykKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9kYXRh
LmFwcGVuZChkYXRhLCBsZW5ndGgpOworICAgIG1fZW5jb2RlZERhdGFMZW5ndGggKz0gZW5jb2Rl
ZERhdGFMZW5ndGg7CisgICAgaWYgKG1fZmlyc3RSZWNlaXZlZERhdGEpIHsKKyAgICAgICAgLy8g
U29tZSBzZXJ2ZXJzIGRvbid0IHNlbmQgYSBib3VuZGFyeSB0b2tlbiBiZWZvcmUgdGhlIGZpcnN0
IGNodW5rIG9mCisgICAgICAgIC8vIGRhdGEuIFdlIGhhbmRsZSB0aGlzIGNhc2UgYW55d2F5IChH
ZWNrbyBkb2VzIHRvbykuCisgICAgICAgIG1fZmlyc3RSZWNlaXZlZERhdGEgPSBmYWxzZTsKKwor
ICAgICAgICAvLyBFYXQgbGVhZGluZyBcclxuLgorICAgICAgICBpbnQgcG9zaXRpb24gPSBwdXNo
T3ZlckxpbmUobV9kYXRhLCAwKTsKKyAgICAgICAgaWYgKHBvc2l0aW9uKQorICAgICAgICAgICAg
bV9kYXRhID0gbV9kYXRhLnN1YnN0cihwb3NpdGlvbik7CisKKyAgICAgICAgaWYgKG1fZGF0YS5s
ZW5ndGgoKSA8IG1fYm91bmRhcnkubGVuZ3RoKCkgKyAyKSB7CisgICAgICAgICAgICAvLyBXZSBk
b24ndCBoYXZlIGVub3VnaCBkYXRhIHlldCB0byBtYWtlIGEgYm91bmRhcnkgdG9rZW4uIEp1c3Qg
d2FpdAorICAgICAgICAgICAgLy8gdW50aWwgdGhlIG5leHQgY2h1bmsgb2YgZGF0YSBhcnJpdmVz
LgorICAgICAgICAgICAgbV9maXJzdFJlY2VpdmVkRGF0YSA9IHRydWU7CisgICAgICAgICAgICBy
ZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAobV9kYXRhLmNvbXBhcmUoMCwgbV9ib3Vu
ZGFyeS5sZW5ndGgoKSwgbV9ib3VuZGFyeSkpCisgICAgICAgICAgICBtX2RhdGEgPSBtX2JvdW5k
YXJ5ICsgIlxuIiArIG1fZGF0YTsKKyAgICB9CisKKyAgICAvLyBIZWFkZXJzCisgICAgaWYgKG1f
cHJvY2Vzc2luZ0hlYWRlcnMpIHsKKyAgICAgICAgLy8gRWF0IGxlYWRpbmcgXHJcbi4KKyAgICAg
ICAgaW50IHBvc2l0aW9uID0gcHVzaE92ZXJMaW5lKG1fZGF0YSwgMCk7CisgICAgICAgIGlmIChw
b3NpdGlvbikKKyAgICAgICAgICAgIG1fZGF0YSA9IG1fZGF0YS5zdWJzdHIocG9zaXRpb24pOwor
CisgICAgICAgIGlmIChwYXJzZUhlYWRlcnMoKSkgeworICAgICAgICAgICAgLy8gU3VjY2Vzc2Z1
bGx5IHBhcnNlZCBoZWFkZXJzLgorICAgICAgICAgICAgbV9wcm9jZXNzaW5nSGVhZGVycyA9IGZh
bHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gR2V0IG1vcmUgZGF0YSBiZWZv
cmUgdHJ5aW5nIGFnYWluLgorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQor
CisgICAgc2l6ZV90IGJvdW5kYXJ5UG9zaXRpb247CisgICAgd2hpbGUgKChib3VuZGFyeVBvc2l0
aW9uID0gZmluZEJvdW5kYXJ5KCkpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIGlm
IChtX3Jlc291cmNlSGFuZGxlICYmICBtX3Jlc291cmNlSGFuZGxlLT5jbGllbnQoKSkgeworICAg
ICAgICAgICAgLy8gU3RyaXAgb3V0IHRyYWlsaW5nIFxuXHIgY2hhcmFjdGVycyBpbiB0aGUgYnVm
ZmVyIHByZWNlZGluZyB0aGUKKyAgICAgICAgICAgIC8vIGJvdW5kYXJ5IG9uIHRoZSBzYW1lIGxp
bmVzIGFzIEZpcmVmb3guCisgICAgICAgICAgICBpbnQgZGF0YUxlbmd0aCA9IGJvdW5kYXJ5UG9z
aXRpb247CisgICAgICAgICAgICBpZiAoYm91bmRhcnlQb3NpdGlvbiA+IDAgJiYgbV9kYXRhW2Jv
dW5kYXJ5UG9zaXRpb24gLSAxXSA9PSAnXG4nKSB7CisgICAgICAgICAgICAgICAgZGF0YUxlbmd0
aC0tOworICAgICAgICAgICAgICAgIGlmIChib3VuZGFyeVBvc2l0aW9uID4gMSAmJiBtX2RhdGFb
Ym91bmRhcnlQb3NpdGlvbiAtIDJdID09ICdccicpCisgICAgICAgICAgICAgICAgICAgIGRhdGFM
ZW5ndGgtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChkYXRhTGVuZ3RoID4gMCkg
eworICAgICAgICAgICAgICAgIC8vIFNlbmQgdGhlIGxhc3QgZGF0YSBjaHVuay4KKyAgICAgICAg
ICAgICAgICBtX3Jlc291cmNlSGFuZGxlLT5jbGllbnQoKS0+ZGlkUmVjZWl2ZURhdGEobV9yZXNv
dXJjZUhhbmRsZS5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgbV9kYXRhLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUxlbmd0aCwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9l
bmNvZGVkRGF0YUxlbmd0aCk7CisgICAgICAgICAgICAgICAgbV9lbmNvZGVkRGF0YUxlbmd0aCA9
IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc2l6ZV90IGJvdW5kYXJ5RW5k
UG9zaXRpb24gPSBib3VuZGFyeVBvc2l0aW9uICsgbV9ib3VuZGFyeS5sZW5ndGgoKTsKKyAgICAg
ICAgaWYgKGJvdW5kYXJ5RW5kUG9zaXRpb24gPCBtX2RhdGEubGVuZ3RoKCkgJiYgJy0nID09IG1f
ZGF0YVtib3VuZGFyeUVuZFBvc2l0aW9uXSkgeworICAgICAgICAgICAgLy8gVGhpcyB3YXMgdGhl
IGxhc3QgYm91bmRhcnkgc28gd2UgY2FuIHN0b3AgcHJvY2Vzc2luZy4KKyAgICAgICAgICAgIG1f
c3RvcFNlbmRpbmcgPSB0cnVlOworICAgICAgICAgICAgbV9kYXRhLmNsZWFyKCk7CisgICAgICAg
ICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBXZSBjYW4gbm93IHRocm93IG91
dCBkYXRhIHVwIHRocm91Z2ggdGhlIGJvdW5kYXJ5LgorICAgICAgICBpbnQgb2Zmc2V0ID0gcHVz
aE92ZXJMaW5lKG1fZGF0YSwgYm91bmRhcnlFbmRQb3NpdGlvbik7CisgICAgICAgIG1fZGF0YSA9
IG1fZGF0YS5zdWJzdHIoYm91bmRhcnlFbmRQb3NpdGlvbiArIG9mZnNldCk7CisKKyAgICAgICAg
Ly8gT2ssIGJhY2sgdG8gcGFyc2luZyBoZWFkZXJzLgorICAgICAgICBpZiAoIXBhcnNlSGVhZGVy
cygpKSB7CisgICAgICAgICAgICBtX3Byb2Nlc3NpbmdIZWFkZXJzID0gdHJ1ZTsKKyAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQXQgdGhpcyBwb2ludCwgd2Ug
c2hvdWxkIHNlbmQgb3ZlciBhbnkgZGF0YSB3ZSBoYXZlLCBidXQga2VlcCBlbm91Z2ggZGF0YQor
ICAgIC8vIGJ1ZmZlcmVkIHRvIGhhbmRsZSBhIGJvdW5kYXJ5IHRoYXQgbWF5IGhhdmUgYmVlbiB0
cnVuY2F0ZWQuCisgICAgaWYgKCFtX3Byb2Nlc3NpbmdIZWFkZXJzICYmIG1fZGF0YS5sZW5ndGgo
KSA+IG1fYm91bmRhcnkubGVuZ3RoKCkpIHsKKyAgICAgICAgLy8gSWYgdGhlIGxhc3QgY2hhcmFj
dGVyIGlzIGEgbmV3IGxpbmUgY2hhcmFjdGVyLCBnbyBhaGVhZCBhbmQganVzdCBzZW5kCisgICAg
ICAgIC8vIGV2ZXJ5dGhpbmcgd2UgaGF2ZSBidWZmZXJlZC4gVGhpcyBtYXRjaGVzIGFuIG9wdGlt
aXphdGlvbiBpbiBHZWNrby4KKyAgICAgICAgaW50IHNlbmRMZW5ndGggPSBtX2RhdGEubGVuZ3Ro
KCkgLSBtX2JvdW5kYXJ5Lmxlbmd0aCgpOworICAgICAgICBpZiAobV9kYXRhW21fZGF0YS5sZW5n
dGgoKSAtIDFdID09ICdcbicpCisgICAgICAgICAgICBzZW5kTGVuZ3RoID0gbV9kYXRhLmxlbmd0
aCgpOworICAgICAgICBpZiAobV9yZXNvdXJjZUhhbmRsZSAmJiBtX3Jlc291cmNlSGFuZGxlLT5j
bGllbnQoKSkKKyAgICAgICAgICAgIG1fcmVzb3VyY2VIYW5kbGUtPmNsaWVudCgpLT5kaWRSZWNl
aXZlRGF0YShtX3Jlc291cmNlSGFuZGxlLmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZGF0YS5kYXRhKCksCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZExlbmd0aCwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBt
X2VuY29kZWREYXRhTGVuZ3RoKTsKKyAgICAgICAgbV9kYXRhID0gbV9kYXRhLnN1YnN0cihzZW5k
TGVuZ3RoKTsKKyAgICAgICAgbV9lbmNvZGVkRGF0YUxlbmd0aCA9IDA7CisgICAgfQorfQorCit2
b2lkIE11bHRpcGFydFJlc3BvbnNlRGVsZWdhdGU6Om9uQ29tcGxldGVkUmVxdWVzdCgpCit7Cisg
ICAgLy8gSWYgd2UgaGF2ZSBhbnkgcGVuZGluZyBkYXRhIGFuZCB3ZSdyZSBub3QgaW4gYSBoZWFk
ZXIsIGdvIGFoZWFkIGFuZCBzZW5kCisgICAgLy8gaXQgdG8gV2ViQ29yZS4KKyAgICBpZiAoIW1f
cHJvY2Vzc2luZ0hlYWRlcnMgJiYgIW1fZGF0YS5lbXB0eSgpICYmICFtX3N0b3BTZW5kaW5nICYm
IG1fcmVzb3VyY2VIYW5kbGUgJiYgbV9yZXNvdXJjZUhhbmRsZS0+Y2xpZW50KCkpIHsKKyAgICAg
ICAgbV9yZXNvdXJjZUhhbmRsZS0+Y2xpZW50KCktPmRpZFJlY2VpdmVEYXRhKG1fcmVzb3VyY2VI
YW5kbGUuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBtX2RhdGEuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgbV9kYXRhLmxlbmd0aCgpLAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9lbmNvZGVkRGF0YUxlbmd0aCk7CisgICAg
ICAgIG1fZW5jb2RlZERhdGFMZW5ndGggPSAwOworICAgIH0KK30KKworYm9vbCBNdWx0aXBhcnRS
ZXNwb25zZURlbGVnYXRlOjpwYXJzZUhlYWRlcnMoKQoreworICAgIGludCBsaW5lRmVlZEluY3Jl
bWVudCA9IDE7CisKKyAgICAvLyBHcmFiIHRoZSBoZWFkZXJzIGJlaW5nIGxpYmVyYWwgYWJvdXQg
bGluZSBlbmRpbmdzLgorICAgIHNpemVfdCBsaW5lU3RhcnRQb3NpdGlvbiA9IDA7CisgICAgc2l6
ZV90IGxpbmVFbmRQb3NpdGlvbiA9IG1fZGF0YS5maW5kKCdcbicpOworICAgIHdoaWxlIChsaW5l
RW5kUG9zaXRpb24gIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgLy8gSGFuZGxlIENS
TEYKKyAgICAgICAgaWYgKGxpbmVFbmRQb3NpdGlvbiA+IGxpbmVTdGFydFBvc2l0aW9uICYmIG1f
ZGF0YVtsaW5lRW5kUG9zaXRpb24gLSAxXSA9PSAnXHInKSB7CisgICAgICAgICAgICBsaW5lRmVl
ZEluY3JlbWVudCA9IDI7CisgICAgICAgICAgICAtLWxpbmVFbmRQb3NpdGlvbjsKKyAgICAgICAg
fSBlbHNlCisgICAgICAgICAgICBsaW5lRmVlZEluY3JlbWVudCA9IDE7CisKKyAgICAgICAgaWYg
KGxpbmVTdGFydFBvc2l0aW9uID09IGxpbmVFbmRQb3NpdGlvbikgeworICAgICAgICAgICAgLy8g
QSBibGFuayBsaW5lLCBlbmQgb2YgaGVhZGVycy4KKyAgICAgICAgICAgIGxpbmVFbmRQb3NpdGlv
biArPSBsaW5lRmVlZEluY3JlbWVudDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9Cisg
ICAgICAgIC8vIEZpbmQgdGhlIG5leHQgaGVhZGVyIGxpbmUuCisgICAgICAgIGxpbmVTdGFydFBv
c2l0aW9uID0gbGluZUVuZFBvc2l0aW9uICsgbGluZUZlZWRJbmNyZW1lbnQ7CisgICAgICAgIGxp
bmVFbmRQb3NpdGlvbiA9IG1fZGF0YS5maW5kKCdcbicsIGxpbmVTdGFydFBvc2l0aW9uKTsKKyAg
ICB9CisgICAgLy8gVHJ1bmNhdGVkIGluIHRoZSBtaWRkbGUgb2YgYSBoZWFkZXIsIHN0b3AgcGFy
c2luZy4KKyAgICBpZiAobGluZUVuZFBvc2l0aW9uID09IHN0ZDo6c3RyaW5nOjpucG9zKQorICAg
ICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBFYXQgaGVhZGVycy4KKyAgICBzdGQ6OnN0cmlu
ZyBoZWFkZXJzKCJcbiIpOworICAgIGhlYWRlcnMuYXBwZW5kKG1fZGF0YSwgMCwgbGluZUVuZFBv
c2l0aW9uKTsKKyAgICBtX2RhdGEgPSBtX2RhdGEuc3Vic3RyKGxpbmVFbmRQb3NpdGlvbik7CisK
KyAgICAvLyBDcmVhdGUgYSBXZWJVUkxSZXNwb25zZSBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgc2V0
IG9mIGhlYWRlcnMgKyB0aGUKKyAgICAvLyByZXBsYWNlbWVudCBoZWFkZXJzLiBXZSBvbmx5IHJl
cGxhY2UgdGhlIHNhbWUgZmV3IGhlYWRlcnMgdGhhdCBnZWNrbworICAgIC8vIGRvZXMuIFNlZSBu
ZXR3ZXJrL3N0cmVhbWNvbnYvY29udmVydGVycy9uc011bHRpTWl4ZWRDb252LmNwcC4KKworICAg
IHN0ZDo6c3RyaW5nIGNvbnRlbnRUeXBlID0gZ2V0U3BlY2lmaWNIZWFkZXIoaGVhZGVycywgImNv
bnRlbnQtdHlwZSIpOworICAgIHN0ZDo6c3RyaW5nIG1pbWVUeXBlOworICAgIHN0ZDo6c3RyaW5n
IGNoYXJzZXQ7CisgICAgYm9vbCBoYXNDaGFyc2V0ID0gZmFsc2U7CisKKyAgICBwYXJzZUNvbnRl
bnRUeXBlKGNvbnRlbnRUeXBlLCBtaW1lVHlwZSwgY2hhcnNldCwgaGFzQ2hhcnNldCk7CisgICAg
UmVzb3VyY2VSZXNwb25zZSByZXNwb25zZTsKKyAgICByZXNwb25zZS5zZXRVUkwobV9vcmlnaW5h
bFJlc3BvbnNlLnVybCgpKTsKKyAgICByZXNwb25zZS5zZXRNaW1lVHlwZShTdHJpbmc6OmZyb21V
VEY4KG1pbWVUeXBlLmRhdGEoKSkpOworICAgIGlmIChoYXNDaGFyc2V0KQorICAgICAgICByZXNw
b25zZS5zZXRUZXh0RW5jb2RpbmdOYW1lKFN0cmluZzo6ZnJvbVVURjgoY2hhcnNldC5kYXRhKCkp
KTsKKworICAgIGNvbnN0IFdlYkNvcmU6OkhUVFBIZWFkZXJNYXAmIG1hcCA9IG1fb3JpZ2luYWxS
ZXNwb25zZS5odHRwSGVhZGVyRmllbGRzKCk7CisKKyAgICAvLyBUaGUgbGlzdCBvZiByZXNwb25z
ZSBoZWFkZXJzIHRoYXQgd2UgZG8gbm90IGNvcHkgZnJvbSB0aGUgb3JpZ2luYWwKKyAgICAvLyBy
ZXNwb25zZSB3aGVuIGdlbmVyYXRpbmcgYSByZXNwb3NlLgorICAgIHN0YXRpYyBjb25zdCBjaGFy
KiBSZXBsYWNlSGVhZGVyc1tdID0geworICAgICAgICAgImNvbnRlbnQtdHlwZSIsCisgICAgICAg
ICAiY29udGVudC1sZW5ndGgiLAorICAgICAgICAgImNvbnRlbnQtZGlzcG9zaXRpb24iLAorICAg
ICAgICAgImNvbnRlbnQtcmFuZ2UiLAorICAgICAgICAgInJhbmdlIiwKKyAgICAgICAgICJzZXQt
Y29va2llIgorICAgIH07CisKKyAgICBmb3IgKFdlYkNvcmU6OkhUVFBIZWFkZXJNYXA6OmNvbnN0
X2l0ZXJhdG9yIGl0ID0gbWFwLmJlZ2luKCk7IGl0ICE9IG1hcC5lbmQoKTsgKytpdCkgeworICAg
ICAgICBib29sIG5lZWRzQWRkID0gdHJ1ZTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkg
PCBXVEZfQVJSQVlfTEVOR1RIKFJlcGxhY2VIZWFkZXJzKTsgKytpKSB7CisgICAgICAgICAgICBp
ZiAoaXQtPmZpcnN0Lmxvd2VyKCkgPT0gUmVwbGFjZUhlYWRlcnNbaV0pIHsKKyAgICAgICAgICAg
ICAgICBuZWVkc0FkZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAg
ICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChuZWVkc0FkZCkKKyAgICAgICAgICAgIHJlc3Bv
bnNlLnNldEhUVFBIZWFkZXJGaWVsZChpdC0+Zmlyc3QsIGl0LT5zZWNvbmQpOworICAgIH0KKwor
ICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgV1RGX0FSUkFZX0xFTkdUSChSZXBsYWNlSGVhZGVy
cyk7ICsraSkgeworICAgICAgICBzdGQ6OnN0cmluZyBuYW1lKFJlcGxhY2VIZWFkZXJzW2ldKTsK
KyAgICAgICAgc3RkOjpzdHJpbmcgdmFsdWUgPSBnZXRTcGVjaWZpY0hlYWRlcihoZWFkZXJzLCBu
YW1lKTsKKyAgICAgICAgaWYgKCF2YWx1ZS5lbXB0eSgpKSB7CisgICAgICAgICAgICByZXNwb25z
ZS5zZXRIVFRQSGVhZGVyRmllbGQoU3RyaW5nOjpmcm9tVVRGOChuYW1lLmRhdGEoKSksCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOjpmcm9tVVRGOCh2YWx1
ZS5kYXRhKCkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtX3Jlc291cmNlSGFuZGxl
ICYmIG1fcmVzb3VyY2VIYW5kbGUtPmNsaWVudCgpKSB7CisgICAgICAgIC8vIEFmdGVyIHBhcnNl
ZCB0aGUgaGVhZGVycyBzdWNjZXNzZnVsbHksIHRoZSBtdWx0aXBhcnQgcGFnZXMgd2lsbCBub3Qg
YmUgc3RvcmVkIGluIHBhZ2UKKyAgICAgICAgLy8gY2FjaGUgYW55IG1vcmUsIGJlY2F1c2UgZ28g
YmFjay9mb3J3YXJkIGFjdGlvbnMgbmVlZCBnZXR0aW5nIHRoZSBsYXRlc3QgZGF0YSBmcm9tIHNl
cnZlci4KKyAgICAgICAgcmVzcG9uc2Uuc2V0SXNNdWx0aXBhcnRQYXlsb2FkKHRydWUpOworICAg
ICAgICBtX3Jlc291cmNlSGFuZGxlLT5jbGllbnQoKS0+ZGlkUmVjZWl2ZVJlc3BvbnNlKG1fcmVz
b3VyY2VIYW5kbGUuZ2V0KCksIHJlc3BvbnNlKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9
CisKKy8vIEJvdW5kYXJpZXMgYXJlIHN1cHBvc2VkIHRvIGJlIHByZWNlZWRlZCB3aXRoIC0tLCBi
dXQgaXQgbG9va3MgbGlrZSBnZWNrbworLy8gZG9lc24ndCByZXF1aXJlIHRoZSBkYXNoZXMgdG8g
ZXhpc3QuIFNlZSBuc011bHRpTWl4ZWRDb252OjpGaW5kVG9rZW4uCitzaXplX3QgTXVsdGlwYXJ0
UmVzcG9uc2VEZWxlZ2F0ZTo6ZmluZEJvdW5kYXJ5KCkKK3sKKyAgICBzaXplX3QgYm91bmRhcnlQ
b3NpdGlvbiA9IG1fZGF0YS5maW5kKG1fYm91bmRhcnkpOworICAgIGlmIChib3VuZGFyeVBvc2l0
aW9uICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIC8vIEJhY2sgdXAgb3ZlciAtLSBm
b3IgYmFja3dhcmRzIGNvbXBhdAorICAgICAgICAvLyBGSVhNRSh0Yyk6IERvbid0IHdlIG9ubHkg
d2FudCB0byBkbyB0aGlzIG9uY2U/IEdlY2tvIGNvZGUgZG9lc24ndCBzZWVtCisgICAgICAgIC8v
IHRvIGNhcmUuCisgICAgICAgIGlmIChib3VuZGFyeVBvc2l0aW9uID49IDIpIHsKKyAgICAgICAg
ICAgIGlmICgnLScgPT0gbV9kYXRhW2JvdW5kYXJ5UG9zaXRpb24gLSAxXSAmJiAnLScgPT0gbV9k
YXRhW2JvdW5kYXJ5UG9zaXRpb24gLSAyXSkgeworICAgICAgICAgICAgICAgIGJvdW5kYXJ5UG9z
aXRpb24gLT0gMjsKKyAgICAgICAgICAgICAgICBtX2JvdW5kYXJ5ID0gIi0tIiArIG1fYm91bmRh
cnk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGJvdW5kYXJ5
UG9zaXRpb247Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1NvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvYmxhY2tiZXJyeS9NdWx0aXBhcnRSZXNwb25zZURl
bGVnYXRlLmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvTXVs
dGlwYXJ0UmVzcG9uc2VEZWxlZ2F0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmU0MWU4MjFiM2IxYjFhOGNhMWUx
YjQ5MGMxNTVlMzRjOTNhYjIyNzEKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvTXVsdGlwYXJ0UmVzcG9uc2VEZWxlZ2F0ZS5oCkBA
IC0wLDAgKzEsMTQwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExIFJlc2VhcmNoIEluIE1v
dGlvbiBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA2
LTIwMDkgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKiAKKyAqICAgICAqIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmli
dXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUg
bmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBw
cm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNw
ZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICog
IkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9S
WSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisvLyBNb3N0IG9m
IGxvZ2ljIGFuZCBmdW5jdGlvbnMgYXJlIGJhc2Ugb24gQ2hyb21pdW0gYnJvd3NlcidzIGltcGxl
bWFudGlvbnMgaW4KKy8vIHdlYmtpdC9nbHVlL211bHRpcGFydF9yZXNwb25zZV9kZWxlZ2F0ZS5j
Yywgc28gaGVyZSdzIHRoZSBvcmlnaW5hbCBjaHJvbWl1bSBsaWNlbnNlOgorCisvLyBDb3B5cmln
aHQgKGMpIDIwMDYtMjAwOSBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxl
IGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisvLwor
Ly8gQSBkZWxlZ2F0ZSBjbGFzcyBvZiBXZWJVUkxMb2FkZXJJbXBsIHRoYXQgaGFuZGxlcyBtdWx0
aXBhcnQveC1taXhlZC1yZXBsYWNlCisvLyBkYXRhLiBXZSBzcGVjaWFsIGNhc2UgbXVsdGlwYXJ0
L3gtbWl4ZWQtcmVwbGFjZSBiZWNhdXNlIFdlYkNvcmUgZXhwZWN0cyBhCisvLyBzZXBhcmF0ZSBk
aWRSZWNlaXZlUmVzcG9uc2UgZm9yIGVhY2ggbmV3IG1lc3NhZ2UgcGFydC4KKy8vCisvLyBNb3N0
IG9mIHRoZSBsb2dpYyBhbmQgZWRnZSBjYXNlIGhhbmRsaW5nIGFyZSBiYXNlZCBvbiB0aGUgTW96
aWxsYSdzCisvLyBpbXBsZW1lbnRhdGlvbiBpbiBuZXR3ZXJrL3N0cmVhbWNvbnYvY29udmVydGVy
cy9uc011bHRpTWl4ZWRDb252LmNwcC4KKy8vIFRoaXMgc2VlbXMgbGlrZSBhIGRlcml2YXRpdmUg
d29yaywgc28gaGVyZSdzIHRoZSBvcmlnaW5hbCBsaWNlbnNlOgorCisvKiAqKioqKiBCRUdJTiBM
SUNFTlNFIEJMT0NLICoqKioqCisgKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEK
KyAqCisgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3pp
bGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KKyAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBt
YXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExp
Y2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogaHR0cDov
L3d3dy5tb3ppbGxhLm9yZy9NUEwvCisgKgorICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIg
dGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKKyAqIFdJVEhP
VVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0
aGUgTGljZW5zZQorICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRz
IGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKKyAqIExpY2Vuc2UuCisgKgorICogVGhlIE9yaWdp
bmFsIENvZGUgaXMgbW96aWxsYS5vcmcgY29kZS4KKyAqCisgKiBUaGUgSW5pdGlhbCBEZXZlbG9w
ZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKKyAqIE5ldHNjYXBlIENvbW11bmljYXRpb25zIENv
cnBvcmF0aW9uLgorICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIg
YXJlIENvcHlyaWdodCAoQykgMTk5OAorICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmln
aHRzIFJlc2VydmVkLgorICoKKyAqIENvbnRyaWJ1dG9yKHMpOgorICoKKyAqIEFsdGVybmF0aXZl
bHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1z
IG9mCisgKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBv
ciBsYXRlciAodGhlICJHUEwiKSwgb3IKKyAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGlj
IExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAorICogaW4gd2hpY2gg
Y2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxl
IGluc3RlYWQKKyAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2Yg
eW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CisgKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0
aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCisgKiB1
c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwg
aW5kaWNhdGUgeW91cgorICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJv
dmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKKyAqIGFuZCBvdGhlciBwcm92aXNp
b25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRl
CisgKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNp
b24gb2YgdGhpcyBmaWxlIHVuZGVyCisgKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBM
LCB0aGUgR1BMIG9yIHRoZSBMR1BMLgorICoKKyAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoq
KioqICovCisKKyNpZm5kZWYgTXVsdGlwYXJ0UmVzcG9uc2VEZWxlZ2F0ZV9oCisjZGVmaW5lIE11
bHRpcGFydFJlc3BvbnNlRGVsZWdhdGVfaAorCisjaW5jbHVkZSAiUmVzb3VyY2VIYW5kbGUuaCIK
KyNpbmNsdWRlICJSZXNvdXJjZVJlc3BvbnNlLmgiCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1l
c3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIE11bHRpcGFydFJlc3BvbnNlRGVsZWdhdGUgeworcHVi
bGljOgorICAgIE11bHRpcGFydFJlc3BvbnNlRGVsZWdhdGUoUGFzc1JlZlB0cjxSZXNvdXJjZUhh
bmRsZT4gcmVzb3VjZUhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0
IFJlc291cmNlUmVzcG9uc2UmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qg
c3RkOjpzdHJpbmcmIGJvdW5kYXJ5KTsKKyAgICBzdGF0aWMgYm9vbCByZWFkTXVsdGlwYXJ0Qm91
bmRhcnkoY29uc3Qgc3RkOjpzdHJpbmcmIGNvbnRlbnRUeXBlLCBzdGQ6OnN0cmluZyYgbXVsdGlw
YXJ0Qm91bmRhcnkpOworICAgIHZvaWQgb25SZWNlaXZlZERhdGEoY29uc3QgY2hhciogZGF0YSwg
aW50IGxlbmd0aCwgaW50IGVuY29kZWREYXRhTGVuZ3RoKTsKKyAgICB2b2lkIG9uQ29tcGxldGVk
UmVxdWVzdCgpOworCitwcml2YXRlOgorCisgICAgLy8gVHJpZXMgdG8gcGFyc2UgaHR0cCBoZWFk
ZXJzIGZyb20gdGhlIHN0YXJ0IG9mIG1fZGF0YS4gUmV0dXJucyB0cnVlIGlmIGl0CisgICAgLy8g
c3VjY2VlZHMgYW5kIHNlbmRzIGEgZGlkUmVjZWl2ZVJlc3BvbnNlIHRvIG1fY2xpZW50LiBSZXR1
cm5zIGZhbHNlIGlmCisgICAgLy8gdGhlIGhlYWRlciBpcyBpbmNvbXBsZXRlIChpbiB3aGljaCBj
YXNlIHdlIGp1c3Qgd2FpdCBmb3IgbW9yZSBkYXRhKS4KKyAgICBib29sIHBhcnNlSGVhZGVycygp
OworCisgICAgLy8gRmluZCB0aGUgbmV4dCBib3VuZGFyeSBpbiBtX2RhdGEuIFJldHVybnMgc3Rk
OjpzdHJpbmc6Om5wb3MgaWYgdGhlcmUncyBubworICAgIC8vIGZ1bGwgdG9rZW4uCisgICAgc2l6
ZV90IGZpbmRCb3VuZGFyeSgpOworCisgICAgLy8gTXVsdGlwYXJ0IGJvdW5kYXJ5IHRva2VuLgor
ICAgIHN0ZDo6c3RyaW5nIG1fYm91bmRhcnk7CisKKyAgICAvLyBBIHRlbXBvcmFyeSBidWZmZXIg
dG8gaG9sZCBkYXRhIGJldHdlZW4gcmVhZHMgZm9yIG11bHRpcGFydCBkYXRhIHRoYXQKKyAgICAv
LyBnZXRzIHNwbGl0IGluIHRoZSBtaWRkbGUgb2YgYSBoZWFkZXIuCisgICAgc3RkOjpzdHJpbmcg
bV9kYXRhOworCisgICAgaW50IG1fZW5jb2RlZERhdGFMZW5ndGg7CisKKyAgICAvLyBUcnVlIHVu
dGlsIHdlJ3JlIHJlY2VpdmVkIHRoZSBmaXJzdCBkYXRhLgorICAgIGJvb2wgbV9maXJzdFJlY2Vp
dmVkRGF0YTsKKworICAgIC8vIFRoZSBvcmlnaW5hbCByZXNvdXJjZSByZXNwb25zZSBmb3IgdGhp
cyByZXF1ZXN0LiBXZSB1c2UgdGhpcyBhcyBhCisgICAgLy8gc3RhcnRpbmcgcG9pbnQgZm9yIGVh
Y2ggcGFydHMgcmVzcG9uc2UuCisgICAgY29uc3QgUmVzb3VyY2VSZXNwb25zZSYgbV9vcmlnaW5h
bFJlc3BvbnNlOworCisgICAgLy8gVHJ1ZSBpZiB3ZSdyZSB0cnVuY2F0ZWQgaW4gdGhlIG1pZGRs
ZSBvZiBhIGhlYWRlci4KKyAgICBib29sIG1fcHJvY2Vzc2luZ0hlYWRlcnM7CisKKyAgICBSZWZQ
dHI8UmVzb3VyY2VIYW5kbGU+IG1fcmVzb3VyY2VIYW5kbGU7CisKKyAgICAvLyBUcnVlIHdoZW4g
d2UncmUgZG9uZSBzZW5kaW5nIGluZm9ybWF0aW9uLiBBdCB0aGF0IHBvaW50LCB3ZSBzdG9wCisg
ICAgLy8gcHJvY2Vzc2luZyBBZGREYXRhIHJlcXVlc3RzLgorICAgIGJvb2wgbV9zdG9wU2VuZGlu
ZzsKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIE11bHRpcGFydFJl
c3BvbnNlRGVsZWdhdGVfaAo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>119979</attachid>
            <date>2011-12-19 20:32:03 -0800</date>
            <delta_ts>2011-12-20 17:53:35 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-73533-20111220123156.patch</filename>
            <type>text/plain</type>
            <size>14290</size>
            <attacher name="Chris.Guan">logingx</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTAzMjk3CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggODNiYmI2ZTllZTM3NGJm
YWNiMTA0MzcxNDJlYWVkMjNhZDMwMzU3Yi4uOWEzNmUwMjBhMmMzNDJiN2ZhYzdmMjBjZWY3NmI1
NGExYTdiNzc5YyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDMxIEBACisyMDExLTEyLTE5ICBDaHJp
cyBHdWFuICA8Y2hyaXMuZ3VhbkB0b3JjaG1vYmlsZS5jb20uY24+CisKKyAgICAgICAgVXBzdHJl
YW0gdGhlIE11bHRpcGFydCBmZWF0dXJlIGluIEJsYWNrYmVycnkgcG9ydAorICAgICAgICBodHRw
czovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM1MzMKKworICAgICAgICBSZXZp
ZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBJIHJlZmFjdG9yZWQgTXVsdGlwYXJ0
IGNvZGUgb2YgQmxhY2tiZXJyeSBwb3J0LiBNb3ZlZCBNdWx0aXBhcnQgaW50bworICAgICAgICBC
bGFja2VycnkgbmV0d29yayBsYXllciBhbmQgcmVtb3ZlZCB0aGUgZGVwZW5kZW5jZSBvZiBzdGQ6
OnN0cmluZy4KKworICAgICAgICBJbml0aWFsIHVwc3RyZWFtLCBubyBuZXcgdGVzdCBjYXNlcy4K
KworICAgICAgICAqIHBsYXRmb3JtL25ldHdvcmsvYmxhY2tiZXJyeS9EZWZlcnJlZERhdGEuY3Bw
OgorICAgICAgICAoV2ViQ29yZTo6RGVmZXJyZWREYXRhOjpkZWZlck11bHRpcGFydEhlYWRlclJl
Y2VpdmVkKToKKyAgICAgICAgKFdlYkNvcmU6OkRlZmVycmVkRGF0YTo6cHJvY2Vzc0hlYWRlcnMp
OgorICAgICAgICAoV2ViQ29yZTo6RGVmZXJyZWREYXRhOjpwcm9jZXNzRGVmZXJyZWREYXRhKToK
KyAgICAgICAgKiBwbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvRGVmZXJyZWREYXRhLmg6Cisg
ICAgICAgIChXZWJDb3JlOjpEZWZlcnJlZERhdGE6Omhhc0RlZmVycmVkRGF0YSk6CisgICAgICAg
ICogcGxhdGZvcm0vbmV0d29yay9ibGFja2JlcnJ5L05ldHdvcmtKb2IuY3BwOgorICAgICAgICAo
V2ViQ29yZTo6TmV0d29ya0pvYjo6bm90aWZ5TXVsdGlwYXJ0SGVhZGVyUmVjZWl2ZWQpOgorICAg
ICAgICAoV2ViQ29yZTo6TmV0d29ya0pvYjo6aGFuZGxlTm90aWZ5TXVsdGlwYXJ0SGVhZGVyUmVj
ZWl2ZWQpOgorICAgICAgICAoV2ViQ29yZTo6TmV0d29ya0pvYjo6aGFuZGxlTm90aWZ5RGF0YVJl
Y2VpdmVkKToKKyAgICAgICAgKFdlYkNvcmU6Ok5ldHdvcmtKb2I6OmhhbmRsZU5vdGlmeUNsb3Nl
KToKKyAgICAgICAgKFdlYkNvcmU6Ok5ldHdvcmtKb2I6OnN0YXJ0TmV3Sm9iV2l0aFJlcXVlc3Qp
OgorICAgICAgICAoV2ViQ29yZTo6TmV0d29ya0pvYjo6c2VuZFJlc3BvbnNlSWZOZWVkZWQpOgor
ICAgICAgICAoV2ViQ29yZTo6TmV0d29ya0pvYjo6c2VuZE11bHRpcGFydFJlc3BvbnNlSWZOZWVk
ZWQpOgorICAgICAgICAqIHBsYXRmb3JtL25ldHdvcmsvYmxhY2tiZXJyeS9OZXR3b3JrSm9iLmg6
CisKIDIwMTEtMTItMTkgIFNhbSBXZWluaWcgIDxzYW1Ad2Via2l0Lm9yZz4KIAogICAgICAgICBN
b3JlIFBsYXRmb3JtRXZlbnQgY2xlYW51cApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vbmV0d29yay9ibGFja2JlcnJ5L0RlZmVycmVkRGF0YS5jcHAgYi9Tb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvRGVmZXJyZWREYXRhLmNwcAppbmRleCBkNGE4
YmVmYjAxOTZjZThlNjQ2MDJhMWE1OGVmODQzNjU2ZjU4MWQ5Li5kZmUxOGQ4YjdjNDk1N2VkY2Mz
YjAwYTJkYjM0ZWIyYTQzMjVmYjU3IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9uZXR3b3JrL2JsYWNrYmVycnkvRGVmZXJyZWREYXRhLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvRGVmZXJyZWREYXRhLmNwcApAQCAtNTUsNiAr
NTUsMTIgQEAgdm9pZCBEZWZlcnJlZERhdGE6OmRlZmVySGVhZGVyUmVjZWl2ZWQoY29uc3QgU3Ry
aW5nJiBrZXksIGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgbV9oZWFkZXJWYWx1ZXMuYXBwZW5k
KHZhbHVlKTsKIH0KIAordm9pZCBEZWZlcnJlZERhdGE6OmRlZmVyTXVsdGlwYXJ0SGVhZGVyUmVj
ZWl2ZWQoY29uc3QgU3RyaW5nJiBrZXksIGNvbnN0IFN0cmluZyYgdmFsdWUpCit7CisgICAgbV9t
dWx0aXBhcnRIZWFkZXJLZXlzLmFwcGVuZChrZXkpOworICAgIG1fbXVsdGlwYXJ0aGVhZGVyVmFs
dWVzLmFwcGVuZCh2YWx1ZSk7Cit9CisKIHZvaWQgRGVmZXJyZWREYXRhOjpkZWZlckRhdGFTZW50
KHVuc2lnbmVkIGxvbmcgbG9uZyBieXRlc1NlbnQsIHVuc2lnbmVkIGxvbmcgbG9uZyB0b3RhbEJ5
dGVzVG9CZVNlbnQpCiB7CiAgICAgbV9ieXRlc1NlbnQgPSBieXRlc1NlbnQ7CkBAIC03Myw2ICs3
OSwzMCBAQCB2b2lkIERlZmVycmVkRGF0YTo6ZGVmZXJDbG9zZShpbnQgc3RhdHVzKQogICAgIG1f
ZGVmZXJyZWRDbG9zZSA9IHRydWU7CiB9CiAKK2Jvb2wgRGVmZXJyZWREYXRhOjpwcm9jZXNzSGVh
ZGVycyhWZWN0b3I8U3RyaW5nPiYgaGVhZGVyS2V5cywgVmVjdG9yPFN0cmluZz4mIGhlYWRlclZh
bHVlcywgSGFuZGxlSGVhZGVyc0Z1bmN0aW9uIGZ1bmN0aW9uKQoreworICAgIHNpemVfdCBudW1I
ZWFkZXJzID0gaGVhZGVyS2V5cy5zaXplKCk7CisgICAgQVNTRVJUKGhlYWRlclZhbHVlcy5zaXpl
KCkgPT0gbnVtSGVhZGVycyk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1IZWFkZXJz
OyArK2kpIHsKKyAgICAgICAgKG1fam9iLipmdW5jdGlvbikoaGVhZGVyS2V5c1tpXSwgaGVhZGVy
VmFsdWVzW2ldKTsKKworICAgICAgICBpZiAobV9qb2IuaXNEZWZlcnJpbmdMb2FkaW5nKCkpIHsK
KyAgICAgICAgICAgIC8vIFJlbW92ZSBhbGwgdGhlIGhlYWRlcnMgdGhhdCBoYXZlIGFscmVhZHkg
YmVlbiBwcm9jZXNzZWQuCisgICAgICAgICAgICBoZWFkZXJLZXlzLnJlbW92ZSgwLCBpICsgMSk7
CisgICAgICAgICAgICBoZWFkZXJWYWx1ZXMucmVtb3ZlKDAsIGkgKyAxKTsKKyAgICAgICAgICAg
IHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtX2pvYi5pc0NhbmNlbGxl
ZCgpKSB7CisgICAgICAgICAgICAvLyBEb24ndCBib3RoZXIgcmVtb3ZpbmcgaGVhZGVyczsgam9i
IHdpbGwgYmUgZGVsZXRlZC4KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQor
ICAgIH0KKyAgICBoZWFkZXJLZXlzLmNsZWFyKCk7CisgICAgaGVhZGVyVmFsdWVzLmNsZWFyKCk7
CisgICAgcmV0dXJuIHRydWU7Cit9CisKIHZvaWQgRGVmZXJyZWREYXRhOjpwcm9jZXNzRGVmZXJy
ZWREYXRhKCkKIHsKICAgICBpZiAobV9pblByb2Nlc3NEZWZlcnJlZERhdGEpCkBAIC0xMDAsMjUg
KzEzMCw5IEBAIHZvaWQgRGVmZXJyZWREYXRhOjpwcm9jZXNzRGVmZXJyZWREYXRhKCkKICAgICAg
ICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBzaXplX3QgbnVtSGVhZGVycyA9IG1faGVhZGVy
S2V5cy5zaXplKCk7Ci0gICAgQVNTRVJUKG1faGVhZGVyVmFsdWVzLnNpemUoKSA9PSBudW1IZWFk
ZXJzKTsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbnVtSGVhZGVyczsgKytpKSB7Ci0g
ICAgICAgIG1fam9iLmhhbmRsZU5vdGlmeUhlYWRlclJlY2VpdmVkKG1faGVhZGVyS2V5c1tpXSwg
bV9oZWFkZXJWYWx1ZXNbaV0pOwotCi0gICAgICAgIGlmIChtX2pvYi5pc0RlZmVycmluZ0xvYWRp
bmcoKSkgewotICAgICAgICAgICAgLy8gUmVtb3ZlIGFsbCB0aGUgaGVhZGVycyB0aGF0IGhhdmUg
YWxyZWFkeSBiZWVuIHByb2Nlc3NlZC4KLSAgICAgICAgICAgIG1faGVhZGVyS2V5cy5yZW1vdmUo
MCwgaSArIDEpOwotICAgICAgICAgICAgbV9oZWFkZXJWYWx1ZXMucmVtb3ZlKDAsIGkgKyAxKTsK
LSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtX2pvYi5pc0Nh
bmNlbGxlZCgpKSB7Ci0gICAgICAgICAgICAvLyBEb24ndCBib3RoZXIgcmVtb3ZpbmcgaGVhZGVy
czsgam9iIHdpbGwgYmUgZGVsZXRlZC4KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQot
ICAgIH0KLSAgICBtX2hlYWRlcktleXMuY2xlYXIoKTsKLSAgICBtX2hlYWRlclZhbHVlcy5jbGVh
cigpOworICAgIGlmICghcHJvY2Vzc0hlYWRlcnMobV9oZWFkZXJLZXlzLCBtX2hlYWRlclZhbHVl
cywgJk5ldHdvcmtKb2I6OmhhbmRsZU5vdGlmeUhlYWRlclJlY2VpdmVkKQorICAgICAgICB8fCAh
cHJvY2Vzc0hlYWRlcnMobV9tdWx0aXBhcnRIZWFkZXJLZXlzLCBtX211bHRpcGFydGhlYWRlclZh
bHVlcywgJk5ldHdvcmtKb2I6OmhhbmRsZU5vdGlmeU11bHRpcGFydEhlYWRlclJlY2VpdmVkKSkK
KyAgICAgICAgcmV0dXJuOwogCiAgICAgLy8gT25seSBwcm9jZXNzIDMyayBvZiBkYXRhIGF0IGEg
dGltZSB0byBhdm9pZCBibG9ja2luZyB0aGUgZXZlbnQgbG9vcCBmb3IgdG9vIGxvbmcuCiAgICAg
c3RhdGljIGNvbnN0IHVuc2lnbmVkIG1heERhdGEgPSAzMiAqIDEwMjQ7CmRpZmYgLS1naXQgYS9T
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvRGVmZXJyZWREYXRhLmgg
Yi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvRGVmZXJyZWREYXRh
LmgKaW5kZXggZjNhMTE1Y2FiYjAwMDg4Mzg2OWRkMmNhYjRmMWM2MDAyOGY3NzUzNS4uYjVkZTdh
OThkZTZhOTI2ZmM0NmYyMTQ5NTRhZThjZWIzZjU1ZGZjYSAxMDA2NDQKLS0tIGEvU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vbmV0d29yay9ibGFja2JlcnJ5L0RlZmVycmVkRGF0YS5oCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvYmxhY2tiZXJyeS9EZWZlcnJlZERhdGEuaApA
QCAtNTMsMTMgKzUzLDE0IEBAIHB1YmxpYzoKICAgICB2b2lkIGRlZmVyT3BlbihpbnQgc3RhdHVz
LCBjb25zdCBTdHJpbmcmIG1lc3NhZ2UpOwogICAgIHZvaWQgZGVmZXJXTUxPdmVycmlkZSgpOwog
ICAgIHZvaWQgZGVmZXJIZWFkZXJSZWNlaXZlZChjb25zdCBTdHJpbmcmIGtleSwgY29uc3QgU3Ry
aW5nJiB2YWx1ZSk7CisgICAgdm9pZCBkZWZlck11bHRpcGFydEhlYWRlclJlY2VpdmVkKGNvbnN0
IFN0cmluZyYga2V5LCBjb25zdCBTdHJpbmcmIHZhbHVlKTsKICAgICB2b2lkIGRlZmVyRGF0YVJl
Y2VpdmVkKGNvbnN0IGNoYXIqIGJ1Ziwgc2l6ZV90IGxlbik7CiAgICAgdm9pZCBkZWZlckRhdGFT
ZW50KHVuc2lnbmVkIGxvbmcgbG9uZyBieXRlc1NlbnQsIHVuc2lnbmVkIGxvbmcgbG9uZyB0b3Rh
bEJ5dGVzVG9CZVNlbnQpOwogICAgIHZvaWQgZGVmZXJDbG9zZShpbnQgc3RhdHVzKTsKIAogICAg
IGJvb2wgaGFzRGVmZXJyZWREYXRhKCkgY29uc3QKICAgICB7Ci0gICAgICAgIHJldHVybiBtX2Rl
ZmVycmVkU3RhdHVzUmVjZWl2ZWQgfHwgbV9kZWZlcnJlZFdNTE92ZXJyaWRlIHx8ICFtX2hlYWRl
cktleXMuaXNFbXB0eSgpIHx8ICFtX2RhdGFTZWdtZW50cy5pc0VtcHR5KCkgfHwgbV9kZWZlcnJl
ZENsb3NlOworICAgICAgICByZXR1cm4gbV9kZWZlcnJlZFN0YXR1c1JlY2VpdmVkIHx8IG1fZGVm
ZXJyZWRXTUxPdmVycmlkZSB8fCAhbV9oZWFkZXJLZXlzLmlzRW1wdHkoKSB8fCAhbV9tdWx0aXBh
cnRIZWFkZXJLZXlzLmlzRW1wdHkoKSB8fCAhbV9kYXRhU2VnbWVudHMuaXNFbXB0eSgpIHx8IG1f
ZGVmZXJyZWRDbG9zZTsKICAgICB9CiAKICAgICB2b2lkIHByb2Nlc3NEZWZlcnJlZERhdGEoKTsK
QEAgLTcxLDYgKzcyLDExIEBAIHB1YmxpYzoKICAgICB9CiAKIHByaXZhdGU6CisgICAgdHlwZWRl
ZiB2b2lkIChOZXR3b3JrSm9iOjoqSGFuZGxlSGVhZGVyc0Z1bmN0aW9uKShjb25zdCBTdHJpbmcm
IGtleSwgY29uc3QgU3RyaW5nJiB2YWx1ZSk7CisKKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIHRo
ZSBqb2IgaXMgZGVmZXJyZWQgb3IgY2FuY2VsZWQsIG90aGVyd2lzZSByZXR1cm5zIHRydWUuCisg
ICAgYm9vbCBwcm9jZXNzSGVhZGVycyhWZWN0b3I8U3RyaW5nPiYgaGVhZGVyS2V5cywgVmVjdG9y
PFN0cmluZz4mIGhlYWRlclZhbHVlcywgSGFuZGxlSGVhZGVyc0Z1bmN0aW9uKTsKKwogICAgIHZv
aWQgZmlyZVByb2Nlc3NEYXRhVGltZXIoVGltZXI8RGVmZXJyZWREYXRhPiopOwogICAgIE5ldHdv
cmtKb2ImIG1fam9iOwogICAgIFRpbWVyPERlZmVycmVkRGF0YT4gbV9wcm9jZXNzRGF0YVRpbWVy
OwpAQCAtODAsNiArODYsOCBAQCBwcml2YXRlOgogICAgIGJvb2wgbV9kZWZlcnJlZFdNTE92ZXJy
aWRlOwogICAgIFZlY3RvcjxTdHJpbmc+IG1faGVhZGVyS2V5czsKICAgICBWZWN0b3I8U3RyaW5n
PiBtX2hlYWRlclZhbHVlczsKKyAgICBWZWN0b3I8U3RyaW5nPiBtX211bHRpcGFydEhlYWRlcktl
eXM7CisgICAgVmVjdG9yPFN0cmluZz4gbV9tdWx0aXBhcnRoZWFkZXJWYWx1ZXM7CiAgICAgRGVx
dWU8VmVjdG9yPGNoYXI+ID4gbV9kYXRhU2VnbWVudHM7CiAgICAgdW5zaWduZWQgbG9uZyBsb25n
IG1fYnl0ZXNTZW50OwogICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBtX3RvdGFsQnl0ZXNUb0JlU2Vu
dDsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvYmxhY2tiZXJy
eS9OZXR3b3JrSm9iLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvYmxhY2ti
ZXJyeS9OZXR3b3JrSm9iLmNwcAppbmRleCA5ODRiYzEyZDcwYmFhMjk3NjdiNDUyNjBhNGNhNGVh
NDhiOTdiMWUwLi41YWI5MjI2MzVhZWFjMWE5NWJmNmMzMmI4NjY0NjFjMmNiM2VhNGVjIDEwMDY0
NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvTmV0d29y
a0pvYi5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9ibGFja2JlcnJ5
L05ldHdvcmtKb2IuY3BwCkBAIC0zNyw2ICszNyw3IEBACiAjaW5jbHVkZSA8QmxhY2tCZXJyeVBs
YXRmb3JtTG9nLmg+CiAjaW5jbHVkZSA8QmxhY2tCZXJyeVBsYXRmb3JtV2ViS2l0Q3JlZGl0cy5o
PgogI2luY2x1ZGUgPEJ1aWxkSW5mb3JtYXRpb24uaD4KKyNpbmNsdWRlIDxuZXR3b3JrL011bHRp
cGFydFN0cmVhbS5oPgogI2luY2x1ZGUgPG5ldHdvcmsvTmV0d29ya1JlcXVlc3QuaD4KICNpbmNs
dWRlIDxuZXR3b3JrL05ldHdvcmtTdHJlYW1GYWN0b3J5Lmg+CiAjaW5jbHVkZSA8d3RmL0FTQ0lJ
Q1R5cGUuaD4KQEAgLTI3OSw2ICsyODAsMTQgQEAgdm9pZCBOZXR3b3JrSm9iOjpub3RpZnlIZWFk
ZXJSZWNlaXZlZChjb25zdCBjaGFyKiBrZXksIGNvbnN0IGNoYXIqIHZhbHVlKQogICAgIH0KIH0K
IAordm9pZCBOZXR3b3JrSm9iOjpub3RpZnlNdWx0aXBhcnRIZWFkZXJSZWNlaXZlZChjb25zdCBj
aGFyKiBrZXksIGNvbnN0IGNoYXIqIHZhbHVlKQoreworICAgIGlmIChzaG91bGREZWZlckxvYWRp
bmcoKSkKKyAgICAgICAgbV9kZWZlcnJlZERhdGEuZGVmZXJNdWx0aXBhcnRIZWFkZXJSZWNlaXZl
ZChrZXksIHZhbHVlKTsKKyAgICBlbHNlCisgICAgICAgIGhhbmRsZU5vdGlmeU11bHRpcGFydEhl
YWRlclJlY2VpdmVkKGtleSwgdmFsdWUpOworfQorCiB2b2lkIE5ldHdvcmtKb2I6Om5vdGlmeVN0
cmluZ0hlYWRlclJlY2VpdmVkKGNvbnN0IFN0cmluZyYga2V5LCBjb25zdCBTdHJpbmcmIHZhbHVl
KQogewogICAgIGlmIChzaG91bGREZWZlckxvYWRpbmcoKSkKQEAgLTMxNSw2ICszMjQsNDQgQEAg
dm9pZCBOZXR3b3JrSm9iOjpoYW5kbGVOb3RpZnlIZWFkZXJSZWNlaXZlZChjb25zdCBTdHJpbmcm
IGtleSwgY29uc3QgU3RyaW5nJiB2YWwKICAgICBtX3Jlc3BvbnNlLnNldEhUVFBIZWFkZXJGaWVs
ZChrZXksIHZhbHVlKTsKIH0KIAordm9pZCBOZXR3b3JrSm9iOjpoYW5kbGVOb3RpZnlNdWx0aXBh
cnRIZWFkZXJSZWNlaXZlZChjb25zdCBTdHJpbmcmIGtleSwgY29uc3QgU3RyaW5nJiB2YWx1ZSkK
K3sKKyAgICBpZiAoIW1fbXVsdGlwYXJ0UmVzcG9uc2UpIHsKKyAgICAgICAgLy8gQ3JlYXRlIGEg
bmV3IHJlc3BvbnNlIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCBzZXQgb2YgaGVhZGVycyArIHRoZQor
ICAgICAgICAvLyByZXBsYWNlbWVudCBoZWFkZXJzLiBXZSBvbmx5IHJlcGxhY2UgdGhlIHNhbWUg
ZmV3IGhlYWRlcnMgdGhhdCBnZWNrbworICAgICAgICAvLyBkb2VzLiBTZWUgbmV0d2Vyay9zdHJl
YW1jb252L2NvbnZlcnRlcnMvbnNNdWx0aU1peGVkQ29udi5jcHAuCisgICAgICAgIG1fbXVsdGlw
YXJ0UmVzcG9uc2UgPSBhZG9wdFB0cihuZXcgUmVzb3VyY2VSZXNwb25zZSk7CisgICAgICAgIG1f
bXVsdGlwYXJ0UmVzcG9uc2UtPnNldFVSTChtX3Jlc3BvbnNlLnVybCgpKTsKKworICAgICAgICAv
LyBUaGUgbGlzdCBvZiBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6cmVwbGFjZUhlYWRlcnMgdGhhdCB3
ZSBkbyBub3QgY29weSBmcm9tIHRoZSBvcmlnaW5hbAorICAgICAgICAvLyByZXNwb25zZSB3aGVu
IGdlbmVyYXRpbmcgYSByZXNwb25zZS4KKyAgICAgICAgY29uc3QgV2ViQ29yZTo6SFRUUEhlYWRl
ck1hcCYgbWFwID0gbV9yZXNwb25zZS5odHRwSGVhZGVyRmllbGRzKCk7CisKKyAgICAgICAgZm9y
IChXZWJDb3JlOjpIVFRQSGVhZGVyTWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IG1hcC5iZWdpbigp
OyBpdCAhPSBtYXAuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgIGJvb2wgbmVlZHNBZGQgPSB0
cnVlOworICAgICAgICAgICAgaW50IHJlcGxhY2VIZWRlYXJJbmRleCA9IDA7CisgICAgICAgICAg
ICB3aGlsZSAoQmxhY2tCZXJyeTo6UGxhdGZvcm06Ok11bHRpcGFydFN0cmVhbTo6cmVwbGFjZUhl
YWRlcnNbcmVwbGFjZUhlZGVhckluZGV4XSkgeworICAgICAgICAgICAgICAgIGlmIChpdC0+Zmly
c3QubG93ZXIoKSA9PSBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TXVsdGlwYXJ0U3RyZWFtOjpyZXBs
YWNlSGVhZGVyc1tyZXBsYWNlSGVkZWFySW5kZXhdKSB7CisgICAgICAgICAgICAgICAgICAgIG5l
ZWRzQWRkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgICAgICByZXBsYWNlSGVkZWFySW5kZXgrKzsKKyAgICAgICAgICAg
IH0KKyAgICAgICAgICAgIGlmIChuZWVkc0FkZCkKKyAgICAgICAgICAgICAgICBtX211bHRpcGFy
dFJlc3BvbnNlLT5zZXRIVFRQSGVhZGVyRmllbGQoaXQtPmZpcnN0LCBpdC0+c2Vjb25kKTsKKyAg
ICAgICAgfQorCisgICAgICAgIG1fbXVsdGlwYXJ0UmVzcG9uc2UtPnNldElzTXVsdGlwYXJ0UGF5
bG9hZCh0cnVlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoa2V5Lmxvd2VyKCkgPT0gImNv
bnRlbnQtdHlwZSIpIHsKKyAgICAgICAgICAgIFN0cmluZyBjb250ZW50VHlwZSA9IHZhbHVlLmxv
d2VyKCk7CisgICAgICAgICAgICBtX211bHRpcGFydFJlc3BvbnNlLT5zZXRNaW1lVHlwZShleHRy
YWN0TUlNRVR5cGVGcm9tTWVkaWFUeXBlKGNvbnRlbnRUeXBlKSk7CisgICAgICAgICAgICBtX211
bHRpcGFydFJlc3BvbnNlLT5zZXRUZXh0RW5jb2RpbmdOYW1lKGV4dHJhY3RDaGFyc2V0RnJvbU1l
ZGlhVHlwZShjb250ZW50VHlwZSkpOworICAgICAgICB9CisgICAgICAgIG1fbXVsdGlwYXJ0UmVz
cG9uc2UtPnNldEhUVFBIZWFkZXJGaWVsZChrZXksIHZhbHVlKTsKKyAgICB9Cit9CisKIHZvaWQg
TmV0d29ya0pvYjo6aGFuZGxlU2V0Q29va2llSGVhZGVyKGNvbnN0IFN0cmluZyYgdmFsdWUpCiB7
CiAgICAgS1VSTCB1cmwgPSBtX3Jlc3BvbnNlLnVybCgpOwpAQCAtMzUwLDEzICszOTcsMTAgQEAg
dm9pZCBOZXR3b3JrSm9iOjpoYW5kbGVOb3RpZnlEYXRhUmVjZWl2ZWQoY29uc3QgY2hhciogYnVm
LCBzaXplX3QgbGVuKQogCiAgICAgaWYgKHNob3VsZFNlbmRDbGllbnREYXRhKCkpIHsKICAgICAg
ICAgc2VuZFJlc3BvbnNlSWZOZWVkZWQoKTsKKyAgICAgICAgc2VuZE11bHRpcGFydFJlc3BvbnNl
SWZOZWVkZWQoKTsKICAgICAgICAgaWYgKGNsaWVudElzT2soKSkgewotICAgICAgICAgICAgaWYg
KG1fbXVsdGlwYXJ0RGVsZWdhdGUpCi0gICAgICAgICAgICAgICAgbV9tdWx0aXBhcnREZWxlZ2F0
ZS0+b25SZWNlaXZlZERhdGEoYnVmLCBsZW4sIGxlbik7Ci0gICAgICAgICAgICBlbHNlIHsKLSAg
ICAgICAgICAgICAgICBSZWN1cnNpb25HdWFyZCBndWFyZChtX2NhbGxpbmdDbGllbnQpOwotICAg
ICAgICAgICAgICAgIG1faGFuZGxlLT5jbGllbnQoKS0+ZGlkUmVjZWl2ZURhdGEobV9oYW5kbGUu
Z2V0KCksIGJ1ZiwgbGVuLCBsZW4pOwotICAgICAgICAgICB9CisgICAgICAgICAgICBSZWN1cnNp
b25HdWFyZCBndWFyZChtX2NhbGxpbmdDbGllbnQpOworICAgICAgICAgICAgbV9oYW5kbGUtPmNs
aWVudCgpLT5kaWRSZWNlaXZlRGF0YShtX2hhbmRsZS5nZXQoKSwgYnVmLCBsZW4sIGxlbik7CiAg
ICAgICAgIH0KICAgICB9CiAKQEAgLTQxOSw4ICs0NjMsNiBAQCB2b2lkIE5ldHdvcmtKb2I6Omhh
bmRsZU5vdGlmeUNsb3NlKGludCBzdGF0dXMpCiAKICAgICAgICAgICAgIHNlbmRSZXNwb25zZUlm
TmVlZGVkKCk7CiAgICAgICAgICAgICBpZiAoY2xpZW50SXNPaygpKSB7Ci0gICAgICAgICAgICAg
ICAgaWYgKG1fbXVsdGlwYXJ0RGVsZWdhdGUpCi0gICAgICAgICAgICAgICAgICAgIG1fbXVsdGlw
YXJ0RGVsZWdhdGUtPm9uQ29tcGxldGVkUmVxdWVzdCgpOwogCiAgICAgICAgICAgICAgICAgUmVj
dXJzaW9uR3VhcmQgZ3VhcmQobV9jYWxsaW5nQ2xpZW50KTsKICAgICAgICAgICAgICAgICBpZiAo
aXNFcnJvcihtX2V4dGVuZGVkU3RhdHVzQ29kZSkgJiYgIW1fZGF0YVJlY2VpdmVkKSB7CkBAIC00
MzksNyArNDgxLDcgQEAgdm9pZCBOZXR3b3JrSm9iOjpoYW5kbGVOb3RpZnlDbG9zZShpbnQgc3Rh
dHVzKQogCiAgICAgLy8gRGV0YWNoIGZyb20gdGhlIFJlc291cmNlSGFuZGxlIGluIGFueSBjYXNl
LgogICAgIG1faGFuZGxlID0gMDsKLSAgICBtX211bHRpcGFydERlbGVnYXRlID0gbnVsbHB0cjsK
KyAgICBtX211bHRpcGFydFJlc3BvbnNlID0gbnVsbHB0cjsKIH0KIAogYm9vbCBOZXR3b3JrSm9i
OjpzaG91bGROb3RpZnlDbGllbnRGaW5pc2hlZCgpCkBAIC00ODcsNyArNTI5LDcgQEAgYm9vbCBO
ZXR3b3JrSm9iOjpzdGFydE5ld0pvYldpdGhSZXF1ZXN0KFJlc291cmNlUmVxdWVzdCYgbmV3UmVx
dWVzdCwgYm9vbCBpbmNyZWEKICAgICAvLyBQYXNzIHRoZSBvd25lcnNoaXAgb2YgdGhlIFJlc291
cmNlSGFuZGxlIHRvIHRoZSBuZXcgTmV0d29ya0pvYi4KICAgICBSZWZQdHI8UmVzb3VyY2VIYW5k
bGU+IGhhbmRsZSA9IG1faGFuZGxlOwogICAgIG1faGFuZGxlID0gMDsKLSAgICBtX211bHRpcGFy
dERlbGVnYXRlID0gbnVsbHB0cjsKKyAgICBtX211bHRpcGFydFJlc3BvbnNlID0gbnVsbHB0cjsK
IAogICAgIE5ldHdvcmtNYW5hZ2VyOjppbnN0YW5jZSgpLT5zdGFydEpvYihtX3BsYXllcklkLAog
ICAgICAgICBtX3BhZ2VHcm91cE5hbWUsCkBAIC01ODIsMTMgKzYyNCwxNCBAQCB2b2lkIE5ldHdv
cmtKb2I6OnNlbmRSZXNwb25zZUlmTmVlZGVkKCkKICAgICBpZiAoY2xpZW50SXNPaygpKSB7CiAg
ICAgICAgIFJlY3Vyc2lvbkd1YXJkIGd1YXJkKG1fY2FsbGluZ0NsaWVudCk7CiAgICAgICAgIG1f
aGFuZGxlLT5jbGllbnQoKS0+ZGlkUmVjZWl2ZVJlc3BvbnNlKG1faGFuZGxlLmdldCgpLCBtX3Jl
c3BvbnNlKTsKKyAgICB9Cit9CiAKLSAgICAgICAgaWYgKG1pbWVUeXBlID09ICJtdWx0aXBhcnQv
eC1taXhlZC1yZXBsYWNlIikgewotICAgICAgICAgICAgc3RkOjpzdHJpbmcgYm91bmRhcnk7Ci0g
ICAgICAgICAgICBib29sIGlzUmVhZEJvdW5kYXJ5ID0gTXVsdGlwYXJ0UmVzcG9uc2VEZWxlZ2F0
ZTo6cmVhZE11bHRpcGFydEJvdW5kYXJ5KG1fY29udGVudFR5cGUubG93ZXIoKS51dGY4KCkuZGF0
YSgpLCBib3VuZGFyeSk7Ci0gICAgICAgICAgICBpZiAoaXNSZWFkQm91bmRhcnkgJiYgIWJvdW5k
YXJ5LmVtcHR5KCkpCi0gICAgICAgICAgICAgICAgbV9tdWx0aXBhcnREZWxlZ2F0ZSA9IGFkb3B0
UHRyKG5ldyBNdWx0aXBhcnRSZXNwb25zZURlbGVnYXRlKG1faGFuZGxlLCBtX3Jlc3BvbnNlLCBi
b3VuZGFyeSkpOwotICAgICAgICB9Cit2b2lkIE5ldHdvcmtKb2I6OnNlbmRNdWx0aXBhcnRSZXNw
b25zZUlmTmVlZGVkKCkKK3sKKyAgICBpZiAobV9tdWx0aXBhcnRSZXNwb25zZSAmJiBjbGllbnRJ
c09rKCkpIHsKKyAgICAgICAgbV9oYW5kbGUtPmNsaWVudCgpLT5kaWRSZWNlaXZlUmVzcG9uc2Uo
bV9oYW5kbGUuZ2V0KCksICptX211bHRpcGFydFJlc3BvbnNlKTsKKyAgICAgICAgbV9tdWx0aXBh
cnRSZXNwb25zZSA9IG51bGxwdHI7CiAgICAgfQogfQogCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvTmV0d29ya0pvYi5oIGIvU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vbmV0d29yay9ibGFja2JlcnJ5L05ldHdvcmtKb2IuaAppbmRleCA1ZDJk
Yzg3YzAwMTQ5NGFkMzdhOGNlODhhOTcwNjQyZmNhMjQ4NjIyLi4zNzgxNjEwZGYxYzJhMWQ0YmI5
OGYzYTYzN2U3OGJmMDZlMWZkMzhlIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9uZXR3b3JrL2JsYWNrYmVycnkvTmV0d29ya0pvYi5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL25ldHdvcmsvYmxhY2tiZXJyeS9OZXR3b3JrSm9iLmgKQEAgLTIwLDcgKzIwLDYgQEAK
ICNkZWZpbmUgTmV0d29ya0pvYl9oCiAKICNpbmNsdWRlICJEZWZlcnJlZERhdGEuaCIKLSNpbmNs
dWRlICJNdWx0aXBhcnRSZXNwb25zZURlbGVnYXRlLmgiCiAjaW5jbHVkZSAiUGxhdGZvcm1TdHJp
bmcuaCIKICNpbmNsdWRlICJQcm90ZWN0aW9uU3BhY2UuaCIKICNpbmNsdWRlICJSZXNvdXJjZUhh
bmRsZS5oIgpAQCAtNzAsOSArNjksMTEgQEAgcHVibGljOgogICAgIHZpcnR1YWwgdm9pZCBub3Rp
ZnlXTUxPdmVycmlkZSgpOwogICAgIHZvaWQgaGFuZGxlTm90aWZ5V01MT3ZlcnJpZGUoKSB7IG1f
cmVzcG9uc2Uuc2V0SXNXTUwodHJ1ZSk7IH0KICAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5SGVhZGVy
UmVjZWl2ZWQoY29uc3QgY2hhcioga2V5LCBjb25zdCBjaGFyKiB2YWx1ZSk7CisgICAgdmlydHVh
bCB2b2lkIG5vdGlmeU11bHRpcGFydEhlYWRlclJlY2VpdmVkKGNvbnN0IGNoYXIqIGtleSwgY29u
c3QgY2hhciogdmFsdWUpOwogICAgIC8vIEV4aXN0cyBvbmx5IHRvIHJlc29sdmUgYW1iaWd1aXR5
IGJldHdlZW4gY2hhciogYW5kIFN0cmluZyBwYXJhbWV0ZXJzCiAgICAgdm9pZCBub3RpZnlTdHJp
bmdIZWFkZXJSZWNlaXZlZChjb25zdCBTdHJpbmcmIGtleSwgY29uc3QgU3RyaW5nJiB2YWx1ZSk7
CiAgICAgdm9pZCBoYW5kbGVOb3RpZnlIZWFkZXJSZWNlaXZlZChjb25zdCBTdHJpbmcmIGtleSwg
Y29uc3QgU3RyaW5nJiB2YWx1ZSk7CisgICAgdm9pZCBoYW5kbGVOb3RpZnlNdWx0aXBhcnRIZWFk
ZXJSZWNlaXZlZChjb25zdCBTdHJpbmcmIGtleSwgY29uc3QgU3RyaW5nJiB2YWx1ZSk7CiAgICAg
dm9pZCBoYW5kbGVTZXRDb29raWVIZWFkZXIoY29uc3QgU3RyaW5nJiB2YWx1ZSk7CiAgICAgdm9p
ZCBub3RpZnlEYXRhUmVjZWl2ZWRQbGFpbihjb25zdCBjaGFyKiBidWYsIHNpemVfdCBsZW4pOwog
ICAgIHZvaWQgaGFuZGxlTm90aWZ5RGF0YVJlY2VpdmVkKGNvbnN0IGNoYXIqIGJ1Ziwgc2l6ZV90
IGxlbik7CkBAIC0xMDgsNiArMTA5LDcgQEAgcHJpdmF0ZToKIAogICAgIC8vIFRoaXMgY2FuIGNh
dXNlIG1fY2FuY2VsbGVkIHRvIGJlIHNldCB0byB0cnVlLCBpZiBpdCBwYXNzZXMgdXAgYW4gZXJy
b3IgdG8gbV9oYW5kbGUtPmNsaWVudCgpIHdoaWNoIGNhdXNlcyB0aGUgam9iIHRvIGJlIGNhbmNl
bGxlZAogICAgIHZvaWQgc2VuZFJlc3BvbnNlSWZOZWVkZWQoKTsKKyAgICB2b2lkIHNlbmRNdWx0
aXBhcnRSZXNwb25zZUlmTmVlZGVkKCk7CiAKICAgICB2b2lkIGZpcmVMb2FkRGF0YVRpbWVyKFRp
bWVyPE5ldHdvcmtKb2I+KikKICAgICB7CkBAIC0xNDksNyArMTUxLDcgQEAgcHJpdmF0ZToKICAg
ICBSZXNvdXJjZVJlc3BvbnNlIG1fcmVzcG9uc2U7CiAgICAgVGltZXI8TmV0d29ya0pvYj4gbV9s
b2FkRGF0YVRpbWVyOwogICAgIFRpbWVyPE5ldHdvcmtKb2I+IG1fbG9hZEFib3V0VGltZXI7Ci0g
ICAgT3duUHRyPE11bHRpcGFydFJlc3BvbnNlRGVsZWdhdGU+IG1fbXVsdGlwYXJ0RGVsZWdhdGU7
CisgICAgT3duUHRyPFJlc291cmNlUmVzcG9uc2U+IG1fbXVsdGlwYXJ0UmVzcG9uc2U7CiAgICAg
VGltZXI8TmV0d29ya0pvYj4gbV9kZWxldGVKb2JUaW1lcjsKICAgICBTdHJpbmcgbV9jb250ZW50
VHlwZTsKICAgICBTdHJpbmcgbV9jb250ZW50RGlzcG9zaXRpb247Cg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>120128</attachid>
            <date>2011-12-20 17:53:49 -0800</date>
            <delta_ts>2011-12-21 18:22:20 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-73533-20111221095346.patch</filename>
            <type>text/plain</type>
            <size>14356</size>
            <attacher name="Chris.Guan">logingx</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTAzMjk3CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggODNiYmI2ZTllZTM3NGJm
YWNiMTA0MzcxNDJlYWVkMjNhZDMwMzU3Yi4uOWEzNmUwMjBhMmMzNDJiN2ZhYzdmMjBjZWY3NmI1
NGExYTdiNzc5YyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDMxIEBACisyMDExLTEyLTE5ICBDaHJp
cyBHdWFuICA8Y2hyaXMuZ3VhbkB0b3JjaG1vYmlsZS5jb20uY24+CisKKyAgICAgICAgVXBzdHJl
YW0gdGhlIE11bHRpcGFydCBmZWF0dXJlIGluIEJsYWNrYmVycnkgcG9ydAorICAgICAgICBodHRw
czovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM1MzMKKworICAgICAgICBSZXZp
ZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBJIHJlZmFjdG9yZWQgTXVsdGlwYXJ0
IGNvZGUgb2YgQmxhY2tiZXJyeSBwb3J0LiBNb3ZlZCBNdWx0aXBhcnQgaW50bworICAgICAgICBC
bGFja2VycnkgbmV0d29yayBsYXllciBhbmQgcmVtb3ZlZCB0aGUgZGVwZW5kZW5jZSBvZiBzdGQ6
OnN0cmluZy4KKworICAgICAgICBJbml0aWFsIHVwc3RyZWFtLCBubyBuZXcgdGVzdCBjYXNlcy4K
KworICAgICAgICAqIHBsYXRmb3JtL25ldHdvcmsvYmxhY2tiZXJyeS9EZWZlcnJlZERhdGEuY3Bw
OgorICAgICAgICAoV2ViQ29yZTo6RGVmZXJyZWREYXRhOjpkZWZlck11bHRpcGFydEhlYWRlclJl
Y2VpdmVkKToKKyAgICAgICAgKFdlYkNvcmU6OkRlZmVycmVkRGF0YTo6cHJvY2Vzc0hlYWRlcnMp
OgorICAgICAgICAoV2ViQ29yZTo6RGVmZXJyZWREYXRhOjpwcm9jZXNzRGVmZXJyZWREYXRhKToK
KyAgICAgICAgKiBwbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvRGVmZXJyZWREYXRhLmg6Cisg
ICAgICAgIChXZWJDb3JlOjpEZWZlcnJlZERhdGE6Omhhc0RlZmVycmVkRGF0YSk6CisgICAgICAg
ICogcGxhdGZvcm0vbmV0d29yay9ibGFja2JlcnJ5L05ldHdvcmtKb2IuY3BwOgorICAgICAgICAo
V2ViQ29yZTo6TmV0d29ya0pvYjo6bm90aWZ5TXVsdGlwYXJ0SGVhZGVyUmVjZWl2ZWQpOgorICAg
ICAgICAoV2ViQ29yZTo6TmV0d29ya0pvYjo6aGFuZGxlTm90aWZ5TXVsdGlwYXJ0SGVhZGVyUmVj
ZWl2ZWQpOgorICAgICAgICAoV2ViQ29yZTo6TmV0d29ya0pvYjo6aGFuZGxlTm90aWZ5RGF0YVJl
Y2VpdmVkKToKKyAgICAgICAgKFdlYkNvcmU6Ok5ldHdvcmtKb2I6OmhhbmRsZU5vdGlmeUNsb3Nl
KToKKyAgICAgICAgKFdlYkNvcmU6Ok5ldHdvcmtKb2I6OnN0YXJ0TmV3Sm9iV2l0aFJlcXVlc3Qp
OgorICAgICAgICAoV2ViQ29yZTo6TmV0d29ya0pvYjo6c2VuZFJlc3BvbnNlSWZOZWVkZWQpOgor
ICAgICAgICAoV2ViQ29yZTo6TmV0d29ya0pvYjo6c2VuZE11bHRpcGFydFJlc3BvbnNlSWZOZWVk
ZWQpOgorICAgICAgICAqIHBsYXRmb3JtL25ldHdvcmsvYmxhY2tiZXJyeS9OZXR3b3JrSm9iLmg6
CisKIDIwMTEtMTItMTkgIFNhbSBXZWluaWcgIDxzYW1Ad2Via2l0Lm9yZz4KIAogICAgICAgICBN
b3JlIFBsYXRmb3JtRXZlbnQgY2xlYW51cApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vbmV0d29yay9ibGFja2JlcnJ5L0RlZmVycmVkRGF0YS5jcHAgYi9Tb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvRGVmZXJyZWREYXRhLmNwcAppbmRleCBkNGE4
YmVmYjAxOTZjZThlNjQ2MDJhMWE1OGVmODQzNjU2ZjU4MWQ5Li5kZmUxOGQ4YjdjNDk1N2VkY2Mz
YjAwYTJkYjM0ZWIyYTQzMjVmYjU3IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9uZXR3b3JrL2JsYWNrYmVycnkvRGVmZXJyZWREYXRhLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvRGVmZXJyZWREYXRhLmNwcApAQCAtNTUsNiAr
NTUsMTIgQEAgdm9pZCBEZWZlcnJlZERhdGE6OmRlZmVySGVhZGVyUmVjZWl2ZWQoY29uc3QgU3Ry
aW5nJiBrZXksIGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgbV9oZWFkZXJWYWx1ZXMuYXBwZW5k
KHZhbHVlKTsKIH0KIAordm9pZCBEZWZlcnJlZERhdGE6OmRlZmVyTXVsdGlwYXJ0SGVhZGVyUmVj
ZWl2ZWQoY29uc3QgU3RyaW5nJiBrZXksIGNvbnN0IFN0cmluZyYgdmFsdWUpCit7CisgICAgbV9t
dWx0aXBhcnRIZWFkZXJLZXlzLmFwcGVuZChrZXkpOworICAgIG1fbXVsdGlwYXJ0aGVhZGVyVmFs
dWVzLmFwcGVuZCh2YWx1ZSk7Cit9CisKIHZvaWQgRGVmZXJyZWREYXRhOjpkZWZlckRhdGFTZW50
KHVuc2lnbmVkIGxvbmcgbG9uZyBieXRlc1NlbnQsIHVuc2lnbmVkIGxvbmcgbG9uZyB0b3RhbEJ5
dGVzVG9CZVNlbnQpCiB7CiAgICAgbV9ieXRlc1NlbnQgPSBieXRlc1NlbnQ7CkBAIC03Myw2ICs3
OSwzMCBAQCB2b2lkIERlZmVycmVkRGF0YTo6ZGVmZXJDbG9zZShpbnQgc3RhdHVzKQogICAgIG1f
ZGVmZXJyZWRDbG9zZSA9IHRydWU7CiB9CiAKK2Jvb2wgRGVmZXJyZWREYXRhOjpwcm9jZXNzSGVh
ZGVycyhWZWN0b3I8U3RyaW5nPiYgaGVhZGVyS2V5cywgVmVjdG9yPFN0cmluZz4mIGhlYWRlclZh
bHVlcywgSGFuZGxlSGVhZGVyc0Z1bmN0aW9uIGZ1bmN0aW9uKQoreworICAgIHNpemVfdCBudW1I
ZWFkZXJzID0gaGVhZGVyS2V5cy5zaXplKCk7CisgICAgQVNTRVJUKGhlYWRlclZhbHVlcy5zaXpl
KCkgPT0gbnVtSGVhZGVycyk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1IZWFkZXJz
OyArK2kpIHsKKyAgICAgICAgKG1fam9iLipmdW5jdGlvbikoaGVhZGVyS2V5c1tpXSwgaGVhZGVy
VmFsdWVzW2ldKTsKKworICAgICAgICBpZiAobV9qb2IuaXNEZWZlcnJpbmdMb2FkaW5nKCkpIHsK
KyAgICAgICAgICAgIC8vIFJlbW92ZSBhbGwgdGhlIGhlYWRlcnMgdGhhdCBoYXZlIGFscmVhZHkg
YmVlbiBwcm9jZXNzZWQuCisgICAgICAgICAgICBoZWFkZXJLZXlzLnJlbW92ZSgwLCBpICsgMSk7
CisgICAgICAgICAgICBoZWFkZXJWYWx1ZXMucmVtb3ZlKDAsIGkgKyAxKTsKKyAgICAgICAgICAg
IHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtX2pvYi5pc0NhbmNlbGxl
ZCgpKSB7CisgICAgICAgICAgICAvLyBEb24ndCBib3RoZXIgcmVtb3ZpbmcgaGVhZGVyczsgam9i
IHdpbGwgYmUgZGVsZXRlZC4KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQor
ICAgIH0KKyAgICBoZWFkZXJLZXlzLmNsZWFyKCk7CisgICAgaGVhZGVyVmFsdWVzLmNsZWFyKCk7
CisgICAgcmV0dXJuIHRydWU7Cit9CisKIHZvaWQgRGVmZXJyZWREYXRhOjpwcm9jZXNzRGVmZXJy
ZWREYXRhKCkKIHsKICAgICBpZiAobV9pblByb2Nlc3NEZWZlcnJlZERhdGEpCkBAIC0xMDAsMjUg
KzEzMCw5IEBAIHZvaWQgRGVmZXJyZWREYXRhOjpwcm9jZXNzRGVmZXJyZWREYXRhKCkKICAgICAg
ICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBzaXplX3QgbnVtSGVhZGVycyA9IG1faGVhZGVy
S2V5cy5zaXplKCk7Ci0gICAgQVNTRVJUKG1faGVhZGVyVmFsdWVzLnNpemUoKSA9PSBudW1IZWFk
ZXJzKTsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbnVtSGVhZGVyczsgKytpKSB7Ci0g
ICAgICAgIG1fam9iLmhhbmRsZU5vdGlmeUhlYWRlclJlY2VpdmVkKG1faGVhZGVyS2V5c1tpXSwg
bV9oZWFkZXJWYWx1ZXNbaV0pOwotCi0gICAgICAgIGlmIChtX2pvYi5pc0RlZmVycmluZ0xvYWRp
bmcoKSkgewotICAgICAgICAgICAgLy8gUmVtb3ZlIGFsbCB0aGUgaGVhZGVycyB0aGF0IGhhdmUg
YWxyZWFkeSBiZWVuIHByb2Nlc3NlZC4KLSAgICAgICAgICAgIG1faGVhZGVyS2V5cy5yZW1vdmUo
MCwgaSArIDEpOwotICAgICAgICAgICAgbV9oZWFkZXJWYWx1ZXMucmVtb3ZlKDAsIGkgKyAxKTsK
LSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtX2pvYi5pc0Nh
bmNlbGxlZCgpKSB7Ci0gICAgICAgICAgICAvLyBEb24ndCBib3RoZXIgcmVtb3ZpbmcgaGVhZGVy
czsgam9iIHdpbGwgYmUgZGVsZXRlZC4KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQot
ICAgIH0KLSAgICBtX2hlYWRlcktleXMuY2xlYXIoKTsKLSAgICBtX2hlYWRlclZhbHVlcy5jbGVh
cigpOworICAgIGlmICghcHJvY2Vzc0hlYWRlcnMobV9oZWFkZXJLZXlzLCBtX2hlYWRlclZhbHVl
cywgJk5ldHdvcmtKb2I6OmhhbmRsZU5vdGlmeUhlYWRlclJlY2VpdmVkKQorICAgICAgICB8fCAh
cHJvY2Vzc0hlYWRlcnMobV9tdWx0aXBhcnRIZWFkZXJLZXlzLCBtX211bHRpcGFydGhlYWRlclZh
bHVlcywgJk5ldHdvcmtKb2I6OmhhbmRsZU5vdGlmeU11bHRpcGFydEhlYWRlclJlY2VpdmVkKSkK
KyAgICAgICAgcmV0dXJuOwogCiAgICAgLy8gT25seSBwcm9jZXNzIDMyayBvZiBkYXRhIGF0IGEg
dGltZSB0byBhdm9pZCBibG9ja2luZyB0aGUgZXZlbnQgbG9vcCBmb3IgdG9vIGxvbmcuCiAgICAg
c3RhdGljIGNvbnN0IHVuc2lnbmVkIG1heERhdGEgPSAzMiAqIDEwMjQ7CmRpZmYgLS1naXQgYS9T
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvRGVmZXJyZWREYXRhLmgg
Yi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvRGVmZXJyZWREYXRh
LmgKaW5kZXggZjNhMTE1Y2FiYjAwMDg4Mzg2OWRkMmNhYjRmMWM2MDAyOGY3NzUzNS4uYjVkZTdh
OThkZTZhOTI2ZmM0NmYyMTQ5NTRhZThjZWIzZjU1ZGZjYSAxMDA2NDQKLS0tIGEvU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vbmV0d29yay9ibGFja2JlcnJ5L0RlZmVycmVkRGF0YS5oCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvYmxhY2tiZXJyeS9EZWZlcnJlZERhdGEuaApA
QCAtNTMsMTMgKzUzLDE0IEBAIHB1YmxpYzoKICAgICB2b2lkIGRlZmVyT3BlbihpbnQgc3RhdHVz
LCBjb25zdCBTdHJpbmcmIG1lc3NhZ2UpOwogICAgIHZvaWQgZGVmZXJXTUxPdmVycmlkZSgpOwog
ICAgIHZvaWQgZGVmZXJIZWFkZXJSZWNlaXZlZChjb25zdCBTdHJpbmcmIGtleSwgY29uc3QgU3Ry
aW5nJiB2YWx1ZSk7CisgICAgdm9pZCBkZWZlck11bHRpcGFydEhlYWRlclJlY2VpdmVkKGNvbnN0
IFN0cmluZyYga2V5LCBjb25zdCBTdHJpbmcmIHZhbHVlKTsKICAgICB2b2lkIGRlZmVyRGF0YVJl
Y2VpdmVkKGNvbnN0IGNoYXIqIGJ1Ziwgc2l6ZV90IGxlbik7CiAgICAgdm9pZCBkZWZlckRhdGFT
ZW50KHVuc2lnbmVkIGxvbmcgbG9uZyBieXRlc1NlbnQsIHVuc2lnbmVkIGxvbmcgbG9uZyB0b3Rh
bEJ5dGVzVG9CZVNlbnQpOwogICAgIHZvaWQgZGVmZXJDbG9zZShpbnQgc3RhdHVzKTsKIAogICAg
IGJvb2wgaGFzRGVmZXJyZWREYXRhKCkgY29uc3QKICAgICB7Ci0gICAgICAgIHJldHVybiBtX2Rl
ZmVycmVkU3RhdHVzUmVjZWl2ZWQgfHwgbV9kZWZlcnJlZFdNTE92ZXJyaWRlIHx8ICFtX2hlYWRl
cktleXMuaXNFbXB0eSgpIHx8ICFtX2RhdGFTZWdtZW50cy5pc0VtcHR5KCkgfHwgbV9kZWZlcnJl
ZENsb3NlOworICAgICAgICByZXR1cm4gbV9kZWZlcnJlZFN0YXR1c1JlY2VpdmVkIHx8IG1fZGVm
ZXJyZWRXTUxPdmVycmlkZSB8fCAhbV9oZWFkZXJLZXlzLmlzRW1wdHkoKSB8fCAhbV9tdWx0aXBh
cnRIZWFkZXJLZXlzLmlzRW1wdHkoKSB8fCAhbV9kYXRhU2VnbWVudHMuaXNFbXB0eSgpIHx8IG1f
ZGVmZXJyZWRDbG9zZTsKICAgICB9CiAKICAgICB2b2lkIHByb2Nlc3NEZWZlcnJlZERhdGEoKTsK
QEAgLTcxLDYgKzcyLDExIEBAIHB1YmxpYzoKICAgICB9CiAKIHByaXZhdGU6CisgICAgdHlwZWRl
ZiB2b2lkIChOZXR3b3JrSm9iOjoqSGFuZGxlSGVhZGVyc0Z1bmN0aW9uKShjb25zdCBTdHJpbmcm
IGtleSwgY29uc3QgU3RyaW5nJiB2YWx1ZSk7CisKKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIHRo
ZSBqb2IgaXMgZGVmZXJyZWQgb3IgY2FuY2VsZWQsIG90aGVyd2lzZSByZXR1cm5zIHRydWUuCisg
ICAgYm9vbCBwcm9jZXNzSGVhZGVycyhWZWN0b3I8U3RyaW5nPiYgaGVhZGVyS2V5cywgVmVjdG9y
PFN0cmluZz4mIGhlYWRlclZhbHVlcywgSGFuZGxlSGVhZGVyc0Z1bmN0aW9uKTsKKwogICAgIHZv
aWQgZmlyZVByb2Nlc3NEYXRhVGltZXIoVGltZXI8RGVmZXJyZWREYXRhPiopOwogICAgIE5ldHdv
cmtKb2ImIG1fam9iOwogICAgIFRpbWVyPERlZmVycmVkRGF0YT4gbV9wcm9jZXNzRGF0YVRpbWVy
OwpAQCAtODAsNiArODYsOCBAQCBwcml2YXRlOgogICAgIGJvb2wgbV9kZWZlcnJlZFdNTE92ZXJy
aWRlOwogICAgIFZlY3RvcjxTdHJpbmc+IG1faGVhZGVyS2V5czsKICAgICBWZWN0b3I8U3RyaW5n
PiBtX2hlYWRlclZhbHVlczsKKyAgICBWZWN0b3I8U3RyaW5nPiBtX211bHRpcGFydEhlYWRlcktl
eXM7CisgICAgVmVjdG9yPFN0cmluZz4gbV9tdWx0aXBhcnRoZWFkZXJWYWx1ZXM7CiAgICAgRGVx
dWU8VmVjdG9yPGNoYXI+ID4gbV9kYXRhU2VnbWVudHM7CiAgICAgdW5zaWduZWQgbG9uZyBsb25n
IG1fYnl0ZXNTZW50OwogICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBtX3RvdGFsQnl0ZXNUb0JlU2Vu
dDsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvYmxhY2tiZXJy
eS9OZXR3b3JrSm9iLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvYmxhY2ti
ZXJyeS9OZXR3b3JrSm9iLmNwcAppbmRleCA5ODRiYzEyZDcwYmFhMjk3NjdiNDUyNjBhNGNhNGVh
NDhiOTdiMWUwLi5kYzJlYmE4YmQ2MDYxZDIwYjczOGQ5OTdlZjg4MmY4ZWEzZmVlZjc3IDEwMDY0
NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvTmV0d29y
a0pvYi5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9ibGFja2JlcnJ5
L05ldHdvcmtKb2IuY3BwCkBAIC0zNyw2ICszNyw3IEBACiAjaW5jbHVkZSA8QmxhY2tCZXJyeVBs
YXRmb3JtTG9nLmg+CiAjaW5jbHVkZSA8QmxhY2tCZXJyeVBsYXRmb3JtV2ViS2l0Q3JlZGl0cy5o
PgogI2luY2x1ZGUgPEJ1aWxkSW5mb3JtYXRpb24uaD4KKyNpbmNsdWRlIDxuZXR3b3JrL011bHRp
cGFydFN0cmVhbS5oPgogI2luY2x1ZGUgPG5ldHdvcmsvTmV0d29ya1JlcXVlc3QuaD4KICNpbmNs
dWRlIDxuZXR3b3JrL05ldHdvcmtTdHJlYW1GYWN0b3J5Lmg+CiAjaW5jbHVkZSA8d3RmL0FTQ0lJ
Q1R5cGUuaD4KQEAgLTI3OSw2ICsyODAsMTQgQEAgdm9pZCBOZXR3b3JrSm9iOjpub3RpZnlIZWFk
ZXJSZWNlaXZlZChjb25zdCBjaGFyKiBrZXksIGNvbnN0IGNoYXIqIHZhbHVlKQogICAgIH0KIH0K
IAordm9pZCBOZXR3b3JrSm9iOjpub3RpZnlNdWx0aXBhcnRIZWFkZXJSZWNlaXZlZChjb25zdCBj
aGFyKiBrZXksIGNvbnN0IGNoYXIqIHZhbHVlKQoreworICAgIGlmIChzaG91bGREZWZlckxvYWRp
bmcoKSkKKyAgICAgICAgbV9kZWZlcnJlZERhdGEuZGVmZXJNdWx0aXBhcnRIZWFkZXJSZWNlaXZl
ZChrZXksIHZhbHVlKTsKKyAgICBlbHNlCisgICAgICAgIGhhbmRsZU5vdGlmeU11bHRpcGFydEhl
YWRlclJlY2VpdmVkKGtleSwgdmFsdWUpOworfQorCiB2b2lkIE5ldHdvcmtKb2I6Om5vdGlmeVN0
cmluZ0hlYWRlclJlY2VpdmVkKGNvbnN0IFN0cmluZyYga2V5LCBjb25zdCBTdHJpbmcmIHZhbHVl
KQogewogICAgIGlmIChzaG91bGREZWZlckxvYWRpbmcoKSkKQEAgLTMxNSw2ICszMjQsNDQgQEAg
dm9pZCBOZXR3b3JrSm9iOjpoYW5kbGVOb3RpZnlIZWFkZXJSZWNlaXZlZChjb25zdCBTdHJpbmcm
IGtleSwgY29uc3QgU3RyaW5nJiB2YWwKICAgICBtX3Jlc3BvbnNlLnNldEhUVFBIZWFkZXJGaWVs
ZChrZXksIHZhbHVlKTsKIH0KIAordm9pZCBOZXR3b3JrSm9iOjpoYW5kbGVOb3RpZnlNdWx0aXBh
cnRIZWFkZXJSZWNlaXZlZChjb25zdCBTdHJpbmcmIGtleSwgY29uc3QgU3RyaW5nJiB2YWx1ZSkK
K3sKKyAgICBpZiAoIW1fbXVsdGlwYXJ0UmVzcG9uc2UpIHsKKyAgICAgICAgLy8gQ3JlYXRlIGEg
bmV3IHJlc3BvbnNlIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCBzZXQgb2YgaGVhZGVycyArIHRoZQor
ICAgICAgICAvLyByZXBsYWNlbWVudCBoZWFkZXJzLiBXZSBvbmx5IHJlcGxhY2UgdGhlIHNhbWUg
ZmV3IGhlYWRlcnMgdGhhdCBnZWNrbworICAgICAgICAvLyBkb2VzLiBTZWUgbmV0d2Vyay9zdHJl
YW1jb252L2NvbnZlcnRlcnMvbnNNdWx0aU1peGVkQ29udi5jcHAuCisgICAgICAgIG1fbXVsdGlw
YXJ0UmVzcG9uc2UgPSBhZG9wdFB0cihuZXcgUmVzb3VyY2VSZXNwb25zZSk7CisgICAgICAgIG1f
bXVsdGlwYXJ0UmVzcG9uc2UtPnNldFVSTChtX3Jlc3BvbnNlLnVybCgpKTsKKworICAgICAgICAv
LyBUaGUgbGlzdCBvZiBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6cmVwbGFjZUhlYWRlcnMgdGhhdCB3
ZSBkbyBub3QgY29weSBmcm9tIHRoZSBvcmlnaW5hbAorICAgICAgICAvLyByZXNwb25zZSB3aGVu
IGdlbmVyYXRpbmcgYSByZXNwb25zZS4KKyAgICAgICAgY29uc3QgV2ViQ29yZTo6SFRUUEhlYWRl
ck1hcCYgbWFwID0gbV9yZXNwb25zZS5odHRwSGVhZGVyRmllbGRzKCk7CisKKyAgICAgICAgZm9y
IChXZWJDb3JlOjpIVFRQSGVhZGVyTWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IG1hcC5iZWdpbigp
OyBpdCAhPSBtYXAuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgIGJvb2wgbmVlZHNDb3B5ZnJv
bU9yaWdpbmFsUmVzcG9uc2UgPSB0cnVlOworICAgICAgICAgICAgaW50IHJlcGxhY2VIZWFkZXJz
SW5kZXggPSAwOworICAgICAgICAgICAgd2hpbGUgKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpNdWx0
aXBhcnRTdHJlYW06OnJlcGxhY2VIZWFkZXJzW3JlcGxhY2VIZWFkZXJzSW5kZXhdKSB7CisgICAg
ICAgICAgICAgICAgaWYgKGl0LT5maXJzdC5sb3dlcigpID09IEJsYWNrQmVycnk6OlBsYXRmb3Jt
OjpNdWx0aXBhcnRTdHJlYW06OnJlcGxhY2VIZWFkZXJzW3JlcGxhY2VIZWFkZXJzSW5kZXhdKSB7
CisgICAgICAgICAgICAgICAgICAgIG5lZWRzQ29weWZyb21PcmlnaW5hbFJlc3BvbnNlPSBmYWxz
ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAg
ICAgICAgICAgIHJlcGxhY2VIZWFkZXJzSW5kZXgrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIGlmIChuZWVkc0NvcHlmcm9tT3JpZ2luYWxSZXNwb25zZSkKKyAgICAgICAgICAgICAgICBt
X211bHRpcGFydFJlc3BvbnNlLT5zZXRIVFRQSGVhZGVyRmllbGQoaXQtPmZpcnN0LCBpdC0+c2Vj
b25kKTsKKyAgICAgICAgfQorCisgICAgICAgIG1fbXVsdGlwYXJ0UmVzcG9uc2UtPnNldElzTXVs
dGlwYXJ0UGF5bG9hZCh0cnVlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoa2V5Lmxvd2Vy
KCkgPT0gImNvbnRlbnQtdHlwZSIpIHsKKyAgICAgICAgICAgIFN0cmluZyBjb250ZW50VHlwZSA9
IHZhbHVlLmxvd2VyKCk7CisgICAgICAgICAgICBtX211bHRpcGFydFJlc3BvbnNlLT5zZXRNaW1l
VHlwZShleHRyYWN0TUlNRVR5cGVGcm9tTWVkaWFUeXBlKGNvbnRlbnRUeXBlKSk7CisgICAgICAg
ICAgICBtX211bHRpcGFydFJlc3BvbnNlLT5zZXRUZXh0RW5jb2RpbmdOYW1lKGV4dHJhY3RDaGFy
c2V0RnJvbU1lZGlhVHlwZShjb250ZW50VHlwZSkpOworICAgICAgICB9CisgICAgICAgIG1fbXVs
dGlwYXJ0UmVzcG9uc2UtPnNldEhUVFBIZWFkZXJGaWVsZChrZXksIHZhbHVlKTsKKyAgICB9Cit9
CisKIHZvaWQgTmV0d29ya0pvYjo6aGFuZGxlU2V0Q29va2llSGVhZGVyKGNvbnN0IFN0cmluZyYg
dmFsdWUpCiB7CiAgICAgS1VSTCB1cmwgPSBtX3Jlc3BvbnNlLnVybCgpOwpAQCAtMzUwLDEzICsz
OTcsMTAgQEAgdm9pZCBOZXR3b3JrSm9iOjpoYW5kbGVOb3RpZnlEYXRhUmVjZWl2ZWQoY29uc3Qg
Y2hhciogYnVmLCBzaXplX3QgbGVuKQogCiAgICAgaWYgKHNob3VsZFNlbmRDbGllbnREYXRhKCkp
IHsKICAgICAgICAgc2VuZFJlc3BvbnNlSWZOZWVkZWQoKTsKKyAgICAgICAgc2VuZE11bHRpcGFy
dFJlc3BvbnNlSWZOZWVkZWQoKTsKICAgICAgICAgaWYgKGNsaWVudElzT2soKSkgewotICAgICAg
ICAgICAgaWYgKG1fbXVsdGlwYXJ0RGVsZWdhdGUpCi0gICAgICAgICAgICAgICAgbV9tdWx0aXBh
cnREZWxlZ2F0ZS0+b25SZWNlaXZlZERhdGEoYnVmLCBsZW4sIGxlbik7Ci0gICAgICAgICAgICBl
bHNlIHsKLSAgICAgICAgICAgICAgICBSZWN1cnNpb25HdWFyZCBndWFyZChtX2NhbGxpbmdDbGll
bnQpOwotICAgICAgICAgICAgICAgIG1faGFuZGxlLT5jbGllbnQoKS0+ZGlkUmVjZWl2ZURhdGEo
bV9oYW5kbGUuZ2V0KCksIGJ1ZiwgbGVuLCBsZW4pOwotICAgICAgICAgICB9CisgICAgICAgICAg
ICBSZWN1cnNpb25HdWFyZCBndWFyZChtX2NhbGxpbmdDbGllbnQpOworICAgICAgICAgICAgbV9o
YW5kbGUtPmNsaWVudCgpLT5kaWRSZWNlaXZlRGF0YShtX2hhbmRsZS5nZXQoKSwgYnVmLCBsZW4s
IGxlbik7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTQxOSw4ICs0NjMsNiBAQCB2b2lkIE5ldHdv
cmtKb2I6OmhhbmRsZU5vdGlmeUNsb3NlKGludCBzdGF0dXMpCiAKICAgICAgICAgICAgIHNlbmRS
ZXNwb25zZUlmTmVlZGVkKCk7CiAgICAgICAgICAgICBpZiAoY2xpZW50SXNPaygpKSB7Ci0gICAg
ICAgICAgICAgICAgaWYgKG1fbXVsdGlwYXJ0RGVsZWdhdGUpCi0gICAgICAgICAgICAgICAgICAg
IG1fbXVsdGlwYXJ0RGVsZWdhdGUtPm9uQ29tcGxldGVkUmVxdWVzdCgpOwogCiAgICAgICAgICAg
ICAgICAgUmVjdXJzaW9uR3VhcmQgZ3VhcmQobV9jYWxsaW5nQ2xpZW50KTsKICAgICAgICAgICAg
ICAgICBpZiAoaXNFcnJvcihtX2V4dGVuZGVkU3RhdHVzQ29kZSkgJiYgIW1fZGF0YVJlY2VpdmVk
KSB7CkBAIC00MzksNyArNDgxLDcgQEAgdm9pZCBOZXR3b3JrSm9iOjpoYW5kbGVOb3RpZnlDbG9z
ZShpbnQgc3RhdHVzKQogCiAgICAgLy8gRGV0YWNoIGZyb20gdGhlIFJlc291cmNlSGFuZGxlIGlu
IGFueSBjYXNlLgogICAgIG1faGFuZGxlID0gMDsKLSAgICBtX211bHRpcGFydERlbGVnYXRlID0g
bnVsbHB0cjsKKyAgICBtX211bHRpcGFydFJlc3BvbnNlID0gbnVsbHB0cjsKIH0KIAogYm9vbCBO
ZXR3b3JrSm9iOjpzaG91bGROb3RpZnlDbGllbnRGaW5pc2hlZCgpCkBAIC00ODcsNyArNTI5LDcg
QEAgYm9vbCBOZXR3b3JrSm9iOjpzdGFydE5ld0pvYldpdGhSZXF1ZXN0KFJlc291cmNlUmVxdWVz
dCYgbmV3UmVxdWVzdCwgYm9vbCBpbmNyZWEKICAgICAvLyBQYXNzIHRoZSBvd25lcnNoaXAgb2Yg
dGhlIFJlc291cmNlSGFuZGxlIHRvIHRoZSBuZXcgTmV0d29ya0pvYi4KICAgICBSZWZQdHI8UmVz
b3VyY2VIYW5kbGU+IGhhbmRsZSA9IG1faGFuZGxlOwogICAgIG1faGFuZGxlID0gMDsKLSAgICBt
X211bHRpcGFydERlbGVnYXRlID0gbnVsbHB0cjsKKyAgICBtX211bHRpcGFydFJlc3BvbnNlID0g
bnVsbHB0cjsKIAogICAgIE5ldHdvcmtNYW5hZ2VyOjppbnN0YW5jZSgpLT5zdGFydEpvYihtX3Bs
YXllcklkLAogICAgICAgICBtX3BhZ2VHcm91cE5hbWUsCkBAIC01ODIsMTMgKzYyNCwxNCBAQCB2
b2lkIE5ldHdvcmtKb2I6OnNlbmRSZXNwb25zZUlmTmVlZGVkKCkKICAgICBpZiAoY2xpZW50SXNP
aygpKSB7CiAgICAgICAgIFJlY3Vyc2lvbkd1YXJkIGd1YXJkKG1fY2FsbGluZ0NsaWVudCk7CiAg
ICAgICAgIG1faGFuZGxlLT5jbGllbnQoKS0+ZGlkUmVjZWl2ZVJlc3BvbnNlKG1faGFuZGxlLmdl
dCgpLCBtX3Jlc3BvbnNlKTsKKyAgICB9Cit9CiAKLSAgICAgICAgaWYgKG1pbWVUeXBlID09ICJt
dWx0aXBhcnQveC1taXhlZC1yZXBsYWNlIikgewotICAgICAgICAgICAgc3RkOjpzdHJpbmcgYm91
bmRhcnk7Ci0gICAgICAgICAgICBib29sIGlzUmVhZEJvdW5kYXJ5ID0gTXVsdGlwYXJ0UmVzcG9u
c2VEZWxlZ2F0ZTo6cmVhZE11bHRpcGFydEJvdW5kYXJ5KG1fY29udGVudFR5cGUubG93ZXIoKS51
dGY4KCkuZGF0YSgpLCBib3VuZGFyeSk7Ci0gICAgICAgICAgICBpZiAoaXNSZWFkQm91bmRhcnkg
JiYgIWJvdW5kYXJ5LmVtcHR5KCkpCi0gICAgICAgICAgICAgICAgbV9tdWx0aXBhcnREZWxlZ2F0
ZSA9IGFkb3B0UHRyKG5ldyBNdWx0aXBhcnRSZXNwb25zZURlbGVnYXRlKG1faGFuZGxlLCBtX3Jl
c3BvbnNlLCBib3VuZGFyeSkpOwotICAgICAgICB9Cit2b2lkIE5ldHdvcmtKb2I6OnNlbmRNdWx0
aXBhcnRSZXNwb25zZUlmTmVlZGVkKCkKK3sKKyAgICBpZiAobV9tdWx0aXBhcnRSZXNwb25zZSAm
JiBjbGllbnRJc09rKCkpIHsKKyAgICAgICAgbV9oYW5kbGUtPmNsaWVudCgpLT5kaWRSZWNlaXZl
UmVzcG9uc2UobV9oYW5kbGUuZ2V0KCksICptX211bHRpcGFydFJlc3BvbnNlKTsKKyAgICAgICAg
bV9tdWx0aXBhcnRSZXNwb25zZSA9IG51bGxwdHI7CiAgICAgfQogfQogCmRpZmYgLS1naXQgYS9T
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvTmV0d29ya0pvYi5oIGIv
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9ibGFja2JlcnJ5L05ldHdvcmtKb2IuaApp
bmRleCA1ZDJkYzg3YzAwMTQ5NGFkMzdhOGNlODhhOTcwNjQyZmNhMjQ4NjIyLi4zNzgxNjEwZGYx
YzJhMWQ0YmI5OGYzYTYzN2U3OGJmMDZlMWZkMzhlIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvTmV0d29ya0pvYi5oCisrKyBiL1NvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvYmxhY2tiZXJyeS9OZXR3b3JrSm9iLmgKQEAgLTIwLDcg
KzIwLDYgQEAKICNkZWZpbmUgTmV0d29ya0pvYl9oCiAKICNpbmNsdWRlICJEZWZlcnJlZERhdGEu
aCIKLSNpbmNsdWRlICJNdWx0aXBhcnRSZXNwb25zZURlbGVnYXRlLmgiCiAjaW5jbHVkZSAiUGxh
dGZvcm1TdHJpbmcuaCIKICNpbmNsdWRlICJQcm90ZWN0aW9uU3BhY2UuaCIKICNpbmNsdWRlICJS
ZXNvdXJjZUhhbmRsZS5oIgpAQCAtNzAsOSArNjksMTEgQEAgcHVibGljOgogICAgIHZpcnR1YWwg
dm9pZCBub3RpZnlXTUxPdmVycmlkZSgpOwogICAgIHZvaWQgaGFuZGxlTm90aWZ5V01MT3ZlcnJp
ZGUoKSB7IG1fcmVzcG9uc2Uuc2V0SXNXTUwodHJ1ZSk7IH0KICAgICB2aXJ0dWFsIHZvaWQgbm90
aWZ5SGVhZGVyUmVjZWl2ZWQoY29uc3QgY2hhcioga2V5LCBjb25zdCBjaGFyKiB2YWx1ZSk7Cisg
ICAgdmlydHVhbCB2b2lkIG5vdGlmeU11bHRpcGFydEhlYWRlclJlY2VpdmVkKGNvbnN0IGNoYXIq
IGtleSwgY29uc3QgY2hhciogdmFsdWUpOwogICAgIC8vIEV4aXN0cyBvbmx5IHRvIHJlc29sdmUg
YW1iaWd1aXR5IGJldHdlZW4gY2hhciogYW5kIFN0cmluZyBwYXJhbWV0ZXJzCiAgICAgdm9pZCBu
b3RpZnlTdHJpbmdIZWFkZXJSZWNlaXZlZChjb25zdCBTdHJpbmcmIGtleSwgY29uc3QgU3RyaW5n
JiB2YWx1ZSk7CiAgICAgdm9pZCBoYW5kbGVOb3RpZnlIZWFkZXJSZWNlaXZlZChjb25zdCBTdHJp
bmcmIGtleSwgY29uc3QgU3RyaW5nJiB2YWx1ZSk7CisgICAgdm9pZCBoYW5kbGVOb3RpZnlNdWx0
aXBhcnRIZWFkZXJSZWNlaXZlZChjb25zdCBTdHJpbmcmIGtleSwgY29uc3QgU3RyaW5nJiB2YWx1
ZSk7CiAgICAgdm9pZCBoYW5kbGVTZXRDb29raWVIZWFkZXIoY29uc3QgU3RyaW5nJiB2YWx1ZSk7
CiAgICAgdm9pZCBub3RpZnlEYXRhUmVjZWl2ZWRQbGFpbihjb25zdCBjaGFyKiBidWYsIHNpemVf
dCBsZW4pOwogICAgIHZvaWQgaGFuZGxlTm90aWZ5RGF0YVJlY2VpdmVkKGNvbnN0IGNoYXIqIGJ1
Ziwgc2l6ZV90IGxlbik7CkBAIC0xMDgsNiArMTA5LDcgQEAgcHJpdmF0ZToKIAogICAgIC8vIFRo
aXMgY2FuIGNhdXNlIG1fY2FuY2VsbGVkIHRvIGJlIHNldCB0byB0cnVlLCBpZiBpdCBwYXNzZXMg
dXAgYW4gZXJyb3IgdG8gbV9oYW5kbGUtPmNsaWVudCgpIHdoaWNoIGNhdXNlcyB0aGUgam9iIHRv
IGJlIGNhbmNlbGxlZAogICAgIHZvaWQgc2VuZFJlc3BvbnNlSWZOZWVkZWQoKTsKKyAgICB2b2lk
IHNlbmRNdWx0aXBhcnRSZXNwb25zZUlmTmVlZGVkKCk7CiAKICAgICB2b2lkIGZpcmVMb2FkRGF0
YVRpbWVyKFRpbWVyPE5ldHdvcmtKb2I+KikKICAgICB7CkBAIC0xNDksNyArMTUxLDcgQEAgcHJp
dmF0ZToKICAgICBSZXNvdXJjZVJlc3BvbnNlIG1fcmVzcG9uc2U7CiAgICAgVGltZXI8TmV0d29y
a0pvYj4gbV9sb2FkRGF0YVRpbWVyOwogICAgIFRpbWVyPE5ldHdvcmtKb2I+IG1fbG9hZEFib3V0
VGltZXI7Ci0gICAgT3duUHRyPE11bHRpcGFydFJlc3BvbnNlRGVsZWdhdGU+IG1fbXVsdGlwYXJ0
RGVsZWdhdGU7CisgICAgT3duUHRyPFJlc291cmNlUmVzcG9uc2U+IG1fbXVsdGlwYXJ0UmVzcG9u
c2U7CiAgICAgVGltZXI8TmV0d29ya0pvYj4gbV9kZWxldGVKb2JUaW1lcjsKICAgICBTdHJpbmcg
bV9jb250ZW50VHlwZTsKICAgICBTdHJpbmcgbV9jb250ZW50RGlzcG9zaXRpb247Cg==
</data>
<flag name="review"
          id="120307"
          type_id="1"
          status="+"
          setter="rwlbuis"
    />
    <flag name="commit-queue"
          id="120308"
          type_id="3"
          status="-"
          setter="leo.yang"
    />
          </attachment>
      

    </bug>

</bugzilla>