<?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>192229</bug_id>
          
          <creation_ts>2018-11-30 09:25:10 -0800</creation_ts>
          <short_desc>[GStreamer][EME][ClearKey] Request keys from CDMInstance rather than passing via bus messages</short_desc>
          <delta_ts>2019-02-05 08:04:01 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WPE WebKit</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Charlie Turner">cturner</reporter>
          <assigned_to name="Charlie Turner">cturner</assigned_to>
          <cc>bugs-noreply</cc>
    
    <cc>calvaris</cc>
    
    <cc>commit-queue</cc>
    
    <cc>jer.noble</cc>
    
    <cc>webkit-bug-importer</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1483557</commentid>
    <comment_count>0</comment_count>
    <who name="Charlie Turner">cturner</who>
    <bug_when>2018-11-30 09:25:10 -0800</bug_when>
    <thetext>[EME] Create and move to a decryption API implemented by CDMInstances</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1484329</commentid>
    <comment_count>1</comment_count>
      <attachid>356374</attachid>
    <who name="Charlie Turner">cturner</who>
    <bug_when>2018-12-03 04:10:07 -0800</bug_when>
    <thetext>Created attachment 356374
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1484330</commentid>
    <comment_count>2</comment_count>
    <who name="Charlie Turner">cturner</who>
    <bug_when>2018-12-03 04:15:51 -0800</bug_when>
    <thetext>I will have to rebase over the GstContext patch, but would appreciate review anyway.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1484382</commentid>
    <comment_count>3</comment_count>
    <who name="Xabier Rodríguez Calvar">calvaris</who>
    <bug_when>2018-12-03 10:01:00 -0800</bug_when>
    <thetext>Even when this shouldn&apos;t impact the Apple ports, let&apos;s add Jer here to see if he has any comments as well.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1484384</commentid>
    <comment_count>4</comment_count>
      <attachid>356384</attachid>
    <who name="Charlie Turner">cturner</who>
    <bug_when>2018-12-03 10:21:29 -0800</bug_when>
    <thetext>Created attachment 356384
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1484386</commentid>
    <comment_count>5</comment_count>
    <who name="Charlie Turner">cturner</who>
    <bug_when>2018-12-03 10:26:26 -0800</bug_when>
    <thetext>(In reply to Xabier Rodríguez Calvar from comment #3)
&gt; Even when this shouldn&apos;t impact the Apple ports, let&apos;s add Jer here to see
&gt; if he has any comments as well.

Yes, I forgot that. Jer, for your attention, the new classes/structs in CDMInstance.h/CDMInstanceSession.h could use your review. TIA.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1484408</commentid>
    <comment_count>6</comment_count>
    <who name="Jer Noble">jer.noble</who>
    <bug_when>2018-12-03 11:02:59 -0800</bug_when>
    <thetext>I don&apos;t really understand why the new types and interfaces need to be added to CDMInstance if they&apos;re being used exclusively by CDMInstanceClearKey to talk to CDMInstanceSessionClearKey?  These new types should be added to CDMInstanceClearKey and use the existing type-checking system from GTK to cast directly from CDMInstance (or better yet, from CDMInstanceSession) to CDMInstanceClearKey.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1484419</commentid>
    <comment_count>7</comment_count>
      <attachid>356384</attachid>
    <who name="Jer Noble">jer.noble</who>
    <bug_when>2018-12-03 11:16:22 -0800</bug_when>
    <thetext>Comment on attachment 356384
Patch

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

Generally, I&apos;m not in favor of taking GStreamer-Specific code and moving it up into platform-independent code. So I don&apos;t really understand why this patch is necessary in the first place. Other questions:

&gt; Source/WebCore/platform/encryptedmedia/CDMInstance.h:68
&gt; +    enum class EncryptionMode {
&gt; +        Unencrypted,
&gt; +        Cenc,
&gt; +        Cbcs,
&gt; +    };

This is just a std::optional&lt;CDMEncryptionScheme&gt;.

&gt; Source/WebCore/platform/encryptedmedia/CDMInstance.h:77
&gt; +    struct SubSample {
&gt; +        SubSample()
&gt; +            : clearBytes(0), cipherBytes(0) { }
&gt; +        SubSample(uint32_t clearBytes, uint32_t cipherBytes)
&gt; +            : clearBytes(clearBytes), cipherBytes(cipherBytes) { }
&gt; +        uint32_t clearBytes;
&gt; +        uint32_t cipherBytes;
&gt; +    };

Isn&apos;t this just a uint64_t? Or a std::pair&lt;uint32_t&gt;?  If it stays a struct, then you don&apos;t need a default or specialized constructor; it&apos;d be written:

struct SubSample {
  uint32_t clearBytes { 0 };
  uint32_t cipherBytes { 0 };
};

&gt; Source/WebCore/platform/encryptedmedia/clearkey/CDMClearKey.cpp:39
&gt; +#include &lt;gcrypt.h&gt;

GStreamer specific code doesn&apos;t belong in this class.  A GStreamer-Specific CDM for ClearKey encryption should be used instead, or at the very least this class and file should be renamed.

&gt; Source/WebCore/platform/encryptedmedia/clearkey/CDMClearKey.cpp:486
&gt; +    ASSERT(!isMainThread());
&gt; +    LOG(EME, &quot;EME ClearKey - decrypting, looking up session for key ID [%s]&quot;, keyIDToHexString(config-&gt;keyID()).utf8().data());
&gt;  
&gt; -    for (auto&amp; key : ClearKeyState::singleton().keys().values())
&gt; -        allKeys.appendVector(key);
&gt; +    auto* session = sessionForKeyID(config-&gt;keyID());
&gt; +    if (!session) {
&gt; +        auto locker = holdLock(m_waitingForKeyLock);
&gt; +        m_waitingForKeyCondition.waitFor(m_waitingForKeyLock, config-&gt;waitForKeyTimeout(), [this, &amp;config, &amp;session] {
&gt; +            return session = sessionForKeyID(config-&gt;keyID());
&gt; +        });
&gt; +        if (!session) {
&gt; +            LOG(EME, &quot;Failed to find matching session&quot;);
&gt; +            return false;
&gt; +        }
&gt; +    }

This code seems weird. sessionForKeyID() isn&apos;t thread safe. What happens when the list of sessions is being mutated while sessionForKeyID() is called on a background thread? Why is it mandatory that this function is called off the main thread? Why isn&apos;t the client talking to the session directly? Why can&apos;t the decode fail if a key isn&apos;t available and retry when the client is notified that there&apos;s a new key available?

&gt; Source/WebCore/platform/encryptedmedia/clearkey/CDMClearKey.cpp:609
&gt; +
&gt; +        LOG(EME, &quot;EME ClearKey session - new keys are available, notifying any waiter&quot;);
&gt; +        m_instance-&gt;signalNewKeysAvailable();

In addition to above, why can&apos;t this use the existing attemptToResumePlaybackOnClients() callback?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1484425</commentid>
    <comment_count>8</comment_count>
    <who name="Charlie Turner">cturner</who>
    <bug_when>2018-12-03 11:29:56 -0800</bug_when>
    <thetext>(In reply to Jer Noble from comment #6)
&gt; I don&apos;t really understand why the new types and interfaces need to be added
&gt; to CDMInstance if they&apos;re being used exclusively by CDMInstanceClearKey to
&gt; talk to CDMInstanceSessionClearKey?

It seems like only CDMInstanceClearKey is using them, but we have more CDM implementations that we cannot upstream due to licensing (Widevine/PlayReady).

&gt; These new types should be added to
&gt; CDMInstanceClearKey and use the existing type-checking system from GTK to
&gt; cast directly from CDMInstance (or better yet, from CDMInstanceSession) to
&gt; CDMInstanceClearKey.

Given the above, that would result in a lot of duplication in our downstream situation.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1484426</commentid>
    <comment_count>9</comment_count>
    <who name="Charlie Turner">cturner</who>
    <bug_when>2018-12-03 11:40:09 -0800</bug_when>
    <thetext>(In reply to Jer Noble from comment #7)
&gt; Comment on attachment 356384 [details]
&gt; Patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=356384&amp;action=review
&gt; 
&gt; Generally, I&apos;m not in favor of taking GStreamer-Specific code and moving it
&gt; up into platform-independent code. So I don&apos;t really understand why this
&gt; patch is necessary in the first place.

I want to move away from the ClearKey code being GStreamer specific, so I am trying to factor it into a cross-platform state. The classes/structs moved into CDMInstance are useful from other derived classes we have downstream for licensing reasons.

&gt; 
&gt; &gt; Source/WebCore/platform/encryptedmedia/CDMInstance.h:68
&gt; &gt; +    enum class EncryptionMode {
&gt; &gt; +        Unencrypted,
&gt; &gt; +        Cenc,
&gt; &gt; +        Cbcs,
&gt; &gt; +    };
&gt; 
&gt; This is just a std::optional&lt;CDMEncryptionScheme&gt;.

Thanks, missed that.

&gt; 
&gt; &gt; Source/WebCore/platform/encryptedmedia/CDMInstance.h:77
&gt; &gt; +    struct SubSample {
&gt; &gt; +        SubSample()
&gt; &gt; +            : clearBytes(0), cipherBytes(0) { }
&gt; &gt; +        SubSample(uint32_t clearBytes, uint32_t cipherBytes)
&gt; &gt; +            : clearBytes(clearBytes), cipherBytes(cipherBytes) { }
&gt; &gt; +        uint32_t clearBytes;
&gt; &gt; +        uint32_t cipherBytes;
&gt; &gt; +    };
&gt; 
&gt; Isn&apos;t this just a uint64_t? Or a std::pair&lt;uint32_t&gt;?  If it stays a struct,
&gt; then you don&apos;t need a default or specialized constructor; it&apos;d be written:
&gt; 
&gt; struct SubSample {
&gt;   uint32_t clearBytes { 0 };
&gt;   uint32_t cipherBytes { 0 };
&gt; };

Will change.

&gt; 
&gt; &gt; Source/WebCore/platform/encryptedmedia/clearkey/CDMClearKey.cpp:39
&gt; &gt; +#include &lt;gcrypt.h&gt;
&gt; 
&gt; GStreamer specific code doesn&apos;t belong in this class.  A GStreamer-Specific
&gt; CDM for ClearKey encryption should be used instead, or at the very least
&gt; this class and file should be renamed.

My goal here is to have cross-platform ClearKey implementation. I did mention in a REVIEW: comment in this patch about whether there are better ways of performing AES-128 decryption in WK, the stuff under WebCore/crypto looked promising but it&apos;s just for window.crypto.subtle, and not used elsewhere in WebCore. Do you have any objections to moving in this direction in general, i.e. having cross-platform ClearKey CDM?

&gt; 
&gt; &gt; Source/WebCore/platform/encryptedmedia/clearkey/CDMClearKey.cpp:486
&gt; &gt; +    ASSERT(!isMainThread());
&gt; &gt; +    LOG(EME, &quot;EME ClearKey - decrypting, looking up session for key ID [%s]&quot;, keyIDToHexString(config-&gt;keyID()).utf8().data());
&gt; &gt;  
&gt; &gt; -    for (auto&amp; key : ClearKeyState::singleton().keys().values())
&gt; &gt; -        allKeys.appendVector(key);
&gt; &gt; +    auto* session = sessionForKeyID(config-&gt;keyID());
&gt; &gt; +    if (!session) {
&gt; &gt; +        auto locker = holdLock(m_waitingForKeyLock);
&gt; &gt; +        m_waitingForKeyCondition.waitFor(m_waitingForKeyLock, config-&gt;waitForKeyTimeout(), [this, &amp;config, &amp;session] {
&gt; &gt; +            return session = sessionForKeyID(config-&gt;keyID());
&gt; &gt; +        });
&gt; &gt; +        if (!session) {
&gt; &gt; +            LOG(EME, &quot;Failed to find matching session&quot;);
&gt; &gt; +            return false;
&gt; &gt; +        }
&gt; &gt; +    }
&gt; 
&gt; This code seems weird. sessionForKeyID() isn&apos;t thread safe. What happens
&gt; when the list of sessions is being mutated while sessionForKeyID() is called
&gt; on a background thread?

That&apos;s a bug.

&gt; Why is it mandatory that this function is called off
&gt; the main thread?

Because of how the condition variable is woken up on the main thread when update() comes in, we need to wait on it off the main thread.

&gt; Why isn&apos;t the client talking to the session directly?

That would be nice, and initially I wanted to do this, but when a CDMInstance is attached, we dispatch it to our GStreamer decryptor element. At the point it is dispatched, there&apos;s no way to know what session to send to the GStreamer pipeline. When GStreamer starts trying to process encrypted frames, only then does it have a key ID with which to look up an appropriate session. Hence, the CDMInstance is shipped, and extra methods added to lookup a session on demand. I agree this is not ideal, but there seemed no alternative.

&gt; Why
&gt; can&apos;t the decode fail if a key isn&apos;t available and retry when the client is
&gt; notified that there&apos;s a new key available?

It would require sending more messages to the GStreamer pipeline, having the waiting for an available key in the decryptor class itself simplified the logic needed in the client in my use-case.

&gt; 
&gt; &gt; Source/WebCore/platform/encryptedmedia/clearkey/CDMClearKey.cpp:609
&gt; &gt; +
&gt; &gt; +        LOG(EME, &quot;EME ClearKey session - new keys are available, notifying any waiter&quot;);
&gt; &gt; +        m_instance-&gt;signalNewKeysAvailable();
&gt; 
&gt; In addition to above, why can&apos;t this use the existing
&gt; attemptToResumePlaybackOnClients() callback?

Didn&apos;t know about that callback, will investigate.

Thank you for your review.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1484454</commentid>
    <comment_count>10</comment_count>
    <who name="Jer Noble">jer.noble</who>
    <bug_when>2018-12-03 12:46:23 -0800</bug_when>
    <thetext>(In reply to Charlie Turner from comment #9)
&gt; (In reply to Jer Noble from comment #7)
&gt; &gt; Comment on attachment 356384 [details]
&gt; &gt; Patch
&gt; &gt; 
&gt; &gt; View in context:
&gt; &gt; https://bugs.webkit.org/attachment.cgi?id=356384&amp;action=review
&gt; &gt; 
&gt; &gt; Generally, I&apos;m not in favor of taking GStreamer-Specific code and moving it
&gt; &gt; up into platform-independent code. So I don&apos;t really understand why this
&gt; &gt; patch is necessary in the first place.
&gt; 
&gt; I want to move away from the ClearKey code being GStreamer specific, so I am
&gt; trying to factor it into a cross-platform state. The classes/structs moved
&gt; into CDMInstance are useful from other derived classes we have downstream
&gt; for licensing reasons.

But are they useful for any non-ClearKey CDMs?  So far, at least two of the added types can be replaced with existing types.

&gt; &gt; 
&gt; &gt; &gt; Source/WebCore/platform/encryptedmedia/CDMInstance.h:68
&gt; &gt; &gt; +    enum class EncryptionMode {
&gt; &gt; &gt; +        Unencrypted,
&gt; &gt; &gt; +        Cenc,
&gt; &gt; &gt; +        Cbcs,
&gt; &gt; &gt; +    };
&gt; &gt; 
&gt; &gt; This is just a std::optional&lt;CDMEncryptionScheme&gt;.
&gt; 
&gt; Thanks, missed that.

Additionally, since this is a property of the MediaKeySystemConfiguration, it doesn&apos;t make sense to provide this scheme as an input to decrypt(), since the CDM will have been already configured to be either &apos;cenc&apos; or &apos;cbcs&apos; by the client. The instance will only ever be either &apos;cenc&apos; or &apos;cbcs&apos; but won&apos;t switch between the two.  The &apos;keyID&apos; property and I suspect that the &apos;iv&apos; property are the same on a session basis.

&gt; &gt; 
&gt; &gt; &gt; Source/WebCore/platform/encryptedmedia/CDMInstance.h:77
&gt; &gt; &gt; +    struct SubSample {
&gt; &gt; &gt; +        SubSample()
&gt; &gt; &gt; +            : clearBytes(0), cipherBytes(0) { }
&gt; &gt; &gt; +        SubSample(uint32_t clearBytes, uint32_t cipherBytes)
&gt; &gt; &gt; +            : clearBytes(clearBytes), cipherBytes(cipherBytes) { }
&gt; &gt; &gt; +        uint32_t clearBytes;
&gt; &gt; &gt; +        uint32_t cipherBytes;
&gt; &gt; &gt; +    };
&gt; &gt; 
&gt; &gt; Isn&apos;t this just a uint64_t? Or a std::pair&lt;uint32_t&gt;?  If it stays a struct,
&gt; &gt; then you don&apos;t need a default or specialized constructor; it&apos;d be written:
&gt; &gt; 
&gt; &gt; struct SubSample {
&gt; &gt;   uint32_t clearBytes { 0 };
&gt; &gt;   uint32_t cipherBytes { 0 };
&gt; &gt; };
&gt; 
&gt; Will change.

Okay. I have other qualms about this struct; I don&apos;t understand why a SubSample is always going to be 4-bytes long, and whether this couldn&apos;t just be implemented with two Uint32Arrays, rather than a Vector&lt;SubSample&gt;.

So what&apos;s left is the &apos;timeout&apos; property.  This has nothing to do with configuring the CDM, per se.

&gt; &gt; &gt; Source/WebCore/platform/encryptedmedia/clearkey/CDMClearKey.cpp:39
&gt; &gt; &gt; +#include &lt;gcrypt.h&gt;
&gt; &gt; 
&gt; &gt; GStreamer specific code doesn&apos;t belong in this class.  A GStreamer-Specific
&gt; &gt; CDM for ClearKey encryption should be used instead, or at the very least
&gt; &gt; this class and file should be renamed.
&gt; 
&gt; My goal here is to have cross-platform ClearKey implementation. I did
&gt; mention in a REVIEW: comment in this patch about whether there are better
&gt; ways of performing AES-128 decryption in WK, the stuff under WebCore/crypto
&gt; looked promising but it&apos;s just for window.crypto.subtle, and not used
&gt; elsewhere in WebCore. Do you have any objections to moving in this direction
&gt; in general, i.e. having cross-platform ClearKey CDM?

No I don&apos;t, but so far this patch isn&apos;t cross-platform.

&gt; &gt; 
&gt; &gt; &gt; Source/WebCore/platform/encryptedmedia/clearkey/CDMClearKey.cpp:486
&gt; &gt; &gt; +    ASSERT(!isMainThread());
&gt; &gt; &gt; +    LOG(EME, &quot;EME ClearKey - decrypting, looking up session for key ID [%s]&quot;, keyIDToHexString(config-&gt;keyID()).utf8().data());
&gt; &gt; &gt;  
&gt; &gt; &gt; -    for (auto&amp; key : ClearKeyState::singleton().keys().values())
&gt; &gt; &gt; -        allKeys.appendVector(key);
&gt; &gt; &gt; +    auto* session = sessionForKeyID(config-&gt;keyID());
&gt; &gt; &gt; +    if (!session) {
&gt; &gt; &gt; +        auto locker = holdLock(m_waitingForKeyLock);
&gt; &gt; &gt; +        m_waitingForKeyCondition.waitFor(m_waitingForKeyLock, config-&gt;waitForKeyTimeout(), [this, &amp;config, &amp;session] {
&gt; &gt; &gt; +            return session = sessionForKeyID(config-&gt;keyID());
&gt; &gt; &gt; +        });
&gt; &gt; &gt; +        if (!session) {
&gt; &gt; &gt; +            LOG(EME, &quot;Failed to find matching session&quot;);
&gt; &gt; &gt; +            return false;
&gt; &gt; &gt; +        }
&gt; &gt; &gt; +    }
&gt; &gt; 
&gt; &gt; This code seems weird. sessionForKeyID() isn&apos;t thread safe. What happens
&gt; &gt; when the list of sessions is being mutated while sessionForKeyID() is called
&gt; &gt; on a background thread?
&gt; 
&gt; That&apos;s a bug.
&gt; 
&gt; &gt; Why is it mandatory that this function is called off
&gt; &gt; the main thread?
&gt; 
&gt; Because of how the condition variable is woken up on the main thread when
&gt; update() comes in, we need to wait on it off the main thread.

That doesn&apos;t really make sense. If the decrypt() function was non-blocking, the condition variable wouldn&apos;t be necessary in the first place.  For example, I don&apos;t see any place where the Condition is signaled if the CDMInstanceClearKey is destroyed. So if the instance is destroyed, the decrypt() thread will hang until the timeout is reached, and at that point, will reference deleted memory.

On a separate note, rather than using a Lock + Condition, WTF has a Semaphore object that should do both. You may want to look into using that directly. But I&apos;d recommend just removing the Condition entirely.

If this really needs to be something that must be called on a background thread, please consider abstracting out &quot;decode()&quot; into something that is just a free-function that doesn&apos;t depend on any ivars.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1484473</commentid>
    <comment_count>11</comment_count>
    <who name="Charlie Turner">cturner</who>
    <bug_when>2018-12-03 13:26:06 -0800</bug_when>
    <thetext>(In reply to Jer Noble from comment #10)
&gt; (In reply to Charlie Turner from comment #9)
&gt; &gt; (In reply to Jer Noble from comment #7)
&gt; &gt; &gt; Comment on attachment 356384 [details]
&gt; &gt; &gt; Patch
&gt; &gt; &gt; 
&gt; &gt; &gt; View in context:
&gt; &gt; &gt; https://bugs.webkit.org/attachment.cgi?id=356384&amp;action=review
&gt; &gt; &gt; 
&gt; &gt; &gt; Generally, I&apos;m not in favor of taking GStreamer-Specific code and moving it
&gt; &gt; &gt; up into platform-independent code. So I don&apos;t really understand why this
&gt; &gt; &gt; patch is necessary in the first place.
&gt; &gt; 
&gt; &gt; I want to move away from the ClearKey code being GStreamer specific, so I am
&gt; &gt; trying to factor it into a cross-platform state. The classes/structs moved
&gt; &gt; into CDMInstance are useful from other derived classes we have downstream
&gt; &gt; for licensing reasons.
&gt; 
&gt; But are they useful for any non-ClearKey CDMs?  So far, at least two of the
&gt; added types can be replaced with existing types.

The decrypt() method on CDMInstance is useful, the implementation details clearly haven&apos;t taken advantage of the existing types in WK.

&gt; 
&gt; &gt; &gt; 
&gt; &gt; &gt; &gt; Source/WebCore/platform/encryptedmedia/CDMInstance.h:68
&gt; &gt; &gt; &gt; +    enum class EncryptionMode {
&gt; &gt; &gt; &gt; +        Unencrypted,
&gt; &gt; &gt; &gt; +        Cenc,
&gt; &gt; &gt; &gt; +        Cbcs,
&gt; &gt; &gt; &gt; +    };
&gt; &gt; &gt; 
&gt; &gt; &gt; This is just a std::optional&lt;CDMEncryptionScheme&gt;.
&gt; &gt; 
&gt; &gt; Thanks, missed that.
&gt; 
&gt; Additionally, since this is a property of the MediaKeySystemConfiguration,
&gt; it doesn&apos;t make sense to provide this scheme as an input to decrypt(), since
&gt; the CDM will have been already configured to be either &apos;cenc&apos; or &apos;cbcs&apos; by
&gt; the client.

It wasn&apos;t clear how that information can be retrieved from CDMInstance, but I will see if it can be exposed in the CDMInstance.

&gt; The instance will only ever be either &apos;cenc&apos; or &apos;cbcs&apos; but won&apos;t
&gt; switch between the two.  The &apos;keyID&apos; property and I suspect that the &apos;iv&apos;
&gt; property are the same on a session basis.

I&apos;m not sure how the keyID and IV are the same on a session basis, in fact they can change for each sample in the fundamental stream.

&gt; 
&gt; &gt; &gt; 
&gt; &gt; &gt; &gt; Source/WebCore/platform/encryptedmedia/CDMInstance.h:77
&gt; &gt; &gt; &gt; +    struct SubSample {
&gt; &gt; &gt; &gt; +        SubSample()
&gt; &gt; &gt; &gt; +            : clearBytes(0), cipherBytes(0) { }
&gt; &gt; &gt; &gt; +        SubSample(uint32_t clearBytes, uint32_t cipherBytes)
&gt; &gt; &gt; &gt; +            : clearBytes(clearBytes), cipherBytes(cipherBytes) { }
&gt; &gt; &gt; &gt; +        uint32_t clearBytes;
&gt; &gt; &gt; &gt; +        uint32_t cipherBytes;
&gt; &gt; &gt; &gt; +    };
&gt; &gt; &gt; 
&gt; &gt; &gt; Isn&apos;t this just a uint64_t? Or a std::pair&lt;uint32_t&gt;?  If it stays a struct,
&gt; &gt; &gt; then you don&apos;t need a default or specialized constructor; it&apos;d be written:
&gt; &gt; &gt; 
&gt; &gt; &gt; struct SubSample {
&gt; &gt; &gt;   uint32_t clearBytes { 0 };
&gt; &gt; &gt;   uint32_t cipherBytes { 0 };
&gt; &gt; &gt; };
&gt; &gt; 
&gt; &gt; Will change.
&gt; 
&gt; Okay. I have other qualms about this struct; I don&apos;t understand why a
&gt; SubSample is always going to be 4-bytes long

That&apos;s specified in the common encryption spec, again perhaps not generic enough, but I&apos;ve not seen subsample formats that violate this.

&gt; and whether this couldn&apos;t just
&gt; be implemented with two Uint32Arrays, rather than a Vector&lt;SubSample&gt;.

Could be done either AoS of SoA, agree.

&gt; So what&apos;s left is the &apos;timeout&apos; property.  This has nothing to do with
&gt; configuring the CDM, per se.

The root reason for the timeout is that we can be ready to decrypt in GStreamer before update() has happened. So there&apos;s a fundamental need for synchronisation somewhere. I chose the CDMInstance rather than the client to avoid needing more bus messages in our GStreamer implementation.

&gt; 
&gt; &gt; &gt; &gt; Source/WebCore/platform/encryptedmedia/clearkey/CDMClearKey.cpp:39
&gt; &gt; &gt; &gt; +#include &lt;gcrypt.h&gt;
&gt; &gt; &gt; 
&gt; &gt; &gt; GStreamer specific code doesn&apos;t belong in this class.  A GStreamer-Specific
&gt; &gt; &gt; CDM for ClearKey encryption should be used instead, or at the very least
&gt; &gt; &gt; this class and file should be renamed.
&gt; &gt; 
&gt; &gt; My goal here is to have cross-platform ClearKey implementation. I did
&gt; &gt; mention in a REVIEW: comment in this patch about whether there are better
&gt; &gt; ways of performing AES-128 decryption in WK, the stuff under WebCore/crypto
&gt; &gt; looked promising but it&apos;s just for window.crypto.subtle, and not used
&gt; &gt; elsewhere in WebCore. Do you have any objections to moving in this direction
&gt; &gt; in general, i.e. having cross-platform ClearKey CDM?
&gt; 
&gt; No I don&apos;t, but so far this patch isn&apos;t cross-platform.

I&apos;m looking to make it so, gcrypt is a cross-platform library, but I would have preferred to use WebCore classes for the decryption, but am unsure how to proceed along that path.

&gt; 
&gt; &gt; &gt; 
&gt; &gt; &gt; &gt; Source/WebCore/platform/encryptedmedia/clearkey/CDMClearKey.cpp:486
&gt; &gt; &gt; &gt; +    ASSERT(!isMainThread());
&gt; &gt; &gt; &gt; +    LOG(EME, &quot;EME ClearKey - decrypting, looking up session for key ID [%s]&quot;, keyIDToHexString(config-&gt;keyID()).utf8().data());
&gt; &gt; &gt; &gt;  
&gt; &gt; &gt; &gt; -    for (auto&amp; key : ClearKeyState::singleton().keys().values())
&gt; &gt; &gt; &gt; -        allKeys.appendVector(key);
&gt; &gt; &gt; &gt; +    auto* session = sessionForKeyID(config-&gt;keyID());
&gt; &gt; &gt; &gt; +    if (!session) {
&gt; &gt; &gt; &gt; +        auto locker = holdLock(m_waitingForKeyLock);
&gt; &gt; &gt; &gt; +        m_waitingForKeyCondition.waitFor(m_waitingForKeyLock, config-&gt;waitForKeyTimeout(), [this, &amp;config, &amp;session] {
&gt; &gt; &gt; &gt; +            return session = sessionForKeyID(config-&gt;keyID());
&gt; &gt; &gt; &gt; +        });
&gt; &gt; &gt; &gt; +        if (!session) {
&gt; &gt; &gt; &gt; +            LOG(EME, &quot;Failed to find matching session&quot;);
&gt; &gt; &gt; &gt; +            return false;
&gt; &gt; &gt; &gt; +        }
&gt; &gt; &gt; &gt; +    }
&gt; &gt; &gt; 
&gt; &gt; &gt; This code seems weird. sessionForKeyID() isn&apos;t thread safe. What happens
&gt; &gt; &gt; when the list of sessions is being mutated while sessionForKeyID() is called
&gt; &gt; &gt; on a background thread?
&gt; &gt; 
&gt; &gt; That&apos;s a bug.
&gt; &gt; 
&gt; &gt; &gt; Why is it mandatory that this function is called off
&gt; &gt; &gt; the main thread?
&gt; &gt; 
&gt; &gt; Because of how the condition variable is woken up on the main thread when
&gt; &gt; update() comes in, we need to wait on it off the main thread.
&gt; 
&gt; That doesn&apos;t really make sense. If the decrypt() function was non-blocking,
&gt; the condition variable wouldn&apos;t be necessary in the first place.  For
&gt; example, I don&apos;t see any place where the Condition is signaled if the
&gt; CDMInstanceClearKey is destroyed. So if the instance is destroyed, the
&gt; decrypt() thread will hang until the timeout is reached, and at that point,
&gt; will reference deleted memory.

Agree I missed a place where it needs signalling, the session decryption should probably be posted onto the main thread with a weakThis.

&gt; On a separate note, rather than using a Lock + Condition, WTF has a
&gt; Semaphore object that should do both. You may want to look into using that
&gt; directly. But I&apos;d recommend just removing the Condition entirely.

Thanks, will take a look.

&gt; If this really needs to be something that must be called on a background
&gt; thread, please consider abstracting out &quot;decode()&quot; into something that is
&gt; just a free-function that doesn&apos;t depend on any ivars.

I will consider it, my gut feel is it will need the created session ivars at the very least to be able to find the one created with key ids requested from the client. It also seemed like in principle, a CDMInstance&apos;s primarly purpose was to manage keys and use them decrypt, so not associating decryption with the CDMInstance seems a bit odd, but I&apos;ll think more about it.

Thanks again for the review!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1484499</commentid>
    <comment_count>12</comment_count>
    <who name="Jer Noble">jer.noble</who>
    <bug_when>2018-12-03 14:02:20 -0800</bug_when>
    <thetext>(In reply to Charlie Turner from comment #11)
&gt; (In reply to Jer Noble from comment #10)&gt; 
&gt; &gt; So what&apos;s left is the &apos;timeout&apos; property.  This has nothing to do with
&gt; &gt; configuring the CDM, per se.
&gt; 
&gt; The root reason for the timeout is that we can be ready to decrypt in
&gt; GStreamer before update() has happened. 

Well, the root reason for the timeout is that you need to block, but can&apos;t trust that your object will ever be signaled.  We do something similar in Cocoa code, where we block forever in a background thread waiting for update(): &lt;https://trac.webkit.org/browser/webkit/trunk/Source/WebCore/platform/graphics/avfoundation/objc/SourceBufferPrivateAVFObjC.mm#L198&gt;, but use a separate semaphore to signal that the operation has been aborted. So I totally get /why/ you&apos;re doing what you&apos;re doing here. I just don&apos;t think this is the right place to /do/ what you&apos;re doing.

&gt; So there&apos;s a fundamental need for
&gt; synchronisation somewhere. I chose the CDMInstance rather than the client to
&gt; avoid needing more bus messages in our GStreamer implementation.

Yes, but this is supposed to be platform-agnostic code, and it&apos;s implemented in a GStreamer-specific way.

Instead, consider this flow:

1) The GStreamer parser encounters an encrypted segment or sample.
2) The spec requires that parsing stops until a valid key has been delivered, so GStreamer blocks the background parser thread with a Semaphore
3) The client gets an &apos;encrypted&apos; message, and initializes a CDM instance with some parameters, including keyID, encryption scheme, and possibly iv data.
4) GStreamer receives a &quot;attempt to resume playback if necessary&quot; message (by way of the attemptToDecryptWithInstance() MediaPlayerPrivate call)
5) GStreamer pulls the configuration parameters out of the CDMInstance, or fails if the required keyID is not present
6) GStreamer unblocks the decoding thread by signaling the semaphore.

None of this requires the CDMInstanceSessionClearKey object itself to be callable on a background thread.  The decode() method itself could be a static method on CDMInstanceClearKey or CDMInstanceSessionClearKey, and accept all the parameters needed to decode the vector of subsamples. There would be no Semaphore in the CDMInstance class itself, no timeout parameter, and no additional GStreamer bus messages.

&gt; &gt; &gt; &gt; &gt; Source/WebCore/platform/encryptedmedia/clearkey/CDMClearKey.cpp:39
&gt; &gt; &gt; &gt; &gt; +#include &lt;gcrypt.h&gt;
&gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; GStreamer specific code doesn&apos;t belong in this class.  A GStreamer-Specific
&gt; &gt; &gt; &gt; CDM for ClearKey encryption should be used instead, or at the very least
&gt; &gt; &gt; &gt; this class and file should be renamed.
&gt; &gt; &gt; 
&gt; &gt; &gt; My goal here is to have cross-platform ClearKey implementation. I did
&gt; &gt; &gt; mention in a REVIEW: comment in this patch about whether there are better
&gt; &gt; &gt; ways of performing AES-128 decryption in WK, the stuff under WebCore/crypto
&gt; &gt; &gt; looked promising but it&apos;s just for window.crypto.subtle, and not used
&gt; &gt; &gt; elsewhere in WebCore. Do you have any objections to moving in this direction
&gt; &gt; &gt; in general, i.e. having cross-platform ClearKey CDM?
&gt; &gt; 
&gt; &gt; No I don&apos;t, but so far this patch isn&apos;t cross-platform.
&gt; 
&gt; I&apos;m looking to make it so, gcrypt is a cross-platform library, but I would
&gt; have preferred to use WebCore classes for the decryption, but am unsure how
&gt; to proceed along that path.
&gt; 
&gt; &gt; 
&gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; &gt; Source/WebCore/platform/encryptedmedia/clearkey/CDMClearKey.cpp:486
&gt; &gt; &gt; &gt; &gt; +    ASSERT(!isMainThread());
&gt; &gt; &gt; &gt; &gt; +    LOG(EME, &quot;EME ClearKey - decrypting, looking up session for key ID [%s]&quot;, keyIDToHexString(config-&gt;keyID()).utf8().data());
&gt; &gt; &gt; &gt; &gt;  
&gt; &gt; &gt; &gt; &gt; -    for (auto&amp; key : ClearKeyState::singleton().keys().values())
&gt; &gt; &gt; &gt; &gt; -        allKeys.appendVector(key);
&gt; &gt; &gt; &gt; &gt; +    auto* session = sessionForKeyID(config-&gt;keyID());
&gt; &gt; &gt; &gt; &gt; +    if (!session) {
&gt; &gt; &gt; &gt; &gt; +        auto locker = holdLock(m_waitingForKeyLock);
&gt; &gt; &gt; &gt; &gt; +        m_waitingForKeyCondition.waitFor(m_waitingForKeyLock, config-&gt;waitForKeyTimeout(), [this, &amp;config, &amp;session] {
&gt; &gt; &gt; &gt; &gt; +            return session = sessionForKeyID(config-&gt;keyID());
&gt; &gt; &gt; &gt; &gt; +        });
&gt; &gt; &gt; &gt; &gt; +        if (!session) {
&gt; &gt; &gt; &gt; &gt; +            LOG(EME, &quot;Failed to find matching session&quot;);
&gt; &gt; &gt; &gt; &gt; +            return false;
&gt; &gt; &gt; &gt; &gt; +        }
&gt; &gt; &gt; &gt; &gt; +    }
&gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; This code seems weird. sessionForKeyID() isn&apos;t thread safe. What happens
&gt; &gt; &gt; &gt; when the list of sessions is being mutated while sessionForKeyID() is called
&gt; &gt; &gt; &gt; on a background thread?
&gt; &gt; &gt; 
&gt; &gt; &gt; That&apos;s a bug.
&gt; &gt; &gt; 
&gt; &gt; &gt; &gt; Why is it mandatory that this function is called off
&gt; &gt; &gt; &gt; the main thread?
&gt; &gt; &gt; 
&gt; &gt; &gt; Because of how the condition variable is woken up on the main thread when
&gt; &gt; &gt; update() comes in, we need to wait on it off the main thread.
&gt; &gt; 
&gt; &gt; That doesn&apos;t really make sense. If the decrypt() function was non-blocking,
&gt; &gt; the condition variable wouldn&apos;t be necessary in the first place.  For
&gt; &gt; example, I don&apos;t see any place where the Condition is signaled if the
&gt; &gt; CDMInstanceClearKey is destroyed. So if the instance is destroyed, the
&gt; &gt; decrypt() thread will hang until the timeout is reached, and at that point,
&gt; &gt; will reference deleted memory.
&gt; 
&gt; Agree I missed a place where it needs signalling, the session decryption
&gt; should probably be posted onto the main thread with a weakThis.
&gt; 
&gt; &gt; On a separate note, rather than using a Lock + Condition, WTF has a
&gt; &gt; Semaphore object that should do both. You may want to look into using that
&gt; &gt; directly. But I&apos;d recommend just removing the Condition entirely.
&gt; 
&gt; Thanks, will take a look.
&gt; 
&gt; &gt; If this really needs to be something that must be called on a background
&gt; &gt; thread, please consider abstracting out &quot;decode()&quot; into something that is
&gt; &gt; just a free-function that doesn&apos;t depend on any ivars.
&gt; 
&gt; I will consider it, my gut feel is it will need the created session ivars at
&gt; the very least to be able to find the one created with key ids requested
&gt; from the client. It also seemed like in principle, a CDMInstance&apos;s primarly
&gt; purpose was to manage keys and use them decrypt, so not associating
&gt; decryption with the CDMInstance seems a bit odd, but I&apos;ll think more about
&gt; it.
&gt; 
&gt; Thanks again for the review!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1485975</commentid>
    <comment_count>13</comment_count>
    <who name="Charlie Turner">cturner</who>
    <bug_when>2018-12-07 04:23:08 -0800</bug_when>
    <thetext>(In reply to Jer Noble from comment #12)
&gt; (In reply to Charlie Turner from comment #11)
&gt; &gt; (In reply to Jer Noble from comment #10)&gt; 
&gt; &gt; &gt; So what&apos;s left is the &apos;timeout&apos; property.  This has nothing to do with
&gt; &gt; &gt; configuring the CDM, per se.
&gt; &gt; 
&gt; &gt; The root reason for the timeout is that we can be ready to decrypt in
&gt; &gt; GStreamer before update() has happened. 
&gt; 
&gt; Well, the root reason for the timeout is that you need to block, but can&apos;t
&gt; trust that your object will ever be signaled.  We do something similar in
&gt; Cocoa code, where we block forever in a background thread waiting for
&gt; update():
&gt; &lt;https://trac.webkit.org/browser/webkit/trunk/Source/WebCore/platform/
&gt; graphics/avfoundation/objc/SourceBufferPrivateAVFObjC.mm#L198&gt;, but use a
&gt; separate semaphore to signal that the operation has been aborted. So I
&gt; totally get /why/ you&apos;re doing what you&apos;re doing here. I just don&apos;t think
&gt; this is the right place to /do/ what you&apos;re doing.

Thanks for the pointer, it was instructive to see the FPS implementation in MSE.

&gt; 
&gt; &gt; So there&apos;s a fundamental need for
&gt; &gt; synchronisation somewhere. I chose the CDMInstance rather than the client to
&gt; &gt; avoid needing more bus messages in our GStreamer implementation.
&gt; 
&gt; Yes, but this is supposed to be platform-agnostic code, and it&apos;s implemented
&gt; in a GStreamer-specific way.
&gt; 
&gt; Instead, consider this flow:
&gt; 
&gt; 1) The GStreamer parser encounters an encrypted segment or sample.
&gt; 2) The spec requires that parsing stops until a valid key has been
&gt; delivered, so GStreamer blocks the background parser thread with a Semaphore
&gt; 3) The client gets an &apos;encrypted&apos; message, and initializes a CDM instance
&gt; with some parameters, including keyID, encryption scheme, and possibly iv
&gt; data.

This is where it breaks down for the &quot;real&quot; CDMs (not ClearKey) I need to support. With FPS, you seem to always be able to populate m_keys with with the result of parsing the SINF box in the init data, when it is first encountered. For Widevine, this is not the case. We normally detect an encrypted segment via the PSSH box. This box has two versions. Version 0 specifies no key IDs as present in the box (version 1 does). The EME spec says only that content creators SHOULD use version 1, but they do not in a lot of cases. What Widevine encoded content tends to do is stuff a proprietary formatted init data block in the Data field of the PSSH box, and you pass that blindly into the Widevine CDM. Then you need to wait for Widevine to call you back about the availability of a license server messages, from which point you can call an API to ask what keys the CDM has available (additionally, even if you did mirror the protobuf parsing and hack out the key IDs in the init data, Widevine has key generation, so it will generate more key IDs than are even available in the init data...). But this is all async, and can happen after WebCore thinks we can attemptToDecrypt(), since a CDM is created before update(). This was the reason why yet another rendezvous was adding in decode();.

So I can&apos;t maintain an m_keys member like you do in your SourceBufferPrivateAVFObjC class to support session querying in general. You have the option of issuing attemptToDecrypt() when you get setCDMInstance, I can not do this in general without further blocking on not only update(); but also the actual CDM issuing callbacks about available keys, after the JS update() has completed...


&gt; 4) GStreamer receives a &quot;attempt to resume playback if necessary&quot; message
&gt; (by way of the attemptToDecryptWithInstance() MediaPlayerPrivate call)

As above, we can&apos;t in general use the &quot;attempt to resume playback if necessary&quot; message to unblock our streaming thread. This is the reason for the further blocking in decode() in this patch. While for ClearKey it is pointless, for Widevine it is required due to the key availability issue. PlayReady can be even worse in that certain versions, that CDM actually give you no way to know what key IDs it has available! There should be a nicer way to handle this point, but perhaps we&apos;ll just have to continue with some extra blocking points in our downstream decryptors to workaround these CDM behaviours, ClearKey and FPS are much nicer to integrate into the current WebCore APIs that Widevine and Playready.

&gt; None of this requires the CDMInstanceSessionClearKey object itself to be
&gt; callable on a background thread.  The decode() method itself could be a
&gt; static method on CDMInstanceClearKey or CDMInstanceSessionClearKey, and
&gt; accept all the parameters needed to decode the vector of subsamples. There
&gt; would be no Semaphore in the CDMInstance class itself, no timeout parameter,
&gt; and no additional GStreamer bus messages.

My conclusion here is that I will have to maintain CDM specific workarounds in our downstream decryptors that can not assume the availability of a CDM instance implies they can continue decrypting. Rather, the derived CDMInstance&apos;s will have extra methods that answer whether the underlying CDM has keys available yet, independent of &quot;attempt to decrypt&quot;, which doesn&apos;t take these cases into account.

For ClearKey, I can mimic more closely what you&apos;re doing with FPS, in terms of extracting and storing key IDs on init data encountered, and move the decode() logic back to something GStreamer/gcrypt specific, to avoid touching the CDMInstance base classes. For Widevine/PlayReady, we have problems described above getting the synchronisation to play nicely with the attemptToDecrypt() algorithm trigger points.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1487553</commentid>
    <comment_count>14</comment_count>
    <who name="Charlie Turner">cturner</who>
    <bug_when>2018-12-13 04:09:38 -0800</bug_when>
    <thetext>Hi Jer,

I have two proposals to sort out our issue about not having key IDs available in advance in the general case.

In our off-main-thread decryptor, we extract key IDs from the encoded samples and have the issue that lack of key IDs in init data / key rotation can force us to block midway through the content, so we need some kind of blocking during decode(), for example some YouTube protected content can change key IDs every 5 minutes during playback, so even if you could extract key IDs from the init data, you&apos;re still out of luck.

So the proposals from the POV of a platform implementation of &quot;attempt to decrypt with instance&quot;,

Option 1. CDMInstance as a key manager and decoder.

gstreamerDecode(newSample) {
   nextKeyID = newSample-&gt;keyID;
   iv = newSample-&gt;iv;
   if (cached key ids does not contain the nextKeyID) {
      // waiting for key = true
      // block waiting for next attempt to decrypt with instance.
      m_session = CDMInstance::sessionForKeyID(newKeyID);
      if (!m_session) { error out; }
      // update cached key ids
      // waiting for key = false
   }
   session-&gt;decrypt(nextKeyID, iv, encryptedBuffer); // now non-blocking, but called off main-thread
}

sessionForKeyID could be reused in your implementation as well, since I notice you have a similar use-case there for looking up sessions with key IDs. I haven&apos;t figured out how decode() works in the FPS stuff however.

Option 2. CDMInstance has a key manager only, rather than also a decoder

Same flow as Option 1., however, once the next &quot;attempt to decrypt with instance&quot; comes through, we instead perform decode() in our decryptor, asking the CDMInstance just for the new key data,

gstreamerDecode(newSample) {
   nextKeyID = newSample-&gt;keyID;
   iv = newSample-&gt;iv;
   if (cached key ids does not contain the nextKeyID) {
      // waiting for key = true
      // block waiting for next attempt to decrypt with instance.
      RefPtr&lt;SharedBuffer&gt; keyData = cdmInstance-&gt;getKey(nextKeyID);
      if (!keyData) { error out; }
      // update cached key ids
   }
   // perform decryptor specific decode() using the key data
}

Where getKey would need to query the available sessions and ask a matching one, if any, for its key data.

Either way, the CDMInstance API is not adequate to support our CDMs in general, since we have no way of extract available key IDs in advance of decode() in all cases. Even if we could, key rotation is problem that would require this anyway. I&apos;m not sure how FPS handles key rotation, or whether this is a case you need to deal with there.

Of the two, I feel option 2. is the least invasive. However conceptually it seems clearer for me that CDMInstance would be responsible for key management and decode.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1487575</commentid>
    <comment_count>15</comment_count>
      <attachid>357229</attachid>
    <who name="Charlie Turner">cturner</who>
    <bug_when>2018-12-13 06:42:08 -0800</bug_when>
    <thetext>Created attachment 357229
Patch

Move back to multi-decryptor architecture, and use CDM downcasting to avoid making any changes to CDMInstance. This avoids needing to touch the base class, and instead moves us to relying on the CDMInstance for key management, rather than key IDs extracted from init data that is not possible in general. Still think it would be a good idea for CDMInstance to have an availableKeys() method or something similar as explained above, but to unblock here, this alternative is now propsed</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1487630</commentid>
    <comment_count>16</comment_count>
    <who name="Jer Noble">jer.noble</who>
    <bug_when>2018-12-13 11:02:09 -0800</bug_when>
    <thetext>(In reply to Charlie Turner from comment #14)
&gt; Hi Jer,
&gt; 
&gt; I have two proposals to sort out our issue about not having key IDs
&gt; available in advance in the general case.
&gt; 
&gt; In our off-main-thread decryptor, we extract key IDs from the encoded
&gt; samples and have the issue that lack of key IDs in init data / key rotation
&gt; can force us to block midway through the content, so we need some kind of
&gt; blocking during decode(), for example some YouTube protected content can
&gt; change key IDs every 5 minutes during playback, so even if you could extract
&gt; key IDs from the init data, you&apos;re still out of luck.

Is it really the case that YouTube will rotate it&apos;s keyIDs outside of a new initialization segment? That seems weird, but maybe it&apos;s a Widevine vs. FPS thing.

&gt; I haven&apos;t figured out how decode() works in the FPS stuff however.

The &quot;decode()&quot; step happens internal to the media engine. They only call up to the WebKit layer when they find they don&apos;t have the keys necessary to decrypt.

&gt; Either way, the CDMInstance API is not adequate to support our CDMs in
&gt; general, since we have no way of extract available key IDs in advance of
&gt; decode() in all cases. Even if we could, key rotation is problem that would
&gt; require this anyway. I&apos;m not sure how FPS handles key rotation, or whether
&gt; this is a case you need to deal with there.
&gt; 
&gt; Of the two, I feel option 2. is the least invasive. However conceptually it
&gt; seems clearer for me that CDMInstance would be responsible for key
&gt; management and decode.

I&apos;m not sure I agree with your &quot;however&quot;.  The intent of these classes was to be a communication mechanism to the actual CDM, not to become CDMs in and of themselves.  Maybe we named them incorrectly.

All that said, I don&apos;t think either of your two options are incredibly problematic. I would prefer that, rather than trying to call into either the CDMInstance or CDMInstanceSession to retrieve key data on the decode() thread, that instead the decode() thread blocks, dispatches to the main thread, and signals the decode() thread to continue once key data is fetched.  If not, we have to be very, very careful to make all the accessors in every CDMInstance subclass thread-safe.

(Alternatively, if we decide that the main thread is too crazy a place to do this work, we can decide as a project to move all CDM access to a well known thread, but we&apos;d still want to block/dispatch to get new keys.)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1487916</commentid>
    <comment_count>17</comment_count>
      <attachid>357229</attachid>
    <who name="Xabier Rodríguez Calvar">calvaris</who>
    <bug_when>2018-12-14 07:50:45 -0800</bug_when>
    <thetext>Comment on attachment 357229
Patch

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

&gt; Source/WebCore/platform/graphics/gstreamer/GStreamerCommon.h:106
&gt; +        if (m_isValid &amp;&amp; GST_IS_BUFFER(m_buffer))

I haven&apos;t checked the implications of this happening. From what I understand the buffer can be unreffed out while we hold a map on it, right?. Checking this is a &quot;poor-man&apos;s&quot; fail-safe. If the buffer was valid before and it is not now, it means that the memory is gone and even it will most probably will answer false, there&apos;s the small possibility of it crashing.

Something makes me worry even more and it is what happens if we access the memory with the data() accessors.

Considering this, I think we should ref the buffer inside the GstMappedBuffer object by holding a GRefPtr instead of a plain pointer. I&apos;d also ASSERT(GST_IS_BUFFER(buffer)) in the constructor.

&gt; Source/WebCore/platform/graphics/gstreamer/GStreamerCommon.h:114
&gt; +    Ref&lt;SharedBuffer&gt; sharedBuffer() const { return SharedBuffer::create(data(), size()); }

Might it be interesting to cache the shared buffer and return a const &amp;?

&gt; Source/WebCore/platform/graphics/gstreamer/eme/WebKitClearKeyDecryptorGStreamer.cpp:121
&gt; +static bool handleKeyResponse(WebKitMediaCommonEncryptionDecrypt* self, RefPtr&lt;CDMInstance&gt; cdmInstance)

could we use const &amp; here?

&gt; Source/WebCore/platform/graphics/gstreamer/eme/WebKitClearKeyDecryptorGStreamer.cpp:128
&gt; +static bool findAndSetKey(WebKitMediaClearKeyDecryptPrivate* priv, const Ref&lt;SharedBuffer&gt; keyID)

const &amp;?

&gt; Source/WebCore/platform/graphics/gstreamer/eme/WebKitCommonEncryptionDecryptorGStreamer.cpp:324
&gt; -            priv-&gt;cdmInstance = value ? reinterpret_cast&lt;CDMInstance*&gt;(g_value_get_pointer(value)) : nullptr;
&gt; +            // Capture the CDMInstance into a separate variable to avoid missing a refcount.
&gt; +            CDMInstance* instance = value ? reinterpret_cast&lt;CDMInstance*&gt;(g_value_get_pointer(value)) : nullptr;
&gt; +            // ... And force a refcount bump using operator=.
&gt; +            priv-&gt;cdmInstance = instance;

I don&apos;t think this change is needed. It&apos;s the same thing but with more stack variables and comments. I think we don&apos;t need them.

&gt; Source/WebCore/platform/graphics/gstreamer/eme/WebKitCommonEncryptionDecryptorGStreamer.cpp:326
&gt; +                GST_DEBUG_OBJECT(self, &quot;received a new CDM instance %p, refcount %u&quot;, priv-&gt;cdmInstance.get(), priv-&gt;cdmInstance-&gt;refCount());

ref count was probably useful while debugging the ref counting issues we had discussed, but I don&apos;t think it is needed here.

&gt; Source/WebCore/platform/graphics/gstreamer/eme/WebKitCommonEncryptionDecryptorGStreamer.cpp:360
&gt; +        if (klass-&gt;handleKeyResponse(self, priv-&gt;cdmInstance)) {
&gt;              GST_DEBUG_OBJECT(self, &quot;key received&quot;);
&gt;              priv-&gt;keyReceived = true;

Considering what we have discussed internally. This does not make sense anymore. Do you have plans to remove the keyReceived attribute and rework this part?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1488852</commentid>
    <comment_count>18</comment_count>
    <who name="Charlie Turner">cturner</who>
    <bug_when>2018-12-18 02:32:33 -0800</bug_when>
    <thetext>(In reply to Jer Noble from comment #16)
&gt; (In reply to Charlie Turner from comment #14)
&gt; &gt; Hi Jer,
&gt; &gt; 
&gt; &gt; I have two proposals to sort out our issue about not having key IDs
&gt; &gt; available in advance in the general case.
&gt; &gt; 
&gt; &gt; In our off-main-thread decryptor, we extract key IDs from the encoded
&gt; &gt; samples and have the issue that lack of key IDs in init data / key rotation
&gt; &gt; can force us to block midway through the content, so we need some kind of
&gt; &gt; blocking during decode(), for example some YouTube protected content can
&gt; &gt; change key IDs every 5 minutes during playback, so even if you could extract
&gt; &gt; key IDs from the init data, you&apos;re still out of luck.
&gt; 
&gt; Is it really the case that YouTube will rotate it&apos;s keyIDs outside of a new
&gt; initialization segment? That seems weird, but maybe it&apos;s a Widevine vs. FPS
&gt; thing.

Widevine sends us a license-renewal (https://www.w3.org/TR/encrypted-media/#dom-mediakeymessagetype-license-renewal) every minute, YouTube protected content&apos;s licenses will expire every 5 minutes if it&apos;s not renewed. In theory, this could change the available keys.


&gt; &gt; Of the two, I feel option 2. is the least invasive. However conceptually it
&gt; &gt; seems clearer for me that CDMInstance would be responsible for key
&gt; &gt; management and decode.
&gt; 
&gt; I&apos;m not sure I agree with your &quot;however&quot;.  The intent of these classes was
&gt; to be a communication mechanism to the actual CDM, not to become CDMs in and
&gt; of themselves.  Maybe we named them incorrectly.

The Widevine CDM API has a decrypt() method, so part of communication mechanisms with this CDM is decryption. Same for Playready. I guess the APIs for FPS / (Playready/Widevine) are sufficiently different that the confusion came about as to what communication needs to be made available to clients of a CDMInstance/CDMInstanceSession.

Currently for Widevine, the CDMInstanceWidevine registers callbacks on the CDM handle for things like onMessage, onKeyStatusUpdate, etc, etc. We then have a decryptor element in GStreamer that needs to call the CDM handle&apos;s decrypt() method, after the CDMInstanceWidevine has done all the necessary setup / updating on this handle. It makes no sense to me that we can&apos;t use a method on CDMInstance to tell it to decrypt. That&apos;s not decrypting *in* the CDMInstance class, it&apos;s allowing communicating the &quot;decrypt intent&quot; to the underlying CDM.

&gt; 
&gt; All that said, I don&apos;t think either of your two options are incredibly
&gt; problematic. I would prefer that, rather than trying to call into either the
&gt; CDMInstance or CDMInstanceSession to retrieve key data on the decode()
&gt; thread, that instead the decode() thread blocks, dispatches to the main
&gt; thread, and signals the decode() thread to continue once key data is
&gt; fetched.  If not, we have to be very, very careful to make all the accessors
&gt; in every CDMInstance subclass thread-safe.

Dispatching to the main thread and waiting for key updates would block the main thread for too long, we can be waiting upto 6 seconds for key data to be returned in YouTube tests for example.

&gt; 
&gt; (Alternatively, if we decide that the main thread is too crazy a place to do
&gt; this work, we can decide as a project to move all CDM access to a well known
&gt; thread, but we&apos;d still want to block/dispatch to get new keys.)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1488867</commentid>
    <comment_count>19</comment_count>
    <who name="Jer Noble">jer.noble</who>
    <bug_when>2018-12-18 06:41:37 -0800</bug_when>
    <thetext>(In reply to Charlie Turner from comment #18)
&gt; (In reply to Jer Noble from comment #16)
&gt; &gt; &gt; Of the two, I feel option 2. is the least invasive. However conceptually it
&gt; &gt; &gt; seems clearer for me that CDMInstance would be responsible for key
&gt; &gt; &gt; management and decode.
&gt; &gt; 
&gt; &gt; I&apos;m not sure I agree with your &quot;however&quot;.  The intent of these classes was
&gt; &gt; to be a communication mechanism to the actual CDM, not to become CDMs in and
&gt; &gt; of themselves.  Maybe we named them incorrectly.
&gt; 
&gt; The Widevine CDM API has a decrypt() method, so part of communication
&gt; mechanisms with this CDM is decryption. Same for Playready. I guess the APIs
&gt; for FPS / (Playready/Widevine) are sufficiently different that the confusion
&gt; came about as to what communication needs to be made available to clients of
&gt; a CDMInstance/CDMInstanceSession.
&gt; 
&gt; Currently for Widevine, the CDMInstanceWidevine registers callbacks on the
&gt; CDM handle for things like onMessage, onKeyStatusUpdate, etc, etc. We then
&gt; have a decryptor element in GStreamer that needs to call the CDM handle&apos;s
&gt; decrypt() method, after the CDMInstanceWidevine has done all the necessary
&gt; setup / updating on this handle. It makes no sense to me that we can&apos;t use a
&gt; method on CDMInstance to tell it to decrypt. That&apos;s not decrypting *in* the
&gt; CDMInstance class, it&apos;s allowing communicating the &quot;decrypt intent&quot; to the
&gt; underlying CDM.

Gotcha. I was still thinking about the CDMClearKeyInstance case.

&gt; Dispatching to the main thread and waiting for key updates would block the
&gt; main thread for too long, we can be waiting upto 6 seconds for key data to
&gt; be returned in YouTube tests for example.

Oh I wasn&apos;t suggesting that the work done on the main thread be synchronous!  I was imagining something like (pseudocode):

void DecoderThread::needKey(auto keyID)
{
    WTF::Semaphore sem;
    WTF::CompletionHandler&lt;void(auto keyData)&gt; callback = [&amp;] (auto keyData) {
        m_keyData = keyData;
        sem.signa();
    };

    callOnMainThread([callback = WTFMove(callback)] () mutable {
        m_cdmInstance.getKeyForKeyID(keyID, WTFMove(callback));
    });
    sem.wait();

    if (hasValidKey())
        decode();
}

void CDMInstanceWidevine::getKeyForKeyID(auto keyID, auto callback)
{
    m_keyNeeded = keyID;
    m_getKeyCallback = WTFMove(callback);
    startAskingForKey(keyID);
}

void CDMInstanceWidevine::keyWasAdded(auto keyID)
{
    if (keyID == m_keyNeeded &amp;&amp; m_getKeyCallback)
        m_getKeyCallback(keyForKeyID(keyID));
}</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1488868</commentid>
    <comment_count>20</comment_count>
    <who name="Jer Noble">jer.noble</who>
    <bug_when>2018-12-18 06:43:42 -0800</bug_when>
    <thetext>BTW, please don&apos;t let this side conversation interrupt reviewing this patch; it looks like this new patch is mostly confined to GStreamer code, so all my previous nits have been thoroughly picked.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1488894</commentid>
    <comment_count>21</comment_count>
    <who name="Xabier Rodríguez Calvar">calvaris</who>
    <bug_when>2018-12-18 08:07:45 -0800</bug_when>
    <thetext>(In reply to Jer Noble from comment #19)
&gt; &gt; Dispatching to the main thread and waiting for key updates would block the
&gt; &gt; main thread for too long, we can be waiting upto 6 seconds for key data to
&gt; &gt; be returned in YouTube tests for example.
&gt; 
&gt; Oh I wasn&apos;t suggesting that the work done on the main thread be synchronous!
&gt; I was imagining something like (pseudocode):
&gt; 
&gt; void DecoderThread::needKey(auto keyID)
&gt; {
&gt;     WTF::Semaphore sem;
&gt;     WTF::CompletionHandler&lt;void(auto keyData)&gt; callback = [&amp;] (auto keyData)
&gt; {
&gt;         m_keyData = keyData;
&gt;         sem.signa();
&gt;     };
&gt; 
&gt;     callOnMainThread([callback = WTFMove(callback)] () mutable {
&gt;         m_cdmInstance.getKeyForKeyID(keyID, WTFMove(callback));
&gt;     });
&gt;     sem.wait();
&gt; 
&gt;     if (hasValidKey())
&gt;         decode();
&gt; }
&gt; 
&gt; void CDMInstanceWidevine::getKeyForKeyID(auto keyID, auto callback)
&gt; {
&gt;     m_keyNeeded = keyID;
&gt;     m_getKeyCallback = WTFMove(callback);
&gt;     startAskingForKey(keyID);
&gt; }
&gt; 
&gt; void CDMInstanceWidevine::keyWasAdded(auto keyID)
&gt; {
&gt;     if (keyID == m_keyNeeded &amp;&amp; m_getKeyCallback)
&gt;         m_getKeyCallback(keyForKeyID(keyID));
&gt; }

Yes, we understood that, but in this case it has the same result, which is that the decryptor streaming thread always needs to call things on the main thread FOR EVERY FRAME, which is where the problem is. We can&apos;t do that for every frame, it&apos;s too much overhead. Actually we though of caching the key depending on the key id so that we don&apos;t have to defer to the main thread for every frame but then we have the problem of key renewal and the spec says very clearly that whenever we are about to decrypt, we need to check the key&apos;s validity which makes caching not spec compliant and of course very bug prone.

The only working solution is making the CDM instance thread safe regarding key retrieval. This would be enough for us.

And considering that we are adding key retrieval, having the decryption inside the CDM instance wouldn&apos;t be such an &quot;offense&quot;, specially because the spec says at:

https://www.w3.org/TR/encrypted-media/#attempt-to-decrypt

[...]
3.2 Let cdm be the CDM instance represented by media keys&apos;s cdm instance value.
[...]
4.5.1 Use the cdm to decrypt block using block key.
[...]

I think Charlie&apos;s impl gets everybody closer to the spec. I think we should agree on going this way and try to find a way that does not break you people.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1488941</commentid>
    <comment_count>22</comment_count>
    <who name="Jer Noble">jer.noble</who>
    <bug_when>2018-12-18 10:30:28 -0800</bug_when>
    <thetext>(In reply to Xabier Rodríguez Calvar from comment #21)
&gt; And considering that we are adding key retrieval, having the decryption
&gt; inside the CDM instance wouldn&apos;t be such an &quot;offense&quot;, specially because the
&gt; spec says at:
&gt; 
&gt; https://www.w3.org/TR/encrypted-media/#attempt-to-decrypt
&gt; 
&gt; [...]
&gt; 3.2 Let cdm be the CDM instance represented by media keys&apos;s cdm instance
&gt; value.

Yes, this is why I said that the WebCore class &quot;CDMInstance&quot; may be mis-named, since it implies that the class is the &quot;CDM instance&quot; the spec refers to, when it&apos;s really just the platform-specific part of the MediaKeysInstance object which communicates with the _actual_ CDM.

Additionally, the point of the MediaKeys and CDMInstance classes is for the page to communicate with the (actual) CDM; it&apos;s not necessary for the media player to use the same interface to communicate with the CDM.

The only reason I&apos;m pushing back on making broad changes to the CDMInstance.h abstract base class itself is that I don&apos;t want to encode platform-specific behavior in the interfaces that all platforms have to implement.  I&apos;m totally fine with GStreamer-specific interfaces between GStreamer platform objects.  And since Charlie&apos;s current patch is limited to only GStreamer-specific code, there&apos;s not much left to argue about. :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1489021</commentid>
    <comment_count>23</comment_count>
    <who name="Charlie Turner">cturner</who>
    <bug_when>2018-12-18 13:11:47 -0800</bug_when>
    <thetext>(In reply to Jer Noble from comment #19)
&gt; (In reply to Charlie Turner from comment #18)
&gt; &gt; (In reply to Jer Noble from comment #16)
&gt; &gt; &gt; &gt; Of the two, I feel option 2. is the least invasive. However conceptually it
&gt; &gt; &gt; &gt; seems clearer for me that CDMInstance would be responsible for key
&gt; &gt; &gt; &gt; management and decode.
&gt; &gt; &gt; 
&gt; &gt; &gt; I&apos;m not sure I agree with your &quot;however&quot;.  The intent of these classes was
&gt; &gt; &gt; to be a communication mechanism to the actual CDM, not to become CDMs in and
&gt; &gt; &gt; of themselves.  Maybe we named them incorrectly.
&gt; &gt; 
&gt; &gt; The Widevine CDM API has a decrypt() method, so part of communication
&gt; &gt; mechanisms with this CDM is decryption. Same for Playready. I guess the APIs
&gt; &gt; for FPS / (Playready/Widevine) are sufficiently different that the confusion
&gt; &gt; came about as to what communication needs to be made available to clients of
&gt; &gt; a CDMInstance/CDMInstanceSession.
&gt; &gt; 
&gt; &gt; Currently for Widevine, the CDMInstanceWidevine registers callbacks on the
&gt; &gt; CDM handle for things like onMessage, onKeyStatusUpdate, etc, etc. We then
&gt; &gt; have a decryptor element in GStreamer that needs to call the CDM handle&apos;s
&gt; &gt; decrypt() method, after the CDMInstanceWidevine has done all the necessary
&gt; &gt; setup / updating on this handle. It makes no sense to me that we can&apos;t use a
&gt; &gt; method on CDMInstance to tell it to decrypt. That&apos;s not decrypting *in* the
&gt; &gt; CDMInstance class, it&apos;s allowing communicating the &quot;decrypt intent&quot; to the
&gt; &gt; underlying CDM.
&gt; 
&gt; Gotcha. I was still thinking about the CDMClearKeyInstance case.

Yeah, it&apos;s awkward discussing designs for things we can&apos;t upload, I&apos;m sorry it&apos;s like this :)

&gt; &gt; Dispatching to the main thread and waiting for key updates would block the
&gt; &gt; main thread for too long, we can be waiting upto 6 seconds for key data to
&gt; &gt; be returned in YouTube tests for example.
&gt; 
&gt; Oh I wasn&apos;t suggesting that the work done on the main thread be synchronous!
&gt; I was imagining something like (pseudocode):

Ah, gotcha. Your next comment makes things much clearer (in terms of the original push-back to the changes on CDMInstance).

&gt; Additionally, the point of the MediaKeys and CDMInstance classes is for the page to communicate with the (actual) CDM; it&apos;s not necessary for the media player to use the same interface to communicate with the CDM.

I understand now why we had a mismatch on wanting decode() to be part of the CDMInstance API, of course the JS page has no interest in that. However, there a few curiosities now,

 - Already CDMInstance implementors like FairPlay have a number of extra methods to allow the MediaPlayer to tell the CDM things the page doesn&apos;t need to, including methods that appear to get some sort of FPS platform handle (like     AVContentKeySession* contentKeySession())
 - Why MediaPlayer::cdmInstanceAttached(CDMInstance&amp;) is defined as so. It seemed like that was there to give the MediaPlayer a handle to talk with the (actual) CDM.
 - Given the above, perhaps some class ProxyCDM (actual CDM) should be available from the CDMInstance, it might be worthwhile to define a common interface to talk with real CDMs, since that&apos;s what this patch is about.

At the moment, the way this patch is going, we&apos;d need on our CDMInstanceWidevine some sort of getKeyForKeyID() as you outlined and a getWidevineHandle() with which to decrypt. If you&apos;re not on-board with that, then we can go the route of having instance specific APIs as we&apos;ve discussed, and not touch the base class. This may be the best way forward, since it&apos;s not clear we can define a common interface that is useful to both FPS and (Widevine/Playready). We definitely have a naming problem at least! :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1489022</commentid>
    <comment_count>24</comment_count>
    <who name="Charlie Turner">cturner</who>
    <bug_when>2018-12-18 13:13:19 -0800</bug_when>
    <thetext>(In reply to Charlie Turner from comment #23)
&gt; If you&apos;re not on-board with that,

By this I mean, not on-board with a ProxyCDM idea.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1489091</commentid>
    <comment_count>25</comment_count>
    <who name="Jer Noble">jer.noble</who>
    <bug_when>2018-12-18 15:09:28 -0800</bug_when>
    <thetext>(In reply to Charlie Turner from comment #23)
&gt; I understand now why we had a mismatch on wanting decode() to be part of the
&gt; CDMInstance API, of course the JS page has no interest in that. However,
&gt; there a few curiosities now,
&gt; 
&gt;  - Already CDMInstance implementors like FairPlay have a number of extra
&gt; methods to allow the MediaPlayer to tell the CDM things the page doesn&apos;t
&gt; need to, including methods that appear to get some sort of FPS platform
&gt; handle (like     AVContentKeySession* contentKeySession())
&gt;  - Why MediaPlayer::cdmInstanceAttached(CDMInstance&amp;) is defined as so. It
&gt; seemed like that was there to give the MediaPlayer a handle to talk with the
&gt; (actual) CDM.
&gt;  - Given the above, perhaps some class ProxyCDM (actual CDM) should be
&gt; available from the CDMInstance, it might be worthwhile to define a common
&gt; interface to talk with real CDMs, since that&apos;s what this patch is about.

That sounds like a really promising refactoring! I&apos;m totally on board.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1489272</commentid>
    <comment_count>26</comment_count>
      <attachid>357229</attachid>
    <who name="Xabier Rodríguez Calvar">calvaris</who>
    <bug_when>2018-12-19 03:47:13 -0800</bug_when>
    <thetext>Comment on attachment 357229
Patch

There are some changes that you can do in follow ups, though some others like the cdminstance ref counting and maybe the consts that IMHO should be done here.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1495827</commentid>
    <comment_count>27</comment_count>
      <attachid>359479</attachid>
    <who name="Charlie Turner">cturner</who>
    <bug_when>2019-01-18 07:18:46 -0800</bug_when>
    <thetext>Created attachment 359479
Patch for landing</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1495828</commentid>
    <comment_count>28</comment_count>
      <attachid>359480</attachid>
    <who name="Charlie Turner">cturner</who>
    <bug_when>2019-01-18 07:20:26 -0800</bug_when>
    <thetext>Created attachment 359480
Patch for landing</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1495850</commentid>
    <comment_count>29</comment_count>
      <attachid>359480</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2019-01-18 07:59:27 -0800</bug_when>
    <thetext>Comment on attachment 359480
Patch for landing

Clearing flags on attachment: 359480

Committed r240148: &lt;https://trac.webkit.org/changeset/240148&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1495851</commentid>
    <comment_count>30</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2019-01-18 07:59:30 -0800</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>356374</attachid>
            <date>2018-12-03 04:10:07 -0800</date>
            <delta_ts>2018-12-03 10:21:24 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-192229-20181203121005.patch</filename>
            <type>text/plain</type>
            <size>83374</size>
            <attacher name="Charlie Turner">cturner</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjM4MTQzCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggOWVmM2M4NDU0YjJkNjVm
NjliM2ZhMDhhYjU3N2FkMTQyZjJmZDc0MC4uZjQwNWVmYmQ4MmE0ZDIzZjI3OTBmYzFiZDQ4YmI2
Nzk5MzE5NzFiYSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDkyIEBACisyMDE4LTExLTMwICBDaGFy
bGllIFR1cm5lciAgPGN0dXJuZXJAaWdhbGlhLmNvbT4KKworICAgICAgICBbRU1FXSBDcmVhdGUg
YW5kIG1vdmUgdG8gYSBkZWNyeXB0aW9uIEFQSSBpbXBsZW1lbnRlZCBieSBDRE1JbnN0YW5jZXMK
KyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE5MjIyOQor
CisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIE5vIG5ldyB0
ZXN0cywgdGhpcyBpcyBhIHJlZmFjdG9yaW5nLgorCisgICAgICAgICogcGxhdGZvcm0vR1N0cmVh
bWVyLmNtYWtlOiBSZW1vdmUgdGhlIENsZWFyS2V5IGRlY3J5cHRvciwgdGhpcworICAgICAgICBw
YXRjaCBtb3ZlcyB0byBhIHNpbmdsZS1kZWNyeXB0b3IgYXJjaGl0ZWN0dXJlLgorICAgICAgICAq
IHBsYXRmb3JtL2VuY3J5cHRlZG1lZGlhL0NETUluc3RhbmNlLmg6IEludHJvZHVjZSBuZXcgYWJz
dHJhY3Rpb24KKyAgICAgICAgZm9yIGhhbmRsaW5nIGRlY3J5cHRpb24gYmVoaW5kIHRoZSBDRE1J
bnN0YW5jZSBpbnRlcmZhY2UuCisgICAgICAgIChXZWJDb3JlOjpDRE1JbnN0YW5jZTo6U3ViU2Ft
cGxlOjpTdWJTYW1wbGUpOiBDRE1zIGNhbiBwZXJmb3JtCisgICAgICAgIGVmZmljaWVudCBkZWNy
eXB0aW9uIG9mIHN1YnNhbXBsZSBlbmNyeXB0ZWQgZGF0YSB3aXRob3V0IGhhdmluZyB0bworICAg
ICAgICBwZXJmb3JtIGV4dHJhIGNvcGllcy4gVGhlcmVmb3JlIGl0IG1ha2VzIHNlbnNlIHRvIGxl
dCB0aGUgQ0RNCisgICAgICAgIGhhbmRsZSBzdWJzYW1wbGVzLCByYXRoZXIgdGhhbiB0aGUgZGVj
cnlwdG9ycy4gRm9yIENsZWFyS2V5IHRoaXMKKyAgICAgICAgZG9lc24ndCBoZWxwLCBidXQgZm9y
IG90aGVyIHN5c3RlbXMgaXQgY2FuLgorICAgICAgICAoV2ViQ29yZTo6Q0RNSW5zdGFuY2U6OkRl
Y3J5cHRpb25Db25maWc6OmNyZWF0ZUNlbmNDb25maWcpOgorICAgICAgICAoV2ViQ29yZTo6Q0RN
SW5zdGFuY2U6OkRlY3J5cHRpb25Db25maWc6OkRlY3J5cHRpb25Db25maWcpOgorICAgICAgICBJ
bnRyb2R1Y2UgZGVjcnlwdGlvbiBjb25maWd1cmF0aW9uIGhlbHBlciBjbGFzcy4KKyAgICAgICAg
KFdlYkNvcmU6OkNETUluc3RhbmNlOjpEZWNyeXB0aW9uQ29uZmlnOjptb2RlIGNvbnN0KToKKyAg
ICAgICAgKFdlYkNvcmU6OkNETUluc3RhbmNlOjpEZWNyeXB0aW9uQ29uZmlnOjppdik6CisgICAg
ICAgIChXZWJDb3JlOjpDRE1JbnN0YW5jZTo6RGVjcnlwdGlvbkNvbmZpZzo6a2V5SUQpOgorICAg
ICAgICAoV2ViQ29yZTo6Q0RNSW5zdGFuY2U6OkRlY3J5cHRpb25Db25maWc6OmlzU3ViU2FtcGxl
IGNvbnN0KToKKyAgICAgICAgKFdlYkNvcmU6OkNETUluc3RhbmNlOjpEZWNyeXB0aW9uQ29uZmln
OjpzdWJTYW1wbGVzKToKKyAgICAgICAgKiBwbGF0Zm9ybS9lbmNyeXB0ZWRtZWRpYS9DRE1JbnN0
YW5jZVNlc3Npb24uaDoKKyAgICAgICAgKFdlYkNvcmU6OkNETUluc3RhbmNlU2Vzc2lvbjo6ZGVj
cnlwdCk6IEludHJvZHVjZSBuZXcgdmlydHVhbAorICAgICAgICBtZXRob2Qgb2YgZGVjcnlwdGlu
Zy4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBmYWlsdXJlCisgICAgICAgIHNv
IHRoYXQgb3RoZXIgcG9ydHMgZG9uJ3QgaGF2ZSB0byBiZSBjaGFuZ2VkLgorICAgICAgICAqIHBs
YXRmb3JtL2VuY3J5cHRlZG1lZGlhL2NsZWFya2V5L0NETUNsZWFyS2V5LmNwcDogU3RhdGljCisg
ICAgICAgIHZhcmlhYmxlcyB3ZXJlIGNsZWFuZWQgdXAsIGFuZCBtYW55IHVzZWxlc3MgY29tbWVu
dHMgdGhhdCBvbmx5CisgICAgICAgIHJlaXRlcmF0aW5nIEMrKyBpbiBFbmdsaXNoIHdlcmUgcmVt
b3ZlZCwgYW5kIHRoZSBnbG9yaWZpZWQgZ2xvYmFsCisgICAgICAgIHN0YXRlIHZpYSBhIHNpbmds
ZXRvbiBjbGFzcyB3YXMgZWxpbWluYXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OnBhcnNlTGljZW5z
ZUZvcm1hdCk6IFVwZGF0ZSBzaWduYXR1cmUsIHNpbmNlIHRoZSBLZXkKKyAgICAgICAgc3RydWN0
IHdhcyBtb3ZlZCB0byB0aGUgc2Vzc2lvbiBvYmplY3QsIHdoaWNoIHRoZSBvbmx5IHBsYWNlIGl0
IGlzCisgICAgICAgIG5vdyB1c2VkLgorICAgICAgICAoV2ViQ29yZTo6a2V5SURUb0hleFN0cmlu
Zyk6IEhlbHBlciBtZXRob2QgdG8gcHJldHR5LXByaW50IGJpbmFyeQorICAgICAgICBzdHJpbmdz
LCB1c2VkIGZvciBLZXlJRHMsIHJlYWxseSBhbiBhYnN0cmFjdGlvbiBmb3Iga2V5IGlkcyB3aXRo
IGEKKyAgICAgICAgc3RyaW5nKCkgb3BlcmF0b3Igc2hvdWxkIGJlIGludHJvZHVjZWQgaW4gdGhl
IGZ1dHVyZS4KKyAgICAgICAgKFdlYkNvcmU6OkNETUluc3RhbmNlQ2xlYXJLZXk6OmNyZWF0ZVNl
c3Npb24pOiBBZGp1c3QgdG8ga2VlcCB0YWNrCisgICAgICAgIG9mIHdoaWNoIHNlc3Npb25zIGhh
dmUgYmVlbiBjcmVhdGVkLiBUaGlzIGlzIHVzZWQgdG8gbG9vayB1cCBhbgorICAgICAgICBhcHBy
b3ByaWF0ZSBzZXNzaW9uIGZvciBkZWNyeXB0aW9uLgorICAgICAgICAoV2ViQ29yZTo6Q0RNSW5z
dGFuY2VDbGVhcktleTo6ZGVjcnlwdCk6IFNlZSBhYm92ZS4KKyAgICAgICAgKFdlYkNvcmU6OkNE
TUluc3RhbmNlQ2xlYXJLZXk6OnNlc3Npb25Gb3JLZXlJRCBjb25zdCk6IExvb2t1cCBhCisgICAg
ICAgIHNlc3Npb24gY29udGFpbmluZyBhIGdpdmVuIGtleSBJRC4KKyAgICAgICAgKFdlYkNvcmU6
OkNETUluc3RhbmNlU2Vzc2lvbkNsZWFyS2V5OjpDRE1JbnN0YW5jZVNlc3Npb25DbGVhcktleSk6
CisgICAgICAgIEhvbGQgYSByZWZlcmVuY2UgdG8gdGhlIHBhcmVudCBpbnN0YW5jZSwgdGhpcyBt
YXkgYmUgdXNlZnVsIGluIHRoZQorICAgICAgICBmdXR1cmUsIGFuZCBtb3ZlcyB1cyBtb3JlIGlu
bGluZSB3aXRoIHRoZSBvd25pbmcgZ3JhcGggdXNlZCBieSBGUFMuCisgICAgICAgIChXZWJDb3Jl
OjpDRE1JbnN0YW5jZVNlc3Npb25DbGVhcktleTo6cmVxdWVzdExpY2Vuc2UpOiBTZXQgb3VyCisg
ICAgICAgIHNlc3Npb24gaWQgaW4gdGhlIHNlc3Npb24gaW5zdGFuY2UuCisgICAgICAgIChXZWJD
b3JlOjpDRE1JbnN0YW5jZVNlc3Npb25DbGVhcktleTo6dXBkYXRlTGljZW5zZSk6IFVwZGF0ZWQg
dG8KKyAgICAgICAgYXNzZXJ0IHdlIGFyZSBpbnZva2VkIGFzIHRoZSByaWdodCBzZXNzaW9uLCBh
bmQgdG8gdXNlIHRoZSBuZXcKKyAgICAgICAgbV9rZXlzIG1lbWJlciB0aGF0IGtlZXBzIHRyYWNr
IG9mIHRoZSBrZXkgaWRzIGFzc29jaWF0ZWQgd2l0aCB0aGlzCisgICAgICAgIHNlc3Npb24uIEFs
c28gcmVtb3ZlIG1vcmUgQysrLWluLUVuZ2xpc2ggY29tbWVudHMuLi4KKyAgICAgICAgKFdlYkNv
cmU6OkNETUluc3RhbmNlU2Vzc2lvbkNsZWFyS2V5Ojpsb2FkU2Vzc2lvbik6IERpdHRvLgorICAg
ICAgICAoV2ViQ29yZTo6Q0RNSW5zdGFuY2VTZXNzaW9uQ2xlYXJLZXk6OnJlbW92ZVNlc3Npb25E
YXRhKTogRGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpDRE1JbnN0YW5jZVNlc3Npb25DbGVhcktl
eTo6ZGVjcnlwdCk6IFJlYWwgZGVjcnlwdGlvbgorICAgICAgICBsb2dpYyBtb3ZlZCBoZXJlLCBh
bmQgcmVmYWN0b3JlZCBoZWF2aWx5LgorICAgICAgICAoV2ViQ29yZTo6Q0RNSW5zdGFuY2VTZXNz
aW9uQ2xlYXJLZXk6OmtleUlEcyk6IFJldHVybiBhIHZlY3RvciBvZgorICAgICAgICBhbGwga25v
d24ga2V5IElEcyAqaW4gdGhpcyBzZXNzaW9uKiByYXRoZXIgdGhhbiBnbG9iYWxseS4KKyAgICAg
ICAgKiBwbGF0Zm9ybS9lbmNyeXB0ZWRtZWRpYS9jbGVhcmtleS9DRE1DbGVhcktleS5oOiBBZGp1
c3RlZCBmb3IgbmV3CisgICAgICAgIGFic3RyYWN0aW9ucy4KKyAgICAgICAgKiBwbGF0Zm9ybS9n
cmFwaGljcy9nc3RyZWFtZXIvR1N0cmVhbWVyQ29tbW9uLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6
OmluaXRpYWxpemVHU3RyZWFtZXJBbmRSZWdpc3RlcldlYktpdEVsZW1lbnRzKTogVXNlCisgICAg
ICAgIHdlYmtpdGNlbmMgYXMgb3VyIGRlY3J5cHRvciwgcmF0aGVyIHRoYW4gdGhlIG5vdyBkZWxl
dGVkCisgICAgICAgIHdlYmtpdGNsZWFya2V5LgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNz
L2dzdHJlYW1lci9HU3RyZWFtZXJDb21tb24uaDoKKyAgICAgICAgKFdlYkNvcmU6OkdzdE1hcHBl
ZEJ1ZmZlcjo6c2hhcmVkQnVmZmVyIGNvbnN0KTogQWRkIGEgbmV3IHV0aWxpdHkKKyAgICAgICAg
bWV0aG9kIHRvIGNvbnZlcnQgYSBtYXBwZWQgYnVmZmVyIGludG8gYSBTaGFyZWRCdWZmZXIuCisg
ICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvZ3N0cmVhbWVyL2VtZS9XZWJLaXRDbGVhcktleURl
Y3J5cHRvckdTdHJlYW1lci5jcHA6IFJlbW92ZWQuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhp
Y3MvZ3N0cmVhbWVyL2VtZS9XZWJLaXRDbGVhcktleURlY3J5cHRvckdTdHJlYW1lci5oOiBSZW1v
dmVkLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2dzdHJlYW1lci9lbWUvV2ViS2l0Q29t
bW9uRW5jcnlwdGlvbkRlY3J5cHRvckdTdHJlYW1lci5jcHA6CisgICAgICAgICh3ZWJraXRfbWVk
aWFfY29tbW9uX2VuY3J5cHRpb25fZGVjcnlwdF9jbGFzc19pbml0KTogVXNlIHRoZSBuZXcKKyAg
ICAgICAgQ0RNSW5zdGFuY2UgQVBJLCBhbmQgcmVuYW1lIHRoZSBsb25nIG1ldGhvZCBuYW1lcywg
c2luY2Ugd2UgYXJlIGluCisgICAgICAgIEMrKyBhbmQgZG9uJ3QgbmVlZCBuYW1lc3BhY2luZyBp
biBtZXRob2QgbmFtZXMuCisgICAgICAgIChmaW5hbGl6ZSk6CisgICAgICAgICh0cmFuc2Zvcm1D
YXBzKToKKyAgICAgICAgKHBvcHVsYXRlU3ViU2FtcGxlcyk6CisgICAgICAgICh0cmFuc2Zvcm1J
blBsYWNlKToKKyAgICAgICAgKHNpbmtFdmVudEhhbmRsZXIpOgorICAgICAgICAocXVlcnlIYW5k
bGVyKToKKyAgICAgICAgKGNoYW5nZVN0YXRlKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGlj
cy9nc3RyZWFtZXIvZW1lL1dlYktpdENvbW1vbkVuY3J5cHRpb25EZWNyeXB0b3JHU3RyZWFtZXIu
aDoKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9nc3RyZWFtZXIvbXNlL01lZGlhUGxheWVy
UHJpdmF0ZUdTdHJlYW1lck1TRS5jcHA6CisgICAgICAgIGF0dGVtcHRUb0RlY3J5cHRXaXRoSW5z
dGFuY2UgaXMgbm8gbG9uZ2VyIG5lZWRlZCwgc2luY2Uga2V5CisgICAgICAgIG1hbmFnZW1lbnQg
aXMgaGFuZGxlZCBpbiBDRE1JbnN0YW5jZSBub3cuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhp
Y3MvZ3N0cmVhbWVyL21zZS9NZWRpYVBsYXllclByaXZhdGVHU3RyZWFtZXJNU0UuaDogRGl0dG8u
CisKIDIwMTgtMTEtMTMgIFRpbW90aHkgSGF0Y2hlciAgPHRpbW90aHlAYXBwbGUuY29tPgogCiAg
ICAgICAgIFRyZWF0IHN1cHBvcnRlZC1jb2xvci1zY2hlbWVzIGFzIHRoZSBzZWNvbmQgaGlnaGVz
dCBwcmlvcml0eSBwcm9wZXJ0eS4KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L0dTdHJlYW1lci5jbWFrZSBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL0dTdHJlYW1lci5jbWFr
ZQppbmRleCBkNTM1NDRhN2RjN2M4MzYyOTljMDBhZDk1M2EwMzQwMWZmNjIwZjA2Li45MTFiNmJj
MWY2Nzk4NTI3NjJlNzcxZmUzZWQ1MWVlYTBhZTBiZGFhIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9HU3RyZWFtZXIuY21ha2UKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vR1N0cmVhbWVyLmNtYWtlCkBAIC0yMSw3ICsyMSw2IEBAIGlmIChFTkFCTEVfVklERU8gT1Ig
RU5BQkxFX1dFQl9BVURJTykKICAgICAgICAgcGxhdGZvcm0vZ3JhcGhpY3MvZ3N0cmVhbWVyL1Zp
ZGVvVHJhY2tQcml2YXRlR1N0cmVhbWVyLmNwcAogICAgICAgICBwbGF0Zm9ybS9ncmFwaGljcy9n
c3RyZWFtZXIvV2ViS2l0V2ViU291cmNlR1N0cmVhbWVyLmNwcAogCi0gICAgICAgIHBsYXRmb3Jt
L2dyYXBoaWNzL2dzdHJlYW1lci9lbWUvV2ViS2l0Q2xlYXJLZXlEZWNyeXB0b3JHU3RyZWFtZXIu
Y3BwCiAgICAgICAgIHBsYXRmb3JtL2dyYXBoaWNzL2dzdHJlYW1lci9lbWUvV2ViS2l0Q29tbW9u
RW5jcnlwdGlvbkRlY3J5cHRvckdTdHJlYW1lci5jcHAKIAogICAgICAgICBwbGF0Zm9ybS9ncmFw
aGljcy9nc3RyZWFtZXIvbXNlL0FwcGVuZFBpcGVsaW5lLmNwcApkaWZmIC0tZ2l0IGEvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZW5jcnlwdGVkbWVkaWEvQ0RNSW5zdGFuY2UuaCBiL1NvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL2VuY3J5cHRlZG1lZGlhL0NETUluc3RhbmNlLmgKaW5kZXggMDRlOGIz
NWMzNzA5NTlmZWY0MTBmMTg4N2UxMzllZjZlNDEyMjMwYS4uZWQxYjQ1MmRlM2FhYjA3ZDJlZDk4
MjE4MDNiNmQ3MDM1NWM0MmZmOSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
ZW5jcnlwdGVkbWVkaWEvQ0RNSW5zdGFuY2UuaAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9lbmNyeXB0ZWRtZWRpYS9DRE1JbnN0YW5jZS5oCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVk
ZSAiQ0RNS2V5U3RhdHVzLmgiCiAjaW5jbHVkZSAiQ0RNTWVzc2FnZVR5cGUuaCIKICNpbmNsdWRl
ICJDRE1TZXNzaW9uVHlwZS5oIgorI2luY2x1ZGUgIlNoYXJlZEJ1ZmZlci5oIgogI2luY2x1ZGUg
PHV0aWxpdHk+CiAjaW5jbHVkZSA8d3RmL0ZvcndhcmQuaD4KICNpbmNsdWRlIDx3dGYvT3B0aW9u
YWwuaD4KQEAgLTYwLDYgKzYxLDQ0IEBAIHB1YmxpYzoKICAgICAgICAgU3VjY2VlZGVkLAogICAg
IH07CiAKKyAgICBlbnVtIGNsYXNzIEVuY3J5cHRpb25Nb2RlIHsKKyAgICAgICAgVW5lbmNyeXB0
ZWQsCisgICAgICAgIENlbmMsCisgICAgICAgIENiY3MsCisgICAgfTsKKworICAgIHN0cnVjdCBT
dWJTYW1wbGUgeworICAgICAgICBTdWJTYW1wbGUoKQorICAgICAgICAgICAgOiBjbGVhckJ5dGVz
KDApLCBjaXBoZXJCeXRlcygwKSB7IH0KKyAgICAgICAgU3ViU2FtcGxlKHVpbnQzMl90IGNsZWFy
Qnl0ZXMsIHVpbnQzMl90IGNpcGhlckJ5dGVzKQorICAgICAgICAgICAgOiBjbGVhckJ5dGVzKGNs
ZWFyQnl0ZXMpLCBjaXBoZXJCeXRlcyhjaXBoZXJCeXRlcykgeyB9CisgICAgICAgIHVpbnQzMl90
IGNsZWFyQnl0ZXM7CisgICAgICAgIHVpbnQzMl90IGNpcGhlckJ5dGVzOworICAgIH07CisKKyAg
ICBjbGFzcyBEZWNyeXB0aW9uQ29uZmlnIDogcHVibGljIFJlZkNvdW50ZWQ8RGVjcnlwdGlvbkNv
bmZpZz4geworICAgIHB1YmxpYzoKKyAgICAgICAgc3RhdGljIFJlZjxEZWNyeXB0aW9uQ29uZmln
PiBjcmVhdGVDZW5jQ29uZmlnKFJlZjxTaGFyZWRCdWZmZXI+JiYgaXYsIFJlZjxTaGFyZWRCdWZm
ZXI+JiYga2V5SWQsIFZlY3RvcjxTdWJTYW1wbGU+JiYgc3ViU2FtcGxlcykKKyAgICAgICAgewor
ICAgICAgICAgICAgcmV0dXJuIGFkb3B0UmVmKCpuZXcgRGVjcnlwdGlvbkNvbmZpZyhFbmNyeXB0
aW9uTW9kZTo6Q2VuYywgV1RGTW92ZShpdiksIFdURk1vdmUoa2V5SWQpLCBXVEZNb3ZlKHN1YlNh
bXBsZXMpKSk7CisgICAgICAgIH0KKworICAgICAgICBEZWNyeXB0aW9uQ29uZmlnKGNvbnN0IEVu
Y3J5cHRpb25Nb2RlJiBlbmNyeXB0aW9uTW9kZSwgUmVmPFNoYXJlZEJ1ZmZlcj4mJiBpdiwgUmVm
PFNoYXJlZEJ1ZmZlcj4mJiBrZXlJZCwgVmVjdG9yPFN1YlNhbXBsZT4mJiBzdWJTYW1wbGVzKQor
ICAgICAgICAgICAgOiBtX2VuY3J5cHRpb25Nb2RlKGVuY3J5cHRpb25Nb2RlKSwgbV9pdihXVEZN
b3ZlKGl2KSksIG1fa2V5SWQoV1RGTW92ZShrZXlJZCkpLCBtX3N1YlNhbXBsZXMoV1RGTW92ZShz
dWJTYW1wbGVzKSkgeyB9CisKKyAgICAgICAgRW5jcnlwdGlvbk1vZGUgbW9kZSgpIGNvbnN0IHsg
cmV0dXJuIG1fZW5jcnlwdGlvbk1vZGU7IH0KKyAgICAgICAgUmVmPFNoYXJlZEJ1ZmZlcj4mIGl2
KCkgeyByZXR1cm4gbV9pdjsgfQorICAgICAgICBSZWY8U2hhcmVkQnVmZmVyPiYga2V5SUQoKSB7
IHJldHVybiBtX2tleUlkOyB9CisgICAgICAgIGJvb2wgaXNTdWJTYW1wbGUoKSBjb25zdCB7IHJl
dHVybiBtX3N1YlNhbXBsZXMuc2l6ZSgpOyB9CisgICAgICAgIFZlY3RvcjxTdWJTYW1wbGU+JiBz
dWJTYW1wbGVzKCkgeyByZXR1cm4gbV9zdWJTYW1wbGVzOyB9CisKKyAgICBwcml2YXRlOgorICAg
ICAgICBFbmNyeXB0aW9uTW9kZSBtX2VuY3J5cHRpb25Nb2RlOworICAgICAgICBSZWY8U2hhcmVk
QnVmZmVyPiBtX2l2OworICAgICAgICBSZWY8U2hhcmVkQnVmZmVyPiBtX2tleUlkOworICAgICAg
ICBWZWN0b3I8U3ViU2FtcGxlPiBtX3N1YlNhbXBsZXM7CisgICAgfTsKKwogICAgIHZpcnR1YWwg
U3VjY2Vzc1ZhbHVlIGluaXRpYWxpemVXaXRoQ29uZmlndXJhdGlvbihjb25zdCBDRE1LZXlTeXN0
ZW1Db25maWd1cmF0aW9uJikgPSAwOwogICAgIHZpcnR1YWwgU3VjY2Vzc1ZhbHVlIHNldERpc3Rp
bmN0aXZlSWRlbnRpZmllcnNBbGxvd2VkKGJvb2wpID0gMDsKICAgICB2aXJ0dWFsIFN1Y2Nlc3NW
YWx1ZSBzZXRQZXJzaXN0ZW50U3RhdGVBbGxvd2VkKGJvb2wpID0gMDsKQEAgLTY3LDYgKzEwNiw3
IEBAIHB1YmxpYzoKICAgICB2aXJ0dWFsIFN1Y2Nlc3NWYWx1ZSBzZXRTdG9yYWdlRGlyZWN0b3J5
KGNvbnN0IFN0cmluZyYpID0gMDsKICAgICB2aXJ0dWFsIGNvbnN0IFN0cmluZyYga2V5U3lzdGVt
KCkgY29uc3QgPSAwOwogICAgIHZpcnR1YWwgUmVmUHRyPENETUluc3RhbmNlU2Vzc2lvbj4gY3Jl
YXRlU2Vzc2lvbigpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgZGVjcnlwdChSZWY8RGVjcnlwdGlv
bkNvbmZpZz4mJiwgdWludDhfdCosIHVpbnQzMl90KSB7IHJldHVybiBmYWxzZTsgfQogCiAgICAg
ZW51bSBjbGFzcyBIRENQU3RhdHVzIHsKICAgICAgICAgVW5rbm93biwKZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2VuY3J5cHRlZG1lZGlhL0NETUluc3RhbmNlU2Vzc2lvbi5o
IGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZW5jcnlwdGVkbWVkaWEvQ0RNSW5zdGFuY2VTZXNz
aW9uLmgKaW5kZXggYWE0OGYzNzM0MjZkZThmYWRjOWQzMDAxZTQwMzNlYzEzOWNkYmY5OS4uYTEw
YTNkZTcwZTUwYmY1M2ViMjQyNGY3OGQxMWZmYTcyZDkwYjFiMiAxMDA2NDQKLS0tIGEvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZW5jcnlwdGVkbWVkaWEvQ0RNSW5zdGFuY2VTZXNzaW9uLmgKKysr
IGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZW5jcnlwdGVkbWVkaWEvQ0RNSW5zdGFuY2VTZXNz
aW9uLmgKQEAgLTI4LDYgKzI4LDcgQEAKICNpZiBFTkFCTEUoRU5DUllQVEVEX01FRElBKQogCiAj
aW5jbHVkZSAiQ0RNS2V5U3RhdHVzLmgiCisjaW5jbHVkZSAiQ0RNSW5zdGFuY2UuaCIKICNpbmNs
dWRlICJDRE1NZXNzYWdlVHlwZS5oIgogI2luY2x1ZGUgIkNETVNlc3Npb25UeXBlLmgiCiAjaW5j
bHVkZSA8d3RmL1JlZkNvdW50ZWQuaD4KQEAgLTkwLDYgKzkxLDggQEAgcHVibGljOgogICAgIHZp
cnR1YWwgdm9pZCByZW1vdmVTZXNzaW9uRGF0YShjb25zdCBTdHJpbmcmIHNlc3Npb25JZCwgTGlj
ZW5zZVR5cGUsIFJlbW92ZVNlc3Npb25EYXRhQ2FsbGJhY2smJikgPSAwOwogCiAgICAgdmlydHVh
bCB2b2lkIHN0b3JlUmVjb3JkT2ZLZXlVc2FnZShjb25zdCBTdHJpbmcmIHNlc3Npb25JZCkgPSAw
OworCisgICAgdmlydHVhbCBib29sIGRlY3J5cHQoUmVmPENETUluc3RhbmNlOjpEZWNyeXB0aW9u
Q29uZmlnPiYmLCB1aW50OF90KiwgdWludDMyX3QpIHsgcmV0dXJuIGZhbHNlOyB9CiB9OwogCiB9
IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9lbmNyeXB0ZWRtZWRpYS9jbGVhcmtleS9DRE1DbGVhcktleS5jcHAgYi9Tb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9lbmNyeXB0ZWRtZWRpYS9jbGVhcmtleS9DRE1DbGVhcktleS5jcHAKaW5kZXgg
NWE3ZmY4NjMxMjA2ZDg1ZDgyYTJjMDQwODBlYWUwNmI3NzVjZjJlMi4uMGZjZTZhZDg2NDRmNDY4
MTBjNDczMDJkNzRjMWZhOGUzNGE2YWVkYiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vZW5jcnlwdGVkbWVkaWEvY2xlYXJrZXkvQ0RNQ2xlYXJLZXkuY3BwCisrKyBiL1NvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL2VuY3J5cHRlZG1lZGlhL2NsZWFya2V5L0NETUNsZWFyS2V5LmNw
cApAQCAtMzQsNDEgKzM0LDI0IEBACiAjaW5jbHVkZSAiQ0RNS2V5U3lzdGVtQ29uZmlndXJhdGlv
bi5oIgogI2luY2x1ZGUgIkNETVJlc3RyaWN0aW9ucy5oIgogI2luY2x1ZGUgIkNETVNlc3Npb25U
eXBlLmgiCisjaW5jbHVkZSAiTG9nZ2luZy5oIgogI2luY2x1ZGUgIlNoYXJlZEJ1ZmZlci5oIgor
I2luY2x1ZGUgPGdjcnlwdC5oPgorI2luY2x1ZGUgPHd0Zi9BbGdvcml0aG1zLmg+CiAjaW5jbHVk
ZSA8d3RmL0pTT05WYWx1ZXMuaD4KICNpbmNsdWRlIDx3dGYvTWFpblRocmVhZC5oPgogI2luY2x1
ZGUgPHd0Zi9OZXZlckRlc3Ryb3llZC5oPgogI2luY2x1ZGUgPHd0Zi90ZXh0L0Jhc2U2NC5oPgor
I2luY2x1ZGUgPHd0Zi90ZXh0L1N0cmluZ0J1aWxkZXIuaD4KIAogbmFtZXNwYWNlIFdlYkNvcmUg
ewogCiAvLyBDbGVhcktleSBDRU5DIFN5c3RlbUlELgogLy8gaHR0cHM6Ly93d3cudzMub3JnL1RS
L2VtZS1pbml0ZGF0YS1jZW5jLyNjb21tb24tc3lzdGVtCi1jb25zdCB1aW50OF90IGNsZWFyS2V5
Q2VuY1N5c3RlbUlkW10gPSB7IDB4MTAsIDB4NzcsIDB4ZWYsIDB4ZWMsIDB4YzAsIDB4YjIsIDB4
NGQsIDB4MDIsIDB4YWMsIDB4ZTMsIDB4M2MsIDB4MWUsIDB4NTIsIDB4ZTIsIDB4ZmIsIDB4NGIg
fTsKLWNvbnN0IHVuc2lnbmVkIGNsZWFyS2V5Q2VuY1N5c3RlbUlkU2l6ZSA9IHNpemVvZihjbGVh
cktleUNlbmNTeXN0ZW1JZCk7Ci1jb25zdCB1bnNpZ25lZCBrZXlJZFNpemUgPSAxNjsKLQotY2xh
c3MgQ2xlYXJLZXlTdGF0ZSB7Ci0gICAgdXNpbmcgS2V5U3RvcmUgPSBIYXNoTWFwPFN0cmluZywg
VmVjdG9yPENETUluc3RhbmNlQ2xlYXJLZXk6OktleT4+OwotCi1wdWJsaWM6Ci0gICAgc3RhdGlj
IENsZWFyS2V5U3RhdGUmIHNpbmdsZXRvbigpOwotCi0gICAgS2V5U3RvcmUmIGtleXMoKSB7IHJl
dHVybiBtX2tleXM7IH0KLQotcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgTmV2ZXJEZXN0cm95
ZWQ8Q2xlYXJLZXlTdGF0ZT47Ci0gICAgQ2xlYXJLZXlTdGF0ZSgpOwotICAgIEtleVN0b3JlIG1f
a2V5czsKLX07Ci0KLUNsZWFyS2V5U3RhdGUmIENsZWFyS2V5U3RhdGU6OnNpbmdsZXRvbigpCi17
Ci0gICAgc3RhdGljIE5ldmVyRGVzdHJveWVkPENsZWFyS2V5U3RhdGU+IHNfc3RhdGU7Ci0gICAg
cmV0dXJuIHNfc3RhdGU7Ci19Ci0KLUNsZWFyS2V5U3RhdGU6OkNsZWFyS2V5U3RhdGUoKSA9IGRl
ZmF1bHQ7CitzdGF0aWMgY29uc3QgdWludDhfdCBjbGVhcktleUNlbmNTeXN0ZW1JZFtdID0geyAw
eDEwLCAweDc3LCAweGVmLCAweGVjLCAweGMwLCAweGIyLCAweDRkLCAweDAyLCAweGFjLCAweGUz
LCAweDNjLCAweDFlLCAweDUyLCAweGUyLCAweGZiLCAweDRiIH07CitzdGF0aWMgY29uc3QgdW5z
aWduZWQgY2xlYXJLZXlDZW5jU3lzdGVtSWRTaXplID0gc2l6ZW9mKGNsZWFyS2V5Q2VuY1N5c3Rl
bUlkKTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBrZXlJZFNpemUgPSAxNjsKK3N0YXRpYyBjb25z
dCB1bnNpZ25lZCBpdlNpemUgPSAxNjsKIAogc3RhdGljIFJlZlB0cjxKU09OOjpPYmplY3Q+IHBh
cnNlSlNPTk9iamVjdChjb25zdCBTaGFyZWRCdWZmZXImIGJ1ZmZlcikKIHsKQEAgLTg3LDcgKzcw
LDcgQEAgc3RhdGljIFJlZlB0cjxKU09OOjpPYmplY3Q+IHBhcnNlSlNPTk9iamVjdChjb25zdCBT
aGFyZWRCdWZmZXImIGJ1ZmZlcikKICAgICByZXR1cm4gb2JqZWN0OwogfQogCi1zdGF0aWMgc3Rk
OjpvcHRpb25hbDxWZWN0b3I8Q0RNSW5zdGFuY2VDbGVhcktleTo6S2V5Pj4gcGFyc2VMaWNlbnNl
Rm9ybWF0KGNvbnN0IEpTT046Ok9iamVjdCYgcm9vdCkKK3N0YXRpYyBzdGQ6Om9wdGlvbmFsPFZl
Y3RvcjxDRE1JbnN0YW5jZVNlc3Npb25DbGVhcktleTo6S2V5Pj4gcGFyc2VMaWNlbnNlRm9ybWF0
KGNvbnN0IEpTT046Ok9iamVjdCYgcm9vdCkKIHsKICAgICAvLyBJZiB0aGUgJ2tleXMnIGtleSBp
cyBwcmVzZW50IGluIHRoZSByb290IG9iamVjdCwgcGFyc2UgdGhlIEpTT04gZnVydGhlcgogICAg
IC8vIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkICdsaWNlbnNlJyBmb3JtYXQuCkBAIC0xMDAs
NyArODMsNyBAQCBzdGF0aWMgc3RkOjpvcHRpb25hbDxWZWN0b3I8Q0RNSW5zdGFuY2VDbGVhcktl
eTo6S2V5Pj4gcGFyc2VMaWNlbnNlRm9ybWF0KGNvbnN0CiAgICAgaWYgKCFpdC0+dmFsdWUtPmFz
QXJyYXkoa2V5c0FycmF5KSkKICAgICAgICAgcmV0dXJuIHN0ZDo6bnVsbG9wdDsKIAotICAgIFZl
Y3RvcjxDRE1JbnN0YW5jZUNsZWFyS2V5OjpLZXk+IGRlY29kZWRLZXlzOworICAgIFZlY3RvcjxD
RE1JbnN0YW5jZVNlc3Npb25DbGVhcktleTo6S2V5PiBkZWNvZGVkS2V5czsKICAgICBib29sIHZh
bGlkRm9ybWF0ID0gc3RkOjphbGxfb2Yoa2V5c0FycmF5LT5iZWdpbigpLCBrZXlzQXJyYXktPmVu
ZCgpLAogICAgICAgICBbJmRlY29kZWRLZXlzXSAoY29uc3QgYXV0byYgdmFsdWUpIHsKICAgICAg
ICAgICAgIFJlZlB0cjxKU09OOjpPYmplY3Q+IGtleU9iamVjdDsKQEAgLTE0NSw2ICsxMjgsNyBA
QCBzdGF0aWMgYm9vbCBwYXJzZUxpY2Vuc2VSZWxlYXNlQWNrbm93bGVkZ2VtZW50Rm9ybWF0KGNv
bnN0IEpTT046Ok9iamVjdCYgcm9vdCkKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAorLy8gRklYTUU6
IFJlbW92ZSB0aGlzIG1hbnVhbCBwYXJzaW5nIGFuZCBpbnN0ZWFkIHVzZSB0aGUgSVNPQm94IGNs
YXNzZXMgaW4gV2ViQ29yZS4KIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9lbWUtaW5pdGRhdGEt
Y2VuYy8jY29tbW9uLXN5c3RlbQogLy8gNC4xIERlZmluaXRpb24KIC8vIFRoZSBTeXN0ZW1JRCBp
cyAxMDc3ZWZlYy1jMGIyLTRkMDItYWNlMy0zYzFlNTJlMmZiNGIuCkBAIC0yODgsNiArMjcyLDE3
IEBAIHN0YXRpYyBSZWY8U2hhcmVkQnVmZmVyPiBleHRyYWN0S2V5SWRGcm9tV2ViTUluaXREYXRh
KGNvbnN0IFNoYXJlZEJ1ZmZlciYgaW5pdERhCiAgICAgcmV0dXJuIGtleUlkczsKIH0KIAorc3Rh
dGljIFN0cmluZyBrZXlJRFRvSGV4U3RyaW5nKGNvbnN0IFJlZjxTaGFyZWRCdWZmZXI+JiBrZXlJ
RCkKK3sKKyAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXI7CisgICAgZm9yICh1bnNpZ25lZCBpID0g
MDsgaSA8IGtleUlELT5zaXplKCk7IGkrKykgeworICAgICAgICBidWlsZGVyLmFwcGVuZChTdHJp
bmc6OmZvcm1hdCgiMHglMngiLCAodWludDhfdClrZXlJRC0+ZGF0YSgpW2ldKSk7CisgICAgICAg
IGlmIChpIDwga2V5SUQtPnNpemUoKSAtIDEpCisgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgn
ICcpOworICAgIH0KKyAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOworfQorCiBDRE1GYWN0
b3J5Q2xlYXJLZXkmIENETUZhY3RvcnlDbGVhcktleTo6c2luZ2xldG9uKCkKIHsKICAgICBzdGF0
aWMgTmV2ZXJEZXN0cm95ZWQ8Q0RNRmFjdG9yeUNsZWFyS2V5PiBzX2ZhY3Rvcnk7CkBAIC0zMDks
NyArMzA0LDYgQEAgc3RkOjp1bmlxdWVfcHRyPENETVByaXZhdGU+IENETUZhY3RvcnlDbGVhcktl
eTo6Y3JlYXRlQ0RNKGNvbnN0IFN0cmluZyYga2V5U3lzdGUKIAogYm9vbCBDRE1GYWN0b3J5Q2xl
YXJLZXk6OnN1cHBvcnRzS2V5U3lzdGVtKGNvbnN0IFN0cmluZyYga2V5U3lzdGVtKQogewotICAg
IC8vIGBvcmcudzMuY2xlYXJrZXlgIGlzIHRoZSBvbmx5IHN1cHBvcnRlZCBrZXkgc3lzdGVtLgog
ICAgIHJldHVybiBlcXVhbExldHRlcnNJZ25vcmluZ0FTQ0lJQ2FzZShrZXlTeXN0ZW0sICJvcmcu
dzMuY2xlYXJrZXkiKTsKIH0KIApAQCAtMzE4LDcgKzMxMiw2IEBAIENETVByaXZhdGVDbGVhcktl
eTo6fkNETVByaXZhdGVDbGVhcktleSgpID0gZGVmYXVsdDsKIAogYm9vbCBDRE1Qcml2YXRlQ2xl
YXJLZXk6OnN1cHBvcnRzSW5pdERhdGFUeXBlKGNvbnN0IEF0b21pY1N0cmluZyYgaW5pdERhdGFU
eXBlKSBjb25zdAogewotICAgIC8vIGBrZXlpZHNgIGFuZCAnY2VuYycgYXJlIHRoZSBvbmx5IHN1
cHBvcnRlZCBpbml0IGRhdGEgdHlwZS4KICAgICByZXR1cm4gKGVxdWFsTGV0dGVyc0lnbm9yaW5n
QVNDSUlDYXNlKGluaXREYXRhVHlwZSwgImtleWlkcyIpIHx8IGVxdWFsTGV0dGVyc0lnbm9yaW5n
QVNDSUlDYXNlKGluaXREYXRhVHlwZSwgImNlbmMiKSB8fCBlcXVhbExldHRlcnNJZ25vcmluZ0FT
Q0lJQ2FzZShpbml0RGF0YVR5cGUsICJ3ZWJtIikpOwogfQogCkBAIC0zMzAsMTIgKzMyMyw5IEBA
IHN0YXRpYyBib29sIGNvbnRhaW5zUGVyc2lzdGVudExpY2Vuc2VUeXBlKGNvbnN0IFZlY3RvcjxD
RE1TZXNzaW9uVHlwZT4mIHR5cGVzKQogCiBib29sIENETVByaXZhdGVDbGVhcktleTo6c3VwcG9y
dHNDb25maWd1cmF0aW9uKGNvbnN0IENETUtleVN5c3RlbUNvbmZpZ3VyYXRpb24mIGNvbmZpZ3Vy
YXRpb24pIGNvbnN0CiB7Ci0gICAgLy8gUmVqZWN0IGFueSBjb25maWd1cmF0aW9uIHRoYXQgbWFy
a3MgZGlzdGluY3RpdmUgaWRlbnRpZmllciBhcyByZXF1aXJlZC4KICAgICBpZiAoY29uZmlndXJh
dGlvbi5kaXN0aW5jdGl2ZUlkZW50aWZpZXIgPT0gQ0RNUmVxdWlyZW1lbnQ6OlJlcXVpcmVkKQog
ICAgICAgICByZXR1cm4gZmFsc2U7CiAKLSAgICAvLyBSZWplY3QgYW55IGNvbmZpZ3VyYXRpb24g
dGhhdCBtYXJrcyBwZXJzaXN0ZW50IHN0YXRlIGFzIHJlcXVpcmVkLCB1bmxlc3MKLSAgICAvLyB0
aGUgJ3BlcnNpc3RlbnQtbGljZW5zZScgc2Vzc2lvbiB0eXBlIGhhcyB0byBiZSBzdXBwb3J0ZWQu
CiAgICAgaWYgKGNvbmZpZ3VyYXRpb24ucGVyc2lzdGVudFN0YXRlID09IENETVJlcXVpcmVtZW50
OjpSZXF1aXJlZCAmJiAhY29udGFpbnNQZXJzaXN0ZW50TGljZW5zZVR5cGUoY29uZmlndXJhdGlv
bi5zZXNzaW9uVHlwZXMpKQogICAgICAgICByZXR1cm4gZmFsc2U7CiAKQEAgLTM0NCwxOSArMzM0
LDEzIEBAIGJvb2wgQ0RNUHJpdmF0ZUNsZWFyS2V5OjpzdXBwb3J0c0NvbmZpZ3VyYXRpb24oY29u
c3QgQ0RNS2V5U3lzdGVtQ29uZmlndXJhdGlvbiYKIAogYm9vbCBDRE1Qcml2YXRlQ2xlYXJLZXk6
OnN1cHBvcnRzQ29uZmlndXJhdGlvbldpdGhSZXN0cmljdGlvbnMoY29uc3QgQ0RNS2V5U3lzdGVt
Q29uZmlndXJhdGlvbiYgY29uZmlndXJhdGlvbiwgY29uc3QgQ0RNUmVzdHJpY3Rpb25zJiByZXN0
cmljdGlvbnMpIGNvbnN0CiB7Ci0gICAgLy8gUmVqZWN0IGFueSBjb25maWd1cmF0aW9uIHRoYXQg
bWFya3MgZGlzdGluY2l0aXZlIGlkZW50aWZpZXIgYXMgcmVxdWlyZWQsIG9yIHRoYXQgbWFya3MK
LSAgICAvLyBkaXN0aW5jdGl2ZSBpZGVudGlmaWVyIGFzIG9wdGlvbmFsIGV2ZW4gd2hlbiByZXN0
cmljdGlvbnMgbWFyayBpdCBhcyBkZW5pZWQuCiAgICAgaWYgKChjb25maWd1cmF0aW9uLmRpc3Rp
bmN0aXZlSWRlbnRpZmllciA9PSBDRE1SZXF1aXJlbWVudDo6T3B0aW9uYWwgJiYgcmVzdHJpY3Rp
b25zLmRpc3RpbmN0aXZlSWRlbnRpZmllckRlbmllZCkKICAgICAgICAgfHwgY29uZmlndXJhdGlv
bi5kaXN0aW5jdGl2ZUlkZW50aWZpZXIgPT0gQ0RNUmVxdWlyZW1lbnQ6OlJlcXVpcmVkKQogICAg
ICAgICByZXR1cm4gZmFsc2U7CiAKLSAgICAvLyBSZWplY3QgYW55IGNvbmZpZ3VyYXRpb24gdGhh
dCBtYXJrcyBwZXJzaXN0ZW50IHN0YXRlIGFzIG9wdGlvbmFsIGV2ZW4gd2hlbgotICAgIC8vIHJl
c3RyaWN0aW9ucyBtYXJrIGl0IGFzIGRlbmllZC4KICAgICBpZiAoY29uZmlndXJhdGlvbi5wZXJz
aXN0ZW50U3RhdGUgPT0gQ0RNUmVxdWlyZW1lbnQ6Ok9wdGlvbmFsICYmIHJlc3RyaWN0aW9ucy5w
ZXJzaXN0ZW50U3RhdGVEZW5pZWQpCiAgICAgICAgIHJldHVybiBmYWxzZTsKIAotICAgIC8vIFJl
amVjdCBhbnkgY29uZmlndXJhdGlvbiB0aGF0IG1hcmtzIHBlcnNpc3RlbnQgc3RhdGUgYXMgcmVx
dWlyZWQsIHVubGVzcwotICAgIC8vIHRoZSAncGVyc2lzdGVudC1saWNlbnNlJyBzZXNzaW9uIHR5
cGUgaGFzIHRvIGJlIHN1cHBvcnRlZC4KICAgICBpZiAoY29uZmlndXJhdGlvbi5wZXJzaXN0ZW50
U3RhdGUgPT0gQ0RNUmVxdWlyZW1lbnQ6OlJlcXVpcmVkICYmICFjb250YWluc1BlcnNpc3RlbnRM
aWNlbnNlVHlwZShjb25maWd1cmF0aW9uLnNlc3Npb25UeXBlcykpCiAgICAgICAgIHJldHVybiBm
YWxzZTsKIApAQCAtMzY1LDcgKzM0OSw2IEBAIGJvb2wgQ0RNUHJpdmF0ZUNsZWFyS2V5OjpzdXBw
b3J0c0NvbmZpZ3VyYXRpb25XaXRoUmVzdHJpY3Rpb25zKGNvbnN0IENETUtleVN5c3RlCiAKIGJv
b2wgQ0RNUHJpdmF0ZUNsZWFyS2V5OjpzdXBwb3J0c1Nlc3Npb25UeXBlV2l0aENvbmZpZ3VyYXRp
b24oQ0RNU2Vzc2lvblR5cGUmIHNlc3Npb25UeXBlLCBjb25zdCBDRE1LZXlTeXN0ZW1Db25maWd1
cmF0aW9uJiBjb25maWd1cmF0aW9uKSBjb25zdAogewotICAgIC8vIE9ubHkgc3VwcG9ydCB0aGUg
J3RlbXBvcmFyeScgYW5kICdwZXJzaXN0ZW50LWxpY2Vuc2UnIHNlc3Npb24gdHlwZXMuCiAgICAg
aWYgKHNlc3Npb25UeXBlICE9IENETVNlc3Npb25UeXBlOjpUZW1wb3JhcnkgJiYgc2Vzc2lvblR5
cGUgIT0gQ0RNU2Vzc2lvblR5cGU6OlBlcnNpc3RlbnRMaWNlbnNlKQogICAgICAgICByZXR1cm4g
ZmFsc2U7CiAgICAgcmV0dXJuIHN1cHBvcnRzQ29uZmlndXJhdGlvbihjb25maWd1cmF0aW9uKTsK
QEAgLTM3Myw3ICszNTYsNiBAQCBib29sIENETVByaXZhdGVDbGVhcktleTo6c3VwcG9ydHNTZXNz
aW9uVHlwZVdpdGhDb25maWd1cmF0aW9uKENETVNlc3Npb25UeXBlJiBzZQogCiBib29sIENETVBy
aXZhdGVDbGVhcktleTo6c3VwcG9ydHNSb2J1c3RuZXNzKGNvbnN0IFN0cmluZyYgcm9idXN0bmVz
cykgY29uc3QKIHsKLSAgICAvLyBPbmx5IGVtcHR5IGByb2J1c3RuZXNzYCBzdHJpbmcgaXMgc3Vw
cG9ydGVkLgogICAgIHJldHVybiByb2J1c3RuZXNzLmlzRW1wdHkoKTsKIH0KIApAQCAtMzg3LDcg
KzM2OSw2IEBAIENETVJlcXVpcmVtZW50IENETVByaXZhdGVDbGVhcktleTo6ZGlzdGluY3RpdmVJ
ZGVudGlmaWVyc1JlcXVpcmVtZW50KGNvbnN0IENETUtlCiAKIENETVJlcXVpcmVtZW50IENETVBy
aXZhdGVDbGVhcktleTo6cGVyc2lzdGVudFN0YXRlUmVxdWlyZW1lbnQoY29uc3QgQ0RNS2V5U3lz
dGVtQ29uZmlndXJhdGlvbiYsIGNvbnN0IENETVJlc3RyaWN0aW9ucyYgcmVzdHJpY3Rpb25zKSBj
b25zdAogewotICAgIC8vIFBlcnNpc3RlbnQgc3RhdGUgaXMgbm90IGFsbG93ZWQgaWYgaXQncyBi
ZWVuIGRlbmllZCwgb3RoZXJ3aXNlIGl0J3Mgb3B0aW9uYWwuCiAgICAgaWYgKHJlc3RyaWN0aW9u
cy5wZXJzaXN0ZW50U3RhdGVEZW5pZWQpCiAgICAgICAgIHJldHVybiBDRE1SZXF1aXJlbWVudDo6
Tm90QWxsb3dlZDsKICAgICByZXR1cm4gQ0RNUmVxdWlyZW1lbnQ6Ok9wdGlvbmFsOwpAQCAtNDA1
LDMyICszODYsMjYgQEAgUmVmUHRyPENETUluc3RhbmNlPiBDRE1Qcml2YXRlQ2xlYXJLZXk6OmNy
ZWF0ZUluc3RhbmNlKCkKIAogdm9pZCBDRE1Qcml2YXRlQ2xlYXJLZXk6OmxvYWRBbmRJbml0aWFs
aXplKCkKIHsKLSAgICAvLyBOby1vcC4KIH0KIAogYm9vbCBDRE1Qcml2YXRlQ2xlYXJLZXk6OnN1
cHBvcnRzU2VydmVyQ2VydGlmaWNhdGVzKCkgY29uc3QKIHsKLSAgICAvLyBTZXJ2ZXIgY2VydGlm
aWNhdGVzIGFyZSBub3Qgc3VwcG9ydGVkLgogICAgIHJldHVybiBmYWxzZTsKIH0KIAogYm9vbCBD
RE1Qcml2YXRlQ2xlYXJLZXk6OnN1cHBvcnRzU2Vzc2lvbnMoKSBjb25zdAogewotICAgIC8vIFNl
c3Npb25zIGFyZSBzdXBwb3J0ZWQuCiAgICAgcmV0dXJuIHRydWU7CiB9CiAKIGJvb2wgQ0RNUHJp
dmF0ZUNsZWFyS2V5OjpzdXBwb3J0c0luaXREYXRhKGNvbnN0IEF0b21pY1N0cmluZyYgaW5pdERh
dGFUeXBlLCBjb25zdCBTaGFyZWRCdWZmZXImIGluaXREYXRhKSBjb25zdAogewotICAgIC8vIFZh
bGlkYXRlIHRoZSBpbml0RGF0YSBidWZmZXIgYXMgYW4gSlNPTiBvYmplY3QgaW4ga2V5aWRzIGNh
c2UuCiAgICAgaWYgKGVxdWFsTGV0dGVyc0lnbm9yaW5nQVNDSUlDYXNlKGluaXREYXRhVHlwZSwg
ImtleWlkcyIpICYmIHBhcnNlSlNPTk9iamVjdChpbml0RGF0YSkpCiAgICAgICAgIHJldHVybiB0
cnVlOwogCi0gICAgLy8gVmFsaWRhdGUgdGhlIGluaXREYXRhIGJ1ZmZlciBhcyBDRU5DIGluaXRE
YXRhLgogICAgIGlmIChlcXVhbExldHRlcnNJZ25vcmluZ0FTQ0lJQ2FzZShpbml0RGF0YVR5cGUs
ICJjZW5jIikgJiYgaXNDZW5jSW5pdERhdGEoaW5pdERhdGEpKQogICAgICAgICByZXR1cm4gdHJ1
ZTsKIAotICAgIC8vIFZhbGlkYXRlIHRoZSBpbml0RGF0YSBidWZmZXIgYXMgV2ViTSBpbml0RGF0
YS4KICAgICBpZiAoZXF1YWxMZXR0ZXJzSWdub3JpbmdBU0NJSUNhc2UoaW5pdERhdGFUeXBlLCAi
d2VibSIpICYmICFpbml0RGF0YS5pc0VtcHR5KCkpCiAgICAgICAgIHJldHVybiB0cnVlOwogCkBA
IC00MzksNyArNDE0LDYgQEAgYm9vbCBDRE1Qcml2YXRlQ2xlYXJLZXk6OnN1cHBvcnRzSW5pdERh
dGEoY29uc3QgQXRvbWljU3RyaW5nJiBpbml0RGF0YVR5cGUsIGNvbnMKIAogUmVmUHRyPFNoYXJl
ZEJ1ZmZlcj4gQ0RNUHJpdmF0ZUNsZWFyS2V5OjpzYW5pdGl6ZVJlc3BvbnNlKGNvbnN0IFNoYXJl
ZEJ1ZmZlciYgcmVzcG9uc2UpIGNvbnN0CiB7Ci0gICAgLy8gVmFsaWRhdGUgdGhlIHJlc3BvbnNl
IGJ1ZmZlciBhcyBhbiBKU09OIG9iamVjdC4KICAgICBpZiAoIXBhcnNlSlNPTk9iamVjdChyZXNw
b25zZSkpCiAgICAgICAgIHJldHVybiBudWxscHRyOwogCkBAIC00NDgsNyArNDIyLDYgQEAgUmVm
UHRyPFNoYXJlZEJ1ZmZlcj4gQ0RNUHJpdmF0ZUNsZWFyS2V5OjpzYW5pdGl6ZVJlc3BvbnNlKGNv
bnN0IFNoYXJlZEJ1ZmZlciYgcmUKIAogc3RkOjpvcHRpb25hbDxTdHJpbmc+IENETVByaXZhdGVD
bGVhcktleTo6c2FuaXRpemVTZXNzaW9uSWQoY29uc3QgU3RyaW5nJiBzZXNzaW9uSWQpIGNvbnN0
CiB7Ci0gICAgLy8gVmFsaWRhdGUgdGhlIHNlc3Npb24gSUQgc3RyaW5nIGFzIGFuIDMyLWJpdCBp
bnRlZ2VyLgogICAgIGJvb2wgb2s7CiAgICAgc2Vzc2lvbklkLnRvVUludFN0cmljdCgmb2spOwog
ICAgIGlmICghb2spCkBAIC00NTYsMzkgKzQyOSwyOCBAQCBzdGQ6Om9wdGlvbmFsPFN0cmluZz4g
Q0RNUHJpdmF0ZUNsZWFyS2V5OjpzYW5pdGl6ZVNlc3Npb25JZChjb25zdCBTdHJpbmcmIHNlc3Np
bwogICAgIHJldHVybiBzZXNzaW9uSWQ7CiB9CiAKLUNETUluc3RhbmNlQ2xlYXJLZXk6OkNETUlu
c3RhbmNlQ2xlYXJLZXkoKQotewotfQotCi1DRE1JbnN0YW5jZUNsZWFyS2V5Ojp+Q0RNSW5zdGFu
Y2VDbGVhcktleSgpID0gZGVmYXVsdDsKLQogQ0RNSW5zdGFuY2U6OlN1Y2Nlc3NWYWx1ZSBDRE1J
bnN0YW5jZUNsZWFyS2V5Ojppbml0aWFsaXplV2l0aENvbmZpZ3VyYXRpb24oY29uc3QgQ0RNS2V5
U3lzdGVtQ29uZmlndXJhdGlvbiYpCiB7Ci0gICAgLy8gTm8tb3AuCiAgICAgcmV0dXJuIFN1Y2Nl
ZWRlZDsKIH0KIAogQ0RNSW5zdGFuY2U6OlN1Y2Nlc3NWYWx1ZSBDRE1JbnN0YW5jZUNsZWFyS2V5
OjpzZXREaXN0aW5jdGl2ZUlkZW50aWZpZXJzQWxsb3dlZChib29sIGFsbG93ZWQpCiB7Ci0gICAg
Ly8gUmVqZWN0IHNldHRpbmcgZGlzdGluY3RpdmUgaWRlbnRpZmllcnMgYXMgYWxsb3dlZC4KICAg
ICByZXR1cm4gIWFsbG93ZWQgPyBTdWNjZWVkZWQgOiBGYWlsZWQ7CiB9CiAKIENETUluc3RhbmNl
OjpTdWNjZXNzVmFsdWUgQ0RNSW5zdGFuY2VDbGVhcktleTo6c2V0UGVyc2lzdGVudFN0YXRlQWxs
b3dlZChib29sIGFsbG93ZWQpCiB7Ci0gICAgLy8gUmVqZWN0IHNldHRpbmcgcGVyc2lzdGVudCBz
dGF0ZSBhcyBhbGxvd2VkLgogICAgIHJldHVybiAhYWxsb3dlZCA/IFN1Y2NlZWRlZCA6IEZhaWxl
ZDsKIH0KIAogQ0RNSW5zdGFuY2U6OlN1Y2Nlc3NWYWx1ZSBDRE1JbnN0YW5jZUNsZWFyS2V5Ojpz
ZXRTZXJ2ZXJDZXJ0aWZpY2F0ZShSZWY8U2hhcmVkQnVmZmVyPiYmKQogewotICAgIC8vIFJlamVj
dCBzZXR0aW5nIGFueSBzZXJ2ZXIgY2VydGlmaWNhdGUuCiAgICAgcmV0dXJuIEZhaWxlZDsKIH0K
IAogQ0RNSW5zdGFuY2U6OlN1Y2Nlc3NWYWx1ZSBDRE1JbnN0YW5jZUNsZWFyS2V5OjpzZXRTdG9y
YWdlRGlyZWN0b3J5KGNvbnN0IFN0cmluZyYgc3RvcmFnZURpcmVjdG9yeSkKIHsKLSAgICAvLyBS
ZWplY3QgYW55IHBlcnNpc3RlbnQgc3RhdGUgc3RvcmFnZS4KICAgICByZXR1cm4gc3RvcmFnZURp
cmVjdG9yeS5pc0VtcHR5KCkgPyBTdWNjZWVkZWQgOiBGYWlsZWQ7CiB9CiAKQEAgLTUwMSwyMiAr
NDYzLDQ0IEBAIGNvbnN0IFN0cmluZyYgQ0RNSW5zdGFuY2VDbGVhcktleTo6a2V5U3lzdGVtKCkg
Y29uc3QKIAogUmVmUHRyPENETUluc3RhbmNlU2Vzc2lvbj4gQ0RNSW5zdGFuY2VDbGVhcktleTo6
Y3JlYXRlU2Vzc2lvbigpCiB7Ci0gICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBDRE1JbnN0YW5jZVNl
c3Npb25DbGVhcktleSgpKTsKKyAgICBhdXRvIHNlc3Npb24gPSBhZG9wdFJlZigqbmV3IENETUlu
c3RhbmNlU2Vzc2lvbkNsZWFyS2V5KCp0aGlzKSk7CisgICAgbV9zZXNzaW9ucy5hcHBlbmQobWFr
ZVdlYWtQdHIoc2Vzc2lvbi5nZXQoKSkpOworICAgIHJldHVybiBzZXNzaW9uOwogfQogCi1jb25z
dCBWZWN0b3I8Q0RNSW5zdGFuY2VDbGVhcktleTo6S2V5PiBDRE1JbnN0YW5jZUNsZWFyS2V5Ojpr
ZXlzKCkgY29uc3QKK2Jvb2wgQ0RNSW5zdGFuY2VDbGVhcktleTo6ZGVjcnlwdChSZWY8Q0RNSW5z
dGFuY2U6OkRlY3J5cHRpb25Db25maWc+JiYgY29uZmlnLCB1aW50OF90KiBlbmNyeXB0ZWRCdWZm
ZXIsIHVpbnQzMl90IGVuY3J5cHRlZEJ1ZmZlclNpemUpCiB7Ci0gICAgLy8gUmV0dXJuIHRoZSBr
ZXlzIG9mIGFsbCBzZXNzaW9ucy4KLSAgICBWZWN0b3I8Q0RNSW5zdGFuY2VDbGVhcktleTo6S2V5
PiBhbGxLZXlzIHsgfTsKLSAgICBzaXplX3QgaW5pdGlhbENhcGFjaXR5ID0gMDsKLSAgICBmb3Ig
KGF1dG8mIGtleSA6IENsZWFyS2V5U3RhdGU6OnNpbmdsZXRvbigpLmtleXMoKS52YWx1ZXMoKSkK
LSAgICAgICAgaW5pdGlhbENhcGFjaXR5ICs9IGtleS5zaXplKCk7Ci0gICAgYWxsS2V5cy5yZXNl
cnZlSW5pdGlhbENhcGFjaXR5KGluaXRpYWxDYXBhY2l0eSk7CisgICAgTE9HKEVNRSwgIkVNRSBD
bGVhcktleSAtIGRlY3J5cHRpbmcsIGxvb2tpbmcgdXAgc2Vzc2lvbiBmb3Iga2V5IElEIFslc10i
LCBrZXlJRFRvSGV4U3RyaW5nKGNvbmZpZy0+a2V5SUQoKSkudXRmOCgpLmRhdGEoKSk7CiAKLSAg
ICBmb3IgKGF1dG8mIGtleSA6IENsZWFyS2V5U3RhdGU6OnNpbmdsZXRvbigpLmtleXMoKS52YWx1
ZXMoKSkKLSAgICAgICAgYWxsS2V5cy5hcHBlbmRWZWN0b3Ioa2V5KTsKKyAgICBhdXRvKiBzZXNz
aW9uID0gc2Vzc2lvbkZvcktleUlEKGNvbmZpZy0+a2V5SUQoKSk7CisgICAgaWYgKCFzZXNzaW9u
KSB7CisgICAgICAgIExPRyhFTUUsICJGYWlsZWQgdG8gZmluZCBtYXRjaGluZyBzZXNzaW9uIik7
CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBMT0coRU1FLCAiRU1FIENsZWFy
S2V5IC0gZm91bmQgc2Vzc2lvbiB3aXRoIGFkZHJlc3MgJXAiLCBzZXNzaW9uKTsKKyAgICByZXR1
cm4gc2Vzc2lvbi0+ZGVjcnlwdChXVEZNb3ZlKGNvbmZpZyksIGVuY3J5cHRlZEJ1ZmZlciwgZW5j
cnlwdGVkQnVmZmVyU2l6ZSk7Cit9CiAKLSAgICByZXR1cm4gYWxsS2V5czsKK0NETUluc3RhbmNl
U2Vzc2lvbkNsZWFyS2V5KiBDRE1JbnN0YW5jZUNsZWFyS2V5OjpzZXNzaW9uRm9yS2V5SUQoY29u
c3QgUmVmPFNoYXJlZEJ1ZmZlcj4mIGtleUlEKSBjb25zdAoreworICAgIGZvciAoYXV0byYgc2Vz
c2lvbkludGVyZmFjZSA6IG1fc2Vzc2lvbnMpIHsKKyAgICAgICAgaWYgKCFzZXNzaW9uSW50ZXJm
YWNlKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgYXV0byBzZXNzaW9uS2V5cyA9
IHNlc3Npb25JbnRlcmZhY2UtPmtleUlEcygpOworICAgICAgICBpZiAoYW55T2Yoc2Vzc2lvbktl
eXMsIFsmXShhdXRvJiBzZXNzaW9uS2V5KSB7CisgICAgICAgICAgICByZXR1cm4ga2V5SUQgPT0g
c2Vzc2lvbktleTsKKyAgICAgICAgfSkpCisgICAgICAgICAgICByZXR1cm4gc2Vzc2lvbkludGVy
ZmFjZS5nZXQoKTsKKyAgICB9CisgICAgTE9HKEVNRSwgIkVNRSBDbGVhcktleSAtIGZvdW5kIG5v
IG1hdGNoaW5nIHNlc3Npb24gZm9yIHRoZSBnaXZlbiBrZXkgSURzIik7CisgICAgcmV0dXJuIG51
bGxwdHI7Cit9CisKK0NETUluc3RhbmNlU2Vzc2lvbkNsZWFyS2V5OjpDRE1JbnN0YW5jZVNlc3Np
b25DbGVhcktleShSZWY8Q0RNSW5zdGFuY2VDbGVhcktleT4mJiBpbnN0YW5jZSkKKyAgICA6IG1f
aW5zdGFuY2UoV1RGTW92ZShpbnN0YW5jZSkpCit7CiB9CiAKIHZvaWQgQ0RNSW5zdGFuY2VTZXNz
aW9uQ2xlYXJLZXk6OnJlcXVlc3RMaWNlbnNlKExpY2Vuc2VUeXBlLCBjb25zdCBBdG9taWNTdHJp
bmcmIGluaXREYXRhVHlwZSwgUmVmPFNoYXJlZEJ1ZmZlcj4mJiBpbml0RGF0YSwgTGljZW5zZUNh
bGxiYWNrJiYgY2FsbGJhY2spCkBAIC01MjQsNiArNTA4LDkgQEAgdm9pZCBDRE1JbnN0YW5jZVNl
c3Npb25DbGVhcktleTo6cmVxdWVzdExpY2Vuc2UoTGljZW5zZVR5cGUsIGNvbnN0IEF0b21pY1N0
cmluZyYKICAgICBzdGF0aWMgdWludDMyX3Qgc19zZXNzaW9uSWRWYWx1ZSA9IDA7CiAgICAgKytz
X3Nlc3Npb25JZFZhbHVlOwogCisgICAgbV9zZXNzaW9uSWQgPSBTdHJpbmc6Om51bWJlcihzX3Nl
c3Npb25JZFZhbHVlKTsKKyAgICBMT0coRU1FLCAiRU1FIENsZWFyS2V5IC0gbmV3IGxpY2Vuc2Ug
cmVxdWVzdCwgb3VyIHNlc3Npb24gaWQgaXMgJXMiLCBtX3Nlc3Npb25JZC51dGY4KCkuZGF0YSgp
KTsKKwogICAgIGlmIChlcXVhbExldHRlcnNJZ25vcmluZ0FTQ0lJQ2FzZShpbml0RGF0YVR5cGUs
ICJjZW5jIikpCiAgICAgICAgIGluaXREYXRhID0gZXh0cmFjdEtleWlkc0Zyb21DZW5jSW5pdERh
dGEoaW5pdERhdGEuZ2V0KCkpOwogCkBAIC01MzEsMTYgKzUxOCwxOSBAQCB2b2lkIENETUluc3Rh
bmNlU2Vzc2lvbkNsZWFyS2V5OjpyZXF1ZXN0TGljZW5zZShMaWNlbnNlVHlwZSwgY29uc3QgQXRv
bWljU3RyaW5nJgogICAgICAgICBpbml0RGF0YSA9IGV4dHJhY3RLZXlJZEZyb21XZWJNSW5pdERh
dGEoaW5pdERhdGEuZ2V0KCkpOwogCiAgICAgY2FsbE9uTWFpblRocmVhZCgKLSAgICAgICAgW3dl
YWtUaGlzID0gbWFrZVdlYWtQdHIoKnRoaXMpLCBjYWxsYmFjayA9IFdURk1vdmUoY2FsbGJhY2sp
LCBpbml0RGF0YSA9IFdURk1vdmUoaW5pdERhdGEpLCBzZXNzaW9uSWRWYWx1ZSA9IHNfc2Vzc2lv
bklkVmFsdWVdKCkgbXV0YWJsZSB7CisgICAgICAgIFt3ZWFrVGhpcyA9IG1ha2VXZWFrUHRyKCp0
aGlzKSwgY2FsbGJhY2sgPSBXVEZNb3ZlKGNhbGxiYWNrKSwgaW5pdERhdGEgPSBXVEZNb3ZlKGlu
aXREYXRhKSwgc2Vzc2lvbklkVmFsdWUgPSBtX3Nlc3Npb25JZF0oKSBtdXRhYmxlIHsKICAgICAg
ICAgICAgIGlmICghd2Vha1RoaXMpCiAgICAgICAgICAgICAgICAgcmV0dXJuOwogCi0gICAgICAg
ICAgICBjYWxsYmFjayhXVEZNb3ZlKGluaXREYXRhKSwgU3RyaW5nOjpudW1iZXIoc2Vzc2lvbklk
VmFsdWUpLCBmYWxzZSwgU3VjY2VlZGVkKTsKKyAgICAgICAgICAgIGNhbGxiYWNrKFdURk1vdmUo
aW5pdERhdGEpLCBzZXNzaW9uSWRWYWx1ZSwgZmFsc2UsIFN1Y2NlZWRlZCk7CiAgICAgICAgIH0p
OwogfQogCiB2b2lkIENETUluc3RhbmNlU2Vzc2lvbkNsZWFyS2V5Ojp1cGRhdGVMaWNlbnNlKGNv
bnN0IFN0cmluZyYgc2Vzc2lvbklkLCBMaWNlbnNlVHlwZSwgY29uc3QgU2hhcmVkQnVmZmVyJiBy
ZXNwb25zZSwgTGljZW5zZVVwZGF0ZUNhbGxiYWNrJiYgY2FsbGJhY2spCiB7CisgICAgTE9HKEVN
RSwgIkVNRSBDbGVhcktleSAtIHJlY2VpdmVkIHVwZGF0ZSByZXF1ZXN0IGZvciBzZXNzaW9uIGlk
ICVzLCBvdXIgaWQgaXMgJXMiLCBzZXNzaW9uSWQudXRmOCgpLmRhdGEoKSwgbV9zZXNzaW9uSWQu
dXRmOCgpLmRhdGEoKSk7CisgICAgUkVMRUFTRV9BU1NFUlQoc2Vzc2lvbklkID09IG1fc2Vzc2lv
bklkKTsKKwogICAgIC8vIFVzZSBhIGhlbHBlciBmdW5jdG9yIHRoYXQgc2NoZWR1bGVzIHRoZSBj
YWxsYmFjayBkaXNwYXRjaCwgYXZvaWRpbmcKICAgICAvLyBkdXBsaWNhdGVkIGNhbGxPbk1haW5U
aHJlYWQoKSBjYWxscy4KICAgICBhdXRvIGRpc3BhdGNoQ2FsbGJhY2sgPQpAQCAtNTU0LDU4ICs1
NDQsNDEgQEAgdm9pZCBDRE1JbnN0YW5jZVNlc3Npb25DbGVhcktleTo6dXBkYXRlTGljZW5zZShj
b25zdCBTdHJpbmcmIHNlc3Npb25JZCwgTGljZW5zZVQKICAgICAgICAgICAgICAgICB9KTsKICAg
ICAgICAgfTsKIAotICAgIC8vIFBhcnNlIHRoZSByZXNwb25zZSBidWZmZXIgYXMgYW4gSlNPTiBv
YmplY3QuCiAgICAgUmVmUHRyPEpTT046Ok9iamVjdD4gcm9vdCA9IHBhcnNlSlNPTk9iamVjdChy
ZXNwb25zZSk7CiAgICAgaWYgKCFyb290KSB7CiAgICAgICAgIGRpc3BhdGNoQ2FsbGJhY2soZmFs
c2UsIHN0ZDo6bnVsbG9wdCwgU3VjY2Vzc1ZhbHVlOjpGYWlsZWQpOwogICAgICAgICByZXR1cm47
CiAgICAgfQogCi0gICAgLy8gUGFyc2UgdGhlIHJlc3BvbnNlIHVzaW5nICdsaWNlbnNlJyBmb3Jt
YXR0aW5nLCBpZiBwb3NzaWJsZS4KICAgICBpZiAoYXV0byBkZWNvZGVkS2V5cyA9IHBhcnNlTGlj
ZW5zZUZvcm1hdCgqcm9vdCkpIHsKLSAgICAgICAgLy8gUmV0cmlldmUgdGhlIHRhcmdldCBWZWN0
b3Igb2YgS2V5IG9iamVjdHMgZm9yIHRoaXMgc2Vzc2lvbi4KLSAgICAgICAgYXV0byYga2V5VmVj
dG9yID0gQ2xlYXJLZXlTdGF0ZTo6c2luZ2xldG9uKCkua2V5cygpLmVuc3VyZShzZXNzaW9uSWQs
IFtdIHsgcmV0dXJuIFZlY3RvcjxDRE1JbnN0YW5jZUNsZWFyS2V5OjpLZXk+IHsgfTsgfSkuaXRl
cmF0b3ItPnZhbHVlOwotCi0gICAgICAgIC8vIEZvciBlYWNoIGRlY29kZWQga2V5LCBmaW5kIGFu
IGV4aXN0aW5nIGl0ZW0gZm9yIHRoZSBkZWNvZGVkIGtleSdzIElELiBJZiBub25lIGV4aXN0LAot
ICAgICAgICAvLyB0aGUga2V5IGlzIGRlY29kZWQuIE90aGVyd2lzZSwgdGhlIGtleSBpcyB1cGRh
dGVkIGluIGNhc2UgdGhlcmUncyBhIG1pc21hdGNoIGJldHdlZW4KLSAgICAgICAgLy8gdGhlIHNp
emUgb3IgZGF0YSBvZiB0aGUgZXhpc3RpbmcgYW5kIHByb3Bvc2VkIGtleS4KICAgICAgICAgYm9v
bCBrZXlzQ2hhbmdlZCA9IGZhbHNlOwogICAgICAgICBmb3IgKGF1dG8mIGtleSA6ICpkZWNvZGVk
S2V5cykgewotICAgICAgICAgICAgYXV0byBpdCA9IHN0ZDo6ZmluZF9pZihrZXlWZWN0b3IuYmVn
aW4oKSwga2V5VmVjdG9yLmVuZCgpLAotICAgICAgICAgICAgICAgIFsma2V5XSAoY29uc3QgQ0RN
SW5zdGFuY2VDbGVhcktleTo6S2V5JiBjb250YWluZWRLZXkpIHsKLSAgICAgICAgICAgICAgICAg
ICAgcmV0dXJuIGNvbnRhaW5lZEtleS5rZXlJRERhdGEtPnNpemUoKSA9PSBrZXkua2V5SUREYXRh
LT5zaXplKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmICFzdGQ6Om1lbWNtcChjb250YWlu
ZWRLZXkua2V5SUREYXRhLT5kYXRhKCksIGtleS5rZXlJRERhdGEtPmRhdGEoKSwgY29udGFpbmVk
S2V5LmtleUlERGF0YS0+c2l6ZSgpKTsKKyAgICAgICAgICAgIGF1dG8gaXQgPSBzdGQ6OmZpbmRf
aWYobV9rZXlzLmJlZ2luKCksIG1fa2V5cy5lbmQoKSwKKyAgICAgICAgICAgICAgICBbJmtleV0g
KGNvbnN0IEtleSYgY29udGFpbmVkS2V5KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBj
b250YWluZWRLZXkuaWQtPnNpemUoKSA9PSBrZXkuaWQtPnNpemUoKQorICAgICAgICAgICAgICAg
ICAgICAgICAgJiYgIXN0ZDo6bWVtY21wKGNvbnRhaW5lZEtleS5pZC0+ZGF0YSgpLCBrZXkuaWQt
PmRhdGEoKSwgY29udGFpbmVkS2V5LmlkLT5zaXplKCkpOwogICAgICAgICAgICAgICAgIH0pOwot
ICAgICAgICAgICAgaWYgKGl0ICE9IGtleVZlY3Rvci5lbmQoKSkgewotICAgICAgICAgICAgICAg
IGF1dG8mIGV4aXN0aW5nS2V5ID0gaXQtPmtleVZhbHVlRGF0YTsKLSAgICAgICAgICAgICAgICBh
dXRvJiBwcm9wb3NlZEtleSA9IGtleS5rZXlWYWx1ZURhdGE7CisgICAgICAgICAgICBpZiAoaXQg
IT0gbV9rZXlzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgYXV0byYgZXhpc3RpbmdLZXkgPSBp
dC0+dmFsdWU7CisgICAgICAgICAgICAgICAgYXV0byYgcHJvcG9zZWRLZXkgPSBrZXkudmFsdWU7
CiAKLSAgICAgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIGV4aXN0aW5nIEtleSBpZiBpdCBkaWZm
ZXJzIGZyb20gdGhlIHByb3Bvc2VkIGtleSBpbiBrZXkgdmFsdWUuCiAgICAgICAgICAgICAgICAg
aWYgKGV4aXN0aW5nS2V5LT5zaXplKCkgIT0gcHJvcG9zZWRLZXktPnNpemUoKSB8fCBzdGQ6Om1l
bWNtcChleGlzdGluZ0tleS0+ZGF0YSgpLCBwcm9wb3NlZEtleS0+ZGF0YSgpLCBleGlzdGluZ0tl
eS0+c2l6ZSgpKSkgewogICAgICAgICAgICAgICAgICAgICAqaXQgPSBXVEZNb3ZlKGtleSk7CiAg
ICAgICAgICAgICAgICAgICAgIGtleXNDaGFuZ2VkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9
CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIEluIGNhc2UgYSBLZXkg
Zm9yIHRoaXMga2V5IElEIGRvZXNuJ3QgZXhpc3QgeWV0LCBhcHBlbmQgdGhlIG5ldyBvbmUgdG8g
a2V5VmVjdG9yLgotICAgICAgICAgICAgICAgIGtleVZlY3Rvci5hcHBlbmQoV1RGTW92ZShrZXkp
KTsKKyAgICAgICAgICAgICAgICBtX2tleXMuYXBwZW5kKFdURk1vdmUoa2V5KSk7CiAgICAgICAg
ICAgICAgICAga2V5c0NoYW5nZWQgPSB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAK
LSAgICAgICAgLy8gSW4gY2FzZSBvZiBjaGFuZ2VkIGtleXMsIHdlIGhhdmUgdG8gcHJvdmlkZSBh
IEtleVN0YXR1c1ZlY3RvciBvZiBhbGwgdGhlIGtleXMgZm9yCi0gICAgICAgIC8vIHRoaXMgc2Vz
c2lvbi4KICAgICAgICAgc3RkOjpvcHRpb25hbDxLZXlTdGF0dXNWZWN0b3I+IGNoYW5nZWRLZXlz
OwogICAgICAgICBpZiAoa2V5c0NoYW5nZWQpIHsKLSAgICAgICAgICAgIC8vIEZpcnN0IGEgaGVs
cGVyIFZlY3RvciBpcyBjb25zdHJ1Y3RlZCwgY290YWluaW5nIHBhaXJzIG9mIFNoYXJlZEJ1ZmZl
ciBSZWZQdHJzCi0gICAgICAgICAgICAvLyByZXByZXNlbnRpbnQga2V5IElEIGRhdGEsIGFuZCB0
aGUgY29ycmVzcG9uZGluZyBrZXkgc3RhdHVzZXMuCi0gICAgICAgICAgICAvLyBXZSBjYW4ndCB1
c2UgS2V5U3RhdHVzVmVjdG9yIGhlcmUgYmVjYXVzZSB0aGlzIFZlY3RvciBoYXMgdG8gYmUgc29y
dGVkLCB3aGljaAotICAgICAgICAgICAgLy8gaXMgbm90IHBvc3NpYmxlIHRvIGRvIG9uIFJlZjw+
IG9iamVjdHMuCiAgICAgICAgICAgICBWZWN0b3I8c3RkOjpwYWlyPFJlZlB0cjxTaGFyZWRCdWZm
ZXI+LCBLZXlTdGF0dXM+PiBrZXlzOwotICAgICAgICAgICAga2V5cy5yZXNlcnZlSW5pdGlhbENh
cGFjaXR5KGtleVZlY3Rvci5zaXplKCkpOwotICAgICAgICAgICAgZm9yIChhdXRvJiBpdCA6IGtl
eVZlY3RvcikKLSAgICAgICAgICAgICAgICBrZXlzLnVuY2hlY2tlZEFwcGVuZChzdGQ6OnBhaXI8
UmVmUHRyPFNoYXJlZEJ1ZmZlcj4sIEtleVN0YXR1cz4geyBpdC5rZXlJRERhdGEsIGl0LnN0YXR1
cyB9KTsKKyAgICAgICAgICAgIGtleXMucmVzZXJ2ZUluaXRpYWxDYXBhY2l0eShtX2tleXMuc2l6
ZSgpKTsKKyAgICAgICAgICAgIGZvciAoYXV0byYgaXQgOiBtX2tleXMpCisgICAgICAgICAgICAg
ICAga2V5cy51bmNoZWNrZWRBcHBlbmQoc3RkOjpwYWlyPFJlZlB0cjxTaGFyZWRCdWZmZXI+LCBL
ZXlTdGF0dXM+IHsgaXQuaWQsIGl0LnN0YXR1cyB9KTsKIAotICAgICAgICAgICAgLy8gU29ydCBm
aXJzdCBieSBzaXplLCBzZWNvbmQgYnkgZGF0YS4KICAgICAgICAgICAgIHN0ZDo6c29ydChrZXlz
LmJlZ2luKCksIGtleXMuZW5kKCksCiAgICAgICAgICAgICAgICAgW10gKGNvbnN0IGF1dG8mIGEs
IGNvbnN0IGF1dG8mIGIpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKGEuZmlyc3QtPnNpemUo
KSAhPSBiLmZpcnN0LT5zaXplKCkpCkBAIC02MTQsOCArNTg3LDYgQEAgdm9pZCBDRE1JbnN0YW5j
ZVNlc3Npb25DbGVhcktleTo6dXBkYXRlTGljZW5zZShjb25zdCBTdHJpbmcmIHNlc3Npb25JZCwg
TGljZW5zZVQKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0ZDo6bWVtY21wKGEuZmlyc3Qt
PmRhdGEoKSwgYi5maXJzdC0+ZGF0YSgpLCBhLmZpcnN0LT5zaXplKCkpIDwgMDsKICAgICAgICAg
ICAgICAgICB9KTsKIAotICAgICAgICAgICAgLy8gRmluYWxseSBjb25zdHJ1Y3QgdGhlIG1pcnJv
cmluZyBLZXlTdGF0dXNWZWN0b3Igb2JqZWN0IGFuZCBtb3ZlIGl0IGludG8gdGhlCi0gICAgICAg
ICAgICAvLyBzdGQ6Om9wdGlvbmFsPD4gb2JqZWN0IHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gdGhl
IGNhbGxiYWNrLgogICAgICAgICAgICAgS2V5U3RhdHVzVmVjdG9yIGtleVN0YXR1c1ZlY3RvcjsK
ICAgICAgICAgICAgIGtleVN0YXR1c1ZlY3Rvci5yZXNlcnZlSW5pdGlhbENhcGFjaXR5KGtleXMu
c2l6ZSgpKTsKICAgICAgICAgICAgIGZvciAoYXV0byYgaXQgOiBrZXlzKQpAQCAtNjI4LDEwICs1
OTksOCBAQCB2b2lkIENETUluc3RhbmNlU2Vzc2lvbkNsZWFyS2V5Ojp1cGRhdGVMaWNlbnNlKGNv
bnN0IFN0cmluZyYgc2Vzc2lvbklkLCBMaWNlbnNlVAogICAgICAgICByZXR1cm47CiAgICAgfQog
Ci0gICAgLy8gUGFyc2UgdGhlIHJlc3BvbnNlIHVzaW5nICdsaWNlbnNlIHJlbGVhc2UgYWNrbm93
bGVkZ2VtZW50JyBmb3JtYXR0aW5nLCBpZiBwb3NzaWJsZS4KICAgICBpZiAocGFyc2VMaWNlbnNl
UmVsZWFzZUFja25vd2xlZGdlbWVudEZvcm1hdCgqcm9vdCkpIHsKLSAgICAgICAgLy8gRklYTUU6
IFJldHJpZXZlIHRoZSBrZXkgSUQgaW5mb3JtYXRpb24gYW5kIHVzZSBpdCB0byB2YWxpZGF0ZSB0
aGUga2V5cyBmb3IgdGhpcyBzZXNzaW9uSWQuCi0gICAgICAgIENsZWFyS2V5U3RhdGU6OnNpbmds
ZXRvbigpLmtleXMoKS5yZW1vdmUoc2Vzc2lvbklkKTsKKyAgICAgICAgbV9rZXlzLmNsZWFyKCk7
CiAgICAgICAgIGRpc3BhdGNoQ2FsbGJhY2sodHJ1ZSwgc3RkOjpudWxsb3B0LCBTdWNjZXNzVmFs
dWU6OlN1Y2NlZWRlZCk7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC02NDIsNiArNjExLDEx
IEBAIHZvaWQgQ0RNSW5zdGFuY2VTZXNzaW9uQ2xlYXJLZXk6OnVwZGF0ZUxpY2Vuc2UoY29uc3Qg
U3RyaW5nJiBzZXNzaW9uSWQsIExpY2Vuc2VUCiAKIHZvaWQgQ0RNSW5zdGFuY2VTZXNzaW9uQ2xl
YXJLZXk6OmxvYWRTZXNzaW9uKExpY2Vuc2VUeXBlLCBjb25zdCBTdHJpbmcmIHNlc3Npb25JZCwg
Y29uc3QgU3RyaW5nJiwgTG9hZFNlc3Npb25DYWxsYmFjayYmIGNhbGxiYWNrKQogeworICAgIExP
RyhFTUUsICJFTUUgQ2xlYXJLZXkgLSBsb2FkIHNlc3Npb24gaWQgJXMiLCBzZXNzaW9uSWQudXRm
OCgpLmRhdGEoKSk7CisgICAgUkVMRUFTRV9BU1NFUlQobV9zZXNzaW9uSWQuaXNFbXB0eSgpKTsK
KworICAgIG1fc2Vzc2lvbklkID0gc2Vzc2lvbklkOworCiAgICAgLy8gVXNlIGEgaGVscGVyIGZ1
bmN0b3IgdGhhdCBzY2hlZHVsZXMgdGhlIGNhbGxiYWNrIGRpc3BhdGNoLCBhdm9pZGluZyBkdXBs
aWNhdGVkIGNhbGxPbk1haW5UaHJlYWQoKSBjYWxscy4KICAgICBhdXRvIGRpc3BhdGNoQ2FsbGJh
Y2sgPQogICAgICAgICBbdGhpcywgJmNhbGxiYWNrXShzdGQ6Om9wdGlvbmFsPEtleVN0YXR1c1Zl
Y3Rvcj4mJiBleGlzdGluZ0tleXMsIFN1Y2Nlc3NWYWx1ZSBzdWNjZXNzLCBTZXNzaW9uTG9hZEZh
aWx1cmUgbG9hZEZhaWx1cmUpIHsKQEAgLTY1NCwyMCArNjI4LDE2IEBAIHZvaWQgQ0RNSW5zdGFu
Y2VTZXNzaW9uQ2xlYXJLZXk6OmxvYWRTZXNzaW9uKExpY2Vuc2VUeXBlLCBjb25zdCBTdHJpbmcm
IHNlc3Npb25JCiAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgIH07CiAKLSAgICAvLyBDb25z
dHJ1Y3QgdGhlIEtleVN0YXR1c1ZlY3RvciBvYmplY3QsIHJlcHJlc2VudGluZyBhbGwgdGhlIGtu
b3duIGtleXMgZm9yIHRoaXMgc2Vzc2lvbi4KICAgICBLZXlTdGF0dXNWZWN0b3Iga2V5U3RhdHVz
VmVjdG9yOwogICAgIHsKLSAgICAgICAgYXV0byYga2V5cyA9IENsZWFyS2V5U3RhdGU6OnNpbmds
ZXRvbigpLmtleXMoKTsKLSAgICAgICAgYXV0byBpdCA9IGtleXMuZmluZChzZXNzaW9uSWQpOwot
ICAgICAgICBpZiAoaXQgPT0ga2V5cy5lbmQoKSkgeworICAgICAgICBpZiAoIW1fa2V5cy5zaXpl
KCkpIHsKICAgICAgICAgICAgIGRpc3BhdGNoQ2FsbGJhY2soc3RkOjpudWxsb3B0LCBGYWlsZWQs
IFNlc3Npb25Mb2FkRmFpbHVyZTo6Tm9TZXNzaW9uRGF0YSk7CiAgICAgICAgICAgICByZXR1cm47
CiAgICAgICAgIH0KIAotICAgICAgICBhdXRvJiBrZXlWZWN0b3IgPSBpdC0+dmFsdWU7Ci0gICAg
ICAgIGtleVN0YXR1c1ZlY3Rvci5yZXNlcnZlSW5pdGlhbENhcGFjaXR5KGtleVZlY3Rvci5zaXpl
KCkpOwotICAgICAgICBmb3IgKGF1dG8mIGtleSA6IGtleVZlY3RvcikKLSAgICAgICAgICAgIGtl
eVN0YXR1c1ZlY3Rvci51bmNoZWNrZWRBcHBlbmQoc3RkOjpwYWlyPFJlZjxTaGFyZWRCdWZmZXI+
LCBLZXlTdGF0dXM+IHsgKmtleS5rZXlJRERhdGEsIGtleS5zdGF0dXMgfSk7CisgICAgICAgIGtl
eVN0YXR1c1ZlY3Rvci5yZXNlcnZlSW5pdGlhbENhcGFjaXR5KG1fa2V5cy5zaXplKCkpOworICAg
ICAgICBmb3IgKGF1dG8mIGtleSA6IG1fa2V5cykKKyAgICAgICAgICAgIGtleVN0YXR1c1ZlY3Rv
ci51bmNoZWNrZWRBcHBlbmQoc3RkOjpwYWlyPFJlZjxTaGFyZWRCdWZmZXI+LCBLZXlTdGF0dXM+
IHsgKmtleS5pZCwga2V5LnN0YXR1cyB9KTsKICAgICB9CiAKICAgICBkaXNwYXRjaENhbGxiYWNr
KFdURk1vdmUoa2V5U3RhdHVzVmVjdG9yKSwgU3VjY2VlZGVkLCBTZXNzaW9uTG9hZEZhaWx1cmU6
Ok5vbmUpOwpAQCAtNjg2LDYgKzY1Niw5IEBAIHZvaWQgQ0RNSW5zdGFuY2VTZXNzaW9uQ2xlYXJL
ZXk6OmNsb3NlU2Vzc2lvbihjb25zdCBTdHJpbmcmLCBDbG9zZVNlc3Npb25DYWxsYmFjCiAKIHZv
aWQgQ0RNSW5zdGFuY2VTZXNzaW9uQ2xlYXJLZXk6OnJlbW92ZVNlc3Npb25EYXRhKGNvbnN0IFN0
cmluZyYgc2Vzc2lvbklkLCBMaWNlbnNlVHlwZSwgUmVtb3ZlU2Vzc2lvbkRhdGFDYWxsYmFjayYm
IGNhbGxiYWNrKQogeworICAgIExPRyhFTUUsICJFTUUgQ2xlYXJLZXkgLSByZW1vdmUgc2Vzc2lv
biBpZCAlcywgb3VyIGlkIGlzICVzIiwgc2Vzc2lvbklkLnV0ZjgoKS5kYXRhKCksIG1fc2Vzc2lv
bklkLnV0ZjgoKS5kYXRhKCkpOworICAgIFJFTEVBU0VfQVNTRVJUKHNlc3Npb25JZCA9PSBtX3Nl
c3Npb25JZCk7CisKICAgICAvLyBVc2UgYSBoZWxwZXIgZnVuY3RvciB0aGF0IHNjaGVkdWxlcyB0
aGUgY2FsbGJhY2sgZGlzcGF0Y2gsIGF2b2lkaW5nIGR1cGxpY2F0ZWQgY2FsbE9uTWFpblRocmVh
ZCgpIGNhbGxzLgogICAgIGF1dG8gZGlzcGF0Y2hDYWxsYmFjayA9CiAgICAgICAgIFt0aGlzLCAm
Y2FsbGJhY2tdKEtleVN0YXR1c1ZlY3RvciYmIGtleVN0YXR1c1ZlY3Rvciwgc3RkOjpvcHRpb25h
bDxSZWY8U2hhcmVkQnVmZmVyPj4mJiBtZXNzYWdlLCBTdWNjZXNzVmFsdWUgc3VjY2VzcykgewpA
QCAtNzAzLDMyICs2NzYsMjQgQEAgdm9pZCBDRE1JbnN0YW5jZVNlc3Npb25DbGVhcktleTo6cmVt
b3ZlU2Vzc2lvbkRhdGEoY29uc3QgU3RyaW5nJiBzZXNzaW9uSWQsIExpY2UKICAgICBLZXlTdGF0
dXNWZWN0b3Iga2V5U3RhdHVzVmVjdG9yOwogICAgIFJlZlB0cjxTaGFyZWRCdWZmZXI+IG1lc3Nh
Z2U7CiAgICAgewotICAgICAgICAvLyBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmb3IgdGhlIGdpdmVu
IHNlc3Npb24gSUQsIGJhaWxpbmcgaWYgbm9uZSBpcyBmb3VuZC4KLSAgICAgICAgYXV0byYga2V5
cyA9IENsZWFyS2V5U3RhdGU6OnNpbmdsZXRvbigpLmtleXMoKTsKLSAgICAgICAgYXV0byBpdCA9
IGtleXMuZmluZChzZXNzaW9uSWQpOwotICAgICAgICBpZiAoaXQgPT0ga2V5cy5lbmQoKSkgewor
ICAgICAgICBpZiAoIW1fa2V5cy5zaXplKCkpIHsKICAgICAgICAgICAgIGRpc3BhdGNoQ2FsbGJh
Y2soS2V5U3RhdHVzVmVjdG9yIHsgfSwgc3RkOjpudWxsb3B0LCBTdWNjZXNzVmFsdWU6OkZhaWxl
ZCk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAotICAgICAgICAvLyBSZXRyaWV2
ZSB0aGUgS2V5IHZlY3RvciwgY29udGFpbmluZyBhbGwgdGhlIGtleXMgZm9yIHRoaXMgc2Vzc2lv
biwgYW5kCi0gICAgICAgIC8vIHRoZW4gcmVtb3ZlIHRoZSBrZXkgbWFwIGVudHJ5IGZvciB0aGlz
IHNlc3Npb24uCi0gICAgICAgIGF1dG8ga2V5VmVjdG9yID0gV1RGTW92ZShpdC0+dmFsdWUpOwot
ICAgICAgICBrZXlzLnJlbW92ZShpdCk7Ci0KICAgICAgICAgLy8gQ29uc3RydWN0IHRoZSBLZXlT
dGF0dXNWZWN0b3Igb2JqZWN0LCBwYWlyaW5nIGtleSBJRHMgd2l0aCB0aGUgJ3JlbGVhc2VkJyBz
dGF0dXMuCi0gICAgICAgIGtleVN0YXR1c1ZlY3Rvci5yZXNlcnZlSW5pdGlhbENhcGFjaXR5KGtl
eVZlY3Rvci5zaXplKCkpOwotICAgICAgICBmb3IgKGF1dG8mIGtleSA6IGtleVZlY3RvcikKLSAg
ICAgICAgICAgIGtleVN0YXR1c1ZlY3Rvci51bmNoZWNrZWRBcHBlbmQoc3RkOjpwYWlyPFJlZjxT
aGFyZWRCdWZmZXI+LCBLZXlTdGF0dXM+IHsgKmtleS5rZXlJRERhdGEsIEtleVN0YXR1czo6UmVs
ZWFzZWQgfSk7CisgICAgICAgIGtleVN0YXR1c1ZlY3Rvci5yZXNlcnZlSW5pdGlhbENhcGFjaXR5
KG1fa2V5cy5zaXplKCkpOworICAgICAgICBmb3IgKGF1dG8mIGtleSA6IG1fa2V5cykKKyAgICAg
ICAgICAgIGtleVN0YXR1c1ZlY3Rvci51bmNoZWNrZWRBcHBlbmQoc3RkOjpwYWlyPFJlZjxTaGFy
ZWRCdWZmZXI+LCBLZXlTdGF0dXM+IHsgKmtleS5pZCwgS2V5U3RhdHVzOjpSZWxlYXNlZCB9KTsK
IAogICAgICAgICAvLyBDb25zdHJ1Y3QgSlNPTiB0aGF0IHJlcHJlc2VudHMgdGhlICdsaWNlbnNl
IHJlbGVhc2UnIGZvcm1hdCwgY3JlYXRpbmcgYSAna2lkcycgYXJyYXkKICAgICAgICAgLy8gb2Yg
YmFzZTY0VVJMLWVuY29kZWQga2V5IElEcyBmb3IgYWxsIGtleXMgdGhhdCB3ZXJlIGFzc29jaWF0
ZWQgd2l0aCB0aGlzIHNlc3Npb24uCiAgICAgICAgIGF1dG8gcm9vdE9iamVjdCA9IEpTT046Ok9i
amVjdDo6Y3JlYXRlKCk7CiAgICAgICAgIHsKICAgICAgICAgICAgIGF1dG8gYXJyYXkgPSBKU09O
OjpBcnJheTo6Y3JlYXRlKCk7Ci0gICAgICAgICAgICBmb3IgKGF1dG8mIGtleSA6IGtleVZlY3Rv
cikgewotICAgICAgICAgICAgICAgIEFTU0VSVChrZXkua2V5SUREYXRhLT5zaXplKCkgPD0gc3Rk
OjpudW1lcmljX2xpbWl0czx1bnNpZ25lZD46Om1heCgpKTsKLSAgICAgICAgICAgICAgICBhcnJh
eS0+cHVzaFN0cmluZyhXVEY6OmJhc2U2NFVSTEVuY29kZShrZXkua2V5SUREYXRhLT5kYXRhKCks
IHN0YXRpY19jYXN0PHVuc2lnbmVkPihrZXkua2V5SUREYXRhLT5zaXplKCkpKSk7CisgICAgICAg
ICAgICBmb3IgKGF1dG8mIGtleSA6IG1fa2V5cykgeworICAgICAgICAgICAgICAgIEFTU0VSVChr
ZXkuaWQtPnNpemUoKSA8PSBzdGQ6Om51bWVyaWNfbGltaXRzPHVuc2lnbmVkPjo6bWF4KCkpOwor
ICAgICAgICAgICAgICAgIGFycmF5LT5wdXNoU3RyaW5nKFdURjo6YmFzZTY0VVJMRW5jb2RlKGtl
eS5pZC0+ZGF0YSgpLCBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oa2V5LmlkLT5zaXplKCkpKSk7CiAg
ICAgICAgICAgICB9CiAgICAgICAgICAgICByb290T2JqZWN0LT5zZXRBcnJheSgia2lkcyIsIFdU
Rk1vdmUoYXJyYXkpKTsKICAgICAgICAgfQpAQCAtNzM3LDYgKzcwMiw4IEBAIHZvaWQgQ0RNSW5z
dGFuY2VTZXNzaW9uQ2xlYXJLZXk6OnJlbW92ZVNlc3Npb25EYXRhKGNvbnN0IFN0cmluZyYgc2Vz
c2lvbklkLCBMaWNlCiAgICAgICAgIFN0cmluZyBtZXNzYWdlU3RyaW5nID0gcm9vdE9iamVjdC0+
dG9KU09OU3RyaW5nKCk7CiAgICAgICAgIENTdHJpbmcgbWVzc2FnZUNTdHJpbmcgPSBtZXNzYWdl
U3RyaW5nLnV0ZjgoKTsKICAgICAgICAgbWVzc2FnZSA9IFNoYXJlZEJ1ZmZlcjo6Y3JlYXRlKG1l
c3NhZ2VDU3RyaW5nLmRhdGEoKSwgbWVzc2FnZUNTdHJpbmcubGVuZ3RoKCkpOworCisgICAgICAg
IG1fa2V5cy5jbGVhcigpOwogICAgIH0KIAogICAgIGRpc3BhdGNoQ2FsbGJhY2soV1RGTW92ZShr
ZXlTdGF0dXNWZWN0b3IpLCBSZWY8U2hhcmVkQnVmZmVyPigqbWVzc2FnZSksIFN1Y2Nlc3NWYWx1
ZTo6U3VjY2VlZGVkKTsKQEAgLTc0Niw2ICs3MTMsMTAzIEBAIHZvaWQgQ0RNSW5zdGFuY2VTZXNz
aW9uQ2xlYXJLZXk6OnN0b3JlUmVjb3JkT2ZLZXlVc2FnZShjb25zdCBTdHJpbmcmKQogewogfQog
Citib29sIENETUluc3RhbmNlU2Vzc2lvbkNsZWFyS2V5OjpkZWNyeXB0KFJlZjxDRE1JbnN0YW5j
ZTo6RGVjcnlwdGlvbkNvbmZpZz4mJiBjb25maWcsIHVpbnQ4X3QqIGVuY3J5cHRlZEJ1ZmZlciwg
dWludDMyX3QgZW5jcnlwdGVkQnVmZmVyU2l6ZSkKK3sKKyAgICAvLyBJdCBpcyB0ZW1wdGluZyB0
byBoYXZlIHRoZSBjaXBoZXIgaGFuZGxlIGFzIGEgZGF0YSBtZW1iZXIgb2YKKyAgICAvLyB0aGlz
IGNsYXNzLCBob3dldmVyLCBkdWUgdG8gdGhlIGxpZmV0aW1lIG9mIHRoaXMgY2xhc3MgYmVpbmcK
KyAgICAvLyBkZXBlbmRlbnQgb24gSlMgR0MsIHRoZXJlIGFyZSBzaXR1YXRpb25zIHdlcmUgeW91
IG5lZWQgbW9yZQorICAgIC8vIHRoYW4gdGhlIGZpeGVkIG51bWJlciBvZiBhbGxvd2VkIEdDcnlw
dCBjaXBoZXIgaGFuZGxlcyBvcGVuCisgICAgLy8gc2ltdWx0YW5lb3VzbHksIHNvIHdlIGhhdmUg
dG8gdGlnaHRseSBjb250cm9sIHRoZSBsaWZldGltZSBvZgorICAgIC8vIHRoZSBoYW5kbGVzIGlu
IHRoaXMgbWV0aG9kLgorICAgIC8vIFJFVklFVzogU2hvdWxkIHdlIHVzZSB0aGUgY3Jvc3MtcGxh
dGZvcm0gYWJzdHJhY3Rpb25zIHVuZGVyCisgICAgLy8gV2ViQ29yZS9jcnlwdG8gaW5zdGVhZCBv
ZiBkaXJlY3RseSB1c2luZyBnY3J5cHQgaGVyZT8KKyAgICBnY3J5X2NpcGhlcl9oZF90IGhhbmRs
ZTsKKyAgICAvLyBGSVhNRTogVGhpcyBpcyBhc3N1bWluZyB0aGUgY29udGVudCBoYXMgYmVlbiBl
bmNyeXB0ZWQgaW4gYQorICAgIC8vIHNwZWNpZmljIG1hbm5lciwgaXQgd2lsbCBmYWlsIHdoZW4g
dXNpbmcgQ0JDIG1vZGUsIG9yIHBhdHRlcm4KKyAgICAvLyBlbmNyeXB0aW9uIGZvciBleGFtcGxl
LiBUaGUgY2lwaGVyIHNob3VsZCBpZGVhbGx5IGJlIGNyZWF0ZWQKKyAgICAvLyBmcm9tIHRoZSBE
ZWNyeXB0aW9uQ29uZmlnIGNsYXNzLgorICAgIGlmIChnY3J5X2Vycm9yX3QgZXJyb3IgPSBnY3J5
X2NpcGhlcl9vcGVuKCZoYW5kbGUsIEdDUllfQ0lQSEVSX0FFUzEyOCwgR0NSWV9DSVBIRVJfTU9E
RV9DVFIsIEdDUllfQ0lQSEVSX1NFQ1VSRSkpCisgICAgICAgIFJFTEVBU0VfQVNTRVJUX1dJVEhf
TUVTU0FHRSghZXJyb3IsICJmYWlsZWQgdG8gY3JlYXRlIEFFUyAxMjggQ1RSIGNpcGhlciBoYW5k
bGU6ICVzIiwgZ3BnX3N0cmVycm9yKGVycm9yKSk7CisKKyAgICAvLyBSRVZJRVc6IFRoaXMgcGFk
ZGluZyBnaXZlcyBtZSBhbnhpZXR5LiBJJ3ZlIHNlZW4gdmFyaW91cworICAgIC8vIHN0YW5kYXJk
cyBmb3IgY3J5cHRvIHBhZGRpbmcsIGJ1dCBJIHNlZSBub3RoaW5nIHNwZWNpZmljIGZvcgorICAg
IC8vIEFFUy0xMjgsIG9yIGlmIHplcm8gcGFkZGluZyBsaWtlIHRoaXMgZXZlbiBtYWtlcyBzZW5z
ZS4gSXQKKyAgICAvLyB3b3VsZCBzZWVtIGFsbCBJVnMgZm9yIEFFUy0xMjggc2hvdWxkIGJlIDE2
IGJ5dGVzLCBidXQgaW4gb3VyCisgICAgLy8gdGVzdHMgdGhleSBhcmUgbm90ISBTb21lIGNsYXJp
ZmljYXRpb24gd291bGQgYmUgZ29vZCBoZXJlLgorICAgIExPRyhFTUUsICJFTUUgQ2xlYXJLZXkg
c2Vzc2lvbiAtIGl2IGhhcyAlbHUgYnl0ZXMiLCBjb25maWctPml2KCktPnNpemUoKSk7CisgICAg
UkVMRUFTRV9BU1NFUlRfV0lUSF9NRVNTQUdFKGNvbmZpZy0+aXYoKS0+c2l6ZSgpID09IGl2U2l6
ZSB8fCBjb25maWctPml2KCktPnNpemUoKSA9PSBpdlNpemUgLyAyLCAidW5leHBlY3RlZCBJViBs
ZW5ndGgiKTsKKyAgICBpZiAoY29uZmlnLT5pdigpLT5zaXplKCkgPT0gaXZTaXplIC8gMikKKyAg
ICAgICAgY29uZmlnLT5pdigpLT5hcHBlbmQoVmVjdG9yPGNoYXI+KDgsIDApKTsKKworICAgIGlm
IChnY3J5X2Vycm9yX3QgZXJyb3IgPSBnY3J5X2NpcGhlcl9zZXRjdHIoaGFuZGxlLCBjb25maWct
Pml2KCktPmRhdGEoKSwgaXZTaXplKSkgeworICAgICAgICBMT0coRU1FLCAiRU1FIENsZWFyS2V5
IC0gZ2NyeV9jaXBoZXJfc2V0Y3RyIGZhaWxlZDogJXMiLCBncGdfc3RyZXJyb3IoZXJyb3IpKTsK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIExPRyhFTUUsICJFTUUgQ2xlYXJL
ZXkgLSBzZWFyY2hpbmcgZm9yIGtleSBJRCBbJXNdIiwga2V5SURUb0hleFN0cmluZyhjb25maWct
PmtleUlEKCkpLnV0ZjgoKS5kYXRhKCkpOworICAgIC8vIEZJWE1FOiBXZSB0ZWNobmljYWxseSBh
bHJlYWR5IGtub3cgdGhlIG1hdGNoaW5nIGtleSBpZCBmcm9tIHRoZQorICAgIC8vIGNhbGxzaXRl
IG9mIHRoaXMgZGVjcnlwdCBtZXRob2QsIGNvdWxkIHNhdmUgYSB3YWxrIGFjcm9zcyBvdXIKKyAg
ICAvLyBrZXlzIGlmIHRoZSBjYWxsaW5nIGNvZGUgaXMgcmVhcnJhbmdlZCBhIGxpdHRsZS4KKyAg
ICBhdXRvIG1hdGNoaW5nS2V5ID0gc3RkOjpmaW5kX2lmKG1fa2V5cy5iZWdpbigpLCBtX2tleXMu
ZW5kKCksCisgICAgICAgIFsmY29uZmlnXShjb25zdCBLZXkmIGV4aXN0aW5nS2V5KSB7CisgICAg
ICAgICAgICByZXR1cm4gY29uZmlnLT5rZXlJRCgpID09ICpleGlzdGluZ0tleS5pZDsKKyAgICAg
ICAgfSk7CisgICAgaWYgKG1hdGNoaW5nS2V5ID09IG1fa2V5cy5lbmQoKSkgeworICAgICAgICBM
T0coRU1FLCAiRU1FIENsZWFyS2V5IC0gZmFpbGVkIHRvIGZpbmQga2V5IGlkIGluIHNldCBvZiBr
bm93biBrZXlzIik7CisgICAgICAgIGdjcnlfY2lwaGVyX2Nsb3NlKGhhbmRsZSk7CisgICAgICAg
IHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoZ2NyeV9lcnJvcl90IGVycm9yID0gZ2Ny
eV9jaXBoZXJfc2V0a2V5KGhhbmRsZSwgbWF0Y2hpbmdLZXktPnZhbHVlLT5kYXRhKCksIG1hdGNo
aW5nS2V5LT52YWx1ZS0+c2l6ZSgpKSkgeworICAgICAgICBMT0coRU1FLCAiRU1FIENsZWFyS2V5
IC0gZ2NyeV9jaXBoZXJfc2V0a2V5IGZhaWxlZDogJXMiLCBncGdfc3RyZXJyb3IoZXJyb3IpKTsK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICghY29uZmlnLT5pc1N1YlNh
bXBsZSgpKSB7CisgICAgICAgIExPRyhFTUUsICJFTUUgQ2xlYXJLZXkgLSBkZWNyeXB0aW5nIGZ1
bGwgc2FtcGxlIG9mICUiIFBSSXUzMiAiIGJ5dGVzIiwgZW5jcnlwdGVkQnVmZmVyU2l6ZSk7Cisg
ICAgICAgIGlmIChnY3J5X2Vycm9yX3QgZXJyb3IgPSBnY3J5X2NpcGhlcl9kZWNyeXB0KGhhbmRs
ZSwgZW5jcnlwdGVkQnVmZmVyLCBlbmNyeXB0ZWRCdWZmZXJTaXplLCAwLCAwKSkgeworICAgICAg
ICAgICAgTE9HKEVNRSwgIkVNRSBDbGVhcktleSAtIGZ1bGwgc2FtcGxlIGRlY3J5cHRpb24gZmFp
bGVkOiAlcyIsIGdwZ19zdHJlcnJvcihlcnJvcikpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgICAgICB9CisgICAgICAgIGdjcnlfY2lwaGVyX2Nsb3NlKGhhbmRsZSk7CisgICAgICAg
IHJldHVybiB0cnVlOworICAgIH0KKworICAgIHVpbnQzMl90IG9mZnNldCB7IDAgfTsKKyAgICBM
T0coRU1FLCAiRU1FIENsZWFyS2V5IC0gdGhlcmUgYXJlICVsdSBzdWJzYW1wbGUgcmFuZ2VzIHRv
IHByb2Nlc3MiLCBjb25maWctPnN1YlNhbXBsZXMoKS5zaXplKCkpOworICAgIGZvciAoY29uc3Qg
YXV0byYgc3ViU2FtcGxlUmFuZ2UgOiBjb25maWctPnN1YlNhbXBsZXMoKSkgeworICAgICAgICBv
ZmZzZXQgKz0gc3ViU2FtcGxlUmFuZ2UuY2xlYXJCeXRlczsKKworICAgICAgICBpZiAoIXN1YlNh
bXBsZVJhbmdlLmNpcGhlckJ5dGVzKSB7CisgICAgICAgICAgICBMT0coRU1FLCAiRU1FIENsZWFy
S2V5IC0gaWdub3JpbmcgY2xlYXIgc3Vic2FtcGxlIG9mIHNpemUgJXUgYXQgb2Zmc2V0ICV1Iiwg
c3ViU2FtcGxlUmFuZ2UuY2xlYXJCeXRlcywgb2Zmc2V0KTsKKyAgICAgICAgICAgIGNvbnRpbnVl
OworICAgICAgICB9CisKKyAgICAgICAgTE9HKEVNRSwgIkVNRSBDbGVhcktleSAtIGRlY3J5cHRp
bmcgc3Vic2FtcGxlLCBbY2xlYXI9JXUsIGNpcGhlcj0ldV0gb2Zmc2V0PSV1Iiwgc3ViU2FtcGxl
UmFuZ2UuY2xlYXJCeXRlcywgc3ViU2FtcGxlUmFuZ2UuY2lwaGVyQnl0ZXMsIG9mZnNldCk7CisK
KyAgICAgICAgaWYgKGdjcnlfZXJyb3JfdCBlcnJvciA9IGdjcnlfY2lwaGVyX2RlY3J5cHQoaGFu
ZGxlLCBlbmNyeXB0ZWRCdWZmZXIgKyBvZmZzZXQsIHN1YlNhbXBsZVJhbmdlLmNpcGhlckJ5dGVz
LCAwLCAwKSkgeworICAgICAgICAgICAgTE9HKEVNRSwgIkVNRSBDbGVhcktleSAtIGRlY3J5cHRp
b24gc3Vic2FtcGxlcyBmYWlsZWQ6ICVzIiwgZ3BnX3N0cmVycm9yKGVycm9yKSk7CisgICAgICAg
ICAgICBnY3J5X2NpcGhlcl9jbG9zZShoYW5kbGUpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgICAgICB9CisgICAgICAgIG9mZnNldCArPSBzdWJTYW1wbGVSYW5nZS5jaXBoZXJCeXRl
czsKKyAgICB9CisKKyAgICBMT0coRU1FLCAiRU1FIENsZWFyS2V5IC0gZGVjcnlwdGluZyBzdWJz
YW1wbGVzIHN1Y2NlZWRlZCIpOworICAgIGdjcnlfY2lwaGVyX2Nsb3NlKGhhbmRsZSk7CisgICAg
cmV0dXJuIHRydWU7Cit9CisKK1ZlY3RvcjxSZWY8U2hhcmVkQnVmZmVyPj4gQ0RNSW5zdGFuY2VT
ZXNzaW9uQ2xlYXJLZXk6OmtleUlEcygpCit7CisgICAgVmVjdG9yPFJlZjxTaGFyZWRCdWZmZXI+
PiBrZXlJRHM7CisgICAga2V5SURzLnJlc2VydmVJbml0aWFsQ2FwYWNpdHkobV9rZXlzLnNpemUo
KSk7CisgICAgZm9yIChhdXRvJiBrZXkgOiBtX2tleXMpCisgICAgICAgIGtleUlEcy51bmNoZWNr
ZWRBcHBlbmQoKmtleS5pZCk7CisKKyAgICByZXR1cm4ga2V5SURzOworfQorCiB9IC8vIG5hbWVz
cGFjZSBXZWJDb3JlCiAKICNlbmRpZiAvLyBFTkFCTEUoRU5DUllQVEVEX01FRElBKQpkaWZmIC0t
Z2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZW5jcnlwdGVkbWVkaWEvY2xlYXJrZXkvQ0RN
Q2xlYXJLZXkuaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2VuY3J5cHRlZG1lZGlhL2NsZWFy
a2V5L0NETUNsZWFyS2V5LmgKaW5kZXggZjExY2NkYzhjNDIxYzk5MjQ5ZDRkODBjMGE3ZjVjMDM1
MzQ1NTBiNC4uYTRmYjRiNjAwN2M5NWMyOTUwZmUzOGVjN2QzZTE1Zjc5MTk4NWYyZiAxMDA2NDQK
LS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZW5jcnlwdGVkbWVkaWEvY2xlYXJrZXkvQ0RN
Q2xlYXJLZXkuaAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9lbmNyeXB0ZWRtZWRpYS9j
bGVhcmtleS9DRE1DbGVhcktleS5oCkBAIC0zNCwxMSArMzQsMTQgQEAKICNpbmNsdWRlICJDRE1J
bnN0YW5jZS5oIgogI2luY2x1ZGUgIkNETUluc3RhbmNlU2Vzc2lvbi5oIgogI2luY2x1ZGUgIkNE
TVByaXZhdGUuaCIKKyNpbmNsdWRlICJMb2dnaW5nLmgiCiAjaW5jbHVkZSAiU2hhcmVkQnVmZmVy
LmgiCiAjaW5jbHVkZSA8d3RmL1dlYWtQdHIuaD4KIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCitj
bGFzcyBDRE1JbnN0YW5jZVNlc3Npb25DbGVhcktleTsKKwogY2xhc3MgQ0RNRmFjdG9yeUNsZWFy
S2V5IGZpbmFsIDogcHVibGljIENETUZhY3RvcnkgewogcHVibGljOgogICAgIHN0YXRpYyBDRE1G
YWN0b3J5Q2xlYXJLZXkmIHNpbmdsZXRvbigpOwpAQCAtNzcsOCArODAsNyBAQCBwdWJsaWM6CiAK
IGNsYXNzIENETUluc3RhbmNlQ2xlYXJLZXkgZmluYWwgOiBwdWJsaWMgQ0RNSW5zdGFuY2UsIHB1
YmxpYyBDYW5NYWtlV2Vha1B0cjxDRE1JbnN0YW5jZUNsZWFyS2V5PiB7CiBwdWJsaWM6Ci0gICAg
Q0RNSW5zdGFuY2VDbGVhcktleSgpOwotICAgIHZpcnR1YWwgfkNETUluc3RhbmNlQ2xlYXJLZXko
KTsKKyAgICB2aXJ0dWFsIH5DRE1JbnN0YW5jZUNsZWFyS2V5KCkgPSBkZWZhdWx0OwogCiAgICAg
SW1wbGVtZW50YXRpb25UeXBlIGltcGxlbWVudGF0aW9uVHlwZSgpIGNvbnN0IGZpbmFsIHsgcmV0
dXJuIEltcGxlbWVudGF0aW9uVHlwZTo6Q2xlYXJLZXk7IH0KIApAQCAtODksMjQgKzkxLDM4IEBA
IHB1YmxpYzoKICAgICBTdWNjZXNzVmFsdWUgc2V0U3RvcmFnZURpcmVjdG9yeShjb25zdCBTdHJp
bmcmKSBmaW5hbDsKICAgICBjb25zdCBTdHJpbmcmIGtleVN5c3RlbSgpIGNvbnN0IGZpbmFsOwog
ICAgIFJlZlB0cjxDRE1JbnN0YW5jZVNlc3Npb24+IGNyZWF0ZVNlc3Npb24oKSBmaW5hbDsKKyAg
ICBib29sIGRlY3J5cHQoUmVmPERlY3J5cHRpb25Db25maWc+JiYsIHVpbnQ4X3QqLCB1aW50MzJf
dCkgZmluYWw7CiAKLSAgICBzdHJ1Y3QgS2V5IHsKLSAgICAgICAgQ0RNSW5zdGFuY2VTZXNzaW9u
OjpLZXlTdGF0dXMgc3RhdHVzOwotICAgICAgICBSZWZQdHI8U2hhcmVkQnVmZmVyPiBrZXlJRERh
dGE7Ci0gICAgICAgIFJlZlB0cjxTaGFyZWRCdWZmZXI+IGtleVZhbHVlRGF0YTsKLSAgICB9Owor
ICAgIENETUluc3RhbmNlU2Vzc2lvbkNsZWFyS2V5KiBzZXNzaW9uRm9yS2V5SUQoY29uc3QgUmVm
PFNoYXJlZEJ1ZmZlcj4mKSBjb25zdDsKIAotICAgIGNvbnN0IFZlY3RvcjxLZXk+IGtleXMoKSBj
b25zdDsKK3ByaXZhdGU6CisgICAgVmVjdG9yPFdlYWtQdHI8Q0RNSW5zdGFuY2VTZXNzaW9uQ2xl
YXJLZXk+PiBtX3Nlc3Npb25zOwogfTsKIAogY2xhc3MgQ0RNSW5zdGFuY2VTZXNzaW9uQ2xlYXJL
ZXkgZmluYWwgOiBwdWJsaWMgQ0RNSW5zdGFuY2VTZXNzaW9uLCBwdWJsaWMgQ2FuTWFrZVdlYWtQ
dHI8Q0RNSW5zdGFuY2VTZXNzaW9uQ2xlYXJLZXk+IHsKIHB1YmxpYzoKKyAgICBzdHJ1Y3QgS2V5
IHsKKyAgICAgICAgQ0RNSW5zdGFuY2VTZXNzaW9uOjpLZXlTdGF0dXMgc3RhdHVzOworICAgICAg
ICBSZWZQdHI8U2hhcmVkQnVmZmVyPiBpZDsKKyAgICAgICAgUmVmUHRyPFNoYXJlZEJ1ZmZlcj4g
dmFsdWU7CisgICAgfTsKKworICAgIENETUluc3RhbmNlU2Vzc2lvbkNsZWFyS2V5KFJlZjxDRE1J
bnN0YW5jZUNsZWFyS2V5PiYmKTsKKwogICAgIHZvaWQgcmVxdWVzdExpY2Vuc2UoTGljZW5zZVR5
cGUsIGNvbnN0IEF0b21pY1N0cmluZyYgaW5pdERhdGFUeXBlLCBSZWY8U2hhcmVkQnVmZmVyPiYm
IGluaXREYXRhLCBMaWNlbnNlQ2FsbGJhY2smJikgZmluYWw7CiAgICAgdm9pZCB1cGRhdGVMaWNl
bnNlKGNvbnN0IFN0cmluZyYsIExpY2Vuc2VUeXBlLCBjb25zdCBTaGFyZWRCdWZmZXImLCBMaWNl
bnNlVXBkYXRlQ2FsbGJhY2smJikgZmluYWw7CiAgICAgdm9pZCBsb2FkU2Vzc2lvbihMaWNlbnNl
VHlwZSwgY29uc3QgU3RyaW5nJiwgY29uc3QgU3RyaW5nJiwgTG9hZFNlc3Npb25DYWxsYmFjayYm
KSBmaW5hbDsKICAgICB2b2lkIGNsb3NlU2Vzc2lvbihjb25zdCBTdHJpbmcmLCBDbG9zZVNlc3Np
b25DYWxsYmFjayYmKSBmaW5hbDsKICAgICB2b2lkIHJlbW92ZVNlc3Npb25EYXRhKGNvbnN0IFN0
cmluZyYsIExpY2Vuc2VUeXBlLCBSZW1vdmVTZXNzaW9uRGF0YUNhbGxiYWNrJiYpIGZpbmFsOwog
ICAgIHZvaWQgc3RvcmVSZWNvcmRPZktleVVzYWdlKGNvbnN0IFN0cmluZyYpIGZpbmFsOworICAg
IGJvb2wgZGVjcnlwdChSZWY8Q0RNSW5zdGFuY2U6OkRlY3J5cHRpb25Db25maWc+JiYsIHVpbnQ4
X3QqLCB1aW50MzJfdCkgZmluYWw7CisKKyAgICBWZWN0b3I8UmVmPFNoYXJlZEJ1ZmZlcj4+IGtl
eUlEcygpOworCitwcml2YXRlOgorICAgIFN0cmluZyBtX3Nlc3Npb25JZDsKKyAgICBSZWY8Q0RN
SW5zdGFuY2VDbGVhcktleT4gbV9pbnN0YW5jZTsKKyAgICBWZWN0b3I8S2V5PiBtX2tleXM7CiB9
OwogCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9nc3RyZWFtZXIvR1N0cmVhbWVyQ29tbW9uLmNwcCBiL1NvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2dzdHJlYW1lci9HU3RyZWFtZXJDb21tb24uY3BwCmlu
ZGV4IDUyNjQ5YmJhN2FiOGM0ZDlhYjc1MzlhZTMyOTk2NDgzODM4MWZjOTkuLmQxNTIzNGUwOGVj
NGYzNjQyNzhjNjAzZjkyNzM4ZGMwZWEwYzhlODggMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL2dzdHJlYW1lci9HU3RyZWFtZXJDb21tb24uY3BwCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2dzdHJlYW1lci9HU3RyZWFtZXJDb21tb24u
Y3BwCkBAIC00Nyw3ICs0Nyw3IEBACiAjZW5kaWYKIAogI2lmIEVOQUJMRShFTkNSWVBURURfTUVE
SUEpCi0jaW5jbHVkZSAiV2ViS2l0Q2xlYXJLZXlEZWNyeXB0b3JHU3RyZWFtZXIuaCIKKyNpbmNs
dWRlICJXZWJLaXRDb21tb25FbmNyeXB0aW9uRGVjcnlwdG9yR1N0cmVhbWVyLmgiCiAjZW5kaWYK
IAogI2lmIEVOQUJMRShWSURFTykKQEAgLTI1OSw3ICsyNTksNyBAQCBib29sIGluaXRpYWxpemVH
U3RyZWFtZXJBbmRSZWdpc3RlcldlYktpdEVsZW1lbnRzKCkKICAgICBzdGQ6OmNhbGxfb25jZShv
bmNlRmxhZywgW10gewogI2lmIEVOQUJMRShFTkNSWVBURURfTUVESUEpCiAgICAgICAgIGlmICh3
ZWJraXRHc3RDaGVja1ZlcnNpb24oMSwgNiwgMSkpCi0gICAgICAgICAgICBnc3RfZWxlbWVudF9y
ZWdpc3RlcihudWxscHRyLCAid2Via2l0Y2xlYXJrZXkiLCBHU1RfUkFOS19QUklNQVJZICsgMTAw
LCBXRUJLSVRfVFlQRV9NRURJQV9DS19ERUNSWVBUKTsKKyAgICAgICAgICAgIGdzdF9lbGVtZW50
X3JlZ2lzdGVyKG51bGxwdHIsICJ3ZWJraXRjZW5jIiwgR1NUX1JBTktfUFJJTUFSWSArIDEwMCwg
V0VCS0lUX1RZUEVfTUVESUFfQ0VOQ19ERUNSWVBUKTsKICNlbmRpZgogCiAjaWYgRU5BQkxFKE1F
RElBX1NUUkVBTSkgJiYgR1NUX0NIRUNLX1ZFUlNJT04oMSwgMTAsIDApCmRpZmYgLS1naXQgYS9T
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9nc3RyZWFtZXIvR1N0cmVhbWVyQ29tbW9u
LmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9nc3RyZWFtZXIvR1N0cmVhbWVy
Q29tbW9uLmgKaW5kZXggZjdjOGQyYWYwNjA1NGQ3MTczZGM0YzZhNTg4ZWE2ZTdlYzYwZjU4OS4u
OTM4ODJlMjZkNzc0ZTdiZTJlN2E0M2Q0NzE4NmE4MDZkY2RkOGQ3NCAxMDA2NDQKLS0tIGEvU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZ3N0cmVhbWVyL0dTdHJlYW1lckNvbW1vbi5o
CisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2dzdHJlYW1lci9HU3RyZWFt
ZXJDb21tb24uaApAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgIkZsb2F0U2l6ZS5oIgogI2lu
Y2x1ZGUgIkdSZWZQdHJHU3RyZWFtZXIuaCIKICNpbmNsdWRlICJHVW5pcXVlUHRyR1N0cmVhbWVy
LmgiCisjaW5jbHVkZSAiU2hhcmVkQnVmZmVyLmgiCiAjaW5jbHVkZSA8Z3N0L2dzdC5oPgogI2lu
Y2x1ZGUgPGdzdC92aWRlby92aWRlby1mb3JtYXQuaD4KICNpbmNsdWRlIDxnc3QvdmlkZW8vdmlk
ZW8taW5mby5oPgpAQCAtMTEyLDYgKzExMyw4IEBAIHB1YmxpYzoKIAogICAgIHNpemVfdCBzaXpl
KCkgY29uc3QgeyBBU1NFUlQobV9pc1ZhbGlkKTsgcmV0dXJuIHN0YXRpY19jYXN0PHNpemVfdD4o
bV9pbmZvLnNpemUpOyB9CiAKKyAgICBSZWY8U2hhcmVkQnVmZmVyPiBzaGFyZWRCdWZmZXIoKSBj
b25zdCB7IHJldHVybiBTaGFyZWRCdWZmZXI6OmNyZWF0ZShkYXRhKCksIHNpemUoKSk7IH0KKwog
ICAgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiBtX2lzVmFsaWQ7IH0K
IAogcHJpdmF0ZToKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L2dzdHJlYW1lci9lbWUvV2ViS2l0Q2xlYXJLZXlEZWNyeXB0b3JHU3RyZWFtZXIuY3BwIGIvU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZ3N0cmVhbWVyL2VtZS9XZWJLaXRDbGVhcktl
eURlY3J5cHRvckdTdHJlYW1lci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5
NDFlNTI4ZjQ3Y2JkMDY5NTc5YmM1ZTYzMzU4MWU2YjYxMGM3MjMuLjAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvZ3N0cmVhbWVyL2VtZS9XZWJLaXRDbGVhcktleURlY3J5cHRvckdTdHJlYW1lci5jcHAK
KysrIC9kZXYvbnVsbApAQCAtMSwyOTkgKzAsMCBAQAotLyogR1N0cmVhbWVyIENsZWFyS2V5IGNv
bW1vbiBlbmNyeXB0aW9uIGRlY3J5cHRvcgotICoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBNZXRy
b2xvZ2ljYWwKLSAqIENvcHlyaWdodCAoQykgMjAxNiBJZ2FsaWEgUy5MCi0gKgotICogVGhpcyBs
aWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgot
ICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQ
dWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5k
YXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBv
cHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmli
dXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQg
QU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1F
UkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0
aGUgR05VCi0gKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWls
cy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGli
cmFyeSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsg
aWYgbm90LCB3cml0ZSB0byB0aGUKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwg
NTEgRnJhbmtsaW4gU3RyZWV0LCBTdWl0ZSA1MDAsCi0gKiBCb3N0b24sIE1BIDAyMTEwLTEzMzUs
IFVTQS4KLSAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiV2ViS2l0Q2xlYXJL
ZXlEZWNyeXB0b3JHU3RyZWFtZXIuaCIKLQotI2lmIEVOQUJMRShFTkNSWVBURURfTUVESUEpICYm
IFVTRShHU1RSRUFNRVIpCi0KLSNpbmNsdWRlICJHU3RyZWFtZXJDb21tb24uaCIKLSNpbmNsdWRl
ICJHU3RyZWFtZXJFTUVVdGlsaXRpZXMuaCIKLSNpbmNsdWRlIDxnY3J5cHQuaD4KLSNpbmNsdWRl
IDxnc3QvYmFzZS9nc3RieXRlcmVhZGVyLmg+Ci0jaW5jbHVkZSA8d3RmL1J1bkxvb3AuaD4KLQot
I2RlZmluZSBDTEVBUktFWV9TSVpFIDE2Ci0KLXN0cnVjdCBLZXkgewotICAgIEdSZWZQdHI8R3N0
QnVmZmVyPiBrZXlJRDsKLSAgICBHUmVmUHRyPEdzdEJ1ZmZlcj4ga2V5VmFsdWU7Ci19OwotCi0j
ZGVmaW5lIFdFQktJVF9NRURJQV9DS19ERUNSWVBUX0dFVF9QUklWQVRFKG9iaikgKEdfVFlQRV9J
TlNUQU5DRV9HRVRfUFJJVkFURSgob2JqKSwgV0VCS0lUX1RZUEVfTUVESUFfQ0tfREVDUllQVCwg
V2ViS2l0TWVkaWFDbGVhcktleURlY3J5cHRQcml2YXRlKSkKLXN0cnVjdCBfV2ViS2l0TWVkaWFD
bGVhcktleURlY3J5cHRQcml2YXRlIHsKLSAgICBWZWN0b3I8S2V5PiBrZXlzOwotICAgIGdjcnlf
Y2lwaGVyX2hkX3QgaGFuZGxlOwotfTsKLQotc3RhdGljIHZvaWQgd2ViS2l0TWVkaWFDbGVhcktl
eURlY3J5cHRvckZpbmFsaXplKEdPYmplY3QqKTsKLXN0YXRpYyBnYm9vbGVhbiB3ZWJLaXRNZWRp
YUNsZWFyS2V5RGVjcnlwdG9ySGFuZGxlS2V5UmVzcG9uc2UoV2ViS2l0TWVkaWFDb21tb25FbmNy
eXB0aW9uRGVjcnlwdCogc2VsZiwgR3N0RXZlbnQqKTsKLXN0YXRpYyBnYm9vbGVhbiB3ZWJLaXRN
ZWRpYUNsZWFyS2V5RGVjcnlwdG9yRGVjcnlwdChXZWJLaXRNZWRpYUNvbW1vbkVuY3J5cHRpb25E
ZWNyeXB0KiwgR3N0QnVmZmVyKiBpdiwgR3N0QnVmZmVyKiBrZXlpZCwgR3N0QnVmZmVyKiBzYW1w
bGUsIHVuc2lnbmVkIHN1YlNhbXBsZXNDb3VudCwgR3N0QnVmZmVyKiBzdWJTYW1wbGVzKTsKLQot
R1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyh3ZWJraXRfbWVkaWFfY2xlYXJfa2V5X2RlY3J5cHRf
ZGVidWdfY2F0ZWdvcnkpOwotI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgd2Via2l0X21lZGlhX2Ns
ZWFyX2tleV9kZWNyeXB0X2RlYnVnX2NhdGVnb3J5Ci0KLXN0YXRpYyBHc3RTdGF0aWNQYWRUZW1w
bGF0ZSBzaW5rVGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSgic2luayIsCi0gICAg
R1NUX1BBRF9TSU5LLAotICAgIEdTVF9QQURfQUxXQVlTLAotICAgIEdTVF9TVEFUSUNfQ0FQUygi
YXBwbGljYXRpb24veC1jZW5jLCBvcmlnaW5hbC1tZWRpYS10eXBlPShzdHJpbmcpdmlkZW8veC1o
MjY0LCBwcm90ZWN0aW9uLXN5c3RlbT0oc3RyaW5nKSIgV0VCQ09SRV9HU1RSRUFNRVJfRU1FX1VU
SUxJVElFU19DTEVBUktFWV9VVUlEICI7ICIKLSAgICAiYXBwbGljYXRpb24veC1jZW5jLCBvcmln
aW5hbC1tZWRpYS10eXBlPShzdHJpbmcpYXVkaW8vbXBlZywgcHJvdGVjdGlvbi1zeXN0ZW09KHN0
cmluZykiIFdFQkNPUkVfR1NUUkVBTUVSX0VNRV9VVElMSVRJRVNfQ0xFQVJLRVlfVVVJRCI7Igot
ICAgICJhcHBsaWNhdGlvbi94LXdlYm0tZW5jLCBvcmlnaW5hbC1tZWRpYS10eXBlPShzdHJpbmcp
dmlkZW8veC12cDg7IgotICAgICJhcHBsaWNhdGlvbi94LXdlYm0tZW5jLCBvcmlnaW5hbC1tZWRp
YS10eXBlPShzdHJpbmcpdmlkZW8veC12cDk7IikpOwotCi1zdGF0aWMgR3N0U3RhdGljUGFkVGVt
cGxhdGUgc3JjVGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSgic3JjIiwKLSAgICBH
U1RfUEFEX1NSQywKLSAgICBHU1RfUEFEX0FMV0FZUywKLSAgICBHU1RfU1RBVElDX0NBUFMoInZp
ZGVvL3gtaDI2NDsgYXVkaW8vbXBlZzsgdmlkZW8veC12cDg7IHZpZGVvL3gtdnA5IikpOwotCi0j
ZGVmaW5lIHdlYmtpdF9tZWRpYV9jbGVhcl9rZXlfZGVjcnlwdF9wYXJlbnRfY2xhc3MgcGFyZW50
X2NsYXNzCi1HX0RFRklORV9UWVBFKFdlYktpdE1lZGlhQ2xlYXJLZXlEZWNyeXB0LCB3ZWJraXRf
bWVkaWFfY2xlYXJfa2V5X2RlY3J5cHQsIFdFQktJVF9UWVBFX01FRElBX0NFTkNfREVDUllQVCk7
Ci0KLXN0YXRpYyB2b2lkIHdlYmtpdF9tZWRpYV9jbGVhcl9rZXlfZGVjcnlwdF9jbGFzc19pbml0
KFdlYktpdE1lZGlhQ2xlYXJLZXlEZWNyeXB0Q2xhc3MqIGtsYXNzKQotewotICAgIEdPYmplY3RD
bGFzcyogZ29iamVjdENsYXNzID0gR19PQkpFQ1RfQ0xBU1Moa2xhc3MpOwotICAgIGdvYmplY3RD
bGFzcy0+ZmluYWxpemUgPSB3ZWJLaXRNZWRpYUNsZWFyS2V5RGVjcnlwdG9yRmluYWxpemU7Ci0K
LSAgICBHc3RFbGVtZW50Q2xhc3MqIGVsZW1lbnRDbGFzcyA9IEdTVF9FTEVNRU5UX0NMQVNTKGts
YXNzKTsKLSAgICBnc3RfZWxlbWVudF9jbGFzc19hZGRfcGFkX3RlbXBsYXRlKGVsZW1lbnRDbGFz
cywgZ3N0X3N0YXRpY19wYWRfdGVtcGxhdGVfZ2V0KCZzaW5rVGVtcGxhdGUpKTsKLSAgICBnc3Rf
ZWxlbWVudF9jbGFzc19hZGRfcGFkX3RlbXBsYXRlKGVsZW1lbnRDbGFzcywgZ3N0X3N0YXRpY19w
YWRfdGVtcGxhdGVfZ2V0KCZzcmNUZW1wbGF0ZSkpOwotCi0gICAgZ3N0X2VsZW1lbnRfY2xhc3Nf
c2V0X3N0YXRpY19tZXRhZGF0YShlbGVtZW50Q2xhc3MsCi0gICAgICAgICJEZWNyeXB0IGNvbnRl
bnQgZW5jcnlwdGVkIHVzaW5nIElTT0JNRkYgQ2xlYXJLZXkgQ29tbW9uIEVuY3J5cHRpb24iLAot
ICAgICAgICBHU1RfRUxFTUVOVF9GQUNUT1JZX0tMQVNTX0RFQ1JZUFRPUiwKLSAgICAgICAgIkRl
Y3J5cHRzIG1lZGlhIHRoYXQgaGFzIGJlZW4gZW5jcnlwdGVkIHVzaW5nIElTT0JNRkYgQ2xlYXJL
ZXkgQ29tbW9uIEVuY3J5cHRpb24uIiwKLSAgICAgICAgIlBoaWxpcHBlIE5vcm1hbmQgPHBoaWxu
QGlnYWxpYS5jb20+Iik7Ci0KLSAgICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCh3ZWJraXRfbWVk
aWFfY2xlYXJfa2V5X2RlY3J5cHRfZGVidWdfY2F0ZWdvcnksCi0gICAgICAgICJ3ZWJraXRjbGVh
cmtleSIsIDAsICJDbGVhcktleSBkZWNyeXB0b3IiKTsKLQotICAgIFdlYktpdE1lZGlhQ29tbW9u
RW5jcnlwdGlvbkRlY3J5cHRDbGFzcyogY2VuY0NsYXNzID0gV0VCS0lUX01FRElBX0NFTkNfREVD
UllQVF9DTEFTUyhrbGFzcyk7Ci0gICAgY2VuY0NsYXNzLT5wcm90ZWN0aW9uU3lzdGVtSWQgPSBX
ZWJDb3JlOjpHU3RyZWFtZXJFTUVVdGlsaXRpZXM6OnNfQ2xlYXJLZXlVVUlEOwotICAgIGNlbmND
bGFzcy0+aGFuZGxlS2V5UmVzcG9uc2UgPSBHU1RfREVCVUdfRlVOQ1BUUih3ZWJLaXRNZWRpYUNs
ZWFyS2V5RGVjcnlwdG9ySGFuZGxlS2V5UmVzcG9uc2UpOwotICAgIGNlbmNDbGFzcy0+ZGVjcnlw
dCA9IEdTVF9ERUJVR19GVU5DUFRSKHdlYktpdE1lZGlhQ2xlYXJLZXlEZWNyeXB0b3JEZWNyeXB0
KTsKLQotICAgIGdfdHlwZV9jbGFzc19hZGRfcHJpdmF0ZShrbGFzcywgc2l6ZW9mKFdlYktpdE1l
ZGlhQ2xlYXJLZXlEZWNyeXB0UHJpdmF0ZSkpOwotfQotCi1zdGF0aWMgdm9pZCB3ZWJraXRfbWVk
aWFfY2xlYXJfa2V5X2RlY3J5cHRfaW5pdChXZWJLaXRNZWRpYUNsZWFyS2V5RGVjcnlwdCogc2Vs
ZikKLXsKLSAgICBXZWJLaXRNZWRpYUNsZWFyS2V5RGVjcnlwdFByaXZhdGUqIHByaXYgPSBXRUJL
SVRfTUVESUFfQ0tfREVDUllQVF9HRVRfUFJJVkFURShzZWxmKTsKLQotICAgIHNlbGYtPnByaXYg
PSBwcml2OwotICAgIG5ldyAocHJpdikgV2ViS2l0TWVkaWFDbGVhcktleURlY3J5cHRQcml2YXRl
KCk7Ci0gICAgaWYgKGdjcnlfZXJyb3JfdCBlcnJvciA9IGdjcnlfY2lwaGVyX29wZW4oJihwcml2
LT5oYW5kbGUpLCBHQ1JZX0NJUEhFUl9BRVMxMjgsIEdDUllfQ0lQSEVSX01PREVfQ1RSLCBHQ1JZ
X0NJUEhFUl9TRUNVUkUpKSB7Ci0gICAgICAgIEdTVF9FUlJPUl9PQkpFQ1Qoc2VsZiwgIkZhaWxl
ZCB0byBjcmVhdGUgQUVTIDEyOCBDVFIgY2lwaGVyIGhhbmRsZTogJXMiLCBncGdfc3RyZXJyb3Io
ZXJyb3IpKTsKLSAgICAgICAgQVNTRVJUKCFlcnJvcik7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9p
ZCB3ZWJLaXRNZWRpYUNsZWFyS2V5RGVjcnlwdG9yRmluYWxpemUoR09iamVjdCogb2JqZWN0KQot
ewotICAgIFdlYktpdE1lZGlhQ2xlYXJLZXlEZWNyeXB0KiBzZWxmID0gV0VCS0lUX01FRElBX0NL
X0RFQ1JZUFQob2JqZWN0KTsKLSAgICBXZWJLaXRNZWRpYUNsZWFyS2V5RGVjcnlwdFByaXZhdGUq
IHByaXYgPSBzZWxmLT5wcml2OwotICAgIGdjcnlfY2lwaGVyX2Nsb3NlKHByaXYtPmhhbmRsZSk7
Ci0gICAgcHJpdi0+fldlYktpdE1lZGlhQ2xlYXJLZXlEZWNyeXB0UHJpdmF0ZSgpOwotCi0gICAg
R1NUX0NBTExfUEFSRU5UKEdfT0JKRUNUX0NMQVNTLCBmaW5hbGl6ZSwgKG9iamVjdCkpOwotfQot
Ci1zdGF0aWMgZ2Jvb2xlYW4gd2ViS2l0TWVkaWFDbGVhcktleURlY3J5cHRvckhhbmRsZUtleVJl
c3BvbnNlKFdlYktpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5cHQqIHNlbGYsIEdzdEV2ZW50
KiBldmVudCkKLXsKLSAgICBXZWJLaXRNZWRpYUNsZWFyS2V5RGVjcnlwdFByaXZhdGUqIHByaXYg
PSBXRUJLSVRfTUVESUFfQ0tfREVDUllQVF9HRVRfUFJJVkFURShXRUJLSVRfTUVESUFfQ0tfREVD
UllQVChzZWxmKSk7Ci0gICAgY29uc3QgR3N0U3RydWN0dXJlKiBzdHJ1Y3R1cmUgPSBnc3RfZXZl
bnRfZ2V0X3N0cnVjdHVyZShldmVudCk7Ci0KLSAgICAvLyBEZW1hbmQgdGhlIGBkcm0tY2lwaGVy
LWNsZWFya2V5YCBHc3RTdHJ1Y3R1cmUuCi0gICAgaWYgKCFnc3Rfc3RydWN0dXJlX2hhc19uYW1l
KHN0cnVjdHVyZSwgImRybS1jaXBoZXItY2xlYXJrZXkiKSkKLSAgICAgICAgcmV0dXJuIEZBTFNF
OwotCi0gICAgLy8gUmV0cmlldmUgdGhlIGBrZXktaWRzYCBHU3RyZWFtZXIgdmFsdWUgbGlzdC4K
LSAgICBjb25zdCBHVmFsdWUqIGtleUlEc0xpc3QgPSBnc3Rfc3RydWN0dXJlX2dldF92YWx1ZShz
dHJ1Y3R1cmUsICJrZXktaWRzIik7Ci0gICAgQVNTRVJUKGtleUlEc0xpc3QgJiYgR1NUX1ZBTFVF
X0hPTERTX0xJU1Qoa2V5SURzTGlzdCkpOwotICAgIHVuc2lnbmVkIGtleUlEc0xpc3RTaXplID0g
Z3N0X3ZhbHVlX2xpc3RfZ2V0X3NpemUoa2V5SURzTGlzdCk7Ci0KLSAgICAvLyBSZXRyaWV2ZSB0
aGUgYGtleS12YWx1ZXNgIEdTdHJlYW1lciB2YWx1ZSBsaXN0LgotICAgIGNvbnN0IEdWYWx1ZSog
a2V5VmFsdWVzTGlzdCA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlKHN0cnVjdHVyZSwgImtleS12
YWx1ZXMiKTsKLSAgICBBU1NFUlQoa2V5VmFsdWVzTGlzdCAmJiBHU1RfVkFMVUVfSE9MRFNfTElT
VChrZXlWYWx1ZXNMaXN0KSk7Ci0gICAgdW5zaWduZWQga2V5VmFsdWVzTGlzdFNpemUgPSBnc3Rf
dmFsdWVfbGlzdF9nZXRfc2l6ZShrZXlWYWx1ZXNMaXN0KTsKLQotICAgIC8vIEJhaWwgaWYgc29t
ZWhvdyB0aGUgdHdvIGxpc3RzIGRvbid0IG1hdGNoIGluIHNpemUuCi0gICAgaWYgKGtleUlEc0xp
c3RTaXplICE9IGtleVZhbHVlc0xpc3RTaXplKQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0KLSAg
ICAvLyBDbGVhciBvdXQgdGhlIHByZXZpb3VzIGxpc3Qgb2Yga2V5cy4KLSAgICBwcml2LT5rZXlz
LmNsZWFyKCk7Ci0KLSAgICAvLyBBcHBlbmQgdGhlIHJldHJpZXZlZCBHc3RCdWZmZXIgb2JqZWN0
cyBjb250YWluaW5nIGVhY2gga2V5J3MgSUQgYW5kIHZhbHVlIHRvIHRoZSBsaXN0IG9mIEtleSBv
YmplY3RzLgotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBrZXlJRHNMaXN0U2l6ZTsgKytp
KSB7Ci0gICAgICAgIEdSZWZQdHI8R3N0QnVmZmVyPiBrZXlJREJ1ZmZlcihnc3RfdmFsdWVfZ2V0
X2J1ZmZlcihnc3RfdmFsdWVfbGlzdF9nZXRfdmFsdWUoa2V5SURzTGlzdCwgaSkpKTsKLSAgICAg
ICAgR1JlZlB0cjxHc3RCdWZmZXI+IGtleVZhbHVlQnVmZmVyKGdzdF92YWx1ZV9nZXRfYnVmZmVy
KGdzdF92YWx1ZV9saXN0X2dldF92YWx1ZShrZXlWYWx1ZXNMaXN0LCBpKSkpOwotICAgICAgICBw
cml2LT5rZXlzLmFwcGVuZChLZXkgeyBXVEZNb3ZlKGtleUlEQnVmZmVyKSwgV1RGTW92ZShrZXlW
YWx1ZUJ1ZmZlcikgfSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLXN0YXRpYyBn
Ym9vbGVhbiB3ZWJLaXRNZWRpYUNsZWFyS2V5RGVjcnlwdG9yRmluZEFuZFNldEtleShXZWJLaXRN
ZWRpYUNsZWFyS2V5RGVjcnlwdFByaXZhdGUqIHByaXYsIGNvbnN0IFdlYkNvcmU6OkdzdE1hcHBl
ZEJ1ZmZlciYga2V5SURCdWZmZXIpCi17Ci0gICAgR1JlZlB0cjxHc3RCdWZmZXI+IGtleUJ1ZmZl
cjsKLSAgICBmb3IgKGF1dG8mIGtleSA6IHByaXYtPmtleXMpIHsKLSAgICAgICAgaWYgKGtleS5r
ZXlJRC5nZXQoKSA9PSBrZXlJREJ1ZmZlcikgewotICAgICAgICAgICAga2V5QnVmZmVyID0ga2V5
LmtleVZhbHVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBp
ZiAoIWtleUJ1ZmZlcikgewotICAgICAgICBHU1RfRVJST1JfT0JKRUNUKHByaXYsICJGYWlsZWQg
dG8gZmluZCBhbiBhcHByb3ByaWF0ZSBrZXkgYnVmZmVyIik7Ci0gICAgICAgIHJldHVybiBmYWxz
ZTsKLSAgICB9Ci0KLSAgICBXZWJDb3JlOjpHc3RNYXBwZWRCdWZmZXIgbWFwcGVkS2V5VmFsdWVC
dWZmZXIoa2V5QnVmZmVyLmdldCgpLCBHU1RfTUFQX1JFQUQpOwotICAgIGlmICghbWFwcGVkS2V5
VmFsdWVCdWZmZXIpIHsKLSAgICAgICAgR1NUX0VSUk9SX09CSkVDVChwcml2LCAiRmFpbGVkIHRv
IG1hcCBkZWNyeXB0aW9uIGtleSIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0g
ICAgQVNTRVJUKG1hcHBlZEtleVZhbHVlQnVmZmVyLnNpemUoKSA9PSBDTEVBUktFWV9TSVpFKTsK
LSAgICBpZiAoZ2NyeV9lcnJvcl90IGVycm9yID0gZ2NyeV9jaXBoZXJfc2V0a2V5KHByaXYtPmhh
bmRsZSwgbWFwcGVkS2V5VmFsdWVCdWZmZXIuZGF0YSgpLCBtYXBwZWRLZXlWYWx1ZUJ1ZmZlci5z
aXplKCkpKSB7Ci0gICAgICAgIEdTVF9FUlJPUl9PQkpFQ1QocHJpdiwgImdjcnlfY2lwaGVyX3Nl
dGtleSBmYWlsZWQ6ICVzIiwgZ3BnX3N0cmVycm9yKGVycm9yKSk7Ci0gICAgICAgIHJldHVybiBm
YWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGdib29sZWFuIHdl
YktpdE1lZGlhQ2xlYXJLZXlEZWNyeXB0b3JEZWNyeXB0KFdlYktpdE1lZGlhQ29tbW9uRW5jcnlw
dGlvbkRlY3J5cHQqIHNlbGYsIEdzdEJ1ZmZlciogaXZCdWZmZXIsIEdzdEJ1ZmZlcioga2V5SURC
dWZmZXIsIEdzdEJ1ZmZlciogYnVmZmVyLCB1bnNpZ25lZCBzdWJTYW1wbGVDb3VudCwgR3N0QnVm
ZmVyKiBzdWJTYW1wbGVzQnVmZmVyKQotewotICAgIC8vIENoZWNrIGl2QnVmZmVyIGlzbid0IG51
bGwuCi0gICAgaWYgKCFpdkJ1ZmZlcikgewotICAgICAgICBHU1RfRVJST1JfT0JKRUNUKHNlbGYs
ICJFcnJvciwgdGhlIGl2QnVmZmVyIGlzIG51bGwiKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwot
ICAgIH0KLQotICAgIFdlYkNvcmU6OkdzdE1hcHBlZEJ1ZmZlciBtYXBwZWRJVkJ1ZmZlcihpdkJ1
ZmZlciwgR1NUX01BUF9SRUFEKTsKLSAgICBpZiAoIW1hcHBlZElWQnVmZmVyKSB7Ci0gICAgICAg
IEdTVF9FUlJPUl9PQkpFQ1Qoc2VsZiwgIkZhaWxlZCB0byBtYXAgSVYiKTsKLSAgICAgICAgcmV0
dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHVpbnQ4X3QgY3RyW0NMRUFSS0VZX1NJWkVdOwotICAg
IGlmIChtYXBwZWRJVkJ1ZmZlci5zaXplKCkgPT0gOCkgewotICAgICAgICBtZW1zZXQoY3RyICsg
OCwgMCwgOCk7Ci0gICAgICAgIG1lbWNweShjdHIsIG1hcHBlZElWQnVmZmVyLmRhdGEoKSwgOCk7
Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQVNTRVJUKG1hcHBlZElWQnVmZmVyLnNpemUoKSA9PSBD
TEVBUktFWV9TSVpFKTsKLSAgICAgICAgbWVtY3B5KGN0ciwgbWFwcGVkSVZCdWZmZXIuZGF0YSgp
LCBDTEVBUktFWV9TSVpFKTsKLSAgICB9Ci0KLSAgICBXZWJLaXRNZWRpYUNsZWFyS2V5RGVjcnlw
dFByaXZhdGUqIHByaXYgPSBXRUJLSVRfTUVESUFfQ0tfREVDUllQVF9HRVRfUFJJVkFURShXRUJL
SVRfTUVESUFfQ0tfREVDUllQVChzZWxmKSk7Ci0gICAgZ2NyeV9lcnJvcl90IGNpcGhlckVycm9y
ID0gZ2NyeV9jaXBoZXJfc2V0Y3RyKHByaXYtPmhhbmRsZSwgY3RyLCBDTEVBUktFWV9TSVpFKTsK
LSAgICBpZiAoY2lwaGVyRXJyb3IpIHsKLSAgICAgICAgR1NUX0VSUk9SX09CSkVDVChzZWxmLCAi
Z2NyeV9jaXBoZXJfc2V0Y3RyIGZhaWxlZDogJXMiLCBncGdfc3RyZXJyb3IoY2lwaGVyRXJyb3Ip
KTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8vIENoZWNrIGJ1ZmZlciBp
c24ndCBudWxsLgotICAgIGlmICghYnVmZmVyKSB7Ci0gICAgICAgIEdTVF9FUlJPUl9PQkpFQ1Qo
c2VsZiwgIk5vIGJ1ZmZlciB0byBkZWNyeXB0Iik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAg
ICB9Ci0KLSAgICBXZWJDb3JlOjpHc3RNYXBwZWRCdWZmZXIgbWFwcGVkS2V5SWRCdWZmZXIoa2V5
SURCdWZmZXIsIEdTVF9NQVBfUkVBRCk7Ci0gICAgaWYgKCFtYXBwZWRLZXlJZEJ1ZmZlcikgewot
ICAgICAgICBHU1RfRVJST1JfT0JKRUNUKHNlbGYsICJGYWlsZWQgdG8gbWFwIGtleSBpZCBidWZm
ZXIiKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIFdlYkNvcmU6OkdzdE1h
cHBlZEJ1ZmZlciBtYXBwZWRCdWZmZXIoYnVmZmVyLCBHU1RfTUFQX1JFQURXUklURSk7Ci0gICAg
aWYgKCFtYXBwZWRCdWZmZXIpIHsKLSAgICAgICAgR1NUX0VSUk9SX09CSkVDVChzZWxmLCAiRmFp
bGVkIHRvIG1hcCBidWZmZXIiKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAg
IHdlYktpdE1lZGlhQ2xlYXJLZXlEZWNyeXB0b3JGaW5kQW5kU2V0S2V5KHByaXYsIG1hcHBlZEtl
eUlkQnVmZmVyKTsKLQotICAgIHVuc2lnbmVkIHBvc2l0aW9uID0gMDsKLSAgICB1bnNpZ25lZCBz
YW1wbGVJbmRleCA9IDA7Ci0KLSAgICBpZiAoIXN1YlNhbXBsZUNvdW50KSB7Ci0gICAgICAgIC8v
IEZ1bGwgc2FtcGxlIGVuY3J5cHRpb24uCi0gICAgICAgIEdTVF9UUkFDRV9PQkpFQ1Qoc2VsZiwg
ImZ1bGwgc2FtcGxlIGVuY3J5cHRpb246ICV6dSBlbmNyeXB0ZWQgYnl0ZXMiLCBtYXBwZWRCdWZm
ZXIuc2l6ZSgpKTsKLQotICAgICAgICAvLyBDaGVjayBpZiB0aGUgYnVmZmVyIGlzIGVtcHR5Lgot
ICAgICAgICBpZiAobWFwcGVkQnVmZmVyLnNpemUoKSkgewotICAgICAgICAgICAgY2lwaGVyRXJy
b3IgPSBnY3J5X2NpcGhlcl9kZWNyeXB0KHByaXYtPmhhbmRsZSwgbWFwcGVkQnVmZmVyLmRhdGEo
KSwgbWFwcGVkQnVmZmVyLnNpemUoKSwgMCwgMCk7Ci0gICAgICAgICAgICBpZiAoY2lwaGVyRXJy
b3IpIHsKLSAgICAgICAgICAgICAgICBHU1RfRVJST1JfT0JKRUNUKHNlbGYsICJmdWxsIHNhbXBs
ZSBkZWNyeXB0aW9uIGZhaWxlZDogJXMiLCBncGdfc3RyZXJyb3IoY2lwaGVyRXJyb3IpKTsKLSAg
ICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAg
ICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLy8gQ2hlY2sgc3ViU2FtcGxlc0J1ZmZl
ciBpc24ndCBudWxsLgotICAgIGlmICghc3ViU2FtcGxlc0J1ZmZlcikgewotICAgICAgICBHU1Rf
RVJST1JfT0JKRUNUKHNlbGYsICJFcnJvciwgdGhlIHN1YlNhbXBsZUJ1ZmZlciBpcyBudWxsIik7
Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBTdWJzYW1wbGUgZW5jcnlw
dGlvbi4KLSAgICBXZWJDb3JlOjpHc3RNYXBwZWRCdWZmZXIgbWFwcGVkU3ViU2FtcGxlc0J1ZmZl
cihzdWJTYW1wbGVzQnVmZmVyLCBHU1RfTUFQX1JFQUQpOwotICAgIGlmICghbWFwcGVkU3ViU2Ft
cGxlc0J1ZmZlcikgewotICAgICAgICBHU1RfRVJST1JfT0JKRUNUKHNlbGYsICJGYWlsZWQgdG8g
bWFwIHN1YnNhbXBsZSBidWZmZXIiKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQot
ICAgIEdVbmlxdWVQdHI8R3N0Qnl0ZVJlYWRlcj4gcmVhZGVyKGdzdF9ieXRlX3JlYWRlcl9uZXco
bWFwcGVkU3ViU2FtcGxlc0J1ZmZlci5kYXRhKCksIG1hcHBlZFN1YlNhbXBsZXNCdWZmZXIuc2l6
ZSgpKSk7Ci0gICAgR1NUX0RFQlVHX09CSkVDVChzZWxmLCAicG9zaXRpb246ICVkLCBzaXplOiAl
enUiLCBwb3NpdGlvbiwgbWFwcGVkQnVmZmVyLnNpemUoKSk7Ci0KLSAgICB3aGlsZSAocG9zaXRp
b24gPCBtYXBwZWRCdWZmZXIuc2l6ZSgpKSB7Ci0gICAgICAgIGd1aW50MTYgbkJ5dGVzQ2xlYXIg
PSAwOwotICAgICAgICBndWludDMyIG5CeXRlc0VuY3J5cHRlZCA9IDA7Ci0KLSAgICAgICAgaWYg
KHNhbXBsZUluZGV4IDwgc3ViU2FtcGxlQ291bnQpIHsKLSAgICAgICAgICAgIGlmICghZ3N0X2J5
dGVfcmVhZGVyX2dldF91aW50MTZfYmUocmVhZGVyLmdldCgpLCAmbkJ5dGVzQ2xlYXIpCi0gICAg
ICAgICAgICAgICAgfHwgIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlKHJlYWRlci5nZXQo
KSwgJm5CeXRlc0VuY3J5cHRlZCkpIHsKLSAgICAgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNU
KHNlbGYsICJ1bnN1cHBvcnRlZCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAg
ICAgICAgICAgIH0KLSAgICAgICAgICAgIHNhbXBsZUluZGV4Kys7Ci0gICAgICAgIH0gZWxzZSB7
Ci0gICAgICAgICAgICBuQnl0ZXNDbGVhciA9IDA7Ci0gICAgICAgICAgICBuQnl0ZXNFbmNyeXB0
ZWQgPSBtYXBwZWRCdWZmZXIuc2l6ZSgpIC0gcG9zaXRpb247Ci0gICAgICAgIH0KLQotICAgICAg
ICBHU1RfVFJBQ0VfT0JKRUNUKHNlbGYsICJzdWJzYW1wbGUgaW5kZXggJXUgLSAlaHUgYnl0ZXMg
Y2xlYXIgKHRvZG89JXp1KSIsIHNhbXBsZUluZGV4LCBuQnl0ZXNDbGVhciwgbWFwcGVkQnVmZmVy
LnNpemUoKSAtIHBvc2l0aW9uKTsKLSAgICAgICAgcG9zaXRpb24gKz0gbkJ5dGVzQ2xlYXI7Ci0g
ICAgICAgIGlmIChuQnl0ZXNFbmNyeXB0ZWQpIHsKLSAgICAgICAgICAgIEdTVF9UUkFDRV9PQkpF
Q1Qoc2VsZiwgInN1YnNhbXBsZSBpbmRleCAldSAtICV1IGJ5dGVzIGVuY3J5cHRlZCAodG9kbz0l
enUpIiwgc2FtcGxlSW5kZXgsIG5CeXRlc0VuY3J5cHRlZCwgbWFwcGVkQnVmZmVyLnNpemUoKSAt
IHBvc2l0aW9uKTsKLSAgICAgICAgICAgIGNpcGhlckVycm9yID0gZ2NyeV9jaXBoZXJfZGVjcnlw
dChwcml2LT5oYW5kbGUsIG1hcHBlZEJ1ZmZlci5kYXRhKCkgKyBwb3NpdGlvbiwgbkJ5dGVzRW5j
cnlwdGVkLCAwLCAwKTsKLSAgICAgICAgICAgIGlmIChjaXBoZXJFcnJvcikgewotICAgICAgICAg
ICAgICAgIEdTVF9FUlJPUl9PQkpFQ1Qoc2VsZiwgInN1YiBzYW1wbGUgaW5kZXggJXUgZGVjcnlw
dGlvbiBmYWlsZWQ6ICVzIiwgc2FtcGxlSW5kZXgsIGdwZ19zdHJlcnJvcihjaXBoZXJFcnJvcikp
OwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAg
ICAgIHBvc2l0aW9uICs9IG5CeXRlc0VuY3J5cHRlZDsKLSAgICAgICAgfQotICAgIH0KLQotICAg
IHJldHVybiB0cnVlOwotfQotCi0jZW5kaWYgLy8gRU5BQkxFKEVOQ1JZUFRFRF9NRURJQSkgJiYg
VVNFKEdTVFJFQU1FUikKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL2dzdHJlYW1lci9lbWUvV2ViS2l0Q2xlYXJLZXlEZWNyeXB0b3JHU3RyZWFtZXIuaCBiL1Nv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2dzdHJlYW1lci9lbWUvV2ViS2l0Q2xlYXJL
ZXlEZWNyeXB0b3JHU3RyZWFtZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTMy
MTUxNzc5MjMyMDExNTI5MGZhMTFjNzYxODFlNTk1ODA3ZWVhNy4uMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9nc3RyZWFtZXIvZW1lL1dlYktpdENsZWFyS2V5RGVjcnlwdG9yR1N0cmVhbWVyLmgKKysr
IC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKiBHU3RyZWFtZXIgQ2xlYXJLZXkgY29tbW9u
IGVuY3J5cHRpb24gZGVjcnlwdG9yCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDE2IE1ldHJvbG9n
aWNhbAotICogQ29weXJpZ2h0IChDKSAyMDE2IElnYWxpYSBTLkwKLSAqCi0gKiBUaGlzIGxpYnJh
cnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBt
b2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1Ymxp
YwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlv
bjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlv
bikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVk
IGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkg
V0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hB
TlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBH
TlUKLSAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgot
ICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5
IEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBu
b3QsIHdyaXRlIHRvIHRoZQotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBG
cmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCi0gKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4K
LSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2lmIEVOQUJMRShFTkNSWVBURURfTUVESUEpICYmIFVT
RShHU1RSRUFNRVIpCi0KLSNpbmNsdWRlICJXZWJLaXRDb21tb25FbmNyeXB0aW9uRGVjcnlwdG9y
R1N0cmVhbWVyLmgiCi0KLUdfQkVHSU5fREVDTFMKLQotI2RlZmluZSBXRUJLSVRfVFlQRV9NRURJ
QV9DS19ERUNSWVBUICAgICAgICAgICh3ZWJraXRfbWVkaWFfY2xlYXJfa2V5X2RlY3J5cHRfZ2V0
X3R5cGUoKSkKLSNkZWZpbmUgV0VCS0lUX01FRElBX0NLX0RFQ1JZUFQob2JqKSAgICAgICAgICAo
R19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksIFdFQktJVF9UWVBFX01FRElBX0NLX0RF
Q1JZUFQsIFdlYktpdE1lZGlhQ2xlYXJLZXlEZWNyeXB0KSkKLSNkZWZpbmUgV0VCS0lUX01FRElB
X0NLX0RFQ1JZUFRfQ0xBU1Moa2xhc3MpICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNz
KSwgV0VCS0lUX1RZUEVfTUVESUFfQ0tfREVDUllQVCwgV2ViS2l0TWVkaWFDbGVhcktleURlY3J5
cHRDbGFzcykpCi0jZGVmaW5lIFdFQktJVF9JU19NRURJQV9DS19ERUNSWVBUKG9iaikgICAgICAg
KEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLCBXRUJLSVRfVFlQRV9NRURJQV9DS19E
RUNSWVBUKSkKLSNkZWZpbmUgV0VCS0lUX0lTX01FRElBX0NLX0RFQ1JZUFRfQ0xBU1Mob2JqKSAo
R19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSwgV0VCS0lUX1RZUEVfTUVESUFfQ0tfREVD
UllQVCkpCi0KLXR5cGVkZWYgc3RydWN0IF9XZWJLaXRNZWRpYUNsZWFyS2V5RGVjcnlwdCAgICAg
ICAgV2ViS2l0TWVkaWFDbGVhcktleURlY3J5cHQ7Ci10eXBlZGVmIHN0cnVjdCBfV2ViS2l0TWVk
aWFDbGVhcktleURlY3J5cHRDbGFzcyAgIFdlYktpdE1lZGlhQ2xlYXJLZXlEZWNyeXB0Q2xhc3M7
Ci10eXBlZGVmIHN0cnVjdCBfV2ViS2l0TWVkaWFDbGVhcktleURlY3J5cHRQcml2YXRlIFdlYktp
dE1lZGlhQ2xlYXJLZXlEZWNyeXB0UHJpdmF0ZTsKLQotR1R5cGUgd2Via2l0X21lZGlhX2NsZWFy
X2tleV9kZWNyeXB0X2dldF90eXBlKHZvaWQpOwotCi1zdHJ1Y3QgX1dlYktpdE1lZGlhQ2xlYXJL
ZXlEZWNyeXB0IHsKLSAgICBXZWJLaXRNZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNyeXB0IHBhcmVu
dDsKLQotICAgIFdlYktpdE1lZGlhQ2xlYXJLZXlEZWNyeXB0UHJpdmF0ZSogcHJpdjsKLX07Ci0K
LXN0cnVjdCBfV2ViS2l0TWVkaWFDbGVhcktleURlY3J5cHRDbGFzcyB7Ci0gICAgV2ViS2l0TWVk
aWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdENsYXNzIHBhcmVudENsYXNzOwotfTsKLQotR19FTkRf
REVDTFMKLQotI2VuZGlmIC8vIEVOQUJMRShFTkNSWVBURURfTUVESUEpICYmIFVTRShHU1RSRUFN
RVIpCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9nc3RyZWFt
ZXIvZW1lL1dlYktpdENvbW1vbkVuY3J5cHRpb25EZWNyeXB0b3JHU3RyZWFtZXIuY3BwIGIvU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZ3N0cmVhbWVyL2VtZS9XZWJLaXRDb21tb25F
bmNyeXB0aW9uRGVjcnlwdG9yR1N0cmVhbWVyLmNwcAppbmRleCA4YmZmMzhjMDM5YmI5ZjExMGE4
NTVjZjE4MWNlN2NlN2M3MThkNjVhLi4wM2FjMjQ0M2QwMzQxYjVlODdhOTVjMDFhMjgwZTYxM2Fl
OWQ3ZDIwIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9nc3Ry
ZWFtZXIvZW1lL1dlYktpdENvbW1vbkVuY3J5cHRpb25EZWNyeXB0b3JHU3RyZWFtZXIuY3BwCisr
KyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2dzdHJlYW1lci9lbWUvV2ViS2l0
Q29tbW9uRW5jcnlwdGlvbkRlY3J5cHRvckdTdHJlYW1lci5jcHAKQEAgLTI2LDYgKzI2LDcgQEAK
ICNpZiBFTkFCTEUoRU5DUllQVEVEX01FRElBKSAmJiBVU0UoR1NUUkVBTUVSKQogCiAjaW5jbHVk
ZSAiR1N0cmVhbWVyQ29tbW9uLmgiCisjaW5jbHVkZSAiR1N0cmVhbWVyRU1FVXRpbGl0aWVzLmgi
CiAjaW5jbHVkZSA8Q0RNSW5zdGFuY2UuaD4KICNpbmNsdWRlIDx3dGYvQ29uZGl0aW9uLmg+CiAj
aW5jbHVkZSA8d3RmL1ByaW50U3RyZWFtLmg+CkBAIC0zNSwxOSArMzYsMTggQEAKIHN0cnVjdCBf
V2ViS2l0TWVkaWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdFByaXZhdGUgewogICAgIEdSZWZQdHI8
R3N0RXZlbnQ+IHByb3RlY3Rpb25FdmVudDsKICAgICBSZWZQdHI8V2ViQ29yZTo6Q0RNSW5zdGFu
Y2U+IGNkbUluc3RhbmNlOwotICAgIGJvb2wga2V5UmVjZWl2ZWQ7CisgICAgYm9vbCBrZXlSZWNl
aXZlZCB7IGZhbHNlIH07CiAgICAgYm9vbCB3YWl0aW5nRm9yS2V5IHsgZmFsc2UgfTsKICAgICBM
b2NrIG11dGV4OwogICAgIENvbmRpdGlvbiBjb25kaXRpb247CiB9OwogCi1zdGF0aWMgR3N0U3Rh
dGVDaGFuZ2VSZXR1cm4gd2ViS2l0TWVkaWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdG9yQ2hhbmdl
U3RhdGUoR3N0RWxlbWVudCosIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pOwotc3RhdGljIHZv
aWQgd2ViS2l0TWVkaWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdG9yRmluYWxpemUoR09iamVjdCop
Owotc3RhdGljIEdzdENhcHMqIHdlYmtpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5cHRUcmFu
c2Zvcm1DYXBzKEdzdEJhc2VUcmFuc2Zvcm0qLCBHc3RQYWREaXJlY3Rpb24sIEdzdENhcHMqLCBH
c3RDYXBzKik7Ci1zdGF0aWMgR3N0Rmxvd1JldHVybiB3ZWJraXRNZWRpYUNvbW1vbkVuY3J5cHRp
b25EZWNyeXB0VHJhbnNmb3JtSW5QbGFjZShHc3RCYXNlVHJhbnNmb3JtKiwgR3N0QnVmZmVyKik7
Ci1zdGF0aWMgZ2Jvb2xlYW4gd2Via2l0TWVkaWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdFNpbmtF
dmVudEhhbmRsZXIoR3N0QmFzZVRyYW5zZm9ybSosIEdzdEV2ZW50Kik7Ci1zdGF0aWMgZ2Jvb2xl
YW4gd2Via2l0TWVkaWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdG9yUXVlcnlIYW5kbGVyKEdzdEJh
c2VUcmFuc2Zvcm0qLCBHc3RQYWREaXJlY3Rpb24sIEdzdFF1ZXJ5Kik7Ci0KK3N0YXRpYyBHc3RT
dGF0ZUNoYW5nZVJldHVybiBjaGFuZ2VTdGF0ZShHc3RFbGVtZW50KiwgR3N0U3RhdGVDaGFuZ2Ug
dHJhbnNpdGlvbik7CitzdGF0aWMgdm9pZCBmaW5hbGl6ZShHT2JqZWN0Kik7CitzdGF0aWMgR3N0
Q2FwcyogdHJhbnNmb3JtQ2FwcyhHc3RCYXNlVHJhbnNmb3JtKiwgR3N0UGFkRGlyZWN0aW9uLCBH
c3RDYXBzKiwgR3N0Q2FwcyopOworc3RhdGljIEdzdEZsb3dSZXR1cm4gdHJhbnNmb3JtSW5QbGFj
ZShHc3RCYXNlVHJhbnNmb3JtKiwgR3N0QnVmZmVyKik7CitzdGF0aWMgZ2Jvb2xlYW4gc2lua0V2
ZW50SGFuZGxlcihHc3RCYXNlVHJhbnNmb3JtKiwgR3N0RXZlbnQqKTsKK3N0YXRpYyBnYm9vbGVh
biBxdWVyeUhhbmRsZXIoR3N0QmFzZVRyYW5zZm9ybSosIEdzdFBhZERpcmVjdGlvbiwgR3N0UXVl
cnkqKTsKIAogR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyh3ZWJraXRfbWVkaWFfY29tbW9uX2Vu
Y3J5cHRpb25fZGVjcnlwdF9kZWJ1Z19jYXRlZ29yeSk7CiAjZGVmaW5lIEdTVF9DQVRfREVGQVVM
VCB3ZWJraXRfbWVkaWFfY29tbW9uX2VuY3J5cHRpb25fZGVjcnlwdF9kZWJ1Z19jYXRlZ29yeQpA
QCAtNTUsMjMgKzU1LDQ4IEBAIEdTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMod2Via2l0X21lZGlh
X2NvbW1vbl9lbmNyeXB0aW9uX2RlY3J5cHRfZGVidWdfY2F0ZWdvcnkpCiAjZGVmaW5lIHdlYmtp
dF9tZWRpYV9jb21tb25fZW5jcnlwdGlvbl9kZWNyeXB0X3BhcmVudF9jbGFzcyBwYXJlbnRfY2xh
c3MKIEdfREVGSU5FX1RZUEUoV2ViS2l0TWVkaWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdCwgd2Vi
a2l0X21lZGlhX2NvbW1vbl9lbmNyeXB0aW9uX2RlY3J5cHQsIEdTVF9UWVBFX0JBU0VfVFJBTlNG
T1JNKTsKIAorc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmtUZW1wbGF0ZSA9IEdTVF9T
VEFUSUNfUEFEX1RFTVBMQVRFKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BB
RF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTKCJhcHBsaWNhdGlvbi94LWNlbmMsIG9yaWdp
bmFsLW1lZGlhLXR5cGU9KHN0cmluZyl2aWRlby94LWgyNjQsIHByb3RlY3Rpb24tc3lzdGVtPShz
dHJpbmcpIiBXRUJDT1JFX0dTVFJFQU1FUl9FTUVfVVRJTElUSUVTX0NMRUFSS0VZX1VVSUQgIjsg
IgorICAgICJhcHBsaWNhdGlvbi94LWNlbmMsIG9yaWdpbmFsLW1lZGlhLXR5cGU9KHN0cmluZylh
dWRpby9tcGVnLCBwcm90ZWN0aW9uLXN5c3RlbT0oc3RyaW5nKSIgV0VCQ09SRV9HU1RSRUFNRVJf
RU1FX1VUSUxJVElFU19DTEVBUktFWV9VVUlEIjsiCisgICAgImFwcGxpY2F0aW9uL3gtd2VibS1l
bmMsIG9yaWdpbmFsLW1lZGlhLXR5cGU9KHN0cmluZyl2aWRlby94LXZwODsiCisgICAgImFwcGxp
Y2F0aW9uL3gtd2VibS1lbmMsIG9yaWdpbmFsLW1lZGlhLXR5cGU9KHN0cmluZyl2aWRlby94LXZw
OTsiKSk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzcmNUZW1wbGF0ZSA9IEdTVF9T
VEFUSUNfUEFEX1RFTVBMQVRFKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURf
QUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUygidmlkZW8veC1oMjY0OyBhdWRpby9tcGVnOyB2
aWRlby94LXZwODsgdmlkZW8veC12cDkiKSk7CisKIHN0YXRpYyB2b2lkIHdlYmtpdF9tZWRpYV9j
b21tb25fZW5jcnlwdGlvbl9kZWNyeXB0X2NsYXNzX2luaXQoV2ViS2l0TWVkaWFDb21tb25FbmNy
eXB0aW9uRGVjcnlwdENsYXNzKiBrbGFzcykKIHsKICAgICBHT2JqZWN0Q2xhc3MqIGdvYmplY3RD
bGFzcyA9IEdfT0JKRUNUX0NMQVNTKGtsYXNzKTsKLSAgICBnb2JqZWN0Q2xhc3MtPmZpbmFsaXpl
ID0gd2ViS2l0TWVkaWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdG9yRmluYWxpemU7CisgICAgZ29i
amVjdENsYXNzLT5maW5hbGl6ZSA9IGZpbmFsaXplOworCisgICAgR3N0RWxlbWVudENsYXNzKiBl
bGVtZW50Q2xhc3MgPSBHU1RfRUxFTUVOVF9DTEFTUyhrbGFzcyk7CisgICAgZ3N0X2VsZW1lbnRf
Y2xhc3NfYWRkX3BhZF90ZW1wbGF0ZShlbGVtZW50Q2xhc3MsIGdzdF9zdGF0aWNfcGFkX3RlbXBs
YXRlX2dldCgmc2lua1RlbXBsYXRlKSk7CisgICAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3BhZF90
ZW1wbGF0ZShlbGVtZW50Q2xhc3MsIGdzdF9zdGF0aWNfcGFkX3RlbXBsYXRlX2dldCgmc3JjVGVt
cGxhdGUpKTsKKworICAgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEoZWxl
bWVudENsYXNzLAorICAgICAgICAiRGVjcnlwdCBjb250ZW50IGNyZWF0ZWQgZm9yIEVNRSIsCisg
ICAgICAgIEdTVF9FTEVNRU5UX0ZBQ1RPUllfS0xBU1NfREVDUllQVE9SLAorICAgICAgICAiRGVj
cnlwdG9yIGVsZW1lbnQgdGhhdCBpbnRlcmZhY2VzIHRvIFdlYktpdCBDRE0gQVBJcyIsCisgICAg
ICAgICJJZ2FsaWEgUy5MIik7CiAKICAgICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCh3ZWJraXRf
bWVkaWFfY29tbW9uX2VuY3J5cHRpb25fZGVjcnlwdF9kZWJ1Z19jYXRlZ29yeSwKLSAgICAgICAg
IndlYmtpdGNlbmMiLCAwLCAiQ29tbW9uIEVuY3J5cHRpb24gYmFzZSBjbGFzcyIpOworICAgICAg
ICAid2Via2l0Y2VuYyIsIDAsICJXZWJLaXQgZGVjcnlwdG9yIik7CiAKLSAgICBHc3RFbGVtZW50
Q2xhc3MqIGVsZW1lbnRDbGFzcyA9IEdTVF9FTEVNRU5UX0NMQVNTKGtsYXNzKTsKLSAgICBlbGVt
ZW50Q2xhc3MtPmNoYW5nZV9zdGF0ZSA9IEdTVF9ERUJVR19GVU5DUFRSKHdlYktpdE1lZGlhQ29t
bW9uRW5jcnlwdGlvbkRlY3J5cHRvckNoYW5nZVN0YXRlKTsKKyAgICBlbGVtZW50Q2xhc3MtPmNo
YW5nZV9zdGF0ZSA9IEdTVF9ERUJVR19GVU5DUFRSKGNoYW5nZVN0YXRlKTsKIAogICAgIEdzdEJh
c2VUcmFuc2Zvcm1DbGFzcyogYmFzZVRyYW5zZm9ybUNsYXNzID0gR1NUX0JBU0VfVFJBTlNGT1JN
X0NMQVNTKGtsYXNzKTsKLSAgICBiYXNlVHJhbnNmb3JtQ2xhc3MtPnRyYW5zZm9ybV9pcCA9IEdT
VF9ERUJVR19GVU5DUFRSKHdlYmtpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5cHRUcmFuc2Zv
cm1JblBsYWNlKTsKLSAgICBiYXNlVHJhbnNmb3JtQ2xhc3MtPnRyYW5zZm9ybV9jYXBzID0gR1NU
X0RFQlVHX0ZVTkNQVFIod2Via2l0TWVkaWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdFRyYW5zZm9y
bUNhcHMpOworICAgIGJhc2VUcmFuc2Zvcm1DbGFzcy0+dHJhbnNmb3JtX2lwID0gR1NUX0RFQlVH
X0ZVTkNQVFIodHJhbnNmb3JtSW5QbGFjZSk7CisgICAgYmFzZVRyYW5zZm9ybUNsYXNzLT50cmFu
c2Zvcm1fY2FwcyA9IEdTVF9ERUJVR19GVU5DUFRSKHRyYW5zZm9ybUNhcHMpOwogICAgIGJhc2VU
cmFuc2Zvcm1DbGFzcy0+dHJhbnNmb3JtX2lwX29uX3Bhc3N0aHJvdWdoID0gRkFMU0U7Ci0gICAg
YmFzZVRyYW5zZm9ybUNsYXNzLT5zaW5rX2V2ZW50ID0gR1NUX0RFQlVHX0ZVTkNQVFIod2Via2l0
TWVkaWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdFNpbmtFdmVudEhhbmRsZXIpOwotICAgIGJhc2VU
cmFuc2Zvcm1DbGFzcy0+cXVlcnkgPSBHU1RfREVCVUdfRlVOQ1BUUih3ZWJraXRNZWRpYUNvbW1v
bkVuY3J5cHRpb25EZWNyeXB0b3JRdWVyeUhhbmRsZXIpOworICAgIGJhc2VUcmFuc2Zvcm1DbGFz
cy0+c2lua19ldmVudCA9IEdTVF9ERUJVR19GVU5DUFRSKHNpbmtFdmVudEhhbmRsZXIpOworICAg
IGJhc2VUcmFuc2Zvcm1DbGFzcy0+cXVlcnkgPSBHU1RfREVCVUdfRlVOQ1BUUihxdWVyeUhhbmRs
ZXIpOworCisgICAgV2ViS2l0TWVkaWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdENsYXNzKiBjZW5j
Q2xhc3MgPSBXRUJLSVRfTUVESUFfQ0VOQ19ERUNSWVBUX0NMQVNTKGtsYXNzKTsKKyAgICBjZW5j
Q2xhc3MtPnByb3RlY3Rpb25TeXN0ZW1JZCA9IFdlYkNvcmU6OkdTdHJlYW1lckVNRVV0aWxpdGll
czo6c19DbGVhcktleVVVSUQ7CiAKICAgICBnX3R5cGVfY2xhc3NfYWRkX3ByaXZhdGUoa2xhc3Ms
IHNpemVvZihXZWJLaXRNZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNyeXB0UHJpdmF0ZSkpOwogfQpA
QCAtODksNyArMTE0LDcgQEAgc3RhdGljIHZvaWQgd2Via2l0X21lZGlhX2NvbW1vbl9lbmNyeXB0
aW9uX2RlY3J5cHRfaW5pdChXZWJLaXRNZWRpYUNvbW1vbkVuY3J5cHQKICAgICBnc3RfYmFzZV90
cmFuc2Zvcm1fc2V0X2dhcF9hd2FyZShiYXNlLCBGQUxTRSk7CiB9CiAKLXN0YXRpYyB2b2lkIHdl
YktpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5cHRvckZpbmFsaXplKEdPYmplY3QqIG9iamVj
dCkKK3N0YXRpYyB2b2lkIGZpbmFsaXplKEdPYmplY3QqIG9iamVjdCkKIHsKICAgICBXZWJLaXRN
ZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNyeXB0KiBzZWxmID0gV0VCS0lUX01FRElBX0NFTkNfREVD
UllQVChvYmplY3QpOwogICAgIFdlYktpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5cHRQcml2
YXRlKiBwcml2ID0gc2VsZi0+cHJpdjsKQEAgLTk4LDcgKzEyMyw3IEBAIHN0YXRpYyB2b2lkIHdl
YktpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5cHRvckZpbmFsaXplKEdPYmplY3QqIG9iamVj
dCkKICAgICBHU1RfQ0FMTF9QQVJFTlQoR19PQkpFQ1RfQ0xBU1MsIGZpbmFsaXplLCAob2JqZWN0
KSk7CiB9CiAKLXN0YXRpYyBHc3RDYXBzKiB3ZWJraXRNZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNy
eXB0VHJhbnNmb3JtQ2FwcyhHc3RCYXNlVHJhbnNmb3JtKiBiYXNlLCBHc3RQYWREaXJlY3Rpb24g
ZGlyZWN0aW9uLCBHc3RDYXBzKiBjYXBzLCBHc3RDYXBzKiBmaWx0ZXIpCitzdGF0aWMgR3N0Q2Fw
cyogdHJhbnNmb3JtQ2FwcyhHc3RCYXNlVHJhbnNmb3JtKiBiYXNlLCBHc3RQYWREaXJlY3Rpb24g
ZGlyZWN0aW9uLCBHc3RDYXBzKiBjYXBzLCBHc3RDYXBzKiBmaWx0ZXIpCiB7CiAgICAgaWYgKGRp
cmVjdGlvbiA9PSBHU1RfUEFEX1VOS05PV04pCiAgICAgICAgIHJldHVybiBudWxscHRyOwpAQCAt
MTkzLDcgKzIxOCw1MSBAQCBzdGF0aWMgR3N0Q2Fwcyogd2Via2l0TWVkaWFDb21tb25FbmNyeXB0
aW9uRGVjcnlwdFRyYW5zZm9ybUNhcHMoR3N0QmFzZVRyYW5zZm9ybQogICAgIHJldHVybiB0cmFu
c2Zvcm1lZENhcHM7CiB9CiAKLXN0YXRpYyBHc3RGbG93UmV0dXJuIHdlYmtpdE1lZGlhQ29tbW9u
RW5jcnlwdGlvbkRlY3J5cHRUcmFuc2Zvcm1JblBsYWNlKEdzdEJhc2VUcmFuc2Zvcm0qIGJhc2Us
IEdzdEJ1ZmZlciogYnVmZmVyKQorc3RhdGljIGJvb2wgcG9wdWxhdGVTdWJTYW1wbGVzKFdlYktp
dE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5cHQqIHNlbGYsIEdzdEJ1ZmZlciogc3ViU2FtcGxl
c0J1ZmZlciwgdWludDMyX3Qgc3ViU2FtcGxlQ291bnQsIHVpbnQzMl90IHRvdGFsU2FtcGxlU2l6
ZSwgVmVjdG9yPFdlYkNvcmU6OkNETUluc3RhbmNlOjpTdWJTYW1wbGU+JiBzdWJTYW1wbGVzKQor
eworICAgIGlmICghc3ViU2FtcGxlc0J1ZmZlcikgeworICAgICAgICBHU1RfRVJST1JfT0JKRUNU
KHNlbGYsICJzdWJzYW1wbGUgYnVmZmVyIGlzIG51bGwiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgIH0KKworICAgIFdlYkNvcmU6OkdzdE1hcHBlZEJ1ZmZlciBtYXBwZWRTdWJTYW1wbGVz
QnVmZmVyKHN1YlNhbXBsZXNCdWZmZXIsIEdTVF9NQVBfUkVBRCk7CisgICAgaWYgKCFtYXBwZWRT
dWJTYW1wbGVzQnVmZmVyKSB7CisgICAgICAgIEdTVF9FUlJPUl9PQkpFQ1Qoc2VsZiwgImZhaWxl
ZCB0byBtYXAgc3Vic2FtcGxlIGJ1ZmZlciIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
fQorCisgICAgdWludDMyX3QgcG9zaXRpb24gPSAwOworICAgIHVpbnQzMl90IHNhbXBsZUluZGV4
ID0gMDsKKworICAgIEdVbmlxdWVQdHI8R3N0Qnl0ZVJlYWRlcj4gcmVhZGVyKGdzdF9ieXRlX3Jl
YWRlcl9uZXcobWFwcGVkU3ViU2FtcGxlc0J1ZmZlci5kYXRhKCksIG1hcHBlZFN1YlNhbXBsZXNC
dWZmZXIuc2l6ZSgpKSk7CisKKyAgICB3aGlsZSAocG9zaXRpb24gPCB0b3RhbFNhbXBsZVNpemUp
IHsKKyAgICAgICAgdWludDE2X3QgbkJ5dGVzQ2xlYXIgPSAwOworICAgICAgICB1aW50MzJfdCBu
Qnl0ZXNFbmNyeXB0ZWQgPSAwOworCisgICAgICAgIGlmIChzYW1wbGVJbmRleCA8IHN1YlNhbXBs
ZUNvdW50KSB7CisgICAgICAgICAgICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDE2X2Jl
KHJlYWRlci5nZXQoKSwgJm5CeXRlc0NsZWFyKQorICAgICAgICAgICAgICAgIHx8ICFnc3RfYnl0
ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZShyZWFkZXIuZ2V0KCksICZuQnl0ZXNFbmNyeXB0ZWQpKSB7
CisgICAgICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVChzZWxmLCAic3Vic2FtcGxlcyBpbiBp
bmNvcnJlY3QgZm9ybWF0Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAg
ICAgICAgfQorICAgICAgICAgICAgc2FtcGxlSW5kZXgrKzsKKyAgICAgICAgfSBlbHNlIHsKKyAg
ICAgICAgICAgIG5CeXRlc0NsZWFyID0gMDsKKyAgICAgICAgICAgIG5CeXRlc0VuY3J5cHRlZCA9
IHRvdGFsU2FtcGxlU2l6ZSAtIHBvc2l0aW9uOworICAgICAgICB9CisKKyAgICAgICAgc3ViU2Ft
cGxlcy5hcHBlbmQoe25CeXRlc0NsZWFyLCBuQnl0ZXNFbmNyeXB0ZWR9KTsKKworICAgICAgICBH
U1RfVFJBQ0VfT0JKRUNUKHNlbGYsICJzdWJzYW1wbGUgaW5kZXggJXUgLSAlaHUgYnl0ZXMgY2xl
YXIgKHRvZG89JSIgUFJJdTMyICIpIiwgc2FtcGxlSW5kZXgsIG5CeXRlc0NsZWFyLCB0b3RhbFNh
bXBsZVNpemUgLSBwb3NpdGlvbik7CisgICAgICAgIHBvc2l0aW9uICs9IG5CeXRlc0NsZWFyICsg
bkJ5dGVzRW5jcnlwdGVkOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCisKK3N0YXRp
YyBHc3RGbG93UmV0dXJuIHRyYW5zZm9ybUluUGxhY2UoR3N0QmFzZVRyYW5zZm9ybSogYmFzZSwg
R3N0QnVmZmVyKiBidWZmZXIpCiB7CiAgICAgV2ViS2l0TWVkaWFDb21tb25FbmNyeXB0aW9uRGVj
cnlwdCogc2VsZiA9IFdFQktJVF9NRURJQV9DRU5DX0RFQ1JZUFQoYmFzZSk7CiAgICAgV2ViS2l0
TWVkaWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdFByaXZhdGUqIHByaXYgPSBXRUJLSVRfTUVESUFf
Q0VOQ19ERUNSWVBUX0dFVF9QUklWQVRFKHNlbGYpOwpAQCAtMjUwLDcgKzMxOSw3IEBAIHN0YXRp
YyBHc3RGbG93UmV0dXJuIHdlYmtpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5cHRUcmFuc2Zv
cm1JblBsYWNlKEdzdEJhc2VUCiAKICAgICBHU1RfREVCVUdfT0JKRUNUKGJhc2UsICJwcm90ZWN0
aW9uIG1ldGE6ICUiIEdTVF9QVFJfRk9STUFULCBwcm90ZWN0aW9uTWV0YS0+aW5mbyk7CiAKLSAg
ICB1bnNpZ25lZCBzdWJTYW1wbGVDb3VudDsKKyAgICB1aW50MzJfdCBzdWJTYW1wbGVDb3VudDsK
ICAgICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X3VpbnQocHJvdGVjdGlvbk1ldGEtPmluZm8sICJz
dWJzYW1wbGVfY291bnQiLCAmc3ViU2FtcGxlQ291bnQpKSB7CiAgICAgICAgIEdTVF9FUlJPUl9P
QkpFQ1Qoc2VsZiwgIkZhaWxlZCB0byBnZXQgc3Vic2FtcGxlX2NvdW50Iik7CiAgICAgICAgIGdz
dF9idWZmZXJfcmVtb3ZlX21ldGEoYnVmZmVyLCByZWludGVycHJldF9jYXN0PEdzdE1ldGEqPihw
cm90ZWN0aW9uTWV0YSkpOwpAQCAtMjcwLDcgKzMzOSw2IEBAIHN0YXRpYyBHc3RGbG93UmV0dXJu
IHdlYmtpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5cHRUcmFuc2Zvcm1JblBsYWNlKEdzdEJh
c2VUCiAgICAgfQogCiAgICAgdmFsdWUgPSBnc3Rfc3RydWN0dXJlX2dldF92YWx1ZShwcm90ZWN0
aW9uTWV0YS0+aW5mbywgImtpZCIpOwotCiAgICAgaWYgKCF2YWx1ZSkgewogICAgICAgICBHU1Rf
RVJST1JfT0JKRUNUKHNlbGYsICJGYWlsZWQgdG8gZ2V0IGtleSBpZCBmb3IgYnVmZmVyIik7CiAg
ICAgICAgIGdzdF9idWZmZXJfcmVtb3ZlX21ldGEoYnVmZmVyLCByZWludGVycHJldF9jYXN0PEdz
dE1ldGEqPihwcm90ZWN0aW9uTWV0YSkpOwpAQCAtMjg2LDEyICszNTQsNDYgQEAgc3RhdGljIEdz
dEZsb3dSZXR1cm4gd2Via2l0TWVkaWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdFRyYW5zZm9ybUlu
UGxhY2UoR3N0QmFzZVQKICAgICB9CiAKICAgICBHc3RCdWZmZXIqIGl2QnVmZmVyID0gZ3N0X3Zh
bHVlX2dldF9idWZmZXIodmFsdWUpOwotICAgIFdlYktpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRl
Y3J5cHRDbGFzcyoga2xhc3MgPSBXRUJLSVRfTUVESUFfQ0VOQ19ERUNSWVBUX0dFVF9DTEFTUyhz
ZWxmKTsKIAotICAgIEdTVF9UUkFDRV9PQkpFQ1Qoc2VsZiwgImRlY3J5cHRpbmciKTsKLSAgICBp
ZiAoIWtsYXNzLT5kZWNyeXB0KHNlbGYsIGl2QnVmZmVyLCBrZXlJREJ1ZmZlciwgYnVmZmVyLCBz
dWJTYW1wbGVDb3VudCwgc3ViU2FtcGxlc0J1ZmZlcikpIHsKLSAgICAgICAgR1NUX0VSUk9SX09C
SkVDVChzZWxmLCAiRGVjcnlwdGlvbiBmYWlsZWQiKTsKLSAgICAgICAgZ3N0X2J1ZmZlcl9yZW1v
dmVfbWV0YShidWZmZXIsIHJlaW50ZXJwcmV0X2Nhc3Q8R3N0TWV0YSo+KHByb3RlY3Rpb25NZXRh
KSk7CisgICAgaWYgKCFpdkJ1ZmZlcikgeworICAgICAgICBHU1RfRVJST1JfT0JKRUNUKHNlbGYs
ICJFcnJvciwgdGhlIGl2QnVmZmVyIGlzIG51bGwiKTsKKyAgICAgICAgcmV0dXJuIEdTVF9GTE9X
X05PVF9TVVBQT1JURUQ7CisgICAgfQorCisgICAgaWYgKCFidWZmZXIpIHsKKyAgICAgICAgR1NU
X0VSUk9SX09CSkVDVChzZWxmLCAiTm8gYnVmZmVyIHRvIGRlY3J5cHQiKTsKKyAgICAgICAgcmV0
dXJuIEdTVF9GTE9XX05PVF9TVVBQT1JURUQ7CisgICAgfQorCisgICAgV2ViQ29yZTo6R3N0TWFw
cGVkQnVmZmVyIG1hcHBlZElWQnVmZmVyKGl2QnVmZmVyLCBHU1RfTUFQX1JFQUQpOworICAgIGlm
ICghbWFwcGVkSVZCdWZmZXIpIHsKKyAgICAgICAgR1NUX0VSUk9SX09CSkVDVChzZWxmLCAiRmFp
bGVkIHRvIG1hcCBJViIpOworICAgICAgICByZXR1cm4gR1NUX0ZMT1dfTk9UX1NVUFBPUlRFRDsK
KyAgICB9CisKKyAgICBXZWJDb3JlOjpHc3RNYXBwZWRCdWZmZXIgbWFwcGVkS2V5SWRCdWZmZXIo
a2V5SURCdWZmZXIsIEdTVF9NQVBfUkVBRCk7CisgICAgaWYgKCFtYXBwZWRLZXlJZEJ1ZmZlcikg
eworICAgICAgICBHU1RfRVJST1JfT0JKRUNUKHNlbGYsICJGYWlsZWQgdG8gbWFwIGtleSBpZCBi
dWZmZXIiKTsKKyAgICAgICAgcmV0dXJuIEdTVF9GTE9XX05PVF9TVVBQT1JURUQ7CisgICAgfQor
CisgICAgV2ViQ29yZTo6R3N0TWFwcGVkQnVmZmVyIG1hcHBlZEJ1ZmZlcihidWZmZXIsIEdTVF9N
QVBfUkVBRFdSSVRFKTsKKyAgICBpZiAoIW1hcHBlZEJ1ZmZlcikgeworICAgICAgICBHU1RfRVJS
T1JfT0JKRUNUKHNlbGYsICJGYWlsZWQgdG8gbWFwIGJ1ZmZlciIpOworICAgICAgICByZXR1cm4g
R1NUX0ZMT1dfTk9UX1NVUFBPUlRFRDsKKyAgICB9CisKKyAgICBWZWN0b3I8V2ViQ29yZTo6Q0RN
SW5zdGFuY2U6OlN1YlNhbXBsZT4gc3ViU2FtcGxlczsKKyAgICBpZiAoc3ViU2FtcGxlQ291bnQg
JiYgIXBvcHVsYXRlU3ViU2FtcGxlcyhzZWxmLCBzdWJTYW1wbGVzQnVmZmVyLCBzdWJTYW1wbGVD
b3VudCwgbWFwcGVkQnVmZmVyLnNpemUoKSwgc3ViU2FtcGxlcykpIHsKKyAgICAgICAgR1NUX0VS
Uk9SX09CSkVDVChzZWxmLCAiZmFpbGVkIHRvIHBhcnNlIHN1YnNhbXBsZSByYW5nZXMiKTsKKyAg
ICAgICAgcmV0dXJuIEdTVF9GTE9XX05PVF9TVVBQT1JURUQ7CisgICAgfQorCisgICAgYXV0byBk
ZWNyeXB0aW9uQ29uZmlndXJhdGlvbiA9IFdlYkNvcmU6OkNETUluc3RhbmNlOjpEZWNyeXB0aW9u
Q29uZmlnOjpjcmVhdGVDZW5jQ29uZmlnKG1hcHBlZElWQnVmZmVyLnNoYXJlZEJ1ZmZlcigpLAor
ICAgICAgICBtYXBwZWRLZXlJZEJ1ZmZlci5zaGFyZWRCdWZmZXIoKSwKKyAgICAgICAgV1RGTW92
ZShzdWJTYW1wbGVzKSk7CisgICAgaWYgKCFwcml2LT5jZG1JbnN0YW5jZS0+ZGVjcnlwdChXVEZN
b3ZlKGRlY3J5cHRpb25Db25maWd1cmF0aW9uKSwgbWFwcGVkQnVmZmVyLmRhdGEoKSwgbWFwcGVk
QnVmZmVyLnNpemUoKSkpIHsKKyAgICAgICAgR1NUX0VSUk9SX09CSkVDVChzZWxmLCAiZmFpbGVk
IHRvIGRlY3J5cHQiKTsKICAgICAgICAgcmV0dXJuIEdTVF9GTE9XX05PVF9TVVBQT1JURUQ7CiAg
ICAgfQogCkBAIC0yOTksMTIgKzQwMSwxMSBAQCBzdGF0aWMgR3N0Rmxvd1JldHVybiB3ZWJraXRN
ZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNyeXB0VHJhbnNmb3JtSW5QbGFjZShHc3RCYXNlVAogICAg
IHJldHVybiBHU1RfRkxPV19PSzsKIH0KIAotCi1zdGF0aWMgZ2Jvb2xlYW4gd2Via2l0TWVkaWFD
b21tb25FbmNyeXB0aW9uRGVjcnlwdFNpbmtFdmVudEhhbmRsZXIoR3N0QmFzZVRyYW5zZm9ybSog
dHJhbnMsIEdzdEV2ZW50KiBldmVudCkKK3N0YXRpYyBnYm9vbGVhbiBzaW5rRXZlbnRIYW5kbGVy
KEdzdEJhc2VUcmFuc2Zvcm0qIHRyYW5zLCBHc3RFdmVudCogZXZlbnQpCiB7CiAgICAgV2ViS2l0
TWVkaWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdCogc2VsZiA9IFdFQktJVF9NRURJQV9DRU5DX0RF
Q1JZUFQodHJhbnMpOwogICAgIFdlYktpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5cHRQcml2
YXRlKiBwcml2ID0gV0VCS0lUX01FRElBX0NFTkNfREVDUllQVF9HRVRfUFJJVkFURShzZWxmKTsK
LSAgICBXZWJLaXRNZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNyeXB0Q2xhc3MqIGtsYXNzID0gV0VC
S0lUX01FRElBX0NFTkNfREVDUllQVF9HRVRfQ0xBU1Moc2VsZik7CisKICAgICBnYm9vbGVhbiBy
ZXN1bHQgPSBGQUxTRTsKIAogCkBAIC0zMTcsMTkgKzQxOCwzMyBAQCBzdGF0aWMgZ2Jvb2xlYW4g
d2Via2l0TWVkaWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdFNpbmtFdmVudEhhbmRsZXIoR3N0QmFz
ZVRyYW5zZgogICAgICAgICAvLyBldmVudHMgd2lsbCBub3QgYmUgaGFuZGxlZCBieSB0aGUgZGVt
dXhlciwgc28gdGhlIG11c3QgYmUKICAgICAgICAgLy8gaGFuZGxlZCBpbiBoZXJlLgogICAgICAg
ICBjb25zdCBHc3RTdHJ1Y3R1cmUqIHN0cnVjdHVyZSA9IGdzdF9ldmVudF9nZXRfc3RydWN0dXJl
KGV2ZW50KTsKLSAgICAgICAgZ3N0X3N0cnVjdHVyZV9nZXQoc3RydWN0dXJlLCAiY2RtLWluc3Rh
bmNlIiwgR19UWVBFX1BPSU5URVIsICZwcml2LT5jZG1JbnN0YW5jZSwgbnVsbHB0cik7CisKKyAg
ICAgICAgLy8gV2UgbXVzdCB1c2UgYSByYXcgcG9pbnRlciB0byByZWNlaXZlIHRoZSBiaXQtd2lz
ZSBjb3B5IGZyb20KKyAgICAgICAgLy8gZ2xpYidzIGxjb3B5X3ZhbHVlLiBJZiB5b3UgcGFzcyBh
biBhZGRyZXNzIHRvIGEgUmVmUHRyLCB5b3UKKyAgICAgICAgLy8gd2lsbCBiaXR3aXNlIGNvcHkg
b3ZlciB0aGUgZmlyc3QgZmllbGQgb2YgdGhhdCBjbGFzcywgd2hpY2gKKyAgICAgICAgLy8ganVz
dCBzbyBoYXBwZW5zIHRvIGJlIGEgcG9pbnRlciBhbmQgZHJhZ29ucyBkb24ndCBjb21lIG91dAor
ICAgICAgICAvLyBvZiB5b3VyIG5vc2UuIEhvd2V2ZXIsIHRoaXMgd2lsbCBieXBhc3MgdGhlIHJl
Zi1jb3VudGluZworICAgICAgICAvLyBtYWNoaW5hcnkgaW4gdGhlIFJlZlB0ciBjbGFzcywgd2hp
Y2ggbWVhbnMgd2UnbGwgbG9zZSBhCisgICAgICAgIC8vIHJlZmVyZW5jZS4KKyAgICAgICAgV2Vi
Q29yZTo6Q0RNSW5zdGFuY2UqIGluc3RhbmNlID0gbnVsbHB0cjsKKyAgICAgICAgZ3N0X3N0cnVj
dHVyZV9nZXQoc3RydWN0dXJlLCAiY2RtLWluc3RhbmNlIiwgR19UWVBFX1BPSU5URVIsICZpbnN0
YW5jZSwgbnVsbHB0cik7CisgICAgICAgIC8vIE5vdyBmb3JjZSBhIHJlZi1jb3VudCBidW1wLgor
ICAgICAgICBwcml2LT5jZG1JbnN0YW5jZSA9IGluc3RhbmNlOworCiAgICAgICAgIGlmICghcHJp
di0+Y2RtSW5zdGFuY2UpIHsKICAgICAgICAgICAgIEdTVF9FUlJPUl9PQkpFQ1Qoc2VsZiwgIk5v
IENETSBpbnN0YW5jZSByZWNlaXZlZCIpOwogICAgICAgICAgICAgcmVzdWx0ID0gRkFMU0U7CiAg
ICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBHU1RfREVCVUdfT0JKRUNUKHNl
bGYsICJyZWNlaXZlZCBhIGNkbSBpbnN0YW5jZSAlcCIsIHByaXYtPmNkbUluc3RhbmNlLmdldCgp
KTsKIAotICAgICAgICBpZiAoa2xhc3MtPmhhbmRsZUtleVJlc3BvbnNlKHNlbGYsIGV2ZW50KSkg
ewotICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVChzZWxmLCAia2V5IHJlY2VpdmVkIik7Ci0g
ICAgICAgICAgICBwcml2LT5rZXlSZWNlaXZlZCA9IHRydWU7Ci0gICAgICAgICAgICBwcml2LT5j
b25kaXRpb24ubm90aWZ5T25lKCk7Ci0gICAgICAgIH0KKyAgICAgICAgR1NUX0RFQlVHX09CSkVD
VChzZWxmLCAicmVjZWl2ZWQgYSBjZG0gaW5zdGFuY2UgJXAsIHJlZmNvdW50ICV1IiwgcHJpdi0+
Y2RtSW5zdGFuY2UuZ2V0KCksIHByaXYtPmNkbUluc3RhbmNlLT5yZWZDb3VudCgpKTsKKworICAg
ICAgICAvLyBGSVhNRTogV2UgYXJlIG5vIGxvbmdlciBpbnRlcmVzdGVkIGluIHdhaXRpbmcgZm9y
ICprZXlzKiwKKyAgICAgICAgLy8gcmF0aGVyIGp1c3QgdGhlIENETSBpbnN0YW5jZSwgcmVuYW1l
IHRoZXNlIHZhcmlhYmxlcy4gVGhpcworICAgICAgICAvLyB3aWxsIGJlIHNpbXBsaWZpZWQgYW5k
IHJlbW92ZWQgYnkgdGhlIEdzdENvbnRleHQsIHNvIG5vCisgICAgICAgIC8vIHBvaW50IGRvaW5n
IGl0IGluIHRoaXMgcGF0Y2guCisgICAgICAgIHByaXYtPmtleVJlY2VpdmVkID0gdHJ1ZTsKKyAg
ICAgICAgcHJpdi0+Y29uZGl0aW9uLm5vdGlmeU9uZSgpOwogCiAgICAgICAgIGdzdF9ldmVudF91
bnJlZihldmVudCk7CiAgICAgICAgIHJlc3VsdCA9IFRSVUU7CkBAIC0zNDMsNyArNDU4LDcgQEAg
c3RhdGljIGdib29sZWFuIHdlYmtpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5cHRTaW5rRXZl
bnRIYW5kbGVyKEdzdEJhc2VUcmFuc2YKICAgICByZXR1cm4gcmVzdWx0OwogfQogCi1zdGF0aWMg
Z2Jvb2xlYW4gd2Via2l0TWVkaWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdG9yUXVlcnlIYW5kbGVy
KEdzdEJhc2VUcmFuc2Zvcm0qIHRyYW5zLCBHc3RQYWREaXJlY3Rpb24gZGlyZWN0aW9uLCBHc3RR
dWVyeSogcXVlcnkpCitzdGF0aWMgZ2Jvb2xlYW4gcXVlcnlIYW5kbGVyKEdzdEJhc2VUcmFuc2Zv
cm0qIHRyYW5zLCBHc3RQYWREaXJlY3Rpb24gZGlyZWN0aW9uLCBHc3RRdWVyeSogcXVlcnkpCiB7
CiAgICAgaWYgKGdzdF9zdHJ1Y3R1cmVfaGFzX25hbWUoZ3N0X3F1ZXJ5X2dldF9zdHJ1Y3R1cmUo
cXVlcnkpLCAiYW55LWRlY3J5cHRvci13YWl0aW5nLWZvci1rZXkiKSkgewogICAgICAgICBXZWJL
aXRNZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNyeXB0UHJpdmF0ZSogcHJpdiA9IFdFQktJVF9NRURJ
QV9DRU5DX0RFQ1JZUFRfR0VUX1BSSVZBVEUodHJhbnMpOwpAQCAtMzUzLDcgKzQ2OCw3IEBAIHN0
YXRpYyBnYm9vbGVhbiB3ZWJraXRNZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNyeXB0b3JRdWVyeUhh
bmRsZXIoR3N0QmFzZVRyYW5zZm9yCiAgICAgcmV0dXJuIEdTVF9CQVNFX1RSQU5TRk9STV9DTEFT
UyhwYXJlbnRfY2xhc3MpLT5xdWVyeSh0cmFucywgZGlyZWN0aW9uLCBxdWVyeSk7CiB9CiAKLXN0
YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybiB3ZWJLaXRNZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNy
eXB0b3JDaGFuZ2VTdGF0ZShHc3RFbGVtZW50KiBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFu
c2l0aW9uKQorc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIGNoYW5nZVN0YXRlKEdzdEVsZW1l
bnQqIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCiB7CiAgICAgV2ViS2l0TWVk
aWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdCogc2VsZiA9IFdFQktJVF9NRURJQV9DRU5DX0RFQ1JZ
UFQoZWxlbWVudCk7CiAgICAgV2ViS2l0TWVkaWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdFByaXZh
dGUqIHByaXYgPSBXRUJLSVRfTUVESUFfQ0VOQ19ERUNSWVBUX0dFVF9QUklWQVRFKHNlbGYpOwpk
aWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZ3N0cmVhbWVyL2Vt
ZS9XZWJLaXRDb21tb25FbmNyeXB0aW9uRGVjcnlwdG9yR1N0cmVhbWVyLmggYi9Tb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9nc3RyZWFtZXIvZW1lL1dlYktpdENvbW1vbkVuY3J5cHRp
b25EZWNyeXB0b3JHU3RyZWFtZXIuaAppbmRleCAyMjIxMTI1NGViN2Q5ZWY1NDY2MDU3ZmQ3ZDU0
MzQyMTllY2VmMmRkLi5kNjUwZjQ2Yjc3NWEwMTVmOTRjMjQyNGU0NjQ2M2ZkYTg4NGRmNzVlIDEw
MDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9nc3RyZWFtZXIvZW1l
L1dlYktpdENvbW1vbkVuY3J5cHRpb25EZWNyeXB0b3JHU3RyZWFtZXIuaAorKysgYi9Tb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9nc3RyZWFtZXIvZW1lL1dlYktpdENvbW1vbkVuY3J5
cHRpb25EZWNyeXB0b3JHU3RyZWFtZXIuaApAQCAtNTMsOCArNTMsNiBAQCBzdHJ1Y3QgX1dlYktp
dE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5cHRDbGFzcyB7CiAgICAgR3N0QmFzZVRyYW5zZm9y
bUNsYXNzIHBhcmVudENsYXNzOwogCiAgICAgY29uc3QgY2hhciogcHJvdGVjdGlvblN5c3RlbUlk
OwotICAgIGdib29sZWFuICgqaGFuZGxlS2V5UmVzcG9uc2UpKFdlYktpdE1lZGlhQ29tbW9uRW5j
cnlwdGlvbkRlY3J5cHQqLCBHc3RFdmVudCogZXZlbnQpOwotICAgIGdib29sZWFuICgqZGVjcnlw
dCkoV2ViS2l0TWVkaWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdCosIEdzdEJ1ZmZlciogaXZCdWZm
ZXIsIEdzdEJ1ZmZlcioga2V5SURCdWZmZXIsIEdzdEJ1ZmZlciogYnVmZmVyLCB1bnNpZ25lZCBz
dWJTYW1wbGVzQ291bnQsIEdzdEJ1ZmZlciogc3ViU2FtcGxlc0J1ZmZlcik7CiB9OwogCiBHX0VO
RF9ERUNMUwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZ3N0
cmVhbWVyL21zZS9NZWRpYVBsYXllclByaXZhdGVHU3RyZWFtZXJNU0UuY3BwIGIvU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZ3N0cmVhbWVyL21zZS9NZWRpYVBsYXllclByaXZhdGVH
U3RyZWFtZXJNU0UuY3BwCmluZGV4IDgwMzgxZjM1MTQ5ZWFhY2EzOWI1YTIyMDY5Mjk3MzZjNjMy
M2U5MDQuLmU2ZTgwNGJkNmU0MTU0ZmU4ZjQ5Mzg2Y2VhNzM3YzIwYTNlYjJiODggMTAwNjQ0Ci0t
LSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2dzdHJlYW1lci9tc2UvTWVkaWFQ
bGF5ZXJQcml2YXRlR1N0cmVhbWVyTVNFLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9nc3RyZWFtZXIvbXNlL01lZGlhUGxheWVyUHJpdmF0ZUdTdHJlYW1lck1TRS5j
cHAKQEAgLTkwMyw0MyArOTAzLDYgQEAgTWVkaWFUaW1lIE1lZGlhUGxheWVyUHJpdmF0ZUdTdHJl
YW1lck1TRTo6bWF4TWVkaWFUaW1lU2Vla2FibGUoKSBjb25zdAogICAgIHJldHVybiByZXN1bHQ7
CiB9CiAKLSNpZiBFTkFCTEUoRU5DUllQVEVEX01FRElBKQotdm9pZCBNZWRpYVBsYXllclByaXZh
dGVHU3RyZWFtZXJNU0U6OmF0dGVtcHRUb0RlY3J5cHRXaXRoSW5zdGFuY2UoQ0RNSW5zdGFuY2Um
IGluc3RhbmNlKQotewotICAgIGlmIChpczxDRE1JbnN0YW5jZUNsZWFyS2V5PihpbnN0YW5jZSkp
IHsKLSAgICAgICAgYXV0byYgY2tJbnN0YW5jZSA9IGRvd25jYXN0PENETUluc3RhbmNlQ2xlYXJL
ZXk+KGluc3RhbmNlKTsKLSAgICAgICAgaWYgKGNrSW5zdGFuY2Uua2V5cygpLmlzRW1wdHkoKSkK
LSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBHVmFsdWUga2V5SURMaXN0ID0gR19WQUxV
RV9JTklULCBrZXlWYWx1ZUxpc3QgPSBHX1ZBTFVFX0lOSVQ7Ci0gICAgICAgIGdfdmFsdWVfaW5p
dCgma2V5SURMaXN0LCBHU1RfVFlQRV9MSVNUKTsKLSAgICAgICAgZ192YWx1ZV9pbml0KCZrZXlW
YWx1ZUxpc3QsIEdTVF9UWVBFX0xJU1QpOwotCi0gICAgICAgIGF1dG8gYXBwZW5kQnVmZmVyID0K
LSAgICAgICAgICAgIFtdKEdWYWx1ZSogdmFsdWVMaXN0LCBjb25zdCBTaGFyZWRCdWZmZXImIGJ1
ZmZlcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBHVmFsdWUqIGJ1ZmZlclZhbHVl
ID0gZ19uZXcwKEdWYWx1ZSwgMSk7Ci0gICAgICAgICAgICAgICAgZ192YWx1ZV9pbml0KGJ1ZmZl
clZhbHVlLCBHU1RfVFlQRV9CVUZGRVIpOwotICAgICAgICAgICAgICAgIGdzdF92YWx1ZV90YWtl
X2J1ZmZlcihidWZmZXJWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgZ3N0X2J1ZmZlcl9uZXdf
d3JhcHBlZChnX21lbWR1cChidWZmZXIuZGF0YSgpLCBidWZmZXIuc2l6ZSgpKSwgYnVmZmVyLnNp
emUoKSkpOwotICAgICAgICAgICAgICAgIGdzdF92YWx1ZV9saXN0X2FwcGVuZF9hbmRfdGFrZV92
YWx1ZSh2YWx1ZUxpc3QsIGJ1ZmZlclZhbHVlKTsKLSAgICAgICAgICAgIH07Ci0KLSAgICAgICAg
Zm9yIChhdXRvJiBrZXkgOiBja0luc3RhbmNlLmtleXMoKSkgewotICAgICAgICAgICAgYXBwZW5k
QnVmZmVyKCZrZXlJRExpc3QsICprZXkua2V5SUREYXRhKTsKLSAgICAgICAgICAgIGFwcGVuZEJ1
ZmZlcigma2V5VmFsdWVMaXN0LCAqa2V5LmtleVZhbHVlRGF0YSk7Ci0gICAgICAgIH0KLQotICAg
ICAgICBHVW5pcXVlUHRyPEdzdFN0cnVjdHVyZT4gc3RydWN0dXJlKGdzdF9zdHJ1Y3R1cmVfbmV3
X2VtcHR5KCJkcm0tY2lwaGVyLWNsZWFya2V5IikpOwotICAgICAgICBnc3Rfc3RydWN0dXJlX3Nl
dF92YWx1ZShzdHJ1Y3R1cmUuZ2V0KCksICJrZXktaWRzIiwgJmtleUlETGlzdCk7Ci0gICAgICAg
IGdzdF9zdHJ1Y3R1cmVfc2V0X3ZhbHVlKHN0cnVjdHVyZS5nZXQoKSwgImtleS12YWx1ZXMiLCAm
a2V5VmFsdWVMaXN0KTsKLSAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQoc3RydWN0dXJlLmdldCgp
LCAiY2RtLWluc3RhbmNlIiwgR19UWVBFX1BPSU5URVIsICZpbnN0YW5jZSwgbnVsbHB0cik7Ci0K
LSAgICAgICAgZ3N0X2VsZW1lbnRfc2VuZF9ldmVudChtX3BsYXliYWNrUGlwZWxpbmUtPnBpcGVs
aW5lKCksIGdzdF9ldmVudF9uZXdfY3VzdG9tKEdTVF9FVkVOVF9DVVNUT01fRE9XTlNUUkVBTV9P
T0IsIHN0cnVjdHVyZS5yZWxlYXNlKCkpKTsKLSAgICB9Ci19Ci0jZW5kaWYKLQogfSAvLyBuYW1l
c3BhY2UgV2ViQ29yZS4KIAogI2VuZGlmIC8vIFVTRShHU1RSRUFNRVIpCmRpZmYgLS1naXQgYS9T
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9nc3RyZWFtZXIvbXNlL01lZGlhUGxheWVy
UHJpdmF0ZUdTdHJlYW1lck1TRS5oIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
Z3N0cmVhbWVyL21zZS9NZWRpYVBsYXllclByaXZhdGVHU3RyZWFtZXJNU0UuaAppbmRleCAyMjU3
ZTllNjgzMGFjYjE4YzZmMDhmNzE4NmJmNzc1OGI3MjczNWQ3Li4yZGZhNzMyZmNiZjI2YmE2ODdm
MWE5ODE0YWI3NjYzZWVmOTg1NDc0IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9nc3RyZWFtZXIvbXNlL01lZGlhUGxheWVyUHJpdmF0ZUdTdHJlYW1lck1TRS5o
CisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2dzdHJlYW1lci9tc2UvTWVk
aWFQbGF5ZXJQcml2YXRlR1N0cmVhbWVyTVNFLmgKQEAgLTg1LDEwICs4NSw2IEBAIHB1YmxpYzoK
ICAgICBzdGF0aWMgYm9vbCBzdXBwb3J0c0NvZGVjKFN0cmluZyBjb2RlYyk7CiAgICAgc3RhdGlj
IGJvb2wgc3VwcG9ydHNBbGxDb2RlY3MoY29uc3QgVmVjdG9yPFN0cmluZz4mIGNvZGVjcyk7CiAK
LSNpZiBFTkFCTEUoRU5DUllQVEVEX01FRElBKQotICAgIHZvaWQgYXR0ZW1wdFRvRGVjcnlwdFdp
dGhJbnN0YW5jZShDRE1JbnN0YW5jZSYpIGZpbmFsOwotI2VuZGlmCi0KIHByaXZhdGU6CiAgICAg
c3RhdGljIHZvaWQgZ2V0U3VwcG9ydGVkVHlwZXMoSGFzaFNldDxTdHJpbmcsIEFTQ0lJQ2FzZUlu
c2Vuc2l0aXZlSGFzaD4mKTsKICAgICBzdGF0aWMgTWVkaWFQbGF5ZXI6OlN1cHBvcnRzVHlwZSBz
dXBwb3J0c1R5cGUoY29uc3QgTWVkaWFFbmdpbmVTdXBwb3J0UGFyYW1ldGVycyYpOwpkaWZmIC0t
Z2l0IGEvVG9vbHMvQ2hhbmdlTG9nIGIvVG9vbHMvQ2hhbmdlTG9nCmluZGV4IDAzY2Y5Y2Y3OGFk
MDkyZmE2NTI5MGVhNmM1ZjkwY2RjMzUxMGY3ODMuLjI5ODI0NzQ0ZjE2MDFhM2QxMzcwOTk3Nzlm
YzI3ODg1MmExZjUzZWQgMTAwNjQ0Ci0tLSBhL1Rvb2xzL0NoYW5nZUxvZworKysgYi9Ub29scy9D
aGFuZ2VMb2cKQEAgLTEsMyArMSwxMyBAQAorMjAxOC0xMS0zMCAgQ2hhcmxpZSBUdXJuZXIgIDxj
dHVybmVyQGlnYWxpYS5jb20+CisKKyAgICAgICAgW0VNRV0gQ3JlYXRlIGFuZCBtb3ZlIHRvIGEg
ZGVjcnlwdGlvbiBBUEkgaW1wbGVtZW50ZWQgYnkgQ0RNSW5zdGFuY2VzCisgICAgICAgIGh0dHBz
Oi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xOTIyMjkKKworICAgICAgICBSZXZp
ZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICAqIE1pbmlCcm93c2VyL3dwZS9tYWlu
LmNwcDoKKyAgICAgICAgKG1haW4pOiBFbmFibGUgZW5jcnlwdGVkLW1lZGlhIGJ5IGRlZmF1bHQu
CisKIDIwMTgtMTEtMTMgIERhbmllbCBCYXRlcyAgPGRhYmF0ZXNAYXBwbGUuY29tPgogCiAgICAg
ICAgIENvbnNvbGlkYXRlIFdlYktpdCBVSUtpdFNQSS5oIGFuZCBVSUtpdFRlc3RTUEkuaApkaWZm
IC0tZ2l0IGEvVG9vbHMvTWluaUJyb3dzZXIvd3BlL21haW4uY3BwIGIvVG9vbHMvTWluaUJyb3dz
ZXIvd3BlL21haW4uY3BwCmluZGV4IGUwYzI5YjIxMjk5MzQzNzEyNzRhNmYyNTQ1MWVhZTk4MjFj
NDY4OWYuLjVjNDQ4YThlMDcxMjYxODlmMzQxMWNlNzEwMTBmYmZkNjI5MTFlZTAgMTAwNjQ0Ci0t
LSBhL1Rvb2xzL01pbmlCcm93c2VyL3dwZS9tYWluLmNwcAorKysgYi9Ub29scy9NaW5pQnJvd3Nl
ci93cGUvbWFpbi5jcHAKQEAgLTE3Nyw2ICsxNzcsNyBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hh
ciAqYXJndltdKQogICAgICAgICAiZW5hYmxlLWRldmVsb3Blci1leHRyYXMiLCBUUlVFLAogICAg
ICAgICAiZW5hYmxlLXdlYmdsIiwgVFJVRSwKICAgICAgICAgImVuYWJsZS1tZWRpYS1zdHJlYW0i
LCBUUlVFLAorICAgICAgICAiZW5hYmxlLWVuY3J5cHRlZC1tZWRpYSIsIFRSVUUsCiAgICAgICAg
IG51bGxwdHIpOwogCiAgICAgYXV0byogd2ViVmlldyA9IFdFQktJVF9XRUJfVklFVyhnX29iamVj
dF9uZXcoV0VCS0lUX1RZUEVfV0VCX1ZJRVcsCmRpZmYgLS1naXQgYS9MYXlvdXRUZXN0cy9DaGFu
Z2VMb2cgYi9MYXlvdXRUZXN0cy9DaGFuZ2VMb2cKaW5kZXggNDc2ZDFiYWEyNjg5M2I0NmM2YTIw
YTg2MzFhYTM3M2IzNmNlMzliZS4uNjNkYzE0ZjM5NThmNWQzZWFmMDJhZDAxY2ZkMzJlNTA1MGJh
MmEzZCAxMDA2NDQKLS0tIGEvTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCisrKyBiL0xheW91dFRlc3Rz
L0NoYW5nZUxvZwpAQCAtMSwzICsxLDE1IEBACisyMDE4LTExLTMwICBDaGFybGllIFR1cm5lciAg
PGN0dXJuZXJAaWdhbGlhLmNvbT4KKworICAgICAgICBbRU1FXSBDcmVhdGUgYW5kIG1vdmUgdG8g
YSBkZWNyeXB0aW9uIEFQSSBpbXBsZW1lbnRlZCBieSBDRE1JbnN0YW5jZXMKKyAgICAgICAgaHR0
cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE5MjIyOQorCisgICAgICAgIFJl
dmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFVwZGF0ZSB0byBuZXcgZmFpbHVy
ZSBvdXRwdXQgYWZ0ZXIgdGhpcyByZWZhY3RvcmluZy4KKworICAgICAgICAqIHBsYXRmb3JtL2d0
ay9pbXBvcnRlZC93M2Mvd2ViLXBsYXRmb3JtLXRlc3RzL2VuY3J5cHRlZC1tZWRpYS9jbGVhcmtl
eS1tcDQtcGxheWJhY2stcGVyc2lzdGVudC1saWNlbnNlLWV2ZW50cy5odHRwcy1leHBlY3RlZC50
eHQ6CisgICAgICAgICogcGxhdGZvcm0vd3BlL2ltcG9ydGVkL3czYy93ZWItcGxhdGZvcm0tdGVz
dHMvZW5jcnlwdGVkLW1lZGlhL2NsZWFya2V5LW1wNC1wbGF5YmFjay1wZXJzaXN0ZW50LWxpY2Vu
c2UtZXZlbnRzLmh0dHBzLWV4cGVjdGVkLnR4dDoKKwogMjAxOC0xMS0xMyAgTWF0dCBCYWtlciAg
PG1hdHRiYWtlckBhcHBsZS5jb20+CiAKICAgICAgICAgV2ViIEluc3BlY3RvcjogVGFibGUgc2hv
dWxkIHN1cHBvcnQgc2VsZWN0IGFsbCAoQ21kLUEpCmRpZmYgLS1naXQgYS9MYXlvdXRUZXN0cy9w
bGF0Zm9ybS9ndGsvaW1wb3J0ZWQvdzNjL3dlYi1wbGF0Zm9ybS10ZXN0cy9lbmNyeXB0ZWQtbWVk
aWEvY2xlYXJrZXktbXA0LXBsYXliYWNrLXBlcnNpc3RlbnQtbGljZW5zZS1ldmVudHMuaHR0cHMt
ZXhwZWN0ZWQudHh0IGIvTGF5b3V0VGVzdHMvcGxhdGZvcm0vZ3RrL2ltcG9ydGVkL3czYy93ZWIt
cGxhdGZvcm0tdGVzdHMvZW5jcnlwdGVkLW1lZGlhL2NsZWFya2V5LW1wNC1wbGF5YmFjay1wZXJz
aXN0ZW50LWxpY2Vuc2UtZXZlbnRzLmh0dHBzLWV4cGVjdGVkLnR4dAppbmRleCBkMWZiMWIyZTcy
MTJkZDFkYmIzM2ZmYjZmOTRkZTVkZTNhZjBlYWEzLi41YzI3NmYzZmM1YTU0N2VmYTc3ZTBmZGVm
NzA4MjBhNGJhOWI4MGMwIDEwMDY0NAotLS0gYS9MYXlvdXRUZXN0cy9wbGF0Zm9ybS9ndGsvaW1w
b3J0ZWQvdzNjL3dlYi1wbGF0Zm9ybS10ZXN0cy9lbmNyeXB0ZWQtbWVkaWEvY2xlYXJrZXktbXA0
LXBsYXliYWNrLXBlcnNpc3RlbnQtbGljZW5zZS1ldmVudHMuaHR0cHMtZXhwZWN0ZWQudHh0Cisr
KyBiL0xheW91dFRlc3RzL3BsYXRmb3JtL2d0ay9pbXBvcnRlZC93M2Mvd2ViLXBsYXRmb3JtLXRl
c3RzL2VuY3J5cHRlZC1tZWRpYS9jbGVhcmtleS1tcDQtcGxheWJhY2stcGVyc2lzdGVudC1saWNl
bnNlLWV2ZW50cy5odHRwcy1leHBlY3RlZC50eHQKQEAgLTEsMyArMSwzIEBACiAKLUZBSUwgb3Jn
LnczLmNsZWFya2V5LCBwZXJzaXN0ZW50LWxpY2Vuc2UsIG1wNCwgcGxheWJhY2ssIGNoZWNrIGV2
ZW50cyBhc3NlcnRfZXF1YWxzOiBFeHBlY3RlZCAxc3QgZXZlbnQgdG8gYmUgJ2dlbmVyYXRlcmVx
dWVzdCcgZXhwZWN0ZWQgImdlbmVyYXRlcmVxdWVzdCIgYnV0IGdvdCAibGljZW5zZS1yZXF1ZXN0
IgorRkFJTCBvcmcudzMuY2xlYXJrZXksIHBlcnNpc3RlbnQtbGljZW5zZSwgbXA0LCBwbGF5YmFj
aywgY2hlY2sgZXZlbnRzIGFzc2VydF9lcXVhbHM6IEV4cGVjdGVkIDFzdCBldmVudCB0byBiZSAn
Z2VuZXJhdGVyZXF1ZXN0JyBleHBlY3RlZCAiZ2VuZXJhdGVyZXF1ZXN0IiBidXQgZ290ICJwbGF5
aW5nIgogCmRpZmYgLS1naXQgYS9MYXlvdXRUZXN0cy9wbGF0Zm9ybS93cGUvaW1wb3J0ZWQvdzNj
L3dlYi1wbGF0Zm9ybS10ZXN0cy9lbmNyeXB0ZWQtbWVkaWEvY2xlYXJrZXktbXA0LXBsYXliYWNr
LXBlcnNpc3RlbnQtbGljZW5zZS1ldmVudHMuaHR0cHMtZXhwZWN0ZWQudHh0IGIvTGF5b3V0VGVz
dHMvcGxhdGZvcm0vd3BlL2ltcG9ydGVkL3czYy93ZWItcGxhdGZvcm0tdGVzdHMvZW5jcnlwdGVk
LW1lZGlhL2NsZWFya2V5LW1wNC1wbGF5YmFjay1wZXJzaXN0ZW50LWxpY2Vuc2UtZXZlbnRzLmh0
dHBzLWV4cGVjdGVkLnR4dAppbmRleCBkMWZiMWIyZTcyMTJkZDFkYmIzM2ZmYjZmOTRkZTVkZTNh
ZjBlYWEzLi41YzI3NmYzZmM1YTU0N2VmYTc3ZTBmZGVmNzA4MjBhNGJhOWI4MGMwIDEwMDY0NAot
LS0gYS9MYXlvdXRUZXN0cy9wbGF0Zm9ybS93cGUvaW1wb3J0ZWQvdzNjL3dlYi1wbGF0Zm9ybS10
ZXN0cy9lbmNyeXB0ZWQtbWVkaWEvY2xlYXJrZXktbXA0LXBsYXliYWNrLXBlcnNpc3RlbnQtbGlj
ZW5zZS1ldmVudHMuaHR0cHMtZXhwZWN0ZWQudHh0CisrKyBiL0xheW91dFRlc3RzL3BsYXRmb3Jt
L3dwZS9pbXBvcnRlZC93M2Mvd2ViLXBsYXRmb3JtLXRlc3RzL2VuY3J5cHRlZC1tZWRpYS9jbGVh
cmtleS1tcDQtcGxheWJhY2stcGVyc2lzdGVudC1saWNlbnNlLWV2ZW50cy5odHRwcy1leHBlY3Rl
ZC50eHQKQEAgLTEsMyArMSwzIEBACiAKLUZBSUwgb3JnLnczLmNsZWFya2V5LCBwZXJzaXN0ZW50
LWxpY2Vuc2UsIG1wNCwgcGxheWJhY2ssIGNoZWNrIGV2ZW50cyBhc3NlcnRfZXF1YWxzOiBFeHBl
Y3RlZCAxc3QgZXZlbnQgdG8gYmUgJ2dlbmVyYXRlcmVxdWVzdCcgZXhwZWN0ZWQgImdlbmVyYXRl
cmVxdWVzdCIgYnV0IGdvdCAibGljZW5zZS1yZXF1ZXN0IgorRkFJTCBvcmcudzMuY2xlYXJrZXks
IHBlcnNpc3RlbnQtbGljZW5zZSwgbXA0LCBwbGF5YmFjaywgY2hlY2sgZXZlbnRzIGFzc2VydF9l
cXVhbHM6IEV4cGVjdGVkIDFzdCBldmVudCB0byBiZSAnZ2VuZXJhdGVyZXF1ZXN0JyBleHBlY3Rl
ZCAiZ2VuZXJhdGVyZXF1ZXN0IiBidXQgZ290ICJwbGF5aW5nIgogCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>356384</attachid>
            <date>2018-12-03 10:21:29 -0800</date>
            <delta_ts>2018-12-13 06:42:04 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-192229-20181203182127.patch</filename>
            <type>text/plain</type>
            <size>88233</size>
            <attacher name="Charlie Turner">cturner</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjM4NzkzCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggZDFhYzU2ZmY0YWMwMWFj
ZDE1MTk2NDI4YjY1MTYyMDU0ZjBiYjhiOS4uYTE2MmE2YmNlZjg5YjgxOTU1NDAwZjZjZDJiYjBk
NmQxMGVhZDBmNyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDExNSBAQAorMjAxOC0xMi0wMyAgQ2hh
cmxpZSBUdXJuZXIgIDxjdHVybmVyQGlnYWxpYS5jb20+CisKKyAgICAgICAgW0VNRV0gQ3JlYXRl
IGFuZCBtb3ZlIHRvIGEgZGVjcnlwdGlvbiBBUEkgaW1wbGVtZW50ZWQgYnkgQ0RNSW5zdGFuY2Vz
CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xOTIyMjkK
KworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBObyBuZXcg
dGVzdHMsIHRoaXMgaXMgYSByZWZhY3RvcmluZy4KKworICAgICAgICAqIHBsYXRmb3JtL0dTdHJl
YW1lci5jbWFrZTogUmVtb3ZlIHRoZSBDbGVhcktleSBkZWNyeXB0b3IsIHRoaXMKKyAgICAgICAg
cGF0Y2ggbW92ZXMgdG8gYSBzaW5nbGUtZGVjcnlwdG9yIGFyY2hpdGVjdHVyZS4KKyAgICAgICAg
KiBwbGF0Zm9ybS9lbmNyeXB0ZWRtZWRpYS9DRE1JbnN0YW5jZS5oOiBJbnRyb2R1Y2UgbmV3IGFi
c3RyYWN0aW9uCisgICAgICAgIGZvciBoYW5kbGluZyBkZWNyeXB0aW9uIGJlaGluZCB0aGUgQ0RN
SW5zdGFuY2UgaW50ZXJmYWNlLgorICAgICAgICAoV2ViQ29yZTo6Q0RNSW5zdGFuY2U6OlN1YlNh
bXBsZTo6U3ViU2FtcGxlKTogQ0RNcyBjYW4gcGVyZm9ybQorICAgICAgICBlZmZpY2llbnQgZGVj
cnlwdGlvbiBvZiBzdWJzYW1wbGUgZW5jcnlwdGVkIGRhdGEgd2l0aG91dCBoYXZpbmcgdG8KKyAg
ICAgICAgcGVyZm9ybSBleHRyYSBjb3BpZXMuIFRoZXJlZm9yZSBpdCBtYWtlcyBzZW5zZSB0byBs
ZXQgdGhlIENETQorICAgICAgICBoYW5kbGUgc3Vic2FtcGxlcywgcmF0aGVyIHRoYW4gdGhlIGRl
Y3J5cHRvcnMuIEZvciBDbGVhcktleSB0aGlzCisgICAgICAgIGRvZXNuJ3QgaGVscCwgYnV0IGZv
ciBvdGhlciBzeXN0ZW1zIGl0IGNhbi4KKyAgICAgICAgKFdlYkNvcmU6OkNETUluc3RhbmNlOjpE
ZWNyeXB0aW9uQ29uZmlnOjpjcmVhdGVDZW5jQ29uZmlnKToKKyAgICAgICAgKFdlYkNvcmU6OkNE
TUluc3RhbmNlOjpEZWNyeXB0aW9uQ29uZmlnOjpEZWNyeXB0aW9uQ29uZmlnKToKKyAgICAgICAg
SW50cm9kdWNlIGRlY3J5cHRpb24gY29uZmlndXJhdGlvbiBoZWxwZXIgY2xhc3MuCisgICAgICAg
IChXZWJDb3JlOjpDRE1JbnN0YW5jZTo6RGVjcnlwdGlvbkNvbmZpZzo6bW9kZSBjb25zdCk6Cisg
ICAgICAgIChXZWJDb3JlOjpDRE1JbnN0YW5jZTo6RGVjcnlwdGlvbkNvbmZpZzo6aXYpOgorICAg
ICAgICAoV2ViQ29yZTo6Q0RNSW5zdGFuY2U6OkRlY3J5cHRpb25Db25maWc6OmtleUlEKToKKyAg
ICAgICAgKFdlYkNvcmU6OkNETUluc3RhbmNlOjpEZWNyeXB0aW9uQ29uZmlnOjppc1N1YlNhbXBs
ZSBjb25zdCk6CisgICAgICAgIChXZWJDb3JlOjpDRE1JbnN0YW5jZTo6RGVjcnlwdGlvbkNvbmZp
Zzo6c3ViU2FtcGxlcyk6CisgICAgICAgIChXZWJDb3JlOjpDRE1JbnN0YW5jZTo6RGVjcnlwdGlv
bkNvbmZpZzo6d2FpdEZvcktleVRpbWVvdXQgY29uc3QpOgorICAgICAgICBUaGUgbnVtYmVyIG9m
IHNlY29uZHMgdG8gYmxvY2sgZGVjcnlwdGlvbiB3YWl0aW5nIGZvciBhIGNhbGwgdG8KKyAgICAg
ICAgdXBkYXRlKCkuCisgICAgICAgIChXZWJDb3JlOjpDRE1JbnN0YW5jZTo6ZGVjcnlwdCk6IEZp
bmQgYSBzZXNzaW9uIHRoYXQgY29udGFpbnMgdGhlCisgICAgICAgIHJlcXVlc3RlZCBrZXkgSUQs
IGFuZCBkaXNwYXRjaCBkZWNyeXB0aW9uIHRvIGl0LgorICAgICAgICAqIHBsYXRmb3JtL2VuY3J5
cHRlZG1lZGlhL0NETUluc3RhbmNlU2Vzc2lvbi5oOgorICAgICAgICAoV2ViQ29yZTo6Q0RNSW5z
dGFuY2VTZXNzaW9uOjpkZWNyeXB0KTogSW50cm9kdWNlIG5ldyB2aXJ0dWFsCisgICAgICAgIG1l
dGhvZCBvZiBkZWNyeXB0aW5nLiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIGZh
aWx1cmUKKyAgICAgICAgc28gdGhhdCBvdGhlciBwb3J0cyBkb24ndCBoYXZlIHRvIGJlIGNoYW5n
ZWQuCisgICAgICAgICogcGxhdGZvcm0vZW5jcnlwdGVkbWVkaWEvY2xlYXJrZXkvQ0RNQ2xlYXJL
ZXkuY3BwOiBTdGF0aWMKKyAgICAgICAgdmFyaWFibGVzIHdlcmUgY2xlYW5lZCB1cCwgYW5kIG1h
bnkgdXNlbGVzcyBjb21tZW50cyB0aGF0IG9ubHkKKyAgICAgICAgcmVpdGVyYXRpbmcgQysrIGlu
IEVuZ2xpc2ggd2VyZSByZW1vdmVkLCBhbmQgdGhlIGdsb3JpZmllZCBnbG9iYWwKKyAgICAgICAg
c3RhdGUgdmlhIGEgc2luZ2xldG9uIGNsYXNzIHdhcyBlbGltaW5hdGVkLgorICAgICAgICAoV2Vi
Q29yZTo6cGFyc2VMaWNlbnNlRm9ybWF0KTogVXBkYXRlIHNpZ25hdHVyZSwgc2luY2UgdGhlIEtl
eQorICAgICAgICBzdHJ1Y3Qgd2FzIG1vdmVkIHRvIHRoZSBzZXNzaW9uIG9iamVjdCwgd2hpY2gg
dGhlIG9ubHkgcGxhY2UgaXQgaXMKKyAgICAgICAgbm93IHVzZWQuCisgICAgICAgIChXZWJDb3Jl
OjprZXlJRFRvSGV4U3RyaW5nKTogSGVscGVyIG1ldGhvZCB0byBwcmV0dHktcHJpbnQgYmluYXJ5
CisgICAgICAgIHN0cmluZ3MsIHVzZWQgZm9yIEtleUlEcywgcmVhbGx5IGFuIGFic3RyYWN0aW9u
IGZvciBrZXkgaWRzIHdpdGggYQorICAgICAgICBzdHJpbmcoKSBvcGVyYXRvciBzaG91bGQgYmUg
aW50cm9kdWNlZCBpbiB0aGUgZnV0dXJlLgorICAgICAgICAoV2ViQ29yZTo6Q0RNSW5zdGFuY2VD
bGVhcktleTo6Y3JlYXRlU2Vzc2lvbik6IEFkanVzdCB0byBrZWVwIHRhY2sKKyAgICAgICAgb2Yg
d2hpY2ggc2Vzc2lvbnMgaGF2ZSBiZWVuIGNyZWF0ZWQuIFRoaXMgaXMgdXNlZCB0byBsb29rIHVw
IGFuCisgICAgICAgIGFwcHJvcHJpYXRlIHNlc3Npb24gZm9yIGRlY3J5cHRpb24uCisgICAgICAg
IChXZWJDb3JlOjpDRE1JbnN0YW5jZUNsZWFyS2V5OjpkZWNyeXB0KTogU2VlIGFib3ZlLgorICAg
ICAgICAoV2ViQ29yZTo6Q0RNSW5zdGFuY2VDbGVhcktleTo6c2Vzc2lvbkZvcktleUlEIGNvbnN0
KTogTG9va3VwIGEKKyAgICAgICAgc2Vzc2lvbiBjb250YWluaW5nIGEgZ2l2ZW4ga2V5IElELgor
ICAgICAgICAoV2ViQ29yZTo6Q0RNSW5zdGFuY2VTZXNzaW9uQ2xlYXJLZXk6OkNETUluc3RhbmNl
U2Vzc2lvbkNsZWFyS2V5KToKKyAgICAgICAgSG9sZCBhIHJlZmVyZW5jZSB0byB0aGUgcGFyZW50
IGluc3RhbmNlLCB0aGlzIG1heSBiZSB1c2VmdWwgaW4gdGhlCisgICAgICAgIGZ1dHVyZSwgYW5k
IG1vdmVzIHVzIG1vcmUgaW5saW5lIHdpdGggdGhlIG93bmluZyBncmFwaCB1c2VkIGJ5IEZQUy4K
KyAgICAgICAgKFdlYkNvcmU6OkNETUluc3RhbmNlU2Vzc2lvbkNsZWFyS2V5OjpyZXF1ZXN0TGlj
ZW5zZSk6IFNldCBvdXIKKyAgICAgICAgc2Vzc2lvbiBpZCBpbiB0aGUgc2Vzc2lvbiBpbnN0YW5j
ZS4KKyAgICAgICAgKFdlYkNvcmU6OkNETUluc3RhbmNlU2Vzc2lvbkNsZWFyS2V5Ojp1cGRhdGVM
aWNlbnNlKTogVXBkYXRlZCB0bworICAgICAgICBhc3NlcnQgd2UgYXJlIGludm9rZWQgYXMgdGhl
IHJpZ2h0IHNlc3Npb24sIGFuZCB0byB1c2UgdGhlIG5ldworICAgICAgICBtX2tleXMgbWVtYmVy
IHRoYXQga2VlcHMgdHJhY2sgb2YgdGhlIGtleSBpZHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMKKyAg
ICAgICAgc2Vzc2lvbi4gQWxzbyByZW1vdmUgbW9yZSBDKystaW4tRW5nbGlzaCBjb21tZW50cy4u
LgorICAgICAgICAoV2ViQ29yZTo6Q0RNSW5zdGFuY2VTZXNzaW9uQ2xlYXJLZXk6OmxvYWRTZXNz
aW9uKTogRGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpDRE1JbnN0YW5jZVNlc3Npb25DbGVhcktl
eTo6cmVtb3ZlU2Vzc2lvbkRhdGEpOiBEaXR0by4KKyAgICAgICAgKFdlYkNvcmU6OkNETUluc3Rh
bmNlU2Vzc2lvbkNsZWFyS2V5OjpkZWNyeXB0KTogUmVhbCBkZWNyeXB0aW9uCisgICAgICAgIGxv
Z2ljIG1vdmVkIGhlcmUsIGFuZCByZWZhY3RvcmVkIGhlYXZpbHkuCisgICAgICAgIChXZWJDb3Jl
OjpDRE1JbnN0YW5jZVNlc3Npb25DbGVhcktleTo6a2V5SURzKTogUmV0dXJuIGEgdmVjdG9yIG9m
CisgICAgICAgIGFsbCBrbm93biBrZXkgSURzICppbiB0aGlzIHNlc3Npb24qIHJhdGhlciB0aGFu
IGdsb2JhbGx5LgorICAgICAgICAoV2ViQ29yZTo6Q2xlYXJLZXlTdGF0ZTo6a2V5cyk6IERlbGV0
ZWQuCisgICAgICAgIChXZWJDb3JlOjpDbGVhcktleVN0YXRlOjpzaW5nbGV0b24pOiBEZWxldGVk
LgorICAgICAgICAoV2ViQ29yZTo6Q0RNSW5zdGFuY2VDbGVhcktleTo6Q0RNSW5zdGFuY2VDbGVh
cktleSk6IERlbGV0ZWQuCisgICAgICAgIChXZWJDb3JlOjpDRE1JbnN0YW5jZUNsZWFyS2V5Ojpr
ZXlzIGNvbnN0KTogRGVsZXRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9lbmNyeXB0ZWRtZWRpYS9j
bGVhcmtleS9DRE1DbGVhcktleS5oOiBBZGp1c3RlZCBmb3IgbmV3CisgICAgICAgIGFic3RyYWN0
aW9ucy4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9nc3RyZWFtZXIvR1N0cmVhbWVyQ29t
bW9uLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OmluaXRpYWxpemVHU3RyZWFtZXJBbmRSZWdpc3Rl
cldlYktpdEVsZW1lbnRzKTogVXNlCisgICAgICAgIHdlYmtpdGNlbmMgYXMgb3VyIGRlY3J5cHRv
ciwgcmF0aGVyIHRoYW4gdGhlIG5vdyBkZWxldGVkCisgICAgICAgIHdlYmtpdGNsZWFya2V5Lgor
ICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2dzdHJlYW1lci9HU3RyZWFtZXJDb21tb24uaDoK
KyAgICAgICAgKFdlYkNvcmU6OkdzdE1hcHBlZEJ1ZmZlcjo6fkdzdE1hcHBlZEJ1ZmZlcik6IEFk
ZCBhbiBhZGRpdGlvbmFsCisgICAgICAgIGd1YXJkIGZvciBHU1RfSVNfQlVGRkVSIGJlZm9yZSB1
bm1hcHBpbmcsIHRoZXJlIGFyZSBmdW5jdGlvbnMgaW4KKyAgICAgICAgR1N0cmVhbWVyIHRoYW4g
Y2FuIGludmFsaWRhdGUgYnVmZmVycyBiZWhpbmQgb3VyIGJhY2suCisgICAgICAgIChXZWJDb3Jl
OjpHc3RNYXBwZWRCdWZmZXI6OnNoYXJlZEJ1ZmZlciBjb25zdCk6IEFkZCBhIG5ldyB1dGlsaXR5
CisgICAgICAgIG1ldGhvZCB0byBjb252ZXJ0IGEgbWFwcGVkIGJ1ZmZlciBpbnRvIGEgU2hhcmVk
QnVmZmVyLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2dzdHJlYW1lci9lbWUvV2ViS2l0
Q2xlYXJLZXlEZWNyeXB0b3JHU3RyZWFtZXIuY3BwOiBSZW1vdmVkLgorICAgICAgICAqIHBsYXRm
b3JtL2dyYXBoaWNzL2dzdHJlYW1lci9lbWUvV2ViS2l0Q2xlYXJLZXlEZWNyeXB0b3JHU3RyZWFt
ZXIuaDogUmVtb3ZlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9nc3RyZWFtZXIvZW1l
L1dlYktpdENvbW1vbkVuY3J5cHRpb25EZWNyeXB0b3JHU3RyZWFtZXIuY3BwOgorICAgICAgICAo
d2Via2l0X21lZGlhX2NvbW1vbl9lbmNyeXB0aW9uX2RlY3J5cHRfY2xhc3NfaW5pdCk6IFVzZSB0
aGUgbmV3CisgICAgICAgIENETUluc3RhbmNlIEFQSSwgYW5kIHJlbmFtZSB0aGUgbG9uZyBtZXRo
b2QgbmFtZXMsIHNpbmNlIHdlIGFyZSBpbgorICAgICAgICBDKysgYW5kIGRvbid0IG5lZWQgbmFt
ZXNwYWNpbmcgaW4gbWV0aG9kIG5hbWVzLgorICAgICAgICAoZmluYWxpemUpOgorICAgICAgICAo
dHJhbnNmb3JtQ2Fwcyk6CisgICAgICAgIChwb3B1bGF0ZVN1YlNhbXBsZXMpOgorICAgICAgICAo
dHJhbnNmb3JtSW5QbGFjZSk6CisgICAgICAgIChpc0NETUluc3RhbmNlQXZhaWxhYmxlKToKKyAg
ICAgICAgKHNpbmtFdmVudEhhbmRsZXIpOgorICAgICAgICAocXVlcnlIYW5kbGVyKToKKyAgICAg
ICAgKGNoYW5nZVN0YXRlKToKKyAgICAgICAgKHNldENvbnRleHQpOgorICAgICAgICAod2ViS2l0
TWVkaWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdG9yRmluYWxpemUpOiBEZWxldGVkLgorICAgICAg
ICAod2Via2l0TWVkaWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdFRyYW5zZm9ybUNhcHMpOiBEZWxl
dGVkLgorICAgICAgICAod2Via2l0TWVkaWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdFRyYW5zZm9y
bUluUGxhY2UpOiBEZWxldGVkLgorICAgICAgICAod2Via2l0TWVkaWFDb21tb25FbmNyeXB0aW9u
RGVjcnlwdElzQ0RNSW5zdGFuY2VBdmFpbGFibGUpOiBEZWxldGVkLgorICAgICAgICAod2Via2l0
TWVkaWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdFNpbmtFdmVudEhhbmRsZXIpOiBEZWxldGVkLgor
ICAgICAgICAod2Via2l0TWVkaWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdG9yUXVlcnlIYW5kbGVy
KTogRGVsZXRlZC4KKyAgICAgICAgKHdlYktpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5cHRv
ckNoYW5nZVN0YXRlKTogRGVsZXRlZC4KKyAgICAgICAgKHdlYktpdE1lZGlhQ29tbW9uRW5jcnlw
dGlvbkRlY3J5cHRvclNldENvbnRleHQpOiBEZWxldGVkLgorICAgICAgICAqIHBsYXRmb3JtL2dy
YXBoaWNzL2dzdHJlYW1lci9lbWUvV2ViS2l0Q29tbW9uRW5jcnlwdGlvbkRlY3J5cHRvckdTdHJl
YW1lci5oOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2dzdHJlYW1lci9tc2UvTWVkaWFQ
bGF5ZXJQcml2YXRlR1N0cmVhbWVyTVNFLmNwcDoKKyAgICAgICAgYXR0ZW1wdFRvRGVjcnlwdFdp
dGhJbnN0YW5jZSBpcyBubyBsb25nZXIgbmVlZGVkLCBzaW5jZSBrZXkKKyAgICAgICAgbWFuYWdl
bWVudCBpcyBoYW5kbGVkIGluIENETUluc3RhbmNlIG5vdy4KKyAgICAgICAgKFdlYkNvcmU6Ok1l
ZGlhUGxheWVyUHJpdmF0ZUdTdHJlYW1lck1TRTo6YXR0ZW1wdFRvRGVjcnlwdFdpdGhMb2NhbElu
c3RhbmNlKTogRGVsZXRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9nc3RyZWFtZXIv
bXNlL01lZGlhUGxheWVyUHJpdmF0ZUdTdHJlYW1lck1TRS5oOiBEaXR0by4KKwogMjAxOC0xMi0w
MiAgWmFsYW4gQnVqdGFzICA8emFsYW5AYXBwbGUuY29tPgogCiAgICAgICAgIEFkZCBhIHJ1bnRp
bWUgZmVhdHVyZSBmbGFnIGZvciBMYXlvdXRGb3JtYXR0aW5nQ29udGV4dC4KZGlmZiAtLWdpdCBh
L1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL0dTdHJlYW1lci5jbWFrZSBiL1NvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL0dTdHJlYW1lci5jbWFrZQppbmRleCA2YTBlMDMzYzJhMzcxODdkZGQ1YTY3OGFh
OTAwNjQ4NzY1MmI1ODA5Li4wZDQ4Njg3Zjg0NDViNzE1NGRkYTNlMTMzY2QxNWE5NjYwMDI5N2Uz
IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9HU3RyZWFtZXIuY21ha2UKKysr
IGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vR1N0cmVhbWVyLmNtYWtlCkBAIC0yMSw3ICsyMSw2
IEBAIGlmIChFTkFCTEVfVklERU8gT1IgRU5BQkxFX1dFQl9BVURJTykKICAgICAgICAgcGxhdGZv
cm0vZ3JhcGhpY3MvZ3N0cmVhbWVyL1ZpZGVvVHJhY2tQcml2YXRlR1N0cmVhbWVyLmNwcAogICAg
ICAgICBwbGF0Zm9ybS9ncmFwaGljcy9nc3RyZWFtZXIvV2ViS2l0V2ViU291cmNlR1N0cmVhbWVy
LmNwcAogCi0gICAgICAgIHBsYXRmb3JtL2dyYXBoaWNzL2dzdHJlYW1lci9lbWUvV2ViS2l0Q2xl
YXJLZXlEZWNyeXB0b3JHU3RyZWFtZXIuY3BwCiAgICAgICAgIHBsYXRmb3JtL2dyYXBoaWNzL2dz
dHJlYW1lci9lbWUvV2ViS2l0Q29tbW9uRW5jcnlwdGlvbkRlY3J5cHRvckdTdHJlYW1lci5jcHAK
IAogICAgICAgICBwbGF0Zm9ybS9ncmFwaGljcy9nc3RyZWFtZXIvbXNlL0FwcGVuZFBpcGVsaW5l
LmNwcApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZW5jcnlwdGVkbWVkaWEv
Q0RNSW5zdGFuY2UuaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2VuY3J5cHRlZG1lZGlhL0NE
TUluc3RhbmNlLmgKaW5kZXggMDRlOGIzNWMzNzA5NTlmZWY0MTBmMTg4N2UxMzllZjZlNDEyMjMw
YS4uNmM1Zjg1ZjQ3MjhhNzU3MzM3OTU1Yjc3ZGUzYzZjMDA2OWM4YmQ2NSAxMDA2NDQKLS0tIGEv
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZW5jcnlwdGVkbWVkaWEvQ0RNSW5zdGFuY2UuaAorKysg
Yi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9lbmNyeXB0ZWRtZWRpYS9DRE1JbnN0YW5jZS5oCkBA
IC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSAiQ0RNS2V5U3RhdHVzLmgiCiAjaW5jbHVkZSAiQ0RN
TWVzc2FnZVR5cGUuaCIKICNpbmNsdWRlICJDRE1TZXNzaW9uVHlwZS5oIgorI2luY2x1ZGUgIlNo
YXJlZEJ1ZmZlci5oIgogI2luY2x1ZGUgPHV0aWxpdHk+CiAjaW5jbHVkZSA8d3RmL0ZvcndhcmQu
aD4KICNpbmNsdWRlIDx3dGYvT3B0aW9uYWwuaD4KQEAgLTYwLDYgKzYxLDQ2IEBAIHB1YmxpYzoK
ICAgICAgICAgU3VjY2VlZGVkLAogICAgIH07CiAKKyAgICBlbnVtIGNsYXNzIEVuY3J5cHRpb25N
b2RlIHsKKyAgICAgICAgVW5lbmNyeXB0ZWQsCisgICAgICAgIENlbmMsCisgICAgICAgIENiY3Ms
CisgICAgfTsKKworICAgIHN0cnVjdCBTdWJTYW1wbGUgeworICAgICAgICBTdWJTYW1wbGUoKQor
ICAgICAgICAgICAgOiBjbGVhckJ5dGVzKDApLCBjaXBoZXJCeXRlcygwKSB7IH0KKyAgICAgICAg
U3ViU2FtcGxlKHVpbnQzMl90IGNsZWFyQnl0ZXMsIHVpbnQzMl90IGNpcGhlckJ5dGVzKQorICAg
ICAgICAgICAgOiBjbGVhckJ5dGVzKGNsZWFyQnl0ZXMpLCBjaXBoZXJCeXRlcyhjaXBoZXJCeXRl
cykgeyB9CisgICAgICAgIHVpbnQzMl90IGNsZWFyQnl0ZXM7CisgICAgICAgIHVpbnQzMl90IGNp
cGhlckJ5dGVzOworICAgIH07CisKKyAgICBjbGFzcyBEZWNyeXB0aW9uQ29uZmlnIDogcHVibGlj
IFJlZkNvdW50ZWQ8RGVjcnlwdGlvbkNvbmZpZz4geworICAgIHB1YmxpYzoKKyAgICAgICAgc3Rh
dGljIFJlZjxEZWNyeXB0aW9uQ29uZmlnPiBjcmVhdGVDZW5jQ29uZmlnKFJlZjxTaGFyZWRCdWZm
ZXI+JiYgaXYsIFJlZjxTaGFyZWRCdWZmZXI+JiYga2V5SWQsIFZlY3RvcjxTdWJTYW1wbGU+JiYg
c3ViU2FtcGxlcykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGFkb3B0UmVmKCpuZXcg
RGVjcnlwdGlvbkNvbmZpZyhFbmNyeXB0aW9uTW9kZTo6Q2VuYywgV1RGTW92ZShpdiksIFdURk1v
dmUoa2V5SWQpLCBXVEZNb3ZlKHN1YlNhbXBsZXMpKSk7CisgICAgICAgIH0KKworICAgICAgICBE
ZWNyeXB0aW9uQ29uZmlnKGNvbnN0IEVuY3J5cHRpb25Nb2RlJiBlbmNyeXB0aW9uTW9kZSwgUmVm
PFNoYXJlZEJ1ZmZlcj4mJiBpdiwgUmVmPFNoYXJlZEJ1ZmZlcj4mJiBrZXlJZCwgVmVjdG9yPFN1
YlNhbXBsZT4mJiBzdWJTYW1wbGVzKQorICAgICAgICAgICAgOiBtX2VuY3J5cHRpb25Nb2RlKGVu
Y3J5cHRpb25Nb2RlKSwgbV9pdihXVEZNb3ZlKGl2KSksIG1fa2V5SWQoV1RGTW92ZShrZXlJZCkp
LCBtX3N1YlNhbXBsZXMoV1RGTW92ZShzdWJTYW1wbGVzKSksIG1fdGltZW91dCg2X3MpIHsgfQor
CisgICAgICAgIEVuY3J5cHRpb25Nb2RlIG1vZGUoKSBjb25zdCB7IHJldHVybiBtX2VuY3J5cHRp
b25Nb2RlOyB9CisgICAgICAgIFJlZjxTaGFyZWRCdWZmZXI+JiBpdigpIHsgcmV0dXJuIG1faXY7
IH0KKyAgICAgICAgUmVmPFNoYXJlZEJ1ZmZlcj4mIGtleUlEKCkgeyByZXR1cm4gbV9rZXlJZDsg
fQorICAgICAgICBib29sIGlzU3ViU2FtcGxlKCkgY29uc3QgeyByZXR1cm4gbV9zdWJTYW1wbGVz
LnNpemUoKTsgfQorICAgICAgICBWZWN0b3I8U3ViU2FtcGxlPiYgc3ViU2FtcGxlcygpIHsgcmV0
dXJuIG1fc3ViU2FtcGxlczsgfQorICAgICAgICBTZWNvbmRzIHdhaXRGb3JLZXlUaW1lb3V0KCkg
Y29uc3QgeyByZXR1cm4gbV90aW1lb3V0OyB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBFbmNy
eXB0aW9uTW9kZSBtX2VuY3J5cHRpb25Nb2RlOworICAgICAgICBSZWY8U2hhcmVkQnVmZmVyPiBt
X2l2OworICAgICAgICBSZWY8U2hhcmVkQnVmZmVyPiBtX2tleUlkOworICAgICAgICBWZWN0b3I8
U3ViU2FtcGxlPiBtX3N1YlNhbXBsZXM7CisgICAgICAgIFNlY29uZHMgbV90aW1lb3V0OworICAg
IH07CisKICAgICB2aXJ0dWFsIFN1Y2Nlc3NWYWx1ZSBpbml0aWFsaXplV2l0aENvbmZpZ3VyYXRp
b24oY29uc3QgQ0RNS2V5U3lzdGVtQ29uZmlndXJhdGlvbiYpID0gMDsKICAgICB2aXJ0dWFsIFN1
Y2Nlc3NWYWx1ZSBzZXREaXN0aW5jdGl2ZUlkZW50aWZpZXJzQWxsb3dlZChib29sKSA9IDA7CiAg
ICAgdmlydHVhbCBTdWNjZXNzVmFsdWUgc2V0UGVyc2lzdGVudFN0YXRlQWxsb3dlZChib29sKSA9
IDA7CkBAIC02Nyw2ICsxMDgsNyBAQCBwdWJsaWM6CiAgICAgdmlydHVhbCBTdWNjZXNzVmFsdWUg
c2V0U3RvcmFnZURpcmVjdG9yeShjb25zdCBTdHJpbmcmKSA9IDA7CiAgICAgdmlydHVhbCBjb25z
dCBTdHJpbmcmIGtleVN5c3RlbSgpIGNvbnN0ID0gMDsKICAgICB2aXJ0dWFsIFJlZlB0cjxDRE1J
bnN0YW5jZVNlc3Npb24+IGNyZWF0ZVNlc3Npb24oKSA9IDA7CisgICAgdmlydHVhbCBib29sIGRl
Y3J5cHQoUmVmPERlY3J5cHRpb25Db25maWc+JiYsIHVpbnQ4X3QqLCB1aW50MzJfdCkgeyByZXR1
cm4gZmFsc2U7IH0KIAogICAgIGVudW0gY2xhc3MgSERDUFN0YXR1cyB7CiAgICAgICAgIFVua25v
d24sCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9lbmNyeXB0ZWRtZWRpYS9D
RE1JbnN0YW5jZVNlc3Npb24uaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2VuY3J5cHRlZG1l
ZGlhL0NETUluc3RhbmNlU2Vzc2lvbi5oCmluZGV4IGFhNDhmMzczNDI2ZGU4ZmFkYzlkMzAwMWU0
MDMzZWMxMzljZGJmOTkuLjg3N2I4NzgwMGJkYzkxZDE2NTQ4M2VjYmFkNDk0NDE0YzE5OWY2OWIg
MTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2VuY3J5cHRlZG1lZGlhL0NETUlu
c3RhbmNlU2Vzc2lvbi5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2VuY3J5cHRlZG1l
ZGlhL0NETUluc3RhbmNlU2Vzc2lvbi5oCkBAIC0yNyw2ICsyNyw3IEBACiAKICNpZiBFTkFCTEUo
RU5DUllQVEVEX01FRElBKQogCisjaW5jbHVkZSAiQ0RNSW5zdGFuY2UuaCIKICNpbmNsdWRlICJD
RE1LZXlTdGF0dXMuaCIKICNpbmNsdWRlICJDRE1NZXNzYWdlVHlwZS5oIgogI2luY2x1ZGUgIkNE
TVNlc3Npb25UeXBlLmgiCkBAIC05MCw2ICs5MSw4IEBAIHB1YmxpYzoKICAgICB2aXJ0dWFsIHZv
aWQgcmVtb3ZlU2Vzc2lvbkRhdGEoY29uc3QgU3RyaW5nJiBzZXNzaW9uSWQsIExpY2Vuc2VUeXBl
LCBSZW1vdmVTZXNzaW9uRGF0YUNhbGxiYWNrJiYpID0gMDsKIAogICAgIHZpcnR1YWwgdm9pZCBz
dG9yZVJlY29yZE9mS2V5VXNhZ2UoY29uc3QgU3RyaW5nJiBzZXNzaW9uSWQpID0gMDsKKworICAg
IHZpcnR1YWwgYm9vbCBkZWNyeXB0KFJlZjxDRE1JbnN0YW5jZTo6RGVjcnlwdGlvbkNvbmZpZz4m
JiwgdWludDhfdCosIHVpbnQzMl90KSB7IHJldHVybiBmYWxzZTsgfQogfTsKIAogfSAvLyBuYW1l
c3BhY2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZW5jcnlw
dGVkbWVkaWEvY2xlYXJrZXkvQ0RNQ2xlYXJLZXkuY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vZW5jcnlwdGVkbWVkaWEvY2xlYXJrZXkvQ0RNQ2xlYXJLZXkuY3BwCmluZGV4IDVhN2ZmODYz
MTIwNmQ4NWQ4MmEyYzA0MDgwZWFlMDZiNzc1Y2YyZTIuLjZhMGYzZTFhZDc3YzYxNDNlMzBjMzk5
NDZlOGNiYTk0NmYxOGJlOTEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2Vu
Y3J5cHRlZG1lZGlhL2NsZWFya2V5L0NETUNsZWFyS2V5LmNwcAorKysgYi9Tb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9lbmNyeXB0ZWRtZWRpYS9jbGVhcmtleS9DRE1DbGVhcktleS5jcHAKQEAgLTM0
LDQxICszNCwyNCBAQAogI2luY2x1ZGUgIkNETUtleVN5c3RlbUNvbmZpZ3VyYXRpb24uaCIKICNp
bmNsdWRlICJDRE1SZXN0cmljdGlvbnMuaCIKICNpbmNsdWRlICJDRE1TZXNzaW9uVHlwZS5oIgor
I2luY2x1ZGUgIkxvZ2dpbmcuaCIKICNpbmNsdWRlICJTaGFyZWRCdWZmZXIuaCIKKyNpbmNsdWRl
IDxnY3J5cHQuaD4KKyNpbmNsdWRlIDx3dGYvQWxnb3JpdGhtcy5oPgogI2luY2x1ZGUgPHd0Zi9K
U09OVmFsdWVzLmg+CiAjaW5jbHVkZSA8d3RmL01haW5UaHJlYWQuaD4KICNpbmNsdWRlIDx3dGYv
TmV2ZXJEZXN0cm95ZWQuaD4KICNpbmNsdWRlIDx3dGYvdGV4dC9CYXNlNjQuaD4KKyNpbmNsdWRl
IDx3dGYvdGV4dC9TdHJpbmdCdWlsZGVyLmg+CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogLy8g
Q2xlYXJLZXkgQ0VOQyBTeXN0ZW1JRC4KIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9lbWUtaW5p
dGRhdGEtY2VuYy8jY29tbW9uLXN5c3RlbQotY29uc3QgdWludDhfdCBjbGVhcktleUNlbmNTeXN0
ZW1JZFtdID0geyAweDEwLCAweDc3LCAweGVmLCAweGVjLCAweGMwLCAweGIyLCAweDRkLCAweDAy
LCAweGFjLCAweGUzLCAweDNjLCAweDFlLCAweDUyLCAweGUyLCAweGZiLCAweDRiIH07Ci1jb25z
dCB1bnNpZ25lZCBjbGVhcktleUNlbmNTeXN0ZW1JZFNpemUgPSBzaXplb2YoY2xlYXJLZXlDZW5j
U3lzdGVtSWQpOwotY29uc3QgdW5zaWduZWQga2V5SWRTaXplID0gMTY7Ci0KLWNsYXNzIENsZWFy
S2V5U3RhdGUgewotICAgIHVzaW5nIEtleVN0b3JlID0gSGFzaE1hcDxTdHJpbmcsIFZlY3RvcjxD
RE1JbnN0YW5jZUNsZWFyS2V5OjpLZXk+PjsKLQotcHVibGljOgotICAgIHN0YXRpYyBDbGVhcktl
eVN0YXRlJiBzaW5nbGV0b24oKTsKLQotICAgIEtleVN0b3JlJiBrZXlzKCkgeyByZXR1cm4gbV9r
ZXlzOyB9Ci0KLXByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIE5ldmVyRGVzdHJveWVkPENsZWFy
S2V5U3RhdGU+OwotICAgIENsZWFyS2V5U3RhdGUoKTsKLSAgICBLZXlTdG9yZSBtX2tleXM7Ci19
OwotCi1DbGVhcktleVN0YXRlJiBDbGVhcktleVN0YXRlOjpzaW5nbGV0b24oKQotewotICAgIHN0
YXRpYyBOZXZlckRlc3Ryb3llZDxDbGVhcktleVN0YXRlPiBzX3N0YXRlOwotICAgIHJldHVybiBz
X3N0YXRlOwotfQotCi1DbGVhcktleVN0YXRlOjpDbGVhcktleVN0YXRlKCkgPSBkZWZhdWx0Owor
c3RhdGljIGNvbnN0IHVpbnQ4X3QgY2xlYXJLZXlDZW5jU3lzdGVtSWRbXSA9IHsgMHgxMCwgMHg3
NywgMHhlZiwgMHhlYywgMHhjMCwgMHhiMiwgMHg0ZCwgMHgwMiwgMHhhYywgMHhlMywgMHgzYywg
MHgxZSwgMHg1MiwgMHhlMiwgMHhmYiwgMHg0YiB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNs
ZWFyS2V5Q2VuY1N5c3RlbUlkU2l6ZSA9IHNpemVvZihjbGVhcktleUNlbmNTeXN0ZW1JZCk7Citz
dGF0aWMgY29uc3QgdW5zaWduZWQga2V5SWRTaXplID0gMTY7CitzdGF0aWMgY29uc3QgdW5zaWdu
ZWQgaXZTaXplID0gMTY7CiAKIHN0YXRpYyBSZWZQdHI8SlNPTjo6T2JqZWN0PiBwYXJzZUpTT05P
YmplY3QoY29uc3QgU2hhcmVkQnVmZmVyJiBidWZmZXIpCiB7CkBAIC04Nyw3ICs3MCw3IEBAIHN0
YXRpYyBSZWZQdHI8SlNPTjo6T2JqZWN0PiBwYXJzZUpTT05PYmplY3QoY29uc3QgU2hhcmVkQnVm
ZmVyJiBidWZmZXIpCiAgICAgcmV0dXJuIG9iamVjdDsKIH0KIAotc3RhdGljIHN0ZDo6b3B0aW9u
YWw8VmVjdG9yPENETUluc3RhbmNlQ2xlYXJLZXk6OktleT4+IHBhcnNlTGljZW5zZUZvcm1hdChj
b25zdCBKU09OOjpPYmplY3QmIHJvb3QpCitzdGF0aWMgc3RkOjpvcHRpb25hbDxWZWN0b3I8Q0RN
SW5zdGFuY2VTZXNzaW9uQ2xlYXJLZXk6OktleT4+IHBhcnNlTGljZW5zZUZvcm1hdChjb25zdCBK
U09OOjpPYmplY3QmIHJvb3QpCiB7CiAgICAgLy8gSWYgdGhlICdrZXlzJyBrZXkgaXMgcHJlc2Vu
dCBpbiB0aGUgcm9vdCBvYmplY3QsIHBhcnNlIHRoZSBKU09OIGZ1cnRoZXIKICAgICAvLyBhY2Nv
cmRpbmcgdG8gdGhlIHNwZWNpZmllZCAnbGljZW5zZScgZm9ybWF0LgpAQCAtMTAwLDcgKzgzLDcg
QEAgc3RhdGljIHN0ZDo6b3B0aW9uYWw8VmVjdG9yPENETUluc3RhbmNlQ2xlYXJLZXk6OktleT4+
IHBhcnNlTGljZW5zZUZvcm1hdChjb25zdAogICAgIGlmICghaXQtPnZhbHVlLT5hc0FycmF5KGtl
eXNBcnJheSkpCiAgICAgICAgIHJldHVybiBzdGQ6Om51bGxvcHQ7CiAKLSAgICBWZWN0b3I8Q0RN
SW5zdGFuY2VDbGVhcktleTo6S2V5PiBkZWNvZGVkS2V5czsKKyAgICBWZWN0b3I8Q0RNSW5zdGFu
Y2VTZXNzaW9uQ2xlYXJLZXk6OktleT4gZGVjb2RlZEtleXM7CiAgICAgYm9vbCB2YWxpZEZvcm1h
dCA9IHN0ZDo6YWxsX29mKGtleXNBcnJheS0+YmVnaW4oKSwga2V5c0FycmF5LT5lbmQoKSwKICAg
ICAgICAgWyZkZWNvZGVkS2V5c10gKGNvbnN0IGF1dG8mIHZhbHVlKSB7CiAgICAgICAgICAgICBS
ZWZQdHI8SlNPTjo6T2JqZWN0PiBrZXlPYmplY3Q7CkBAIC0xNDUsNiArMTI4LDcgQEAgc3RhdGlj
IGJvb2wgcGFyc2VMaWNlbnNlUmVsZWFzZUFja25vd2xlZGdlbWVudEZvcm1hdChjb25zdCBKU09O
OjpPYmplY3QmIHJvb3QpCiAgICAgcmV0dXJuIHRydWU7CiB9CiAKKy8vIEZJWE1FOiBSZW1vdmUg
dGhpcyBtYW51YWwgcGFyc2luZyBhbmQgaW5zdGVhZCB1c2UgdGhlIElTT0JveCBjbGFzc2VzIGlu
IFdlYkNvcmUuCiAvLyBodHRwczovL3d3dy53My5vcmcvVFIvZW1lLWluaXRkYXRhLWNlbmMvI2Nv
bW1vbi1zeXN0ZW0KIC8vIDQuMSBEZWZpbml0aW9uCiAvLyBUaGUgU3lzdGVtSUQgaXMgMTA3N2Vm
ZWMtYzBiMi00ZDAyLWFjZTMtM2MxZTUyZTJmYjRiLgpAQCAtMjg4LDYgKzI3MiwxNyBAQCBzdGF0
aWMgUmVmPFNoYXJlZEJ1ZmZlcj4gZXh0cmFjdEtleUlkRnJvbVdlYk1Jbml0RGF0YShjb25zdCBT
aGFyZWRCdWZmZXImIGluaXREYQogICAgIHJldHVybiBrZXlJZHM7CiB9CiAKK3N0YXRpYyBTdHJp
bmcga2V5SURUb0hleFN0cmluZyhjb25zdCBSZWY8U2hhcmVkQnVmZmVyPiYga2V5SUQpCit7Cisg
ICAgU3RyaW5nQnVpbGRlciBidWlsZGVyOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBr
ZXlJRC0+c2l6ZSgpOyBpKyspIHsKKyAgICAgICAgYnVpbGRlci5hcHBlbmQoU3RyaW5nOjpmb3Jt
YXQoIjB4JTJ4IiwgKHVpbnQ4X3Qpa2V5SUQtPmRhdGEoKVtpXSkpOworICAgICAgICBpZiAoaSA8
IGtleUlELT5zaXplKCkgLSAxKQorICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoJyAnKTsKKyAg
ICB9CisgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKK30KKwogQ0RNRmFjdG9yeUNsZWFy
S2V5JiBDRE1GYWN0b3J5Q2xlYXJLZXk6OnNpbmdsZXRvbigpCiB7CiAgICAgc3RhdGljIE5ldmVy
RGVzdHJveWVkPENETUZhY3RvcnlDbGVhcktleT4gc19mYWN0b3J5OwpAQCAtMzA5LDcgKzMwNCw2
IEBAIHN0ZDo6dW5pcXVlX3B0cjxDRE1Qcml2YXRlPiBDRE1GYWN0b3J5Q2xlYXJLZXk6OmNyZWF0
ZUNETShjb25zdCBTdHJpbmcmIGtleVN5c3RlCiAKIGJvb2wgQ0RNRmFjdG9yeUNsZWFyS2V5Ojpz
dXBwb3J0c0tleVN5c3RlbShjb25zdCBTdHJpbmcmIGtleVN5c3RlbSkKIHsKLSAgICAvLyBgb3Jn
LnczLmNsZWFya2V5YCBpcyB0aGUgb25seSBzdXBwb3J0ZWQga2V5IHN5c3RlbS4KICAgICByZXR1
cm4gZXF1YWxMZXR0ZXJzSWdub3JpbmdBU0NJSUNhc2Uoa2V5U3lzdGVtLCAib3JnLnczLmNsZWFy
a2V5Iik7CiB9CiAKQEAgLTMxOCw3ICszMTIsNiBAQCBDRE1Qcml2YXRlQ2xlYXJLZXk6On5DRE1Q
cml2YXRlQ2xlYXJLZXkoKSA9IGRlZmF1bHQ7CiAKIGJvb2wgQ0RNUHJpdmF0ZUNsZWFyS2V5Ojpz
dXBwb3J0c0luaXREYXRhVHlwZShjb25zdCBBdG9taWNTdHJpbmcmIGluaXREYXRhVHlwZSkgY29u
c3QKIHsKLSAgICAvLyBga2V5aWRzYCBhbmQgJ2NlbmMnIGFyZSB0aGUgb25seSBzdXBwb3J0ZWQg
aW5pdCBkYXRhIHR5cGUuCiAgICAgcmV0dXJuIChlcXVhbExldHRlcnNJZ25vcmluZ0FTQ0lJQ2Fz
ZShpbml0RGF0YVR5cGUsICJrZXlpZHMiKSB8fCBlcXVhbExldHRlcnNJZ25vcmluZ0FTQ0lJQ2Fz
ZShpbml0RGF0YVR5cGUsICJjZW5jIikgfHwgZXF1YWxMZXR0ZXJzSWdub3JpbmdBU0NJSUNhc2Uo
aW5pdERhdGFUeXBlLCAid2VibSIpKTsKIH0KIApAQCAtMzMwLDEyICszMjMsOSBAQCBzdGF0aWMg
Ym9vbCBjb250YWluc1BlcnNpc3RlbnRMaWNlbnNlVHlwZShjb25zdCBWZWN0b3I8Q0RNU2Vzc2lv
blR5cGU+JiB0eXBlcykKIAogYm9vbCBDRE1Qcml2YXRlQ2xlYXJLZXk6OnN1cHBvcnRzQ29uZmln
dXJhdGlvbihjb25zdCBDRE1LZXlTeXN0ZW1Db25maWd1cmF0aW9uJiBjb25maWd1cmF0aW9uKSBj
b25zdAogewotICAgIC8vIFJlamVjdCBhbnkgY29uZmlndXJhdGlvbiB0aGF0IG1hcmtzIGRpc3Rp
bmN0aXZlIGlkZW50aWZpZXIgYXMgcmVxdWlyZWQuCiAgICAgaWYgKGNvbmZpZ3VyYXRpb24uZGlz
dGluY3RpdmVJZGVudGlmaWVyID09IENETVJlcXVpcmVtZW50OjpSZXF1aXJlZCkKICAgICAgICAg
cmV0dXJuIGZhbHNlOwogCi0gICAgLy8gUmVqZWN0IGFueSBjb25maWd1cmF0aW9uIHRoYXQgbWFy
a3MgcGVyc2lzdGVudCBzdGF0ZSBhcyByZXF1aXJlZCwgdW5sZXNzCi0gICAgLy8gdGhlICdwZXJz
aXN0ZW50LWxpY2Vuc2UnIHNlc3Npb24gdHlwZSBoYXMgdG8gYmUgc3VwcG9ydGVkLgogICAgIGlm
IChjb25maWd1cmF0aW9uLnBlcnNpc3RlbnRTdGF0ZSA9PSBDRE1SZXF1aXJlbWVudDo6UmVxdWly
ZWQgJiYgIWNvbnRhaW5zUGVyc2lzdGVudExpY2Vuc2VUeXBlKGNvbmZpZ3VyYXRpb24uc2Vzc2lv
blR5cGVzKSkKICAgICAgICAgcmV0dXJuIGZhbHNlOwogCkBAIC0zNDQsMTkgKzMzNCwxMyBAQCBi
b29sIENETVByaXZhdGVDbGVhcktleTo6c3VwcG9ydHNDb25maWd1cmF0aW9uKGNvbnN0IENETUtl
eVN5c3RlbUNvbmZpZ3VyYXRpb24mCiAKIGJvb2wgQ0RNUHJpdmF0ZUNsZWFyS2V5OjpzdXBwb3J0
c0NvbmZpZ3VyYXRpb25XaXRoUmVzdHJpY3Rpb25zKGNvbnN0IENETUtleVN5c3RlbUNvbmZpZ3Vy
YXRpb24mIGNvbmZpZ3VyYXRpb24sIGNvbnN0IENETVJlc3RyaWN0aW9ucyYgcmVzdHJpY3Rpb25z
KSBjb25zdAogewotICAgIC8vIFJlamVjdCBhbnkgY29uZmlndXJhdGlvbiB0aGF0IG1hcmtzIGRp
c3RpbmNpdGl2ZSBpZGVudGlmaWVyIGFzIHJlcXVpcmVkLCBvciB0aGF0IG1hcmtzCi0gICAgLy8g
ZGlzdGluY3RpdmUgaWRlbnRpZmllciBhcyBvcHRpb25hbCBldmVuIHdoZW4gcmVzdHJpY3Rpb25z
IG1hcmsgaXQgYXMgZGVuaWVkLgogICAgIGlmICgoY29uZmlndXJhdGlvbi5kaXN0aW5jdGl2ZUlk
ZW50aWZpZXIgPT0gQ0RNUmVxdWlyZW1lbnQ6Ok9wdGlvbmFsICYmIHJlc3RyaWN0aW9ucy5kaXN0
aW5jdGl2ZUlkZW50aWZpZXJEZW5pZWQpCiAgICAgICAgIHx8IGNvbmZpZ3VyYXRpb24uZGlzdGlu
Y3RpdmVJZGVudGlmaWVyID09IENETVJlcXVpcmVtZW50OjpSZXF1aXJlZCkKICAgICAgICAgcmV0
dXJuIGZhbHNlOwogCi0gICAgLy8gUmVqZWN0IGFueSBjb25maWd1cmF0aW9uIHRoYXQgbWFya3Mg
cGVyc2lzdGVudCBzdGF0ZSBhcyBvcHRpb25hbCBldmVuIHdoZW4KLSAgICAvLyByZXN0cmljdGlv
bnMgbWFyayBpdCBhcyBkZW5pZWQuCiAgICAgaWYgKGNvbmZpZ3VyYXRpb24ucGVyc2lzdGVudFN0
YXRlID09IENETVJlcXVpcmVtZW50OjpPcHRpb25hbCAmJiByZXN0cmljdGlvbnMucGVyc2lzdGVu
dFN0YXRlRGVuaWVkKQogICAgICAgICByZXR1cm4gZmFsc2U7CiAKLSAgICAvLyBSZWplY3QgYW55
IGNvbmZpZ3VyYXRpb24gdGhhdCBtYXJrcyBwZXJzaXN0ZW50IHN0YXRlIGFzIHJlcXVpcmVkLCB1
bmxlc3MKLSAgICAvLyB0aGUgJ3BlcnNpc3RlbnQtbGljZW5zZScgc2Vzc2lvbiB0eXBlIGhhcyB0
byBiZSBzdXBwb3J0ZWQuCiAgICAgaWYgKGNvbmZpZ3VyYXRpb24ucGVyc2lzdGVudFN0YXRlID09
IENETVJlcXVpcmVtZW50OjpSZXF1aXJlZCAmJiAhY29udGFpbnNQZXJzaXN0ZW50TGljZW5zZVR5
cGUoY29uZmlndXJhdGlvbi5zZXNzaW9uVHlwZXMpKQogICAgICAgICByZXR1cm4gZmFsc2U7CiAK
QEAgLTM2NSw3ICszNDksNiBAQCBib29sIENETVByaXZhdGVDbGVhcktleTo6c3VwcG9ydHNDb25m
aWd1cmF0aW9uV2l0aFJlc3RyaWN0aW9ucyhjb25zdCBDRE1LZXlTeXN0ZQogCiBib29sIENETVBy
aXZhdGVDbGVhcktleTo6c3VwcG9ydHNTZXNzaW9uVHlwZVdpdGhDb25maWd1cmF0aW9uKENETVNl
c3Npb25UeXBlJiBzZXNzaW9uVHlwZSwgY29uc3QgQ0RNS2V5U3lzdGVtQ29uZmlndXJhdGlvbiYg
Y29uZmlndXJhdGlvbikgY29uc3QKIHsKLSAgICAvLyBPbmx5IHN1cHBvcnQgdGhlICd0ZW1wb3Jh
cnknIGFuZCAncGVyc2lzdGVudC1saWNlbnNlJyBzZXNzaW9uIHR5cGVzLgogICAgIGlmIChzZXNz
aW9uVHlwZSAhPSBDRE1TZXNzaW9uVHlwZTo6VGVtcG9yYXJ5ICYmIHNlc3Npb25UeXBlICE9IENE
TVNlc3Npb25UeXBlOjpQZXJzaXN0ZW50TGljZW5zZSkKICAgICAgICAgcmV0dXJuIGZhbHNlOwog
ICAgIHJldHVybiBzdXBwb3J0c0NvbmZpZ3VyYXRpb24oY29uZmlndXJhdGlvbik7CkBAIC0zNzMs
NyArMzU2LDYgQEAgYm9vbCBDRE1Qcml2YXRlQ2xlYXJLZXk6OnN1cHBvcnRzU2Vzc2lvblR5cGVX
aXRoQ29uZmlndXJhdGlvbihDRE1TZXNzaW9uVHlwZSYgc2UKIAogYm9vbCBDRE1Qcml2YXRlQ2xl
YXJLZXk6OnN1cHBvcnRzUm9idXN0bmVzcyhjb25zdCBTdHJpbmcmIHJvYnVzdG5lc3MpIGNvbnN0
CiB7Ci0gICAgLy8gT25seSBlbXB0eSBgcm9idXN0bmVzc2Agc3RyaW5nIGlzIHN1cHBvcnRlZC4K
ICAgICByZXR1cm4gcm9idXN0bmVzcy5pc0VtcHR5KCk7CiB9CiAKQEAgLTM4Nyw3ICszNjksNiBA
QCBDRE1SZXF1aXJlbWVudCBDRE1Qcml2YXRlQ2xlYXJLZXk6OmRpc3RpbmN0aXZlSWRlbnRpZmll
cnNSZXF1aXJlbWVudChjb25zdCBDRE1LZQogCiBDRE1SZXF1aXJlbWVudCBDRE1Qcml2YXRlQ2xl
YXJLZXk6OnBlcnNpc3RlbnRTdGF0ZVJlcXVpcmVtZW50KGNvbnN0IENETUtleVN5c3RlbUNvbmZp
Z3VyYXRpb24mLCBjb25zdCBDRE1SZXN0cmljdGlvbnMmIHJlc3RyaWN0aW9ucykgY29uc3QKIHsK
LSAgICAvLyBQZXJzaXN0ZW50IHN0YXRlIGlzIG5vdCBhbGxvd2VkIGlmIGl0J3MgYmVlbiBkZW5p
ZWQsIG90aGVyd2lzZSBpdCdzIG9wdGlvbmFsLgogICAgIGlmIChyZXN0cmljdGlvbnMucGVyc2lz
dGVudFN0YXRlRGVuaWVkKQogICAgICAgICByZXR1cm4gQ0RNUmVxdWlyZW1lbnQ6Ok5vdEFsbG93
ZWQ7CiAgICAgcmV0dXJuIENETVJlcXVpcmVtZW50OjpPcHRpb25hbDsKQEAgLTQwNSwzMiArMzg2
LDI2IEBAIFJlZlB0cjxDRE1JbnN0YW5jZT4gQ0RNUHJpdmF0ZUNsZWFyS2V5OjpjcmVhdGVJbnN0
YW5jZSgpCiAKIHZvaWQgQ0RNUHJpdmF0ZUNsZWFyS2V5Ojpsb2FkQW5kSW5pdGlhbGl6ZSgpCiB7
Ci0gICAgLy8gTm8tb3AuCiB9CiAKIGJvb2wgQ0RNUHJpdmF0ZUNsZWFyS2V5OjpzdXBwb3J0c1Nl
cnZlckNlcnRpZmljYXRlcygpIGNvbnN0CiB7Ci0gICAgLy8gU2VydmVyIGNlcnRpZmljYXRlcyBh
cmUgbm90IHN1cHBvcnRlZC4KICAgICByZXR1cm4gZmFsc2U7CiB9CiAKIGJvb2wgQ0RNUHJpdmF0
ZUNsZWFyS2V5OjpzdXBwb3J0c1Nlc3Npb25zKCkgY29uc3QKIHsKLSAgICAvLyBTZXNzaW9ucyBh
cmUgc3VwcG9ydGVkLgogICAgIHJldHVybiB0cnVlOwogfQogCiBib29sIENETVByaXZhdGVDbGVh
cktleTo6c3VwcG9ydHNJbml0RGF0YShjb25zdCBBdG9taWNTdHJpbmcmIGluaXREYXRhVHlwZSwg
Y29uc3QgU2hhcmVkQnVmZmVyJiBpbml0RGF0YSkgY29uc3QKIHsKLSAgICAvLyBWYWxpZGF0ZSB0
aGUgaW5pdERhdGEgYnVmZmVyIGFzIGFuIEpTT04gb2JqZWN0IGluIGtleWlkcyBjYXNlLgogICAg
IGlmIChlcXVhbExldHRlcnNJZ25vcmluZ0FTQ0lJQ2FzZShpbml0RGF0YVR5cGUsICJrZXlpZHMi
KSAmJiBwYXJzZUpTT05PYmplY3QoaW5pdERhdGEpKQogICAgICAgICByZXR1cm4gdHJ1ZTsKIAot
ICAgIC8vIFZhbGlkYXRlIHRoZSBpbml0RGF0YSBidWZmZXIgYXMgQ0VOQyBpbml0RGF0YS4KICAg
ICBpZiAoZXF1YWxMZXR0ZXJzSWdub3JpbmdBU0NJSUNhc2UoaW5pdERhdGFUeXBlLCAiY2VuYyIp
ICYmIGlzQ2VuY0luaXREYXRhKGluaXREYXRhKSkKICAgICAgICAgcmV0dXJuIHRydWU7CiAKLSAg
ICAvLyBWYWxpZGF0ZSB0aGUgaW5pdERhdGEgYnVmZmVyIGFzIFdlYk0gaW5pdERhdGEuCiAgICAg
aWYgKGVxdWFsTGV0dGVyc0lnbm9yaW5nQVNDSUlDYXNlKGluaXREYXRhVHlwZSwgIndlYm0iKSAm
JiAhaW5pdERhdGEuaXNFbXB0eSgpKQogICAgICAgICByZXR1cm4gdHJ1ZTsKIApAQCAtNDM5LDcg
KzQxNCw2IEBAIGJvb2wgQ0RNUHJpdmF0ZUNsZWFyS2V5OjpzdXBwb3J0c0luaXREYXRhKGNvbnN0
IEF0b21pY1N0cmluZyYgaW5pdERhdGFUeXBlLCBjb25zCiAKIFJlZlB0cjxTaGFyZWRCdWZmZXI+
IENETVByaXZhdGVDbGVhcktleTo6c2FuaXRpemVSZXNwb25zZShjb25zdCBTaGFyZWRCdWZmZXIm
IHJlc3BvbnNlKSBjb25zdAogewotICAgIC8vIFZhbGlkYXRlIHRoZSByZXNwb25zZSBidWZmZXIg
YXMgYW4gSlNPTiBvYmplY3QuCiAgICAgaWYgKCFwYXJzZUpTT05PYmplY3QocmVzcG9uc2UpKQog
ICAgICAgICByZXR1cm4gbnVsbHB0cjsKIApAQCAtNDQ4LDcgKzQyMiw2IEBAIFJlZlB0cjxTaGFy
ZWRCdWZmZXI+IENETVByaXZhdGVDbGVhcktleTo6c2FuaXRpemVSZXNwb25zZShjb25zdCBTaGFy
ZWRCdWZmZXImIHJlCiAKIHN0ZDo6b3B0aW9uYWw8U3RyaW5nPiBDRE1Qcml2YXRlQ2xlYXJLZXk6
OnNhbml0aXplU2Vzc2lvbklkKGNvbnN0IFN0cmluZyYgc2Vzc2lvbklkKSBjb25zdAogewotICAg
IC8vIFZhbGlkYXRlIHRoZSBzZXNzaW9uIElEIHN0cmluZyBhcyBhbiAzMi1iaXQgaW50ZWdlci4K
ICAgICBib29sIG9rOwogICAgIHNlc3Npb25JZC50b1VJbnRTdHJpY3QoJm9rKTsKICAgICBpZiAo
IW9rKQpAQCAtNDU2LDM5ICs0MjksMjggQEAgc3RkOjpvcHRpb25hbDxTdHJpbmc+IENETVByaXZh
dGVDbGVhcktleTo6c2FuaXRpemVTZXNzaW9uSWQoY29uc3QgU3RyaW5nJiBzZXNzaW8KICAgICBy
ZXR1cm4gc2Vzc2lvbklkOwogfQogCi1DRE1JbnN0YW5jZUNsZWFyS2V5OjpDRE1JbnN0YW5jZUNs
ZWFyS2V5KCkKLXsKLX0KLQotQ0RNSW5zdGFuY2VDbGVhcktleTo6fkNETUluc3RhbmNlQ2xlYXJL
ZXkoKSA9IGRlZmF1bHQ7Ci0KIENETUluc3RhbmNlOjpTdWNjZXNzVmFsdWUgQ0RNSW5zdGFuY2VD
bGVhcktleTo6aW5pdGlhbGl6ZVdpdGhDb25maWd1cmF0aW9uKGNvbnN0IENETUtleVN5c3RlbUNv
bmZpZ3VyYXRpb24mKQogewotICAgIC8vIE5vLW9wLgogICAgIHJldHVybiBTdWNjZWVkZWQ7CiB9
CiAKIENETUluc3RhbmNlOjpTdWNjZXNzVmFsdWUgQ0RNSW5zdGFuY2VDbGVhcktleTo6c2V0RGlz
dGluY3RpdmVJZGVudGlmaWVyc0FsbG93ZWQoYm9vbCBhbGxvd2VkKQogewotICAgIC8vIFJlamVj
dCBzZXR0aW5nIGRpc3RpbmN0aXZlIGlkZW50aWZpZXJzIGFzIGFsbG93ZWQuCiAgICAgcmV0dXJu
ICFhbGxvd2VkID8gU3VjY2VlZGVkIDogRmFpbGVkOwogfQogCiBDRE1JbnN0YW5jZTo6U3VjY2Vz
c1ZhbHVlIENETUluc3RhbmNlQ2xlYXJLZXk6OnNldFBlcnNpc3RlbnRTdGF0ZUFsbG93ZWQoYm9v
bCBhbGxvd2VkKQogewotICAgIC8vIFJlamVjdCBzZXR0aW5nIHBlcnNpc3RlbnQgc3RhdGUgYXMg
YWxsb3dlZC4KICAgICByZXR1cm4gIWFsbG93ZWQgPyBTdWNjZWVkZWQgOiBGYWlsZWQ7CiB9CiAK
IENETUluc3RhbmNlOjpTdWNjZXNzVmFsdWUgQ0RNSW5zdGFuY2VDbGVhcktleTo6c2V0U2VydmVy
Q2VydGlmaWNhdGUoUmVmPFNoYXJlZEJ1ZmZlcj4mJikKIHsKLSAgICAvLyBSZWplY3Qgc2V0dGlu
ZyBhbnkgc2VydmVyIGNlcnRpZmljYXRlLgogICAgIHJldHVybiBGYWlsZWQ7CiB9CiAKIENETUlu
c3RhbmNlOjpTdWNjZXNzVmFsdWUgQ0RNSW5zdGFuY2VDbGVhcktleTo6c2V0U3RvcmFnZURpcmVj
dG9yeShjb25zdCBTdHJpbmcmIHN0b3JhZ2VEaXJlY3RvcnkpCiB7Ci0gICAgLy8gUmVqZWN0IGFu
eSBwZXJzaXN0ZW50IHN0YXRlIHN0b3JhZ2UuCiAgICAgcmV0dXJuIHN0b3JhZ2VEaXJlY3Rvcnku
aXNFbXB0eSgpID8gU3VjY2VlZGVkIDogRmFpbGVkOwogfQogCkBAIC01MDEsMjIgKzQ2Myw1MiBA
QCBjb25zdCBTdHJpbmcmIENETUluc3RhbmNlQ2xlYXJLZXk6OmtleVN5c3RlbSgpIGNvbnN0CiAK
IFJlZlB0cjxDRE1JbnN0YW5jZVNlc3Npb24+IENETUluc3RhbmNlQ2xlYXJLZXk6OmNyZWF0ZVNl
c3Npb24oKQogewotICAgIHJldHVybiBhZG9wdFJlZihuZXcgQ0RNSW5zdGFuY2VTZXNzaW9uQ2xl
YXJLZXkoKSk7CisgICAgYXV0byBzZXNzaW9uID0gYWRvcHRSZWYoKm5ldyBDRE1JbnN0YW5jZVNl
c3Npb25DbGVhcktleSgqdGhpcykpOworICAgIG1fc2Vzc2lvbnMuYXBwZW5kKG1ha2VXZWFrUHRy
KHNlc3Npb24uZ2V0KCkpKTsKKyAgICByZXR1cm4gc2Vzc2lvbjsKIH0KIAotY29uc3QgVmVjdG9y
PENETUluc3RhbmNlQ2xlYXJLZXk6OktleT4gQ0RNSW5zdGFuY2VDbGVhcktleTo6a2V5cygpIGNv
bnN0Citib29sIENETUluc3RhbmNlQ2xlYXJLZXk6OmRlY3J5cHQoUmVmPENETUluc3RhbmNlOjpE
ZWNyeXB0aW9uQ29uZmlnPiYmIGNvbmZpZywgdWludDhfdCogZW5jcnlwdGVkQnVmZmVyLCB1aW50
MzJfdCBlbmNyeXB0ZWRCdWZmZXJTaXplKQogewotICAgIC8vIFJldHVybiB0aGUga2V5cyBvZiBh
bGwgc2Vzc2lvbnMuCi0gICAgVmVjdG9yPENETUluc3RhbmNlQ2xlYXJLZXk6OktleT4gYWxsS2V5
cyB7IH07Ci0gICAgc2l6ZV90IGluaXRpYWxDYXBhY2l0eSA9IDA7Ci0gICAgZm9yIChhdXRvJiBr
ZXkgOiBDbGVhcktleVN0YXRlOjpzaW5nbGV0b24oKS5rZXlzKCkudmFsdWVzKCkpCi0gICAgICAg
IGluaXRpYWxDYXBhY2l0eSArPSBrZXkuc2l6ZSgpOwotICAgIGFsbEtleXMucmVzZXJ2ZUluaXRp
YWxDYXBhY2l0eShpbml0aWFsQ2FwYWNpdHkpOworICAgIEFTU0VSVCghaXNNYWluVGhyZWFkKCkp
OworICAgIExPRyhFTUUsICJFTUUgQ2xlYXJLZXkgLSBkZWNyeXB0aW5nLCBsb29raW5nIHVwIHNl
c3Npb24gZm9yIGtleSBJRCBbJXNdIiwga2V5SURUb0hleFN0cmluZyhjb25maWctPmtleUlEKCkp
LnV0ZjgoKS5kYXRhKCkpOwogCi0gICAgZm9yIChhdXRvJiBrZXkgOiBDbGVhcktleVN0YXRlOjpz
aW5nbGV0b24oKS5rZXlzKCkudmFsdWVzKCkpCi0gICAgICAgIGFsbEtleXMuYXBwZW5kVmVjdG9y
KGtleSk7CisgICAgYXV0byogc2Vzc2lvbiA9IHNlc3Npb25Gb3JLZXlJRChjb25maWctPmtleUlE
KCkpOworICAgIGlmICghc2Vzc2lvbikgeworICAgICAgICBhdXRvIGxvY2tlciA9IGhvbGRMb2Nr
KG1fd2FpdGluZ0ZvcktleUxvY2spOworICAgICAgICBtX3dhaXRpbmdGb3JLZXlDb25kaXRpb24u
d2FpdEZvcihtX3dhaXRpbmdGb3JLZXlMb2NrLCBjb25maWctPndhaXRGb3JLZXlUaW1lb3V0KCks
IFt0aGlzLCAmY29uZmlnLCAmc2Vzc2lvbl0geworICAgICAgICAgICAgcmV0dXJuIHNlc3Npb24g
PSBzZXNzaW9uRm9yS2V5SUQoY29uZmlnLT5rZXlJRCgpKTsKKyAgICAgICAgfSk7CisgICAgICAg
IGlmICghc2Vzc2lvbikgeworICAgICAgICAgICAgTE9HKEVNRSwgIkZhaWxlZCB0byBmaW5kIG1h
dGNoaW5nIHNlc3Npb24iKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQor
ICAgIH0KKworICAgIExPRyhFTUUsICJFTUUgQ2xlYXJLZXkgLSBmb3VuZCBzZXNzaW9uIHdpdGgg
YWRkcmVzcyAlcCIsIHNlc3Npb24pOworICAgIHJldHVybiBzZXNzaW9uLT5kZWNyeXB0KFdURk1v
dmUoY29uZmlnKSwgZW5jcnlwdGVkQnVmZmVyLCBlbmNyeXB0ZWRCdWZmZXJTaXplKTsKK30KKwor
Q0RNSW5zdGFuY2VTZXNzaW9uQ2xlYXJLZXkqIENETUluc3RhbmNlQ2xlYXJLZXk6OnNlc3Npb25G
b3JLZXlJRChjb25zdCBSZWY8U2hhcmVkQnVmZmVyPiYga2V5SUQpIGNvbnN0Cit7CisgICAgZm9y
IChhdXRvJiBzZXNzaW9uSW50ZXJmYWNlIDogbV9zZXNzaW9ucykgeworICAgICAgICBpZiAoIXNl
c3Npb25JbnRlcmZhY2UpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBhdXRvIHNl
c3Npb25LZXlzID0gc2Vzc2lvbkludGVyZmFjZS0+a2V5SURzKCk7CisgICAgICAgIGlmIChhbnlP
ZihzZXNzaW9uS2V5cywgWyZdKGF1dG8mIHNlc3Npb25LZXkpIHsKKyAgICAgICAgICAgIHJldHVy
biBrZXlJRCA9PSBzZXNzaW9uS2V5OworICAgICAgICB9KSkKKyAgICAgICAgICAgIHJldHVybiBz
ZXNzaW9uSW50ZXJmYWNlLmdldCgpOworICAgIH0KIAotICAgIHJldHVybiBhbGxLZXlzOworICAg
IExPRyhFTUUsICJFTUUgQ2xlYXJLZXkgLSBmb3VuZCBubyBtYXRjaGluZyBzZXNzaW9uIGZvciB0
aGUgZ2l2ZW4ga2V5IElEcyIpOworICAgIHJldHVybiBudWxscHRyOworfQorCitDRE1JbnN0YW5j
ZVNlc3Npb25DbGVhcktleTo6Q0RNSW5zdGFuY2VTZXNzaW9uQ2xlYXJLZXkoUmVmPENETUluc3Rh
bmNlQ2xlYXJLZXk+JiYgaW5zdGFuY2UpCisgICAgOiBtX2luc3RhbmNlKFdURk1vdmUoaW5zdGFu
Y2UpKQorewogfQogCiB2b2lkIENETUluc3RhbmNlU2Vzc2lvbkNsZWFyS2V5OjpyZXF1ZXN0TGlj
ZW5zZShMaWNlbnNlVHlwZSwgY29uc3QgQXRvbWljU3RyaW5nJiBpbml0RGF0YVR5cGUsIFJlZjxT
aGFyZWRCdWZmZXI+JiYgaW5pdERhdGEsIExpY2Vuc2VDYWxsYmFjayYmIGNhbGxiYWNrKQpAQCAt
NTI0LDYgKzUxNiw5IEBAIHZvaWQgQ0RNSW5zdGFuY2VTZXNzaW9uQ2xlYXJLZXk6OnJlcXVlc3RM
aWNlbnNlKExpY2Vuc2VUeXBlLCBjb25zdCBBdG9taWNTdHJpbmcmCiAgICAgc3RhdGljIHVpbnQz
Ml90IHNfc2Vzc2lvbklkVmFsdWUgPSAwOwogICAgICsrc19zZXNzaW9uSWRWYWx1ZTsKIAorICAg
IG1fc2Vzc2lvbklkID0gU3RyaW5nOjpudW1iZXIoc19zZXNzaW9uSWRWYWx1ZSk7CisgICAgTE9H
KEVNRSwgIkVNRSBDbGVhcktleSAtIG5ldyBsaWNlbnNlIHJlcXVlc3QsIG91ciBzZXNzaW9uIGlk
IGlzICVzIiwgbV9zZXNzaW9uSWQudXRmOCgpLmRhdGEoKSk7CisKICAgICBpZiAoZXF1YWxMZXR0
ZXJzSWdub3JpbmdBU0NJSUNhc2UoaW5pdERhdGFUeXBlLCAiY2VuYyIpKQogICAgICAgICBpbml0
RGF0YSA9IGV4dHJhY3RLZXlpZHNGcm9tQ2VuY0luaXREYXRhKGluaXREYXRhLmdldCgpKTsKIApA
QCAtNTMxLDE2ICs1MjYsMTkgQEAgdm9pZCBDRE1JbnN0YW5jZVNlc3Npb25DbGVhcktleTo6cmVx
dWVzdExpY2Vuc2UoTGljZW5zZVR5cGUsIGNvbnN0IEF0b21pY1N0cmluZyYKICAgICAgICAgaW5p
dERhdGEgPSBleHRyYWN0S2V5SWRGcm9tV2ViTUluaXREYXRhKGluaXREYXRhLmdldCgpKTsKIAog
ICAgIGNhbGxPbk1haW5UaHJlYWQoCi0gICAgICAgIFt3ZWFrVGhpcyA9IG1ha2VXZWFrUHRyKCp0
aGlzKSwgY2FsbGJhY2sgPSBXVEZNb3ZlKGNhbGxiYWNrKSwgaW5pdERhdGEgPSBXVEZNb3ZlKGlu
aXREYXRhKSwgc2Vzc2lvbklkVmFsdWUgPSBzX3Nlc3Npb25JZFZhbHVlXSgpIG11dGFibGUgewor
ICAgICAgICBbd2Vha1RoaXMgPSBtYWtlV2Vha1B0cigqdGhpcyksIGNhbGxiYWNrID0gV1RGTW92
ZShjYWxsYmFjayksIGluaXREYXRhID0gV1RGTW92ZShpbml0RGF0YSksIHNlc3Npb25JZFZhbHVl
ID0gbV9zZXNzaW9uSWRdKCkgbXV0YWJsZSB7CiAgICAgICAgICAgICBpZiAoIXdlYWtUaGlzKQog
ICAgICAgICAgICAgICAgIHJldHVybjsKIAotICAgICAgICAgICAgY2FsbGJhY2soV1RGTW92ZShp
bml0RGF0YSksIFN0cmluZzo6bnVtYmVyKHNlc3Npb25JZFZhbHVlKSwgZmFsc2UsIFN1Y2NlZWRl
ZCk7CisgICAgICAgICAgICBjYWxsYmFjayhXVEZNb3ZlKGluaXREYXRhKSwgc2Vzc2lvbklkVmFs
dWUsIGZhbHNlLCBTdWNjZWVkZWQpOwogICAgICAgICB9KTsKIH0KIAogdm9pZCBDRE1JbnN0YW5j
ZVNlc3Npb25DbGVhcktleTo6dXBkYXRlTGljZW5zZShjb25zdCBTdHJpbmcmIHNlc3Npb25JZCwg
TGljZW5zZVR5cGUsIGNvbnN0IFNoYXJlZEJ1ZmZlciYgcmVzcG9uc2UsIExpY2Vuc2VVcGRhdGVD
YWxsYmFjayYmIGNhbGxiYWNrKQogeworICAgIExPRyhFTUUsICJFTUUgQ2xlYXJLZXkgLSByZWNl
aXZlZCB1cGRhdGUgcmVxdWVzdCBmb3Igc2Vzc2lvbiBpZCAlcywgb3VyIGlkIGlzICVzIiwgc2Vz
c2lvbklkLnV0ZjgoKS5kYXRhKCksIG1fc2Vzc2lvbklkLnV0ZjgoKS5kYXRhKCkpOworICAgIFJF
TEVBU0VfQVNTRVJUKHNlc3Npb25JZCA9PSBtX3Nlc3Npb25JZCk7CisKICAgICAvLyBVc2UgYSBo
ZWxwZXIgZnVuY3RvciB0aGF0IHNjaGVkdWxlcyB0aGUgY2FsbGJhY2sgZGlzcGF0Y2gsIGF2b2lk
aW5nCiAgICAgLy8gZHVwbGljYXRlZCBjYWxsT25NYWluVGhyZWFkKCkgY2FsbHMuCiAgICAgYXV0
byBkaXNwYXRjaENhbGxiYWNrID0KQEAgLTU1NCw1OCArNTUyLDQxIEBAIHZvaWQgQ0RNSW5zdGFu
Y2VTZXNzaW9uQ2xlYXJLZXk6OnVwZGF0ZUxpY2Vuc2UoY29uc3QgU3RyaW5nJiBzZXNzaW9uSWQs
IExpY2Vuc2VUCiAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgIH07CiAKLSAgICAvLyBQYXJz
ZSB0aGUgcmVzcG9uc2UgYnVmZmVyIGFzIGFuIEpTT04gb2JqZWN0LgogICAgIFJlZlB0cjxKU09O
OjpPYmplY3Q+IHJvb3QgPSBwYXJzZUpTT05PYmplY3QocmVzcG9uc2UpOwogICAgIGlmICghcm9v
dCkgewogICAgICAgICBkaXNwYXRjaENhbGxiYWNrKGZhbHNlLCBzdGQ6Om51bGxvcHQsIFN1Y2Nl
c3NWYWx1ZTo6RmFpbGVkKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIC8vIFBhcnNl
IHRoZSByZXNwb25zZSB1c2luZyAnbGljZW5zZScgZm9ybWF0dGluZywgaWYgcG9zc2libGUuCiAg
ICAgaWYgKGF1dG8gZGVjb2RlZEtleXMgPSBwYXJzZUxpY2Vuc2VGb3JtYXQoKnJvb3QpKSB7Ci0g
ICAgICAgIC8vIFJldHJpZXZlIHRoZSB0YXJnZXQgVmVjdG9yIG9mIEtleSBvYmplY3RzIGZvciB0
aGlzIHNlc3Npb24uCi0gICAgICAgIGF1dG8mIGtleVZlY3RvciA9IENsZWFyS2V5U3RhdGU6OnNp
bmdsZXRvbigpLmtleXMoKS5lbnN1cmUoc2Vzc2lvbklkLCBbXSB7IHJldHVybiBWZWN0b3I8Q0RN
SW5zdGFuY2VDbGVhcktleTo6S2V5PiB7IH07IH0pLml0ZXJhdG9yLT52YWx1ZTsKLQotICAgICAg
ICAvLyBGb3IgZWFjaCBkZWNvZGVkIGtleSwgZmluZCBhbiBleGlzdGluZyBpdGVtIGZvciB0aGUg
ZGVjb2RlZCBrZXkncyBJRC4gSWYgbm9uZSBleGlzdCwKLSAgICAgICAgLy8gdGhlIGtleSBpcyBk
ZWNvZGVkLiBPdGhlcndpc2UsIHRoZSBrZXkgaXMgdXBkYXRlZCBpbiBjYXNlIHRoZXJlJ3MgYSBt
aXNtYXRjaCBiZXR3ZWVuCi0gICAgICAgIC8vIHRoZSBzaXplIG9yIGRhdGEgb2YgdGhlIGV4aXN0
aW5nIGFuZCBwcm9wb3NlZCBrZXkuCiAgICAgICAgIGJvb2wga2V5c0NoYW5nZWQgPSBmYWxzZTsK
ICAgICAgICAgZm9yIChhdXRvJiBrZXkgOiAqZGVjb2RlZEtleXMpIHsKLSAgICAgICAgICAgIGF1
dG8gaXQgPSBzdGQ6OmZpbmRfaWYoa2V5VmVjdG9yLmJlZ2luKCksIGtleVZlY3Rvci5lbmQoKSwK
LSAgICAgICAgICAgICAgICBbJmtleV0gKGNvbnN0IENETUluc3RhbmNlQ2xlYXJLZXk6OktleSYg
Y29udGFpbmVkS2V5KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluZWRLZXku
a2V5SUREYXRhLT5zaXplKCkgPT0ga2V5LmtleUlERGF0YS0+c2l6ZSgpCi0gICAgICAgICAgICAg
ICAgICAgICAgICAmJiAhc3RkOjptZW1jbXAoY29udGFpbmVkS2V5LmtleUlERGF0YS0+ZGF0YSgp
LCBrZXkua2V5SUREYXRhLT5kYXRhKCksIGNvbnRhaW5lZEtleS5rZXlJRERhdGEtPnNpemUoKSk7
CisgICAgICAgICAgICBhdXRvIGl0ID0gc3RkOjpmaW5kX2lmKG1fa2V5cy5iZWdpbigpLCBtX2tl
eXMuZW5kKCksCisgICAgICAgICAgICAgICAgWyZrZXldIChjb25zdCBLZXkmIGNvbnRhaW5lZEtl
eSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGFpbmVkS2V5LmlkLT5zaXplKCkg
PT0ga2V5LmlkLT5zaXplKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmICFzdGQ6Om1lbWNt
cChjb250YWluZWRLZXkuaWQtPmRhdGEoKSwga2V5LmlkLT5kYXRhKCksIGNvbnRhaW5lZEtleS5p
ZC0+c2l6ZSgpKTsKICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIGlmIChpdCAhPSBr
ZXlWZWN0b3IuZW5kKCkpIHsKLSAgICAgICAgICAgICAgICBhdXRvJiBleGlzdGluZ0tleSA9IGl0
LT5rZXlWYWx1ZURhdGE7Ci0gICAgICAgICAgICAgICAgYXV0byYgcHJvcG9zZWRLZXkgPSBrZXku
a2V5VmFsdWVEYXRhOworICAgICAgICAgICAgaWYgKGl0ICE9IG1fa2V5cy5lbmQoKSkgeworICAg
ICAgICAgICAgICAgIGF1dG8mIGV4aXN0aW5nS2V5ID0gaXQtPnZhbHVlOworICAgICAgICAgICAg
ICAgIGF1dG8mIHByb3Bvc2VkS2V5ID0ga2V5LnZhbHVlOwogCi0gICAgICAgICAgICAgICAgLy8g
VXBkYXRlIHRoZSBleGlzdGluZyBLZXkgaWYgaXQgZGlmZmVycyBmcm9tIHRoZSBwcm9wb3NlZCBr
ZXkgaW4ga2V5IHZhbHVlLgogICAgICAgICAgICAgICAgIGlmIChleGlzdGluZ0tleS0+c2l6ZSgp
ICE9IHByb3Bvc2VkS2V5LT5zaXplKCkgfHwgc3RkOjptZW1jbXAoZXhpc3RpbmdLZXktPmRhdGEo
KSwgcHJvcG9zZWRLZXktPmRhdGEoKSwgZXhpc3RpbmdLZXktPnNpemUoKSkpIHsKICAgICAgICAg
ICAgICAgICAgICAgKml0ID0gV1RGTW92ZShrZXkpOwogICAgICAgICAgICAgICAgICAgICBrZXlz
Q2hhbmdlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsK
LSAgICAgICAgICAgICAgICAvLyBJbiBjYXNlIGEgS2V5IGZvciB0aGlzIGtleSBJRCBkb2Vzbid0
IGV4aXN0IHlldCwgYXBwZW5kIHRoZSBuZXcgb25lIHRvIGtleVZlY3Rvci4KLSAgICAgICAgICAg
ICAgICBrZXlWZWN0b3IuYXBwZW5kKFdURk1vdmUoa2V5KSk7CisgICAgICAgICAgICAgICAgbV9r
ZXlzLmFwcGVuZChXVEZNb3ZlKGtleSkpOwogICAgICAgICAgICAgICAgIGtleXNDaGFuZ2VkID0g
dHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIC8vIEluIGNhc2Ugb2Yg
Y2hhbmdlZCBrZXlzLCB3ZSBoYXZlIHRvIHByb3ZpZGUgYSBLZXlTdGF0dXNWZWN0b3Igb2YgYWxs
IHRoZSBrZXlzIGZvcgotICAgICAgICAvLyB0aGlzIHNlc3Npb24uCiAgICAgICAgIHN0ZDo6b3B0
aW9uYWw8S2V5U3RhdHVzVmVjdG9yPiBjaGFuZ2VkS2V5czsKICAgICAgICAgaWYgKGtleXNDaGFu
Z2VkKSB7Ci0gICAgICAgICAgICAvLyBGaXJzdCBhIGhlbHBlciBWZWN0b3IgaXMgY29uc3RydWN0
ZWQsIGNvdGFpbmluZyBwYWlycyBvZiBTaGFyZWRCdWZmZXIgUmVmUHRycwotICAgICAgICAgICAg
Ly8gcmVwcmVzZW50aW50IGtleSBJRCBkYXRhLCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcga2V5IHN0
YXR1c2VzLgotICAgICAgICAgICAgLy8gV2UgY2FuJ3QgdXNlIEtleVN0YXR1c1ZlY3RvciBoZXJl
IGJlY2F1c2UgdGhpcyBWZWN0b3IgaGFzIHRvIGJlIHNvcnRlZCwgd2hpY2gKLSAgICAgICAgICAg
IC8vIGlzIG5vdCBwb3NzaWJsZSB0byBkbyBvbiBSZWY8PiBvYmplY3RzLgogICAgICAgICAgICAg
VmVjdG9yPHN0ZDo6cGFpcjxSZWZQdHI8U2hhcmVkQnVmZmVyPiwgS2V5U3RhdHVzPj4ga2V5czsK
LSAgICAgICAgICAgIGtleXMucmVzZXJ2ZUluaXRpYWxDYXBhY2l0eShrZXlWZWN0b3Iuc2l6ZSgp
KTsKLSAgICAgICAgICAgIGZvciAoYXV0byYgaXQgOiBrZXlWZWN0b3IpCi0gICAgICAgICAgICAg
ICAga2V5cy51bmNoZWNrZWRBcHBlbmQoc3RkOjpwYWlyPFJlZlB0cjxTaGFyZWRCdWZmZXI+LCBL
ZXlTdGF0dXM+IHsgaXQua2V5SUREYXRhLCBpdC5zdGF0dXMgfSk7CisgICAgICAgICAgICBrZXlz
LnJlc2VydmVJbml0aWFsQ2FwYWNpdHkobV9rZXlzLnNpemUoKSk7CisgICAgICAgICAgICBmb3Ig
KGF1dG8mIGl0IDogbV9rZXlzKQorICAgICAgICAgICAgICAgIGtleXMudW5jaGVja2VkQXBwZW5k
KHN0ZDo6cGFpcjxSZWZQdHI8U2hhcmVkQnVmZmVyPiwgS2V5U3RhdHVzPiB7IGl0LmlkLCBpdC5z
dGF0dXMgfSk7CiAKLSAgICAgICAgICAgIC8vIFNvcnQgZmlyc3QgYnkgc2l6ZSwgc2Vjb25kIGJ5
IGRhdGEuCiAgICAgICAgICAgICBzdGQ6OnNvcnQoa2V5cy5iZWdpbigpLCBrZXlzLmVuZCgpLAog
ICAgICAgICAgICAgICAgIFtdIChjb25zdCBhdXRvJiBhLCBjb25zdCBhdXRvJiBiKSB7CiAgICAg
ICAgICAgICAgICAgICAgIGlmIChhLmZpcnN0LT5zaXplKCkgIT0gYi5maXJzdC0+c2l6ZSgpKQpA
QCAtNjE0LDggKzU5NSw2IEBAIHZvaWQgQ0RNSW5zdGFuY2VTZXNzaW9uQ2xlYXJLZXk6OnVwZGF0
ZUxpY2Vuc2UoY29uc3QgU3RyaW5nJiBzZXNzaW9uSWQsIExpY2Vuc2VUCiAgICAgICAgICAgICAg
ICAgICAgIHJldHVybiBzdGQ6Om1lbWNtcChhLmZpcnN0LT5kYXRhKCksIGIuZmlyc3QtPmRhdGEo
KSwgYS5maXJzdC0+c2l6ZSgpKSA8IDA7CiAgICAgICAgICAgICAgICAgfSk7CiAKLSAgICAgICAg
ICAgIC8vIEZpbmFsbHkgY29uc3RydWN0IHRoZSBtaXJyb3JpbmcgS2V5U3RhdHVzVmVjdG9yIG9i
amVjdCBhbmQgbW92ZSBpdCBpbnRvIHRoZQotICAgICAgICAgICAgLy8gc3RkOjpvcHRpb25hbDw+
IG9iamVjdCB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBjYWxsYmFjay4KICAgICAgICAgICAg
IEtleVN0YXR1c1ZlY3RvciBrZXlTdGF0dXNWZWN0b3I7CiAgICAgICAgICAgICBrZXlTdGF0dXNW
ZWN0b3IucmVzZXJ2ZUluaXRpYWxDYXBhY2l0eShrZXlzLnNpemUoKSk7CiAgICAgICAgICAgICBm
b3IgKGF1dG8mIGl0IDoga2V5cykKQEAgLTYyNSwxMyArNjA0LDE0IEBAIHZvaWQgQ0RNSW5zdGFu
Y2VTZXNzaW9uQ2xlYXJLZXk6OnVwZGF0ZUxpY2Vuc2UoY29uc3QgU3RyaW5nJiBzZXNzaW9uSWQs
IExpY2Vuc2VUCiAgICAgICAgIH0KIAogICAgICAgICBkaXNwYXRjaENhbGxiYWNrKGZhbHNlLCBX
VEZNb3ZlKGNoYW5nZWRLZXlzKSwgU3VjY2Vzc1ZhbHVlOjpTdWNjZWVkZWQpOworCisgICAgICAg
IExPRyhFTUUsICJFTUUgQ2xlYXJLZXkgc2Vzc2lvbiAtIG5ldyBrZXlzIGFyZSBhdmFpbGFibGUs
IG5vdGlmeWluZyBhbnkgd2FpdGVyIik7CisgICAgICAgIG1faW5zdGFuY2UtPnNpZ25hbE5ld0tl
eXNBdmFpbGFibGUoKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIC8vIFBhcnNlIHRo
ZSByZXNwb25zZSB1c2luZyAnbGljZW5zZSByZWxlYXNlIGFja25vd2xlZGdlbWVudCcgZm9ybWF0
dGluZywgaWYgcG9zc2libGUuCiAgICAgaWYgKHBhcnNlTGljZW5zZVJlbGVhc2VBY2tub3dsZWRn
ZW1lbnRGb3JtYXQoKnJvb3QpKSB7Ci0gICAgICAgIC8vIEZJWE1FOiBSZXRyaWV2ZSB0aGUga2V5
IElEIGluZm9ybWF0aW9uIGFuZCB1c2UgaXQgdG8gdmFsaWRhdGUgdGhlIGtleXMgZm9yIHRoaXMg
c2Vzc2lvbklkLgotICAgICAgICBDbGVhcktleVN0YXRlOjpzaW5nbGV0b24oKS5rZXlzKCkucmVt
b3ZlKHNlc3Npb25JZCk7CisgICAgICAgIG1fa2V5cy5jbGVhcigpOwogICAgICAgICBkaXNwYXRj
aENhbGxiYWNrKHRydWUsIHN0ZDo6bnVsbG9wdCwgU3VjY2Vzc1ZhbHVlOjpTdWNjZWVkZWQpOwog
ICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtNjQyLDYgKzYyMiwxMSBAQCB2b2lkIENETUluc3Rh
bmNlU2Vzc2lvbkNsZWFyS2V5Ojp1cGRhdGVMaWNlbnNlKGNvbnN0IFN0cmluZyYgc2Vzc2lvbklk
LCBMaWNlbnNlVAogCiB2b2lkIENETUluc3RhbmNlU2Vzc2lvbkNsZWFyS2V5Ojpsb2FkU2Vzc2lv
bihMaWNlbnNlVHlwZSwgY29uc3QgU3RyaW5nJiBzZXNzaW9uSWQsIGNvbnN0IFN0cmluZyYsIExv
YWRTZXNzaW9uQ2FsbGJhY2smJiBjYWxsYmFjaykKIHsKKyAgICBMT0coRU1FLCAiRU1FIENsZWFy
S2V5IC0gbG9hZCBzZXNzaW9uIGlkICVzIiwgc2Vzc2lvbklkLnV0ZjgoKS5kYXRhKCkpOworICAg
IFJFTEVBU0VfQVNTRVJUKG1fc2Vzc2lvbklkLmlzRW1wdHkoKSk7CisKKyAgICBtX3Nlc3Npb25J
ZCA9IHNlc3Npb25JZDsKKwogICAgIC8vIFVzZSBhIGhlbHBlciBmdW5jdG9yIHRoYXQgc2NoZWR1
bGVzIHRoZSBjYWxsYmFjayBkaXNwYXRjaCwgYXZvaWRpbmcgZHVwbGljYXRlZCBjYWxsT25NYWlu
VGhyZWFkKCkgY2FsbHMuCiAgICAgYXV0byBkaXNwYXRjaENhbGxiYWNrID0KICAgICAgICAgW3Ro
aXMsICZjYWxsYmFja10oc3RkOjpvcHRpb25hbDxLZXlTdGF0dXNWZWN0b3I+JiYgZXhpc3RpbmdL
ZXlzLCBTdWNjZXNzVmFsdWUgc3VjY2VzcywgU2Vzc2lvbkxvYWRGYWlsdXJlIGxvYWRGYWlsdXJl
KSB7CkBAIC02NTQsMjAgKzYzOSwxNiBAQCB2b2lkIENETUluc3RhbmNlU2Vzc2lvbkNsZWFyS2V5
Ojpsb2FkU2Vzc2lvbihMaWNlbnNlVHlwZSwgY29uc3QgU3RyaW5nJiBzZXNzaW9uSQogICAgICAg
ICAgICAgICAgIH0pOwogICAgICAgICB9OwogCi0gICAgLy8gQ29uc3RydWN0IHRoZSBLZXlTdGF0
dXNWZWN0b3Igb2JqZWN0LCByZXByZXNlbnRpbmcgYWxsIHRoZSBrbm93biBrZXlzIGZvciB0aGlz
IHNlc3Npb24uCiAgICAgS2V5U3RhdHVzVmVjdG9yIGtleVN0YXR1c1ZlY3RvcjsKICAgICB7Ci0g
ICAgICAgIGF1dG8mIGtleXMgPSBDbGVhcktleVN0YXRlOjpzaW5nbGV0b24oKS5rZXlzKCk7Ci0g
ICAgICAgIGF1dG8gaXQgPSBrZXlzLmZpbmQoc2Vzc2lvbklkKTsKLSAgICAgICAgaWYgKGl0ID09
IGtleXMuZW5kKCkpIHsKKyAgICAgICAgaWYgKCFtX2tleXMuc2l6ZSgpKSB7CiAgICAgICAgICAg
ICBkaXNwYXRjaENhbGxiYWNrKHN0ZDo6bnVsbG9wdCwgRmFpbGVkLCBTZXNzaW9uTG9hZEZhaWx1
cmU6Ok5vU2Vzc2lvbkRhdGEpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKLSAg
ICAgICAgYXV0byYga2V5VmVjdG9yID0gaXQtPnZhbHVlOwotICAgICAgICBrZXlTdGF0dXNWZWN0
b3IucmVzZXJ2ZUluaXRpYWxDYXBhY2l0eShrZXlWZWN0b3Iuc2l6ZSgpKTsKLSAgICAgICAgZm9y
IChhdXRvJiBrZXkgOiBrZXlWZWN0b3IpCi0gICAgICAgICAgICBrZXlTdGF0dXNWZWN0b3IudW5j
aGVja2VkQXBwZW5kKHN0ZDo6cGFpcjxSZWY8U2hhcmVkQnVmZmVyPiwgS2V5U3RhdHVzPiB7ICpr
ZXkua2V5SUREYXRhLCBrZXkuc3RhdHVzIH0pOworICAgICAgICBrZXlTdGF0dXNWZWN0b3IucmVz
ZXJ2ZUluaXRpYWxDYXBhY2l0eShtX2tleXMuc2l6ZSgpKTsKKyAgICAgICAgZm9yIChhdXRvJiBr
ZXkgOiBtX2tleXMpCisgICAgICAgICAgICBrZXlTdGF0dXNWZWN0b3IudW5jaGVja2VkQXBwZW5k
KHN0ZDo6cGFpcjxSZWY8U2hhcmVkQnVmZmVyPiwgS2V5U3RhdHVzPiB7ICprZXkuaWQsIGtleS5z
dGF0dXMgfSk7CiAgICAgfQogCiAgICAgZGlzcGF0Y2hDYWxsYmFjayhXVEZNb3ZlKGtleVN0YXR1
c1ZlY3RvciksIFN1Y2NlZWRlZCwgU2Vzc2lvbkxvYWRGYWlsdXJlOjpOb25lKTsKQEAgLTY4Niw2
ICs2NjcsOSBAQCB2b2lkIENETUluc3RhbmNlU2Vzc2lvbkNsZWFyS2V5OjpjbG9zZVNlc3Npb24o
Y29uc3QgU3RyaW5nJiwgQ2xvc2VTZXNzaW9uQ2FsbGJhYwogCiB2b2lkIENETUluc3RhbmNlU2Vz
c2lvbkNsZWFyS2V5OjpyZW1vdmVTZXNzaW9uRGF0YShjb25zdCBTdHJpbmcmIHNlc3Npb25JZCwg
TGljZW5zZVR5cGUsIFJlbW92ZVNlc3Npb25EYXRhQ2FsbGJhY2smJiBjYWxsYmFjaykKIHsKKyAg
ICBMT0coRU1FLCAiRU1FIENsZWFyS2V5IC0gcmVtb3ZlIHNlc3Npb24gaWQgJXMsIG91ciBpZCBp
cyAlcyIsIHNlc3Npb25JZC51dGY4KCkuZGF0YSgpLCBtX3Nlc3Npb25JZC51dGY4KCkuZGF0YSgp
KTsKKyAgICBSRUxFQVNFX0FTU0VSVChzZXNzaW9uSWQgPT0gbV9zZXNzaW9uSWQpOworCiAgICAg
Ly8gVXNlIGEgaGVscGVyIGZ1bmN0b3IgdGhhdCBzY2hlZHVsZXMgdGhlIGNhbGxiYWNrIGRpc3Bh
dGNoLCBhdm9pZGluZyBkdXBsaWNhdGVkIGNhbGxPbk1haW5UaHJlYWQoKSBjYWxscy4KICAgICBh
dXRvIGRpc3BhdGNoQ2FsbGJhY2sgPQogICAgICAgICBbdGhpcywgJmNhbGxiYWNrXShLZXlTdGF0
dXNWZWN0b3ImJiBrZXlTdGF0dXNWZWN0b3IsIHN0ZDo6b3B0aW9uYWw8UmVmPFNoYXJlZEJ1ZmZl
cj4+JiYgbWVzc2FnZSwgU3VjY2Vzc1ZhbHVlIHN1Y2Nlc3MpIHsKQEAgLTcwMywzMiArNjg3LDI0
IEBAIHZvaWQgQ0RNSW5zdGFuY2VTZXNzaW9uQ2xlYXJLZXk6OnJlbW92ZVNlc3Npb25EYXRhKGNv
bnN0IFN0cmluZyYgc2Vzc2lvbklkLCBMaWNlCiAgICAgS2V5U3RhdHVzVmVjdG9yIGtleVN0YXR1
c1ZlY3RvcjsKICAgICBSZWZQdHI8U2hhcmVkQnVmZmVyPiBtZXNzYWdlOwogICAgIHsKLSAgICAg
ICAgLy8gUmV0cmlldmUgaW5mb3JtYXRpb24gZm9yIHRoZSBnaXZlbiBzZXNzaW9uIElELCBiYWls
aW5nIGlmIG5vbmUgaXMgZm91bmQuCi0gICAgICAgIGF1dG8mIGtleXMgPSBDbGVhcktleVN0YXRl
OjpzaW5nbGV0b24oKS5rZXlzKCk7Ci0gICAgICAgIGF1dG8gaXQgPSBrZXlzLmZpbmQoc2Vzc2lv
bklkKTsKLSAgICAgICAgaWYgKGl0ID09IGtleXMuZW5kKCkpIHsKKyAgICAgICAgaWYgKCFtX2tl
eXMuc2l6ZSgpKSB7CiAgICAgICAgICAgICBkaXNwYXRjaENhbGxiYWNrKEtleVN0YXR1c1ZlY3Rv
ciB7IH0sIHN0ZDo6bnVsbG9wdCwgU3VjY2Vzc1ZhbHVlOjpGYWlsZWQpOwogICAgICAgICAgICAg
cmV0dXJuOwogICAgICAgICB9CiAKLSAgICAgICAgLy8gUmV0cmlldmUgdGhlIEtleSB2ZWN0b3Is
IGNvbnRhaW5pbmcgYWxsIHRoZSBrZXlzIGZvciB0aGlzIHNlc3Npb24sIGFuZAotICAgICAgICAv
LyB0aGVuIHJlbW92ZSB0aGUga2V5IG1hcCBlbnRyeSBmb3IgdGhpcyBzZXNzaW9uLgotICAgICAg
ICBhdXRvIGtleVZlY3RvciA9IFdURk1vdmUoaXQtPnZhbHVlKTsKLSAgICAgICAga2V5cy5yZW1v
dmUoaXQpOwotCiAgICAgICAgIC8vIENvbnN0cnVjdCB0aGUgS2V5U3RhdHVzVmVjdG9yIG9iamVj
dCwgcGFpcmluZyBrZXkgSURzIHdpdGggdGhlICdyZWxlYXNlZCcgc3RhdHVzLgotICAgICAgICBr
ZXlTdGF0dXNWZWN0b3IucmVzZXJ2ZUluaXRpYWxDYXBhY2l0eShrZXlWZWN0b3Iuc2l6ZSgpKTsK
LSAgICAgICAgZm9yIChhdXRvJiBrZXkgOiBrZXlWZWN0b3IpCi0gICAgICAgICAgICBrZXlTdGF0
dXNWZWN0b3IudW5jaGVja2VkQXBwZW5kKHN0ZDo6cGFpcjxSZWY8U2hhcmVkQnVmZmVyPiwgS2V5
U3RhdHVzPiB7ICprZXkua2V5SUREYXRhLCBLZXlTdGF0dXM6OlJlbGVhc2VkIH0pOworICAgICAg
ICBrZXlTdGF0dXNWZWN0b3IucmVzZXJ2ZUluaXRpYWxDYXBhY2l0eShtX2tleXMuc2l6ZSgpKTsK
KyAgICAgICAgZm9yIChhdXRvJiBrZXkgOiBtX2tleXMpCisgICAgICAgICAgICBrZXlTdGF0dXNW
ZWN0b3IudW5jaGVja2VkQXBwZW5kKHN0ZDo6cGFpcjxSZWY8U2hhcmVkQnVmZmVyPiwgS2V5U3Rh
dHVzPiB7ICprZXkuaWQsIEtleVN0YXR1czo6UmVsZWFzZWQgfSk7CiAKICAgICAgICAgLy8gQ29u
c3RydWN0IEpTT04gdGhhdCByZXByZXNlbnRzIHRoZSAnbGljZW5zZSByZWxlYXNlJyBmb3JtYXQs
IGNyZWF0aW5nIGEgJ2tpZHMnIGFycmF5CiAgICAgICAgIC8vIG9mIGJhc2U2NFVSTC1lbmNvZGVk
IGtleSBJRHMgZm9yIGFsbCBrZXlzIHRoYXQgd2VyZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBzZXNz
aW9uLgogICAgICAgICBhdXRvIHJvb3RPYmplY3QgPSBKU09OOjpPYmplY3Q6OmNyZWF0ZSgpOwog
ICAgICAgICB7CiAgICAgICAgICAgICBhdXRvIGFycmF5ID0gSlNPTjo6QXJyYXk6OmNyZWF0ZSgp
OwotICAgICAgICAgICAgZm9yIChhdXRvJiBrZXkgOiBrZXlWZWN0b3IpIHsKLSAgICAgICAgICAg
ICAgICBBU1NFUlQoa2V5LmtleUlERGF0YS0+c2l6ZSgpIDw9IHN0ZDo6bnVtZXJpY19saW1pdHM8
dW5zaWduZWQ+OjptYXgoKSk7Ci0gICAgICAgICAgICAgICAgYXJyYXktPnB1c2hTdHJpbmcoV1RG
OjpiYXNlNjRVUkxFbmNvZGUoa2V5LmtleUlERGF0YS0+ZGF0YSgpLCBzdGF0aWNfY2FzdDx1bnNp
Z25lZD4oa2V5LmtleUlERGF0YS0+c2l6ZSgpKSkpOworICAgICAgICAgICAgZm9yIChhdXRvJiBr
ZXkgOiBtX2tleXMpIHsKKyAgICAgICAgICAgICAgICBBU1NFUlQoa2V5LmlkLT5zaXplKCkgPD0g
c3RkOjpudW1lcmljX2xpbWl0czx1bnNpZ25lZD46Om1heCgpKTsKKyAgICAgICAgICAgICAgICBh
cnJheS0+cHVzaFN0cmluZyhXVEY6OmJhc2U2NFVSTEVuY29kZShrZXkuaWQtPmRhdGEoKSwgc3Rh
dGljX2Nhc3Q8dW5zaWduZWQ+KGtleS5pZC0+c2l6ZSgpKSkpOwogICAgICAgICAgICAgfQogICAg
ICAgICAgICAgcm9vdE9iamVjdC0+c2V0QXJyYXkoImtpZHMiLCBXVEZNb3ZlKGFycmF5KSk7CiAg
ICAgICAgIH0KQEAgLTczNyw2ICs3MTMsOCBAQCB2b2lkIENETUluc3RhbmNlU2Vzc2lvbkNsZWFy
S2V5OjpyZW1vdmVTZXNzaW9uRGF0YShjb25zdCBTdHJpbmcmIHNlc3Npb25JZCwgTGljZQogICAg
ICAgICBTdHJpbmcgbWVzc2FnZVN0cmluZyA9IHJvb3RPYmplY3QtPnRvSlNPTlN0cmluZygpOwog
ICAgICAgICBDU3RyaW5nIG1lc3NhZ2VDU3RyaW5nID0gbWVzc2FnZVN0cmluZy51dGY4KCk7CiAg
ICAgICAgIG1lc3NhZ2UgPSBTaGFyZWRCdWZmZXI6OmNyZWF0ZShtZXNzYWdlQ1N0cmluZy5kYXRh
KCksIG1lc3NhZ2VDU3RyaW5nLmxlbmd0aCgpKTsKKworICAgICAgICBtX2tleXMuY2xlYXIoKTsK
ICAgICB9CiAKICAgICBkaXNwYXRjaENhbGxiYWNrKFdURk1vdmUoa2V5U3RhdHVzVmVjdG9yKSwg
UmVmPFNoYXJlZEJ1ZmZlcj4oKm1lc3NhZ2UpLCBTdWNjZXNzVmFsdWU6OlN1Y2NlZWRlZCk7CkBA
IC03NDYsNiArNzI0LDEwNSBAQCB2b2lkIENETUluc3RhbmNlU2Vzc2lvbkNsZWFyS2V5OjpzdG9y
ZVJlY29yZE9mS2V5VXNhZ2UoY29uc3QgU3RyaW5nJikKIHsKIH0KIAorYm9vbCBDRE1JbnN0YW5j
ZVNlc3Npb25DbGVhcktleTo6ZGVjcnlwdChSZWY8Q0RNSW5zdGFuY2U6OkRlY3J5cHRpb25Db25m
aWc+JiYgY29uZmlnLCB1aW50OF90KiBlbmNyeXB0ZWRCdWZmZXIsIHVpbnQzMl90IGVuY3J5cHRl
ZEJ1ZmZlclNpemUpCit7CisgICAgQVNTRVJUKCFpc01haW5UaHJlYWQoKSk7CisKKyAgICAvLyBJ
dCBpcyB0ZW1wdGluZyB0byBoYXZlIHRoZSBjaXBoZXIgaGFuZGxlIGFzIGEgZGF0YSBtZW1iZXIg
b2YKKyAgICAvLyB0aGlzIGNsYXNzLCBob3dldmVyLCBkdWUgdG8gdGhlIGxpZmV0aW1lIG9mIHRo
aXMgY2xhc3MgYmVpbmcKKyAgICAvLyBkZXBlbmRlbnQgb24gSlMgR0MsIHRoZXJlIGFyZSBzaXR1
YXRpb25zIHdlcmUgeW91IG5lZWQgbW9yZQorICAgIC8vIHRoYW4gdGhlIGZpeGVkIG51bWJlciBv
ZiBhbGxvd2VkIEdDcnlwdCBjaXBoZXIgaGFuZGxlcyBvcGVuCisgICAgLy8gc2ltdWx0YW5lb3Vz
bHksIHNvIHdlIGhhdmUgdG8gdGlnaHRseSBjb250cm9sIHRoZSBsaWZldGltZSBvZgorICAgIC8v
IHRoZSBoYW5kbGVzIGluIHRoaXMgbWV0aG9kLgorICAgIC8vIFJFVklFVzogU2hvdWxkIHdlIHVz
ZSB0aGUgY3Jvc3MtcGxhdGZvcm0gYWJzdHJhY3Rpb25zIHVuZGVyCisgICAgLy8gV2ViQ29yZS9j
cnlwdG8gaW5zdGVhZCBvZiBkaXJlY3RseSB1c2luZyBnY3J5cHQgaGVyZT8KKyAgICBnY3J5X2Np
cGhlcl9oZF90IGhhbmRsZTsKKyAgICAvLyBGSVhNRTogVGhpcyBpcyBhc3N1bWluZyB0aGUgY29u
dGVudCBoYXMgYmVlbiBlbmNyeXB0ZWQgaW4gYQorICAgIC8vIHNwZWNpZmljIG1hbm5lciwgaXQg
d2lsbCBmYWlsIHdoZW4gdXNpbmcgQ0JDIG1vZGUsIG9yIHBhdHRlcm4KKyAgICAvLyBlbmNyeXB0
aW9uIGZvciBleGFtcGxlLiBUaGUgY2lwaGVyIHNob3VsZCBpZGVhbGx5IGJlIGNyZWF0ZWQKKyAg
ICAvLyBmcm9tIHRoZSBEZWNyeXB0aW9uQ29uZmlnIGNsYXNzLgorICAgIGlmIChnY3J5X2Vycm9y
X3QgZXJyb3IgPSBnY3J5X2NpcGhlcl9vcGVuKCZoYW5kbGUsIEdDUllfQ0lQSEVSX0FFUzEyOCwg
R0NSWV9DSVBIRVJfTU9ERV9DVFIsIEdDUllfQ0lQSEVSX1NFQ1VSRSkpCisgICAgICAgIFJFTEVB
U0VfQVNTRVJUX1dJVEhfTUVTU0FHRSghZXJyb3IsICJmYWlsZWQgdG8gY3JlYXRlIEFFUyAxMjgg
Q1RSIGNpcGhlciBoYW5kbGU6ICVzIiwgZ3BnX3N0cmVycm9yKGVycm9yKSk7CisKKyAgICAvLyBS
RVZJRVc6IFRoaXMgcGFkZGluZyBnaXZlcyBtZSBhbnhpZXR5LiBJJ3ZlIHNlZW4gdmFyaW91cwor
ICAgIC8vIHN0YW5kYXJkcyBmb3IgY3J5cHRvIHBhZGRpbmcsIGJ1dCBJIHNlZSBub3RoaW5nIHNw
ZWNpZmljIGZvcgorICAgIC8vIEFFUy0xMjgsIG9yIGlmIHplcm8gcGFkZGluZyBsaWtlIHRoaXMg
ZXZlbiBtYWtlcyBzZW5zZS4gSXQKKyAgICAvLyB3b3VsZCBzZWVtIGFsbCBJVnMgZm9yIEFFUy0x
Mjggc2hvdWxkIGJlIDE2IGJ5dGVzLCBidXQgaW4gb3VyCisgICAgLy8gdGVzdHMgdGhleSBhcmUg
bm90ISBTb21lIGNsYXJpZmljYXRpb24gd291bGQgYmUgZ29vZCBoZXJlLgorICAgIExPRyhFTUUs
ICJFTUUgQ2xlYXJLZXkgc2Vzc2lvbiAtIGl2IGhhcyAlbHUgYnl0ZXMiLCBjb25maWctPml2KCkt
PnNpemUoKSk7CisgICAgUkVMRUFTRV9BU1NFUlRfV0lUSF9NRVNTQUdFKGNvbmZpZy0+aXYoKS0+
c2l6ZSgpID09IGl2U2l6ZSB8fCBjb25maWctPml2KCktPnNpemUoKSA9PSBpdlNpemUgLyAyLCAi
dW5leHBlY3RlZCBJViBsZW5ndGgiKTsKKyAgICBpZiAoY29uZmlnLT5pdigpLT5zaXplKCkgPT0g
aXZTaXplIC8gMikKKyAgICAgICAgY29uZmlnLT5pdigpLT5hcHBlbmQoVmVjdG9yPGNoYXI+KDgs
IDApKTsKKworICAgIGlmIChnY3J5X2Vycm9yX3QgZXJyb3IgPSBnY3J5X2NpcGhlcl9zZXRjdHIo
aGFuZGxlLCBjb25maWctPml2KCktPmRhdGEoKSwgaXZTaXplKSkgeworICAgICAgICBMT0coRU1F
LCAiRU1FIENsZWFyS2V5IHNlc3Npb24gLSBnY3J5X2NpcGhlcl9zZXRjdHIgZmFpbGVkOiAlcyIs
IGdwZ19zdHJlcnJvcihlcnJvcikpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisg
ICAgTE9HKEVNRSwgIkVNRSBDbGVhcktleSBzZXNzaW9uIC0gc2VhcmNoaW5nIGZvciBrZXkgSUQg
WyVzXSIsIGtleUlEVG9IZXhTdHJpbmcoY29uZmlnLT5rZXlJRCgpKS51dGY4KCkuZGF0YSgpKTsK
KyAgICAvLyBGSVhNRTogV2UgdGVjaG5pY2FsbHkgYWxyZWFkeSBrbm93IHRoZSBtYXRjaGluZyBr
ZXkgaWQgZnJvbSB0aGUKKyAgICAvLyBjYWxsc2l0ZSBvZiB0aGlzIGRlY3J5cHQgbWV0aG9kLCBj
b3VsZCBzYXZlIGEgd2FsayBhY3Jvc3Mgb3VyCisgICAgLy8ga2V5cyBpZiB0aGUgY2FsbGluZyBj
b2RlIGlzIHJlYXJyYW5nZWQgYSBsaXR0bGUuCisgICAgYXV0byBtYXRjaGluZ0tleSA9IHN0ZDo6
ZmluZF9pZihtX2tleXMuYmVnaW4oKSwgbV9rZXlzLmVuZCgpLAorICAgICAgICBbJmNvbmZpZ10o
Y29uc3QgS2V5JiBleGlzdGluZ0tleSkgeworICAgICAgICAgICAgcmV0dXJuIGNvbmZpZy0+a2V5
SUQoKSA9PSAqZXhpc3RpbmdLZXkuaWQ7CisgICAgICAgIH0pOworICAgIGlmIChtYXRjaGluZ0tl
eSA9PSBtX2tleXMuZW5kKCkpIHsKKyAgICAgICAgTE9HKEVNRSwgIkVNRSBDbGVhcktleSBzZXNz
aW9uIC0gZmFpbGVkIHRvIGZpbmQga2V5IGlkIGluIHNldCBvZiBrbm93biBrZXlzIik7CisgICAg
ICAgIGdjcnlfY2lwaGVyX2Nsb3NlKGhhbmRsZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICB9CisKKyAgICBpZiAoZ2NyeV9lcnJvcl90IGVycm9yID0gZ2NyeV9jaXBoZXJfc2V0a2V5KGhh
bmRsZSwgbWF0Y2hpbmdLZXktPnZhbHVlLT5kYXRhKCksIG1hdGNoaW5nS2V5LT52YWx1ZS0+c2l6
ZSgpKSkgeworICAgICAgICBMT0coRU1FLCAiRU1FIENsZWFyS2V5IHNlc3Npb24gLSBnY3J5X2Np
cGhlcl9zZXRrZXkgZmFpbGVkOiAlcyIsIGdwZ19zdHJlcnJvcihlcnJvcikpOworICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFjb25maWctPmlzU3ViU2FtcGxlKCkpIHsK
KyAgICAgICAgTE9HKEVNRSwgIkVNRSBDbGVhcktleSBzZXNzaW9uIC0gZGVjcnlwdGluZyBmdWxs
IHNhbXBsZSBvZiAlIiBQUkl1MzIgIiBieXRlcyIsIGVuY3J5cHRlZEJ1ZmZlclNpemUpOworICAg
ICAgICBpZiAoZ2NyeV9lcnJvcl90IGVycm9yID0gZ2NyeV9jaXBoZXJfZGVjcnlwdChoYW5kbGUs
IGVuY3J5cHRlZEJ1ZmZlciwgZW5jcnlwdGVkQnVmZmVyU2l6ZSwgMCwgMCkpIHsKKyAgICAgICAg
ICAgIExPRyhFTUUsICJFTUUgQ2xlYXJLZXkgc2Vzc2lvbiAtIGZ1bGwgc2FtcGxlIGRlY3J5cHRp
b24gZmFpbGVkOiAlcyIsIGdwZ19zdHJlcnJvcihlcnJvcikpOworICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgICAgICB9CisgICAgICAgIGdjcnlfY2lwaGVyX2Nsb3NlKGhhbmRsZSk7Cisg
ICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHVpbnQzMl90IG9mZnNldCB7IDAgfTsK
KyAgICBMT0coRU1FLCAiRU1FIENsZWFyS2V5IHNlc3Npb24gLSB0aGVyZSBhcmUgJWx1IHN1YnNh
bXBsZSByYW5nZXMgdG8gcHJvY2VzcyIsIGNvbmZpZy0+c3ViU2FtcGxlcygpLnNpemUoKSk7Cisg
ICAgZm9yIChjb25zdCBhdXRvJiBzdWJTYW1wbGVSYW5nZSA6IGNvbmZpZy0+c3ViU2FtcGxlcygp
KSB7CisgICAgICAgIG9mZnNldCArPSBzdWJTYW1wbGVSYW5nZS5jbGVhckJ5dGVzOworCisgICAg
ICAgIGlmICghc3ViU2FtcGxlUmFuZ2UuY2lwaGVyQnl0ZXMpIHsKKyAgICAgICAgICAgIExPRyhF
TUUsICJFTUUgQ2xlYXJLZXkgc2Vzc2lvbiAtIGlnbm9yaW5nIGNsZWFyIHN1YnNhbXBsZSBvZiBz
aXplICV1IGF0IG9mZnNldCAldSIsIHN1YlNhbXBsZVJhbmdlLmNsZWFyQnl0ZXMsIG9mZnNldCk7
CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIExPRyhFTUUsICJF
TUUgQ2xlYXJLZXkgc2Vzc2lvbiAtIGRlY3J5cHRpbmcgc3Vic2FtcGxlLCBbY2xlYXI9JXUsIGNp
cGhlcj0ldV0gb2Zmc2V0PSV1Iiwgc3ViU2FtcGxlUmFuZ2UuY2xlYXJCeXRlcywgc3ViU2FtcGxl
UmFuZ2UuY2lwaGVyQnl0ZXMsIG9mZnNldCk7CisKKyAgICAgICAgaWYgKGdjcnlfZXJyb3JfdCBl
cnJvciA9IGdjcnlfY2lwaGVyX2RlY3J5cHQoaGFuZGxlLCBlbmNyeXB0ZWRCdWZmZXIgKyBvZmZz
ZXQsIHN1YlNhbXBsZVJhbmdlLmNpcGhlckJ5dGVzLCAwLCAwKSkgeworICAgICAgICAgICAgTE9H
KEVNRSwgIkVNRSBDbGVhcktleSBzZXNzaW9uIC0gZGVjcnlwdGlvbiBzdWJzYW1wbGVzIGZhaWxl
ZDogJXMiLCBncGdfc3RyZXJyb3IoZXJyb3IpKTsKKyAgICAgICAgICAgIGdjcnlfY2lwaGVyX2Ns
b3NlKGhhbmRsZSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAg
ICAgb2Zmc2V0ICs9IHN1YlNhbXBsZVJhbmdlLmNpcGhlckJ5dGVzOworICAgIH0KKworICAgIExP
RyhFTUUsICJFTUUgQ2xlYXJLZXkgc2Vzc2lvbiAtIGRlY3J5cHRpbmcgc3Vic2FtcGxlcyBzdWNj
ZWVkZWQiKTsKKyAgICBnY3J5X2NpcGhlcl9jbG9zZShoYW5kbGUpOworICAgIHJldHVybiB0cnVl
OworfQorCitWZWN0b3I8UmVmPFNoYXJlZEJ1ZmZlcj4+IENETUluc3RhbmNlU2Vzc2lvbkNsZWFy
S2V5OjprZXlJRHMoKQoreworICAgIFZlY3RvcjxSZWY8U2hhcmVkQnVmZmVyPj4ga2V5SURzOwor
ICAgIGtleUlEcy5yZXNlcnZlSW5pdGlhbENhcGFjaXR5KG1fa2V5cy5zaXplKCkpOworICAgIGZv
ciAoYXV0byYga2V5IDogbV9rZXlzKQorICAgICAgICBrZXlJRHMudW5jaGVja2VkQXBwZW5kKCpr
ZXkuaWQpOworCisgICAgcmV0dXJuIGtleUlEczsKK30KKwogfSAvLyBuYW1lc3BhY2UgV2ViQ29y
ZQogCiAjZW5kaWYgLy8gRU5BQkxFKEVOQ1JZUFRFRF9NRURJQSkKZGlmZiAtLWdpdCBhL1NvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL2VuY3J5cHRlZG1lZGlhL2NsZWFya2V5L0NETUNsZWFyS2V5Lmgg
Yi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9lbmNyeXB0ZWRtZWRpYS9jbGVhcmtleS9DRE1DbGVh
cktleS5oCmluZGV4IGYxMWNjZGM4YzQyMWM5OTI0OWQ0ZDgwYzBhN2Y1YzAzNTM0NTUwYjQuLjE3
ODAxM2FlYjY1YTRjNWZhMDlkOGY3MzQ0NjBkYzFhYjcxZjk2ODggMTAwNjQ0Ci0tLSBhL1NvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL2VuY3J5cHRlZG1lZGlhL2NsZWFya2V5L0NETUNsZWFyS2V5LmgK
KysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZW5jcnlwdGVkbWVkaWEvY2xlYXJrZXkvQ0RN
Q2xlYXJLZXkuaApAQCAtMzQsMTEgKzM0LDE2IEBACiAjaW5jbHVkZSAiQ0RNSW5zdGFuY2UuaCIK
ICNpbmNsdWRlICJDRE1JbnN0YW5jZVNlc3Npb24uaCIKICNpbmNsdWRlICJDRE1Qcml2YXRlLmgi
CisjaW5jbHVkZSAiTG9nZ2luZy5oIgogI2luY2x1ZGUgIlNoYXJlZEJ1ZmZlci5oIgorI2luY2x1
ZGUgPHd0Zi9Db25kaXRpb24uaD4KKyNpbmNsdWRlIDx3dGYvTG9jay5oPgogI2luY2x1ZGUgPHd0
Zi9XZWFrUHRyLmg+CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAorY2xhc3MgQ0RNSW5zdGFuY2VT
ZXNzaW9uQ2xlYXJLZXk7CisKIGNsYXNzIENETUZhY3RvcnlDbGVhcktleSBmaW5hbCA6IHB1Ymxp
YyBDRE1GYWN0b3J5IHsKIHB1YmxpYzoKICAgICBzdGF0aWMgQ0RNRmFjdG9yeUNsZWFyS2V5JiBz
aW5nbGV0b24oKTsKQEAgLTc3LDggKzgyLDcgQEAgcHVibGljOgogCiBjbGFzcyBDRE1JbnN0YW5j
ZUNsZWFyS2V5IGZpbmFsIDogcHVibGljIENETUluc3RhbmNlLCBwdWJsaWMgQ2FuTWFrZVdlYWtQ
dHI8Q0RNSW5zdGFuY2VDbGVhcktleT4gewogcHVibGljOgotICAgIENETUluc3RhbmNlQ2xlYXJL
ZXkoKTsKLSAgICB2aXJ0dWFsIH5DRE1JbnN0YW5jZUNsZWFyS2V5KCk7CisgICAgdmlydHVhbCB+
Q0RNSW5zdGFuY2VDbGVhcktleSgpID0gZGVmYXVsdDsKIAogICAgIEltcGxlbWVudGF0aW9uVHlw
ZSBpbXBsZW1lbnRhdGlvblR5cGUoKSBjb25zdCBmaW5hbCB7IHJldHVybiBJbXBsZW1lbnRhdGlv
blR5cGU6OkNsZWFyS2V5OyB9CiAKQEAgLTg5LDI0ICs5Myw0MiBAQCBwdWJsaWM6CiAgICAgU3Vj
Y2Vzc1ZhbHVlIHNldFN0b3JhZ2VEaXJlY3RvcnkoY29uc3QgU3RyaW5nJikgZmluYWw7CiAgICAg
Y29uc3QgU3RyaW5nJiBrZXlTeXN0ZW0oKSBjb25zdCBmaW5hbDsKICAgICBSZWZQdHI8Q0RNSW5z
dGFuY2VTZXNzaW9uPiBjcmVhdGVTZXNzaW9uKCkgZmluYWw7CisgICAgYm9vbCBkZWNyeXB0KFJl
ZjxEZWNyeXB0aW9uQ29uZmlnPiYmLCB1aW50OF90KiwgdWludDMyX3QpIGZpbmFsOwogCi0gICAg
c3RydWN0IEtleSB7Ci0gICAgICAgIENETUluc3RhbmNlU2Vzc2lvbjo6S2V5U3RhdHVzIHN0YXR1
czsKLSAgICAgICAgUmVmUHRyPFNoYXJlZEJ1ZmZlcj4ga2V5SUREYXRhOwotICAgICAgICBSZWZQ
dHI8U2hhcmVkQnVmZmVyPiBrZXlWYWx1ZURhdGE7Ci0gICAgfTsKKyAgICBDRE1JbnN0YW5jZVNl
c3Npb25DbGVhcktleSogc2Vzc2lvbkZvcktleUlEKGNvbnN0IFJlZjxTaGFyZWRCdWZmZXI+Jikg
Y29uc3Q7CisgICAgdm9pZCBzaWduYWxOZXdLZXlzQXZhaWxhYmxlKCkgeyBtX3dhaXRpbmdGb3JL
ZXlDb25kaXRpb24ubm90aWZ5T25lKCk7IH0KIAotICAgIGNvbnN0IFZlY3RvcjxLZXk+IGtleXMo
KSBjb25zdDsKK3ByaXZhdGU6CisgICAgTG9jayBtX3dhaXRpbmdGb3JLZXlMb2NrOworICAgIENv
bmRpdGlvbiBtX3dhaXRpbmdGb3JLZXlDb25kaXRpb247CisKKyAgICBWZWN0b3I8V2Vha1B0cjxD
RE1JbnN0YW5jZVNlc3Npb25DbGVhcktleT4+IG1fc2Vzc2lvbnM7CiB9OwogCiBjbGFzcyBDRE1J
bnN0YW5jZVNlc3Npb25DbGVhcktleSBmaW5hbCA6IHB1YmxpYyBDRE1JbnN0YW5jZVNlc3Npb24s
IHB1YmxpYyBDYW5NYWtlV2Vha1B0cjxDRE1JbnN0YW5jZVNlc3Npb25DbGVhcktleT4gewogcHVi
bGljOgorICAgIHN0cnVjdCBLZXkgeworICAgICAgICBDRE1JbnN0YW5jZVNlc3Npb246OktleVN0
YXR1cyBzdGF0dXM7CisgICAgICAgIFJlZlB0cjxTaGFyZWRCdWZmZXI+IGlkOworICAgICAgICBS
ZWZQdHI8U2hhcmVkQnVmZmVyPiB2YWx1ZTsKKyAgICB9OworCisgICAgQ0RNSW5zdGFuY2VTZXNz
aW9uQ2xlYXJLZXkoUmVmPENETUluc3RhbmNlQ2xlYXJLZXk+JiYpOworCiAgICAgdm9pZCByZXF1
ZXN0TGljZW5zZShMaWNlbnNlVHlwZSwgY29uc3QgQXRvbWljU3RyaW5nJiBpbml0RGF0YVR5cGUs
IFJlZjxTaGFyZWRCdWZmZXI+JiYgaW5pdERhdGEsIExpY2Vuc2VDYWxsYmFjayYmKSBmaW5hbDsK
ICAgICB2b2lkIHVwZGF0ZUxpY2Vuc2UoY29uc3QgU3RyaW5nJiwgTGljZW5zZVR5cGUsIGNvbnN0
IFNoYXJlZEJ1ZmZlciYsIExpY2Vuc2VVcGRhdGVDYWxsYmFjayYmKSBmaW5hbDsKICAgICB2b2lk
IGxvYWRTZXNzaW9uKExpY2Vuc2VUeXBlLCBjb25zdCBTdHJpbmcmLCBjb25zdCBTdHJpbmcmLCBM
b2FkU2Vzc2lvbkNhbGxiYWNrJiYpIGZpbmFsOwogICAgIHZvaWQgY2xvc2VTZXNzaW9uKGNvbnN0
IFN0cmluZyYsIENsb3NlU2Vzc2lvbkNhbGxiYWNrJiYpIGZpbmFsOwogICAgIHZvaWQgcmVtb3Zl
U2Vzc2lvbkRhdGEoY29uc3QgU3RyaW5nJiwgTGljZW5zZVR5cGUsIFJlbW92ZVNlc3Npb25EYXRh
Q2FsbGJhY2smJikgZmluYWw7CiAgICAgdm9pZCBzdG9yZVJlY29yZE9mS2V5VXNhZ2UoY29uc3Qg
U3RyaW5nJikgZmluYWw7CisgICAgYm9vbCBkZWNyeXB0KFJlZjxDRE1JbnN0YW5jZTo6RGVjcnlw
dGlvbkNvbmZpZz4mJiwgdWludDhfdCosIHVpbnQzMl90KSBmaW5hbDsKKworICAgIFZlY3RvcjxS
ZWY8U2hhcmVkQnVmZmVyPj4ga2V5SURzKCk7CisKK3ByaXZhdGU6CisgICAgU3RyaW5nIG1fc2Vz
c2lvbklkOworICAgIFJlZjxDRE1JbnN0YW5jZUNsZWFyS2V5PiBtX2luc3RhbmNlOworICAgIFZl
Y3RvcjxLZXk+IG1fa2V5czsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2dzdHJlYW1lci9HU3RyZWFtZXJD
b21tb24uY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZ3N0cmVhbWVyL0dT
dHJlYW1lckNvbW1vbi5jcHAKaW5kZXggNTI2NDliYmE3YWI4YzRkOWFiNzUzOWFlMzI5OTY0ODM4
MzgxZmM5OS4uZDE1MjM0ZTA4ZWM0ZjM2NDI3OGM2MDNmOTI3MzhkYzBlYTBjOGU4OCAxMDA2NDQK
LS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZ3N0cmVhbWVyL0dTdHJlYW1l
ckNvbW1vbi5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZ3N0cmVh
bWVyL0dTdHJlYW1lckNvbW1vbi5jcHAKQEAgLTQ3LDcgKzQ3LDcgQEAKICNlbmRpZgogCiAjaWYg
RU5BQkxFKEVOQ1JZUFRFRF9NRURJQSkKLSNpbmNsdWRlICJXZWJLaXRDbGVhcktleURlY3J5cHRv
ckdTdHJlYW1lci5oIgorI2luY2x1ZGUgIldlYktpdENvbW1vbkVuY3J5cHRpb25EZWNyeXB0b3JH
U3RyZWFtZXIuaCIKICNlbmRpZgogCiAjaWYgRU5BQkxFKFZJREVPKQpAQCAtMjU5LDcgKzI1OSw3
IEBAIGJvb2wgaW5pdGlhbGl6ZUdTdHJlYW1lckFuZFJlZ2lzdGVyV2ViS2l0RWxlbWVudHMoKQog
ICAgIHN0ZDo6Y2FsbF9vbmNlKG9uY2VGbGFnLCBbXSB7CiAjaWYgRU5BQkxFKEVOQ1JZUFRFRF9N
RURJQSkKICAgICAgICAgaWYgKHdlYmtpdEdzdENoZWNrVmVyc2lvbigxLCA2LCAxKSkKLSAgICAg
ICAgICAgIGdzdF9lbGVtZW50X3JlZ2lzdGVyKG51bGxwdHIsICJ3ZWJraXRjbGVhcmtleSIsIEdT
VF9SQU5LX1BSSU1BUlkgKyAxMDAsIFdFQktJVF9UWVBFX01FRElBX0NLX0RFQ1JZUFQpOworICAg
ICAgICAgICAgZ3N0X2VsZW1lbnRfcmVnaXN0ZXIobnVsbHB0ciwgIndlYmtpdGNlbmMiLCBHU1Rf
UkFOS19QUklNQVJZICsgMTAwLCBXRUJLSVRfVFlQRV9NRURJQV9DRU5DX0RFQ1JZUFQpOwogI2Vu
ZGlmCiAKICNpZiBFTkFCTEUoTUVESUFfU1RSRUFNKSAmJiBHU1RfQ0hFQ0tfVkVSU0lPTigxLCAx
MCwgMCkKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2dzdHJl
YW1lci9HU3RyZWFtZXJDb21tb24uaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L2dzdHJlYW1lci9HU3RyZWFtZXJDb21tb24uaAppbmRleCA1ZDQ0ZDQ3NDAxYmM3MThjZWRlNDYy
OTBlNjA5MTM3MTkwZjI3MDBmLi45ZjE0YTUwNjU0NDgwMDRiNTNiZWQxMzJjOWUyZWI1ODA4ZTk3
YjVhIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9nc3RyZWFt
ZXIvR1N0cmVhbWVyQ29tbW9uLmgKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvZ3N0cmVhbWVyL0dTdHJlYW1lckNvbW1vbi5oCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVk
ZSAiRmxvYXRTaXplLmgiCiAjaW5jbHVkZSAiR1JlZlB0ckdTdHJlYW1lci5oIgogI2luY2x1ZGUg
IkdVbmlxdWVQdHJHU3RyZWFtZXIuaCIKKyNpbmNsdWRlICJTaGFyZWRCdWZmZXIuaCIKICNpbmNs
dWRlIDxnc3QvZ3N0Lmg+CiAjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLWZvcm1hdC5oPgogI2lu
Y2x1ZGUgPGdzdC92aWRlby92aWRlby1pbmZvLmg+CkBAIC0xMDIsNyArMTAzLDcgQEAgcHVibGlj
OgogCiAgICAgfkdzdE1hcHBlZEJ1ZmZlcigpCiAgICAgewotICAgICAgICBpZiAobV9pc1ZhbGlk
KQorICAgICAgICBpZiAobV9pc1ZhbGlkICYmIEdTVF9JU19CVUZGRVIobV9idWZmZXIpKQogICAg
ICAgICAgICAgZ3N0X2J1ZmZlcl91bm1hcChtX2J1ZmZlciwgJm1faW5mbyk7CiAgICAgICAgIG1f
aXNWYWxpZCA9IGZhbHNlOwogICAgIH0KQEAgLTExMiw2ICsxMTMsOCBAQCBwdWJsaWM6CiAKICAg
ICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgQVNTRVJUKG1faXNWYWxpZCk7IHJldHVybiBzdGF0aWNf
Y2FzdDxzaXplX3Q+KG1faW5mby5zaXplKTsgfQogCisgICAgUmVmPFNoYXJlZEJ1ZmZlcj4gc2hh
cmVkQnVmZmVyKCkgY29uc3QgeyByZXR1cm4gU2hhcmVkQnVmZmVyOjpjcmVhdGUoZGF0YSgpLCBz
aXplKCkpOyB9CisKICAgICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4g
bV9pc1ZhbGlkOyB9CiAKIHByaXZhdGU6CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9nc3RyZWFtZXIvZW1lL1dlYktpdENsZWFyS2V5RGVjcnlwdG9yR1N0cmVh
bWVyLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2dzdHJlYW1lci9lbWUv
V2ViS2l0Q2xlYXJLZXlEZWNyeXB0b3JHU3RyZWFtZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEw
MDY0NAppbmRleCBmOTQxZTUyOGY0N2NiZDA2OTU3OWJjNWU2MzM1ODFlNmI2MTBjNzIzLi4wMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL2dzdHJlYW1lci9lbWUvV2ViS2l0Q2xlYXJLZXlEZWNyeXB0b3JH
U3RyZWFtZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjk5ICswLDAgQEAKLS8qIEdTdHJlYW1l
ciBDbGVhcktleSBjb21tb24gZW5jcnlwdGlvbiBkZWNyeXB0b3IKLSAqCi0gKiBDb3B5cmlnaHQg
KEMpIDIwMTYgTWV0cm9sb2dpY2FsCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgSWdhbGlhIFMuTAot
ICoKLSAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0
ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJy
YXJ5IEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBT
b2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwg
b3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIGxpYnJh
cnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAq
IGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJh
bnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBV
UlBPU0UuICBTZWUgdGhlIEdOVQotICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZv
ciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBv
ZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0
aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5k
YXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgU3VpdGUgNTAwLAotICogQm9zdG9uLCBN
QSAwMjExMC0xMzM1LCBVU0EuCi0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUg
IldlYktpdENsZWFyS2V5RGVjcnlwdG9yR1N0cmVhbWVyLmgiCi0KLSNpZiBFTkFCTEUoRU5DUllQ
VEVEX01FRElBKSAmJiBVU0UoR1NUUkVBTUVSKQotCi0jaW5jbHVkZSAiR1N0cmVhbWVyQ29tbW9u
LmgiCi0jaW5jbHVkZSAiR1N0cmVhbWVyRU1FVXRpbGl0aWVzLmgiCi0jaW5jbHVkZSA8Z2NyeXB0
Lmg+Ci0jaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0Ynl0ZXJlYWRlci5oPgotI2luY2x1ZGUgPHd0Zi9S
dW5Mb29wLmg+Ci0KLSNkZWZpbmUgQ0xFQVJLRVlfU0laRSAxNgotCi1zdHJ1Y3QgS2V5IHsKLSAg
ICBHUmVmUHRyPEdzdEJ1ZmZlcj4ga2V5SUQ7Ci0gICAgR1JlZlB0cjxHc3RCdWZmZXI+IGtleVZh
bHVlOwotfTsKLQotI2RlZmluZSBXRUJLSVRfTUVESUFfQ0tfREVDUllQVF9HRVRfUFJJVkFURShv
YmopIChHX1RZUEVfSU5TVEFOQ0VfR0VUX1BSSVZBVEUoKG9iaiksIFdFQktJVF9UWVBFX01FRElB
X0NLX0RFQ1JZUFQsIFdlYktpdE1lZGlhQ2xlYXJLZXlEZWNyeXB0UHJpdmF0ZSkpCi1zdHJ1Y3Qg
X1dlYktpdE1lZGlhQ2xlYXJLZXlEZWNyeXB0UHJpdmF0ZSB7Ci0gICAgVmVjdG9yPEtleT4ga2V5
czsKLSAgICBnY3J5X2NpcGhlcl9oZF90IGhhbmRsZTsKLX07Ci0KLXN0YXRpYyB2b2lkIHdlYktp
dE1lZGlhQ2xlYXJLZXlEZWNyeXB0b3JGaW5hbGl6ZShHT2JqZWN0Kik7Ci1zdGF0aWMgZ2Jvb2xl
YW4gd2ViS2l0TWVkaWFDbGVhcktleURlY3J5cHRvckhhbmRsZUtleVJlc3BvbnNlKFdlYktpdE1l
ZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5cHQqIHNlbGYsIEdzdEV2ZW50Kik7Ci1zdGF0aWMgZ2Jv
b2xlYW4gd2ViS2l0TWVkaWFDbGVhcktleURlY3J5cHRvckRlY3J5cHQoV2ViS2l0TWVkaWFDb21t
b25FbmNyeXB0aW9uRGVjcnlwdCosIEdzdEJ1ZmZlciogaXYsIEdzdEJ1ZmZlcioga2V5aWQsIEdz
dEJ1ZmZlciogc2FtcGxlLCB1bnNpZ25lZCBzdWJTYW1wbGVzQ291bnQsIEdzdEJ1ZmZlciogc3Vi
U2FtcGxlcyk7Ci0KLUdTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMod2Via2l0X21lZGlhX2NsZWFy
X2tleV9kZWNyeXB0X2RlYnVnX2NhdGVnb3J5KTsKLSNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIHdl
YmtpdF9tZWRpYV9jbGVhcl9rZXlfZGVjcnlwdF9kZWJ1Z19jYXRlZ29yeQotCi1zdGF0aWMgR3N0
U3RhdGljUGFkVGVtcGxhdGUgc2lua1RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUo
InNpbmsiLAotICAgIEdTVF9QQURfU0lOSywKLSAgICBHU1RfUEFEX0FMV0FZUywKLSAgICBHU1Rf
U1RBVElDX0NBUFMoImFwcGxpY2F0aW9uL3gtY2VuYywgb3JpZ2luYWwtbWVkaWEtdHlwZT0oc3Ry
aW5nKXZpZGVvL3gtaDI2NCwgcHJvdGVjdGlvbi1zeXN0ZW09KHN0cmluZykiIFdFQkNPUkVfR1NU
UkVBTUVSX0VNRV9VVElMSVRJRVNfQ0xFQVJLRVlfVVVJRCAiOyAiCi0gICAgImFwcGxpY2F0aW9u
L3gtY2VuYywgb3JpZ2luYWwtbWVkaWEtdHlwZT0oc3RyaW5nKWF1ZGlvL21wZWcsIHByb3RlY3Rp
b24tc3lzdGVtPShzdHJpbmcpIiBXRUJDT1JFX0dTVFJFQU1FUl9FTUVfVVRJTElUSUVTX0NMRUFS
S0VZX1VVSUQiOyIKLSAgICAiYXBwbGljYXRpb24veC13ZWJtLWVuYywgb3JpZ2luYWwtbWVkaWEt
dHlwZT0oc3RyaW5nKXZpZGVvL3gtdnA4OyIKLSAgICAiYXBwbGljYXRpb24veC13ZWJtLWVuYywg
b3JpZ2luYWwtbWVkaWEtdHlwZT0oc3RyaW5nKXZpZGVvL3gtdnA5OyIpKTsKLQotc3RhdGljIEdz
dFN0YXRpY1BhZFRlbXBsYXRlIHNyY1RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUo
InNyYyIsCi0gICAgR1NUX1BBRF9TUkMsCi0gICAgR1NUX1BBRF9BTFdBWVMsCi0gICAgR1NUX1NU
QVRJQ19DQVBTKCJ2aWRlby94LWgyNjQ7IGF1ZGlvL21wZWc7IHZpZGVvL3gtdnA4OyB2aWRlby94
LXZwOSIpKTsKLQotI2RlZmluZSB3ZWJraXRfbWVkaWFfY2xlYXJfa2V5X2RlY3J5cHRfcGFyZW50
X2NsYXNzIHBhcmVudF9jbGFzcwotR19ERUZJTkVfVFlQRShXZWJLaXRNZWRpYUNsZWFyS2V5RGVj
cnlwdCwgd2Via2l0X21lZGlhX2NsZWFyX2tleV9kZWNyeXB0LCBXRUJLSVRfVFlQRV9NRURJQV9D
RU5DX0RFQ1JZUFQpOwotCi1zdGF0aWMgdm9pZCB3ZWJraXRfbWVkaWFfY2xlYXJfa2V5X2RlY3J5
cHRfY2xhc3NfaW5pdChXZWJLaXRNZWRpYUNsZWFyS2V5RGVjcnlwdENsYXNzKiBrbGFzcykKLXsK
LSAgICBHT2JqZWN0Q2xhc3MqIGdvYmplY3RDbGFzcyA9IEdfT0JKRUNUX0NMQVNTKGtsYXNzKTsK
LSAgICBnb2JqZWN0Q2xhc3MtPmZpbmFsaXplID0gd2ViS2l0TWVkaWFDbGVhcktleURlY3J5cHRv
ckZpbmFsaXplOwotCi0gICAgR3N0RWxlbWVudENsYXNzKiBlbGVtZW50Q2xhc3MgPSBHU1RfRUxF
TUVOVF9DTEFTUyhrbGFzcyk7Ci0gICAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3BhZF90ZW1wbGF0
ZShlbGVtZW50Q2xhc3MsIGdzdF9zdGF0aWNfcGFkX3RlbXBsYXRlX2dldCgmc2lua1RlbXBsYXRl
KSk7Ci0gICAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3BhZF90ZW1wbGF0ZShlbGVtZW50Q2xhc3Ms
IGdzdF9zdGF0aWNfcGFkX3RlbXBsYXRlX2dldCgmc3JjVGVtcGxhdGUpKTsKLQotICAgIGdzdF9l
bGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEoZWxlbWVudENsYXNzLAotICAgICAgICAi
RGVjcnlwdCBjb250ZW50IGVuY3J5cHRlZCB1c2luZyBJU09CTUZGIENsZWFyS2V5IENvbW1vbiBF
bmNyeXB0aW9uIiwKLSAgICAgICAgR1NUX0VMRU1FTlRfRkFDVE9SWV9LTEFTU19ERUNSWVBUT1Is
Ci0gICAgICAgICJEZWNyeXB0cyBtZWRpYSB0aGF0IGhhcyBiZWVuIGVuY3J5cHRlZCB1c2luZyBJ
U09CTUZGIENsZWFyS2V5IENvbW1vbiBFbmNyeXB0aW9uLiIsCi0gICAgICAgICJQaGlsaXBwZSBO
b3JtYW5kIDxwaGlsbkBpZ2FsaWEuY29tPiIpOwotCi0gICAgR1NUX0RFQlVHX0NBVEVHT1JZX0lO
SVQod2Via2l0X21lZGlhX2NsZWFyX2tleV9kZWNyeXB0X2RlYnVnX2NhdGVnb3J5LAotICAgICAg
ICAid2Via2l0Y2xlYXJrZXkiLCAwLCAiQ2xlYXJLZXkgZGVjcnlwdG9yIik7Ci0KLSAgICBXZWJL
aXRNZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNyeXB0Q2xhc3MqIGNlbmNDbGFzcyA9IFdFQktJVF9N
RURJQV9DRU5DX0RFQ1JZUFRfQ0xBU1Moa2xhc3MpOwotICAgIGNlbmNDbGFzcy0+cHJvdGVjdGlv
blN5c3RlbUlkID0gV2ViQ29yZTo6R1N0cmVhbWVyRU1FVXRpbGl0aWVzOjpzX0NsZWFyS2V5VVVJ
RDsKLSAgICBjZW5jQ2xhc3MtPmhhbmRsZUtleVJlc3BvbnNlID0gR1NUX0RFQlVHX0ZVTkNQVFIo
d2ViS2l0TWVkaWFDbGVhcktleURlY3J5cHRvckhhbmRsZUtleVJlc3BvbnNlKTsKLSAgICBjZW5j
Q2xhc3MtPmRlY3J5cHQgPSBHU1RfREVCVUdfRlVOQ1BUUih3ZWJLaXRNZWRpYUNsZWFyS2V5RGVj
cnlwdG9yRGVjcnlwdCk7Ci0KLSAgICBnX3R5cGVfY2xhc3NfYWRkX3ByaXZhdGUoa2xhc3MsIHNp
emVvZihXZWJLaXRNZWRpYUNsZWFyS2V5RGVjcnlwdFByaXZhdGUpKTsKLX0KLQotc3RhdGljIHZv
aWQgd2Via2l0X21lZGlhX2NsZWFyX2tleV9kZWNyeXB0X2luaXQoV2ViS2l0TWVkaWFDbGVhcktl
eURlY3J5cHQqIHNlbGYpCi17Ci0gICAgV2ViS2l0TWVkaWFDbGVhcktleURlY3J5cHRQcml2YXRl
KiBwcml2ID0gV0VCS0lUX01FRElBX0NLX0RFQ1JZUFRfR0VUX1BSSVZBVEUoc2VsZik7Ci0KLSAg
ICBzZWxmLT5wcml2ID0gcHJpdjsKLSAgICBuZXcgKHByaXYpIFdlYktpdE1lZGlhQ2xlYXJLZXlE
ZWNyeXB0UHJpdmF0ZSgpOwotICAgIGlmIChnY3J5X2Vycm9yX3QgZXJyb3IgPSBnY3J5X2NpcGhl
cl9vcGVuKCYocHJpdi0+aGFuZGxlKSwgR0NSWV9DSVBIRVJfQUVTMTI4LCBHQ1JZX0NJUEhFUl9N
T0RFX0NUUiwgR0NSWV9DSVBIRVJfU0VDVVJFKSkgewotICAgICAgICBHU1RfRVJST1JfT0JKRUNU
KHNlbGYsICJGYWlsZWQgdG8gY3JlYXRlIEFFUyAxMjggQ1RSIGNpcGhlciBoYW5kbGU6ICVzIiwg
Z3BnX3N0cmVycm9yKGVycm9yKSk7Ci0gICAgICAgIEFTU0VSVCghZXJyb3IpOwotICAgIH0KLX0K
LQotc3RhdGljIHZvaWQgd2ViS2l0TWVkaWFDbGVhcktleURlY3J5cHRvckZpbmFsaXplKEdPYmpl
Y3QqIG9iamVjdCkKLXsKLSAgICBXZWJLaXRNZWRpYUNsZWFyS2V5RGVjcnlwdCogc2VsZiA9IFdF
QktJVF9NRURJQV9DS19ERUNSWVBUKG9iamVjdCk7Ci0gICAgV2ViS2l0TWVkaWFDbGVhcktleURl
Y3J5cHRQcml2YXRlKiBwcml2ID0gc2VsZi0+cHJpdjsKLSAgICBnY3J5X2NpcGhlcl9jbG9zZShw
cml2LT5oYW5kbGUpOwotICAgIHByaXYtPn5XZWJLaXRNZWRpYUNsZWFyS2V5RGVjcnlwdFByaXZh
dGUoKTsKLQotICAgIEdTVF9DQUxMX1BBUkVOVChHX09CSkVDVF9DTEFTUywgZmluYWxpemUsIChv
YmplY3QpKTsKLX0KLQotc3RhdGljIGdib29sZWFuIHdlYktpdE1lZGlhQ2xlYXJLZXlEZWNyeXB0
b3JIYW5kbGVLZXlSZXNwb25zZShXZWJLaXRNZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNyeXB0KiBz
ZWxmLCBHc3RFdmVudCogZXZlbnQpCi17Ci0gICAgV2ViS2l0TWVkaWFDbGVhcktleURlY3J5cHRQ
cml2YXRlKiBwcml2ID0gV0VCS0lUX01FRElBX0NLX0RFQ1JZUFRfR0VUX1BSSVZBVEUoV0VCS0lU
X01FRElBX0NLX0RFQ1JZUFQoc2VsZikpOwotICAgIGNvbnN0IEdzdFN0cnVjdHVyZSogc3RydWN0
dXJlID0gZ3N0X2V2ZW50X2dldF9zdHJ1Y3R1cmUoZXZlbnQpOwotCi0gICAgLy8gRGVtYW5kIHRo
ZSBgZHJtLWNpcGhlci1jbGVhcmtleWAgR3N0U3RydWN0dXJlLgotICAgIGlmICghZ3N0X3N0cnVj
dHVyZV9oYXNfbmFtZShzdHJ1Y3R1cmUsICJkcm0tY2lwaGVyLWNsZWFya2V5IikpCi0gICAgICAg
IHJldHVybiBGQUxTRTsKLQotICAgIC8vIFJldHJpZXZlIHRoZSBga2V5LWlkc2AgR1N0cmVhbWVy
IHZhbHVlIGxpc3QuCi0gICAgY29uc3QgR1ZhbHVlKiBrZXlJRHNMaXN0ID0gZ3N0X3N0cnVjdHVy
ZV9nZXRfdmFsdWUoc3RydWN0dXJlLCAia2V5LWlkcyIpOwotICAgIEFTU0VSVChrZXlJRHNMaXN0
ICYmIEdTVF9WQUxVRV9IT0xEU19MSVNUKGtleUlEc0xpc3QpKTsKLSAgICB1bnNpZ25lZCBrZXlJ
RHNMaXN0U2l6ZSA9IGdzdF92YWx1ZV9saXN0X2dldF9zaXplKGtleUlEc0xpc3QpOwotCi0gICAg
Ly8gUmV0cmlldmUgdGhlIGBrZXktdmFsdWVzYCBHU3RyZWFtZXIgdmFsdWUgbGlzdC4KLSAgICBj
b25zdCBHVmFsdWUqIGtleVZhbHVlc0xpc3QgPSBnc3Rfc3RydWN0dXJlX2dldF92YWx1ZShzdHJ1
Y3R1cmUsICJrZXktdmFsdWVzIik7Ci0gICAgQVNTRVJUKGtleVZhbHVlc0xpc3QgJiYgR1NUX1ZB
TFVFX0hPTERTX0xJU1Qoa2V5VmFsdWVzTGlzdCkpOwotICAgIHVuc2lnbmVkIGtleVZhbHVlc0xp
c3RTaXplID0gZ3N0X3ZhbHVlX2xpc3RfZ2V0X3NpemUoa2V5VmFsdWVzTGlzdCk7Ci0KLSAgICAv
LyBCYWlsIGlmIHNvbWVob3cgdGhlIHR3byBsaXN0cyBkb24ndCBtYXRjaCBpbiBzaXplLgotICAg
IGlmIChrZXlJRHNMaXN0U2l6ZSAhPSBrZXlWYWx1ZXNMaXN0U2l6ZSkKLSAgICAgICAgcmV0dXJu
IEZBTFNFOwotCi0gICAgLy8gQ2xlYXIgb3V0IHRoZSBwcmV2aW91cyBsaXN0IG9mIGtleXMuCi0g
ICAgcHJpdi0+a2V5cy5jbGVhcigpOwotCi0gICAgLy8gQXBwZW5kIHRoZSByZXRyaWV2ZWQgR3N0
QnVmZmVyIG9iamVjdHMgY29udGFpbmluZyBlYWNoIGtleSdzIElEIGFuZCB2YWx1ZSB0byB0aGUg
bGlzdCBvZiBLZXkgb2JqZWN0cy4KLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwga2V5SURz
TGlzdFNpemU7ICsraSkgewotICAgICAgICBHUmVmUHRyPEdzdEJ1ZmZlcj4ga2V5SURCdWZmZXIo
Z3N0X3ZhbHVlX2dldF9idWZmZXIoZ3N0X3ZhbHVlX2xpc3RfZ2V0X3ZhbHVlKGtleUlEc0xpc3Qs
IGkpKSk7Ci0gICAgICAgIEdSZWZQdHI8R3N0QnVmZmVyPiBrZXlWYWx1ZUJ1ZmZlcihnc3RfdmFs
dWVfZ2V0X2J1ZmZlcihnc3RfdmFsdWVfbGlzdF9nZXRfdmFsdWUoa2V5VmFsdWVzTGlzdCwgaSkp
KTsKLSAgICAgICAgcHJpdi0+a2V5cy5hcHBlbmQoS2V5IHsgV1RGTW92ZShrZXlJREJ1ZmZlciks
IFdURk1vdmUoa2V5VmFsdWVCdWZmZXIpIH0pOwotICAgIH0KLQotICAgIHJldHVybiBUUlVFOwot
fQotCi1zdGF0aWMgZ2Jvb2xlYW4gd2ViS2l0TWVkaWFDbGVhcktleURlY3J5cHRvckZpbmRBbmRT
ZXRLZXkoV2ViS2l0TWVkaWFDbGVhcktleURlY3J5cHRQcml2YXRlKiBwcml2LCBjb25zdCBXZWJD
b3JlOjpHc3RNYXBwZWRCdWZmZXImIGtleUlEQnVmZmVyKQotewotICAgIEdSZWZQdHI8R3N0QnVm
ZmVyPiBrZXlCdWZmZXI7Ci0gICAgZm9yIChhdXRvJiBrZXkgOiBwcml2LT5rZXlzKSB7Ci0gICAg
ICAgIGlmIChrZXkua2V5SUQuZ2V0KCkgPT0ga2V5SURCdWZmZXIpIHsKLSAgICAgICAgICAgIGtl
eUJ1ZmZlciA9IGtleS5rZXlWYWx1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0g
ICAgfQotCi0gICAgaWYgKCFrZXlCdWZmZXIpIHsKLSAgICAgICAgR1NUX0VSUk9SX09CSkVDVChw
cml2LCAiRmFpbGVkIHRvIGZpbmQgYW4gYXBwcm9wcmlhdGUga2V5IGJ1ZmZlciIpOwotICAgICAg
ICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgV2ViQ29yZTo6R3N0TWFwcGVkQnVmZmVyIG1h
cHBlZEtleVZhbHVlQnVmZmVyKGtleUJ1ZmZlci5nZXQoKSwgR1NUX01BUF9SRUFEKTsKLSAgICBp
ZiAoIW1hcHBlZEtleVZhbHVlQnVmZmVyKSB7Ci0gICAgICAgIEdTVF9FUlJPUl9PQkpFQ1QocHJp
diwgIkZhaWxlZCB0byBtYXAgZGVjcnlwdGlvbiBrZXkiKTsKLSAgICAgICAgcmV0dXJuIGZhbHNl
OwotICAgIH0KLQotICAgIEFTU0VSVChtYXBwZWRLZXlWYWx1ZUJ1ZmZlci5zaXplKCkgPT0gQ0xF
QVJLRVlfU0laRSk7Ci0gICAgaWYgKGdjcnlfZXJyb3JfdCBlcnJvciA9IGdjcnlfY2lwaGVyX3Nl
dGtleShwcml2LT5oYW5kbGUsIG1hcHBlZEtleVZhbHVlQnVmZmVyLmRhdGEoKSwgbWFwcGVkS2V5
VmFsdWVCdWZmZXIuc2l6ZSgpKSkgewotICAgICAgICBHU1RfRVJST1JfT0JKRUNUKHByaXYsICJn
Y3J5X2NpcGhlcl9zZXRrZXkgZmFpbGVkOiAlcyIsIGdwZ19zdHJlcnJvcihlcnJvcikpOwotICAg
ICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRp
YyBnYm9vbGVhbiB3ZWJLaXRNZWRpYUNsZWFyS2V5RGVjcnlwdG9yRGVjcnlwdChXZWJLaXRNZWRp
YUNvbW1vbkVuY3J5cHRpb25EZWNyeXB0KiBzZWxmLCBHc3RCdWZmZXIqIGl2QnVmZmVyLCBHc3RC
dWZmZXIqIGtleUlEQnVmZmVyLCBHc3RCdWZmZXIqIGJ1ZmZlciwgdW5zaWduZWQgc3ViU2FtcGxl
Q291bnQsIEdzdEJ1ZmZlciogc3ViU2FtcGxlc0J1ZmZlcikKLXsKLSAgICAvLyBDaGVjayBpdkJ1
ZmZlciBpc24ndCBudWxsLgotICAgIGlmICghaXZCdWZmZXIpIHsKLSAgICAgICAgR1NUX0VSUk9S
X09CSkVDVChzZWxmLCAiRXJyb3IsIHRoZSBpdkJ1ZmZlciBpcyBudWxsIik7Ci0gICAgICAgIHJl
dHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBXZWJDb3JlOjpHc3RNYXBwZWRCdWZmZXIgbWFwcGVk
SVZCdWZmZXIoaXZCdWZmZXIsIEdTVF9NQVBfUkVBRCk7Ci0gICAgaWYgKCFtYXBwZWRJVkJ1ZmZl
cikgewotICAgICAgICBHU1RfRVJST1JfT0JKRUNUKHNlbGYsICJGYWlsZWQgdG8gbWFwIElWIik7
Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB1aW50OF90IGN0cltDTEVBUktF
WV9TSVpFXTsKLSAgICBpZiAobWFwcGVkSVZCdWZmZXIuc2l6ZSgpID09IDgpIHsKLSAgICAgICAg
bWVtc2V0KGN0ciArIDgsIDAsIDgpOwotICAgICAgICBtZW1jcHkoY3RyLCBtYXBwZWRJVkJ1ZmZl
ci5kYXRhKCksIDgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFTU0VSVChtYXBwZWRJVkJ1ZmZl
ci5zaXplKCkgPT0gQ0xFQVJLRVlfU0laRSk7Ci0gICAgICAgIG1lbWNweShjdHIsIG1hcHBlZElW
QnVmZmVyLmRhdGEoKSwgQ0xFQVJLRVlfU0laRSk7Ci0gICAgfQotCi0gICAgV2ViS2l0TWVkaWFD
bGVhcktleURlY3J5cHRQcml2YXRlKiBwcml2ID0gV0VCS0lUX01FRElBX0NLX0RFQ1JZUFRfR0VU
X1BSSVZBVEUoV0VCS0lUX01FRElBX0NLX0RFQ1JZUFQoc2VsZikpOwotICAgIGdjcnlfZXJyb3Jf
dCBjaXBoZXJFcnJvciA9IGdjcnlfY2lwaGVyX3NldGN0cihwcml2LT5oYW5kbGUsIGN0ciwgQ0xF
QVJLRVlfU0laRSk7Ci0gICAgaWYgKGNpcGhlckVycm9yKSB7Ci0gICAgICAgIEdTVF9FUlJPUl9P
QkpFQ1Qoc2VsZiwgImdjcnlfY2lwaGVyX3NldGN0ciBmYWlsZWQ6ICVzIiwgZ3BnX3N0cmVycm9y
KGNpcGhlckVycm9yKSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBD
aGVjayBidWZmZXIgaXNuJ3QgbnVsbC4KLSAgICBpZiAoIWJ1ZmZlcikgewotICAgICAgICBHU1Rf
RVJST1JfT0JKRUNUKHNlbGYsICJObyBidWZmZXIgdG8gZGVjcnlwdCIpOwotICAgICAgICByZXR1
cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgV2ViQ29yZTo6R3N0TWFwcGVkQnVmZmVyIG1hcHBlZEtl
eUlkQnVmZmVyKGtleUlEQnVmZmVyLCBHU1RfTUFQX1JFQUQpOwotICAgIGlmICghbWFwcGVkS2V5
SWRCdWZmZXIpIHsKLSAgICAgICAgR1NUX0VSUk9SX09CSkVDVChzZWxmLCAiRmFpbGVkIHRvIG1h
cCBrZXkgaWQgYnVmZmVyIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBX
ZWJDb3JlOjpHc3RNYXBwZWRCdWZmZXIgbWFwcGVkQnVmZmVyKGJ1ZmZlciwgR1NUX01BUF9SRUFE
V1JJVEUpOwotICAgIGlmICghbWFwcGVkQnVmZmVyKSB7Ci0gICAgICAgIEdTVF9FUlJPUl9PQkpF
Q1Qoc2VsZiwgIkZhaWxlZCB0byBtYXAgYnVmZmVyIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsK
LSAgICB9Ci0KLSAgICB3ZWJLaXRNZWRpYUNsZWFyS2V5RGVjcnlwdG9yRmluZEFuZFNldEtleShw
cml2LCBtYXBwZWRLZXlJZEJ1ZmZlcik7Ci0KLSAgICB1bnNpZ25lZCBwb3NpdGlvbiA9IDA7Ci0g
ICAgdW5zaWduZWQgc2FtcGxlSW5kZXggPSAwOwotCi0gICAgaWYgKCFzdWJTYW1wbGVDb3VudCkg
ewotICAgICAgICAvLyBGdWxsIHNhbXBsZSBlbmNyeXB0aW9uLgotICAgICAgICBHU1RfVFJBQ0Vf
T0JKRUNUKHNlbGYsICJmdWxsIHNhbXBsZSBlbmNyeXB0aW9uOiAlenUgZW5jcnlwdGVkIGJ5dGVz
IiwgbWFwcGVkQnVmZmVyLnNpemUoKSk7Ci0KLSAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGJ1ZmZl
ciBpcyBlbXB0eS4KLSAgICAgICAgaWYgKG1hcHBlZEJ1ZmZlci5zaXplKCkpIHsKLSAgICAgICAg
ICAgIGNpcGhlckVycm9yID0gZ2NyeV9jaXBoZXJfZGVjcnlwdChwcml2LT5oYW5kbGUsIG1hcHBl
ZEJ1ZmZlci5kYXRhKCksIG1hcHBlZEJ1ZmZlci5zaXplKCksIDAsIDApOwotICAgICAgICAgICAg
aWYgKGNpcGhlckVycm9yKSB7Ci0gICAgICAgICAgICAgICAgR1NUX0VSUk9SX09CSkVDVChzZWxm
LCAiZnVsbCBzYW1wbGUgZGVjcnlwdGlvbiBmYWlsZWQ6ICVzIiwgZ3BnX3N0cmVycm9yKGNpcGhl
ckVycm9yKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQot
ICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8vIENoZWNrIHN1
YlNhbXBsZXNCdWZmZXIgaXNuJ3QgbnVsbC4KLSAgICBpZiAoIXN1YlNhbXBsZXNCdWZmZXIpIHsK
LSAgICAgICAgR1NUX0VSUk9SX09CSkVDVChzZWxmLCAiRXJyb3IsIHRoZSBzdWJTYW1wbGVCdWZm
ZXIgaXMgbnVsbCIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLy8gU3Vi
c2FtcGxlIGVuY3J5cHRpb24uCi0gICAgV2ViQ29yZTo6R3N0TWFwcGVkQnVmZmVyIG1hcHBlZFN1
YlNhbXBsZXNCdWZmZXIoc3ViU2FtcGxlc0J1ZmZlciwgR1NUX01BUF9SRUFEKTsKLSAgICBpZiAo
IW1hcHBlZFN1YlNhbXBsZXNCdWZmZXIpIHsKLSAgICAgICAgR1NUX0VSUk9SX09CSkVDVChzZWxm
LCAiRmFpbGVkIHRvIG1hcCBzdWJzYW1wbGUgYnVmZmVyIik7Ci0gICAgICAgIHJldHVybiBmYWxz
ZTsKLSAgICB9Ci0KLSAgICBHVW5pcXVlUHRyPEdzdEJ5dGVSZWFkZXI+IHJlYWRlcihnc3RfYnl0
ZV9yZWFkZXJfbmV3KG1hcHBlZFN1YlNhbXBsZXNCdWZmZXIuZGF0YSgpLCBtYXBwZWRTdWJTYW1w
bGVzQnVmZmVyLnNpemUoKSkpOwotICAgIEdTVF9ERUJVR19PQkpFQ1Qoc2VsZiwgInBvc2l0aW9u
OiAlZCwgc2l6ZTogJXp1IiwgcG9zaXRpb24sIG1hcHBlZEJ1ZmZlci5zaXplKCkpOwotCi0gICAg
d2hpbGUgKHBvc2l0aW9uIDwgbWFwcGVkQnVmZmVyLnNpemUoKSkgewotICAgICAgICBndWludDE2
IG5CeXRlc0NsZWFyID0gMDsKLSAgICAgICAgZ3VpbnQzMiBuQnl0ZXNFbmNyeXB0ZWQgPSAwOwot
Ci0gICAgICAgIGlmIChzYW1wbGVJbmRleCA8IHN1YlNhbXBsZUNvdW50KSB7Ci0gICAgICAgICAg
ICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDE2X2JlKHJlYWRlci5nZXQoKSwgJm5CeXRl
c0NsZWFyKQotICAgICAgICAgICAgICAgIHx8ICFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9i
ZShyZWFkZXIuZ2V0KCksICZuQnl0ZXNFbmNyeXB0ZWQpKSB7Ci0gICAgICAgICAgICAgICAgR1NU
X0RFQlVHX09CSkVDVChzZWxmLCAidW5zdXBwb3J0ZWQiKTsKLSAgICAgICAgICAgICAgICByZXR1
cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzYW1wbGVJbmRleCsrOwotICAg
ICAgICB9IGVsc2UgewotICAgICAgICAgICAgbkJ5dGVzQ2xlYXIgPSAwOwotICAgICAgICAgICAg
bkJ5dGVzRW5jcnlwdGVkID0gbWFwcGVkQnVmZmVyLnNpemUoKSAtIHBvc2l0aW9uOwotICAgICAg
ICB9Ci0KLSAgICAgICAgR1NUX1RSQUNFX09CSkVDVChzZWxmLCAic3Vic2FtcGxlIGluZGV4ICV1
IC0gJWh1IGJ5dGVzIGNsZWFyICh0b2RvPSV6dSkiLCBzYW1wbGVJbmRleCwgbkJ5dGVzQ2xlYXIs
IG1hcHBlZEJ1ZmZlci5zaXplKCkgLSBwb3NpdGlvbik7Ci0gICAgICAgIHBvc2l0aW9uICs9IG5C
eXRlc0NsZWFyOwotICAgICAgICBpZiAobkJ5dGVzRW5jcnlwdGVkKSB7Ci0gICAgICAgICAgICBH
U1RfVFJBQ0VfT0JKRUNUKHNlbGYsICJzdWJzYW1wbGUgaW5kZXggJXUgLSAldSBieXRlcyBlbmNy
eXB0ZWQgKHRvZG89JXp1KSIsIHNhbXBsZUluZGV4LCBuQnl0ZXNFbmNyeXB0ZWQsIG1hcHBlZEJ1
ZmZlci5zaXplKCkgLSBwb3NpdGlvbik7Ci0gICAgICAgICAgICBjaXBoZXJFcnJvciA9IGdjcnlf
Y2lwaGVyX2RlY3J5cHQocHJpdi0+aGFuZGxlLCBtYXBwZWRCdWZmZXIuZGF0YSgpICsgcG9zaXRp
b24sIG5CeXRlc0VuY3J5cHRlZCwgMCwgMCk7Ci0gICAgICAgICAgICBpZiAoY2lwaGVyRXJyb3Ip
IHsKLSAgICAgICAgICAgICAgICBHU1RfRVJST1JfT0JKRUNUKHNlbGYsICJzdWIgc2FtcGxlIGlu
ZGV4ICV1IGRlY3J5cHRpb24gZmFpbGVkOiAlcyIsIHNhbXBsZUluZGV4LCBncGdfc3RyZXJyb3Io
Y2lwaGVyRXJyb3IpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAg
ICB9Ci0gICAgICAgICAgICBwb3NpdGlvbiArPSBuQnl0ZXNFbmNyeXB0ZWQ7Ci0gICAgICAgIH0K
LSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotI2VuZGlmIC8vIEVOQUJMRShFTkNSWVBU
RURfTUVESUEpICYmIFVTRShHU1RSRUFNRVIpCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9nc3RyZWFtZXIvZW1lL1dlYktpdENsZWFyS2V5RGVjcnlwdG9yR1N0
cmVhbWVyLmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9nc3RyZWFtZXIvZW1l
L1dlYktpdENsZWFyS2V5RGVjcnlwdG9yR1N0cmVhbWVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAw
NjQ0CmluZGV4IDkzMjE1MTc3OTIzMjAxMTUyOTBmYTExYzc2MTgxZTU5NTgwN2VlYTcuLjAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvZ3N0cmVhbWVyL2VtZS9XZWJLaXRDbGVhcktleURlY3J5cHRvckdT
dHJlYW1lci5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyogR1N0cmVhbWVyIENs
ZWFyS2V5IGNvbW1vbiBlbmNyeXB0aW9uIGRlY3J5cHRvcgotICoKLSAqIENvcHlyaWdodCAoQykg
MjAxNiBNZXRyb2xvZ2ljYWwKLSAqIENvcHlyaWdodCAoQykgMjAxNiBJZ2FsaWEgUy5MCi0gKgot
ICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0
IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkg
R2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3
YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAo
YXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgbGlicmFyeSBp
cyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0
IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkg
b2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9T
RS4gIFNlZSB0aGUgR05VCi0gKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1v
cmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRo
ZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMg
bGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlv
biwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAotICogQm9zdG9uLCBNQSAwMjEx
MC0xMzAxLCBVU0EuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpZiBFTkFCTEUoRU5DUllQVEVE
X01FRElBKSAmJiBVU0UoR1NUUkVBTUVSKQotCi0jaW5jbHVkZSAiV2ViS2l0Q29tbW9uRW5jcnlw
dGlvbkRlY3J5cHRvckdTdHJlYW1lci5oIgotCi1HX0JFR0lOX0RFQ0xTCi0KLSNkZWZpbmUgV0VC
S0lUX1RZUEVfTUVESUFfQ0tfREVDUllQVCAgICAgICAgICAod2Via2l0X21lZGlhX2NsZWFyX2tl
eV9kZWNyeXB0X2dldF90eXBlKCkpCi0jZGVmaW5lIFdFQktJVF9NRURJQV9DS19ERUNSWVBUKG9i
aikgICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLCBXRUJLSVRfVFlQ
RV9NRURJQV9DS19ERUNSWVBULCBXZWJLaXRNZWRpYUNsZWFyS2V5RGVjcnlwdCkpCi0jZGVmaW5l
IFdFQktJVF9NRURJQV9DS19ERUNSWVBUX0NMQVNTKGtsYXNzKSAgKEdfVFlQRV9DSEVDS19DTEFT
U19DQVNUKChrbGFzcyksIFdFQktJVF9UWVBFX01FRElBX0NLX0RFQ1JZUFQsIFdlYktpdE1lZGlh
Q2xlYXJLZXlEZWNyeXB0Q2xhc3MpKQotI2RlZmluZSBXRUJLSVRfSVNfTUVESUFfQ0tfREVDUllQ
VChvYmopICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSwgV0VCS0lUX1RZ
UEVfTUVESUFfQ0tfREVDUllQVCkpCi0jZGVmaW5lIFdFQktJVF9JU19NRURJQV9DS19ERUNSWVBU
X0NMQVNTKG9iaikgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksIFdFQktJVF9UWVBF
X01FRElBX0NLX0RFQ1JZUFQpKQotCi10eXBlZGVmIHN0cnVjdCBfV2ViS2l0TWVkaWFDbGVhcktl
eURlY3J5cHQgICAgICAgIFdlYktpdE1lZGlhQ2xlYXJLZXlEZWNyeXB0OwotdHlwZWRlZiBzdHJ1
Y3QgX1dlYktpdE1lZGlhQ2xlYXJLZXlEZWNyeXB0Q2xhc3MgICBXZWJLaXRNZWRpYUNsZWFyS2V5
RGVjcnlwdENsYXNzOwotdHlwZWRlZiBzdHJ1Y3QgX1dlYktpdE1lZGlhQ2xlYXJLZXlEZWNyeXB0
UHJpdmF0ZSBXZWJLaXRNZWRpYUNsZWFyS2V5RGVjcnlwdFByaXZhdGU7Ci0KLUdUeXBlIHdlYmtp
dF9tZWRpYV9jbGVhcl9rZXlfZGVjcnlwdF9nZXRfdHlwZSh2b2lkKTsKLQotc3RydWN0IF9XZWJL
aXRNZWRpYUNsZWFyS2V5RGVjcnlwdCB7Ci0gICAgV2ViS2l0TWVkaWFDb21tb25FbmNyeXB0aW9u
RGVjcnlwdCBwYXJlbnQ7Ci0KLSAgICBXZWJLaXRNZWRpYUNsZWFyS2V5RGVjcnlwdFByaXZhdGUq
IHByaXY7Ci19OwotCi1zdHJ1Y3QgX1dlYktpdE1lZGlhQ2xlYXJLZXlEZWNyeXB0Q2xhc3Mgewot
ICAgIFdlYktpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5cHRDbGFzcyBwYXJlbnRDbGFzczsK
LX07Ci0KLUdfRU5EX0RFQ0xTCi0KLSNlbmRpZiAvLyBFTkFCTEUoRU5DUllQVEVEX01FRElBKSAm
JiBVU0UoR1NUUkVBTUVSKQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvZ3N0cmVhbWVyL2VtZS9XZWJLaXRDb21tb25FbmNyeXB0aW9uRGVjcnlwdG9yR1N0cmVh
bWVyLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2dzdHJlYW1lci9lbWUv
V2ViS2l0Q29tbW9uRW5jcnlwdGlvbkRlY3J5cHRvckdTdHJlYW1lci5jcHAKaW5kZXggMTdmZDQ4
Y2M5NTkxZTgxNGU2YTM5YjQ3MjVmMDhmOTA5ODBlNWY2MS4uZjEwYTg1YjVmZDIxMzJlZjdmMWJi
YjA3OGJiYzU4YTQ4YzNjNDMwOCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvZ3N0cmVhbWVyL2VtZS9XZWJLaXRDb21tb25FbmNyeXB0aW9uRGVjcnlwdG9yR1N0
cmVhbWVyLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9nc3RyZWFt
ZXIvZW1lL1dlYktpdENvbW1vbkVuY3J5cHRpb25EZWNyeXB0b3JHU3RyZWFtZXIuY3BwCkBAIC0y
Niw2ICsyNiw3IEBACiAjaWYgRU5BQkxFKEVOQ1JZUFRFRF9NRURJQSkgJiYgVVNFKEdTVFJFQU1F
UikKIAogI2luY2x1ZGUgIkdTdHJlYW1lckNvbW1vbi5oIgorI2luY2x1ZGUgIkdTdHJlYW1lckVN
RVV0aWxpdGllcy5oIgogI2luY2x1ZGUgPENETUluc3RhbmNlLmg+CiAjaW5jbHVkZSA8d3RmL0Nv
bmRpdGlvbi5oPgogI2luY2x1ZGUgPHd0Zi9QcmludFN0cmVhbS5oPgpAQCAtMzcsMjAgKzM4LDIx
IEBAIHVzaW5nIFdlYkNvcmU6OkNETUluc3RhbmNlOwogc3RydWN0IF9XZWJLaXRNZWRpYUNvbW1v
bkVuY3J5cHRpb25EZWNyeXB0UHJpdmF0ZSB7CiAgICAgR1JlZlB0cjxHc3RFdmVudD4gcHJvdGVj
dGlvbkV2ZW50OwogICAgIFJlZlB0cjxDRE1JbnN0YW5jZT4gY2RtSW5zdGFuY2U7Ci0gICAgYm9v
bCBrZXlSZWNlaXZlZDsKKyAgICBib29sIGtleVJlY2VpdmVkIHsgZmFsc2UgfTsKICAgICBib29s
IHdhaXRpbmdGb3JLZXkgeyBmYWxzZSB9OwogICAgIExvY2sgbXV0ZXg7CiAgICAgQ29uZGl0aW9u
IGNvbmRpdGlvbjsKIH07CiAKLXN0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybiB3ZWJLaXRNZWRp
YUNvbW1vbkVuY3J5cHRpb25EZWNyeXB0b3JDaGFuZ2VTdGF0ZShHc3RFbGVtZW50KiwgR3N0U3Rh
dGVDaGFuZ2UgdHJhbnNpdGlvbik7Ci1zdGF0aWMgdm9pZCB3ZWJLaXRNZWRpYUNvbW1vbkVuY3J5
cHRpb25EZWNyeXB0b3JTZXRDb250ZXh0KEdzdEVsZW1lbnQqLCBHc3RDb250ZXh0Kik7Ci1zdGF0
aWMgdm9pZCB3ZWJLaXRNZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNyeXB0b3JGaW5hbGl6ZShHT2Jq
ZWN0Kik7Ci1zdGF0aWMgR3N0Q2Fwcyogd2Via2l0TWVkaWFDb21tb25FbmNyeXB0aW9uRGVjcnlw
dFRyYW5zZm9ybUNhcHMoR3N0QmFzZVRyYW5zZm9ybSosIEdzdFBhZERpcmVjdGlvbiwgR3N0Q2Fw
cyosIEdzdENhcHMqKTsKLXN0YXRpYyBHc3RGbG93UmV0dXJuIHdlYmtpdE1lZGlhQ29tbW9uRW5j
cnlwdGlvbkRlY3J5cHRUcmFuc2Zvcm1JblBsYWNlKEdzdEJhc2VUcmFuc2Zvcm0qLCBHc3RCdWZm
ZXIqKTsKLXN0YXRpYyBnYm9vbGVhbiB3ZWJraXRNZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNyeXB0
U2lua0V2ZW50SGFuZGxlcihHc3RCYXNlVHJhbnNmb3JtKiwgR3N0RXZlbnQqKTsKLXN0YXRpYyBn
Ym9vbGVhbiB3ZWJraXRNZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNyeXB0b3JRdWVyeUhhbmRsZXIo
R3N0QmFzZVRyYW5zZm9ybSosIEdzdFBhZERpcmVjdGlvbiwgR3N0UXVlcnkqKTsKLXN0YXRpYyBi
b29sIHdlYmtpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5cHRJc0NETUluc3RhbmNlQXZhaWxh
YmxlKFdlYktpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5cHQqKTsKK3N0YXRpYyBHc3RTdGF0
ZUNoYW5nZVJldHVybiBjaGFuZ2VTdGF0ZShHc3RFbGVtZW50KiwgR3N0U3RhdGVDaGFuZ2UgdHJh
bnNpdGlvbik7CitzdGF0aWMgdm9pZCBmaW5hbGl6ZShHT2JqZWN0Kik7CitzdGF0aWMgR3N0Q2Fw
cyogdHJhbnNmb3JtQ2FwcyhHc3RCYXNlVHJhbnNmb3JtKiwgR3N0UGFkRGlyZWN0aW9uLCBHc3RD
YXBzKiwgR3N0Q2FwcyopOworc3RhdGljIEdzdEZsb3dSZXR1cm4gdHJhbnNmb3JtSW5QbGFjZShH
c3RCYXNlVHJhbnNmb3JtKiwgR3N0QnVmZmVyKik7CitzdGF0aWMgZ2Jvb2xlYW4gc2lua0V2ZW50
SGFuZGxlcihHc3RCYXNlVHJhbnNmb3JtKiwgR3N0RXZlbnQqKTsKK3N0YXRpYyBnYm9vbGVhbiBx
dWVyeUhhbmRsZXIoR3N0QmFzZVRyYW5zZm9ybSosIEdzdFBhZERpcmVjdGlvbiwgR3N0UXVlcnkq
KTsKK3N0YXRpYyBib29sIGlzQ0RNSW5zdGFuY2VBdmFpbGFibGUoV2ViS2l0TWVkaWFDb21tb25F
bmNyeXB0aW9uRGVjcnlwdCopOworc3RhdGljIHZvaWQgc2V0Q29udGV4dChHc3RFbGVtZW50Kiwg
R3N0Q29udGV4dCopOworCiAKIEdTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMod2Via2l0X21lZGlh
X2NvbW1vbl9lbmNyeXB0aW9uX2RlY3J5cHRfZGVidWdfY2F0ZWdvcnkpOwogI2RlZmluZSBHU1Rf
Q0FUX0RFRkFVTFQgd2Via2l0X21lZGlhX2NvbW1vbl9lbmNyeXB0aW9uX2RlY3J5cHRfZGVidWdf
Y2F0ZWdvcnkKQEAgLTU4LDI0ICs2MCw0OSBAQCBHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDKHdl
YmtpdF9tZWRpYV9jb21tb25fZW5jcnlwdGlvbl9kZWNyeXB0X2RlYnVnX2NhdGVnb3J5KQogI2Rl
ZmluZSB3ZWJraXRfbWVkaWFfY29tbW9uX2VuY3J5cHRpb25fZGVjcnlwdF9wYXJlbnRfY2xhc3Mg
cGFyZW50X2NsYXNzCiBHX0RFRklORV9UWVBFKFdlYktpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRl
Y3J5cHQsIHdlYmtpdF9tZWRpYV9jb21tb25fZW5jcnlwdGlvbl9kZWNyeXB0LCBHU1RfVFlQRV9C
QVNFX1RSQU5TRk9STSk7CiAKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rVGVtcGxh
dGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAor
ICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUygiYXBwbGljYXRpb24veC1j
ZW5jLCBvcmlnaW5hbC1tZWRpYS10eXBlPShzdHJpbmcpdmlkZW8veC1oMjY0LCBwcm90ZWN0aW9u
LXN5c3RlbT0oc3RyaW5nKSIgV0VCQ09SRV9HU1RSRUFNRVJfRU1FX1VUSUxJVElFU19DTEVBUktF
WV9VVUlEICI7ICIKKyAgICAiYXBwbGljYXRpb24veC1jZW5jLCBvcmlnaW5hbC1tZWRpYS10eXBl
PShzdHJpbmcpYXVkaW8vbXBlZywgcHJvdGVjdGlvbi1zeXN0ZW09KHN0cmluZykiIFdFQkNPUkVf
R1NUUkVBTUVSX0VNRV9VVElMSVRJRVNfQ0xFQVJLRVlfVVVJRCI7IgorICAgICJhcHBsaWNhdGlv
bi94LXdlYm0tZW5jLCBvcmlnaW5hbC1tZWRpYS10eXBlPShzdHJpbmcpdmlkZW8veC12cDg7Igor
ICAgICJhcHBsaWNhdGlvbi94LXdlYm0tZW5jLCBvcmlnaW5hbC1tZWRpYS10eXBlPShzdHJpbmcp
dmlkZW8veC12cDk7IikpOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjVGVtcGxh
dGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAg
ICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMoInZpZGVvL3gtaDI2NDsgYXVk
aW8vbXBlZzsgdmlkZW8veC12cDg7IHZpZGVvL3gtdnA5IikpOworCiBzdGF0aWMgdm9pZCB3ZWJr
aXRfbWVkaWFfY29tbW9uX2VuY3J5cHRpb25fZGVjcnlwdF9jbGFzc19pbml0KFdlYktpdE1lZGlh
Q29tbW9uRW5jcnlwdGlvbkRlY3J5cHRDbGFzcyoga2xhc3MpCiB7CiAgICAgR09iamVjdENsYXNz
KiBnb2JqZWN0Q2xhc3MgPSBHX09CSkVDVF9DTEFTUyhrbGFzcyk7Ci0gICAgZ29iamVjdENsYXNz
LT5maW5hbGl6ZSA9IHdlYktpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5cHRvckZpbmFsaXpl
OworICAgIGdvYmplY3RDbGFzcy0+ZmluYWxpemUgPSBmaW5hbGl6ZTsKKworICAgIEdzdEVsZW1l
bnRDbGFzcyogZWxlbWVudENsYXNzID0gR1NUX0VMRU1FTlRfQ0xBU1Moa2xhc3MpOworICAgIGdz
dF9lbGVtZW50X2NsYXNzX2FkZF9wYWRfdGVtcGxhdGUoZWxlbWVudENsYXNzLCBnc3Rfc3RhdGlj
X3BhZF90ZW1wbGF0ZV9nZXQoJnNpbmtUZW1wbGF0ZSkpOworICAgIGdzdF9lbGVtZW50X2NsYXNz
X2FkZF9wYWRfdGVtcGxhdGUoZWxlbWVudENsYXNzLCBnc3Rfc3RhdGljX3BhZF90ZW1wbGF0ZV9n
ZXQoJnNyY1RlbXBsYXRlKSk7CisKKyAgICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21l
dGFkYXRhKGVsZW1lbnRDbGFzcywKKyAgICAgICAgIkRlY3J5cHQgY29udGVudCBjcmVhdGVkIGZv
ciBFTUUiLAorICAgICAgICBHU1RfRUxFTUVOVF9GQUNUT1JZX0tMQVNTX0RFQ1JZUFRPUiwKKyAg
ICAgICAgIkRlY3J5cHRvciBlbGVtZW50IHRoYXQgaW50ZXJmYWNlcyB0byBXZWJLaXQgQ0RNIEFQ
SXMiLAorICAgICAgICAiSWdhbGlhIFMuTCIpOwogCiAgICAgR1NUX0RFQlVHX0NBVEVHT1JZX0lO
SVQod2Via2l0X21lZGlhX2NvbW1vbl9lbmNyeXB0aW9uX2RlY3J5cHRfZGVidWdfY2F0ZWdvcnks
Ci0gICAgICAgICJ3ZWJraXRjZW5jIiwgMCwgIkNvbW1vbiBFbmNyeXB0aW9uIGJhc2UgY2xhc3Mi
KTsKKyAgICAgICAgIndlYmtpdGNlbmMiLCAwLCAiV2ViS2l0IGRlY3J5cHRvciIpOwogCi0gICAg
R3N0RWxlbWVudENsYXNzKiBlbGVtZW50Q2xhc3MgPSBHU1RfRUxFTUVOVF9DTEFTUyhrbGFzcyk7
Ci0gICAgZWxlbWVudENsYXNzLT5jaGFuZ2Vfc3RhdGUgPSBHU1RfREVCVUdfRlVOQ1BUUih3ZWJL
aXRNZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNyeXB0b3JDaGFuZ2VTdGF0ZSk7Ci0gICAgZWxlbWVu
dENsYXNzLT5zZXRfY29udGV4dCA9IEdTVF9ERUJVR19GVU5DUFRSKHdlYktpdE1lZGlhQ29tbW9u
RW5jcnlwdGlvbkRlY3J5cHRvclNldENvbnRleHQpOworICAgIGVsZW1lbnRDbGFzcy0+Y2hhbmdl
X3N0YXRlID0gR1NUX0RFQlVHX0ZVTkNQVFIoY2hhbmdlU3RhdGUpOworICAgIGVsZW1lbnRDbGFz
cy0+c2V0X2NvbnRleHQgPSBHU1RfREVCVUdfRlVOQ1BUUihzZXRDb250ZXh0KTsKIAogICAgIEdz
dEJhc2VUcmFuc2Zvcm1DbGFzcyogYmFzZVRyYW5zZm9ybUNsYXNzID0gR1NUX0JBU0VfVFJBTlNG
T1JNX0NMQVNTKGtsYXNzKTsKLSAgICBiYXNlVHJhbnNmb3JtQ2xhc3MtPnRyYW5zZm9ybV9pcCA9
IEdTVF9ERUJVR19GVU5DUFRSKHdlYmtpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5cHRUcmFu
c2Zvcm1JblBsYWNlKTsKLSAgICBiYXNlVHJhbnNmb3JtQ2xhc3MtPnRyYW5zZm9ybV9jYXBzID0g
R1NUX0RFQlVHX0ZVTkNQVFIod2Via2l0TWVkaWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdFRyYW5z
Zm9ybUNhcHMpOworICAgIGJhc2VUcmFuc2Zvcm1DbGFzcy0+dHJhbnNmb3JtX2lwID0gR1NUX0RF
QlVHX0ZVTkNQVFIodHJhbnNmb3JtSW5QbGFjZSk7CisgICAgYmFzZVRyYW5zZm9ybUNsYXNzLT50
cmFuc2Zvcm1fY2FwcyA9IEdTVF9ERUJVR19GVU5DUFRSKHRyYW5zZm9ybUNhcHMpOwogICAgIGJh
c2VUcmFuc2Zvcm1DbGFzcy0+dHJhbnNmb3JtX2lwX29uX3Bhc3N0aHJvdWdoID0gRkFMU0U7Ci0g
ICAgYmFzZVRyYW5zZm9ybUNsYXNzLT5zaW5rX2V2ZW50ID0gR1NUX0RFQlVHX0ZVTkNQVFIod2Vi
a2l0TWVkaWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdFNpbmtFdmVudEhhbmRsZXIpOwotICAgIGJh
c2VUcmFuc2Zvcm1DbGFzcy0+cXVlcnkgPSBHU1RfREVCVUdfRlVOQ1BUUih3ZWJraXRNZWRpYUNv
bW1vbkVuY3J5cHRpb25EZWNyeXB0b3JRdWVyeUhhbmRsZXIpOworICAgIGJhc2VUcmFuc2Zvcm1D
bGFzcy0+c2lua19ldmVudCA9IEdTVF9ERUJVR19GVU5DUFRSKHNpbmtFdmVudEhhbmRsZXIpOwor
ICAgIGJhc2VUcmFuc2Zvcm1DbGFzcy0+cXVlcnkgPSBHU1RfREVCVUdfRlVOQ1BUUihxdWVyeUhh
bmRsZXIpOworCisgICAgV2ViS2l0TWVkaWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdENsYXNzKiBj
ZW5jQ2xhc3MgPSBXRUJLSVRfTUVESUFfQ0VOQ19ERUNSWVBUX0NMQVNTKGtsYXNzKTsKKyAgICBj
ZW5jQ2xhc3MtPnByb3RlY3Rpb25TeXN0ZW1JZCA9IFdlYkNvcmU6OkdTdHJlYW1lckVNRVV0aWxp
dGllczo6c19DbGVhcktleVVVSUQ7CiAKICAgICBnX3R5cGVfY2xhc3NfYWRkX3ByaXZhdGUoa2xh
c3MsIHNpemVvZihXZWJLaXRNZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNyeXB0UHJpdmF0ZSkpOwog
fQpAQCAtOTMsNyArMTIwLDcgQEAgc3RhdGljIHZvaWQgd2Via2l0X21lZGlhX2NvbW1vbl9lbmNy
eXB0aW9uX2RlY3J5cHRfaW5pdChXZWJLaXRNZWRpYUNvbW1vbkVuY3J5cHQKICAgICBnc3RfYmFz
ZV90cmFuc2Zvcm1fc2V0X2dhcF9hd2FyZShiYXNlLCBGQUxTRSk7CiB9CiAKLXN0YXRpYyB2b2lk
IHdlYktpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5cHRvckZpbmFsaXplKEdPYmplY3QqIG9i
amVjdCkKK3N0YXRpYyB2b2lkIGZpbmFsaXplKEdPYmplY3QqIG9iamVjdCkKIHsKICAgICBXZWJL
aXRNZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNyeXB0KiBzZWxmID0gV0VCS0lUX01FRElBX0NFTkNf
REVDUllQVChvYmplY3QpOwogICAgIFdlYktpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5cHRQ
cml2YXRlKiBwcml2ID0gc2VsZi0+cHJpdjsKQEAgLTEwMiw3ICsxMjksNyBAQCBzdGF0aWMgdm9p
ZCB3ZWJLaXRNZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNyeXB0b3JGaW5hbGl6ZShHT2JqZWN0KiBv
YmplY3QpCiAgICAgR1NUX0NBTExfUEFSRU5UKEdfT0JKRUNUX0NMQVNTLCBmaW5hbGl6ZSwgKG9i
amVjdCkpOwogfQogCi1zdGF0aWMgR3N0Q2Fwcyogd2Via2l0TWVkaWFDb21tb25FbmNyeXB0aW9u
RGVjcnlwdFRyYW5zZm9ybUNhcHMoR3N0QmFzZVRyYW5zZm9ybSogYmFzZSwgR3N0UGFkRGlyZWN0
aW9uIGRpcmVjdGlvbiwgR3N0Q2FwcyogY2FwcywgR3N0Q2FwcyogZmlsdGVyKQorc3RhdGljIEdz
dENhcHMqIHRyYW5zZm9ybUNhcHMoR3N0QmFzZVRyYW5zZm9ybSogYmFzZSwgR3N0UGFkRGlyZWN0
aW9uIGRpcmVjdGlvbiwgR3N0Q2FwcyogY2FwcywgR3N0Q2FwcyogZmlsdGVyKQogewogICAgIGlm
IChkaXJlY3Rpb24gPT0gR1NUX1BBRF9VTktOT1dOKQogICAgICAgICByZXR1cm4gbnVsbHB0cjsK
QEAgLTE5Nyw3ICsyMjQsNTEgQEAgc3RhdGljIEdzdENhcHMqIHdlYmtpdE1lZGlhQ29tbW9uRW5j
cnlwdGlvbkRlY3J5cHRUcmFuc2Zvcm1DYXBzKEdzdEJhc2VUcmFuc2Zvcm0KICAgICByZXR1cm4g
dHJhbnNmb3JtZWRDYXBzOwogfQogCi1zdGF0aWMgR3N0Rmxvd1JldHVybiB3ZWJraXRNZWRpYUNv
bW1vbkVuY3J5cHRpb25EZWNyeXB0VHJhbnNmb3JtSW5QbGFjZShHc3RCYXNlVHJhbnNmb3JtKiBi
YXNlLCBHc3RCdWZmZXIqIGJ1ZmZlcikKK3N0YXRpYyBib29sIHBvcHVsYXRlU3ViU2FtcGxlcyhX
ZWJLaXRNZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNyeXB0KiBzZWxmLCBHc3RCdWZmZXIqIHN1YlNh
bXBsZXNCdWZmZXIsIHVpbnQzMl90IHN1YlNhbXBsZUNvdW50LCB1aW50MzJfdCB0b3RhbFNhbXBs
ZVNpemUsIFZlY3RvcjxXZWJDb3JlOjpDRE1JbnN0YW5jZTo6U3ViU2FtcGxlPiYgc3ViU2FtcGxl
cykKK3sKKyAgICBpZiAoIXN1YlNhbXBsZXNCdWZmZXIpIHsKKyAgICAgICAgR1NUX0VSUk9SX09C
SkVDVChzZWxmLCAic3Vic2FtcGxlIGJ1ZmZlciBpcyBudWxsIik7CisgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICB9CisKKyAgICBXZWJDb3JlOjpHc3RNYXBwZWRCdWZmZXIgbWFwcGVkU3ViU2Ft
cGxlc0J1ZmZlcihzdWJTYW1wbGVzQnVmZmVyLCBHU1RfTUFQX1JFQUQpOworICAgIGlmICghbWFw
cGVkU3ViU2FtcGxlc0J1ZmZlcikgeworICAgICAgICBHU1RfRVJST1JfT0JKRUNUKHNlbGYsICJm
YWlsZWQgdG8gbWFwIHN1YnNhbXBsZSBidWZmZXIiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgIH0KKworICAgIHVpbnQzMl90IHBvc2l0aW9uID0gMDsKKyAgICB1aW50MzJfdCBzYW1wbGVJ
bmRleCA9IDA7CisKKyAgICBHVW5pcXVlUHRyPEdzdEJ5dGVSZWFkZXI+IHJlYWRlcihnc3RfYnl0
ZV9yZWFkZXJfbmV3KG1hcHBlZFN1YlNhbXBsZXNCdWZmZXIuZGF0YSgpLCBtYXBwZWRTdWJTYW1w
bGVzQnVmZmVyLnNpemUoKSkpOworCisgICAgd2hpbGUgKHBvc2l0aW9uIDwgdG90YWxTYW1wbGVT
aXplKSB7CisgICAgICAgIHVpbnQxNl90IG5CeXRlc0NsZWFyID0gMDsKKyAgICAgICAgdWludDMy
X3QgbkJ5dGVzRW5jcnlwdGVkID0gMDsKKworICAgICAgICBpZiAoc2FtcGxlSW5kZXggPCBzdWJT
YW1wbGVDb3VudCkgeworICAgICAgICAgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQx
Nl9iZShyZWFkZXIuZ2V0KCksICZuQnl0ZXNDbGVhcikKKyAgICAgICAgICAgICAgICB8fCAhZ3N0
X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUocmVhZGVyLmdldCgpLCAmbkJ5dGVzRW5jcnlwdGVk
KSkgeworICAgICAgICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1Qoc2VsZiwgInN1YnNhbXBsZXMg
aW4gaW5jb3JyZWN0IGZvcm1hdCIpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgIHNhbXBsZUluZGV4Kys7CisgICAgICAgIH0gZWxzZSB7
CisgICAgICAgICAgICBuQnl0ZXNDbGVhciA9IDA7CisgICAgICAgICAgICBuQnl0ZXNFbmNyeXB0
ZWQgPSB0b3RhbFNhbXBsZVNpemUgLSBwb3NpdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIHN1
YlNhbXBsZXMuYXBwZW5kKHtuQnl0ZXNDbGVhciwgbkJ5dGVzRW5jcnlwdGVkfSk7CisKKyAgICAg
ICAgR1NUX1RSQUNFX09CSkVDVChzZWxmLCAic3Vic2FtcGxlIGluZGV4ICV1IC0gJWh1IGJ5dGVz
IGNsZWFyICh0b2RvPSUiIFBSSXUzMiAiKSIsIHNhbXBsZUluZGV4LCBuQnl0ZXNDbGVhciwgdG90
YWxTYW1wbGVTaXplIC0gcG9zaXRpb24pOworICAgICAgICBwb3NpdGlvbiArPSBuQnl0ZXNDbGVh
ciArIG5CeXRlc0VuY3J5cHRlZDsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworCitz
dGF0aWMgR3N0Rmxvd1JldHVybiB0cmFuc2Zvcm1JblBsYWNlKEdzdEJhc2VUcmFuc2Zvcm0qIGJh
c2UsIEdzdEJ1ZmZlciogYnVmZmVyKQogewogICAgIFdlYktpdE1lZGlhQ29tbW9uRW5jcnlwdGlv
bkRlY3J5cHQqIHNlbGYgPSBXRUJLSVRfTUVESUFfQ0VOQ19ERUNSWVBUKGJhc2UpOwogICAgIFdl
YktpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5cHRQcml2YXRlKiBwcml2ID0gV0VCS0lUX01F
RElBX0NFTkNfREVDUllQVF9HRVRfUFJJVkFURShzZWxmKTsKQEAgLTIwNSw2ICsyNzYsOSBAQCBz
dGF0aWMgR3N0Rmxvd1JldHVybiB3ZWJraXRNZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNyeXB0VHJh
bnNmb3JtSW5QbGFjZShHc3RCYXNlVAogCiAgICAgLy8gVGhlIGtleSBtaWdodCBub3QgaGF2ZSBi
ZWVuIHJlY2VpdmVkIHlldC4gV2FpdCBmb3IgaXQuCiAgICAgaWYgKCFwcml2LT5rZXlSZWNlaXZl
ZCkgeworICAgICAgICAvLyBGSVhNRTogVGhlIHdhaXRpbmcgZm9yIGtleSBsb2dpYyBzaG91bGQg
YmUgbW92ZWQgdG8gdGhlCisgICAgICAgIC8vIENETUluc3RhbmNlLCB3aGVyZSB0aGUgZGVjcnlw
dCBtZXRob2QgY2FuIHRlbGwgaXQncyB3YWl0aW5nCisgICAgICAgIC8vIGZvciBhIGtleSB3aXRo
IGhpZ2hlciBhY2N1cmFjeS4KICAgICAgICAgR1NUX0RFQlVHX09CSkVDVChzZWxmLCAia2V5IG5v
dCBhdmFpbGFibGUgeWV0LCB3YWl0aW5nIGZvciBpdCIpOwogICAgICAgICBpZiAoR1NUX1NUQVRF
KEdTVF9FTEVNRU5UKHNlbGYpKSA8IEdTVF9TVEFURV9QQVVTRUQgfHwgKEdTVF9TVEFURV9UQVJH
RVQoR1NUX0VMRU1FTlQoc2VsZikpICE9IEdTVF9TVEFURV9WT0lEX1BFTkRJTkcgJiYgR1NUX1NU
QVRFX1RBUkdFVChHU1RfRUxFTUVOVChzZWxmKSkgPCBHU1RfU1RBVEVfUEFVU0VEKSkgewogICAg
ICAgICAgICAgR1NUX0VSUk9SX09CSkVDVChzZWxmLCAiY2FuJ3QgcHJvY2VzcyBrZXkgcmVxdWVz
dHMgaW4gbGVzcyB0aGFuIFBBVVNFRCBzdGF0ZSIpOwpAQCAtMjUzLDcgKzMyNyw3IEBAIHN0YXRp
YyBHc3RGbG93UmV0dXJuIHdlYmtpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5cHRUcmFuc2Zv
cm1JblBsYWNlKEdzdEJhc2VUCiAKICAgICBHU1RfREVCVUdfT0JKRUNUKGJhc2UsICJwcm90ZWN0
aW9uIG1ldGE6ICUiIEdTVF9QVFJfRk9STUFULCBwcm90ZWN0aW9uTWV0YS0+aW5mbyk7CiAKLSAg
ICB1bnNpZ25lZCBzdWJTYW1wbGVDb3VudDsKKyAgICB1aW50MzJfdCBzdWJTYW1wbGVDb3VudDsK
ICAgICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X3VpbnQocHJvdGVjdGlvbk1ldGEtPmluZm8sICJz
dWJzYW1wbGVfY291bnQiLCAmc3ViU2FtcGxlQ291bnQpKSB7CiAgICAgICAgIEdTVF9FUlJPUl9P
QkpFQ1Qoc2VsZiwgIkZhaWxlZCB0byBnZXQgc3Vic2FtcGxlX2NvdW50Iik7CiAgICAgICAgIGdz
dF9idWZmZXJfcmVtb3ZlX21ldGEoYnVmZmVyLCByZWludGVycHJldF9jYXN0PEdzdE1ldGEqPihw
cm90ZWN0aW9uTWV0YSkpOwpAQCAtMjczLDcgKzM0Nyw2IEBAIHN0YXRpYyBHc3RGbG93UmV0dXJu
IHdlYmtpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5cHRUcmFuc2Zvcm1JblBsYWNlKEdzdEJh
c2VUCiAgICAgfQogCiAgICAgdmFsdWUgPSBnc3Rfc3RydWN0dXJlX2dldF92YWx1ZShwcm90ZWN0
aW9uTWV0YS0+aW5mbywgImtpZCIpOwotCiAgICAgaWYgKCF2YWx1ZSkgewogICAgICAgICBHU1Rf
RVJST1JfT0JKRUNUKHNlbGYsICJGYWlsZWQgdG8gZ2V0IGtleSBpZCBmb3IgYnVmZmVyIik7CiAg
ICAgICAgIGdzdF9idWZmZXJfcmVtb3ZlX21ldGEoYnVmZmVyLCByZWludGVycHJldF9jYXN0PEdz
dE1ldGEqPihwcm90ZWN0aW9uTWV0YSkpOwpAQCAtMjg5LDEyICszNjIsNDYgQEAgc3RhdGljIEdz
dEZsb3dSZXR1cm4gd2Via2l0TWVkaWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdFRyYW5zZm9ybUlu
UGxhY2UoR3N0QmFzZVQKICAgICB9CiAKICAgICBHc3RCdWZmZXIqIGl2QnVmZmVyID0gZ3N0X3Zh
bHVlX2dldF9idWZmZXIodmFsdWUpOwotICAgIFdlYktpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRl
Y3J5cHRDbGFzcyoga2xhc3MgPSBXRUJLSVRfTUVESUFfQ0VOQ19ERUNSWVBUX0dFVF9DTEFTUyhz
ZWxmKTsKIAotICAgIEdTVF9UUkFDRV9PQkpFQ1Qoc2VsZiwgImRlY3J5cHRpbmciKTsKLSAgICBp
ZiAoIWtsYXNzLT5kZWNyeXB0KHNlbGYsIGl2QnVmZmVyLCBrZXlJREJ1ZmZlciwgYnVmZmVyLCBz
dWJTYW1wbGVDb3VudCwgc3ViU2FtcGxlc0J1ZmZlcikpIHsKLSAgICAgICAgR1NUX0VSUk9SX09C
SkVDVChzZWxmLCAiRGVjcnlwdGlvbiBmYWlsZWQiKTsKLSAgICAgICAgZ3N0X2J1ZmZlcl9yZW1v
dmVfbWV0YShidWZmZXIsIHJlaW50ZXJwcmV0X2Nhc3Q8R3N0TWV0YSo+KHByb3RlY3Rpb25NZXRh
KSk7CisgICAgaWYgKCFpdkJ1ZmZlcikgeworICAgICAgICBHU1RfRVJST1JfT0JKRUNUKHNlbGYs
ICJFcnJvciwgdGhlIGl2QnVmZmVyIGlzIG51bGwiKTsKKyAgICAgICAgcmV0dXJuIEdTVF9GTE9X
X05PVF9TVVBQT1JURUQ7CisgICAgfQorCisgICAgaWYgKCFidWZmZXIpIHsKKyAgICAgICAgR1NU
X0VSUk9SX09CSkVDVChzZWxmLCAiTm8gYnVmZmVyIHRvIGRlY3J5cHQiKTsKKyAgICAgICAgcmV0
dXJuIEdTVF9GTE9XX05PVF9TVVBQT1JURUQ7CisgICAgfQorCisgICAgV2ViQ29yZTo6R3N0TWFw
cGVkQnVmZmVyIG1hcHBlZElWQnVmZmVyKGl2QnVmZmVyLCBHU1RfTUFQX1JFQUQpOworICAgIGlm
ICghbWFwcGVkSVZCdWZmZXIpIHsKKyAgICAgICAgR1NUX0VSUk9SX09CSkVDVChzZWxmLCAiRmFp
bGVkIHRvIG1hcCBJViIpOworICAgICAgICByZXR1cm4gR1NUX0ZMT1dfTk9UX1NVUFBPUlRFRDsK
KyAgICB9CisKKyAgICBXZWJDb3JlOjpHc3RNYXBwZWRCdWZmZXIgbWFwcGVkS2V5SWRCdWZmZXIo
a2V5SURCdWZmZXIsIEdTVF9NQVBfUkVBRCk7CisgICAgaWYgKCFtYXBwZWRLZXlJZEJ1ZmZlcikg
eworICAgICAgICBHU1RfRVJST1JfT0JKRUNUKHNlbGYsICJGYWlsZWQgdG8gbWFwIGtleSBpZCBi
dWZmZXIiKTsKKyAgICAgICAgcmV0dXJuIEdTVF9GTE9XX05PVF9TVVBQT1JURUQ7CisgICAgfQor
CisgICAgV2ViQ29yZTo6R3N0TWFwcGVkQnVmZmVyIG1hcHBlZEJ1ZmZlcihidWZmZXIsIEdTVF9N
QVBfUkVBRFdSSVRFKTsKKyAgICBpZiAoIW1hcHBlZEJ1ZmZlcikgeworICAgICAgICBHU1RfRVJS
T1JfT0JKRUNUKHNlbGYsICJGYWlsZWQgdG8gbWFwIGJ1ZmZlciIpOworICAgICAgICByZXR1cm4g
R1NUX0ZMT1dfTk9UX1NVUFBPUlRFRDsKKyAgICB9CisKKyAgICBWZWN0b3I8V2ViQ29yZTo6Q0RN
SW5zdGFuY2U6OlN1YlNhbXBsZT4gc3ViU2FtcGxlczsKKyAgICBpZiAoc3ViU2FtcGxlQ291bnQg
JiYgIXBvcHVsYXRlU3ViU2FtcGxlcyhzZWxmLCBzdWJTYW1wbGVzQnVmZmVyLCBzdWJTYW1wbGVD
b3VudCwgbWFwcGVkQnVmZmVyLnNpemUoKSwgc3ViU2FtcGxlcykpIHsKKyAgICAgICAgR1NUX0VS
Uk9SX09CSkVDVChzZWxmLCAiZmFpbGVkIHRvIHBhcnNlIHN1YnNhbXBsZSByYW5nZXMiKTsKKyAg
ICAgICAgcmV0dXJuIEdTVF9GTE9XX05PVF9TVVBQT1JURUQ7CisgICAgfQorCisgICAgYXV0byBk
ZWNyeXB0aW9uQ29uZmlndXJhdGlvbiA9IFdlYkNvcmU6OkNETUluc3RhbmNlOjpEZWNyeXB0aW9u
Q29uZmlnOjpjcmVhdGVDZW5jQ29uZmlnKG1hcHBlZElWQnVmZmVyLnNoYXJlZEJ1ZmZlcigpLAor
ICAgICAgICBtYXBwZWRLZXlJZEJ1ZmZlci5zaGFyZWRCdWZmZXIoKSwKKyAgICAgICAgV1RGTW92
ZShzdWJTYW1wbGVzKSk7CisgICAgaWYgKCFwcml2LT5jZG1JbnN0YW5jZS0+ZGVjcnlwdChXVEZN
b3ZlKGRlY3J5cHRpb25Db25maWd1cmF0aW9uKSwgbWFwcGVkQnVmZmVyLmRhdGEoKSwgbWFwcGVk
QnVmZmVyLnNpemUoKSkpIHsKKyAgICAgICAgR1NUX0VSUk9SX09CSkVDVChzZWxmLCAiZmFpbGVk
IHRvIGRlY3J5cHQiKTsKICAgICAgICAgcmV0dXJuIEdTVF9GTE9XX05PVF9TVVBQT1JURUQ7CiAg
ICAgfQogCkBAIC0zMDIsNyArNDA5LDcgQEAgc3RhdGljIEdzdEZsb3dSZXR1cm4gd2Via2l0TWVk
aWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdFRyYW5zZm9ybUluUGxhY2UoR3N0QmFzZVQKICAgICBy
ZXR1cm4gR1NUX0ZMT1dfT0s7CiB9CiAKLXN0YXRpYyBib29sIHdlYmtpdE1lZGlhQ29tbW9uRW5j
cnlwdGlvbkRlY3J5cHRJc0NETUluc3RhbmNlQXZhaWxhYmxlKFdlYktpdE1lZGlhQ29tbW9uRW5j
cnlwdGlvbkRlY3J5cHQqIHNlbGYpCitzdGF0aWMgYm9vbCBpc0NETUluc3RhbmNlQXZhaWxhYmxl
KFdlYktpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5cHQqIHNlbGYpCiB7CiAgICAgV2ViS2l0
TWVkaWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdFByaXZhdGUqIHByaXYgPSBXRUJLSVRfTUVESUFf
Q0VOQ19ERUNSWVBUX0dFVF9QUklWQVRFKHNlbGYpOwogCkBAIC0zMTcsNyArNDI0LDEwIEBAIHN0
YXRpYyBib29sIHdlYmtpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5cHRJc0NETUluc3RhbmNl
QXZhaWxhYmxlKFdlYktpdE1lZGlhCiAgICAgICAgIC8vIHJlcXVlc3RzIGFyZSB1c2VmdWwgaGVy
ZS4KICAgICAgICAgaWYgKGNvbnRleHQpIHsKICAgICAgICAgICAgIGNvbnN0IEdWYWx1ZSogdmFs
dWUgPSBnc3Rfc3RydWN0dXJlX2dldF92YWx1ZShnc3RfY29udGV4dF9nZXRfc3RydWN0dXJlKGNv
bnRleHQuZ2V0KCkpLCAiY2RtLWluc3RhbmNlIik7Ci0gICAgICAgICAgICBwcml2LT5jZG1JbnN0
YW5jZSA9IHZhbHVlID8gcmVpbnRlcnByZXRfY2FzdDxDRE1JbnN0YW5jZSo+KGdfdmFsdWVfZ2V0
X3BvaW50ZXIodmFsdWUpKSA6IG51bGxwdHI7CisgICAgICAgICAgICAvLyBDYXB0dXJlIHRoZSBD
RE1JbnN0YW5jZSBpbnRvIGEgc2VwYXJhdGUgdmFyaWFibGUgdG8gYXZvaWQgbWlzc2luZyBhIHJl
ZmNvdW50LgorICAgICAgICAgICAgQ0RNSW5zdGFuY2UqIGluc3RhbmNlID0gdmFsdWUgPyByZWlu
dGVycHJldF9jYXN0PENETUluc3RhbmNlKj4oZ192YWx1ZV9nZXRfcG9pbnRlcih2YWx1ZSkpIDog
bnVsbHB0cjsKKyAgICAgICAgICAgIC8vIC4uLiBBbmQgZm9yY2UgYSByZWZjb3VudCBidW1wIHVz
aW5nIG9wZXJhdG9yPS4KKyAgICAgICAgICAgIHByaXYtPmNkbUluc3RhbmNlID0gaW5zdGFuY2U7
CiAgICAgICAgICAgICBpZiAocHJpdi0+Y2RtSW5zdGFuY2UpCiAgICAgICAgICAgICAgICAgR1NU
X0RFQlVHX09CSkVDVChzZWxmLCAicmVjZWl2ZWQgbmV3IENETUluc3RhbmNlICVwIiwgcHJpdi0+
Y2RtSW5zdGFuY2UuZ2V0KCkpOwogICAgICAgICAgICAgZWxzZQpAQCAtMzI5LDExICs0MzksMTEg
QEAgc3RhdGljIGJvb2wgd2Via2l0TWVkaWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdElzQ0RNSW5z
dGFuY2VBdmFpbGFibGUoV2ViS2l0TWVkaWEKICAgICByZXR1cm4gcHJpdi0+Y2RtSW5zdGFuY2U7
CiB9CiAKLXN0YXRpYyBnYm9vbGVhbiB3ZWJraXRNZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNyeXB0
U2lua0V2ZW50SGFuZGxlcihHc3RCYXNlVHJhbnNmb3JtKiB0cmFucywgR3N0RXZlbnQqIGV2ZW50
KQorc3RhdGljIGdib29sZWFuIHNpbmtFdmVudEhhbmRsZXIoR3N0QmFzZVRyYW5zZm9ybSogdHJh
bnMsIEdzdEV2ZW50KiBldmVudCkKIHsKICAgICBXZWJLaXRNZWRpYUNvbW1vbkVuY3J5cHRpb25E
ZWNyeXB0KiBzZWxmID0gV0VCS0lUX01FRElBX0NFTkNfREVDUllQVCh0cmFucyk7CiAgICAgV2Vi
S2l0TWVkaWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdFByaXZhdGUqIHByaXYgPSBXRUJLSVRfTUVE
SUFfQ0VOQ19ERUNSWVBUX0dFVF9QUklWQVRFKHNlbGYpOwotICAgIFdlYktpdE1lZGlhQ29tbW9u
RW5jcnlwdGlvbkRlY3J5cHRDbGFzcyoga2xhc3MgPSBXRUJLSVRfTUVESUFfQ0VOQ19ERUNSWVBU
X0dFVF9DTEFTUyhzZWxmKTsKKwogICAgIGdib29sZWFuIHJlc3VsdCA9IEZBTFNFOwogCiAgICAg
c3dpdGNoIChHU1RfRVZFTlRfVFlQRShldmVudCkpIHsKQEAgLTM0NSwxNyArNDU1LDIxIEBAIHN0
YXRpYyBnYm9vbGVhbiB3ZWJraXRNZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNyeXB0U2lua0V2ZW50
SGFuZGxlcihHc3RCYXNlVHJhbnNmCiAgICAgICAgIC8vIGV2ZW50cyB3aWxsIG5vdCBiZSBoYW5k
bGVkIGJ5IHRoZSBkZW11eGVyLCBzbyB0aGUgbXVzdCBiZQogICAgICAgICAvLyBoYW5kbGVkIGlu
IGhlcmUuCiAgICAgICAgIExvY2tIb2xkZXIgbG9ja2VyKHByaXYtPm11dGV4KTsKLSAgICAgICAg
aWYgKCF3ZWJraXRNZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNyeXB0SXNDRE1JbnN0YW5jZUF2YWls
YWJsZShzZWxmKSkgeworICAgICAgICBpZiAoIWlzQ0RNSW5zdGFuY2VBdmFpbGFibGUoc2VsZikp
IHsKICAgICAgICAgICAgIEdTVF9FUlJPUl9PQkpFQ1Qoc2VsZiwgIk5vIENETSBpbnN0YW5jZSBh
dmFpbGFibGUiKTsKKwogICAgICAgICAgICAgcmVzdWx0ID0gRkFMU0U7CiAgICAgICAgICAgICBi
cmVhazsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChrbGFzcy0+aGFuZGxlS2V5UmVzcG9uc2Uo
c2VsZiwgZXZlbnQpKSB7Ci0gICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUKHNlbGYsICJrZXkg
cmVjZWl2ZWQiKTsKLSAgICAgICAgICAgIHByaXYtPmtleVJlY2VpdmVkID0gdHJ1ZTsKLSAgICAg
ICAgICAgIHByaXYtPmNvbmRpdGlvbi5ub3RpZnlPbmUoKTsKLSAgICAgICAgfQorICAgICAgICBH
U1RfREVCVUdfT0JKRUNUKHNlbGYsICJyZWNlaXZlZCBhIGNkbSBpbnN0YW5jZSAlcCwgcmVmY291
bnQgJXUiLCBwcml2LT5jZG1JbnN0YW5jZS5nZXQoKSwgcHJpdi0+Y2RtSW5zdGFuY2UtPnJlZkNv
dW50KCkpOworCisgICAgICAgIC8vIEZJWE1FOiBXZSBhcmUgbm8gbG9uZ2VyIGludGVyZXN0ZWQg
aW4gd2FpdGluZyBmb3IgKmtleXMqLAorICAgICAgICAvLyByYXRoZXIganVzdCB0aGUgQ0RNIGlu
c3RhbmNlLCByZW5hbWUgdGhlc2UgdmFyaWFibGVzLiBUaGlzCisgICAgICAgIC8vIHdpbGwgYmUg
c2ltcGxpZmllZCBhbmQgcmVtb3ZlZCBieSB0aGUgR3N0Q29udGV4dCwgc28gbm8KKyAgICAgICAg
Ly8gcG9pbnQgZG9pbmcgaXQgaW4gdGhpcyBwYXRjaC4KKyAgICAgICAgcHJpdi0+a2V5UmVjZWl2
ZWQgPSB0cnVlOworICAgICAgICBwcml2LT5jb25kaXRpb24ubm90aWZ5T25lKCk7CiAKICAgICAg
ICAgZ3N0X2V2ZW50X3VucmVmKGV2ZW50KTsKICAgICAgICAgcmVzdWx0ID0gVFJVRTsKQEAgLTM2
OSw3ICs0ODMsNyBAQCBzdGF0aWMgZ2Jvb2xlYW4gd2Via2l0TWVkaWFDb21tb25FbmNyeXB0aW9u
RGVjcnlwdFNpbmtFdmVudEhhbmRsZXIoR3N0QmFzZVRyYW5zZgogICAgIHJldHVybiByZXN1bHQ7
CiB9CiAKLXN0YXRpYyBnYm9vbGVhbiB3ZWJraXRNZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNyeXB0
b3JRdWVyeUhhbmRsZXIoR3N0QmFzZVRyYW5zZm9ybSogdHJhbnMsIEdzdFBhZERpcmVjdGlvbiBk
aXJlY3Rpb24sIEdzdFF1ZXJ5KiBxdWVyeSkKK3N0YXRpYyBnYm9vbGVhbiBxdWVyeUhhbmRsZXIo
R3N0QmFzZVRyYW5zZm9ybSogdHJhbnMsIEdzdFBhZERpcmVjdGlvbiBkaXJlY3Rpb24sIEdzdFF1
ZXJ5KiBxdWVyeSkKIHsKICAgICBpZiAoZ3N0X3N0cnVjdHVyZV9oYXNfbmFtZShnc3RfcXVlcnlf
Z2V0X3N0cnVjdHVyZShxdWVyeSksICJhbnktZGVjcnlwdG9yLXdhaXRpbmctZm9yLWtleSIpKSB7
CiAgICAgICAgIFdlYktpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5cHRQcml2YXRlKiBwcml2
ID0gV0VCS0lUX01FRElBX0NFTkNfREVDUllQVF9HRVRfUFJJVkFURSh0cmFucyk7CkBAIC0zNzks
NyArNDkzLDcgQEAgc3RhdGljIGdib29sZWFuIHdlYmtpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRl
Y3J5cHRvclF1ZXJ5SGFuZGxlcihHc3RCYXNlVHJhbnNmb3IKICAgICByZXR1cm4gR1NUX0JBU0Vf
VFJBTlNGT1JNX0NMQVNTKHBhcmVudF9jbGFzcyktPnF1ZXJ5KHRyYW5zLCBkaXJlY3Rpb24sIHF1
ZXJ5KTsKIH0KIAotc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHdlYktpdE1lZGlhQ29tbW9u
RW5jcnlwdGlvbkRlY3J5cHRvckNoYW5nZVN0YXRlKEdzdEVsZW1lbnQqIGVsZW1lbnQsIEdzdFN0
YXRlQ2hhbmdlIHRyYW5zaXRpb24pCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gY2hhbmdl
U3RhdGUoR3N0RWxlbWVudCogZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKIHsK
ICAgICBXZWJLaXRNZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNyeXB0KiBzZWxmID0gV0VCS0lUX01F
RElBX0NFTkNfREVDUllQVChlbGVtZW50KTsKICAgICBXZWJLaXRNZWRpYUNvbW1vbkVuY3J5cHRp
b25EZWNyeXB0UHJpdmF0ZSogcHJpdiA9IFdFQktJVF9NRURJQV9DRU5DX0RFQ1JZUFRfR0VUX1BS
SVZBVEUoc2VsZik7CkBAIC00MDAsNyArNTE0LDcgQEAgc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0
dXJuIHdlYktpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5cHRvckNoYW5nZVN0YXRlKEdzdEUK
ICAgICByZXR1cm4gcmVzdWx0OwogfQogCi1zdGF0aWMgdm9pZCB3ZWJLaXRNZWRpYUNvbW1vbkVu
Y3J5cHRpb25EZWNyeXB0b3JTZXRDb250ZXh0KEdzdEVsZW1lbnQqIGVsZW1lbnQsIEdzdENvbnRl
eHQqIGNvbnRleHQpCitzdGF0aWMgdm9pZCBzZXRDb250ZXh0KEdzdEVsZW1lbnQqIGVsZW1lbnQs
IEdzdENvbnRleHQqIGNvbnRleHQpCiB7CiAgICAgV2ViS2l0TWVkaWFDb21tb25FbmNyeXB0aW9u
RGVjcnlwdCogc2VsZiA9IFdFQktJVF9NRURJQV9DRU5DX0RFQ1JZUFQoZWxlbWVudCk7CiAgICAg
V2ViS2l0TWVkaWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdFByaXZhdGUqIHByaXYgPSBXRUJLSVRf
TUVESUFfQ0VOQ19ERUNSWVBUX0dFVF9QUklWQVRFKHNlbGYpOwpkaWZmIC0tZ2l0IGEvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZ3N0cmVhbWVyL2VtZS9XZWJLaXRDb21tb25FbmNy
eXB0aW9uRGVjcnlwdG9yR1N0cmVhbWVyLmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9nc3RyZWFtZXIvZW1lL1dlYktpdENvbW1vbkVuY3J5cHRpb25EZWNyeXB0b3JHU3RyZWFt
ZXIuaAppbmRleCAyMjIxMTI1NGViN2Q5ZWY1NDY2MDU3ZmQ3ZDU0MzQyMTllY2VmMmRkLi5kNjUw
ZjQ2Yjc3NWEwMTVmOTRjMjQyNGU0NjQ2M2ZkYTg4NGRmNzVlIDEwMDY0NAotLS0gYS9Tb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9nc3RyZWFtZXIvZW1lL1dlYktpdENvbW1vbkVuY3J5
cHRpb25EZWNyeXB0b3JHU3RyZWFtZXIuaAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9nc3RyZWFtZXIvZW1lL1dlYktpdENvbW1vbkVuY3J5cHRpb25EZWNyeXB0b3JHU3Ry
ZWFtZXIuaApAQCAtNTMsOCArNTMsNiBAQCBzdHJ1Y3QgX1dlYktpdE1lZGlhQ29tbW9uRW5jcnlw
dGlvbkRlY3J5cHRDbGFzcyB7CiAgICAgR3N0QmFzZVRyYW5zZm9ybUNsYXNzIHBhcmVudENsYXNz
OwogCiAgICAgY29uc3QgY2hhciogcHJvdGVjdGlvblN5c3RlbUlkOwotICAgIGdib29sZWFuICgq
aGFuZGxlS2V5UmVzcG9uc2UpKFdlYktpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5cHQqLCBH
c3RFdmVudCogZXZlbnQpOwotICAgIGdib29sZWFuICgqZGVjcnlwdCkoV2ViS2l0TWVkaWFDb21t
b25FbmNyeXB0aW9uRGVjcnlwdCosIEdzdEJ1ZmZlciogaXZCdWZmZXIsIEdzdEJ1ZmZlcioga2V5
SURCdWZmZXIsIEdzdEJ1ZmZlciogYnVmZmVyLCB1bnNpZ25lZCBzdWJTYW1wbGVzQ291bnQsIEdz
dEJ1ZmZlciogc3ViU2FtcGxlc0J1ZmZlcik7CiB9OwogCiBHX0VORF9ERUNMUwpkaWZmIC0tZ2l0
IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZ3N0cmVhbWVyL21zZS9NZWRpYVBs
YXllclByaXZhdGVHU3RyZWFtZXJNU0UuY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvZ3N0cmVhbWVyL21zZS9NZWRpYVBsYXllclByaXZhdGVHU3RyZWFtZXJNU0UuY3BwCmlu
ZGV4IGI2M2U1ZGVlZTcyYzk1YzQ5ZDg1NmRjNTQ3MGJhYWIzZjYxNDllOGMuLjZkZmEzMmUwZjQx
MGYzMDE4MWJhODU3MmIxZGU0NTlkZjM0YmZlMjQgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL2dzdHJlYW1lci9tc2UvTWVkaWFQbGF5ZXJQcml2YXRlR1N0cmVh
bWVyTVNFLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9nc3RyZWFt
ZXIvbXNlL01lZGlhUGxheWVyUHJpdmF0ZUdTdHJlYW1lck1TRS5jcHAKQEAgLTkwOCw0MiArOTA4
LDYgQEAgTWVkaWFUaW1lIE1lZGlhUGxheWVyUHJpdmF0ZUdTdHJlYW1lck1TRTo6bWF4TWVkaWFU
aW1lU2Vla2FibGUoKSBjb25zdAogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLSNpZiBFTkFCTEUo
RU5DUllQVEVEX01FRElBKQotdm9pZCBNZWRpYVBsYXllclByaXZhdGVHU3RyZWFtZXJNU0U6OmF0
dGVtcHRUb0RlY3J5cHRXaXRoTG9jYWxJbnN0YW5jZSgpCi17Ci0gICAgaWYgKGlzPENETUluc3Rh
bmNlQ2xlYXJLZXk+KCptX2NkbUluc3RhbmNlKSkgewotICAgICAgICBhdXRvJiBjbGVhcmtleUNE
TUluc3RhbmNlID0gZG93bmNhc3Q8Q0RNSW5zdGFuY2VDbGVhcktleT4oKm1fY2RtSW5zdGFuY2Up
OwotICAgICAgICBpZiAoY2xlYXJrZXlDRE1JbnN0YW5jZS5rZXlzKCkuaXNFbXB0eSgpKQotICAg
ICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIEdWYWx1ZSBrZXlJRExpc3QgPSBHX1ZBTFVFX0lO
SVQsIGtleVZhbHVlTGlzdCA9IEdfVkFMVUVfSU5JVDsKLSAgICAgICAgZ192YWx1ZV9pbml0KCZr
ZXlJRExpc3QsIEdTVF9UWVBFX0xJU1QpOwotICAgICAgICBnX3ZhbHVlX2luaXQoJmtleVZhbHVl
TGlzdCwgR1NUX1RZUEVfTElTVCk7Ci0KLSAgICAgICAgYXV0byBhcHBlbmRCdWZmZXIgPQotICAg
ICAgICAgICAgW10oR1ZhbHVlKiB2YWx1ZUxpc3QsIGNvbnN0IFNoYXJlZEJ1ZmZlciYgYnVmZmVy
KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEdWYWx1ZSogYnVmZmVyVmFsdWUgPSBn
X25ldzAoR1ZhbHVlLCAxKTsKLSAgICAgICAgICAgICAgICBnX3ZhbHVlX2luaXQoYnVmZmVyVmFs
dWUsIEdTVF9UWVBFX0JVRkZFUik7Ci0gICAgICAgICAgICAgICAgZ3N0X3ZhbHVlX3Rha2VfYnVm
ZmVyKGJ1ZmZlclZhbHVlLAotICAgICAgICAgICAgICAgICAgICBnc3RfYnVmZmVyX25ld193cmFw
cGVkKGdfbWVtZHVwKGJ1ZmZlci5kYXRhKCksIGJ1ZmZlci5zaXplKCkpLCBidWZmZXIuc2l6ZSgp
KSk7Ci0gICAgICAgICAgICAgICAgZ3N0X3ZhbHVlX2xpc3RfYXBwZW5kX2FuZF90YWtlX3ZhbHVl
KHZhbHVlTGlzdCwgYnVmZmVyVmFsdWUpOwotICAgICAgICAgICAgfTsKLQotICAgICAgICBmb3Ig
KGF1dG8mIGtleSA6IGNsZWFya2V5Q0RNSW5zdGFuY2Uua2V5cygpKSB7Ci0gICAgICAgICAgICBh
cHBlbmRCdWZmZXIoJmtleUlETGlzdCwgKmtleS5rZXlJRERhdGEpOwotICAgICAgICAgICAgYXBw
ZW5kQnVmZmVyKCZrZXlWYWx1ZUxpc3QsICprZXkua2V5VmFsdWVEYXRhKTsKLSAgICAgICAgfQot
Ci0gICAgICAgIEdVbmlxdWVQdHI8R3N0U3RydWN0dXJlPiBzdHJ1Y3R1cmUoZ3N0X3N0cnVjdHVy
ZV9uZXdfZW1wdHkoImRybS1jaXBoZXItY2xlYXJrZXkiKSk7Ci0gICAgICAgIGdzdF9zdHJ1Y3R1
cmVfc2V0X3ZhbHVlKHN0cnVjdHVyZS5nZXQoKSwgImtleS1pZHMiLCAma2V5SURMaXN0KTsKLSAg
ICAgICAgZ3N0X3N0cnVjdHVyZV9zZXRfdmFsdWUoc3RydWN0dXJlLmdldCgpLCAia2V5LXZhbHVl
cyIsICZrZXlWYWx1ZUxpc3QpOwotCi0gICAgICAgIGdzdF9lbGVtZW50X3NlbmRfZXZlbnQobV9w
bGF5YmFja1BpcGVsaW5lLT5waXBlbGluZSgpLCBnc3RfZXZlbnRfbmV3X2N1c3RvbShHU1RfRVZF
TlRfQ1VTVE9NX0RPV05TVFJFQU1fT09CLCBzdHJ1Y3R1cmUucmVsZWFzZSgpKSk7Ci0gICAgfQot
fQotI2VuZGlmCi0KIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUuCiAKICNlbmRpZiAvLyBVU0UoR1NU
UkVBTUVSKQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZ3N0
cmVhbWVyL21zZS9NZWRpYVBsYXllclByaXZhdGVHU3RyZWFtZXJNU0UuaCBiL1NvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL2dzdHJlYW1lci9tc2UvTWVkaWFQbGF5ZXJQcml2YXRlR1N0
cmVhbWVyTVNFLmgKaW5kZXggNWI1NjgyZjY0YjVkMzU0OTRlODM5YjdhMzk0NGJhN2U0MDllZmMx
OC4uMmRmYTczMmZjYmYyNmJhNjg3ZjFhOTgxNGFiNzY2M2VlZjk4NTQ3NCAxMDA2NDQKLS0tIGEv
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZ3N0cmVhbWVyL21zZS9NZWRpYVBsYXll
clByaXZhdGVHU3RyZWFtZXJNU0UuaAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9nc3RyZWFtZXIvbXNlL01lZGlhUGxheWVyUHJpdmF0ZUdTdHJlYW1lck1TRS5oCkBAIC04
NSwxMCArODUsNiBAQCBwdWJsaWM6CiAgICAgc3RhdGljIGJvb2wgc3VwcG9ydHNDb2RlYyhTdHJp
bmcgY29kZWMpOwogICAgIHN0YXRpYyBib29sIHN1cHBvcnRzQWxsQ29kZWNzKGNvbnN0IFZlY3Rv
cjxTdHJpbmc+JiBjb2RlY3MpOwogCi0jaWYgRU5BQkxFKEVOQ1JZUFRFRF9NRURJQSkKLSAgICB2
b2lkIGF0dGVtcHRUb0RlY3J5cHRXaXRoTG9jYWxJbnN0YW5jZSgpIGZpbmFsOwotI2VuZGlmCi0K
IHByaXZhdGU6CiAgICAgc3RhdGljIHZvaWQgZ2V0U3VwcG9ydGVkVHlwZXMoSGFzaFNldDxTdHJp
bmcsIEFTQ0lJQ2FzZUluc2Vuc2l0aXZlSGFzaD4mKTsKICAgICBzdGF0aWMgTWVkaWFQbGF5ZXI6
OlN1cHBvcnRzVHlwZSBzdXBwb3J0c1R5cGUoY29uc3QgTWVkaWFFbmdpbmVTdXBwb3J0UGFyYW1l
dGVycyYpOwpkaWZmIC0tZ2l0IGEvVG9vbHMvQ2hhbmdlTG9nIGIvVG9vbHMvQ2hhbmdlTG9nCmlu
ZGV4IGMxZWE0NGNlMTFjMDhiN2M2YjNhZDM1ZjBlZTA5OTY0MmUzOGM1MjkuLjE3NTFjZTRiYTM0
ODVhZWNkNmI4MTdjYzA5YjY0ZTUzOTk1MzY5MzkgMTAwNjQ0Ci0tLSBhL1Rvb2xzL0NoYW5nZUxv
ZworKysgYi9Ub29scy9DaGFuZ2VMb2cKQEAgLTEsMyArMSwxMyBAQAorMjAxOC0xMi0wMyAgQ2hh
cmxpZSBUdXJuZXIgIDxjdHVybmVyQGlnYWxpYS5jb20+CisKKyAgICAgICAgW0VNRV0gQ3JlYXRl
IGFuZCBtb3ZlIHRvIGEgZGVjcnlwdGlvbiBBUEkgaW1wbGVtZW50ZWQgYnkgQ0RNSW5zdGFuY2Vz
CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xOTIyMjkK
KworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICAqIE1pbmlC
cm93c2VyL3dwZS9tYWluLmNwcDoKKyAgICAgICAgKG1haW4pOiBFbmFibGUgZW5jcnlwdGVkLW1l
ZGlhIGJ5IGRlZmF1bHQuCisKIDIwMTgtMTItMDEgIERvbiBPbG1zdGVhZCAgPGRvbi5vbG1zdGVh
ZEBzb255LmNvbT4KIAogICAgICAgICBDbGVhbnVwIFdlYktpdCBGZWF0dXJlcwpkaWZmIC0tZ2l0
IGEvVG9vbHMvTWluaUJyb3dzZXIvd3BlL21haW4uY3BwIGIvVG9vbHMvTWluaUJyb3dzZXIvd3Bl
L21haW4uY3BwCmluZGV4IGUwYzI5YjIxMjk5MzQzNzEyNzRhNmYyNTQ1MWVhZTk4MjFjNDY4OWYu
LjVjNDQ4YThlMDcxMjYxODlmMzQxMWNlNzEwMTBmYmZkNjI5MTFlZTAgMTAwNjQ0Ci0tLSBhL1Rv
b2xzL01pbmlCcm93c2VyL3dwZS9tYWluLmNwcAorKysgYi9Ub29scy9NaW5pQnJvd3Nlci93cGUv
bWFpbi5jcHAKQEAgLTE3Nyw2ICsxNzcsNyBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJn
dltdKQogICAgICAgICAiZW5hYmxlLWRldmVsb3Blci1leHRyYXMiLCBUUlVFLAogICAgICAgICAi
ZW5hYmxlLXdlYmdsIiwgVFJVRSwKICAgICAgICAgImVuYWJsZS1tZWRpYS1zdHJlYW0iLCBUUlVF
LAorICAgICAgICAiZW5hYmxlLWVuY3J5cHRlZC1tZWRpYSIsIFRSVUUsCiAgICAgICAgIG51bGxw
dHIpOwogCiAgICAgYXV0byogd2ViVmlldyA9IFdFQktJVF9XRUJfVklFVyhnX29iamVjdF9uZXco
V0VCS0lUX1RZUEVfV0VCX1ZJRVcsCmRpZmYgLS1naXQgYS9MYXlvdXRUZXN0cy9DaGFuZ2VMb2cg
Yi9MYXlvdXRUZXN0cy9DaGFuZ2VMb2cKaW5kZXggYjQzMTc5ZjZkNWNlYTVjNjhhNzg4ZTlmNDdh
Zjg0NmRiZGMxNDRhZC4uNGI3NjZhMWM0ODVmZmQ0MjZkYzg1ZDFkMTJlMzk1ZjdhYmRjMzY2YyAx
MDA2NDQKLS0tIGEvTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCisrKyBiL0xheW91dFRlc3RzL0NoYW5n
ZUxvZwpAQCAtMSwzICsxLDE2IEBACisyMDE4LTEyLTAzICBDaGFybGllIFR1cm5lciAgPGN0dXJu
ZXJAaWdhbGlhLmNvbT4KKworICAgICAgICBbRU1FXSBDcmVhdGUgYW5kIG1vdmUgdG8gYSBkZWNy
eXB0aW9uIEFQSSBpbXBsZW1lbnRlZCBieSBDRE1JbnN0YW5jZXMKKyAgICAgICAgaHR0cHM6Ly9i
dWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE5MjIyOQorCisgICAgICAgIFJldmlld2Vk
IGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFVwZGF0ZSB0byBuZXcgZmFpbHVyZSBvdXRw
dXQsIHRoaXMgd2FzIG5vdCBjYXVzZWQgYnkgdGhpcyBwYXRjaCwKKyAgICAgICAgZHJpdmUtYnkg
Z2FyZGVuaW5nLgorCisgICAgICAgICogcGxhdGZvcm0vZ3RrL2ltcG9ydGVkL3czYy93ZWItcGxh
dGZvcm0tdGVzdHMvZW5jcnlwdGVkLW1lZGlhL2NsZWFya2V5LW1wNC1wbGF5YmFjay1wZXJzaXN0
ZW50LWxpY2Vuc2UtZXZlbnRzLmh0dHBzLWV4cGVjdGVkLnR4dDoKKyAgICAgICAgKiBwbGF0Zm9y
bS93cGUvaW1wb3J0ZWQvdzNjL3dlYi1wbGF0Zm9ybS10ZXN0cy9lbmNyeXB0ZWQtbWVkaWEvY2xl
YXJrZXktbXA0LXBsYXliYWNrLXBlcnNpc3RlbnQtbGljZW5zZS1ldmVudHMuaHR0cHMtZXhwZWN0
ZWQudHh0OgorCiAyMDE4LTEyLTAzICBZYWNpbmUgQmFuZG91ICA8eWFjaW5lLmJhbmRvdUBzb2Z0
YXRob21lLmNvbT4KIAogICAgICAgICBbRU1FXVtDbGVhcktleV0gQWRkIGxheW91dCB0ZXN0IGZv
ciBkeW5hbWljIGNoYW5nZSBvZiBrZXkgYW5kIHZpZGVvIHJlc29sdXRpb24KZGlmZiAtLWdpdCBh
L0xheW91dFRlc3RzL3BsYXRmb3JtL2d0ay9pbXBvcnRlZC93M2Mvd2ViLXBsYXRmb3JtLXRlc3Rz
L2VuY3J5cHRlZC1tZWRpYS9jbGVhcmtleS1tcDQtcGxheWJhY2stcGVyc2lzdGVudC1saWNlbnNl
LWV2ZW50cy5odHRwcy1leHBlY3RlZC50eHQgYi9MYXlvdXRUZXN0cy9wbGF0Zm9ybS9ndGsvaW1w
b3J0ZWQvdzNjL3dlYi1wbGF0Zm9ybS10ZXN0cy9lbmNyeXB0ZWQtbWVkaWEvY2xlYXJrZXktbXA0
LXBsYXliYWNrLXBlcnNpc3RlbnQtbGljZW5zZS1ldmVudHMuaHR0cHMtZXhwZWN0ZWQudHh0Cmlu
ZGV4IGQxZmIxYjJlNzIxMmRkMWRiYjMzZmZiNmY5NGRlNWRlM2FmMGVhYTMuLjVjMjc2ZjNmYzVh
NTQ3ZWZhNzdlMGZkZWY3MDgyMGE0YmE5YjgwYzAgMTAwNjQ0Ci0tLSBhL0xheW91dFRlc3RzL3Bs
YXRmb3JtL2d0ay9pbXBvcnRlZC93M2Mvd2ViLXBsYXRmb3JtLXRlc3RzL2VuY3J5cHRlZC1tZWRp
YS9jbGVhcmtleS1tcDQtcGxheWJhY2stcGVyc2lzdGVudC1saWNlbnNlLWV2ZW50cy5odHRwcy1l
eHBlY3RlZC50eHQKKysrIGIvTGF5b3V0VGVzdHMvcGxhdGZvcm0vZ3RrL2ltcG9ydGVkL3czYy93
ZWItcGxhdGZvcm0tdGVzdHMvZW5jcnlwdGVkLW1lZGlhL2NsZWFya2V5LW1wNC1wbGF5YmFjay1w
ZXJzaXN0ZW50LWxpY2Vuc2UtZXZlbnRzLmh0dHBzLWV4cGVjdGVkLnR4dApAQCAtMSwzICsxLDMg
QEAKIAotRkFJTCBvcmcudzMuY2xlYXJrZXksIHBlcnNpc3RlbnQtbGljZW5zZSwgbXA0LCBwbGF5
YmFjaywgY2hlY2sgZXZlbnRzIGFzc2VydF9lcXVhbHM6IEV4cGVjdGVkIDFzdCBldmVudCB0byBi
ZSAnZ2VuZXJhdGVyZXF1ZXN0JyBleHBlY3RlZCAiZ2VuZXJhdGVyZXF1ZXN0IiBidXQgZ290ICJs
aWNlbnNlLXJlcXVlc3QiCitGQUlMIG9yZy53My5jbGVhcmtleSwgcGVyc2lzdGVudC1saWNlbnNl
LCBtcDQsIHBsYXliYWNrLCBjaGVjayBldmVudHMgYXNzZXJ0X2VxdWFsczogRXhwZWN0ZWQgMXN0
IGV2ZW50IHRvIGJlICdnZW5lcmF0ZXJlcXVlc3QnIGV4cGVjdGVkICJnZW5lcmF0ZXJlcXVlc3Qi
IGJ1dCBnb3QgInBsYXlpbmciCiAKZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL3BsYXRmb3JtL3dw
ZS9pbXBvcnRlZC93M2Mvd2ViLXBsYXRmb3JtLXRlc3RzL2VuY3J5cHRlZC1tZWRpYS9jbGVhcmtl
eS1tcDQtcGxheWJhY2stcGVyc2lzdGVudC1saWNlbnNlLWV2ZW50cy5odHRwcy1leHBlY3RlZC50
eHQgYi9MYXlvdXRUZXN0cy9wbGF0Zm9ybS93cGUvaW1wb3J0ZWQvdzNjL3dlYi1wbGF0Zm9ybS10
ZXN0cy9lbmNyeXB0ZWQtbWVkaWEvY2xlYXJrZXktbXA0LXBsYXliYWNrLXBlcnNpc3RlbnQtbGlj
ZW5zZS1ldmVudHMuaHR0cHMtZXhwZWN0ZWQudHh0CmluZGV4IGQxZmIxYjJlNzIxMmRkMWRiYjMz
ZmZiNmY5NGRlNWRlM2FmMGVhYTMuLjVjMjc2ZjNmYzVhNTQ3ZWZhNzdlMGZkZWY3MDgyMGE0YmE5
YjgwYzAgMTAwNjQ0Ci0tLSBhL0xheW91dFRlc3RzL3BsYXRmb3JtL3dwZS9pbXBvcnRlZC93M2Mv
d2ViLXBsYXRmb3JtLXRlc3RzL2VuY3J5cHRlZC1tZWRpYS9jbGVhcmtleS1tcDQtcGxheWJhY2st
cGVyc2lzdGVudC1saWNlbnNlLWV2ZW50cy5odHRwcy1leHBlY3RlZC50eHQKKysrIGIvTGF5b3V0
VGVzdHMvcGxhdGZvcm0vd3BlL2ltcG9ydGVkL3czYy93ZWItcGxhdGZvcm0tdGVzdHMvZW5jcnlw
dGVkLW1lZGlhL2NsZWFya2V5LW1wNC1wbGF5YmFjay1wZXJzaXN0ZW50LWxpY2Vuc2UtZXZlbnRz
Lmh0dHBzLWV4cGVjdGVkLnR4dApAQCAtMSwzICsxLDMgQEAKIAotRkFJTCBvcmcudzMuY2xlYXJr
ZXksIHBlcnNpc3RlbnQtbGljZW5zZSwgbXA0LCBwbGF5YmFjaywgY2hlY2sgZXZlbnRzIGFzc2Vy
dF9lcXVhbHM6IEV4cGVjdGVkIDFzdCBldmVudCB0byBiZSAnZ2VuZXJhdGVyZXF1ZXN0JyBleHBl
Y3RlZCAiZ2VuZXJhdGVyZXF1ZXN0IiBidXQgZ290ICJsaWNlbnNlLXJlcXVlc3QiCitGQUlMIG9y
Zy53My5jbGVhcmtleSwgcGVyc2lzdGVudC1saWNlbnNlLCBtcDQsIHBsYXliYWNrLCBjaGVjayBl
dmVudHMgYXNzZXJ0X2VxdWFsczogRXhwZWN0ZWQgMXN0IGV2ZW50IHRvIGJlICdnZW5lcmF0ZXJl
cXVlc3QnIGV4cGVjdGVkICJnZW5lcmF0ZXJlcXVlc3QiIGJ1dCBnb3QgInBsYXlpbmciCiAK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>357229</attachid>
            <date>2018-12-13 06:42:08 -0800</date>
            <delta_ts>2019-01-18 07:18:41 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-192229-20181213144206.patch</filename>
            <type>text/plain</type>
            <size>32697</size>
            <attacher name="Charlie Turner">cturner</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjM4NzkzCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggZDFhYzU2ZmY0YWMwMWFj
ZDE1MTk2NDI4YjY1MTYyMDU0ZjBiYjhiOS4uMTc2Y2ZjOWQ1YmQ5ZjU0MmE3M2QzYTllMGFiNzMw
YWI1Nzk3MjMzNSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDYyIEBACisyMDE4LTEyLTEzICBDaGFy
bGllIFR1cm5lciAgPGN0dXJuZXJAaWdhbGlhLmNvbT4KKworICAgICAgICBbR1N0cmVhbWVyXVtF
TUVdW0NsZWFyS2V5XSBSZXF1ZXN0IGtleXMgZnJvbSBDRE1JbnN0YW5jZSByYXRoZXIgdGhhbiBw
YXNzaW5nIHZpYSBidXMgbWVzc2FnZXMKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcv
c2hvd19idWcuY2dpP2lkPTE5MjIyOQorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09Q
UyEpLgorCisgICAgICAgIFJlZmFjdG9yaW5nLCBjb3ZlcmVkIGJ5IGV4aXN0aW5nIHRlc3RzLgor
CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvZ3N0cmVhbWVyL0dTdHJlYW1lckNvbW1vbi5o
OgorICAgICAgICAoV2ViQ29yZTo6R3N0TWFwcGVkQnVmZmVyOjp+R3N0TWFwcGVkQnVmZmVyKTog
QWRkIGV4dHJhIGNoZWNrIHRvCisgICAgICAgIGVuc3VyZSB0aGF0IGlmIEdTdHJlYW1lciByZW1v
dmVzIHRoZSBidWZmZXIgdXNpbmcgaXRzIG93bgorICAgICAgICByZWZjb3VudHMsIHdlIGRvbid0
IHRyeSBhbmQgZG91YmxlIGRlbGV0ZS4KKyAgICAgICAgKFdlYkNvcmU6OkdzdE1hcHBlZEJ1ZmZl
cjo6c2hhcmVkQnVmZmVyIGNvbnN0KTogQWRkIHV0aWxpdHkgdG8KKyAgICAgICAgZmFicmljYXRl
IGEgU2hhcmVkQnVmZmVyLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2dzdHJlYW1lci9N
ZWRpYVBsYXllclByaXZhdGVHU3RyZWFtZXJCYXNlLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6Ok1l
ZGlhUGxheWVyUHJpdmF0ZUdTdHJlYW1lckJhc2U6OmRpc3BhdGNoRGVjcnlwdGlvbktleSk6Cisg
ICAgICAgIERlbGV0ZWQsIG5vdCB1c2VkIGFueXdoZXJlLgorICAgICAgICAqIHBsYXRmb3JtL2dy
YXBoaWNzL2dzdHJlYW1lci9NZWRpYVBsYXllclByaXZhdGVHU3RyZWFtZXJCYXNlLmg6IERpdHRv
LgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2dzdHJlYW1lci9lbWUvV2ViS2l0Q2xlYXJL
ZXlEZWNyeXB0b3JHU3RyZWFtZXIuY3BwOgorICAgICAgICBNdWNoIG9mIHRoZSBjaGFuZ2VzIGFy
ZSBqdXN0IGNsZWFuaW5nIHVwIHRoZQorICAgICAgICBuYW1lc3BhY2VJblZhcmlhYmxlTmFtZXMg
c3R1ZmYuCisgICAgICAgICh3ZWJraXRfbWVkaWFfY2xlYXJfa2V5X2RlY3J5cHRfY2xhc3NfaW5p
dCk6IERpdHRvLgorICAgICAgICAoZmluYWxpemUpOiBEaXR0by4KKyAgICAgICAgKGhhbmRsZUtl
eVJlc3BvbnNlKTogRG93bmNhc3QgdGhlIENETUluc3RhbmNlIHJlY2VpdmVkIHRvCisgICAgICAg
IENsZWFyS2V5LiBOb3cgaXQgc2VlbXMgd2UgY2Fubm90IG1vZGlmeSBDRE1JbnN0YW5jZSBpbiB0
aGUgYmFzZQorICAgICAgICBjbGFzcyB0byBoZWxwIG91ciB1c2UgY2FzZXMsIHdlIHdpbGwgbmVl
ZCB0byBrZWVwIHRoZQorICAgICAgICBtdWx0aS1kZWNyeXB0b3IgYXJjaGl0ZWN0dXJlLgorICAg
ICAgICAoZmluZEFuZFNldEtleSk6CisgICAgICAgIChkZWNyeXB0KToKKyAgICAgICAgKHdlYktp
dE1lZGlhQ2xlYXJLZXlEZWNyeXB0b3JGaW5hbGl6ZSk6IERlbGV0ZWQuCisgICAgICAgICh3ZWJL
aXRNZWRpYUNsZWFyS2V5RGVjcnlwdG9ySGFuZGxlS2V5UmVzcG9uc2UpOiBEZWxldGVkLgorICAg
ICAgICAod2ViS2l0TWVkaWFDbGVhcktleURlY3J5cHRvckZpbmRBbmRTZXRLZXkpOiBEZWxldGVk
LgorICAgICAgICAod2ViS2l0TWVkaWFDbGVhcktleURlY3J5cHRvckRlY3J5cHQpOiBEZWxldGVk
LgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2dzdHJlYW1lci9lbWUvV2ViS2l0Q29tbW9u
RW5jcnlwdGlvbkRlY3J5cHRvckdTdHJlYW1lci5jcHA6CisgICAgICAgICh3ZWJraXRfbWVkaWFf
Y29tbW9uX2VuY3J5cHRpb25fZGVjcnlwdF9jbGFzc19pbml0KToKKyAgICAgICAgKGZpbmFsaXpl
KToKKyAgICAgICAgKHRyYW5zZm9ybUNhcHMpOgorICAgICAgICAodHJhbnNmb3JtSW5QbGFjZSk6
CisgICAgICAgIChpc0NETUluc3RhbmNlQXZhaWxhYmxlKToKKyAgICAgICAgKHNpbmtFdmVudEhh
bmRsZXIpOgorICAgICAgICAocXVlcnlIYW5kbGVyKToKKyAgICAgICAgKGNoYW5nZVN0YXRlKToK
KyAgICAgICAgKHNldENvbnRleHQpOgorICAgICAgICAod2ViS2l0TWVkaWFDb21tb25FbmNyeXB0
aW9uRGVjcnlwdG9yRmluYWxpemUpOiBEZWxldGVkLgorICAgICAgICAod2Via2l0TWVkaWFDb21t
b25FbmNyeXB0aW9uRGVjcnlwdFRyYW5zZm9ybUNhcHMpOiBEZWxldGVkLgorICAgICAgICAod2Vi
a2l0TWVkaWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdFRyYW5zZm9ybUluUGxhY2UpOiBEZWxldGVk
LgorICAgICAgICAod2Via2l0TWVkaWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdElzQ0RNSW5zdGFu
Y2VBdmFpbGFibGUpOiBEZWxldGVkLgorICAgICAgICAod2Via2l0TWVkaWFDb21tb25FbmNyeXB0
aW9uRGVjcnlwdFNpbmtFdmVudEhhbmRsZXIpOiBEZWxldGVkLgorICAgICAgICAod2Via2l0TWVk
aWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdG9yUXVlcnlIYW5kbGVyKTogRGVsZXRlZC4KKyAgICAg
ICAgKHdlYktpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5cHRvckNoYW5nZVN0YXRlKTogRGVs
ZXRlZC4KKyAgICAgICAgKHdlYktpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5cHRvclNldENv
bnRleHQpOiBEZWxldGVkLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2dzdHJlYW1lci9l
bWUvV2ViS2l0Q29tbW9uRW5jcnlwdGlvbkRlY3J5cHRvckdTdHJlYW1lci5oOgorICAgICAgICAq
IHBsYXRmb3JtL2dyYXBoaWNzL2dzdHJlYW1lci9tc2UvTWVkaWFQbGF5ZXJQcml2YXRlR1N0cmVh
bWVyTVNFLmNwcDoKKyAgICAgICAgTm93IHRoYXQgd2UgYXJlIHVzaW5nIHRoZSBDRE1DbGVhcktl
eTo6a2V5cygpIG1ldGhvZCwgbm8gbmVlZCBmb3IKKyAgICAgICAgdGhpcyByb3VuZHRyaXBwaW5n
IGFueW1vcmUuCisgICAgICAgIChXZWJDb3JlOjpNZWRpYVBsYXllclByaXZhdGVHU3RyZWFtZXJN
U0U6OmF0dGVtcHRUb0RlY3J5cHRXaXRoTG9jYWxJbnN0YW5jZSk6IERlbGV0ZWQuCisgICAgICAg
ICogcGxhdGZvcm0vZ3JhcGhpY3MvZ3N0cmVhbWVyL21zZS9NZWRpYVBsYXllclByaXZhdGVHU3Ry
ZWFtZXJNU0UuaDoKKwogMjAxOC0xMi0wMiAgWmFsYW4gQnVqdGFzICA8emFsYW5AYXBwbGUuY29t
PgogCiAgICAgICAgIEFkZCBhIHJ1bnRpbWUgZmVhdHVyZSBmbGFnIGZvciBMYXlvdXRGb3JtYXR0
aW5nQ29udGV4dC4KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L2dzdHJlYW1lci9HU3RyZWFtZXJDb21tb24uaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL2dzdHJlYW1lci9HU3RyZWFtZXJDb21tb24uaAppbmRleCA1ZDQ0ZDQ3NDAxYmM3MThj
ZWRlNDYyOTBlNjA5MTM3MTkwZjI3MDBmLi5iMWQ3ZDk4ZTY2NTA0YmYwNmRlNmU1NTgyMWE3YTY4
YmVhYjkwN2IxIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9n
c3RyZWFtZXIvR1N0cmVhbWVyQ29tbW9uLmgKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvZ3N0cmVhbWVyL0dTdHJlYW1lckNvbW1vbi5oCkBAIC0yMyw2ICsyMyw3IEBACiAj
aW5jbHVkZSAiRmxvYXRTaXplLmgiCiAjaW5jbHVkZSAiR1JlZlB0ckdTdHJlYW1lci5oIgogI2lu
Y2x1ZGUgIkdVbmlxdWVQdHJHU3RyZWFtZXIuaCIKKyNpbmNsdWRlICJTaGFyZWRCdWZmZXIuaCIK
ICNpbmNsdWRlIDxnc3QvZ3N0Lmg+CiAjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLWZvcm1hdC5o
PgogI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby1pbmZvLmg+CkBAIC0xMDIsMTYgKzEwMywxNSBA
QCBwdWJsaWM6CiAKICAgICB+R3N0TWFwcGVkQnVmZmVyKCkKICAgICB7Ci0gICAgICAgIGlmICht
X2lzVmFsaWQpCisgICAgICAgIGlmIChtX2lzVmFsaWQgJiYgR1NUX0lTX0JVRkZFUihtX2J1ZmZl
cikpCiAgICAgICAgICAgICBnc3RfYnVmZmVyX3VubWFwKG1fYnVmZmVyLCAmbV9pbmZvKTsKICAg
ICAgICAgbV9pc1ZhbGlkID0gZmFsc2U7CiAgICAgfQogCiAgICAgdWludDhfdCogZGF0YSgpIHsg
QVNTRVJUKG1faXNWYWxpZCk7IHJldHVybiBzdGF0aWNfY2FzdDx1aW50OF90Kj4obV9pbmZvLmRh
dGEpOyB9CiAgICAgY29uc3QgdWludDhfdCogZGF0YSgpIGNvbnN0IHsgQVNTRVJUKG1faXNWYWxp
ZCk7IHJldHVybiBzdGF0aWNfY2FzdDx1aW50OF90Kj4obV9pbmZvLmRhdGEpOyB9Ci0KICAgICBz
aXplX3Qgc2l6ZSgpIGNvbnN0IHsgQVNTRVJUKG1faXNWYWxpZCk7IHJldHVybiBzdGF0aWNfY2Fz
dDxzaXplX3Q+KG1faW5mby5zaXplKTsgfQotCisgICAgUmVmPFNoYXJlZEJ1ZmZlcj4gc2hhcmVk
QnVmZmVyKCkgY29uc3QgeyByZXR1cm4gU2hhcmVkQnVmZmVyOjpjcmVhdGUoZGF0YSgpLCBzaXpl
KCkpOyB9CiAgICAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIG1faXNW
YWxpZDsgfQogCiBwcml2YXRlOgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvZ3N0cmVhbWVyL01lZGlhUGxheWVyUHJpdmF0ZUdTdHJlYW1lckJhc2UuY3BwIGIv
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZ3N0cmVhbWVyL01lZGlhUGxheWVyUHJp
dmF0ZUdTdHJlYW1lckJhc2UuY3BwCmluZGV4IDg5N2YyOTIwMjVkZDRhYWMyNjVkZDliZGRmMmI3
NzgzODZjYjliNjEuLjc3NGZjM2UwMWVkYWQ0OWNmMGZhNDI3OWM5ZDQzZGJiN2JkMDJhNzMgMTAw
NjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2dzdHJlYW1lci9NZWRp
YVBsYXllclByaXZhdGVHU3RyZWFtZXJCYXNlLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9nc3RyZWFtZXIvTWVkaWFQbGF5ZXJQcml2YXRlR1N0cmVhbWVyQmFzZS5j
cHAKQEAgLTEyNTQsMTMgKzEyNTQsNiBAQCB2b2lkIE1lZGlhUGxheWVyUHJpdmF0ZUdTdHJlYW1l
ckJhc2U6OmF0dGVtcHRUb0RlY3J5cHRXaXRoTG9jYWxJbnN0YW5jZSgpCiAgICAgR1NUX0RFQlVH
KCJhdHRlbXB0aW5nIHRvIGRlY3J5cHQsIGV2ZW50IGhhbmRsZWQgJXMiLCBib29sRm9yUHJpbnRp
bmcoZXZlbnRIYW5kbGVkKSk7CiB9CiAKLXZvaWQgTWVkaWFQbGF5ZXJQcml2YXRlR1N0cmVhbWVy
QmFzZTo6ZGlzcGF0Y2hEZWNyeXB0aW9uS2V5KEdzdEJ1ZmZlciogYnVmZmVyKQotewotICAgIGJv
b2wgZXZlbnRIYW5kbGVkID0gZ3N0X2VsZW1lbnRfc2VuZF9ldmVudChwaXBlbGluZSgpLCBnc3Rf
ZXZlbnRfbmV3X2N1c3RvbShHU1RfRVZFTlRfQ1VTVE9NX0RPV05TVFJFQU1fT09CLAotICAgICAg
ICBnc3Rfc3RydWN0dXJlX25ldygiZHJtLWNpcGhlciIsICJrZXkiLCBHU1RfVFlQRV9CVUZGRVIs
IGJ1ZmZlciwgbnVsbHB0cikpKTsKLSAgICBHU1RfVFJBQ0UoImVtaXR0ZWQgZGVjcnlwdGlvbiBj
aXBoZXIga2V5IG9uIHBpcGVsaW5lLCBldmVudCBoYW5kbGVkICVzIiwgYm9vbEZvclByaW50aW5n
KGV2ZW50SGFuZGxlZCkpOwotfQotCiB2b2lkIE1lZGlhUGxheWVyUHJpdmF0ZUdTdHJlYW1lckJh
c2U6OmhhbmRsZVByb3RlY3Rpb25FdmVudChHc3RFdmVudCogZXZlbnQpCiB7CiAgICAgaWYgKG1f
aGFuZGxlZFByb3RlY3Rpb25FdmVudHMuY29udGFpbnMoR1NUX0VWRU5UX1NFUU5VTShldmVudCkp
KSB7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9nc3RyZWFt
ZXIvTWVkaWFQbGF5ZXJQcml2YXRlR1N0cmVhbWVyQmFzZS5oIGIvU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3MvZ3N0cmVhbWVyL01lZGlhUGxheWVyUHJpdmF0ZUdTdHJlYW1lckJhc2Uu
aAppbmRleCA0MjM4MWQyZjc3YjhjMTRjMTlkMDdhYTBmYzZkN2Y4NTljNjlmYWFhLi43NmFhNWNj
ZmQ4OTMxZjBjNDQwOTVkZmQwZDcwZjRhYThmMzFlNTljIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9nc3RyZWFtZXIvTWVkaWFQbGF5ZXJQcml2YXRlR1N0cmVh
bWVyQmFzZS5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2dzdHJlYW1l
ci9NZWRpYVBsYXllclByaXZhdGVHU3RyZWFtZXJCYXNlLmgKQEAgLTE0OCw3ICsxNDgsNiBAQCBw
dWJsaWM6CiAjaWYgRU5BQkxFKEVOQ1JZUFRFRF9NRURJQSkKICAgICB2b2lkIGNkbUluc3RhbmNl
QXR0YWNoZWQoQ0RNSW5zdGFuY2UmKSBvdmVycmlkZTsKICAgICB2b2lkIGNkbUluc3RhbmNlRGV0
YWNoZWQoQ0RNSW5zdGFuY2UmKSBvdmVycmlkZTsKLSAgICB2b2lkIGRpc3BhdGNoRGVjcnlwdGlv
bktleShHc3RCdWZmZXIqKTsKICAgICB2b2lkIGhhbmRsZVByb3RlY3Rpb25FdmVudChHc3RFdmVu
dCopOwogICAgIHZpcnR1YWwgdm9pZCBhdHRlbXB0VG9EZWNyeXB0V2l0aExvY2FsSW5zdGFuY2Uo
KTsKICAgICB2b2lkIGF0dGVtcHRUb0RlY3J5cHRXaXRoSW5zdGFuY2UoQ0RNSW5zdGFuY2UmKSBm
aW5hbDsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2dzdHJl
YW1lci9lbWUvV2ViS2l0Q2xlYXJLZXlEZWNyeXB0b3JHU3RyZWFtZXIuY3BwIGIvU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZ3N0cmVhbWVyL2VtZS9XZWJLaXRDbGVhcktleURlY3J5
cHRvckdTdHJlYW1lci5jcHAKaW5kZXggZjk0MWU1MjhmNDdjYmQwNjk1NzliYzVlNjMzNTgxZTZi
NjEwYzcyMy4uMWVlMTY4NGQzMTFmNWUyNzA4Yzc1NmFkNjRmN2YzZWFkMGY2NGQ4ZiAxMDA2NDQK
LS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZ3N0cmVhbWVyL2VtZS9XZWJL
aXRDbGVhcktleURlY3J5cHRvckdTdHJlYW1lci5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3MvZ3N0cmVhbWVyL2VtZS9XZWJLaXRDbGVhcktleURlY3J5cHRvckdTdHJl
YW1lci5jcHAKQEAgLTI0LDEyICsyNCwxNSBAQAogCiAjaWYgRU5BQkxFKEVOQ1JZUFRFRF9NRURJ
QSkgJiYgVVNFKEdTVFJFQU1FUikKIAorI2luY2x1ZGUgIkNETUNsZWFyS2V5LmgiCiAjaW5jbHVk
ZSAiR1N0cmVhbWVyQ29tbW9uLmgiCiAjaW5jbHVkZSAiR1N0cmVhbWVyRU1FVXRpbGl0aWVzLmgi
CiAjaW5jbHVkZSA8Z2NyeXB0Lmg+CiAjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0Ynl0ZXJlYWRlci5o
PgogI2luY2x1ZGUgPHd0Zi9SdW5Mb29wLmg+CiAKK3VzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOwor
CiAjZGVmaW5lIENMRUFSS0VZX1NJWkUgMTYKIAogc3RydWN0IEtleSB7CkBAIC0zOSwxMyArNDIs
MTQgQEAgc3RydWN0IEtleSB7CiAKICNkZWZpbmUgV0VCS0lUX01FRElBX0NLX0RFQ1JZUFRfR0VU
X1BSSVZBVEUob2JqKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9QUklWQVRFKChvYmopLCBXRUJLSVRf
VFlQRV9NRURJQV9DS19ERUNSWVBULCBXZWJLaXRNZWRpYUNsZWFyS2V5RGVjcnlwdFByaXZhdGUp
KQogc3RydWN0IF9XZWJLaXRNZWRpYUNsZWFyS2V5RGVjcnlwdFByaXZhdGUgeworICAgIFJlZlB0
cjxDRE1JbnN0YW5jZUNsZWFyS2V5PiBjZG1JbnN0YW5jZTsKICAgICBWZWN0b3I8S2V5PiBrZXlz
OwogICAgIGdjcnlfY2lwaGVyX2hkX3QgaGFuZGxlOwogfTsKIAotc3RhdGljIHZvaWQgd2ViS2l0
TWVkaWFDbGVhcktleURlY3J5cHRvckZpbmFsaXplKEdPYmplY3QqKTsKLXN0YXRpYyBnYm9vbGVh
biB3ZWJLaXRNZWRpYUNsZWFyS2V5RGVjcnlwdG9ySGFuZGxlS2V5UmVzcG9uc2UoV2ViS2l0TWVk
aWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdCogc2VsZiwgR3N0RXZlbnQqKTsKLXN0YXRpYyBnYm9v
bGVhbiB3ZWJLaXRNZWRpYUNsZWFyS2V5RGVjcnlwdG9yRGVjcnlwdChXZWJLaXRNZWRpYUNvbW1v
bkVuY3J5cHRpb25EZWNyeXB0KiwgR3N0QnVmZmVyKiBpdiwgR3N0QnVmZmVyKiBrZXlpZCwgR3N0
QnVmZmVyKiBzYW1wbGUsIHVuc2lnbmVkIHN1YlNhbXBsZXNDb3VudCwgR3N0QnVmZmVyKiBzdWJT
YW1wbGVzKTsKK3N0YXRpYyB2b2lkIGZpbmFsaXplKEdPYmplY3QqKTsKK3N0YXRpYyBib29sIGhh
bmRsZUtleVJlc3BvbnNlKFdlYktpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5cHQqIHNlbGYs
IFJlZlB0cjxDRE1JbnN0YW5jZT4pOworc3RhdGljIGJvb2wgZGVjcnlwdChXZWJLaXRNZWRpYUNv
bW1vbkVuY3J5cHRpb25EZWNyeXB0KiwgR3N0QnVmZmVyKiBpdiwgR3N0QnVmZmVyKiBrZXlpZCwg
R3N0QnVmZmVyKiBzYW1wbGUsIHVuc2lnbmVkIHN1YlNhbXBsZXNDb3VudCwgR3N0QnVmZmVyKiBz
dWJTYW1wbGVzKTsKIAogR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyh3ZWJraXRfbWVkaWFfY2xl
YXJfa2V5X2RlY3J5cHRfZGVidWdfY2F0ZWdvcnkpOwogI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQg
d2Via2l0X21lZGlhX2NsZWFyX2tleV9kZWNyeXB0X2RlYnVnX2NhdGVnb3J5CkBAIC02OSw3ICs3
Myw3IEBAIEdfREVGSU5FX1RZUEUoV2ViS2l0TWVkaWFDbGVhcktleURlY3J5cHQsIHdlYmtpdF9t
ZWRpYV9jbGVhcl9rZXlfZGVjcnlwdCwgV0VCS0lUCiBzdGF0aWMgdm9pZCB3ZWJraXRfbWVkaWFf
Y2xlYXJfa2V5X2RlY3J5cHRfY2xhc3NfaW5pdChXZWJLaXRNZWRpYUNsZWFyS2V5RGVjcnlwdENs
YXNzKiBrbGFzcykKIHsKICAgICBHT2JqZWN0Q2xhc3MqIGdvYmplY3RDbGFzcyA9IEdfT0JKRUNU
X0NMQVNTKGtsYXNzKTsKLSAgICBnb2JqZWN0Q2xhc3MtPmZpbmFsaXplID0gd2ViS2l0TWVkaWFD
bGVhcktleURlY3J5cHRvckZpbmFsaXplOworICAgIGdvYmplY3RDbGFzcy0+ZmluYWxpemUgPSBm
aW5hbGl6ZTsKIAogICAgIEdzdEVsZW1lbnRDbGFzcyogZWxlbWVudENsYXNzID0gR1NUX0VMRU1F
TlRfQ0xBU1Moa2xhc3MpOwogICAgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9wYWRfdGVtcGxhdGUo
ZWxlbWVudENsYXNzLCBnc3Rfc3RhdGljX3BhZF90ZW1wbGF0ZV9nZXQoJnNpbmtUZW1wbGF0ZSkp
OwpAQCAtODUsOSArODksOSBAQCBzdGF0aWMgdm9pZCB3ZWJraXRfbWVkaWFfY2xlYXJfa2V5X2Rl
Y3J5cHRfY2xhc3NfaW5pdChXZWJLaXRNZWRpYUNsZWFyS2V5RGVjcnlwdAogICAgICAgICAid2Vi
a2l0Y2xlYXJrZXkiLCAwLCAiQ2xlYXJLZXkgZGVjcnlwdG9yIik7CiAKICAgICBXZWJLaXRNZWRp
YUNvbW1vbkVuY3J5cHRpb25EZWNyeXB0Q2xhc3MqIGNlbmNDbGFzcyA9IFdFQktJVF9NRURJQV9D
RU5DX0RFQ1JZUFRfQ0xBU1Moa2xhc3MpOwotICAgIGNlbmNDbGFzcy0+cHJvdGVjdGlvblN5c3Rl
bUlkID0gV2ViQ29yZTo6R1N0cmVhbWVyRU1FVXRpbGl0aWVzOjpzX0NsZWFyS2V5VVVJRDsKLSAg
ICBjZW5jQ2xhc3MtPmhhbmRsZUtleVJlc3BvbnNlID0gR1NUX0RFQlVHX0ZVTkNQVFIod2ViS2l0
TWVkaWFDbGVhcktleURlY3J5cHRvckhhbmRsZUtleVJlc3BvbnNlKTsKLSAgICBjZW5jQ2xhc3Mt
PmRlY3J5cHQgPSBHU1RfREVCVUdfRlVOQ1BUUih3ZWJLaXRNZWRpYUNsZWFyS2V5RGVjcnlwdG9y
RGVjcnlwdCk7CisgICAgY2VuY0NsYXNzLT5wcm90ZWN0aW9uU3lzdGVtSWQgPSBHU3RyZWFtZXJF
TUVVdGlsaXRpZXM6OnNfQ2xlYXJLZXlVVUlEOworICAgIGNlbmNDbGFzcy0+aGFuZGxlS2V5UmVz
cG9uc2UgPSBHU1RfREVCVUdfRlVOQ1BUUihoYW5kbGVLZXlSZXNwb25zZSk7CisgICAgY2VuY0Ns
YXNzLT5kZWNyeXB0ID0gR1NUX0RFQlVHX0ZVTkNQVFIoZGVjcnlwdCk7CiAKICAgICBnX3R5cGVf
Y2xhc3NfYWRkX3ByaXZhdGUoa2xhc3MsIHNpemVvZihXZWJLaXRNZWRpYUNsZWFyS2V5RGVjcnlw
dFByaXZhdGUpKTsKIH0KQEAgLTEwNCw3ICsxMDgsNyBAQCBzdGF0aWMgdm9pZCB3ZWJraXRfbWVk
aWFfY2xlYXJfa2V5X2RlY3J5cHRfaW5pdChXZWJLaXRNZWRpYUNsZWFyS2V5RGVjcnlwdCogc2Vs
ZgogICAgIH0KIH0KIAotc3RhdGljIHZvaWQgd2ViS2l0TWVkaWFDbGVhcktleURlY3J5cHRvckZp
bmFsaXplKEdPYmplY3QqIG9iamVjdCkKK3N0YXRpYyB2b2lkIGZpbmFsaXplKEdPYmplY3QqIG9i
amVjdCkKIHsKICAgICBXZWJLaXRNZWRpYUNsZWFyS2V5RGVjcnlwdCogc2VsZiA9IFdFQktJVF9N
RURJQV9DS19ERUNSWVBUKG9iamVjdCk7CiAgICAgV2ViS2l0TWVkaWFDbGVhcktleURlY3J5cHRQ
cml2YXRlKiBwcml2ID0gc2VsZi0+cHJpdjsKQEAgLTExNCw2NSArMTE4LDMwIEBAIHN0YXRpYyB2
b2lkIHdlYktpdE1lZGlhQ2xlYXJLZXlEZWNyeXB0b3JGaW5hbGl6ZShHT2JqZWN0KiBvYmplY3Qp
CiAgICAgR1NUX0NBTExfUEFSRU5UKEdfT0JKRUNUX0NMQVNTLCBmaW5hbGl6ZSwgKG9iamVjdCkp
OwogfQogCi1zdGF0aWMgZ2Jvb2xlYW4gd2ViS2l0TWVkaWFDbGVhcktleURlY3J5cHRvckhhbmRs
ZUtleVJlc3BvbnNlKFdlYktpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5cHQqIHNlbGYsIEdz
dEV2ZW50KiBldmVudCkKK3N0YXRpYyBib29sIGhhbmRsZUtleVJlc3BvbnNlKFdlYktpdE1lZGlh
Q29tbW9uRW5jcnlwdGlvbkRlY3J5cHQqIHNlbGYsIFJlZlB0cjxDRE1JbnN0YW5jZT4gY2RtSW5z
dGFuY2UpCiB7CiAgICAgV2ViS2l0TWVkaWFDbGVhcktleURlY3J5cHRQcml2YXRlKiBwcml2ID0g
V0VCS0lUX01FRElBX0NLX0RFQ1JZUFRfR0VUX1BSSVZBVEUoV0VCS0lUX01FRElBX0NLX0RFQ1JZ
UFQoc2VsZikpOwotICAgIGNvbnN0IEdzdFN0cnVjdHVyZSogc3RydWN0dXJlID0gZ3N0X2V2ZW50
X2dldF9zdHJ1Y3R1cmUoZXZlbnQpOwotCi0gICAgLy8gRGVtYW5kIHRoZSBgZHJtLWNpcGhlci1j
bGVhcmtleWAgR3N0U3RydWN0dXJlLgotICAgIGlmICghZ3N0X3N0cnVjdHVyZV9oYXNfbmFtZShz
dHJ1Y3R1cmUsICJkcm0tY2lwaGVyLWNsZWFya2V5IikpCi0gICAgICAgIHJldHVybiBGQUxTRTsK
LQotICAgIC8vIFJldHJpZXZlIHRoZSBga2V5LWlkc2AgR1N0cmVhbWVyIHZhbHVlIGxpc3QuCi0g
ICAgY29uc3QgR1ZhbHVlKiBrZXlJRHNMaXN0ID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUoc3Ry
dWN0dXJlLCAia2V5LWlkcyIpOwotICAgIEFTU0VSVChrZXlJRHNMaXN0ICYmIEdTVF9WQUxVRV9I
T0xEU19MSVNUKGtleUlEc0xpc3QpKTsKLSAgICB1bnNpZ25lZCBrZXlJRHNMaXN0U2l6ZSA9IGdz
dF92YWx1ZV9saXN0X2dldF9zaXplKGtleUlEc0xpc3QpOwotCi0gICAgLy8gUmV0cmlldmUgdGhl
IGBrZXktdmFsdWVzYCBHU3RyZWFtZXIgdmFsdWUgbGlzdC4KLSAgICBjb25zdCBHVmFsdWUqIGtl
eVZhbHVlc0xpc3QgPSBnc3Rfc3RydWN0dXJlX2dldF92YWx1ZShzdHJ1Y3R1cmUsICJrZXktdmFs
dWVzIik7Ci0gICAgQVNTRVJUKGtleVZhbHVlc0xpc3QgJiYgR1NUX1ZBTFVFX0hPTERTX0xJU1Qo
a2V5VmFsdWVzTGlzdCkpOwotICAgIHVuc2lnbmVkIGtleVZhbHVlc0xpc3RTaXplID0gZ3N0X3Zh
bHVlX2xpc3RfZ2V0X3NpemUoa2V5VmFsdWVzTGlzdCk7Ci0KLSAgICAvLyBCYWlsIGlmIHNvbWVo
b3cgdGhlIHR3byBsaXN0cyBkb24ndCBtYXRjaCBpbiBzaXplLgotICAgIGlmIChrZXlJRHNMaXN0
U2l6ZSAhPSBrZXlWYWx1ZXNMaXN0U2l6ZSkKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAg
Ly8gQ2xlYXIgb3V0IHRoZSBwcmV2aW91cyBsaXN0IG9mIGtleXMuCi0gICAgcHJpdi0+a2V5cy5j
bGVhcigpOwotCi0gICAgLy8gQXBwZW5kIHRoZSByZXRyaWV2ZWQgR3N0QnVmZmVyIG9iamVjdHMg
Y29udGFpbmluZyBlYWNoIGtleSdzIElEIGFuZCB2YWx1ZSB0byB0aGUgbGlzdCBvZiBLZXkgb2Jq
ZWN0cy4KLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwga2V5SURzTGlzdFNpemU7ICsraSkg
ewotICAgICAgICBHUmVmUHRyPEdzdEJ1ZmZlcj4ga2V5SURCdWZmZXIoZ3N0X3ZhbHVlX2dldF9i
dWZmZXIoZ3N0X3ZhbHVlX2xpc3RfZ2V0X3ZhbHVlKGtleUlEc0xpc3QsIGkpKSk7Ci0gICAgICAg
IEdSZWZQdHI8R3N0QnVmZmVyPiBrZXlWYWx1ZUJ1ZmZlcihnc3RfdmFsdWVfZ2V0X2J1ZmZlcihn
c3RfdmFsdWVfbGlzdF9nZXRfdmFsdWUoa2V5VmFsdWVzTGlzdCwgaSkpKTsKLSAgICAgICAgcHJp
di0+a2V5cy5hcHBlbmQoS2V5IHsgV1RGTW92ZShrZXlJREJ1ZmZlciksIFdURk1vdmUoa2V5VmFs
dWVCdWZmZXIpIH0pOwotICAgIH0KLQotICAgIHJldHVybiBUUlVFOworICAgIHByaXYtPmNkbUlu
c3RhbmNlID0gZG93bmNhc3Q8Q0RNSW5zdGFuY2VDbGVhcktleT4oY2RtSW5zdGFuY2UuZ2V0KCkp
OworICAgIHJldHVybiBwcml2LT5jZG1JbnN0YW5jZTsKIH0KIAotc3RhdGljIGdib29sZWFuIHdl
YktpdE1lZGlhQ2xlYXJLZXlEZWNyeXB0b3JGaW5kQW5kU2V0S2V5KFdlYktpdE1lZGlhQ2xlYXJL
ZXlEZWNyeXB0UHJpdmF0ZSogcHJpdiwgY29uc3QgV2ViQ29yZTo6R3N0TWFwcGVkQnVmZmVyJiBr
ZXlJREJ1ZmZlcikKK3N0YXRpYyBib29sIGZpbmRBbmRTZXRLZXkoV2ViS2l0TWVkaWFDbGVhcktl
eURlY3J5cHRQcml2YXRlKiBwcml2LCBjb25zdCBSZWY8U2hhcmVkQnVmZmVyPiBrZXlJRCkKIHsK
LSAgICBHUmVmUHRyPEdzdEJ1ZmZlcj4ga2V5QnVmZmVyOwotICAgIGZvciAoYXV0byYga2V5IDog
cHJpdi0+a2V5cykgewotICAgICAgICBpZiAoa2V5LmtleUlELmdldCgpID09IGtleUlEQnVmZmVy
KSB7Ci0gICAgICAgICAgICBrZXlCdWZmZXIgPSBrZXkua2V5VmFsdWU7CisgICAgUmVmUHRyPFNo
YXJlZEJ1ZmZlcj4ga2V5VmFsdWU7CisgICAgZm9yIChhdXRvJiBrZXkgOiBwcml2LT5jZG1JbnN0
YW5jZS0+a2V5cygpKSB7CisgICAgICAgIGlmICgqa2V5LmtleUlERGF0YSA9PSBrZXlJRCkgewor
ICAgICAgICAgICAga2V5VmFsdWUgPSBrZXkua2V5VmFsdWVEYXRhOwogICAgICAgICAgICAgYnJl
YWs7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoIWtleUJ1ZmZlcikgewotICAgICAgICBH
U1RfRVJST1JfT0JKRUNUKHByaXYsICJGYWlsZWQgdG8gZmluZCBhbiBhcHByb3ByaWF0ZSBrZXkg
YnVmZmVyIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBXZWJDb3JlOjpH
c3RNYXBwZWRCdWZmZXIgbWFwcGVkS2V5VmFsdWVCdWZmZXIoa2V5QnVmZmVyLmdldCgpLCBHU1Rf
TUFQX1JFQUQpOwotICAgIGlmICghbWFwcGVkS2V5VmFsdWVCdWZmZXIpIHsKLSAgICAgICAgR1NU
X0VSUk9SX09CSkVDVChwcml2LCAiRmFpbGVkIHRvIG1hcCBkZWNyeXB0aW9uIGtleSIpOworICAg
IGlmICgha2V5VmFsdWUpIHsKKyAgICAgICAgR1NUX0VSUk9SX09CSkVDVChwcml2LCAiRmFpbGVk
IHRvIGZpbmQgYW4gYXBwcm9wcmlhdGUga2V5Iik7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAg
ICB9CiAKLSAgICBBU1NFUlQobWFwcGVkS2V5VmFsdWVCdWZmZXIuc2l6ZSgpID09IENMRUFSS0VZ
X1NJWkUpOwotICAgIGlmIChnY3J5X2Vycm9yX3QgZXJyb3IgPSBnY3J5X2NpcGhlcl9zZXRrZXko
cHJpdi0+aGFuZGxlLCBtYXBwZWRLZXlWYWx1ZUJ1ZmZlci5kYXRhKCksIG1hcHBlZEtleVZhbHVl
QnVmZmVyLnNpemUoKSkpIHsKKyAgICBBU1NFUlQoa2V5VmFsdWUuc2l6ZSgpID09IENMRUFSS0VZ
X1NJWkUpOworICAgIGlmIChnY3J5X2Vycm9yX3QgZXJyb3IgPSBnY3J5X2NpcGhlcl9zZXRrZXko
cHJpdi0+aGFuZGxlLCBrZXlWYWx1ZS0+ZGF0YSgpLCBrZXlWYWx1ZS0+c2l6ZSgpKSkgewogICAg
ICAgICBHU1RfRVJST1JfT0JKRUNUKHByaXYsICJnY3J5X2NpcGhlcl9zZXRrZXkgZmFpbGVkOiAl
cyIsIGdwZ19zdHJlcnJvcihlcnJvcikpOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQpA
QCAtMTgwLDcgKzE0OSw3IEBAIHN0YXRpYyBnYm9vbGVhbiB3ZWJLaXRNZWRpYUNsZWFyS2V5RGVj
cnlwdG9yRmluZEFuZFNldEtleShXZWJLaXRNZWRpYUNsZWFyS2V5RGVjCiAgICAgcmV0dXJuIHRy
dWU7CiB9CiAKLXN0YXRpYyBnYm9vbGVhbiB3ZWJLaXRNZWRpYUNsZWFyS2V5RGVjcnlwdG9yRGVj
cnlwdChXZWJLaXRNZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNyeXB0KiBzZWxmLCBHc3RCdWZmZXIq
IGl2QnVmZmVyLCBHc3RCdWZmZXIqIGtleUlEQnVmZmVyLCBHc3RCdWZmZXIqIGJ1ZmZlciwgdW5z
aWduZWQgc3ViU2FtcGxlQ291bnQsIEdzdEJ1ZmZlciogc3ViU2FtcGxlc0J1ZmZlcikKK3N0YXRp
YyBib29sIGRlY3J5cHQoV2ViS2l0TWVkaWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdCogc2VsZiwg
R3N0QnVmZmVyKiBpdkJ1ZmZlciwgR3N0QnVmZmVyKiBrZXlJREJ1ZmZlciwgR3N0QnVmZmVyKiBi
dWZmZXIsIHVuc2lnbmVkIHN1YlNhbXBsZUNvdW50LCBHc3RCdWZmZXIqIHN1YlNhbXBsZXNCdWZm
ZXIpCiB7CiAgICAgLy8gQ2hlY2sgaXZCdWZmZXIgaXNuJ3QgbnVsbC4KICAgICBpZiAoIWl2QnVm
ZmVyKSB7CkBAIC0xODgsNyArMTU3LDcgQEAgc3RhdGljIGdib29sZWFuIHdlYktpdE1lZGlhQ2xl
YXJLZXlEZWNyeXB0b3JEZWNyeXB0KFdlYktpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkQKICAgICAg
ICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIFdlYkNvcmU6OkdzdE1hcHBlZEJ1ZmZlciBt
YXBwZWRJVkJ1ZmZlcihpdkJ1ZmZlciwgR1NUX01BUF9SRUFEKTsKKyAgICBHc3RNYXBwZWRCdWZm
ZXIgbWFwcGVkSVZCdWZmZXIoaXZCdWZmZXIsIEdTVF9NQVBfUkVBRCk7CiAgICAgaWYgKCFtYXBw
ZWRJVkJ1ZmZlcikgewogICAgICAgICBHU1RfRVJST1JfT0JKRUNUKHNlbGYsICJGYWlsZWQgdG8g
bWFwIElWIik7CiAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTIxNiwxOSArMTg1LDE5IEBAIHN0
YXRpYyBnYm9vbGVhbiB3ZWJLaXRNZWRpYUNsZWFyS2V5RGVjcnlwdG9yRGVjcnlwdChXZWJLaXRN
ZWRpYUNvbW1vbkVuY3J5cHRpb25ECiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAg
ICBXZWJDb3JlOjpHc3RNYXBwZWRCdWZmZXIgbWFwcGVkS2V5SWRCdWZmZXIoa2V5SURCdWZmZXIs
IEdTVF9NQVBfUkVBRCk7CisgICAgR3N0TWFwcGVkQnVmZmVyIG1hcHBlZEtleUlkQnVmZmVyKGtl
eUlEQnVmZmVyLCBHU1RfTUFQX1JFQUQpOwogICAgIGlmICghbWFwcGVkS2V5SWRCdWZmZXIpIHsK
ICAgICAgICAgR1NUX0VSUk9SX09CSkVDVChzZWxmLCAiRmFpbGVkIHRvIG1hcCBrZXkgaWQgYnVm
ZmVyIik7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBXZWJDb3JlOjpHc3RN
YXBwZWRCdWZmZXIgbWFwcGVkQnVmZmVyKGJ1ZmZlciwgR1NUX01BUF9SRUFEV1JJVEUpOworICAg
IEdzdE1hcHBlZEJ1ZmZlciBtYXBwZWRCdWZmZXIoYnVmZmVyLCBHU1RfTUFQX1JFQURXUklURSk7
CiAgICAgaWYgKCFtYXBwZWRCdWZmZXIpIHsKICAgICAgICAgR1NUX0VSUk9SX09CSkVDVChzZWxm
LCAiRmFpbGVkIHRvIG1hcCBidWZmZXIiKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0K
IAotICAgIHdlYktpdE1lZGlhQ2xlYXJLZXlEZWNyeXB0b3JGaW5kQW5kU2V0S2V5KHByaXYsIG1h
cHBlZEtleUlkQnVmZmVyKTsKKyAgICBmaW5kQW5kU2V0S2V5KHByaXYsIG1hcHBlZEtleUlkQnVm
ZmVyLnNoYXJlZEJ1ZmZlcigpKTsKIAogICAgIHVuc2lnbmVkIHBvc2l0aW9uID0gMDsKICAgICB1
bnNpZ25lZCBzYW1wbGVJbmRleCA9IDA7CkBAIC0yNDgsMTQgKzIxNywxMiBAQCBzdGF0aWMgZ2Jv
b2xlYW4gd2ViS2l0TWVkaWFDbGVhcktleURlY3J5cHRvckRlY3J5cHQoV2ViS2l0TWVkaWFDb21t
b25FbmNyeXB0aW9uRAogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKLSAgICAvLyBDaGVj
ayBzdWJTYW1wbGVzQnVmZmVyIGlzbid0IG51bGwuCiAgICAgaWYgKCFzdWJTYW1wbGVzQnVmZmVy
KSB7CiAgICAgICAgIEdTVF9FUlJPUl9PQkpFQ1Qoc2VsZiwgIkVycm9yLCB0aGUgc3ViU2FtcGxl
QnVmZmVyIGlzIG51bGwiKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIC8v
IFN1YnNhbXBsZSBlbmNyeXB0aW9uLgotICAgIFdlYkNvcmU6OkdzdE1hcHBlZEJ1ZmZlciBtYXBw
ZWRTdWJTYW1wbGVzQnVmZmVyKHN1YlNhbXBsZXNCdWZmZXIsIEdTVF9NQVBfUkVBRCk7CisgICAg
R3N0TWFwcGVkQnVmZmVyIG1hcHBlZFN1YlNhbXBsZXNCdWZmZXIoc3ViU2FtcGxlc0J1ZmZlciwg
R1NUX01BUF9SRUFEKTsKICAgICBpZiAoIW1hcHBlZFN1YlNhbXBsZXNCdWZmZXIpIHsKICAgICAg
ICAgR1NUX0VSUk9SX09CSkVDVChzZWxmLCAiRmFpbGVkIHRvIG1hcCBzdWJzYW1wbGUgYnVmZmVy
Iik7CiAgICAgICAgIHJldHVybiBmYWxzZTsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL2dzdHJlYW1lci9lbWUvV2ViS2l0Q29tbW9uRW5jcnlwdGlvbkRlY3J5
cHRvckdTdHJlYW1lci5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9nc3Ry
ZWFtZXIvZW1lL1dlYktpdENvbW1vbkVuY3J5cHRpb25EZWNyeXB0b3JHU3RyZWFtZXIuY3BwCmlu
ZGV4IDE3ZmQ0OGNjOTU5MWU4MTRlNmEzOWI0NzI1ZjA4ZjkwOTgwZTVmNjEuLmZjNjk2ODU4MjUx
OGY1ZWZlYTIzMmQ2NWZjOTZlOTAzMjNiYjU4ZGMgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL2dzdHJlYW1lci9lbWUvV2ViS2l0Q29tbW9uRW5jcnlwdGlvbkRl
Y3J5cHRvckdTdHJlYW1lci5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvZ3N0cmVhbWVyL2VtZS9XZWJLaXRDb21tb25FbmNyeXB0aW9uRGVjcnlwdG9yR1N0cmVhbWVy
LmNwcApAQCAtMjYsNyArMjYsNyBAQAogI2lmIEVOQUJMRShFTkNSWVBURURfTUVESUEpICYmIFVT
RShHU1RSRUFNRVIpCiAKICNpbmNsdWRlICJHU3RyZWFtZXJDb21tb24uaCIKLSNpbmNsdWRlIDxD
RE1JbnN0YW5jZS5oPgorI2luY2x1ZGUgIkdTdHJlYW1lckVNRVV0aWxpdGllcy5oIgogI2luY2x1
ZGUgPHd0Zi9Db25kaXRpb24uaD4KICNpbmNsdWRlIDx3dGYvUHJpbnRTdHJlYW0uaD4KICNpbmNs
dWRlIDx3dGYvUnVuTG9vcC5oPgpAQCAtMzcsMjAgKzM3LDIxIEBAIHVzaW5nIFdlYkNvcmU6OkNE
TUluc3RhbmNlOwogc3RydWN0IF9XZWJLaXRNZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNyeXB0UHJp
dmF0ZSB7CiAgICAgR1JlZlB0cjxHc3RFdmVudD4gcHJvdGVjdGlvbkV2ZW50OwogICAgIFJlZlB0
cjxDRE1JbnN0YW5jZT4gY2RtSW5zdGFuY2U7Ci0gICAgYm9vbCBrZXlSZWNlaXZlZDsKKyAgICBi
b29sIGtleVJlY2VpdmVkIHsgZmFsc2UgfTsKICAgICBib29sIHdhaXRpbmdGb3JLZXkgeyBmYWxz
ZSB9OwogICAgIExvY2sgbXV0ZXg7CiAgICAgQ29uZGl0aW9uIGNvbmRpdGlvbjsKIH07CiAKLXN0
YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybiB3ZWJLaXRNZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNy
eXB0b3JDaGFuZ2VTdGF0ZShHc3RFbGVtZW50KiwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7
Ci1zdGF0aWMgdm9pZCB3ZWJLaXRNZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNyeXB0b3JTZXRDb250
ZXh0KEdzdEVsZW1lbnQqLCBHc3RDb250ZXh0Kik7Ci1zdGF0aWMgdm9pZCB3ZWJLaXRNZWRpYUNv
bW1vbkVuY3J5cHRpb25EZWNyeXB0b3JGaW5hbGl6ZShHT2JqZWN0Kik7Ci1zdGF0aWMgR3N0Q2Fw
cyogd2Via2l0TWVkaWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdFRyYW5zZm9ybUNhcHMoR3N0QmFz
ZVRyYW5zZm9ybSosIEdzdFBhZERpcmVjdGlvbiwgR3N0Q2FwcyosIEdzdENhcHMqKTsKLXN0YXRp
YyBHc3RGbG93UmV0dXJuIHdlYmtpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5cHRUcmFuc2Zv
cm1JblBsYWNlKEdzdEJhc2VUcmFuc2Zvcm0qLCBHc3RCdWZmZXIqKTsKLXN0YXRpYyBnYm9vbGVh
biB3ZWJraXRNZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNyeXB0U2lua0V2ZW50SGFuZGxlcihHc3RC
YXNlVHJhbnNmb3JtKiwgR3N0RXZlbnQqKTsKLXN0YXRpYyBnYm9vbGVhbiB3ZWJraXRNZWRpYUNv
bW1vbkVuY3J5cHRpb25EZWNyeXB0b3JRdWVyeUhhbmRsZXIoR3N0QmFzZVRyYW5zZm9ybSosIEdz
dFBhZERpcmVjdGlvbiwgR3N0UXVlcnkqKTsKLXN0YXRpYyBib29sIHdlYmtpdE1lZGlhQ29tbW9u
RW5jcnlwdGlvbkRlY3J5cHRJc0NETUluc3RhbmNlQXZhaWxhYmxlKFdlYktpdE1lZGlhQ29tbW9u
RW5jcnlwdGlvbkRlY3J5cHQqKTsKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybiBjaGFuZ2VT
dGF0ZShHc3RFbGVtZW50KiwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CitzdGF0aWMgdm9p
ZCBmaW5hbGl6ZShHT2JqZWN0Kik7CitzdGF0aWMgR3N0Q2FwcyogdHJhbnNmb3JtQ2FwcyhHc3RC
YXNlVHJhbnNmb3JtKiwgR3N0UGFkRGlyZWN0aW9uLCBHc3RDYXBzKiwgR3N0Q2FwcyopOworc3Rh
dGljIEdzdEZsb3dSZXR1cm4gdHJhbnNmb3JtSW5QbGFjZShHc3RCYXNlVHJhbnNmb3JtKiwgR3N0
QnVmZmVyKik7CitzdGF0aWMgZ2Jvb2xlYW4gc2lua0V2ZW50SGFuZGxlcihHc3RCYXNlVHJhbnNm
b3JtKiwgR3N0RXZlbnQqKTsKK3N0YXRpYyBnYm9vbGVhbiBxdWVyeUhhbmRsZXIoR3N0QmFzZVRy
YW5zZm9ybSosIEdzdFBhZERpcmVjdGlvbiwgR3N0UXVlcnkqKTsKK3N0YXRpYyBib29sIGlzQ0RN
SW5zdGFuY2VBdmFpbGFibGUoV2ViS2l0TWVkaWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdCopOwor
c3RhdGljIHZvaWQgc2V0Q29udGV4dChHc3RFbGVtZW50KiwgR3N0Q29udGV4dCopOworCiAKIEdT
VF9ERUJVR19DQVRFR09SWV9TVEFUSUMod2Via2l0X21lZGlhX2NvbW1vbl9lbmNyeXB0aW9uX2Rl
Y3J5cHRfZGVidWdfY2F0ZWdvcnkpOwogI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgd2Via2l0X21l
ZGlhX2NvbW1vbl9lbmNyeXB0aW9uX2RlY3J5cHRfZGVidWdfY2F0ZWdvcnkKQEAgLTYxLDIxICs2
MiwyMSBAQCBHX0RFRklORV9UWVBFKFdlYktpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5cHQs
IHdlYmtpdF9tZWRpYV9jb21tb25fZW5jcnlwdGlvbgogc3RhdGljIHZvaWQgd2Via2l0X21lZGlh
X2NvbW1vbl9lbmNyeXB0aW9uX2RlY3J5cHRfY2xhc3NfaW5pdChXZWJLaXRNZWRpYUNvbW1vbkVu
Y3J5cHRpb25EZWNyeXB0Q2xhc3MqIGtsYXNzKQogewogICAgIEdPYmplY3RDbGFzcyogZ29iamVj
dENsYXNzID0gR19PQkpFQ1RfQ0xBU1Moa2xhc3MpOwotICAgIGdvYmplY3RDbGFzcy0+ZmluYWxp
emUgPSB3ZWJLaXRNZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNyeXB0b3JGaW5hbGl6ZTsKKyAgICBn
b2JqZWN0Q2xhc3MtPmZpbmFsaXplID0gZmluYWxpemU7CiAKICAgICBHU1RfREVCVUdfQ0FURUdP
UllfSU5JVCh3ZWJraXRfbWVkaWFfY29tbW9uX2VuY3J5cHRpb25fZGVjcnlwdF9kZWJ1Z19jYXRl
Z29yeSwKICAgICAgICAgIndlYmtpdGNlbmMiLCAwLCAiQ29tbW9uIEVuY3J5cHRpb24gYmFzZSBj
bGFzcyIpOwogCiAgICAgR3N0RWxlbWVudENsYXNzKiBlbGVtZW50Q2xhc3MgPSBHU1RfRUxFTUVO
VF9DTEFTUyhrbGFzcyk7Ci0gICAgZWxlbWVudENsYXNzLT5jaGFuZ2Vfc3RhdGUgPSBHU1RfREVC
VUdfRlVOQ1BUUih3ZWJLaXRNZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNyeXB0b3JDaGFuZ2VTdGF0
ZSk7Ci0gICAgZWxlbWVudENsYXNzLT5zZXRfY29udGV4dCA9IEdTVF9ERUJVR19GVU5DUFRSKHdl
YktpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5cHRvclNldENvbnRleHQpOworICAgIGVsZW1l
bnRDbGFzcy0+Y2hhbmdlX3N0YXRlID0gR1NUX0RFQlVHX0ZVTkNQVFIoY2hhbmdlU3RhdGUpOwor
ICAgIGVsZW1lbnRDbGFzcy0+c2V0X2NvbnRleHQgPSBHU1RfREVCVUdfRlVOQ1BUUihzZXRDb250
ZXh0KTsKIAogICAgIEdzdEJhc2VUcmFuc2Zvcm1DbGFzcyogYmFzZVRyYW5zZm9ybUNsYXNzID0g
R1NUX0JBU0VfVFJBTlNGT1JNX0NMQVNTKGtsYXNzKTsKLSAgICBiYXNlVHJhbnNmb3JtQ2xhc3Mt
PnRyYW5zZm9ybV9pcCA9IEdTVF9ERUJVR19GVU5DUFRSKHdlYmtpdE1lZGlhQ29tbW9uRW5jcnlw
dGlvbkRlY3J5cHRUcmFuc2Zvcm1JblBsYWNlKTsKLSAgICBiYXNlVHJhbnNmb3JtQ2xhc3MtPnRy
YW5zZm9ybV9jYXBzID0gR1NUX0RFQlVHX0ZVTkNQVFIod2Via2l0TWVkaWFDb21tb25FbmNyeXB0
aW9uRGVjcnlwdFRyYW5zZm9ybUNhcHMpOworICAgIGJhc2VUcmFuc2Zvcm1DbGFzcy0+dHJhbnNm
b3JtX2lwID0gR1NUX0RFQlVHX0ZVTkNQVFIodHJhbnNmb3JtSW5QbGFjZSk7CisgICAgYmFzZVRy
YW5zZm9ybUNsYXNzLT50cmFuc2Zvcm1fY2FwcyA9IEdTVF9ERUJVR19GVU5DUFRSKHRyYW5zZm9y
bUNhcHMpOwogICAgIGJhc2VUcmFuc2Zvcm1DbGFzcy0+dHJhbnNmb3JtX2lwX29uX3Bhc3N0aHJv
dWdoID0gRkFMU0U7Ci0gICAgYmFzZVRyYW5zZm9ybUNsYXNzLT5zaW5rX2V2ZW50ID0gR1NUX0RF
QlVHX0ZVTkNQVFIod2Via2l0TWVkaWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdFNpbmtFdmVudEhh
bmRsZXIpOwotICAgIGJhc2VUcmFuc2Zvcm1DbGFzcy0+cXVlcnkgPSBHU1RfREVCVUdfRlVOQ1BU
Uih3ZWJraXRNZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNyeXB0b3JRdWVyeUhhbmRsZXIpOworICAg
IGJhc2VUcmFuc2Zvcm1DbGFzcy0+c2lua19ldmVudCA9IEdTVF9ERUJVR19GVU5DUFRSKHNpbmtF
dmVudEhhbmRsZXIpOworICAgIGJhc2VUcmFuc2Zvcm1DbGFzcy0+cXVlcnkgPSBHU1RfREVCVUdf
RlVOQ1BUUihxdWVyeUhhbmRsZXIpOwogCiAgICAgZ190eXBlX2NsYXNzX2FkZF9wcml2YXRlKGts
YXNzLCBzaXplb2YoV2ViS2l0TWVkaWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdFByaXZhdGUpKTsK
IH0KQEAgLTkzLDcgKzk0LDcgQEAgc3RhdGljIHZvaWQgd2Via2l0X21lZGlhX2NvbW1vbl9lbmNy
eXB0aW9uX2RlY3J5cHRfaW5pdChXZWJLaXRNZWRpYUNvbW1vbkVuY3J5cHQKICAgICBnc3RfYmFz
ZV90cmFuc2Zvcm1fc2V0X2dhcF9hd2FyZShiYXNlLCBGQUxTRSk7CiB9CiAKLXN0YXRpYyB2b2lk
IHdlYktpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5cHRvckZpbmFsaXplKEdPYmplY3QqIG9i
amVjdCkKK3N0YXRpYyB2b2lkIGZpbmFsaXplKEdPYmplY3QqIG9iamVjdCkKIHsKICAgICBXZWJL
aXRNZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNyeXB0KiBzZWxmID0gV0VCS0lUX01FRElBX0NFTkNf
REVDUllQVChvYmplY3QpOwogICAgIFdlYktpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5cHRQ
cml2YXRlKiBwcml2ID0gc2VsZi0+cHJpdjsKQEAgLTEwMiw3ICsxMDMsNyBAQCBzdGF0aWMgdm9p
ZCB3ZWJLaXRNZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNyeXB0b3JGaW5hbGl6ZShHT2JqZWN0KiBv
YmplY3QpCiAgICAgR1NUX0NBTExfUEFSRU5UKEdfT0JKRUNUX0NMQVNTLCBmaW5hbGl6ZSwgKG9i
amVjdCkpOwogfQogCi1zdGF0aWMgR3N0Q2Fwcyogd2Via2l0TWVkaWFDb21tb25FbmNyeXB0aW9u
RGVjcnlwdFRyYW5zZm9ybUNhcHMoR3N0QmFzZVRyYW5zZm9ybSogYmFzZSwgR3N0UGFkRGlyZWN0
aW9uIGRpcmVjdGlvbiwgR3N0Q2FwcyogY2FwcywgR3N0Q2FwcyogZmlsdGVyKQorc3RhdGljIEdz
dENhcHMqIHRyYW5zZm9ybUNhcHMoR3N0QmFzZVRyYW5zZm9ybSogYmFzZSwgR3N0UGFkRGlyZWN0
aW9uIGRpcmVjdGlvbiwgR3N0Q2FwcyogY2FwcywgR3N0Q2FwcyogZmlsdGVyKQogewogICAgIGlm
IChkaXJlY3Rpb24gPT0gR1NUX1BBRF9VTktOT1dOKQogICAgICAgICByZXR1cm4gbnVsbHB0cjsK
QEAgLTE5Nyw3ICsxOTgsNyBAQCBzdGF0aWMgR3N0Q2Fwcyogd2Via2l0TWVkaWFDb21tb25FbmNy
eXB0aW9uRGVjcnlwdFRyYW5zZm9ybUNhcHMoR3N0QmFzZVRyYW5zZm9ybQogICAgIHJldHVybiB0
cmFuc2Zvcm1lZENhcHM7CiB9CiAKLXN0YXRpYyBHc3RGbG93UmV0dXJuIHdlYmtpdE1lZGlhQ29t
bW9uRW5jcnlwdGlvbkRlY3J5cHRUcmFuc2Zvcm1JblBsYWNlKEdzdEJhc2VUcmFuc2Zvcm0qIGJh
c2UsIEdzdEJ1ZmZlciogYnVmZmVyKQorc3RhdGljIEdzdEZsb3dSZXR1cm4gdHJhbnNmb3JtSW5Q
bGFjZShHc3RCYXNlVHJhbnNmb3JtKiBiYXNlLCBHc3RCdWZmZXIqIGJ1ZmZlcikKIHsKICAgICBX
ZWJLaXRNZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNyeXB0KiBzZWxmID0gV0VCS0lUX01FRElBX0NF
TkNfREVDUllQVChiYXNlKTsKICAgICBXZWJLaXRNZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNyeXB0
UHJpdmF0ZSogcHJpdiA9IFdFQktJVF9NRURJQV9DRU5DX0RFQ1JZUFRfR0VUX1BSSVZBVEUoc2Vs
Zik7CkBAIC0zMDIsNyArMzAzLDcgQEAgc3RhdGljIEdzdEZsb3dSZXR1cm4gd2Via2l0TWVkaWFD
b21tb25FbmNyeXB0aW9uRGVjcnlwdFRyYW5zZm9ybUluUGxhY2UoR3N0QmFzZVQKICAgICByZXR1
cm4gR1NUX0ZMT1dfT0s7CiB9CiAKLXN0YXRpYyBib29sIHdlYmtpdE1lZGlhQ29tbW9uRW5jcnlw
dGlvbkRlY3J5cHRJc0NETUluc3RhbmNlQXZhaWxhYmxlKFdlYktpdE1lZGlhQ29tbW9uRW5jcnlw
dGlvbkRlY3J5cHQqIHNlbGYpCitzdGF0aWMgYm9vbCBpc0NETUluc3RhbmNlQXZhaWxhYmxlKFdl
YktpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5cHQqIHNlbGYpCiB7CiAgICAgV2ViS2l0TWVk
aWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdFByaXZhdGUqIHByaXYgPSBXRUJLSVRfTUVESUFfQ0VO
Q19ERUNSWVBUX0dFVF9QUklWQVRFKHNlbGYpOwogCkBAIC0zMTcsMTkgKzMxOCwyMiBAQCBzdGF0
aWMgYm9vbCB3ZWJraXRNZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNyeXB0SXNDRE1JbnN0YW5jZUF2
YWlsYWJsZShXZWJLaXRNZWRpYQogICAgICAgICAvLyByZXF1ZXN0cyBhcmUgdXNlZnVsIGhlcmUu
CiAgICAgICAgIGlmIChjb250ZXh0KSB7CiAgICAgICAgICAgICBjb25zdCBHVmFsdWUqIHZhbHVl
ID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUoZ3N0X2NvbnRleHRfZ2V0X3N0cnVjdHVyZShjb250
ZXh0LmdldCgpKSwgImNkbS1pbnN0YW5jZSIpOwotICAgICAgICAgICAgcHJpdi0+Y2RtSW5zdGFu
Y2UgPSB2YWx1ZSA/IHJlaW50ZXJwcmV0X2Nhc3Q8Q0RNSW5zdGFuY2UqPihnX3ZhbHVlX2dldF9w
b2ludGVyKHZhbHVlKSkgOiBudWxscHRyOworICAgICAgICAgICAgLy8gQ2FwdHVyZSB0aGUgQ0RN
SW5zdGFuY2UgaW50byBhIHNlcGFyYXRlIHZhcmlhYmxlIHRvIGF2b2lkIG1pc3NpbmcgYSByZWZj
b3VudC4KKyAgICAgICAgICAgIENETUluc3RhbmNlKiBpbnN0YW5jZSA9IHZhbHVlID8gcmVpbnRl
cnByZXRfY2FzdDxDRE1JbnN0YW5jZSo+KGdfdmFsdWVfZ2V0X3BvaW50ZXIodmFsdWUpKSA6IG51
bGxwdHI7CisgICAgICAgICAgICAvLyAuLi4gQW5kIGZvcmNlIGEgcmVmY291bnQgYnVtcCB1c2lu
ZyBvcGVyYXRvcj0uCisgICAgICAgICAgICBwcml2LT5jZG1JbnN0YW5jZSA9IGluc3RhbmNlOwog
ICAgICAgICAgICAgaWYgKHByaXYtPmNkbUluc3RhbmNlKQotICAgICAgICAgICAgICAgIEdTVF9E
RUJVR19PQkpFQ1Qoc2VsZiwgInJlY2VpdmVkIG5ldyBDRE1JbnN0YW5jZSAlcCIsIHByaXYtPmNk
bUluc3RhbmNlLmdldCgpKTsKKyAgICAgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUKHNlbGYs
ICJyZWNlaXZlZCBhIG5ldyBDRE0gaW5zdGFuY2UgJXAsIHJlZmNvdW50ICV1IiwgcHJpdi0+Y2Rt
SW5zdGFuY2UuZ2V0KCksIHByaXYtPmNkbUluc3RhbmNlLT5yZWZDb3VudCgpKTsKICAgICAgICAg
ICAgIGVsc2UKLSAgICAgICAgICAgICAgICBHU1RfVFJBQ0VfT0JKRUNUKHNlbGYsICJmb3JtZXIg
aW5zdGFuY2Ugd2FzIGRldGFjaGVkIik7CisgICAgICAgICAgICAgICAgR1NUX1RSQUNFX09CSkVD
VChzZWxmLCAiQ0RNIGluc3RhbmNlIHdhcyBkZXRhY2hlZCIpOwogICAgICAgICB9CiAgICAgfQog
Ci0gICAgR1NUX1RSQUNFX09CSkVDVChzZWxmLCAiQ0RNSW5zdGFuY2UgYXZhaWxhYmxlICVzIiwg
Ym9vbEZvclByaW50aW5nKHByaXYtPmNkbUluc3RhbmNlLmdldCgpKSk7CisgICAgR1NUX1RSQUNF
X09CSkVDVChzZWxmLCAiQ0RNIGluc3RhbmNlIGF2YWlsYWJsZSAlcyIsIGJvb2xGb3JQcmludGlu
Zyhwcml2LT5jZG1JbnN0YW5jZS5nZXQoKSkpOwogICAgIHJldHVybiBwcml2LT5jZG1JbnN0YW5j
ZTsKIH0KIAotc3RhdGljIGdib29sZWFuIHdlYmtpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5
cHRTaW5rRXZlbnRIYW5kbGVyKEdzdEJhc2VUcmFuc2Zvcm0qIHRyYW5zLCBHc3RFdmVudCogZXZl
bnQpCitzdGF0aWMgZ2Jvb2xlYW4gc2lua0V2ZW50SGFuZGxlcihHc3RCYXNlVHJhbnNmb3JtKiB0
cmFucywgR3N0RXZlbnQqIGV2ZW50KQogewogICAgIFdlYktpdE1lZGlhQ29tbW9uRW5jcnlwdGlv
bkRlY3J5cHQqIHNlbGYgPSBXRUJLSVRfTUVESUFfQ0VOQ19ERUNSWVBUKHRyYW5zKTsKICAgICBX
ZWJLaXRNZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNyeXB0UHJpdmF0ZSogcHJpdiA9IFdFQktJVF9N
RURJQV9DRU5DX0RFQ1JZUFRfR0VUX1BSSVZBVEUoc2VsZik7CkBAIC0zNDUsMTMgKzM0OSwxMyBA
QCBzdGF0aWMgZ2Jvb2xlYW4gd2Via2l0TWVkaWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdFNpbmtF
dmVudEhhbmRsZXIoR3N0QmFzZVRyYW5zZgogICAgICAgICAvLyBldmVudHMgd2lsbCBub3QgYmUg
aGFuZGxlZCBieSB0aGUgZGVtdXhlciwgc28gdGhlIG11c3QgYmUKICAgICAgICAgLy8gaGFuZGxl
ZCBpbiBoZXJlLgogICAgICAgICBMb2NrSG9sZGVyIGxvY2tlcihwcml2LT5tdXRleCk7Ci0gICAg
ICAgIGlmICghd2Via2l0TWVkaWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdElzQ0RNSW5zdGFuY2VB
dmFpbGFibGUoc2VsZikpIHsKKyAgICAgICAgaWYgKCFpc0NETUluc3RhbmNlQXZhaWxhYmxlKHNl
bGYpKSB7CiAgICAgICAgICAgICBHU1RfRVJST1JfT0JKRUNUKHNlbGYsICJObyBDRE0gaW5zdGFu
Y2UgYXZhaWxhYmxlIik7CiAgICAgICAgICAgICByZXN1bHQgPSBGQUxTRTsKICAgICAgICAgICAg
IGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKGtsYXNzLT5oYW5kbGVLZXlSZXNwb25z
ZShzZWxmLCBldmVudCkpIHsKKyAgICAgICAgaWYgKGtsYXNzLT5oYW5kbGVLZXlSZXNwb25zZShz
ZWxmLCBwcml2LT5jZG1JbnN0YW5jZSkpIHsKICAgICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1Qo
c2VsZiwgImtleSByZWNlaXZlZCIpOwogICAgICAgICAgICAgcHJpdi0+a2V5UmVjZWl2ZWQgPSB0
cnVlOwogICAgICAgICAgICAgcHJpdi0+Y29uZGl0aW9uLm5vdGlmeU9uZSgpOwpAQCAtMzY5LDcg
KzM3Myw3IEBAIHN0YXRpYyBnYm9vbGVhbiB3ZWJraXRNZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNy
eXB0U2lua0V2ZW50SGFuZGxlcihHc3RCYXNlVHJhbnNmCiAgICAgcmV0dXJuIHJlc3VsdDsKIH0K
IAotc3RhdGljIGdib29sZWFuIHdlYmtpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5cHRvclF1
ZXJ5SGFuZGxlcihHc3RCYXNlVHJhbnNmb3JtKiB0cmFucywgR3N0UGFkRGlyZWN0aW9uIGRpcmVj
dGlvbiwgR3N0UXVlcnkqIHF1ZXJ5KQorc3RhdGljIGdib29sZWFuIHF1ZXJ5SGFuZGxlcihHc3RC
YXNlVHJhbnNmb3JtKiB0cmFucywgR3N0UGFkRGlyZWN0aW9uIGRpcmVjdGlvbiwgR3N0UXVlcnkq
IHF1ZXJ5KQogewogICAgIGlmIChnc3Rfc3RydWN0dXJlX2hhc19uYW1lKGdzdF9xdWVyeV9nZXRf
c3RydWN0dXJlKHF1ZXJ5KSwgImFueS1kZWNyeXB0b3Itd2FpdGluZy1mb3Ita2V5IikpIHsKICAg
ICAgICAgV2ViS2l0TWVkaWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdFByaXZhdGUqIHByaXYgPSBX
RUJLSVRfTUVESUFfQ0VOQ19ERUNSWVBUX0dFVF9QUklWQVRFKHRyYW5zKTsKQEAgLTM3OSw3ICsz
ODMsNyBAQCBzdGF0aWMgZ2Jvb2xlYW4gd2Via2l0TWVkaWFDb21tb25FbmNyeXB0aW9uRGVjcnlw
dG9yUXVlcnlIYW5kbGVyKEdzdEJhc2VUcmFuc2ZvcgogICAgIHJldHVybiBHU1RfQkFTRV9UUkFO
U0ZPUk1fQ0xBU1MocGFyZW50X2NsYXNzKS0+cXVlcnkodHJhbnMsIGRpcmVjdGlvbiwgcXVlcnkp
OwogfQogCi1zdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gd2ViS2l0TWVkaWFDb21tb25FbmNy
eXB0aW9uRGVjcnlwdG9yQ2hhbmdlU3RhdGUoR3N0RWxlbWVudCogZWxlbWVudCwgR3N0U3RhdGVD
aGFuZ2UgdHJhbnNpdGlvbikKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybiBjaGFuZ2VTdGF0
ZShHc3RFbGVtZW50KiBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKQogewogICAg
IFdlYktpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5cHQqIHNlbGYgPSBXRUJLSVRfTUVESUFf
Q0VOQ19ERUNSWVBUKGVsZW1lbnQpOwogICAgIFdlYktpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRl
Y3J5cHRQcml2YXRlKiBwcml2ID0gV0VCS0lUX01FRElBX0NFTkNfREVDUllQVF9HRVRfUFJJVkFU
RShzZWxmKTsKQEAgLTQwMCw3ICs0MDQsNyBAQCBzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4g
d2ViS2l0TWVkaWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdG9yQ2hhbmdlU3RhdGUoR3N0RQogICAg
IHJldHVybiByZXN1bHQ7CiB9CiAKLXN0YXRpYyB2b2lkIHdlYktpdE1lZGlhQ29tbW9uRW5jcnlw
dGlvbkRlY3J5cHRvclNldENvbnRleHQoR3N0RWxlbWVudCogZWxlbWVudCwgR3N0Q29udGV4dCog
Y29udGV4dCkKK3N0YXRpYyB2b2lkIHNldENvbnRleHQoR3N0RWxlbWVudCogZWxlbWVudCwgR3N0
Q29udGV4dCogY29udGV4dCkKIHsKICAgICBXZWJLaXRNZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNy
eXB0KiBzZWxmID0gV0VCS0lUX01FRElBX0NFTkNfREVDUllQVChlbGVtZW50KTsKICAgICBXZWJL
aXRNZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNyeXB0UHJpdmF0ZSogcHJpdiA9IFdFQktJVF9NRURJ
QV9DRU5DX0RFQ1JZUFRfR0VUX1BSSVZBVEUoc2VsZik7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9nc3RyZWFtZXIvZW1lL1dlYktpdENvbW1vbkVuY3J5cHRp
b25EZWNyeXB0b3JHU3RyZWFtZXIuaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L2dzdHJlYW1lci9lbWUvV2ViS2l0Q29tbW9uRW5jcnlwdGlvbkRlY3J5cHRvckdTdHJlYW1lci5o
CmluZGV4IDIyMjExMjU0ZWI3ZDllZjU0NjYwNTdmZDdkNTQzNDIxOWVjZWYyZGQuLjgyOTlkMzlk
MmVjMDYwMTJiOGUyMWNlYjFhZWNjNjc5Mjc2ZTg1NjcgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL2dzdHJlYW1lci9lbWUvV2ViS2l0Q29tbW9uRW5jcnlwdGlv
bkRlY3J5cHRvckdTdHJlYW1lci5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL2dzdHJlYW1lci9lbWUvV2ViS2l0Q29tbW9uRW5jcnlwdGlvbkRlY3J5cHRvckdTdHJlYW1l
ci5oCkBAIC0yNCw2ICsyNCw3IEBACiAKICNpZiBFTkFCTEUoRU5DUllQVEVEX01FRElBKSAmJiBV
U0UoR1NUUkVBTUVSKQogCisjaW5jbHVkZSA8Q0RNSW5zdGFuY2UuaD4KICNpbmNsdWRlIDxnc3Qv
YmFzZS9nc3RiYXNldHJhbnNmb3JtLmg+CiAjaW5jbHVkZSA8Z3N0L2dzdC5oPgogCkBAIC01Myw4
ICs1NCw4IEBAIHN0cnVjdCBfV2ViS2l0TWVkaWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdENsYXNz
IHsKICAgICBHc3RCYXNlVHJhbnNmb3JtQ2xhc3MgcGFyZW50Q2xhc3M7CiAKICAgICBjb25zdCBj
aGFyKiBwcm90ZWN0aW9uU3lzdGVtSWQ7Ci0gICAgZ2Jvb2xlYW4gKCpoYW5kbGVLZXlSZXNwb25z
ZSkoV2ViS2l0TWVkaWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdCosIEdzdEV2ZW50KiBldmVudCk7
Ci0gICAgZ2Jvb2xlYW4gKCpkZWNyeXB0KShXZWJLaXRNZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNy
eXB0KiwgR3N0QnVmZmVyKiBpdkJ1ZmZlciwgR3N0QnVmZmVyKiBrZXlJREJ1ZmZlciwgR3N0QnVm
ZmVyKiBidWZmZXIsIHVuc2lnbmVkIHN1YlNhbXBsZXNDb3VudCwgR3N0QnVmZmVyKiBzdWJTYW1w
bGVzQnVmZmVyKTsKKyAgICBib29sICgqaGFuZGxlS2V5UmVzcG9uc2UpKFdlYktpdE1lZGlhQ29t
bW9uRW5jcnlwdGlvbkRlY3J5cHQqLCBSZWZQdHI8V2ViQ29yZTo6Q0RNSW5zdGFuY2U+KTsKKyAg
ICBib29sICgqZGVjcnlwdCkoV2ViS2l0TWVkaWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdCosIEdz
dEJ1ZmZlciogaXZCdWZmZXIsIEdzdEJ1ZmZlcioga2V5SURCdWZmZXIsIEdzdEJ1ZmZlciogYnVm
ZmVyLCB1bnNpZ25lZCBzdWJTYW1wbGVzQ291bnQsIEdzdEJ1ZmZlciogc3ViU2FtcGxlc0J1ZmZl
cik7CiB9OwogCiBHX0VORF9ERUNMUwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvZ3N0cmVhbWVyL21zZS9NZWRpYVBsYXllclByaXZhdGVHU3RyZWFtZXJNU0Uu
Y3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZ3N0cmVhbWVyL21zZS9NZWRp
YVBsYXllclByaXZhdGVHU3RyZWFtZXJNU0UuY3BwCmluZGV4IGI2M2U1ZGVlZTcyYzk1YzQ5ZDg1
NmRjNTQ3MGJhYWIzZjYxNDllOGMuLmFhOTFhOTk2OWU5Y2IwODdiMjZkOGU4MGEzNWRmYzlhNDFl
YWE1NTAgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2dzdHJl
YW1lci9tc2UvTWVkaWFQbGF5ZXJQcml2YXRlR1N0cmVhbWVyTVNFLmNwcAorKysgYi9Tb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9nc3RyZWFtZXIvbXNlL01lZGlhUGxheWVyUHJpdmF0
ZUdTdHJlYW1lck1TRS5jcHAKQEAgLTU1LDExICs1NSw2IEBACiAjaW5jbHVkZSA8d3RmL3RleHQv
QXRvbWljU3RyaW5nLmg+CiAjaW5jbHVkZSA8d3RmL3RleHQvQXRvbWljU3RyaW5nSGFzaC5oPgog
Ci0jaWYgRU5BQkxFKEVOQ1JZUFRFRF9NRURJQSkKLSNpbmNsdWRlICJDRE1DbGVhcktleS5oIgot
I2luY2x1ZGUgIlNoYXJlZEJ1ZmZlci5oIgotI2VuZGlmCi0KIHN0YXRpYyBjb25zdCBjaGFyKiBk
dW1wUmVhZHlTdGF0ZShXZWJDb3JlOjpNZWRpYVBsYXllcjo6UmVhZHlTdGF0ZSByZWFkeVN0YXRl
KQogewogICAgIHN3aXRjaCAocmVhZHlTdGF0ZSkgewpAQCAtOTA4LDQyICs5MDMsNiBAQCBNZWRp
YVRpbWUgTWVkaWFQbGF5ZXJQcml2YXRlR1N0cmVhbWVyTVNFOjptYXhNZWRpYVRpbWVTZWVrYWJs
ZSgpIGNvbnN0CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotI2lmIEVOQUJMRShFTkNSWVBURURf
TUVESUEpCi12b2lkIE1lZGlhUGxheWVyUHJpdmF0ZUdTdHJlYW1lck1TRTo6YXR0ZW1wdFRvRGVj
cnlwdFdpdGhMb2NhbEluc3RhbmNlKCkKLXsKLSAgICBpZiAoaXM8Q0RNSW5zdGFuY2VDbGVhcktl
eT4oKm1fY2RtSW5zdGFuY2UpKSB7Ci0gICAgICAgIGF1dG8mIGNsZWFya2V5Q0RNSW5zdGFuY2Ug
PSBkb3duY2FzdDxDRE1JbnN0YW5jZUNsZWFyS2V5PigqbV9jZG1JbnN0YW5jZSk7Ci0gICAgICAg
IGlmIChjbGVhcmtleUNETUluc3RhbmNlLmtleXMoKS5pc0VtcHR5KCkpCi0gICAgICAgICAgICBy
ZXR1cm47Ci0KLSAgICAgICAgR1ZhbHVlIGtleUlETGlzdCA9IEdfVkFMVUVfSU5JVCwga2V5VmFs
dWVMaXN0ID0gR19WQUxVRV9JTklUOwotICAgICAgICBnX3ZhbHVlX2luaXQoJmtleUlETGlzdCwg
R1NUX1RZUEVfTElTVCk7Ci0gICAgICAgIGdfdmFsdWVfaW5pdCgma2V5VmFsdWVMaXN0LCBHU1Rf
VFlQRV9MSVNUKTsKLQotICAgICAgICBhdXRvIGFwcGVuZEJ1ZmZlciA9Ci0gICAgICAgICAgICBb
XShHVmFsdWUqIHZhbHVlTGlzdCwgY29uc3QgU2hhcmVkQnVmZmVyJiBidWZmZXIpCi0gICAgICAg
ICAgICB7Ci0gICAgICAgICAgICAgICAgR1ZhbHVlKiBidWZmZXJWYWx1ZSA9IGdfbmV3MChHVmFs
dWUsIDEpOwotICAgICAgICAgICAgICAgIGdfdmFsdWVfaW5pdChidWZmZXJWYWx1ZSwgR1NUX1RZ
UEVfQlVGRkVSKTsKLSAgICAgICAgICAgICAgICBnc3RfdmFsdWVfdGFrZV9idWZmZXIoYnVmZmVy
VmFsdWUsCi0gICAgICAgICAgICAgICAgICAgIGdzdF9idWZmZXJfbmV3X3dyYXBwZWQoZ19tZW1k
dXAoYnVmZmVyLmRhdGEoKSwgYnVmZmVyLnNpemUoKSksIGJ1ZmZlci5zaXplKCkpKTsKLSAgICAg
ICAgICAgICAgICBnc3RfdmFsdWVfbGlzdF9hcHBlbmRfYW5kX3Rha2VfdmFsdWUodmFsdWVMaXN0
LCBidWZmZXJWYWx1ZSk7Ci0gICAgICAgICAgICB9OwotCi0gICAgICAgIGZvciAoYXV0byYga2V5
IDogY2xlYXJrZXlDRE1JbnN0YW5jZS5rZXlzKCkpIHsKLSAgICAgICAgICAgIGFwcGVuZEJ1ZmZl
cigma2V5SURMaXN0LCAqa2V5LmtleUlERGF0YSk7Ci0gICAgICAgICAgICBhcHBlbmRCdWZmZXIo
JmtleVZhbHVlTGlzdCwgKmtleS5rZXlWYWx1ZURhdGEpOwotICAgICAgICB9Ci0KLSAgICAgICAg
R1VuaXF1ZVB0cjxHc3RTdHJ1Y3R1cmU+IHN0cnVjdHVyZShnc3Rfc3RydWN0dXJlX25ld19lbXB0
eSgiZHJtLWNpcGhlci1jbGVhcmtleSIpKTsKLSAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXRfdmFs
dWUoc3RydWN0dXJlLmdldCgpLCAia2V5LWlkcyIsICZrZXlJRExpc3QpOwotICAgICAgICBnc3Rf
c3RydWN0dXJlX3NldF92YWx1ZShzdHJ1Y3R1cmUuZ2V0KCksICJrZXktdmFsdWVzIiwgJmtleVZh
bHVlTGlzdCk7Ci0KLSAgICAgICAgZ3N0X2VsZW1lbnRfc2VuZF9ldmVudChtX3BsYXliYWNrUGlw
ZWxpbmUtPnBpcGVsaW5lKCksIGdzdF9ldmVudF9uZXdfY3VzdG9tKEdTVF9FVkVOVF9DVVNUT01f
RE9XTlNUUkVBTV9PT0IsIHN0cnVjdHVyZS5yZWxlYXNlKCkpKTsKLSAgICB9Ci19Ci0jZW5kaWYK
LQogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZS4KIAogI2VuZGlmIC8vIFVTRShHU1RSRUFNRVIpCmRp
ZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9nc3RyZWFtZXIvbXNl
L01lZGlhUGxheWVyUHJpdmF0ZUdTdHJlYW1lck1TRS5oIGIvU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvZ3N0cmVhbWVyL21zZS9NZWRpYVBsYXllclByaXZhdGVHU3RyZWFtZXJNU0Uu
aAppbmRleCA1YjU2ODJmNjRiNWQzNTQ5NGU4MzliN2EzOTQ0YmE3ZTQwOWVmYzE4Li4yZGZhNzMy
ZmNiZjI2YmE2ODdmMWE5ODE0YWI3NjYzZWVmOTg1NDc0IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9nc3RyZWFtZXIvbXNlL01lZGlhUGxheWVyUHJpdmF0ZUdT
dHJlYW1lck1TRS5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2dzdHJl
YW1lci9tc2UvTWVkaWFQbGF5ZXJQcml2YXRlR1N0cmVhbWVyTVNFLmgKQEAgLTg1LDEwICs4NSw2
IEBAIHB1YmxpYzoKICAgICBzdGF0aWMgYm9vbCBzdXBwb3J0c0NvZGVjKFN0cmluZyBjb2RlYyk7
CiAgICAgc3RhdGljIGJvb2wgc3VwcG9ydHNBbGxDb2RlY3MoY29uc3QgVmVjdG9yPFN0cmluZz4m
IGNvZGVjcyk7CiAKLSNpZiBFTkFCTEUoRU5DUllQVEVEX01FRElBKQotICAgIHZvaWQgYXR0ZW1w
dFRvRGVjcnlwdFdpdGhMb2NhbEluc3RhbmNlKCkgZmluYWw7Ci0jZW5kaWYKLQogcHJpdmF0ZToK
ICAgICBzdGF0aWMgdm9pZCBnZXRTdXBwb3J0ZWRUeXBlcyhIYXNoU2V0PFN0cmluZywgQVNDSUlD
YXNlSW5zZW5zaXRpdmVIYXNoPiYpOwogICAgIHN0YXRpYyBNZWRpYVBsYXllcjo6U3VwcG9ydHNU
eXBlIHN1cHBvcnRzVHlwZShjb25zdCBNZWRpYUVuZ2luZVN1cHBvcnRQYXJhbWV0ZXJzJik7CmRp
ZmYgLS1naXQgYS9Ub29scy9DaGFuZ2VMb2cgYi9Ub29scy9DaGFuZ2VMb2cKaW5kZXggYzFlYTQ0
Y2UxMWMwOGI3YzZiM2FkMzVmMGVlMDk5NjQyZTM4YzUyOS4uZDVkMDA3YjgzYWY1MDZiYzI2YmEw
ZWQ2NGUwZjgyMzU0MmQ2YTMxMiAxMDA2NDQKLS0tIGEvVG9vbHMvQ2hhbmdlTG9nCisrKyBiL1Rv
b2xzL0NoYW5nZUxvZwpAQCAtMSwzICsxLDEzIEBACisyMDE4LTEyLTEzICBDaGFybGllIFR1cm5l
ciAgPGN0dXJuZXJAaWdhbGlhLmNvbT4KKworICAgICAgICBbR1N0cmVhbWVyXVtFTUVdW0NsZWFy
S2V5XSBSZXF1ZXN0IGtleXMgZnJvbSBDRE1JbnN0YW5jZSByYXRoZXIgdGhhbiBwYXNzaW5nIHZp
YSBidXMgbWVzc2FnZXMKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcu
Y2dpP2lkPTE5MjIyOQorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisg
ICAgICAgICogTWluaUJyb3dzZXIvd3BlL21haW4uY3BwOgorICAgICAgICAobWFpbik6IEVuYWJs
ZSBlbmNyeXB0ZWQtbWVkaWEgYnkgZGVmYXVsdC4KKwogMjAxOC0xMi0wMSAgRG9uIE9sbXN0ZWFk
ICA8ZG9uLm9sbXN0ZWFkQHNvbnkuY29tPgogCiAgICAgICAgIENsZWFudXAgV2ViS2l0IEZlYXR1
cmVzCmRpZmYgLS1naXQgYS9Ub29scy9NaW5pQnJvd3Nlci93cGUvbWFpbi5jcHAgYi9Ub29scy9N
aW5pQnJvd3Nlci93cGUvbWFpbi5jcHAKaW5kZXggZTBjMjliMjEyOTkzNDM3MTI3NGE2ZjI1NDUx
ZWFlOTgyMWM0Njg5Zi4uNWM0NDhhOGUwNzEyNjE4OWYzNDExY2U3MTAxMGZiZmQ2MjkxMWVlMCAx
MDA2NDQKLS0tIGEvVG9vbHMvTWluaUJyb3dzZXIvd3BlL21haW4uY3BwCisrKyBiL1Rvb2xzL01p
bmlCcm93c2VyL3dwZS9tYWluLmNwcApAQCAtMTc3LDYgKzE3Nyw3IEBAIGludCBtYWluKGludCBh
cmdjLCBjaGFyICphcmd2W10pCiAgICAgICAgICJlbmFibGUtZGV2ZWxvcGVyLWV4dHJhcyIsIFRS
VUUsCiAgICAgICAgICJlbmFibGUtd2ViZ2wiLCBUUlVFLAogICAgICAgICAiZW5hYmxlLW1lZGlh
LXN0cmVhbSIsIFRSVUUsCisgICAgICAgICJlbmFibGUtZW5jcnlwdGVkLW1lZGlhIiwgVFJVRSwK
ICAgICAgICAgbnVsbHB0cik7CiAKICAgICBhdXRvKiB3ZWJWaWV3ID0gV0VCS0lUX1dFQl9WSUVX
KGdfb2JqZWN0X25ldyhXRUJLSVRfVFlQRV9XRUJfVklFVywK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>359479</attachid>
            <date>2019-01-18 07:18:46 -0800</date>
            <delta_ts>2019-01-18 07:20:20 -0800</delta_ts>
            <desc>Patch for landing</desc>
            <filename>bug-192229-20190118151845.patch</filename>
            <type>text/plain</type>
            <size>31133</size>
            <attacher name="Charlie Turner">cturner</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjQwMTQwCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggNzIyM2ZjNWZkNzgyOGU5
MWE1MWVkOGU0OGY3ZTdjZWFjMzBlZDk2Ni4uODY5NzM3ZTVhOTI1NjM3ZDczYTRlYTExNTIzODBh
NzVkY2Q4OGE2OSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDU2IEBACisyMDE5LTAxLTE4ICBDaGFy
bGllIFR1cm5lciAgPGN0dXJuZXJAaWdhbGlhLmNvbT4KKworICAgICAgICBOZWVkIGEgc2hvcnQg
ZGVzY3JpcHRpb24gKE9PUFMhKS4KKyAgICAgICAgTmVlZCB0aGUgYnVnIFVSTCAoT09QUyEpLgor
CisgICAgICAgIFJldmlld2VkIGJ5IFhhYmllciBSb2RyaWd1ZXotQ2FsdmFyLgorCisgICAgICAg
IE5vIG5ldyB0ZXN0cyAoT09QUyEpLgorCisgICAgICAgICogcGxhdGZvcm0vZW5jcnlwdGVkbWVk
aWEvY2xlYXJrZXkvQ0RNQ2xlYXJLZXkuY3BwOgorICAgICAgICAoV2ViQ29yZTo6cGFyc2VMaWNl
bnNlRm9ybWF0KTogVGhlcmUgaXMgYSBkZWZlY3QgaW4gc29tZSBDKysxMQorICAgICAgICBjb21w
aWxlcyB3aGVyZSB0aGV5IHdpbGwgY29weSB0aGlzIHJldHVybiB2YWx1ZSBzaW5jZSB0aGUgdHlw
ZQorICAgICAgICBkb2Vzbid0IGV4YWN0bHkgbWF0Y2guIEZvcmNlIGEgbW92ZSB3aXRoIFdURk1v
dmUuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvZ3N0cmVhbWVyL01lZGlhUGxheWVyUHJp
dmF0ZUdTdHJlYW1lckJhc2UuY3BwOgorICAgICAgICAoV2ViQ29yZTo6TWVkaWFQbGF5ZXJQcml2
YXRlR1N0cmVhbWVyQmFzZTo6ZGlzcGF0Y2hEZWNyeXB0aW9uS2V5KToKKyAgICAgICAgRGVsZXRl
ZC4gTm8gbG9uZ2VyIHVzZWQgYnkgYW55dGhpbmcuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhp
Y3MvZ3N0cmVhbWVyL01lZGlhUGxheWVyUHJpdmF0ZUdTdHJlYW1lckJhc2UuaDogRGl0dG8uCisg
ICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvZ3N0cmVhbWVyL2VtZS9XZWJLaXRDbGVhcktleURl
Y3J5cHRvckdTdHJlYW1lci5jcHA6CisgICAgICAgIFJlbmFtZSB0aGVzZSBtZXRob2RzIHRvIGF2
b2lkICJuYW1lc3BhY2luZyBuYW1lcyIuCisgICAgICAgICh3ZWJraXRfbWVkaWFfY2xlYXJfa2V5
X2RlY3J5cHRfY2xhc3NfaW5pdCk6CisgICAgICAgIChmaW5hbGl6ZSk6CisgICAgICAgIChoYW5k
bGVLZXlSZXNwb25zZSk6IFRoaXMgaXMgYSB0ZW1wb3JhcnkgZml4LCB3ZSBuZWVkIHNvbWUgbW9y
ZQorICAgICAgICByZW9yZ2FuaXNhdGlvbiB0byBiZSBmdWxsIGRyaXZlbiBieSBDRE1JbnN0YW5j
ZSBBUElzIGZvciBkZWNyeXB0aW9uLgorICAgICAgICAoZmluZEFuZFNldEtleSk6CisgICAgICAg
IChkZWNyeXB0KToKKyAgICAgICAgKHdlYktpdE1lZGlhQ2xlYXJLZXlEZWNyeXB0b3JGaW5hbGl6
ZSk6IERlbGV0ZWQuCisgICAgICAgICh3ZWJLaXRNZWRpYUNsZWFyS2V5RGVjcnlwdG9ySGFuZGxl
S2V5UmVzcG9uc2UpOiBEZWxldGVkLgorICAgICAgICAod2ViS2l0TWVkaWFDbGVhcktleURlY3J5
cHRvckZpbmRBbmRTZXRLZXkpOiBEZWxldGVkLgorICAgICAgICAod2ViS2l0TWVkaWFDbGVhcktl
eURlY3J5cHRvckRlY3J5cHQpOiBEZWxldGVkLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNz
L2dzdHJlYW1lci9lbWUvV2ViS2l0Q29tbW9uRW5jcnlwdGlvbkRlY3J5cHRvckdTdHJlYW1lci5j
cHA6IERpdHRvLgorICAgICAgICAod2Via2l0X21lZGlhX2NvbW1vbl9lbmNyeXB0aW9uX2RlY3J5
cHRfY2xhc3NfaW5pdCk6CisgICAgICAgIChmaW5hbGl6ZSk6CisgICAgICAgICh0cmFuc2Zvcm1D
YXBzKToKKyAgICAgICAgKHRyYW5zZm9ybUluUGxhY2UpOgorICAgICAgICAoaXNDRE1JbnN0YW5j
ZUF2YWlsYWJsZSk6CisgICAgICAgIChzaW5rRXZlbnRIYW5kbGVyKToKKyAgICAgICAgKHF1ZXJ5
SGFuZGxlcik6CisgICAgICAgIChjaGFuZ2VTdGF0ZSk6CisgICAgICAgIChzZXRDb250ZXh0KToK
KyAgICAgICAgKHdlYktpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5cHRvckZpbmFsaXplKTog
RGVsZXRlZC4KKyAgICAgICAgKHdlYmtpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5cHRUcmFu
c2Zvcm1DYXBzKTogRGVsZXRlZC4KKyAgICAgICAgKHdlYmtpdE1lZGlhQ29tbW9uRW5jcnlwdGlv
bkRlY3J5cHRUcmFuc2Zvcm1JblBsYWNlKTogRGVsZXRlZC4KKyAgICAgICAgKHdlYmtpdE1lZGlh
Q29tbW9uRW5jcnlwdGlvbkRlY3J5cHRJc0NETUluc3RhbmNlQXZhaWxhYmxlKTogRGVsZXRlZC4K
KyAgICAgICAgKHdlYmtpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5cHRTaW5rRXZlbnRIYW5k
bGVyKTogRGVsZXRlZC4KKyAgICAgICAgKHdlYmtpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5
cHRvclF1ZXJ5SGFuZGxlcik6IERlbGV0ZWQuCisgICAgICAgICh3ZWJLaXRNZWRpYUNvbW1vbkVu
Y3J5cHRpb25EZWNyeXB0b3JDaGFuZ2VTdGF0ZSk6IERlbGV0ZWQuCisgICAgICAgICh3ZWJLaXRN
ZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNyeXB0b3JTZXRDb250ZXh0KTogRGVsZXRlZC4KKyAgICAg
ICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9nc3RyZWFtZXIvZW1lL1dlYktpdENvbW1vbkVuY3J5cHRp
b25EZWNyeXB0b3JHU3RyZWFtZXIuaDoKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9nc3Ry
ZWFtZXIvbXNlL01lZGlhUGxheWVyUHJpdmF0ZUdTdHJlYW1lck1TRS5jcHA6CisgICAgICAgIChX
ZWJDb3JlOjpNZWRpYVBsYXllclByaXZhdGVHU3RyZWFtZXJNU0U6OmF0dGVtcHRUb0RlY3J5cHRX
aXRoTG9jYWxJbnN0YW5jZSk6CisgICAgICAgIERlbGV0ZWQuIE5vIGxvbmdlciBwYXNzaW5nIGtl
eSBpbmZvcm1hdGlvbiBvdmVyIGJ1cyBtZXNzYWdlcy4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFw
aGljcy9nc3RyZWFtZXIvbXNlL01lZGlhUGxheWVyUHJpdmF0ZUdTdHJlYW1lck1TRS5oOgorCiAy
MDE5LTAxLTE4ICBTaW1vbiBGcmFzZXIgIDxzaW1vbi5mcmFzZXJAYXBwbGUuY29tPgogCiAgICAg
ICAgIFNjcm9sbGluZ0Nvb3JkaW5hdG9yOjpzY3JvbGxhYmxlQXJlYVNjcm9sbExheWVyRGlkQ2hh
bmdlKCkgY2FuIGJlIHJlbW92ZWQKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2VuY3J5cHRlZG1lZGlhL2NsZWFya2V5L0NETUNsZWFyS2V5LmNwcCBiL1NvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL2VuY3J5cHRlZG1lZGlhL2NsZWFya2V5L0NETUNsZWFyS2V5LmNwcAppbmRleCBi
ZTdkZmNjYTM1MTg0YmM5OWRlNGU2ZDE0Yjk4Y2NkODU4YWY1ODJhLi5iOTczODkyNzM1ZTE2MzU3
ZTI5ZTcxMDUyZmViYjYzNTVmYWY0NTlkIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9lbmNyeXB0ZWRtZWRpYS9jbGVhcmtleS9DRE1DbGVhcktleS5jcHAKKysrIGIvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZW5jcnlwdGVkbWVkaWEvY2xlYXJrZXkvQ0RNQ2xlYXJLZXkuY3Bw
CkBAIC0xMjQsOCArMTI0LDcgQEAgc3RhdGljIE9wdGlvbmFsPFZlY3RvcjxDRE1JbnN0YW5jZUNs
ZWFyS2V5OjpLZXk+PiBwYXJzZUxpY2Vuc2VGb3JtYXQoY29uc3QgSlNPTjoKICAgICAgICAgfSk7
CiAgICAgaWYgKCF2YWxpZEZvcm1hdCkKICAgICAgICAgcmV0dXJuIFdURjo6bnVsbG9wdDsKLQot
ICAgIHJldHVybiBkZWNvZGVkS2V5czsKKyAgICByZXR1cm4gV1RGTW92ZShkZWNvZGVkS2V5cyk7
CiB9CiAKIHN0YXRpYyBib29sIHBhcnNlTGljZW5zZVJlbGVhc2VBY2tub3dsZWRnZW1lbnRGb3Jt
YXQoY29uc3QgSlNPTjo6T2JqZWN0JiByb290KQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvZ3N0cmVhbWVyL01lZGlhUGxheWVyUHJpdmF0ZUdTdHJlYW1lckJh
c2UuY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZ3N0cmVhbWVyL01lZGlh
UGxheWVyUHJpdmF0ZUdTdHJlYW1lckJhc2UuY3BwCmluZGV4IDM1NjM1MTM0MmYwYTU1MTk3OTk4
ZmU3MTgxYjljOGE1NTNmZGM2NjQuLmUxMzBjMjAwODNkNTU0ZjBhZTE2ODRhY2VmODY3MzFjODMw
NjBmYjcgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2dzdHJl
YW1lci9NZWRpYVBsYXllclByaXZhdGVHU3RyZWFtZXJCYXNlLmNwcAorKysgYi9Tb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9nc3RyZWFtZXIvTWVkaWFQbGF5ZXJQcml2YXRlR1N0cmVh
bWVyQmFzZS5jcHAKQEAgLTEyNTQsMTMgKzEyNTQsNiBAQCB2b2lkIE1lZGlhUGxheWVyUHJpdmF0
ZUdTdHJlYW1lckJhc2U6OmF0dGVtcHRUb0RlY3J5cHRXaXRoTG9jYWxJbnN0YW5jZSgpCiAgICAg
R1NUX0RFQlVHKCJhdHRlbXB0aW5nIHRvIGRlY3J5cHQsIGV2ZW50IGhhbmRsZWQgJXMiLCBib29s
Rm9yUHJpbnRpbmcoZXZlbnRIYW5kbGVkKSk7CiB9CiAKLXZvaWQgTWVkaWFQbGF5ZXJQcml2YXRl
R1N0cmVhbWVyQmFzZTo6ZGlzcGF0Y2hEZWNyeXB0aW9uS2V5KEdzdEJ1ZmZlciogYnVmZmVyKQot
ewotICAgIGJvb2wgZXZlbnRIYW5kbGVkID0gZ3N0X2VsZW1lbnRfc2VuZF9ldmVudChwaXBlbGlu
ZSgpLCBnc3RfZXZlbnRfbmV3X2N1c3RvbShHU1RfRVZFTlRfQ1VTVE9NX0RPV05TVFJFQU1fT09C
LAotICAgICAgICBnc3Rfc3RydWN0dXJlX25ldygiZHJtLWNpcGhlciIsICJrZXkiLCBHU1RfVFlQ
RV9CVUZGRVIsIGJ1ZmZlciwgbnVsbHB0cikpKTsKLSAgICBHU1RfVFJBQ0UoImVtaXR0ZWQgZGVj
cnlwdGlvbiBjaXBoZXIga2V5IG9uIHBpcGVsaW5lLCBldmVudCBoYW5kbGVkICVzIiwgYm9vbEZv
clByaW50aW5nKGV2ZW50SGFuZGxlZCkpOwotfQotCiB2b2lkIE1lZGlhUGxheWVyUHJpdmF0ZUdT
dHJlYW1lckJhc2U6OmhhbmRsZVByb3RlY3Rpb25FdmVudChHc3RFdmVudCogZXZlbnQpCiB7CiAg
ICAgaWYgKG1faGFuZGxlZFByb3RlY3Rpb25FdmVudHMuY29udGFpbnMoR1NUX0VWRU5UX1NFUU5V
TShldmVudCkpKSB7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9nc3RyZWFtZXIvTWVkaWFQbGF5ZXJQcml2YXRlR1N0cmVhbWVyQmFzZS5oIGIvU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZ3N0cmVhbWVyL01lZGlhUGxheWVyUHJpdmF0ZUdTdHJl
YW1lckJhc2UuaAppbmRleCA0MjM4MWQyZjc3YjhjMTRjMTlkMDdhYTBmYzZkN2Y4NTljNjlmYWFh
Li43NmFhNWNjZmQ4OTMxZjBjNDQwOTVkZmQwZDcwZjRhYThmMzFlNTljIDEwMDY0NAotLS0gYS9T
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9nc3RyZWFtZXIvTWVkaWFQbGF5ZXJQcml2
YXRlR1N0cmVhbWVyQmFzZS5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L2dzdHJlYW1lci9NZWRpYVBsYXllclByaXZhdGVHU3RyZWFtZXJCYXNlLmgKQEAgLTE0OCw3ICsx
NDgsNiBAQCBwdWJsaWM6CiAjaWYgRU5BQkxFKEVOQ1JZUFRFRF9NRURJQSkKICAgICB2b2lkIGNk
bUluc3RhbmNlQXR0YWNoZWQoQ0RNSW5zdGFuY2UmKSBvdmVycmlkZTsKICAgICB2b2lkIGNkbUlu
c3RhbmNlRGV0YWNoZWQoQ0RNSW5zdGFuY2UmKSBvdmVycmlkZTsKLSAgICB2b2lkIGRpc3BhdGNo
RGVjcnlwdGlvbktleShHc3RCdWZmZXIqKTsKICAgICB2b2lkIGhhbmRsZVByb3RlY3Rpb25FdmVu
dChHc3RFdmVudCopOwogICAgIHZpcnR1YWwgdm9pZCBhdHRlbXB0VG9EZWNyeXB0V2l0aExvY2Fs
SW5zdGFuY2UoKTsKICAgICB2b2lkIGF0dGVtcHRUb0RlY3J5cHRXaXRoSW5zdGFuY2UoQ0RNSW5z
dGFuY2UmKSBmaW5hbDsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL2dzdHJlYW1lci9lbWUvV2ViS2l0Q2xlYXJLZXlEZWNyeXB0b3JHU3RyZWFtZXIuY3BwIGIv
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZ3N0cmVhbWVyL2VtZS9XZWJLaXRDbGVh
cktleURlY3J5cHRvckdTdHJlYW1lci5jcHAKaW5kZXggMjg0YzhhMGMxYzQ0MTg1MjRkNzkzNTJh
MjA0NTQ5NjI1NzJiZDM1YS4uNzEzMDM4YTc3ZDBiMGU0YjMwYWYwMTg5OGU2Yzc1YzhmMmNhZDQz
YiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZ3N0cmVhbWVy
L2VtZS9XZWJLaXRDbGVhcktleURlY3J5cHRvckdTdHJlYW1lci5jcHAKKysrIGIvU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZ3N0cmVhbWVyL2VtZS9XZWJLaXRDbGVhcktleURlY3J5
cHRvckdTdHJlYW1lci5jcHAKQEAgLTI0LDI4ICsyNCwyNiBAQAogCiAjaWYgRU5BQkxFKEVOQ1JZ
UFRFRF9NRURJQSkgJiYgVVNFKEdTVFJFQU1FUikKIAorI2luY2x1ZGUgIkNETUNsZWFyS2V5Lmgi
CiAjaW5jbHVkZSAiR1N0cmVhbWVyQ29tbW9uLmgiCiAjaW5jbHVkZSAiR1N0cmVhbWVyRU1FVXRp
bGl0aWVzLmgiCiAjaW5jbHVkZSA8Z2NyeXB0Lmg+CiAjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0Ynl0
ZXJlYWRlci5oPgogI2luY2x1ZGUgPHd0Zi9SdW5Mb29wLmg+CiAKLSNkZWZpbmUgQ0xFQVJLRVlf
U0laRSAxNgordXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7CiAKLXN0cnVjdCBLZXkgewotICAgIEdS
ZWZQdHI8R3N0QnVmZmVyPiBrZXlJRDsKLSAgICBHUmVmUHRyPEdzdEJ1ZmZlcj4ga2V5VmFsdWU7
Ci19OworI2RlZmluZSBDTEVBUktFWV9TSVpFIDE2CiAKICNkZWZpbmUgV0VCS0lUX01FRElBX0NL
X0RFQ1JZUFRfR0VUX1BSSVZBVEUob2JqKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9QUklWQVRFKChv
YmopLCBXRUJLSVRfVFlQRV9NRURJQV9DS19ERUNSWVBULCBXZWJLaXRNZWRpYUNsZWFyS2V5RGVj
cnlwdFByaXZhdGUpKQogc3RydWN0IF9XZWJLaXRNZWRpYUNsZWFyS2V5RGVjcnlwdFByaXZhdGUg
ewotICAgIFZlY3RvcjxLZXk+IGtleXM7CisgICAgUmVmUHRyPENETUluc3RhbmNlQ2xlYXJLZXk+
IGNkbUluc3RhbmNlOwogICAgIGdjcnlfY2lwaGVyX2hkX3QgaGFuZGxlOwogfTsKIAotc3RhdGlj
IHZvaWQgd2ViS2l0TWVkaWFDbGVhcktleURlY3J5cHRvckZpbmFsaXplKEdPYmplY3QqKTsKLXN0
YXRpYyBnYm9vbGVhbiB3ZWJLaXRNZWRpYUNsZWFyS2V5RGVjcnlwdG9ySGFuZGxlS2V5UmVzcG9u
c2UoV2ViS2l0TWVkaWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdCogc2VsZiwgR3N0RXZlbnQqKTsK
LXN0YXRpYyBnYm9vbGVhbiB3ZWJLaXRNZWRpYUNsZWFyS2V5RGVjcnlwdG9yRGVjcnlwdChXZWJL
aXRNZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNyeXB0KiwgR3N0QnVmZmVyKiBpdiwgR3N0QnVmZmVy
KiBrZXlpZCwgR3N0QnVmZmVyKiBzYW1wbGUsIHVuc2lnbmVkIHN1YlNhbXBsZXNDb3VudCwgR3N0
QnVmZmVyKiBzdWJTYW1wbGVzKTsKK3N0YXRpYyB2b2lkIGZpbmFsaXplKEdPYmplY3QqKTsKK3N0
YXRpYyBib29sIGhhbmRsZUtleVJlc3BvbnNlKFdlYktpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRl
Y3J5cHQqIHNlbGYsIFJlZlB0cjxDRE1JbnN0YW5jZT4pOworc3RhdGljIGJvb2wgZGVjcnlwdChX
ZWJLaXRNZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNyeXB0KiwgR3N0QnVmZmVyKiBpdiwgR3N0QnVm
ZmVyKiBrZXlpZCwgR3N0QnVmZmVyKiBzYW1wbGUsIHVuc2lnbmVkIHN1YlNhbXBsZXNDb3VudCwg
R3N0QnVmZmVyKiBzdWJTYW1wbGVzKTsKIAogR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyh3ZWJr
aXRfbWVkaWFfY2xlYXJfa2V5X2RlY3J5cHRfZGVidWdfY2F0ZWdvcnkpOwogI2RlZmluZSBHU1Rf
Q0FUX0RFRkFVTFQgd2Via2l0X21lZGlhX2NsZWFyX2tleV9kZWNyeXB0X2RlYnVnX2NhdGVnb3J5
CkBAIC02OSw3ICs2Nyw3IEBAIEdfREVGSU5FX1RZUEUoV2ViS2l0TWVkaWFDbGVhcktleURlY3J5
cHQsIHdlYmtpdF9tZWRpYV9jbGVhcl9rZXlfZGVjcnlwdCwgV0VCS0lUCiBzdGF0aWMgdm9pZCB3
ZWJraXRfbWVkaWFfY2xlYXJfa2V5X2RlY3J5cHRfY2xhc3NfaW5pdChXZWJLaXRNZWRpYUNsZWFy
S2V5RGVjcnlwdENsYXNzKiBrbGFzcykKIHsKICAgICBHT2JqZWN0Q2xhc3MqIGdvYmplY3RDbGFz
cyA9IEdfT0JKRUNUX0NMQVNTKGtsYXNzKTsKLSAgICBnb2JqZWN0Q2xhc3MtPmZpbmFsaXplID0g
d2ViS2l0TWVkaWFDbGVhcktleURlY3J5cHRvckZpbmFsaXplOworICAgIGdvYmplY3RDbGFzcy0+
ZmluYWxpemUgPSBmaW5hbGl6ZTsKIAogICAgIEdzdEVsZW1lbnRDbGFzcyogZWxlbWVudENsYXNz
ID0gR1NUX0VMRU1FTlRfQ0xBU1Moa2xhc3MpOwogICAgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9w
YWRfdGVtcGxhdGUoZWxlbWVudENsYXNzLCBnc3Rfc3RhdGljX3BhZF90ZW1wbGF0ZV9nZXQoJnNp
bmtUZW1wbGF0ZSkpOwpAQCAtODUsOSArODMsOSBAQCBzdGF0aWMgdm9pZCB3ZWJraXRfbWVkaWFf
Y2xlYXJfa2V5X2RlY3J5cHRfY2xhc3NfaW5pdChXZWJLaXRNZWRpYUNsZWFyS2V5RGVjcnlwdAog
ICAgICAgICAid2Via2l0Y2xlYXJrZXkiLCAwLCAiQ2xlYXJLZXkgZGVjcnlwdG9yIik7CiAKICAg
ICBXZWJLaXRNZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNyeXB0Q2xhc3MqIGNlbmNDbGFzcyA9IFdF
QktJVF9NRURJQV9DRU5DX0RFQ1JZUFRfQ0xBU1Moa2xhc3MpOwotICAgIGNlbmNDbGFzcy0+cHJv
dGVjdGlvblN5c3RlbUlkID0gV2ViQ29yZTo6R1N0cmVhbWVyRU1FVXRpbGl0aWVzOjpzX0NsZWFy
S2V5VVVJRDsKLSAgICBjZW5jQ2xhc3MtPmhhbmRsZUtleVJlc3BvbnNlID0gR1NUX0RFQlVHX0ZV
TkNQVFIod2ViS2l0TWVkaWFDbGVhcktleURlY3J5cHRvckhhbmRsZUtleVJlc3BvbnNlKTsKLSAg
ICBjZW5jQ2xhc3MtPmRlY3J5cHQgPSBHU1RfREVCVUdfRlVOQ1BUUih3ZWJLaXRNZWRpYUNsZWFy
S2V5RGVjcnlwdG9yRGVjcnlwdCk7CisgICAgY2VuY0NsYXNzLT5wcm90ZWN0aW9uU3lzdGVtSWQg
PSBHU3RyZWFtZXJFTUVVdGlsaXRpZXM6OnNfQ2xlYXJLZXlVVUlEOworICAgIGNlbmNDbGFzcy0+
aGFuZGxlS2V5UmVzcG9uc2UgPSBHU1RfREVCVUdfRlVOQ1BUUihoYW5kbGVLZXlSZXNwb25zZSk7
CisgICAgY2VuY0NsYXNzLT5kZWNyeXB0ID0gR1NUX0RFQlVHX0ZVTkNQVFIoZGVjcnlwdCk7CiAK
ICAgICBnX3R5cGVfY2xhc3NfYWRkX3ByaXZhdGUoa2xhc3MsIHNpemVvZihXZWJLaXRNZWRpYUNs
ZWFyS2V5RGVjcnlwdFByaXZhdGUpKTsKIH0KQEAgLTEwNCw3ICsxMDIsNyBAQCBzdGF0aWMgdm9p
ZCB3ZWJraXRfbWVkaWFfY2xlYXJfa2V5X2RlY3J5cHRfaW5pdChXZWJLaXRNZWRpYUNsZWFyS2V5
RGVjcnlwdCogc2VsZgogICAgIH0KIH0KIAotc3RhdGljIHZvaWQgd2ViS2l0TWVkaWFDbGVhcktl
eURlY3J5cHRvckZpbmFsaXplKEdPYmplY3QqIG9iamVjdCkKK3N0YXRpYyB2b2lkIGZpbmFsaXpl
KEdPYmplY3QqIG9iamVjdCkKIHsKICAgICBXZWJLaXRNZWRpYUNsZWFyS2V5RGVjcnlwdCogc2Vs
ZiA9IFdFQktJVF9NRURJQV9DS19ERUNSWVBUKG9iamVjdCk7CiAgICAgV2ViS2l0TWVkaWFDbGVh
cktleURlY3J5cHRQcml2YXRlKiBwcml2ID0gc2VsZi0+cHJpdjsKQEAgLTExNCw2NSArMTEyLDMw
IEBAIHN0YXRpYyB2b2lkIHdlYktpdE1lZGlhQ2xlYXJLZXlEZWNyeXB0b3JGaW5hbGl6ZShHT2Jq
ZWN0KiBvYmplY3QpCiAgICAgR1NUX0NBTExfUEFSRU5UKEdfT0JKRUNUX0NMQVNTLCBmaW5hbGl6
ZSwgKG9iamVjdCkpOwogfQogCi1zdGF0aWMgZ2Jvb2xlYW4gd2ViS2l0TWVkaWFDbGVhcktleURl
Y3J5cHRvckhhbmRsZUtleVJlc3BvbnNlKFdlYktpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5
cHQqIHNlbGYsIEdzdEV2ZW50KiBldmVudCkKK3N0YXRpYyBib29sIGhhbmRsZUtleVJlc3BvbnNl
KFdlYktpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5cHQqIHNlbGYsIFJlZlB0cjxDRE1JbnN0
YW5jZT4gY2RtSW5zdGFuY2UpCiB7CiAgICAgV2ViS2l0TWVkaWFDbGVhcktleURlY3J5cHRQcml2
YXRlKiBwcml2ID0gV0VCS0lUX01FRElBX0NLX0RFQ1JZUFRfR0VUX1BSSVZBVEUoV0VCS0lUX01F
RElBX0NLX0RFQ1JZUFQoc2VsZikpOwotICAgIGNvbnN0IEdzdFN0cnVjdHVyZSogc3RydWN0dXJl
ID0gZ3N0X2V2ZW50X2dldF9zdHJ1Y3R1cmUoZXZlbnQpOwotCi0gICAgLy8gRGVtYW5kIHRoZSBg
ZHJtLWNpcGhlci1jbGVhcmtleWAgR3N0U3RydWN0dXJlLgotICAgIGlmICghZ3N0X3N0cnVjdHVy
ZV9oYXNfbmFtZShzdHJ1Y3R1cmUsICJkcm0tY2lwaGVyLWNsZWFya2V5IikpCi0gICAgICAgIHJl
dHVybiBGQUxTRTsKLQotICAgIC8vIFJldHJpZXZlIHRoZSBga2V5LWlkc2AgR1N0cmVhbWVyIHZh
bHVlIGxpc3QuCi0gICAgY29uc3QgR1ZhbHVlKiBrZXlJRHNMaXN0ID0gZ3N0X3N0cnVjdHVyZV9n
ZXRfdmFsdWUoc3RydWN0dXJlLCAia2V5LWlkcyIpOwotICAgIEFTU0VSVChrZXlJRHNMaXN0ICYm
IEdTVF9WQUxVRV9IT0xEU19MSVNUKGtleUlEc0xpc3QpKTsKLSAgICB1bnNpZ25lZCBrZXlJRHNM
aXN0U2l6ZSA9IGdzdF92YWx1ZV9saXN0X2dldF9zaXplKGtleUlEc0xpc3QpOwotCi0gICAgLy8g
UmV0cmlldmUgdGhlIGBrZXktdmFsdWVzYCBHU3RyZWFtZXIgdmFsdWUgbGlzdC4KLSAgICBjb25z
dCBHVmFsdWUqIGtleVZhbHVlc0xpc3QgPSBnc3Rfc3RydWN0dXJlX2dldF92YWx1ZShzdHJ1Y3R1
cmUsICJrZXktdmFsdWVzIik7Ci0gICAgQVNTRVJUKGtleVZhbHVlc0xpc3QgJiYgR1NUX1ZBTFVF
X0hPTERTX0xJU1Qoa2V5VmFsdWVzTGlzdCkpOwotICAgIHVuc2lnbmVkIGtleVZhbHVlc0xpc3RT
aXplID0gZ3N0X3ZhbHVlX2xpc3RfZ2V0X3NpemUoa2V5VmFsdWVzTGlzdCk7Ci0KLSAgICAvLyBC
YWlsIGlmIHNvbWVob3cgdGhlIHR3byBsaXN0cyBkb24ndCBtYXRjaCBpbiBzaXplLgotICAgIGlm
IChrZXlJRHNMaXN0U2l6ZSAhPSBrZXlWYWx1ZXNMaXN0U2l6ZSkKLSAgICAgICAgcmV0dXJuIEZB
TFNFOwotCi0gICAgLy8gQ2xlYXIgb3V0IHRoZSBwcmV2aW91cyBsaXN0IG9mIGtleXMuCi0gICAg
cHJpdi0+a2V5cy5jbGVhcigpOwotCi0gICAgLy8gQXBwZW5kIHRoZSByZXRyaWV2ZWQgR3N0QnVm
ZmVyIG9iamVjdHMgY29udGFpbmluZyBlYWNoIGtleSdzIElEIGFuZCB2YWx1ZSB0byB0aGUgbGlz
dCBvZiBLZXkgb2JqZWN0cy4KLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwga2V5SURzTGlz
dFNpemU7ICsraSkgewotICAgICAgICBHUmVmUHRyPEdzdEJ1ZmZlcj4ga2V5SURCdWZmZXIoZ3N0
X3ZhbHVlX2dldF9idWZmZXIoZ3N0X3ZhbHVlX2xpc3RfZ2V0X3ZhbHVlKGtleUlEc0xpc3QsIGkp
KSk7Ci0gICAgICAgIEdSZWZQdHI8R3N0QnVmZmVyPiBrZXlWYWx1ZUJ1ZmZlcihnc3RfdmFsdWVf
Z2V0X2J1ZmZlcihnc3RfdmFsdWVfbGlzdF9nZXRfdmFsdWUoa2V5VmFsdWVzTGlzdCwgaSkpKTsK
LSAgICAgICAgcHJpdi0+a2V5cy5hcHBlbmQoS2V5IHsgV1RGTW92ZShrZXlJREJ1ZmZlciksIFdU
Rk1vdmUoa2V5VmFsdWVCdWZmZXIpIH0pOwotICAgIH0KLQotICAgIHJldHVybiBUUlVFOworICAg
IHByaXYtPmNkbUluc3RhbmNlID0gZG93bmNhc3Q8Q0RNSW5zdGFuY2VDbGVhcktleT4oY2RtSW5z
dGFuY2UuZ2V0KCkpOworICAgIHJldHVybiBwcml2LT5jZG1JbnN0YW5jZTsKIH0KIAotc3RhdGlj
IGdib29sZWFuIHdlYktpdE1lZGlhQ2xlYXJLZXlEZWNyeXB0b3JGaW5kQW5kU2V0S2V5KFdlYktp
dE1lZGlhQ2xlYXJLZXlEZWNyeXB0UHJpdmF0ZSogcHJpdiwgUmVmUHRyPFdlYkNvcmU6OkdzdE1h
cHBlZEJ1ZmZlcj4mJiBrZXlJREJ1ZmZlcikKK3N0YXRpYyBib29sIGZpbmRBbmRTZXRLZXkoV2Vi
S2l0TWVkaWFDbGVhcktleURlY3J5cHRQcml2YXRlKiBwcml2LCBjb25zdCBSZWY8U2hhcmVkQnVm
ZmVyPiYga2V5SUQpCiB7Ci0gICAgR1JlZlB0cjxHc3RCdWZmZXI+IGtleUJ1ZmZlcjsKLSAgICBm
b3IgKGF1dG8mIGtleSA6IHByaXYtPmtleXMpIHsKLSAgICAgICAgaWYgKGtleS5rZXlJRC5nZXQo
KSA9PSAqa2V5SURCdWZmZXIpIHsKLSAgICAgICAgICAgIGtleUJ1ZmZlciA9IGtleS5rZXlWYWx1
ZTsKKyAgICBSZWZQdHI8U2hhcmVkQnVmZmVyPiBrZXlWYWx1ZTsKKyAgICBmb3IgKGNvbnN0IGF1
dG8mIGtleSA6IHByaXYtPmNkbUluc3RhbmNlLT5rZXlzKCkpIHsKKyAgICAgICAgaWYgKCprZXku
a2V5SUREYXRhID09IGtleUlEKSB7CisgICAgICAgICAgICBrZXlWYWx1ZSA9IGtleS5rZXlWYWx1
ZURhdGE7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmICgh
a2V5QnVmZmVyKSB7Ci0gICAgICAgIEdTVF9FUlJPUl9PQkpFQ1QocHJpdiwgIkZhaWxlZCB0byBm
aW5kIGFuIGFwcHJvcHJpYXRlIGtleSBidWZmZXIiKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwot
ICAgIH0KLQotICAgIGF1dG8gbWFwcGVkS2V5VmFsdWVCdWZmZXIgPSBXZWJDb3JlOjpHc3RNYXBw
ZWRCdWZmZXI6OmNyZWF0ZShrZXlCdWZmZXIuZ2V0KCksIEdTVF9NQVBfUkVBRCk7Ci0gICAgaWYg
KCFtYXBwZWRLZXlWYWx1ZUJ1ZmZlcikgewotICAgICAgICBHU1RfRVJST1JfT0JKRUNUKHByaXYs
ICJGYWlsZWQgdG8gbWFwIGRlY3J5cHRpb24ga2V5Iik7CisgICAgaWYgKCFrZXlWYWx1ZSkgewor
ICAgICAgICBHU1RfRVJST1JfT0JKRUNUKHByaXYsICJmYWlsZWQgdG8gZmluZCBhIGRlY3J5cHRp
b24ga2V5Iik7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBBU1NFUlQobWFw
cGVkS2V5VmFsdWVCdWZmZXItPnNpemUoKSA9PSBDTEVBUktFWV9TSVpFKTsKLSAgICBpZiAoZ2Ny
eV9lcnJvcl90IGVycm9yID0gZ2NyeV9jaXBoZXJfc2V0a2V5KHByaXYtPmhhbmRsZSwgbWFwcGVk
S2V5VmFsdWVCdWZmZXItPmRhdGEoKSwgbWFwcGVkS2V5VmFsdWVCdWZmZXItPnNpemUoKSkpIHsK
KyAgICBBU1NFUlQoa2V5VmFsdWUtPnNpemUoKSA9PSBDTEVBUktFWV9TSVpFKTsKKyAgICBpZiAo
Z2NyeV9lcnJvcl90IGVycm9yID0gZ2NyeV9jaXBoZXJfc2V0a2V5KHByaXYtPmhhbmRsZSwga2V5
VmFsdWUtPmRhdGEoKSwga2V5VmFsdWUtPnNpemUoKSkpIHsKICAgICAgICAgR1NUX0VSUk9SX09C
SkVDVChwcml2LCAiZ2NyeV9jaXBoZXJfc2V0a2V5IGZhaWxlZDogJXMiLCBncGdfc3RyZXJyb3Io
ZXJyb3IpKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KQEAgLTE4MCwxNyArMTQzLDE2
IEBAIHN0YXRpYyBnYm9vbGVhbiB3ZWJLaXRNZWRpYUNsZWFyS2V5RGVjcnlwdG9yRmluZEFuZFNl
dEtleShXZWJLaXRNZWRpYUNsZWFyS2V5RGVjCiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLXN0YXRp
YyBnYm9vbGVhbiB3ZWJLaXRNZWRpYUNsZWFyS2V5RGVjcnlwdG9yRGVjcnlwdChXZWJLaXRNZWRp
YUNvbW1vbkVuY3J5cHRpb25EZWNyeXB0KiBzZWxmLCBHc3RCdWZmZXIqIGl2QnVmZmVyLCBHc3RC
dWZmZXIqIGtleUlEQnVmZmVyLCBHc3RCdWZmZXIqIGJ1ZmZlciwgdW5zaWduZWQgc3ViU2FtcGxl
Q291bnQsIEdzdEJ1ZmZlciogc3ViU2FtcGxlc0J1ZmZlcikKK3N0YXRpYyBib29sIGRlY3J5cHQo
V2ViS2l0TWVkaWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdCogc2VsZiwgR3N0QnVmZmVyKiBpdkJ1
ZmZlciwgR3N0QnVmZmVyKiBrZXlJREJ1ZmZlciwgR3N0QnVmZmVyKiBidWZmZXIsIHVuc2lnbmVk
IHN1YlNhbXBsZUNvdW50LCBHc3RCdWZmZXIqIHN1YlNhbXBsZXNCdWZmZXIpCiB7Ci0gICAgLy8g
Q2hlY2sgaXZCdWZmZXIgaXNuJ3QgbnVsbC4KICAgICBpZiAoIWl2QnVmZmVyKSB7Ci0gICAgICAg
IEdTVF9FUlJPUl9PQkpFQ1Qoc2VsZiwgIkVycm9yLCB0aGUgaXZCdWZmZXIgaXMgbnVsbCIpOwor
ICAgICAgICBHU1RfRVJST1JfT0JKRUNUKHNlbGYsICJubyBJViBidWZmZXIiKTsKICAgICAgICAg
cmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIGF1dG8gbWFwcGVkSVZCdWZmZXIgPSBXZWJDb3Jl
OjpHc3RNYXBwZWRCdWZmZXI6OmNyZWF0ZShpdkJ1ZmZlciwgR1NUX01BUF9SRUFEKTsKICAgICBp
ZiAoIW1hcHBlZElWQnVmZmVyKSB7Ci0gICAgICAgIEdTVF9FUlJPUl9PQkpFQ1Qoc2VsZiwgIkZh
aWxlZCB0byBtYXAgSVYiKTsKKyAgICAgICAgR1NUX0VSUk9SX09CSkVDVChzZWxmLCAiZmFpbGVk
IHRvIG1hcCBJViBidWZmZXIiKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIApAQCAt
MjEwLDcgKzE3Miw2IEBAIHN0YXRpYyBnYm9vbGVhbiB3ZWJLaXRNZWRpYUNsZWFyS2V5RGVjcnlw
dG9yRGVjcnlwdChXZWJLaXRNZWRpYUNvbW1vbkVuY3J5cHRpb25ECiAgICAgICAgIHJldHVybiBm
YWxzZTsKICAgICB9CiAKLSAgICAvLyBDaGVjayBidWZmZXIgaXNuJ3QgbnVsbC4KICAgICBpZiAo
IWJ1ZmZlcikgewogICAgICAgICBHU1RfRVJST1JfT0JKRUNUKHNlbGYsICJObyBidWZmZXIgdG8g
ZGVjcnlwdCIpOwogICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0yMjgsNyArMTg5LDcgQEAgc3Rh
dGljIGdib29sZWFuIHdlYktpdE1lZGlhQ2xlYXJLZXlEZWNyeXB0b3JEZWNyeXB0KFdlYktpdE1l
ZGlhQ29tbW9uRW5jcnlwdGlvbkQKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAg
IHdlYktpdE1lZGlhQ2xlYXJLZXlEZWNyeXB0b3JGaW5kQW5kU2V0S2V5KHByaXYsIFdURk1vdmUo
bWFwcGVkS2V5SWRCdWZmZXIpKTsKKyAgICBmaW5kQW5kU2V0S2V5KHByaXYsIG1hcHBlZEtleUlk
QnVmZmVyLT5jcmVhdGVTaGFyZWRCdWZmZXIoKSk7CiAKICAgICB1bnNpZ25lZCBwb3NpdGlvbiA9
IDA7CiAgICAgdW5zaWduZWQgc2FtcGxlSW5kZXggPSAwOwpkaWZmIC0tZ2l0IGEvU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZ3N0cmVhbWVyL2VtZS9XZWJLaXRDb21tb25FbmNyeXB0
aW9uRGVjcnlwdG9yR1N0cmVhbWVyLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL2dzdHJlYW1lci9lbWUvV2ViS2l0Q29tbW9uRW5jcnlwdGlvbkRlY3J5cHRvckdTdHJlYW1l
ci5jcHAKaW5kZXggMTdmZDQ4Y2M5NTkxZTgxNGU2YTM5YjQ3MjVmMDhmOTA5ODBlNWY2MS4uZmM2
OTY4NTgyNTE4ZjVlZmVhMjMyZDY1ZmM5NmU5MDMyM2JiNThkYyAxMDA2NDQKLS0tIGEvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZ3N0cmVhbWVyL2VtZS9XZWJLaXRDb21tb25FbmNy
eXB0aW9uRGVjcnlwdG9yR1N0cmVhbWVyLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9nc3RyZWFtZXIvZW1lL1dlYktpdENvbW1vbkVuY3J5cHRpb25EZWNyeXB0b3JH
U3RyZWFtZXIuY3BwCkBAIC0yNiw3ICsyNiw3IEBACiAjaWYgRU5BQkxFKEVOQ1JZUFRFRF9NRURJ
QSkgJiYgVVNFKEdTVFJFQU1FUikKIAogI2luY2x1ZGUgIkdTdHJlYW1lckNvbW1vbi5oIgotI2lu
Y2x1ZGUgPENETUluc3RhbmNlLmg+CisjaW5jbHVkZSAiR1N0cmVhbWVyRU1FVXRpbGl0aWVzLmgi
CiAjaW5jbHVkZSA8d3RmL0NvbmRpdGlvbi5oPgogI2luY2x1ZGUgPHd0Zi9QcmludFN0cmVhbS5o
PgogI2luY2x1ZGUgPHd0Zi9SdW5Mb29wLmg+CkBAIC0zNywyMCArMzcsMjEgQEAgdXNpbmcgV2Vi
Q29yZTo6Q0RNSW5zdGFuY2U7CiBzdHJ1Y3QgX1dlYktpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRl
Y3J5cHRQcml2YXRlIHsKICAgICBHUmVmUHRyPEdzdEV2ZW50PiBwcm90ZWN0aW9uRXZlbnQ7CiAg
ICAgUmVmUHRyPENETUluc3RhbmNlPiBjZG1JbnN0YW5jZTsKLSAgICBib29sIGtleVJlY2VpdmVk
OworICAgIGJvb2wga2V5UmVjZWl2ZWQgeyBmYWxzZSB9OwogICAgIGJvb2wgd2FpdGluZ0Zvcktl
eSB7IGZhbHNlIH07CiAgICAgTG9jayBtdXRleDsKICAgICBDb25kaXRpb24gY29uZGl0aW9uOwog
fTsKIAotc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHdlYktpdE1lZGlhQ29tbW9uRW5jcnlw
dGlvbkRlY3J5cHRvckNoYW5nZVN0YXRlKEdzdEVsZW1lbnQqLCBHc3RTdGF0ZUNoYW5nZSB0cmFu
c2l0aW9uKTsKLXN0YXRpYyB2b2lkIHdlYktpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5cHRv
clNldENvbnRleHQoR3N0RWxlbWVudCosIEdzdENvbnRleHQqKTsKLXN0YXRpYyB2b2lkIHdlYktp
dE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5cHRvckZpbmFsaXplKEdPYmplY3QqKTsKLXN0YXRp
YyBHc3RDYXBzKiB3ZWJraXRNZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNyeXB0VHJhbnNmb3JtQ2Fw
cyhHc3RCYXNlVHJhbnNmb3JtKiwgR3N0UGFkRGlyZWN0aW9uLCBHc3RDYXBzKiwgR3N0Q2Fwcyop
Owotc3RhdGljIEdzdEZsb3dSZXR1cm4gd2Via2l0TWVkaWFDb21tb25FbmNyeXB0aW9uRGVjcnlw
dFRyYW5zZm9ybUluUGxhY2UoR3N0QmFzZVRyYW5zZm9ybSosIEdzdEJ1ZmZlciopOwotc3RhdGlj
IGdib29sZWFuIHdlYmtpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5cHRTaW5rRXZlbnRIYW5k
bGVyKEdzdEJhc2VUcmFuc2Zvcm0qLCBHc3RFdmVudCopOwotc3RhdGljIGdib29sZWFuIHdlYmtp
dE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5cHRvclF1ZXJ5SGFuZGxlcihHc3RCYXNlVHJhbnNm
b3JtKiwgR3N0UGFkRGlyZWN0aW9uLCBHc3RRdWVyeSopOwotc3RhdGljIGJvb2wgd2Via2l0TWVk
aWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdElzQ0RNSW5zdGFuY2VBdmFpbGFibGUoV2ViS2l0TWVk
aWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdCopOworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJu
IGNoYW5nZVN0YXRlKEdzdEVsZW1lbnQqLCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKK3N0
YXRpYyB2b2lkIGZpbmFsaXplKEdPYmplY3QqKTsKK3N0YXRpYyBHc3RDYXBzKiB0cmFuc2Zvcm1D
YXBzKEdzdEJhc2VUcmFuc2Zvcm0qLCBHc3RQYWREaXJlY3Rpb24sIEdzdENhcHMqLCBHc3RDYXBz
Kik7CitzdGF0aWMgR3N0Rmxvd1JldHVybiB0cmFuc2Zvcm1JblBsYWNlKEdzdEJhc2VUcmFuc2Zv
cm0qLCBHc3RCdWZmZXIqKTsKK3N0YXRpYyBnYm9vbGVhbiBzaW5rRXZlbnRIYW5kbGVyKEdzdEJh
c2VUcmFuc2Zvcm0qLCBHc3RFdmVudCopOworc3RhdGljIGdib29sZWFuIHF1ZXJ5SGFuZGxlcihH
c3RCYXNlVHJhbnNmb3JtKiwgR3N0UGFkRGlyZWN0aW9uLCBHc3RRdWVyeSopOworc3RhdGljIGJv
b2wgaXNDRE1JbnN0YW5jZUF2YWlsYWJsZShXZWJLaXRNZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNy
eXB0Kik7CitzdGF0aWMgdm9pZCBzZXRDb250ZXh0KEdzdEVsZW1lbnQqLCBHc3RDb250ZXh0Kik7
CisKIAogR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyh3ZWJraXRfbWVkaWFfY29tbW9uX2VuY3J5
cHRpb25fZGVjcnlwdF9kZWJ1Z19jYXRlZ29yeSk7CiAjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCB3
ZWJraXRfbWVkaWFfY29tbW9uX2VuY3J5cHRpb25fZGVjcnlwdF9kZWJ1Z19jYXRlZ29yeQpAQCAt
NjEsMjEgKzYyLDIxIEBAIEdfREVGSU5FX1RZUEUoV2ViS2l0TWVkaWFDb21tb25FbmNyeXB0aW9u
RGVjcnlwdCwgd2Via2l0X21lZGlhX2NvbW1vbl9lbmNyeXB0aW9uCiBzdGF0aWMgdm9pZCB3ZWJr
aXRfbWVkaWFfY29tbW9uX2VuY3J5cHRpb25fZGVjcnlwdF9jbGFzc19pbml0KFdlYktpdE1lZGlh
Q29tbW9uRW5jcnlwdGlvbkRlY3J5cHRDbGFzcyoga2xhc3MpCiB7CiAgICAgR09iamVjdENsYXNz
KiBnb2JqZWN0Q2xhc3MgPSBHX09CSkVDVF9DTEFTUyhrbGFzcyk7Ci0gICAgZ29iamVjdENsYXNz
LT5maW5hbGl6ZSA9IHdlYktpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5cHRvckZpbmFsaXpl
OworICAgIGdvYmplY3RDbGFzcy0+ZmluYWxpemUgPSBmaW5hbGl6ZTsKIAogICAgIEdTVF9ERUJV
R19DQVRFR09SWV9JTklUKHdlYmtpdF9tZWRpYV9jb21tb25fZW5jcnlwdGlvbl9kZWNyeXB0X2Rl
YnVnX2NhdGVnb3J5LAogICAgICAgICAid2Via2l0Y2VuYyIsIDAsICJDb21tb24gRW5jcnlwdGlv
biBiYXNlIGNsYXNzIik7CiAKICAgICBHc3RFbGVtZW50Q2xhc3MqIGVsZW1lbnRDbGFzcyA9IEdT
VF9FTEVNRU5UX0NMQVNTKGtsYXNzKTsKLSAgICBlbGVtZW50Q2xhc3MtPmNoYW5nZV9zdGF0ZSA9
IEdTVF9ERUJVR19GVU5DUFRSKHdlYktpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5cHRvckNo
YW5nZVN0YXRlKTsKLSAgICBlbGVtZW50Q2xhc3MtPnNldF9jb250ZXh0ID0gR1NUX0RFQlVHX0ZV
TkNQVFIod2ViS2l0TWVkaWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdG9yU2V0Q29udGV4dCk7Cisg
ICAgZWxlbWVudENsYXNzLT5jaGFuZ2Vfc3RhdGUgPSBHU1RfREVCVUdfRlVOQ1BUUihjaGFuZ2VT
dGF0ZSk7CisgICAgZWxlbWVudENsYXNzLT5zZXRfY29udGV4dCA9IEdTVF9ERUJVR19GVU5DUFRS
KHNldENvbnRleHQpOwogCiAgICAgR3N0QmFzZVRyYW5zZm9ybUNsYXNzKiBiYXNlVHJhbnNmb3Jt
Q2xhc3MgPSBHU1RfQkFTRV9UUkFOU0ZPUk1fQ0xBU1Moa2xhc3MpOwotICAgIGJhc2VUcmFuc2Zv
cm1DbGFzcy0+dHJhbnNmb3JtX2lwID0gR1NUX0RFQlVHX0ZVTkNQVFIod2Via2l0TWVkaWFDb21t
b25FbmNyeXB0aW9uRGVjcnlwdFRyYW5zZm9ybUluUGxhY2UpOwotICAgIGJhc2VUcmFuc2Zvcm1D
bGFzcy0+dHJhbnNmb3JtX2NhcHMgPSBHU1RfREVCVUdfRlVOQ1BUUih3ZWJraXRNZWRpYUNvbW1v
bkVuY3J5cHRpb25EZWNyeXB0VHJhbnNmb3JtQ2Fwcyk7CisgICAgYmFzZVRyYW5zZm9ybUNsYXNz
LT50cmFuc2Zvcm1faXAgPSBHU1RfREVCVUdfRlVOQ1BUUih0cmFuc2Zvcm1JblBsYWNlKTsKKyAg
ICBiYXNlVHJhbnNmb3JtQ2xhc3MtPnRyYW5zZm9ybV9jYXBzID0gR1NUX0RFQlVHX0ZVTkNQVFIo
dHJhbnNmb3JtQ2Fwcyk7CiAgICAgYmFzZVRyYW5zZm9ybUNsYXNzLT50cmFuc2Zvcm1faXBfb25f
cGFzc3Rocm91Z2ggPSBGQUxTRTsKLSAgICBiYXNlVHJhbnNmb3JtQ2xhc3MtPnNpbmtfZXZlbnQg
PSBHU1RfREVCVUdfRlVOQ1BUUih3ZWJraXRNZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNyeXB0U2lu
a0V2ZW50SGFuZGxlcik7Ci0gICAgYmFzZVRyYW5zZm9ybUNsYXNzLT5xdWVyeSA9IEdTVF9ERUJV
R19GVU5DUFRSKHdlYmtpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5cHRvclF1ZXJ5SGFuZGxl
cik7CisgICAgYmFzZVRyYW5zZm9ybUNsYXNzLT5zaW5rX2V2ZW50ID0gR1NUX0RFQlVHX0ZVTkNQ
VFIoc2lua0V2ZW50SGFuZGxlcik7CisgICAgYmFzZVRyYW5zZm9ybUNsYXNzLT5xdWVyeSA9IEdT
VF9ERUJVR19GVU5DUFRSKHF1ZXJ5SGFuZGxlcik7CiAKICAgICBnX3R5cGVfY2xhc3NfYWRkX3By
aXZhdGUoa2xhc3MsIHNpemVvZihXZWJLaXRNZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNyeXB0UHJp
dmF0ZSkpOwogfQpAQCAtOTMsNyArOTQsNyBAQCBzdGF0aWMgdm9pZCB3ZWJraXRfbWVkaWFfY29t
bW9uX2VuY3J5cHRpb25fZGVjcnlwdF9pbml0KFdlYktpdE1lZGlhQ29tbW9uRW5jcnlwdAogICAg
IGdzdF9iYXNlX3RyYW5zZm9ybV9zZXRfZ2FwX2F3YXJlKGJhc2UsIEZBTFNFKTsKIH0KIAotc3Rh
dGljIHZvaWQgd2ViS2l0TWVkaWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdG9yRmluYWxpemUoR09i
amVjdCogb2JqZWN0KQorc3RhdGljIHZvaWQgZmluYWxpemUoR09iamVjdCogb2JqZWN0KQogewog
ICAgIFdlYktpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5cHQqIHNlbGYgPSBXRUJLSVRfTUVE
SUFfQ0VOQ19ERUNSWVBUKG9iamVjdCk7CiAgICAgV2ViS2l0TWVkaWFDb21tb25FbmNyeXB0aW9u
RGVjcnlwdFByaXZhdGUqIHByaXYgPSBzZWxmLT5wcml2OwpAQCAtMTAyLDcgKzEwMyw3IEBAIHN0
YXRpYyB2b2lkIHdlYktpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5cHRvckZpbmFsaXplKEdP
YmplY3QqIG9iamVjdCkKICAgICBHU1RfQ0FMTF9QQVJFTlQoR19PQkpFQ1RfQ0xBU1MsIGZpbmFs
aXplLCAob2JqZWN0KSk7CiB9CiAKLXN0YXRpYyBHc3RDYXBzKiB3ZWJraXRNZWRpYUNvbW1vbkVu
Y3J5cHRpb25EZWNyeXB0VHJhbnNmb3JtQ2FwcyhHc3RCYXNlVHJhbnNmb3JtKiBiYXNlLCBHc3RQ
YWREaXJlY3Rpb24gZGlyZWN0aW9uLCBHc3RDYXBzKiBjYXBzLCBHc3RDYXBzKiBmaWx0ZXIpCitz
dGF0aWMgR3N0Q2FwcyogdHJhbnNmb3JtQ2FwcyhHc3RCYXNlVHJhbnNmb3JtKiBiYXNlLCBHc3RQ
YWREaXJlY3Rpb24gZGlyZWN0aW9uLCBHc3RDYXBzKiBjYXBzLCBHc3RDYXBzKiBmaWx0ZXIpCiB7
CiAgICAgaWYgKGRpcmVjdGlvbiA9PSBHU1RfUEFEX1VOS05PV04pCiAgICAgICAgIHJldHVybiBu
dWxscHRyOwpAQCAtMTk3LDcgKzE5OCw3IEBAIHN0YXRpYyBHc3RDYXBzKiB3ZWJraXRNZWRpYUNv
bW1vbkVuY3J5cHRpb25EZWNyeXB0VHJhbnNmb3JtQ2FwcyhHc3RCYXNlVHJhbnNmb3JtCiAgICAg
cmV0dXJuIHRyYW5zZm9ybWVkQ2FwczsKIH0KIAotc3RhdGljIEdzdEZsb3dSZXR1cm4gd2Via2l0
TWVkaWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdFRyYW5zZm9ybUluUGxhY2UoR3N0QmFzZVRyYW5z
Zm9ybSogYmFzZSwgR3N0QnVmZmVyKiBidWZmZXIpCitzdGF0aWMgR3N0Rmxvd1JldHVybiB0cmFu
c2Zvcm1JblBsYWNlKEdzdEJhc2VUcmFuc2Zvcm0qIGJhc2UsIEdzdEJ1ZmZlciogYnVmZmVyKQog
ewogICAgIFdlYktpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5cHQqIHNlbGYgPSBXRUJLSVRf
TUVESUFfQ0VOQ19ERUNSWVBUKGJhc2UpOwogICAgIFdlYktpdE1lZGlhQ29tbW9uRW5jcnlwdGlv
bkRlY3J5cHRQcml2YXRlKiBwcml2ID0gV0VCS0lUX01FRElBX0NFTkNfREVDUllQVF9HRVRfUFJJ
VkFURShzZWxmKTsKQEAgLTMwMiw3ICszMDMsNyBAQCBzdGF0aWMgR3N0Rmxvd1JldHVybiB3ZWJr
aXRNZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNyeXB0VHJhbnNmb3JtSW5QbGFjZShHc3RCYXNlVAog
ICAgIHJldHVybiBHU1RfRkxPV19PSzsKIH0KIAotc3RhdGljIGJvb2wgd2Via2l0TWVkaWFDb21t
b25FbmNyeXB0aW9uRGVjcnlwdElzQ0RNSW5zdGFuY2VBdmFpbGFibGUoV2ViS2l0TWVkaWFDb21t
b25FbmNyeXB0aW9uRGVjcnlwdCogc2VsZikKK3N0YXRpYyBib29sIGlzQ0RNSW5zdGFuY2VBdmFp
bGFibGUoV2ViS2l0TWVkaWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdCogc2VsZikKIHsKICAgICBX
ZWJLaXRNZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNyeXB0UHJpdmF0ZSogcHJpdiA9IFdFQktJVF9N
RURJQV9DRU5DX0RFQ1JZUFRfR0VUX1BSSVZBVEUoc2VsZik7CiAKQEAgLTMxNywxOSArMzE4LDIy
IEBAIHN0YXRpYyBib29sIHdlYmtpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5cHRJc0NETUlu
c3RhbmNlQXZhaWxhYmxlKFdlYktpdE1lZGlhCiAgICAgICAgIC8vIHJlcXVlc3RzIGFyZSB1c2Vm
dWwgaGVyZS4KICAgICAgICAgaWYgKGNvbnRleHQpIHsKICAgICAgICAgICAgIGNvbnN0IEdWYWx1
ZSogdmFsdWUgPSBnc3Rfc3RydWN0dXJlX2dldF92YWx1ZShnc3RfY29udGV4dF9nZXRfc3RydWN0
dXJlKGNvbnRleHQuZ2V0KCkpLCAiY2RtLWluc3RhbmNlIik7Ci0gICAgICAgICAgICBwcml2LT5j
ZG1JbnN0YW5jZSA9IHZhbHVlID8gcmVpbnRlcnByZXRfY2FzdDxDRE1JbnN0YW5jZSo+KGdfdmFs
dWVfZ2V0X3BvaW50ZXIodmFsdWUpKSA6IG51bGxwdHI7CisgICAgICAgICAgICAvLyBDYXB0dXJl
IHRoZSBDRE1JbnN0YW5jZSBpbnRvIGEgc2VwYXJhdGUgdmFyaWFibGUgdG8gYXZvaWQgbWlzc2lu
ZyBhIHJlZmNvdW50LgorICAgICAgICAgICAgQ0RNSW5zdGFuY2UqIGluc3RhbmNlID0gdmFsdWUg
PyByZWludGVycHJldF9jYXN0PENETUluc3RhbmNlKj4oZ192YWx1ZV9nZXRfcG9pbnRlcih2YWx1
ZSkpIDogbnVsbHB0cjsKKyAgICAgICAgICAgIC8vIC4uLiBBbmQgZm9yY2UgYSByZWZjb3VudCBi
dW1wIHVzaW5nIG9wZXJhdG9yPS4KKyAgICAgICAgICAgIHByaXYtPmNkbUluc3RhbmNlID0gaW5z
dGFuY2U7CiAgICAgICAgICAgICBpZiAocHJpdi0+Y2RtSW5zdGFuY2UpCi0gICAgICAgICAgICAg
ICAgR1NUX0RFQlVHX09CSkVDVChzZWxmLCAicmVjZWl2ZWQgbmV3IENETUluc3RhbmNlICVwIiwg
cHJpdi0+Y2RtSW5zdGFuY2UuZ2V0KCkpOworICAgICAgICAgICAgICAgIEdTVF9ERUJVR19PQkpF
Q1Qoc2VsZiwgInJlY2VpdmVkIGEgbmV3IENETSBpbnN0YW5jZSAlcCwgcmVmY291bnQgJXUiLCBw
cml2LT5jZG1JbnN0YW5jZS5nZXQoKSwgcHJpdi0+Y2RtSW5zdGFuY2UtPnJlZkNvdW50KCkpOwog
ICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIEdTVF9UUkFDRV9PQkpFQ1Qoc2VsZiwg
ImZvcm1lciBpbnN0YW5jZSB3YXMgZGV0YWNoZWQiKTsKKyAgICAgICAgICAgICAgICBHU1RfVFJB
Q0VfT0JKRUNUKHNlbGYsICJDRE0gaW5zdGFuY2Ugd2FzIGRldGFjaGVkIik7CiAgICAgICAgIH0K
ICAgICB9CiAKLSAgICBHU1RfVFJBQ0VfT0JKRUNUKHNlbGYsICJDRE1JbnN0YW5jZSBhdmFpbGFi
bGUgJXMiLCBib29sRm9yUHJpbnRpbmcocHJpdi0+Y2RtSW5zdGFuY2UuZ2V0KCkpKTsKKyAgICBH
U1RfVFJBQ0VfT0JKRUNUKHNlbGYsICJDRE0gaW5zdGFuY2UgYXZhaWxhYmxlICVzIiwgYm9vbEZv
clByaW50aW5nKHByaXYtPmNkbUluc3RhbmNlLmdldCgpKSk7CiAgICAgcmV0dXJuIHByaXYtPmNk
bUluc3RhbmNlOwogfQogCi1zdGF0aWMgZ2Jvb2xlYW4gd2Via2l0TWVkaWFDb21tb25FbmNyeXB0
aW9uRGVjcnlwdFNpbmtFdmVudEhhbmRsZXIoR3N0QmFzZVRyYW5zZm9ybSogdHJhbnMsIEdzdEV2
ZW50KiBldmVudCkKK3N0YXRpYyBnYm9vbGVhbiBzaW5rRXZlbnRIYW5kbGVyKEdzdEJhc2VUcmFu
c2Zvcm0qIHRyYW5zLCBHc3RFdmVudCogZXZlbnQpCiB7CiAgICAgV2ViS2l0TWVkaWFDb21tb25F
bmNyeXB0aW9uRGVjcnlwdCogc2VsZiA9IFdFQktJVF9NRURJQV9DRU5DX0RFQ1JZUFQodHJhbnMp
OwogICAgIFdlYktpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5cHRQcml2YXRlKiBwcml2ID0g
V0VCS0lUX01FRElBX0NFTkNfREVDUllQVF9HRVRfUFJJVkFURShzZWxmKTsKQEAgLTM0NSwxMyAr
MzQ5LDEzIEBAIHN0YXRpYyBnYm9vbGVhbiB3ZWJraXRNZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNy
eXB0U2lua0V2ZW50SGFuZGxlcihHc3RCYXNlVHJhbnNmCiAgICAgICAgIC8vIGV2ZW50cyB3aWxs
IG5vdCBiZSBoYW5kbGVkIGJ5IHRoZSBkZW11eGVyLCBzbyB0aGUgbXVzdCBiZQogICAgICAgICAv
LyBoYW5kbGVkIGluIGhlcmUuCiAgICAgICAgIExvY2tIb2xkZXIgbG9ja2VyKHByaXYtPm11dGV4
KTsKLSAgICAgICAgaWYgKCF3ZWJraXRNZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNyeXB0SXNDRE1J
bnN0YW5jZUF2YWlsYWJsZShzZWxmKSkgeworICAgICAgICBpZiAoIWlzQ0RNSW5zdGFuY2VBdmFp
bGFibGUoc2VsZikpIHsKICAgICAgICAgICAgIEdTVF9FUlJPUl9PQkpFQ1Qoc2VsZiwgIk5vIENE
TSBpbnN0YW5jZSBhdmFpbGFibGUiKTsKICAgICAgICAgICAgIHJlc3VsdCA9IEZBTFNFOwogICAg
ICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoa2xhc3MtPmhhbmRsZUtl
eVJlc3BvbnNlKHNlbGYsIGV2ZW50KSkgeworICAgICAgICBpZiAoa2xhc3MtPmhhbmRsZUtleVJl
c3BvbnNlKHNlbGYsIHByaXYtPmNkbUluc3RhbmNlKSkgewogICAgICAgICAgICAgR1NUX0RFQlVH
X09CSkVDVChzZWxmLCAia2V5IHJlY2VpdmVkIik7CiAgICAgICAgICAgICBwcml2LT5rZXlSZWNl
aXZlZCA9IHRydWU7CiAgICAgICAgICAgICBwcml2LT5jb25kaXRpb24ubm90aWZ5T25lKCk7CkBA
IC0zNjksNyArMzczLDcgQEAgc3RhdGljIGdib29sZWFuIHdlYmtpdE1lZGlhQ29tbW9uRW5jcnlw
dGlvbkRlY3J5cHRTaW5rRXZlbnRIYW5kbGVyKEdzdEJhc2VUcmFuc2YKICAgICByZXR1cm4gcmVz
dWx0OwogfQogCi1zdGF0aWMgZ2Jvb2xlYW4gd2Via2l0TWVkaWFDb21tb25FbmNyeXB0aW9uRGVj
cnlwdG9yUXVlcnlIYW5kbGVyKEdzdEJhc2VUcmFuc2Zvcm0qIHRyYW5zLCBHc3RQYWREaXJlY3Rp
b24gZGlyZWN0aW9uLCBHc3RRdWVyeSogcXVlcnkpCitzdGF0aWMgZ2Jvb2xlYW4gcXVlcnlIYW5k
bGVyKEdzdEJhc2VUcmFuc2Zvcm0qIHRyYW5zLCBHc3RQYWREaXJlY3Rpb24gZGlyZWN0aW9uLCBH
c3RRdWVyeSogcXVlcnkpCiB7CiAgICAgaWYgKGdzdF9zdHJ1Y3R1cmVfaGFzX25hbWUoZ3N0X3F1
ZXJ5X2dldF9zdHJ1Y3R1cmUocXVlcnkpLCAiYW55LWRlY3J5cHRvci13YWl0aW5nLWZvci1rZXki
KSkgewogICAgICAgICBXZWJLaXRNZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNyeXB0UHJpdmF0ZSog
cHJpdiA9IFdFQktJVF9NRURJQV9DRU5DX0RFQ1JZUFRfR0VUX1BSSVZBVEUodHJhbnMpOwpAQCAt
Mzc5LDcgKzM4Myw3IEBAIHN0YXRpYyBnYm9vbGVhbiB3ZWJraXRNZWRpYUNvbW1vbkVuY3J5cHRp
b25EZWNyeXB0b3JRdWVyeUhhbmRsZXIoR3N0QmFzZVRyYW5zZm9yCiAgICAgcmV0dXJuIEdTVF9C
QVNFX1RSQU5TRk9STV9DTEFTUyhwYXJlbnRfY2xhc3MpLT5xdWVyeSh0cmFucywgZGlyZWN0aW9u
LCBxdWVyeSk7CiB9CiAKLXN0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybiB3ZWJLaXRNZWRpYUNv
bW1vbkVuY3J5cHRpb25EZWNyeXB0b3JDaGFuZ2VTdGF0ZShHc3RFbGVtZW50KiBlbGVtZW50LCBH
c3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKQorc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIGNo
YW5nZVN0YXRlKEdzdEVsZW1lbnQqIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24p
CiB7CiAgICAgV2ViS2l0TWVkaWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdCogc2VsZiA9IFdFQktJ
VF9NRURJQV9DRU5DX0RFQ1JZUFQoZWxlbWVudCk7CiAgICAgV2ViS2l0TWVkaWFDb21tb25FbmNy
eXB0aW9uRGVjcnlwdFByaXZhdGUqIHByaXYgPSBXRUJLSVRfTUVESUFfQ0VOQ19ERUNSWVBUX0dF
VF9QUklWQVRFKHNlbGYpOwpAQCAtNDAwLDcgKzQwNCw3IEBAIHN0YXRpYyBHc3RTdGF0ZUNoYW5n
ZVJldHVybiB3ZWJLaXRNZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNyeXB0b3JDaGFuZ2VTdGF0ZShH
c3RFCiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RhdGljIHZvaWQgd2ViS2l0TWVkaWFDb21t
b25FbmNyeXB0aW9uRGVjcnlwdG9yU2V0Q29udGV4dChHc3RFbGVtZW50KiBlbGVtZW50LCBHc3RD
b250ZXh0KiBjb250ZXh0KQorc3RhdGljIHZvaWQgc2V0Q29udGV4dChHc3RFbGVtZW50KiBlbGVt
ZW50LCBHc3RDb250ZXh0KiBjb250ZXh0KQogewogICAgIFdlYktpdE1lZGlhQ29tbW9uRW5jcnlw
dGlvbkRlY3J5cHQqIHNlbGYgPSBXRUJLSVRfTUVESUFfQ0VOQ19ERUNSWVBUKGVsZW1lbnQpOwog
ICAgIFdlYktpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5cHRQcml2YXRlKiBwcml2ID0gV0VC
S0lUX01FRElBX0NFTkNfREVDUllQVF9HRVRfUFJJVkFURShzZWxmKTsKZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2dzdHJlYW1lci9lbWUvV2ViS2l0Q29tbW9u
RW5jcnlwdGlvbkRlY3J5cHRvckdTdHJlYW1lci5oIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvZ3N0cmVhbWVyL2VtZS9XZWJLaXRDb21tb25FbmNyeXB0aW9uRGVjcnlwdG9yR1N0
cmVhbWVyLmgKaW5kZXggMjIyMTEyNTRlYjdkOWVmNTQ2NjA1N2ZkN2Q1NDM0MjE5ZWNlZjJkZC4u
ODI5OWQzOWQyZWMwNjAxMmI4ZTIxY2ViMWFlY2M2NzkyNzZlODU2NyAxMDA2NDQKLS0tIGEvU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZ3N0cmVhbWVyL2VtZS9XZWJLaXRDb21tb25F
bmNyeXB0aW9uRGVjcnlwdG9yR1N0cmVhbWVyLmgKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvZ3N0cmVhbWVyL2VtZS9XZWJLaXRDb21tb25FbmNyeXB0aW9uRGVjcnlwdG9y
R1N0cmVhbWVyLmgKQEAgLTI0LDYgKzI0LDcgQEAKIAogI2lmIEVOQUJMRShFTkNSWVBURURfTUVE
SUEpICYmIFVTRShHU1RSRUFNRVIpCiAKKyNpbmNsdWRlIDxDRE1JbnN0YW5jZS5oPgogI2luY2x1
ZGUgPGdzdC9iYXNlL2dzdGJhc2V0cmFuc2Zvcm0uaD4KICNpbmNsdWRlIDxnc3QvZ3N0Lmg+CiAK
QEAgLTUzLDggKzU0LDggQEAgc3RydWN0IF9XZWJLaXRNZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNy
eXB0Q2xhc3MgewogICAgIEdzdEJhc2VUcmFuc2Zvcm1DbGFzcyBwYXJlbnRDbGFzczsKIAogICAg
IGNvbnN0IGNoYXIqIHByb3RlY3Rpb25TeXN0ZW1JZDsKLSAgICBnYm9vbGVhbiAoKmhhbmRsZUtl
eVJlc3BvbnNlKShXZWJLaXRNZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNyeXB0KiwgR3N0RXZlbnQq
IGV2ZW50KTsKLSAgICBnYm9vbGVhbiAoKmRlY3J5cHQpKFdlYktpdE1lZGlhQ29tbW9uRW5jcnlw
dGlvbkRlY3J5cHQqLCBHc3RCdWZmZXIqIGl2QnVmZmVyLCBHc3RCdWZmZXIqIGtleUlEQnVmZmVy
LCBHc3RCdWZmZXIqIGJ1ZmZlciwgdW5zaWduZWQgc3ViU2FtcGxlc0NvdW50LCBHc3RCdWZmZXIq
IHN1YlNhbXBsZXNCdWZmZXIpOworICAgIGJvb2wgKCpoYW5kbGVLZXlSZXNwb25zZSkoV2ViS2l0
TWVkaWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdCosIFJlZlB0cjxXZWJDb3JlOjpDRE1JbnN0YW5j
ZT4pOworICAgIGJvb2wgKCpkZWNyeXB0KShXZWJLaXRNZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNy
eXB0KiwgR3N0QnVmZmVyKiBpdkJ1ZmZlciwgR3N0QnVmZmVyKiBrZXlJREJ1ZmZlciwgR3N0QnVm
ZmVyKiBidWZmZXIsIHVuc2lnbmVkIHN1YlNhbXBsZXNDb3VudCwgR3N0QnVmZmVyKiBzdWJTYW1w
bGVzQnVmZmVyKTsKIH07CiAKIEdfRU5EX0RFQ0xTCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9nc3RyZWFtZXIvbXNlL01lZGlhUGxheWVyUHJpdmF0ZUdTdHJl
YW1lck1TRS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9nc3RyZWFtZXIv
bXNlL01lZGlhUGxheWVyUHJpdmF0ZUdTdHJlYW1lck1TRS5jcHAKaW5kZXggNmJmZTQ4YTJlZDdi
MGJmYmRlODFjZTJkZDA1NGEzZjc3NTE2ZDQ5NC4uZTViNDQzZTZiMmQ3MjE3MmY2NzEyN2UxNmFh
YjBjM2Y3ZTJjYjg0MCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvZ3N0cmVhbWVyL21zZS9NZWRpYVBsYXllclByaXZhdGVHU3RyZWFtZXJNU0UuY3BwCisrKyBi
L1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2dzdHJlYW1lci9tc2UvTWVkaWFQbGF5
ZXJQcml2YXRlR1N0cmVhbWVyTVNFLmNwcApAQCAtNTUsMTEgKzU1LDYgQEAKICNpbmNsdWRlIDx3
dGYvdGV4dC9BdG9taWNTdHJpbmcuaD4KICNpbmNsdWRlIDx3dGYvdGV4dC9BdG9taWNTdHJpbmdI
YXNoLmg+CiAKLSNpZiBFTkFCTEUoRU5DUllQVEVEX01FRElBKQotI2luY2x1ZGUgIkNETUNsZWFy
S2V5LmgiCi0jaW5jbHVkZSAiU2hhcmVkQnVmZmVyLmgiCi0jZW5kaWYKLQogc3RhdGljIGNvbnN0
IGNoYXIqIGR1bXBSZWFkeVN0YXRlKFdlYkNvcmU6Ok1lZGlhUGxheWVyOjpSZWFkeVN0YXRlIHJl
YWR5U3RhdGUpCiB7CiAgICAgc3dpdGNoIChyZWFkeVN0YXRlKSB7CkBAIC05MDgsNDIgKzkwMyw2
IEBAIE1lZGlhVGltZSBNZWRpYVBsYXllclByaXZhdGVHU3RyZWFtZXJNU0U6Om1heE1lZGlhVGlt
ZVNlZWthYmxlKCkgY29uc3QKICAgICByZXR1cm4gcmVzdWx0OwogfQogCi0jaWYgRU5BQkxFKEVO
Q1JZUFRFRF9NRURJQSkKLXZvaWQgTWVkaWFQbGF5ZXJQcml2YXRlR1N0cmVhbWVyTVNFOjphdHRl
bXB0VG9EZWNyeXB0V2l0aExvY2FsSW5zdGFuY2UoKQotewotICAgIGlmIChpczxDRE1JbnN0YW5j
ZUNsZWFyS2V5PigqbV9jZG1JbnN0YW5jZSkpIHsKLSAgICAgICAgYXV0byYgY2xlYXJrZXlDRE1J
bnN0YW5jZSA9IGRvd25jYXN0PENETUluc3RhbmNlQ2xlYXJLZXk+KCptX2NkbUluc3RhbmNlKTsK
LSAgICAgICAgaWYgKGNsZWFya2V5Q0RNSW5zdGFuY2Uua2V5cygpLmlzRW1wdHkoKSkKLSAgICAg
ICAgICAgIHJldHVybjsKLQotICAgICAgICBHVmFsdWUga2V5SURMaXN0ID0gR19WQUxVRV9JTklU
LCBrZXlWYWx1ZUxpc3QgPSBHX1ZBTFVFX0lOSVQ7Ci0gICAgICAgIGdfdmFsdWVfaW5pdCgma2V5
SURMaXN0LCBHU1RfVFlQRV9MSVNUKTsKLSAgICAgICAgZ192YWx1ZV9pbml0KCZrZXlWYWx1ZUxp
c3QsIEdTVF9UWVBFX0xJU1QpOwotCi0gICAgICAgIGF1dG8gYXBwZW5kQnVmZmVyID0KLSAgICAg
ICAgICAgIFtdKEdWYWx1ZSogdmFsdWVMaXN0LCBjb25zdCBTaGFyZWRCdWZmZXImIGJ1ZmZlcikK
LSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBHVmFsdWUqIGJ1ZmZlclZhbHVlID0gZ19u
ZXcwKEdWYWx1ZSwgMSk7Ci0gICAgICAgICAgICAgICAgZ192YWx1ZV9pbml0KGJ1ZmZlclZhbHVl
LCBHU1RfVFlQRV9CVUZGRVIpOwotICAgICAgICAgICAgICAgIGdzdF92YWx1ZV90YWtlX2J1ZmZl
cihidWZmZXJWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgZ3N0X2J1ZmZlcl9uZXdfd3JhcHBl
ZChnX21lbWR1cChidWZmZXIuZGF0YSgpLCBidWZmZXIuc2l6ZSgpKSwgYnVmZmVyLnNpemUoKSkp
OwotICAgICAgICAgICAgICAgIGdzdF92YWx1ZV9saXN0X2FwcGVuZF9hbmRfdGFrZV92YWx1ZSh2
YWx1ZUxpc3QsIGJ1ZmZlclZhbHVlKTsKLSAgICAgICAgICAgIH07Ci0KLSAgICAgICAgZm9yIChh
dXRvJiBrZXkgOiBjbGVhcmtleUNETUluc3RhbmNlLmtleXMoKSkgewotICAgICAgICAgICAgYXBw
ZW5kQnVmZmVyKCZrZXlJRExpc3QsICprZXkua2V5SUREYXRhKTsKLSAgICAgICAgICAgIGFwcGVu
ZEJ1ZmZlcigma2V5VmFsdWVMaXN0LCAqa2V5LmtleVZhbHVlRGF0YSk7Ci0gICAgICAgIH0KLQot
ICAgICAgICBHVW5pcXVlUHRyPEdzdFN0cnVjdHVyZT4gc3RydWN0dXJlKGdzdF9zdHJ1Y3R1cmVf
bmV3X2VtcHR5KCJkcm0tY2lwaGVyLWNsZWFya2V5IikpOwotICAgICAgICBnc3Rfc3RydWN0dXJl
X3NldF92YWx1ZShzdHJ1Y3R1cmUuZ2V0KCksICJrZXktaWRzIiwgJmtleUlETGlzdCk7Ci0gICAg
ICAgIGdzdF9zdHJ1Y3R1cmVfc2V0X3ZhbHVlKHN0cnVjdHVyZS5nZXQoKSwgImtleS12YWx1ZXMi
LCAma2V5VmFsdWVMaXN0KTsKLQotICAgICAgICBnc3RfZWxlbWVudF9zZW5kX2V2ZW50KG1fcGxh
eWJhY2tQaXBlbGluZS0+cGlwZWxpbmUoKSwgZ3N0X2V2ZW50X25ld19jdXN0b20oR1NUX0VWRU5U
X0NVU1RPTV9ET1dOU1RSRUFNX09PQiwgc3RydWN0dXJlLnJlbGVhc2UoKSkpOwotICAgIH0KLX0K
LSNlbmRpZgotCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlLgogCiAjZW5kaWYgLy8gVVNFKEdTVFJF
QU1FUikKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2dzdHJl
YW1lci9tc2UvTWVkaWFQbGF5ZXJQcml2YXRlR1N0cmVhbWVyTVNFLmggYi9Tb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9nc3RyZWFtZXIvbXNlL01lZGlhUGxheWVyUHJpdmF0ZUdTdHJl
YW1lck1TRS5oCmluZGV4IDViNTY4MmY2NGI1ZDM1NDk0ZTgzOWI3YTM5NDRiYTdlNDA5ZWZjMTgu
LjJkZmE3MzJmY2JmMjZiYTY4N2YxYTk4MTRhYjc2NjNlZWY5ODU0NzQgMTAwNjQ0Ci0tLSBhL1Nv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2dzdHJlYW1lci9tc2UvTWVkaWFQbGF5ZXJQ
cml2YXRlR1N0cmVhbWVyTVNFLmgKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvZ3N0cmVhbWVyL21zZS9NZWRpYVBsYXllclByaXZhdGVHU3RyZWFtZXJNU0UuaApAQCAtODUs
MTAgKzg1LDYgQEAgcHVibGljOgogICAgIHN0YXRpYyBib29sIHN1cHBvcnRzQ29kZWMoU3RyaW5n
IGNvZGVjKTsKICAgICBzdGF0aWMgYm9vbCBzdXBwb3J0c0FsbENvZGVjcyhjb25zdCBWZWN0b3I8
U3RyaW5nPiYgY29kZWNzKTsKIAotI2lmIEVOQUJMRShFTkNSWVBURURfTUVESUEpCi0gICAgdm9p
ZCBhdHRlbXB0VG9EZWNyeXB0V2l0aExvY2FsSW5zdGFuY2UoKSBmaW5hbDsKLSNlbmRpZgotCiBw
cml2YXRlOgogICAgIHN0YXRpYyB2b2lkIGdldFN1cHBvcnRlZFR5cGVzKEhhc2hTZXQ8U3RyaW5n
LCBBU0NJSUNhc2VJbnNlbnNpdGl2ZUhhc2g+Jik7CiAgICAgc3RhdGljIE1lZGlhUGxheWVyOjpT
dXBwb3J0c1R5cGUgc3VwcG9ydHNUeXBlKGNvbnN0IE1lZGlhRW5naW5lU3VwcG9ydFBhcmFtZXRl
cnMmKTsKZGlmZiAtLWdpdCBhL1Rvb2xzL0NoYW5nZUxvZyBiL1Rvb2xzL0NoYW5nZUxvZwppbmRl
eCA2YmI0MTAwOTM0NjQwOWM2ODg5Mjc2YjgzNjU1YzJjNjYyOWU4ODM5Li5lZGZkOWJmYWZlZTYy
NWRlMjAzYzEzYzk5OWM2MjM2NGFjZGYyODg3IDEwMDY0NAotLS0gYS9Ub29scy9DaGFuZ2VMb2cK
KysrIGIvVG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTMgQEAKKzIwMTktMDEtMTggIENoYXJs
aWUgVHVybmVyICA8Y3R1cm5lckBpZ2FsaWEuY29tPgorCisgICAgICAgIFtHU3RyZWFtZXJdW0VN
RV1bQ2xlYXJLZXldIFJlcXVlc3Qga2V5cyBmcm9tIENETUluc3RhbmNlIHJhdGhlciB0aGFuIHBh
c3NpbmcgdmlhIGJ1cyBtZXNzYWdlcworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9z
aG93X2J1Zy5jZ2k/aWQ9MTkyMjI5CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgWGFiaWVyIFJvZHJp
Z3Vlei1DYWx2YXIuCisKKyAgICAgICAgKiBNaW5pQnJvd3Nlci93cGUvbWFpbi5jcHA6CisgICAg
ICAgIChtYWluKTogRW5hYmxlIGVuY3J5cHRlZC1tZWRpYSBieSBkZWZhdWx0LgorCiAyMDE5LTAx
LTE3ICBXZW5zb24gSHNpZWggIDx3ZW5zb25faHNpZWhAYXBwbGUuY29tPgogCiAgICAgICAgIFtp
T1NdIENvbnRlbnQgb2Zmc2V0IGp1bXBzIGVycmF0aWNhbGx5IHdoZW4gYXV0b3Njcm9sbGluZyBu
ZWFyIHNjcm9sbCB2aWV3IGNvbnRlbnQgaW5zZXQgYXJlYXMKZGlmZiAtLWdpdCBhL1Rvb2xzL01p
bmlCcm93c2VyL3dwZS9tYWluLmNwcCBiL1Rvb2xzL01pbmlCcm93c2VyL3dwZS9tYWluLmNwcApp
bmRleCA2MmNmNTVkYjMxMWRiODFmMjlhNWUxM2EzNmY2YTgxZDkyMDZhZDExLi5lZDc3NTI4YjJj
ZWIyZmQwYzQxMWJmNmRlMjZlZjNlMjlhMDEzNTU4IDEwMDY0NAotLS0gYS9Ub29scy9NaW5pQnJv
d3Nlci93cGUvbWFpbi5jcHAKKysrIGIvVG9vbHMvTWluaUJyb3dzZXIvd3BlL21haW4uY3BwCkBA
IC0xNzcsNiArMTc3LDcgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKICAgICAg
ICAgImVuYWJsZS1kZXZlbG9wZXItZXh0cmFzIiwgVFJVRSwKICAgICAgICAgImVuYWJsZS13ZWJn
bCIsIFRSVUUsCiAgICAgICAgICJlbmFibGUtbWVkaWEtc3RyZWFtIiwgVFJVRSwKKyAgICAgICAg
ImVuYWJsZS1lbmNyeXB0ZWQtbWVkaWEiLCBUUlVFLAogICAgICAgICBudWxscHRyKTsKIAogICAg
IGF1dG8qIHdlYlZpZXcgPSBXRUJLSVRfV0VCX1ZJRVcoZ19vYmplY3RfbmV3KFdFQktJVF9UWVBF
X1dFQl9WSUVXLAo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>359480</attachid>
            <date>2019-01-18 07:20:26 -0800</date>
            <delta_ts>2019-01-18 07:59:27 -0800</delta_ts>
            <desc>Patch for landing</desc>
            <filename>bug-192229-20190118152025.patch</filename>
            <type>text/plain</type>
            <size>31219</size>
            <attacher name="Charlie Turner">cturner</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjQwMTQwCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggNzIyM2ZjNWZkNzgyOGU5
MWE1MWVkOGU0OGY3ZTdjZWFjMzBlZDk2Ni4uZThmOWNkYzg0MGE1YTgwYzk4Mzc1OWY1NTE3Yjhi
NTIwYmY1MjdiMyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDU2IEBACisyMDE5LTAxLTE4ICBDaGFy
bGllIFR1cm5lciAgPGN0dXJuZXJAaWdhbGlhLmNvbT4KKworICAgICAgICBbR1N0cmVhbWVyXVtF
TUVdW0NsZWFyS2V5XSBSZXF1ZXN0IGtleXMgZnJvbSBDRE1JbnN0YW5jZSByYXRoZXIgdGhhbiBw
YXNzaW5nIHZpYSBidXMgbWVzc2FnZXMKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcv
c2hvd19idWcuY2dpP2lkPTE5MjIyOQorCisgICAgICAgIFJldmlld2VkIGJ5IFhhYmllciBSb2Ry
aWd1ZXotQ2FsdmFyLgorCisgICAgICAgIENvdmVyZWQgYnkgZXhpc3RpbmcgdGVzdHMuCisKKyAg
ICAgICAgKiBwbGF0Zm9ybS9lbmNyeXB0ZWRtZWRpYS9jbGVhcmtleS9DRE1DbGVhcktleS5jcHA6
CisgICAgICAgIChXZWJDb3JlOjpwYXJzZUxpY2Vuc2VGb3JtYXQpOiBUaGVyZSBpcyBhIGRlZmVj
dCBpbiBzb21lIEMrKzExCisgICAgICAgIGNvbXBpbGVzIHdoZXJlIHRoZXkgd2lsbCBjb3B5IHRo
aXMgcmV0dXJuIHZhbHVlIHNpbmNlIHRoZSB0eXBlCisgICAgICAgIGRvZXNuJ3QgZXhhY3RseSBt
YXRjaC4gRm9yY2UgYSBtb3ZlIHdpdGggV1RGTW92ZS4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFw
aGljcy9nc3RyZWFtZXIvTWVkaWFQbGF5ZXJQcml2YXRlR1N0cmVhbWVyQmFzZS5jcHA6CisgICAg
ICAgIChXZWJDb3JlOjpNZWRpYVBsYXllclByaXZhdGVHU3RyZWFtZXJCYXNlOjpkaXNwYXRjaERl
Y3J5cHRpb25LZXkpOgorICAgICAgICBEZWxldGVkLiBObyBsb25nZXIgdXNlZCBieSBhbnl0aGlu
Zy4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9nc3RyZWFtZXIvTWVkaWFQbGF5ZXJQcml2
YXRlR1N0cmVhbWVyQmFzZS5oOiBEaXR0by4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9n
c3RyZWFtZXIvZW1lL1dlYktpdENsZWFyS2V5RGVjcnlwdG9yR1N0cmVhbWVyLmNwcDoKKyAgICAg
ICAgUmVuYW1lIHRoZXNlIG1ldGhvZHMgdG8gYXZvaWQgIm5hbWVzcGFjaW5nIG5hbWVzIi4KKyAg
ICAgICAgKHdlYmtpdF9tZWRpYV9jbGVhcl9rZXlfZGVjcnlwdF9jbGFzc19pbml0KToKKyAgICAg
ICAgKGZpbmFsaXplKToKKyAgICAgICAgKGhhbmRsZUtleVJlc3BvbnNlKTogVGhpcyBpcyBhIHRl
bXBvcmFyeSBmaXgsIHdlIG5lZWQgc29tZSBtb3JlCisgICAgICAgIHJlb3JnYW5pc2F0aW9uIHRv
IGJlIGZ1bGwgZHJpdmVuIGJ5IENETUluc3RhbmNlIEFQSXMgZm9yIGRlY3J5cHRpb24uCisgICAg
ICAgIChmaW5kQW5kU2V0S2V5KToKKyAgICAgICAgKGRlY3J5cHQpOgorICAgICAgICAod2ViS2l0
TWVkaWFDbGVhcktleURlY3J5cHRvckZpbmFsaXplKTogRGVsZXRlZC4KKyAgICAgICAgKHdlYktp
dE1lZGlhQ2xlYXJLZXlEZWNyeXB0b3JIYW5kbGVLZXlSZXNwb25zZSk6IERlbGV0ZWQuCisgICAg
ICAgICh3ZWJLaXRNZWRpYUNsZWFyS2V5RGVjcnlwdG9yRmluZEFuZFNldEtleSk6IERlbGV0ZWQu
CisgICAgICAgICh3ZWJLaXRNZWRpYUNsZWFyS2V5RGVjcnlwdG9yRGVjcnlwdCk6IERlbGV0ZWQu
CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvZ3N0cmVhbWVyL2VtZS9XZWJLaXRDb21tb25F
bmNyeXB0aW9uRGVjcnlwdG9yR1N0cmVhbWVyLmNwcDogRGl0dG8uCisgICAgICAgICh3ZWJraXRf
bWVkaWFfY29tbW9uX2VuY3J5cHRpb25fZGVjcnlwdF9jbGFzc19pbml0KToKKyAgICAgICAgKGZp
bmFsaXplKToKKyAgICAgICAgKHRyYW5zZm9ybUNhcHMpOgorICAgICAgICAodHJhbnNmb3JtSW5Q
bGFjZSk6CisgICAgICAgIChpc0NETUluc3RhbmNlQXZhaWxhYmxlKToKKyAgICAgICAgKHNpbmtF
dmVudEhhbmRsZXIpOgorICAgICAgICAocXVlcnlIYW5kbGVyKToKKyAgICAgICAgKGNoYW5nZVN0
YXRlKToKKyAgICAgICAgKHNldENvbnRleHQpOgorICAgICAgICAod2ViS2l0TWVkaWFDb21tb25F
bmNyeXB0aW9uRGVjcnlwdG9yRmluYWxpemUpOiBEZWxldGVkLgorICAgICAgICAod2Via2l0TWVk
aWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdFRyYW5zZm9ybUNhcHMpOiBEZWxldGVkLgorICAgICAg
ICAod2Via2l0TWVkaWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdFRyYW5zZm9ybUluUGxhY2UpOiBE
ZWxldGVkLgorICAgICAgICAod2Via2l0TWVkaWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdElzQ0RN
SW5zdGFuY2VBdmFpbGFibGUpOiBEZWxldGVkLgorICAgICAgICAod2Via2l0TWVkaWFDb21tb25F
bmNyeXB0aW9uRGVjcnlwdFNpbmtFdmVudEhhbmRsZXIpOiBEZWxldGVkLgorICAgICAgICAod2Vi
a2l0TWVkaWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdG9yUXVlcnlIYW5kbGVyKTogRGVsZXRlZC4K
KyAgICAgICAgKHdlYktpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5cHRvckNoYW5nZVN0YXRl
KTogRGVsZXRlZC4KKyAgICAgICAgKHdlYktpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5cHRv
clNldENvbnRleHQpOiBEZWxldGVkLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2dzdHJl
YW1lci9lbWUvV2ViS2l0Q29tbW9uRW5jcnlwdGlvbkRlY3J5cHRvckdTdHJlYW1lci5oOgorICAg
ICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2dzdHJlYW1lci9tc2UvTWVkaWFQbGF5ZXJQcml2YXRl
R1N0cmVhbWVyTVNFLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6Ok1lZGlhUGxheWVyUHJpdmF0ZUdT
dHJlYW1lck1TRTo6YXR0ZW1wdFRvRGVjcnlwdFdpdGhMb2NhbEluc3RhbmNlKToKKyAgICAgICAg
RGVsZXRlZC4gTm8gbG9uZ2VyIHBhc3Npbmcga2V5IGluZm9ybWF0aW9uIG92ZXIgYnVzIG1lc3Nh
Z2VzLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2dzdHJlYW1lci9tc2UvTWVkaWFQbGF5
ZXJQcml2YXRlR1N0cmVhbWVyTVNFLmg6CisKIDIwMTktMDEtMTggIFNpbW9uIEZyYXNlciAgPHNp
bW9uLmZyYXNlckBhcHBsZS5jb20+CiAKICAgICAgICAgU2Nyb2xsaW5nQ29vcmRpbmF0b3I6OnNj
cm9sbGFibGVBcmVhU2Nyb2xsTGF5ZXJEaWRDaGFuZ2UoKSBjYW4gYmUgcmVtb3ZlZApkaWZmIC0t
Z2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZW5jcnlwdGVkbWVkaWEvY2xlYXJrZXkvQ0RN
Q2xlYXJLZXkuY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZW5jcnlwdGVkbWVkaWEvY2xl
YXJrZXkvQ0RNQ2xlYXJLZXkuY3BwCmluZGV4IGJlN2RmY2NhMzUxODRiYzk5ZGU0ZTZkMTRiOThj
Y2Q4NThhZjU4MmEuLmI5NzM4OTI3MzVlMTYzNTdlMjllNzEwNTJmZWJiNjM1NWZhZjQ1OWQgMTAw
NjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2VuY3J5cHRlZG1lZGlhL2NsZWFya2V5
L0NETUNsZWFyS2V5LmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9lbmNyeXB0ZWRt
ZWRpYS9jbGVhcmtleS9DRE1DbGVhcktleS5jcHAKQEAgLTEyNCw4ICsxMjQsNyBAQCBzdGF0aWMg
T3B0aW9uYWw8VmVjdG9yPENETUluc3RhbmNlQ2xlYXJLZXk6OktleT4+IHBhcnNlTGljZW5zZUZv
cm1hdChjb25zdCBKU09OOgogICAgICAgICB9KTsKICAgICBpZiAoIXZhbGlkRm9ybWF0KQogICAg
ICAgICByZXR1cm4gV1RGOjpudWxsb3B0OwotCi0gICAgcmV0dXJuIGRlY29kZWRLZXlzOworICAg
IHJldHVybiBXVEZNb3ZlKGRlY29kZWRLZXlzKTsKIH0KIAogc3RhdGljIGJvb2wgcGFyc2VMaWNl
bnNlUmVsZWFzZUFja25vd2xlZGdlbWVudEZvcm1hdChjb25zdCBKU09OOjpPYmplY3QmIHJvb3Qp
CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9nc3RyZWFtZXIv
TWVkaWFQbGF5ZXJQcml2YXRlR1N0cmVhbWVyQmFzZS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9nc3RyZWFtZXIvTWVkaWFQbGF5ZXJQcml2YXRlR1N0cmVhbWVyQmFzZS5j
cHAKaW5kZXggMzU2MzUxMzQyZjBhNTUxOTc5OThmZTcxODFiOWM4YTU1M2ZkYzY2NC4uZTEzMGMy
MDA4M2Q1NTRmMGFlMTY4NGFjZWY4NjczMWM4MzA2MGZiNyAxMDA2NDQKLS0tIGEvU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZ3N0cmVhbWVyL01lZGlhUGxheWVyUHJpdmF0ZUdTdHJl
YW1lckJhc2UuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2dzdHJl
YW1lci9NZWRpYVBsYXllclByaXZhdGVHU3RyZWFtZXJCYXNlLmNwcApAQCAtMTI1NCwxMyArMTI1
NCw2IEBAIHZvaWQgTWVkaWFQbGF5ZXJQcml2YXRlR1N0cmVhbWVyQmFzZTo6YXR0ZW1wdFRvRGVj
cnlwdFdpdGhMb2NhbEluc3RhbmNlKCkKICAgICBHU1RfREVCVUcoImF0dGVtcHRpbmcgdG8gZGVj
cnlwdCwgZXZlbnQgaGFuZGxlZCAlcyIsIGJvb2xGb3JQcmludGluZyhldmVudEhhbmRsZWQpKTsK
IH0KIAotdm9pZCBNZWRpYVBsYXllclByaXZhdGVHU3RyZWFtZXJCYXNlOjpkaXNwYXRjaERlY3J5
cHRpb25LZXkoR3N0QnVmZmVyKiBidWZmZXIpCi17Ci0gICAgYm9vbCBldmVudEhhbmRsZWQgPSBn
c3RfZWxlbWVudF9zZW5kX2V2ZW50KHBpcGVsaW5lKCksIGdzdF9ldmVudF9uZXdfY3VzdG9tKEdT
VF9FVkVOVF9DVVNUT01fRE9XTlNUUkVBTV9PT0IsCi0gICAgICAgIGdzdF9zdHJ1Y3R1cmVfbmV3
KCJkcm0tY2lwaGVyIiwgImtleSIsIEdTVF9UWVBFX0JVRkZFUiwgYnVmZmVyLCBudWxscHRyKSkp
OwotICAgIEdTVF9UUkFDRSgiZW1pdHRlZCBkZWNyeXB0aW9uIGNpcGhlciBrZXkgb24gcGlwZWxp
bmUsIGV2ZW50IGhhbmRsZWQgJXMiLCBib29sRm9yUHJpbnRpbmcoZXZlbnRIYW5kbGVkKSk7Ci19
Ci0KIHZvaWQgTWVkaWFQbGF5ZXJQcml2YXRlR1N0cmVhbWVyQmFzZTo6aGFuZGxlUHJvdGVjdGlv
bkV2ZW50KEdzdEV2ZW50KiBldmVudCkKIHsKICAgICBpZiAobV9oYW5kbGVkUHJvdGVjdGlvbkV2
ZW50cy5jb250YWlucyhHU1RfRVZFTlRfU0VRTlVNKGV2ZW50KSkpIHsKZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2dzdHJlYW1lci9NZWRpYVBsYXllclByaXZh
dGVHU3RyZWFtZXJCYXNlLmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9nc3Ry
ZWFtZXIvTWVkaWFQbGF5ZXJQcml2YXRlR1N0cmVhbWVyQmFzZS5oCmluZGV4IDQyMzgxZDJmNzdi
OGMxNGMxOWQwN2FhMGZjNmQ3Zjg1OWM2OWZhYWEuLjc2YWE1Y2NmZDg5MzFmMGM0NDA5NWRmZDBk
NzBmNGFhOGYzMWU1OWMgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL2dzdHJlYW1lci9NZWRpYVBsYXllclByaXZhdGVHU3RyZWFtZXJCYXNlLmgKKysrIGIvU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZ3N0cmVhbWVyL01lZGlhUGxheWVyUHJpdmF0
ZUdTdHJlYW1lckJhc2UuaApAQCAtMTQ4LDcgKzE0OCw2IEBAIHB1YmxpYzoKICNpZiBFTkFCTEUo
RU5DUllQVEVEX01FRElBKQogICAgIHZvaWQgY2RtSW5zdGFuY2VBdHRhY2hlZChDRE1JbnN0YW5j
ZSYpIG92ZXJyaWRlOwogICAgIHZvaWQgY2RtSW5zdGFuY2VEZXRhY2hlZChDRE1JbnN0YW5jZSYp
IG92ZXJyaWRlOwotICAgIHZvaWQgZGlzcGF0Y2hEZWNyeXB0aW9uS2V5KEdzdEJ1ZmZlciopOwog
ICAgIHZvaWQgaGFuZGxlUHJvdGVjdGlvbkV2ZW50KEdzdEV2ZW50Kik7CiAgICAgdmlydHVhbCB2
b2lkIGF0dGVtcHRUb0RlY3J5cHRXaXRoTG9jYWxJbnN0YW5jZSgpOwogICAgIHZvaWQgYXR0ZW1w
dFRvRGVjcnlwdFdpdGhJbnN0YW5jZShDRE1JbnN0YW5jZSYpIGZpbmFsOwpkaWZmIC0tZ2l0IGEv
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZ3N0cmVhbWVyL2VtZS9XZWJLaXRDbGVh
cktleURlY3J5cHRvckdTdHJlYW1lci5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9nc3RyZWFtZXIvZW1lL1dlYktpdENsZWFyS2V5RGVjcnlwdG9yR1N0cmVhbWVyLmNwcApp
bmRleCAyODRjOGEwYzFjNDQxODUyNGQ3OTM1MmEyMDQ1NDk2MjU3MmJkMzVhLi43MTMwMzhhNzdk
MGIwZTRiMzBhZjAxODk4ZTZjNzVjOGYyY2FkNDNiIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9nc3RyZWFtZXIvZW1lL1dlYktpdENsZWFyS2V5RGVjcnlwdG9y
R1N0cmVhbWVyLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9nc3Ry
ZWFtZXIvZW1lL1dlYktpdENsZWFyS2V5RGVjcnlwdG9yR1N0cmVhbWVyLmNwcApAQCAtMjQsMjgg
KzI0LDI2IEBACiAKICNpZiBFTkFCTEUoRU5DUllQVEVEX01FRElBKSAmJiBVU0UoR1NUUkVBTUVS
KQogCisjaW5jbHVkZSAiQ0RNQ2xlYXJLZXkuaCIKICNpbmNsdWRlICJHU3RyZWFtZXJDb21tb24u
aCIKICNpbmNsdWRlICJHU3RyZWFtZXJFTUVVdGlsaXRpZXMuaCIKICNpbmNsdWRlIDxnY3J5cHQu
aD4KICNpbmNsdWRlIDxnc3QvYmFzZS9nc3RieXRlcmVhZGVyLmg+CiAjaW5jbHVkZSA8d3RmL1J1
bkxvb3AuaD4KIAotI2RlZmluZSBDTEVBUktFWV9TSVpFIDE2Cit1c2luZyBuYW1lc3BhY2UgV2Vi
Q29yZTsKIAotc3RydWN0IEtleSB7Ci0gICAgR1JlZlB0cjxHc3RCdWZmZXI+IGtleUlEOwotICAg
IEdSZWZQdHI8R3N0QnVmZmVyPiBrZXlWYWx1ZTsKLX07CisjZGVmaW5lIENMRUFSS0VZX1NJWkUg
MTYKIAogI2RlZmluZSBXRUJLSVRfTUVESUFfQ0tfREVDUllQVF9HRVRfUFJJVkFURShvYmopIChH
X1RZUEVfSU5TVEFOQ0VfR0VUX1BSSVZBVEUoKG9iaiksIFdFQktJVF9UWVBFX01FRElBX0NLX0RF
Q1JZUFQsIFdlYktpdE1lZGlhQ2xlYXJLZXlEZWNyeXB0UHJpdmF0ZSkpCiBzdHJ1Y3QgX1dlYktp
dE1lZGlhQ2xlYXJLZXlEZWNyeXB0UHJpdmF0ZSB7Ci0gICAgVmVjdG9yPEtleT4ga2V5czsKKyAg
ICBSZWZQdHI8Q0RNSW5zdGFuY2VDbGVhcktleT4gY2RtSW5zdGFuY2U7CiAgICAgZ2NyeV9jaXBo
ZXJfaGRfdCBoYW5kbGU7CiB9OwogCi1zdGF0aWMgdm9pZCB3ZWJLaXRNZWRpYUNsZWFyS2V5RGVj
cnlwdG9yRmluYWxpemUoR09iamVjdCopOwotc3RhdGljIGdib29sZWFuIHdlYktpdE1lZGlhQ2xl
YXJLZXlEZWNyeXB0b3JIYW5kbGVLZXlSZXNwb25zZShXZWJLaXRNZWRpYUNvbW1vbkVuY3J5cHRp
b25EZWNyeXB0KiBzZWxmLCBHc3RFdmVudCopOwotc3RhdGljIGdib29sZWFuIHdlYktpdE1lZGlh
Q2xlYXJLZXlEZWNyeXB0b3JEZWNyeXB0KFdlYktpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5
cHQqLCBHc3RCdWZmZXIqIGl2LCBHc3RCdWZmZXIqIGtleWlkLCBHc3RCdWZmZXIqIHNhbXBsZSwg
dW5zaWduZWQgc3ViU2FtcGxlc0NvdW50LCBHc3RCdWZmZXIqIHN1YlNhbXBsZXMpOworc3RhdGlj
IHZvaWQgZmluYWxpemUoR09iamVjdCopOworc3RhdGljIGJvb2wgaGFuZGxlS2V5UmVzcG9uc2Uo
V2ViS2l0TWVkaWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdCogc2VsZiwgUmVmUHRyPENETUluc3Rh
bmNlPik7CitzdGF0aWMgYm9vbCBkZWNyeXB0KFdlYktpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRl
Y3J5cHQqLCBHc3RCdWZmZXIqIGl2LCBHc3RCdWZmZXIqIGtleWlkLCBHc3RCdWZmZXIqIHNhbXBs
ZSwgdW5zaWduZWQgc3ViU2FtcGxlc0NvdW50LCBHc3RCdWZmZXIqIHN1YlNhbXBsZXMpOwogCiBH
U1RfREVCVUdfQ0FURUdPUllfU1RBVElDKHdlYmtpdF9tZWRpYV9jbGVhcl9rZXlfZGVjcnlwdF9k
ZWJ1Z19jYXRlZ29yeSk7CiAjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCB3ZWJraXRfbWVkaWFfY2xl
YXJfa2V5X2RlY3J5cHRfZGVidWdfY2F0ZWdvcnkKQEAgLTY5LDcgKzY3LDcgQEAgR19ERUZJTkVf
VFlQRShXZWJLaXRNZWRpYUNsZWFyS2V5RGVjcnlwdCwgd2Via2l0X21lZGlhX2NsZWFyX2tleV9k
ZWNyeXB0LCBXRUJLSVQKIHN0YXRpYyB2b2lkIHdlYmtpdF9tZWRpYV9jbGVhcl9rZXlfZGVjcnlw
dF9jbGFzc19pbml0KFdlYktpdE1lZGlhQ2xlYXJLZXlEZWNyeXB0Q2xhc3MqIGtsYXNzKQogewog
ICAgIEdPYmplY3RDbGFzcyogZ29iamVjdENsYXNzID0gR19PQkpFQ1RfQ0xBU1Moa2xhc3MpOwot
ICAgIGdvYmplY3RDbGFzcy0+ZmluYWxpemUgPSB3ZWJLaXRNZWRpYUNsZWFyS2V5RGVjcnlwdG9y
RmluYWxpemU7CisgICAgZ29iamVjdENsYXNzLT5maW5hbGl6ZSA9IGZpbmFsaXplOwogCiAgICAg
R3N0RWxlbWVudENsYXNzKiBlbGVtZW50Q2xhc3MgPSBHU1RfRUxFTUVOVF9DTEFTUyhrbGFzcyk7
CiAgICAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3BhZF90ZW1wbGF0ZShlbGVtZW50Q2xhc3MsIGdz
dF9zdGF0aWNfcGFkX3RlbXBsYXRlX2dldCgmc2lua1RlbXBsYXRlKSk7CkBAIC04NSw5ICs4Myw5
IEBAIHN0YXRpYyB2b2lkIHdlYmtpdF9tZWRpYV9jbGVhcl9rZXlfZGVjcnlwdF9jbGFzc19pbml0
KFdlYktpdE1lZGlhQ2xlYXJLZXlEZWNyeXB0CiAgICAgICAgICJ3ZWJraXRjbGVhcmtleSIsIDAs
ICJDbGVhcktleSBkZWNyeXB0b3IiKTsKIAogICAgIFdlYktpdE1lZGlhQ29tbW9uRW5jcnlwdGlv
bkRlY3J5cHRDbGFzcyogY2VuY0NsYXNzID0gV0VCS0lUX01FRElBX0NFTkNfREVDUllQVF9DTEFT
UyhrbGFzcyk7Ci0gICAgY2VuY0NsYXNzLT5wcm90ZWN0aW9uU3lzdGVtSWQgPSBXZWJDb3JlOjpH
U3RyZWFtZXJFTUVVdGlsaXRpZXM6OnNfQ2xlYXJLZXlVVUlEOwotICAgIGNlbmNDbGFzcy0+aGFu
ZGxlS2V5UmVzcG9uc2UgPSBHU1RfREVCVUdfRlVOQ1BUUih3ZWJLaXRNZWRpYUNsZWFyS2V5RGVj
cnlwdG9ySGFuZGxlS2V5UmVzcG9uc2UpOwotICAgIGNlbmNDbGFzcy0+ZGVjcnlwdCA9IEdTVF9E
RUJVR19GVU5DUFRSKHdlYktpdE1lZGlhQ2xlYXJLZXlEZWNyeXB0b3JEZWNyeXB0KTsKKyAgICBj
ZW5jQ2xhc3MtPnByb3RlY3Rpb25TeXN0ZW1JZCA9IEdTdHJlYW1lckVNRVV0aWxpdGllczo6c19D
bGVhcktleVVVSUQ7CisgICAgY2VuY0NsYXNzLT5oYW5kbGVLZXlSZXNwb25zZSA9IEdTVF9ERUJV
R19GVU5DUFRSKGhhbmRsZUtleVJlc3BvbnNlKTsKKyAgICBjZW5jQ2xhc3MtPmRlY3J5cHQgPSBH
U1RfREVCVUdfRlVOQ1BUUihkZWNyeXB0KTsKIAogICAgIGdfdHlwZV9jbGFzc19hZGRfcHJpdmF0
ZShrbGFzcywgc2l6ZW9mKFdlYktpdE1lZGlhQ2xlYXJLZXlEZWNyeXB0UHJpdmF0ZSkpOwogfQpA
QCAtMTA0LDcgKzEwMiw3IEBAIHN0YXRpYyB2b2lkIHdlYmtpdF9tZWRpYV9jbGVhcl9rZXlfZGVj
cnlwdF9pbml0KFdlYktpdE1lZGlhQ2xlYXJLZXlEZWNyeXB0KiBzZWxmCiAgICAgfQogfQogCi1z
dGF0aWMgdm9pZCB3ZWJLaXRNZWRpYUNsZWFyS2V5RGVjcnlwdG9yRmluYWxpemUoR09iamVjdCog
b2JqZWN0KQorc3RhdGljIHZvaWQgZmluYWxpemUoR09iamVjdCogb2JqZWN0KQogewogICAgIFdl
YktpdE1lZGlhQ2xlYXJLZXlEZWNyeXB0KiBzZWxmID0gV0VCS0lUX01FRElBX0NLX0RFQ1JZUFQo
b2JqZWN0KTsKICAgICBXZWJLaXRNZWRpYUNsZWFyS2V5RGVjcnlwdFByaXZhdGUqIHByaXYgPSBz
ZWxmLT5wcml2OwpAQCAtMTE0LDY1ICsxMTIsMzAgQEAgc3RhdGljIHZvaWQgd2ViS2l0TWVkaWFD
bGVhcktleURlY3J5cHRvckZpbmFsaXplKEdPYmplY3QqIG9iamVjdCkKICAgICBHU1RfQ0FMTF9Q
QVJFTlQoR19PQkpFQ1RfQ0xBU1MsIGZpbmFsaXplLCAob2JqZWN0KSk7CiB9CiAKLXN0YXRpYyBn
Ym9vbGVhbiB3ZWJLaXRNZWRpYUNsZWFyS2V5RGVjcnlwdG9ySGFuZGxlS2V5UmVzcG9uc2UoV2Vi
S2l0TWVkaWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdCogc2VsZiwgR3N0RXZlbnQqIGV2ZW50KQor
c3RhdGljIGJvb2wgaGFuZGxlS2V5UmVzcG9uc2UoV2ViS2l0TWVkaWFDb21tb25FbmNyeXB0aW9u
RGVjcnlwdCogc2VsZiwgUmVmUHRyPENETUluc3RhbmNlPiBjZG1JbnN0YW5jZSkKIHsKICAgICBX
ZWJLaXRNZWRpYUNsZWFyS2V5RGVjcnlwdFByaXZhdGUqIHByaXYgPSBXRUJLSVRfTUVESUFfQ0tf
REVDUllQVF9HRVRfUFJJVkFURShXRUJLSVRfTUVESUFfQ0tfREVDUllQVChzZWxmKSk7Ci0gICAg
Y29uc3QgR3N0U3RydWN0dXJlKiBzdHJ1Y3R1cmUgPSBnc3RfZXZlbnRfZ2V0X3N0cnVjdHVyZShl
dmVudCk7Ci0KLSAgICAvLyBEZW1hbmQgdGhlIGBkcm0tY2lwaGVyLWNsZWFya2V5YCBHc3RTdHJ1
Y3R1cmUuCi0gICAgaWYgKCFnc3Rfc3RydWN0dXJlX2hhc19uYW1lKHN0cnVjdHVyZSwgImRybS1j
aXBoZXItY2xlYXJrZXkiKSkKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgLy8gUmV0cmll
dmUgdGhlIGBrZXktaWRzYCBHU3RyZWFtZXIgdmFsdWUgbGlzdC4KLSAgICBjb25zdCBHVmFsdWUq
IGtleUlEc0xpc3QgPSBnc3Rfc3RydWN0dXJlX2dldF92YWx1ZShzdHJ1Y3R1cmUsICJrZXktaWRz
Iik7Ci0gICAgQVNTRVJUKGtleUlEc0xpc3QgJiYgR1NUX1ZBTFVFX0hPTERTX0xJU1Qoa2V5SURz
TGlzdCkpOwotICAgIHVuc2lnbmVkIGtleUlEc0xpc3RTaXplID0gZ3N0X3ZhbHVlX2xpc3RfZ2V0
X3NpemUoa2V5SURzTGlzdCk7Ci0KLSAgICAvLyBSZXRyaWV2ZSB0aGUgYGtleS12YWx1ZXNgIEdT
dHJlYW1lciB2YWx1ZSBsaXN0LgotICAgIGNvbnN0IEdWYWx1ZSoga2V5VmFsdWVzTGlzdCA9IGdz
dF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlKHN0cnVjdHVyZSwgImtleS12YWx1ZXMiKTsKLSAgICBBU1NF
UlQoa2V5VmFsdWVzTGlzdCAmJiBHU1RfVkFMVUVfSE9MRFNfTElTVChrZXlWYWx1ZXNMaXN0KSk7
Ci0gICAgdW5zaWduZWQga2V5VmFsdWVzTGlzdFNpemUgPSBnc3RfdmFsdWVfbGlzdF9nZXRfc2l6
ZShrZXlWYWx1ZXNMaXN0KTsKLQotICAgIC8vIEJhaWwgaWYgc29tZWhvdyB0aGUgdHdvIGxpc3Rz
IGRvbid0IG1hdGNoIGluIHNpemUuCi0gICAgaWYgKGtleUlEc0xpc3RTaXplICE9IGtleVZhbHVl
c0xpc3RTaXplKQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0KLSAgICAvLyBDbGVhciBvdXQgdGhl
IHByZXZpb3VzIGxpc3Qgb2Yga2V5cy4KLSAgICBwcml2LT5rZXlzLmNsZWFyKCk7Ci0KLSAgICAv
LyBBcHBlbmQgdGhlIHJldHJpZXZlZCBHc3RCdWZmZXIgb2JqZWN0cyBjb250YWluaW5nIGVhY2gg
a2V5J3MgSUQgYW5kIHZhbHVlIHRvIHRoZSBsaXN0IG9mIEtleSBvYmplY3RzLgotICAgIGZvciAo
dW5zaWduZWQgaSA9IDA7IGkgPCBrZXlJRHNMaXN0U2l6ZTsgKytpKSB7Ci0gICAgICAgIEdSZWZQ
dHI8R3N0QnVmZmVyPiBrZXlJREJ1ZmZlcihnc3RfdmFsdWVfZ2V0X2J1ZmZlcihnc3RfdmFsdWVf
bGlzdF9nZXRfdmFsdWUoa2V5SURzTGlzdCwgaSkpKTsKLSAgICAgICAgR1JlZlB0cjxHc3RCdWZm
ZXI+IGtleVZhbHVlQnVmZmVyKGdzdF92YWx1ZV9nZXRfYnVmZmVyKGdzdF92YWx1ZV9saXN0X2dl
dF92YWx1ZShrZXlWYWx1ZXNMaXN0LCBpKSkpOwotICAgICAgICBwcml2LT5rZXlzLmFwcGVuZChL
ZXkgeyBXVEZNb3ZlKGtleUlEQnVmZmVyKSwgV1RGTW92ZShrZXlWYWx1ZUJ1ZmZlcikgfSk7Ci0g
ICAgfQotCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcHJpdi0+Y2RtSW5zdGFuY2UgPSBkb3duY2Fz
dDxDRE1JbnN0YW5jZUNsZWFyS2V5PihjZG1JbnN0YW5jZS5nZXQoKSk7CisgICAgcmV0dXJuIHBy
aXYtPmNkbUluc3RhbmNlOwogfQogCi1zdGF0aWMgZ2Jvb2xlYW4gd2ViS2l0TWVkaWFDbGVhcktl
eURlY3J5cHRvckZpbmRBbmRTZXRLZXkoV2ViS2l0TWVkaWFDbGVhcktleURlY3J5cHRQcml2YXRl
KiBwcml2LCBSZWZQdHI8V2ViQ29yZTo6R3N0TWFwcGVkQnVmZmVyPiYmIGtleUlEQnVmZmVyKQor
c3RhdGljIGJvb2wgZmluZEFuZFNldEtleShXZWJLaXRNZWRpYUNsZWFyS2V5RGVjcnlwdFByaXZh
dGUqIHByaXYsIGNvbnN0IFJlZjxTaGFyZWRCdWZmZXI+JiBrZXlJRCkKIHsKLSAgICBHUmVmUHRy
PEdzdEJ1ZmZlcj4ga2V5QnVmZmVyOwotICAgIGZvciAoYXV0byYga2V5IDogcHJpdi0+a2V5cykg
ewotICAgICAgICBpZiAoa2V5LmtleUlELmdldCgpID09ICprZXlJREJ1ZmZlcikgewotICAgICAg
ICAgICAga2V5QnVmZmVyID0ga2V5LmtleVZhbHVlOworICAgIFJlZlB0cjxTaGFyZWRCdWZmZXI+
IGtleVZhbHVlOworICAgIGZvciAoY29uc3QgYXV0byYga2V5IDogcHJpdi0+Y2RtSW5zdGFuY2Ut
PmtleXMoKSkgeworICAgICAgICBpZiAoKmtleS5rZXlJRERhdGEgPT0ga2V5SUQpIHsKKyAgICAg
ICAgICAgIGtleVZhbHVlID0ga2V5LmtleVZhbHVlRGF0YTsKICAgICAgICAgICAgIGJyZWFrOwog
ICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKCFrZXlCdWZmZXIpIHsKLSAgICAgICAgR1NUX0VS
Uk9SX09CSkVDVChwcml2LCAiRmFpbGVkIHRvIGZpbmQgYW4gYXBwcm9wcmlhdGUga2V5IGJ1ZmZl
ciIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgYXV0byBtYXBwZWRLZXlW
YWx1ZUJ1ZmZlciA9IFdlYkNvcmU6OkdzdE1hcHBlZEJ1ZmZlcjo6Y3JlYXRlKGtleUJ1ZmZlci5n
ZXQoKSwgR1NUX01BUF9SRUFEKTsKLSAgICBpZiAoIW1hcHBlZEtleVZhbHVlQnVmZmVyKSB7Ci0g
ICAgICAgIEdTVF9FUlJPUl9PQkpFQ1QocHJpdiwgIkZhaWxlZCB0byBtYXAgZGVjcnlwdGlvbiBr
ZXkiKTsKKyAgICBpZiAoIWtleVZhbHVlKSB7CisgICAgICAgIEdTVF9FUlJPUl9PQkpFQ1QocHJp
diwgImZhaWxlZCB0byBmaW5kIGEgZGVjcnlwdGlvbiBrZXkiKTsKICAgICAgICAgcmV0dXJuIGZh
bHNlOwogICAgIH0KIAotICAgIEFTU0VSVChtYXBwZWRLZXlWYWx1ZUJ1ZmZlci0+c2l6ZSgpID09
IENMRUFSS0VZX1NJWkUpOwotICAgIGlmIChnY3J5X2Vycm9yX3QgZXJyb3IgPSBnY3J5X2NpcGhl
cl9zZXRrZXkocHJpdi0+aGFuZGxlLCBtYXBwZWRLZXlWYWx1ZUJ1ZmZlci0+ZGF0YSgpLCBtYXBw
ZWRLZXlWYWx1ZUJ1ZmZlci0+c2l6ZSgpKSkgeworICAgIEFTU0VSVChrZXlWYWx1ZS0+c2l6ZSgp
ID09IENMRUFSS0VZX1NJWkUpOworICAgIGlmIChnY3J5X2Vycm9yX3QgZXJyb3IgPSBnY3J5X2Np
cGhlcl9zZXRrZXkocHJpdi0+aGFuZGxlLCBrZXlWYWx1ZS0+ZGF0YSgpLCBrZXlWYWx1ZS0+c2l6
ZSgpKSkgewogICAgICAgICBHU1RfRVJST1JfT0JKRUNUKHByaXYsICJnY3J5X2NpcGhlcl9zZXRr
ZXkgZmFpbGVkOiAlcyIsIGdwZ19zdHJlcnJvcihlcnJvcikpOwogICAgICAgICByZXR1cm4gZmFs
c2U7CiAgICAgfQpAQCAtMTgwLDE3ICsxNDMsMTYgQEAgc3RhdGljIGdib29sZWFuIHdlYktpdE1l
ZGlhQ2xlYXJLZXlEZWNyeXB0b3JGaW5kQW5kU2V0S2V5KFdlYktpdE1lZGlhQ2xlYXJLZXlEZWMK
ICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotc3RhdGljIGdib29sZWFuIHdlYktpdE1lZGlhQ2xlYXJL
ZXlEZWNyeXB0b3JEZWNyeXB0KFdlYktpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5cHQqIHNl
bGYsIEdzdEJ1ZmZlciogaXZCdWZmZXIsIEdzdEJ1ZmZlcioga2V5SURCdWZmZXIsIEdzdEJ1ZmZl
ciogYnVmZmVyLCB1bnNpZ25lZCBzdWJTYW1wbGVDb3VudCwgR3N0QnVmZmVyKiBzdWJTYW1wbGVz
QnVmZmVyKQorc3RhdGljIGJvb2wgZGVjcnlwdChXZWJLaXRNZWRpYUNvbW1vbkVuY3J5cHRpb25E
ZWNyeXB0KiBzZWxmLCBHc3RCdWZmZXIqIGl2QnVmZmVyLCBHc3RCdWZmZXIqIGtleUlEQnVmZmVy
LCBHc3RCdWZmZXIqIGJ1ZmZlciwgdW5zaWduZWQgc3ViU2FtcGxlQ291bnQsIEdzdEJ1ZmZlciog
c3ViU2FtcGxlc0J1ZmZlcikKIHsKLSAgICAvLyBDaGVjayBpdkJ1ZmZlciBpc24ndCBudWxsLgog
ICAgIGlmICghaXZCdWZmZXIpIHsKLSAgICAgICAgR1NUX0VSUk9SX09CSkVDVChzZWxmLCAiRXJy
b3IsIHRoZSBpdkJ1ZmZlciBpcyBudWxsIik7CisgICAgICAgIEdTVF9FUlJPUl9PQkpFQ1Qoc2Vs
ZiwgIm5vIElWIGJ1ZmZlciIpOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAg
YXV0byBtYXBwZWRJVkJ1ZmZlciA9IFdlYkNvcmU6OkdzdE1hcHBlZEJ1ZmZlcjo6Y3JlYXRlKGl2
QnVmZmVyLCBHU1RfTUFQX1JFQUQpOwogICAgIGlmICghbWFwcGVkSVZCdWZmZXIpIHsKLSAgICAg
ICAgR1NUX0VSUk9SX09CSkVDVChzZWxmLCAiRmFpbGVkIHRvIG1hcCBJViIpOworICAgICAgICBH
U1RfRVJST1JfT0JKRUNUKHNlbGYsICJmYWlsZWQgdG8gbWFwIElWIGJ1ZmZlciIpOwogICAgICAg
ICByZXR1cm4gZmFsc2U7CiAgICAgfQogCkBAIC0yMTAsNyArMTcyLDYgQEAgc3RhdGljIGdib29s
ZWFuIHdlYktpdE1lZGlhQ2xlYXJLZXlEZWNyeXB0b3JEZWNyeXB0KFdlYktpdE1lZGlhQ29tbW9u
RW5jcnlwdGlvbkQKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIC8vIENoZWNr
IGJ1ZmZlciBpc24ndCBudWxsLgogICAgIGlmICghYnVmZmVyKSB7CiAgICAgICAgIEdTVF9FUlJP
Ul9PQkpFQ1Qoc2VsZiwgIk5vIGJ1ZmZlciB0byBkZWNyeXB0Iik7CiAgICAgICAgIHJldHVybiBm
YWxzZTsKQEAgLTIyOCw3ICsxODksNyBAQCBzdGF0aWMgZ2Jvb2xlYW4gd2ViS2l0TWVkaWFDbGVh
cktleURlY3J5cHRvckRlY3J5cHQoV2ViS2l0TWVkaWFDb21tb25FbmNyeXB0aW9uRAogICAgICAg
ICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgd2ViS2l0TWVkaWFDbGVhcktleURlY3J5cHRv
ckZpbmRBbmRTZXRLZXkocHJpdiwgV1RGTW92ZShtYXBwZWRLZXlJZEJ1ZmZlcikpOworICAgIGZp
bmRBbmRTZXRLZXkocHJpdiwgbWFwcGVkS2V5SWRCdWZmZXItPmNyZWF0ZVNoYXJlZEJ1ZmZlcigp
KTsKIAogICAgIHVuc2lnbmVkIHBvc2l0aW9uID0gMDsKICAgICB1bnNpZ25lZCBzYW1wbGVJbmRl
eCA9IDA7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9nc3Ry
ZWFtZXIvZW1lL1dlYktpdENvbW1vbkVuY3J5cHRpb25EZWNyeXB0b3JHU3RyZWFtZXIuY3BwIGIv
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZ3N0cmVhbWVyL2VtZS9XZWJLaXRDb21t
b25FbmNyeXB0aW9uRGVjcnlwdG9yR1N0cmVhbWVyLmNwcAppbmRleCAxN2ZkNDhjYzk1OTFlODE0
ZTZhMzliNDcyNWYwOGY5MDk4MGU1ZjYxLi5mYzY5Njg1ODI1MThmNWVmZWEyMzJkNjVmYzk2ZTkw
MzIzYmI1OGRjIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9n
c3RyZWFtZXIvZW1lL1dlYktpdENvbW1vbkVuY3J5cHRpb25EZWNyeXB0b3JHU3RyZWFtZXIuY3Bw
CisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2dzdHJlYW1lci9lbWUvV2Vi
S2l0Q29tbW9uRW5jcnlwdGlvbkRlY3J5cHRvckdTdHJlYW1lci5jcHAKQEAgLTI2LDcgKzI2LDcg
QEAKICNpZiBFTkFCTEUoRU5DUllQVEVEX01FRElBKSAmJiBVU0UoR1NUUkVBTUVSKQogCiAjaW5j
bHVkZSAiR1N0cmVhbWVyQ29tbW9uLmgiCi0jaW5jbHVkZSA8Q0RNSW5zdGFuY2UuaD4KKyNpbmNs
dWRlICJHU3RyZWFtZXJFTUVVdGlsaXRpZXMuaCIKICNpbmNsdWRlIDx3dGYvQ29uZGl0aW9uLmg+
CiAjaW5jbHVkZSA8d3RmL1ByaW50U3RyZWFtLmg+CiAjaW5jbHVkZSA8d3RmL1J1bkxvb3AuaD4K
QEAgLTM3LDIwICszNywyMSBAQCB1c2luZyBXZWJDb3JlOjpDRE1JbnN0YW5jZTsKIHN0cnVjdCBf
V2ViS2l0TWVkaWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdFByaXZhdGUgewogICAgIEdSZWZQdHI8
R3N0RXZlbnQ+IHByb3RlY3Rpb25FdmVudDsKICAgICBSZWZQdHI8Q0RNSW5zdGFuY2U+IGNkbUlu
c3RhbmNlOwotICAgIGJvb2wga2V5UmVjZWl2ZWQ7CisgICAgYm9vbCBrZXlSZWNlaXZlZCB7IGZh
bHNlIH07CiAgICAgYm9vbCB3YWl0aW5nRm9yS2V5IHsgZmFsc2UgfTsKICAgICBMb2NrIG11dGV4
OwogICAgIENvbmRpdGlvbiBjb25kaXRpb247CiB9OwogCi1zdGF0aWMgR3N0U3RhdGVDaGFuZ2VS
ZXR1cm4gd2ViS2l0TWVkaWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdG9yQ2hhbmdlU3RhdGUoR3N0
RWxlbWVudCosIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pOwotc3RhdGljIHZvaWQgd2ViS2l0
TWVkaWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdG9yU2V0Q29udGV4dChHc3RFbGVtZW50KiwgR3N0
Q29udGV4dCopOwotc3RhdGljIHZvaWQgd2ViS2l0TWVkaWFDb21tb25FbmNyeXB0aW9uRGVjcnlw
dG9yRmluYWxpemUoR09iamVjdCopOwotc3RhdGljIEdzdENhcHMqIHdlYmtpdE1lZGlhQ29tbW9u
RW5jcnlwdGlvbkRlY3J5cHRUcmFuc2Zvcm1DYXBzKEdzdEJhc2VUcmFuc2Zvcm0qLCBHc3RQYWRE
aXJlY3Rpb24sIEdzdENhcHMqLCBHc3RDYXBzKik7Ci1zdGF0aWMgR3N0Rmxvd1JldHVybiB3ZWJr
aXRNZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNyeXB0VHJhbnNmb3JtSW5QbGFjZShHc3RCYXNlVHJh
bnNmb3JtKiwgR3N0QnVmZmVyKik7Ci1zdGF0aWMgZ2Jvb2xlYW4gd2Via2l0TWVkaWFDb21tb25F
bmNyeXB0aW9uRGVjcnlwdFNpbmtFdmVudEhhbmRsZXIoR3N0QmFzZVRyYW5zZm9ybSosIEdzdEV2
ZW50Kik7Ci1zdGF0aWMgZ2Jvb2xlYW4gd2Via2l0TWVkaWFDb21tb25FbmNyeXB0aW9uRGVjcnlw
dG9yUXVlcnlIYW5kbGVyKEdzdEJhc2VUcmFuc2Zvcm0qLCBHc3RQYWREaXJlY3Rpb24sIEdzdFF1
ZXJ5Kik7Ci1zdGF0aWMgYm9vbCB3ZWJraXRNZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNyeXB0SXND
RE1JbnN0YW5jZUF2YWlsYWJsZShXZWJLaXRNZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNyeXB0Kik7
CitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gY2hhbmdlU3RhdGUoR3N0RWxlbWVudCosIEdz
dFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pOworc3RhdGljIHZvaWQgZmluYWxpemUoR09iamVjdCop
Oworc3RhdGljIEdzdENhcHMqIHRyYW5zZm9ybUNhcHMoR3N0QmFzZVRyYW5zZm9ybSosIEdzdFBh
ZERpcmVjdGlvbiwgR3N0Q2FwcyosIEdzdENhcHMqKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIHRy
YW5zZm9ybUluUGxhY2UoR3N0QmFzZVRyYW5zZm9ybSosIEdzdEJ1ZmZlciopOworc3RhdGljIGdi
b29sZWFuIHNpbmtFdmVudEhhbmRsZXIoR3N0QmFzZVRyYW5zZm9ybSosIEdzdEV2ZW50Kik7Citz
dGF0aWMgZ2Jvb2xlYW4gcXVlcnlIYW5kbGVyKEdzdEJhc2VUcmFuc2Zvcm0qLCBHc3RQYWREaXJl
Y3Rpb24sIEdzdFF1ZXJ5Kik7CitzdGF0aWMgYm9vbCBpc0NETUluc3RhbmNlQXZhaWxhYmxlKFdl
YktpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5cHQqKTsKK3N0YXRpYyB2b2lkIHNldENvbnRl
eHQoR3N0RWxlbWVudCosIEdzdENvbnRleHQqKTsKKwogCiBHU1RfREVCVUdfQ0FURUdPUllfU1RB
VElDKHdlYmtpdF9tZWRpYV9jb21tb25fZW5jcnlwdGlvbl9kZWNyeXB0X2RlYnVnX2NhdGVnb3J5
KTsKICNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIHdlYmtpdF9tZWRpYV9jb21tb25fZW5jcnlwdGlv
bl9kZWNyeXB0X2RlYnVnX2NhdGVnb3J5CkBAIC02MSwyMSArNjIsMjEgQEAgR19ERUZJTkVfVFlQ
RShXZWJLaXRNZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNyeXB0LCB3ZWJraXRfbWVkaWFfY29tbW9u
X2VuY3J5cHRpb24KIHN0YXRpYyB2b2lkIHdlYmtpdF9tZWRpYV9jb21tb25fZW5jcnlwdGlvbl9k
ZWNyeXB0X2NsYXNzX2luaXQoV2ViS2l0TWVkaWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdENsYXNz
KiBrbGFzcykKIHsKICAgICBHT2JqZWN0Q2xhc3MqIGdvYmplY3RDbGFzcyA9IEdfT0JKRUNUX0NM
QVNTKGtsYXNzKTsKLSAgICBnb2JqZWN0Q2xhc3MtPmZpbmFsaXplID0gd2ViS2l0TWVkaWFDb21t
b25FbmNyeXB0aW9uRGVjcnlwdG9yRmluYWxpemU7CisgICAgZ29iamVjdENsYXNzLT5maW5hbGl6
ZSA9IGZpbmFsaXplOwogCiAgICAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQod2Via2l0X21lZGlh
X2NvbW1vbl9lbmNyeXB0aW9uX2RlY3J5cHRfZGVidWdfY2F0ZWdvcnksCiAgICAgICAgICJ3ZWJr
aXRjZW5jIiwgMCwgIkNvbW1vbiBFbmNyeXB0aW9uIGJhc2UgY2xhc3MiKTsKIAogICAgIEdzdEVs
ZW1lbnRDbGFzcyogZWxlbWVudENsYXNzID0gR1NUX0VMRU1FTlRfQ0xBU1Moa2xhc3MpOwotICAg
IGVsZW1lbnRDbGFzcy0+Y2hhbmdlX3N0YXRlID0gR1NUX0RFQlVHX0ZVTkNQVFIod2ViS2l0TWVk
aWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdG9yQ2hhbmdlU3RhdGUpOwotICAgIGVsZW1lbnRDbGFz
cy0+c2V0X2NvbnRleHQgPSBHU1RfREVCVUdfRlVOQ1BUUih3ZWJLaXRNZWRpYUNvbW1vbkVuY3J5
cHRpb25EZWNyeXB0b3JTZXRDb250ZXh0KTsKKyAgICBlbGVtZW50Q2xhc3MtPmNoYW5nZV9zdGF0
ZSA9IEdTVF9ERUJVR19GVU5DUFRSKGNoYW5nZVN0YXRlKTsKKyAgICBlbGVtZW50Q2xhc3MtPnNl
dF9jb250ZXh0ID0gR1NUX0RFQlVHX0ZVTkNQVFIoc2V0Q29udGV4dCk7CiAKICAgICBHc3RCYXNl
VHJhbnNmb3JtQ2xhc3MqIGJhc2VUcmFuc2Zvcm1DbGFzcyA9IEdTVF9CQVNFX1RSQU5TRk9STV9D
TEFTUyhrbGFzcyk7Ci0gICAgYmFzZVRyYW5zZm9ybUNsYXNzLT50cmFuc2Zvcm1faXAgPSBHU1Rf
REVCVUdfRlVOQ1BUUih3ZWJraXRNZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNyeXB0VHJhbnNmb3Jt
SW5QbGFjZSk7Ci0gICAgYmFzZVRyYW5zZm9ybUNsYXNzLT50cmFuc2Zvcm1fY2FwcyA9IEdTVF9E
RUJVR19GVU5DUFRSKHdlYmtpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5cHRUcmFuc2Zvcm1D
YXBzKTsKKyAgICBiYXNlVHJhbnNmb3JtQ2xhc3MtPnRyYW5zZm9ybV9pcCA9IEdTVF9ERUJVR19G
VU5DUFRSKHRyYW5zZm9ybUluUGxhY2UpOworICAgIGJhc2VUcmFuc2Zvcm1DbGFzcy0+dHJhbnNm
b3JtX2NhcHMgPSBHU1RfREVCVUdfRlVOQ1BUUih0cmFuc2Zvcm1DYXBzKTsKICAgICBiYXNlVHJh
bnNmb3JtQ2xhc3MtPnRyYW5zZm9ybV9pcF9vbl9wYXNzdGhyb3VnaCA9IEZBTFNFOwotICAgIGJh
c2VUcmFuc2Zvcm1DbGFzcy0+c2lua19ldmVudCA9IEdTVF9ERUJVR19GVU5DUFRSKHdlYmtpdE1l
ZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5cHRTaW5rRXZlbnRIYW5kbGVyKTsKLSAgICBiYXNlVHJh
bnNmb3JtQ2xhc3MtPnF1ZXJ5ID0gR1NUX0RFQlVHX0ZVTkNQVFIod2Via2l0TWVkaWFDb21tb25F
bmNyeXB0aW9uRGVjcnlwdG9yUXVlcnlIYW5kbGVyKTsKKyAgICBiYXNlVHJhbnNmb3JtQ2xhc3Mt
PnNpbmtfZXZlbnQgPSBHU1RfREVCVUdfRlVOQ1BUUihzaW5rRXZlbnRIYW5kbGVyKTsKKyAgICBi
YXNlVHJhbnNmb3JtQ2xhc3MtPnF1ZXJ5ID0gR1NUX0RFQlVHX0ZVTkNQVFIocXVlcnlIYW5kbGVy
KTsKIAogICAgIGdfdHlwZV9jbGFzc19hZGRfcHJpdmF0ZShrbGFzcywgc2l6ZW9mKFdlYktpdE1l
ZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5cHRQcml2YXRlKSk7CiB9CkBAIC05Myw3ICs5NCw3IEBA
IHN0YXRpYyB2b2lkIHdlYmtpdF9tZWRpYV9jb21tb25fZW5jcnlwdGlvbl9kZWNyeXB0X2luaXQo
V2ViS2l0TWVkaWFDb21tb25FbmNyeXB0CiAgICAgZ3N0X2Jhc2VfdHJhbnNmb3JtX3NldF9nYXBf
YXdhcmUoYmFzZSwgRkFMU0UpOwogfQogCi1zdGF0aWMgdm9pZCB3ZWJLaXRNZWRpYUNvbW1vbkVu
Y3J5cHRpb25EZWNyeXB0b3JGaW5hbGl6ZShHT2JqZWN0KiBvYmplY3QpCitzdGF0aWMgdm9pZCBm
aW5hbGl6ZShHT2JqZWN0KiBvYmplY3QpCiB7CiAgICAgV2ViS2l0TWVkaWFDb21tb25FbmNyeXB0
aW9uRGVjcnlwdCogc2VsZiA9IFdFQktJVF9NRURJQV9DRU5DX0RFQ1JZUFQob2JqZWN0KTsKICAg
ICBXZWJLaXRNZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNyeXB0UHJpdmF0ZSogcHJpdiA9IHNlbGYt
PnByaXY7CkBAIC0xMDIsNyArMTAzLDcgQEAgc3RhdGljIHZvaWQgd2ViS2l0TWVkaWFDb21tb25F
bmNyeXB0aW9uRGVjcnlwdG9yRmluYWxpemUoR09iamVjdCogb2JqZWN0KQogICAgIEdTVF9DQUxM
X1BBUkVOVChHX09CSkVDVF9DTEFTUywgZmluYWxpemUsIChvYmplY3QpKTsKIH0KIAotc3RhdGlj
IEdzdENhcHMqIHdlYmtpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5cHRUcmFuc2Zvcm1DYXBz
KEdzdEJhc2VUcmFuc2Zvcm0qIGJhc2UsIEdzdFBhZERpcmVjdGlvbiBkaXJlY3Rpb24sIEdzdENh
cHMqIGNhcHMsIEdzdENhcHMqIGZpbHRlcikKK3N0YXRpYyBHc3RDYXBzKiB0cmFuc2Zvcm1DYXBz
KEdzdEJhc2VUcmFuc2Zvcm0qIGJhc2UsIEdzdFBhZERpcmVjdGlvbiBkaXJlY3Rpb24sIEdzdENh
cHMqIGNhcHMsIEdzdENhcHMqIGZpbHRlcikKIHsKICAgICBpZiAoZGlyZWN0aW9uID09IEdTVF9Q
QURfVU5LTk9XTikKICAgICAgICAgcmV0dXJuIG51bGxwdHI7CkBAIC0xOTcsNyArMTk4LDcgQEAg
c3RhdGljIEdzdENhcHMqIHdlYmtpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5cHRUcmFuc2Zv
cm1DYXBzKEdzdEJhc2VUcmFuc2Zvcm0KICAgICByZXR1cm4gdHJhbnNmb3JtZWRDYXBzOwogfQog
Ci1zdGF0aWMgR3N0Rmxvd1JldHVybiB3ZWJraXRNZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNyeXB0
VHJhbnNmb3JtSW5QbGFjZShHc3RCYXNlVHJhbnNmb3JtKiBiYXNlLCBHc3RCdWZmZXIqIGJ1ZmZl
cikKK3N0YXRpYyBHc3RGbG93UmV0dXJuIHRyYW5zZm9ybUluUGxhY2UoR3N0QmFzZVRyYW5zZm9y
bSogYmFzZSwgR3N0QnVmZmVyKiBidWZmZXIpCiB7CiAgICAgV2ViS2l0TWVkaWFDb21tb25FbmNy
eXB0aW9uRGVjcnlwdCogc2VsZiA9IFdFQktJVF9NRURJQV9DRU5DX0RFQ1JZUFQoYmFzZSk7CiAg
ICAgV2ViS2l0TWVkaWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdFByaXZhdGUqIHByaXYgPSBXRUJL
SVRfTUVESUFfQ0VOQ19ERUNSWVBUX0dFVF9QUklWQVRFKHNlbGYpOwpAQCAtMzAyLDcgKzMwMyw3
IEBAIHN0YXRpYyBHc3RGbG93UmV0dXJuIHdlYmtpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5
cHRUcmFuc2Zvcm1JblBsYWNlKEdzdEJhc2VUCiAgICAgcmV0dXJuIEdTVF9GTE9XX09LOwogfQog
Ci1zdGF0aWMgYm9vbCB3ZWJraXRNZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNyeXB0SXNDRE1JbnN0
YW5jZUF2YWlsYWJsZShXZWJLaXRNZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNyeXB0KiBzZWxmKQor
c3RhdGljIGJvb2wgaXNDRE1JbnN0YW5jZUF2YWlsYWJsZShXZWJLaXRNZWRpYUNvbW1vbkVuY3J5
cHRpb25EZWNyeXB0KiBzZWxmKQogewogICAgIFdlYktpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRl
Y3J5cHRQcml2YXRlKiBwcml2ID0gV0VCS0lUX01FRElBX0NFTkNfREVDUllQVF9HRVRfUFJJVkFU
RShzZWxmKTsKIApAQCAtMzE3LDE5ICszMTgsMjIgQEAgc3RhdGljIGJvb2wgd2Via2l0TWVkaWFD
b21tb25FbmNyeXB0aW9uRGVjcnlwdElzQ0RNSW5zdGFuY2VBdmFpbGFibGUoV2ViS2l0TWVkaWEK
ICAgICAgICAgLy8gcmVxdWVzdHMgYXJlIHVzZWZ1bCBoZXJlLgogICAgICAgICBpZiAoY29udGV4
dCkgewogICAgICAgICAgICAgY29uc3QgR1ZhbHVlKiB2YWx1ZSA9IGdzdF9zdHJ1Y3R1cmVfZ2V0
X3ZhbHVlKGdzdF9jb250ZXh0X2dldF9zdHJ1Y3R1cmUoY29udGV4dC5nZXQoKSksICJjZG0taW5z
dGFuY2UiKTsKLSAgICAgICAgICAgIHByaXYtPmNkbUluc3RhbmNlID0gdmFsdWUgPyByZWludGVy
cHJldF9jYXN0PENETUluc3RhbmNlKj4oZ192YWx1ZV9nZXRfcG9pbnRlcih2YWx1ZSkpIDogbnVs
bHB0cjsKKyAgICAgICAgICAgIC8vIENhcHR1cmUgdGhlIENETUluc3RhbmNlIGludG8gYSBzZXBh
cmF0ZSB2YXJpYWJsZSB0byBhdm9pZCBtaXNzaW5nIGEgcmVmY291bnQuCisgICAgICAgICAgICBD
RE1JbnN0YW5jZSogaW5zdGFuY2UgPSB2YWx1ZSA/IHJlaW50ZXJwcmV0X2Nhc3Q8Q0RNSW5zdGFu
Y2UqPihnX3ZhbHVlX2dldF9wb2ludGVyKHZhbHVlKSkgOiBudWxscHRyOworICAgICAgICAgICAg
Ly8gLi4uIEFuZCBmb3JjZSBhIHJlZmNvdW50IGJ1bXAgdXNpbmcgb3BlcmF0b3I9LgorICAgICAg
ICAgICAgcHJpdi0+Y2RtSW5zdGFuY2UgPSBpbnN0YW5jZTsKICAgICAgICAgICAgIGlmIChwcml2
LT5jZG1JbnN0YW5jZSkKLSAgICAgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUKHNlbGYsICJy
ZWNlaXZlZCBuZXcgQ0RNSW5zdGFuY2UgJXAiLCBwcml2LT5jZG1JbnN0YW5jZS5nZXQoKSk7Cisg
ICAgICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVChzZWxmLCAicmVjZWl2ZWQgYSBuZXcgQ0RN
IGluc3RhbmNlICVwLCByZWZjb3VudCAldSIsIHByaXYtPmNkbUluc3RhbmNlLmdldCgpLCBwcml2
LT5jZG1JbnN0YW5jZS0+cmVmQ291bnQoKSk7CiAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAg
ICAgICAgR1NUX1RSQUNFX09CSkVDVChzZWxmLCAiZm9ybWVyIGluc3RhbmNlIHdhcyBkZXRhY2hl
ZCIpOworICAgICAgICAgICAgICAgIEdTVF9UUkFDRV9PQkpFQ1Qoc2VsZiwgIkNETSBpbnN0YW5j
ZSB3YXMgZGV0YWNoZWQiKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIEdTVF9UUkFDRV9PQkpF
Q1Qoc2VsZiwgIkNETUluc3RhbmNlIGF2YWlsYWJsZSAlcyIsIGJvb2xGb3JQcmludGluZyhwcml2
LT5jZG1JbnN0YW5jZS5nZXQoKSkpOworICAgIEdTVF9UUkFDRV9PQkpFQ1Qoc2VsZiwgIkNETSBp
bnN0YW5jZSBhdmFpbGFibGUgJXMiLCBib29sRm9yUHJpbnRpbmcocHJpdi0+Y2RtSW5zdGFuY2Uu
Z2V0KCkpKTsKICAgICByZXR1cm4gcHJpdi0+Y2RtSW5zdGFuY2U7CiB9CiAKLXN0YXRpYyBnYm9v
bGVhbiB3ZWJraXRNZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNyeXB0U2lua0V2ZW50SGFuZGxlcihH
c3RCYXNlVHJhbnNmb3JtKiB0cmFucywgR3N0RXZlbnQqIGV2ZW50KQorc3RhdGljIGdib29sZWFu
IHNpbmtFdmVudEhhbmRsZXIoR3N0QmFzZVRyYW5zZm9ybSogdHJhbnMsIEdzdEV2ZW50KiBldmVu
dCkKIHsKICAgICBXZWJLaXRNZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNyeXB0KiBzZWxmID0gV0VC
S0lUX01FRElBX0NFTkNfREVDUllQVCh0cmFucyk7CiAgICAgV2ViS2l0TWVkaWFDb21tb25FbmNy
eXB0aW9uRGVjcnlwdFByaXZhdGUqIHByaXYgPSBXRUJLSVRfTUVESUFfQ0VOQ19ERUNSWVBUX0dF
VF9QUklWQVRFKHNlbGYpOwpAQCAtMzQ1LDEzICszNDksMTMgQEAgc3RhdGljIGdib29sZWFuIHdl
YmtpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5cHRTaW5rRXZlbnRIYW5kbGVyKEdzdEJhc2VU
cmFuc2YKICAgICAgICAgLy8gZXZlbnRzIHdpbGwgbm90IGJlIGhhbmRsZWQgYnkgdGhlIGRlbXV4
ZXIsIHNvIHRoZSBtdXN0IGJlCiAgICAgICAgIC8vIGhhbmRsZWQgaW4gaGVyZS4KICAgICAgICAg
TG9ja0hvbGRlciBsb2NrZXIocHJpdi0+bXV0ZXgpOwotICAgICAgICBpZiAoIXdlYmtpdE1lZGlh
Q29tbW9uRW5jcnlwdGlvbkRlY3J5cHRJc0NETUluc3RhbmNlQXZhaWxhYmxlKHNlbGYpKSB7Cisg
ICAgICAgIGlmICghaXNDRE1JbnN0YW5jZUF2YWlsYWJsZShzZWxmKSkgewogICAgICAgICAgICAg
R1NUX0VSUk9SX09CSkVDVChzZWxmLCAiTm8gQ0RNIGluc3RhbmNlIGF2YWlsYWJsZSIpOwogICAg
ICAgICAgICAgcmVzdWx0ID0gRkFMU0U7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQog
Ci0gICAgICAgIGlmIChrbGFzcy0+aGFuZGxlS2V5UmVzcG9uc2Uoc2VsZiwgZXZlbnQpKSB7Cisg
ICAgICAgIGlmIChrbGFzcy0+aGFuZGxlS2V5UmVzcG9uc2Uoc2VsZiwgcHJpdi0+Y2RtSW5zdGFu
Y2UpKSB7CiAgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUKHNlbGYsICJrZXkgcmVjZWl2ZWQi
KTsKICAgICAgICAgICAgIHByaXYtPmtleVJlY2VpdmVkID0gdHJ1ZTsKICAgICAgICAgICAgIHBy
aXYtPmNvbmRpdGlvbi5ub3RpZnlPbmUoKTsKQEAgLTM2OSw3ICszNzMsNyBAQCBzdGF0aWMgZ2Jv
b2xlYW4gd2Via2l0TWVkaWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdFNpbmtFdmVudEhhbmRsZXIo
R3N0QmFzZVRyYW5zZgogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLXN0YXRpYyBnYm9vbGVhbiB3
ZWJraXRNZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNyeXB0b3JRdWVyeUhhbmRsZXIoR3N0QmFzZVRy
YW5zZm9ybSogdHJhbnMsIEdzdFBhZERpcmVjdGlvbiBkaXJlY3Rpb24sIEdzdFF1ZXJ5KiBxdWVy
eSkKK3N0YXRpYyBnYm9vbGVhbiBxdWVyeUhhbmRsZXIoR3N0QmFzZVRyYW5zZm9ybSogdHJhbnMs
IEdzdFBhZERpcmVjdGlvbiBkaXJlY3Rpb24sIEdzdFF1ZXJ5KiBxdWVyeSkKIHsKICAgICBpZiAo
Z3N0X3N0cnVjdHVyZV9oYXNfbmFtZShnc3RfcXVlcnlfZ2V0X3N0cnVjdHVyZShxdWVyeSksICJh
bnktZGVjcnlwdG9yLXdhaXRpbmctZm9yLWtleSIpKSB7CiAgICAgICAgIFdlYktpdE1lZGlhQ29t
bW9uRW5jcnlwdGlvbkRlY3J5cHRQcml2YXRlKiBwcml2ID0gV0VCS0lUX01FRElBX0NFTkNfREVD
UllQVF9HRVRfUFJJVkFURSh0cmFucyk7CkBAIC0zNzksNyArMzgzLDcgQEAgc3RhdGljIGdib29s
ZWFuIHdlYmtpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5cHRvclF1ZXJ5SGFuZGxlcihHc3RC
YXNlVHJhbnNmb3IKICAgICByZXR1cm4gR1NUX0JBU0VfVFJBTlNGT1JNX0NMQVNTKHBhcmVudF9j
bGFzcyktPnF1ZXJ5KHRyYW5zLCBkaXJlY3Rpb24sIHF1ZXJ5KTsKIH0KIAotc3RhdGljIEdzdFN0
YXRlQ2hhbmdlUmV0dXJuIHdlYktpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5cHRvckNoYW5n
ZVN0YXRlKEdzdEVsZW1lbnQqIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCitz
dGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gY2hhbmdlU3RhdGUoR3N0RWxlbWVudCogZWxlbWVu
dCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKIHsKICAgICBXZWJLaXRNZWRpYUNvbW1vbkVu
Y3J5cHRpb25EZWNyeXB0KiBzZWxmID0gV0VCS0lUX01FRElBX0NFTkNfREVDUllQVChlbGVtZW50
KTsKICAgICBXZWJLaXRNZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNyeXB0UHJpdmF0ZSogcHJpdiA9
IFdFQktJVF9NRURJQV9DRU5DX0RFQ1JZUFRfR0VUX1BSSVZBVEUoc2VsZik7CkBAIC00MDAsNyAr
NDA0LDcgQEAgc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHdlYktpdE1lZGlhQ29tbW9uRW5j
cnlwdGlvbkRlY3J5cHRvckNoYW5nZVN0YXRlKEdzdEUKICAgICByZXR1cm4gcmVzdWx0OwogfQog
Ci1zdGF0aWMgdm9pZCB3ZWJLaXRNZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNyeXB0b3JTZXRDb250
ZXh0KEdzdEVsZW1lbnQqIGVsZW1lbnQsIEdzdENvbnRleHQqIGNvbnRleHQpCitzdGF0aWMgdm9p
ZCBzZXRDb250ZXh0KEdzdEVsZW1lbnQqIGVsZW1lbnQsIEdzdENvbnRleHQqIGNvbnRleHQpCiB7
CiAgICAgV2ViS2l0TWVkaWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdCogc2VsZiA9IFdFQktJVF9N
RURJQV9DRU5DX0RFQ1JZUFQoZWxlbWVudCk7CiAgICAgV2ViS2l0TWVkaWFDb21tb25FbmNyeXB0
aW9uRGVjcnlwdFByaXZhdGUqIHByaXYgPSBXRUJLSVRfTUVESUFfQ0VOQ19ERUNSWVBUX0dFVF9Q
UklWQVRFKHNlbGYpOwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvZ3N0cmVhbWVyL2VtZS9XZWJLaXRDb21tb25FbmNyeXB0aW9uRGVjcnlwdG9yR1N0cmVhbWVy
LmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9nc3RyZWFtZXIvZW1lL1dlYktp
dENvbW1vbkVuY3J5cHRpb25EZWNyeXB0b3JHU3RyZWFtZXIuaAppbmRleCAyMjIxMTI1NGViN2Q5
ZWY1NDY2MDU3ZmQ3ZDU0MzQyMTllY2VmMmRkLi44Mjk5ZDM5ZDJlYzA2MDEyYjhlMjFjZWIxYWVj
YzY3OTI3NmU4NTY3IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9nc3RyZWFtZXIvZW1lL1dlYktpdENvbW1vbkVuY3J5cHRpb25EZWNyeXB0b3JHU3RyZWFtZXIu
aAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9nc3RyZWFtZXIvZW1lL1dl
YktpdENvbW1vbkVuY3J5cHRpb25EZWNyeXB0b3JHU3RyZWFtZXIuaApAQCAtMjQsNiArMjQsNyBA
QAogCiAjaWYgRU5BQkxFKEVOQ1JZUFRFRF9NRURJQSkgJiYgVVNFKEdTVFJFQU1FUikKIAorI2lu
Y2x1ZGUgPENETUluc3RhbmNlLmg+CiAjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YmFzZXRyYW5zZm9y
bS5oPgogI2luY2x1ZGUgPGdzdC9nc3QuaD4KIApAQCAtNTMsOCArNTQsOCBAQCBzdHJ1Y3QgX1dl
YktpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5cHRDbGFzcyB7CiAgICAgR3N0QmFzZVRyYW5z
Zm9ybUNsYXNzIHBhcmVudENsYXNzOwogCiAgICAgY29uc3QgY2hhciogcHJvdGVjdGlvblN5c3Rl
bUlkOwotICAgIGdib29sZWFuICgqaGFuZGxlS2V5UmVzcG9uc2UpKFdlYktpdE1lZGlhQ29tbW9u
RW5jcnlwdGlvbkRlY3J5cHQqLCBHc3RFdmVudCogZXZlbnQpOwotICAgIGdib29sZWFuICgqZGVj
cnlwdCkoV2ViS2l0TWVkaWFDb21tb25FbmNyeXB0aW9uRGVjcnlwdCosIEdzdEJ1ZmZlciogaXZC
dWZmZXIsIEdzdEJ1ZmZlcioga2V5SURCdWZmZXIsIEdzdEJ1ZmZlciogYnVmZmVyLCB1bnNpZ25l
ZCBzdWJTYW1wbGVzQ291bnQsIEdzdEJ1ZmZlciogc3ViU2FtcGxlc0J1ZmZlcik7CisgICAgYm9v
bCAoKmhhbmRsZUtleVJlc3BvbnNlKShXZWJLaXRNZWRpYUNvbW1vbkVuY3J5cHRpb25EZWNyeXB0
KiwgUmVmUHRyPFdlYkNvcmU6OkNETUluc3RhbmNlPik7CisgICAgYm9vbCAoKmRlY3J5cHQpKFdl
YktpdE1lZGlhQ29tbW9uRW5jcnlwdGlvbkRlY3J5cHQqLCBHc3RCdWZmZXIqIGl2QnVmZmVyLCBH
c3RCdWZmZXIqIGtleUlEQnVmZmVyLCBHc3RCdWZmZXIqIGJ1ZmZlciwgdW5zaWduZWQgc3ViU2Ft
cGxlc0NvdW50LCBHc3RCdWZmZXIqIHN1YlNhbXBsZXNCdWZmZXIpOwogfTsKIAogR19FTkRfREVD
TFMKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2dzdHJlYW1l
ci9tc2UvTWVkaWFQbGF5ZXJQcml2YXRlR1N0cmVhbWVyTVNFLmNwcCBiL1NvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL2dzdHJlYW1lci9tc2UvTWVkaWFQbGF5ZXJQcml2YXRlR1N0cmVh
bWVyTVNFLmNwcAppbmRleCA2YmZlNDhhMmVkN2IwYmZiZGU4MWNlMmRkMDU0YTNmNzc1MTZkNDk0
Li5lNWI0NDNlNmIyZDcyMTcyZjY3MTI3ZTE2YWFiMGMzZjdlMmNiODQwIDEwMDY0NAotLS0gYS9T
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9nc3RyZWFtZXIvbXNlL01lZGlhUGxheWVy
UHJpdmF0ZUdTdHJlYW1lck1TRS5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvZ3N0cmVhbWVyL21zZS9NZWRpYVBsYXllclByaXZhdGVHU3RyZWFtZXJNU0UuY3BwCkBA
IC01NSwxMSArNTUsNiBAQAogI2luY2x1ZGUgPHd0Zi90ZXh0L0F0b21pY1N0cmluZy5oPgogI2lu
Y2x1ZGUgPHd0Zi90ZXh0L0F0b21pY1N0cmluZ0hhc2guaD4KIAotI2lmIEVOQUJMRShFTkNSWVBU
RURfTUVESUEpCi0jaW5jbHVkZSAiQ0RNQ2xlYXJLZXkuaCIKLSNpbmNsdWRlICJTaGFyZWRCdWZm
ZXIuaCIKLSNlbmRpZgotCiBzdGF0aWMgY29uc3QgY2hhciogZHVtcFJlYWR5U3RhdGUoV2ViQ29y
ZTo6TWVkaWFQbGF5ZXI6OlJlYWR5U3RhdGUgcmVhZHlTdGF0ZSkKIHsKICAgICBzd2l0Y2ggKHJl
YWR5U3RhdGUpIHsKQEAgLTkwOCw0MiArOTAzLDYgQEAgTWVkaWFUaW1lIE1lZGlhUGxheWVyUHJp
dmF0ZUdTdHJlYW1lck1TRTo6bWF4TWVkaWFUaW1lU2Vla2FibGUoKSBjb25zdAogICAgIHJldHVy
biByZXN1bHQ7CiB9CiAKLSNpZiBFTkFCTEUoRU5DUllQVEVEX01FRElBKQotdm9pZCBNZWRpYVBs
YXllclByaXZhdGVHU3RyZWFtZXJNU0U6OmF0dGVtcHRUb0RlY3J5cHRXaXRoTG9jYWxJbnN0YW5j
ZSgpCi17Ci0gICAgaWYgKGlzPENETUluc3RhbmNlQ2xlYXJLZXk+KCptX2NkbUluc3RhbmNlKSkg
ewotICAgICAgICBhdXRvJiBjbGVhcmtleUNETUluc3RhbmNlID0gZG93bmNhc3Q8Q0RNSW5zdGFu
Y2VDbGVhcktleT4oKm1fY2RtSW5zdGFuY2UpOwotICAgICAgICBpZiAoY2xlYXJrZXlDRE1JbnN0
YW5jZS5rZXlzKCkuaXNFbXB0eSgpKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIEdW
YWx1ZSBrZXlJRExpc3QgPSBHX1ZBTFVFX0lOSVQsIGtleVZhbHVlTGlzdCA9IEdfVkFMVUVfSU5J
VDsKLSAgICAgICAgZ192YWx1ZV9pbml0KCZrZXlJRExpc3QsIEdTVF9UWVBFX0xJU1QpOwotICAg
ICAgICBnX3ZhbHVlX2luaXQoJmtleVZhbHVlTGlzdCwgR1NUX1RZUEVfTElTVCk7Ci0KLSAgICAg
ICAgYXV0byBhcHBlbmRCdWZmZXIgPQotICAgICAgICAgICAgW10oR1ZhbHVlKiB2YWx1ZUxpc3Qs
IGNvbnN0IFNoYXJlZEJ1ZmZlciYgYnVmZmVyKQotICAgICAgICAgICAgewotICAgICAgICAgICAg
ICAgIEdWYWx1ZSogYnVmZmVyVmFsdWUgPSBnX25ldzAoR1ZhbHVlLCAxKTsKLSAgICAgICAgICAg
ICAgICBnX3ZhbHVlX2luaXQoYnVmZmVyVmFsdWUsIEdTVF9UWVBFX0JVRkZFUik7Ci0gICAgICAg
ICAgICAgICAgZ3N0X3ZhbHVlX3Rha2VfYnVmZmVyKGJ1ZmZlclZhbHVlLAotICAgICAgICAgICAg
ICAgICAgICBnc3RfYnVmZmVyX25ld193cmFwcGVkKGdfbWVtZHVwKGJ1ZmZlci5kYXRhKCksIGJ1
ZmZlci5zaXplKCkpLCBidWZmZXIuc2l6ZSgpKSk7Ci0gICAgICAgICAgICAgICAgZ3N0X3ZhbHVl
X2xpc3RfYXBwZW5kX2FuZF90YWtlX3ZhbHVlKHZhbHVlTGlzdCwgYnVmZmVyVmFsdWUpOwotICAg
ICAgICAgICAgfTsKLQotICAgICAgICBmb3IgKGF1dG8mIGtleSA6IGNsZWFya2V5Q0RNSW5zdGFu
Y2Uua2V5cygpKSB7Ci0gICAgICAgICAgICBhcHBlbmRCdWZmZXIoJmtleUlETGlzdCwgKmtleS5r
ZXlJRERhdGEpOwotICAgICAgICAgICAgYXBwZW5kQnVmZmVyKCZrZXlWYWx1ZUxpc3QsICprZXku
a2V5VmFsdWVEYXRhKTsKLSAgICAgICAgfQotCi0gICAgICAgIEdVbmlxdWVQdHI8R3N0U3RydWN0
dXJlPiBzdHJ1Y3R1cmUoZ3N0X3N0cnVjdHVyZV9uZXdfZW1wdHkoImRybS1jaXBoZXItY2xlYXJr
ZXkiKSk7Ci0gICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0X3ZhbHVlKHN0cnVjdHVyZS5nZXQoKSwg
ImtleS1pZHMiLCAma2V5SURMaXN0KTsKLSAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXRfdmFsdWUo
c3RydWN0dXJlLmdldCgpLCAia2V5LXZhbHVlcyIsICZrZXlWYWx1ZUxpc3QpOwotCi0gICAgICAg
IGdzdF9lbGVtZW50X3NlbmRfZXZlbnQobV9wbGF5YmFja1BpcGVsaW5lLT5waXBlbGluZSgpLCBn
c3RfZXZlbnRfbmV3X2N1c3RvbShHU1RfRVZFTlRfQ1VTVE9NX0RPV05TVFJFQU1fT09CLCBzdHJ1
Y3R1cmUucmVsZWFzZSgpKSk7Ci0gICAgfQotfQotI2VuZGlmCi0KIH0gLy8gbmFtZXNwYWNlIFdl
YkNvcmUuCiAKICNlbmRpZiAvLyBVU0UoR1NUUkVBTUVSKQpkaWZmIC0tZ2l0IGEvU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZ3N0cmVhbWVyL21zZS9NZWRpYVBsYXllclByaXZhdGVH
U3RyZWFtZXJNU0UuaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2dzdHJlYW1l
ci9tc2UvTWVkaWFQbGF5ZXJQcml2YXRlR1N0cmVhbWVyTVNFLmgKaW5kZXggNWI1NjgyZjY0YjVk
MzU0OTRlODM5YjdhMzk0NGJhN2U0MDllZmMxOC4uMmRmYTczMmZjYmYyNmJhNjg3ZjFhOTgxNGFi
NzY2M2VlZjk4NTQ3NCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvZ3N0cmVhbWVyL21zZS9NZWRpYVBsYXllclByaXZhdGVHU3RyZWFtZXJNU0UuaAorKysgYi9T
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9nc3RyZWFtZXIvbXNlL01lZGlhUGxheWVy
UHJpdmF0ZUdTdHJlYW1lck1TRS5oCkBAIC04NSwxMCArODUsNiBAQCBwdWJsaWM6CiAgICAgc3Rh
dGljIGJvb2wgc3VwcG9ydHNDb2RlYyhTdHJpbmcgY29kZWMpOwogICAgIHN0YXRpYyBib29sIHN1
cHBvcnRzQWxsQ29kZWNzKGNvbnN0IFZlY3RvcjxTdHJpbmc+JiBjb2RlY3MpOwogCi0jaWYgRU5B
QkxFKEVOQ1JZUFRFRF9NRURJQSkKLSAgICB2b2lkIGF0dGVtcHRUb0RlY3J5cHRXaXRoTG9jYWxJ
bnN0YW5jZSgpIGZpbmFsOwotI2VuZGlmCi0KIHByaXZhdGU6CiAgICAgc3RhdGljIHZvaWQgZ2V0
U3VwcG9ydGVkVHlwZXMoSGFzaFNldDxTdHJpbmcsIEFTQ0lJQ2FzZUluc2Vuc2l0aXZlSGFzaD4m
KTsKICAgICBzdGF0aWMgTWVkaWFQbGF5ZXI6OlN1cHBvcnRzVHlwZSBzdXBwb3J0c1R5cGUoY29u
c3QgTWVkaWFFbmdpbmVTdXBwb3J0UGFyYW1ldGVycyYpOwpkaWZmIC0tZ2l0IGEvVG9vbHMvQ2hh
bmdlTG9nIGIvVG9vbHMvQ2hhbmdlTG9nCmluZGV4IDZiYjQxMDA5MzQ2NDA5YzY4ODkyNzZiODM2
NTVjMmM2NjI5ZTg4MzkuLmVkZmQ5YmZhZmVlNjI1ZGUyMDNjMTNjOTk5YzYyMzY0YWNkZjI4ODcg
MTAwNjQ0Ci0tLSBhL1Rvb2xzL0NoYW5nZUxvZworKysgYi9Ub29scy9DaGFuZ2VMb2cKQEAgLTEs
MyArMSwxMyBAQAorMjAxOS0wMS0xOCAgQ2hhcmxpZSBUdXJuZXIgIDxjdHVybmVyQGlnYWxpYS5j
b20+CisKKyAgICAgICAgW0dTdHJlYW1lcl1bRU1FXVtDbGVhcktleV0gUmVxdWVzdCBrZXlzIGZy
b20gQ0RNSW5zdGFuY2UgcmF0aGVyIHRoYW4gcGFzc2luZyB2aWEgYnVzIG1lc3NhZ2VzCisgICAg
ICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xOTIyMjkKKworICAg
ICAgICBSZXZpZXdlZCBieSBYYWJpZXIgUm9kcmlndWV6LUNhbHZhci4KKworICAgICAgICAqIE1p
bmlCcm93c2VyL3dwZS9tYWluLmNwcDoKKyAgICAgICAgKG1haW4pOiBFbmFibGUgZW5jcnlwdGVk
LW1lZGlhIGJ5IGRlZmF1bHQuCisKIDIwMTktMDEtMTcgIFdlbnNvbiBIc2llaCAgPHdlbnNvbl9o
c2llaEBhcHBsZS5jb20+CiAKICAgICAgICAgW2lPU10gQ29udGVudCBvZmZzZXQganVtcHMgZXJy
YXRpY2FsbHkgd2hlbiBhdXRvc2Nyb2xsaW5nIG5lYXIgc2Nyb2xsIHZpZXcgY29udGVudCBpbnNl
dCBhcmVhcwpkaWZmIC0tZ2l0IGEvVG9vbHMvTWluaUJyb3dzZXIvd3BlL21haW4uY3BwIGIvVG9v
bHMvTWluaUJyb3dzZXIvd3BlL21haW4uY3BwCmluZGV4IDYyY2Y1NWRiMzExZGI4MWYyOWE1ZTEz
YTM2ZjZhODFkOTIwNmFkMTEuLmVkNzc1MjhiMmNlYjJmZDBjNDExYmY2ZGUyNmVmM2UyOWEwMTM1
NTggMTAwNjQ0Ci0tLSBhL1Rvb2xzL01pbmlCcm93c2VyL3dwZS9tYWluLmNwcAorKysgYi9Ub29s
cy9NaW5pQnJvd3Nlci93cGUvbWFpbi5jcHAKQEAgLTE3Nyw2ICsxNzcsNyBAQCBpbnQgbWFpbihp
bnQgYXJnYywgY2hhciAqYXJndltdKQogICAgICAgICAiZW5hYmxlLWRldmVsb3Blci1leHRyYXMi
LCBUUlVFLAogICAgICAgICAiZW5hYmxlLXdlYmdsIiwgVFJVRSwKICAgICAgICAgImVuYWJsZS1t
ZWRpYS1zdHJlYW0iLCBUUlVFLAorICAgICAgICAiZW5hYmxlLWVuY3J5cHRlZC1tZWRpYSIsIFRS
VUUsCiAgICAgICAgIG51bGxwdHIpOwogCiAgICAgYXV0byogd2ViVmlldyA9IFdFQktJVF9XRUJf
VklFVyhnX29iamVjdF9uZXcoV0VCS0lUX1RZUEVfV0VCX1ZJRVcsCg==
</data>

          </attachment>
      

    </bug>

</bugzilla>