<?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>43276</bug_id>
          
          <creation_ts>2010-07-30 16:09:58 -0700</creation_ts>
          <short_desc>Implements IDBKeyPath extractor.</short_desc>
          <delta_ts>2010-08-16 10:31:22 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>New Bugs</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Other</rep_platform>
          <op_sys>OS X 10.5</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>
          <dependson>42976</dependson>
          
          <everconfirmed>0</everconfirmed>
          <reporter name="Marcus Bulach">bulach</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>andreip</cc>
    
    <cc>fishd</cc>
    
    <cc>hans</cc>
    
    <cc>jorlow</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>258442</commentid>
    <comment_count>0</comment_count>
    <who name="Marcus Bulach">bulach</who>
    <bug_when>2010-07-30 16:09:58 -0700</bug_when>
    <thetext>Implements IDBKeyPath extractor.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>258444</commentid>
    <comment_count>1</comment_count>
      <attachid>63116</attachid>
    <who name="Marcus Bulach">bulach</who>
    <bug_when>2010-07-30 16:12:44 -0700</bug_when>
    <thetext>Created attachment 63116
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>258449</commentid>
    <comment_count>2</comment_count>
      <attachid>63117</attachid>
    <who name="Marcus Bulach">bulach</who>
    <bug_when>2010-07-30 16:14:16 -0700</bug_when>
    <thetext>Created attachment 63117
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>258452</commentid>
    <comment_count>3</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-07-30 16:15:32 -0700</bug_when>
    <thetext>Attachment 63117 did not pass style-queue:

Failed to run &quot;[&apos;WebKitTools/Scripts/check-webkit-style&apos;]&quot; exit_code: 1
WebKit/chromium/tests/IDBKeyPathExtractorTest.cpp:27:  You should add a blank line after implementation file&apos;s own header.  [build/include_order] [4]
WebKit/chromium/tests/IDBKeyPathExtractorTest.cpp:67:  Consider using EXPECT_EQ instead of EXPECT_TRUE(a == b)  [readability/check] [2]
WebKit/chromium/tests/IDBKeyPathExtractorTest.cpp:84:  Consider using EXPECT_EQ instead of EXPECT_TRUE(a == b)  [readability/check] [2]
WebKit/chromium/tests/IDBKeyPathExtractorTest.cpp:99:  Consider using EXPECT_EQ instead of EXPECT_TRUE(a == b)  [readability/check] [2]
WebKit/chromium/tests/IDBKeyPathExtractorTest.cpp:100:  Consider using EXPECT_EQ instead of EXPECT_TRUE(a == b)  [readability/check] [2]
WebKit/chromium/tests/IDBKeyPathExtractorTest.cpp:119:  Consider using EXPECT_EQ instead of EXPECT_TRUE(a == b)  [readability/check] [2]
Total errors found: 6 in 12 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>258455</commentid>
    <comment_count>4</comment_count>
    <who name="Marcus Bulach">bulach</who>
    <bug_when>2010-07-30 16:17:12 -0700</bug_when>
    <thetext>Hi,

This patch depends on https://bugs.webkit.org/show_bug.cgi?id=42976.
If you want to look at this, please focus on SerializedScriptValue, IDBKeyPathExtractorTest, as almost everything else is part of the patch above.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>258760</commentid>
    <comment_count>5</comment_count>
    <who name="Andrei Popescu">andreip</who>
    <bug_when>2010-08-02 03:04:38 -0700</bug_when>
    <thetext>&gt; WebCore/bindings/v8/SerializedScriptValue.cpp
&gt; String keyPathExtractor(const String&amp; wireData, const String&amp; keyPathString)

Does the above IDB-specific method belong to the SerializedScriptValue file? I think Jeremy added a IDBBindingsUtils class that seems more fit for your purpose.

Also, is this method used just for testing? Otherwise, I am a bit confused about why it always returns a string. 

And one last thing: is the current name the best choice? You&apos;re not extracting a key path. You&apos;re extracting a value from the serialized object at the given key path.

&gt; void IDBKeyPath::parse()
&gt; (...)
&gt;  case Array : {
&gt; (...)
&gt; m_lexer.next();
 &gt; token = m_lexer.currentToken();

You are only checking for dot or left bracket. But what if tokEnd follows? Seems like you&apos;re returning ParserErrorAfterArray in that case? Although looking at the unit tests, it seems you have cases for key paths that end indexing into an array.

&gt; class LocalContext {

Umm, do you need this? Isn&apos;t this the same as v8::Context::Scope?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>259337</commentid>
    <comment_count>6</comment_count>
      <attachid>63313</attachid>
    <who name="Marcus Bulach">bulach</who>
    <bug_when>2010-08-03 03:02:27 -0700</bug_when>
    <thetext>Created attachment 63313
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>259339</commentid>
    <comment_count>7</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-08-03 03:04:44 -0700</bug_when>
    <thetext>Attachment 63313 did not pass style-queue:

Failed to run &quot;[&apos;WebKitTools/Scripts/check-webkit-style&apos;]&quot; exit_code: 1
WebKit/chromium/tests/IDBBindingUtilitiesTest.cpp:27:  You should add a blank line after implementation file&apos;s own header.  [build/include_order] [4]
Total errors found: 1 in 16 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>259341</commentid>
    <comment_count>8</comment_count>
    <who name="Marcus Bulach">bulach</who>
    <bug_when>2010-08-03 03:10:07 -0700</bug_when>
    <thetext>Thanks, Andrei!
replies inline:

(In reply to comment #5)
&gt; &gt; WebCore/bindings/v8/SerializedScriptValue.cpp
&gt; &gt; String keyPathExtractor(const String&amp; wireData, const String&amp; keyPathString)
&gt; 
&gt; Does the above IDB-specific method belong to the SerializedScriptValue file? I think Jeremy added a IDBBindingsUtils class that seems more fit for your purpose.
moved to IDBBindingUtils.

&gt; 
&gt; Also, is this method used just for testing? Otherwise, I am a bit confused about why it always returns a string. 
this is the real method, returning string was a mistake :)
it now returns an IDBKey.

&gt; 
&gt; And one last thing: is the current name the best choice? You&apos;re not extracting a key path. You&apos;re extracting a value from the serialized object at the given key path.
as discussed, this is now called valueForKeyPath.

&gt; 
&gt; &gt; void IDBKeyPath::parse()
&gt; &gt; (...)
&gt; &gt;  case Array : {
&gt; &gt; (...)
&gt; &gt; m_lexer.next();
&gt;  &gt; token = m_lexer.currentToken();
&gt; 
&gt; You are only checking for dot or left bracket. But what if tokEnd follows? Seems like you&apos;re returning ParserErrorAfterArray in that case? Although looking at the unit tests, it seems you have cases for key paths that end indexing into an array.

sorry, I think it wasn&apos;t clear. this bug depends on https://bugs.webkit.org/show_bug.cgi?id=42976, and in fact contains all the code from there.
as such, please avoid looking at any IDBKeyPath.* here. once that patch is in, I&apos;ll merge it here and this will only contain the binding utilities and related tests.
regardless: this comment has been applied in both places, thanks!

&gt; 
&gt; &gt; class LocalContext {
&gt; 
&gt; Umm, do you need this? Isn&apos;t this the same as v8::Context::Scope?

apparently, it also needs a v8::HandleScope, so I put them both inside this LocalContext (and removed the HandleScope from individual tests).

another look please?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>259382</commentid>
    <comment_count>9</comment_count>
      <attachid>63313</attachid>
    <who name="Jeremy Orlow">jorlow</who>
    <bug_when>2010-08-03 05:09:14 -0700</bug_when>
    <thetext>Comment on attachment 63313
Patch

WebKit/chromium/tests/IDBKeyPathTest.cpp:32
 +  #if ENABLE(INDEXED_DATABASE)
move this up...or....actually maybe just get rid of?

WebKit/chromium/tests/IDBBindingUtilitiesTest.cpp:35
 +  #if ENABLE(INDEXED_DATABASE)
ditto

WebCore/storage/IndexedDatabaseRequest.idl:31
 +          [CallWith=ScriptExecutionContext] IDBRequest open(in DOMString name, in DOMString description);
Umm....what&apos;s this file doing here?

WebCore/storage/IndexedDatabaseRequest.h:48
 +  class IndexedDatabaseRequest : public RefCounted&lt;IndexedDatabaseRequest&gt; {
ditto

WebCore/storage/IndexedDatabaseRequest.cpp:55
 +  PassRefPtr&lt;IDBRequest&gt; IndexedDatabaseRequest::open(ScriptExecutionContext* context, const String&amp; name, const String&amp; description)
and again

WebCore/storage/IDBKeyPath.cpp:33
 +  #if ENABLE(INDEXED_DATABASE)
move up

WebCore/bindings/v8/IDBBindingUtilities.h:40
 +  PassRefPtr&lt;IDBKey&gt; valueForKeyPath(const String&amp; wireData, const String&amp; keyPathString);
Should this just take a SerializedScriptValue?

WebCore/bindings/v8/IDBBindingUtilities.cpp:54
 +      RefPtr&lt;IDBKeyPath&gt; keyPath = IDBKeyPath::create(keyPathString);
Check whether it&apos;s valid before going on.

Of course....shouldn&apos;t we just compile once.  I.e. pass in an IDBKeyPath to the function?

WebCore/bindings/v8/IDBBindingUtilities.cpp:61
 +              v8::Local&lt;v8::Object&gt; object = v8Value-&gt;ToObject();
Is this the best way to do this?

WebCore/bindings/v8/IDBBindingUtilities.cpp:66
 +              if (!v8Value-&gt;IsObject())
Can this stuff be factored out?



You should probably do all the build files and JSC support in this patch as well.

Still haven&apos;t done a detailed review of the actual parser.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>259398</commentid>
    <comment_count>10</comment_count>
    <who name="Jeremy Orlow">jorlow</who>
    <bug_when>2010-08-03 05:46:09 -0700</bug_when>
    <thetext>O..and make sure fishd reviews before you commit since it touches WebKit</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>259419</commentid>
    <comment_count>11</comment_count>
      <attachid>63313</attachid>
    <who name="Jeremy Orlow">jorlow</who>
    <bug_when>2010-08-03 06:24:35 -0700</bug_when>
    <thetext>Comment on attachment 63313
Patch

WebCore/storage/IDBKeyPath.cpp:101
 +              if (token == TokIdentifier)
Use a switch?

WebCore/storage/IDBKeyPath.cpp:46
 +      , m_currentToken(0)
Use the enum value

WebCore/storage/IDBKeyPath.cpp:58
 +      return m_currentToken &lt; m_tokens.size();
I guess I&apos;d suggest just converting over all this hasNext/next stuff to just returning the raw vector.  I don&apos;t feel strongly, but I just don&apos;t see much of a point of creating this interface.

WebCore/storage/IDBKeyPath.cpp:70
 +          return &quot;&quot;;
Maybe you should just let it crash?  I.e. not do bounds checking?

WebCore/storage/IDBKeyPath.cpp:90
 +      return m_parserError;
Maybe all the methods should be ASSERTing that a parse error never happened?

WebCore/storage/IDBKeyPath.cpp:103
 +              else if (token == TokLBracket)
I&apos;d lean towards spelling these all the way out.

WebCore/storage/IDBKeyPath.cpp:116
 +              Token idbToken;
these 2 token variable names are confusing.  The idb doesn&apos;t make it any less so.  Maybe &apos;outputToken&apos; or something?



general note: you should talk to the guy who does fuzzers (skylined..?) and see if we can get some coverage on this

also, could we just do this more simply?  for example, in python pseudo code I could do this:

tokens = []
if (path == &quot;&quot;):
  return []
for (component in path.split(&quot;.&quot;)):
  if (component ~= /^([a-zA-Z0-9_]+)\[([0-9]+)\]$/):
    tokens.append($1, $2)
  else if (component ~= /^([a-zA-Z0-9_]+)$/):
    tokens.append($1, null)
  else:
    return error
return tokens

And that&apos;d be about it.  Do we have any sort of regex support build into WebKit already?  The split would be pretty easy to do as well.  I&apos;m just concerned that we&apos;re jumping the gun with all of this complexity.

Anyhow...


WebCore/storage/IDBKeyPath.cpp:145
 +              ASSERT(token.type == TokNumber);
this seems mildly redundant, but I&apos;m ok with it

WebCore/storage/IDBKeyPath.cpp:163
 +                  state = Array;
but this is an invalid state!

WebCore/storage/IDBKeyPath.cpp:147
 +              idbToken.hasIndex = true;
maybe assert it was false?

WebCore/storage/IDBKeyPath.cpp:190
 +  
default:
  raise error

WebCore/storage/IDBKeyPath.cpp:99
 +          case Start : {
maybe pull this out of the state machine?

WebCore/storage/IDBKeyPath.cpp:278
 +          return TokError;
I&apos;d just do an m_ptr &gt;= m_end first and then return...then no need for an else

WebCore/storage/IDBKeyPath.cpp:292
 +      return TokError;
same again...test the error condition and return rather than putting everythign in a block

WebCore/storage/IDBKeyPath.cpp:252
 +      if (m_ptr &lt; m_end &amp;&amp; isSafeIdentifierStartCharacter(*m_ptr))
ditto

WebCore/storage/IDBKeyPath.h:84
 +      class Lexer {
Why does this need to be defined here?

WebCore/storage/IDBKeyPath.h:116
 +          const UChar* m_ptr;
should this be called m_cursor?

WebCore/storage/IDBKeyPath.h:100
 +          TokenType next()
these could all be on one line</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>260177</commentid>
    <comment_count>12</comment_count>
    <who name="Marcus Bulach">bulach</who>
    <bug_when>2010-08-04 13:11:43 -0700</bug_when>
    <thetext>thanks for this review, jeremy!
I&apos;ll reply to this comment specifically in https://bugs.webkit.org/show_bug.cgi?id=42976, which is the original patch for KeyPath.
I&apos;ll reply to the bindings / extractor later here.
(as mentioned above, this change *includes* 42976, I only split so that I could go ahead and not block with the implementation details of the parser.).

(In reply to comment #11)
&gt; (From update of attachment 63313 [details])
&gt; WebCore/storage/IDBKeyPath.cpp:101
&gt;  +              if (token == TokIdentifier)
&gt; Use a switch?
&gt; 
&gt; WebCore/storage/IDBKeyPath.cpp:46
&gt;  +      , m_currentToken(0)
&gt; Use the enum value
&gt; 
&gt; WebCore/storage/IDBKeyPath.cpp:58
&gt;  +      return m_currentToken &lt; m_tokens.size();
&gt; I guess I&apos;d suggest just converting over all this hasNext/next stuff to just returning the raw vector.  I don&apos;t feel strongly, but I just don&apos;t see much of a point of creating this interface.
&gt; 
&gt; WebCore/storage/IDBKeyPath.cpp:70
&gt;  +          return &quot;&quot;;
&gt; Maybe you should just let it crash?  I.e. not do bounds checking?
&gt; 
&gt; WebCore/storage/IDBKeyPath.cpp:90
&gt;  +      return m_parserError;
&gt; Maybe all the methods should be ASSERTing that a parse error never happened?
&gt; 
&gt; WebCore/storage/IDBKeyPath.cpp:103
&gt;  +              else if (token == TokLBracket)
&gt; I&apos;d lean towards spelling these all the way out.
&gt; 
&gt; WebCore/storage/IDBKeyPath.cpp:116
&gt;  +              Token idbToken;
&gt; these 2 token variable names are confusing.  The idb doesn&apos;t make it any less so.  Maybe &apos;outputToken&apos; or something?
&gt; 
&gt; 
&gt; 
&gt; general note: you should talk to the guy who does fuzzers (skylined..?) and see if we can get some coverage on this
&gt; 
&gt; also, could we just do this more simply?  for example, in python pseudo code I could do this:
&gt; 
&gt; tokens = []
&gt; if (path == &quot;&quot;):
&gt;   return []
&gt; for (component in path.split(&quot;.&quot;)):
&gt;   if (component ~= /^([a-zA-Z0-9_]+)\[([0-9]+)\]$/):
&gt;     tokens.append($1, $2)
&gt;   else if (component ~= /^([a-zA-Z0-9_]+)$/):
&gt;     tokens.append($1, null)
&gt;   else:
&gt;     return error
&gt; return tokens
&gt; 
&gt; And that&apos;d be about it.  Do we have any sort of regex support build into WebKit already?  The split would be pretty easy to do as well.  I&apos;m just concerned that we&apos;re jumping the gun with all of this complexity.
&gt; 
&gt; Anyhow...
&gt; 
&gt; 
&gt; WebCore/storage/IDBKeyPath.cpp:145
&gt;  +              ASSERT(token.type == TokNumber);
&gt; this seems mildly redundant, but I&apos;m ok with it
&gt; 
&gt; WebCore/storage/IDBKeyPath.cpp:163
&gt;  +                  state = Array;
&gt; but this is an invalid state!
&gt; 
&gt; WebCore/storage/IDBKeyPath.cpp:147
&gt;  +              idbToken.hasIndex = true;
&gt; maybe assert it was false?
&gt; 
&gt; WebCore/storage/IDBKeyPath.cpp:190
&gt;  +  
&gt; default:
&gt;   raise error
&gt; 
&gt; WebCore/storage/IDBKeyPath.cpp:99
&gt;  +          case Start : {
&gt; maybe pull this out of the state machine?
&gt; 
&gt; WebCore/storage/IDBKeyPath.cpp:278
&gt;  +          return TokError;
&gt; I&apos;d just do an m_ptr &gt;= m_end first and then return...then no need for an else
&gt; 
&gt; WebCore/storage/IDBKeyPath.cpp:292
&gt;  +      return TokError;
&gt; same again...test the error condition and return rather than putting everythign in a block
&gt; 
&gt; WebCore/storage/IDBKeyPath.cpp:252
&gt;  +      if (m_ptr &lt; m_end &amp;&amp; isSafeIdentifierStartCharacter(*m_ptr))
&gt; ditto
&gt; 
&gt; WebCore/storage/IDBKeyPath.h:84
&gt;  +      class Lexer {
&gt; Why does this need to be defined here?
&gt; 
&gt; WebCore/storage/IDBKeyPath.h:116
&gt;  +          const UChar* m_ptr;
&gt; should this be called m_cursor?
&gt; 
&gt; WebCore/storage/IDBKeyPath.h:100
&gt;  +          TokenType next()
&gt; these could all be on one line</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>260508</commentid>
    <comment_count>13</comment_count>
    <who name="Jeremy Orlow">jorlow</who>
    <bug_when>2010-08-05 04:13:48 -0700</bug_when>
    <thetext>(In reply to comment #12)
&gt; thanks for this review, jeremy!
&gt; I&apos;ll reply to this comment specifically in https://bugs.webkit.org/show_bug.cgi?id=42976, which is the original patch for KeyPath.
&gt; I&apos;ll reply to the bindings / extractor later here.
&gt; (as mentioned above, this change *includes* 42976, I only split so that I could go ahead and not block with the implementation details of the parser.).

Ugh.  Please don&apos;t include multiple patches in one.  Do a diff between what&apos;s in the other change and this and post that.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>260872</commentid>
    <comment_count>14</comment_count>
      <attachid>63638</attachid>
    <who name="Marcus Bulach">bulach</who>
    <bug_when>2010-08-05 14:39:07 -0700</bug_when>
    <thetext>Created attachment 63638
Patch

this is a git diff between my branches, it should contain only the code for the valueForKeyPath and associated tests.
(it still depends on https://bugs.webkit.org/show_bug.cgi?id=42976, but hopefully can be reviewed in parallel..)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>261268</commentid>
    <comment_count>15</comment_count>
      <attachid>63638</attachid>
    <who name="Jeremy Orlow">jorlow</who>
    <bug_when>2010-08-06 08:25:07 -0700</bug_when>
    <thetext>Comment on attachment 63638
Patch

WebKit/chromium/src/WebIDBKeyPath.cpp:34
 +  #include &quot;Vector.h&quot;
&lt;wtf/Vector.h&gt;

WebKit/chromium/src/WebIDBKeyPath.cpp:36
 +  using WebCore::IDBKeyPathElement;
Just using WebCore;

WebKit/chromium/src/WebIDBKeyPath.cpp:51
 +      delete m_private;
maybe check to see if m_private is !0...and then set it to 0?

WebKit/chromium/public/WebIDBKeyPath.h:53
 +      void assign(WTF::Vector&lt;WebCore::IDBKeyPathElement, 0&gt;&amp;);
typically we just make these all implicit conversions.  Is that not possible?

WebKit/chromium/public/WebIDBKeyPath.h:58
 +      WTF::Vector&lt;WebCore::IDBKeyPathElement, 0&gt;* m_private;
I just asked hans to make a PrivateOwnPtr class (like PrivatePrt..maybe renaming it to PrivateRefPtr) for something similar.  Coordinate between yourselves?

WebKit/chromium/public/WebIDBKeyPath.h:32
 +  namespace WebCore {
#if WEBKIT_IMPLEMENTATION

WebKit/chromium/public/WebIDBKeyPath.h:61
 +  void WebIDBParseKeyPath(const WebString&amp;, WebIDBKeyPath*, int* error);
Do we have other base methods like this?  Maybe it should be a static method of some class?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>262713</commentid>
    <comment_count>16</comment_count>
      <attachid>64017</attachid>
    <who name="Marcus Bulach">bulach</who>
    <bug_when>2010-08-10 09:38:10 -0700</bug_when>
    <thetext>Created attachment 64017
Patch

(this is still blocked by https://bugs.webkit.org/show_bug.cgi?id=42976)

more inline:

(In reply to comment #15)
&gt; (From update of attachment 63638 [details])
&gt; WebKit/chromium/src/WebIDBKeyPath.cpp:34
&gt;  +  #include &quot;Vector.h&quot;
&gt; &lt;wtf/Vector.h&gt;
done.

&gt; 
&gt; WebKit/chromium/src/WebIDBKeyPath.cpp:36
&gt;  +  using WebCore::IDBKeyPathElement;
&gt; Just using WebCore;
done.

&gt; 
&gt; WebKit/chromium/src/WebIDBKeyPath.cpp:51
&gt;  +      delete m_private;
&gt; maybe check to see if m_private is !0...and then set it to 0?
I used your suggestion and created a WebPrivateOwnPtr that takes care of it.

&gt; 
&gt; WebKit/chromium/public/WebIDBKeyPath.h:53
&gt;  +      void assign(WTF::Vector&lt;WebCore::IDBKeyPathElement, 0&gt;&amp;);
&gt; typically we just make these all implicit conversions.  Is that not possible?
changed so that there&apos;s a factory method, in order to capture any parsing errors.

&gt; 
&gt; WebKit/chromium/public/WebIDBKeyPath.h:58
&gt;  +      WTF::Vector&lt;WebCore::IDBKeyPathElement, 0&gt;* m_private;
&gt; I just asked hans to make a PrivateOwnPtr class (like PrivatePrt..maybe renaming it to PrivateRefPtr) for something similar.  Coordinate between yourselves?

good idea! done.

&gt; 
&gt; WebKit/chromium/public/WebIDBKeyPath.h:32
&gt;  +  namespace WebCore {
&gt; #if WEBKIT_IMPLEMENTATION
hmm, I think such forward declarations are required regardless of which side?

&gt; 
&gt; WebKit/chromium/public/WebIDBKeyPath.h:61
&gt;  +  void WebIDBParseKeyPath(const WebString&amp;, WebIDBKeyPath*, int* error);
&gt; Do we have other base methods like this?  Maybe it should be a static method of some class?
yep, created a factory method on WebIDBKeyPath.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>262742</commentid>
    <comment_count>17</comment_count>
      <attachid>64017</attachid>
    <who name="Jeremy Orlow">jorlow</who>
    <bug_when>2010-08-10 10:13:42 -0700</bug_when>
    <thetext>Comment on attachment 64017
Patch

WebCore/bindings/v8/IDBBindingUtilities.cpp:51
 +  bool GetValueFrom(v8::Handle&lt;v8::Value&gt;&amp; v8Value, T indexOrName)
lowercase g

WebCore/bindings/v8/IDBBindingUtilities.cpp:55
 +          return 0;
return false

WebCore/bindings/v8/IDBBindingUtilities.cpp:51
 +  bool GetValueFrom(v8::Handle&lt;v8::Value&gt;&amp; v8Value, T indexOrName)
Hm...should the output param come second?

WebCore/bindings/v8/IDBBindingUtilities.cpp:68
 +          } else {
else if maybe...and maybe even add an else after this that ASSERT_NOT_REACHED?

Maybe use a switch?

WebCore/bindings/v8/IDBBindingUtilities.h:32
 +  #include &lt;wtf/Vector.h&gt;
alpha order

WebCore/bindings/v8/IDBBindingUtilities.h:38
 +  struct IDBKeyPathElement;
structs come after classes

WebKit/chromium/WebKit.gyp:180
 +                  &apos;public/WebIDBBindingUtilities.h&apos;,
So this file is alpha, not ascii order?

WebKit/chromium/public/WebIDBBindingUtilities.h:35
 +  WebIDBKey WebValueForKeyPath(const WebSerializedScriptValue&amp;, const WebIDBKeyPath&amp;);
lower case w

WebKit/chromium/public/WebIDBKeyPath.h:33
 +  namespace WebCore {
these could be one liners if you wanted

WebKit/chromium/src/WebIDBBindingUtilities.cpp:40
 +  WebIDBKey WebValueForKeyPath(const WebSerializedScriptValue&amp; serializedScriptValue, const WebIDBKeyPath&amp; idbKeyPath)
I still kind of feel like this should just be a static method on WebIDBKeyPath or something.

WebKit/chromium/src/WebIDBKeyPath.cpp:44
 +      IDBParseKeyPath(keyPath, &amp;idbElements, &amp;idbError);
Hm....isn&apos;t the norm to just pass by reference, not pointer?

WebKit/chromium/src/WebIDBKeyPath.cpp:47
 +        return NULL;
0

and 4 spaces

WebKit/chromium/src/WebIDBKeyPath.cpp:40
 +  WebIDBKeyPath* WebIDBKeyPath::create(const WebString&amp; keyPath, int* error)
Why do we need to return a *?  Just return a copy of this object.

WebKit/chromium/src/WebIDBKeyPath.cpp:58
 +      m_private.reset();
The destructor needn&apos;t call reset anymore now that you have a class to do it...so you could get rid of reset.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>262743</commentid>
    <comment_count>18</comment_count>
    <who name="Hans Wennborg">hans</who>
    <bug_when>2010-08-10 10:17:34 -0700</bug_when>
    <thetext>(In reply to comment #16)
&gt; Created an attachment (id=64017) [details]
&gt; Patch

I&apos;m only commenting on the WebPrivateOwnPtr part.

In WebKit/chromium/public/WebPrivateOwnPtr.h:
+#if WEBKIT_IMPLEMENTATION
+#include &lt;wtf/OwnPtr.h&gt;
+#include &lt;wtf/PassOwnPtr.h&gt;
+#endif

Those classes don&apos;t seem to be used.

The class should probably be Noncopyable, so hide copy ctor and assignment operator in the private section.

When WEBKIT_IMPLEMENTATION is not defined, code should probably not be allowed to construct objects of the class. To prevent this, maybe the WebPrivateOwnPtr() contructor should be declared in the private: section.

+    void reset()
+    {
+        // we own m_ptr.
+        delete m_ptr;
+        m_ptr = 0;
+    }
There is a subtle point to not defining reset() inline. If it is inline, then T must be defined when WebPrivatePtr&lt;T&gt; is instantiated, because it will try to bind the &quot;delete m_ptr&quot; call. If reset() is not inline, it&apos;s enough to have T forward-declared when instantiating the template, which is a good thing. OwnPtr does this too, for the same reason AFAIK.

Also, I thought you would do this in Bug 43709. If not, at least please update that when this goes in.

This is definitely a nice class to have, I think :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>262816</commentid>
    <comment_count>19</comment_count>
    <who name="Hans Wennborg">hans</who>
    <bug_when>2010-08-10 12:27:28 -0700</bug_when>
    <thetext>(In reply to comment #18)
&gt; There is a subtle point to not defining reset() inline. If it is inline, then T must be defined when WebPrivatePtr&lt;T&gt; is instantiated, because it will try to bind the &quot;delete m_ptr&quot; call. If reset() is not inline, it&apos;s enough to have T forward-declared when instantiating the template, which is a good thing. OwnPtr does this too, for the same reason AFAIK.

I hadn&apos;t thought this through. Obviously it has to be inline, because it&apos;s in a template. I&apos;m not sure what deleteOwnedPtr() in OwnPtrCommon.h does, but it looks tricky. Please disregard my comment.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>263212</commentid>
    <comment_count>20</comment_count>
    <who name="Marcus Bulach">bulach</who>
    <bug_when>2010-08-11 06:23:22 -0700</bug_when>
    <thetext>(In reply to comment #19)
&gt; (In reply to comment #18)
&gt; &gt; There is a subtle point to not defining reset() inline. If it is inline, then T must be defined when WebPrivatePtr&lt;T&gt; is instantiated, because it will try to bind the &quot;delete m_ptr&quot; call. If reset() is not inline, it&apos;s enough to have T forward-declared when instantiating the template, which is a good thing. OwnPtr does this too, for the same reason AFAIK.
&gt; 
&gt; I hadn&apos;t thought this through. Obviously it has to be inline, because it&apos;s in a template. I&apos;m not sure what deleteOwnedPtr() in OwnPtrCommon.h does, but it looks tricky. Please disregard my comment.

you&apos;re right, and the WEBKIT_API / IMPLEMENTATION and the templates are making me dizzy :)
I think we need to define the destructor inline and make it call &quot;reset()&quot;, which will be declared as an API method, but defined inline under an IMPLEMENTATION guard. it must also COMPILE_ASSERT it knows sizeof(T). I&apos;ll address Jeremey&apos;s previous comment and try to get this one, will send a new patch shortly..

oh, and I&apos;m happy to split and put in the separate bug as well, but I&apos;d prefer to do that once we figure out the right usage here. how does it sound?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>263227</commentid>
    <comment_count>21</comment_count>
    <who name="Hans Wennborg">hans</who>
    <bug_when>2010-08-11 06:58:19 -0700</bug_when>
    <thetext>(In reply to comment #20)
&gt; oh, and I&apos;m happy to split and put in the separate bug as well, but I&apos;d prefer to do that once we figure out the right usage here. how does it sound?

Sounds good.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>263288</commentid>
    <comment_count>22</comment_count>
      <attachid>64125</attachid>
    <who name="Marcus Bulach">bulach</who>
    <bug_when>2010-08-11 09:34:23 -0700</bug_when>
    <thetext>Created attachment 64125
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>263293</commentid>
    <comment_count>23</comment_count>
      <attachid>64128</attachid>
    <who name="Marcus Bulach">bulach</who>
    <bug_when>2010-08-11 09:39:52 -0700</bug_when>
    <thetext>Created attachment 64128
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>263299</commentid>
    <comment_count>24</comment_count>
    <who name="Marcus Bulach">bulach</who>
    <bug_when>2010-08-11 09:43:28 -0700</bug_when>
    <thetext>thanks Jeremy, Hans! replies inline, another look please?

(In reply to comment #17)
&gt; (From update of attachment 64017 [details])
&gt; WebCore/bindings/v8/IDBBindingUtilities.cpp:51
&gt;  +  bool GetValueFrom(v8::Handle&lt;v8::Value&gt;&amp; v8Value, T indexOrName)
&gt; lowercase g
done.

&gt; 
&gt; WebCore/bindings/v8/IDBBindingUtilities.cpp:55
&gt;  +          return 0;
&gt; return false
done

&gt; 
&gt; WebCore/bindings/v8/IDBBindingUtilities.cpp:51
&gt;  +  bool GetValueFrom(v8::Handle&lt;v8::Value&gt;&amp; v8Value, T indexOrName)
&gt; Hm...should the output param come second?
done

&gt; 
&gt; WebCore/bindings/v8/IDBBindingUtilities.cpp:68
&gt;  +          } else {
&gt; else if maybe...and maybe even add an else after this that ASSERT_NOT_REACHED?
&gt; 
&gt; Maybe use a switch?
done

&gt; 
&gt; WebCore/bindings/v8/IDBBindingUtilities.h:32
&gt;  +  #include &lt;wtf/Vector.h&gt;
&gt; alpha order
done

&gt; 
&gt; WebCore/bindings/v8/IDBBindingUtilities.h:38
&gt;  +  struct IDBKeyPathElement;
&gt; structs come after classes
done.

&gt; 
&gt; WebKit/chromium/WebKit.gyp:180
&gt;  +                  &apos;public/WebIDBBindingUtilities.h&apos;,
&gt; So this file is alpha, not ascii order?
not sure I understood this comment?

&gt; 
&gt; WebKit/chromium/public/WebIDBBindingUtilities.h:35
&gt;  +  WebIDBKey WebValueForKeyPath(const WebSerializedScriptValue&amp;, const WebIDBKeyPath&amp;);
&gt; lower case w
obsolete, this file no longer exists and this method is now WebIDBKey::createFromValueAndKeyPath

&gt; 
&gt; WebKit/chromium/public/WebIDBKeyPath.h:33
&gt;  +  namespace WebCore {
&gt; these could be one liners if you wanted
done  

&gt; 
&gt; WebKit/chromium/src/WebIDBBindingUtilities.cpp:40
&gt;  +  WebIDBKey WebValueForKeyPath(const WebSerializedScriptValue&amp; serializedScriptValue, const WebIDBKeyPath&amp; idbKeyPath)
&gt; I still kind of feel like this should just be a static method on WebIDBKeyPath or something.
as we chatted, this is now WebIDBKey::createFromValueAndKeyPath

&gt; 
&gt; WebKit/chromium/src/WebIDBKeyPath.cpp:44
&gt;  +      IDBParseKeyPath(keyPath, &amp;idbElements, &amp;idbError);
&gt; Hm....isn&apos;t the norm to just pass by reference, not pointer?
done.

&gt; 
&gt; WebKit/chromium/src/WebIDBKeyPath.cpp:47
&gt;  +        return NULL;
&gt; 0
done.

&gt; 
&gt; and 4 spaces
done.

&gt; 
&gt; WebKit/chromium/src/WebIDBKeyPath.cpp:40
&gt;  +  WebIDBKeyPath* WebIDBKeyPath::create(const WebString&amp; keyPath, int* error)
&gt; Why do we need to return a *?  Just return a copy of this object.
done.  

&gt; 
&gt; WebKit/chromium/src/WebIDBKeyPath.cpp:58
&gt;  +      m_private.reset();
&gt; The destructor needn&apos;t call reset anymore now that you have a class to do it...so you could get rid of reset.
due to the template / WEBKIT_API, we need again the reset

(In reply to comment #18)
&gt; (In reply to comment #16)
&gt; &gt; Created an attachment (id=64017) [details] [details]
&gt; &gt; Patch
&gt; 
&gt; I&apos;m only commenting on the WebPrivateOwnPtr part.
&gt; 
&gt; In WebKit/chromium/public/WebPrivateOwnPtr.h:
&gt; +#if WEBKIT_IMPLEMENTATION
&gt; +#include &lt;wtf/OwnPtr.h&gt;
&gt; +#include &lt;wtf/PassOwnPtr.h&gt;
&gt; +#endif
&gt; 
&gt; Those classes don&apos;t seem to be used.
removed.

&gt; 
&gt; The class should probably be Noncopyable, so hide copy ctor and assignment operator in the private section.
done.

&gt; 
&gt; When WEBKIT_IMPLEMENTATION is not defined, code should probably not be allowed to construct objects of the class. To prevent this, maybe the WebPrivateOwnPtr() contructor should be declared in the private: section.
&gt; 
&gt; +    void reset()
&gt; +    {
&gt; +        // we own m_ptr.
&gt; +        delete m_ptr;
&gt; +        m_ptr = 0;
&gt; +    }
&gt; There is a subtle point to not defining reset() inline. If it is inline, then T must be defined when WebPrivatePtr&lt;T&gt; is instantiated, because it will try to bind the &quot;delete m_ptr&quot; call. If reset() is not inline, it&apos;s enough to have T forward-declared when instantiating the template, which is a good thing. OwnPtr does this too, for the same reason AFAIK.
yes, you&apos;re right. this is no longer _that_ useful, as the dtor needs to be inline, but reset() can&apos;t be... :(
so I used the same pattern as WebPrivatePtr, in the sense that the caller needs to call reset(), and the dtor assert it&apos;s null.

&gt; 
&gt; Also, I thought you would do this in Bug 43709. If not, at least please update that when this goes in.
Yep, I can split this at any point, just thought it&apos;d be nicer to have a concrete usage. :)  

&gt; 
&gt; This is definitely a nice class to have, I think :)
:)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>263722</commentid>
    <comment_count>25</comment_count>
      <attachid>64128</attachid>
    <who name="Jeremy Orlow">jorlow</who>
    <bug_when>2010-08-12 04:51:48 -0700</bug_when>
    <thetext>Comment on attachment 64128
Patch

need change log

WebCore/bindings/v8/IDBBindingUtilities.cpp:65
 +          switch (keyPath[i].type) {
Maybe this would be better if it were an if statement?

(Just kidding.  :-)

WebCore/bindings/v8/IDBBindingUtilities.h:33
 +  #include &lt;wtf/Vector.h&gt;
You don&apos;t need this.

WebKit/chromium/src/WebIDBKeyPath.cpp:49
 +      : m_private(new WTF::Vector&lt;IDBKeyPathElement&gt;(elements)),
comma on next line

WebKit/chromium/src/WebIDBKeyPath.cpp:41
 +  {
Initialize m_parseError?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>263723</commentid>
    <comment_count>26</comment_count>
    <who name="Jeremy Orlow">jorlow</who>
    <bug_when>2010-08-12 04:52:01 -0700</bug_when>
    <thetext>forgot r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>265157</commentid>
    <comment_count>27</comment_count>
    <who name="Marcus Bulach">bulach</who>
    <bug_when>2010-08-16 10:27:52 -0700</bug_when>
    <thetext>(In reply to comment #26)
&gt; forgot r=me

(In reply to comment #25)
&gt; (From update of attachment 64128 [details])
&gt; need change log
&gt; 
&gt; WebCore/bindings/v8/IDBBindingUtilities.cpp:65
&gt;  +          switch (keyPath[i].type) {
&gt; Maybe this would be better if it were an if statement?
&gt; 
&gt; (Just kidding.  :-)
&gt; 
&gt; WebCore/bindings/v8/IDBBindingUtilities.h:33
&gt;  +  #include &lt;wtf/Vector.h&gt;
&gt; You don&apos;t need this.
&gt; 
&gt; WebKit/chromium/src/WebIDBKeyPath.cpp:49
&gt;  +      : m_private(new WTF::Vector&lt;IDBKeyPathElement&gt;(elements)),
&gt; comma on next line
&gt; 
&gt; WebKit/chromium/src/WebIDBKeyPath.cpp:41
&gt;  +  {
&gt; Initialize m_parseError?

thanks, Jeremy! all comments addressed, landing it now.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>265160</commentid>
    <comment_count>28</comment_count>
    <who name="Marcus Bulach">bulach</who>
    <bug_when>2010-08-16 10:31:22 -0700</bug_when>
    <thetext>Committed r65439: &lt;http://trac.webkit.org/changeset/65439&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>63116</attachid>
            <date>2010-07-30 16:12:44 -0700</date>
            <delta_ts>2010-07-30 16:14:08 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-43276-20100731001242.patch</filename>
            <type>text/plain</type>
            <size>34742</size>
            <attacher name="Marcus Bulach">bulach</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
YThjZWFlOWYzMzMzYjM5MWE1ZTlkYTBjNTg1MjdlY2RlOTU1ZmI1ZS4uM2Q2NzZmZDBiYmNkMGJl
NzQ2ODM2OWI0MGEzNjU0YTY2ZjU1NWQzMyAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cK
KysrIGIvV2ViQ29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSw0MCBAQAorMjAxMC0wNy0zMCAgTWFy
Y3VzIEJ1bGFjaCAgPGJ1bGFjaEBjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkg
Tk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgSW1wbGVtZW50cyBJREJLZXlQYXRoIGV4dHJhY3Rv
ci4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTQzMjc2
CisKKyAgICAgICAgVW5pdC10ZXN0IElEQktleVBhdGhFeHRyYWN0b3JUZXN0LmNwcC4KKyAgICAg
ICAgTGF5b3V0VGVzdHMgd2lsbCBhcnJpdmUgYXMgSW5kZXhlZERCIGluZnJhc3RydWN0dXJlIGlz
IGZsZXNoZWQgb3V0LgorCisgICAgICAgICogV2ViQ29yZS5neXBpOgorICAgICAgICAqIGJpbmRp
bmdzL3Y4L1NlcmlhbGl6ZWRTY3JpcHRWYWx1ZS5jcHA6CisgICAgICAgIChXZWJDb3JlOjprZXlQ
YXRoRXh0cmFjdG9yKToKKyAgICAgICAgKiBiaW5kaW5ncy92OC9TZXJpYWxpemVkU2NyaXB0VmFs
dWUuaDoKKyAgICAgICAgKiBzdG9yYWdlL0lEQktleVBhdGguY3BwOiBBZGRlZC4KKyAgICAgICAg
KFdlYkNvcmU6OklEQktleVBhdGg6OmNyZWF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpJREJLZXlQ
YXRoOjpJREJLZXlQYXRoKToKKyAgICAgICAgKFdlYkNvcmU6OklEQktleVBhdGg6On5JREJLZXlQ
YXRoKToKKyAgICAgICAgKFdlYkNvcmU6OklEQktleVBhdGg6Omhhc05leHQpOgorICAgICAgICAo
V2ViQ29yZTo6SURCS2V5UGF0aDo6bmV4dCk6CisgICAgICAgIChXZWJDb3JlOjpJREJLZXlQYXRo
OjppZGVudGlmaWVyKToKKyAgICAgICAgKFdlYkNvcmU6OklEQktleVBhdGg6Omhhc0luZGV4KToK
KyAgICAgICAgKFdlYkNvcmU6OklEQktleVBhdGg6OmluZGV4VmFsdWUpOgorICAgICAgICAoV2Vi
Q29yZTo6SURCS2V5UGF0aDo6cGFyc2VyRXJyb3IpOgorICAgICAgICAoV2ViQ29yZTo6SURCS2V5
UGF0aDo6cGFyc2UpOgorICAgICAgICAoV2ViQ29yZTo6SURCS2V5UGF0aDo6TGV4ZXI6OmxleCk6
CisgICAgICAgIChXZWJDb3JlOjppc1NhZmVJZGVudGlmaWVyU3RhcnRDaGFyYWN0ZXIpOgorICAg
ICAgICAoV2ViQ29yZTo6aXNTYWZlSWRlbnRpZmllckNoYXJhY3Rlcik6CisgICAgICAgIChXZWJD
b3JlOjpJREJLZXlQYXRoOjpMZXhlcjo6bGV4SWRlbnRpZmllcik6CisgICAgICAgIChXZWJDb3Jl
OjpJREJLZXlQYXRoOjpMZXhlcjo6bGV4TnVtYmVyKToKKyAgICAgICAgKiBzdG9yYWdlL0lEQktl
eVBhdGguaDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpJREJLZXlQYXRoOjpUb2tlbjo6VG9r
ZW4pOgorICAgICAgICAoV2ViQ29yZTo6SURCS2V5UGF0aDo6KToKKyAgICAgICAgKFdlYkNvcmU6
OklEQktleVBhdGg6OkxleGVyOjpMZXhlcik6CisgICAgICAgIChXZWJDb3JlOjpJREJLZXlQYXRo
OjpMZXhlcjo6bmV4dCk6CisgICAgICAgIChXZWJDb3JlOjpJREJLZXlQYXRoOjpMZXhlcjo6Y3Vy
cmVudFRva2VuKToKKwogMjAxMC0wNy0yOSAgQWxleGFuZGVyIFBhdmxvdiAgPGFwYXZsb3ZAY2hy
b21pdW0ub3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5IFBhdmVsIEZlbGRtYW4uCmRpZmYgLS1n
aXQgYS9XZWJDb3JlL1dlYkNvcmUuZ3lwaSBiL1dlYkNvcmUvV2ViQ29yZS5neXBpCmluZGV4IDY5
OGUzMDI1NmJiN2ZiZGU3MzI2NjBiMWFhZTA2YThhMzI2NGE4ZjIuLmI4YjAzY2Q2ZDMwNjY1ZmE2
M2VhNzA4ZGMzNGYzM2M4MWRiOThiYjcgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvV2ViQ29yZS5neXBp
CisrKyBiL1dlYkNvcmUvV2ViQ29yZS5neXBpCkBAIC0zNDg5LDYgKzM0ODksOCBAQAogICAgICAg
ICAgICAgJ3N0b3JhZ2UvSURCSW5kZXhSZXF1ZXN0LmgnLAogICAgICAgICAgICAgJ3N0b3JhZ2Uv
SURCS2V5LmNwcCcsCiAgICAgICAgICAgICAnc3RvcmFnZS9JREJLZXkuaCcsCisgICAgICAgICAg
ICAnc3RvcmFnZS9JREJLZXlQYXRoLmNwcCcsCisgICAgICAgICAgICAnc3RvcmFnZS9JREJLZXlQ
YXRoLmgnLAogICAgICAgICAgICAgJ3N0b3JhZ2UvSURCS2V5UmFuZ2UuY3BwJywKICAgICAgICAg
ICAgICdzdG9yYWdlL0lEQktleVJhbmdlLmgnLAogICAgICAgICAgICAgJ3N0b3JhZ2UvSURCS2V5
VHJlZS5oJywKZGlmZiAtLWdpdCBhL1dlYkNvcmUvYmluZGluZ3MvdjgvU2VyaWFsaXplZFNjcmlw
dFZhbHVlLmNwcCBiL1dlYkNvcmUvYmluZGluZ3MvdjgvU2VyaWFsaXplZFNjcmlwdFZhbHVlLmNw
cAppbmRleCA5ZGM0ZDBmY2JjZWE5ZDllMTQxNDNkN2I5ZTBkNzA2OWNlOTU2MTExLi5lN2FmYTli
ZDIzZjVlM2ZlMWJiODM1MGQzZjg1Mzc5ZGVmZTY4MzZhIDEwMDY0NAotLS0gYS9XZWJDb3JlL2Jp
bmRpbmdzL3Y4L1NlcmlhbGl6ZWRTY3JpcHRWYWx1ZS5jcHAKKysrIGIvV2ViQ29yZS9iaW5kaW5n
cy92OC9TZXJpYWxpemVkU2NyaXB0VmFsdWUuY3BwCkBAIC0zNyw2ICszNyw3IEBACiAjaW5jbHVk
ZSAiRXhjZXB0aW9uQ29kZS5oIgogI2luY2x1ZGUgIkZpbGUuaCIKICNpbmNsdWRlICJGaWxlTGlz
dC5oIgorI2luY2x1ZGUgIklEQktleVBhdGguaCIKICNpbmNsdWRlICJJbWFnZURhdGEuaCIKICNp
bmNsdWRlICJTaGFyZWRCdWZmZXIuaCIKICNpbmNsdWRlICJWOEJpbmRpbmcuaCIKQEAgLTEwOTUs
NCArMTA5NiwzMyBAQCB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gU2VyaWFsaXplZFNjcmlwdFZhbHVl
OjpkZXNlcmlhbGl6ZSgpCiAgICAgcmV0dXJuIGRlc2VyaWFsaXplci5kZXNlcmlhbGl6ZSgpOwog
fQogCitTdHJpbmcga2V5UGF0aEV4dHJhY3Rvcihjb25zdCBTdHJpbmcmIHdpcmVEYXRhLCBjb25z
dCBTdHJpbmcmIGtleVBhdGhTdHJpbmcpCit7CisgICAgdjg6OkhhbmRsZVNjb3BlIHNjb3BlOwor
ICAgIFJlZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+IHZhbHVlID0gU2VyaWFsaXplZFNjcmlw
dFZhbHVlOjpjcmVhdGVGcm9tV2lyZSh3aXJlRGF0YSk7CisgICAgUmVmUHRyPElEQktleVBhdGg+
IGtleVBhdGggPSBJREJLZXlQYXRoOjpjcmVhdGUoa2V5UGF0aFN0cmluZyk7CisgICAgdjg6Okhh
bmRsZTx2ODo6VmFsdWU+IHY4VmFsdWUodmFsdWUtPmRlc2VyaWFsaXplKCkpOworICAgIHdoaWxl
IChrZXlQYXRoLT5oYXNOZXh0KCkpIHsKKyAgICAgICAgaWYgKGtleVBhdGgtPmhhc0luZGV4KCkp
IHsKKyAgICAgICAgICAgIGlmICghdjhWYWx1ZS0+SXNBcnJheSgpKQorICAgICAgICAgICAgICAg
IHJldHVybiBTdHJpbmcoKTsKKyAgICAgICAgICAgIGludCBpbmRleCA9IGtleVBhdGgtPmluZGV4
VmFsdWUoKTsKKyAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBvYmplY3QgPSB2OFZh
bHVlLT5Ub09iamVjdCgpOworICAgICAgICAgICAgaWYgKCFvYmplY3QtPkhhcyhpbmRleCkpCisg
ICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZygpOworICAgICAgICAgICAgdjhWYWx1ZSA9IG9i
amVjdC0+R2V0KGluZGV4KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICghdjhW
YWx1ZS0+SXNPYmplY3QoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKCk7CisgICAg
ICAgICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gb2JqZWN0ID0gdjhWYWx1ZS0+VG9PYmplY3Qo
KTsKKyAgICAgICAgICAgIHY4OjpIYW5kbGU8djg6OlN0cmluZz4gaWRlbnRpZmllcih2OFN0cmlu
ZyhrZXlQYXRoLT5pZGVudGlmaWVyKCkpKTsKKyAgICAgICAgICAgIGlmICghb2JqZWN0LT5IYXMo
aWRlbnRpZmllcikpCisgICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZygpOworICAgICAgICAg
ICAgdjhWYWx1ZSA9IG9iamVjdC0+R2V0KGlkZW50aWZpZXIpOworICAgICAgICB9CisgICAgICAg
IGtleVBhdGgtPm5leHQoKTsKKyAgICB9CisgICAgcmV0dXJuIHY4U3RyaW5nVG9XZWJDb3JlU3Ry
aW5nKHY4VmFsdWUtPlRvU3RyaW5nKCkpOworfQorCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRp
ZmYgLS1naXQgYS9XZWJDb3JlL2JpbmRpbmdzL3Y4L1NlcmlhbGl6ZWRTY3JpcHRWYWx1ZS5oIGIv
V2ViQ29yZS9iaW5kaW5ncy92OC9TZXJpYWxpemVkU2NyaXB0VmFsdWUuaAppbmRleCAzNzEwYjVh
MjMxMDVhNmYxNjkzMTY1MGVhNTA4YjAyYjQ3ZTllMGQyLi4xNTY3YTkwZWVkMjAyYWU1Yzk2YmZk
NzkwZjEwNmFjZjFkZjYzZmI2IDEwMDY0NAotLS0gYS9XZWJDb3JlL2JpbmRpbmdzL3Y4L1Nlcmlh
bGl6ZWRTY3JpcHRWYWx1ZS5oCisrKyBiL1dlYkNvcmUvYmluZGluZ3MvdjgvU2VyaWFsaXplZFNj
cmlwdFZhbHVlLmgKQEAgLTc0LDYgKzc0LDggQEAgcHJpdmF0ZToKICAgICBTdHJpbmcgbV9kYXRh
OwogfTsKIAorU3RyaW5nIGtleVBhdGhFeHRyYWN0b3IoY29uc3QgU3RyaW5nJiB3aXJlRGF0YSwg
Y29uc3QgU3RyaW5nJiBrZXlQYXRoU3RyaW5nKTsKKwogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQog
CiAjZW5kaWYgLy8gU2VyaWFsaXplZFNjcmlwdFZhbHVlX2gKZGlmZiAtLWdpdCBhL1dlYkNvcmUv
c3RvcmFnZS9JREJLZXlQYXRoLmNwcCBiL1dlYkNvcmUvc3RvcmFnZS9JREJLZXlQYXRoLmNwcApu
ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwLi41NmIwMTVhNDI4NjZlOTA4MDA0NmM3NGRkNDA3YTU1YTZkNzQwNWEzCi0tLSAv
ZGV2L251bGwKKysrIGIvV2ViQ29yZS9zdG9yYWdlL0lEQktleVBhdGguY3BwCkBAIC0wLDAgKzEs
Mjk4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg
KgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAq
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVT
RSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIklEQktleVBhdGgu
aCIKKworI2luY2x1ZGUgIlN0cmluZ0J1aWxkZXIuaCIKKyNpbmNsdWRlIDx3dGYvQVNDSUlDVHlw
ZS5oPgorI2luY2x1ZGUgPHd0Zi9kdG9hLmg+CisKKyNpZiBFTkFCTEUoSU5ERVhFRF9EQVRBQkFT
RSkKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitQYXNzUmVmUHRyPElEQktleVBhdGg+IElEQktl
eVBhdGg6OmNyZWF0ZShjb25zdCBTdHJpbmcmIGtleVBhdGgpCit7CisgICAgUmVmUHRyPElEQktl
eVBhdGg+IGlkYktleVBhdGggPSBhZG9wdFJlZihuZXcgSURCS2V5UGF0aChrZXlQYXRoKSk7Cisg
ICAgaWRiS2V5UGF0aC0+cGFyc2UoKTsKKyAgICByZXR1cm4gaWRiS2V5UGF0aC5yZWxlYXNlKCk7
Cit9CisKK0lEQktleVBhdGg6OklEQktleVBhdGgoY29uc3QgU3RyaW5nJiBrZXlQYXRoKQorICAg
IDogbV9rZXlQYXRoKGtleVBhdGgpCisgICAgLCBtX2N1cnJlbnRUb2tlbigwKQorICAgICwgbV9s
ZXhlcihrZXlQYXRoKQoreworICAgIG1fbGV4ZXIubmV4dCgpOworfQorCitJREJLZXlQYXRoOjp+
SURCS2V5UGF0aCgpCit7Cit9CisKK2Jvb2wgSURCS2V5UGF0aDo6aGFzTmV4dCgpCit7CisgICAg
cmV0dXJuIG1fY3VycmVudFRva2VuIDwgbV90b2tlbnMuc2l6ZSgpOworfQorCit2b2lkIElEQktl
eVBhdGg6Om5leHQoKQoreworICAgIGlmIChtX2N1cnJlbnRUb2tlbiA8IG1fdG9rZW5zLnNpemUo
KSkKKyAgICAgICAgKyttX2N1cnJlbnRUb2tlbjsKK30KKworU3RyaW5nIElEQktleVBhdGg6Omlk
ZW50aWZpZXIoKQoreworICAgIGlmIChtX2N1cnJlbnRUb2tlbiA+PSBtX3Rva2Vucy5zaXplKCkp
CisgICAgICAgIHJldHVybiAiIjsKKyAgICByZXR1cm4gbV90b2tlbnNbbV9jdXJyZW50VG9rZW5d
LmlkZW50aWZpZXI7Cit9CisKK2Jvb2wgSURCS2V5UGF0aDo6aGFzSW5kZXgoKSBjb25zdAorewor
ICAgIGlmIChtX2N1cnJlbnRUb2tlbiA+PSBtX3Rva2Vucy5zaXplKCkpCisgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICByZXR1cm4gbV90b2tlbnNbbV9jdXJyZW50VG9rZW5dLmhhc0luZGV4Owor
fQorCitpbnQgSURCS2V5UGF0aDo6aW5kZXhWYWx1ZSgpIGNvbnN0Cit7CisgICAgaWYgKG1fY3Vy
cmVudFRva2VuID49IG1fdG9rZW5zLnNpemUoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
IHJldHVybiBtX3Rva2Vuc1ttX2N1cnJlbnRUb2tlbl0uaW5kZXhWYWx1ZTsKK30KKworaW50IElE
QktleVBhdGg6OnBhcnNlckVycm9yKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9wYXJzZXJFcnJv
cjsKK30KKwordm9pZCBJREJLZXlQYXRoOjpwYXJzZSgpCit7CisgICAgUGFyc2VyU3RhdGUgc3Rh
dGUgPSBTdGFydDsKKworICAgIHdoaWxlICgxKSB7CisgICAgICAgIHN3aXRjaCAoc3RhdGUpIHsK
KyAgICAgICAgY2FzZSBTdGFydCA6IHsKKyAgICAgICAgICAgIFRva2VuVHlwZSB0b2tlbiA9IG1f
bGV4ZXIuY3VycmVudFRva2VuKCkudHlwZTsKKyAgICAgICAgICAgIGlmICh0b2tlbiA9PSBUb2tJ
ZGVudGlmaWVyKSB7CisgICAgICAgICAgICAgICAgc3RhdGUgPSBJZGVudGlmaWVyOworICAgICAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRva2VuID09
IFRva0xCcmFja2V0KSB7CisgICAgICAgICAgICAgICAgc3RhdGUgPSBBcnJheTsKKyAgICAgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0b2tlbiA9PSBU
b2tFbmQpIHsKKyAgICAgICAgICAgICAgICBtX3BhcnNlckVycm9yID0gUGFyc2VFcnJvck5vbmU7
CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbV9w
YXJzZXJFcnJvciA9IFBhcnNlRXJyb3JTdGFydDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAg
ICAgfQorICAgICAgICBjYXNlIElkZW50aWZpZXIgOiB7CisgICAgICAgICAgICBMZXhlcjo6UGFy
c2VyVG9rZW4gdG9rZW4gPSBtX2xleGVyLmN1cnJlbnRUb2tlbigpOworICAgICAgICAgICAgQVNT
RVJUKHRva2VuLnR5cGUgPT0gVG9rSWRlbnRpZmllcik7CisgICAgICAgICAgICBUb2tlbiBpZGJU
b2tlbjsKKyAgICAgICAgICAgIGlkYlRva2VuLmlkZW50aWZpZXIgPSB0b2tlbi5zdHJpbmdUb2tl
bjsKKyAgICAgICAgICAgIG1fdG9rZW5zLmFwcGVuZChpZGJUb2tlbik7CisKKyAgICAgICAgICAg
IG1fbGV4ZXIubmV4dCgpOworICAgICAgICAgICAgdG9rZW4gPSBtX2xleGVyLmN1cnJlbnRUb2tl
bigpOworICAgICAgICAgICAgaWYgKHRva2VuLnR5cGUgPT0gVG9rRG90KSB7CisgICAgICAgICAg
ICAgICAgc3RhdGUgPSBEb3Q7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9
CisgICAgICAgICAgICBpZiAodG9rZW4udHlwZSA9PSBUb2tMQnJhY2tldCkgeworICAgICAgICAg
ICAgICAgIHN0YXRlID0gQXJyYXk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAg
ICB9CisgICAgICAgICAgICBpZiAodG9rZW4udHlwZSA9PSBUb2tFbmQpIHsKKyAgICAgICAgICAg
ICAgICBtX3BhcnNlckVycm9yID0gUGFyc2VFcnJvck5vbmU7CisgICAgICAgICAgICAgICAgcmV0
dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbV9wYXJzZXJFcnJvciA9IFBhcnNlRXJy
b3JJZGVudGlmaWVyOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGNh
c2UgQXJyYXkgOiB7CisgICAgICAgICAgICBMZXhlcjo6UGFyc2VyVG9rZW4gdG9rZW4gPSBtX2xl
eGVyLmN1cnJlbnRUb2tlbigpOworICAgICAgICAgICAgQVNTRVJUKHRva2VuLnR5cGUgPT0gVG9r
TEJyYWNrZXQpOworCisgICAgICAgICAgICBtX2xleGVyLm5leHQoKTsKKyAgICAgICAgICAgIHRv
a2VuID0gbV9sZXhlci5jdXJyZW50VG9rZW4oKTsKKyAgICAgICAgICAgIGlmICh0b2tlbi50eXBl
ICE9IFRva051bWJlcikgeworICAgICAgICAgICAgICAgIG1fcGFyc2VyRXJyb3IgPSBQYXJzZUVy
cm9yQXJyYXlJbmRleDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisK
KyAgICAgICAgICAgIEFTU0VSVCh0b2tlbi50eXBlID09IFRva051bWJlcik7CisgICAgICAgICAg
ICBUb2tlbiBpZGJUb2tlbjsKKyAgICAgICAgICAgIGlkYlRva2VuLmhhc0luZGV4ID0gdHJ1ZTsK
KyAgICAgICAgICAgIGlkYlRva2VuLmluZGV4VmFsdWUgPSB0b2tlbi5udW1iZXJUb2tlbjsKKyAg
ICAgICAgICAgIG1fdG9rZW5zLmFwcGVuZChpZGJUb2tlbik7CisKKyAgICAgICAgICAgIG1fbGV4
ZXIubmV4dCgpOworICAgICAgICAgICAgdG9rZW4gPSBtX2xleGVyLmN1cnJlbnRUb2tlbigpOwor
ICAgICAgICAgICAgaWYgKHRva2VuLnR5cGUgIT0gVG9rUkJyYWNrZXQpIHsKKyAgICAgICAgICAg
ICAgICBtX3BhcnNlckVycm9yID0gUGFyc2VFcnJvckFycmF5SW5kZXg7CisgICAgICAgICAgICAg
ICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtX2xleGVyLm5leHQoKTsK
KyAgICAgICAgICAgIHRva2VuID0gbV9sZXhlci5jdXJyZW50VG9rZW4oKTsKKyAgICAgICAgICAg
IGlmICh0b2tlbi50eXBlID09IFRva0RvdCkKKyAgICAgICAgICAgICAgICBzdGF0ZSA9IERvdDsK
KyAgICAgICAgICAgIGVsc2UgaWYgKHRva2VuLnR5cGUgPT0gVG9rTEJyYWNrZXQpCisgICAgICAg
ICAgICAgICAgc3RhdGUgPSBBcnJheTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAg
ICAgIG1fcGFyc2VyRXJyb3IgPSBQYXJzZXJFcnJvckFmdGVyQXJyYXk7CisgICAgICAgICAgICAg
ICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
fQorCisgICAgICAgIGNhc2UgRG90OiB7CisgICAgICAgICAgICBMZXhlcjo6UGFyc2VyVG9rZW4g
dG9rZW4gPSBtX2xleGVyLmN1cnJlbnRUb2tlbigpOworICAgICAgICAgICAgQVNTRVJUKHRva2Vu
LnR5cGUgPT0gVG9rRG90KTsKKworICAgICAgICAgICAgbV9sZXhlci5uZXh0KCk7CisgICAgICAg
ICAgICB0b2tlbiA9IG1fbGV4ZXIuY3VycmVudFRva2VuKCk7CisgICAgICAgICAgICBpZiAodG9r
ZW4udHlwZSAhPSBUb2tJZGVudGlmaWVyKSB7CisgICAgICAgICAgICAgICAgbV9wYXJzZXJFcnJv
ciA9IFBhcnNlRXJyb3JEb3Q7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAg
fQorCisgICAgICAgICAgICBzdGF0ZSA9IElkZW50aWZpZXI7CisgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitJREJLZXlQYXRoOjpUb2tlblR5cGUg
SURCS2V5UGF0aDo6TGV4ZXI6OmxleChQYXJzZXJUb2tlbiYgdG9rZW4pCit7CisgICAgd2hpbGUg
KG1fcHRyIDwgbV9lbmQgJiYgaXNBU0NJSVNwYWNlKCptX3B0cikpCisgICAgICAgICsrbV9wdHI7
CisKKyAgICBpZiAobV9wdHIgPj0gbV9lbmQpIHsKKyAgICAgICAgdG9rZW4udHlwZSA9IFRva0Vu
ZDsKKyAgICAgICAgdG9rZW4uc3RhcnQgPSBtX3B0cjsKKyAgICAgICAgdG9rZW4uZW5kID0gbV9w
dHI7CisgICAgICAgIHJldHVybiBUb2tFbmQ7CisgICAgfQorICAgIEFTU0VSVChtX3B0ciA8IG1f
ZW5kKTsKKyAgICB0b2tlbi50eXBlID0gVG9rRXJyb3I7CisgICAgdG9rZW4uc3RhcnQgPSBtX3B0
cjsKKyAgICBzd2l0Y2ggKCptX3B0cikgeworICAgIGNhc2UgJ1snOgorICAgICAgICB0b2tlbi50
eXBlID0gVG9rTEJyYWNrZXQ7CisgICAgICAgIHRva2VuLmVuZCA9ICsrbV9wdHI7CisgICAgICAg
IHJldHVybiBUb2tMQnJhY2tldDsKKyAgICBjYXNlICddJzoKKyAgICAgICAgdG9rZW4udHlwZSA9
IFRva1JCcmFja2V0OworICAgICAgICB0b2tlbi5lbmQgPSArK21fcHRyOworICAgICAgICByZXR1
cm4gVG9rUkJyYWNrZXQ7CisgICAgY2FzZSAnLic6CisgICAgICAgIHRva2VuLnR5cGUgPSBUb2tE
b3Q7CisgICAgICAgIHRva2VuLmVuZCA9ICsrbV9wdHI7CisgICAgICAgIHJldHVybiBUb2tEb3Q7
CisgICAgY2FzZSAnMCc6CisgICAgY2FzZSAnMSc6CisgICAgY2FzZSAnMic6CisgICAgY2FzZSAn
Myc6CisgICAgY2FzZSAnNCc6CisgICAgY2FzZSAnNSc6CisgICAgY2FzZSAnNic6CisgICAgY2Fz
ZSAnNyc6CisgICAgY2FzZSAnOCc6CisgICAgY2FzZSAnOSc6CisgICAgICAgIHJldHVybiBsZXhO
dW1iZXIodG9rZW4pOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBsZXhJZGVudGlmaWVy
KHRva2VuKTsKKyAgICB9CisgICAgcmV0dXJuIFRva0Vycm9yOworfQorCitzdGF0aWMgaW5saW5l
IGJvb2wgaXNTYWZlSWRlbnRpZmllclN0YXJ0Q2hhcmFjdGVyKFVDaGFyIGMpCit7CisgICAgcmV0
dXJuIGlzQVNDSUlBbHBoYShjKSB8fCAoYyA9PSAnXycpIHx8IChjID09ICckJyk7Cit9CisKK3N0
YXRpYyBpbmxpbmUgYm9vbCBpc1NhZmVJZGVudGlmaWVyQ2hhcmFjdGVyKFVDaGFyIGMpCit7Cisg
ICAgcmV0dXJuIGlzQVNDSUlBbHBoYW51bWVyaWMoYykgfHwgKGMgPT0gJ18nKSB8fCAoYyA9PSAn
JCcpOworfQorCitJREJLZXlQYXRoOjpUb2tlblR5cGUgSURCS2V5UGF0aDo6TGV4ZXI6OmxleElk
ZW50aWZpZXIoUGFyc2VyVG9rZW4mIHRva2VuKQoreworICAgIGNvbnN0IFVDaGFyKiBzdGFydCA9
IG1fcHRyOworICAgIGlmIChtX3B0ciA8IG1fZW5kICYmIGlzU2FmZUlkZW50aWZpZXJTdGFydENo
YXJhY3RlcigqbV9wdHIpKQorICAgICAgICArK21fcHRyOworICAgIGVsc2UKKyAgICAgICAgcmV0
dXJuIFRva0Vycm9yOworCisgICAgd2hpbGUgKG1fcHRyIDwgbV9lbmQgJiYgaXNTYWZlSWRlbnRp
ZmllckNoYXJhY3RlcigqbV9wdHIpKQorICAgICAgICArK21fcHRyOworCisgICAgU3RyaW5nIGlk
ZW50aWZpZXI7CisgICAgaWYgKHN0YXJ0IDwgbV9wdHIpCisgICAgICAgIGlkZW50aWZpZXIgPSBT
dHJpbmcoc3RhcnQsIG1fcHRyIC0gc3RhcnQpOworCisgICAgdG9rZW4uc3RyaW5nVG9rZW4gPSBp
ZGVudGlmaWVyOworICAgIHRva2VuLnR5cGUgPSBUb2tJZGVudGlmaWVyOworICAgIHRva2VuLmVu
ZCA9IG1fcHRyOworICAgIHJldHVybiBUb2tJZGVudGlmaWVyOworfQorCitJREJLZXlQYXRoOjpU
b2tlblR5cGUgSURCS2V5UGF0aDo6TGV4ZXI6OmxleE51bWJlcihQYXJzZXJUb2tlbiYgdG9rZW4p
Cit7CisgICAgY29uc3QgVUNoYXIqIHN0YXJ0ID0gbV9wdHI7CisgICAgaWYgKG1fcHRyIDwgbV9l
bmQpIHsKKyAgICAgICAgLy8gWzAtOV0qCisgICAgICAgIHdoaWxlIChtX3B0ciA8IG1fZW5kICYm
IGlzQVNDSUlEaWdpdCgqbV9wdHIpKQorICAgICAgICAgICAgKyttX3B0cjsKKyAgICB9IGVsc2UK
KyAgICAgICAgcmV0dXJuIFRva0Vycm9yOworCisgICAgU3RyaW5nIG51bWJlckFzU3RyaW5nOwor
ICAgIGlmIChzdGFydCA8IG1fcHRyKSB7CisgICAgICAgIG51bWJlckFzU3RyaW5nID0gU3RyaW5n
KHN0YXJ0LCBtX3B0ciAtIHN0YXJ0KTsKKyAgICAgICAgYm9vbCBvayA9IGZhbHNlOworICAgICAg
ICBpbnQgbnVtYmVyID0gbnVtYmVyQXNTdHJpbmcudG9JbnRTdHJpY3QoJm9rKTsKKyAgICAgICAg
aWYgKCFvaykKKyAgICAgICAgICAgIHJldHVybiBUb2tFcnJvcjsKKyAgICAgICAgdG9rZW4udHlw
ZSA9IFRva051bWJlcjsKKyAgICAgICAgdG9rZW4ubnVtYmVyVG9rZW4gPSBudW1iZXI7CisgICAg
ICAgIHRva2VuLmVuZCA9IG1fcHRyOworICAgICAgICByZXR1cm4gVG9rTnVtYmVyOworICAgIH0K
KyAgICByZXR1cm4gVG9rRXJyb3I7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2Vu
ZGlmIC8vIEVOQUJMRShJTkRFWEVEX0RBVEFCQVNFKQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9zdG9y
YWdlL0lEQktleVBhdGguaCBiL1dlYkNvcmUvc3RvcmFnZS9JREJLZXlQYXRoLmgKbmV3IGZpbGUg
bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MC4uNzM3YWNjOWU4YTIyMDYwNDE5YjA5MmI3MjE2ZjVlNGFjOGQ0NzA4ZAotLS0gL2Rldi9udWxs
CisrKyBiL1dlYkNvcmUvc3RvcmFnZS9JREJLZXlQYXRoLmgKQEAgLTAsMCArMSwxMjcgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiAg
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1Q
TElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwg
QVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBP
UiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAor
ICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAq
LworCisjaWZuZGVmIElEQktleVBhdGhfaAorI2RlZmluZSBJREJLZXlQYXRoX2gKKworI2lmIEVO
QUJMRShJTkRFWEVEX0RBVEFCQVNFKQorCisjaW5jbHVkZSA8d3RmL1Bhc3NSZWZQdHIuaD4KKyNp
bmNsdWRlIDx3dGYvUmVmQ291bnRlZC5oPgorI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKyNpbmNs
dWRlIDx3dGYvdGV4dC9XVEZTdHJpbmcuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFz
cyBJREJLZXlQYXRoIDogcHVibGljIFJlZkNvdW50ZWQ8SURCS2V5UGF0aD4geworcHVibGljOgor
ICAgIHN0YXRpYyBQYXNzUmVmUHRyPElEQktleVBhdGg+IGNyZWF0ZShjb25zdCBTdHJpbmcmKTsK
KyAgICB+SURCS2V5UGF0aCgpOworCisgICAgYm9vbCBoYXNOZXh0KCk7CisgICAgdm9pZCBuZXh0
KCk7CisgICAgU3RyaW5nIGlkZW50aWZpZXIoKTsKKyAgICBib29sIGhhc0luZGV4KCkgY29uc3Q7
CisgICAgaW50IGluZGV4VmFsdWUoKSBjb25zdDsKKworICAgIGludCBwYXJzZXJFcnJvcigpIGNv
bnN0OworCitwcml2YXRlOgorICAgIHN0cnVjdCBUb2tlbiB7CisgICAgICAgIFN0cmluZyBpZGVu
dGlmaWVyOworICAgICAgICBib29sIGhhc0luZGV4OworICAgICAgICBpbnQgaW5kZXhWYWx1ZTsK
KyAgICAgICAgVG9rZW4oKSA6IGhhc0luZGV4KGZhbHNlKSwgaW5kZXhWYWx1ZSgwKSB7fQorICAg
IH07CisgICAgZXhwbGljaXQgSURCS2V5UGF0aChjb25zdCBTdHJpbmcmKTsKKworICAgIFN0cmlu
ZyBtX2tleVBhdGg7CisgICAgVmVjdG9yPFRva2VuPiBtX3Rva2VuczsKKyAgICBpbnQgbV9jdXJy
ZW50VG9rZW47CisgICAgaW50IG1fcGFyc2VyRXJyb3I7CisKKyAgICAvLyBUaGlzIGlzIGEgc2lt
cGxpZmllZCBwYXJzZXIgbG9vc2VseSBiYXNlZCBvbiBMaXRlcmFsUGFyc2VyLgorICAgIC8vIEFu
IElEQktleVBhdGggaXMgZGVmaW5lZCBhcyBhIHNlcXVlbmNlIG9mOgorICAgIC8vIGlkZW50aWZp
ZXJBey5pZGVudGlmaWVyQntbbnVtZXJpY192YWx1ZV19CisgICAgLy8gd2hlcmUgInt9IiByZXBy
ZXNlbnRzIGFuIG9wdGlvbmFsIHBhcnQKKyAgICAvLyBUaGUgYmFzaWMgc3RhdGUgbWFjaGluZSBp
czoKKyAgICAvLyBTdGFydCA9PiB7SWRlbnRpZmllciwgQXJyYXl9CisgICAgLy8gSWRlbnRpZmll
ciA9PiB7RG90LCBBcnJheX0KKyAgICAvLyBBcnJheSA9PiB7U3RhcnQsIERvdH0KKyAgICAvLyBE
b3QgPT4ge0lkZW50aWZpZXJ9CisgICAgLy8gSXQgYmFpbHMgb3V0IGFzIHNvb24gYXMgaXQgZmlu
ZHMgYW4gZXJyb3IsIGJ1dCBkb2Vzbid0IGRpc2NhcmQgdGhlIGJpdHMgaXQgbWFuYWdlZCB0byBw
YXJzZS4KKyAgICBlbnVtIFBhcnNlclN0YXRlIHsgIFN0YXJ0LCBJZGVudGlmaWVyLCBBcnJheSwg
RG90IH07CisgICAgZW51bSBUb2tlblR5cGUgeyBUb2tMQnJhY2tldCwgVG9rUkJyYWNrZXQsCisg
ICAgICAgICAgICAgICAgICAgICBUb2tJZGVudGlmaWVyLCBUb2tOdW1iZXIsCisgICAgICAgICAg
ICAgICAgICAgICBUb2tEb3QsIFRva0VuZCwgVG9rRXJyb3IgfTsKKyAgICBlbnVtIFBhcnNlRXJy
b3IgeyBQYXJzZUVycm9yTm9uZSwgUGFyc2VFcnJvclN0YXJ0LCBQYXJzZUVycm9ySWRlbnRpZmll
ciwKKyAgICAgICAgICAgICAgICAgICAgICBQYXJzZUVycm9yQXJyYXlJbmRleCwgUGFyc2VyRXJy
b3JBZnRlckFycmF5LCBQYXJzZUVycm9yRG90fTsKKworICAgIHZvaWQgcGFyc2UoKTsKKworICAg
IGNsYXNzIExleGVyIHsKKyAgICBwdWJsaWM6CisgICAgICAgIHN0cnVjdCBQYXJzZXJUb2tlbiB7
CisgICAgICAgICAgICBUb2tlblR5cGUgdHlwZTsKKyAgICAgICAgICAgIGNvbnN0IFVDaGFyKiBz
dGFydDsKKyAgICAgICAgICAgIGNvbnN0IFVDaGFyKiBlbmQ7CisgICAgICAgICAgICBTdHJpbmcg
c3RyaW5nVG9rZW47CisgICAgICAgICAgICBkb3VibGUgbnVtYmVyVG9rZW47CisgICAgICAgIH07
CisgICAgICAgIGV4cGxpY2l0IExleGVyKGNvbnN0IFN0cmluZyYgcykKKyAgICAgICAgICAgIDog
bV9zdHJpbmcocykKKyAgICAgICAgICAgICwgbV9wdHIocy5jaGFyYWN0ZXJzKCkpCisgICAgICAg
ICAgICAsIG1fZW5kKHMuY2hhcmFjdGVycygpICsgcy5sZW5ndGgoKSkKKyAgICAgICAgeworICAg
ICAgICB9CisKKyAgICAgICAgVG9rZW5UeXBlIG5leHQoKQorICAgICAgICB7CisgICAgICAgICAg
ICByZXR1cm4gbGV4KG1fY3VycmVudFRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0
IFBhcnNlclRva2VuJiBjdXJyZW50VG9rZW4oKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1
cm4gbV9jdXJyZW50VG9rZW47CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIFRv
a2VuVHlwZSBsZXgoUGFyc2VyVG9rZW4mKTsKKyAgICAgICAgVG9rZW5UeXBlIGxleElkZW50aWZp
ZXIoUGFyc2VyVG9rZW4mKTsKKyAgICAgICAgVG9rZW5UeXBlIGxleE51bWJlcihQYXJzZXJUb2tl
biYpOworICAgICAgICBQYXJzZXJUb2tlbiBtX2N1cnJlbnRUb2tlbjsKKyAgICAgICAgU3RyaW5n
IG1fc3RyaW5nOworICAgICAgICBjb25zdCBVQ2hhciogbV9wdHI7CisgICAgICAgIGNvbnN0IFVD
aGFyKiBtX2VuZDsKKyAgICAgfTsKKworICAgIExleGVyIG1fbGV4ZXI7Cit9OworCit9IC8vIG5h
bWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZgorCisjZW5kaWYgLy8gSURCS2V5UGF0aF9oCmRpZmYg
LS1naXQgYS9XZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9nIGIvV2ViS2l0L2Nocm9taXVtL0NoYW5n
ZUxvZwppbmRleCA0YWFjZGFkNWI4MGNkMWM2N2UxNjViZTMzYThiZDE0OThlY2NkOWQ5Li45ZmM5
MGQyOGY3NWIyYjZjOTVjZjIwZTBhNjI5NWEyZGRmYmYzY2FlIDEwMDY0NAotLS0gYS9XZWJLaXQv
Y2hyb21pdW0vQ2hhbmdlTG9nCisrKyBiL1dlYktpdC9jaHJvbWl1bS9DaGFuZ2VMb2cKQEAgLTEs
MyArMSwyNiBAQAorMjAxMC0wNy0zMCAgTWFyY3VzIEJ1bGFjaCAgPGJ1bGFjaEBjaHJvbWl1bS5v
cmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgSW1w
bGVtZW50cyBJREJLZXlQYXRoIGV4dHJhY3Rvci4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtp
dC5vcmcvc2hvd19idWcuY2dpP2lkPTQzMjc2CisKKyAgICAgICAgVW5pdC10ZXN0IElEQktleVBh
dGhFeHRyYWN0b3JUZXN0LmNwcC4KKyAgICAgICAgTGF5b3V0VGVzdHMgd2lsbCBhcnJpdmUgYXMg
SW5kZXhlZERCIGluZnJhc3RydWN0dXJlIGlzIGZsZXNoZWQgb3V0LgorCisgICAgICAgICogV2Vi
S2l0Lmd5cDoKKyAgICAgICAgKiBwdWJsaWMvV2ViSURCS2V5UGF0aEV4dHJhY3Rvci5oOiBBZGRl
ZC4KKyAgICAgICAgKiBzcmMvV2ViSURCS2V5UGF0aEV4dHJhY3Rvci5jcHA6IEFkZGVkLgorICAg
ICAgICAoV2ViS2l0OjpXZWJJREJLZXlQYXRoRXh0cmFjdG9yKToKKyAgICAgICAgKiB0ZXN0cy9J
REJLZXlQYXRoRXh0cmFjdG9yVGVzdC5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6TG9j
YWxDb250ZXh0OjpMb2NhbENvbnRleHQpOgorICAgICAgICAoV2ViQ29yZTo6TG9jYWxDb250ZXh0
Ojp+TG9jYWxDb250ZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OlRFU1QpOgorICAgICAgICAqIHRl
c3RzL0lEQktleVBhdGhUZXN0LmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpFeHBlY3Rl
ZFRva2VuOjpFeHBlY3RlZFRva2VuKToKKyAgICAgICAgKFdlYkNvcmU6OmNoZWNrS2V5UGF0aCk6
CisgICAgICAgIChXZWJDb3JlOjpURVNUKToKKwogMjAxMC0wNy0yOSAgQW5kcmVpIFBvcGVzY3Ug
IDxhbmRyZWlwQGdvb2dsZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgSmVyZW15IE9ybG93
LgpkaWZmIC0tZ2l0IGEvV2ViS2l0L2Nocm9taXVtL1dlYktpdC5neXAgYi9XZWJLaXQvY2hyb21p
dW0vV2ViS2l0Lmd5cAppbmRleCA5N2VmZGRjYjU3MTNkMzFkYmZhMzZkYmNiMTI0ZjBjMTgwMjAw
ZmEzLi40NTQ3YWE2NTdmZGY0MzgxYzE4YmE0YjEzOGFkZmYwMzZmNjI3YzY5IDEwMDY0NAotLS0g
YS9XZWJLaXQvY2hyb21pdW0vV2ViS2l0Lmd5cAorKysgYi9XZWJLaXQvY2hyb21pdW0vV2ViS2l0
Lmd5cApAQCAtMTgwLDYgKzE4MCw3IEBACiAgICAgICAgICAgICAgICAgJ3B1YmxpYy9XZWJJREJE
YXRhYmFzZUVycm9yLmgnLAogICAgICAgICAgICAgICAgICdwdWJsaWMvV2ViSURCSW5kZXguaCcs
CiAgICAgICAgICAgICAgICAgJ3B1YmxpYy9XZWJJREJLZXkuaCcsCisgICAgICAgICAgICAgICAg
J3B1YmxpYy9XZWJJREJLZXlQYXRoRXh0cmFjdG9yLmgnLAogICAgICAgICAgICAgICAgICdwdWJs
aWMvV2ViSURCT2JqZWN0U3RvcmUuaCcsCiAgICAgICAgICAgICAgICAgJ3B1YmxpYy9XZWJJbmRl
eGVkRGF0YWJhc2UuaCcsCiAgICAgICAgICAgICAgICAgJ3B1YmxpYy9XZWJJbnB1dEVsZW1lbnQu
aCcsCkBAIC00MjAsNiArNDIxLDcgQEAKICAgICAgICAgICAgICAgICAnc3JjL1dlYklEQkluZGV4
SW1wbC5jcHAnLAogICAgICAgICAgICAgICAgICdzcmMvV2ViSURCSW5kZXhJbXBsLmgnLAogICAg
ICAgICAgICAgICAgICdzcmMvV2ViSURCS2V5LmNwcCcsCisgICAgICAgICAgICAgICAgJ3NyYy9X
ZWJJREJLZXlQYXRoRXh0cmFjdG9yLmNwcCcsCiAgICAgICAgICAgICAgICAgJ3NyYy9XZWJJREJP
YmplY3RTdG9yZUltcGwuY3BwJywKICAgICAgICAgICAgICAgICAnc3JjL1dlYklEQk9iamVjdFN0
b3JlSW1wbC5oJywKICAgICAgICAgICAgICAgICAnc3JjL1dlYkltYWdlQ0cuY3BwJywKQEAgLTcw
Myw2ICs3MDUsOCBAQAogICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAg
ICAnc291cmNlcyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0cy9EcmFnSW1hZ2VU
ZXN0LmNwcCcsCisgICAgICAgICAgICAgICAgICAgICAgICAndGVzdHMvSURCS2V5UGF0aFRlc3Qu
Y3BwJywKKyAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0cy9JREJLZXlQYXRoRXh0cmFjdG9y
VGVzdC5jcHAnLAogICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3RzL0tleWJvYXJkVGVzdC5j
cHAnLAogICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3RzL0tVUkxUZXN0LmNwcCcsCiAgICAg
ICAgICAgICAgICAgICAgICAgICAndGVzdHMvUnVuQWxsVGVzdHMuY3BwJywKZGlmZiAtLWdpdCBh
L1dlYktpdC9jaHJvbWl1bS9wdWJsaWMvV2ViSURCS2V5UGF0aEV4dHJhY3Rvci5oIGIvV2ViS2l0
L2Nocm9taXVtL3B1YmxpYy9XZWJJREJLZXlQYXRoRXh0cmFjdG9yLmgKbmV3IGZpbGUgbW9kZSAx
MDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uZWE1
ZDgxNzJmMzY3ZTdhZGU0ZGY2NDE5MDQ1YTEwNWViYTJkZjg0NAotLS0gL2Rldi9udWxsCisrKyBi
L1dlYktpdC9jaHJvbWl1bS9wdWJsaWMvV2ViSURCS2V5UGF0aEV4dHJhY3Rvci5oCkBAIC0wLDAg
KzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK
KyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICog
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQor
ICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0Yg
VVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICog
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4KKyAqLworCisjaWZuZGVmIFdlYklEQktleVBhdGhFeHRyYWN0b3JfaAorI2RlZmlu
ZSBXZWJJREJLZXlQYXRoRXh0cmFjdG9yX2gKKworI2luY2x1ZGUgIldlYlN0cmluZy5oIgorCitu
YW1lc3BhY2UgV2ViS2l0IHsKKwordm9pZCBXZWJJREJLZXlQYXRoRXh0cmFjdG9yKGNvbnN0IFdl
YlN0cmluZyYgc2VyaWFsaXplZFNjcmlwdFZhbHVlLCBjb25zdCBXZWJTdHJpbmcmIGlkYktleVBh
dGgsIFdlYlN0cmluZyogdmFsdWUpOworCit9IC8vIG5hbWVzcGFjZSBXZWJLaXQKKworI2VuZGlm
IC8vIFdlYklEQktleVBhdGhFeHRyYWN0b3JfaApkaWZmIC0tZ2l0IGEvV2ViS2l0L2Nocm9taXVt
L3NyYy9XZWJJREJLZXlQYXRoRXh0cmFjdG9yLmNwcCBiL1dlYktpdC9jaHJvbWl1bS9zcmMvV2Vi
SURCS2V5UGF0aEV4dHJhY3Rvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uYTZlMjQzMmRkZGIxZjQxMjE4ZWY4
Y2NmZTU2ZTQwM2YwZmJiYjE5YQotLS0gL2Rldi9udWxsCisrKyBiL1dlYktpdC9jaHJvbWl1bS9z
cmMvV2ViSURCS2V5UGF0aEV4dHJhY3Rvci5jcHAKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENv
cHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5E
IElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisg
KiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBP
UiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBB
TlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNp
bmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJXZWJJREJLZXlQYXRoRXh0cmFjdG9yLmgiCisK
KyNpbmNsdWRlICJTZXJpYWxpemVkU2NyaXB0VmFsdWUuaCIKKworbmFtZXNwYWNlIFdlYktpdCB7
CisKK3ZvaWQgV2ViSURCS2V5UGF0aEV4dHJhY3Rvcihjb25zdCBXZWJTdHJpbmcmIHNlcmlhbGl6
ZWRTY3JpcHRWYWx1ZSwgY29uc3QgV2ViU3RyaW5nJiBpZGJLZXlQYXRoLCBXZWJTdHJpbmcqIHZh
bHVlKQoreworICAgICp2YWx1ZSA9IFdlYkNvcmU6OmtleVBhdGhFeHRyYWN0b3Ioc2VyaWFsaXpl
ZFNjcmlwdFZhbHVlLCBpZGJLZXlQYXRoKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViS2l0CisK
ZGlmZiAtLWdpdCBhL1dlYktpdC9jaHJvbWl1bS90ZXN0cy9JREJLZXlQYXRoRXh0cmFjdG9yVGVz
dC5jcHAgYi9XZWJLaXQvY2hyb21pdW0vdGVzdHMvSURCS2V5UGF0aEV4dHJhY3RvclRlc3QuY3Bw
Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAuLjlkNDBiMzAwODFkMDY0MThmZmRlYzk5ZDg0ODdkNGY1NmVhYzYxMzgKLS0t
IC9kZXYvbnVsbAorKysgYi9XZWJLaXQvY2hyb21pdW0vdGVzdHMvSURCS2V5UGF0aEV4dHJhY3Rv
clRlc3QuY3BwCkBAIC0wLDAgKzEsMTI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdv
b2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAi
QVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAq
IERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMg
QkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJ
QUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5U
RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VU
IE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgor
I2luY2x1ZGUgIklEQktleVBhdGguaCIKKyNpbmNsdWRlICJTZXJpYWxpemVkU2NyaXB0VmFsdWUu
aCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgor
CisjaWYgRU5BQkxFKElOREVYRURfREFUQUJBU0UpCisKK3VzaW5nIG5hbWVzcGFjZSBXZWJDb3Jl
OworCituYW1lc3BhY2UgeworCitjbGFzcyBMb2NhbENvbnRleHQgeworcHVibGljOgorICAgIExv
Y2FsQ29udGV4dCgpCisgICAgICAgIDogbV9jb250ZXh0KHY4OjpDb250ZXh0OjpOZXcoMCwgdjg6
OkhhbmRsZTx2ODo6T2JqZWN0VGVtcGxhdGU+KCksIHY4OjpIYW5kbGU8djg6OlZhbHVlPigpKSkK
KyAgICB7CisgICAgICAgIG1fY29udGV4dC0+RW50ZXIoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFs
IH5Mb2NhbENvbnRleHQoKQorICAgIHsKKyAgICAgIG1fY29udGV4dC0+RXhpdCgpOworICAgICAg
bV9jb250ZXh0LkRpc3Bvc2UoKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgdjg6OlBlcnNpc3Rl
bnQ8djg6OkNvbnRleHQ+IG1fY29udGV4dDsKK307CisKK1RFU1QoSURCS2V5UGF0aEV4dHJhY3Rv
clRlc3QsIEV4dHJhY3RUb3BMZXZlbFByb3BlcnR5VmFsdWUpCit7CisgICAgdjg6OkhhbmRsZVNj
b3BlIHNjb3BlOworICAgIExvY2FsQ29udGV4dCBlbnY7CisgICAgdjg6OkxvY2FsPHY4OjpPYmpl
Y3Q+IG9iamVjdCA9IHY4OjpPYmplY3Q6Ok5ldygpOworICAgIG9iamVjdC0+U2V0KHY4OjpTdHJp
bmc6Ok5ldygiZm9vIiksIHY4OjpTdHJpbmc6Ok5ldygiem9vIikpOworCisgICAgUmVmUHRyPFNl
cmlhbGl6ZWRTY3JpcHRWYWx1ZT4gc2VyaWFsaXplZFNjcmlwdFZhbHVlID0gU2VyaWFsaXplZFNj
cmlwdFZhbHVlOjpjcmVhdGUob2JqZWN0KTsKKworICAgIFN0cmluZyB3aXJlU3RyaW5nID0gc2Vy
aWFsaXplZFNjcmlwdFZhbHVlLT50b1dpcmVTdHJpbmcoKTsKKyAgICBGSUxFKiBmb28gPSBmb3Bl
bigiL3RtcC9mb28iLCAidyIpOworICAgIGZ3cml0ZShyZWludGVycHJldF9jYXN0PGNvbnN0IHVp
bnQ4X3QqPih3aXJlU3RyaW5nLmltcGwoKS0+Y2hhcmFjdGVycygpKSwgMSwgMiAqIHdpcmVTdHJp
bmcubGVuZ3RoKCksIGZvbyk7CisgICAgZmNsb3NlKGZvbyk7CisgICAgRVhQRUNUX1RSVUUoInpv
byIgPT0ga2V5UGF0aEV4dHJhY3Rvcih3aXJlU3RyaW5nLCAiZm9vIikpOworICAgIEVYUEVDVF9U
UlVFKFN0cmluZygpID09IGtleVBhdGhFeHRyYWN0b3Iod2lyZVN0cmluZywgImJhciIpKTsKKyAg
ICBFWFBFQ1RfVFJVRShTdHJpbmcoKSA9PSBrZXlQYXRoRXh0cmFjdG9yKHdpcmVTdHJpbmcsICJb
M10iKSk7Cit9CisKK1RFU1QoSURCS2V5UGF0aEV4dHJhY3RvclRlc3QsIEV4dHJhY3RUb3BMZXZl
bEFycmF5RWxlbWVudCkKK3sKKyAgICB2ODo6SGFuZGxlU2NvcGUgc2NvcGU7CisgICAgTG9jYWxD
b250ZXh0IGVudjsKKyAgICB2ODo6TG9jYWw8djg6OkFycmF5PiBhcnJheSA9IHY4OjpBcnJheTo6
TmV3KCk7CisgICAgYXJyYXktPlNldCgzLCB2ODo6U3RyaW5nOjpOZXcoInpvbyIpKTsKKworICAg
IFJlZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+IHNlcmlhbGl6ZWRTY3JpcHRWYWx1ZSA9IFNl
cmlhbGl6ZWRTY3JpcHRWYWx1ZTo6Y3JlYXRlKGFycmF5KTsKKworICAgIFN0cmluZyB3aXJlU3Ry
aW5nID0gc2VyaWFsaXplZFNjcmlwdFZhbHVlLT50b1dpcmVTdHJpbmcoKTsKKyAgICBFWFBFQ1Rf
VFJVRShTdHJpbmcoKSA9PSBrZXlQYXRoRXh0cmFjdG9yKHdpcmVTdHJpbmcsICJmb28iKSk7Cisg
ICAgRVhQRUNUX1RSVUUoU3RyaW5nKCkgPT0ga2V5UGF0aEV4dHJhY3Rvcih3aXJlU3RyaW5nLCAi
YmFyIikpOworICAgIEVYUEVDVF9UUlVFKCJ6b28iID09IGtleVBhdGhFeHRyYWN0b3Iod2lyZVN0
cmluZywgIlszXSIpKTsKK30KKworVEVTVChJREJLZXlQYXRoRXh0cmFjdG9yVGVzdCwgRXh0cmFj
dFN1YlByb3BlcnR5KQoreworICAgIHY4OjpIYW5kbGVTY29wZSBzY29wZTsKKyAgICBMb2NhbENv
bnRleHQgZW52OworICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBvYmplY3QgPSB2ODo6T2JqZWN0
OjpOZXcoKTsKKyAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gc3ViUHJvcGVydHkgPSB2ODo6T2Jq
ZWN0OjpOZXcoKTsKKyAgICBzdWJQcm9wZXJ0eS0+U2V0KHY4OjpTdHJpbmc6Ok5ldygiYmFyIiks
IHY4OjpTdHJpbmc6Ok5ldygiemVlIikpOworICAgIG9iamVjdC0+U2V0KHY4OjpTdHJpbmc6Ok5l
dygiZm9vIiksIHN1YlByb3BlcnR5KTsKKworICAgIFJlZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFs
dWU+IHNlcmlhbGl6ZWRTY3JpcHRWYWx1ZSA9IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6Y3JlYXRl
KG9iamVjdCk7CisKKyAgICBTdHJpbmcgd2lyZVN0cmluZyA9IHNlcmlhbGl6ZWRTY3JpcHRWYWx1
ZS0+dG9XaXJlU3RyaW5nKCk7CisgICAgRVhQRUNUX1RSVUUoInplZSIgPT0ga2V5UGF0aEV4dHJh
Y3Rvcih3aXJlU3RyaW5nLCAiZm9vLmJhciIpKTsKKyAgICBFWFBFQ1RfVFJVRSgiW29iamVjdCBP
YmplY3RdIiA9PSBrZXlQYXRoRXh0cmFjdG9yKHdpcmVTdHJpbmcsICJmb28iKSk7CisgICAgRVhQ
RUNUX1RSVUUoU3RyaW5nKCkgPT0ga2V5UGF0aEV4dHJhY3Rvcih3aXJlU3RyaW5nLCAiYmFyIikp
OworICAgIEVYUEVDVF9UUlVFKFN0cmluZygpID09IGtleVBhdGhFeHRyYWN0b3Iod2lyZVN0cmlu
ZywgIlszXSIpKTsKK30KKworVEVTVChJREJLZXlQYXRoRXh0cmFjdG9yVGVzdCwgRXh0cmFjdDJE
QXJyYXkpCit7CisgICAgdjg6OkhhbmRsZVNjb3BlIHNjb3BlOworICAgIExvY2FsQ29udGV4dCBl
bnY7CisgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IG9iamVjdCA9IHY4OjpPYmplY3Q6Ok5ldygp
OworICAgIHY4OjpMb2NhbDx2ODo6QXJyYXk+IGFycmF5ID0gdjg6OkFycmF5OjpOZXcoKTsKKyAg
ICB2ODo6TG9jYWw8djg6OkFycmF5PiBzdWJBcnJheSA9IHY4OjpBcnJheTo6TmV3KCk7CisgICAg
c3ViQXJyYXktPlNldCg3LCB2ODo6U3RyaW5nOjpOZXcoInplZSIpKTsKKyAgICBhcnJheS0+U2V0
KDMsIHN1YkFycmF5KTsKKyAgICBvYmplY3QtPlNldCh2ODo6U3RyaW5nOjpOZXcoImZvbyIpLCBh
cnJheSk7CisKKyAgICBSZWZQdHI8U2VyaWFsaXplZFNjcmlwdFZhbHVlPiBzZXJpYWxpemVkU2Ny
aXB0VmFsdWUgPSBTZXJpYWxpemVkU2NyaXB0VmFsdWU6OmNyZWF0ZShvYmplY3QpOworCisgICAg
U3RyaW5nIHdpcmVTdHJpbmcgPSBzZXJpYWxpemVkU2NyaXB0VmFsdWUtPnRvV2lyZVN0cmluZygp
OworICAgIEVYUEVDVF9UUlVFKCJ6ZWUiID09IGtleVBhdGhFeHRyYWN0b3Iod2lyZVN0cmluZywg
ImZvb1szXVs3XSIpKTsKKyAgICBFWFBFQ1RfVFJVRShTdHJpbmcoKSA9PSBrZXlQYXRoRXh0cmFj
dG9yKHdpcmVTdHJpbmcsICJiYXIiKSk7CisgICAgRVhQRUNUX1RSVUUoU3RyaW5nKCkgPT0ga2V5
UGF0aEV4dHJhY3Rvcih3aXJlU3RyaW5nLCAiWzRdIikpOworfQorCit9IC8vIG5hbWVzcGFjZQor
CisjZW5kaWYgLy8gRU5BQkxFKElOREVYRURfREFUQUJBU0UpCmRpZmYgLS1naXQgYS9XZWJLaXQv
Y2hyb21pdW0vdGVzdHMvSURCS2V5UGF0aFRlc3QuY3BwIGIvV2ViS2l0L2Nocm9taXVtL3Rlc3Rz
L0lEQktleVBhdGhUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi40Y2E4ZjNhNmM0ZjM0MWZlMjZlN2UxMTgx
NjZkMWM3MWI3OTk2MDIwCi0tLSAvZGV2L251bGwKKysrIGIvV2ViS2l0L2Nocm9taXVtL3Rlc3Rz
L0lEQktleVBhdGhUZXN0LmNwcApAQCAtMCwwICsxLDE2NSBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05U
UklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBP
U0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09O
VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZ
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJj
b25maWcuaCIKKyNpbmNsdWRlICJJREJLZXlQYXRoLmgiCisKKyNpbmNsdWRlIDxndGVzdC9ndGVz
dC5oPgorI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKworI2lmIEVOQUJMRShJTkRFWEVEX0RBVEFC
QVNFKQorCit1c2luZyBuYW1lc3BhY2UgV2ViQ29yZTsKKworbmFtZXNwYWNlIHsKKworc3RydWN0
IEV4cGVjdGVkVG9rZW4geworICAgIFN0cmluZyBpZGVudGlmaWVyOworICAgIGJvb2wgaGFzSW5k
ZXg7CisgICAgaW50IGluZGV4VmFsdWU7CisgICAgRXhwZWN0ZWRUb2tlbihjb25zdCBTdHJpbmcm
IHBJZGVudGlmaWVyLCBib29sIHBIYXNJbmRleCwgIGludCBwSW5kZXhWYWx1ZSkKKyAgICB7Cisg
ICAgICAgIGlkZW50aWZpZXIgPSBwSWRlbnRpZmllcjsKKyAgICAgICAgaGFzSW5kZXggPSBwSGFz
SW5kZXg7CisgICAgICAgIGluZGV4VmFsdWUgPSBwSW5kZXhWYWx1ZTsKKyAgICB9Cit9OworCit2
b2lkIGNoZWNrS2V5UGF0aChjb25zdCBTdHJpbmcmIGtleVBhdGgsIGNvbnN0IFZlY3RvcjxFeHBl
Y3RlZFRva2VuPiYgZXhwZWN0ZWQsIGludCBwYXJzZXJFcnJvcikKK3sKKworICAgIFJlZlB0cjxJ
REJLZXlQYXRoPiBpZGJLZXlQYXRoID0gSURCS2V5UGF0aDo6Y3JlYXRlKGtleVBhdGgpOworICAg
IGludCBpID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpZGJLZXlQYXRoLT5oYXNOZXh0KCk7IGlkYktl
eVBhdGgtPm5leHQoKSwgKytpKSB7CisgICAgICAgIEFTU0VSVF9UUlVFKGkgPCBleHBlY3RlZC5z
aXplKCkpOworICAgICAgICBFWFBFQ1RfVFJVRShleHBlY3RlZFtpXS5pZGVudGlmaWVyID09IGlk
YktleVBhdGgtPmlkZW50aWZpZXIoKSkgPDwgaTsKKyAgICAgICAgRVhQRUNUX0VRKGV4cGVjdGVk
W2ldLmhhc0luZGV4LCBpZGJLZXlQYXRoLT5oYXNJbmRleCgpKSA8PCBpOworICAgICAgICBFWFBF
Q1RfRVEoZXhwZWN0ZWRbaV0uaW5kZXhWYWx1ZSwgaWRiS2V5UGF0aC0+aW5kZXhWYWx1ZSgpKSA8
PCBpOworICAgIH0KKyAgICBFWFBFQ1RfRVEoaSwgZXhwZWN0ZWQuc2l6ZSgpKTsKKyAgICBFWFBF
Q1RfRVEocGFyc2VyRXJyb3IsIGlkYktleVBhdGgtPnBhcnNlckVycm9yKCkpOworfQorCitURVNU
KElEQktleVBhdGhUZXN0LCBWYWxpZEtleVBhdGgwKQoreworICAgIFZlY3RvcjxFeHBlY3RlZFRv
a2VuPiBleHBlY3RlZDsKKyAgICBTdHJpbmcga2V5UGF0aCgiZm9vLmJhci56b28iKTsKKyAgICBl
eHBlY3RlZC5hcHBlbmQoRXhwZWN0ZWRUb2tlbigiZm9vIiwgZmFsc2UsIDApKTsKKyAgICBleHBl
Y3RlZC5hcHBlbmQoRXhwZWN0ZWRUb2tlbigiYmFyIiwgZmFsc2UsIDApKTsKKyAgICBleHBlY3Rl
ZC5hcHBlbmQoRXhwZWN0ZWRUb2tlbigiem9vIiwgZmFsc2UsIDApKTsKKyAgICBjaGVja0tleVBh
dGgoa2V5UGF0aCwgZXhwZWN0ZWQsIDApOworfQorCitURVNUKElEQktleVBhdGhUZXN0LCBWYWxp
ZEtleVBhdGgxKQoreworICAgIFZlY3RvcjxFeHBlY3RlZFRva2VuPiBleHBlY3RlZDsKKyAgICBT
dHJpbmcga2V5UGF0aCgiYVszNF1bMjBdLmZvb1syXS5iYXIiKTsKKyAgICBleHBlY3RlZC5hcHBl
bmQoRXhwZWN0ZWRUb2tlbigiYSIsIGZhbHNlLCAwKSk7CisgICAgZXhwZWN0ZWQuYXBwZW5kKEV4
cGVjdGVkVG9rZW4oU3RyaW5nKCksIHRydWUsIDM0KSk7CisgICAgZXhwZWN0ZWQuYXBwZW5kKEV4
cGVjdGVkVG9rZW4oU3RyaW5nKCksIHRydWUsIDIwKSk7CisgICAgZXhwZWN0ZWQuYXBwZW5kKEV4
cGVjdGVkVG9rZW4oImZvbyIsIGZhbHNlLCAwKSk7CisgICAgZXhwZWN0ZWQuYXBwZW5kKEV4cGVj
dGVkVG9rZW4oU3RyaW5nKCksIHRydWUsIDIpKTsKKyAgICBleHBlY3RlZC5hcHBlbmQoRXhwZWN0
ZWRUb2tlbigiYmFyIiwgZmFsc2UsIDApKTsKKyAgICBjaGVja0tleVBhdGgoa2V5UGF0aCwgZXhw
ZWN0ZWQsIDApOworfQorCitURVNUKElEQktleVBhdGhUZXN0LCBWYWxpZEtleVBhdGgyKQorewor
ICAgIFZlY3RvcjxFeHBlY3RlZFRva2VuPiBleHBlY3RlZDsKKyAgICBTdHJpbmcga2V5UGF0aCgi
Zm9vWyAzNCBdLlpvb19bMDAwMjNdXHQuX2MiKTsKKyAgICBleHBlY3RlZC5hcHBlbmQoRXhwZWN0
ZWRUb2tlbigiZm9vIiwgZmFsc2UsIDApKTsKKyAgICBleHBlY3RlZC5hcHBlbmQoRXhwZWN0ZWRU
b2tlbihTdHJpbmcoKSwgdHJ1ZSwgMzQpKTsKKyAgICBleHBlY3RlZC5hcHBlbmQoRXhwZWN0ZWRU
b2tlbigiWm9vXyIsIGZhbHNlLCAwKSk7CisgICAgZXhwZWN0ZWQuYXBwZW5kKEV4cGVjdGVkVG9r
ZW4oU3RyaW5nKCksIHRydWUsIDIzKSk7CisgICAgZXhwZWN0ZWQuYXBwZW5kKEV4cGVjdGVkVG9r
ZW4oIl9jIiwgZmFsc2UsIDApKTsKKyAgICBjaGVja0tleVBhdGgoa2V5UGF0aCwgZXhwZWN0ZWQs
IDApOworfQorCitURVNUKElEQktleVBhdGhUZXN0LCBJbnZhbGlkS2V5UGF0aDIpCit7CisgICAg
VmVjdG9yPEV4cGVjdGVkVG9rZW4+IGV4cGVjdGVkOworICAgIFN0cmluZyBrZXlQYXRoKCJhW1sz
NF1dLmJbMl0uYyIpOworICAgIGV4cGVjdGVkLmFwcGVuZChFeHBlY3RlZFRva2VuKCJhIiwgZmFs
c2UsIDApKTsKKyAgICBjaGVja0tleVBhdGgoa2V5UGF0aCwgZXhwZWN0ZWQsIDMpOworfQorCitU
RVNUKElEQktleVBhdGhUZXN0LCBJbnZhbGlkS2V5UGF0aDMpCit7CisgICAgVmVjdG9yPEV4cGVj
dGVkVG9rZW4+IGV4cGVjdGVkOworICAgIFN0cmluZyBrZXlQYXRoKCJhW1szNF0uYlsyXS5jIik7
CisgICAgZXhwZWN0ZWQuYXBwZW5kKEV4cGVjdGVkVG9rZW4oImEiLCBmYWxzZSwgMCkpOworICAg
IGNoZWNrS2V5UGF0aChrZXlQYXRoLCBleHBlY3RlZCwgMyk7Cit9CisKK1RFU1QoSURCS2V5UGF0
aFRlc3QsIEludmFsaWRLZXlQYXRoNSkKK3sKKyAgICBWZWN0b3I8RXhwZWN0ZWRUb2tlbj4gZXhw
ZWN0ZWQ7CisgICAgU3RyaW5nIGtleVBhdGgoImFbWzM0LmJbMl0uYyIpOworICAgIGV4cGVjdGVk
LmFwcGVuZChFeHBlY3RlZFRva2VuKCJhIiwgZmFsc2UsIDApKTsKKyAgICBjaGVja0tleVBhdGgo
a2V5UGF0aCwgZXhwZWN0ZWQsIDMpOworfQorCitURVNUKElEQktleVBhdGhUZXN0LCBJbnZhbGlk
S2V5UGF0aDYpCit7CisgICAgVmVjdG9yPEV4cGVjdGVkVG9rZW4+IGV4cGVjdGVkOworICAgIFN0
cmluZyBrZXlQYXRoKCIrYVszNF0uYlsyXS5jIik7CisgICAgY2hlY2tLZXlQYXRoKGtleVBhdGgs
IGV4cGVjdGVkLCAxKTsKK30KKworVEVTVChJREJLZXlQYXRoVGVzdCwgSW52YWxpZEtleVBhdGg3
KQoreworICAgIFZlY3RvcjxFeHBlY3RlZFRva2VuPiBleHBlY3RlZDsKKyAgICBTdHJpbmcga2V5
UGF0aCgiJWFbMzRdLmJbMl0uYyIpOworICAgIGNoZWNrS2V5UGF0aChrZXlQYXRoLCBleHBlY3Rl
ZCwgMSk7Cit9CisKK1RFU1QoSURCS2V5UGF0aFRlc3QsIEludmFsaWRLZXlQYXRoOCkKK3sKKyAg
ICBWZWN0b3I8RXhwZWN0ZWRUb2tlbj4gZXhwZWN0ZWQ7CisgICAgU3RyaW5nIGtleVBhdGgoImF7
WzM0XX0uYlsyXS5jIik7CisgICAgZXhwZWN0ZWQuYXBwZW5kKEV4cGVjdGVkVG9rZW4oImEiLCBm
YWxzZSwgMCkpOworICAgIGNoZWNrS2V5UGF0aChrZXlQYXRoLCBleHBlY3RlZCwgMik7Cit9CisK
K1RFU1QoSURCS2V5UGF0aFRlc3QsIEludmFsaWRLZXlQYXRoOSkKK3sKKyAgICBWZWN0b3I8RXhw
ZWN0ZWRUb2tlbj4gZXhwZWN0ZWQ7CisgICAgU3RyaW5nIGtleVBhdGgoImEuLmJbMl0uYyIpOwor
ICAgIGV4cGVjdGVkLmFwcGVuZChFeHBlY3RlZFRva2VuKCJhIiwgZmFsc2UsIDApKTsKKyAgICBj
aGVja0tleVBhdGgoa2V5UGF0aCwgZXhwZWN0ZWQsIDUpOworfQorCitURVNUKElEQktleVBhdGhU
ZXN0LCBJbnZhbGlkS2V5UGF0aDEwKQoreworICAgIFZlY3RvcjxFeHBlY3RlZFRva2VuPiBleHBl
Y3RlZDsKKyAgICBTdHJpbmcga2V5UGF0aCgiYVszNF1iLmZvb1syXS5iYXIiKTsKKyAgICBleHBl
Y3RlZC5hcHBlbmQoRXhwZWN0ZWRUb2tlbigiYSIsIGZhbHNlLCAwKSk7CisgICAgZXhwZWN0ZWQu
YXBwZW5kKEV4cGVjdGVkVG9rZW4oU3RyaW5nKCksIHRydWUsIDM0KSk7CisgICAgY2hlY2tLZXlQ
YXRoKGtleVBhdGgsIGV4cGVjdGVkLCA0KTsKK30KKworfSAvLyBuYW1lc3BhY2UKKworI2VuZGlm
IC8vIEVOQUJMRShJTkRFWEVEX0RBVEFCQVNFKQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>63117</attachid>
            <date>2010-07-30 16:14:16 -0700</date>
            <delta_ts>2010-08-03 03:02:22 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-43276-20100731001412.patch</filename>
            <type>text/plain</type>
            <size>34570</size>
            <attacher name="Marcus Bulach">bulach</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
YThjZWFlOWYzMzMzYjM5MWE1ZTlkYTBjNTg1MjdlY2RlOTU1ZmI1ZS4uM2Q2NzZmZDBiYmNkMGJl
NzQ2ODM2OWI0MGEzNjU0YTY2ZjU1NWQzMyAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cK
KysrIGIvV2ViQ29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSw0MCBAQAorMjAxMC0wNy0zMCAgTWFy
Y3VzIEJ1bGFjaCAgPGJ1bGFjaEBjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkg
Tk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgSW1wbGVtZW50cyBJREJLZXlQYXRoIGV4dHJhY3Rv
ci4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTQzMjc2
CisKKyAgICAgICAgVW5pdC10ZXN0IElEQktleVBhdGhFeHRyYWN0b3JUZXN0LmNwcC4KKyAgICAg
ICAgTGF5b3V0VGVzdHMgd2lsbCBhcnJpdmUgYXMgSW5kZXhlZERCIGluZnJhc3RydWN0dXJlIGlz
IGZsZXNoZWQgb3V0LgorCisgICAgICAgICogV2ViQ29yZS5neXBpOgorICAgICAgICAqIGJpbmRp
bmdzL3Y4L1NlcmlhbGl6ZWRTY3JpcHRWYWx1ZS5jcHA6CisgICAgICAgIChXZWJDb3JlOjprZXlQ
YXRoRXh0cmFjdG9yKToKKyAgICAgICAgKiBiaW5kaW5ncy92OC9TZXJpYWxpemVkU2NyaXB0VmFs
dWUuaDoKKyAgICAgICAgKiBzdG9yYWdlL0lEQktleVBhdGguY3BwOiBBZGRlZC4KKyAgICAgICAg
KFdlYkNvcmU6OklEQktleVBhdGg6OmNyZWF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpJREJLZXlQ
YXRoOjpJREJLZXlQYXRoKToKKyAgICAgICAgKFdlYkNvcmU6OklEQktleVBhdGg6On5JREJLZXlQ
YXRoKToKKyAgICAgICAgKFdlYkNvcmU6OklEQktleVBhdGg6Omhhc05leHQpOgorICAgICAgICAo
V2ViQ29yZTo6SURCS2V5UGF0aDo6bmV4dCk6CisgICAgICAgIChXZWJDb3JlOjpJREJLZXlQYXRo
OjppZGVudGlmaWVyKToKKyAgICAgICAgKFdlYkNvcmU6OklEQktleVBhdGg6Omhhc0luZGV4KToK
KyAgICAgICAgKFdlYkNvcmU6OklEQktleVBhdGg6OmluZGV4VmFsdWUpOgorICAgICAgICAoV2Vi
Q29yZTo6SURCS2V5UGF0aDo6cGFyc2VyRXJyb3IpOgorICAgICAgICAoV2ViQ29yZTo6SURCS2V5
UGF0aDo6cGFyc2UpOgorICAgICAgICAoV2ViQ29yZTo6SURCS2V5UGF0aDo6TGV4ZXI6OmxleCk6
CisgICAgICAgIChXZWJDb3JlOjppc1NhZmVJZGVudGlmaWVyU3RhcnRDaGFyYWN0ZXIpOgorICAg
ICAgICAoV2ViQ29yZTo6aXNTYWZlSWRlbnRpZmllckNoYXJhY3Rlcik6CisgICAgICAgIChXZWJD
b3JlOjpJREJLZXlQYXRoOjpMZXhlcjo6bGV4SWRlbnRpZmllcik6CisgICAgICAgIChXZWJDb3Jl
OjpJREJLZXlQYXRoOjpMZXhlcjo6bGV4TnVtYmVyKToKKyAgICAgICAgKiBzdG9yYWdlL0lEQktl
eVBhdGguaDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpJREJLZXlQYXRoOjpUb2tlbjo6VG9r
ZW4pOgorICAgICAgICAoV2ViQ29yZTo6SURCS2V5UGF0aDo6KToKKyAgICAgICAgKFdlYkNvcmU6
OklEQktleVBhdGg6OkxleGVyOjpMZXhlcik6CisgICAgICAgIChXZWJDb3JlOjpJREJLZXlQYXRo
OjpMZXhlcjo6bmV4dCk6CisgICAgICAgIChXZWJDb3JlOjpJREJLZXlQYXRoOjpMZXhlcjo6Y3Vy
cmVudFRva2VuKToKKwogMjAxMC0wNy0yOSAgQWxleGFuZGVyIFBhdmxvdiAgPGFwYXZsb3ZAY2hy
b21pdW0ub3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5IFBhdmVsIEZlbGRtYW4uCmRpZmYgLS1n
aXQgYS9XZWJDb3JlL1dlYkNvcmUuZ3lwaSBiL1dlYkNvcmUvV2ViQ29yZS5neXBpCmluZGV4IDY5
OGUzMDI1NmJiN2ZiZGU3MzI2NjBiMWFhZTA2YThhMzI2NGE4ZjIuLmI4YjAzY2Q2ZDMwNjY1ZmE2
M2VhNzA4ZGMzNGYzM2M4MWRiOThiYjcgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvV2ViQ29yZS5neXBp
CisrKyBiL1dlYkNvcmUvV2ViQ29yZS5neXBpCkBAIC0zNDg5LDYgKzM0ODksOCBAQAogICAgICAg
ICAgICAgJ3N0b3JhZ2UvSURCSW5kZXhSZXF1ZXN0LmgnLAogICAgICAgICAgICAgJ3N0b3JhZ2Uv
SURCS2V5LmNwcCcsCiAgICAgICAgICAgICAnc3RvcmFnZS9JREJLZXkuaCcsCisgICAgICAgICAg
ICAnc3RvcmFnZS9JREJLZXlQYXRoLmNwcCcsCisgICAgICAgICAgICAnc3RvcmFnZS9JREJLZXlQ
YXRoLmgnLAogICAgICAgICAgICAgJ3N0b3JhZ2UvSURCS2V5UmFuZ2UuY3BwJywKICAgICAgICAg
ICAgICdzdG9yYWdlL0lEQktleVJhbmdlLmgnLAogICAgICAgICAgICAgJ3N0b3JhZ2UvSURCS2V5
VHJlZS5oJywKZGlmZiAtLWdpdCBhL1dlYkNvcmUvYmluZGluZ3MvdjgvU2VyaWFsaXplZFNjcmlw
dFZhbHVlLmNwcCBiL1dlYkNvcmUvYmluZGluZ3MvdjgvU2VyaWFsaXplZFNjcmlwdFZhbHVlLmNw
cAppbmRleCA5ZGM0ZDBmY2JjZWE5ZDllMTQxNDNkN2I5ZTBkNzA2OWNlOTU2MTExLi5lN2FmYTli
ZDIzZjVlM2ZlMWJiODM1MGQzZjg1Mzc5ZGVmZTY4MzZhIDEwMDY0NAotLS0gYS9XZWJDb3JlL2Jp
bmRpbmdzL3Y4L1NlcmlhbGl6ZWRTY3JpcHRWYWx1ZS5jcHAKKysrIGIvV2ViQ29yZS9iaW5kaW5n
cy92OC9TZXJpYWxpemVkU2NyaXB0VmFsdWUuY3BwCkBAIC0zNyw2ICszNyw3IEBACiAjaW5jbHVk
ZSAiRXhjZXB0aW9uQ29kZS5oIgogI2luY2x1ZGUgIkZpbGUuaCIKICNpbmNsdWRlICJGaWxlTGlz
dC5oIgorI2luY2x1ZGUgIklEQktleVBhdGguaCIKICNpbmNsdWRlICJJbWFnZURhdGEuaCIKICNp
bmNsdWRlICJTaGFyZWRCdWZmZXIuaCIKICNpbmNsdWRlICJWOEJpbmRpbmcuaCIKQEAgLTEwOTUs
NCArMTA5NiwzMyBAQCB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gU2VyaWFsaXplZFNjcmlwdFZhbHVl
OjpkZXNlcmlhbGl6ZSgpCiAgICAgcmV0dXJuIGRlc2VyaWFsaXplci5kZXNlcmlhbGl6ZSgpOwog
fQogCitTdHJpbmcga2V5UGF0aEV4dHJhY3Rvcihjb25zdCBTdHJpbmcmIHdpcmVEYXRhLCBjb25z
dCBTdHJpbmcmIGtleVBhdGhTdHJpbmcpCit7CisgICAgdjg6OkhhbmRsZVNjb3BlIHNjb3BlOwor
ICAgIFJlZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+IHZhbHVlID0gU2VyaWFsaXplZFNjcmlw
dFZhbHVlOjpjcmVhdGVGcm9tV2lyZSh3aXJlRGF0YSk7CisgICAgUmVmUHRyPElEQktleVBhdGg+
IGtleVBhdGggPSBJREJLZXlQYXRoOjpjcmVhdGUoa2V5UGF0aFN0cmluZyk7CisgICAgdjg6Okhh
bmRsZTx2ODo6VmFsdWU+IHY4VmFsdWUodmFsdWUtPmRlc2VyaWFsaXplKCkpOworICAgIHdoaWxl
IChrZXlQYXRoLT5oYXNOZXh0KCkpIHsKKyAgICAgICAgaWYgKGtleVBhdGgtPmhhc0luZGV4KCkp
IHsKKyAgICAgICAgICAgIGlmICghdjhWYWx1ZS0+SXNBcnJheSgpKQorICAgICAgICAgICAgICAg
IHJldHVybiBTdHJpbmcoKTsKKyAgICAgICAgICAgIGludCBpbmRleCA9IGtleVBhdGgtPmluZGV4
VmFsdWUoKTsKKyAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBvYmplY3QgPSB2OFZh
bHVlLT5Ub09iamVjdCgpOworICAgICAgICAgICAgaWYgKCFvYmplY3QtPkhhcyhpbmRleCkpCisg
ICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZygpOworICAgICAgICAgICAgdjhWYWx1ZSA9IG9i
amVjdC0+R2V0KGluZGV4KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICghdjhW
YWx1ZS0+SXNPYmplY3QoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKCk7CisgICAg
ICAgICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gb2JqZWN0ID0gdjhWYWx1ZS0+VG9PYmplY3Qo
KTsKKyAgICAgICAgICAgIHY4OjpIYW5kbGU8djg6OlN0cmluZz4gaWRlbnRpZmllcih2OFN0cmlu
ZyhrZXlQYXRoLT5pZGVudGlmaWVyKCkpKTsKKyAgICAgICAgICAgIGlmICghb2JqZWN0LT5IYXMo
aWRlbnRpZmllcikpCisgICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZygpOworICAgICAgICAg
ICAgdjhWYWx1ZSA9IG9iamVjdC0+R2V0KGlkZW50aWZpZXIpOworICAgICAgICB9CisgICAgICAg
IGtleVBhdGgtPm5leHQoKTsKKyAgICB9CisgICAgcmV0dXJuIHY4U3RyaW5nVG9XZWJDb3JlU3Ry
aW5nKHY4VmFsdWUtPlRvU3RyaW5nKCkpOworfQorCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRp
ZmYgLS1naXQgYS9XZWJDb3JlL2JpbmRpbmdzL3Y4L1NlcmlhbGl6ZWRTY3JpcHRWYWx1ZS5oIGIv
V2ViQ29yZS9iaW5kaW5ncy92OC9TZXJpYWxpemVkU2NyaXB0VmFsdWUuaAppbmRleCAzNzEwYjVh
MjMxMDVhNmYxNjkzMTY1MGVhNTA4YjAyYjQ3ZTllMGQyLi4xNTY3YTkwZWVkMjAyYWU1Yzk2YmZk
NzkwZjEwNmFjZjFkZjYzZmI2IDEwMDY0NAotLS0gYS9XZWJDb3JlL2JpbmRpbmdzL3Y4L1Nlcmlh
bGl6ZWRTY3JpcHRWYWx1ZS5oCisrKyBiL1dlYkNvcmUvYmluZGluZ3MvdjgvU2VyaWFsaXplZFNj
cmlwdFZhbHVlLmgKQEAgLTc0LDYgKzc0LDggQEAgcHJpdmF0ZToKICAgICBTdHJpbmcgbV9kYXRh
OwogfTsKIAorU3RyaW5nIGtleVBhdGhFeHRyYWN0b3IoY29uc3QgU3RyaW5nJiB3aXJlRGF0YSwg
Y29uc3QgU3RyaW5nJiBrZXlQYXRoU3RyaW5nKTsKKwogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQog
CiAjZW5kaWYgLy8gU2VyaWFsaXplZFNjcmlwdFZhbHVlX2gKZGlmZiAtLWdpdCBhL1dlYkNvcmUv
c3RvcmFnZS9JREJLZXlQYXRoLmNwcCBiL1dlYkNvcmUvc3RvcmFnZS9JREJLZXlQYXRoLmNwcApu
ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwLi41NmIwMTVhNDI4NjZlOTA4MDA0NmM3NGRkNDA3YTU1YTZkNzQwNWEzCi0tLSAv
ZGV2L251bGwKKysrIGIvV2ViQ29yZS9zdG9yYWdlL0lEQktleVBhdGguY3BwCkBAIC0wLDAgKzEs
Mjk4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg
KgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAq
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVT
RSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIklEQktleVBhdGgu
aCIKKworI2luY2x1ZGUgIlN0cmluZ0J1aWxkZXIuaCIKKyNpbmNsdWRlIDx3dGYvQVNDSUlDVHlw
ZS5oPgorI2luY2x1ZGUgPHd0Zi9kdG9hLmg+CisKKyNpZiBFTkFCTEUoSU5ERVhFRF9EQVRBQkFT
RSkKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitQYXNzUmVmUHRyPElEQktleVBhdGg+IElEQktl
eVBhdGg6OmNyZWF0ZShjb25zdCBTdHJpbmcmIGtleVBhdGgpCit7CisgICAgUmVmUHRyPElEQktl
eVBhdGg+IGlkYktleVBhdGggPSBhZG9wdFJlZihuZXcgSURCS2V5UGF0aChrZXlQYXRoKSk7Cisg
ICAgaWRiS2V5UGF0aC0+cGFyc2UoKTsKKyAgICByZXR1cm4gaWRiS2V5UGF0aC5yZWxlYXNlKCk7
Cit9CisKK0lEQktleVBhdGg6OklEQktleVBhdGgoY29uc3QgU3RyaW5nJiBrZXlQYXRoKQorICAg
IDogbV9rZXlQYXRoKGtleVBhdGgpCisgICAgLCBtX2N1cnJlbnRUb2tlbigwKQorICAgICwgbV9s
ZXhlcihrZXlQYXRoKQoreworICAgIG1fbGV4ZXIubmV4dCgpOworfQorCitJREJLZXlQYXRoOjp+
SURCS2V5UGF0aCgpCit7Cit9CisKK2Jvb2wgSURCS2V5UGF0aDo6aGFzTmV4dCgpCit7CisgICAg
cmV0dXJuIG1fY3VycmVudFRva2VuIDwgbV90b2tlbnMuc2l6ZSgpOworfQorCit2b2lkIElEQktl
eVBhdGg6Om5leHQoKQoreworICAgIGlmIChtX2N1cnJlbnRUb2tlbiA8IG1fdG9rZW5zLnNpemUo
KSkKKyAgICAgICAgKyttX2N1cnJlbnRUb2tlbjsKK30KKworU3RyaW5nIElEQktleVBhdGg6Omlk
ZW50aWZpZXIoKQoreworICAgIGlmIChtX2N1cnJlbnRUb2tlbiA+PSBtX3Rva2Vucy5zaXplKCkp
CisgICAgICAgIHJldHVybiAiIjsKKyAgICByZXR1cm4gbV90b2tlbnNbbV9jdXJyZW50VG9rZW5d
LmlkZW50aWZpZXI7Cit9CisKK2Jvb2wgSURCS2V5UGF0aDo6aGFzSW5kZXgoKSBjb25zdAorewor
ICAgIGlmIChtX2N1cnJlbnRUb2tlbiA+PSBtX3Rva2Vucy5zaXplKCkpCisgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICByZXR1cm4gbV90b2tlbnNbbV9jdXJyZW50VG9rZW5dLmhhc0luZGV4Owor
fQorCitpbnQgSURCS2V5UGF0aDo6aW5kZXhWYWx1ZSgpIGNvbnN0Cit7CisgICAgaWYgKG1fY3Vy
cmVudFRva2VuID49IG1fdG9rZW5zLnNpemUoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
IHJldHVybiBtX3Rva2Vuc1ttX2N1cnJlbnRUb2tlbl0uaW5kZXhWYWx1ZTsKK30KKworaW50IElE
QktleVBhdGg6OnBhcnNlckVycm9yKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9wYXJzZXJFcnJv
cjsKK30KKwordm9pZCBJREJLZXlQYXRoOjpwYXJzZSgpCit7CisgICAgUGFyc2VyU3RhdGUgc3Rh
dGUgPSBTdGFydDsKKworICAgIHdoaWxlICgxKSB7CisgICAgICAgIHN3aXRjaCAoc3RhdGUpIHsK
KyAgICAgICAgY2FzZSBTdGFydCA6IHsKKyAgICAgICAgICAgIFRva2VuVHlwZSB0b2tlbiA9IG1f
bGV4ZXIuY3VycmVudFRva2VuKCkudHlwZTsKKyAgICAgICAgICAgIGlmICh0b2tlbiA9PSBUb2tJ
ZGVudGlmaWVyKSB7CisgICAgICAgICAgICAgICAgc3RhdGUgPSBJZGVudGlmaWVyOworICAgICAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRva2VuID09
IFRva0xCcmFja2V0KSB7CisgICAgICAgICAgICAgICAgc3RhdGUgPSBBcnJheTsKKyAgICAgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0b2tlbiA9PSBU
b2tFbmQpIHsKKyAgICAgICAgICAgICAgICBtX3BhcnNlckVycm9yID0gUGFyc2VFcnJvck5vbmU7
CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbV9w
YXJzZXJFcnJvciA9IFBhcnNlRXJyb3JTdGFydDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAg
ICAgfQorICAgICAgICBjYXNlIElkZW50aWZpZXIgOiB7CisgICAgICAgICAgICBMZXhlcjo6UGFy
c2VyVG9rZW4gdG9rZW4gPSBtX2xleGVyLmN1cnJlbnRUb2tlbigpOworICAgICAgICAgICAgQVNT
RVJUKHRva2VuLnR5cGUgPT0gVG9rSWRlbnRpZmllcik7CisgICAgICAgICAgICBUb2tlbiBpZGJU
b2tlbjsKKyAgICAgICAgICAgIGlkYlRva2VuLmlkZW50aWZpZXIgPSB0b2tlbi5zdHJpbmdUb2tl
bjsKKyAgICAgICAgICAgIG1fdG9rZW5zLmFwcGVuZChpZGJUb2tlbik7CisKKyAgICAgICAgICAg
IG1fbGV4ZXIubmV4dCgpOworICAgICAgICAgICAgdG9rZW4gPSBtX2xleGVyLmN1cnJlbnRUb2tl
bigpOworICAgICAgICAgICAgaWYgKHRva2VuLnR5cGUgPT0gVG9rRG90KSB7CisgICAgICAgICAg
ICAgICAgc3RhdGUgPSBEb3Q7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9
CisgICAgICAgICAgICBpZiAodG9rZW4udHlwZSA9PSBUb2tMQnJhY2tldCkgeworICAgICAgICAg
ICAgICAgIHN0YXRlID0gQXJyYXk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAg
ICB9CisgICAgICAgICAgICBpZiAodG9rZW4udHlwZSA9PSBUb2tFbmQpIHsKKyAgICAgICAgICAg
ICAgICBtX3BhcnNlckVycm9yID0gUGFyc2VFcnJvck5vbmU7CisgICAgICAgICAgICAgICAgcmV0
dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbV9wYXJzZXJFcnJvciA9IFBhcnNlRXJy
b3JJZGVudGlmaWVyOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGNh
c2UgQXJyYXkgOiB7CisgICAgICAgICAgICBMZXhlcjo6UGFyc2VyVG9rZW4gdG9rZW4gPSBtX2xl
eGVyLmN1cnJlbnRUb2tlbigpOworICAgICAgICAgICAgQVNTRVJUKHRva2VuLnR5cGUgPT0gVG9r
TEJyYWNrZXQpOworCisgICAgICAgICAgICBtX2xleGVyLm5leHQoKTsKKyAgICAgICAgICAgIHRv
a2VuID0gbV9sZXhlci5jdXJyZW50VG9rZW4oKTsKKyAgICAgICAgICAgIGlmICh0b2tlbi50eXBl
ICE9IFRva051bWJlcikgeworICAgICAgICAgICAgICAgIG1fcGFyc2VyRXJyb3IgPSBQYXJzZUVy
cm9yQXJyYXlJbmRleDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisK
KyAgICAgICAgICAgIEFTU0VSVCh0b2tlbi50eXBlID09IFRva051bWJlcik7CisgICAgICAgICAg
ICBUb2tlbiBpZGJUb2tlbjsKKyAgICAgICAgICAgIGlkYlRva2VuLmhhc0luZGV4ID0gdHJ1ZTsK
KyAgICAgICAgICAgIGlkYlRva2VuLmluZGV4VmFsdWUgPSB0b2tlbi5udW1iZXJUb2tlbjsKKyAg
ICAgICAgICAgIG1fdG9rZW5zLmFwcGVuZChpZGJUb2tlbik7CisKKyAgICAgICAgICAgIG1fbGV4
ZXIubmV4dCgpOworICAgICAgICAgICAgdG9rZW4gPSBtX2xleGVyLmN1cnJlbnRUb2tlbigpOwor
ICAgICAgICAgICAgaWYgKHRva2VuLnR5cGUgIT0gVG9rUkJyYWNrZXQpIHsKKyAgICAgICAgICAg
ICAgICBtX3BhcnNlckVycm9yID0gUGFyc2VFcnJvckFycmF5SW5kZXg7CisgICAgICAgICAgICAg
ICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtX2xleGVyLm5leHQoKTsK
KyAgICAgICAgICAgIHRva2VuID0gbV9sZXhlci5jdXJyZW50VG9rZW4oKTsKKyAgICAgICAgICAg
IGlmICh0b2tlbi50eXBlID09IFRva0RvdCkKKyAgICAgICAgICAgICAgICBzdGF0ZSA9IERvdDsK
KyAgICAgICAgICAgIGVsc2UgaWYgKHRva2VuLnR5cGUgPT0gVG9rTEJyYWNrZXQpCisgICAgICAg
ICAgICAgICAgc3RhdGUgPSBBcnJheTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAg
ICAgIG1fcGFyc2VyRXJyb3IgPSBQYXJzZXJFcnJvckFmdGVyQXJyYXk7CisgICAgICAgICAgICAg
ICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
fQorCisgICAgICAgIGNhc2UgRG90OiB7CisgICAgICAgICAgICBMZXhlcjo6UGFyc2VyVG9rZW4g
dG9rZW4gPSBtX2xleGVyLmN1cnJlbnRUb2tlbigpOworICAgICAgICAgICAgQVNTRVJUKHRva2Vu
LnR5cGUgPT0gVG9rRG90KTsKKworICAgICAgICAgICAgbV9sZXhlci5uZXh0KCk7CisgICAgICAg
ICAgICB0b2tlbiA9IG1fbGV4ZXIuY3VycmVudFRva2VuKCk7CisgICAgICAgICAgICBpZiAodG9r
ZW4udHlwZSAhPSBUb2tJZGVudGlmaWVyKSB7CisgICAgICAgICAgICAgICAgbV9wYXJzZXJFcnJv
ciA9IFBhcnNlRXJyb3JEb3Q7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAg
fQorCisgICAgICAgICAgICBzdGF0ZSA9IElkZW50aWZpZXI7CisgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitJREJLZXlQYXRoOjpUb2tlblR5cGUg
SURCS2V5UGF0aDo6TGV4ZXI6OmxleChQYXJzZXJUb2tlbiYgdG9rZW4pCit7CisgICAgd2hpbGUg
KG1fcHRyIDwgbV9lbmQgJiYgaXNBU0NJSVNwYWNlKCptX3B0cikpCisgICAgICAgICsrbV9wdHI7
CisKKyAgICBpZiAobV9wdHIgPj0gbV9lbmQpIHsKKyAgICAgICAgdG9rZW4udHlwZSA9IFRva0Vu
ZDsKKyAgICAgICAgdG9rZW4uc3RhcnQgPSBtX3B0cjsKKyAgICAgICAgdG9rZW4uZW5kID0gbV9w
dHI7CisgICAgICAgIHJldHVybiBUb2tFbmQ7CisgICAgfQorICAgIEFTU0VSVChtX3B0ciA8IG1f
ZW5kKTsKKyAgICB0b2tlbi50eXBlID0gVG9rRXJyb3I7CisgICAgdG9rZW4uc3RhcnQgPSBtX3B0
cjsKKyAgICBzd2l0Y2ggKCptX3B0cikgeworICAgIGNhc2UgJ1snOgorICAgICAgICB0b2tlbi50
eXBlID0gVG9rTEJyYWNrZXQ7CisgICAgICAgIHRva2VuLmVuZCA9ICsrbV9wdHI7CisgICAgICAg
IHJldHVybiBUb2tMQnJhY2tldDsKKyAgICBjYXNlICddJzoKKyAgICAgICAgdG9rZW4udHlwZSA9
IFRva1JCcmFja2V0OworICAgICAgICB0b2tlbi5lbmQgPSArK21fcHRyOworICAgICAgICByZXR1
cm4gVG9rUkJyYWNrZXQ7CisgICAgY2FzZSAnLic6CisgICAgICAgIHRva2VuLnR5cGUgPSBUb2tE
b3Q7CisgICAgICAgIHRva2VuLmVuZCA9ICsrbV9wdHI7CisgICAgICAgIHJldHVybiBUb2tEb3Q7
CisgICAgY2FzZSAnMCc6CisgICAgY2FzZSAnMSc6CisgICAgY2FzZSAnMic6CisgICAgY2FzZSAn
Myc6CisgICAgY2FzZSAnNCc6CisgICAgY2FzZSAnNSc6CisgICAgY2FzZSAnNic6CisgICAgY2Fz
ZSAnNyc6CisgICAgY2FzZSAnOCc6CisgICAgY2FzZSAnOSc6CisgICAgICAgIHJldHVybiBsZXhO
dW1iZXIodG9rZW4pOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBsZXhJZGVudGlmaWVy
KHRva2VuKTsKKyAgICB9CisgICAgcmV0dXJuIFRva0Vycm9yOworfQorCitzdGF0aWMgaW5saW5l
IGJvb2wgaXNTYWZlSWRlbnRpZmllclN0YXJ0Q2hhcmFjdGVyKFVDaGFyIGMpCit7CisgICAgcmV0
dXJuIGlzQVNDSUlBbHBoYShjKSB8fCAoYyA9PSAnXycpIHx8IChjID09ICckJyk7Cit9CisKK3N0
YXRpYyBpbmxpbmUgYm9vbCBpc1NhZmVJZGVudGlmaWVyQ2hhcmFjdGVyKFVDaGFyIGMpCit7Cisg
ICAgcmV0dXJuIGlzQVNDSUlBbHBoYW51bWVyaWMoYykgfHwgKGMgPT0gJ18nKSB8fCAoYyA9PSAn
JCcpOworfQorCitJREJLZXlQYXRoOjpUb2tlblR5cGUgSURCS2V5UGF0aDo6TGV4ZXI6OmxleElk
ZW50aWZpZXIoUGFyc2VyVG9rZW4mIHRva2VuKQoreworICAgIGNvbnN0IFVDaGFyKiBzdGFydCA9
IG1fcHRyOworICAgIGlmIChtX3B0ciA8IG1fZW5kICYmIGlzU2FmZUlkZW50aWZpZXJTdGFydENo
YXJhY3RlcigqbV9wdHIpKQorICAgICAgICArK21fcHRyOworICAgIGVsc2UKKyAgICAgICAgcmV0
dXJuIFRva0Vycm9yOworCisgICAgd2hpbGUgKG1fcHRyIDwgbV9lbmQgJiYgaXNTYWZlSWRlbnRp
ZmllckNoYXJhY3RlcigqbV9wdHIpKQorICAgICAgICArK21fcHRyOworCisgICAgU3RyaW5nIGlk
ZW50aWZpZXI7CisgICAgaWYgKHN0YXJ0IDwgbV9wdHIpCisgICAgICAgIGlkZW50aWZpZXIgPSBT
dHJpbmcoc3RhcnQsIG1fcHRyIC0gc3RhcnQpOworCisgICAgdG9rZW4uc3RyaW5nVG9rZW4gPSBp
ZGVudGlmaWVyOworICAgIHRva2VuLnR5cGUgPSBUb2tJZGVudGlmaWVyOworICAgIHRva2VuLmVu
ZCA9IG1fcHRyOworICAgIHJldHVybiBUb2tJZGVudGlmaWVyOworfQorCitJREJLZXlQYXRoOjpU
b2tlblR5cGUgSURCS2V5UGF0aDo6TGV4ZXI6OmxleE51bWJlcihQYXJzZXJUb2tlbiYgdG9rZW4p
Cit7CisgICAgY29uc3QgVUNoYXIqIHN0YXJ0ID0gbV9wdHI7CisgICAgaWYgKG1fcHRyIDwgbV9l
bmQpIHsKKyAgICAgICAgLy8gWzAtOV0qCisgICAgICAgIHdoaWxlIChtX3B0ciA8IG1fZW5kICYm
IGlzQVNDSUlEaWdpdCgqbV9wdHIpKQorICAgICAgICAgICAgKyttX3B0cjsKKyAgICB9IGVsc2UK
KyAgICAgICAgcmV0dXJuIFRva0Vycm9yOworCisgICAgU3RyaW5nIG51bWJlckFzU3RyaW5nOwor
ICAgIGlmIChzdGFydCA8IG1fcHRyKSB7CisgICAgICAgIG51bWJlckFzU3RyaW5nID0gU3RyaW5n
KHN0YXJ0LCBtX3B0ciAtIHN0YXJ0KTsKKyAgICAgICAgYm9vbCBvayA9IGZhbHNlOworICAgICAg
ICBpbnQgbnVtYmVyID0gbnVtYmVyQXNTdHJpbmcudG9JbnRTdHJpY3QoJm9rKTsKKyAgICAgICAg
aWYgKCFvaykKKyAgICAgICAgICAgIHJldHVybiBUb2tFcnJvcjsKKyAgICAgICAgdG9rZW4udHlw
ZSA9IFRva051bWJlcjsKKyAgICAgICAgdG9rZW4ubnVtYmVyVG9rZW4gPSBudW1iZXI7CisgICAg
ICAgIHRva2VuLmVuZCA9IG1fcHRyOworICAgICAgICByZXR1cm4gVG9rTnVtYmVyOworICAgIH0K
KyAgICByZXR1cm4gVG9rRXJyb3I7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2Vu
ZGlmIC8vIEVOQUJMRShJTkRFWEVEX0RBVEFCQVNFKQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9zdG9y
YWdlL0lEQktleVBhdGguaCBiL1dlYkNvcmUvc3RvcmFnZS9JREJLZXlQYXRoLmgKbmV3IGZpbGUg
bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MC4uNzM3YWNjOWU4YTIyMDYwNDE5YjA5MmI3MjE2ZjVlNGFjOGQ0NzA4ZAotLS0gL2Rldi9udWxs
CisrKyBiL1dlYkNvcmUvc3RvcmFnZS9JREJLZXlQYXRoLmgKQEAgLTAsMCArMSwxMjcgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiAg
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1Q
TElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwg
QVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBP
UiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAor
ICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAq
LworCisjaWZuZGVmIElEQktleVBhdGhfaAorI2RlZmluZSBJREJLZXlQYXRoX2gKKworI2lmIEVO
QUJMRShJTkRFWEVEX0RBVEFCQVNFKQorCisjaW5jbHVkZSA8d3RmL1Bhc3NSZWZQdHIuaD4KKyNp
bmNsdWRlIDx3dGYvUmVmQ291bnRlZC5oPgorI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKyNpbmNs
dWRlIDx3dGYvdGV4dC9XVEZTdHJpbmcuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFz
cyBJREJLZXlQYXRoIDogcHVibGljIFJlZkNvdW50ZWQ8SURCS2V5UGF0aD4geworcHVibGljOgor
ICAgIHN0YXRpYyBQYXNzUmVmUHRyPElEQktleVBhdGg+IGNyZWF0ZShjb25zdCBTdHJpbmcmKTsK
KyAgICB+SURCS2V5UGF0aCgpOworCisgICAgYm9vbCBoYXNOZXh0KCk7CisgICAgdm9pZCBuZXh0
KCk7CisgICAgU3RyaW5nIGlkZW50aWZpZXIoKTsKKyAgICBib29sIGhhc0luZGV4KCkgY29uc3Q7
CisgICAgaW50IGluZGV4VmFsdWUoKSBjb25zdDsKKworICAgIGludCBwYXJzZXJFcnJvcigpIGNv
bnN0OworCitwcml2YXRlOgorICAgIHN0cnVjdCBUb2tlbiB7CisgICAgICAgIFN0cmluZyBpZGVu
dGlmaWVyOworICAgICAgICBib29sIGhhc0luZGV4OworICAgICAgICBpbnQgaW5kZXhWYWx1ZTsK
KyAgICAgICAgVG9rZW4oKSA6IGhhc0luZGV4KGZhbHNlKSwgaW5kZXhWYWx1ZSgwKSB7fQorICAg
IH07CisgICAgZXhwbGljaXQgSURCS2V5UGF0aChjb25zdCBTdHJpbmcmKTsKKworICAgIFN0cmlu
ZyBtX2tleVBhdGg7CisgICAgVmVjdG9yPFRva2VuPiBtX3Rva2VuczsKKyAgICBpbnQgbV9jdXJy
ZW50VG9rZW47CisgICAgaW50IG1fcGFyc2VyRXJyb3I7CisKKyAgICAvLyBUaGlzIGlzIGEgc2lt
cGxpZmllZCBwYXJzZXIgbG9vc2VseSBiYXNlZCBvbiBMaXRlcmFsUGFyc2VyLgorICAgIC8vIEFu
IElEQktleVBhdGggaXMgZGVmaW5lZCBhcyBhIHNlcXVlbmNlIG9mOgorICAgIC8vIGlkZW50aWZp
ZXJBey5pZGVudGlmaWVyQntbbnVtZXJpY192YWx1ZV19CisgICAgLy8gd2hlcmUgInt9IiByZXBy
ZXNlbnRzIGFuIG9wdGlvbmFsIHBhcnQKKyAgICAvLyBUaGUgYmFzaWMgc3RhdGUgbWFjaGluZSBp
czoKKyAgICAvLyBTdGFydCA9PiB7SWRlbnRpZmllciwgQXJyYXl9CisgICAgLy8gSWRlbnRpZmll
ciA9PiB7RG90LCBBcnJheX0KKyAgICAvLyBBcnJheSA9PiB7U3RhcnQsIERvdH0KKyAgICAvLyBE
b3QgPT4ge0lkZW50aWZpZXJ9CisgICAgLy8gSXQgYmFpbHMgb3V0IGFzIHNvb24gYXMgaXQgZmlu
ZHMgYW4gZXJyb3IsIGJ1dCBkb2Vzbid0IGRpc2NhcmQgdGhlIGJpdHMgaXQgbWFuYWdlZCB0byBw
YXJzZS4KKyAgICBlbnVtIFBhcnNlclN0YXRlIHsgIFN0YXJ0LCBJZGVudGlmaWVyLCBBcnJheSwg
RG90IH07CisgICAgZW51bSBUb2tlblR5cGUgeyBUb2tMQnJhY2tldCwgVG9rUkJyYWNrZXQsCisg
ICAgICAgICAgICAgICAgICAgICBUb2tJZGVudGlmaWVyLCBUb2tOdW1iZXIsCisgICAgICAgICAg
ICAgICAgICAgICBUb2tEb3QsIFRva0VuZCwgVG9rRXJyb3IgfTsKKyAgICBlbnVtIFBhcnNlRXJy
b3IgeyBQYXJzZUVycm9yTm9uZSwgUGFyc2VFcnJvclN0YXJ0LCBQYXJzZUVycm9ySWRlbnRpZmll
ciwKKyAgICAgICAgICAgICAgICAgICAgICBQYXJzZUVycm9yQXJyYXlJbmRleCwgUGFyc2VyRXJy
b3JBZnRlckFycmF5LCBQYXJzZUVycm9yRG90fTsKKworICAgIHZvaWQgcGFyc2UoKTsKKworICAg
IGNsYXNzIExleGVyIHsKKyAgICBwdWJsaWM6CisgICAgICAgIHN0cnVjdCBQYXJzZXJUb2tlbiB7
CisgICAgICAgICAgICBUb2tlblR5cGUgdHlwZTsKKyAgICAgICAgICAgIGNvbnN0IFVDaGFyKiBz
dGFydDsKKyAgICAgICAgICAgIGNvbnN0IFVDaGFyKiBlbmQ7CisgICAgICAgICAgICBTdHJpbmcg
c3RyaW5nVG9rZW47CisgICAgICAgICAgICBkb3VibGUgbnVtYmVyVG9rZW47CisgICAgICAgIH07
CisgICAgICAgIGV4cGxpY2l0IExleGVyKGNvbnN0IFN0cmluZyYgcykKKyAgICAgICAgICAgIDog
bV9zdHJpbmcocykKKyAgICAgICAgICAgICwgbV9wdHIocy5jaGFyYWN0ZXJzKCkpCisgICAgICAg
ICAgICAsIG1fZW5kKHMuY2hhcmFjdGVycygpICsgcy5sZW5ndGgoKSkKKyAgICAgICAgeworICAg
ICAgICB9CisKKyAgICAgICAgVG9rZW5UeXBlIG5leHQoKQorICAgICAgICB7CisgICAgICAgICAg
ICByZXR1cm4gbGV4KG1fY3VycmVudFRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0
IFBhcnNlclRva2VuJiBjdXJyZW50VG9rZW4oKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1
cm4gbV9jdXJyZW50VG9rZW47CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIFRv
a2VuVHlwZSBsZXgoUGFyc2VyVG9rZW4mKTsKKyAgICAgICAgVG9rZW5UeXBlIGxleElkZW50aWZp
ZXIoUGFyc2VyVG9rZW4mKTsKKyAgICAgICAgVG9rZW5UeXBlIGxleE51bWJlcihQYXJzZXJUb2tl
biYpOworICAgICAgICBQYXJzZXJUb2tlbiBtX2N1cnJlbnRUb2tlbjsKKyAgICAgICAgU3RyaW5n
IG1fc3RyaW5nOworICAgICAgICBjb25zdCBVQ2hhciogbV9wdHI7CisgICAgICAgIGNvbnN0IFVD
aGFyKiBtX2VuZDsKKyAgICAgfTsKKworICAgIExleGVyIG1fbGV4ZXI7Cit9OworCit9IC8vIG5h
bWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZgorCisjZW5kaWYgLy8gSURCS2V5UGF0aF9oCmRpZmYg
LS1naXQgYS9XZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9nIGIvV2ViS2l0L2Nocm9taXVtL0NoYW5n
ZUxvZwppbmRleCA0YWFjZGFkNWI4MGNkMWM2N2UxNjViZTMzYThiZDE0OThlY2NkOWQ5Li45ZmM5
MGQyOGY3NWIyYjZjOTVjZjIwZTBhNjI5NWEyZGRmYmYzY2FlIDEwMDY0NAotLS0gYS9XZWJLaXQv
Y2hyb21pdW0vQ2hhbmdlTG9nCisrKyBiL1dlYktpdC9jaHJvbWl1bS9DaGFuZ2VMb2cKQEAgLTEs
MyArMSwyNiBAQAorMjAxMC0wNy0zMCAgTWFyY3VzIEJ1bGFjaCAgPGJ1bGFjaEBjaHJvbWl1bS5v
cmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgSW1w
bGVtZW50cyBJREJLZXlQYXRoIGV4dHJhY3Rvci4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtp
dC5vcmcvc2hvd19idWcuY2dpP2lkPTQzMjc2CisKKyAgICAgICAgVW5pdC10ZXN0IElEQktleVBh
dGhFeHRyYWN0b3JUZXN0LmNwcC4KKyAgICAgICAgTGF5b3V0VGVzdHMgd2lsbCBhcnJpdmUgYXMg
SW5kZXhlZERCIGluZnJhc3RydWN0dXJlIGlzIGZsZXNoZWQgb3V0LgorCisgICAgICAgICogV2Vi
S2l0Lmd5cDoKKyAgICAgICAgKiBwdWJsaWMvV2ViSURCS2V5UGF0aEV4dHJhY3Rvci5oOiBBZGRl
ZC4KKyAgICAgICAgKiBzcmMvV2ViSURCS2V5UGF0aEV4dHJhY3Rvci5jcHA6IEFkZGVkLgorICAg
ICAgICAoV2ViS2l0OjpXZWJJREJLZXlQYXRoRXh0cmFjdG9yKToKKyAgICAgICAgKiB0ZXN0cy9J
REJLZXlQYXRoRXh0cmFjdG9yVGVzdC5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6TG9j
YWxDb250ZXh0OjpMb2NhbENvbnRleHQpOgorICAgICAgICAoV2ViQ29yZTo6TG9jYWxDb250ZXh0
Ojp+TG9jYWxDb250ZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OlRFU1QpOgorICAgICAgICAqIHRl
c3RzL0lEQktleVBhdGhUZXN0LmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpFeHBlY3Rl
ZFRva2VuOjpFeHBlY3RlZFRva2VuKToKKyAgICAgICAgKFdlYkNvcmU6OmNoZWNrS2V5UGF0aCk6
CisgICAgICAgIChXZWJDb3JlOjpURVNUKToKKwogMjAxMC0wNy0yOSAgQW5kcmVpIFBvcGVzY3Ug
IDxhbmRyZWlwQGdvb2dsZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgSmVyZW15IE9ybG93
LgpkaWZmIC0tZ2l0IGEvV2ViS2l0L2Nocm9taXVtL1dlYktpdC5neXAgYi9XZWJLaXQvY2hyb21p
dW0vV2ViS2l0Lmd5cAppbmRleCA5N2VmZGRjYjU3MTNkMzFkYmZhMzZkYmNiMTI0ZjBjMTgwMjAw
ZmEzLi40NTQ3YWE2NTdmZGY0MzgxYzE4YmE0YjEzOGFkZmYwMzZmNjI3YzY5IDEwMDY0NAotLS0g
YS9XZWJLaXQvY2hyb21pdW0vV2ViS2l0Lmd5cAorKysgYi9XZWJLaXQvY2hyb21pdW0vV2ViS2l0
Lmd5cApAQCAtMTgwLDYgKzE4MCw3IEBACiAgICAgICAgICAgICAgICAgJ3B1YmxpYy9XZWJJREJE
YXRhYmFzZUVycm9yLmgnLAogICAgICAgICAgICAgICAgICdwdWJsaWMvV2ViSURCSW5kZXguaCcs
CiAgICAgICAgICAgICAgICAgJ3B1YmxpYy9XZWJJREJLZXkuaCcsCisgICAgICAgICAgICAgICAg
J3B1YmxpYy9XZWJJREJLZXlQYXRoRXh0cmFjdG9yLmgnLAogICAgICAgICAgICAgICAgICdwdWJs
aWMvV2ViSURCT2JqZWN0U3RvcmUuaCcsCiAgICAgICAgICAgICAgICAgJ3B1YmxpYy9XZWJJbmRl
eGVkRGF0YWJhc2UuaCcsCiAgICAgICAgICAgICAgICAgJ3B1YmxpYy9XZWJJbnB1dEVsZW1lbnQu
aCcsCkBAIC00MjAsNiArNDIxLDcgQEAKICAgICAgICAgICAgICAgICAnc3JjL1dlYklEQkluZGV4
SW1wbC5jcHAnLAogICAgICAgICAgICAgICAgICdzcmMvV2ViSURCSW5kZXhJbXBsLmgnLAogICAg
ICAgICAgICAgICAgICdzcmMvV2ViSURCS2V5LmNwcCcsCisgICAgICAgICAgICAgICAgJ3NyYy9X
ZWJJREJLZXlQYXRoRXh0cmFjdG9yLmNwcCcsCiAgICAgICAgICAgICAgICAgJ3NyYy9XZWJJREJP
YmplY3RTdG9yZUltcGwuY3BwJywKICAgICAgICAgICAgICAgICAnc3JjL1dlYklEQk9iamVjdFN0
b3JlSW1wbC5oJywKICAgICAgICAgICAgICAgICAnc3JjL1dlYkltYWdlQ0cuY3BwJywKQEAgLTcw
Myw2ICs3MDUsOCBAQAogICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAg
ICAnc291cmNlcyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0cy9EcmFnSW1hZ2VU
ZXN0LmNwcCcsCisgICAgICAgICAgICAgICAgICAgICAgICAndGVzdHMvSURCS2V5UGF0aFRlc3Qu
Y3BwJywKKyAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0cy9JREJLZXlQYXRoRXh0cmFjdG9y
VGVzdC5jcHAnLAogICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3RzL0tleWJvYXJkVGVzdC5j
cHAnLAogICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3RzL0tVUkxUZXN0LmNwcCcsCiAgICAg
ICAgICAgICAgICAgICAgICAgICAndGVzdHMvUnVuQWxsVGVzdHMuY3BwJywKZGlmZiAtLWdpdCBh
L1dlYktpdC9jaHJvbWl1bS9wdWJsaWMvV2ViSURCS2V5UGF0aEV4dHJhY3Rvci5oIGIvV2ViS2l0
L2Nocm9taXVtL3B1YmxpYy9XZWJJREJLZXlQYXRoRXh0cmFjdG9yLmgKbmV3IGZpbGUgbW9kZSAx
MDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uZWE1
ZDgxNzJmMzY3ZTdhZGU0ZGY2NDE5MDQ1YTEwNWViYTJkZjg0NAotLS0gL2Rldi9udWxsCisrKyBi
L1dlYktpdC9jaHJvbWl1bS9wdWJsaWMvV2ViSURCS2V5UGF0aEV4dHJhY3Rvci5oCkBAIC0wLDAg
KzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK
KyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICog
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQor
ICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0Yg
VVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICog
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4KKyAqLworCisjaWZuZGVmIFdlYklEQktleVBhdGhFeHRyYWN0b3JfaAorI2RlZmlu
ZSBXZWJJREJLZXlQYXRoRXh0cmFjdG9yX2gKKworI2luY2x1ZGUgIldlYlN0cmluZy5oIgorCitu
YW1lc3BhY2UgV2ViS2l0IHsKKwordm9pZCBXZWJJREJLZXlQYXRoRXh0cmFjdG9yKGNvbnN0IFdl
YlN0cmluZyYgc2VyaWFsaXplZFNjcmlwdFZhbHVlLCBjb25zdCBXZWJTdHJpbmcmIGlkYktleVBh
dGgsIFdlYlN0cmluZyogdmFsdWUpOworCit9IC8vIG5hbWVzcGFjZSBXZWJLaXQKKworI2VuZGlm
IC8vIFdlYklEQktleVBhdGhFeHRyYWN0b3JfaApkaWZmIC0tZ2l0IGEvV2ViS2l0L2Nocm9taXVt
L3NyYy9XZWJJREJLZXlQYXRoRXh0cmFjdG9yLmNwcCBiL1dlYktpdC9jaHJvbWl1bS9zcmMvV2Vi
SURCS2V5UGF0aEV4dHJhY3Rvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uYTZlMjQzMmRkZGIxZjQxMjE4ZWY4
Y2NmZTU2ZTQwM2YwZmJiYjE5YQotLS0gL2Rldi9udWxsCisrKyBiL1dlYktpdC9jaHJvbWl1bS9z
cmMvV2ViSURCS2V5UGF0aEV4dHJhY3Rvci5jcHAKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENv
cHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5E
IElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisg
KiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBP
UiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBB
TlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNp
bmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJXZWJJREJLZXlQYXRoRXh0cmFjdG9yLmgiCisK
KyNpbmNsdWRlICJTZXJpYWxpemVkU2NyaXB0VmFsdWUuaCIKKworbmFtZXNwYWNlIFdlYktpdCB7
CisKK3ZvaWQgV2ViSURCS2V5UGF0aEV4dHJhY3Rvcihjb25zdCBXZWJTdHJpbmcmIHNlcmlhbGl6
ZWRTY3JpcHRWYWx1ZSwgY29uc3QgV2ViU3RyaW5nJiBpZGJLZXlQYXRoLCBXZWJTdHJpbmcqIHZh
bHVlKQoreworICAgICp2YWx1ZSA9IFdlYkNvcmU6OmtleVBhdGhFeHRyYWN0b3Ioc2VyaWFsaXpl
ZFNjcmlwdFZhbHVlLCBpZGJLZXlQYXRoKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViS2l0CisK
ZGlmZiAtLWdpdCBhL1dlYktpdC9jaHJvbWl1bS90ZXN0cy9JREJLZXlQYXRoRXh0cmFjdG9yVGVz
dC5jcHAgYi9XZWJLaXQvY2hyb21pdW0vdGVzdHMvSURCS2V5UGF0aEV4dHJhY3RvclRlc3QuY3Bw
Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAuLjMzZWFiNDZhN2I5MDk4YjE0NTliYTM2NGViOWM1YWMyMGYxM2Q3NzIKLS0t
IC9kZXYvbnVsbAorKysgYi9XZWJLaXQvY2hyb21pdW0vdGVzdHMvSURCS2V5UGF0aEV4dHJhY3Rv
clRlc3QuY3BwCkBAIC0wLDAgKzEsMTI2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdv
b2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAi
QVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAq
IERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMg
QkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJ
QUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5U
RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VU
IE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgor
I2luY2x1ZGUgIklEQktleVBhdGguaCIKKyNpbmNsdWRlICJTZXJpYWxpemVkU2NyaXB0VmFsdWUu
aCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgor
CisjaWYgRU5BQkxFKElOREVYRURfREFUQUJBU0UpCisKK3VzaW5nIG5hbWVzcGFjZSBXZWJDb3Jl
OworCituYW1lc3BhY2UgeworCitjbGFzcyBMb2NhbENvbnRleHQgeworcHVibGljOgorICAgIExv
Y2FsQ29udGV4dCgpCisgICAgICAgIDogbV9jb250ZXh0KHY4OjpDb250ZXh0OjpOZXcoMCwgdjg6
OkhhbmRsZTx2ODo6T2JqZWN0VGVtcGxhdGU+KCksIHY4OjpIYW5kbGU8djg6OlZhbHVlPigpKSkK
KyAgICB7CisgICAgICAgIG1fY29udGV4dC0+RW50ZXIoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFs
IH5Mb2NhbENvbnRleHQoKQorICAgIHsKKyAgICAgIG1fY29udGV4dC0+RXhpdCgpOworICAgICAg
bV9jb250ZXh0LkRpc3Bvc2UoKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgdjg6OlBlcnNpc3Rl
bnQ8djg6OkNvbnRleHQ+IG1fY29udGV4dDsKK307CisKK1RFU1QoSURCS2V5UGF0aEV4dHJhY3Rv
clRlc3QsIEV4dHJhY3RUb3BMZXZlbFByb3BlcnR5VmFsdWUpCit7CisgICAgdjg6OkhhbmRsZVNj
b3BlIHNjb3BlOworICAgIExvY2FsQ29udGV4dCBlbnY7CisgICAgdjg6OkxvY2FsPHY4OjpPYmpl
Y3Q+IG9iamVjdCA9IHY4OjpPYmplY3Q6Ok5ldygpOworICAgIG9iamVjdC0+U2V0KHY4OjpTdHJp
bmc6Ok5ldygiZm9vIiksIHY4OjpTdHJpbmc6Ok5ldygiem9vIikpOworCisgICAgUmVmUHRyPFNl
cmlhbGl6ZWRTY3JpcHRWYWx1ZT4gc2VyaWFsaXplZFNjcmlwdFZhbHVlID0gU2VyaWFsaXplZFNj
cmlwdFZhbHVlOjpjcmVhdGUob2JqZWN0KTsKKworICAgIFN0cmluZyB3aXJlU3RyaW5nID0gc2Vy
aWFsaXplZFNjcmlwdFZhbHVlLT50b1dpcmVTdHJpbmcoKTsKKyAgICBFWFBFQ1RfVFJVRSgiem9v
IiA9PSBrZXlQYXRoRXh0cmFjdG9yKHdpcmVTdHJpbmcsICJmb28iKSk7CisgICAgRVhQRUNUX1RS
VUUoU3RyaW5nKCkgPT0ga2V5UGF0aEV4dHJhY3Rvcih3aXJlU3RyaW5nLCAiYmFyIikpOworICAg
IEVYUEVDVF9UUlVFKFN0cmluZygpID09IGtleVBhdGhFeHRyYWN0b3Iod2lyZVN0cmluZywgIlsz
XSIpKTsKK30KKworVEVTVChJREJLZXlQYXRoRXh0cmFjdG9yVGVzdCwgRXh0cmFjdFRvcExldmVs
QXJyYXlFbGVtZW50KQoreworICAgIHY4OjpIYW5kbGVTY29wZSBzY29wZTsKKyAgICBMb2NhbENv
bnRleHQgZW52OworICAgIHY4OjpMb2NhbDx2ODo6QXJyYXk+IGFycmF5ID0gdjg6OkFycmF5OjpO
ZXcoKTsKKyAgICBhcnJheS0+U2V0KDMsIHY4OjpTdHJpbmc6Ok5ldygiem9vIikpOworCisgICAg
UmVmUHRyPFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZT4gc2VyaWFsaXplZFNjcmlwdFZhbHVlID0gU2Vy
aWFsaXplZFNjcmlwdFZhbHVlOjpjcmVhdGUoYXJyYXkpOworCisgICAgU3RyaW5nIHdpcmVTdHJp
bmcgPSBzZXJpYWxpemVkU2NyaXB0VmFsdWUtPnRvV2lyZVN0cmluZygpOworICAgIEVYUEVDVF9U
UlVFKFN0cmluZygpID09IGtleVBhdGhFeHRyYWN0b3Iod2lyZVN0cmluZywgImZvbyIpKTsKKyAg
ICBFWFBFQ1RfVFJVRShTdHJpbmcoKSA9PSBrZXlQYXRoRXh0cmFjdG9yKHdpcmVTdHJpbmcsICJi
YXIiKSk7CisgICAgRVhQRUNUX1RSVUUoInpvbyIgPT0ga2V5UGF0aEV4dHJhY3Rvcih3aXJlU3Ry
aW5nLCAiWzNdIikpOworfQorCitURVNUKElEQktleVBhdGhFeHRyYWN0b3JUZXN0LCBFeHRyYWN0
U3ViUHJvcGVydHkpCit7CisgICAgdjg6OkhhbmRsZVNjb3BlIHNjb3BlOworICAgIExvY2FsQ29u
dGV4dCBlbnY7CisgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IG9iamVjdCA9IHY4OjpPYmplY3Q6
Ok5ldygpOworICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBzdWJQcm9wZXJ0eSA9IHY4OjpPYmpl
Y3Q6Ok5ldygpOworICAgIHN1YlByb3BlcnR5LT5TZXQodjg6OlN0cmluZzo6TmV3KCJiYXIiKSwg
djg6OlN0cmluZzo6TmV3KCJ6ZWUiKSk7CisgICAgb2JqZWN0LT5TZXQodjg6OlN0cmluZzo6TmV3
KCJmb28iKSwgc3ViUHJvcGVydHkpOworCisgICAgUmVmUHRyPFNlcmlhbGl6ZWRTY3JpcHRWYWx1
ZT4gc2VyaWFsaXplZFNjcmlwdFZhbHVlID0gU2VyaWFsaXplZFNjcmlwdFZhbHVlOjpjcmVhdGUo
b2JqZWN0KTsKKworICAgIFN0cmluZyB3aXJlU3RyaW5nID0gc2VyaWFsaXplZFNjcmlwdFZhbHVl
LT50b1dpcmVTdHJpbmcoKTsKKyAgICBFWFBFQ1RfVFJVRSgiemVlIiA9PSBrZXlQYXRoRXh0cmFj
dG9yKHdpcmVTdHJpbmcsICJmb28uYmFyIikpOworICAgIEVYUEVDVF9UUlVFKCJbb2JqZWN0IE9i
amVjdF0iID09IGtleVBhdGhFeHRyYWN0b3Iod2lyZVN0cmluZywgImZvbyIpKTsKKyAgICBFWFBF
Q1RfVFJVRShTdHJpbmcoKSA9PSBrZXlQYXRoRXh0cmFjdG9yKHdpcmVTdHJpbmcsICJiYXIiKSk7
CisgICAgRVhQRUNUX1RSVUUoU3RyaW5nKCkgPT0ga2V5UGF0aEV4dHJhY3Rvcih3aXJlU3RyaW5n
LCAiWzNdIikpOworfQorCitURVNUKElEQktleVBhdGhFeHRyYWN0b3JUZXN0LCBFeHRyYWN0MkRB
cnJheSkKK3sKKyAgICB2ODo6SGFuZGxlU2NvcGUgc2NvcGU7CisgICAgTG9jYWxDb250ZXh0IGVu
djsKKyAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gb2JqZWN0ID0gdjg6Ok9iamVjdDo6TmV3KCk7
CisgICAgdjg6OkxvY2FsPHY4OjpBcnJheT4gYXJyYXkgPSB2ODo6QXJyYXk6Ok5ldygpOworICAg
IHY4OjpMb2NhbDx2ODo6QXJyYXk+IHN1YkFycmF5ID0gdjg6OkFycmF5OjpOZXcoKTsKKyAgICBz
dWJBcnJheS0+U2V0KDcsIHY4OjpTdHJpbmc6Ok5ldygiemVlIikpOworICAgIGFycmF5LT5TZXQo
Mywgc3ViQXJyYXkpOworICAgIG9iamVjdC0+U2V0KHY4OjpTdHJpbmc6Ok5ldygiZm9vIiksIGFy
cmF5KTsKKworICAgIFJlZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+IHNlcmlhbGl6ZWRTY3Jp
cHRWYWx1ZSA9IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6Y3JlYXRlKG9iamVjdCk7CisKKyAgICBT
dHJpbmcgd2lyZVN0cmluZyA9IHNlcmlhbGl6ZWRTY3JpcHRWYWx1ZS0+dG9XaXJlU3RyaW5nKCk7
CisgICAgRVhQRUNUX1RSVUUoInplZSIgPT0ga2V5UGF0aEV4dHJhY3Rvcih3aXJlU3RyaW5nLCAi
Zm9vWzNdWzddIikpOworICAgIEVYUEVDVF9UUlVFKFN0cmluZygpID09IGtleVBhdGhFeHRyYWN0
b3Iod2lyZVN0cmluZywgImJhciIpKTsKKyAgICBFWFBFQ1RfVFJVRShTdHJpbmcoKSA9PSBrZXlQ
YXRoRXh0cmFjdG9yKHdpcmVTdHJpbmcsICJbNF0iKSk7Cit9CisKK30gLy8gbmFtZXNwYWNlCisK
KyNlbmRpZiAvLyBFTkFCTEUoSU5ERVhFRF9EQVRBQkFTRSkKZGlmZiAtLWdpdCBhL1dlYktpdC9j
aHJvbWl1bS90ZXN0cy9JREJLZXlQYXRoVGVzdC5jcHAgYi9XZWJLaXQvY2hyb21pdW0vdGVzdHMv
SURCS2V5UGF0aFRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjRjYThmM2E2YzRmMzQxZmUyNmU3ZTExODE2
NmQxYzcxYjc5OTYwMjAKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJLaXQvY2hyb21pdW0vdGVzdHMv
SURCS2V5UGF0aFRlc3QuY3BwCkBAIC0wLDAgKzEsMTY1IEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
CisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRS
SUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9T
RSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05U
UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVT
SU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkg
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNv
bmZpZy5oIgorI2luY2x1ZGUgIklEQktleVBhdGguaCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0
Lmg+CisjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgorCisjaWYgRU5BQkxFKElOREVYRURfREFUQUJB
U0UpCisKK3VzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOworCituYW1lc3BhY2UgeworCitzdHJ1Y3Qg
RXhwZWN0ZWRUb2tlbiB7CisgICAgU3RyaW5nIGlkZW50aWZpZXI7CisgICAgYm9vbCBoYXNJbmRl
eDsKKyAgICBpbnQgaW5kZXhWYWx1ZTsKKyAgICBFeHBlY3RlZFRva2VuKGNvbnN0IFN0cmluZyYg
cElkZW50aWZpZXIsIGJvb2wgcEhhc0luZGV4LCAgaW50IHBJbmRleFZhbHVlKQorICAgIHsKKyAg
ICAgICAgaWRlbnRpZmllciA9IHBJZGVudGlmaWVyOworICAgICAgICBoYXNJbmRleCA9IHBIYXNJ
bmRleDsKKyAgICAgICAgaW5kZXhWYWx1ZSA9IHBJbmRleFZhbHVlOworICAgIH0KK307CisKK3Zv
aWQgY2hlY2tLZXlQYXRoKGNvbnN0IFN0cmluZyYga2V5UGF0aCwgY29uc3QgVmVjdG9yPEV4cGVj
dGVkVG9rZW4+JiBleHBlY3RlZCwgaW50IHBhcnNlckVycm9yKQoreworCisgICAgUmVmUHRyPElE
QktleVBhdGg+IGlkYktleVBhdGggPSBJREJLZXlQYXRoOjpjcmVhdGUoa2V5UGF0aCk7CisgICAg
aW50IGkgPSAwOworICAgIGZvciAoaSA9IDA7IGlkYktleVBhdGgtPmhhc05leHQoKTsgaWRiS2V5
UGF0aC0+bmV4dCgpLCArK2kpIHsKKyAgICAgICAgQVNTRVJUX1RSVUUoaSA8IGV4cGVjdGVkLnNp
emUoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKGV4cGVjdGVkW2ldLmlkZW50aWZpZXIgPT0gaWRi
S2V5UGF0aC0+aWRlbnRpZmllcigpKSA8PCBpOworICAgICAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRb
aV0uaGFzSW5kZXgsIGlkYktleVBhdGgtPmhhc0luZGV4KCkpIDw8IGk7CisgICAgICAgIEVYUEVD
VF9FUShleHBlY3RlZFtpXS5pbmRleFZhbHVlLCBpZGJLZXlQYXRoLT5pbmRleFZhbHVlKCkpIDw8
IGk7CisgICAgfQorICAgIEVYUEVDVF9FUShpLCBleHBlY3RlZC5zaXplKCkpOworICAgIEVYUEVD
VF9FUShwYXJzZXJFcnJvciwgaWRiS2V5UGF0aC0+cGFyc2VyRXJyb3IoKSk7Cit9CisKK1RFU1Qo
SURCS2V5UGF0aFRlc3QsIFZhbGlkS2V5UGF0aDApCit7CisgICAgVmVjdG9yPEV4cGVjdGVkVG9r
ZW4+IGV4cGVjdGVkOworICAgIFN0cmluZyBrZXlQYXRoKCJmb28uYmFyLnpvbyIpOworICAgIGV4
cGVjdGVkLmFwcGVuZChFeHBlY3RlZFRva2VuKCJmb28iLCBmYWxzZSwgMCkpOworICAgIGV4cGVj
dGVkLmFwcGVuZChFeHBlY3RlZFRva2VuKCJiYXIiLCBmYWxzZSwgMCkpOworICAgIGV4cGVjdGVk
LmFwcGVuZChFeHBlY3RlZFRva2VuKCJ6b28iLCBmYWxzZSwgMCkpOworICAgIGNoZWNrS2V5UGF0
aChrZXlQYXRoLCBleHBlY3RlZCwgMCk7Cit9CisKK1RFU1QoSURCS2V5UGF0aFRlc3QsIFZhbGlk
S2V5UGF0aDEpCit7CisgICAgVmVjdG9yPEV4cGVjdGVkVG9rZW4+IGV4cGVjdGVkOworICAgIFN0
cmluZyBrZXlQYXRoKCJhWzM0XVsyMF0uZm9vWzJdLmJhciIpOworICAgIGV4cGVjdGVkLmFwcGVu
ZChFeHBlY3RlZFRva2VuKCJhIiwgZmFsc2UsIDApKTsKKyAgICBleHBlY3RlZC5hcHBlbmQoRXhw
ZWN0ZWRUb2tlbihTdHJpbmcoKSwgdHJ1ZSwgMzQpKTsKKyAgICBleHBlY3RlZC5hcHBlbmQoRXhw
ZWN0ZWRUb2tlbihTdHJpbmcoKSwgdHJ1ZSwgMjApKTsKKyAgICBleHBlY3RlZC5hcHBlbmQoRXhw
ZWN0ZWRUb2tlbigiZm9vIiwgZmFsc2UsIDApKTsKKyAgICBleHBlY3RlZC5hcHBlbmQoRXhwZWN0
ZWRUb2tlbihTdHJpbmcoKSwgdHJ1ZSwgMikpOworICAgIGV4cGVjdGVkLmFwcGVuZChFeHBlY3Rl
ZFRva2VuKCJiYXIiLCBmYWxzZSwgMCkpOworICAgIGNoZWNrS2V5UGF0aChrZXlQYXRoLCBleHBl
Y3RlZCwgMCk7Cit9CisKK1RFU1QoSURCS2V5UGF0aFRlc3QsIFZhbGlkS2V5UGF0aDIpCit7Cisg
ICAgVmVjdG9yPEV4cGVjdGVkVG9rZW4+IGV4cGVjdGVkOworICAgIFN0cmluZyBrZXlQYXRoKCJm
b29bIDM0IF0uWm9vX1swMDAyM11cdC5fYyIpOworICAgIGV4cGVjdGVkLmFwcGVuZChFeHBlY3Rl
ZFRva2VuKCJmb28iLCBmYWxzZSwgMCkpOworICAgIGV4cGVjdGVkLmFwcGVuZChFeHBlY3RlZFRv
a2VuKFN0cmluZygpLCB0cnVlLCAzNCkpOworICAgIGV4cGVjdGVkLmFwcGVuZChFeHBlY3RlZFRv
a2VuKCJab29fIiwgZmFsc2UsIDApKTsKKyAgICBleHBlY3RlZC5hcHBlbmQoRXhwZWN0ZWRUb2tl
bihTdHJpbmcoKSwgdHJ1ZSwgMjMpKTsKKyAgICBleHBlY3RlZC5hcHBlbmQoRXhwZWN0ZWRUb2tl
bigiX2MiLCBmYWxzZSwgMCkpOworICAgIGNoZWNrS2V5UGF0aChrZXlQYXRoLCBleHBlY3RlZCwg
MCk7Cit9CisKK1RFU1QoSURCS2V5UGF0aFRlc3QsIEludmFsaWRLZXlQYXRoMikKK3sKKyAgICBW
ZWN0b3I8RXhwZWN0ZWRUb2tlbj4gZXhwZWN0ZWQ7CisgICAgU3RyaW5nIGtleVBhdGgoImFbWzM0
XV0uYlsyXS5jIik7CisgICAgZXhwZWN0ZWQuYXBwZW5kKEV4cGVjdGVkVG9rZW4oImEiLCBmYWxz
ZSwgMCkpOworICAgIGNoZWNrS2V5UGF0aChrZXlQYXRoLCBleHBlY3RlZCwgMyk7Cit9CisKK1RF
U1QoSURCS2V5UGF0aFRlc3QsIEludmFsaWRLZXlQYXRoMykKK3sKKyAgICBWZWN0b3I8RXhwZWN0
ZWRUb2tlbj4gZXhwZWN0ZWQ7CisgICAgU3RyaW5nIGtleVBhdGgoImFbWzM0XS5iWzJdLmMiKTsK
KyAgICBleHBlY3RlZC5hcHBlbmQoRXhwZWN0ZWRUb2tlbigiYSIsIGZhbHNlLCAwKSk7CisgICAg
Y2hlY2tLZXlQYXRoKGtleVBhdGgsIGV4cGVjdGVkLCAzKTsKK30KKworVEVTVChJREJLZXlQYXRo
VGVzdCwgSW52YWxpZEtleVBhdGg1KQoreworICAgIFZlY3RvcjxFeHBlY3RlZFRva2VuPiBleHBl
Y3RlZDsKKyAgICBTdHJpbmcga2V5UGF0aCgiYVtbMzQuYlsyXS5jIik7CisgICAgZXhwZWN0ZWQu
YXBwZW5kKEV4cGVjdGVkVG9rZW4oImEiLCBmYWxzZSwgMCkpOworICAgIGNoZWNrS2V5UGF0aChr
ZXlQYXRoLCBleHBlY3RlZCwgMyk7Cit9CisKK1RFU1QoSURCS2V5UGF0aFRlc3QsIEludmFsaWRL
ZXlQYXRoNikKK3sKKyAgICBWZWN0b3I8RXhwZWN0ZWRUb2tlbj4gZXhwZWN0ZWQ7CisgICAgU3Ry
aW5nIGtleVBhdGgoIithWzM0XS5iWzJdLmMiKTsKKyAgICBjaGVja0tleVBhdGgoa2V5UGF0aCwg
ZXhwZWN0ZWQsIDEpOworfQorCitURVNUKElEQktleVBhdGhUZXN0LCBJbnZhbGlkS2V5UGF0aDcp
Cit7CisgICAgVmVjdG9yPEV4cGVjdGVkVG9rZW4+IGV4cGVjdGVkOworICAgIFN0cmluZyBrZXlQ
YXRoKCIlYVszNF0uYlsyXS5jIik7CisgICAgY2hlY2tLZXlQYXRoKGtleVBhdGgsIGV4cGVjdGVk
LCAxKTsKK30KKworVEVTVChJREJLZXlQYXRoVGVzdCwgSW52YWxpZEtleVBhdGg4KQoreworICAg
IFZlY3RvcjxFeHBlY3RlZFRva2VuPiBleHBlY3RlZDsKKyAgICBTdHJpbmcga2V5UGF0aCgiYXtb
MzRdfS5iWzJdLmMiKTsKKyAgICBleHBlY3RlZC5hcHBlbmQoRXhwZWN0ZWRUb2tlbigiYSIsIGZh
bHNlLCAwKSk7CisgICAgY2hlY2tLZXlQYXRoKGtleVBhdGgsIGV4cGVjdGVkLCAyKTsKK30KKwor
VEVTVChJREJLZXlQYXRoVGVzdCwgSW52YWxpZEtleVBhdGg5KQoreworICAgIFZlY3RvcjxFeHBl
Y3RlZFRva2VuPiBleHBlY3RlZDsKKyAgICBTdHJpbmcga2V5UGF0aCgiYS4uYlsyXS5jIik7Cisg
ICAgZXhwZWN0ZWQuYXBwZW5kKEV4cGVjdGVkVG9rZW4oImEiLCBmYWxzZSwgMCkpOworICAgIGNo
ZWNrS2V5UGF0aChrZXlQYXRoLCBleHBlY3RlZCwgNSk7Cit9CisKK1RFU1QoSURCS2V5UGF0aFRl
c3QsIEludmFsaWRLZXlQYXRoMTApCit7CisgICAgVmVjdG9yPEV4cGVjdGVkVG9rZW4+IGV4cGVj
dGVkOworICAgIFN0cmluZyBrZXlQYXRoKCJhWzM0XWIuZm9vWzJdLmJhciIpOworICAgIGV4cGVj
dGVkLmFwcGVuZChFeHBlY3RlZFRva2VuKCJhIiwgZmFsc2UsIDApKTsKKyAgICBleHBlY3RlZC5h
cHBlbmQoRXhwZWN0ZWRUb2tlbihTdHJpbmcoKSwgdHJ1ZSwgMzQpKTsKKyAgICBjaGVja0tleVBh
dGgoa2V5UGF0aCwgZXhwZWN0ZWQsIDQpOworfQorCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYg
Ly8gRU5BQkxFKElOREVYRURfREFUQUJBU0UpCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>63313</attachid>
            <date>2010-08-03 03:02:27 -0700</date>
            <delta_ts>2010-08-05 14:39:07 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-43276-20100803110225.patch</filename>
            <type>text/plain</type>
            <size>44530</size>
            <attacher name="Marcus Bulach">bulach</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
NTY0ZDMzODFjNDhmMzM4NDg3OTliYzI3ZmM2MWZkNjdkOTYyNWUwZC4uMTVhN2JhNzg2NWQ3YzE3
ODcxNDI5NzE4ODY5MDk5MjQxYzRjZDRkNiAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cK
KysrIGIvV2ViQ29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSw0MCBAQAorMjAxMC0wNy0zMCAgTWFy
Y3VzIEJ1bGFjaCAgPGJ1bGFjaEBjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkg
Tk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgSW1wbGVtZW50cyBJREJLZXlQYXRoIGV4dHJhY3Rv
ci4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTQzMjc2
CisKKyAgICAgICAgVW5pdC10ZXN0IElEQktleVBhdGhFeHRyYWN0b3JUZXN0LmNwcC4KKyAgICAg
ICAgTGF5b3V0VGVzdHMgd2lsbCBhcnJpdmUgYXMgSW5kZXhlZERCIGluZnJhc3RydWN0dXJlIGlz
IGZsZXNoZWQgb3V0LgorCisgICAgICAgICogV2ViQ29yZS5neXBpOgorICAgICAgICAqIGJpbmRp
bmdzL3Y4L1NlcmlhbGl6ZWRTY3JpcHRWYWx1ZS5jcHA6CisgICAgICAgIChXZWJDb3JlOjprZXlQ
YXRoRXh0cmFjdG9yKToKKyAgICAgICAgKiBiaW5kaW5ncy92OC9TZXJpYWxpemVkU2NyaXB0VmFs
dWUuaDoKKyAgICAgICAgKiBzdG9yYWdlL0lEQktleVBhdGguY3BwOiBBZGRlZC4KKyAgICAgICAg
KFdlYkNvcmU6OklEQktleVBhdGg6OmNyZWF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpJREJLZXlQ
YXRoOjpJREJLZXlQYXRoKToKKyAgICAgICAgKFdlYkNvcmU6OklEQktleVBhdGg6On5JREJLZXlQ
YXRoKToKKyAgICAgICAgKFdlYkNvcmU6OklEQktleVBhdGg6Omhhc05leHQpOgorICAgICAgICAo
V2ViQ29yZTo6SURCS2V5UGF0aDo6bmV4dCk6CisgICAgICAgIChXZWJDb3JlOjpJREJLZXlQYXRo
OjppZGVudGlmaWVyKToKKyAgICAgICAgKFdlYkNvcmU6OklEQktleVBhdGg6Omhhc0luZGV4KToK
KyAgICAgICAgKFdlYkNvcmU6OklEQktleVBhdGg6OmluZGV4VmFsdWUpOgorICAgICAgICAoV2Vi
Q29yZTo6SURCS2V5UGF0aDo6cGFyc2VyRXJyb3IpOgorICAgICAgICAoV2ViQ29yZTo6SURCS2V5
UGF0aDo6cGFyc2UpOgorICAgICAgICAoV2ViQ29yZTo6SURCS2V5UGF0aDo6TGV4ZXI6OmxleCk6
CisgICAgICAgIChXZWJDb3JlOjppc1NhZmVJZGVudGlmaWVyU3RhcnRDaGFyYWN0ZXIpOgorICAg
ICAgICAoV2ViQ29yZTo6aXNTYWZlSWRlbnRpZmllckNoYXJhY3Rlcik6CisgICAgICAgIChXZWJD
b3JlOjpJREJLZXlQYXRoOjpMZXhlcjo6bGV4SWRlbnRpZmllcik6CisgICAgICAgIChXZWJDb3Jl
OjpJREJLZXlQYXRoOjpMZXhlcjo6bGV4TnVtYmVyKToKKyAgICAgICAgKiBzdG9yYWdlL0lEQktl
eVBhdGguaDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpJREJLZXlQYXRoOjpUb2tlbjo6VG9r
ZW4pOgorICAgICAgICAoV2ViQ29yZTo6SURCS2V5UGF0aDo6KToKKyAgICAgICAgKFdlYkNvcmU6
OklEQktleVBhdGg6OkxleGVyOjpMZXhlcik6CisgICAgICAgIChXZWJDb3JlOjpJREJLZXlQYXRo
OjpMZXhlcjo6bmV4dCk6CisgICAgICAgIChXZWJDb3JlOjpJREJLZXlQYXRoOjpMZXhlcjo6Y3Vy
cmVudFRva2VuKToKKwogMjAxMC0wOC0wMyAgQWxleGV5IFByb3NrdXJ5YWtvdiAgPGFwQGFwcGxl
LmNvbT4KIAogICAgICAgICBVbnJldmlld2VkIChlbWVyZ2VuY3kgdGVzdCBmaXgpLgpkaWZmIC0t
Z2l0IGEvV2ViQ29yZS9XZWJDb3JlLmd5cGkgYi9XZWJDb3JlL1dlYkNvcmUuZ3lwaQppbmRleCAy
MDQ4MmJiZTBkMzM5Yjk4ZDExNjgzMzJhMzUyOWYxZWQyYjY1NzJmLi4wY2E5YjI2OWI3Yzk4NDEw
ZmUxNmUyNWE3ZDZjM2ExOWJiNzcxZjQwIDEwMDY0NAotLS0gYS9XZWJDb3JlL1dlYkNvcmUuZ3lw
aQorKysgYi9XZWJDb3JlL1dlYkNvcmUuZ3lwaQpAQCAtMzUxOSw2ICszNTE5LDggQEAKICAgICAg
ICAgICAgICdzdG9yYWdlL0lEQkluZGV4QmFja2VuZEltcGwuaCcsCiAgICAgICAgICAgICAnc3Rv
cmFnZS9JREJLZXkuY3BwJywKICAgICAgICAgICAgICdzdG9yYWdlL0lEQktleS5oJywKKyAgICAg
ICAgICAgICdzdG9yYWdlL0lEQktleVBhdGguY3BwJywKKyAgICAgICAgICAgICdzdG9yYWdlL0lE
QktleVBhdGguaCcsCiAgICAgICAgICAgICAnc3RvcmFnZS9JREJLZXlSYW5nZS5jcHAnLAogICAg
ICAgICAgICAgJ3N0b3JhZ2UvSURCS2V5UmFuZ2UuaCcsCiAgICAgICAgICAgICAnc3RvcmFnZS9J
REJLZXlUcmVlLmgnLApkaWZmIC0tZ2l0IGEvV2ViQ29yZS9iaW5kaW5ncy92OC9JREJCaW5kaW5n
VXRpbGl0aWVzLmNwcCBiL1dlYkNvcmUvYmluZGluZ3MvdjgvSURCQmluZGluZ1V0aWxpdGllcy5j
cHAKaW5kZXggNGIzOGE2MTE3OTkyZGI5MTBhYzlmYTAwYTk4MTg2MTJkZTQyNjJmNS4uNmY2ZDJh
MjE0N2Y1NzA1Y2QwYzI0OTg3NDk0N2Y1NmI5YjM3MTkxMCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9i
aW5kaW5ncy92OC9JREJCaW5kaW5nVXRpbGl0aWVzLmNwcAorKysgYi9XZWJDb3JlL2JpbmRpbmdz
L3Y4L0lEQkJpbmRpbmdVdGlsaXRpZXMuY3BwCkBAIC0yOSw2ICsyOSw4IEBACiAjaWYgRU5BQkxF
KElOREVYRURfREFUQUJBU0UpCiAKICNpbmNsdWRlICJJREJLZXkuaCIKKyNpbmNsdWRlICJJREJL
ZXlQYXRoLmgiCisjaW5jbHVkZSAiU2VyaWFsaXplZFNjcmlwdFZhbHVlLmgiCiAjaW5jbHVkZSAi
VjhCaW5kaW5nLmgiCiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKQEAgLTQ1LDYgKzQ3LDM1IEBAIFBh
c3NSZWZQdHI8SURCS2V5PiBjcmVhdGVJREJLZXlGcm9tVmFsdWUodjg6OkhhbmRsZTx2ODo6VmFs
dWU+IHZhbHVlKQogICAgIHJldHVybiAwOwogfQogCitQYXNzUmVmUHRyPElEQktleT4gdmFsdWVG
b3JLZXlQYXRoKGNvbnN0IFN0cmluZyYgd2lyZURhdGEsIGNvbnN0IFN0cmluZyYga2V5UGF0aFN0
cmluZykKK3sKKyAgICB2ODo6SGFuZGxlU2NvcGUgc2NvcGU7CisgICAgUmVmUHRyPFNlcmlhbGl6
ZWRTY3JpcHRWYWx1ZT4gdmFsdWUgPSBTZXJpYWxpemVkU2NyaXB0VmFsdWU6OmNyZWF0ZUZyb21X
aXJlKHdpcmVEYXRhKTsKKyAgICBSZWZQdHI8SURCS2V5UGF0aD4ga2V5UGF0aCA9IElEQktleVBh
dGg6OmNyZWF0ZShrZXlQYXRoU3RyaW5nKTsKKyAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gdjhW
YWx1ZSh2YWx1ZS0+ZGVzZXJpYWxpemUoKSk7CisgICAgd2hpbGUgKGtleVBhdGgtPmhhc05leHQo
KSkgeworICAgICAgICBpZiAoa2V5UGF0aC0+aGFzSW5kZXgoKSkgeworICAgICAgICAgICAgaWYg
KCF2OFZhbHVlLT5Jc0FycmF5KCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAg
ICAgICBpbnQgaW5kZXggPSBrZXlQYXRoLT5pbmRleFZhbHVlKCk7CisgICAgICAgICAgICB2ODo6
TG9jYWw8djg6Ok9iamVjdD4gb2JqZWN0ID0gdjhWYWx1ZS0+VG9PYmplY3QoKTsKKyAgICAgICAg
ICAgIGlmICghb2JqZWN0LT5IYXMoaW5kZXgpKQorICAgICAgICAgICAgICAgIHJldHVybiAwOwor
ICAgICAgICAgICAgdjhWYWx1ZSA9IG9iamVjdC0+R2V0KGluZGV4KTsKKyAgICAgICAgfSBlbHNl
IHsKKyAgICAgICAgICAgIGlmICghdjhWYWx1ZS0+SXNPYmplY3QoKSkKKyAgICAgICAgICAgICAg
ICByZXR1cm4gMDsKKyAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBvYmplY3QgPSB2
OFZhbHVlLT5Ub09iamVjdCgpOworICAgICAgICAgICAgdjg6OkhhbmRsZTx2ODo6U3RyaW5nPiBp
ZGVudGlmaWVyKHY4U3RyaW5nKGtleVBhdGgtPmlkZW50aWZpZXIoKSkpOworICAgICAgICAgICAg
aWYgKCFvYmplY3QtPkhhcyhpZGVudGlmaWVyKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsK
KyAgICAgICAgICAgIHY4VmFsdWUgPSBvYmplY3QtPkdldChpZGVudGlmaWVyKTsKKyAgICAgICAg
fQorICAgICAgICBrZXlQYXRoLT5uZXh0KCk7CisgICAgfQorICAgIHJldHVybiBjcmVhdGVJREJL
ZXlGcm9tVmFsdWUodjhWYWx1ZSk7Cit9CisKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKIAogI2Vu
ZGlmCmRpZmYgLS1naXQgYS9XZWJDb3JlL2JpbmRpbmdzL3Y4L0lEQkJpbmRpbmdVdGlsaXRpZXMu
aCBiL1dlYkNvcmUvYmluZGluZ3MvdjgvSURCQmluZGluZ1V0aWxpdGllcy5oCmluZGV4IDc2ZjJi
YmFmMzY3M2I5MzUzNzAxZTAzNjQ0ZTgwMjJiNzRlNDU4OTQuLjdhYjZjZDIyNDY5M2YxNjc2NTIx
OTI2YmY5NGJjZjFjOWNiZjZjNzMgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvYmluZGluZ3MvdjgvSURC
QmluZGluZ1V0aWxpdGllcy5oCisrKyBiL1dlYkNvcmUvYmluZGluZ3MvdjgvSURCQmluZGluZ1V0
aWxpdGllcy5oCkBAIC0zNCw4ICszNCwxMCBAQAogbmFtZXNwYWNlIFdlYkNvcmUgewogCiBjbGFz
cyBJREJLZXk7CitjbGFzcyBTdHJpbmc7CiAKIFBhc3NSZWZQdHI8SURCS2V5PiBjcmVhdGVJREJL
ZXlGcm9tVmFsdWUodjg6OkhhbmRsZTx2ODo6VmFsdWU+KTsKK1Bhc3NSZWZQdHI8SURCS2V5PiB2
YWx1ZUZvcktleVBhdGgoY29uc3QgU3RyaW5nJiB3aXJlRGF0YSwgY29uc3QgU3RyaW5nJiBrZXlQ
YXRoU3RyaW5nKTsKIAogfQogCmRpZmYgLS1naXQgYS9XZWJDb3JlL2JpbmRpbmdzL3Y4L1Nlcmlh
bGl6ZWRTY3JpcHRWYWx1ZS5jcHAgYi9XZWJDb3JlL2JpbmRpbmdzL3Y4L1NlcmlhbGl6ZWRTY3Jp
cHRWYWx1ZS5jcHAKaW5kZXggOWRjNGQwZmNiY2VhOWQ5ZTE0MTQzZDdiOWUwZDcwNjljZTk1NjEx
MS4uYmE5YjNiZmY5ODAyNTI5OWViYzFiM2UyN2RjMmY1YmNlODM0MWQ4MSAxMDA2NDQKLS0tIGEv
V2ViQ29yZS9iaW5kaW5ncy92OC9TZXJpYWxpemVkU2NyaXB0VmFsdWUuY3BwCisrKyBiL1dlYkNv
cmUvYmluZGluZ3MvdjgvU2VyaWFsaXplZFNjcmlwdFZhbHVlLmNwcApAQCAtMzcsNiArMzcsNyBA
QAogI2luY2x1ZGUgIkV4Y2VwdGlvbkNvZGUuaCIKICNpbmNsdWRlICJGaWxlLmgiCiAjaW5jbHVk
ZSAiRmlsZUxpc3QuaCIKKyNpbmNsdWRlICJJREJLZXlQYXRoLmgiCiAjaW5jbHVkZSAiSW1hZ2VE
YXRhLmgiCiAjaW5jbHVkZSAiU2hhcmVkQnVmZmVyLmgiCiAjaW5jbHVkZSAiVjhCaW5kaW5nLmgi
CmRpZmYgLS1naXQgYS9XZWJDb3JlL3N0b3JhZ2UvSURCS2V5UGF0aC5jcHAgYi9XZWJDb3JlL3N0
b3JhZ2UvSURCS2V5UGF0aC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uZmE3ZTkwYTcxNTAzOTU5NTBhODRjMTBi
MDM1OWYxYzExMzVhM2Y0NwotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvc3RvcmFnZS9JREJL
ZXlQYXRoLmNwcApAQCAtMCwwICsxLDI5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBH
b29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIu
ICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMg
IkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisg
KiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JT
IEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICog
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIK
KyNpbmNsdWRlICJJREJLZXlQYXRoLmgiCisKKyNpbmNsdWRlICJTdHJpbmdCdWlsZGVyLmgiCisj
aW5jbHVkZSA8d3RmL0FTQ0lJQ1R5cGUuaD4KKyNpbmNsdWRlIDx3dGYvZHRvYS5oPgorCisjaWYg
RU5BQkxFKElOREVYRURfREFUQUJBU0UpCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworUGFzc1Jl
ZlB0cjxJREJLZXlQYXRoPiBJREJLZXlQYXRoOjpjcmVhdGUoY29uc3QgU3RyaW5nJiBrZXlQYXRo
KQoreworICAgIFJlZlB0cjxJREJLZXlQYXRoPiBpZGJLZXlQYXRoID0gYWRvcHRSZWYobmV3IElE
QktleVBhdGgoa2V5UGF0aCkpOworICAgIGlkYktleVBhdGgtPnBhcnNlKCk7CisgICAgcmV0dXJu
IGlkYktleVBhdGgucmVsZWFzZSgpOworfQorCitJREJLZXlQYXRoOjpJREJLZXlQYXRoKGNvbnN0
IFN0cmluZyYga2V5UGF0aCkKKyAgICA6IG1fa2V5UGF0aChrZXlQYXRoKQorICAgICwgbV9jdXJy
ZW50VG9rZW4oMCkKKyAgICAsIG1fbGV4ZXIoa2V5UGF0aCkKK3sKKyAgICBtX2xleGVyLm5leHQo
KTsKK30KKworSURCS2V5UGF0aDo6fklEQktleVBhdGgoKQoreworfQorCitib29sIElEQktleVBh
dGg6Omhhc05leHQoKQoreworICAgIHJldHVybiBtX2N1cnJlbnRUb2tlbiA8IG1fdG9rZW5zLnNp
emUoKTsKK30KKwordm9pZCBJREJLZXlQYXRoOjpuZXh0KCkKK3sKKyAgICBpZiAobV9jdXJyZW50
VG9rZW4gPCBtX3Rva2Vucy5zaXplKCkpCisgICAgICAgICsrbV9jdXJyZW50VG9rZW47Cit9CisK
K1N0cmluZyBJREJLZXlQYXRoOjppZGVudGlmaWVyKCkKK3sKKyAgICBpZiAobV9jdXJyZW50VG9r
ZW4gPj0gbV90b2tlbnMuc2l6ZSgpKQorICAgICAgICByZXR1cm4gIiI7CisgICAgcmV0dXJuIG1f
dG9rZW5zW21fY3VycmVudFRva2VuXS5pZGVudGlmaWVyOworfQorCitib29sIElEQktleVBhdGg6
Omhhc0luZGV4KCkgY29uc3QKK3sKKyAgICBpZiAobV9jdXJyZW50VG9rZW4gPj0gbV90b2tlbnMu
c2l6ZSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIG1fdG9rZW5zW21fY3Vy
cmVudFRva2VuXS5oYXNJbmRleDsKK30KKworaW50IElEQktleVBhdGg6OmluZGV4VmFsdWUoKSBj
b25zdAoreworICAgIGlmIChtX2N1cnJlbnRUb2tlbiA+PSBtX3Rva2Vucy5zaXplKCkpCisgICAg
ICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gbV90b2tlbnNbbV9jdXJyZW50VG9rZW5dLmlu
ZGV4VmFsdWU7Cit9CisKK2ludCBJREJLZXlQYXRoOjpwYXJzZXJFcnJvcigpIGNvbnN0Cit7Cisg
ICAgcmV0dXJuIG1fcGFyc2VyRXJyb3I7Cit9CisKK3ZvaWQgSURCS2V5UGF0aDo6cGFyc2UoKQor
eworICAgIFBhcnNlclN0YXRlIHN0YXRlID0gU3RhcnQ7CisKKyAgICB3aGlsZSAoMSkgeworICAg
ICAgICBzd2l0Y2ggKHN0YXRlKSB7CisgICAgICAgIGNhc2UgU3RhcnQgOiB7CisgICAgICAgICAg
ICBUb2tlblR5cGUgdG9rZW4gPSBtX2xleGVyLmN1cnJlbnRUb2tlbigpLnR5cGU7CisgICAgICAg
ICAgICBpZiAodG9rZW4gPT0gVG9rSWRlbnRpZmllcikKKyAgICAgICAgICAgICAgICBzdGF0ZSA9
IElkZW50aWZpZXI7CisgICAgICAgICAgICBlbHNlIGlmICh0b2tlbiA9PSBUb2tMQnJhY2tldCkK
KyAgICAgICAgICAgICAgICBzdGF0ZSA9IEFycmF5OworICAgICAgICAgICAgZWxzZSBpZiAodG9r
ZW4gPT0gVG9rRW5kKQorICAgICAgICAgICAgICAgIHN0YXRlID0gRW5kOworICAgICAgICAgICAg
ZWxzZSB7CisgICAgICAgICAgICAgIG1fcGFyc2VyRXJyb3IgPSBQYXJzZUVycm9yU3RhcnQ7Cisg
ICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICB9CisgICAgICAgIGNhc2UgSWRlbnRpZmllciA6IHsKKyAgICAgICAgICAgIExleGVy
OjpQYXJzZXJUb2tlbiB0b2tlbiA9IG1fbGV4ZXIuY3VycmVudFRva2VuKCk7CisgICAgICAgICAg
ICBBU1NFUlQodG9rZW4udHlwZSA9PSBUb2tJZGVudGlmaWVyKTsKKyAgICAgICAgICAgIFRva2Vu
IGlkYlRva2VuOworICAgICAgICAgICAgaWRiVG9rZW4uaWRlbnRpZmllciA9IHRva2VuLnN0cmlu
Z1Rva2VuOworICAgICAgICAgICAgbV90b2tlbnMuYXBwZW5kKGlkYlRva2VuKTsKKworICAgICAg
ICAgICAgbV9sZXhlci5uZXh0KCk7CisgICAgICAgICAgICB0b2tlbiA9IG1fbGV4ZXIuY3VycmVu
dFRva2VuKCk7CisgICAgICAgICAgICBpZiAodG9rZW4udHlwZSA9PSBUb2tEb3QpCisgICAgICAg
ICAgICAgICAgc3RhdGUgPSBEb3Q7CisgICAgICAgICAgICBlbHNlIGlmICh0b2tlbi50eXBlID09
IFRva0xCcmFja2V0KQorICAgICAgICAgICAgICAgIHN0YXRlID0gQXJyYXk7CisgICAgICAgICAg
ICBlbHNlIGlmICh0b2tlbi50eXBlID09IFRva0VuZCkKKyAgICAgICAgICAgICAgICBzdGF0ZSA9
IEVuZDsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICBtX3BhcnNlckVycm9yID0g
UGFyc2VFcnJvcklkZW50aWZpZXI7CisgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAg
IH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgQXJyYXkgOiB7
CisgICAgICAgICAgICBMZXhlcjo6UGFyc2VyVG9rZW4gdG9rZW4gPSBtX2xleGVyLmN1cnJlbnRU
b2tlbigpOworICAgICAgICAgICAgQVNTRVJUKHRva2VuLnR5cGUgPT0gVG9rTEJyYWNrZXQpOwor
CisgICAgICAgICAgICBtX2xleGVyLm5leHQoKTsKKyAgICAgICAgICAgIHRva2VuID0gbV9sZXhl
ci5jdXJyZW50VG9rZW4oKTsKKyAgICAgICAgICAgIGlmICh0b2tlbi50eXBlICE9IFRva051bWJl
cikgeworICAgICAgICAgICAgICAgIG1fcGFyc2VyRXJyb3IgPSBQYXJzZUVycm9yQXJyYXlJbmRl
eDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAg
IEFTU0VSVCh0b2tlbi50eXBlID09IFRva051bWJlcik7CisgICAgICAgICAgICBUb2tlbiBpZGJU
b2tlbjsKKyAgICAgICAgICAgIGlkYlRva2VuLmhhc0luZGV4ID0gdHJ1ZTsKKyAgICAgICAgICAg
IGlkYlRva2VuLmluZGV4VmFsdWUgPSB0b2tlbi5udW1iZXJUb2tlbjsKKyAgICAgICAgICAgIG1f
dG9rZW5zLmFwcGVuZChpZGJUb2tlbik7CisKKyAgICAgICAgICAgIG1fbGV4ZXIubmV4dCgpOwor
ICAgICAgICAgICAgdG9rZW4gPSBtX2xleGVyLmN1cnJlbnRUb2tlbigpOworICAgICAgICAgICAg
aWYgKHRva2VuLnR5cGUgIT0gVG9rUkJyYWNrZXQpIHsKKyAgICAgICAgICAgICAgICBtX3BhcnNl
ckVycm9yID0gUGFyc2VFcnJvckFycmF5SW5kZXg7CisgICAgICAgICAgICAgICAgcmV0dXJuOwor
ICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtX2xleGVyLm5leHQoKTsKKyAgICAgICAgICAg
IHRva2VuID0gbV9sZXhlci5jdXJyZW50VG9rZW4oKTsKKyAgICAgICAgICAgIGlmICh0b2tlbi50
eXBlID09IFRva0RvdCkKKyAgICAgICAgICAgICAgICBzdGF0ZSA9IERvdDsKKyAgICAgICAgICAg
IGVsc2UgaWYgKHRva2VuLnR5cGUgPT0gVG9rTEJyYWNrZXQpCisgICAgICAgICAgICAgICAgc3Rh
dGUgPSBBcnJheTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHRva2VuLnR5cGUgPT0gVG9rRW5kKQor
ICAgICAgICAgICAgICAgIHN0YXRlID0gRW5kOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAg
ICAgICAgICAgbV9wYXJzZXJFcnJvciA9IFBhcnNlckVycm9yQWZ0ZXJBcnJheTsKKyAgICAgICAg
ICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgfQorICAgICAgICBjYXNlIERvdDogeworICAgICAgICAgICAgTGV4ZXI6OlBhcnNlclRva2Vu
IHRva2VuID0gbV9sZXhlci5jdXJyZW50VG9rZW4oKTsKKyAgICAgICAgICAgIEFTU0VSVCh0b2tl
bi50eXBlID09IFRva0RvdCk7CisKKyAgICAgICAgICAgIG1fbGV4ZXIubmV4dCgpOworICAgICAg
ICAgICAgdG9rZW4gPSBtX2xleGVyLmN1cnJlbnRUb2tlbigpOworICAgICAgICAgICAgaWYgKHRv
a2VuLnR5cGUgIT0gVG9rSWRlbnRpZmllcikgeworICAgICAgICAgICAgICAgIG1fcGFyc2VyRXJy
b3IgPSBQYXJzZUVycm9yRG90OworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAg
IH0KKworICAgICAgICAgICAgc3RhdGUgPSBJZGVudGlmaWVyOworICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBFbmQ6IHsKKyAgICAgICAgICAgIG1fcGFyc2VyRXJy
b3IgPSBQYXJzZUVycm9yTm9uZTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisg
ICAgICAgIH0KKyAgICB9Cit9CisKK0lEQktleVBhdGg6OlRva2VuVHlwZSBJREJLZXlQYXRoOjpM
ZXhlcjo6bGV4KFBhcnNlclRva2VuJiB0b2tlbikKK3sKKyAgICB3aGlsZSAobV9wdHIgPCBtX2Vu
ZCAmJiBpc0FTQ0lJU3BhY2UoKm1fcHRyKSkKKyAgICAgICAgKyttX3B0cjsKKworICAgIGlmICht
X3B0ciA+PSBtX2VuZCkgeworICAgICAgICB0b2tlbi50eXBlID0gVG9rRW5kOworICAgICAgICB0
b2tlbi5zdGFydCA9IG1fcHRyOworICAgICAgICB0b2tlbi5lbmQgPSBtX3B0cjsKKyAgICAgICAg
cmV0dXJuIFRva0VuZDsKKyAgICB9CisgICAgQVNTRVJUKG1fcHRyIDwgbV9lbmQpOworICAgIHRv
a2VuLnR5cGUgPSBUb2tFcnJvcjsKKyAgICB0b2tlbi5zdGFydCA9IG1fcHRyOworICAgIHN3aXRj
aCAoKm1fcHRyKSB7CisgICAgY2FzZSAnWyc6CisgICAgICAgIHRva2VuLnR5cGUgPSBUb2tMQnJh
Y2tldDsKKyAgICAgICAgdG9rZW4uZW5kID0gKyttX3B0cjsKKyAgICAgICAgcmV0dXJuIFRva0xC
cmFja2V0OworICAgIGNhc2UgJ10nOgorICAgICAgICB0b2tlbi50eXBlID0gVG9rUkJyYWNrZXQ7
CisgICAgICAgIHRva2VuLmVuZCA9ICsrbV9wdHI7CisgICAgICAgIHJldHVybiBUb2tSQnJhY2tl
dDsKKyAgICBjYXNlICcuJzoKKyAgICAgICAgdG9rZW4udHlwZSA9IFRva0RvdDsKKyAgICAgICAg
dG9rZW4uZW5kID0gKyttX3B0cjsKKyAgICAgICAgcmV0dXJuIFRva0RvdDsKKyAgICBjYXNlICcw
JzoKKyAgICBjYXNlICcxJzoKKyAgICBjYXNlICcyJzoKKyAgICBjYXNlICczJzoKKyAgICBjYXNl
ICc0JzoKKyAgICBjYXNlICc1JzoKKyAgICBjYXNlICc2JzoKKyAgICBjYXNlICc3JzoKKyAgICBj
YXNlICc4JzoKKyAgICBjYXNlICc5JzoKKyAgICAgICAgcmV0dXJuIGxleE51bWJlcih0b2tlbik7
CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGxleElkZW50aWZpZXIodG9rZW4pOworICAg
IH0KKyAgICByZXR1cm4gVG9rRXJyb3I7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc1NhZmVJ
ZGVudGlmaWVyU3RhcnRDaGFyYWN0ZXIoVUNoYXIgYykKK3sKKyAgICByZXR1cm4gaXNBU0NJSUFs
cGhhKGMpIHx8IChjID09ICdfJykgfHwgKGMgPT0gJyQnKTsKK30KKworc3RhdGljIGlubGluZSBi
b29sIGlzU2FmZUlkZW50aWZpZXJDaGFyYWN0ZXIoVUNoYXIgYykKK3sKKyAgICByZXR1cm4gaXNB
U0NJSUFscGhhbnVtZXJpYyhjKSB8fCAoYyA9PSAnXycpIHx8IChjID09ICckJyk7Cit9CisKK0lE
QktleVBhdGg6OlRva2VuVHlwZSBJREJLZXlQYXRoOjpMZXhlcjo6bGV4SWRlbnRpZmllcihQYXJz
ZXJUb2tlbiYgdG9rZW4pCit7CisgICAgY29uc3QgVUNoYXIqIHN0YXJ0ID0gbV9wdHI7CisgICAg
aWYgKG1fcHRyIDwgbV9lbmQgJiYgaXNTYWZlSWRlbnRpZmllclN0YXJ0Q2hhcmFjdGVyKCptX3B0
cikpCisgICAgICAgICsrbV9wdHI7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gVG9rRXJyb3I7
CisKKyAgICB3aGlsZSAobV9wdHIgPCBtX2VuZCAmJiBpc1NhZmVJZGVudGlmaWVyQ2hhcmFjdGVy
KCptX3B0cikpCisgICAgICAgICsrbV9wdHI7CisKKyAgICBTdHJpbmcgaWRlbnRpZmllcjsKKyAg
ICBpZiAoc3RhcnQgPCBtX3B0cikKKyAgICAgICAgaWRlbnRpZmllciA9IFN0cmluZyhzdGFydCwg
bV9wdHIgLSBzdGFydCk7CisKKyAgICB0b2tlbi5zdHJpbmdUb2tlbiA9IGlkZW50aWZpZXI7Cisg
ICAgdG9rZW4udHlwZSA9IFRva0lkZW50aWZpZXI7CisgICAgdG9rZW4uZW5kID0gbV9wdHI7Cisg
ICAgcmV0dXJuIFRva0lkZW50aWZpZXI7Cit9CisKK0lEQktleVBhdGg6OlRva2VuVHlwZSBJREJL
ZXlQYXRoOjpMZXhlcjo6bGV4TnVtYmVyKFBhcnNlclRva2VuJiB0b2tlbikKK3sKKyAgICBjb25z
dCBVQ2hhciogc3RhcnQgPSBtX3B0cjsKKyAgICBpZiAobV9wdHIgPCBtX2VuZCkgeworICAgICAg
ICAvLyBbMC05XSoKKyAgICAgICAgd2hpbGUgKG1fcHRyIDwgbV9lbmQgJiYgaXNBU0NJSURpZ2l0
KCptX3B0cikpCisgICAgICAgICAgICArK21fcHRyOworICAgIH0gZWxzZQorICAgICAgICByZXR1
cm4gVG9rRXJyb3I7CisKKyAgICBTdHJpbmcgbnVtYmVyQXNTdHJpbmc7CisgICAgaWYgKHN0YXJ0
IDwgbV9wdHIpIHsKKyAgICAgICAgbnVtYmVyQXNTdHJpbmcgPSBTdHJpbmcoc3RhcnQsIG1fcHRy
IC0gc3RhcnQpOworICAgICAgICBib29sIG9rID0gZmFsc2U7CisgICAgICAgIGludCBudW1iZXIg
PSBudW1iZXJBc1N0cmluZy50b0ludFN0cmljdCgmb2spOworICAgICAgICBpZiAoIW9rKQorICAg
ICAgICAgICAgcmV0dXJuIFRva0Vycm9yOworICAgICAgICB0b2tlbi50eXBlID0gVG9rTnVtYmVy
OworICAgICAgICB0b2tlbi5udW1iZXJUb2tlbiA9IG51bWJlcjsKKyAgICAgICAgdG9rZW4uZW5k
ID0gbV9wdHI7CisgICAgICAgIHJldHVybiBUb2tOdW1iZXI7CisgICAgfQorICAgIHJldHVybiBU
b2tFcnJvcjsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gRU5BQkxF
KElOREVYRURfREFUQUJBU0UpCmRpZmYgLS1naXQgYS9XZWJDb3JlL3N0b3JhZ2UvSURCS2V5UGF0
aC5oIGIvV2ViQ29yZS9zdG9yYWdlL0lEQktleVBhdGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NApp
bmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5hMTVkYzEwZmE3
OTU0Mzg4OTg0ZWM3NWI1NTc5YTlmNjcxZDIwZDYwCi0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29y
ZS9zdG9yYWdlL0lEQktleVBhdGguaApAQCAtMCwwICsxLDEyNyBAQAorLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBD
T05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBV
UlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMg
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICog
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhF
T1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYg
SURCS2V5UGF0aF9oCisjZGVmaW5lIElEQktleVBhdGhfaAorCisjaWYgRU5BQkxFKElOREVYRURf
REFUQUJBU0UpCisKKyNpbmNsdWRlIDx3dGYvUGFzc1JlZlB0ci5oPgorI2luY2x1ZGUgPHd0Zi9S
ZWZDb3VudGVkLmg+CisjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0
L1dURlN0cmluZy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIElEQktleVBhdGgg
OiBwdWJsaWMgUmVmQ291bnRlZDxJREJLZXlQYXRoPiB7CitwdWJsaWM6CisgICAgc3RhdGljIFBh
c3NSZWZQdHI8SURCS2V5UGF0aD4gY3JlYXRlKGNvbnN0IFN0cmluZyYpOworICAgIH5JREJLZXlQ
YXRoKCk7CisKKyAgICBib29sIGhhc05leHQoKTsKKyAgICB2b2lkIG5leHQoKTsKKyAgICBTdHJp
bmcgaWRlbnRpZmllcigpOworICAgIGJvb2wgaGFzSW5kZXgoKSBjb25zdDsKKyAgICBpbnQgaW5k
ZXhWYWx1ZSgpIGNvbnN0OworCisgICAgaW50IHBhcnNlckVycm9yKCkgY29uc3Q7CisKK3ByaXZh
dGU6CisgICAgc3RydWN0IFRva2VuIHsKKyAgICAgICAgU3RyaW5nIGlkZW50aWZpZXI7CisgICAg
ICAgIGJvb2wgaGFzSW5kZXg7CisgICAgICAgIGludCBpbmRleFZhbHVlOworICAgICAgICBUb2tl
bigpIDogaGFzSW5kZXgoZmFsc2UpLCBpbmRleFZhbHVlKDApIHt9CisgICAgfTsKKyAgICBleHBs
aWNpdCBJREJLZXlQYXRoKGNvbnN0IFN0cmluZyYpOworCisgICAgU3RyaW5nIG1fa2V5UGF0aDsK
KyAgICBWZWN0b3I8VG9rZW4+IG1fdG9rZW5zOworICAgIGludCBtX2N1cnJlbnRUb2tlbjsKKyAg
ICBpbnQgbV9wYXJzZXJFcnJvcjsKKworICAgIC8vIFRoaXMgaXMgYSBzaW1wbGlmaWVkIHBhcnNl
ciBsb29zZWx5IGJhc2VkIG9uIExpdGVyYWxQYXJzZXIuCisgICAgLy8gQW4gSURCS2V5UGF0aCBp
cyBkZWZpbmVkIGFzIGEgc2VxdWVuY2Ugb2Y6CisgICAgLy8gaWRlbnRpZmllckF7LmlkZW50aWZp
ZXJCe1tudW1lcmljX3ZhbHVlXX0KKyAgICAvLyB3aGVyZSAie30iIHJlcHJlc2VudHMgYW4gb3B0
aW9uYWwgcGFydAorICAgIC8vIFRoZSBiYXNpYyBzdGF0ZSBtYWNoaW5lIGlzOgorICAgIC8vIFN0
YXJ0ID0+IHtJZGVudGlmaWVyLCBBcnJheX0KKyAgICAvLyBJZGVudGlmaWVyID0+IHtEb3QsIEFy
cmF5LCBFbmR9CisgICAgLy8gQXJyYXkgPT4ge1N0YXJ0LCBEb3QsIEVuZH0KKyAgICAvLyBEb3Qg
PT4ge0lkZW50aWZpZXJ9CisgICAgLy8gSXQgYmFpbHMgb3V0IGFzIHNvb24gYXMgaXQgZmluZHMg
YW4gZXJyb3IsIGJ1dCBkb2Vzbid0IGRpc2NhcmQgdGhlIGJpdHMgaXQgbWFuYWdlZCB0byBwYXJz
ZS4KKyAgICBlbnVtIFBhcnNlclN0YXRlIHsgIFN0YXJ0LCBJZGVudGlmaWVyLCBBcnJheSwgRG90
LCBFbmQgfTsKKyAgICBlbnVtIFRva2VuVHlwZSB7IFRva0xCcmFja2V0LCBUb2tSQnJhY2tldCwK
KyAgICAgICAgICAgICAgICAgICAgIFRva0lkZW50aWZpZXIsIFRva051bWJlciwKKyAgICAgICAg
ICAgICAgICAgICAgIFRva0RvdCwgVG9rRW5kLCBUb2tFcnJvciB9OworICAgIGVudW0gUGFyc2VF
cnJvciB7IFBhcnNlRXJyb3JOb25lLCBQYXJzZUVycm9yU3RhcnQsIFBhcnNlRXJyb3JJZGVudGlm
aWVyLAorICAgICAgICAgICAgICAgICAgICAgIFBhcnNlRXJyb3JBcnJheUluZGV4LCBQYXJzZXJF
cnJvckFmdGVyQXJyYXksIFBhcnNlRXJyb3JEb3R9OworCisgICAgdm9pZCBwYXJzZSgpOworCisg
ICAgY2xhc3MgTGV4ZXIgeworICAgIHB1YmxpYzoKKyAgICAgICAgc3RydWN0IFBhcnNlclRva2Vu
IHsKKyAgICAgICAgICAgIFRva2VuVHlwZSB0eXBlOworICAgICAgICAgICAgY29uc3QgVUNoYXIq
IHN0YXJ0OworICAgICAgICAgICAgY29uc3QgVUNoYXIqIGVuZDsKKyAgICAgICAgICAgIFN0cmlu
ZyBzdHJpbmdUb2tlbjsKKyAgICAgICAgICAgIGRvdWJsZSBudW1iZXJUb2tlbjsKKyAgICAgICAg
fTsKKyAgICAgICAgZXhwbGljaXQgTGV4ZXIoY29uc3QgU3RyaW5nJiBzKQorICAgICAgICAgICAg
OiBtX3N0cmluZyhzKQorICAgICAgICAgICAgLCBtX3B0cihzLmNoYXJhY3RlcnMoKSkKKyAgICAg
ICAgICAgICwgbV9lbmQocy5jaGFyYWN0ZXJzKCkgKyBzLmxlbmd0aCgpKQorICAgICAgICB7Cisg
ICAgICAgIH0KKworICAgICAgICBUb2tlblR5cGUgbmV4dCgpCisgICAgICAgIHsKKyAgICAgICAg
ICAgIHJldHVybiBsZXgobV9jdXJyZW50VG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgY29u
c3QgUGFyc2VyVG9rZW4mIGN1cnJlbnRUb2tlbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJl
dHVybiBtX2N1cnJlbnRUb2tlbjsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAg
VG9rZW5UeXBlIGxleChQYXJzZXJUb2tlbiYpOworICAgICAgICBUb2tlblR5cGUgbGV4SWRlbnRp
ZmllcihQYXJzZXJUb2tlbiYpOworICAgICAgICBUb2tlblR5cGUgbGV4TnVtYmVyKFBhcnNlclRv
a2VuJik7CisgICAgICAgIFBhcnNlclRva2VuIG1fY3VycmVudFRva2VuOworICAgICAgICBTdHJp
bmcgbV9zdHJpbmc7CisgICAgICAgIGNvbnN0IFVDaGFyKiBtX3B0cjsKKyAgICAgICAgY29uc3Qg
VUNoYXIqIG1fZW5kOworICAgICB9OworCisgICAgTGV4ZXIgbV9sZXhlcjsKK307CisKK30gLy8g
bmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmCisKKyNlbmRpZiAvLyBJREJLZXlQYXRoX2gKZGlm
ZiAtLWdpdCBhL1dlYkNvcmUvc3RvcmFnZS9JbmRleGVkRGF0YWJhc2VSZXF1ZXN0LmNwcCBiL1dl
YkNvcmUvc3RvcmFnZS9JbmRleGVkRGF0YWJhc2VSZXF1ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEw
MDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5jMWM1
NTE1NzdmMTAxMmZmNGEyMmNkMzAwYWI2NmI4MzFlYjRhMDY4Ci0tLSAvZGV2L251bGwKKysrIGIv
V2ViQ29yZS9zdG9yYWdlL0luZGV4ZWREYXRhYmFzZVJlcXVlc3QuY3BwCkBAIC0wLDAgKzEsNzMg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisg
KiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFwcGxl
IENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCisgKiAgICAgaXRzIGNv
bnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVy
aXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdy
aXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1Q
TElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwg
QVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBP
UiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAor
ICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAq
LworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiSW5kZXhlZERhdGFiYXNlUmVxdWVz
dC5oIgorCisjaW5jbHVkZSAiRG9jdW1lbnQuaCIKKyNpbmNsdWRlICJFeGNlcHRpb25Db2RlLmgi
CisjaW5jbHVkZSAiRnJhbWUuaCIKKyNpbmNsdWRlICJJREJEYXRhYmFzZS5oIgorI2luY2x1ZGUg
IklEQktleVJhbmdlLmgiCisjaW5jbHVkZSAiSURCUmVxdWVzdC5oIgorI2luY2x1ZGUgIkluZGV4
ZWREYXRhYmFzZS5oIgorCisjaWYgRU5BQkxFKElOREVYRURfREFUQUJBU0UpCisKK25hbWVzcGFj
ZSBXZWJDb3JlIHsKKworSW5kZXhlZERhdGFiYXNlUmVxdWVzdDo6SW5kZXhlZERhdGFiYXNlUmVx
dWVzdChJbmRleGVkRGF0YWJhc2UqIGluZGV4ZWREYXRhYmFzZSkKKyAgICA6IG1faW5kZXhlZERh
dGFiYXNlKGluZGV4ZWREYXRhYmFzZSkKK3sKKyAgICAvLyBXZSBwYXNzIGEgcmVmZXJlbmNlIHRv
IHRoaXMgb2JqZWN0IGJlZm9yZSBpdCBjYW4gYmUgYWRvcHRlZC4KKyAgICByZWxheEFkb3B0aW9u
UmVxdWlyZW1lbnQoKTsKK30KKworSW5kZXhlZERhdGFiYXNlUmVxdWVzdDo6fkluZGV4ZWREYXRh
YmFzZVJlcXVlc3QoKQoreworfQorCitQYXNzUmVmUHRyPElEQlJlcXVlc3Q+IEluZGV4ZWREYXRh
YmFzZVJlcXVlc3Q6Om9wZW4oU2NyaXB0RXhlY3V0aW9uQ29udGV4dCogY29udGV4dCwgY29uc3Qg
U3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIGRlc2NyaXB0aW9uKQoreworICAgIGlmICghY29u
dGV4dC0+aXNEb2N1bWVudCgpKSB7CisgICAgICAgIC8vIEZJWE1FOiBtYWtlIHRoaXMgd29yayB3
aXRoIHdvcmtlcnMuCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIERvY3VtZW50KiBk
b2N1bWVudCA9IHN0YXRpY19jYXN0PERvY3VtZW50Kj4oY29udGV4dCk7CisgICAgaWYgKCFkb2N1
bWVudC0+ZnJhbWUoKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBSZWZQdHI8SURCUmVxdWVz
dD4gcmVxdWVzdCA9IElEQlJlcXVlc3Q6OmNyZWF0ZShkb2N1bWVudCwgSURCQW55OjpjcmVhdGUo
dGhpcykpOworICAgIG1faW5kZXhlZERhdGFiYXNlLT5vcGVuKG5hbWUsIGRlc2NyaXB0aW9uLCBy
ZXF1ZXN0LCBkb2N1bWVudC0+c2VjdXJpdHlPcmlnaW4oKSwgZG9jdW1lbnQtPmZyYW1lKCkpOwor
ICAgIHJldHVybiByZXF1ZXN0OworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRp
ZiAvLyBFTkFCTEUoSU5ERVhFRF9EQVRBQkFTRSkKZGlmZiAtLWdpdCBhL1dlYkNvcmUvc3RvcmFn
ZS9JbmRleGVkRGF0YWJhc2VSZXF1ZXN0LmggYi9XZWJDb3JlL3N0b3JhZ2UvSW5kZXhlZERhdGFi
YXNlUmVxdWVzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjU3ZjhhNzg1YmM5YjBhNmM5ZGI4MjI1OWRhMjRjMzk5
YmRlOTNlZGYKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3N0b3JhZ2UvSW5kZXhlZERhdGFi
YXNlUmVxdWVzdC5oCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAg
R29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAy
LiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMu
ICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFwcGxlIENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBub3Ig
dGhlIG5hbWVzIG9mCisgKiAgICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRv
cnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2Fy
ZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJ
UyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElT
Q0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwg
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworI2lmbmRlZiBJbmRleGVkRGF0YWJhc2VSZXF1
ZXN0X2gKKyNkZWZpbmUgSW5kZXhlZERhdGFiYXNlUmVxdWVzdF9oCisKKyNpbmNsdWRlICJFeGNl
cHRpb25Db2RlLmgiCisjaW5jbHVkZSAiSW5kZXhlZERhdGFiYXNlLmgiCisjaW5jbHVkZSAiUGxh
dGZvcm1TdHJpbmcuaCIKKyNpbmNsdWRlIDx3dGYvUGFzc1JlZlB0ci5oPgorI2luY2x1ZGUgPHd0
Zi9SZWZDb3VudGVkLmg+CisjaW5jbHVkZSA8d3RmL1JlZlB0ci5oPgorCisjaWYgRU5BQkxFKElO
REVYRURfREFUQUJBU0UpCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgSURCS2V5Owor
Y2xhc3MgSURCS2V5UmFuZ2U7CitjbGFzcyBJREJSZXF1ZXN0OworY2xhc3MgSW5kZXhlZERhdGFi
YXNlOworY2xhc3MgU2NyaXB0RXhlY3V0aW9uQ29udGV4dDsKKworY2xhc3MgSW5kZXhlZERhdGFi
YXNlUmVxdWVzdCA6IHB1YmxpYyBSZWZDb3VudGVkPEluZGV4ZWREYXRhYmFzZVJlcXVlc3Q+IHsK
K3B1YmxpYzoKKyAgICBzdGF0aWMgUGFzc1JlZlB0cjxJbmRleGVkRGF0YWJhc2VSZXF1ZXN0PiBj
cmVhdGUoSW5kZXhlZERhdGFiYXNlKiBpbmRleGVkRGF0YWJhc2UpCisgICAgeworICAgICAgICBy
ZXR1cm4gYWRvcHRSZWYobmV3IEluZGV4ZWREYXRhYmFzZVJlcXVlc3QoaW5kZXhlZERhdGFiYXNl
KSk7CisgICAgfQorICAgIH5JbmRleGVkRGF0YWJhc2VSZXF1ZXN0KCk7CisKKyAgICBQYXNzUmVm
UHRyPElEQlJlcXVlc3Q+IG9wZW4oU2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIGNvbnN0IFN0cmlu
ZyYgbmFtZSwgY29uc3QgU3RyaW5nJiBkZXNjcmlwdGlvbik7CisKK3ByaXZhdGU6CisgICAgSW5k
ZXhlZERhdGFiYXNlUmVxdWVzdChJbmRleGVkRGF0YWJhc2UqKTsKKworICAgIFJlZlB0cjxJbmRl
eGVkRGF0YWJhc2U+IG1faW5kZXhlZERhdGFiYXNlOworfTsKKworfSAvLyBuYW1lc3BhY2UgV2Vi
Q29yZQorCisjZW5kaWYKKworI2VuZGlmIC8vIEluZGV4ZWREYXRhYmFzZVJlcXVlc3RfaAorCmRp
ZmYgLS1naXQgYS9XZWJDb3JlL3N0b3JhZ2UvSW5kZXhlZERhdGFiYXNlUmVxdWVzdC5pZGwgYi9X
ZWJDb3JlL3N0b3JhZ2UvSW5kZXhlZERhdGFiYXNlUmVxdWVzdC5pZGwKbmV3IGZpbGUgbW9kZSAx
MDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uZTZl
ZTQ0NjI3OGY3OTU1NDE4ZmY4MzVkYTIzOGY5MWE5OTBmMTE2OAotLS0gL2Rldi9udWxsCisrKyBi
L1dlYkNvcmUvc3RvcmFnZS9JbmRleGVkRGF0YWJhc2VSZXF1ZXN0LmlkbApAQCAtMCwwICsxLDM0
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgor
ICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF
RCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJ
UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwg
REFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuCisgKi8KKworbW9kdWxlIHN0b3JhZ2UgeworCisgICAgaW50ZXJmYWNlIFsKKyAgICAgICAg
Q29uZGl0aW9uYWw9SU5ERVhFRF9EQVRBQkFTRQorICAgIF0gSW5kZXhlZERhdGFiYXNlUmVxdWVz
dCB7CisgICAgICAgIFtDYWxsV2l0aD1TY3JpcHRFeGVjdXRpb25Db250ZXh0XSBJREJSZXF1ZXN0
IG9wZW4oaW4gRE9NU3RyaW5nIG5hbWUsIGluIERPTVN0cmluZyBkZXNjcmlwdGlvbik7CisgICAg
fTsKKworfQpkaWZmIC0tZ2l0IGEvV2ViS2l0L2Nocm9taXVtL0NoYW5nZUxvZyBiL1dlYktpdC9j
aHJvbWl1bS9DaGFuZ2VMb2cKaW5kZXggZGI3NmI4ZTlkODJkNzBhOGQyMzNiNzRhNDRiY2NiMTJj
OWMxZTEzNS4uMDI0YzE5NGRkYzBjNzU0ZWQyOTQwZmI3ZmQ3OGRkMTBmZDc3MTcwMCAxMDA2NDQK
LS0tIGEvV2ViS2l0L2Nocm9taXVtL0NoYW5nZUxvZworKysgYi9XZWJLaXQvY2hyb21pdW0vQ2hh
bmdlTG9nCkBAIC0xLDMgKzEsMjYgQEAKKzIwMTAtMDctMzAgIE1hcmN1cyBCdWxhY2ggIDxidWxh
Y2hAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgor
CisgICAgICAgIEltcGxlbWVudHMgSURCS2V5UGF0aCBleHRyYWN0b3IuCisgICAgICAgIGh0dHBz
Oi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD00MzI3NgorCisgICAgICAgIFVuaXQt
dGVzdCBJREJLZXlQYXRoRXh0cmFjdG9yVGVzdC5jcHAuCisgICAgICAgIExheW91dFRlc3RzIHdp
bGwgYXJyaXZlIGFzIEluZGV4ZWREQiBpbmZyYXN0cnVjdHVyZSBpcyBmbGVzaGVkIG91dC4KKwor
ICAgICAgICAqIFdlYktpdC5neXA6CisgICAgICAgICogcHVibGljL1dlYklEQktleVBhdGhFeHRy
YWN0b3IuaDogQWRkZWQuCisgICAgICAgICogc3JjL1dlYklEQktleVBhdGhFeHRyYWN0b3IuY3Bw
OiBBZGRlZC4KKyAgICAgICAgKFdlYktpdDo6V2ViSURCS2V5UGF0aEV4dHJhY3Rvcik6CisgICAg
ICAgICogdGVzdHMvSURCS2V5UGF0aEV4dHJhY3RvclRlc3QuY3BwOiBBZGRlZC4KKyAgICAgICAg
KFdlYkNvcmU6OkxvY2FsQ29udGV4dDo6TG9jYWxDb250ZXh0KToKKyAgICAgICAgKFdlYkNvcmU6
OkxvY2FsQ29udGV4dDo6fkxvY2FsQ29udGV4dCk6CisgICAgICAgIChXZWJDb3JlOjpURVNUKToK
KyAgICAgICAgKiB0ZXN0cy9JREJLZXlQYXRoVGVzdC5jcHA6IEFkZGVkLgorICAgICAgICAoV2Vi
Q29yZTo6RXhwZWN0ZWRUb2tlbjo6RXhwZWN0ZWRUb2tlbik6CisgICAgICAgIChXZWJDb3JlOjpj
aGVja0tleVBhdGgpOgorICAgICAgICAoV2ViQ29yZTo6VEVTVCk6CisKIDIwMTAtMDgtMDIgIFBh
dmVsIEZlbGRtYW4gIDxwZmVsZG1hbkBjaHJvbWl1bS5vcmc+CiAKICAgICAgICAgUmV2aWV3ZWQg
YnkgWXVyeSBTZW1pa2hhdHNreS4KZGlmZiAtLWdpdCBhL1dlYktpdC9jaHJvbWl1bS9XZWJLaXQu
Z3lwIGIvV2ViS2l0L2Nocm9taXVtL1dlYktpdC5neXAKaW5kZXggOWRhODVjZDdjYTM4YzUwNzI3
ODEzMTU4MDdlYzM5NWNkYjViZDI0NC4uZWNmZGRmNTZiNjFhMjUwYjIzZjRmNjU3OWRjNDJlODI1
NTIyMGE2MyAxMDA2NDQKLS0tIGEvV2ViS2l0L2Nocm9taXVtL1dlYktpdC5neXAKKysrIGIvV2Vi
S2l0L2Nocm9taXVtL1dlYktpdC5neXAKQEAgLTE3Myw2ICsxNzMsNyBAQAogICAgICAgICAgICAg
ICAgICdwdWJsaWMvV2ViSFRUUEJvZHkuaCcsCiAgICAgICAgICAgICAgICAgJ3B1YmxpYy9XZWJJ
bWFnZS5oJywKICAgICAgICAgICAgICAgICAncHVibGljL1dlYkltYWdlRGVjb2Rlci5oJywKKyAg
ICAgICAgICAgICAgICAncHVibGljL1dlYklEQkJpbmRpbmdVdGlsaXRpZXMuaCcsCiAgICAgICAg
ICAgICAgICAgJ3B1YmxpYy9XZWJJREJDYWxsYmFja3MuaCcsCiAgICAgICAgICAgICAgICAgJ3B1
YmxpYy9XZWJJREJEYXRhYmFzZS5oJywKICAgICAgICAgICAgICAgICAncHVibGljL1dlYklEQkRh
dGFiYXNlRXJyb3IuaCcsCkBAIC00MDIsNiArNDAzLDcgQEAKICAgICAgICAgICAgICAgICAnc3Jj
L1dlYkdyYXBoaWNzQ29udGV4dDNERGVmYXVsdEltcGwuaCcsCiAgICAgICAgICAgICAgICAgJ3Ny
Yy9XZWJIaXN0b3J5SXRlbS5jcHAnLAogICAgICAgICAgICAgICAgICdzcmMvV2ViSFRUUEJvZHku
Y3BwJywKKyAgICAgICAgICAgICAgICAnc3JjL1dlYklEQkJpbmRpbmdVdGlsaXRpZXMuY3BwJywK
ICAgICAgICAgICAgICAgICAnc3JjL1dlYklEQkNhbGxiYWNrc0ltcGwuY3BwJywKICAgICAgICAg
ICAgICAgICAnc3JjL1dlYklEQkNhbGxiYWNrc0ltcGwuaCcsCiAgICAgICAgICAgICAgICAgJ3Ny
Yy9XZWJJREJEYXRhYmFzZUVycm9yLmNwcCcsCkBAIC02OTMsNiArNjk1LDggQEAKICAgICAgICAg
ICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgJ3NvdXJjZXMnOiBbCiAgICAgICAg
ICAgICAgICAgICAgICAgICAndGVzdHMvRHJhZ0ltYWdlVGVzdC5jcHAnLAorICAgICAgICAgICAg
ICAgICAgICAgICAgJ3Rlc3RzL0lEQkJpbmRpbmdVdGlsaXRpZXNUZXN0LmNwcCcsCisgICAgICAg
ICAgICAgICAgICAgICAgICAndGVzdHMvSURCS2V5UGF0aFRlc3QuY3BwJywKICAgICAgICAgICAg
ICAgICAgICAgICAgICd0ZXN0cy9LZXlib2FyZFRlc3QuY3BwJywKICAgICAgICAgICAgICAgICAg
ICAgICAgICd0ZXN0cy9LVVJMVGVzdC5jcHAnLAogICAgICAgICAgICAgICAgICAgICAgICAgJ3Rl
c3RzL1J1bkFsbFRlc3RzLmNwcCcsCmRpZmYgLS1naXQgYS9XZWJLaXQvY2hyb21pdW0vcHVibGlj
L1dlYklEQkJpbmRpbmdVdGlsaXRpZXMuaCBiL1dlYktpdC9jaHJvbWl1bS9wdWJsaWMvV2ViSURC
QmluZGluZ1V0aWxpdGllcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjFlNTYxOWUzNDdlMzBkOGRjNTYxZTJhOGIx
YTNhNDZiZjllYmM4ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJLaXQvY2hyb21pdW0vcHVibGlj
L1dlYklEQkJpbmRpbmdVdGlsaXRpZXMuaApAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRT
IENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIg
UFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElU
UyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisg
KiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBU
SEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRl
ZiBXZWJJREJCaW5kaW5nVXRpbGl0aWVzX2gKKyNkZWZpbmUgV2ViSURCQmluZGluZ1V0aWxpdGll
c19oCisKK25hbWVzcGFjZSBXZWJLaXQgeworCitjbGFzcyBXZWJJREJLZXk7CitjbGFzcyBXZWJT
dHJpbmc7CisKK3ZvaWQgV2ViVmFsdWVGb3JLZXlQYXRoKGNvbnN0IFdlYlN0cmluZyYgc2VyaWFs
aXplZFNjcmlwdFZhbHVlLCBjb25zdCBXZWJTdHJpbmcmIGlkYktleVBhdGgsIFdlYklEQktleSog
dmFsdWUpOworCit9IC8vIG5hbWVzcGFjZSBXZWJLaXQKKworI2VuZGlmIC8vIFdlYklEQkJpbmRp
bmdVdGlsaXRpZXNfaApkaWZmIC0tZ2l0IGEvV2ViS2l0L2Nocm9taXVtL3NyYy9XZWJJREJCaW5k
aW5nVXRpbGl0aWVzLmNwcCBiL1dlYktpdC9jaHJvbWl1bS9zcmMvV2ViSURCQmluZGluZ1V0aWxp
dGllcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMC4uNjkzMWExODNhNjBkMjk2ODFmN2ZkMWQ3NDBkZmU1YTIzNWMz
MzJhMQotLS0gL2Rldi9udWxsCisrKyBiL1dlYktpdC9jaHJvbWl1bS9zcmMvV2ViSURCQmluZGlu
Z1V0aWxpdGllcy5jcHAKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAx
MCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRP
UlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJF
CisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVU
T1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAor
ICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcu
aCIKKyNpbmNsdWRlICJXZWJJREJCaW5kaW5nVXRpbGl0aWVzLmgiCisKKyNpbmNsdWRlICJJREJC
aW5kaW5nVXRpbGl0aWVzLmgiCisjaW5jbHVkZSAiSURCS2V5LmgiCisjaW5jbHVkZSAiUGxhdGZv
cm1TdHJpbmcuaCIKKyNpbmNsdWRlICJXZWJJREJLZXkuaCIKKyNpbmNsdWRlICJXZWJTdHJpbmcu
aCIKKworbmFtZXNwYWNlIFdlYktpdCB7CisKK3ZvaWQgV2ViVmFsdWVGb3JLZXlQYXRoKGNvbnN0
IFdlYlN0cmluZyYgc2VyaWFsaXplZFNjcmlwdFZhbHVlLCBjb25zdCBXZWJTdHJpbmcmIGlkYktl
eVBhdGgsIFdlYklEQktleSogdmFsdWUpCit7CisgICAgKnZhbHVlID0gV2ViQ29yZTo6dmFsdWVG
b3JLZXlQYXRoKHNlcmlhbGl6ZWRTY3JpcHRWYWx1ZSwgaWRiS2V5UGF0aCk7Cit9CisKK30gLy8g
bmFtZXNwYWNlIFdlYktpdApkaWZmIC0tZ2l0IGEvV2ViS2l0L2Nocm9taXVtL3Rlc3RzL0lEQkJp
bmRpbmdVdGlsaXRpZXNUZXN0LmNwcCBiL1dlYktpdC9jaHJvbWl1bS90ZXN0cy9JREJCaW5kaW5n
VXRpbGl0aWVzVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uYzQ3YTI3OTA2YzQ4MTQ4NWU5MGZjMTgzYjBm
MDEwNzExMGY5ZmM5NQotLS0gL2Rldi9udWxsCisrKyBiL1dlYktpdC9jaHJvbWl1bS90ZXN0cy9J
REJCaW5kaW5nVXRpbGl0aWVzVGVzdC5jcHAKQEAgLTAsMCArMSwxNjAgQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJ
VFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICog
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1Ig
SVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMK
KyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5Z
IFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5j
bHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiSURCQmluZGluZ1V0aWxpdGllcy5oIgorI2luY2x1
ZGUgIklEQktleS5oIgorI2luY2x1ZGUgIklEQktleVBhdGguaCIKKyNpbmNsdWRlICJTZXJpYWxp
emVkU2NyaXB0VmFsdWUuaCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8
d3RmL1ZlY3Rvci5oPgorCisjaWYgRU5BQkxFKElOREVYRURfREFUQUJBU0UpCisKK3VzaW5nIG5h
bWVzcGFjZSBXZWJDb3JlOworCituYW1lc3BhY2UgeworCitjbGFzcyBMb2NhbENvbnRleHQgewor
cHVibGljOgorICAgIExvY2FsQ29udGV4dCgpCisgICAgICAgIDogbV9jb250ZXh0KHY4OjpDb250
ZXh0OjpOZXcoKSkKKyAgICB7CisgICAgICAgIG1fY29udGV4dC0+RW50ZXIoKTsKKyAgICB9CisK
KyAgICB2aXJ0dWFsIH5Mb2NhbENvbnRleHQoKQorICAgIHsKKyAgICAgICAgbV9jb250ZXh0LT5F
eGl0KCk7CisgICAgICAgIG1fY29udGV4dC5EaXNwb3NlKCk7CisgICAgfQorCitwcml2YXRlOgor
ICAgIHY4OjpIYW5kbGVTY29wZSBtX3Njb3BlOworICAgIHY4OjpQZXJzaXN0ZW50PHY4OjpDb250
ZXh0PiBtX2NvbnRleHQ7Cit9OworCit2b2lkIGNoZWNrS2V5UGF0aE51bGxWYWx1ZShjb25zdCBT
dHJpbmcmIHdpcmVTdHJpbmcsIGNvbnN0IFN0cmluZyYga2V5UGF0aCkKK3sKKyAgICBSZWZQdHI8
SURCS2V5PiBpZGJLZXkgPSB2YWx1ZUZvcktleVBhdGgod2lyZVN0cmluZywga2V5UGF0aCk7Cisg
ICAgQVNTRVJUX0ZBTFNFKGlkYktleS5nZXQoKSk7Cit9CisKK3ZvaWQgY2hlY2tLZXlQYXRoU3Ry
aW5nVmFsdWUoY29uc3QgU3RyaW5nJiB3aXJlU3RyaW5nLCBjb25zdCBTdHJpbmcmIGtleVBhdGgs
IGNvbnN0IFN0cmluZyYgZXhwZWN0ZWQpCit7CisgICAgUmVmUHRyPElEQktleT4gaWRiS2V5ID0g
dmFsdWVGb3JLZXlQYXRoKHdpcmVTdHJpbmcsIGtleVBhdGgpOworICAgIEFTU0VSVF9UUlVFKGlk
YktleS5nZXQoKSk7CisgICAgQVNTRVJUX0VRKElEQktleTo6U3RyaW5nVHlwZSwgaWRiS2V5LT50
eXBlKCkpOworICAgIEFTU0VSVF9UUlVFKGV4cGVjdGVkID09IGlkYktleS0+c3RyaW5nKCkpOwor
fQorCit2b2lkIGNoZWNrS2V5UGF0aE51bWJlclZhbHVlKGNvbnN0IFN0cmluZyYgd2lyZVN0cmlu
ZywgY29uc3QgU3RyaW5nJiBrZXlQYXRoLCBpbnQgZXhwZWN0ZWQpCit7CisgICAgUmVmUHRyPElE
QktleT4gaWRiS2V5ID0gdmFsdWVGb3JLZXlQYXRoKHdpcmVTdHJpbmcsIGtleVBhdGgpOworICAg
IEFTU0VSVF9UUlVFKGlkYktleS5nZXQoKSk7CisgICAgQVNTRVJUX0VRKElEQktleTo6TnVtYmVy
VHlwZSwgaWRiS2V5LT50eXBlKCkpOworICAgIEFTU0VSVF9UUlVFKGV4cGVjdGVkID09IGlkYktl
eS0+bnVtYmVyKCkpOworfQorCitURVNUKElEQlZhbHVlRm9yS2V5UGF0aFRlc3QsIFRvcExldmVs
UHJvcGVydHlTdHJpbmdWYWx1ZSkKK3sKKyAgICBMb2NhbENvbnRleHQgdjhjb250ZXh0OworICAg
IHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBvYmplY3QgPSB2ODo6T2JqZWN0OjpOZXcoKTsKKyAgICBv
YmplY3QtPlNldCh2ODo6U3RyaW5nOjpOZXcoImZvbyIpLCB2ODo6U3RyaW5nOjpOZXcoInpvbyIp
KTsKKworICAgIFJlZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+IHNlcmlhbGl6ZWRTY3JpcHRW
YWx1ZSA9IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6Y3JlYXRlKG9iamVjdCk7CisKKyAgICBTdHJp
bmcgd2lyZVN0cmluZyA9IHNlcmlhbGl6ZWRTY3JpcHRWYWx1ZS0+dG9XaXJlU3RyaW5nKCk7Cisg
ICAgY2hlY2tLZXlQYXRoU3RyaW5nVmFsdWUod2lyZVN0cmluZywgImZvbyIsICJ6b28iKTsKKyAg
ICBjaGVja0tleVBhdGhOdWxsVmFsdWUod2lyZVN0cmluZywgImJhciIpOworICAgIGNoZWNrS2V5
UGF0aE51bGxWYWx1ZSh3aXJlU3RyaW5nLCAiWzNdIik7Cit9CisKK1RFU1QoSURCVmFsdWVGb3JL
ZXlQYXRoVGVzdCwgVG9wTGV2ZWxQcm9wZXJ0eU51bWJlclZhbHVlKQoreworICAgIExvY2FsQ29u
dGV4dCB2OGNvbnRleHQ7CisgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IG9iamVjdCA9IHY4OjpP
YmplY3Q6Ok5ldygpOworICAgIG9iamVjdC0+U2V0KHY4OjpTdHJpbmc6Ok5ldygiZm9vIiksIHY4
OjpOdW1iZXI6Ok5ldyg0NTYpKTsKKworICAgIFJlZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+
IHNlcmlhbGl6ZWRTY3JpcHRWYWx1ZSA9IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6Y3JlYXRlKG9i
amVjdCk7CisKKyAgICBTdHJpbmcgd2lyZVN0cmluZyA9IHNlcmlhbGl6ZWRTY3JpcHRWYWx1ZS0+
dG9XaXJlU3RyaW5nKCk7CisgICAgY2hlY2tLZXlQYXRoTnVtYmVyVmFsdWUod2lyZVN0cmluZywg
ImZvbyIsIDQ1Nik7CisgICAgY2hlY2tLZXlQYXRoTnVsbFZhbHVlKHdpcmVTdHJpbmcsICJiYXIi
KTsKKyAgICBjaGVja0tleVBhdGhOdWxsVmFsdWUod2lyZVN0cmluZywgIlszXSIpOworfQorCitU
RVNUKElEQlZhbHVlRm9yS2V5UGF0aFRlc3QsIFRvcExldmVsQXJyYXlFbGVtZW50KQoreworICAg
IExvY2FsQ29udGV4dCB2OGNvbnRleHQ7CisgICAgdjg6OkxvY2FsPHY4OjpBcnJheT4gYXJyYXkg
PSB2ODo6QXJyYXk6Ok5ldygpOworICAgIGFycmF5LT5TZXQoMywgdjg6OlN0cmluZzo6TmV3KCJ6
b28iKSk7CisKKyAgICBSZWZQdHI8U2VyaWFsaXplZFNjcmlwdFZhbHVlPiBzZXJpYWxpemVkU2Ny
aXB0VmFsdWUgPSBTZXJpYWxpemVkU2NyaXB0VmFsdWU6OmNyZWF0ZShhcnJheSk7CisKKyAgICBT
dHJpbmcgd2lyZVN0cmluZyA9IHNlcmlhbGl6ZWRTY3JpcHRWYWx1ZS0+dG9XaXJlU3RyaW5nKCk7
CisgICAgY2hlY2tLZXlQYXRoU3RyaW5nVmFsdWUod2lyZVN0cmluZywgIlszXSIsICJ6b28iKTsK
KyAgICBjaGVja0tleVBhdGhOdWxsVmFsdWUod2lyZVN0cmluZywgImZvbyIpOworICAgIGNoZWNr
S2V5UGF0aE51bGxWYWx1ZSh3aXJlU3RyaW5nLCAiYmFyIik7Cit9CisKK1RFU1QoSURCVmFsdWVG
b3JLZXlQYXRoVGVzdCwgU3ViUHJvcGVydHkpCit7CisgICAgTG9jYWxDb250ZXh0IHY4Y29udGV4
dDsKKyAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gb2JqZWN0ID0gdjg6Ok9iamVjdDo6TmV3KCk7
CisgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHN1YlByb3BlcnR5ID0gdjg6Ok9iamVjdDo6TmV3
KCk7CisgICAgc3ViUHJvcGVydHktPlNldCh2ODo6U3RyaW5nOjpOZXcoImJhciIpLCB2ODo6U3Ry
aW5nOjpOZXcoInplZSIpKTsKKyAgICBvYmplY3QtPlNldCh2ODo6U3RyaW5nOjpOZXcoImZvbyIp
LCBzdWJQcm9wZXJ0eSk7CisKKyAgICBSZWZQdHI8U2VyaWFsaXplZFNjcmlwdFZhbHVlPiBzZXJp
YWxpemVkU2NyaXB0VmFsdWUgPSBTZXJpYWxpemVkU2NyaXB0VmFsdWU6OmNyZWF0ZShvYmplY3Qp
OworCisgICAgU3RyaW5nIHdpcmVTdHJpbmcgPSBzZXJpYWxpemVkU2NyaXB0VmFsdWUtPnRvV2ly
ZVN0cmluZygpOworICAgIGNoZWNrS2V5UGF0aFN0cmluZ1ZhbHVlKHdpcmVTdHJpbmcsICJmb28u
YmFyIiwgInplZSIpOworICAgIGNoZWNrS2V5UGF0aE51bGxWYWx1ZSh3aXJlU3RyaW5nLCAiYmFy
Iik7CisgICAgY2hlY2tLZXlQYXRoTnVsbFZhbHVlKHdpcmVTdHJpbmcsICJbM10iKTsKK30KKwor
VEVTVChJREJWYWx1ZUZvcktleVBhdGhUZXN0LCBBcnJheTJEKQoreworICAgIExvY2FsQ29udGV4
dCB2OGNvbnRleHQ7CisgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IG9iamVjdCA9IHY4OjpPYmpl
Y3Q6Ok5ldygpOworICAgIHY4OjpMb2NhbDx2ODo6QXJyYXk+IGFycmF5ID0gdjg6OkFycmF5OjpO
ZXcoKTsKKyAgICB2ODo6TG9jYWw8djg6OkFycmF5PiBzdWJBcnJheSA9IHY4OjpBcnJheTo6TmV3
KCk7CisgICAgc3ViQXJyYXktPlNldCg3LCB2ODo6U3RyaW5nOjpOZXcoInplZSIpKTsKKyAgICBh
cnJheS0+U2V0KDMsIHN1YkFycmF5KTsKKyAgICBvYmplY3QtPlNldCh2ODo6U3RyaW5nOjpOZXco
ImZvbyIpLCBhcnJheSk7CisKKyAgICBSZWZQdHI8U2VyaWFsaXplZFNjcmlwdFZhbHVlPiBzZXJp
YWxpemVkU2NyaXB0VmFsdWUgPSBTZXJpYWxpemVkU2NyaXB0VmFsdWU6OmNyZWF0ZShvYmplY3Qp
OworCisgICAgU3RyaW5nIHdpcmVTdHJpbmcgPSBzZXJpYWxpemVkU2NyaXB0VmFsdWUtPnRvV2ly
ZVN0cmluZygpOworICAgIGNoZWNrS2V5UGF0aFN0cmluZ1ZhbHVlKHdpcmVTdHJpbmcsICJmb29b
M11bN10iLCAiemVlIik7CisgICAgY2hlY2tLZXlQYXRoTnVsbFZhbHVlKHdpcmVTdHJpbmcsICJi
YXIiKTsKKyAgICBjaGVja0tleVBhdGhOdWxsVmFsdWUod2lyZVN0cmluZywgIls0XSIpOworfQor
Cit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYgLy8gRU5BQkxFKElOREVYRURfREFUQUJBU0UpCmRp
ZmYgLS1naXQgYS9XZWJLaXQvY2hyb21pdW0vdGVzdHMvSURCS2V5UGF0aFRlc3QuY3BwIGIvV2Vi
S2l0L2Nocm9taXVtL3Rlc3RzL0lEQktleVBhdGhUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0
NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4yMzEzYzFj
MzRhNTYxYzc4OWZhZDQ4YTU3ZmE5YjgyOGE2MGQ2ZTdkCi0tLSAvZGV2L251bGwKKysrIGIvV2Vi
S2l0L2Nocm9taXVtL3Rlc3RzL0lEQktleVBhdGhUZXN0LmNwcApAQCAtMCwwICsxLDE4MiBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEu
ICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJ
TVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ
QUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEs
IE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
CisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgor
ICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJJREJLZXlQYXRoLmgiCisKKyNp
bmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKworI2lmIEVO
QUJMRShJTkRFWEVEX0RBVEFCQVNFKQorCit1c2luZyBuYW1lc3BhY2UgV2ViQ29yZTsKKworbmFt
ZXNwYWNlIHsKKworc3RydWN0IEV4cGVjdGVkVG9rZW4geworICAgIFN0cmluZyBpZGVudGlmaWVy
OworICAgIGJvb2wgaGFzSW5kZXg7CisgICAgaW50IGluZGV4VmFsdWU7CisgICAgRXhwZWN0ZWRU
b2tlbihjb25zdCBTdHJpbmcmIHBJZGVudGlmaWVyLCBib29sIHBIYXNJbmRleCwgIGludCBwSW5k
ZXhWYWx1ZSkKKyAgICB7CisgICAgICAgIGlkZW50aWZpZXIgPSBwSWRlbnRpZmllcjsKKyAgICAg
ICAgaGFzSW5kZXggPSBwSGFzSW5kZXg7CisgICAgICAgIGluZGV4VmFsdWUgPSBwSW5kZXhWYWx1
ZTsKKyAgICB9Cit9OworCit2b2lkIGNoZWNrS2V5UGF0aChjb25zdCBTdHJpbmcmIGtleVBhdGgs
IGNvbnN0IFZlY3RvcjxFeHBlY3RlZFRva2VuPiYgZXhwZWN0ZWQsIGludCBwYXJzZXJFcnJvcikK
K3sKKworICAgIFJlZlB0cjxJREJLZXlQYXRoPiBpZGJLZXlQYXRoID0gSURCS2V5UGF0aDo6Y3Jl
YXRlKGtleVBhdGgpOworICAgIGludCBpID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpZGJLZXlQYXRo
LT5oYXNOZXh0KCk7IGlkYktleVBhdGgtPm5leHQoKSwgKytpKSB7CisgICAgICAgIEFTU0VSVF9U
UlVFKGkgPCBleHBlY3RlZC5zaXplKCkpOworICAgICAgICBFWFBFQ1RfVFJVRShleHBlY3RlZFtp
XS5pZGVudGlmaWVyID09IGlkYktleVBhdGgtPmlkZW50aWZpZXIoKSkgPDwgaTsKKyAgICAgICAg
RVhQRUNUX0VRKGV4cGVjdGVkW2ldLmhhc0luZGV4LCBpZGJLZXlQYXRoLT5oYXNJbmRleCgpKSA8
PCBpOworICAgICAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRbaV0uaW5kZXhWYWx1ZSwgaWRiS2V5UGF0
aC0+aW5kZXhWYWx1ZSgpKSA8PCBpOworICAgIH0KKyAgICBFWFBFQ1RfRVEoaSwgZXhwZWN0ZWQu
c2l6ZSgpKTsKKyAgICBFWFBFQ1RfRVEocGFyc2VyRXJyb3IsIGlkYktleVBhdGgtPnBhcnNlckVy
cm9yKCkpOworfQorCitURVNUKElEQktleVBhdGhUZXN0LCBWYWxpZEtleVBhdGgwKQoreworICAg
IFZlY3RvcjxFeHBlY3RlZFRva2VuPiBleHBlY3RlZDsKKyAgICBTdHJpbmcga2V5UGF0aCgiZm9v
LmJhci56b28iKTsKKyAgICBleHBlY3RlZC5hcHBlbmQoRXhwZWN0ZWRUb2tlbigiZm9vIiwgZmFs
c2UsIDApKTsKKyAgICBleHBlY3RlZC5hcHBlbmQoRXhwZWN0ZWRUb2tlbigiYmFyIiwgZmFsc2Us
IDApKTsKKyAgICBleHBlY3RlZC5hcHBlbmQoRXhwZWN0ZWRUb2tlbigiem9vIiwgZmFsc2UsIDAp
KTsKKyAgICBjaGVja0tleVBhdGgoa2V5UGF0aCwgZXhwZWN0ZWQsIDApOworfQorCitURVNUKElE
QktleVBhdGhUZXN0LCBWYWxpZEtleVBhdGgxKQoreworICAgIFZlY3RvcjxFeHBlY3RlZFRva2Vu
PiBleHBlY3RlZDsKKyAgICBTdHJpbmcga2V5UGF0aCgiYVszNF1bMjBdLmZvb1syXS5iYXIiKTsK
KyAgICBleHBlY3RlZC5hcHBlbmQoRXhwZWN0ZWRUb2tlbigiYSIsIGZhbHNlLCAwKSk7CisgICAg
ZXhwZWN0ZWQuYXBwZW5kKEV4cGVjdGVkVG9rZW4oU3RyaW5nKCksIHRydWUsIDM0KSk7CisgICAg
ZXhwZWN0ZWQuYXBwZW5kKEV4cGVjdGVkVG9rZW4oU3RyaW5nKCksIHRydWUsIDIwKSk7CisgICAg
ZXhwZWN0ZWQuYXBwZW5kKEV4cGVjdGVkVG9rZW4oImZvbyIsIGZhbHNlLCAwKSk7CisgICAgZXhw
ZWN0ZWQuYXBwZW5kKEV4cGVjdGVkVG9rZW4oU3RyaW5nKCksIHRydWUsIDIpKTsKKyAgICBleHBl
Y3RlZC5hcHBlbmQoRXhwZWN0ZWRUb2tlbigiYmFyIiwgZmFsc2UsIDApKTsKKyAgICBjaGVja0tl
eVBhdGgoa2V5UGF0aCwgZXhwZWN0ZWQsIDApOworfQorCitURVNUKElEQktleVBhdGhUZXN0LCBW
YWxpZEtleVBhdGgyKQoreworICAgIFZlY3RvcjxFeHBlY3RlZFRva2VuPiBleHBlY3RlZDsKKyAg
ICBTdHJpbmcga2V5UGF0aCgiZm9vWyAzNCBdLlpvb19bMDAwMjNdXHQuX2MiKTsKKyAgICBleHBl
Y3RlZC5hcHBlbmQoRXhwZWN0ZWRUb2tlbigiZm9vIiwgZmFsc2UsIDApKTsKKyAgICBleHBlY3Rl
ZC5hcHBlbmQoRXhwZWN0ZWRUb2tlbihTdHJpbmcoKSwgdHJ1ZSwgMzQpKTsKKyAgICBleHBlY3Rl
ZC5hcHBlbmQoRXhwZWN0ZWRUb2tlbigiWm9vXyIsIGZhbHNlLCAwKSk7CisgICAgZXhwZWN0ZWQu
YXBwZW5kKEV4cGVjdGVkVG9rZW4oU3RyaW5nKCksIHRydWUsIDIzKSk7CisgICAgZXhwZWN0ZWQu
YXBwZW5kKEV4cGVjdGVkVG9rZW4oIl9jIiwgZmFsc2UsIDApKTsKKyAgICBjaGVja0tleVBhdGgo
a2V5UGF0aCwgZXhwZWN0ZWQsIDApOworfQorCitURVNUKElEQktleVBhdGhUZXN0LCBWYWxpZEtl
eVBhdGgzKQoreworICAgIFZlY3RvcjxFeHBlY3RlZFRva2VuPiBleHBlY3RlZDsKKyAgICBTdHJp
bmcga2V5UGF0aCgiZm9vWyAzNCBdIik7CisgICAgZXhwZWN0ZWQuYXBwZW5kKEV4cGVjdGVkVG9r
ZW4oImZvbyIsIGZhbHNlLCAwKSk7CisgICAgZXhwZWN0ZWQuYXBwZW5kKEV4cGVjdGVkVG9rZW4o
U3RyaW5nKCksIHRydWUsIDM0KSk7CisgICAgY2hlY2tLZXlQYXRoKGtleVBhdGgsIGV4cGVjdGVk
LCAwKTsKK30KKworVEVTVChJREJLZXlQYXRoVGVzdCwgVmFsaWRLZXlQYXRoNCkKK3sKKyAgICBW
ZWN0b3I8RXhwZWN0ZWRUb2tlbj4gZXhwZWN0ZWQ7CisgICAgU3RyaW5nIGtleVBhdGgoIlsgMzQg
XSIpOworICAgIGV4cGVjdGVkLmFwcGVuZChFeHBlY3RlZFRva2VuKFN0cmluZygpLCB0cnVlLCAz
NCkpOworICAgIGNoZWNrS2V5UGF0aChrZXlQYXRoLCBleHBlY3RlZCwgMCk7Cit9CisKK1RFU1Qo
SURCS2V5UGF0aFRlc3QsIEludmFsaWRLZXlQYXRoMikKK3sKKyAgICBWZWN0b3I8RXhwZWN0ZWRU
b2tlbj4gZXhwZWN0ZWQ7CisgICAgU3RyaW5nIGtleVBhdGgoImFbWzM0XV0uYlsyXS5jIik7Cisg
ICAgZXhwZWN0ZWQuYXBwZW5kKEV4cGVjdGVkVG9rZW4oImEiLCBmYWxzZSwgMCkpOworICAgIGNo
ZWNrS2V5UGF0aChrZXlQYXRoLCBleHBlY3RlZCwgMyk7Cit9CisKK1RFU1QoSURCS2V5UGF0aFRl
c3QsIEludmFsaWRLZXlQYXRoMykKK3sKKyAgICBWZWN0b3I8RXhwZWN0ZWRUb2tlbj4gZXhwZWN0
ZWQ7CisgICAgU3RyaW5nIGtleVBhdGgoImFbWzM0XS5iWzJdLmMiKTsKKyAgICBleHBlY3RlZC5h
cHBlbmQoRXhwZWN0ZWRUb2tlbigiYSIsIGZhbHNlLCAwKSk7CisgICAgY2hlY2tLZXlQYXRoKGtl
eVBhdGgsIGV4cGVjdGVkLCAzKTsKK30KKworVEVTVChJREJLZXlQYXRoVGVzdCwgSW52YWxpZEtl
eVBhdGg1KQoreworICAgIFZlY3RvcjxFeHBlY3RlZFRva2VuPiBleHBlY3RlZDsKKyAgICBTdHJp
bmcga2V5UGF0aCgiYVtbMzQuYlsyXS5jIik7CisgICAgZXhwZWN0ZWQuYXBwZW5kKEV4cGVjdGVk
VG9rZW4oImEiLCBmYWxzZSwgMCkpOworICAgIGNoZWNrS2V5UGF0aChrZXlQYXRoLCBleHBlY3Rl
ZCwgMyk7Cit9CisKK1RFU1QoSURCS2V5UGF0aFRlc3QsIEludmFsaWRLZXlQYXRoNikKK3sKKyAg
ICBWZWN0b3I8RXhwZWN0ZWRUb2tlbj4gZXhwZWN0ZWQ7CisgICAgU3RyaW5nIGtleVBhdGgoIith
WzM0XS5iWzJdLmMiKTsKKyAgICBjaGVja0tleVBhdGgoa2V5UGF0aCwgZXhwZWN0ZWQsIDEpOwor
fQorCitURVNUKElEQktleVBhdGhUZXN0LCBJbnZhbGlkS2V5UGF0aDcpCit7CisgICAgVmVjdG9y
PEV4cGVjdGVkVG9rZW4+IGV4cGVjdGVkOworICAgIFN0cmluZyBrZXlQYXRoKCIlYVszNF0uYlsy
XS5jIik7CisgICAgY2hlY2tLZXlQYXRoKGtleVBhdGgsIGV4cGVjdGVkLCAxKTsKK30KKworVEVT
VChJREJLZXlQYXRoVGVzdCwgSW52YWxpZEtleVBhdGg4KQoreworICAgIFZlY3RvcjxFeHBlY3Rl
ZFRva2VuPiBleHBlY3RlZDsKKyAgICBTdHJpbmcga2V5UGF0aCgiYXtbMzRdfS5iWzJdLmMiKTsK
KyAgICBleHBlY3RlZC5hcHBlbmQoRXhwZWN0ZWRUb2tlbigiYSIsIGZhbHNlLCAwKSk7CisgICAg
Y2hlY2tLZXlQYXRoKGtleVBhdGgsIGV4cGVjdGVkLCAyKTsKK30KKworVEVTVChJREJLZXlQYXRo
VGVzdCwgSW52YWxpZEtleVBhdGg5KQoreworICAgIFZlY3RvcjxFeHBlY3RlZFRva2VuPiBleHBl
Y3RlZDsKKyAgICBTdHJpbmcga2V5UGF0aCgiYS4uYlsyXS5jIik7CisgICAgZXhwZWN0ZWQuYXBw
ZW5kKEV4cGVjdGVkVG9rZW4oImEiLCBmYWxzZSwgMCkpOworICAgIGNoZWNrS2V5UGF0aChrZXlQ
YXRoLCBleHBlY3RlZCwgNSk7Cit9CisKK1RFU1QoSURCS2V5UGF0aFRlc3QsIEludmFsaWRLZXlQ
YXRoMTApCit7CisgICAgVmVjdG9yPEV4cGVjdGVkVG9rZW4+IGV4cGVjdGVkOworICAgIFN0cmlu
ZyBrZXlQYXRoKCJhWzM0XWIuZm9vWzJdLmJhciIpOworICAgIGV4cGVjdGVkLmFwcGVuZChFeHBl
Y3RlZFRva2VuKCJhIiwgZmFsc2UsIDApKTsKKyAgICBleHBlY3RlZC5hcHBlbmQoRXhwZWN0ZWRU
b2tlbihTdHJpbmcoKSwgdHJ1ZSwgMzQpKTsKKyAgICBjaGVja0tleVBhdGgoa2V5UGF0aCwgZXhw
ZWN0ZWQsIDQpOworfQorCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYgLy8gRU5BQkxFKElOREVY
RURfREFUQUJBU0UpCg==
</data>
<flag name="review"
          id="51634"
          type_id="1"
          status="-"
          setter="jorlow"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>63638</attachid>
            <date>2010-08-05 14:39:07 -0700</date>
            <delta_ts>2010-08-10 09:38:10 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>key_path_extractor.patch</filename>
            <type>text/plain</type>
            <size>19386</size>
            <attacher name="Marcus Bulach">bulach</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvYmluZGluZ3MvdjgvSURCQmluZGluZ1V0aWxpdGllcy5jcHAg
Yi9XZWJDb3JlL2JpbmRpbmdzL3Y4L0lEQkJpbmRpbmdVdGlsaXRpZXMuY3BwCmluZGV4IDRiMzhh
NjEuLjhmNzhiNDkgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvYmluZGluZ3MvdjgvSURCQmluZGluZ1V0
aWxpdGllcy5jcHAKKysrIGIvV2ViQ29yZS9iaW5kaW5ncy92OC9JREJCaW5kaW5nVXRpbGl0aWVz
LmNwcApAQCAtMjksNiArMjksOCBAQAogI2lmIEVOQUJMRShJTkRFWEVEX0RBVEFCQVNFKQogCiAj
aW5jbHVkZSAiSURCS2V5LmgiCisjaW5jbHVkZSAiSURCS2V5UGF0aC5oIgorI2luY2x1ZGUgIlNl
cmlhbGl6ZWRTY3JpcHRWYWx1ZS5oIgogI2luY2x1ZGUgIlY4QmluZGluZy5oIgogCiBuYW1lc3Bh
Y2UgV2ViQ29yZSB7CkBAIC00NSw2ICs0NywzMiBAQCBQYXNzUmVmUHRyPElEQktleT4gY3JlYXRl
SURCS2V5RnJvbVZhbHVlKHY4OjpIYW5kbGU8djg6OlZhbHVlPiB2YWx1ZSkKICAgICByZXR1cm4g
MDsKIH0KIAordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2Jvb2wgR2V0VmFsdWVGcm9tKHY4OjpIYW5k
bGU8djg6OlZhbHVlPiYgdjhWYWx1ZSwgVCBpbmRleE9yTmFtZSkKK3sKKyAgICB2ODo6TG9jYWw8
djg6Ok9iamVjdD4gb2JqZWN0ID0gdjhWYWx1ZS0+VG9PYmplY3QoKTsKKyAgICBpZiAoIW9iamVj
dC0+SGFzKGluZGV4T3JOYW1lKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgdjhWYWx1ZSA9IG9i
amVjdC0+R2V0KGluZGV4T3JOYW1lKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworUGFzc1JlZlB0
cjxJREJLZXk+IHZhbHVlRm9yS2V5UGF0aChQYXNzUmVmUHRyPFNlcmlhbGl6ZWRTY3JpcHRWYWx1
ZT4gdmFsdWUsIGNvbnN0IFZlY3RvcjxJREJLZXlQYXRoRWxlbWVudD4mIGtleVBhdGgpCit7Cisg
ICAgdjg6OkhhbmRsZVNjb3BlIHNjb3BlOworICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiB2OFZh
bHVlKHZhbHVlLT5kZXNlcmlhbGl6ZSgpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtl
eVBhdGguc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaWYgKGtleVBhdGhbaV0udHlwZSA9PSBJREJL
ZXlQYXRoRWxlbWVudDo6SXNJbmRleGVkKSB7CisgICAgICAgICAgICBpZiAoIXY4VmFsdWUtPklz
QXJyYXkoKSB8fCAhR2V0VmFsdWVGcm9tKHY4VmFsdWUsIGtleVBhdGhbaV0uaW5kZXgpKQorICAg
ICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYg
KCF2OFZhbHVlLT5Jc09iamVjdCgpIHx8ICFHZXRWYWx1ZUZyb20odjhWYWx1ZSwgdjhTdHJpbmco
a2V5UGF0aFtpXS5pZGVudGlmaWVyKSkpCisgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAg
ICB9CisgICAgfQorICAgIHJldHVybiBjcmVhdGVJREJLZXlGcm9tVmFsdWUodjhWYWx1ZSk7Cit9
CisKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9XZWJDb3Jl
L2JpbmRpbmdzL3Y4L0lEQkJpbmRpbmdVdGlsaXRpZXMuaCBiL1dlYkNvcmUvYmluZGluZ3Mvdjgv
SURCQmluZGluZ1V0aWxpdGllcy5oCmluZGV4IDc2ZjJiYmEuLjk3NWFlODYgMTAwNjQ0Ci0tLSBh
L1dlYkNvcmUvYmluZGluZ3MvdjgvSURCQmluZGluZ1V0aWxpdGllcy5oCisrKyBiL1dlYkNvcmUv
YmluZGluZ3MvdjgvSURCQmluZGluZ1V0aWxpdGllcy5oCkBAIC0yOSwxMyArMjksMTggQEAKICNp
ZiBFTkFCTEUoSU5ERVhFRF9EQVRBQkFTRSkKIAogI2luY2x1ZGUgPHY4Lmg+CisjaW5jbHVkZSA8
d3RmL1ZlY3Rvci5oPgogI2luY2x1ZGUgPHd0Zi9Gb3J3YXJkLmg+CiAKIG5hbWVzcGFjZSBXZWJD
b3JlIHsKIAogY2xhc3MgSURCS2V5Oworc3RydWN0IElEQktleVBhdGhFbGVtZW50OworY2xhc3Mg
U2VyaWFsaXplZFNjcmlwdFZhbHVlOworY2xhc3MgU3RyaW5nOwogCiBQYXNzUmVmUHRyPElEQktl
eT4gY3JlYXRlSURCS2V5RnJvbVZhbHVlKHY4OjpIYW5kbGU8djg6OlZhbHVlPik7CitQYXNzUmVm
UHRyPElEQktleT4gdmFsdWVGb3JLZXlQYXRoKFBhc3NSZWZQdHI8U2VyaWFsaXplZFNjcmlwdFZh
bHVlPiB2YWx1ZSwgIGNvbnN0IFZlY3RvcjxJREJLZXlQYXRoRWxlbWVudD4mIGtleVBhdGgpOwog
CiB9CiAKZGlmZiAtLWdpdCBhL1dlYktpdC9jaHJvbWl1bS9XZWJLaXQuZ3lwIGIvV2ViS2l0L2No
cm9taXVtL1dlYktpdC5neXAKaW5kZXggNTJjMGRhNi4uZmU1N2U3YiAxMDA2NDQKLS0tIGEvV2Vi
S2l0L2Nocm9taXVtL1dlYktpdC5neXAKKysrIGIvV2ViS2l0L2Nocm9taXVtL1dlYktpdC5neXAK
QEAgLTE3MywxMiArMTczLDE0IEBACiAgICAgICAgICAgICAgICAgJ3B1YmxpYy9XZWJIVFRQQm9k
eS5oJywKICAgICAgICAgICAgICAgICAncHVibGljL1dlYkltYWdlLmgnLAogICAgICAgICAgICAg
ICAgICdwdWJsaWMvV2ViSW1hZ2VEZWNvZGVyLmgnLAorICAgICAgICAgICAgICAgICdwdWJsaWMv
V2ViSURCQmluZGluZ1V0aWxpdGllcy5oJywKICAgICAgICAgICAgICAgICAncHVibGljL1dlYklE
QkNhbGxiYWNrcy5oJywKICAgICAgICAgICAgICAgICAncHVibGljL1dlYklEQkRhdGFiYXNlLmgn
LAogICAgICAgICAgICAgICAgICdwdWJsaWMvV2ViSURCRGF0YWJhc2VFcnJvci5oJywKICAgICAg
ICAgICAgICAgICAncHVibGljL1dlYklEQkZhY3RvcnkuaCcsCiAgICAgICAgICAgICAgICAgJ3B1
YmxpYy9XZWJJREJJbmRleC5oJywKICAgICAgICAgICAgICAgICAncHVibGljL1dlYklEQktleS5o
JywKKyAgICAgICAgICAgICAgICAncHVibGljL1dlYklEQktleVBhdGguaCcsCiAgICAgICAgICAg
ICAgICAgJ3B1YmxpYy9XZWJJREJPYmplY3RTdG9yZS5oJywKICAgICAgICAgICAgICAgICAncHVi
bGljL1dlYklucHV0RWxlbWVudC5oJywKICAgICAgICAgICAgICAgICAncHVibGljL1dlYklucHV0
RXZlbnQuaCcsCkBAIC00MDMsNiArNDA1LDcgQEAKICAgICAgICAgICAgICAgICAnc3JjL1dlYkdy
YXBoaWNzQ29udGV4dDNERGVmYXVsdEltcGwuaCcsCiAgICAgICAgICAgICAgICAgJ3NyYy9XZWJI
aXN0b3J5SXRlbS5jcHAnLAogICAgICAgICAgICAgICAgICdzcmMvV2ViSFRUUEJvZHkuY3BwJywK
KyAgICAgICAgICAgICAgICAnc3JjL1dlYklEQkJpbmRpbmdVdGlsaXRpZXMuY3BwJywKICAgICAg
ICAgICAgICAgICAnc3JjL1dlYklEQkNhbGxiYWNrc0ltcGwuY3BwJywKICAgICAgICAgICAgICAg
ICAnc3JjL1dlYklEQkNhbGxiYWNrc0ltcGwuaCcsCiAgICAgICAgICAgICAgICAgJ3NyYy9XZWJJ
REJEYXRhYmFzZUVycm9yLmNwcCcsCkBAIC00MTMsNiArNDE2LDcgQEAKICAgICAgICAgICAgICAg
ICAnc3JjL1dlYklEQkluZGV4SW1wbC5jcHAnLAogICAgICAgICAgICAgICAgICdzcmMvV2ViSURC
SW5kZXhJbXBsLmgnLAogICAgICAgICAgICAgICAgICdzcmMvV2ViSURCS2V5LmNwcCcsCisgICAg
ICAgICAgICAgICAgJ3NyYy9XZWJJREJLZXlQYXRoLmNwcCcsCiAgICAgICAgICAgICAgICAgJ3Ny
Yy9XZWJJREJPYmplY3RTdG9yZUltcGwuY3BwJywKICAgICAgICAgICAgICAgICAnc3JjL1dlYklE
Qk9iamVjdFN0b3JlSW1wbC5oJywKICAgICAgICAgICAgICAgICAnc3JjL1dlYkltYWdlQ0cuY3Bw
JywKQEAgLTY5Niw2ICs3MDAsNyBAQAogICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAg
ICAgICAgICAgICAnc291cmNlcyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0cy9E
cmFnSW1hZ2VUZXN0LmNwcCcsCisgICAgICAgICAgICAgICAgICAgICAgICAndGVzdHMvSURCQmlu
ZGluZ1V0aWxpdGllc1Rlc3QuY3BwJywKICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0cy9J
REJLZXlQYXRoVGVzdC5jcHAnLAogICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3RzL0tleWJv
YXJkVGVzdC5jcHAnLAogICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3RzL0tVUkxUZXN0LmNw
cCcsCmRpZmYgLS1naXQgYS9XZWJLaXQvY2hyb21pdW0vcHVibGljL1dlYklEQkJpbmRpbmdVdGls
aXRpZXMuaCBiL1dlYktpdC9jaHJvbWl1bS9wdWJsaWMvV2ViSURCQmluZGluZ1V0aWxpdGllcy5o
Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllOGRhOTgKLS0tIC9kZXYvbnVs
bAorKysgYi9XZWJLaXQvY2hyb21pdW0vcHVibGljL1dlYklEQkJpbmRpbmdVdGlsaXRpZXMuaApA
QCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVy
aWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBB
TlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQu
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBM
T1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0Ug
T0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBXZWJJREJCaW5kaW5nVXRpbGl0aWVzX2gK
KyNkZWZpbmUgV2ViSURCQmluZGluZ1V0aWxpdGllc19oCisKK25hbWVzcGFjZSBXZWJLaXQgewor
CitjbGFzcyBXZWJJREJLZXk7CitjbGFzcyBXZWJJREJLZXlQYXRoOworY2xhc3MgV2ViU2VyaWFs
aXplZFNjcmlwdFZhbHVlOworCitXZWJJREJLZXkgV2ViVmFsdWVGb3JLZXlQYXRoKFdlYlNlcmlh
bGl6ZWRTY3JpcHRWYWx1ZSosIFdlYklEQktleVBhdGgqKTsKKworfSAvLyBuYW1lc3BhY2UgV2Vi
S2l0CisKKyNlbmRpZiAvLyBXZWJJREJCaW5kaW5nVXRpbGl0aWVzX2gKZGlmZiAtLWdpdCBhL1dl
YktpdC9jaHJvbWl1bS9wdWJsaWMvV2ViSURCS2V5UGF0aC5oIGIvV2ViS2l0L2Nocm9taXVtL3B1
YmxpYy9XZWJJREJLZXlQYXRoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4u
YzM0NTEzMQotLS0gL2Rldi9udWxsCisrKyBiL1dlYktpdC9jaHJvbWl1bS9wdWJsaWMvV2ViSURC
S2V5UGF0aC5oCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29v
Z2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAg
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJB
UyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICog
RElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBC
RSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lB
TCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJ
VFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIFdlYklEQktleVBhdGhf
aAorI2RlZmluZSBXZWJJREJLZXlQYXRoX2gKKworI2luY2x1ZGUgIldlYkNvbW1vbi5oIgorI2lu
Y2x1ZGUgIldlYlZlY3Rvci5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CitzdHJ1Y3QgSURCS2V5
UGF0aEVsZW1lbnQ7Cit9CisKK25hbWVzcGFjZSBXVEYgewordGVtcGxhdGU8dHlwZW5hbWUgVCwg
c2l6ZV90IGlubGluZUNhcGFjaXR5PiBjbGFzcyBWZWN0b3I7Cit9CisKK25hbWVzcGFjZSBXZWJL
aXQgeworCitjbGFzcyBXZWJTdHJpbmc7CisKK2NsYXNzIFdlYklEQktleVBhdGggeworcHVibGlj
OgorICAgIH5XZWJJREJLZXlQYXRoKCkgeyByZXNldCgpOyB9CisKKyAgICBXZWJJREJLZXlQYXRo
KCkgOiBtX3ByaXZhdGUoMCkgeyB9CisKKyAgICBXRUJLSVRfQVBJIHZvaWQgcmVzZXQoKTsKKwor
I2lmIFdFQktJVF9JTVBMRU1FTlRBVElPTgorICAgIHZvaWQgYXNzaWduKFdURjo6VmVjdG9yPFdl
YkNvcmU6OklEQktleVBhdGhFbGVtZW50LCAwPiYpOworICAgIGNvbnN0IFdURjo6VmVjdG9yPFdl
YkNvcmU6OklEQktleVBhdGhFbGVtZW50LCAwPiYgZWxlbWVudHMoKTsKKyNlbmRpZgorCitwcml2
YXRlOgorICAgIFdURjo6VmVjdG9yPFdlYkNvcmU6OklEQktleVBhdGhFbGVtZW50LCAwPiogbV9w
cml2YXRlOworfTsKKwordm9pZCBXZWJJREJQYXJzZUtleVBhdGgoY29uc3QgV2ViU3RyaW5nJiwg
V2ViSURCS2V5UGF0aCosIGludCogZXJyb3IpOworCit9IC8vIG5hbWVzcGFjZSBXZWJLaXQKKwor
I2VuZGlmIC8vIFdlYklEQktleVBhdGhfaApkaWZmIC0tZ2l0IGEvV2ViS2l0L2Nocm9taXVtL3Ny
Yy9XZWJJREJCaW5kaW5nVXRpbGl0aWVzLmNwcCBiL1dlYktpdC9jaHJvbWl1bS9zcmMvV2ViSURC
QmluZGluZ1V0aWxpdGllcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4u
NGQ0N2VhNgotLS0gL2Rldi9udWxsCisrKyBiL1dlYktpdC9jaHJvbWl1bS9zcmMvV2ViSURCQmlu
ZGluZ1V0aWxpdGllcy5jcHAKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9u
IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgor
ICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklC
VVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0Ug
QVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJ
QlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lO
RVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25m
aWcuaCIKKyNpbmNsdWRlICJXZWJJREJCaW5kaW5nVXRpbGl0aWVzLmgiCisKKyNpbmNsdWRlICJJ
REJCaW5kaW5nVXRpbGl0aWVzLmgiCisjaW5jbHVkZSAiSURCS2V5LmgiCisjaW5jbHVkZSAiSURC
S2V5UGF0aC5oIgorI2luY2x1ZGUgIlBsYXRmb3JtU3RyaW5nLmgiCisjaW5jbHVkZSAiU2VyaWFs
aXplZFNjcmlwdFZhbHVlLmgiCisjaW5jbHVkZSAiV2ViSURCS2V5LmgiCisjaW5jbHVkZSAiV2Vi
SURCS2V5UGF0aC5oIgorI2luY2x1ZGUgIldlYlNlcmlhbGl6ZWRTY3JpcHRWYWx1ZS5oIgorCitu
YW1lc3BhY2UgV2ViS2l0IHsKKworV2ViSURCS2V5IFdlYlZhbHVlRm9yS2V5UGF0aChXZWJTZXJp
YWxpemVkU2NyaXB0VmFsdWUqIHNlcmlhbGl6ZWRTY3JpcHRWYWx1ZSwgV2ViSURCS2V5UGF0aCog
aWRiS2V5UGF0aCkKK3sKKyAgICBpZiAoc2VyaWFsaXplZFNjcmlwdFZhbHVlLT5pc051bGwoKSkK
KyAgICAgICAgcmV0dXJuIFdlYklEQktleTo6Y3JlYXRlTnVsbCgpOworICAgIHJldHVybiBXZWJD
b3JlOjp2YWx1ZUZvcktleVBhdGgoKnNlcmlhbGl6ZWRTY3JpcHRWYWx1ZSwgaWRiS2V5UGF0aC0+
ZWxlbWVudHMoKSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYktpdApkaWZmIC0tZ2l0IGEvV2Vi
S2l0L2Nocm9taXVtL3NyYy9XZWJJREJLZXlQYXRoLmNwcCBiL1dlYktpdC9jaHJvbWl1bS9zcmMv
V2ViSURCS2V5UGF0aC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGEz
NTUyYwotLS0gL2Rldi9udWxsCisrKyBiL1dlYktpdC9jaHJvbWl1bS9zcmMvV2ViSURCS2V5UGF0
aC5jcHAKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElT
IiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVND
TEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJ
QUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBF
WEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQ
VElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNs
dWRlICJXZWJJREJLZXlQYXRoLmgiCisKKyNpZiBFTkFCTEUoSU5ERVhFRF9EQVRBQkFTRSkKKwor
I2luY2x1ZGUgIklEQktleVBhdGguaCIKKyNpbmNsdWRlICJXZWJTdHJpbmcuaCIKKyNpbmNsdWRl
ICJXZWJWZWN0b3IuaCIKKyNpbmNsdWRlICJWZWN0b3IuaCIKKwordXNpbmcgV2ViQ29yZTo6SURC
S2V5UGF0aEVsZW1lbnQ7Cit1c2luZyBXZWJDb3JlOjpJREJLZXlQYXRoUGFyc2VFcnJvcjsKK3Vz
aW5nIFdlYkNvcmU6OklEQlBhcnNlS2V5UGF0aDsKKworbmFtZXNwYWNlIFdlYktpdCB7CisKK3Zv
aWQgV2ViSURCS2V5UGF0aDo6YXNzaWduKFdURjo6VmVjdG9yPElEQktleVBhdGhFbGVtZW50PiYg
ZWxlbWVudHMpCit7CisgICAgcmVzZXQoKTsKKyAgICBtX3ByaXZhdGUgPSBuZXcgV1RGOjpWZWN0
b3I8SURCS2V5UGF0aEVsZW1lbnQ+KCk7CisgICAgbV9wcml2YXRlLT5zd2FwKGVsZW1lbnRzKTsK
K30KKwordm9pZCBXZWJJREJLZXlQYXRoOjpyZXNldCgpCit7CisgICAgZGVsZXRlIG1fcHJpdmF0
ZTsKK30KKworY29uc3QgV1RGOjpWZWN0b3I8V2ViQ29yZTo6SURCS2V5UGF0aEVsZW1lbnQsIDA+
JiBXZWJJREJLZXlQYXRoOjplbGVtZW50cygpCit7CisgICAgcmV0dXJuICptX3ByaXZhdGU7Cit9
CisKK3ZvaWQgV2ViSURCUGFyc2VLZXlQYXRoKGNvbnN0IFdlYlN0cmluZyYga2V5UGF0aCwgV2Vi
SURCS2V5UGF0aCogd2ViSURCS2V5UGF0aCwgaW50KiBlcnJvcikKK3sKKyAgICBXVEY6OlZlY3Rv
cjxJREJLZXlQYXRoRWxlbWVudD4gaWRiRWxlbWVudHM7CisgICAgSURCS2V5UGF0aFBhcnNlRXJy
b3IgaWRiRXJyb3I7CisgICAgSURCUGFyc2VLZXlQYXRoKGtleVBhdGgsICZpZGJFbGVtZW50cywg
JmlkYkVycm9yKTsKKyAgICAqZXJyb3IgPSBpZGJFcnJvcjsKKyAgICB3ZWJJREJLZXlQYXRoLT5h
c3NpZ24oaWRiRWxlbWVudHMpOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJLaXQKKworI2VuZGlm
IC8vIEVOQUJMRShJTkRFWEVEX0RBVEFCQVNFKQpkaWZmIC0tZ2l0IGEvV2ViS2l0L2Nocm9taXVt
L3Rlc3RzL0lEQkJpbmRpbmdVdGlsaXRpZXNUZXN0LmNwcCBiL1dlYktpdC9jaHJvbWl1bS90ZXN0
cy9JREJCaW5kaW5nVXRpbGl0aWVzVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg
MDAwMDAwMC4uMzljZDk3MgotLS0gL2Rldi9udWxsCisrKyBiL1dlYktpdC9jaHJvbWl1bS90ZXN0
cy9JREJCaW5kaW5nVXRpbGl0aWVzVGVzdC5jcHAKQEAgLTAsMCArMSwxNjUgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFO
RCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAor
ICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUg
T1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04g
QU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisj
aW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiSURCQmluZGluZ1V0aWxpdGllcy5oIgorI2lu
Y2x1ZGUgIklEQktleS5oIgorI2luY2x1ZGUgIklEQktleVBhdGguaCIKKyNpbmNsdWRlICJTZXJp
YWxpemVkU2NyaXB0VmFsdWUuaCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVk
ZSA8d3RmL1ZlY3Rvci5oPgorCisjaWYgRU5BQkxFKElOREVYRURfREFUQUJBU0UpCisKK3VzaW5n
IG5hbWVzcGFjZSBXZWJDb3JlOworCituYW1lc3BhY2UgeworCitjbGFzcyBMb2NhbENvbnRleHQg
eworcHVibGljOgorICAgIExvY2FsQ29udGV4dCgpCisgICAgICAgIDogbV9jb250ZXh0KHY4OjpD
b250ZXh0OjpOZXcoKSkKKyAgICB7CisgICAgICAgIG1fY29udGV4dC0+RW50ZXIoKTsKKyAgICB9
CisKKyAgICB2aXJ0dWFsIH5Mb2NhbENvbnRleHQoKQorICAgIHsKKyAgICAgICAgbV9jb250ZXh0
LT5FeGl0KCk7CisgICAgICAgIG1fY29udGV4dC5EaXNwb3NlKCk7CisgICAgfQorCitwcml2YXRl
OgorICAgIHY4OjpMb2NrZXIgbV9sb2NrZXI7CisgICAgdjg6OkhhbmRsZVNjb3BlIG1fc2NvcGU7
CisgICAgdjg6OlBlcnNpc3RlbnQ8djg6OkNvbnRleHQ+IG1fY29udGV4dDsKK307CisKK1Bhc3NS
ZWZQdHI8SURCS2V5PiBjaGVja1ZhbHVlRm9yS2V5UGF0aEludGVybmFsKFNlcmlhbGl6ZWRTY3Jp
cHRWYWx1ZSogdmFsdWUsIGNvbnN0IFN0cmluZyYga2V5UGF0aCkKK3sKKyAgICBWZWN0b3I8SURC
S2V5UGF0aEVsZW1lbnQ+IGlkYktleVBhdGg7CisgICAgSURCS2V5UGF0aFBhcnNlRXJyb3IgcGFy
c2VFcnJvcjsKKyAgICBJREJQYXJzZUtleVBhdGgoa2V5UGF0aCwgJmlkYktleVBhdGgsICZwYXJz
ZUVycm9yKTsKKyAgICBFWFBFQ1RfRVEoSURCS2V5UGF0aFBhcnNlRXJyb3JOb25lLCBwYXJzZUVy
cm9yKTsKKyAgICByZXR1cm4gdmFsdWVGb3JLZXlQYXRoKHZhbHVlLCBpZGJLZXlQYXRoKTsKK30K
Kwordm9pZCBjaGVja0tleVBhdGhOdWxsVmFsdWUoU2VyaWFsaXplZFNjcmlwdFZhbHVlKiB2YWx1
ZSwgY29uc3QgU3RyaW5nJiBrZXlQYXRoKQoreworICAgIFJlZlB0cjxJREJLZXk+IGlkYktleSA9
IGNoZWNrVmFsdWVGb3JLZXlQYXRoSW50ZXJuYWwodmFsdWUsIGtleVBhdGgpOworICAgIEFTU0VS
VF9GQUxTRShpZGJLZXkuZ2V0KCkpOworfQorCit2b2lkIGNoZWNrS2V5UGF0aFN0cmluZ1ZhbHVl
KFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZSogdmFsdWUsIGNvbnN0IFN0cmluZyYga2V5UGF0aCwgY29u
c3QgU3RyaW5nJiBleHBlY3RlZCkKK3sKKyAgICBSZWZQdHI8SURCS2V5PiBpZGJLZXkgPSBjaGVj
a1ZhbHVlRm9yS2V5UGF0aEludGVybmFsKHZhbHVlLCBrZXlQYXRoKTsKKyAgICBBU1NFUlRfVFJV
RShpZGJLZXkuZ2V0KCkpOworICAgIEFTU0VSVF9FUShJREJLZXk6OlN0cmluZ1R5cGUsIGlkYktl
eS0+dHlwZSgpKTsKKyAgICBBU1NFUlRfVFJVRShleHBlY3RlZCA9PSBpZGJLZXktPnN0cmluZygp
KTsKK30KKwordm9pZCBjaGVja0tleVBhdGhOdW1iZXJWYWx1ZShTZXJpYWxpemVkU2NyaXB0VmFs
dWUqIHZhbHVlLCBjb25zdCBTdHJpbmcmIGtleVBhdGgsIGludCBleHBlY3RlZCkKK3sKKyAgICBS
ZWZQdHI8SURCS2V5PiBpZGJLZXkgPSBjaGVja1ZhbHVlRm9yS2V5UGF0aEludGVybmFsKHZhbHVl
LCBrZXlQYXRoKTsKKyAgICBBU1NFUlRfVFJVRShpZGJLZXkuZ2V0KCkpOworICAgIEFTU0VSVF9F
UShJREJLZXk6Ok51bWJlclR5cGUsIGlkYktleS0+dHlwZSgpKTsKKyAgICBBU1NFUlRfVFJVRShl
eHBlY3RlZCA9PSBpZGJLZXktPm51bWJlcigpKTsKK30KKworVEVTVChJREJWYWx1ZUZvcktleVBh
dGhUZXN0LCBUb3BMZXZlbFByb3BlcnR5U3RyaW5nVmFsdWUpCit7CisgICAgTG9jYWxDb250ZXh0
IHY4Y29udGV4dDsKKyAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gb2JqZWN0ID0gdjg6Ok9iamVj
dDo6TmV3KCk7CisgICAgb2JqZWN0LT5TZXQodjg6OlN0cmluZzo6TmV3KCJmb28iKSwgdjg6OlN0
cmluZzo6TmV3KCJ6b28iKSk7CisKKyAgICBSZWZQdHI8U2VyaWFsaXplZFNjcmlwdFZhbHVlPiBz
ZXJpYWxpemVkU2NyaXB0VmFsdWUgPSBTZXJpYWxpemVkU2NyaXB0VmFsdWU6OmNyZWF0ZShvYmpl
Y3QpOworCisgICAgY2hlY2tLZXlQYXRoU3RyaW5nVmFsdWUoc2VyaWFsaXplZFNjcmlwdFZhbHVl
LmdldCgpLCAiZm9vIiwgInpvbyIpOworICAgIGNoZWNrS2V5UGF0aE51bGxWYWx1ZShzZXJpYWxp
emVkU2NyaXB0VmFsdWUuZ2V0KCksICJiYXIiKTsKKyAgICBjaGVja0tleVBhdGhOdWxsVmFsdWUo
c2VyaWFsaXplZFNjcmlwdFZhbHVlLmdldCgpLCAiWzNdIik7Cit9CisKK1RFU1QoSURCVmFsdWVG
b3JLZXlQYXRoVGVzdCwgVG9wTGV2ZWxQcm9wZXJ0eU51bWJlclZhbHVlKQoreworICAgIExvY2Fs
Q29udGV4dCB2OGNvbnRleHQ7CisgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IG9iamVjdCA9IHY4
OjpPYmplY3Q6Ok5ldygpOworICAgIG9iamVjdC0+U2V0KHY4OjpTdHJpbmc6Ok5ldygiZm9vIiks
IHY4OjpOdW1iZXI6Ok5ldyg0NTYpKTsKKworICAgIFJlZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFs
dWU+IHNlcmlhbGl6ZWRTY3JpcHRWYWx1ZSA9IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6Y3JlYXRl
KG9iamVjdCk7CisKKyAgICBjaGVja0tleVBhdGhOdW1iZXJWYWx1ZShzZXJpYWxpemVkU2NyaXB0
VmFsdWUuZ2V0KCksICJmb28iLCA0NTYpOworICAgIGNoZWNrS2V5UGF0aE51bGxWYWx1ZShzZXJp
YWxpemVkU2NyaXB0VmFsdWUuZ2V0KCksICJiYXIiKTsKKyAgICBjaGVja0tleVBhdGhOdWxsVmFs
dWUoc2VyaWFsaXplZFNjcmlwdFZhbHVlLmdldCgpLCAiWzNdIik7Cit9CisKK1RFU1QoSURCVmFs
dWVGb3JLZXlQYXRoVGVzdCwgVG9wTGV2ZWxBcnJheUVsZW1lbnQpCit7CisgICAgTG9jYWxDb250
ZXh0IHY4Y29udGV4dDsKKyAgICB2ODo6TG9jYWw8djg6OkFycmF5PiBhcnJheSA9IHY4OjpBcnJh
eTo6TmV3KCk7CisgICAgYXJyYXktPlNldCgzLCB2ODo6U3RyaW5nOjpOZXcoInpvbyIpKTsKKwor
ICAgIFJlZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+IHNlcmlhbGl6ZWRTY3JpcHRWYWx1ZSA9
IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6Y3JlYXRlKGFycmF5KTsKKworICAgIGNoZWNrS2V5UGF0
aFN0cmluZ1ZhbHVlKHNlcmlhbGl6ZWRTY3JpcHRWYWx1ZS5nZXQoKSwgIlszXSIsICJ6b28iKTsK
KyAgICBjaGVja0tleVBhdGhOdWxsVmFsdWUoc2VyaWFsaXplZFNjcmlwdFZhbHVlLmdldCgpLCAi
Zm9vIik7CisgICAgY2hlY2tLZXlQYXRoTnVsbFZhbHVlKHNlcmlhbGl6ZWRTY3JpcHRWYWx1ZS5n
ZXQoKSwgImJhciIpOworfQorCitURVNUKElEQlZhbHVlRm9yS2V5UGF0aFRlc3QsIFN1YlByb3Bl
cnR5KQoreworICAgIExvY2FsQ29udGV4dCB2OGNvbnRleHQ7CisgICAgdjg6OkxvY2FsPHY4OjpP
YmplY3Q+IG9iamVjdCA9IHY4OjpPYmplY3Q6Ok5ldygpOworICAgIHY4OjpMb2NhbDx2ODo6T2Jq
ZWN0PiBzdWJQcm9wZXJ0eSA9IHY4OjpPYmplY3Q6Ok5ldygpOworICAgIHN1YlByb3BlcnR5LT5T
ZXQodjg6OlN0cmluZzo6TmV3KCJiYXIiKSwgdjg6OlN0cmluZzo6TmV3KCJ6ZWUiKSk7CisgICAg
b2JqZWN0LT5TZXQodjg6OlN0cmluZzo6TmV3KCJmb28iKSwgc3ViUHJvcGVydHkpOworCisgICAg
UmVmUHRyPFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZT4gc2VyaWFsaXplZFNjcmlwdFZhbHVlID0gU2Vy
aWFsaXplZFNjcmlwdFZhbHVlOjpjcmVhdGUob2JqZWN0KTsKKworICAgIGNoZWNrS2V5UGF0aFN0
cmluZ1ZhbHVlKHNlcmlhbGl6ZWRTY3JpcHRWYWx1ZS5nZXQoKSwgImZvby5iYXIiLCAiemVlIik7
CisgICAgY2hlY2tLZXlQYXRoTnVsbFZhbHVlKHNlcmlhbGl6ZWRTY3JpcHRWYWx1ZS5nZXQoKSwg
ImJhciIpOworICAgIGNoZWNrS2V5UGF0aE51bGxWYWx1ZShzZXJpYWxpemVkU2NyaXB0VmFsdWUu
Z2V0KCksICJbM10iKTsKK30KKworVEVTVChJREJWYWx1ZUZvcktleVBhdGhUZXN0LCBBcnJheTJE
KQoreworICAgIExvY2FsQ29udGV4dCB2OGNvbnRleHQ7CisgICAgdjg6OkxvY2FsPHY4OjpPYmpl
Y3Q+IG9iamVjdCA9IHY4OjpPYmplY3Q6Ok5ldygpOworICAgIHY4OjpMb2NhbDx2ODo6QXJyYXk+
IGFycmF5ID0gdjg6OkFycmF5OjpOZXcoKTsKKyAgICB2ODo6TG9jYWw8djg6OkFycmF5PiBzdWJB
cnJheSA9IHY4OjpBcnJheTo6TmV3KCk7CisgICAgc3ViQXJyYXktPlNldCg3LCB2ODo6U3RyaW5n
OjpOZXcoInplZSIpKTsKKyAgICBhcnJheS0+U2V0KDMsIHN1YkFycmF5KTsKKyAgICBvYmplY3Qt
PlNldCh2ODo6U3RyaW5nOjpOZXcoImZvbyIpLCBhcnJheSk7CisKKyAgICBSZWZQdHI8U2VyaWFs
aXplZFNjcmlwdFZhbHVlPiBzZXJpYWxpemVkU2NyaXB0VmFsdWUgPSBTZXJpYWxpemVkU2NyaXB0
VmFsdWU6OmNyZWF0ZShvYmplY3QpOworCisgICAgY2hlY2tLZXlQYXRoU3RyaW5nVmFsdWUoc2Vy
aWFsaXplZFNjcmlwdFZhbHVlLmdldCgpLCAiZm9vWzNdWzddIiwgInplZSIpOworICAgIGNoZWNr
S2V5UGF0aE51bGxWYWx1ZShzZXJpYWxpemVkU2NyaXB0VmFsdWUuZ2V0KCksICJiYXIiKTsKKyAg
ICBjaGVja0tleVBhdGhOdWxsVmFsdWUoc2VyaWFsaXplZFNjcmlwdFZhbHVlLmdldCgpLCAiWzRd
Iik7Cit9CisKK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZiAvLyBFTkFCTEUoSU5ERVhFRF9EQVRB
QkFTRSkK
</data>
<flag name="review"
          id="52131"
          type_id="1"
          status="-"
          setter="jorlow"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>64017</attachid>
            <date>2010-08-10 09:38:10 -0700</date>
            <delta_ts>2010-08-11 09:34:23 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>a</filename>
            <type>text/plain</type>
            <size>21840</size>
            <attacher name="Marcus Bulach">bulach</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvYmluZGluZ3MvdjgvSURCQmluZGluZ1V0aWxpdGllcy5jcHAg
Yi9XZWJDb3JlL2JpbmRpbmdzL3Y4L0lEQkJpbmRpbmdVdGlsaXRpZXMuY3BwCmluZGV4IDRiMzhh
NjEuLjhmNzhiNDkgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvYmluZGluZ3MvdjgvSURCQmluZGluZ1V0
aWxpdGllcy5jcHAKKysrIGIvV2ViQ29yZS9iaW5kaW5ncy92OC9JREJCaW5kaW5nVXRpbGl0aWVz
LmNwcApAQCAtMjksNiArMjksOCBAQAogI2lmIEVOQUJMRShJTkRFWEVEX0RBVEFCQVNFKQogCiAj
aW5jbHVkZSAiSURCS2V5LmgiCisjaW5jbHVkZSAiSURCS2V5UGF0aC5oIgorI2luY2x1ZGUgIlNl
cmlhbGl6ZWRTY3JpcHRWYWx1ZS5oIgogI2luY2x1ZGUgIlY4QmluZGluZy5oIgogCiBuYW1lc3Bh
Y2UgV2ViQ29yZSB7CkBAIC00NSw2ICs0NywzMiBAQCBQYXNzUmVmUHRyPElEQktleT4gY3JlYXRl
SURCS2V5RnJvbVZhbHVlKHY4OjpIYW5kbGU8djg6OlZhbHVlPiB2YWx1ZSkKICAgICByZXR1cm4g
MDsKIH0KIAordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2Jvb2wgR2V0VmFsdWVGcm9tKHY4OjpIYW5k
bGU8djg6OlZhbHVlPiYgdjhWYWx1ZSwgVCBpbmRleE9yTmFtZSkKK3sKKyAgICB2ODo6TG9jYWw8
djg6Ok9iamVjdD4gb2JqZWN0ID0gdjhWYWx1ZS0+VG9PYmplY3QoKTsKKyAgICBpZiAoIW9iamVj
dC0+SGFzKGluZGV4T3JOYW1lKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgdjhWYWx1ZSA9IG9i
amVjdC0+R2V0KGluZGV4T3JOYW1lKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworUGFzc1JlZlB0
cjxJREJLZXk+IHZhbHVlRm9yS2V5UGF0aChQYXNzUmVmUHRyPFNlcmlhbGl6ZWRTY3JpcHRWYWx1
ZT4gdmFsdWUsIGNvbnN0IFZlY3RvcjxJREJLZXlQYXRoRWxlbWVudD4mIGtleVBhdGgpCit7Cisg
ICAgdjg6OkhhbmRsZVNjb3BlIHNjb3BlOworICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiB2OFZh
bHVlKHZhbHVlLT5kZXNlcmlhbGl6ZSgpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtl
eVBhdGguc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaWYgKGtleVBhdGhbaV0udHlwZSA9PSBJREJL
ZXlQYXRoRWxlbWVudDo6SXNJbmRleGVkKSB7CisgICAgICAgICAgICBpZiAoIXY4VmFsdWUtPklz
QXJyYXkoKSB8fCAhR2V0VmFsdWVGcm9tKHY4VmFsdWUsIGtleVBhdGhbaV0uaW5kZXgpKQorICAg
ICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYg
KCF2OFZhbHVlLT5Jc09iamVjdCgpIHx8ICFHZXRWYWx1ZUZyb20odjhWYWx1ZSwgdjhTdHJpbmco
a2V5UGF0aFtpXS5pZGVudGlmaWVyKSkpCisgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAg
ICB9CisgICAgfQorICAgIHJldHVybiBjcmVhdGVJREJLZXlGcm9tVmFsdWUodjhWYWx1ZSk7Cit9
CisKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9XZWJDb3Jl
L2JpbmRpbmdzL3Y4L0lEQkJpbmRpbmdVdGlsaXRpZXMuaCBiL1dlYkNvcmUvYmluZGluZ3Mvdjgv
SURCQmluZGluZ1V0aWxpdGllcy5oCmluZGV4IDc2ZjJiYmEuLjFkZTc5ZmQgMTAwNjQ0Ci0tLSBh
L1dlYkNvcmUvYmluZGluZ3MvdjgvSURCQmluZGluZ1V0aWxpdGllcy5oCisrKyBiL1dlYkNvcmUv
YmluZGluZ3MvdjgvSURCQmluZGluZ1V0aWxpdGllcy5oCkBAIC0yOSwxMyArMjksMTcgQEAKICNp
ZiBFTkFCTEUoSU5ERVhFRF9EQVRBQkFTRSkKIAogI2luY2x1ZGUgPHY4Lmg+CisjaW5jbHVkZSA8
d3RmL1ZlY3Rvci5oPgogI2luY2x1ZGUgPHd0Zi9Gb3J3YXJkLmg+CiAKIG5hbWVzcGFjZSBXZWJD
b3JlIHsKIAogY2xhc3MgSURCS2V5Oworc3RydWN0IElEQktleVBhdGhFbGVtZW50OworY2xhc3Mg
U2VyaWFsaXplZFNjcmlwdFZhbHVlOwogCiBQYXNzUmVmUHRyPElEQktleT4gY3JlYXRlSURCS2V5
RnJvbVZhbHVlKHY4OjpIYW5kbGU8djg6OlZhbHVlPik7CitQYXNzUmVmUHRyPElEQktleT4gdmFs
dWVGb3JLZXlQYXRoKFBhc3NSZWZQdHI8U2VyaWFsaXplZFNjcmlwdFZhbHVlPiB2YWx1ZSwgIGNv
bnN0IFZlY3RvcjxJREJLZXlQYXRoRWxlbWVudD4mIGtleVBhdGgpOwogCiB9CiAKZGlmZiAtLWdp
dCBhL1dlYktpdC9jaHJvbWl1bS9XZWJLaXQuZ3lwIGIvV2ViS2l0L2Nocm9taXVtL1dlYktpdC5n
eXAKaW5kZXggY2I4MjQxMy4uNDQxMDM5NSAxMDA2NDQKLS0tIGEvV2ViS2l0L2Nocm9taXVtL1dl
YktpdC5neXAKKysrIGIvV2ViS2l0L2Nocm9taXVtL1dlYktpdC5neXAKQEAgLTE3Nyw2ICsxNzcs
NyBAQAogICAgICAgICAgICAgICAgICdwdWJsaWMvV2ViSFRUUEJvZHkuaCcsCiAgICAgICAgICAg
ICAgICAgJ3B1YmxpYy9XZWJJbWFnZS5oJywKICAgICAgICAgICAgICAgICAncHVibGljL1dlYklt
YWdlRGVjb2Rlci5oJywKKyAgICAgICAgICAgICAgICAncHVibGljL1dlYklEQkJpbmRpbmdVdGls
aXRpZXMuaCcsCiAgICAgICAgICAgICAgICAgJ3B1YmxpYy9XZWJJREJDYWxsYmFja3MuaCcsCiAg
ICAgICAgICAgICAgICAgJ3B1YmxpYy9XZWJJREJDdXJzb3IuaCcsCiAgICAgICAgICAgICAgICAg
J3B1YmxpYy9XZWJJREJEYXRhYmFzZS5oJywKQEAgLTE4NSw2ICsxODYsNyBAQAogICAgICAgICAg
ICAgICAgICdwdWJsaWMvV2ViSURCS2V5UmFuZ2UuaCcsCiAgICAgICAgICAgICAgICAgJ3B1Ymxp
Yy9XZWJJREJJbmRleC5oJywKICAgICAgICAgICAgICAgICAncHVibGljL1dlYklEQktleS5oJywK
KyAgICAgICAgICAgICAgICAncHVibGljL1dlYklEQktleVBhdGguaCcsCiAgICAgICAgICAgICAg
ICAgJ3B1YmxpYy9XZWJJREJPYmplY3RTdG9yZS5oJywKICAgICAgICAgICAgICAgICAncHVibGlj
L1dlYklucHV0RWxlbWVudC5oJywKICAgICAgICAgICAgICAgICAncHVibGljL1dlYklucHV0RXZl
bnQuaCcsCkBAIC00MTYsNiArNDE4LDcgQEAKICAgICAgICAgICAgICAgICAnc3JjL1dlYkdyYXBo
aWNzQ29udGV4dDNERGVmYXVsdEltcGwuaCcsCiAgICAgICAgICAgICAgICAgJ3NyYy9XZWJIaXN0
b3J5SXRlbS5jcHAnLAogICAgICAgICAgICAgICAgICdzcmMvV2ViSFRUUEJvZHkuY3BwJywKKyAg
ICAgICAgICAgICAgICAnc3JjL1dlYklEQkJpbmRpbmdVdGlsaXRpZXMuY3BwJywKICAgICAgICAg
ICAgICAgICAnc3JjL1dlYklEQkNhbGxiYWNrc0ltcGwuY3BwJywKICAgICAgICAgICAgICAgICAn
c3JjL1dlYklEQkNhbGxiYWNrc0ltcGwuaCcsCiAgICAgICAgICAgICAgICAgJ3NyYy9XZWJJREJD
dXJzb3JJbXBsLmNwcCcsCkBAIC00MjgsNiArNDMxLDcgQEAKICAgICAgICAgICAgICAgICAnc3Jj
L1dlYklEQkluZGV4SW1wbC5jcHAnLAogICAgICAgICAgICAgICAgICdzcmMvV2ViSURCSW5kZXhJ
bXBsLmgnLAogICAgICAgICAgICAgICAgICdzcmMvV2ViSURCS2V5LmNwcCcsCisgICAgICAgICAg
ICAgICAgJ3NyYy9XZWJJREJLZXlQYXRoLmNwcCcsCiAgICAgICAgICAgICAgICAgJ3NyYy9XZWJJ
REJLZXlSYW5nZS5jcHAnLAogICAgICAgICAgICAgICAgICdzcmMvV2ViSURCT2JqZWN0U3RvcmVJ
bXBsLmNwcCcsCiAgICAgICAgICAgICAgICAgJ3NyYy9XZWJJREJPYmplY3RTdG9yZUltcGwuaCcs
CkBAIC03MTMsNiArNzE3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAg
ICAgICAgICAgJ3NvdXJjZXMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAndGVzdHMvRHJh
Z0ltYWdlVGVzdC5jcHAnLAorICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3RzL0lEQkJpbmRp
bmdVdGlsaXRpZXNUZXN0LmNwcCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAndGVzdHMvSURC
S2V5UGF0aFRlc3QuY3BwJywKICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0cy9LZXlib2Fy
ZFRlc3QuY3BwJywKICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0cy9LVVJMVGVzdC5jcHAn
LApkaWZmIC0tZ2l0IGEvV2ViS2l0L2Nocm9taXVtL3B1YmxpYy9XZWJJREJCaW5kaW5nVXRpbGl0
aWVzLmggYi9XZWJLaXQvY2hyb21pdW0vcHVibGljL1dlYklEQkJpbmRpbmdVdGlsaXRpZXMuaApu
ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWEwNTc2Ci0tLSAvZGV2L251bGwK
KysrIGIvV2ViS2l0L2Nocm9taXVtL3B1YmxpYy9XZWJJREJCaW5kaW5nVXRpbGl0aWVzLmgKQEAg
LTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5Z
CisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9T
UyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9G
CisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgV2ViSURCQmluZGluZ1V0aWxpdGllc19oCisj
ZGVmaW5lIFdlYklEQkJpbmRpbmdVdGlsaXRpZXNfaAorCituYW1lc3BhY2UgV2ViS2l0IHsKKwor
Y2xhc3MgV2ViSURCS2V5OworY2xhc3MgV2ViSURCS2V5UGF0aDsKK2NsYXNzIFdlYlNlcmlhbGl6
ZWRTY3JpcHRWYWx1ZTsKKworV2ViSURCS2V5IFdlYlZhbHVlRm9yS2V5UGF0aChjb25zdCBXZWJT
ZXJpYWxpemVkU2NyaXB0VmFsdWUmLCBjb25zdCBXZWJJREJLZXlQYXRoJik7CisKK30gLy8gbmFt
ZXNwYWNlIFdlYktpdAorCisjZW5kaWYgLy8gV2ViSURCQmluZGluZ1V0aWxpdGllc19oCmRpZmYg
LS1naXQgYS9XZWJLaXQvY2hyb21pdW0vcHVibGljL1dlYklEQktleVBhdGguaCBiL1dlYktpdC9j
aHJvbWl1bS9wdWJsaWMvV2ViSURCS2V5UGF0aC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4
IDAwMDAwMDAuLjhkNDkzYTYKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJLaXQvY2hyb21pdW0vcHVi
bGljL1dlYklEQktleVBhdGguaApAQCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
CisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRS
SUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9T
RSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05U
UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVT
SU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkg
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBXZWJJ
REJLZXlQYXRoX2gKKyNkZWZpbmUgV2ViSURCS2V5UGF0aF9oCisKKyNpbmNsdWRlICJXZWJDb21t
b24uaCIKKyNpbmNsdWRlICJXZWJQcml2YXRlT3duUHRyLmgiCisjaW5jbHVkZSAiV2ViVmVjdG9y
LmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKK3N0cnVjdCBJREJLZXlQYXRoRWxlbWVudDsKK30K
KworbmFtZXNwYWNlIFdURiB7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBULCBzaXplX3QgaW5saW5lQ2Fw
YWNpdHk+IGNsYXNzIFZlY3RvcjsKK30KKworbmFtZXNwYWNlIFdlYktpdCB7CisKK2NsYXNzIFdl
YlN0cmluZzsKKworY2xhc3MgV2ViSURCS2V5UGF0aCB7CitwdWJsaWM6CisgICAgc3RhdGljIFdl
YklEQktleVBhdGgqIGNyZWF0ZShjb25zdCBXZWJTdHJpbmcmLCBpbnQqIGVycm9yKTsKKyAgICB+
V2ViSURCS2V5UGF0aCgpIHsgcmVzZXQoKTsgfQorCisgICAgV0VCS0lUX0FQSSB2b2lkIHJlc2V0
KCk7CisKKyNpZiBXRUJLSVRfSU1QTEVNRU5UQVRJT04KKyAgICBleHBsaWNpdCBXZWJJREJLZXlQ
YXRoKGNvbnN0IFdURjo6VmVjdG9yPFdlYkNvcmU6OklEQktleVBhdGhFbGVtZW50LCAwPiYpOwor
ICAgIG9wZXJhdG9yIGNvbnN0IFdURjo6VmVjdG9yPFdlYkNvcmU6OklEQktleVBhdGhFbGVtZW50
LCAwPiYgKCkgY29uc3Q7CisjZW5kaWYKKworcHJpdmF0ZToKKyAgICBXZWJQcml2YXRlT3duUHRy
PFdURjo6VmVjdG9yPFdlYkNvcmU6OklEQktleVBhdGhFbGVtZW50LCAwPiA+IG1fcHJpdmF0ZTsK
K307CisKK30gLy8gbmFtZXNwYWNlIFdlYktpdAorCisjZW5kaWYgLy8gV2ViSURCS2V5UGF0aF9o
CmRpZmYgLS1naXQgYS9XZWJLaXQvY2hyb21pdW0vcHVibGljL1dlYlByaXZhdGVPd25QdHIuaCBi
L1dlYktpdC9jaHJvbWl1bS9wdWJsaWMvV2ViUHJpdmF0ZU93blB0ci5oCm5ldyBmaWxlIG1vZGUg
MTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MzNiOGEKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJLaXQv
Y2hyb21pdW0vcHVibGljL1dlYlByaXZhdGVPd25QdHIuaApAQCAtMCwwICsxLDc1IEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBM
RSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJ
RUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQ
UExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1Ig
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAq
IE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8K
KworI2lmbmRlZiBXZWJQcml2YXRlT3duUHRyX2gKKyNkZWZpbmUgV2ViUHJpdmF0ZU93blB0cl9o
CisKKyNpZiBXRUJLSVRfSU1QTEVNRU5UQVRJT04KKyNpbmNsdWRlIDx3dGYvT3duUHRyLmg+Cisj
aW5jbHVkZSA8d3RmL1Bhc3NPd25QdHIuaD4KKyNlbmRpZgorCituYW1lc3BhY2UgV2ViS2l0IHsK
KworLy8gVGhpcyBjbGFzcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwgb2YgdGhlIFdlYktp
dCBBUEkuICBJdCBleGlzdHMKKy8vIHRvIGhlbHAgc2ltcGxpZnkgdGhlIGltcGxlbWVudGF0aW9u
IG9mIFdlYktpdCBpbnRlcmZhY2VzIHRoYXQgbWVyZWx5CisvLyB3cmFwIChhbmQgb3duKSBhIHBv
aW50ZXIgdG8gYSBXZWJDb3JlIGNsYXNzLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBX
ZWJQcml2YXRlT3duUHRyIHsKK3B1YmxpYzoKKyNpZiBXRUJLSVRfSU1QTEVNRU5UQVRJT04KKyAg
ICBleHBsaWNpdCBXZWJQcml2YXRlT3duUHRyKFQqIHB0cikKKyAgICAgICAgOiBtX3B0cihwdHIp
CisgICAgeworICAgIH0KKworICAgIH5XZWJQcml2YXRlT3duUHRyKCkgeyByZXNldCgpOyB9CisK
KyAgICB2b2lkIHJlc2V0KCkKKyAgICB7CisgICAgICAgIC8vIHdlIG93biBtX3B0ci4KKyAgICAg
ICAgZGVsZXRlIG1fcHRyOworICAgICAgICBtX3B0ciA9IDA7CisgICAgfQorCisgICAgVCogZ2V0
KCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtX3B0cjsKKyAgICB9CisKKyAgICBUKiBv
cGVyYXRvci0+KCkgY29uc3QKKyAgICB7CisgICAgICAgIEFTU0VSVChtX3B0cik7CisgICAgICAg
IHJldHVybiBtX3B0cjsKKyAgICB9CisjZW5kaWYKKworcHJpdmF0ZToKKyAgICBUKiBtX3B0cjsK
K307CisKK30gLy8gbmFtZXNwYWNlIFdlYktpdAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL1dlYktp
dC9jaHJvbWl1bS9zcmMvV2ViSURCQmluZGluZ1V0aWxpdGllcy5jcHAgYi9XZWJLaXQvY2hyb21p
dW0vc3JjL1dlYklEQkJpbmRpbmdVdGlsaXRpZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu
ZGV4IDAwMDAwMDAuLjg2NTg4ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJLaXQvY2hyb21pdW0v
c3JjL1dlYklEQkJpbmRpbmdVdGlsaXRpZXMuY3BwCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFO
RCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAor
ICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUg
T1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04g
QU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisj
aW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiV2ViSURCQmluZGluZ1V0aWxpdGllcy5oIgor
CisjaW5jbHVkZSAiSURCQmluZGluZ1V0aWxpdGllcy5oIgorI2luY2x1ZGUgIklEQktleS5oIgor
I2luY2x1ZGUgIklEQktleVBhdGguaCIKKyNpbmNsdWRlICJQbGF0Zm9ybVN0cmluZy5oIgorI2lu
Y2x1ZGUgIlNlcmlhbGl6ZWRTY3JpcHRWYWx1ZS5oIgorI2luY2x1ZGUgIldlYklEQktleS5oIgor
I2luY2x1ZGUgIldlYklEQktleVBhdGguaCIKKyNpbmNsdWRlICJXZWJTZXJpYWxpemVkU2NyaXB0
VmFsdWUuaCIKKworbmFtZXNwYWNlIFdlYktpdCB7CisKK1dlYklEQktleSBXZWJWYWx1ZUZvcktl
eVBhdGgoY29uc3QgV2ViU2VyaWFsaXplZFNjcmlwdFZhbHVlJiBzZXJpYWxpemVkU2NyaXB0VmFs
dWUsIGNvbnN0IFdlYklEQktleVBhdGgmIGlkYktleVBhdGgpCit7CisgICAgaWYgKHNlcmlhbGl6
ZWRTY3JpcHRWYWx1ZS5pc051bGwoKSkKKyAgICAgICAgcmV0dXJuIFdlYklEQktleTo6Y3JlYXRl
SW52YWxpZCgpOworICAgIHJldHVybiBXZWJDb3JlOjp2YWx1ZUZvcktleVBhdGgoc2VyaWFsaXpl
ZFNjcmlwdFZhbHVlLCBpZGJLZXlQYXRoKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViS2l0CmRp
ZmYgLS1naXQgYS9XZWJLaXQvY2hyb21pdW0vc3JjL1dlYklEQktleVBhdGguY3BwIGIvV2ViS2l0
L2Nocm9taXVtL3NyYy9XZWJJREJLZXlQYXRoLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl
eCAwMDAwMDAwLi5iZjRiZmNiCi0tLSAvZGV2L251bGwKKysrIGIvV2ViS2l0L2Nocm9taXVtL3Ny
Yy9XZWJJREJLZXlQYXRoLmNwcApAQCAtMCwwICsxLDY4IEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
CisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRS
SUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9T
RSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05U
UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVT
SU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkg
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNv
bmZpZy5oIgorI2luY2x1ZGUgIldlYklEQktleVBhdGguaCIKKworI2lmIEVOQUJMRShJTkRFWEVE
X0RBVEFCQVNFKQorCisjaW5jbHVkZSAiSURCS2V5UGF0aC5oIgorI2luY2x1ZGUgIldlYlN0cmlu
Zy5oIgorI2luY2x1ZGUgIldlYlZlY3Rvci5oIgorI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKwor
dXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7CisKK25hbWVzcGFjZSBXZWJLaXQgeworCitXZWJJREJL
ZXlQYXRoKiBXZWJJREJLZXlQYXRoOjpjcmVhdGUoY29uc3QgV2ViU3RyaW5nJiBrZXlQYXRoLCBp
bnQqIGVycm9yKQoreworICAgIFdURjo6VmVjdG9yPElEQktleVBhdGhFbGVtZW50PiBpZGJFbGVt
ZW50czsKKyAgICBJREJLZXlQYXRoUGFyc2VFcnJvciBpZGJFcnJvcjsKKyAgICBJREJQYXJzZUtl
eVBhdGgoa2V5UGF0aCwgJmlkYkVsZW1lbnRzLCAmaWRiRXJyb3IpOworICAgICplcnJvciA9IGlk
YkVycm9yOworICAgIGlmIChpZGJFcnJvcikKKyAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVy
biBuZXcgV2ViSURCS2V5UGF0aChpZGJFbGVtZW50cyk7Cit9CisKK1dlYklEQktleVBhdGg6Oldl
YklEQktleVBhdGgoY29uc3QgV1RGOjpWZWN0b3I8SURCS2V5UGF0aEVsZW1lbnQ+JiBlbGVtZW50
cykKKyAgICA6IG1fcHJpdmF0ZShuZXcgV1RGOjpWZWN0b3I8SURCS2V5UGF0aEVsZW1lbnQ+KGVs
ZW1lbnRzKSkKK3sKK30KKwordm9pZCBXZWJJREJLZXlQYXRoOjpyZXNldCgpCit7CisgICAgbV9w
cml2YXRlLnJlc2V0KCk7Cit9CisKK1dlYklEQktleVBhdGg6Om9wZXJhdG9yIGNvbnN0IFdURjo6
VmVjdG9yPFdlYkNvcmU6OklEQktleVBhdGhFbGVtZW50LCAwPiYoKSBjb25zdAoreworICAgIHJl
dHVybiAqbV9wcml2YXRlLmdldCgpOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJLaXQKKworI2Vu
ZGlmIC8vIEVOQUJMRShJTkRFWEVEX0RBVEFCQVNFKQpkaWZmIC0tZ2l0IGEvV2ViS2l0L2Nocm9t
aXVtL3Rlc3RzL0lEQkJpbmRpbmdVdGlsaXRpZXNUZXN0LmNwcCBiL1dlYktpdC9jaHJvbWl1bS90
ZXN0cy9JREJCaW5kaW5nVXRpbGl0aWVzVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k
ZXggMDAwMDAwMC4uMzljZDk3MgotLS0gL2Rldi9udWxsCisrKyBiL1dlYktpdC9jaHJvbWl1bS90
ZXN0cy9JREJCaW5kaW5nVXRpbGl0aWVzVGVzdC5jcHAKQEAgLTAsMCArMSwxNjUgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAg
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElF
RAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICog
T04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLwor
CisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiSURCQmluZGluZ1V0aWxpdGllcy5oIgor
I2luY2x1ZGUgIklEQktleS5oIgorI2luY2x1ZGUgIklEQktleVBhdGguaCIKKyNpbmNsdWRlICJT
ZXJpYWxpemVkU2NyaXB0VmFsdWUuaCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5j
bHVkZSA8d3RmL1ZlY3Rvci5oPgorCisjaWYgRU5BQkxFKElOREVYRURfREFUQUJBU0UpCisKK3Vz
aW5nIG5hbWVzcGFjZSBXZWJDb3JlOworCituYW1lc3BhY2UgeworCitjbGFzcyBMb2NhbENvbnRl
eHQgeworcHVibGljOgorICAgIExvY2FsQ29udGV4dCgpCisgICAgICAgIDogbV9jb250ZXh0KHY4
OjpDb250ZXh0OjpOZXcoKSkKKyAgICB7CisgICAgICAgIG1fY29udGV4dC0+RW50ZXIoKTsKKyAg
ICB9CisKKyAgICB2aXJ0dWFsIH5Mb2NhbENvbnRleHQoKQorICAgIHsKKyAgICAgICAgbV9jb250
ZXh0LT5FeGl0KCk7CisgICAgICAgIG1fY29udGV4dC5EaXNwb3NlKCk7CisgICAgfQorCitwcml2
YXRlOgorICAgIHY4OjpMb2NrZXIgbV9sb2NrZXI7CisgICAgdjg6OkhhbmRsZVNjb3BlIG1fc2Nv
cGU7CisgICAgdjg6OlBlcnNpc3RlbnQ8djg6OkNvbnRleHQ+IG1fY29udGV4dDsKK307CisKK1Bh
c3NSZWZQdHI8SURCS2V5PiBjaGVja1ZhbHVlRm9yS2V5UGF0aEludGVybmFsKFNlcmlhbGl6ZWRT
Y3JpcHRWYWx1ZSogdmFsdWUsIGNvbnN0IFN0cmluZyYga2V5UGF0aCkKK3sKKyAgICBWZWN0b3I8
SURCS2V5UGF0aEVsZW1lbnQ+IGlkYktleVBhdGg7CisgICAgSURCS2V5UGF0aFBhcnNlRXJyb3Ig
cGFyc2VFcnJvcjsKKyAgICBJREJQYXJzZUtleVBhdGgoa2V5UGF0aCwgJmlkYktleVBhdGgsICZw
YXJzZUVycm9yKTsKKyAgICBFWFBFQ1RfRVEoSURCS2V5UGF0aFBhcnNlRXJyb3JOb25lLCBwYXJz
ZUVycm9yKTsKKyAgICByZXR1cm4gdmFsdWVGb3JLZXlQYXRoKHZhbHVlLCBpZGJLZXlQYXRoKTsK
K30KKwordm9pZCBjaGVja0tleVBhdGhOdWxsVmFsdWUoU2VyaWFsaXplZFNjcmlwdFZhbHVlKiB2
YWx1ZSwgY29uc3QgU3RyaW5nJiBrZXlQYXRoKQoreworICAgIFJlZlB0cjxJREJLZXk+IGlkYktl
eSA9IGNoZWNrVmFsdWVGb3JLZXlQYXRoSW50ZXJuYWwodmFsdWUsIGtleVBhdGgpOworICAgIEFT
U0VSVF9GQUxTRShpZGJLZXkuZ2V0KCkpOworfQorCit2b2lkIGNoZWNrS2V5UGF0aFN0cmluZ1Zh
bHVlKFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZSogdmFsdWUsIGNvbnN0IFN0cmluZyYga2V5UGF0aCwg
Y29uc3QgU3RyaW5nJiBleHBlY3RlZCkKK3sKKyAgICBSZWZQdHI8SURCS2V5PiBpZGJLZXkgPSBj
aGVja1ZhbHVlRm9yS2V5UGF0aEludGVybmFsKHZhbHVlLCBrZXlQYXRoKTsKKyAgICBBU1NFUlRf
VFJVRShpZGJLZXkuZ2V0KCkpOworICAgIEFTU0VSVF9FUShJREJLZXk6OlN0cmluZ1R5cGUsIGlk
YktleS0+dHlwZSgpKTsKKyAgICBBU1NFUlRfVFJVRShleHBlY3RlZCA9PSBpZGJLZXktPnN0cmlu
ZygpKTsKK30KKwordm9pZCBjaGVja0tleVBhdGhOdW1iZXJWYWx1ZShTZXJpYWxpemVkU2NyaXB0
VmFsdWUqIHZhbHVlLCBjb25zdCBTdHJpbmcmIGtleVBhdGgsIGludCBleHBlY3RlZCkKK3sKKyAg
ICBSZWZQdHI8SURCS2V5PiBpZGJLZXkgPSBjaGVja1ZhbHVlRm9yS2V5UGF0aEludGVybmFsKHZh
bHVlLCBrZXlQYXRoKTsKKyAgICBBU1NFUlRfVFJVRShpZGJLZXkuZ2V0KCkpOworICAgIEFTU0VS
VF9FUShJREJLZXk6Ok51bWJlclR5cGUsIGlkYktleS0+dHlwZSgpKTsKKyAgICBBU1NFUlRfVFJV
RShleHBlY3RlZCA9PSBpZGJLZXktPm51bWJlcigpKTsKK30KKworVEVTVChJREJWYWx1ZUZvcktl
eVBhdGhUZXN0LCBUb3BMZXZlbFByb3BlcnR5U3RyaW5nVmFsdWUpCit7CisgICAgTG9jYWxDb250
ZXh0IHY4Y29udGV4dDsKKyAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gb2JqZWN0ID0gdjg6Ok9i
amVjdDo6TmV3KCk7CisgICAgb2JqZWN0LT5TZXQodjg6OlN0cmluZzo6TmV3KCJmb28iKSwgdjg6
OlN0cmluZzo6TmV3KCJ6b28iKSk7CisKKyAgICBSZWZQdHI8U2VyaWFsaXplZFNjcmlwdFZhbHVl
PiBzZXJpYWxpemVkU2NyaXB0VmFsdWUgPSBTZXJpYWxpemVkU2NyaXB0VmFsdWU6OmNyZWF0ZShv
YmplY3QpOworCisgICAgY2hlY2tLZXlQYXRoU3RyaW5nVmFsdWUoc2VyaWFsaXplZFNjcmlwdFZh
bHVlLmdldCgpLCAiZm9vIiwgInpvbyIpOworICAgIGNoZWNrS2V5UGF0aE51bGxWYWx1ZShzZXJp
YWxpemVkU2NyaXB0VmFsdWUuZ2V0KCksICJiYXIiKTsKKyAgICBjaGVja0tleVBhdGhOdWxsVmFs
dWUoc2VyaWFsaXplZFNjcmlwdFZhbHVlLmdldCgpLCAiWzNdIik7Cit9CisKK1RFU1QoSURCVmFs
dWVGb3JLZXlQYXRoVGVzdCwgVG9wTGV2ZWxQcm9wZXJ0eU51bWJlclZhbHVlKQoreworICAgIExv
Y2FsQ29udGV4dCB2OGNvbnRleHQ7CisgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IG9iamVjdCA9
IHY4OjpPYmplY3Q6Ok5ldygpOworICAgIG9iamVjdC0+U2V0KHY4OjpTdHJpbmc6Ok5ldygiZm9v
IiksIHY4OjpOdW1iZXI6Ok5ldyg0NTYpKTsKKworICAgIFJlZlB0cjxTZXJpYWxpemVkU2NyaXB0
VmFsdWU+IHNlcmlhbGl6ZWRTY3JpcHRWYWx1ZSA9IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6Y3Jl
YXRlKG9iamVjdCk7CisKKyAgICBjaGVja0tleVBhdGhOdW1iZXJWYWx1ZShzZXJpYWxpemVkU2Ny
aXB0VmFsdWUuZ2V0KCksICJmb28iLCA0NTYpOworICAgIGNoZWNrS2V5UGF0aE51bGxWYWx1ZShz
ZXJpYWxpemVkU2NyaXB0VmFsdWUuZ2V0KCksICJiYXIiKTsKKyAgICBjaGVja0tleVBhdGhOdWxs
VmFsdWUoc2VyaWFsaXplZFNjcmlwdFZhbHVlLmdldCgpLCAiWzNdIik7Cit9CisKK1RFU1QoSURC
VmFsdWVGb3JLZXlQYXRoVGVzdCwgVG9wTGV2ZWxBcnJheUVsZW1lbnQpCit7CisgICAgTG9jYWxD
b250ZXh0IHY4Y29udGV4dDsKKyAgICB2ODo6TG9jYWw8djg6OkFycmF5PiBhcnJheSA9IHY4OjpB
cnJheTo6TmV3KCk7CisgICAgYXJyYXktPlNldCgzLCB2ODo6U3RyaW5nOjpOZXcoInpvbyIpKTsK
KworICAgIFJlZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+IHNlcmlhbGl6ZWRTY3JpcHRWYWx1
ZSA9IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6Y3JlYXRlKGFycmF5KTsKKworICAgIGNoZWNrS2V5
UGF0aFN0cmluZ1ZhbHVlKHNlcmlhbGl6ZWRTY3JpcHRWYWx1ZS5nZXQoKSwgIlszXSIsICJ6b28i
KTsKKyAgICBjaGVja0tleVBhdGhOdWxsVmFsdWUoc2VyaWFsaXplZFNjcmlwdFZhbHVlLmdldCgp
LCAiZm9vIik7CisgICAgY2hlY2tLZXlQYXRoTnVsbFZhbHVlKHNlcmlhbGl6ZWRTY3JpcHRWYWx1
ZS5nZXQoKSwgImJhciIpOworfQorCitURVNUKElEQlZhbHVlRm9yS2V5UGF0aFRlc3QsIFN1YlBy
b3BlcnR5KQoreworICAgIExvY2FsQ29udGV4dCB2OGNvbnRleHQ7CisgICAgdjg6OkxvY2FsPHY4
OjpPYmplY3Q+IG9iamVjdCA9IHY4OjpPYmplY3Q6Ok5ldygpOworICAgIHY4OjpMb2NhbDx2ODo6
T2JqZWN0PiBzdWJQcm9wZXJ0eSA9IHY4OjpPYmplY3Q6Ok5ldygpOworICAgIHN1YlByb3BlcnR5
LT5TZXQodjg6OlN0cmluZzo6TmV3KCJiYXIiKSwgdjg6OlN0cmluZzo6TmV3KCJ6ZWUiKSk7Cisg
ICAgb2JqZWN0LT5TZXQodjg6OlN0cmluZzo6TmV3KCJmb28iKSwgc3ViUHJvcGVydHkpOworCisg
ICAgUmVmUHRyPFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZT4gc2VyaWFsaXplZFNjcmlwdFZhbHVlID0g
U2VyaWFsaXplZFNjcmlwdFZhbHVlOjpjcmVhdGUob2JqZWN0KTsKKworICAgIGNoZWNrS2V5UGF0
aFN0cmluZ1ZhbHVlKHNlcmlhbGl6ZWRTY3JpcHRWYWx1ZS5nZXQoKSwgImZvby5iYXIiLCAiemVl
Iik7CisgICAgY2hlY2tLZXlQYXRoTnVsbFZhbHVlKHNlcmlhbGl6ZWRTY3JpcHRWYWx1ZS5nZXQo
KSwgImJhciIpOworICAgIGNoZWNrS2V5UGF0aE51bGxWYWx1ZShzZXJpYWxpemVkU2NyaXB0VmFs
dWUuZ2V0KCksICJbM10iKTsKK30KKworVEVTVChJREJWYWx1ZUZvcktleVBhdGhUZXN0LCBBcnJh
eTJEKQoreworICAgIExvY2FsQ29udGV4dCB2OGNvbnRleHQ7CisgICAgdjg6OkxvY2FsPHY4OjpP
YmplY3Q+IG9iamVjdCA9IHY4OjpPYmplY3Q6Ok5ldygpOworICAgIHY4OjpMb2NhbDx2ODo6QXJy
YXk+IGFycmF5ID0gdjg6OkFycmF5OjpOZXcoKTsKKyAgICB2ODo6TG9jYWw8djg6OkFycmF5PiBz
dWJBcnJheSA9IHY4OjpBcnJheTo6TmV3KCk7CisgICAgc3ViQXJyYXktPlNldCg3LCB2ODo6U3Ry
aW5nOjpOZXcoInplZSIpKTsKKyAgICBhcnJheS0+U2V0KDMsIHN1YkFycmF5KTsKKyAgICBvYmpl
Y3QtPlNldCh2ODo6U3RyaW5nOjpOZXcoImZvbyIpLCBhcnJheSk7CisKKyAgICBSZWZQdHI8U2Vy
aWFsaXplZFNjcmlwdFZhbHVlPiBzZXJpYWxpemVkU2NyaXB0VmFsdWUgPSBTZXJpYWxpemVkU2Ny
aXB0VmFsdWU6OmNyZWF0ZShvYmplY3QpOworCisgICAgY2hlY2tLZXlQYXRoU3RyaW5nVmFsdWUo
c2VyaWFsaXplZFNjcmlwdFZhbHVlLmdldCgpLCAiZm9vWzNdWzddIiwgInplZSIpOworICAgIGNo
ZWNrS2V5UGF0aE51bGxWYWx1ZShzZXJpYWxpemVkU2NyaXB0VmFsdWUuZ2V0KCksICJiYXIiKTsK
KyAgICBjaGVja0tleVBhdGhOdWxsVmFsdWUoc2VyaWFsaXplZFNjcmlwdFZhbHVlLmdldCgpLCAi
WzRdIik7Cit9CisKK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZiAvLyBFTkFCTEUoSU5ERVhFRF9E
QVRBQkFTRSkK
</data>
<flag name="review"
          id="52485"
          type_id="1"
          status="-"
          setter="jorlow"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>64125</attachid>
            <date>2010-08-11 09:34:23 -0700</date>
            <delta_ts>2010-08-11 09:39:52 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>patch</filename>
            <type>text/plain</type>
            <size>19982</size>
            <attacher name="Marcus Bulach">bulach</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvYmluZGluZ3MvdjgvSURCQmluZGluZ1V0aWxpdGllcy5jcHAg
Yi9XZWJDb3JlL2JpbmRpbmdzL3Y4L0lEQkJpbmRpbmdVdGlsaXRpZXMuY3BwCmluZGV4IDRiMzhh
NjEuLjgyNTkwMDcgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvYmluZGluZ3MvdjgvSURCQmluZGluZ1V0
aWxpdGllcy5jcHAKKysrIGIvV2ViQ29yZS9iaW5kaW5ncy92OC9JREJCaW5kaW5nVXRpbGl0aWVz
LmNwcApAQCAtMjksNiArMjksOCBAQAogI2lmIEVOQUJMRShJTkRFWEVEX0RBVEFCQVNFKQogCiAj
aW5jbHVkZSAiSURCS2V5LmgiCisjaW5jbHVkZSAiSURCS2V5UGF0aC5oIgorI2luY2x1ZGUgIlNl
cmlhbGl6ZWRTY3JpcHRWYWx1ZS5oIgogI2luY2x1ZGUgIlY4QmluZGluZy5oIgogCiBuYW1lc3Bh
Y2UgV2ViQ29yZSB7CkBAIC00NSw2ICs0NywzNyBAQCBQYXNzUmVmUHRyPElEQktleT4gY3JlYXRl
SURCS2V5RnJvbVZhbHVlKHY4OjpIYW5kbGU8djg6OlZhbHVlPiB2YWx1ZSkKICAgICByZXR1cm4g
MDsKIH0KIAordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2Jvb2wgR2V0VmFsdWVGcm9tKFQgaW5kZXhP
ck5hbWUsIHY4OjpIYW5kbGU8djg6OlZhbHVlPiYgdjhWYWx1ZSkKK3sKKyAgICB2ODo6TG9jYWw8
djg6Ok9iamVjdD4gb2JqZWN0ID0gdjhWYWx1ZS0+VG9PYmplY3QoKTsKKyAgICBpZiAoIW9iamVj
dC0+SGFzKGluZGV4T3JOYW1lKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHY4VmFsdWUg
PSBvYmplY3QtPkdldChpbmRleE9yTmFtZSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK1Bhc3NS
ZWZQdHI8SURCS2V5PiBjcmVhdGVJREJLZXlGcm9tU2VyaWFsaXplZFZhbHVlQW5kS2V5UGF0aChQ
YXNzUmVmUHRyPFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZT4gdmFsdWUsIGNvbnN0IFZlY3RvcjxJREJL
ZXlQYXRoRWxlbWVudD4mIGtleVBhdGgpCit7CisgICAgdjg6OkhhbmRsZVNjb3BlIHNjb3BlOwor
ICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiB2OFZhbHVlKHZhbHVlLT5kZXNlcmlhbGl6ZSgpKTsK
KyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtleVBhdGguc2l6ZSgpOyArK2kpIHsKKyAgICAg
ICAgc3dpdGNoIChrZXlQYXRoW2ldLnR5cGUpIHsKKyAgICAgICAgY2FzZSBJREJLZXlQYXRoRWxl
bWVudDo6SXNJbmRleGVkOgorICAgICAgICAgICAgaWYgKCF2OFZhbHVlLT5Jc0FycmF5KCkgfHwg
IUdldFZhbHVlRnJvbShrZXlQYXRoW2ldLmluZGV4LCB2OFZhbHVlKSkKKyAgICAgICAgICAgICAg
ICByZXR1cm4gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIElEQktleVBhdGhF
bGVtZW50OjpJc05hbWVkOgorICAgICAgICAgICAgaWYgKCF2OFZhbHVlLT5Jc09iamVjdCgpIHx8
ICFHZXRWYWx1ZUZyb20odjhTdHJpbmcoa2V5UGF0aFtpXS5pZGVudGlmaWVyKSwgdjhWYWx1ZSkp
CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
ZGVmYXVsdDoKKyAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICB9Cisg
ICAgfQorICAgIHJldHVybiBjcmVhdGVJREJLZXlGcm9tVmFsdWUodjhWYWx1ZSk7Cit9CisKIH0g
Ly8gbmFtZXNwYWNlIFdlYkNvcmUKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9XZWJDb3JlL2JpbmRp
bmdzL3Y4L0lEQkJpbmRpbmdVdGlsaXRpZXMuaCBiL1dlYkNvcmUvYmluZGluZ3MvdjgvSURCQmlu
ZGluZ1V0aWxpdGllcy5oCmluZGV4IDc2ZjJiYmEuLmVlYzdjNDEgMTAwNjQ0Ci0tLSBhL1dlYkNv
cmUvYmluZGluZ3MvdjgvSURCQmluZGluZ1V0aWxpdGllcy5oCisrKyBiL1dlYkNvcmUvYmluZGlu
Z3MvdjgvSURCQmluZGluZ1V0aWxpdGllcy5oCkBAIC0zMCwxMiArMzAsMTYgQEAKIAogI2luY2x1
ZGUgPHY4Lmg+CiAjaW5jbHVkZSA8d3RmL0ZvcndhcmQuaD4KKyNpbmNsdWRlIDx3dGYvVmVjdG9y
Lmg+CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogY2xhc3MgSURCS2V5OworY2xhc3MgU2VyaWFs
aXplZFNjcmlwdFZhbHVlOworc3RydWN0IElEQktleVBhdGhFbGVtZW50OwogCiBQYXNzUmVmUHRy
PElEQktleT4gY3JlYXRlSURCS2V5RnJvbVZhbHVlKHY4OjpIYW5kbGU8djg6OlZhbHVlPik7CitQ
YXNzUmVmUHRyPElEQktleT4gY3JlYXRlSURCS2V5RnJvbVNlcmlhbGl6ZWRWYWx1ZUFuZEtleVBh
dGgoUGFzc1JlZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+IHZhbHVlLCAgY29uc3QgVmVjdG9y
PElEQktleVBhdGhFbGVtZW50PiYga2V5UGF0aCk7CiAKIH0KIApkaWZmIC0tZ2l0IGEvV2ViS2l0
L2Nocm9taXVtL1dlYktpdC5neXAgYi9XZWJLaXQvY2hyb21pdW0vV2ViS2l0Lmd5cAppbmRleCAx
ZTMxNDJjLi5mZjFmNmNmIDEwMDY0NAotLS0gYS9XZWJLaXQvY2hyb21pdW0vV2ViS2l0Lmd5cAor
KysgYi9XZWJLaXQvY2hyb21pdW0vV2ViS2l0Lmd5cApAQCAtMTg2LDYgKzE4Niw3IEBACiAgICAg
ICAgICAgICAgICAgJ3B1YmxpYy9XZWJJREJLZXlSYW5nZS5oJywKICAgICAgICAgICAgICAgICAn
cHVibGljL1dlYklEQkluZGV4LmgnLAogICAgICAgICAgICAgICAgICdwdWJsaWMvV2ViSURCS2V5
LmgnLAorICAgICAgICAgICAgICAgICdwdWJsaWMvV2ViSURCS2V5UGF0aC5oJywKICAgICAgICAg
ICAgICAgICAncHVibGljL1dlYklEQk9iamVjdFN0b3JlLmgnLAogICAgICAgICAgICAgICAgICdw
dWJsaWMvV2ViSW5wdXRFbGVtZW50LmgnLAogICAgICAgICAgICAgICAgICdwdWJsaWMvV2ViSW5w
dXRFdmVudC5oJywKQEAgLTIyNSw2ICsyMjYsNyBAQAogICAgICAgICAgICAgICAgICdwdWJsaWMv
V2ViUG9wdXBNZW51SW5mby5oJywKICAgICAgICAgICAgICAgICAncHVibGljL1dlYlBvcHVwVHlw
ZS5oJywKICAgICAgICAgICAgICAgICAncHVibGljL1dlYlByaXZhdGVQdHIuaCcsCisgICAgICAg
ICAgICAgICAgJ3B1YmxpYy9XZWJQcml2YXRlT3duUHRyLmgnLAogICAgICAgICAgICAgICAgICdw
dWJsaWMvV2ViUmFuZ2UuaCcsCiAgICAgICAgICAgICAgICAgJ3B1YmxpYy9XZWJSZWN0LmgnLAog
ICAgICAgICAgICAgICAgICdwdWJsaWMvV2ViUmVndWxhckV4cHJlc3Npb24uaCcsCkBAIC00MzAs
NiArNDMyLDcgQEAKICAgICAgICAgICAgICAgICAnc3JjL1dlYklEQkluZGV4SW1wbC5jcHAnLAog
ICAgICAgICAgICAgICAgICdzcmMvV2ViSURCSW5kZXhJbXBsLmgnLAogICAgICAgICAgICAgICAg
ICdzcmMvV2ViSURCS2V5LmNwcCcsCisgICAgICAgICAgICAgICAgJ3NyYy9XZWJJREJLZXlQYXRo
LmNwcCcsCiAgICAgICAgICAgICAgICAgJ3NyYy9XZWJJREJLZXlSYW5nZS5jcHAnLAogICAgICAg
ICAgICAgICAgICdzcmMvV2ViSURCT2JqZWN0U3RvcmVJbXBsLmNwcCcsCiAgICAgICAgICAgICAg
ICAgJ3NyYy9XZWJJREJPYmplY3RTdG9yZUltcGwuaCcsCkBAIC03MDMsNiArNzA2LDcgQEAKICAg
ICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgJ3NvdXJjZXMnOiBbCiAg
ICAgICAgICAgICAgICAgICAgICAgICAndGVzdHMvRHJhZ0ltYWdlVGVzdC5jcHAnLAorICAgICAg
ICAgICAgICAgICAgICAgICAgJ3Rlc3RzL0lEQkJpbmRpbmdVdGlsaXRpZXNUZXN0LmNwcCcsCiAg
ICAgICAgICAgICAgICAgICAgICAgICAndGVzdHMvSURCS2V5UGF0aFRlc3QuY3BwJywKICAgICAg
ICAgICAgICAgICAgICAgICAgICd0ZXN0cy9LZXlib2FyZFRlc3QuY3BwJywKICAgICAgICAgICAg
ICAgICAgICAgICAgICd0ZXN0cy9LVVJMVGVzdC5jcHAnLApkaWZmIC0tZ2l0IGEvV2ViS2l0L2No
cm9taXVtL3B1YmxpYy9XZWJJREJLZXkuaCBiL1dlYktpdC9jaHJvbWl1bS9wdWJsaWMvV2ViSURC
S2V5LmgKaW5kZXggMWNmMzM2ZC4uMzJjYWExMCAxMDA2NDQKLS0tIGEvV2ViS2l0L2Nocm9taXVt
L3B1YmxpYy9XZWJJREJLZXkuaAorKysgYi9XZWJLaXQvY2hyb21pdW0vcHVibGljL1dlYklEQktl
eS5oCkBAIC0zNCwxMiArMzQsMTYgQEAgbmFtZXNwYWNlIFdlYkNvcmUgeyBjbGFzcyBJREJLZXk7
IH0KIAogbmFtZXNwYWNlIFdlYktpdCB7CiAKK2NsYXNzIFdlYklEQktleVBhdGg7CitjbGFzcyBX
ZWJTZXJpYWxpemVkU2NyaXB0VmFsdWU7CisKIGNsYXNzIFdlYklEQktleSB7CiBwdWJsaWM6CiAg
ICAgfldlYklEQktleSgpIHsgcmVzZXQoKTsgfQogICAKICAgICBXRUJLSVRfQVBJIHN0YXRpYyBX
ZWJJREJLZXkgY3JlYXRlTnVsbCgpOwogICAgIFdFQktJVF9BUEkgc3RhdGljIFdlYklEQktleSBj
cmVhdGVJbnZhbGlkKCk7CisgICAgV0VCS0lUX0FQSSBzdGF0aWMgV2ViSURCS2V5IGNyZWF0ZUZy
b21WYWx1ZUFuZEtleVBhdGgoY29uc3QgV2ViU2VyaWFsaXplZFNjcmlwdFZhbHVlJiwgY29uc3Qg
V2ViSURCS2V5UGF0aCYpOwogCiAgICAgV2ViSURCS2V5KGNvbnN0IFdlYlN0cmluZyYgc3RyaW5n
KSB7IGFzc2lnbihzdHJpbmcpOyB9CiAgICAgV2ViSURCS2V5KGludDMyX3QgbnVtYmVyKSB7IGFz
c2lnbihudW1iZXIpOyB9CmRpZmYgLS1naXQgYS9XZWJLaXQvY2hyb21pdW0vcHVibGljL1dlYklE
QktleVBhdGguaCBiL1dlYktpdC9jaHJvbWl1bS9wdWJsaWMvV2ViSURCS2V5UGF0aC5oCm5ldyBm
aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwOGVjNjMKLS0tIC9kZXYvbnVsbAorKysg
Yi9XZWJLaXQvY2hyb21pdW0vcHVibGljL1dlYklEQktleVBhdGguaApAQCAtMCwwICsxLDY4IEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICog
MS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF
IElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFU
QSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
CisgKi8KKworI2lmbmRlZiBXZWJJREJLZXlQYXRoX2gKKyNkZWZpbmUgV2ViSURCS2V5UGF0aF9o
CisKKyNpbmNsdWRlICJXZWJDb21tb24uaCIKKyNpbmNsdWRlICJXZWJQcml2YXRlT3duUHRyLmgi
CisjaW5jbHVkZSAiV2ViVmVjdG9yLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsgc3RydWN0IElE
QktleVBhdGhFbGVtZW50OyB9CisKK25hbWVzcGFjZSBXVEYgeyB0ZW1wbGF0ZTx0eXBlbmFtZSBU
LCBzaXplX3QgaW5saW5lQ2FwYWNpdHk+IGNsYXNzIFZlY3RvcjsgfQorCituYW1lc3BhY2UgV2Vi
S2l0IHsKKworY2xhc3MgV2ViU3RyaW5nOworCitjbGFzcyBXZWJJREJLZXlQYXRoIHsKK3B1Ymxp
YzoKKyAgICBzdGF0aWMgV2ViSURCS2V5UGF0aCBjcmVhdGUoY29uc3QgV2ViU3RyaW5nJik7Cisg
ICAgV2ViSURCS2V5UGF0aChjb25zdCBXZWJJREJLZXlQYXRoJiBrZXlQYXRoKSB7IGFzc2lnbihr
ZXlQYXRoKTsgfQorICAgIH5XZWJJREJLZXlQYXRoKCkgeyByZXNldCgpOyB9CisKKyAgICBXRUJL
SVRfQVBJIGludCBwYXJzZUVycm9yKCkgY29uc3Q7CisgICAgV0VCS0lUX0FQSSB2b2lkIGFzc2ln
bihjb25zdCBXZWJJREJLZXlQYXRoJik7CisgICAgV0VCS0lUX0FQSSB2b2lkIHJlc2V0KCk7CisK
KyNpZiBXRUJLSVRfSU1QTEVNRU5UQVRJT04KKyAgICBvcGVyYXRvciBjb25zdCBXVEY6OlZlY3Rv
cjxXZWJDb3JlOjpJREJLZXlQYXRoRWxlbWVudCwgMD4mICgpIGNvbnN0OworI2VuZGlmCisKK3By
aXZhdGU6CisgICAgV2ViSURCS2V5UGF0aCgpOworCisjaWYgV0VCS0lUX0lNUExFTUVOVEFUSU9O
CisgICAgV2ViSURCS2V5UGF0aChjb25zdCBXVEY6OlZlY3RvcjxXZWJDb3JlOjpJREJLZXlQYXRo
RWxlbWVudCwgMD4mLCBpbnQgcGFyc2VFcnJvcik7CisjZW5kaWYKKworICAgIFdlYlByaXZhdGVP
d25QdHI8V1RGOjpWZWN0b3I8V2ViQ29yZTo6SURCS2V5UGF0aEVsZW1lbnQsIDA+ID4gbV9wcml2
YXRlOworICAgIGludCBtX3BhcnNlRXJyb3I7Cit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJLaXQK
KworI2VuZGlmIC8vIFdlYklEQktleVBhdGhfaApkaWZmIC0tZ2l0IGEvV2ViS2l0L2Nocm9taXVt
L3B1YmxpYy9XZWJQcml2YXRlT3duUHRyLmggYi9XZWJLaXQvY2hyb21pdW0vcHVibGljL1dlYlBy
aXZhdGVPd25QdHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmNhYmNm
Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViS2l0L2Nocm9taXVtL3B1YmxpYy9XZWJQcml2YXRlT3du
UHRyLmgKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElT
IiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVND
TEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJ
QUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBF
WEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQ
VElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgV2ViUHJpdmF0ZU93blB0cl9o
CisjZGVmaW5lIFdlYlByaXZhdGVPd25QdHJfaAorCisjaW5jbHVkZSAiV2ViQ29tbW9uLmgiCisK
K25hbWVzcGFjZSBXZWJLaXQgeworCisvLyBUaGlzIGNsYXNzIGlzIGFuIGltcGxlbWVudGF0aW9u
IGRldGFpbCBvZiB0aGUgV2ViS2l0IEFQSS4gIEl0IGV4aXN0cworLy8gdG8gaGVscCBzaW1wbGlm
eSB0aGUgaW1wbGVtZW50YXRpb24gb2YgV2ViS2l0IGludGVyZmFjZXMgdGhhdCBtZXJlbHkKKy8v
IHdyYXAgYSBwb2ludGVyIHRvIGEgV2ViQ29yZSBjbGFzcy4gSXQncyBzaW1pbGFyIHRvIFdlYlBy
aXZhdGVQdHIsIGJ1dCBpdAorLy8gd3JhcHMgYSBuYWtlZCBwb2ludGVyIHJhdGhlciB0aGFuIGEg
cmVmZXJlbmNlIGNvdW50ZWQuCisvLyBOb3RlOiB5b3UgbXVzdCBjYWxsIHJlc2V0KDApIG9uIHRo
ZSBpbXBsZW1lbnRhdGlvbiBzaWRlIGluIG9yZGVyIHRvIGRlbGV0ZQorLy8gdGhlIFdlYkNvcmUg
cG9pbnRlci4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgV2ViUHJpdmF0ZU93blB0ciB7
CitwdWJsaWM6CisgICAgV2ViUHJpdmF0ZU93blB0cigpIDogbV9wdHIoMCkge30KKyAgICB+V2Vi
UHJpdmF0ZU93blB0cigpIHsgV0VCS0lUX0FTU0VSVCghbV9wdHIpOyB9CisKKyNpZiBXRUJLSVRf
SU1QTEVNRU5UQVRJT04KKyAgICBleHBsaWNpdCBXZWJQcml2YXRlT3duUHRyKFQqIHB0cikKKyAg
ICAgICAgOiBtX3B0cihwdHIpCisgICAgeworICAgIH0KKworICAgIHZvaWQgcmVzZXQoVCogcHRy
KQorICAgIHsKKyAgICAgICAgZGVsZXRlIG1fcHRyOworICAgICAgICBtX3B0ciA9IHB0cjsKKyAg
ICB9CisKKyAgICBUKiBnZXQoKSBjb25zdCB7IHJldHVybiBtX3B0cjsgfQorCisgICAgVCogb3Bl
cmF0b3ItPigpIGNvbnN0CisgICAgeworICAgICAgICBXRUJLSVRfQVNTRVJUKG1fcHRyKTsKKyAg
ICAgICAgcmV0dXJuIG1fcHRyOworICAgIH0KKyNlbmRpZiAvLyBXRUJLSVRfSU1QTEVNRU5UQVRJ
T04KKworcHJpdmF0ZToKKyAgICBUKiBtX3B0cjsKKworICAgIFdlYlByaXZhdGVPd25QdHIoY29u
c3QgV2ViUHJpdmF0ZU93blB0ciYpOworICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFdlYlByaXZh
dGVPd25QdHImKTsKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYktpdAorCisjZW5kaWYKZGlmZiAt
LWdpdCBhL1dlYktpdC9jaHJvbWl1bS9zcmMvV2ViSURCS2V5LmNwcCBiL1dlYktpdC9jaHJvbWl1
bS9zcmMvV2ViSURCS2V5LmNwcAppbmRleCAxYzRjNjg1Li40MTNhOWU2IDEwMDY0NAotLS0gYS9X
ZWJLaXQvY2hyb21pdW0vc3JjL1dlYklEQktleS5jcHAKKysrIGIvV2ViS2l0L2Nocm9taXVtL3Ny
Yy9XZWJJREJLZXkuY3BwCkBAIC0zMCw3ICszMCwxMiBAQAogCiAjaWYgRU5BQkxFKElOREVYRURf
REFUQUJBU0UpCiAKKyNpbmNsdWRlICJJREJCaW5kaW5nVXRpbGl0aWVzLmgiCiAjaW5jbHVkZSAi
SURCS2V5LmgiCisjaW5jbHVkZSAiSURCS2V5UGF0aC5oIgorI2luY2x1ZGUgIlNlcmlhbGl6ZWRT
Y3JpcHRWYWx1ZS5oIgorI2luY2x1ZGUgIldlYklEQktleVBhdGguaCIKKyNpbmNsdWRlICJXZWJT
ZXJpYWxpemVkU2NyaXB0VmFsdWUuaCIKIAogdXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7CiAKQEAg
LTUwLDYgKzU1LDEzIEBAIFdlYklEQktleSBXZWJJREJLZXk6OmNyZWF0ZUludmFsaWQoKQogICAg
IHJldHVybiBrZXk7CiB9CiAKK1dlYklEQktleSBXZWJJREJLZXk6OmNyZWF0ZUZyb21WYWx1ZUFu
ZEtleVBhdGgoY29uc3QgV2ViU2VyaWFsaXplZFNjcmlwdFZhbHVlJiBzZXJpYWxpemVkU2NyaXB0
VmFsdWUsIGNvbnN0IFdlYklEQktleVBhdGgmIGlkYktleVBhdGgpCit7CisgICAgaWYgKHNlcmlh
bGl6ZWRTY3JpcHRWYWx1ZS5pc051bGwoKSkKKyAgICAgICAgcmV0dXJuIFdlYklEQktleTo6Y3Jl
YXRlSW52YWxpZCgpOworICAgIHJldHVybiBXZWJDb3JlOjpjcmVhdGVJREJLZXlGcm9tU2VyaWFs
aXplZFZhbHVlQW5kS2V5UGF0aChzZXJpYWxpemVkU2NyaXB0VmFsdWUsIGlkYktleVBhdGgpOwor
fQorCiB2b2lkIFdlYklEQktleTo6YXNzaWduKGNvbnN0IFdlYklEQktleSYgdmFsdWUpCiB7CiAg
ICAgbV9wcml2YXRlID0gdmFsdWUubV9wcml2YXRlOwpkaWZmIC0tZ2l0IGEvV2ViS2l0L2Nocm9t
aXVtL3NyYy9XZWJJREJLZXlQYXRoLmNwcCBiL1dlYktpdC9jaHJvbWl1bS9zcmMvV2ViSURCS2V5
UGF0aC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFmNzFmNAotLS0g
L2Rldi9udWxsCisrKyBiL1dlYktpdC9jaHJvbWl1bS9zcmMvV2ViSURCS2V5UGF0aC5jcHAKQEAg
LTAsMCArMSw3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5Z
CisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9T
UyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9G
CisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJXZWJJ
REJLZXlQYXRoLmgiCisKKyNpZiBFTkFCTEUoSU5ERVhFRF9EQVRBQkFTRSkKKworI2luY2x1ZGUg
IklEQktleVBhdGguaCIKKyNpbmNsdWRlICJXZWJTdHJpbmcuaCIKKyNpbmNsdWRlICJXZWJWZWN0
b3IuaCIKKyNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBXZWJDb3Jl
OworCituYW1lc3BhY2UgV2ViS2l0IHsKKworV2ViSURCS2V5UGF0aCBXZWJJREJLZXlQYXRoOjpj
cmVhdGUoY29uc3QgV2ViU3RyaW5nJiBrZXlQYXRoKQoreworICAgIFdURjo6VmVjdG9yPElEQktl
eVBhdGhFbGVtZW50PiBpZGJFbGVtZW50czsKKyAgICBJREJLZXlQYXRoUGFyc2VFcnJvciBpZGJF
cnJvcjsKKyAgICBJREJQYXJzZUtleVBhdGgoa2V5UGF0aCwgaWRiRWxlbWVudHMsIGlkYkVycm9y
KTsKKyAgICByZXR1cm4gV2ViSURCS2V5UGF0aChpZGJFbGVtZW50cywgc3RhdGljX2Nhc3Q8aW50
PihpZGJFcnJvcikpOworfQorCitXZWJJREJLZXlQYXRoOjpXZWJJREJLZXlQYXRoKGNvbnN0IFdU
Rjo6VmVjdG9yPElEQktleVBhdGhFbGVtZW50PiYgZWxlbWVudHMsIGludCBwYXJzZUVycm9yKQor
ICAgIDogbV9wcml2YXRlKG5ldyBXVEY6OlZlY3RvcjxJREJLZXlQYXRoRWxlbWVudD4oZWxlbWVu
dHMpKSwKKyAgICAgIG1fcGFyc2VFcnJvcihwYXJzZUVycm9yKQoreworfQorCitpbnQgV2ViSURC
S2V5UGF0aDo6cGFyc2VFcnJvcigpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fcGFyc2VFcnJvcjsK
K30KKwordm9pZCBXZWJJREJLZXlQYXRoOjphc3NpZ24oY29uc3QgV2ViSURCS2V5UGF0aCYga2V5
UGF0aCkKK3sKKyAgICBtX3BhcnNlRXJyb3IgPSBrZXlQYXRoLm1fcGFyc2VFcnJvcjsKKyAgICBt
X3ByaXZhdGUucmVzZXQobmV3IFdURjo6VmVjdG9yPElEQktleVBhdGhFbGVtZW50PihrZXlQYXRo
KSk7Cit9CisKK3ZvaWQgV2ViSURCS2V5UGF0aDo6cmVzZXQoKQoreworICAgIG1fcHJpdmF0ZS5y
ZXNldCgwKTsKK30KKworV2ViSURCS2V5UGF0aDo6b3BlcmF0b3IgY29uc3QgV1RGOjpWZWN0b3I8
V2ViQ29yZTo6SURCS2V5UGF0aEVsZW1lbnQsIDA+JigpIGNvbnN0Cit7CisgICAgcmV0dXJuICpt
X3ByaXZhdGUuZ2V0KCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYktpdAorCisjZW5kaWYgLy8g
RU5BQkxFKElOREVYRURfREFUQUJBU0UpCmRpZmYgLS1naXQgYS9XZWJLaXQvY2hyb21pdW0vdGVz
dHMvSURCQmluZGluZ1V0aWxpdGllc1Rlc3QuY3BwIGIvV2ViS2l0L2Nocm9taXVtL3Rlc3RzL0lE
QkJpbmRpbmdVdGlsaXRpZXNUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAw
MDAwLi4xYjdmMTU2Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViS2l0L2Nocm9taXVtL3Rlc3RzL0lE
QkJpbmRpbmdVdGlsaXRpZXNUZXN0LmNwcApAQCAtMCwwICsxLDE2NSBAQAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElU
UyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
IFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJ
VFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwor
ICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkg
VEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNs
dWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJJREJCaW5kaW5nVXRpbGl0aWVzLmgiCisjaW5jbHVk
ZSAiSURCS2V5LmgiCisjaW5jbHVkZSAiSURCS2V5UGF0aC5oIgorI2luY2x1ZGUgIlNlcmlhbGl6
ZWRTY3JpcHRWYWx1ZS5oIgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDx3
dGYvVmVjdG9yLmg+CisKKyNpZiBFTkFCTEUoSU5ERVhFRF9EQVRBQkFTRSkKKwordXNpbmcgbmFt
ZXNwYWNlIFdlYkNvcmU7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIExvY2FsQ29udGV4dCB7Citw
dWJsaWM6CisgICAgTG9jYWxDb250ZXh0KCkKKyAgICAgICAgOiBtX2NvbnRleHQodjg6OkNvbnRl
eHQ6Ok5ldygpKQorICAgIHsKKyAgICAgICAgbV9jb250ZXh0LT5FbnRlcigpOworICAgIH0KKwor
ICAgIHZpcnR1YWwgfkxvY2FsQ29udGV4dCgpCisgICAgeworICAgICAgICBtX2NvbnRleHQtPkV4
aXQoKTsKKyAgICAgICAgbV9jb250ZXh0LkRpc3Bvc2UoKTsKKyAgICB9CisKK3ByaXZhdGU6Cisg
ICAgdjg6OkxvY2tlciBtX2xvY2tlcjsKKyAgICB2ODo6SGFuZGxlU2NvcGUgbV9zY29wZTsKKyAg
ICB2ODo6UGVyc2lzdGVudDx2ODo6Q29udGV4dD4gbV9jb250ZXh0OworfTsKKworUGFzc1JlZlB0
cjxJREJLZXk+IGNoZWNrS2V5RnJvbVZhbHVlQW5kS2V5UGF0aEludGVybmFsKFNlcmlhbGl6ZWRT
Y3JpcHRWYWx1ZSogdmFsdWUsIGNvbnN0IFN0cmluZyYga2V5UGF0aCkKK3sKKyAgICBWZWN0b3I8
SURCS2V5UGF0aEVsZW1lbnQ+IGlkYktleVBhdGg7CisgICAgSURCS2V5UGF0aFBhcnNlRXJyb3Ig
cGFyc2VFcnJvcjsKKyAgICBJREJQYXJzZUtleVBhdGgoa2V5UGF0aCwgaWRiS2V5UGF0aCwgcGFy
c2VFcnJvcik7CisgICAgRVhQRUNUX0VRKElEQktleVBhdGhQYXJzZUVycm9yTm9uZSwgcGFyc2VF
cnJvcik7CisgICAgcmV0dXJuIGNyZWF0ZUlEQktleUZyb21TZXJpYWxpemVkVmFsdWVBbmRLZXlQ
YXRoKHZhbHVlLCBpZGJLZXlQYXRoKTsKK30KKwordm9pZCBjaGVja0tleVBhdGhOdWxsVmFsdWUo
U2VyaWFsaXplZFNjcmlwdFZhbHVlKiB2YWx1ZSwgY29uc3QgU3RyaW5nJiBrZXlQYXRoKQorewor
ICAgIFJlZlB0cjxJREJLZXk+IGlkYktleSA9IGNoZWNrS2V5RnJvbVZhbHVlQW5kS2V5UGF0aElu
dGVybmFsKHZhbHVlLCBrZXlQYXRoKTsKKyAgICBBU1NFUlRfRkFMU0UoaWRiS2V5LmdldCgpKTsK
K30KKwordm9pZCBjaGVja0tleVBhdGhTdHJpbmdWYWx1ZShTZXJpYWxpemVkU2NyaXB0VmFsdWUq
IHZhbHVlLCBjb25zdCBTdHJpbmcmIGtleVBhdGgsIGNvbnN0IFN0cmluZyYgZXhwZWN0ZWQpCit7
CisgICAgUmVmUHRyPElEQktleT4gaWRiS2V5ID0gY2hlY2tLZXlGcm9tVmFsdWVBbmRLZXlQYXRo
SW50ZXJuYWwodmFsdWUsIGtleVBhdGgpOworICAgIEFTU0VSVF9UUlVFKGlkYktleS5nZXQoKSk7
CisgICAgQVNTRVJUX0VRKElEQktleTo6U3RyaW5nVHlwZSwgaWRiS2V5LT50eXBlKCkpOworICAg
IEFTU0VSVF9UUlVFKGV4cGVjdGVkID09IGlkYktleS0+c3RyaW5nKCkpOworfQorCit2b2lkIGNo
ZWNrS2V5UGF0aE51bWJlclZhbHVlKFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZSogdmFsdWUsIGNvbnN0
IFN0cmluZyYga2V5UGF0aCwgaW50IGV4cGVjdGVkKQoreworICAgIFJlZlB0cjxJREJLZXk+IGlk
YktleSA9IGNoZWNrS2V5RnJvbVZhbHVlQW5kS2V5UGF0aEludGVybmFsKHZhbHVlLCBrZXlQYXRo
KTsKKyAgICBBU1NFUlRfVFJVRShpZGJLZXkuZ2V0KCkpOworICAgIEFTU0VSVF9FUShJREJLZXk6
Ok51bWJlclR5cGUsIGlkYktleS0+dHlwZSgpKTsKKyAgICBBU1NFUlRfVFJVRShleHBlY3RlZCA9
PSBpZGJLZXktPm51bWJlcigpKTsKK30KKworVEVTVChJREJLZXlGcm9tVmFsdWVBbmRLZXlQYXRo
VGVzdCwgVG9wTGV2ZWxQcm9wZXJ0eVN0cmluZ1ZhbHVlKQoreworICAgIExvY2FsQ29udGV4dCB2
OGNvbnRleHQ7CisgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IG9iamVjdCA9IHY4OjpPYmplY3Q6
Ok5ldygpOworICAgIG9iamVjdC0+U2V0KHY4OjpTdHJpbmc6Ok5ldygiZm9vIiksIHY4OjpTdHJp
bmc6Ok5ldygiem9vIikpOworCisgICAgUmVmUHRyPFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZT4gc2Vy
aWFsaXplZFNjcmlwdFZhbHVlID0gU2VyaWFsaXplZFNjcmlwdFZhbHVlOjpjcmVhdGUob2JqZWN0
KTsKKworICAgIGNoZWNrS2V5UGF0aFN0cmluZ1ZhbHVlKHNlcmlhbGl6ZWRTY3JpcHRWYWx1ZS5n
ZXQoKSwgImZvbyIsICJ6b28iKTsKKyAgICBjaGVja0tleVBhdGhOdWxsVmFsdWUoc2VyaWFsaXpl
ZFNjcmlwdFZhbHVlLmdldCgpLCAiYmFyIik7CisgICAgY2hlY2tLZXlQYXRoTnVsbFZhbHVlKHNl
cmlhbGl6ZWRTY3JpcHRWYWx1ZS5nZXQoKSwgIlszXSIpOworfQorCitURVNUKElEQktleUZyb21W
YWx1ZUFuZEtleVBhdGhUZXN0LCBUb3BMZXZlbFByb3BlcnR5TnVtYmVyVmFsdWUpCit7CisgICAg
TG9jYWxDb250ZXh0IHY4Y29udGV4dDsKKyAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gb2JqZWN0
ID0gdjg6Ok9iamVjdDo6TmV3KCk7CisgICAgb2JqZWN0LT5TZXQodjg6OlN0cmluZzo6TmV3KCJm
b28iKSwgdjg6Ok51bWJlcjo6TmV3KDQ1NikpOworCisgICAgUmVmUHRyPFNlcmlhbGl6ZWRTY3Jp
cHRWYWx1ZT4gc2VyaWFsaXplZFNjcmlwdFZhbHVlID0gU2VyaWFsaXplZFNjcmlwdFZhbHVlOjpj
cmVhdGUob2JqZWN0KTsKKworICAgIGNoZWNrS2V5UGF0aE51bWJlclZhbHVlKHNlcmlhbGl6ZWRT
Y3JpcHRWYWx1ZS5nZXQoKSwgImZvbyIsIDQ1Nik7CisgICAgY2hlY2tLZXlQYXRoTnVsbFZhbHVl
KHNlcmlhbGl6ZWRTY3JpcHRWYWx1ZS5nZXQoKSwgImJhciIpOworICAgIGNoZWNrS2V5UGF0aE51
bGxWYWx1ZShzZXJpYWxpemVkU2NyaXB0VmFsdWUuZ2V0KCksICJbM10iKTsKK30KKworVEVTVChJ
REJLZXlGcm9tVmFsdWVBbmRLZXlQYXRoVGVzdCwgVG9wTGV2ZWxBcnJheUVsZW1lbnQpCit7Cisg
ICAgTG9jYWxDb250ZXh0IHY4Y29udGV4dDsKKyAgICB2ODo6TG9jYWw8djg6OkFycmF5PiBhcnJh
eSA9IHY4OjpBcnJheTo6TmV3KCk7CisgICAgYXJyYXktPlNldCgzLCB2ODo6U3RyaW5nOjpOZXco
InpvbyIpKTsKKworICAgIFJlZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+IHNlcmlhbGl6ZWRT
Y3JpcHRWYWx1ZSA9IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6Y3JlYXRlKGFycmF5KTsKKworICAg
IGNoZWNrS2V5UGF0aFN0cmluZ1ZhbHVlKHNlcmlhbGl6ZWRTY3JpcHRWYWx1ZS5nZXQoKSwgIlsz
XSIsICJ6b28iKTsKKyAgICBjaGVja0tleVBhdGhOdWxsVmFsdWUoc2VyaWFsaXplZFNjcmlwdFZh
bHVlLmdldCgpLCAiZm9vIik7CisgICAgY2hlY2tLZXlQYXRoTnVsbFZhbHVlKHNlcmlhbGl6ZWRT
Y3JpcHRWYWx1ZS5nZXQoKSwgImJhciIpOworfQorCitURVNUKElEQktleUZyb21WYWx1ZUFuZEtl
eVBhdGhUZXN0LCBTdWJQcm9wZXJ0eSkKK3sKKyAgICBMb2NhbENvbnRleHQgdjhjb250ZXh0Owor
ICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBvYmplY3QgPSB2ODo6T2JqZWN0OjpOZXcoKTsKKyAg
ICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gc3ViUHJvcGVydHkgPSB2ODo6T2JqZWN0OjpOZXcoKTsK
KyAgICBzdWJQcm9wZXJ0eS0+U2V0KHY4OjpTdHJpbmc6Ok5ldygiYmFyIiksIHY4OjpTdHJpbmc6
Ok5ldygiemVlIikpOworICAgIG9iamVjdC0+U2V0KHY4OjpTdHJpbmc6Ok5ldygiZm9vIiksIHN1
YlByb3BlcnR5KTsKKworICAgIFJlZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+IHNlcmlhbGl6
ZWRTY3JpcHRWYWx1ZSA9IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6Y3JlYXRlKG9iamVjdCk7CisK
KyAgICBjaGVja0tleVBhdGhTdHJpbmdWYWx1ZShzZXJpYWxpemVkU2NyaXB0VmFsdWUuZ2V0KCks
ICJmb28uYmFyIiwgInplZSIpOworICAgIGNoZWNrS2V5UGF0aE51bGxWYWx1ZShzZXJpYWxpemVk
U2NyaXB0VmFsdWUuZ2V0KCksICJiYXIiKTsKKyAgICBjaGVja0tleVBhdGhOdWxsVmFsdWUoc2Vy
aWFsaXplZFNjcmlwdFZhbHVlLmdldCgpLCAiWzNdIik7Cit9CisKK1RFU1QoSURCS2V5RnJvbVZh
bHVlQW5kS2V5UGF0aFRlc3QsIEFycmF5MkQpCit7CisgICAgTG9jYWxDb250ZXh0IHY4Y29udGV4
dDsKKyAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gb2JqZWN0ID0gdjg6Ok9iamVjdDo6TmV3KCk7
CisgICAgdjg6OkxvY2FsPHY4OjpBcnJheT4gYXJyYXkgPSB2ODo6QXJyYXk6Ok5ldygpOworICAg
IHY4OjpMb2NhbDx2ODo6QXJyYXk+IHN1YkFycmF5ID0gdjg6OkFycmF5OjpOZXcoKTsKKyAgICBz
dWJBcnJheS0+U2V0KDcsIHY4OjpTdHJpbmc6Ok5ldygiemVlIikpOworICAgIGFycmF5LT5TZXQo
Mywgc3ViQXJyYXkpOworICAgIG9iamVjdC0+U2V0KHY4OjpTdHJpbmc6Ok5ldygiZm9vIiksIGFy
cmF5KTsKKworICAgIFJlZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+IHNlcmlhbGl6ZWRTY3Jp
cHRWYWx1ZSA9IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6Y3JlYXRlKG9iamVjdCk7CisKKyAgICBj
aGVja0tleVBhdGhTdHJpbmdWYWx1ZShzZXJpYWxpemVkU2NyaXB0VmFsdWUuZ2V0KCksICJmb29b
M11bN10iLCAiemVlIik7CisgICAgY2hlY2tLZXlQYXRoTnVsbFZhbHVlKHNlcmlhbGl6ZWRTY3Jp
cHRWYWx1ZS5nZXQoKSwgImJhciIpOworICAgIGNoZWNrS2V5UGF0aE51bGxWYWx1ZShzZXJpYWxp
emVkU2NyaXB0VmFsdWUuZ2V0KCksICJbNF0iKTsKK30KKworfSAvLyBuYW1lc3BhY2UKKworI2Vu
ZGlmIC8vIEVOQUJMRShJTkRFWEVEX0RBVEFCQVNFKQo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>64128</attachid>
            <date>2010-08-11 09:39:52 -0700</date>
            <delta_ts>2010-08-12 04:51:47 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>patch</filename>
            <type>text/plain</type>
            <size>19982</size>
            <attacher name="Marcus Bulach">bulach</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvYmluZGluZ3MvdjgvSURCQmluZGluZ1V0aWxpdGllcy5jcHAg
Yi9XZWJDb3JlL2JpbmRpbmdzL3Y4L0lEQkJpbmRpbmdVdGlsaXRpZXMuY3BwCmluZGV4IDRiMzhh
NjEuLjg2MmU1NDIgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvYmluZGluZ3MvdjgvSURCQmluZGluZ1V0
aWxpdGllcy5jcHAKKysrIGIvV2ViQ29yZS9iaW5kaW5ncy92OC9JREJCaW5kaW5nVXRpbGl0aWVz
LmNwcApAQCAtMjksNiArMjksOCBAQAogI2lmIEVOQUJMRShJTkRFWEVEX0RBVEFCQVNFKQogCiAj
aW5jbHVkZSAiSURCS2V5LmgiCisjaW5jbHVkZSAiSURCS2V5UGF0aC5oIgorI2luY2x1ZGUgIlNl
cmlhbGl6ZWRTY3JpcHRWYWx1ZS5oIgogI2luY2x1ZGUgIlY4QmluZGluZy5oIgogCiBuYW1lc3Bh
Y2UgV2ViQ29yZSB7CkBAIC00NSw2ICs0NywzNyBAQCBQYXNzUmVmUHRyPElEQktleT4gY3JlYXRl
SURCS2V5RnJvbVZhbHVlKHY4OjpIYW5kbGU8djg6OlZhbHVlPiB2YWx1ZSkKICAgICByZXR1cm4g
MDsKIH0KIAordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2Jvb2wgZ2V0VmFsdWVGcm9tKFQgaW5kZXhP
ck5hbWUsIHY4OjpIYW5kbGU8djg6OlZhbHVlPiYgdjhWYWx1ZSkKK3sKKyAgICB2ODo6TG9jYWw8
djg6Ok9iamVjdD4gb2JqZWN0ID0gdjhWYWx1ZS0+VG9PYmplY3QoKTsKKyAgICBpZiAoIW9iamVj
dC0+SGFzKGluZGV4T3JOYW1lKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHY4VmFsdWUg
PSBvYmplY3QtPkdldChpbmRleE9yTmFtZSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK1Bhc3NS
ZWZQdHI8SURCS2V5PiBjcmVhdGVJREJLZXlGcm9tU2VyaWFsaXplZFZhbHVlQW5kS2V5UGF0aChQ
YXNzUmVmUHRyPFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZT4gdmFsdWUsIGNvbnN0IFZlY3RvcjxJREJL
ZXlQYXRoRWxlbWVudD4mIGtleVBhdGgpCit7CisgICAgdjg6OkhhbmRsZVNjb3BlIHNjb3BlOwor
ICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiB2OFZhbHVlKHZhbHVlLT5kZXNlcmlhbGl6ZSgpKTsK
KyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtleVBhdGguc2l6ZSgpOyArK2kpIHsKKyAgICAg
ICAgc3dpdGNoIChrZXlQYXRoW2ldLnR5cGUpIHsKKyAgICAgICAgY2FzZSBJREJLZXlQYXRoRWxl
bWVudDo6SXNJbmRleGVkOgorICAgICAgICAgICAgaWYgKCF2OFZhbHVlLT5Jc0FycmF5KCkgfHwg
IWdldFZhbHVlRnJvbShrZXlQYXRoW2ldLmluZGV4LCB2OFZhbHVlKSkKKyAgICAgICAgICAgICAg
ICByZXR1cm4gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIElEQktleVBhdGhF
bGVtZW50OjpJc05hbWVkOgorICAgICAgICAgICAgaWYgKCF2OFZhbHVlLT5Jc09iamVjdCgpIHx8
ICFnZXRWYWx1ZUZyb20odjhTdHJpbmcoa2V5UGF0aFtpXS5pZGVudGlmaWVyKSwgdjhWYWx1ZSkp
CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
ZGVmYXVsdDoKKyAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICB9Cisg
ICAgfQorICAgIHJldHVybiBjcmVhdGVJREJLZXlGcm9tVmFsdWUodjhWYWx1ZSk7Cit9CisKIH0g
Ly8gbmFtZXNwYWNlIFdlYkNvcmUKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9XZWJDb3JlL2JpbmRp
bmdzL3Y4L0lEQkJpbmRpbmdVdGlsaXRpZXMuaCBiL1dlYkNvcmUvYmluZGluZ3MvdjgvSURCQmlu
ZGluZ1V0aWxpdGllcy5oCmluZGV4IDc2ZjJiYmEuLmVlYzdjNDEgMTAwNjQ0Ci0tLSBhL1dlYkNv
cmUvYmluZGluZ3MvdjgvSURCQmluZGluZ1V0aWxpdGllcy5oCisrKyBiL1dlYkNvcmUvYmluZGlu
Z3MvdjgvSURCQmluZGluZ1V0aWxpdGllcy5oCkBAIC0zMCwxMiArMzAsMTYgQEAKIAogI2luY2x1
ZGUgPHY4Lmg+CiAjaW5jbHVkZSA8d3RmL0ZvcndhcmQuaD4KKyNpbmNsdWRlIDx3dGYvVmVjdG9y
Lmg+CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogY2xhc3MgSURCS2V5OworY2xhc3MgU2VyaWFs
aXplZFNjcmlwdFZhbHVlOworc3RydWN0IElEQktleVBhdGhFbGVtZW50OwogCiBQYXNzUmVmUHRy
PElEQktleT4gY3JlYXRlSURCS2V5RnJvbVZhbHVlKHY4OjpIYW5kbGU8djg6OlZhbHVlPik7CitQ
YXNzUmVmUHRyPElEQktleT4gY3JlYXRlSURCS2V5RnJvbVNlcmlhbGl6ZWRWYWx1ZUFuZEtleVBh
dGgoUGFzc1JlZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+IHZhbHVlLCAgY29uc3QgVmVjdG9y
PElEQktleVBhdGhFbGVtZW50PiYga2V5UGF0aCk7CiAKIH0KIApkaWZmIC0tZ2l0IGEvV2ViS2l0
L2Nocm9taXVtL1dlYktpdC5neXAgYi9XZWJLaXQvY2hyb21pdW0vV2ViS2l0Lmd5cAppbmRleCAx
ZTMxNDJjLi5mZjFmNmNmIDEwMDY0NAotLS0gYS9XZWJLaXQvY2hyb21pdW0vV2ViS2l0Lmd5cAor
KysgYi9XZWJLaXQvY2hyb21pdW0vV2ViS2l0Lmd5cApAQCAtMTg2LDYgKzE4Niw3IEBACiAgICAg
ICAgICAgICAgICAgJ3B1YmxpYy9XZWJJREJLZXlSYW5nZS5oJywKICAgICAgICAgICAgICAgICAn
cHVibGljL1dlYklEQkluZGV4LmgnLAogICAgICAgICAgICAgICAgICdwdWJsaWMvV2ViSURCS2V5
LmgnLAorICAgICAgICAgICAgICAgICdwdWJsaWMvV2ViSURCS2V5UGF0aC5oJywKICAgICAgICAg
ICAgICAgICAncHVibGljL1dlYklEQk9iamVjdFN0b3JlLmgnLAogICAgICAgICAgICAgICAgICdw
dWJsaWMvV2ViSW5wdXRFbGVtZW50LmgnLAogICAgICAgICAgICAgICAgICdwdWJsaWMvV2ViSW5w
dXRFdmVudC5oJywKQEAgLTIyNSw2ICsyMjYsNyBAQAogICAgICAgICAgICAgICAgICdwdWJsaWMv
V2ViUG9wdXBNZW51SW5mby5oJywKICAgICAgICAgICAgICAgICAncHVibGljL1dlYlBvcHVwVHlw
ZS5oJywKICAgICAgICAgICAgICAgICAncHVibGljL1dlYlByaXZhdGVQdHIuaCcsCisgICAgICAg
ICAgICAgICAgJ3B1YmxpYy9XZWJQcml2YXRlT3duUHRyLmgnLAogICAgICAgICAgICAgICAgICdw
dWJsaWMvV2ViUmFuZ2UuaCcsCiAgICAgICAgICAgICAgICAgJ3B1YmxpYy9XZWJSZWN0LmgnLAog
ICAgICAgICAgICAgICAgICdwdWJsaWMvV2ViUmVndWxhckV4cHJlc3Npb24uaCcsCkBAIC00MzAs
NiArNDMyLDcgQEAKICAgICAgICAgICAgICAgICAnc3JjL1dlYklEQkluZGV4SW1wbC5jcHAnLAog
ICAgICAgICAgICAgICAgICdzcmMvV2ViSURCSW5kZXhJbXBsLmgnLAogICAgICAgICAgICAgICAg
ICdzcmMvV2ViSURCS2V5LmNwcCcsCisgICAgICAgICAgICAgICAgJ3NyYy9XZWJJREJLZXlQYXRo
LmNwcCcsCiAgICAgICAgICAgICAgICAgJ3NyYy9XZWJJREJLZXlSYW5nZS5jcHAnLAogICAgICAg
ICAgICAgICAgICdzcmMvV2ViSURCT2JqZWN0U3RvcmVJbXBsLmNwcCcsCiAgICAgICAgICAgICAg
ICAgJ3NyYy9XZWJJREJPYmplY3RTdG9yZUltcGwuaCcsCkBAIC03MDMsNiArNzA2LDcgQEAKICAg
ICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgJ3NvdXJjZXMnOiBbCiAg
ICAgICAgICAgICAgICAgICAgICAgICAndGVzdHMvRHJhZ0ltYWdlVGVzdC5jcHAnLAorICAgICAg
ICAgICAgICAgICAgICAgICAgJ3Rlc3RzL0lEQkJpbmRpbmdVdGlsaXRpZXNUZXN0LmNwcCcsCiAg
ICAgICAgICAgICAgICAgICAgICAgICAndGVzdHMvSURCS2V5UGF0aFRlc3QuY3BwJywKICAgICAg
ICAgICAgICAgICAgICAgICAgICd0ZXN0cy9LZXlib2FyZFRlc3QuY3BwJywKICAgICAgICAgICAg
ICAgICAgICAgICAgICd0ZXN0cy9LVVJMVGVzdC5jcHAnLApkaWZmIC0tZ2l0IGEvV2ViS2l0L2No
cm9taXVtL3B1YmxpYy9XZWJJREJLZXkuaCBiL1dlYktpdC9jaHJvbWl1bS9wdWJsaWMvV2ViSURC
S2V5LmgKaW5kZXggMWNmMzM2ZC4uMzJjYWExMCAxMDA2NDQKLS0tIGEvV2ViS2l0L2Nocm9taXVt
L3B1YmxpYy9XZWJJREJLZXkuaAorKysgYi9XZWJLaXQvY2hyb21pdW0vcHVibGljL1dlYklEQktl
eS5oCkBAIC0zNCwxMiArMzQsMTYgQEAgbmFtZXNwYWNlIFdlYkNvcmUgeyBjbGFzcyBJREJLZXk7
IH0KIAogbmFtZXNwYWNlIFdlYktpdCB7CiAKK2NsYXNzIFdlYklEQktleVBhdGg7CitjbGFzcyBX
ZWJTZXJpYWxpemVkU2NyaXB0VmFsdWU7CisKIGNsYXNzIFdlYklEQktleSB7CiBwdWJsaWM6CiAg
ICAgfldlYklEQktleSgpIHsgcmVzZXQoKTsgfQogICAKICAgICBXRUJLSVRfQVBJIHN0YXRpYyBX
ZWJJREJLZXkgY3JlYXRlTnVsbCgpOwogICAgIFdFQktJVF9BUEkgc3RhdGljIFdlYklEQktleSBj
cmVhdGVJbnZhbGlkKCk7CisgICAgV0VCS0lUX0FQSSBzdGF0aWMgV2ViSURCS2V5IGNyZWF0ZUZy
b21WYWx1ZUFuZEtleVBhdGgoY29uc3QgV2ViU2VyaWFsaXplZFNjcmlwdFZhbHVlJiwgY29uc3Qg
V2ViSURCS2V5UGF0aCYpOwogCiAgICAgV2ViSURCS2V5KGNvbnN0IFdlYlN0cmluZyYgc3RyaW5n
KSB7IGFzc2lnbihzdHJpbmcpOyB9CiAgICAgV2ViSURCS2V5KGludDMyX3QgbnVtYmVyKSB7IGFz
c2lnbihudW1iZXIpOyB9CmRpZmYgLS1naXQgYS9XZWJLaXQvY2hyb21pdW0vcHVibGljL1dlYklE
QktleVBhdGguaCBiL1dlYktpdC9jaHJvbWl1bS9wdWJsaWMvV2ViSURCS2V5UGF0aC5oCm5ldyBm
aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwOGVjNjMKLS0tIC9kZXYvbnVsbAorKysg
Yi9XZWJLaXQvY2hyb21pdW0vcHVibGljL1dlYklEQktleVBhdGguaApAQCAtMCwwICsxLDY4IEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICog
MS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF
IElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFU
QSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
CisgKi8KKworI2lmbmRlZiBXZWJJREJLZXlQYXRoX2gKKyNkZWZpbmUgV2ViSURCS2V5UGF0aF9o
CisKKyNpbmNsdWRlICJXZWJDb21tb24uaCIKKyNpbmNsdWRlICJXZWJQcml2YXRlT3duUHRyLmgi
CisjaW5jbHVkZSAiV2ViVmVjdG9yLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsgc3RydWN0IElE
QktleVBhdGhFbGVtZW50OyB9CisKK25hbWVzcGFjZSBXVEYgeyB0ZW1wbGF0ZTx0eXBlbmFtZSBU
LCBzaXplX3QgaW5saW5lQ2FwYWNpdHk+IGNsYXNzIFZlY3RvcjsgfQorCituYW1lc3BhY2UgV2Vi
S2l0IHsKKworY2xhc3MgV2ViU3RyaW5nOworCitjbGFzcyBXZWJJREJLZXlQYXRoIHsKK3B1Ymxp
YzoKKyAgICBzdGF0aWMgV2ViSURCS2V5UGF0aCBjcmVhdGUoY29uc3QgV2ViU3RyaW5nJik7Cisg
ICAgV2ViSURCS2V5UGF0aChjb25zdCBXZWJJREJLZXlQYXRoJiBrZXlQYXRoKSB7IGFzc2lnbihr
ZXlQYXRoKTsgfQorICAgIH5XZWJJREJLZXlQYXRoKCkgeyByZXNldCgpOyB9CisKKyAgICBXRUJL
SVRfQVBJIGludCBwYXJzZUVycm9yKCkgY29uc3Q7CisgICAgV0VCS0lUX0FQSSB2b2lkIGFzc2ln
bihjb25zdCBXZWJJREJLZXlQYXRoJik7CisgICAgV0VCS0lUX0FQSSB2b2lkIHJlc2V0KCk7CisK
KyNpZiBXRUJLSVRfSU1QTEVNRU5UQVRJT04KKyAgICBvcGVyYXRvciBjb25zdCBXVEY6OlZlY3Rv
cjxXZWJDb3JlOjpJREJLZXlQYXRoRWxlbWVudCwgMD4mICgpIGNvbnN0OworI2VuZGlmCisKK3By
aXZhdGU6CisgICAgV2ViSURCS2V5UGF0aCgpOworCisjaWYgV0VCS0lUX0lNUExFTUVOVEFUSU9O
CisgICAgV2ViSURCS2V5UGF0aChjb25zdCBXVEY6OlZlY3RvcjxXZWJDb3JlOjpJREJLZXlQYXRo
RWxlbWVudCwgMD4mLCBpbnQgcGFyc2VFcnJvcik7CisjZW5kaWYKKworICAgIFdlYlByaXZhdGVP
d25QdHI8V1RGOjpWZWN0b3I8V2ViQ29yZTo6SURCS2V5UGF0aEVsZW1lbnQsIDA+ID4gbV9wcml2
YXRlOworICAgIGludCBtX3BhcnNlRXJyb3I7Cit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJLaXQK
KworI2VuZGlmIC8vIFdlYklEQktleVBhdGhfaApkaWZmIC0tZ2l0IGEvV2ViS2l0L2Nocm9taXVt
L3B1YmxpYy9XZWJQcml2YXRlT3duUHRyLmggYi9XZWJLaXQvY2hyb21pdW0vcHVibGljL1dlYlBy
aXZhdGVPd25QdHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmNhYmNm
Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViS2l0L2Nocm9taXVtL3B1YmxpYy9XZWJQcml2YXRlT3du
UHRyLmgKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElT
IiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVND
TEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJ
QUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBF
WEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQ
VElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgV2ViUHJpdmF0ZU93blB0cl9o
CisjZGVmaW5lIFdlYlByaXZhdGVPd25QdHJfaAorCisjaW5jbHVkZSAiV2ViQ29tbW9uLmgiCisK
K25hbWVzcGFjZSBXZWJLaXQgeworCisvLyBUaGlzIGNsYXNzIGlzIGFuIGltcGxlbWVudGF0aW9u
IGRldGFpbCBvZiB0aGUgV2ViS2l0IEFQSS4gIEl0IGV4aXN0cworLy8gdG8gaGVscCBzaW1wbGlm
eSB0aGUgaW1wbGVtZW50YXRpb24gb2YgV2ViS2l0IGludGVyZmFjZXMgdGhhdCBtZXJlbHkKKy8v
IHdyYXAgYSBwb2ludGVyIHRvIGEgV2ViQ29yZSBjbGFzcy4gSXQncyBzaW1pbGFyIHRvIFdlYlBy
aXZhdGVQdHIsIGJ1dCBpdAorLy8gd3JhcHMgYSBuYWtlZCBwb2ludGVyIHJhdGhlciB0aGFuIGEg
cmVmZXJlbmNlIGNvdW50ZWQuCisvLyBOb3RlOiB5b3UgbXVzdCBjYWxsIHJlc2V0KDApIG9uIHRo
ZSBpbXBsZW1lbnRhdGlvbiBzaWRlIGluIG9yZGVyIHRvIGRlbGV0ZQorLy8gdGhlIFdlYkNvcmUg
cG9pbnRlci4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgV2ViUHJpdmF0ZU93blB0ciB7
CitwdWJsaWM6CisgICAgV2ViUHJpdmF0ZU93blB0cigpIDogbV9wdHIoMCkge30KKyAgICB+V2Vi
UHJpdmF0ZU93blB0cigpIHsgV0VCS0lUX0FTU0VSVCghbV9wdHIpOyB9CisKKyNpZiBXRUJLSVRf
SU1QTEVNRU5UQVRJT04KKyAgICBleHBsaWNpdCBXZWJQcml2YXRlT3duUHRyKFQqIHB0cikKKyAg
ICAgICAgOiBtX3B0cihwdHIpCisgICAgeworICAgIH0KKworICAgIHZvaWQgcmVzZXQoVCogcHRy
KQorICAgIHsKKyAgICAgICAgZGVsZXRlIG1fcHRyOworICAgICAgICBtX3B0ciA9IHB0cjsKKyAg
ICB9CisKKyAgICBUKiBnZXQoKSBjb25zdCB7IHJldHVybiBtX3B0cjsgfQorCisgICAgVCogb3Bl
cmF0b3ItPigpIGNvbnN0CisgICAgeworICAgICAgICBXRUJLSVRfQVNTRVJUKG1fcHRyKTsKKyAg
ICAgICAgcmV0dXJuIG1fcHRyOworICAgIH0KKyNlbmRpZiAvLyBXRUJLSVRfSU1QTEVNRU5UQVRJ
T04KKworcHJpdmF0ZToKKyAgICBUKiBtX3B0cjsKKworICAgIFdlYlByaXZhdGVPd25QdHIoY29u
c3QgV2ViUHJpdmF0ZU93blB0ciYpOworICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFdlYlByaXZh
dGVPd25QdHImKTsKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYktpdAorCisjZW5kaWYKZGlmZiAt
LWdpdCBhL1dlYktpdC9jaHJvbWl1bS9zcmMvV2ViSURCS2V5LmNwcCBiL1dlYktpdC9jaHJvbWl1
bS9zcmMvV2ViSURCS2V5LmNwcAppbmRleCAxYzRjNjg1Li40MTNhOWU2IDEwMDY0NAotLS0gYS9X
ZWJLaXQvY2hyb21pdW0vc3JjL1dlYklEQktleS5jcHAKKysrIGIvV2ViS2l0L2Nocm9taXVtL3Ny
Yy9XZWJJREJLZXkuY3BwCkBAIC0zMCw3ICszMCwxMiBAQAogCiAjaWYgRU5BQkxFKElOREVYRURf
REFUQUJBU0UpCiAKKyNpbmNsdWRlICJJREJCaW5kaW5nVXRpbGl0aWVzLmgiCiAjaW5jbHVkZSAi
SURCS2V5LmgiCisjaW5jbHVkZSAiSURCS2V5UGF0aC5oIgorI2luY2x1ZGUgIlNlcmlhbGl6ZWRT
Y3JpcHRWYWx1ZS5oIgorI2luY2x1ZGUgIldlYklEQktleVBhdGguaCIKKyNpbmNsdWRlICJXZWJT
ZXJpYWxpemVkU2NyaXB0VmFsdWUuaCIKIAogdXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7CiAKQEAg
LTUwLDYgKzU1LDEzIEBAIFdlYklEQktleSBXZWJJREJLZXk6OmNyZWF0ZUludmFsaWQoKQogICAg
IHJldHVybiBrZXk7CiB9CiAKK1dlYklEQktleSBXZWJJREJLZXk6OmNyZWF0ZUZyb21WYWx1ZUFu
ZEtleVBhdGgoY29uc3QgV2ViU2VyaWFsaXplZFNjcmlwdFZhbHVlJiBzZXJpYWxpemVkU2NyaXB0
VmFsdWUsIGNvbnN0IFdlYklEQktleVBhdGgmIGlkYktleVBhdGgpCit7CisgICAgaWYgKHNlcmlh
bGl6ZWRTY3JpcHRWYWx1ZS5pc051bGwoKSkKKyAgICAgICAgcmV0dXJuIFdlYklEQktleTo6Y3Jl
YXRlSW52YWxpZCgpOworICAgIHJldHVybiBXZWJDb3JlOjpjcmVhdGVJREJLZXlGcm9tU2VyaWFs
aXplZFZhbHVlQW5kS2V5UGF0aChzZXJpYWxpemVkU2NyaXB0VmFsdWUsIGlkYktleVBhdGgpOwor
fQorCiB2b2lkIFdlYklEQktleTo6YXNzaWduKGNvbnN0IFdlYklEQktleSYgdmFsdWUpCiB7CiAg
ICAgbV9wcml2YXRlID0gdmFsdWUubV9wcml2YXRlOwpkaWZmIC0tZ2l0IGEvV2ViS2l0L2Nocm9t
aXVtL3NyYy9XZWJJREJLZXlQYXRoLmNwcCBiL1dlYktpdC9jaHJvbWl1bS9zcmMvV2ViSURCS2V5
UGF0aC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFmNzFmNAotLS0g
L2Rldi9udWxsCisrKyBiL1dlYktpdC9jaHJvbWl1bS9zcmMvV2ViSURCS2V5UGF0aC5jcHAKQEAg
LTAsMCArMSw3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5Z
CisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9T
UyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9G
CisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJXZWJJ
REJLZXlQYXRoLmgiCisKKyNpZiBFTkFCTEUoSU5ERVhFRF9EQVRBQkFTRSkKKworI2luY2x1ZGUg
IklEQktleVBhdGguaCIKKyNpbmNsdWRlICJXZWJTdHJpbmcuaCIKKyNpbmNsdWRlICJXZWJWZWN0
b3IuaCIKKyNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBXZWJDb3Jl
OworCituYW1lc3BhY2UgV2ViS2l0IHsKKworV2ViSURCS2V5UGF0aCBXZWJJREJLZXlQYXRoOjpj
cmVhdGUoY29uc3QgV2ViU3RyaW5nJiBrZXlQYXRoKQoreworICAgIFdURjo6VmVjdG9yPElEQktl
eVBhdGhFbGVtZW50PiBpZGJFbGVtZW50czsKKyAgICBJREJLZXlQYXRoUGFyc2VFcnJvciBpZGJF
cnJvcjsKKyAgICBJREJQYXJzZUtleVBhdGgoa2V5UGF0aCwgaWRiRWxlbWVudHMsIGlkYkVycm9y
KTsKKyAgICByZXR1cm4gV2ViSURCS2V5UGF0aChpZGJFbGVtZW50cywgc3RhdGljX2Nhc3Q8aW50
PihpZGJFcnJvcikpOworfQorCitXZWJJREJLZXlQYXRoOjpXZWJJREJLZXlQYXRoKGNvbnN0IFdU
Rjo6VmVjdG9yPElEQktleVBhdGhFbGVtZW50PiYgZWxlbWVudHMsIGludCBwYXJzZUVycm9yKQor
ICAgIDogbV9wcml2YXRlKG5ldyBXVEY6OlZlY3RvcjxJREJLZXlQYXRoRWxlbWVudD4oZWxlbWVu
dHMpKSwKKyAgICAgIG1fcGFyc2VFcnJvcihwYXJzZUVycm9yKQoreworfQorCitpbnQgV2ViSURC
S2V5UGF0aDo6cGFyc2VFcnJvcigpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fcGFyc2VFcnJvcjsK
K30KKwordm9pZCBXZWJJREJLZXlQYXRoOjphc3NpZ24oY29uc3QgV2ViSURCS2V5UGF0aCYga2V5
UGF0aCkKK3sKKyAgICBtX3BhcnNlRXJyb3IgPSBrZXlQYXRoLm1fcGFyc2VFcnJvcjsKKyAgICBt
X3ByaXZhdGUucmVzZXQobmV3IFdURjo6VmVjdG9yPElEQktleVBhdGhFbGVtZW50PihrZXlQYXRo
KSk7Cit9CisKK3ZvaWQgV2ViSURCS2V5UGF0aDo6cmVzZXQoKQoreworICAgIG1fcHJpdmF0ZS5y
ZXNldCgwKTsKK30KKworV2ViSURCS2V5UGF0aDo6b3BlcmF0b3IgY29uc3QgV1RGOjpWZWN0b3I8
V2ViQ29yZTo6SURCS2V5UGF0aEVsZW1lbnQsIDA+JigpIGNvbnN0Cit7CisgICAgcmV0dXJuICpt
X3ByaXZhdGUuZ2V0KCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYktpdAorCisjZW5kaWYgLy8g
RU5BQkxFKElOREVYRURfREFUQUJBU0UpCmRpZmYgLS1naXQgYS9XZWJLaXQvY2hyb21pdW0vdGVz
dHMvSURCQmluZGluZ1V0aWxpdGllc1Rlc3QuY3BwIGIvV2ViS2l0L2Nocm9taXVtL3Rlc3RzL0lE
QkJpbmRpbmdVdGlsaXRpZXNUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAw
MDAwLi4xYjdmMTU2Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViS2l0L2Nocm9taXVtL3Rlc3RzL0lE
QkJpbmRpbmdVdGlsaXRpZXNUZXN0LmNwcApAQCAtMCwwICsxLDE2NSBAQAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElU
UyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
IFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJ
VFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwor
ICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkg
VEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNs
dWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJJREJCaW5kaW5nVXRpbGl0aWVzLmgiCisjaW5jbHVk
ZSAiSURCS2V5LmgiCisjaW5jbHVkZSAiSURCS2V5UGF0aC5oIgorI2luY2x1ZGUgIlNlcmlhbGl6
ZWRTY3JpcHRWYWx1ZS5oIgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDx3
dGYvVmVjdG9yLmg+CisKKyNpZiBFTkFCTEUoSU5ERVhFRF9EQVRBQkFTRSkKKwordXNpbmcgbmFt
ZXNwYWNlIFdlYkNvcmU7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIExvY2FsQ29udGV4dCB7Citw
dWJsaWM6CisgICAgTG9jYWxDb250ZXh0KCkKKyAgICAgICAgOiBtX2NvbnRleHQodjg6OkNvbnRl
eHQ6Ok5ldygpKQorICAgIHsKKyAgICAgICAgbV9jb250ZXh0LT5FbnRlcigpOworICAgIH0KKwor
ICAgIHZpcnR1YWwgfkxvY2FsQ29udGV4dCgpCisgICAgeworICAgICAgICBtX2NvbnRleHQtPkV4
aXQoKTsKKyAgICAgICAgbV9jb250ZXh0LkRpc3Bvc2UoKTsKKyAgICB9CisKK3ByaXZhdGU6Cisg
ICAgdjg6OkxvY2tlciBtX2xvY2tlcjsKKyAgICB2ODo6SGFuZGxlU2NvcGUgbV9zY29wZTsKKyAg
ICB2ODo6UGVyc2lzdGVudDx2ODo6Q29udGV4dD4gbV9jb250ZXh0OworfTsKKworUGFzc1JlZlB0
cjxJREJLZXk+IGNoZWNrS2V5RnJvbVZhbHVlQW5kS2V5UGF0aEludGVybmFsKFNlcmlhbGl6ZWRT
Y3JpcHRWYWx1ZSogdmFsdWUsIGNvbnN0IFN0cmluZyYga2V5UGF0aCkKK3sKKyAgICBWZWN0b3I8
SURCS2V5UGF0aEVsZW1lbnQ+IGlkYktleVBhdGg7CisgICAgSURCS2V5UGF0aFBhcnNlRXJyb3Ig
cGFyc2VFcnJvcjsKKyAgICBJREJQYXJzZUtleVBhdGgoa2V5UGF0aCwgaWRiS2V5UGF0aCwgcGFy
c2VFcnJvcik7CisgICAgRVhQRUNUX0VRKElEQktleVBhdGhQYXJzZUVycm9yTm9uZSwgcGFyc2VF
cnJvcik7CisgICAgcmV0dXJuIGNyZWF0ZUlEQktleUZyb21TZXJpYWxpemVkVmFsdWVBbmRLZXlQ
YXRoKHZhbHVlLCBpZGJLZXlQYXRoKTsKK30KKwordm9pZCBjaGVja0tleVBhdGhOdWxsVmFsdWUo
U2VyaWFsaXplZFNjcmlwdFZhbHVlKiB2YWx1ZSwgY29uc3QgU3RyaW5nJiBrZXlQYXRoKQorewor
ICAgIFJlZlB0cjxJREJLZXk+IGlkYktleSA9IGNoZWNrS2V5RnJvbVZhbHVlQW5kS2V5UGF0aElu
dGVybmFsKHZhbHVlLCBrZXlQYXRoKTsKKyAgICBBU1NFUlRfRkFMU0UoaWRiS2V5LmdldCgpKTsK
K30KKwordm9pZCBjaGVja0tleVBhdGhTdHJpbmdWYWx1ZShTZXJpYWxpemVkU2NyaXB0VmFsdWUq
IHZhbHVlLCBjb25zdCBTdHJpbmcmIGtleVBhdGgsIGNvbnN0IFN0cmluZyYgZXhwZWN0ZWQpCit7
CisgICAgUmVmUHRyPElEQktleT4gaWRiS2V5ID0gY2hlY2tLZXlGcm9tVmFsdWVBbmRLZXlQYXRo
SW50ZXJuYWwodmFsdWUsIGtleVBhdGgpOworICAgIEFTU0VSVF9UUlVFKGlkYktleS5nZXQoKSk7
CisgICAgQVNTRVJUX0VRKElEQktleTo6U3RyaW5nVHlwZSwgaWRiS2V5LT50eXBlKCkpOworICAg
IEFTU0VSVF9UUlVFKGV4cGVjdGVkID09IGlkYktleS0+c3RyaW5nKCkpOworfQorCit2b2lkIGNo
ZWNrS2V5UGF0aE51bWJlclZhbHVlKFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZSogdmFsdWUsIGNvbnN0
IFN0cmluZyYga2V5UGF0aCwgaW50IGV4cGVjdGVkKQoreworICAgIFJlZlB0cjxJREJLZXk+IGlk
YktleSA9IGNoZWNrS2V5RnJvbVZhbHVlQW5kS2V5UGF0aEludGVybmFsKHZhbHVlLCBrZXlQYXRo
KTsKKyAgICBBU1NFUlRfVFJVRShpZGJLZXkuZ2V0KCkpOworICAgIEFTU0VSVF9FUShJREJLZXk6
Ok51bWJlclR5cGUsIGlkYktleS0+dHlwZSgpKTsKKyAgICBBU1NFUlRfVFJVRShleHBlY3RlZCA9
PSBpZGJLZXktPm51bWJlcigpKTsKK30KKworVEVTVChJREJLZXlGcm9tVmFsdWVBbmRLZXlQYXRo
VGVzdCwgVG9wTGV2ZWxQcm9wZXJ0eVN0cmluZ1ZhbHVlKQoreworICAgIExvY2FsQ29udGV4dCB2
OGNvbnRleHQ7CisgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IG9iamVjdCA9IHY4OjpPYmplY3Q6
Ok5ldygpOworICAgIG9iamVjdC0+U2V0KHY4OjpTdHJpbmc6Ok5ldygiZm9vIiksIHY4OjpTdHJp
bmc6Ok5ldygiem9vIikpOworCisgICAgUmVmUHRyPFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZT4gc2Vy
aWFsaXplZFNjcmlwdFZhbHVlID0gU2VyaWFsaXplZFNjcmlwdFZhbHVlOjpjcmVhdGUob2JqZWN0
KTsKKworICAgIGNoZWNrS2V5UGF0aFN0cmluZ1ZhbHVlKHNlcmlhbGl6ZWRTY3JpcHRWYWx1ZS5n
ZXQoKSwgImZvbyIsICJ6b28iKTsKKyAgICBjaGVja0tleVBhdGhOdWxsVmFsdWUoc2VyaWFsaXpl
ZFNjcmlwdFZhbHVlLmdldCgpLCAiYmFyIik7CisgICAgY2hlY2tLZXlQYXRoTnVsbFZhbHVlKHNl
cmlhbGl6ZWRTY3JpcHRWYWx1ZS5nZXQoKSwgIlszXSIpOworfQorCitURVNUKElEQktleUZyb21W
YWx1ZUFuZEtleVBhdGhUZXN0LCBUb3BMZXZlbFByb3BlcnR5TnVtYmVyVmFsdWUpCit7CisgICAg
TG9jYWxDb250ZXh0IHY4Y29udGV4dDsKKyAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gb2JqZWN0
ID0gdjg6Ok9iamVjdDo6TmV3KCk7CisgICAgb2JqZWN0LT5TZXQodjg6OlN0cmluZzo6TmV3KCJm
b28iKSwgdjg6Ok51bWJlcjo6TmV3KDQ1NikpOworCisgICAgUmVmUHRyPFNlcmlhbGl6ZWRTY3Jp
cHRWYWx1ZT4gc2VyaWFsaXplZFNjcmlwdFZhbHVlID0gU2VyaWFsaXplZFNjcmlwdFZhbHVlOjpj
cmVhdGUob2JqZWN0KTsKKworICAgIGNoZWNrS2V5UGF0aE51bWJlclZhbHVlKHNlcmlhbGl6ZWRT
Y3JpcHRWYWx1ZS5nZXQoKSwgImZvbyIsIDQ1Nik7CisgICAgY2hlY2tLZXlQYXRoTnVsbFZhbHVl
KHNlcmlhbGl6ZWRTY3JpcHRWYWx1ZS5nZXQoKSwgImJhciIpOworICAgIGNoZWNrS2V5UGF0aE51
bGxWYWx1ZShzZXJpYWxpemVkU2NyaXB0VmFsdWUuZ2V0KCksICJbM10iKTsKK30KKworVEVTVChJ
REJLZXlGcm9tVmFsdWVBbmRLZXlQYXRoVGVzdCwgVG9wTGV2ZWxBcnJheUVsZW1lbnQpCit7Cisg
ICAgTG9jYWxDb250ZXh0IHY4Y29udGV4dDsKKyAgICB2ODo6TG9jYWw8djg6OkFycmF5PiBhcnJh
eSA9IHY4OjpBcnJheTo6TmV3KCk7CisgICAgYXJyYXktPlNldCgzLCB2ODo6U3RyaW5nOjpOZXco
InpvbyIpKTsKKworICAgIFJlZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+IHNlcmlhbGl6ZWRT
Y3JpcHRWYWx1ZSA9IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6Y3JlYXRlKGFycmF5KTsKKworICAg
IGNoZWNrS2V5UGF0aFN0cmluZ1ZhbHVlKHNlcmlhbGl6ZWRTY3JpcHRWYWx1ZS5nZXQoKSwgIlsz
XSIsICJ6b28iKTsKKyAgICBjaGVja0tleVBhdGhOdWxsVmFsdWUoc2VyaWFsaXplZFNjcmlwdFZh
bHVlLmdldCgpLCAiZm9vIik7CisgICAgY2hlY2tLZXlQYXRoTnVsbFZhbHVlKHNlcmlhbGl6ZWRT
Y3JpcHRWYWx1ZS5nZXQoKSwgImJhciIpOworfQorCitURVNUKElEQktleUZyb21WYWx1ZUFuZEtl
eVBhdGhUZXN0LCBTdWJQcm9wZXJ0eSkKK3sKKyAgICBMb2NhbENvbnRleHQgdjhjb250ZXh0Owor
ICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBvYmplY3QgPSB2ODo6T2JqZWN0OjpOZXcoKTsKKyAg
ICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gc3ViUHJvcGVydHkgPSB2ODo6T2JqZWN0OjpOZXcoKTsK
KyAgICBzdWJQcm9wZXJ0eS0+U2V0KHY4OjpTdHJpbmc6Ok5ldygiYmFyIiksIHY4OjpTdHJpbmc6
Ok5ldygiemVlIikpOworICAgIG9iamVjdC0+U2V0KHY4OjpTdHJpbmc6Ok5ldygiZm9vIiksIHN1
YlByb3BlcnR5KTsKKworICAgIFJlZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+IHNlcmlhbGl6
ZWRTY3JpcHRWYWx1ZSA9IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6Y3JlYXRlKG9iamVjdCk7CisK
KyAgICBjaGVja0tleVBhdGhTdHJpbmdWYWx1ZShzZXJpYWxpemVkU2NyaXB0VmFsdWUuZ2V0KCks
ICJmb28uYmFyIiwgInplZSIpOworICAgIGNoZWNrS2V5UGF0aE51bGxWYWx1ZShzZXJpYWxpemVk
U2NyaXB0VmFsdWUuZ2V0KCksICJiYXIiKTsKKyAgICBjaGVja0tleVBhdGhOdWxsVmFsdWUoc2Vy
aWFsaXplZFNjcmlwdFZhbHVlLmdldCgpLCAiWzNdIik7Cit9CisKK1RFU1QoSURCS2V5RnJvbVZh
bHVlQW5kS2V5UGF0aFRlc3QsIEFycmF5MkQpCit7CisgICAgTG9jYWxDb250ZXh0IHY4Y29udGV4
dDsKKyAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gb2JqZWN0ID0gdjg6Ok9iamVjdDo6TmV3KCk7
CisgICAgdjg6OkxvY2FsPHY4OjpBcnJheT4gYXJyYXkgPSB2ODo6QXJyYXk6Ok5ldygpOworICAg
IHY4OjpMb2NhbDx2ODo6QXJyYXk+IHN1YkFycmF5ID0gdjg6OkFycmF5OjpOZXcoKTsKKyAgICBz
dWJBcnJheS0+U2V0KDcsIHY4OjpTdHJpbmc6Ok5ldygiemVlIikpOworICAgIGFycmF5LT5TZXQo
Mywgc3ViQXJyYXkpOworICAgIG9iamVjdC0+U2V0KHY4OjpTdHJpbmc6Ok5ldygiZm9vIiksIGFy
cmF5KTsKKworICAgIFJlZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+IHNlcmlhbGl6ZWRTY3Jp
cHRWYWx1ZSA9IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6Y3JlYXRlKG9iamVjdCk7CisKKyAgICBj
aGVja0tleVBhdGhTdHJpbmdWYWx1ZShzZXJpYWxpemVkU2NyaXB0VmFsdWUuZ2V0KCksICJmb29b
M11bN10iLCAiemVlIik7CisgICAgY2hlY2tLZXlQYXRoTnVsbFZhbHVlKHNlcmlhbGl6ZWRTY3Jp
cHRWYWx1ZS5nZXQoKSwgImJhciIpOworICAgIGNoZWNrS2V5UGF0aE51bGxWYWx1ZShzZXJpYWxp
emVkU2NyaXB0VmFsdWUuZ2V0KCksICJbNF0iKTsKK30KKworfSAvLyBuYW1lc3BhY2UKKworI2Vu
ZGlmIC8vIEVOQUJMRShJTkRFWEVEX0RBVEFCQVNFKQo=
</data>
<flag name="review"
          id="52723"
          type_id="1"
          status="+"
          setter="jorlow"
    />
          </attachment>
      

    </bug>

</bugzilla>