<?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>187984</bug_id>
          
          <creation_ts>2018-07-24 19:14:40 -0700</creation_ts>
          <short_desc>[Curl] Use shared single thread for WebSocket connections</short_desc>
          <delta_ts>2020-02-17 04:08:18 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Platform</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          <see_also>https://bugs.webkit.org/show_bug.cgi?id=173449</see_also>
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          <dependson>172630</dependson>
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Basuke Suzuki">basuke</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>annulen</cc>
    
    <cc>basuke</cc>
    
    <cc>commit-queue</cc>
    
    <cc>ews-watchlist</cc>
    
    <cc>fujii</cc>
    
    <cc>galpeter</cc>
    
    <cc>gyuyoung.kim</cc>
    
    <cc>ryuan.choi</cc>
    
    <cc>sergio</cc>
    
    <cc>takashi.komori</cc>
    
    <cc>toyoshim</cc>
    
    <cc>webkit-bug-importer</cc>
    
    <cc>yutak</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1444935</commentid>
    <comment_count>0</comment_count>
    <who name="Basuke Suzuki">basuke</who>
    <bug_when>2018-07-24 19:14:40 -0700</bug_when>
    <thetext>Current implementation launches new thread for each connection. Create a new scheduler for socket connection. It&apos;s not possible to share with normal scheduler for HTTP connection because of the difference of the architecture. One for HTTP and another for WebSocket.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1539381</commentid>
    <comment_count>1</comment_count>
    <who name="Fujii Hironori">fujii</who>
    <bug_when>2019-05-27 06:39:51 -0700</bug_when>
    <thetext>You need to address Bug 173449.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1612226</commentid>
    <comment_count>2</comment_count>
      <attachid>389079</attachid>
    <who name="Takashi Komori">takashi.komori</who>
    <bug_when>2020-01-28 15:42:32 -0800</bug_when>
    <thetext>Created attachment 389079
Handling connections by one thread.

This patch is for proof of concept.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1612227</commentid>
    <comment_count>3</comment_count>
    <who name="Takashi Komori">takashi.komori</who>
    <bug_when>2020-01-28 15:43:38 -0800</bug_when>
    <thetext>On curl port SocketStreamHanle creates a thread for handling each connection. (SocketStreamHandleImplCurl.cpp)
But this implementation is not resource friendly.

This patch aims to suppress creating threads.
The main idea is handling all connections by one thread.
For this purpose we propose introducing a manager class &apos;CurlSocketStreamWorkerManager&apos; in this patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1612306</commentid>
    <comment_count>4</comment_count>
      <attachid>389079</attachid>
    <who name="Basuke Suzuki">basuke</who>
    <bug_when>2020-01-28 19:23:17 -0800</bug_when>
    <thetext>Comment on attachment 389079
Handling connections by one thread.

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

This is an informal review. So to describe the overview of the changes,
- CurlSocketHandle code was moved to CurlSocketStreamWorker,
- SocketStreamHandleImpl code was moved to CurlSocketWorkerManager and CurlSocketStreamHandle

The instance of CurlSocketStreamHandle exists only in main thread and those of CurlSocketStreamWorker are in worker thread. This is a good separation and very effective way to prevent thread related memory issue.

I think CurlSocketStreamHandle do a little bit too much. It should be thinner layer as name implies and tasks should be asked to WorkerManager with an argument of Handle. Stop registering itself to manager, but let manager create Handle and register it by itself.

Last thing, class names are too long and hard to get the meaning. I suggest renaming like this:
- CurlSocketStreamWorkerManager -&gt; CurlStreamScheduler (corresponding to CurlRequestSchedular)
- CurlSocketStreamWorker -&gt; CurlStream
- CurlSocketStreamHandle -&gt; CurlStream::Handle
- CurlSocketStreamHandleClient -&gt; CurlStream::Client

Because this is inside curl network layer implementation, there&apos;s nothing to point to Stream since today. We can safely use simple term &quot;Stream&quot; for the meaning of SocketStream.

Also as WinCairo also has an implementation of RemoteInspectorSocket and the term &quot;Socket&quot; is used everywhere around that, I feel better not seeing that term  in Curl layer.

&gt; Source/WebCore/platform/network/curl/CurlContext.cpp:120
&gt; +    m_socketStreamWorkerManager = makeUnique&lt;CurlSocketStreamWorkerManager&gt;();

It should be lazy initialization.

&gt; Source/WebCore/platform/network/curl/CurlContext.cpp:259
&gt; +CURLMcode CurlMultiHandle::poll(curl_waitfd* extraFds, unsigned numOfExtraFds, int timeoutMS, int&amp; numFds)

This isn&apos;t used in this patch. Please remove it.

&gt; Source/WebCore/platform/network/curl/CurlContext.cpp:-874
&gt; -#ifndef NDEBUG

These changes happens because of the layout change of functions. Please try minimizing the diff size.

&gt; Source/WebCore/platform/network/curl/CurlContext.cpp:886
&gt; +        errorHandler(errorCode);

errorHandler is used just for returning errorCode. There must be better way to do that. i.e. WTF::Expected

&gt; Source/WebCore/platform/network/curl/CurlSocketStreamHandleClient.h:32
&gt; +class CurlSocketStreamHandleClient {

This class is very close to CurlSocketStreamHandle and recent implementation tend to put that as a embedded class. Let&apos;s move it inside CurlSocketStreamHandle . like:
class CurlSocketStreamHandle {
...
public:
...
    class Client {
        ...
    }

Then this file can be deleted and the reader can understand the relationship easily afterword.

&gt; Source/WebCore/platform/network/curl/CurlSocketStreamWorkerClient.h:35
&gt; +class CurlSocketStreamWorkerClient {

I don&apos;t think this abstraction is required. It&apos;s too much. WorkerManager should handle Workers directly.

&gt; Source/WebCore/platform/network/curl/SocketStreamHandleImpl.h:-82
&gt; -    bool m_hasPendingWriteData { false };

I understand this patch tries to move the logic from this class to CurlSocketStreamXXX, but it seems a little bit too much. m_hasPendingWriteData is actually the mechanizm of WebKit side. It is okay to leave them here and make the change less in the platform layer side.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1612878</commentid>
    <comment_count>5</comment_count>
      <attachid>389232</attachid>
    <who name="Takashi Komori">takashi.komori</who>
    <bug_when>2020-01-30 00:28:41 -0800</bug_when>
    <thetext>Created attachment 389232
Handling connections by one thread.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1612882</commentid>
    <comment_count>6</comment_count>
    <who name="Takashi Komori">takashi.komori</who>
    <bug_when>2020-01-30 00:49:26 -0800</bug_when>
    <thetext>

(In reply to Basuke Suzuki from comment #4)
&gt; Comment on attachment 389079 [details]
&gt; Handling connections by one thread.
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=389079&amp;action=review
&gt; 
&gt; This is an informal review. So to describe the overview of the changes,
&gt; - CurlSocketHandle code was moved to CurlSocketStreamWorker,
&gt; - SocketStreamHandleImpl code was moved to CurlSocketWorkerManager and
&gt; CurlSocketStreamHandle
&gt; 
&gt; The instance of CurlSocketStreamHandle exists only in main thread and those
&gt; of CurlSocketStreamWorker are in worker thread. This is a good separation
&gt; and very effective way to prevent thread related memory issue.
&gt; 
&gt; I think CurlSocketStreamHandle do a little bit too much. It should be
&gt; thinner layer as name implies and tasks should be asked to WorkerManager
&gt; with an argument of Handle. Stop registering itself to manager, but let
&gt; manager create Handle and register it by itself.
&gt; 
&gt; Last thing, class names are too long and hard to get the meaning. I suggest
&gt; renaming like this:
&gt; - CurlSocketStreamWorkerManager -&gt; CurlStreamScheduler (corresponding to
&gt; CurlRequestSchedular)
&gt; - CurlSocketStreamWorker -&gt; CurlStream
&gt; - CurlSocketStreamHandle -&gt; CurlStream::Handle
&gt; - CurlSocketStreamHandleClient -&gt; CurlStream::Client
&gt; 
&gt; Because this is inside curl network layer implementation, there&apos;s nothing to
&gt; point to Stream since today. We can safely use simple term &quot;Stream&quot; for the
&gt; meaning of SocketStream.
&gt; 
&gt; Also as WinCairo also has an implementation of RemoteInspectorSocket and the
&gt; term &quot;Socket&quot; is used everywhere around that, I feel better not seeing that
&gt; term  in Curl layer.
&gt; 
&gt; &gt; Source/WebCore/platform/network/curl/CurlContext.cpp:120
&gt; &gt; +    m_socketStreamWorkerManager = makeUnique&lt;CurlSocketStreamWorkerManager&gt;();
&gt; 
&gt; It should be lazy initialization.

FIXED.

&gt; 
&gt; &gt; Source/WebCore/platform/network/curl/CurlContext.cpp:259
&gt; &gt; +CURLMcode CurlMultiHandle::poll(curl_waitfd* extraFds, unsigned numOfExtraFds, int timeoutMS, int&amp; numFds)
&gt; 
&gt; This isn&apos;t used in this patch. Please remove it.

REMOVED.

&gt; 
&gt; &gt; Source/WebCore/platform/network/curl/CurlContext.cpp:-874
&gt; &gt; -#ifndef NDEBUG
&gt; 
&gt; These changes happens because of the layout change of functions. Please try
&gt; minimizing the diff size.

FIXED.

&gt; 
&gt; &gt; Source/WebCore/platform/network/curl/CurlContext.cpp:886
&gt; &gt; +        errorHandler(errorCode);
&gt; 
&gt; errorHandler is used just for returning errorCode. There must be better way
&gt; to do that. i.e. WTF::Expected

FIXED.

&gt; 
&gt; &gt; Source/WebCore/platform/network/curl/CurlSocketStreamHandleClient.h:32
&gt; &gt; +class CurlSocketStreamHandleClient {
&gt; 
&gt; This class is very close to CurlSocketStreamHandle and recent implementation
&gt; tend to put that as a embedded class. Let&apos;s move it inside
&gt; CurlSocketStreamHandle . like:
&gt; class CurlSocketStreamHandle {
&gt; ...
&gt; public:
&gt; ...
&gt;     class Client {
&gt;         ...
&gt;     }
&gt; 
&gt; Then this file can be deleted and the reader can understand the relationship
&gt; easily afterword.
&gt; 
&gt; &gt; Source/WebCore/platform/network/curl/CurlSocketStreamWorkerClient.h:35
&gt; &gt; +class CurlSocketStreamWorkerClient {
&gt; 
&gt; I don&apos;t think this abstraction is required. It&apos;s too much. WorkerManager
&gt; should handle Workers directly.

Reduced files by introducing CurlStream::Client class.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1612889</commentid>
    <comment_count>7</comment_count>
      <attachid>389232</attachid>
    <who name="Fujii Hironori">fujii</who>
    <bug_when>2020-01-30 02:03:03 -0800</bug_when>
    <thetext>Comment on attachment 389232
Handling connections by one thread.

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

&gt; Source/WebCore/platform/network/curl/CurlStream.cpp:82
&gt; +void CurlStream::send(UniqueArray&lt;uint8_t&gt;&amp;&amp; buffer, size_t length)

&apos;length&apos; is redundant. buffer has the size.

&gt; Source/WebCore/platform/network/curl/CurlStream.cpp:191
&gt; +void CurlStream::notifyFailWithError(CURLcode errorCode)

notifyFailWithError should be renamed because &apos;fail&apos; is a verb, the phase &apos;notify fail&apos; sounds weird.
I think you refereed &apos;curlDidFailWithError&apos;. the phase &apos;did fail&apos; is not weird.

&gt; Source/WebCore/platform/network/curl/CurlStreamScheduler.cpp:172
&gt; +    struct timeval timeout { 0, selectTimeoutMS * 1000};

You should implement self-piping technique here to wake up. (Bug 173449)
Then, you can sleep forever here instead of waking up every 20ms.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1612892</commentid>
    <comment_count>8</comment_count>
      <attachid>389232</attachid>
    <who name="Fujii Hironori">fujii</who>
    <bug_when>2020-01-30 02:27:59 -0800</bug_when>
    <thetext>Comment on attachment 389232
Handling connections by one thread.

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

&gt; Source/WebCore/platform/network/curl/CurlStreamScheduler.cpp:48
&gt; +    m_nextStreamID = (m_nextStreamID + 1 != invalidCurlStreamID) ? m_nextStreamID + 1 : 1;

You don&apos;t check m_nextStreamID is not used.
Can you use the pointer of client instead of m_nextStreamID?

&gt; Source/WebCore/platform/network/curl/CurlStreamScheduler.h:42
&gt; +    void destory(CurlStreamID);

&apos;create&apos; is typically used to create the instance of the class.
Rename createStream and destroyStream, for example.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1612894</commentid>
    <comment_count>9</comment_count>
      <attachid>389232</attachid>
    <who name="Fujii Hironori">fujii</who>
    <bug_when>2020-01-30 02:34:40 -0800</bug_when>
    <thetext>Comment on attachment 389232
Handling connections by one thread.

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

&gt; Source/WebCore/platform/network/curl/CurlStream.cpp:168
&gt; +    while (m_writeBufferOffset &lt; m_writeBufferSize) {

Do you know the reason why &apos;while&apos; loop is used here even though &apos;tryToRead&apos; doesn&apos;t?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1612896</commentid>
    <comment_count>10</comment_count>
      <attachid>389232</attachid>
    <who name="Fujii Hironori">fujii</who>
    <bug_when>2020-01-30 02:38:01 -0800</bug_when>
    <thetext>Comment on attachment 389232
Handling connections by one thread.

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

&gt; Source/WebCore/platform/network/curl/CurlStreamScheduler.cpp:137
&gt; +void CurlStreamScheduler::stopThread()

Is stopThread called from anywhere?

&gt; Source/WebCore/platform/network/curl/CurlStreamScheduler.cpp:139
&gt; +    m_runThread = false;

Don&apos;t you need to lock m_mutex?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1613191</commentid>
    <comment_count>11</comment_count>
      <attachid>389232</attachid>
    <who name="Basuke Suzuki">basuke</who>
    <bug_when>2020-01-30 16:04:18 -0800</bug_when>
    <thetext>Comment on attachment 389232
Handling connections by one thread.

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

This is informal review.

&gt; Source/WebCore/platform/network/curl/CurlStream.cpp:54
&gt; +    auto errorCode = m_curlHandle-&gt;perform();

You cannot try connecting here. It blocks until it connect.

&gt; Source/WebCore/platform/network/curl/CurlStream.cpp:87
&gt; +    if (!m_curlHandle || m_writeBuffer)

This is wrong. If m_writeBuffer is not null, the contents of buffer is gone. And there&apos;s no way the client can know whether it can send or not. Add canSend() method or append data in the end of writeBuffer.

Or m_writeBuffer can be Vector&lt;std::tuple&lt;UniqueArray&lt;uint_t&gt;, size_t&gt;&gt;, then appending is just a simple task.

&gt; Source/WebCore/platform/network/curl/CurlStream.cpp:153
&gt; +        destroyHandle();

Don&apos;t you need to start any closing sequence here?

&gt;&gt; Source/WebCore/platform/network/curl/CurlStream.cpp:168
&gt;&gt; +    while (m_writeBufferOffset &lt; m_writeBufferSize) {
&gt; 
&gt; Do you know the reason why &apos;while&apos; loop is used here even though &apos;tryToRead&apos; doesn&apos;t?

Yeah, this is wrong. The write() will block if send buffer is full. It was okay in a dedicate thread mode, but not okay in this patch. We can try just one timing after we get a permission to write after status check.

&gt;&gt; Source/WebCore/platform/network/curl/CurlStream.cpp:191
&gt;&gt; +void CurlStream::notifyFailWithError(CURLcode errorCode)
&gt; 
&gt; notifyFailWithError should be renamed because &apos;fail&apos; is a verb, the phase &apos;notify fail&apos; sounds weird.
&gt; I think you refereed &apos;curlDidFailWithError&apos;. the phase &apos;did fail&apos; is not weird.

The verb `notify` is important for this method, simply using noun `Failure` and `notifyFailure` is enough, isn&apos;t it? `WithError` is apparent from the parameter.

&gt; Source/WebCore/platform/network/curl/CurlStream.cpp:199
&gt; +        client.didFailWithError(SocketStreamError(errorCode, url, CurlHandle::errorDescription(errorCode)));

Is this CurlScheduler&apos;s responsibility to instantiate SocketStreamError? It is good idea to be as ignorant as possible for WebKit implementation. Just return errorCode and url is enough, I think.

&gt; Source/WebCore/platform/network/curl/CurlStream.cpp:203
&gt; +void CurlStream::callClient(Function&lt;void(Client&amp;)&gt;&amp;&amp; task)

Do we need this method? Each occasion to call client callback can call m_scheduler&apos;s method directly. That makes code a little bit busy, but more straight forward.

&gt; Source/WebCore/platform/network/curl/CurlStream.h:46
&gt; +        virtual void didOpen() = 0;

These interface method should have caller&apos;s instance as a first argument.

    virtual void didOpen(CurlStream&amp;) = 0;

That is similar to Cocoa&apos;s delegation pattern. Adding that to each method gives more context to implementation side, i.e. who will require them. Also it may solve future method name conflict.

&gt;&gt; Source/WebCore/platform/network/curl/CurlStreamScheduler.cpp:48
&gt;&gt; +    m_nextStreamID = (m_nextStreamID + 1 != invalidCurlStreamID) ? m_nextStreamID + 1 : 1;
&gt; 
&gt; You don&apos;t check m_nextStreamID is not used.
&gt; Can you use the pointer of client instead of m_nextStreamID?

The timing of issuing ID and object allocation is different. We cannot simply use the address as an id. Also memory region can be reused for same object type and it is safe not to use address. But existence check is required.

&gt; Source/WebCore/platform/network/curl/CurlStreamScheduler.cpp:52
&gt; +    auto task = [this, streamID, url = url.isolatedCopy()]() mutable {

This might be just a preference, but for me, assigning to temporal variable and use it in next line is not good rhythm to read. Calling `callOnWorkerThread()` with direct lambda is easy to read.

&gt; Source/WebCore/platform/network/curl/CurlStreamScheduler.cpp:70
&gt; +        ASSERT(!isMainThread());

These assertion should be responsibility of callOnWorkerThead() or executeTask() method and no need to check in every places.

&gt; Source/WebCore/platform/network/curl/CurlStreamScheduler.cpp:97
&gt; +void CurlStreamScheduler::callOnMainThread(CurlStreamID streamID, WTF::Function&lt;void(CurlStream::Client&amp;)&gt;&amp;&amp; task)

This is not general purpose invocation method. This function do more. How about callClientOnMainThread?

&gt; Source/WebCore/platform/network/curl/CurlStreamScheduler.h:65
&gt; +    HashMap&lt;CurlStreamID, CurlStream::Client*&gt; m_clientLists;

The value of item cannot be nullptr, so is should be CurlStream::Client&amp;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1613823</commentid>
    <comment_count>12</comment_count>
      <attachid>389481</attachid>
    <who name="Takashi Komori">takashi.komori</who>
    <bug_when>2020-02-02 14:15:39 -0800</bug_when>
    <thetext>Created attachment 389481
Handling connections by one thread.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1613825</commentid>
    <comment_count>13</comment_count>
    <who name="Takashi Komori">takashi.komori</who>
    <bug_when>2020-02-02 14:36:10 -0800</bug_when>
    <thetext>(In reply to Fujii Hironori from comment #7)
&gt; Comment on attachment 389232 [details]
&gt; Handling connections by one thread.
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=389232&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/platform/network/curl/CurlStream.cpp:82
&gt; &gt; +void CurlStream::send(UniqueArray&lt;uint8_t&gt;&amp;&amp; buffer, size_t length)
&gt; 
&gt; &apos;length&apos; is redundant. buffer has the size.

UniqueArray doesn&apos;t have length property.
 
&gt; &gt; Source/WebCore/platform/network/curl/CurlStream.cpp:191
&gt; &gt; +void CurlStream::notifyFailWithError(CURLcode errorCode)
&gt; 
&gt; notifyFailWithError should be renamed because &apos;fail&apos; is a verb, the phase
&gt; &apos;notify fail&apos; sounds weird.
&gt; I think you refereed &apos;curlDidFailWithError&apos;. the phase &apos;did fail&apos; is not
&gt; weird.

Changed to notifyFailure.

&gt; 
&gt; &gt; Source/WebCore/platform/network/curl/CurlStreamScheduler.cpp:172
&gt; &gt; +    struct timeval timeout { 0, selectTimeoutMS * 1000};
&gt; 
&gt; You should implement self-piping technique here to wake up. (Bug 173449)
&gt; Then, you can sleep forever here instead of waking up every 20ms.


We feel like implementing that in another ticket, because already we have had many changes.

And we think that we might be able to implement similar function by using curl_multi_poll and curl_multi_wakeup which are supported above curl 7.68.0
How do you think about using curl_multi_poo/curl_multi_wakeup?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1613826</commentid>
    <comment_count>14</comment_count>
    <who name="Takashi Komori">takashi.komori</who>
    <bug_when>2020-02-02 14:38:59 -0800</bug_when>
    <thetext>(In reply to Fujii Hironori from comment #9)
&gt; Comment on attachment 389232 [details]
&gt; Handling connections by one thread.
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=389232&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/platform/network/curl/CurlStream.cpp:168
&gt; &gt; +    while (m_writeBufferOffset &lt; m_writeBufferSize) {
&gt; 
&gt; Do you know the reason why &apos;while&apos; loop is used here even though &apos;tryToRead&apos;
&gt; doesn&apos;t?

We haven&apos;t fixed it, we will start soon.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1613827</commentid>
    <comment_count>15</comment_count>
    <who name="Takashi Komori">takashi.komori</who>
    <bug_when>2020-02-02 14:40:04 -0800</bug_when>
    <thetext>(In reply to Fujii Hironori from comment #10)
&gt; Comment on attachment 389232 [details]
&gt; Handling connections by one thread.
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=389232&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/platform/network/curl/CurlStreamScheduler.cpp:137
&gt; &gt; +void CurlStreamScheduler::stopThread()
&gt; 
&gt; Is stopThread called from anywhere?

Removed.

&gt; 
&gt; &gt; Source/WebCore/platform/network/curl/CurlStreamScheduler.cpp:139
&gt; &gt; +    m_runThread = false;
&gt; 
&gt; Don&apos;t you need to lock m_mutex?

Fixed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1613829</commentid>
    <comment_count>16</comment_count>
    <who name="Takashi Komori">takashi.komori</who>
    <bug_when>2020-02-02 14:50:18 -0800</bug_when>
    <thetext>(In reply to Fujii Hironori from comment #8)
&gt; Comment on attachment 389232 [details]
&gt; Handling connections by one thread.
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=389232&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/platform/network/curl/CurlStreamScheduler.cpp:48
&gt; &gt; +    m_nextStreamID = (m_nextStreamID + 1 != invalidCurlStreamID) ? m_nextStreamID + 1 : 1;
&gt; 
&gt; You don&apos;t check m_nextStreamID is not used.
&gt; Can you use the pointer of client instead of m_nextStreamID?

Fixed not to use in-use IDs.
As stand in comment11 we cannot substitute IDs by pointers.

&gt; 
&gt; &gt; Source/WebCore/platform/network/curl/CurlStreamScheduler.h:42
&gt; &gt; +    void destory(CurlStreamID);
&gt; 
&gt; &apos;create&apos; is typically used to create the instance of the class.
&gt; Rename createStream and destroyStream, for example.

Fixed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1613837</commentid>
    <comment_count>17</comment_count>
    <who name="Takashi Komori">takashi.komori</who>
    <bug_when>2020-02-02 15:37:39 -0800</bug_when>
    <thetext>(In reply to Basuke Suzuki from comment #11)
&gt; Comment on attachment 389232 [details]
&gt; Handling connections by one thread.
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=389232&amp;action=review
&gt; 
&gt; This is informal review.
&gt; 
&gt; &gt; Source/WebCore/platform/network/curl/CurlStream.cpp:54
&gt; &gt; +    auto errorCode = m_curlHandle-&gt;perform();
&gt; 
&gt; You cannot try connecting here. It blocks until it connect.

We tried to avoid blocking by using curl_multi_perform, but it causes some failures of layout tests (timeout).
Connections made by curl_multi_perform seem to fail detecting server close.
If you know about this, please let us know.

&gt; 
&gt; &gt; Source/WebCore/platform/network/curl/CurlStream.cpp:87
&gt; &gt; +    if (!m_curlHandle || m_writeBuffer)
&gt; 
&gt; This is wrong. If m_writeBuffer is not null, the contents of buffer is gone.
&gt; And there&apos;s no way the client can know whether it can send or not. Add
&gt; canSend() method or append data in the end of writeBuffer.
&gt; 
&gt; Or m_writeBuffer can be Vector&lt;std::tuple&lt;UniqueArray&lt;uint_t&gt;, size_t&gt;&gt;,
&gt; then appending is just a simple task.

We haven&apos;t fixed.
Client can know if there is pending data by checking SocketStreamHandleImpl::m_hasPendingSendData.
Do you mean that SocketStreamHandleImpl::platformSendInternal should have vector of sending buffer and accept buffer regardless state of m_hasPendingSendData?


&gt; 
&gt; &gt; Source/WebCore/platform/network/curl/CurlStream.cpp:153
&gt; &gt; +        destroyHandle();
&gt; 
&gt; Don&apos;t you need to start any closing sequence here?

We don&apos;t need to start closing here.
When WebSocketChannel::didReceiveSocketStreamData receives 0 byte buffer, it starts disconnecting.

&gt; &gt;&gt; Source/WebCore/platform/network/curl/CurlStream.cpp:191
&gt; &gt;&gt; +void CurlStream::notifyFailWithError(CURLcode errorCode)
&gt; &gt; 
&gt; &gt; notifyFailWithError should be renamed because &apos;fail&apos; is a verb, the phase &apos;notify fail&apos; sounds weird.
&gt; &gt; I think you refereed &apos;curlDidFailWithError&apos;. the phase &apos;did fail&apos; is not weird.
&gt; 
&gt; The verb `notify` is important for this method, simply using noun `Failure`
&gt; and `notifyFailure` is enough, isn&apos;t it? `WithError` is apparent from the
&gt; parameter.
&gt; 

Fixed.

&gt; &gt; Source/WebCore/platform/network/curl/CurlStream.cpp:199
&gt; &gt; +        client.didFailWithError(SocketStreamError(errorCode, url, CurlHandle::errorDescription(errorCode)));
&gt; 
&gt; Is this CurlScheduler&apos;s responsibility to instantiate SocketStreamError? It
&gt; is good idea to be as ignorant as possible for WebKit implementation. Just
&gt; return errorCode and url is enough, I think.

Fixed.

&gt; 
&gt; &gt; Source/WebCore/platform/network/curl/CurlStream.cpp:203
&gt; &gt; +void CurlStream::callClient(Function&lt;void(Client&amp;)&gt;&amp;&amp; task)
&gt; 
&gt; Do we need this method? Each occasion to call client callback can call
&gt; m_scheduler&apos;s method directly. That makes code a little bit busy, but more
&gt; straight forward.

Fixed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1613840</commentid>
    <comment_count>18</comment_count>
    <who name="Takashi Komori">takashi.komori</who>
    <bug_when>2020-02-02 16:28:56 -0800</bug_when>
    <thetext>(In reply to Basuke Suzuki from comment #11)
&gt; 
&gt; &gt; Source/WebCore/platform/network/curl/CurlStream.h:46
&gt; &gt; +        virtual void didOpen() = 0;
&gt; 
&gt; These interface method should have caller&apos;s instance as a first argument.
&gt; 
&gt;     virtual void didOpen(CurlStream&amp;) = 0;
&gt; 
&gt; That is similar to Cocoa&apos;s delegation pattern. Adding that to each method
&gt; gives more context to implementation side, i.e. who will require them. Also
&gt; it may solve future method name conflict.

CurlStreamHandleImpl&apos;s lifetime is different from CurlStream&apos;s, so it is possible that when CurlStreamHandleImple::didFail is invoked, the CurlStream instance already had been destructed.
To implement that we should consider not to access destructed instances too.


&gt; &gt; Source/WebCore/platform/network/curl/CurlStreamScheduler.cpp:52
&gt; &gt; +    auto task = [this, streamID, url = url.isolatedCopy()]() mutable {
&gt; 
&gt; This might be just a preference, but for me, assigning to temporal variable
&gt; and use it in next line is not good rhythm to read. Calling
&gt; `callOnWorkerThread()` with direct lambda is easy to read.

Fixed.

&gt;
&gt; &gt; Source/WebCore/platform/network/curl/CurlStreamScheduler.cpp:70
&gt; &gt; +        ASSERT(!isMainThread());
&gt; 
&gt; These assertion should be responsibility of callOnWorkerThead() or
&gt; executeTask() method and no need to check in every places.

Fixed.

&gt; 
&gt; &gt; Source/WebCore/platform/network/curl/CurlStreamScheduler.cpp:97
&gt; &gt; +void CurlStreamScheduler::callOnMainThread(CurlStreamID streamID, WTF::Function&lt;void(CurlStream::Client&amp;)&gt;&amp;&amp; task)
&gt; 
&gt; This is not general purpose invocation method. This function do more. How
&gt; about callClientOnMainThread?

Fixed.

&gt; 
&gt; &gt; Source/WebCore/platform/network/curl/CurlStreamScheduler.h:65
&gt; &gt; +    HashMap&lt;CurlStreamID, CurlStream::Client*&gt; m_clientLists;
&gt; 
&gt; The value of item cannot be nullptr, so is should be CurlStream::Client&amp;

We can&apos;t use reference here because CurlStream::Client is abstract class as we can&apos;t get the instance by calling m_clientLists.get</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1614260</commentid>
    <comment_count>19</comment_count>
    <who name="Basuke Suzuki">basuke</who>
    <bug_when>2020-02-03 16:16:38 -0800</bug_when>
    <thetext>(In reply to Takashi Komori from comment #13)
&gt; &gt; &gt; Source/WebCore/platform/network/curl/CurlStreamScheduler.cpp:172
&gt; &gt; &gt; +    struct timeval timeout { 0, selectTimeoutMS * 1000};
&gt; &gt; 
&gt; &gt; You should implement self-piping technique here to wake up. (Bug 173449)
&gt; &gt; Then, you can sleep forever here instead of waking up every 20ms.
&gt; 
&gt; 
&gt; We feel like implementing that in another ticket, because already we have
&gt; had many changes.
&gt; 
&gt; And we think that we might be able to implement similar function by using
&gt; curl_multi_poll and curl_multi_wakeup which are supported above curl 7.68.0
&gt; How do you think about using curl_multi_poo/curl_multi_wakeup?

I feel that is very right direction. I agree with postponing this improvement later.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1614278</commentid>
    <comment_count>20</comment_count>
    <who name="Basuke Suzuki">basuke</who>
    <bug_when>2020-02-03 16:35:12 -0800</bug_when>
    <thetext>(In reply to Takashi Komori from comment #17)
&gt; &gt; You cannot try connecting here. It blocks until it connect.
&gt; 
&gt; We tried to avoid blocking by using curl_multi_perform, but it causes some
&gt; failures of layout tests (timeout).
&gt; Connections made by curl_multi_perform seem to fail detecting server close.
&gt; If you know about this, please let us know.


&gt; &gt; 
&gt; &gt; &gt; Source/WebCore/platform/network/curl/CurlStream.cpp:153
&gt; &gt; &gt; +        destroyHandle();
&gt; &gt; 
&gt; &gt; Don&apos;t you need to start any closing sequence here?
&gt; 
&gt; We don&apos;t need to start closing here.
&gt; When WebSocketChannel::didReceiveSocketStreamData receives 0 byte buffer, it
&gt; starts disconnecting.

Got it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1614282</commentid>
    <comment_count>21</comment_count>
    <who name="Basuke Suzuki">basuke</who>
    <bug_when>2020-02-03 16:40:14 -0800</bug_when>
    <thetext>(In reply to Takashi Komori from comment #18)
&gt; &gt; That is similar to Cocoa&apos;s delegation pattern. Adding that to each method
&gt; &gt; gives more context to implementation side, i.e. who will require them. Also
&gt; &gt; it may solve future method name conflict.
&gt; 
&gt; CurlStreamHandleImpl&apos;s lifetime is different from CurlStream&apos;s, so it is
&gt; possible that when CurlStreamHandleImple::didFail is invoked, the CurlStream
&gt; instance already had been destructed.
&gt; To implement that we should consider not to access destructed instances too.

Good point. Then use CurlStreamId instead. That represents the CurlStream itself and it&apos;s just an identifier, but client code can be distinguishable by that argument.

&gt; &gt; &gt; Source/WebCore/platform/network/curl/CurlStreamScheduler.h:65
&gt; &gt; &gt; +    HashMap&lt;CurlStreamID, CurlStream::Client*&gt; m_clientLists;
&gt; &gt; 
&gt; &gt; The value of item cannot be nullptr, so is should be CurlStream::Client&amp;
&gt; 
&gt; We can&apos;t use reference here because CurlStream::Client is abstract class as
&gt; we can&apos;t get the instance by calling m_clientLists.get

Ah, okay. Sorry about this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1614360</commentid>
    <comment_count>22</comment_count>
      <attachid>389232</attachid>
    <who name="Fujii Hironori">fujii</who>
    <bug_when>2020-02-03 19:25:52 -0800</bug_when>
    <thetext>Comment on attachment 389232
Handling connections by one thread.

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

&gt;&gt;&gt;&gt; Source/WebCore/platform/network/curl/CurlStreamScheduler.cpp:48
&gt;&gt;&gt;&gt; +    m_nextStreamID = (m_nextStreamID + 1 != invalidCurlStreamID) ? m_nextStreamID + 1 : 1;
&gt;&gt;&gt; 
&gt;&gt;&gt; You don&apos;t check m_nextStreamID is not used.
&gt;&gt;&gt; Can you use the pointer of client instead of m_nextStreamID?
&gt;&gt; 
&gt;&gt; The timing of issuing ID and object allocation is different. We cannot simply use the address as an id. Also memory region can be reused for same object type and it is safe not to use address. But existence check is required.
&gt; 
&gt; Fixed not to use in-use IDs.
&gt; As stand in comment11 we cannot substitute IDs by pointers.

I don&apos;t agree on this. SocketStreamHandleImpl always lives longer than CurlStream.
Even if CurlStream would be alive longer than SocketStreamHandleImpl, I think using WeakPtr is better because HashMap is expensive.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1614648</commentid>
    <comment_count>23</comment_count>
      <attachid>389232</attachid>
    <who name="Basuke Suzuki">basuke</who>
    <bug_when>2020-02-04 11:10:26 -0800</bug_when>
    <thetext>Comment on attachment 389232
Handling connections by one thread.

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

&gt;&gt;&gt;&gt;&gt; Source/WebCore/platform/network/curl/CurlStreamScheduler.cpp:48
&gt;&gt;&gt;&gt;&gt; +    m_nextStreamID = (m_nextStreamID + 1 != invalidCurlStreamID) ? m_nextStreamID + 1 : 1;
&gt;&gt;&gt;&gt; 
&gt;&gt;&gt;&gt; You don&apos;t check m_nextStreamID is not used.
&gt;&gt;&gt;&gt; Can you use the pointer of client instead of m_nextStreamID?
&gt;&gt;&gt; 
&gt;&gt;&gt; The timing of issuing ID and object allocation is different. We cannot simply use the address as an id. Also memory region can be reused for same object type and it is safe not to use address. But existence check is required.
&gt;&gt; 
&gt;&gt; Fixed not to use in-use IDs.
&gt;&gt; As stand in comment11 we cannot substitute IDs by pointers.
&gt; 
&gt; I don&apos;t agree on this. SocketStreamHandleImpl always lives longer than CurlStream.
&gt; Even if CurlStream would be alive longer than SocketStreamHandleImpl, I think using WeakPtr is better because HashMap is expensive.

No, he&apos;s talking about the timing difference between issuing ID and object instantiation. ID has to be issued at the timing of CurlStreamScheduler::create() and CurStream object will be created in the worker thread. That&apos;s the design of this patch. 

As of WeakPtr, it has to be created in main thread and that&apos;s also the approach we cannot take.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1615019</commentid>
    <comment_count>24</comment_count>
      <attachid>389797</attachid>
    <who name="Takashi Komori">takashi.komori</who>
    <bug_when>2020-02-05 05:40:23 -0800</bug_when>
    <thetext>Created attachment 389797
Handling connections by one thread.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1615020</commentid>
    <comment_count>25</comment_count>
    <who name="Takashi Komori">takashi.komori</who>
    <bug_when>2020-02-05 05:40:54 -0800</bug_when>
    <thetext>(In reply to Takashi Komori from comment #14)
&gt; (In reply to Fujii Hironori from comment #9)
&gt; &gt; Comment on attachment 389232 [details]
&gt; &gt; Handling connections by one thread.
&gt; &gt; 
&gt; &gt; View in context:
&gt; &gt; https://bugs.webkit.org/attachment.cgi?id=389232&amp;action=review
&gt; &gt; 
&gt; &gt; &gt; Source/WebCore/platform/network/curl/CurlStream.cpp:168
&gt; &gt; &gt; +    while (m_writeBufferOffset &lt; m_writeBufferSize) {
&gt; &gt; 
&gt; &gt; Do you know the reason why &apos;while&apos; loop is used here even though &apos;tryToRead&apos;
&gt; &gt; doesn&apos;t?
&gt; 
&gt; We haven&apos;t fixed it, we will start soon.

Fixed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1615021</commentid>
    <comment_count>26</comment_count>
    <who name="Takashi Komori">takashi.komori</who>
    <bug_when>2020-02-05 05:44:49 -0800</bug_when>
    <thetext>(In reply to Basuke Suzuki from comment #11)
&gt; Comment on attachment 389232 [details]
&gt; Handling connections by one thread.
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=389232&amp;action=review
&gt; 
&gt; This is informal review.
&gt; 
&gt; &gt; Source/WebCore/platform/network/curl/CurlStream.cpp:54
&gt; &gt; +    auto errorCode = m_curlHandle-&gt;perform();
&gt; 
&gt; You cannot try connecting here. It blocks until it connect.
&gt; 
&gt; &gt; Source/WebCore/platform/network/curl/CurlStream.cpp:87
&gt; &gt; +    if (!m_curlHandle || m_writeBuffer)
&gt; 
&gt; This is wrong. If m_writeBuffer is not null, the contents of buffer is gone.
&gt; And there&apos;s no way the client can know whether it can send or not. Add
&gt; canSend() method or append data in the end of writeBuffer.
&gt; 
&gt; Or m_writeBuffer can be Vector&lt;std::tuple&lt;UniqueArray&lt;uint_t&gt;, size_t&gt;&gt;,
&gt; then appending is just a simple task.
&gt; 

Simplified m_writeBuffer by using Vector&lt;std::tuple&lt;UniqueArray&lt;uint_t&gt;, size_t&gt;&gt;
m_writeBuffer -&gt; m_sendBuffer</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1615022</commentid>
    <comment_count>27</comment_count>
    <who name="Takashi Komori">takashi.komori</who>
    <bug_when>2020-02-05 05:45:37 -0800</bug_when>
    <thetext>(In reply to Basuke Suzuki from comment #21)
&gt; (In reply to Takashi Komori from comment #18)
&gt; &gt; &gt; That is similar to Cocoa&apos;s delegation pattern. Adding that to each method
&gt; &gt; &gt; gives more context to implementation side, i.e. who will require them. Also
&gt; &gt; &gt; it may solve future method name conflict.
&gt; &gt; 
&gt; &gt; CurlStreamHandleImpl&apos;s lifetime is different from CurlStream&apos;s, so it is
&gt; &gt; possible that when CurlStreamHandleImple::didFail is invoked, the CurlStream
&gt; &gt; instance already had been destructed.
&gt; &gt; To implement that we should consider not to access destructed instances too.
&gt; 
&gt; Good point. Then use CurlStreamId instead. That represents the CurlStream
&gt; itself and it&apos;s just an identifier, but client code can be distinguishable
&gt; by that argument.
&gt; 

We tried to let CurlStream::Client::didXXX accept CurlStreamID as the first argument.
But this is not used at all for now. I think we could make this change when we really need.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1616296</commentid>
    <comment_count>28</comment_count>
      <attachid>389797</attachid>
    <who name="Basuke Suzuki">basuke</who>
    <bug_when>2020-02-07 12:25:11 -0800</bug_when>
    <thetext>Comment on attachment 389797
Handling connections by one thread.

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

This is another informal review from the previous implementer of this logic. This time, checking the thread lock area.

&gt; Source/WebCore/platform/network/curl/CurlStreamScheduler.cpp:118
&gt; +        auto locker = holdLock(m_mutex);

Just after waitForCompletion(), it is ensured the thread is not running here. No need to lock.

&gt; Source/WebCore/platform/network/curl/CurlStreamScheduler.cpp:126
&gt; +        m_runThread = false;

workerThread() never return from looping until m_runThread == false. I think there&apos;s no need to set the variable here. This makes entire life cycle unclear and very confusing.

&gt; Source/WebCore/platform/network/curl/CurlStreamScheduler.cpp:131
&gt; +{

Add assert to ensure called in worker thread. And let code reader (me) know about that explicitly.

&gt; Source/WebCore/platform/network/curl/CurlStreamScheduler.cpp:133
&gt; +    if (m_taskQueue.size() || m_streamLists.size())

Move m_streamLists.size() check before locking to avoid unneeded lock.

&gt; Source/WebCore/platform/network/curl/CurlStreamScheduler.cpp:162
&gt; +            auto locker = holdLock(m_mutex);

m_runThread is set to false only within worker thread. There&apos;s no need to lock.

&gt; Source/WebCore/platform/network/curl/CurlStreamScheduler.cpp:163
&gt; +            if (!m_runThread)

Then this check can be move into `while`&apos;s condition.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1616301</commentid>
    <comment_count>29</comment_count>
      <attachid>389797</attachid>
    <who name="Basuke Suzuki">basuke</who>
    <bug_when>2020-02-07 12:40:24 -0800</bug_when>
    <thetext>Comment on attachment 389797
Handling connections by one thread.

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

(In reply to Takashi Komori from comment #27)

&gt; Source/WebCore/platform/network/curl/SocketStreamHandleImpl.h:65
&gt; +    void didFail(CurlStreamID, CURLcode, URL&amp;&amp;) final;

&gt; We tried to let CurlStream::Client::didXXX accept CurlStreamID as the first argument.
&gt; But this is not used at all for now. I think we could make this change when we really need.

You said this is not used, but that&apos;s not true. This signature express that these are implemented in interfaces related to CurlStream. That is very important to read a code by others. That&apos;s the thing I feel very important.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1617054</commentid>
    <comment_count>30</comment_count>
      <attachid>389797</attachid>
    <who name="Basuke Suzuki">basuke</who>
    <bug_when>2020-02-10 13:15:06 -0800</bug_when>
    <thetext>Comment on attachment 389797
Handling connections by one thread.

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

&gt; Source/WebCore/platform/network/curl/CurlStreamScheduler.h:64
&gt; +    HashMap&lt;CurlStreamID, std::unique_ptr&lt;CurlStream&gt;&gt; m_streamLists;

If HashMap is the concern because of the cost, we can switch to StdMap. If that&apos;s not enough, use Vector&lt;std::tuple&lt;CurlStreamID, CurlStream::Client*&gt;&gt;.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1617102</commentid>
    <comment_count>31</comment_count>
      <attachid>389797</attachid>
    <who name="Fujii Hironori">fujii</who>
    <bug_when>2020-02-10 14:08:29 -0800</bug_when>
    <thetext>Comment on attachment 389797
Handling connections by one thread.

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

&gt;&gt; Source/WebCore/platform/network/curl/CurlStreamScheduler.h:64
&gt;&gt; +    HashMap&lt;CurlStreamID, std::unique_ptr&lt;CurlStream&gt;&gt; m_streamLists;
&gt; 
&gt; If HashMap is the concern because of the cost, we can switch to StdMap. If that&apos;s not enough, use Vector&lt;std::tuple&lt;CurlStreamID, CurlStream::Client*&gt;&gt;.

Why do you prefer the inefficient approach? m_streamLists simply can be removed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1617294</commentid>
    <comment_count>32</comment_count>
      <attachid>389797</attachid>
    <who name="Basuke Suzuki">basuke</who>
    <bug_when>2020-02-10 23:47:16 -0800</bug_when>
    <thetext>Comment on attachment 389797
Handling connections by one thread.

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

&gt;&gt;&gt; Source/WebCore/platform/network/curl/CurlStreamScheduler.h:64
&gt;&gt;&gt; +    HashMap&lt;CurlStreamID, std::unique_ptr&lt;CurlStream&gt;&gt; m_streamLists;
&gt;&gt; 
&gt;&gt; If HashMap is the concern because of the cost, we can switch to StdMap. If that&apos;s not enough, use Vector&lt;std::tuple&lt;CurlStreamID, CurlStream::Client*&gt;&gt;.
&gt; 
&gt; Why do you prefer the inefficient approach? m_streamLists simply can be removed.

Can you provide how to do that? We need bi-directional reference from Client to Stream and Stream to Client. I don&apos;t understand what you are proposing.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1617762</commentid>
    <comment_count>33</comment_count>
      <attachid>390463</attachid>
    <who name="Takashi Komori">takashi.komori</who>
    <bug_when>2020-02-11 16:38:23 -0800</bug_when>
    <thetext>Created attachment 390463
Handling connections by one thread.

The former patch had a flaw (CurlStream::send wrongly resets m_sendBufferOffset)
This patch also aims to fix this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1617765</commentid>
    <comment_count>34</comment_count>
    <who name="Takashi Komori">takashi.komori</who>
    <bug_when>2020-02-11 16:40:38 -0800</bug_when>
    <thetext>(In reply to Basuke Suzuki from comment #28)
&gt; Comment on attachment 389797 [details]
&gt; Handling connections by one thread.
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=389797&amp;action=review
&gt; 
&gt; This is another informal review from the previous implementer of this logic.
&gt; This time, checking the thread lock area.
&gt; 
&gt; &gt; Source/WebCore/platform/network/curl/CurlStreamScheduler.cpp:118
&gt; &gt; +        auto locker = holdLock(m_mutex);
&gt; 
&gt; Just after waitForCompletion(), it is ensured the thread is not running
&gt; here. No need to lock.

Removed.

&gt; 
&gt; &gt; Source/WebCore/platform/network/curl/CurlStreamScheduler.cpp:126
&gt; &gt; +        m_runThread = false;
&gt; 
&gt; workerThread() never return from looping until m_runThread == false. I think
&gt; there&apos;s no need to set the variable here. This makes entire life cycle
&gt; unclear and very confusing.

Fixed.

&gt; 
&gt; &gt; Source/WebCore/platform/network/curl/CurlStreamScheduler.cpp:131
&gt; &gt; +{
&gt; 
&gt; Add assert to ensure called in worker thread. And let code reader (me) know
&gt; about that explicitly.

Added.

&gt; 
&gt; &gt; Source/WebCore/platform/network/curl/CurlStreamScheduler.cpp:133
&gt; &gt; +    if (m_taskQueue.size() || m_streamLists.size())
&gt; 
&gt; Move m_streamLists.size() check before locking to avoid unneeded lock.

Moved.

&gt; 
&gt; &gt; Source/WebCore/platform/network/curl/CurlStreamScheduler.cpp:162
&gt; &gt; +            auto locker = holdLock(m_mutex);
&gt; 
&gt; m_runThread is set to false only within worker thread. There&apos;s no need to
&gt; lock.
&gt; 
&gt; &gt; Source/WebCore/platform/network/curl/CurlStreamScheduler.cpp:163
&gt; &gt; +            if (!m_runThread)
&gt; 
&gt; Then this check can be move into `while`&apos;s condition.

Fixed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1617819</commentid>
    <comment_count>35</comment_count>
      <attachid>389797</attachid>
    <who name="Fujii Hironori">fujii</who>
    <bug_when>2020-02-11 19:11:58 -0800</bug_when>
    <thetext>Comment on attachment 389797
Handling connections by one thread.

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

&gt;&gt;&gt;&gt; Source/WebCore/platform/network/curl/CurlStreamScheduler.h:64
&gt;&gt;&gt;&gt; +    HashMap&lt;CurlStreamID, std::unique_ptr&lt;CurlStream&gt;&gt; m_streamLists;
&gt;&gt;&gt; 
&gt;&gt;&gt; If HashMap is the concern because of the cost, we can switch to StdMap. If that&apos;s not enough, use Vector&lt;std::tuple&lt;CurlStreamID, CurlStream::Client*&gt;&gt;.
&gt;&gt; 
&gt;&gt; Why do you prefer the inefficient approach? m_streamLists simply can be removed.
&gt; 
&gt; Can you provide how to do that? We need bi-directional reference from Client to Stream and Stream to Client. I don&apos;t understand what you are proposing.

By having an internal discussion, I understand why the raw address of SocketStreamHandleImpl can&apos;t be use as the ID.
But, I still think using WeakPtr or making SocketStreamHandleImpl ThreadSafeRefCounted is better than using double HashMap.
Do you know WeakPtrImpl is a ThreadSafeRefCounted&lt;WeakPtrImpl&gt;? it can be safely increment the ref-counter in the worker thread.
Anyway, you are the curl port architecture, I buy your architectural decision.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1618404</commentid>
    <comment_count>36</comment_count>
      <attachid>390619</attachid>
    <who name="Takashi Komori">takashi.komori</who>
    <bug_when>2020-02-12 22:59:53 -0800</bug_when>
    <thetext>Created attachment 390619
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1618931</commentid>
    <comment_count>37</comment_count>
      <attachid>390619</attachid>
    <who name="Fujii Hironori">fujii</who>
    <bug_when>2020-02-14 04:08:39 -0800</bug_when>
    <thetext>Comment on attachment 390619
Patch

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

&gt; Source/WebCore/platform/network/curl/CurlStream.cpp:161
&gt; +    auto&amp; sendBuffer = m_sendBuffers.first();

auto&amp; [buffer, length] = m_sendBuffers.first();

&gt; Source/WebCore/platform/network/curl/CurlStream.cpp:188
&gt; +        client.didFail(streamID, errorCode, WTFMove(url));

Remove url of didFail becasue SocketStreamHandleImpl knows own m_url.
m_url.isolatedCopy() is redundant.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1618962</commentid>
    <comment_count>38</comment_count>
      <attachid>390619</attachid>
    <who name="Fujii Hironori">fujii</who>
    <bug_when>2020-02-14 07:07:51 -0800</bug_when>
    <thetext>Comment on attachment 390619
Patch

What will happen in the invaid cert scenario?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1619591</commentid>
    <comment_count>39</comment_count>
      <attachid>390905</attachid>
    <who name="Takashi Komori">takashi.komori</who>
    <bug_when>2020-02-17 00:29:32 -0800</bug_when>
    <thetext>Created attachment 390905
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1619592</commentid>
    <comment_count>40</comment_count>
    <who name="Takashi Komori">takashi.komori</who>
    <bug_when>2020-02-17 00:30:39 -0800</bug_when>
    <thetext>(In reply to Fujii Hironori from comment #37)
&gt; Comment on attachment 390619 [details]
&gt; Patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=390619&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/platform/network/curl/CurlStream.cpp:161
&gt; &gt; +    auto&amp; sendBuffer = m_sendBuffers.first();
&gt; 
&gt; auto&amp; [buffer, length] = m_sendBuffers.first();

Fixed.

&gt; 
&gt; &gt; Source/WebCore/platform/network/curl/CurlStream.cpp:188
&gt; &gt; +        client.didFail(streamID, errorCode, WTFMove(url));
&gt; 
&gt; Remove url of didFail becasue SocketStreamHandleImpl knows own m_url.
&gt; m_url.isolatedCopy() is redundant.

Removed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1619593</commentid>
    <comment_count>41</comment_count>
    <who name="Takashi Komori">takashi.komori</who>
    <bug_when>2020-02-17 00:31:23 -0800</bug_when>
    <thetext>(In reply to Fujii Hironori from comment #38)
&gt; Comment on attachment 390619 [details]
&gt; Patch
&gt; 
&gt; What will happen in the invaid cert scenario?

CURLE_PEER_FAILED_VERIFICATION error occurs in libcurl, and the connection is terminated.

NetworkSocketStream doesn&apos;t have a mechanism like handling &apos;Authentication Challenge&apos; in NetworkDataTask.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1619601</commentid>
    <comment_count>42</comment_count>
      <attachid>390905</attachid>
    <who name="Fujii Hironori">fujii</who>
    <bug_when>2020-02-17 01:31:09 -0800</bug_when>
    <thetext>Comment on attachment 390905
Patch

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

&gt; Source/WebCore/platform/network/curl/CurlStream.cpp:39
&gt; +    , m_url(WTFMove(url))

m_url is not used outside of the ctor. Remove it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1619609</commentid>
    <comment_count>43</comment_count>
      <attachid>390907</attachid>
    <who name="Takashi Komori">takashi.komori</who>
    <bug_when>2020-02-17 02:50:41 -0800</bug_when>
    <thetext>Created attachment 390907
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1619610</commentid>
    <comment_count>44</comment_count>
    <who name="Takashi Komori">takashi.komori</who>
    <bug_when>2020-02-17 02:51:30 -0800</bug_when>
    <thetext>(In reply to Fujii Hironori from comment #42)
&gt; Comment on attachment 390905 [details]
&gt; Patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=390905&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/platform/network/curl/CurlStream.cpp:39
&gt; &gt; +    , m_url(WTFMove(url))
&gt; 
&gt; m_url is not used outside of the ctor. Remove it.

Removed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1619622</commentid>
    <comment_count>45</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2020-02-17 04:06:36 -0800</bug_when>
    <thetext>The commit-queue encountered the following flaky tests while processing attachment 390907:

editing/spelling/spellcheck-async-remove-frame.html bug 158401 (authors: morrita@google.com, rniwa@webkit.org, and tony@chromium.org)
The commit-queue is continuing to process your patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1619623</commentid>
    <comment_count>46</comment_count>
      <attachid>390907</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2020-02-17 04:07:14 -0800</bug_when>
    <thetext>Comment on attachment 390907
Patch

Clearing flags on attachment: 390907

Committed r256728: &lt;https://trac.webkit.org/changeset/256728&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1619624</commentid>
    <comment_count>47</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2020-02-17 04:07:16 -0800</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1619625</commentid>
    <comment_count>48</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2020-02-17 04:08:18 -0800</bug_when>
    <thetext>&lt;rdar://problem/59506869&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>389079</attachid>
            <date>2020-01-28 15:42:32 -0800</date>
            <delta_ts>2020-01-30 02:03:33 -0800</delta_ts>
            <desc>Handling connections by one thread.</desc>
            <filename>sindle-thread-0.patch</filename>
            <type>text/plain</type>
            <size>51725</size>
            <attacher name="Takashi Komori">takashi.komori</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL0N1cmwuY21ha2UgYi9Tb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9DdXJsLmNtYWtlCmluZGV4IGY2ODk0YWMzZWY0Li5mMmU3MjU1NWRm
ZiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vQ3VybC5jbWFrZQorKysgYi9T
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9DdXJsLmNtYWtlCkBAIC0yMCw2ICsyMCw5IEBAIGxpc3Qo
QVBQRU5EIFdlYkNvcmVfU09VUkNFUwogICAgIHBsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsUmVx
dWVzdC5jcHAKICAgICBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybFJlcXVlc3RTY2hlZHVsZXIu
Y3BwCiAgICAgcGxhdGZvcm0vbmV0d29yay9jdXJsL0N1cmxSZXNvdXJjZUhhbmRsZURlbGVnYXRl
LmNwcAorICAgIHBsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsU29ja2V0U3RyZWFtSGFuZGxlLmNw
cAorICAgIHBsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsU29ja2V0U3RyZWFtV29ya2VyLmNwcAor
ICAgIHBsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsU29ja2V0U3RyZWFtV29ya2VyTWFuYWdlci5j
cHAKICAgICBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybFNTTEhhbmRsZS5jcHAKICAgICBwbGF0
Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybFNTTFZlcmlmaWVyLmNwcAogICAgIHBsYXRmb3JtL25ldHdv
cmsvY3VybC9ETlNSZXNvbHZlUXVldWVDdXJsLmNwcApAQCAtNTYsNiArNTksMTEgQEAgbGlzdChB
UFBFTkQgV2ViQ29yZV9QUklWQVRFX0ZSQU1FV09SS19IRUFERVJTCiAgICAgcGxhdGZvcm0vbmV0
d29yay9jdXJsL0N1cmxSZXF1ZXN0U2NoZWR1bGVyQ2xpZW50LmgKICAgICBwbGF0Zm9ybS9uZXR3
b3JrL2N1cmwvQ3VybFJlc291cmNlSGFuZGxlRGVsZWdhdGUuaAogICAgIHBsYXRmb3JtL25ldHdv
cmsvY3VybC9DdXJsUmVzcG9uc2UuaAorICAgIHBsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsU29j
a2V0U3RyZWFtSGFuZGxlLmgKKyAgICBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybFNvY2tldFN0
cmVhbUhhbmRsZUNsaWVudC5oCisgICAgcGxhdGZvcm0vbmV0d29yay9jdXJsL0N1cmxTb2NrZXRT
dHJlYW1Xb3JrZXIuaAorICAgIHBsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsU29ja2V0U3RyZWFt
V29ya2VyQ2xpZW50LmgKKyAgICBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybFNvY2tldFN0cmVh
bVdvcmtlck1hbmFnZXIuaAogICAgIHBsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsU1NMSGFuZGxl
LmgKICAgICBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybFNTTFZlcmlmaWVyLmgKICAgICBwbGF0
Zm9ybS9uZXR3b3JrL2N1cmwvRE5TUmVzb2x2ZVF1ZXVlQ3VybC5oCmRpZmYgLS1naXQgYS9Tb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybENvbnRleHQuY3BwIGIvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0N1cmxDb250ZXh0LmNwcAppbmRleCA3YjA0
ZmEyNmE0Mi4uNzY2NzY4OTQzNTcgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L25ldHdvcmsvY3VybC9DdXJsQ29udGV4dC5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vbmV0d29yay9jdXJsL0N1cmxDb250ZXh0LmNwcApAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1
ZGUgIkN1cmxSZXF1ZXN0U2NoZWR1bGVyLmgiCiAjaW5jbHVkZSAiQ3VybFNTTEhhbmRsZS5oIgog
I2luY2x1ZGUgIkN1cmxTU0xWZXJpZmllci5oIgorI2luY2x1ZGUgIkN1cmxTb2NrZXRTdHJlYW1X
b3JrZXJNYW5hZ2VyLmgiCiAjaW5jbHVkZSAiSFRUUEhlYWRlck1hcC5oIgogI2luY2x1ZGUgPE5l
dHdvcmtMb2FkTWV0cmljcy5oPgogI2luY2x1ZGUgPG11dGV4PgpAQCAtMTE2LDYgKzExNyw3IEBA
IEN1cmxDb250ZXh0OjpDdXJsQ29udGV4dCgpCiAgICAgICAgIG1heEhvc3RDb25uZWN0aW9ucyA9
ICp2YWx1ZTsKIAogICAgIG1fc2NoZWR1bGVyID0gbWFrZVVuaXF1ZTxDdXJsUmVxdWVzdFNjaGVk
dWxlcj4obWF4Q29ubmVjdHMsIG1heFRvdGFsQ29ubmVjdGlvbnMsIG1heEhvc3RDb25uZWN0aW9u
cyk7CisgICAgbV9zb2NrZXRTdHJlYW1Xb3JrZXJNYW5hZ2VyID0gbWFrZVVuaXF1ZTxDdXJsU29j
a2V0U3RyZWFtV29ya2VyTWFuYWdlcj4oKTsKIAogI2lmbmRlZiBOREVCVUcKICAgICBtX3ZlcmJv
c2UgPSBlbnZWYXIuZGVmaW5lZCgiREVCVUdfQ1VSTCIpOwpAQCAtMjU0LDYgKzI1NiwxMSBAQCBD
VVJMTWNvZGUgQ3VybE11bHRpSGFuZGxlOjpnZXRGZFNldChmZF9zZXQmIHJlYWRGZFNldCwgZmRf
c2V0JiB3cml0ZUZkU2V0LCBmZF9zZQogICAgIHJldHVybiBjdXJsX211bHRpX2Zkc2V0KG1fbXVs
dGlIYW5kbGUsICZyZWFkRmRTZXQsICZ3cml0ZUZkU2V0LCAmZXhjRmRTZXQsICZtYXhGZCk7CiB9
CiAKK0NVUkxNY29kZSBDdXJsTXVsdGlIYW5kbGU6OnBvbGwoY3VybF93YWl0ZmQqIGV4dHJhRmRz
LCB1bnNpZ25lZCBudW1PZkV4dHJhRmRzLCBpbnQgdGltZW91dE1TLCBpbnQmIG51bUZkcykKK3sK
KyAgICByZXR1cm4gY3VybF9tdWx0aV9wb2xsKG1fbXVsdGlIYW5kbGUsIGV4dHJhRmRzLCBudW1P
ZkV4dHJhRmRzLCB0aW1lb3V0TVMsICZudW1GZHMpOworfQorCiBDVVJMTWNvZGUgQ3VybE11bHRp
SGFuZGxlOjpwZXJmb3JtKGludCYgcnVubmluZ0hhbmRsZXMpCiB7CiAgICAgcmV0dXJuIGN1cmxf
bXVsdGlfcGVyZm9ybShtX211bHRpSGFuZGxlLCAmcnVubmluZ0hhbmRsZXMpOwpAQCAtODcxLDEz
MiArODc4LDQ0IEBAIGludCBDdXJsSGFuZGxlOjpleHBlY3RlZFNpemVPZkN1cmxPZmZUKCkKICAg
ICByZXR1cm4gZXhwZWN0ZWRTaXplT2ZDdXJsT2ZmVDsKIH0KIAotI2lmbmRlZiBOREVCVUcKLQot
dm9pZCBDdXJsSGFuZGxlOjplbmFibGVWZXJib3NlSWZVc2VkKCkKLXsKLSAgICBpZiAoQ3VybENv
bnRleHQ6OnNpbmdsZXRvbigpLmlzVmVyYm9zZSgpKQotICAgICAgICBjdXJsX2Vhc3lfc2V0b3B0
KG1faGFuZGxlLCBDVVJMT1BUX1ZFUkJPU0UsIDEpOwotfQotCi12b2lkIEN1cmxIYW5kbGU6OmVu
YWJsZVN0ZEVycklmVXNlZCgpCitPcHRpb25hbDxjdXJsX3NvY2tldF90PiBDdXJsSGFuZGxlOjpn
ZXRBY3RpdmVTb2NrZXQoRnVuY3Rpb248dm9pZChDVVJMY29kZSk+JiYgZXJyb3JIYW5kbGVyKQog
ewotICAgIGlmIChhdXRvIGxvZyA9IEN1cmxDb250ZXh0OjpzaW5nbGV0b24oKS5nZXRMb2dGaWxl
KCkpCi0gICAgICAgIGN1cmxfZWFzeV9zZXRvcHQobV9oYW5kbGUsIENVUkxPUFRfU1RERVJSLCBs
b2cpOwotfQotCi0jZW5kaWYKLQotLy8gQ3VybFNvY2tldEhhbmRsZQotCi1DdXJsU29ja2V0SGFu
ZGxlOjpDdXJsU29ja2V0SGFuZGxlKGNvbnN0IFVSTCYgdXJsLCBGdW5jdGlvbjx2b2lkKENVUkxj
b2RlKT4mJiBlcnJvckhhbmRsZXIpCi0gICAgOiBtX2Vycm9ySGFuZGxlcihXVEZNb3ZlKGVycm9y
SGFuZGxlcikpCi17Ci0gICAgLy8gTGliY3VybCBpcyBub3QgcmVzcG9uc2libGUgZm9yIHRoZSBw
cm90b2NvbCBoYW5kbGluZy4gSXQganVzdCBoYW5kbGVzIGNvbm5lY3Rpb24uCi0gICAgLy8gT25s
eSBzY2hlbWUsIGhvc3QgYW5kIHBvcnQgaXMgcmVxdWlyZWQuCi0gICAgVVJMIHVybEZvckNvbm5l
Y3Rpb247Ci0gICAgdXJsRm9yQ29ubmVjdGlvbi5zZXRQcm90b2NvbCh1cmwucHJvdG9jb2xJcygi
d3NzIikgPyAiaHR0cHMiIDogImh0dHAiKTsKLSAgICB1cmxGb3JDb25uZWN0aW9uLnNldEhvc3RB
bmRQb3J0KHVybC5ob3N0QW5kUG9ydCgpKTsKLSAgICBzZXRVcmwodXJsRm9yQ29ubmVjdGlvbik7
Ci0KLSAgICBlbmFibGVDb25uZWN0aW9uT25seSgpOwotfQotCi1ib29sIEN1cmxTb2NrZXRIYW5k
bGU6OmNvbm5lY3QoKQotewotICAgIENVUkxjb2RlIGVycm9yQ29kZSA9IHBlcmZvcm0oKTsKKyAg
ICBjdXJsX3NvY2tldF90IHNvY2tldDsKKyAgICBDVVJMY29kZSBlcnJvckNvZGUgPSBjdXJsX2Vh
c3lfZ2V0aW5mbyhtX2hhbmRsZSwgQ1VSTElORk9fQUNUSVZFU09DS0VULCAmc29ja2V0KTsKICAg
ICBpZiAoZXJyb3JDb2RlICE9IENVUkxFX09LKSB7Ci0gICAgICAgIG1fZXJyb3JIYW5kbGVyKGVy
cm9yQ29kZSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgZXJyb3JIYW5kbGVyKGVy
cm9yQ29kZSk7CisgICAgICAgIHJldHVybiBXVEY6Om51bGxvcHQ7CiAgICAgfQogCi0gICAgcmV0
dXJuIHRydWU7CisgICAgcmV0dXJuIHNvY2tldDsKIH0KIAotc2l6ZV90IEN1cmxTb2NrZXRIYW5k
bGU6OnNlbmQoY29uc3QgdWludDhfdCogYnVmZmVyLCBzaXplX3Qgc2l6ZSkKK0NVUkxjb2RlIEN1
cmxIYW5kbGU6OnNlbmQoY29uc3QgdWludDhfdCogYnVmZmVyLCBzaXplX3QgYnVmZmVyU2l6ZSwg
c2l6ZV90JiBieXRlc1NlbnQpCiB7Ci0gICAgc2l6ZV90IHRvdGFsQnl0ZXNTZW50ID0gMDsKLQot
ICAgIHdoaWxlICh0b3RhbEJ5dGVzU2VudCA8IHNpemUpIHsKLSAgICAgICAgc2l6ZV90IGJ5dGVz
U2VudCA9IDA7Ci0gICAgICAgIENVUkxjb2RlIGVycm9yQ29kZSA9IGN1cmxfZWFzeV9zZW5kKGhh
bmRsZSgpLCBidWZmZXIgKyB0b3RhbEJ5dGVzU2VudCwgc2l6ZSAtIHRvdGFsQnl0ZXNTZW50LCAm
Ynl0ZXNTZW50KTsKLSAgICAgICAgaWYgKGVycm9yQ29kZSAhPSBDVVJMRV9PSykgewotICAgICAg
ICAgICAgaWYgKGVycm9yQ29kZSAhPSBDVVJMRV9BR0FJTikKLSAgICAgICAgICAgICAgICBtX2Vy
cm9ySGFuZGxlcihlcnJvckNvZGUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQot
ICAgICAgICB0b3RhbEJ5dGVzU2VudCArPSBieXRlc1NlbnQ7Ci0gICAgfQotCi0gICAgcmV0dXJu
IHRvdGFsQnl0ZXNTZW50OworICAgIHJldHVybiBjdXJsX2Vhc3lfc2VuZChtX2hhbmRsZSwgYnVm
ZmVyLCBidWZmZXJTaXplLCAmYnl0ZXNTZW50KTsKIH0KIAotT3B0aW9uYWw8c2l6ZV90PiBDdXJs
U29ja2V0SGFuZGxlOjpyZWNlaXZlKHVpbnQ4X3QqIGJ1ZmZlciwgc2l6ZV90IGJ1ZmZlclNpemUp
CitDVVJMY29kZSBDdXJsSGFuZGxlOjpyZWNlaXZlKHVpbnQ4X3QqIGJ1ZmZlciwgc2l6ZV90IGJ1
ZmZlclNpemUsIHNpemVfdCYgYnl0ZXNSZWFkKQogewotICAgIHNpemVfdCBieXRlc1JlYWQgPSAw
OwotCi0gICAgQ1VSTGNvZGUgZXJyb3JDb2RlID0gY3VybF9lYXN5X3JlY3YoaGFuZGxlKCksIGJ1
ZmZlciwgYnVmZmVyU2l6ZSwgJmJ5dGVzUmVhZCk7Ci0gICAgaWYgKGVycm9yQ29kZSAhPSBDVVJM
RV9PSykgewotICAgICAgICBpZiAoZXJyb3JDb2RlICE9IENVUkxFX0FHQUlOKQotICAgICAgICAg
ICAgbV9lcnJvckhhbmRsZXIoZXJyb3JDb2RlKTsKKyAgICByZXR1cm4gY3VybF9lYXN5X3JlY3Yo
bV9oYW5kbGUsIGJ1ZmZlciwgYnVmZmVyU2l6ZSwgJmJ5dGVzUmVhZCk7Cit9CiAKLSAgICAgICAg
cmV0dXJuIFdURjo6bnVsbG9wdDsKLSAgICB9CisjaWZuZGVmIE5ERUJVRwogCi0gICAgcmV0dXJu
IGJ5dGVzUmVhZDsKK3ZvaWQgQ3VybEhhbmRsZTo6ZW5hYmxlVmVyYm9zZUlmVXNlZCgpCit7Cisg
ICAgaWYgKEN1cmxDb250ZXh0OjpzaW5nbGV0b24oKS5pc1ZlcmJvc2UoKSkKKyAgICAgICAgY3Vy
bF9lYXN5X3NldG9wdChtX2hhbmRsZSwgQ1VSTE9QVF9WRVJCT1NFLCAxKTsKIH0KIAotT3B0aW9u
YWw8Q3VybFNvY2tldEhhbmRsZTo6V2FpdFJlc3VsdD4gQ3VybFNvY2tldEhhbmRsZTo6d2FpdChj
b25zdCBTZWNvbmRzJiB0aW1lb3V0LCBib29sIGFsc29XYWl0Rm9yV3JpdGUpCit2b2lkIEN1cmxI
YW5kbGU6OmVuYWJsZVN0ZEVycklmVXNlZCgpCiB7Ci0gICAgY3VybF9zb2NrZXRfdCBzb2NrZXQ7
Ci0gICAgQ1VSTGNvZGUgZXJyb3JDb2RlID0gY3VybF9lYXN5X2dldGluZm8oaGFuZGxlKCksIENV
UkxJTkZPX0FDVElWRVNPQ0tFVCwgJnNvY2tldCk7Ci0gICAgaWYgKGVycm9yQ29kZSAhPSBDVVJM
RV9PSykgewotICAgICAgICBtX2Vycm9ySGFuZGxlcihlcnJvckNvZGUpOwotICAgICAgICByZXR1
cm4gV1RGOjpudWxsb3B0OwotICAgIH0KLQotICAgIGludDY0X3QgdXNlYyA9IHRpbWVvdXQubWlj
cm9zZWNvbmRzQXM8aW50NjRfdD4oKTsKLQotICAgIHN0cnVjdCB0aW1ldmFsIHNlbGVjdFRpbWVv
dXQ7Ci0gICAgaWYgKHVzZWMgPD0gMCkgewotICAgICAgICBzZWxlY3RUaW1lb3V0LnR2X3NlYyA9
IDA7Ci0gICAgICAgIHNlbGVjdFRpbWVvdXQudHZfdXNlYyA9IDA7Ci0gICAgfSBlbHNlIHsKLSAg
ICAgICAgc2VsZWN0VGltZW91dC50dl9zZWMgPSB1c2VjIC8gMTAwMDAwMDsKLSAgICAgICAgc2Vs
ZWN0VGltZW91dC50dl91c2VjID0gdXNlYyAlIDEwMDAwMDA7Ci0gICAgfQotCi0gICAgaW50IHJj
ID0gMDsKLSAgICBpbnQgbWF4ZmQgPSBzdGF0aWNfY2FzdDxpbnQ+KHNvY2tldCkgKyAxOwotICAg
IGZkX3NldCBmZHJlYWQ7Ci0gICAgZmRfc2V0IGZkd3JpdGU7Ci0gICAgZmRfc2V0IGZkZXJyOwot
Ci0gICAgLy8gUmV0cnkgJ3NlbGVjdCcgaWYgaXQgd2FzIGludGVycnVwdGVkIGJ5IGEgcHJvY2Vz
cyBzaWduYWwuCi0gICAgZG8gewotICAgICAgICBGRF9aRVJPKCZmZHJlYWQpOwotICAgICAgICBG
RF9TRVQoc29ja2V0LCAmZmRyZWFkKTsKLQotICAgICAgICBGRF9aRVJPKCZmZHdyaXRlKTsKLSAg
ICAgICAgaWYgKGFsc29XYWl0Rm9yV3JpdGUpCi0gICAgICAgICAgICBGRF9TRVQoc29ja2V0LCAm
ZmR3cml0ZSk7Ci0KLSAgICAgICAgRkRfWkVSTygmZmRlcnIpOwotICAgICAgICBGRF9TRVQoc29j
a2V0LCAmZmRlcnIpOwotCi0gICAgICAgIHJjID0gOjpzZWxlY3QobWF4ZmQsICZmZHJlYWQsICZm
ZHdyaXRlLCAmZmRlcnIsICZzZWxlY3RUaW1lb3V0KTsKLSAgICB9IHdoaWxlIChyYyA9PSAtMSAm
JiBlcnJubyA9PSBFSU5UUik7Ci0KLSAgICBpZiAocmMgPD0gMCkKLSAgICAgICAgcmV0dXJuIFdU
Rjo6bnVsbG9wdDsKLQotICAgIFdhaXRSZXN1bHQgcmVzdWx0OwotICAgIHJlc3VsdC5yZWFkYWJs
ZSA9IEZEX0lTU0VUKHNvY2tldCwgJmZkcmVhZCkgfHwgRkRfSVNTRVQoc29ja2V0LCAmZmRlcnIp
OwotICAgIHJlc3VsdC53cml0YWJsZSA9IEZEX0lTU0VUKHNvY2tldCwgJmZkd3JpdGUpOwotICAg
IHJldHVybiByZXN1bHQ7CisgICAgaWYgKGF1dG8gbG9nID0gQ3VybENvbnRleHQ6OnNpbmdsZXRv
bigpLmdldExvZ0ZpbGUoKSkKKyAgICAgICAgY3VybF9lYXN5X3NldG9wdChtX2hhbmRsZSwgQ1VS
TE9QVF9TVERFUlIsIGxvZyk7CiB9CiAKKyNlbmRpZgorCiB9CiAKICNlbmRpZgpkaWZmIC0tZ2l0
IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0N1cmxDb250ZXh0LmggYi9T
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybENvbnRleHQuaAppbmRleCBh
NGY4YzAyODI3Ni4uYzYzYTRhNGI4MDUgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL25ldHdvcmsvY3VybC9DdXJsQ29udGV4dC5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL25ldHdvcmsvY3VybC9DdXJsQ29udGV4dC5oCkBAIC04OSw2ICs4OSw3IEBAIHByaXZhdGU6
CiAvLyBDdXJsQ29udGV4dCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLQogCiBjbGFzcyBDdXJsUmVxdWVzdFNjaGVkdWxlcjsKK2NsYXNzIEN1cmxTb2NrZXRTdHJl
YW1Xb3JrZXJNYW5hZ2VyOwogCiBjbGFzcyBDdXJsQ29udGV4dCA6IHB1YmxpYyBDdXJsR2xvYmFs
IHsKICAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShDdXJsQ29udGV4dCk7CkBAIC0xMDEsNiArMTAy
LDcgQEAgcHVibGljOgogICAgIGNvbnN0IEN1cmxTaGFyZUhhbmRsZSYgc2hhcmVIYW5kbGUoKSB7
IHJldHVybiBtX3NoYXJlSGFuZGxlOyB9CiAKICAgICBDdXJsUmVxdWVzdFNjaGVkdWxlciYgc2No
ZWR1bGVyKCkgeyByZXR1cm4gKm1fc2NoZWR1bGVyOyB9CisgICAgQ3VybFNvY2tldFN0cmVhbVdv
cmtlck1hbmFnZXImIHNvY2tldFN0cmVhbVdvcmtlck1hbmFnZXIoKSB7IHJldHVybiAqbV9zb2Nr
ZXRTdHJlYW1Xb3JrZXJNYW5hZ2VyOyB9CiAKICAgICAvLyBQcm94eQogICAgIGNvbnN0IEN1cmxQ
cm94eVNldHRpbmdzJiBwcm94eVNldHRpbmdzKCkgY29uc3QgeyByZXR1cm4gbV9wcm94eVNldHRp
bmdzOyB9CkBAIC0xMzMsNiArMTM1LDcgQEAgcHJpdmF0ZToKICAgICBDdXJsU2hhcmVIYW5kbGUg
bV9zaGFyZUhhbmRsZTsKICAgICBDdXJsU1NMSGFuZGxlIG1fc3NsSGFuZGxlOwogICAgIHN0ZDo6
dW5pcXVlX3B0cjxDdXJsUmVxdWVzdFNjaGVkdWxlcj4gbV9zY2hlZHVsZXI7CisgICAgc3RkOjp1
bmlxdWVfcHRyPEN1cmxTb2NrZXRTdHJlYW1Xb3JrZXJNYW5hZ2VyPiBtX3NvY2tldFN0cmVhbVdv
cmtlck1hbmFnZXI7CiAKICAgICBTZWNvbmRzIG1fZG5zQ2FjaGVUaW1lb3V0IHsgU2Vjb25kczo6
ZnJvbU1pbnV0ZXMoNSkgfTsKICAgICBTZWNvbmRzIG1fY29ubmVjdFRpbWVvdXQgeyAzMC4wIH07
CkBAIC0xNjIsNiArMTY1LDcgQEAgcHVibGljOgogICAgIENVUkxNY29kZSByZW1vdmVIYW5kbGUo
Q1VSTCopOwogCiAgICAgQ1VSTE1jb2RlIGdldEZkU2V0KGZkX3NldCYsIGZkX3NldCYsIGZkX3Nl
dCYsIGludCYpOworICAgIENVUkxNY29kZSBwb2xsKGN1cmxfd2FpdGZkKiwgdW5zaWduZWQsIGlu
dCwgaW50Jik7CiAgICAgQ1VSTE1jb2RlIHBlcmZvcm0oaW50Jik7CiAgICAgQ1VSTE1zZyogcmVh
ZEluZm8oaW50Jik7CiAKQEAgLTI5Myw2ICsyOTcsMTEgQEAgcHVibGljOgogCiAgICAgc3RhdGlj
IGxvbmcgbG9uZyBtYXhDdXJsT2ZmVCgpOwogCisgICAgLy8gc29ja2V0CisgICAgT3B0aW9uYWw8
Y3VybF9zb2NrZXRfdD4gZ2V0QWN0aXZlU29ja2V0KEZ1bmN0aW9uPHZvaWQoQ1VSTGNvZGUpPiYm
KTsKKyAgICBDVVJMY29kZSBzZW5kKGNvbnN0IHVpbnQ4X3QqLCBzaXplX3QsIHNpemVfdCYpOwor
ICAgIENVUkxjb2RlIHJlY2VpdmUodWludDhfdCosIHNpemVfdCwgc2l6ZV90Jik7CisKICNpZm5k
ZWYgTkRFQlVHCiAgICAgdm9pZCBlbmFibGVWZXJib3NlSWZVc2VkKCk7CiAgICAgdm9pZCBlbmFi
bGVTdGRFcnJJZlVzZWQoKTsKQEAgLTMxMywyNCArMzIyLDQgQEAgcHJpdmF0ZToKICAgICBzdGQ6
OnVuaXF1ZV9wdHI8Q3VybFNTTFZlcmlmaWVyPiBtX3NzbFZlcmlmaWVyOwogfTsKIAotY2xhc3Mg
Q3VybFNvY2tldEhhbmRsZSA6IHB1YmxpYyBDdXJsSGFuZGxlIHsKLSAgICBXVEZfTUFLRV9OT05D
T1BZQUJMRShDdXJsU29ja2V0SGFuZGxlKTsKLQotcHVibGljOgotICAgIHN0cnVjdCBXYWl0UmVz
dWx0IHsKLSAgICAgICAgYm9vbCByZWFkYWJsZSB7IGZhbHNlIH07Ci0gICAgICAgIGJvb2wgd3Jp
dGFibGUgeyBmYWxzZSB9OwotICAgIH07Ci0KLSAgICBDdXJsU29ja2V0SGFuZGxlKGNvbnN0IFVS
TCYsIEZ1bmN0aW9uPHZvaWQoQ1VSTGNvZGUpPiYmIGVycm9ySGFuZGxlcik7Ci0KLSAgICBib29s
IGNvbm5lY3QoKTsKLSAgICBzaXplX3Qgc2VuZChjb25zdCB1aW50OF90Kiwgc2l6ZV90KTsKLSAg
ICBPcHRpb25hbDxzaXplX3Q+IHJlY2VpdmUodWludDhfdCosIHNpemVfdCk7Ci0gICAgT3B0aW9u
YWw8V2FpdFJlc3VsdD4gd2FpdChjb25zdCBTZWNvbmRzJiB0aW1lb3V0LCBib29sIGFsc29XYWl0
Rm9yV3JpdGUpOwotCi1wcml2YXRlOgotICAgIEZ1bmN0aW9uPHZvaWQoQ1VSTGNvZGUpPiBtX2Vy
cm9ySGFuZGxlcjsKLX07Ci0KIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsU29ja2V0U3RyZWFtSGFuZGxl
LmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsU29ja2V0U3Ry
ZWFtSGFuZGxlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uYTgw
Mzk3NGNmYTYKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3
b3JrL2N1cmwvQ3VybFNvY2tldFN0cmVhbUhhbmRsZS5jcHAKQEAgLTAsMCArMSwxNDggQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgU29ueSBJbnRlcmFjdGl2ZSBFbnRlcnRhaW5tZW50IElu
Yy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJ
TkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBU
SEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJ
UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENP
TlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NV
UkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwg
REFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gg
REFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJDdXJsU29ja2V0
U3RyZWFtSGFuZGxlLmgiCisKKyNpbmNsdWRlICJDdXJsQ29udGV4dC5oIgorI2luY2x1ZGUgIkN1
cmxTb2NrZXRTdHJlYW1IYW5kbGVDbGllbnQuaCIKKyNpbmNsdWRlICJDdXJsU29ja2V0U3RyZWFt
V29ya2VyTWFuYWdlci5oIgorI2luY2x1ZGUgIkRlcHJlY2F0ZWRHbG9iYWxTZXR0aW5ncy5oIgor
I2luY2x1ZGUgIlNvY2tldFN0cmVhbUVycm9yLmgiCisKKyNpZiBVU0UoQ1VSTCkKKworbmFtZXNw
YWNlIFdlYkNvcmUgeworCitDdXJsU29ja2V0U3RyZWFtSGFuZGxlOjpDdXJsU29ja2V0U3RyZWFt
SGFuZGxlKGNvbnN0IFVSTCYgdXJsLCBDdXJsU29ja2V0U3RyZWFtSGFuZGxlQ2xpZW50JiBjbGll
bnQpCisgICAgOiBtX3VybCh1cmwpCisgICAgLCBtX2hhbmRsZUNsaWVudChjbGllbnQpCisgICAg
LCBtX3dvcmtlck1hbmFnZXIoQ3VybENvbnRleHQ6OnNpbmdsZXRvbigpLnNvY2tldFN0cmVhbVdv
cmtlck1hbmFnZXIoKSkKK3sKKyAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOworCisgICAgLy8g
RklYTUU6IFVzaW5nIERlcHJlY2F0ZWRHbG9iYWxTZXR0aW5ncyBmcm9tIGhlcmUgaXMgYSBsYXll
cmluZyB2aW9sYXRpb24uCisgICAgaWYgKG1fdXJsLnByb3RvY29sSXMoIndzcyIpICYmIERlcHJl
Y2F0ZWRHbG9iYWxTZXR0aW5nczo6YWxsb3dzQW55U1NMQ2VydGlmaWNhdGUoKSkKKyAgICAgICAg
Q3VybENvbnRleHQ6OnNpbmdsZXRvbigpLnNzbEhhbmRsZSgpLnNldElnbm9yZVNTTEVycm9ycyh0
cnVlKTsKK30KKworQ3VybFNvY2tldFN0cmVhbUhhbmRsZTo6fkN1cmxTb2NrZXRTdHJlYW1IYW5k
bGUoKQoreworICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7CisgICAgZGVzdHJ1Y3RXb3JrZXIo
KTsKK30KKwordm9pZCBDdXJsU29ja2V0U3RyZWFtSGFuZGxlOjpjcmVhdGVXb3JrZXIoKQorewor
ICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7CisKKyAgICBpZiAoIWlzV29ya2VySW52YWxpZGF0
ZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV93b3JrZXJJRCA9IG1fd29ya2VyTWFuYWdl
ci5jcmVhdGUobV91cmwsICp0aGlzKTsKK30KKwordm9pZCBDdXJsU29ja2V0U3RyZWFtSGFuZGxl
OjpkZXN0cnVjdFdvcmtlcigpCit7CisgICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKKworICAg
IGlmIChpc1dvcmtlckludmFsaWRhdGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIG1fd29y
a2VyTWFuYWdlci5kZXN0b3J5KG1fd29ya2VySUQpOworICAgIG1fd29ya2VySUQgPSBpbnZhbGlk
Q3VybFNvY2tldFN0cmVhbVdvcmtlcklEOworfQorCit2b2lkIEN1cmxTb2NrZXRTdHJlYW1IYW5k
bGU6Om9wZW4oKQoreworICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7CisgICAgY3JlYXRlV29y
a2VyKCk7Cit9CisKK3ZvaWQgQ3VybFNvY2tldFN0cmVhbUhhbmRsZTo6Y2xvc2UoKQoreworICAg
IEFTU0VSVChpc01haW5UaHJlYWQoKSk7CisKKyAgICBkZXN0cnVjdFdvcmtlcigpOworICAgIG1f
aGFuZGxlQ2xpZW50LmN1cmxEaWRDbG9zZVNvY2tldFN0cmVhbSgpOworfQorCitPcHRpb25hbDxz
aXplX3Q+IEN1cmxTb2NrZXRTdHJlYW1IYW5kbGU6OnNlbmQoY29uc3QgdWludDhfdCogZGF0YSwg
c2l6ZV90IGxlbmd0aCkKK3sKKyAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOworCisgICAgaWYg
KGlzV29ya2VySW52YWxpZGF0ZWQoKSkKKyAgICAgICAgcmV0dXJuIFdURjo6bnVsbG9wdDsKKwor
ICAgIGlmIChtX2hhc1BlbmRpbmdTZW5kRGF0YSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBt
X2hhc1BlbmRpbmdTZW5kRGF0YSA9IHRydWU7CisKKyAgICBhdXRvIGJ1ZmZlciA9IG1ha2VVbmlx
dWVBcnJheTx1aW50OF90PihsZW5ndGgpOworICAgIG1lbWNweShidWZmZXIuZ2V0KCksIGRhdGEs
IGxlbmd0aCk7CisKKyAgICBtX3dvcmtlck1hbmFnZXIuc2VuZChtX3dvcmtlcklELCBXVEZNb3Zl
KGJ1ZmZlciksIGxlbmd0aCk7CisgICAgcmV0dXJuIGxlbmd0aDsKK30KKwordm9pZCBDdXJsU29j
a2V0U3RyZWFtSGFuZGxlOjpkaWRPcGVuQ29ubmVjdGlvbigpCit7CisgICAgQVNTRVJUKGlzTWFp
blRocmVhZCgpKTsKKworICAgIG1faGFuZGxlQ2xpZW50LmN1cmxEaWRPcGVuU29ja2V0U3RyZWFt
KCk7Cit9CisKK3ZvaWQgQ3VybFNvY2tldFN0cmVhbUhhbmRsZTo6ZGlkU2VuZERhdGEoKQorewor
ICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7CisgICAgQVNTRVJUKG1faGFzUGVuZGluZ1NlbmRE
YXRhKTsKKworICAgIG1faGFzUGVuZGluZ1NlbmREYXRhID0gZmFsc2U7CisgICAgbV9oYW5kbGVD
bGllbnQuY3VybERpZFNlbmRTb2NrZXRTdHJlYW1EYXRhKCk7Cit9CisKK3ZvaWQgQ3VybFNvY2tl
dFN0cmVhbUhhbmRsZTo6ZGlkUmVjZWl2ZURhdGEoY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IGxl
bmd0aCkKK3sKKyAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOworCisgICAgbV9oYW5kbGVDbGll
bnQuY3VybERpZFJlY2VpdmVTb2NrZXRTdHJlYW1EYXRhKGRhdGEsIGxlbmd0aCk7Cit9CisKK3Zv
aWQgQ3VybFNvY2tldFN0cmVhbUhhbmRsZTo6ZGlkRmFpbFdpdGhFcnJvcihTb2NrZXRTdHJlYW1F
cnJvciYmIGVycm9yKQoreworICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7CisKKyAgICBkZXN0
cnVjdFdvcmtlcigpOworCisgICAgaWYgKGVycm9yLmVycm9yQ29kZSgpID09IENVUkxFX1JFQ1Zf
RVJST1IpCisgICAgICAgIG1faGFuZGxlQ2xpZW50LmN1cmxEaWRGYWlsVG9SZWNlaXZlU29ja2V0
U3RyZWFtRGF0YSgpOworICAgIGVsc2UKKyAgICAgICAgbV9oYW5kbGVDbGllbnQuY3VybERpZEZh
aWxTb2NrZXRTdHJlYW0oV1RGTW92ZShlcnJvcikpOworfQorCit9CisKKyNlbmRpZgpkaWZmIC0t
Z2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0N1cmxTb2NrZXRTdHJl
YW1IYW5kbGUuaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsU29j
a2V0U3RyZWFtSGFuZGxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAu
LjM2YTdlZDk0YmNhCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
bmV0d29yay9jdXJsL0N1cmxTb2NrZXRTdHJlYW1IYW5kbGUuaApAQCAtMCwwICsxLDcyIEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDIwIFNvbnkgSW50ZXJhY3RpdmUgRW50ZXJ0YWlubWVudCBJ
bmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
SU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICog
VEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9D
VVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
IERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIkN1cmxTb2NrZXRTdHJl
YW1Xb3JrZXJDbGllbnQuaCIKKyNpbmNsdWRlIDx3dGYvTm9uY29weWFibGUuaD4KKyNpbmNsdWRl
IDx3dGYvVVJMLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgQ3VybFNvY2tldFN0
cmVhbVdvcmtlck1hbmFnZXI7CitjbGFzcyBDdXJsU29ja2V0U3RyZWFtSGFuZGxlQ2xpZW50Owor
CitjbGFzcyBDdXJsU29ja2V0U3RyZWFtSGFuZGxlIDogcHVibGljIEN1cmxTb2NrZXRTdHJlYW1X
b3JrZXJDbGllbnQgeworICAgIFdURl9NQUtFX0ZBU1RfQUxMT0NBVEVEOworICAgIFdURl9NQUtF
X05PTkNPUFlBQkxFKEN1cmxTb2NrZXRTdHJlYW1IYW5kbGUpOworcHVibGljOgorICAgIHN0YXRp
YyBzdGQ6OnVuaXF1ZV9wdHI8Q3VybFNvY2tldFN0cmVhbUhhbmRsZT4gY3JlYXRlKGNvbnN0IFVS
TCYgdXJsLCBDdXJsU29ja2V0U3RyZWFtSGFuZGxlQ2xpZW50JiBjbGllbnQpCisgICAgeworICAg
ICAgICByZXR1cm4gV1RGOjptYWtlVW5pcXVlPEN1cmxTb2NrZXRTdHJlYW1IYW5kbGU+KHVybCwg
Y2xpZW50KTsKKyAgICB9CisKKyAgICBDdXJsU29ja2V0U3RyZWFtSGFuZGxlKGNvbnN0IFVSTCYs
IEN1cmxTb2NrZXRTdHJlYW1IYW5kbGVDbGllbnQmKTsKKyAgICB2aXJ0dWFsIH5DdXJsU29ja2V0
U3RyZWFtSGFuZGxlKCk7CisKKyAgICB2b2lkIG9wZW4oKTsKKyAgICB2b2lkIGNsb3NlKCk7Cisg
ICAgT3B0aW9uYWw8c2l6ZV90PiBzZW5kKGNvbnN0IHVpbnQ4X3QqLCBzaXplX3QpOworCitwcml2
YXRlOgorICAgIHZvaWQgY3JlYXRlV29ya2VyKCk7CisgICAgdm9pZCBkZXN0cnVjdFdvcmtlcigp
OworCisgICAgdm9pZCBkaWRPcGVuQ29ubmVjdGlvbigpIGZpbmFsOworICAgIHZvaWQgZGlkU2Vu
ZERhdGEoKSBmaW5hbDsKKyAgICB2b2lkIGRpZFJlY2VpdmVEYXRhKGNvbnN0IGNoYXIqLCBzaXpl
X3QpIGZpbmFsOworICAgIHZvaWQgZGlkRmFpbFdpdGhFcnJvcihTb2NrZXRTdHJlYW1FcnJvciYm
KSBmaW5hbDsKKworICAgIGJvb2wgaXNXb3JrZXJJbnZhbGlkYXRlZCgpIHsgcmV0dXJuIG1fd29y
a2VySUQgPT0gaW52YWxpZEN1cmxTb2NrZXRTdHJlYW1Xb3JrZXJJRDsgfQorCisgICAgVVJMIG1f
dXJsOworICAgIEN1cmxTb2NrZXRTdHJlYW1IYW5kbGVDbGllbnQmIG1faGFuZGxlQ2xpZW50Owor
ICAgIEN1cmxTb2NrZXRTdHJlYW1Xb3JrZXJNYW5hZ2VyJiBtX3dvcmtlck1hbmFnZXI7CisgICAg
Q3VybFNvY2tldFN0cmVhbVdvcmtlcklEIG1fd29ya2VySUQgeyBpbnZhbGlkQ3VybFNvY2tldFN0
cmVhbVdvcmtlcklEIH07CisKKyAgICBib29sIG1faGFzUGVuZGluZ1NlbmREYXRhIHsgZmFsc2Ug
fTsKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsU29ja2V0U3RyZWFtSGFuZGxlQ2xpZW50Lmgg
Yi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybFNvY2tldFN0cmVhbUhh
bmRsZUNsaWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi5mYzNj
ZjRjNmYyZgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdv
cmsvY3VybC9DdXJsU29ja2V0U3RyZWFtSGFuZGxlQ2xpZW50LmgKQEAgLTAsMCArMSw0MiBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBTb255IEludGVyYWN0aXZlIEVudGVydGFpbm1lbnQg
SW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4g
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAg
ICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUg
ZGlzdHJpYnV0aW9uLgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAq
IFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICog
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJP
Q1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKwor
Y2xhc3MgU29ja2V0U3RyZWFtRXJyb3I7CisKK2NsYXNzIEN1cmxTb2NrZXRTdHJlYW1IYW5kbGVD
bGllbnQgeworcHVibGljOgorICAgIHZpcnR1YWwgdm9pZCBjdXJsRGlkT3BlblNvY2tldFN0cmVh
bSgpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgY3VybERpZENsb3NlU29ja2V0U3RyZWFtKCkgPSAw
OworICAgIHZpcnR1YWwgdm9pZCBjdXJsRGlkU2VuZFNvY2tldFN0cmVhbURhdGEoKSA9IDA7Cisg
ICAgdmlydHVhbCB2b2lkIGN1cmxEaWRSZWNlaXZlU29ja2V0U3RyZWFtRGF0YShjb25zdCBjaGFy
Kiwgc2l6ZV90KSA9IDA7CisgICAgdmlydHVhbCB2b2lkIGN1cmxEaWRGYWlsVG9SZWNlaXZlU29j
a2V0U3RyZWFtRGF0YSgpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgY3VybERpZEZhaWxTb2NrZXRT
dHJlYW0oU29ja2V0U3RyZWFtRXJyb3ImJikgPSAwOworfTsKKworfSAvLyBuYW1lc3BhY2UgV2Vi
Q29yZQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0N1
cmxTb2NrZXRTdHJlYW1Xb3JrZXIuY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29y
ay9jdXJsL0N1cmxTb2NrZXRTdHJlYW1Xb3JrZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu
ZGV4IDAwMDAwMDAwMDAwLi40NGQ1YWI0MDM0ZQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsU29ja2V0U3RyZWFtV29ya2VyLmNwcApA
QCAtMCwwICsxLDIxNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBTb255IEludGVyYWN0
aXZlIEVudGVydGFpbm1lbnQgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisg
KiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlN
RUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICog
QkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwg
RVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5U
RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VU
IE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgor
I2luY2x1ZGUgIkN1cmxTb2NrZXRTdHJlYW1Xb3JrZXIuaCIKKworI2luY2x1ZGUgIkN1cmxTb2Nr
ZXRTdHJlYW1Xb3JrZXJNYW5hZ2VyLmgiCisjaW5jbHVkZSAiU29ja2V0U3RyZWFtRXJyb3IuaCIK
KworI2lmIFVTRShDVVJMKQorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK0N1cmxTb2NrZXRTdHJl
YW1Xb3JrZXI6OkN1cmxTb2NrZXRTdHJlYW1Xb3JrZXIoQ3VybFNvY2tldFN0cmVhbVdvcmtlck1h
bmFnZXImIHdvcmtlck1hbmFnZXIsIEN1cmxTb2NrZXRTdHJlYW1Xb3JrZXJJRCB3b3JrZXJJRCwg
VVJMJiYgdXJsKQorICAgIDogbV93b3JrZXJNYW5hZ2VyKHdvcmtlck1hbmFnZXIpCisgICAgLCBt
X3dvcmtlcklEKHdvcmtlcklEKQorICAgICwgbV91cmwoV1RGTW92ZSh1cmwpKQoreworICAgIEFT
U0VSVCghaXNNYWluVGhyZWFkKCkpOworCisgICAgbV9jdXJsSGFuZGxlID0gV1RGOjptYWtlVW5p
cXVlPEN1cmxIYW5kbGU+KCk7CisKKyAgICAvLyBMaWJjdXJsIGlzIG5vdCByZXNwb25zaWJsZSBm
b3IgdGhlIHByb3RvY29sIGhhbmRsaW5nLiBJdCBqdXN0IGhhbmRsZXMgY29ubmVjdGlvbi4KKyAg
ICAvLyBPbmx5IHNjaGVtZSwgaG9zdCBhbmQgcG9ydCBpcyByZXF1aXJlZC4KKyAgICBVUkwgdXJs
Rm9yQ29ubmVjdGlvbjsKKyAgICB1cmxGb3JDb25uZWN0aW9uLnNldFByb3RvY29sKG1fdXJsLnBy
b3RvY29sSXMoIndzcyIpID8gImh0dHBzIiA6ICJodHRwIik7CisgICAgdXJsRm9yQ29ubmVjdGlv
bi5zZXRIb3N0QW5kUG9ydChtX3VybC5ob3N0QW5kUG9ydCgpKTsKKyAgICBtX2N1cmxIYW5kbGUt
PnNldFVybCh1cmxGb3JDb25uZWN0aW9uKTsKKworICAgIG1fY3VybEhhbmRsZS0+ZW5hYmxlQ29u
bmVjdGlvbk9ubHkoKTsKKworICAgIGF1dG8gZXJyb3JDb2RlID0gbV9jdXJsSGFuZGxlLT5wZXJm
b3JtKCk7CisgICAgaWYgKGVycm9yQ29kZSAhPSBDVVJMRV9PSykgeworICAgICAgICBub3RpZnlG
YWlsV2l0aEVycm9yKGVycm9yQ29kZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBj
YWxsQ2xpZW50KFtdKEN1cmxTb2NrZXRTdHJlYW1Xb3JrZXJDbGllbnQmIGNsaWVudCkgeworICAg
ICAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOworICAgICAgICBjbGllbnQuZGlkT3BlbkNvbm5l
Y3Rpb24oKTsKKyAgICB9KTsKK30KKworQ3VybFNvY2tldFN0cmVhbVdvcmtlcjo6fkN1cmxTb2Nr
ZXRTdHJlYW1Xb3JrZXIoKQoreworICAgIEFTU0VSVCghaXNNYWluVGhyZWFkKCkpOworICAgIGRl
c3Ryb3lIYW5kbGUoKTsKK30KKwordm9pZCBDdXJsU29ja2V0U3RyZWFtV29ya2VyOjpkZXN0cm95
SGFuZGxlKCkKK3sKKyAgICBBU1NFUlQoIWlzTWFpblRocmVhZCgpKTsKKworICAgIGlmICghbV9j
dXJsSGFuZGxlKQorICAgICAgICByZXR1cm47CisKKyAgICBtX2N1cmxIYW5kbGUgPSBudWxscHRy
OworfQorCit2b2lkIEN1cmxTb2NrZXRTdHJlYW1Xb3JrZXI6OnNlbmQoVW5pcXVlQXJyYXk8dWlu
dDhfdD4mJiBidWZmZXIsIHNpemVfdCBsZW5ndGgpCit7CisgICAgQVNTRVJUKCFpc01haW5UaHJl
YWQoKSk7CisgICAgQVNTRVJUKCFtX3dyaXRlQnVmZmVyKTsKKworICAgIGlmICghbV9jdXJsSGFu
ZGxlIHx8IG1fd3JpdGVCdWZmZXIpCisgICAgICAgIHJldHVybjsKKworICAgIG1fd3JpdGVCdWZm
ZXIgPSBXVEZNb3ZlKGJ1ZmZlcik7CisgICAgbV93cml0ZUJ1ZmZlclNpemUgPSBsZW5ndGg7Cisg
ICAgbV93cml0ZUJ1ZmZlck9mZnNldCA9IDA7Cit9CisKK3ZvaWQgQ3VybFNvY2tldFN0cmVhbVdv
cmtlcjo6YXBwZW5kTW9uaXRvcmluZ0ZkKGZkX3NldCYgcmVhZGZkcywgZmRfc2V0JiB3cml0ZWZk
cywgZmRfc2V0JiBleGNlcHRmZHMsIGludCYgbWF4ZmQpCit7CisgICAgaWYgKCFtX2N1cmxIYW5k
bGUpCisgICAgICAgIHJldHVybjsKKworICAgIGF1dG8gc29ja2V0ID0gbV9jdXJsSGFuZGxlLT5n
ZXRBY3RpdmVTb2NrZXQoW3RoaXNdKENVUkxjb2RlIGVycm9yQ29kZSkgeworICAgICAgICBub3Rp
ZnlGYWlsV2l0aEVycm9yKGVycm9yQ29kZSk7CisgICAgfSk7CisKKyAgICBpZiAoIXNvY2tldCkK
KyAgICAgICAgcmV0dXJuOworCisgICAgRkRfU0VUKCpzb2NrZXQsICZyZWFkZmRzKTsKKyAgICBG
RF9TRVQoKnNvY2tldCwgJmV4Y2VwdGZkcyk7CisKKyAgICBpZiAobV93cml0ZUJ1ZmZlcikKKyAg
ICAgICAgRkRfU0VUKCpzb2NrZXQsICZ3cml0ZWZkcyk7CisKKyAgICBpZiAobWF4ZmQgPCAqc29j
a2V0KQorICAgICAgICBtYXhmZCA9ICpzb2NrZXQ7Cit9CisKK3ZvaWQgQ3VybFNvY2tldFN0cmVh
bVdvcmtlcjo6dHJ5VG9UcmFuc2Zlcihjb25zdCBmZF9zZXQmIHJlYWRmZHMsIGNvbnN0IGZkX3Nl
dCYgd3JpdGVmZHMsIGNvbnN0IGZkX3NldCYgZXhjZXB0ZmRzKQoreworICAgIGlmICghbV9jdXJs
SGFuZGxlKQorICAgICAgICByZXR1cm47CisKKyAgICBhdXRvIHNvY2tldCA9IG1fY3VybEhhbmRs
ZS0+Z2V0QWN0aXZlU29ja2V0KFt0aGlzXShDVVJMY29kZSBlcnJvckNvZGUpIHsKKyAgICAgICAg
bm90aWZ5RmFpbFdpdGhFcnJvcihlcnJvckNvZGUpOworICAgIH0pOworCisgICAgaWYgKCFzb2Nr
ZXQpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChGRF9JU1NFVCgqc29ja2V0LCAmcmVhZGZk
cykgfHwgRkRfSVNTRVQoKnNvY2tldCwgJmV4Y2VwdGZkcykpCisgICAgICAgIHRyeVRvUmVhZCgp
OworCisgICAgaWYgKEZEX0lTU0VUKCpzb2NrZXQsICZ3cml0ZWZkcykpCisgICAgICAgIHRyeVRv
V3JpdGUoKTsKK30KKwordm9pZCBDdXJsU29ja2V0U3RyZWFtV29ya2VyOjp0cnlUb1JlYWQoKQor
eworICAgIEFTU0VSVCghaXNNYWluVGhyZWFkKCkpOworCisgICAgaWYgKCFtX2N1cmxIYW5kbGUp
CisgICAgICAgIHJldHVybjsKKworICAgIGF1dG8gcmVhZEJ1ZmZlciA9IG1ha2VVbmlxdWVBcnJh
eTx1aW50OF90PihrUmVhZEJ1ZmZlclNpemUpOworICAgIHNpemVfdCBieXRlc1JlYWQgPSAwOwor
CisgICAgYXV0byBlcnJvckNvZGUgPSBtX2N1cmxIYW5kbGUtPnJlY2VpdmUocmVhZEJ1ZmZlci5n
ZXQoKSwga1JlYWRCdWZmZXJTaXplLCBieXRlc1JlYWQpOworICAgIGlmIChlcnJvckNvZGUgIT0g
Q1VSTEVfT0spIHsKKyAgICAgICAgaWYgKGVycm9yQ29kZSAhPSBDVVJMRV9BR0FJTikKKyAgICAg
ICAgICAgIG5vdGlmeUZhaWxXaXRoRXJyb3IoZXJyb3JDb2RlKTsKKyAgICAgICAgcmV0dXJuOwor
ICAgIH0KKworICAgIC8vIDAgYnl0ZXMgaW5kaWNhdGVzIGEgY2xvc2VkIGNvbm5lY3Rpb24uCisg
ICAgaWYgKCFieXRlc1JlYWQpCisgICAgICAgIGRlc3Ryb3lIYW5kbGUoKTsKKworICAgIGNhbGxD
bGllbnQoW2J1ZmZlciA9IFdURk1vdmUocmVhZEJ1ZmZlciksIGxlbmd0aCA9IGJ5dGVzUmVhZF0o
Q3VybFNvY2tldFN0cmVhbVdvcmtlckNsaWVudCYgY2xpZW50KSBtdXRhYmxlIHsKKyAgICAgICAg
QVNTRVJUKGlzTWFpblRocmVhZCgpKTsKKyAgICAgICAgY2xpZW50LmRpZFJlY2VpdmVEYXRhKHJl
aW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGJ1ZmZlci5nZXQoKSksIGxlbmd0aCk7CisgICAg
fSk7Cit9CisKK3ZvaWQgQ3VybFNvY2tldFN0cmVhbVdvcmtlcjo6dHJ5VG9Xcml0ZSgpCit7Cisg
ICAgQVNTRVJUKCFpc01haW5UaHJlYWQoKSk7CisKKyAgICBpZiAoIW1fY3VybEhhbmRsZSB8fCAh
bV93cml0ZUJ1ZmZlcikKKyAgICAgICAgcmV0dXJuOworCisgICAgd2hpbGUgKG1fd3JpdGVCdWZm
ZXJPZmZzZXQgPCBtX3dyaXRlQnVmZmVyU2l6ZSkgeworICAgICAgICBzaXplX3QgYnl0ZXNXcml0
dGVuID0gMDsKKworICAgICAgICBhdXRvIGVycm9yQ29kZSA9IG1fY3VybEhhbmRsZS0+c2VuZCht
X3dyaXRlQnVmZmVyLmdldCgpICsgbV93cml0ZUJ1ZmZlck9mZnNldCwgbV93cml0ZUJ1ZmZlclNp
emUgLSBtX3dyaXRlQnVmZmVyT2Zmc2V0LCBieXRlc1dyaXR0ZW4pOworICAgICAgICBpZiAoZXJy
b3JDb2RlICE9IENVUkxFX09LKSB7CisgICAgICAgICAgICBpZiAoZXJyb3JDb2RlICE9IENVUkxF
X0FHQUlOKQorICAgICAgICAgICAgICAgIG5vdGlmeUZhaWxXaXRoRXJyb3IoZXJyb3JDb2RlKTsK
KyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIG1fd3JpdGVCdWZmZXJP
ZmZzZXQgKz0gYnl0ZXNXcml0dGVuOworICAgIH0KKworICAgIG1fd3JpdGVCdWZmZXIgPSBudWxs
cHRyOworICAgIG1fd3JpdGVCdWZmZXJTaXplID0gMDsKKyAgICBtX3dyaXRlQnVmZmVyT2Zmc2V0
ID0gMDsKKworICAgIGNhbGxDbGllbnQoW10oQ3VybFNvY2tldFN0cmVhbVdvcmtlckNsaWVudCYg
Y2xpZW50KSB7CisgICAgICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7CisgICAgICAgIGNsaWVu
dC5kaWRTZW5kRGF0YSgpOworICAgIH0pOworfQorCit2b2lkIEN1cmxTb2NrZXRTdHJlYW1Xb3Jr
ZXI6Om5vdGlmeUZhaWxXaXRoRXJyb3IoQ1VSTGNvZGUgZXJyb3JDb2RlKQoreworICAgIEFTU0VS
VCghaXNNYWluVGhyZWFkKCkpOworCisgICAgZGVzdHJveUhhbmRsZSgpOworCisgICAgY2FsbENs
aWVudChbdXJsID0gbV91cmwuaXNvbGF0ZWRDb3B5KCksIGVycm9yQ29kZV0oQ3VybFNvY2tldFN0
cmVhbVdvcmtlckNsaWVudCYgY2xpZW50KSB7CisgICAgICAgIEFTU0VSVChpc01haW5UaHJlYWQo
KSk7CisgICAgICAgIGNsaWVudC5kaWRGYWlsV2l0aEVycm9yKFNvY2tldFN0cmVhbUVycm9yKGVy
cm9yQ29kZSwgdXJsLCBDdXJsSGFuZGxlOjplcnJvckRlc2NyaXB0aW9uKGVycm9yQ29kZSkpKTsK
KyAgICB9KTsKK30KKwordm9pZCBDdXJsU29ja2V0U3RyZWFtV29ya2VyOjpjYWxsQ2xpZW50KEZ1
bmN0aW9uPHZvaWQoQ3VybFNvY2tldFN0cmVhbVdvcmtlckNsaWVudCYpPiYmIHRhc2spCit7Cisg
ICAgQVNTRVJUKCFpc01haW5UaHJlYWQoKSk7CisKKyAgICBtX3dvcmtlck1hbmFnZXIuY2FsbE9u
TWFpblRocmVhZChtX3dvcmtlcklELCBXVEZNb3ZlKHRhc2spKTsKK30KKworfQorCisjZW5kaWYK
ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsU29j
a2V0U3RyZWFtV29ya2VyLmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwv
Q3VybFNvY2tldFN0cmVhbVdvcmtlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAw
MDAwMDAwLi5iOGUyZDg3ZGQzYwotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL25ldHdvcmsvY3VybC9DdXJsU29ja2V0U3RyZWFtV29ya2VyLmgKQEAgLTAsMCArMSw3
NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBTb255IEludGVyYWN0aXZlIEVudGVydGFp
bm1lbnQgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0Ogor
ICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBP
UgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4K
KyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0Ug
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJDdXJsQ29u
dGV4dC5oIgorI2luY2x1ZGUgIkN1cmxTb2NrZXRTdHJlYW1Xb3JrZXJDbGllbnQuaCIKKyNpbmNs
dWRlIDx3dGYvVVJMLmg+CisjaW5jbHVkZSA8d3RmL1VuaXF1ZUFycmF5Lmg+CisKK25hbWVzcGFj
ZSBXZWJDb3JlIHsKKworY2xhc3MgQ3VybEhhbmRsZTsKK2NsYXNzIEN1cmxTb2NrZXRTdHJlYW1X
b3JrZXJNYW5hZ2VyOworCitjbGFzcyBDdXJsU29ja2V0U3RyZWFtV29ya2VyIHsKKyAgICBXVEZf
TUFLRV9GQVNUX0FMTE9DQVRFRDsKKyAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShDdXJsU29ja2V0
U3RyZWFtV29ya2VyKTsKK3B1YmxpYzoKKyAgICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEN1cmxT
b2NrZXRTdHJlYW1Xb3JrZXI+IGNyZWF0ZShDdXJsU29ja2V0U3RyZWFtV29ya2VyTWFuYWdlciYg
d29ya2VyTWFuYWdlciwgQ3VybFNvY2tldFN0cmVhbVdvcmtlcklEIHdvcmtlcklELCBVUkwmJiB1
cmwpCisgICAgeworICAgICAgICByZXR1cm4gV1RGOjptYWtlVW5pcXVlPEN1cmxTb2NrZXRTdHJl
YW1Xb3JrZXI+KHdvcmtlck1hbmFnZXIsIHdvcmtlcklELCBXVEZNb3ZlKHVybCkpOworICAgIH0K
KworICAgIEN1cmxTb2NrZXRTdHJlYW1Xb3JrZXIoQ3VybFNvY2tldFN0cmVhbVdvcmtlck1hbmFn
ZXImLCBDdXJsU29ja2V0U3RyZWFtV29ya2VySUQsIFVSTCYmKTsKKyAgICB2aXJ0dWFsIH5DdXJs
U29ja2V0U3RyZWFtV29ya2VyKCk7CisKKyAgICB2b2lkIHNlbmQoVW5pcXVlQXJyYXk8dWludDhf
dD4mJiwgc2l6ZV90KTsKKworICAgIHZvaWQgYXBwZW5kTW9uaXRvcmluZ0ZkKGZkX3NldCYsIGZk
X3NldCYsIGZkX3NldCYsIGludCYpOworICAgIHZvaWQgdHJ5VG9UcmFuc2Zlcihjb25zdCBmZF9z
ZXQmLCBjb25zdCBmZF9zZXQmLCBjb25zdCBmZF9zZXQmKTsKKworcHJpdmF0ZToKKyAgICB2b2lk
IGRlc3Ryb3lIYW5kbGUoKTsKKworICAgIHZvaWQgdHJ5VG9SZWFkKCk7CisgICAgdm9pZCB0cnlU
b1dyaXRlKCk7CisKKyAgICB2b2lkIG5vdGlmeUZhaWxXaXRoRXJyb3IoQ1VSTGNvZGUpOworICAg
IHZvaWQgY2FsbENsaWVudChGdW5jdGlvbjx2b2lkKEN1cmxTb2NrZXRTdHJlYW1Xb3JrZXJDbGll
bnQmKT4mJik7CisKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtSZWFkQnVmZmVyU2l6ZSA9IDY0
ICogMTAyNDsKKworICAgIEN1cmxTb2NrZXRTdHJlYW1Xb3JrZXJNYW5hZ2VyJiBtX3dvcmtlck1h
bmFnZXI7CisgICAgQ3VybFNvY2tldFN0cmVhbVdvcmtlcklEIG1fd29ya2VySUQ7CisgICAgVVJM
IG1fdXJsOworCisgICAgc3RkOjp1bmlxdWVfcHRyPEN1cmxIYW5kbGU+IG1fY3VybEhhbmRsZTsK
KworICAgIFVuaXF1ZUFycmF5PHVpbnQ4X3Q+IG1fd3JpdGVCdWZmZXI7CisgICAgc2l6ZV90IG1f
d3JpdGVCdWZmZXJTaXplIHsgMCB9OworICAgIHNpemVfdCBtX3dyaXRlQnVmZmVyT2Zmc2V0IHsg
MCB9OworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEvU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0N1cmxTb2NrZXRTdHJlYW1Xb3JrZXJDbGllbnQu
aCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsU29ja2V0U3RyZWFt
V29ya2VyQ2xpZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLmUw
MGM1MjQzZGM2Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0
d29yay9jdXJsL0N1cmxTb2NrZXRTdHJlYW1Xb3JrZXJDbGllbnQuaApAQCAtMCwwICsxLDQzIEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFNvbnkgSW50ZXJhY3RpdmUgRW50ZXJ0YWlubWVu
dCBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAx
LiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAq
ICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZSBkaXN0cmlidXRpb24uCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAor
ICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQg
U0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisg
KiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQ
Uk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICog
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNF
IE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBU
SElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworbmFtZXNwYWNlIFdlYkNvcmUgewor
Cit1c2luZyBDdXJsU29ja2V0U3RyZWFtV29ya2VySUQgPSB1aW50MTZfdDsKK2NvbnN0IEN1cmxT
b2NrZXRTdHJlYW1Xb3JrZXJJRCBpbnZhbGlkQ3VybFNvY2tldFN0cmVhbVdvcmtlcklEID0gMDsK
KworY2xhc3MgU29ja2V0U3RyZWFtRXJyb3I7CisKK2NsYXNzIEN1cmxTb2NrZXRTdHJlYW1Xb3Jr
ZXJDbGllbnQgeworcHVibGljOgorICAgIHZpcnR1YWwgdm9pZCBkaWRPcGVuQ29ubmVjdGlvbigp
ID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgZGlkU2VuZERhdGEoKSA9IDA7CisgICAgdmlydHVhbCB2
b2lkIGRpZFJlY2VpdmVEYXRhKGNvbnN0IGNoYXIqLCBzaXplX3QpID0gMDsKKyAgICB2aXJ0dWFs
IHZvaWQgZGlkRmFpbFdpdGhFcnJvcihTb2NrZXRTdHJlYW1FcnJvciYmKSA9IDA7Cit9OworCit9
IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9uZXR3b3JrL2N1cmwvQ3VybFNvY2tldFN0cmVhbVdvcmtlck1hbmFnZXIuY3BwIGIvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0N1cmxTb2NrZXRTdHJlYW1Xb3JrZXJNYW5h
Z2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uNGEzNGJkYmM2
NGQKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1
cmwvQ3VybFNvY2tldFN0cmVhbVdvcmtlck1hbmFnZXIuY3BwCkBAIC0wLDAgKzEsMjA4IEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDIwIFNvbnkgSW50ZXJhY3RpdmUgRW50ZXJ0YWlubWVudCBJ
bmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
SU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICog
VEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9D
VVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
IERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQ3VybFNvY2tl
dFN0cmVhbVdvcmtlck1hbmFnZXIuaCIKKworI2luY2x1ZGUgIkN1cmxDb250ZXh0LmgiCisjaW5j
bHVkZSAiQ3VybFNvY2tldFN0cmVhbVdvcmtlckNsaWVudC5oIgorCisjaWYgVVNFKENVUkwpCisK
K25hbWVzcGFjZSBXZWJDb3JlIHsKKworQ3VybFNvY2tldFN0cmVhbVdvcmtlck1hbmFnZXI6OkN1
cmxTb2NrZXRTdHJlYW1Xb3JrZXJNYW5hZ2VyKCkKK3sKKyAgICBBU1NFUlQoaXNNYWluVGhyZWFk
KCkpOworfQorCitDdXJsU29ja2V0U3RyZWFtV29ya2VyTWFuYWdlcjo6fkN1cmxTb2NrZXRTdHJl
YW1Xb3JrZXJNYW5hZ2VyKCkKK3sKKyAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOworfQorCitD
dXJsU29ja2V0U3RyZWFtV29ya2VySUQgQ3VybFNvY2tldFN0cmVhbVdvcmtlck1hbmFnZXI6OmNy
ZWF0ZShjb25zdCBVUkwmIHVybCwgQ3VybFNvY2tldFN0cmVhbVdvcmtlckNsaWVudCYgY2xpZW50
KQoreworICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7CisKKyAgICBhdXRvIHdvcmtlcklEID0g
bV9uZXh0V29ya2VySUQ7CisgICAgbV9uZXh0V29ya2VySUQgPSAobV9uZXh0V29ya2VySUQgKyAx
ICE9IGludmFsaWRDdXJsU29ja2V0U3RyZWFtV29ya2VySUQpID8gbV9uZXh0V29ya2VySUQgKyAx
IDogMTsKKworICAgIG1fd29ya2VyQ2xpZW50TGlzdHMuYWRkKHdvcmtlcklELCAmY2xpZW50KTsK
KworICAgIGF1dG8gdGFzayA9IFt0aGlzLCB3b3JrZXJJRCwgdXJsID0gdXJsLmlzb2xhdGVkQ29w
eSgpXSgpIG11dGFibGUgeworICAgICAgICBBU1NFUlQoIWlzTWFpblRocmVhZCgpKTsKKyAgICAg
ICAgbV93b3JrZXJMaXN0cy5hZGQod29ya2VySUQsIEN1cmxTb2NrZXRTdHJlYW1Xb3JrZXI6OmNy
ZWF0ZSgqdGhpcywgd29ya2VySUQsIFdURk1vdmUodXJsKSkpOworICAgIH07CisKKyAgICBjYWxs
T25Xb3JrZXJUaHJlYWQoV1RGTW92ZSh0YXNrKSk7CisKKyAgICByZXR1cm4gd29ya2VySUQ7Cit9
CisKK3ZvaWQgQ3VybFNvY2tldFN0cmVhbVdvcmtlck1hbmFnZXI6OmRlc3RvcnkoQ3VybFNvY2tl
dFN0cmVhbVdvcmtlcklEIHdvcmtlcklEKQoreworICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7
CisKKyAgICBpZiAobV93b3JrZXJDbGllbnRMaXN0cy5jb250YWlucyh3b3JrZXJJRCkpCisgICAg
ICAgIG1fd29ya2VyQ2xpZW50TGlzdHMucmVtb3ZlKHdvcmtlcklEKTsKKworICAgIGF1dG8gdGFz
ayA9IFt0aGlzLCB3b3JrZXJJRF0oKSB7CisgICAgICAgIEFTU0VSVCghaXNNYWluVGhyZWFkKCkp
OworICAgICAgICBpZiAobV93b3JrZXJMaXN0cy5jb250YWlucyh3b3JrZXJJRCkpCisgICAgICAg
ICAgICBtX3dvcmtlckxpc3RzLnJlbW92ZSh3b3JrZXJJRCk7CisgICAgfTsKKworICAgIGNhbGxP
bldvcmtlclRocmVhZChXVEZNb3ZlKHRhc2spKTsKK30KKwordm9pZCBDdXJsU29ja2V0U3RyZWFt
V29ya2VyTWFuYWdlcjo6c2VuZChDdXJsU29ja2V0U3RyZWFtV29ya2VySUQgd29ya2VySUQsIFVu
aXF1ZUFycmF5PHVpbnQ4X3Q+JiYgZGF0YSwgc2l6ZV90IGxlbmd0aCkKK3sKKyAgICBBU1NFUlQo
aXNNYWluVGhyZWFkKCkpOworCisgICAgYXV0byB0YXNrID0gW3RoaXMsIHdvcmtlcklELCBkYXRh
ID0gV1RGTW92ZShkYXRhKSwgbGVuZ3RoXSgpIG11dGFibGUgeworICAgICAgICBBU1NFUlQoIWlz
TWFpblRocmVhZCgpKTsKKyAgICAgICAgaWYgKGF1dG8gd29ya2VyID0gbV93b3JrZXJMaXN0cy5n
ZXQod29ya2VySUQpKQorICAgICAgICAgICAgd29ya2VyLT5zZW5kKFdURk1vdmUoZGF0YSksIGxl
bmd0aCk7CisgICAgfTsKKworICAgIGNhbGxPbldvcmtlclRocmVhZChXVEZNb3ZlKHRhc2spKTsK
K30KKwordm9pZCBDdXJsU29ja2V0U3RyZWFtV29ya2VyTWFuYWdlcjo6Y2FsbE9uV29ya2VyVGhy
ZWFkKFdURjo6RnVuY3Rpb248dm9pZCgpPiYmIHRhc2spCit7CisgICAgYXBwZW5kVGFzayhXVEZN
b3ZlKHRhc2spKTsKKyAgICBzdGFydFRocmVhZElmTmVlZGVkKCk7Cit9CisKK3ZvaWQgQ3VybFNv
Y2tldFN0cmVhbVdvcmtlck1hbmFnZXI6OmNhbGxPbk1haW5UaHJlYWQoQ3VybFNvY2tldFN0cmVh
bVdvcmtlcklEIHdvcmtlcklELCBXVEY6OkZ1bmN0aW9uPHZvaWQoQ3VybFNvY2tldFN0cmVhbVdv
cmtlckNsaWVudCYpPiYmIHRhc2spCit7CisgICAgQVNTRVJUKCFpc01haW5UaHJlYWQoKSk7CisK
KyAgICBhdXRvIHN1YlRhc2sgPSBbdGhpcywgd29ya2VySUQsIHRhc2sgPSBXVEZNb3ZlKHRhc2sp
XSgpIHsKKyAgICAgICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKKyAgICAgICAgaWYgKGF1dG8g
Y2xpZW50ID0gbV93b3JrZXJDbGllbnRMaXN0cy5nZXQod29ya2VySUQpKQorICAgICAgICAgICAg
dGFzaygqY2xpZW50KTsKKyAgICB9OworCisgICAgV1RGOjpjYWxsT25NYWluVGhyZWFkKFdURk1v
dmUoc3ViVGFzaykpOworfQorCit2b2lkIEN1cmxTb2NrZXRTdHJlYW1Xb3JrZXJNYW5hZ2VyOjpz
dGFydFRocmVhZElmTmVlZGVkKCkKK3sKKyAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOworCisg
ICAgTG9ja0hvbGRlciBsb2NrZXIobV9tdXRleCk7CisgICAgaWYgKCFtX3J1blRocmVhZCkgewor
ICAgICAgICBpZiAobV90aHJlYWQpCisgICAgICAgICAgICBtX3RocmVhZC0+d2FpdEZvckNvbXBs
ZXRpb24oKTsKKworICAgICAgICBtX3J1blRocmVhZCA9IHRydWU7CisgICAgICAgIG1fdGhyZWFk
ID0gVGhyZWFkOjpjcmVhdGUoImN1cmxTb2NrZXRTdHJlYW1UaHJlYWQiLCBbdGhpc10geworICAg
ICAgICAgICAgd29ya2VyVGhyZWFkKCk7CisgICAgICAgIH0pOworICAgIH0KK30KKwordm9pZCBD
dXJsU29ja2V0U3RyZWFtV29ya2VyTWFuYWdlcjo6c3RvcFRocmVhZElmTm9Nb3JlSm9iUnVubmlu
ZygpCit7CisgICAgQVNTRVJUKCFpc01haW5UaHJlYWQoKSk7CisKKyAgICBMb2NrSG9sZGVyIGxv
Y2tlcihtX211dGV4KTsKKyAgICBpZiAobV90YXNrUXVldWUuc2l6ZSgpIHx8IG1fd29ya2VyTGlz
dHMuc2l6ZSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBtX3J1blRocmVhZCA9IGZhbHNlOwor
fQorCit2b2lkIEN1cmxTb2NrZXRTdHJlYW1Xb3JrZXJNYW5hZ2VyOjpzdG9wVGhyZWFkKCkKK3sK
KyAgICBtX3J1blRocmVhZCA9IGZhbHNlOworCisgICAgaWYgKG1fdGhyZWFkKSB7CisgICAgICAg
IG1fdGhyZWFkLT53YWl0Rm9yQ29tcGxldGlvbigpOworICAgICAgICBtX3RocmVhZCA9IG51bGxw
dHI7CisgICAgfQorfQorCit2b2lkIEN1cmxTb2NrZXRTdHJlYW1Xb3JrZXJNYW5hZ2VyOjphcHBl
bmRUYXNrKFdURjo6RnVuY3Rpb248dm9pZCgpPiYmIHRhc2spCit7CisgICAgTG9ja0hvbGRlciBs
b2NrZXIobV9tdXRleCk7CisgICAgbV90YXNrUXVldWUuYXBwZW5kKFdURk1vdmUodGFzaykpOwor
fQorCit2b2lkIEN1cmxTb2NrZXRTdHJlYW1Xb3JrZXJNYW5hZ2VyOjpleGVjdXRlVGFza3MoKQor
eworICAgIEFTU0VSVCghaXNNYWluVGhyZWFkKCkpOworCisgICAgVmVjdG9yPFdURjo6RnVuY3Rp
b248dm9pZCgpPj4gdGFza1F1ZXVlOworCisgICAgeworICAgICAgICBMb2NrSG9sZGVyIGxvY2tl
cihtX211dGV4KTsKKyAgICAgICAgdGFza1F1ZXVlID0gV1RGTW92ZShtX3Rhc2tRdWV1ZSk7Cisg
ICAgfQorCisgICAgZm9yIChhdXRvJiB0YXNrIDogdGFza1F1ZXVlKQorICAgICAgICB0YXNrKCk7
Cit9CisKK3ZvaWQgQ3VybFNvY2tldFN0cmVhbVdvcmtlck1hbmFnZXI6OndvcmtlclRocmVhZCgp
Cit7CisgICAgQVNTRVJUKCFpc01haW5UaHJlYWQoKSk7CisgICAgc3RhdGljIGNvbnN0IGludCBz
ZWxlY3RUaW1lb3V0TVMgPSAyMDsKKyAgICBzdHJ1Y3QgdGltZXZhbCB0aW1lb3V0IHsgMCwgc2Vs
ZWN0VGltZW91dE1TICogMTAwMH07CisKKyAgICB3aGlsZSAobV9ydW5UaHJlYWQpIHsKKyAgICAg
ICAgZXhlY3V0ZVRhc2tzKCk7CisKKyAgICAgICAgaW50IHJjID0gMDsKKyAgICAgICAgZmRfc2V0
IHJlYWRmZHM7CisgICAgICAgIGZkX3NldCB3cml0ZWZkczsKKyAgICAgICAgZmRfc2V0IGV4Y2Vw
dGZkczsKKworICAgICAgICBkbyB7CisgICAgICAgICAgICBpbnQgbWF4ZmQgPSAtMTsKKworICAg
ICAgICAgICAgRkRfWkVSTygmcmVhZGZkcyk7CisgICAgICAgICAgICBGRF9aRVJPKCZ3cml0ZWZk
cyk7CisgICAgICAgICAgICBGRF9aRVJPKCZleGNlcHRmZHMpOworCisgICAgICAgICAgICBmb3Ig
KGF1dG8mIHdvcmtlciA6IG1fd29ya2VyTGlzdHMudmFsdWVzKCkpCisgICAgICAgICAgICAgICAg
d29ya2VyLT5hcHBlbmRNb25pdG9yaW5nRmQocmVhZGZkcywgd3JpdGVmZHMsIGV4Y2VwdGZkcywg
bWF4ZmQpOworCisgICAgICAgICAgICBpZiAobWF4ZmQgPj0gMCkKKyAgICAgICAgICAgICAgICBy
YyA9IDo6c2VsZWN0KG1heGZkICsgMSwgJnJlYWRmZHMsICZ3cml0ZWZkcywgJmV4Y2VwdGZkcywg
JnRpbWVvdXQpOworICAgICAgICB9IHdoaWxlIChyYyA9PSAtMSAmJiBlcnJubyA9PSBFSU5UUik7
CisKKyAgICAgICAgZm9yIChhdXRvJiB3b3JrZXIgOiBtX3dvcmtlckxpc3RzLnZhbHVlcygpKQor
ICAgICAgICAgICAgd29ya2VyLT50cnlUb1RyYW5zZmVyKHJlYWRmZHMsIHdyaXRlZmRzLCBleGNl
cHRmZHMpOworCisgICAgICAgIHN0b3BUaHJlYWRJZk5vTW9yZUpvYlJ1bm5pbmcoKTsKKyAgICB9
Cit9CisKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9u
ZXR3b3JrL2N1cmwvQ3VybFNvY2tldFN0cmVhbVdvcmtlck1hbmFnZXIuaCBiL1NvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsU29ja2V0U3RyZWFtV29ya2VyTWFuYWdlci5o
Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi5hYTY0ODMyYWU4YwotLS0g
L2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJs
U29ja2V0U3RyZWFtV29ya2VyTWFuYWdlci5oCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMjAgU29ueSBJbnRlcmFjdGl2ZSBFbnRlcnRhaW5tZW50IEluYy4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJ
VFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElF
RCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJ
TkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9G
CisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1Ig
UFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgor
ICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiQ3VybENvbnRleHQuaCIKKyNpbmNsdWRl
ICJDdXJsU29ja2V0U3RyZWFtV29ya2VyLmgiCisjaW5jbHVkZSA8d3RmL0Z1bmN0aW9uLmg+Cisj
aW5jbHVkZSA8d3RmL0hhc2hNYXAuaD4KKyNpbmNsdWRlIDx3dGYvVVJMLmg+CisKK25hbWVzcGFj
ZSBXZWJDb3JlIHsKKworY2xhc3MgQ3VybFNvY2tldFN0cmVhbVdvcmtlckNsaWVudDsKKworY2xh
c3MgQ3VybFNvY2tldFN0cmVhbVdvcmtlck1hbmFnZXIgeworICAgIFdURl9NQUtFX0ZBU1RfQUxM
T0NBVEVEOworICAgIFdURl9NQUtFX05PTkNPUFlBQkxFKEN1cmxTb2NrZXRTdHJlYW1Xb3JrZXJN
YW5hZ2VyKTsKK3B1YmxpYzoKKyAgICBDdXJsU29ja2V0U3RyZWFtV29ya2VyTWFuYWdlcigpOwor
ICAgIHZpcnR1YWwgfkN1cmxTb2NrZXRTdHJlYW1Xb3JrZXJNYW5hZ2VyKCk7CisKKyAgICBDdXJs
U29ja2V0U3RyZWFtV29ya2VySUQgY3JlYXRlKGNvbnN0IFVSTCYsIEN1cmxTb2NrZXRTdHJlYW1X
b3JrZXJDbGllbnQmKTsKKyAgICB2b2lkIGRlc3RvcnkoQ3VybFNvY2tldFN0cmVhbVdvcmtlcklE
KTsKKyAgICB2b2lkIHNlbmQoQ3VybFNvY2tldFN0cmVhbVdvcmtlcklELCBVbmlxdWVBcnJheTx1
aW50OF90PiYmLCBzaXplX3QpOworCisgICAgdm9pZCBjYWxsT25Xb3JrZXJUaHJlYWQoV1RGOjpG
dW5jdGlvbjx2b2lkKCk+JiYpOworICAgIHZvaWQgY2FsbE9uTWFpblRocmVhZChDdXJsU29ja2V0
U3RyZWFtV29ya2VySUQsIFdURjo6RnVuY3Rpb248dm9pZChDdXJsU29ja2V0U3RyZWFtV29ya2Vy
Q2xpZW50Jik+JiYpOworCitwcml2YXRlOgorICAgIHZvaWQgc3RhcnRUaHJlYWRJZk5lZWRlZCgp
OworICAgIHZvaWQgc3RvcFRocmVhZElmTm9Nb3JlSm9iUnVubmluZygpOworICAgIHZvaWQgc3Rv
cFRocmVhZCgpOworCisgICAgdm9pZCBhcHBlbmRUYXNrKFdURjo6RnVuY3Rpb248dm9pZCgpPiYm
KTsKKyAgICB2b2lkIGV4ZWN1dGVUYXNrcygpOworCisgICAgdm9pZCB3b3JrZXJUaHJlYWQoKTsK
KworICAgIExvY2sgbV9tdXRleDsKKyAgICBSZWZQdHI8VGhyZWFkPiBtX3RocmVhZDsKKyAgICBi
b29sIG1fcnVuVGhyZWFkIHsgZmFsc2UgfTsKKworICAgIEN1cmxTb2NrZXRTdHJlYW1Xb3JrZXJJ
RCBtX25leHRXb3JrZXJJRCA9IDE7CisKKyAgICBWZWN0b3I8RnVuY3Rpb248dm9pZCgpPj4gbV90
YXNrUXVldWU7CisgICAgSGFzaE1hcDxDdXJsU29ja2V0U3RyZWFtV29ya2VySUQsIEN1cmxTb2Nr
ZXRTdHJlYW1Xb3JrZXJDbGllbnQqPiBtX3dvcmtlckNsaWVudExpc3RzOworICAgIEhhc2hNYXA8
Q3VybFNvY2tldFN0cmVhbVdvcmtlcklELCBzdGQ6OnVuaXF1ZV9wdHI8Q3VybFNvY2tldFN0cmVh
bVdvcmtlcj4+IG1fd29ya2VyTGlzdHM7Cit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRp
ZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvU29ja2V0U3Ry
ZWFtSGFuZGxlSW1wbC5oIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL1Nv
Y2tldFN0cmVhbUhhbmRsZUltcGwuaAppbmRleCAyNWJmM2M0NmEyZS4uODZhY2M2YTQzM2MgMTAw
NjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9Tb2NrZXRTdHJl
YW1IYW5kbGVJbXBsLmgKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJs
L1NvY2tldFN0cmVhbUhhbmRsZUltcGwuaApAQCAtMSw2ICsxLDcgQEAKIC8qCiAgKiBDb3B5cmln
aHQgKEMpIDIwMDktMjAxOCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBDb3B5
cmlnaHQgKEMpIDIwMDkgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5
cmlnaHQgKEMpIDIwMjAgU29ueSBJbnRlcmFjdGl2ZSBFbnRlcnRhaW5tZW50IEluYy4KICAqCiAg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKICAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKQEAgLTMxLDIzICszMiwxOSBAQAogCiAjcHJh
Z21hIG9uY2UKIAotI2luY2x1ZGUgIkN1cmxDb250ZXh0LmgiCisjaW5jbHVkZSAiQ3VybFNvY2tl
dFN0cmVhbUhhbmRsZUNsaWVudC5oIgogI2luY2x1ZGUgIlNvY2tldFN0cmVhbUhhbmRsZS5oIgog
I2luY2x1ZGUgPHBhbC9TZXNzaW9uSUQuaD4KLSNpbmNsdWRlIDx3dGYvRnVuY3Rpb24uaD4KLSNp
bmNsdWRlIDx3dGYvTG9jay5oPgotI2luY2x1ZGUgPHd0Zi9NZXNzYWdlUXVldWUuaD4KLSNpbmNs
dWRlIDx3dGYvUmVmQ291bnRlZC5oPgogI2luY2x1ZGUgPHd0Zi9TdHJlYW1CdWZmZXIuaD4KLSNp
bmNsdWRlIDx3dGYvVGhyZWFkaW5nLmg+CiAjaW5jbHVkZSA8d3RmL1VuaXF1ZUFycmF5Lmg+CiAK
IG5hbWVzcGFjZSBXZWJDb3JlIHsKIAorY2xhc3MgQ3VybFNvY2tldFN0cmVhbUhhbmRsZTsKIGNs
YXNzIFNvY2tldFN0cmVhbUhhbmRsZUNsaWVudDsKIGNsYXNzIFN0b3JhZ2VTZXNzaW9uUHJvdmlk
ZXI7CiAKLWNsYXNzIFNvY2tldFN0cmVhbUhhbmRsZUltcGwgOiBwdWJsaWMgU29ja2V0U3RyZWFt
SGFuZGxlIHsKK2NsYXNzIFNvY2tldFN0cmVhbUhhbmRsZUltcGwgOiBwdWJsaWMgU29ja2V0U3Ry
ZWFtSGFuZGxlLCBwdWJsaWMgQ3VybFNvY2tldFN0cmVhbUhhbmRsZUNsaWVudCB7CiBwdWJsaWM6
CiAgICAgc3RhdGljIFJlZjxTb2NrZXRTdHJlYW1IYW5kbGVJbXBsPiBjcmVhdGUoY29uc3QgVVJM
JiB1cmwsIFNvY2tldFN0cmVhbUhhbmRsZUNsaWVudCYgY2xpZW50LCBQQUw6OlNlc3Npb25JRCwg
Y29uc3QgU3RyaW5nJiwgU291cmNlQXBwbGljYXRpb25BdWRpdFRva2VuJiYsIGNvbnN0IFN0b3Jh
Z2VTZXNzaW9uUHJvdmlkZXIqIHByb3ZpZGVyKSB7IHJldHVybiBhZG9wdFJlZigqbmV3IFNvY2tl
dFN0cmVhbUhhbmRsZUltcGwodXJsLCBjbGllbnQsIHByb3ZpZGVyKSk7IH0KIApAQCAtNjQsMjgg
KzYxLDE5IEBAIHByaXZhdGU6CiAgICAgT3B0aW9uYWw8c2l6ZV90PiBwbGF0Zm9ybVNlbmRJbnRl
cm5hbChjb25zdCB1aW50OF90Kiwgc2l6ZV90KTsKICAgICBib29sIHNlbmRQZW5kaW5nRGF0YSgp
OwogCi0gICAgdm9pZCB0aHJlYWRFbnRyeVBvaW50KGNvbnN0IFVSTCYpOwotICAgIHZvaWQgaGFu
ZGxlRXJyb3IoQ1VSTGNvZGUpOwotICAgIHZvaWQgc3RvcFRocmVhZCgpOwotCi0gICAgdm9pZCBj
YWxsT25Xb3JrZXJUaHJlYWQoRnVuY3Rpb248dm9pZCgpPiYmKTsKLSAgICB2b2lkIGV4ZWN1dGVU
YXNrcygpOwotCi0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBrUmVhZEJ1ZmZlclNpemUgPSA0ICog
MTAyNDsKKyAgICB2b2lkIGN1cmxEaWRPcGVuU29ja2V0U3RyZWFtKCkgZmluYWw7CisgICAgdm9p
ZCBjdXJsRGlkQ2xvc2VTb2NrZXRTdHJlYW0oKSBmaW5hbDsKKyAgICB2b2lkIGN1cmxEaWRTZW5k
U29ja2V0U3RyZWFtRGF0YSgpIGZpbmFsOworICAgIHZvaWQgY3VybERpZFJlY2VpdmVTb2NrZXRT
dHJlYW1EYXRhKGNvbnN0IGNoYXIqLCBzaXplX3QpIGZpbmFsOworICAgIHZvaWQgY3VybERpZEZh
aWxUb1JlY2VpdmVTb2NrZXRTdHJlYW1EYXRhKCkgZmluYWw7CisgICAgdm9pZCBjdXJsRGlkRmFp
bFNvY2tldFN0cmVhbShTb2NrZXRTdHJlYW1FcnJvciYmKSBmaW5hbDsKIAogICAgIFJlZlB0cjxj
b25zdCBTdG9yYWdlU2Vzc2lvblByb3ZpZGVyPiBtX3N0b3JhZ2VTZXNzaW9uUHJvdmlkZXI7Ci0g
ICAgUmVmUHRyPFRocmVhZD4gbV93b3JrZXJUaHJlYWQ7Ci0gICAgc3RkOjphdG9taWM8Ym9vbD4g
bV9ydW5uaW5nIHsgdHJ1ZSB9OwotCi0gICAgTWVzc2FnZVF1ZXVlPEZ1bmN0aW9uPHZvaWQoKT4+
IG1fdGFza1F1ZXVlOwotCi0gICAgYm9vbCBtX2hhc1BlbmRpbmdXcml0ZURhdGEgeyBmYWxzZSB9
OwotICAgIHNpemVfdCBtX3dyaXRlQnVmZmVyU2l6ZSB7IDAgfTsKLSAgICBzaXplX3QgbV93cml0
ZUJ1ZmZlck9mZnNldCB7IDAgfTsKLSAgICBVbmlxdWVBcnJheTx1aW50OF90PiBtX3dyaXRlQnVm
ZmVyOwogCiAgICAgU3RyZWFtQnVmZmVyPHVpbnQ4X3QsIDEwMjQgKiAxMDI0PiBtX2J1ZmZlcjsK
ICAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgbWF4QnVmZmVyU2l6ZSA9IDEwMCAqIDEwMjQgKiAx
MDI0OworCisgICAgc3RkOjp1bmlxdWVfcHRyPEN1cmxTb2NrZXRTdHJlYW1IYW5kbGU+IG1fY3Vy
bFNvY2tldFN0cmVhbUhhbmRsZTsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9Tb2NrZXRTdHJlYW1I
YW5kbGVJbXBsQ3VybC5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwv
U29ja2V0U3RyZWFtSGFuZGxlSW1wbEN1cmwuY3BwCmluZGV4IDEzYTgzMmMyNjY5Li5kNWVjODVl
ZjlmMiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL1Nv
Y2tldFN0cmVhbUhhbmRsZUltcGxDdXJsLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9uZXR3b3JrL2N1cmwvU29ja2V0U3RyZWFtSGFuZGxlSW1wbEN1cmwuY3BwCkBAIC0xLDcgKzEs
NyBAQAogLyoKICAqIENvcHlyaWdodCAoQykgMjAwOSBCcmVudCBGdWxnaGFtLiAgQWxsIHJpZ2h0
cyByZXNlcnZlZC4KICAqIENvcHlyaWdodCAoQykgMjAwOSBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0
cyByZXNlcnZlZC4KLSAqIENvcHlyaWdodCAoQykgMjAxOCBTb255IEludGVyYWN0aXZlIEVudGVy
dGFpbm1lbnQgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDIwIFNvbnkgSW50ZXJhY3RpdmUgRW50
ZXJ0YWlubWVudCBJbmMuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCkBAIC0z
NSwxNCArMzUsMTEgQEAKIAogI2lmIFVTRShDVVJMKQogCi0jaW5jbHVkZSAiRGVwcmVjYXRlZEds
b2JhbFNldHRpbmdzLmgiCi0jaW5jbHVkZSAiTG9nZ2luZy5oIgotI2luY2x1ZGUgIlNvY2tldFN0
cmVhbUVycm9yLmgiCisjaW5jbHVkZSAiQ3VybFNvY2tldFN0cmVhbUhhbmRsZS5oIgorI2luY2x1
ZGUgIlNoYXJlZEJ1ZmZlci5oIgogI2luY2x1ZGUgIlNvY2tldFN0cmVhbUhhbmRsZUNsaWVudC5o
IgogI2luY2x1ZGUgIlN0b3JhZ2VTZXNzaW9uUHJvdmlkZXIuaCIKLSNpbmNsdWRlIDx3dGYvTWFp
blRocmVhZC5oPgogI2luY2x1ZGUgPHd0Zi9VUkwuaD4KLSNpbmNsdWRlIDx3dGYvdGV4dC9DU3Ry
aW5nLmg+CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIApAQCAtNTAsMTY4ICs0Nyw5MiBAQCBTb2Nr
ZXRTdHJlYW1IYW5kbGVJbXBsOjpTb2NrZXRTdHJlYW1IYW5kbGVJbXBsKGNvbnN0IFVSTCYgdXJs
LCBTb2NrZXRTdHJlYW1IYW5kbAogICAgIDogU29ja2V0U3RyZWFtSGFuZGxlKHVybCwgY2xpZW50
KQogICAgICwgbV9zdG9yYWdlU2Vzc2lvblByb3ZpZGVyKHByb3ZpZGVyKQogewotICAgIExPRyhO
ZXR3b3JrLCAiU29ja2V0U3RyZWFtSGFuZGxlICVwIG5ldyBjbGllbnQgJXAiLCB0aGlzLCAmbV9j
bGllbnQpOwogICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7CiAKLSAgICAvLyBGSVhNRTogVXNp
bmcgRGVwcmVjYXRlZEdsb2JhbFNldHRpbmdzIGZyb20gaGVyZSBpcyBhIGxheWVyaW5nIHZpb2xh
dGlvbi4KLSAgICBpZiAobV91cmwucHJvdG9jb2xJcygid3NzIikgJiYgRGVwcmVjYXRlZEdsb2Jh
bFNldHRpbmdzOjphbGxvd3NBbnlTU0xDZXJ0aWZpY2F0ZSgpKQotICAgICAgICBDdXJsQ29udGV4
dDo6c2luZ2xldG9uKCkuc3NsSGFuZGxlKCkuc2V0SWdub3JlU1NMRXJyb3JzKHRydWUpOwotCi0g
ICAgbV93b3JrZXJUaHJlYWQgPSBUaHJlYWQ6OmNyZWF0ZSgiV2ViU29ja2V0IHRocmVhZCIsIFt0
aGlzLCBwcm90ZWN0ZWRUaGlzID0gbWFrZVJlZigqdGhpcyksIHVybCA9IHVybC5pc29sYXRlZENv
cHkoKV0gewotICAgICAgICB0aHJlYWRFbnRyeVBvaW50KHVybCk7Ci0gICAgfSk7CisgICAgbV9j
dXJsU29ja2V0U3RyZWFtSGFuZGxlID0gQ3VybFNvY2tldFN0cmVhbUhhbmRsZTo6Y3JlYXRlKHVy
bCwgKnRoaXMpOworICAgIG1fY3VybFNvY2tldFN0cmVhbUhhbmRsZS0+b3BlbigpOwogfQogCiBT
b2NrZXRTdHJlYW1IYW5kbGVJbXBsOjp+U29ja2V0U3RyZWFtSGFuZGxlSW1wbCgpCiB7Ci0gICAg
TE9HKE5ldHdvcmssICJTb2NrZXRTdHJlYW1IYW5kbGUgJXAgZGVsZXRlIiwgdGhpcyk7Ci0gICAg
c3RvcFRocmVhZCgpOworICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7CiB9CiAKLU9wdGlvbmFs
PHNpemVfdD4gU29ja2V0U3RyZWFtSGFuZGxlSW1wbDo6cGxhdGZvcm1TZW5kSW50ZXJuYWwoY29u
c3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbmd0aCkKK3ZvaWQgU29ja2V0U3RyZWFtSGFuZGxl
SW1wbDo6cGxhdGZvcm1DbG9zZSgpCiB7Ci0gICAgTE9HKE5ldHdvcmssICJTb2NrZXRTdHJlYW1I
YW5kbGUgJXAgcGxhdGZvcm1TZW5kIiwgdGhpcyk7CiAgICAgQVNTRVJUKGlzTWFpblRocmVhZCgp
KTsKIAotICAgIGlmIChtX2hhc1BlbmRpbmdXcml0ZURhdGEpCi0gICAgICAgIHJldHVybiAwOwot
Ci0gICAgbV9oYXNQZW5kaW5nV3JpdGVEYXRhID0gdHJ1ZTsKKyAgICBpZiAobV9jdXJsU29ja2V0
U3RyZWFtSGFuZGxlKQorICAgICAgICBtX2N1cmxTb2NrZXRTdHJlYW1IYW5kbGUtPmNsb3NlKCk7
Cit9CiAKLSAgICBhdXRvIHdyaXRlQnVmZmVyID0gbWFrZVVuaXF1ZUFycmF5PHVpbnQ4X3Q+KGxl
bmd0aCk7Ci0gICAgbWVtY3B5KHdyaXRlQnVmZmVyLmdldCgpLCBkYXRhLCBsZW5ndGgpOworT3B0
aW9uYWw8c2l6ZV90PiBTb2NrZXRTdHJlYW1IYW5kbGVJbXBsOjpwbGF0Zm9ybVNlbmRJbnRlcm5h
bChjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuZ3RoKQoreworICAgIEFTU0VSVChpc01h
aW5UaHJlYWQoKSk7CiAKLSAgICBjYWxsT25Xb3JrZXJUaHJlYWQoW3RoaXMsIHdyaXRlQnVmZmVy
ID0gV1RGTW92ZSh3cml0ZUJ1ZmZlciksIHdyaXRlQnVmZmVyU2l6ZSA9IGxlbmd0aF0oKSBtdXRh
YmxlIHsKLSAgICAgICAgQVNTRVJUKCFpc01haW5UaHJlYWQoKSk7Ci0gICAgICAgIG1fd3JpdGVC
dWZmZXIgPSBXVEZNb3ZlKHdyaXRlQnVmZmVyKTsKLSAgICAgICAgbV93cml0ZUJ1ZmZlclNpemUg
PSB3cml0ZUJ1ZmZlclNpemU7Ci0gICAgICAgIG1fd3JpdGVCdWZmZXJPZmZzZXQgPSAwOwotICAg
IH0pOworICAgIGlmICghbV9jdXJsU29ja2V0U3RyZWFtSGFuZGxlKQorICAgICAgICByZXR1cm4g
V1RGOjpudWxsb3B0OwogCi0gICAgcmV0dXJuIGxlbmd0aDsKKyAgICByZXR1cm4gbV9jdXJsU29j
a2V0U3RyZWFtSGFuZGxlLT5zZW5kKGRhdGEsIGxlbmd0aCk7CiB9CiAKLXZvaWQgU29ja2V0U3Ry
ZWFtSGFuZGxlSW1wbDo6cGxhdGZvcm1DbG9zZSgpCit2b2lkIFNvY2tldFN0cmVhbUhhbmRsZUlt
cGw6OmN1cmxEaWRPcGVuU29ja2V0U3RyZWFtKCkKIHsKLSAgICBMT0coTmV0d29yaywgIlNvY2tl
dFN0cmVhbUhhbmRsZSAlcCBwbGF0Zm9ybUNsb3NlIiwgdGhpcyk7CiAgICAgQVNTRVJUKGlzTWFp
blRocmVhZCgpKTsKIAotICAgIGlmIChtX3N0YXRlID09IENsb3NlZCkKKyAgICBpZiAobV9zdGF0
ZSAhPSBDb25uZWN0aW5nKQogICAgICAgICByZXR1cm47Ci0gICAgbV9zdGF0ZSA9IENsb3NlZDsK
IAotICAgIHN0b3BUaHJlYWQoKTsKLSAgICBtX2NsaWVudC5kaWRDbG9zZVNvY2tldFN0cmVhbSgq
dGhpcyk7CisgICAgbV9zdGF0ZSA9IE9wZW47CisgICAgbV9jbGllbnQuZGlkT3BlblNvY2tldFN0
cmVhbSgqdGhpcyk7CiB9CiAKLXZvaWQgU29ja2V0U3RyZWFtSGFuZGxlSW1wbDo6dGhyZWFkRW50
cnlQb2ludChjb25zdCBVUkwmIHVybCkKK3ZvaWQgU29ja2V0U3RyZWFtSGFuZGxlSW1wbDo6Y3Vy
bERpZENsb3NlU29ja2V0U3RyZWFtKCkKIHsKLSAgICBBU1NFUlQoIWlzTWFpblRocmVhZCgpKTsK
LQotICAgIEN1cmxTb2NrZXRIYW5kbGUgc29ja2V0IHsgdXJsLCBbdGhpc10oQ1VSTGNvZGUgZXJy
b3JDb2RlKSB7Ci0gICAgICAgIGhhbmRsZUVycm9yKGVycm9yQ29kZSk7Ci0gICAgfX07CisgICAg
QVNTRVJUKGlzTWFpblRocmVhZCgpKTsKIAotICAgIC8vIENvbm5lY3QgdG8gaG9zdAotICAgIGlm
ICghc29ja2V0LmNvbm5lY3QoKSkKKyAgICBpZiAobV9zdGF0ZSA9PSBDbG9zZWQpCiAgICAgICAg
IHJldHVybjsKIAotICAgIGNhbGxPbk1haW5UaHJlYWQoW3RoaXMsIHByb3RlY3RlZFRoaXMgPSBt
YWtlUmVmKCp0aGlzKV0gewotICAgICAgICBpZiAobV9zdGF0ZSA9PSBDb25uZWN0aW5nKSB7Ci0g
ICAgICAgICAgICBtX3N0YXRlID0gT3BlbjsKLSAgICAgICAgICAgIG1fY2xpZW50LmRpZE9wZW5T
b2NrZXRTdHJlYW0oKnRoaXMpOwotICAgICAgICB9Ci0gICAgfSk7Ci0KLSAgICB3aGlsZSAobV9y
dW5uaW5nKSB7Ci0gICAgICAgIGV4ZWN1dGVUYXNrcygpOwotCi0gICAgICAgIGF1dG8gcmVzdWx0
ID0gc29ja2V0LndhaXQoMjBfbXMsIG1fd3JpdGVCdWZmZXIuZ2V0KCkpOwotICAgICAgICBpZiAo
IXJlc3VsdCkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIC8vIFRoZXNlIGxvZ2lj
IG9ubHkgcnVuIHdoZW4gdGhlcmUncyBkYXRhIHdhaXRpbmcuCi0gICAgICAgIGlmIChyZXN1bHQt
PndyaXRhYmxlICYmIG1fcnVubmluZykgewotICAgICAgICAgICAgYXV0byBieXRlc1NlbnQgPSBz
b2NrZXQuc2VuZChtX3dyaXRlQnVmZmVyLmdldCgpICsgbV93cml0ZUJ1ZmZlck9mZnNldCwgbV93
cml0ZUJ1ZmZlclNpemUgLSBtX3dyaXRlQnVmZmVyT2Zmc2V0KTsKLSAgICAgICAgICAgIG1fd3Jp
dGVCdWZmZXJPZmZzZXQgKz0gYnl0ZXNTZW50OwotCi0gICAgICAgICAgICBpZiAobV93cml0ZUJ1
ZmZlclNpemUgPD0gbV93cml0ZUJ1ZmZlck9mZnNldCkgewotICAgICAgICAgICAgICAgIG1fd3Jp
dGVCdWZmZXIgPSBudWxscHRyOwotICAgICAgICAgICAgICAgIG1fd3JpdGVCdWZmZXJTaXplID0g
MDsKLSAgICAgICAgICAgICAgICBtX3dyaXRlQnVmZmVyT2Zmc2V0ID0gMDsKLQotICAgICAgICAg
ICAgICAgIGNhbGxPbk1haW5UaHJlYWQoW3RoaXMsIHByb3RlY3RlZFRoaXMgPSBtYWtlUmVmKCp0
aGlzKV0gewotICAgICAgICAgICAgICAgICAgICBtX2hhc1BlbmRpbmdXcml0ZURhdGEgPSBmYWxz
ZTsKLSAgICAgICAgICAgICAgICAgICAgc2VuZFBlbmRpbmdEYXRhKCk7Ci0gICAgICAgICAgICAg
ICAgfSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocmVzdWx0LT5y
ZWFkYWJsZSAmJiBtX3J1bm5pbmcpIHsKLSAgICAgICAgICAgIGF1dG8gcmVhZEJ1ZmZlciA9IG1h
a2VVbmlxdWVBcnJheTx1aW50OF90PihrUmVhZEJ1ZmZlclNpemUpOwotICAgICAgICAgICAgYXV0
byBieXRlc1JlYWQgPSBzb2NrZXQucmVjZWl2ZShyZWFkQnVmZmVyLmdldCgpLCBrUmVhZEJ1ZmZl
clNpemUpOwotICAgICAgICAgICAgLy8gYG51bGxvcHRgIHJlc3VsdCBtZWFucyBub3RoaW5nIHRv
IGhhbmRsZSBhdCB0aGlzIG1vbWVudC4KLSAgICAgICAgICAgIGlmICghYnl0ZXNSZWFkKQotICAg
ICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICAvLyAwIGJ5dGVzIGluZGljYXRl
cyBhIGNsb3NlZCBjb25uZWN0aW9uLgotICAgICAgICAgICAgaWYgKCEqYnl0ZXNSZWFkKSB7Ci0g
ICAgICAgICAgICAgICAgbV9ydW5uaW5nID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgY2FsbE9u
TWFpblRocmVhZChbdGhpcywgcHJvdGVjdGVkVGhpcyA9IG1ha2VSZWYoKnRoaXMpXSB7Ci0gICAg
ICAgICAgICAgICAgICAgIGNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAg
ICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhbGxPbk1haW5UaHJl
YWQoW3RoaXMsIHByb3RlY3RlZFRoaXMgPSBtYWtlUmVmKCp0aGlzKSwgYnVmZmVyID0gV1RGTW92
ZShyZWFkQnVmZmVyKSwgc2l6ZSA9ICpieXRlc1JlYWQgXSB7Ci0gICAgICAgICAgICAgICAgaWYg
KG1fc3RhdGUgPT0gT3BlbikKLSAgICAgICAgICAgICAgICAgICAgbV9jbGllbnQuZGlkUmVjZWl2
ZVNvY2tldFN0cmVhbURhdGEoKnRoaXMsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGJ1
ZmZlci5nZXQoKSksIHNpemUpOwotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLSAgICB9Ci0K
LSAgICBtX3dyaXRlQnVmZmVyID0gbnVsbHB0cjsKKyAgICBtX3N0YXRlID0gQ2xvc2VkOworICAg
IG1fY2xpZW50LmRpZENsb3NlU29ja2V0U3RyZWFtKCp0aGlzKTsKIH0KIAotdm9pZCBTb2NrZXRT
dHJlYW1IYW5kbGVJbXBsOjpoYW5kbGVFcnJvcihDVVJMY29kZSBlcnJvckNvZGUpCit2b2lkIFNv
Y2tldFN0cmVhbUhhbmRsZUltcGw6OmN1cmxEaWRTZW5kU29ja2V0U3RyZWFtRGF0YSgpCiB7Ci0g
ICAgbV9ydW5uaW5nID0gZmFsc2U7Ci0gICAgY2FsbE9uTWFpblRocmVhZChbdGhpcywgcHJvdGVj
dGVkVGhpcyA9IG1ha2VSZWYoKnRoaXMpLCBlcnJvckNvZGUsIGxvY2FsaXplZERlc2NyaXB0aW9u
ID0gQ3VybEhhbmRsZTo6ZXJyb3JEZXNjcmlwdGlvbihlcnJvckNvZGUpLmlzb2xhdGVkQ29weSgp
XSB7Ci0gICAgICAgIGlmIChtX3N0YXRlID09IENsb3NlZCkKLSAgICAgICAgICAgIHJldHVybjsK
LQotICAgICAgICBpZiAoZXJyb3JDb2RlID09IENVUkxFX1JFQ1ZfRVJST1IpCi0gICAgICAgICAg
ICBtX2NsaWVudC5kaWRGYWlsVG9SZWNlaXZlU29ja2V0U3RyZWFtRGF0YSgqdGhpcyk7Ci0gICAg
ICAgIGVsc2UKLSAgICAgICAgICAgIG1fY2xpZW50LmRpZEZhaWxTb2NrZXRTdHJlYW0oKnRoaXMs
IFNvY2tldFN0cmVhbUVycm9yKHN0YXRpY19jYXN0PGludD4oZXJyb3JDb2RlKSwgeyB9LCBsb2Nh
bGl6ZWREZXNjcmlwdGlvbikpOwotICAgIH0pOworICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7
CisKKyAgICBzZW5kUGVuZGluZ0RhdGEoKTsKIH0KIAotdm9pZCBTb2NrZXRTdHJlYW1IYW5kbGVJ
bXBsOjpzdG9wVGhyZWFkKCkKK3ZvaWQgU29ja2V0U3RyZWFtSGFuZGxlSW1wbDo6Y3VybERpZFJl
Y2VpdmVTb2NrZXRTdHJlYW1EYXRhKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBsZW5ndGgpCiB7
CiAgICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKIAotICAgIG1fcnVubmluZyA9IGZhbHNlOwor
ICAgIGlmIChtX3N0YXRlICE9IE9wZW4pCisgICAgICAgIHJldHVybjsKIAotICAgIGlmIChtX3dv
cmtlclRocmVhZCkgewotICAgICAgICBtX3dvcmtlclRocmVhZC0+d2FpdEZvckNvbXBsZXRpb24o
KTsKLSAgICAgICAgbV93b3JrZXJUaHJlYWQgPSBudWxscHRyOwotICAgIH0KKyAgICBtX2NsaWVu
dC5kaWRSZWNlaXZlU29ja2V0U3RyZWFtRGF0YSgqdGhpcywgZGF0YSwgbGVuZ3RoKTsKIH0KIAot
dm9pZCBTb2NrZXRTdHJlYW1IYW5kbGVJbXBsOjpjYWxsT25Xb3JrZXJUaHJlYWQoRnVuY3Rpb248
dm9pZCgpPiYmIHRhc2spCit2b2lkIFNvY2tldFN0cmVhbUhhbmRsZUltcGw6OmN1cmxEaWRGYWls
VG9SZWNlaXZlU29ja2V0U3RyZWFtRGF0YSgpCiB7CiAgICAgQVNTRVJUKGlzTWFpblRocmVhZCgp
KTsKLSAgICBtX3Rhc2tRdWV1ZS5hcHBlbmQobWFrZVVuaXF1ZTxGdW5jdGlvbjx2b2lkKCk+PihX
VEZNb3ZlKHRhc2spKSk7CisKKyAgICBpZiAobV9zdGF0ZSA9PSBDbG9zZWQpCisgICAgICAgIHJl
dHVybjsKKworICAgIG1fY2xpZW50LmRpZEZhaWxUb1JlY2VpdmVTb2NrZXRTdHJlYW1EYXRhKCp0
aGlzKTsKIH0KIAotdm9pZCBTb2NrZXRTdHJlYW1IYW5kbGVJbXBsOjpleGVjdXRlVGFza3MoKQor
dm9pZCBTb2NrZXRTdHJlYW1IYW5kbGVJbXBsOjpjdXJsRGlkRmFpbFNvY2tldFN0cmVhbShTb2Nr
ZXRTdHJlYW1FcnJvciYmIGVycm9yKQogewotICAgIEFTU0VSVCghaXNNYWluVGhyZWFkKCkpOwor
ICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7CisKKyAgICBpZiAobV9zdGF0ZSA9PSBDbG9zZWQp
CisgICAgICAgIHJldHVybjsKIAotICAgIGF1dG8gdGFza3MgPSBtX3Rhc2tRdWV1ZS50YWtlQWxs
TWVzc2FnZXMoKTsKLSAgICBmb3IgKGF1dG8mIHRhc2sgOiB0YXNrcykKLSAgICAgICAgKCp0YXNr
KSgpOworICAgIG1fY2xpZW50LmRpZEZhaWxTb2NrZXRTdHJlYW0oKnRoaXMsIGVycm9yKTsKIH0K
IAogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>389232</attachid>
            <date>2020-01-30 00:28:41 -0800</date>
            <delta_ts>2020-02-05 05:40:23 -0800</delta_ts>
            <desc>Handling connections by one thread.</desc>
            <filename>shukuwa-patch-0130.0.diff</filename>
            <type>text/plain</type>
            <size>36504</size>
            <attacher name="Takashi Komori">takashi.komori</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL0N1cmwuY21ha2UgYi9Tb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9DdXJsLmNtYWtlCmluZGV4IGY2ODk0YWMzZWY0Li5lZGRiNWZhYzJm
MyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vQ3VybC5jbWFrZQorKysgYi9T
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9DdXJsLmNtYWtlCkBAIC0yMiw2ICsyMiw4IEBAIGxpc3Qo
QVBQRU5EIFdlYkNvcmVfU09VUkNFUwogICAgIHBsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsUmVz
b3VyY2VIYW5kbGVEZWxlZ2F0ZS5jcHAKICAgICBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybFNT
TEhhbmRsZS5jcHAKICAgICBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybFNTTFZlcmlmaWVyLmNw
cAorICAgIHBsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsU3RyZWFtLmNwcAorICAgIHBsYXRmb3Jt
L25ldHdvcmsvY3VybC9DdXJsU3RyZWFtU2NoZWR1bGVyLmNwcAogICAgIHBsYXRmb3JtL25ldHdv
cmsvY3VybC9ETlNSZXNvbHZlUXVldWVDdXJsLmNwcAogICAgIHBsYXRmb3JtL25ldHdvcmsvY3Vy
bC9OZXR3b3JrU3RvcmFnZVNlc3Npb25DdXJsLmNwcAogICAgIHBsYXRmb3JtL25ldHdvcmsvY3Vy
bC9PcGVuU1NMSGVscGVyLmNwcApAQCAtNTgsNiArNjAsOCBAQCBsaXN0KEFQUEVORCBXZWJDb3Jl
X1BSSVZBVEVfRlJBTUVXT1JLX0hFQURFUlMKICAgICBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3Vy
bFJlc3BvbnNlLmgKICAgICBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybFNTTEhhbmRsZS5oCiAg
ICAgcGxhdGZvcm0vbmV0d29yay9jdXJsL0N1cmxTU0xWZXJpZmllci5oCisgICAgcGxhdGZvcm0v
bmV0d29yay9jdXJsL0N1cmxTdHJlYW0uaAorICAgIHBsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJs
U3RyZWFtU2NoZWR1bGVyLmgKICAgICBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvRE5TUmVzb2x2ZVF1
ZXVlQ3VybC5oCiAgICAgcGxhdGZvcm0vbmV0d29yay9jdXJsL0Rvd25sb2FkQnVuZGxlLmgKICAg
ICBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvT3BlblNTTEhlbHBlci5oCmRpZmYgLS1naXQgYS9Tb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybENvbnRleHQuY3BwIGIvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0N1cmxDb250ZXh0LmNwcAppbmRleCA3YjA0
ZmEyNmE0Mi4uZTRjNzYwNjY1YTQgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L25ldHdvcmsvY3VybC9DdXJsQ29udGV4dC5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vbmV0d29yay9jdXJsL0N1cmxDb250ZXh0LmNwcApAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1
ZGUgIkN1cmxSZXF1ZXN0U2NoZWR1bGVyLmgiCiAjaW5jbHVkZSAiQ3VybFNTTEhhbmRsZS5oIgog
I2luY2x1ZGUgIkN1cmxTU0xWZXJpZmllci5oIgorI2luY2x1ZGUgIkN1cmxTdHJlYW1TY2hlZHVs
ZXIuaCIKICNpbmNsdWRlICJIVFRQSGVhZGVyTWFwLmgiCiAjaW5jbHVkZSA8TmV0d29ya0xvYWRN
ZXRyaWNzLmg+CiAjaW5jbHVkZSA8bXV0ZXg+CkBAIC0xNDYsNiArMTQ3LDEyIEBAIHZvaWQgQ3Vy
bENvbnRleHQ6OmluaXRTaGFyZUhhbmRsZSgpCiAgICAgY3VybF9lYXN5X2NsZWFudXAoY3VybCk7
CiB9CiAKK0N1cmxTdHJlYW1TY2hlZHVsZXImIEN1cmxDb250ZXh0OjpzdHJlYW1TY2hlZHVsZXIo
KQoreworICAgIHN0YXRpYyBOZXZlckRlc3Ryb3llZDxDdXJsU3RyZWFtU2NoZWR1bGVyPiBzaGFy
ZWRJbnN0YW5jZTsKKyAgICByZXR1cm4gc2hhcmVkSW5zdGFuY2U7Cit9CisKIGJvb2wgQ3VybENv
bnRleHQ6OmlzSHR0cDJFbmFibGVkKCkgY29uc3QKIHsKICAgICBjdXJsX3ZlcnNpb25faW5mb19k
YXRhKiBkYXRhID0gY3VybF92ZXJzaW9uX2luZm8oQ1VSTFZFUlNJT05fTk9XKTsKQEAgLTg4Nywx
MTQgKzg5NCwyNSBAQCB2b2lkIEN1cmxIYW5kbGU6OmVuYWJsZVN0ZEVycklmVXNlZCgpCiAKICNl
bmRpZgogCi0vLyBDdXJsU29ja2V0SGFuZGxlCi0KLUN1cmxTb2NrZXRIYW5kbGU6OkN1cmxTb2Nr
ZXRIYW5kbGUoY29uc3QgVVJMJiB1cmwsIEZ1bmN0aW9uPHZvaWQoQ1VSTGNvZGUpPiYmIGVycm9y
SGFuZGxlcikKLSAgICA6IG1fZXJyb3JIYW5kbGVyKFdURk1vdmUoZXJyb3JIYW5kbGVyKSkKK0V4
cGVjdGVkPGN1cmxfc29ja2V0X3QsIENVUkxjb2RlPiBDdXJsSGFuZGxlOjpnZXRBY3RpdmVTb2Nr
ZXQoKQogewotICAgIC8vIExpYmN1cmwgaXMgbm90IHJlc3BvbnNpYmxlIGZvciB0aGUgcHJvdG9j
b2wgaGFuZGxpbmcuIEl0IGp1c3QgaGFuZGxlcyBjb25uZWN0aW9uLgotICAgIC8vIE9ubHkgc2No
ZW1lLCBob3N0IGFuZCBwb3J0IGlzIHJlcXVpcmVkLgotICAgIFVSTCB1cmxGb3JDb25uZWN0aW9u
OwotICAgIHVybEZvckNvbm5lY3Rpb24uc2V0UHJvdG9jb2wodXJsLnByb3RvY29sSXMoIndzcyIp
ID8gImh0dHBzIiA6ICJodHRwIik7Ci0gICAgdXJsRm9yQ29ubmVjdGlvbi5zZXRIb3N0QW5kUG9y
dCh1cmwuaG9zdEFuZFBvcnQoKSk7Ci0gICAgc2V0VXJsKHVybEZvckNvbm5lY3Rpb24pOwotCi0g
ICAgZW5hYmxlQ29ubmVjdGlvbk9ubHkoKTsKLX0KKyAgICBjdXJsX3NvY2tldF90IHNvY2tldDsK
IAotYm9vbCBDdXJsU29ja2V0SGFuZGxlOjpjb25uZWN0KCkKLXsKLSAgICBDVVJMY29kZSBlcnJv
ckNvZGUgPSBwZXJmb3JtKCk7Ci0gICAgaWYgKGVycm9yQ29kZSAhPSBDVVJMRV9PSykgewotICAg
ICAgICBtX2Vycm9ySGFuZGxlcihlcnJvckNvZGUpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0g
ICAgfQorICAgIENVUkxjb2RlIGVycm9yQ29kZSA9IGN1cmxfZWFzeV9nZXRpbmZvKG1faGFuZGxl
LCBDVVJMSU5GT19BQ1RJVkVTT0NLRVQsICZzb2NrZXQpOworICAgIGlmIChlcnJvckNvZGUgIT0g
Q1VSTEVfT0spCisgICAgICAgIHJldHVybiBtYWtlVW5leHBlY3RlZChlcnJvckNvZGUpOwogCi0g
ICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIHNvY2tldDsKIH0KIAotc2l6ZV90IEN1cmxTb2Nr
ZXRIYW5kbGU6OnNlbmQoY29uc3QgdWludDhfdCogYnVmZmVyLCBzaXplX3Qgc2l6ZSkKK0NVUkxj
b2RlIEN1cmxIYW5kbGU6OnNlbmQoY29uc3QgdWludDhfdCogYnVmZmVyLCBzaXplX3QgYnVmZmVy
U2l6ZSwgc2l6ZV90JiBieXRlc1NlbnQpCiB7Ci0gICAgc2l6ZV90IHRvdGFsQnl0ZXNTZW50ID0g
MDsKLQotICAgIHdoaWxlICh0b3RhbEJ5dGVzU2VudCA8IHNpemUpIHsKLSAgICAgICAgc2l6ZV90
IGJ5dGVzU2VudCA9IDA7Ci0gICAgICAgIENVUkxjb2RlIGVycm9yQ29kZSA9IGN1cmxfZWFzeV9z
ZW5kKGhhbmRsZSgpLCBidWZmZXIgKyB0b3RhbEJ5dGVzU2VudCwgc2l6ZSAtIHRvdGFsQnl0ZXNT
ZW50LCAmYnl0ZXNTZW50KTsKLSAgICAgICAgaWYgKGVycm9yQ29kZSAhPSBDVVJMRV9PSykgewot
ICAgICAgICAgICAgaWYgKGVycm9yQ29kZSAhPSBDVVJMRV9BR0FJTikKLSAgICAgICAgICAgICAg
ICBtX2Vycm9ySGFuZGxlcihlcnJvckNvZGUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAg
IH0KLQotICAgICAgICB0b3RhbEJ5dGVzU2VudCArPSBieXRlc1NlbnQ7Ci0gICAgfQotCi0gICAg
cmV0dXJuIHRvdGFsQnl0ZXNTZW50OworICAgIHJldHVybiBjdXJsX2Vhc3lfc2VuZChtX2hhbmRs
ZSwgYnVmZmVyLCBidWZmZXJTaXplLCAmYnl0ZXNTZW50KTsKIH0KIAotT3B0aW9uYWw8c2l6ZV90
PiBDdXJsU29ja2V0SGFuZGxlOjpyZWNlaXZlKHVpbnQ4X3QqIGJ1ZmZlciwgc2l6ZV90IGJ1ZmZl
clNpemUpCitDVVJMY29kZSBDdXJsSGFuZGxlOjpyZWNlaXZlKHVpbnQ4X3QqIGJ1ZmZlciwgc2l6
ZV90IGJ1ZmZlclNpemUsIHNpemVfdCYgYnl0ZXNSZWFkKQogewotICAgIHNpemVfdCBieXRlc1Jl
YWQgPSAwOwotCi0gICAgQ1VSTGNvZGUgZXJyb3JDb2RlID0gY3VybF9lYXN5X3JlY3YoaGFuZGxl
KCksIGJ1ZmZlciwgYnVmZmVyU2l6ZSwgJmJ5dGVzUmVhZCk7Ci0gICAgaWYgKGVycm9yQ29kZSAh
PSBDVVJMRV9PSykgewotICAgICAgICBpZiAoZXJyb3JDb2RlICE9IENVUkxFX0FHQUlOKQotICAg
ICAgICAgICAgbV9lcnJvckhhbmRsZXIoZXJyb3JDb2RlKTsKLQotICAgICAgICByZXR1cm4gV1RG
OjpudWxsb3B0OwotICAgIH0KLQotICAgIHJldHVybiBieXRlc1JlYWQ7Ci19Ci0KLU9wdGlvbmFs
PEN1cmxTb2NrZXRIYW5kbGU6OldhaXRSZXN1bHQ+IEN1cmxTb2NrZXRIYW5kbGU6OndhaXQoY29u
c3QgU2Vjb25kcyYgdGltZW91dCwgYm9vbCBhbHNvV2FpdEZvcldyaXRlKQotewotICAgIGN1cmxf
c29ja2V0X3Qgc29ja2V0OwotICAgIENVUkxjb2RlIGVycm9yQ29kZSA9IGN1cmxfZWFzeV9nZXRp
bmZvKGhhbmRsZSgpLCBDVVJMSU5GT19BQ1RJVkVTT0NLRVQsICZzb2NrZXQpOwotICAgIGlmIChl
cnJvckNvZGUgIT0gQ1VSTEVfT0spIHsKLSAgICAgICAgbV9lcnJvckhhbmRsZXIoZXJyb3JDb2Rl
KTsKLSAgICAgICAgcmV0dXJuIFdURjo6bnVsbG9wdDsKLSAgICB9Ci0KLSAgICBpbnQ2NF90IHVz
ZWMgPSB0aW1lb3V0Lm1pY3Jvc2Vjb25kc0FzPGludDY0X3Q+KCk7Ci0KLSAgICBzdHJ1Y3QgdGlt
ZXZhbCBzZWxlY3RUaW1lb3V0OwotICAgIGlmICh1c2VjIDw9IDApIHsKLSAgICAgICAgc2VsZWN0
VGltZW91dC50dl9zZWMgPSAwOwotICAgICAgICBzZWxlY3RUaW1lb3V0LnR2X3VzZWMgPSAwOwot
ICAgIH0gZWxzZSB7Ci0gICAgICAgIHNlbGVjdFRpbWVvdXQudHZfc2VjID0gdXNlYyAvIDEwMDAw
MDA7Ci0gICAgICAgIHNlbGVjdFRpbWVvdXQudHZfdXNlYyA9IHVzZWMgJSAxMDAwMDAwOwotICAg
IH0KLQotICAgIGludCByYyA9IDA7Ci0gICAgaW50IG1heGZkID0gc3RhdGljX2Nhc3Q8aW50Pihz
b2NrZXQpICsgMTsKLSAgICBmZF9zZXQgZmRyZWFkOwotICAgIGZkX3NldCBmZHdyaXRlOwotICAg
IGZkX3NldCBmZGVycjsKLQotICAgIC8vIFJldHJ5ICdzZWxlY3QnIGlmIGl0IHdhcyBpbnRlcnJ1
cHRlZCBieSBhIHByb2Nlc3Mgc2lnbmFsLgotICAgIGRvIHsKLSAgICAgICAgRkRfWkVSTygmZmRy
ZWFkKTsKLSAgICAgICAgRkRfU0VUKHNvY2tldCwgJmZkcmVhZCk7Ci0KLSAgICAgICAgRkRfWkVS
TygmZmR3cml0ZSk7Ci0gICAgICAgIGlmIChhbHNvV2FpdEZvcldyaXRlKQotICAgICAgICAgICAg
RkRfU0VUKHNvY2tldCwgJmZkd3JpdGUpOwotCi0gICAgICAgIEZEX1pFUk8oJmZkZXJyKTsKLSAg
ICAgICAgRkRfU0VUKHNvY2tldCwgJmZkZXJyKTsKLQotICAgICAgICByYyA9IDo6c2VsZWN0KG1h
eGZkLCAmZmRyZWFkLCAmZmR3cml0ZSwgJmZkZXJyLCAmc2VsZWN0VGltZW91dCk7Ci0gICAgfSB3
aGlsZSAocmMgPT0gLTEgJiYgZXJybm8gPT0gRUlOVFIpOwotCi0gICAgaWYgKHJjIDw9IDApCi0g
ICAgICAgIHJldHVybiBXVEY6Om51bGxvcHQ7Ci0KLSAgICBXYWl0UmVzdWx0IHJlc3VsdDsKLSAg
ICByZXN1bHQucmVhZGFibGUgPSBGRF9JU1NFVChzb2NrZXQsICZmZHJlYWQpIHx8IEZEX0lTU0VU
KHNvY2tldCwgJmZkZXJyKTsKLSAgICByZXN1bHQud3JpdGFibGUgPSBGRF9JU1NFVChzb2NrZXQs
ICZmZHdyaXRlKTsKLSAgICByZXR1cm4gcmVzdWx0OworICAgIHJldHVybiBjdXJsX2Vhc3lfcmVj
dihtX2hhbmRsZSwgYnVmZmVyLCBidWZmZXJTaXplLCAmYnl0ZXNSZWFkKTsKIH0KIAogfQpkaWZm
IC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0N1cmxDb250ZXh0
LmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybENvbnRleHQuaApp
bmRleCBhNGY4YzAyODI3Ni4uM2M5MGU0YjFlY2MgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsQ29udGV4dC5oCisrKyBiL1NvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsQ29udGV4dC5oCkBAIC04OSw2ICs4OSw3IEBAIHBy
aXZhdGU6CiAvLyBDdXJsQ29udGV4dCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLQogCiBjbGFzcyBDdXJsUmVxdWVzdFNjaGVkdWxlcjsKK2NsYXNzIEN1cmxTdHJl
YW1TY2hlZHVsZXI7CiAKIGNsYXNzIEN1cmxDb250ZXh0IDogcHVibGljIEN1cmxHbG9iYWwgewog
ICAgIFdURl9NQUtFX05PTkNPUFlBQkxFKEN1cmxDb250ZXh0KTsKQEAgLTEwMSw2ICsxMDIsNyBA
QCBwdWJsaWM6CiAgICAgY29uc3QgQ3VybFNoYXJlSGFuZGxlJiBzaGFyZUhhbmRsZSgpIHsgcmV0
dXJuIG1fc2hhcmVIYW5kbGU7IH0KIAogICAgIEN1cmxSZXF1ZXN0U2NoZWR1bGVyJiBzY2hlZHVs
ZXIoKSB7IHJldHVybiAqbV9zY2hlZHVsZXI7IH0KKyAgICBDdXJsU3RyZWFtU2NoZWR1bGVyJiBz
dHJlYW1TY2hlZHVsZXIoKTsKIAogICAgIC8vIFByb3h5CiAgICAgY29uc3QgQ3VybFByb3h5U2V0
dGluZ3MmIHByb3h5U2V0dGluZ3MoKSBjb25zdCB7IHJldHVybiBtX3Byb3h5U2V0dGluZ3M7IH0K
QEAgLTI5Myw2ICsyOTUsMTEgQEAgcHVibGljOgogCiAgICAgc3RhdGljIGxvbmcgbG9uZyBtYXhD
dXJsT2ZmVCgpOwogCisgICAgLy8gc29ja2V0CisgICAgRXhwZWN0ZWQ8Y3VybF9zb2NrZXRfdCwg
Q1VSTGNvZGU+IGdldEFjdGl2ZVNvY2tldCgpOworICAgIENVUkxjb2RlIHNlbmQoY29uc3QgdWlu
dDhfdCosIHNpemVfdCwgc2l6ZV90Jik7CisgICAgQ1VSTGNvZGUgcmVjZWl2ZSh1aW50OF90Kiwg
c2l6ZV90LCBzaXplX3QmKTsKKwogI2lmbmRlZiBOREVCVUcKICAgICB2b2lkIGVuYWJsZVZlcmJv
c2VJZlVzZWQoKTsKICAgICB2b2lkIGVuYWJsZVN0ZEVycklmVXNlZCgpOwpAQCAtMzEzLDI0ICsz
MjAsNCBAQCBwcml2YXRlOgogICAgIHN0ZDo6dW5pcXVlX3B0cjxDdXJsU1NMVmVyaWZpZXI+IG1f
c3NsVmVyaWZpZXI7CiB9OwogCi1jbGFzcyBDdXJsU29ja2V0SGFuZGxlIDogcHVibGljIEN1cmxI
YW5kbGUgewotICAgIFdURl9NQUtFX05PTkNPUFlBQkxFKEN1cmxTb2NrZXRIYW5kbGUpOwotCi1w
dWJsaWM6Ci0gICAgc3RydWN0IFdhaXRSZXN1bHQgewotICAgICAgICBib29sIHJlYWRhYmxlIHsg
ZmFsc2UgfTsKLSAgICAgICAgYm9vbCB3cml0YWJsZSB7IGZhbHNlIH07Ci0gICAgfTsKLQotICAg
IEN1cmxTb2NrZXRIYW5kbGUoY29uc3QgVVJMJiwgRnVuY3Rpb248dm9pZChDVVJMY29kZSk+JiYg
ZXJyb3JIYW5kbGVyKTsKLQotICAgIGJvb2wgY29ubmVjdCgpOwotICAgIHNpemVfdCBzZW5kKGNv
bnN0IHVpbnQ4X3QqLCBzaXplX3QpOwotICAgIE9wdGlvbmFsPHNpemVfdD4gcmVjZWl2ZSh1aW50
OF90Kiwgc2l6ZV90KTsKLSAgICBPcHRpb25hbDxXYWl0UmVzdWx0PiB3YWl0KGNvbnN0IFNlY29u
ZHMmIHRpbWVvdXQsIGJvb2wgYWxzb1dhaXRGb3JXcml0ZSk7Ci0KLXByaXZhdGU6Ci0gICAgRnVu
Y3Rpb248dm9pZChDVVJMY29kZSk+IG1fZXJyb3JIYW5kbGVyOwotfTsKLQogfSAvLyBuYW1lc3Bh
Y2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9j
dXJsL0N1cmxTdHJlYW0uY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJs
L0N1cmxTdHJlYW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi45
MWZmMWU5NGQ5NgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25l
dHdvcmsvY3VybC9DdXJsU3RyZWFtLmNwcApAQCAtMCwwICsxLDIxMiBAQAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAyMCBTb255IEludGVyYWN0aXZlIEVudGVydGFpbm1lbnQgSW5jLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElU
UyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElO
Qy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YK
KyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
CisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisg
Ki8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkN1cmxTdHJlYW0uaCIKKworI2lu
Y2x1ZGUgIkN1cmxTdHJlYW1TY2hlZHVsZXIuaCIKKyNpbmNsdWRlICJTb2NrZXRTdHJlYW1FcnJv
ci5oIgorCisjaWYgVVNFKENVUkwpCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworQ3VybFN0cmVh
bTo6Q3VybFN0cmVhbShDdXJsU3RyZWFtU2NoZWR1bGVyJiBzY2hlZHVsZXIsIEN1cmxTdHJlYW1J
RCBzdHJlYW1JRCwgVVJMJiYgdXJsKQorICAgIDogbV9zY2hlZHVsZXIoc2NoZWR1bGVyKQorICAg
ICwgbV9zdHJlYW1JRChzdHJlYW1JRCkKKyAgICAsIG1fdXJsKFdURk1vdmUodXJsKSkKK3sKKyAg
ICBBU1NFUlQoIWlzTWFpblRocmVhZCgpKTsKKworICAgIG1fY3VybEhhbmRsZSA9IFdURjo6bWFr
ZVVuaXF1ZTxDdXJsSGFuZGxlPigpOworCisgICAgLy8gTGliY3VybCBpcyBub3QgcmVzcG9uc2li
bGUgZm9yIHRoZSBwcm90b2NvbCBoYW5kbGluZy4gSXQganVzdCBoYW5kbGVzIGNvbm5lY3Rpb24u
CisgICAgLy8gT25seSBzY2hlbWUsIGhvc3QgYW5kIHBvcnQgaXMgcmVxdWlyZWQuCisgICAgVVJM
IHVybEZvckNvbm5lY3Rpb247CisgICAgdXJsRm9yQ29ubmVjdGlvbi5zZXRQcm90b2NvbChtX3Vy
bC5wcm90b2NvbElzKCJ3c3MiKSA/ICJodHRwcyIgOiAiaHR0cCIpOworICAgIHVybEZvckNvbm5l
Y3Rpb24uc2V0SG9zdEFuZFBvcnQobV91cmwuaG9zdEFuZFBvcnQoKSk7CisgICAgbV9jdXJsSGFu
ZGxlLT5zZXRVcmwodXJsRm9yQ29ubmVjdGlvbik7CisKKyAgICBtX2N1cmxIYW5kbGUtPmVuYWJs
ZUNvbm5lY3Rpb25Pbmx5KCk7CisKKyAgICBhdXRvIGVycm9yQ29kZSA9IG1fY3VybEhhbmRsZS0+
cGVyZm9ybSgpOworICAgIGlmIChlcnJvckNvZGUgIT0gQ1VSTEVfT0spIHsKKyAgICAgICAgbm90
aWZ5RmFpbFdpdGhFcnJvcihlcnJvckNvZGUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisg
ICAgY2FsbENsaWVudChbXShDbGllbnQmIGNsaWVudCkgeworICAgICAgICBBU1NFUlQoaXNNYWlu
VGhyZWFkKCkpOworICAgICAgICBjbGllbnQuZGlkT3BlbigpOworICAgIH0pOworfQorCitDdXJs
U3RyZWFtOjp+Q3VybFN0cmVhbSgpCit7CisgICAgQVNTRVJUKCFpc01haW5UaHJlYWQoKSk7Cisg
ICAgZGVzdHJveUhhbmRsZSgpOworfQorCit2b2lkIEN1cmxTdHJlYW06OmRlc3Ryb3lIYW5kbGUo
KQoreworICAgIEFTU0VSVCghaXNNYWluVGhyZWFkKCkpOworCisgICAgaWYgKCFtX2N1cmxIYW5k
bGUpCisgICAgICAgIHJldHVybjsKKworICAgIG1fY3VybEhhbmRsZSA9IG51bGxwdHI7Cit9CisK
K3ZvaWQgQ3VybFN0cmVhbTo6c2VuZChVbmlxdWVBcnJheTx1aW50OF90PiYmIGJ1ZmZlciwgc2l6
ZV90IGxlbmd0aCkKK3sKKyAgICBBU1NFUlQoIWlzTWFpblRocmVhZCgpKTsKKyAgICBBU1NFUlQo
IW1fd3JpdGVCdWZmZXIpOworCisgICAgaWYgKCFtX2N1cmxIYW5kbGUgfHwgbV93cml0ZUJ1ZmZl
cikKKyAgICAgICAgcmV0dXJuOworCisgICAgbV93cml0ZUJ1ZmZlciA9IFdURk1vdmUoYnVmZmVy
KTsKKyAgICBtX3dyaXRlQnVmZmVyU2l6ZSA9IGxlbmd0aDsKKyAgICBtX3dyaXRlQnVmZmVyT2Zm
c2V0ID0gMDsKK30KKwordm9pZCBDdXJsU3RyZWFtOjphcHBlbmRNb25pdG9yaW5nRmQoZmRfc2V0
JiByZWFkZmRzLCBmZF9zZXQmIHdyaXRlZmRzLCBmZF9zZXQmIGV4Y2VwdGZkcywgaW50JiBtYXhm
ZCkKK3sKKyAgICBpZiAoIW1fY3VybEhhbmRsZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgYXV0
byBzb2NrZXQgPSBtX2N1cmxIYW5kbGUtPmdldEFjdGl2ZVNvY2tldCgpOworICAgIGlmICghc29j
a2V0Lmhhc192YWx1ZSgpKSB7CisgICAgICAgIG5vdGlmeUZhaWxXaXRoRXJyb3Ioc29ja2V0LmVy
cm9yKCkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgRkRfU0VUKCpzb2NrZXQsICZy
ZWFkZmRzKTsKKyAgICBGRF9TRVQoKnNvY2tldCwgJmV4Y2VwdGZkcyk7CisKKyAgICBpZiAobV93
cml0ZUJ1ZmZlcikKKyAgICAgICAgRkRfU0VUKCpzb2NrZXQsICZ3cml0ZWZkcyk7CisKKyAgICBp
ZiAobWF4ZmQgPCAqc29ja2V0KQorICAgICAgICBtYXhmZCA9ICpzb2NrZXQ7Cit9CisKK3ZvaWQg
Q3VybFN0cmVhbTo6dHJ5VG9UcmFuc2Zlcihjb25zdCBmZF9zZXQmIHJlYWRmZHMsIGNvbnN0IGZk
X3NldCYgd3JpdGVmZHMsIGNvbnN0IGZkX3NldCYgZXhjZXB0ZmRzKQoreworICAgIGlmICghbV9j
dXJsSGFuZGxlKQorICAgICAgICByZXR1cm47CisKKyAgICBhdXRvIHNvY2tldCA9IG1fY3VybEhh
bmRsZS0+Z2V0QWN0aXZlU29ja2V0KCk7CisgICAgaWYgKCFzb2NrZXQuaGFzX3ZhbHVlKCkpIHsK
KyAgICAgICAgbm90aWZ5RmFpbFdpdGhFcnJvcihzb2NrZXQuZXJyb3IoKSk7CisgICAgICAgIHJl
dHVybjsKKyAgICB9CisKKyAgICBpZiAoRkRfSVNTRVQoKnNvY2tldCwgJnJlYWRmZHMpIHx8IEZE
X0lTU0VUKCpzb2NrZXQsICZleGNlcHRmZHMpKQorICAgICAgICB0cnlUb1JlYWQoKTsKKworICAg
IGlmIChGRF9JU1NFVCgqc29ja2V0LCAmd3JpdGVmZHMpKQorICAgICAgICB0cnlUb1dyaXRlKCk7
Cit9CisKK3ZvaWQgQ3VybFN0cmVhbTo6dHJ5VG9SZWFkKCkKK3sKKyAgICBBU1NFUlQoIWlzTWFp
blRocmVhZCgpKTsKKworICAgIGlmICghbV9jdXJsSGFuZGxlKQorICAgICAgICByZXR1cm47CisK
KyAgICBhdXRvIHJlYWRCdWZmZXIgPSBtYWtlVW5pcXVlQXJyYXk8dWludDhfdD4oa1JlYWRCdWZm
ZXJTaXplKTsKKyAgICBzaXplX3QgYnl0ZXNSZWFkID0gMDsKKworICAgIGF1dG8gZXJyb3JDb2Rl
ID0gbV9jdXJsSGFuZGxlLT5yZWNlaXZlKHJlYWRCdWZmZXIuZ2V0KCksIGtSZWFkQnVmZmVyU2l6
ZSwgYnl0ZXNSZWFkKTsKKyAgICBpZiAoZXJyb3JDb2RlICE9IENVUkxFX09LKSB7CisgICAgICAg
IGlmIChlcnJvckNvZGUgIT0gQ1VSTEVfQUdBSU4pCisgICAgICAgICAgICBub3RpZnlGYWlsV2l0
aEVycm9yKGVycm9yQ29kZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyAwIGJ5
dGVzIGluZGljYXRlcyBhIGNsb3NlZCBjb25uZWN0aW9uLgorICAgIGlmICghYnl0ZXNSZWFkKQor
ICAgICAgICBkZXN0cm95SGFuZGxlKCk7CisKKyAgICBjYWxsQ2xpZW50KFtidWZmZXIgPSBXVEZN
b3ZlKHJlYWRCdWZmZXIpLCBsZW5ndGggPSBieXRlc1JlYWRdKENsaWVudCYgY2xpZW50KSBtdXRh
YmxlIHsKKyAgICAgICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKKyAgICAgICAgY2xpZW50LmRp
ZFJlY2VpdmVEYXRhKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGJ1ZmZlci5nZXQoKSks
IGxlbmd0aCk7CisgICAgfSk7Cit9CisKK3ZvaWQgQ3VybFN0cmVhbTo6dHJ5VG9Xcml0ZSgpCit7
CisgICAgQVNTRVJUKCFpc01haW5UaHJlYWQoKSk7CisKKyAgICBpZiAoIW1fY3VybEhhbmRsZSB8
fCAhbV93cml0ZUJ1ZmZlcikKKyAgICAgICAgcmV0dXJuOworCisgICAgd2hpbGUgKG1fd3JpdGVC
dWZmZXJPZmZzZXQgPCBtX3dyaXRlQnVmZmVyU2l6ZSkgeworICAgICAgICBzaXplX3QgYnl0ZXNX
cml0dGVuID0gMDsKKworICAgICAgICBhdXRvIGVycm9yQ29kZSA9IG1fY3VybEhhbmRsZS0+c2Vu
ZChtX3dyaXRlQnVmZmVyLmdldCgpICsgbV93cml0ZUJ1ZmZlck9mZnNldCwgbV93cml0ZUJ1ZmZl
clNpemUgLSBtX3dyaXRlQnVmZmVyT2Zmc2V0LCBieXRlc1dyaXR0ZW4pOworICAgICAgICBpZiAo
ZXJyb3JDb2RlICE9IENVUkxFX09LKSB7CisgICAgICAgICAgICBpZiAoZXJyb3JDb2RlICE9IENV
UkxFX0FHQUlOKQorICAgICAgICAgICAgICAgIG5vdGlmeUZhaWxXaXRoRXJyb3IoZXJyb3JDb2Rl
KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIG1fd3JpdGVCdWZm
ZXJPZmZzZXQgKz0gYnl0ZXNXcml0dGVuOworICAgIH0KKworICAgIG1fd3JpdGVCdWZmZXIgPSBu
dWxscHRyOworICAgIG1fd3JpdGVCdWZmZXJTaXplID0gMDsKKyAgICBtX3dyaXRlQnVmZmVyT2Zm
c2V0ID0gMDsKKworICAgIGNhbGxDbGllbnQoW10oQ2xpZW50JiBjbGllbnQpIHsKKyAgICAgICAg
QVNTRVJUKGlzTWFpblRocmVhZCgpKTsKKyAgICAgICAgY2xpZW50LmRpZFNlbmREYXRhKCk7Cisg
ICAgfSk7Cit9CisKK3ZvaWQgQ3VybFN0cmVhbTo6bm90aWZ5RmFpbFdpdGhFcnJvcihDVVJMY29k
ZSBlcnJvckNvZGUpCit7CisgICAgQVNTRVJUKCFpc01haW5UaHJlYWQoKSk7CisKKyAgICBkZXN0
cm95SGFuZGxlKCk7CisKKyAgICBjYWxsQ2xpZW50KFt1cmwgPSBtX3VybC5pc29sYXRlZENvcHko
KSwgZXJyb3JDb2RlXShDbGllbnQmIGNsaWVudCkgeworICAgICAgICBBU1NFUlQoaXNNYWluVGhy
ZWFkKCkpOworICAgICAgICBjbGllbnQuZGlkRmFpbFdpdGhFcnJvcihTb2NrZXRTdHJlYW1FcnJv
cihlcnJvckNvZGUsIHVybCwgQ3VybEhhbmRsZTo6ZXJyb3JEZXNjcmlwdGlvbihlcnJvckNvZGUp
KSk7CisgICAgfSk7Cit9CisKK3ZvaWQgQ3VybFN0cmVhbTo6Y2FsbENsaWVudChGdW5jdGlvbjx2
b2lkKENsaWVudCYpPiYmIHRhc2spCit7CisgICAgQVNTRVJUKCFpc01haW5UaHJlYWQoKSk7CisK
KyAgICBtX3NjaGVkdWxlci5jYWxsT25NYWluVGhyZWFkKG1fc3RyZWFtSUQsIFdURk1vdmUodGFz
aykpOworfQorCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vbmV0d29yay9jdXJsL0N1cmxTdHJlYW0uaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25l
dHdvcmsvY3VybC9DdXJsU3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw
MDAwMDAuLjI5NmIzMjg2OTliCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vbmV0d29yay9jdXJsL0N1cmxTdHJlYW0uaApAQCAtMCwwICsxLDg3IEBACisvKgorICog
Q29weXJpZ2h0IChDKSAyMDIwIFNvbnkgSW50ZXJhY3RpdmUgRW50ZXJ0YWlubWVudCBJbmMuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBB
TkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElN
UExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVO
VCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEs
IE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIkN1cmxDb250ZXh0LmgiCisjaW5j
bHVkZSA8d3RmL1VSTC5oPgorI2luY2x1ZGUgPHd0Zi9VbmlxdWVBcnJheS5oPgorCituYW1lc3Bh
Y2UgV2ViQ29yZSB7CisKK2NsYXNzIEN1cmxTdHJlYW1TY2hlZHVsZXI7CitjbGFzcyBTb2NrZXRT
dHJlYW1FcnJvcjsKKwordXNpbmcgQ3VybFN0cmVhbUlEID0gdWludDE2X3Q7Citjb25zdCBDdXJs
U3RyZWFtSUQgaW52YWxpZEN1cmxTdHJlYW1JRCA9IDA7CisKK2NsYXNzIEN1cmxTdHJlYW0gewor
ICAgIFdURl9NQUtFX0ZBU1RfQUxMT0NBVEVEOworICAgIFdURl9NQUtFX05PTkNPUFlBQkxFKEN1
cmxTdHJlYW0pOworcHVibGljOgorICAgIGNsYXNzIENsaWVudCB7CisgICAgcHVibGljOgorICAg
ICAgICB2aXJ0dWFsIHZvaWQgZGlkT3BlbigpID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIGRp
ZFNlbmREYXRhKCkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgZGlkUmVjZWl2ZURhdGEoY29u
c3QgY2hhciosIHNpemVfdCkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgZGlkRmFpbFdpdGhF
cnJvcihTb2NrZXRTdHJlYW1FcnJvciYmKSA9IDA7CisgICAgfTsKKworICAgIHN0YXRpYyBzdGQ6
OnVuaXF1ZV9wdHI8Q3VybFN0cmVhbT4gY3JlYXRlKEN1cmxTdHJlYW1TY2hlZHVsZXImIHNjaGVk
dWxlciwgQ3VybFN0cmVhbUlEIHN0cmVhbUlELCBVUkwmJiB1cmwpCisgICAgeworICAgICAgICBy
ZXR1cm4gV1RGOjptYWtlVW5pcXVlPEN1cmxTdHJlYW0+KHNjaGVkdWxlciwgc3RyZWFtSUQsIFdU
Rk1vdmUodXJsKSk7CisgICAgfQorCisgICAgQ3VybFN0cmVhbShDdXJsU3RyZWFtU2NoZWR1bGVy
JiwgQ3VybFN0cmVhbUlELCBVUkwmJik7CisgICAgdmlydHVhbCB+Q3VybFN0cmVhbSgpOworCisg
ICAgdm9pZCBzZW5kKFVuaXF1ZUFycmF5PHVpbnQ4X3Q+JiYsIHNpemVfdCk7CisKKyAgICB2b2lk
IGFwcGVuZE1vbml0b3JpbmdGZChmZF9zZXQmLCBmZF9zZXQmLCBmZF9zZXQmLCBpbnQmKTsKKyAg
ICB2b2lkIHRyeVRvVHJhbnNmZXIoY29uc3QgZmRfc2V0JiwgY29uc3QgZmRfc2V0JiwgY29uc3Qg
ZmRfc2V0Jik7CisKK3ByaXZhdGU6CisgICAgdm9pZCBkZXN0cm95SGFuZGxlKCk7CisKKyAgICB2
b2lkIHRyeVRvUmVhZCgpOworICAgIHZvaWQgdHJ5VG9Xcml0ZSgpOworCisgICAgdm9pZCBub3Rp
ZnlGYWlsV2l0aEVycm9yKENVUkxjb2RlKTsKKyAgICB2b2lkIGNhbGxDbGllbnQoRnVuY3Rpb248
dm9pZChDbGllbnQmKT4mJik7CisKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtSZWFkQnVmZmVy
U2l6ZSA9IDY0ICogMTAyNDsKKworICAgIEN1cmxTdHJlYW1TY2hlZHVsZXImIG1fc2NoZWR1bGVy
OworICAgIEN1cmxTdHJlYW1JRCBtX3N0cmVhbUlEOworICAgIFVSTCBtX3VybDsKKworICAgIHN0
ZDo6dW5pcXVlX3B0cjxDdXJsSGFuZGxlPiBtX2N1cmxIYW5kbGU7CisKKyAgICBVbmlxdWVBcnJh
eTx1aW50OF90PiBtX3dyaXRlQnVmZmVyOworICAgIHNpemVfdCBtX3dyaXRlQnVmZmVyU2l6ZSB7
IDAgfTsKKyAgICBzaXplX3QgbV93cml0ZUJ1ZmZlck9mZnNldCB7IDAgfTsKK307CisKK30gLy8g
bmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25l
dHdvcmsvY3VybC9DdXJsU3RyZWFtU2NoZWR1bGVyLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL25ldHdvcmsvY3VybC9DdXJsU3RyZWFtU2NoZWR1bGVyLmNwcApuZXcgZmlsZSBtb2RlIDEw
MDY0NAppbmRleCAwMDAwMDAwMDAwMC4uZDRiZTg1YmU4YzQKLS0tIC9kZXYvbnVsbAorKysgYi9T
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybFN0cmVhbVNjaGVkdWxlci5j
cHAKQEAgLTAsMCArMSwyMDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgU29ueSBJbnRl
cmFjdGl2ZSBFbnRlcnRhaW5tZW50IEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIAorICogVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMn
JworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVND
TEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMK
KyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJ
QUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAq
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICog
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcu
aCIKKyNpbmNsdWRlICJDdXJsU3RyZWFtU2NoZWR1bGVyLmgiCisKKyNpZiBVU0UoQ1VSTCkKKwor
bmFtZXNwYWNlIFdlYkNvcmUgeworCitDdXJsU3RyZWFtU2NoZWR1bGVyOjpDdXJsU3RyZWFtU2No
ZWR1bGVyKCkKK3sKKyAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOworfQorCitDdXJsU3RyZWFt
U2NoZWR1bGVyOjp+Q3VybFN0cmVhbVNjaGVkdWxlcigpCit7CisgICAgQVNTRVJUKGlzTWFpblRo
cmVhZCgpKTsKK30KKworQ3VybFN0cmVhbUlEIEN1cmxTdHJlYW1TY2hlZHVsZXI6OmNyZWF0ZShj
b25zdCBVUkwmIHVybCwgQ3VybFN0cmVhbTo6Q2xpZW50JiBjbGllbnQpCit7CisgICAgQVNTRVJU
KGlzTWFpblRocmVhZCgpKTsKKworICAgIGF1dG8gc3RyZWFtSUQgPSBtX25leHRTdHJlYW1JRDsK
KyAgICBtX25leHRTdHJlYW1JRCA9IChtX25leHRTdHJlYW1JRCArIDEgIT0gaW52YWxpZEN1cmxT
dHJlYW1JRCkgPyBtX25leHRTdHJlYW1JRCArIDEgOiAxOworCisgICAgbV9jbGllbnRMaXN0cy5h
ZGQoc3RyZWFtSUQsICZjbGllbnQpOworCisgICAgYXV0byB0YXNrID0gW3RoaXMsIHN0cmVhbUlE
LCB1cmwgPSB1cmwuaXNvbGF0ZWRDb3B5KCldKCkgbXV0YWJsZSB7CisgICAgICAgIEFTU0VSVCgh
aXNNYWluVGhyZWFkKCkpOworICAgICAgICBtX3N0cmVhbUxpc3RzLmFkZChzdHJlYW1JRCwgQ3Vy
bFN0cmVhbTo6Y3JlYXRlKCp0aGlzLCBzdHJlYW1JRCwgV1RGTW92ZSh1cmwpKSk7CisgICAgfTsK
KworICAgIGNhbGxPbldvcmtlclRocmVhZChXVEZNb3ZlKHRhc2spKTsKKworICAgIHJldHVybiBz
dHJlYW1JRDsKK30KKwordm9pZCBDdXJsU3RyZWFtU2NoZWR1bGVyOjpkZXN0b3J5KEN1cmxTdHJl
YW1JRCBzdHJlYW1JRCkKK3sKKyAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOworCisgICAgaWYg
KG1fY2xpZW50TGlzdHMuY29udGFpbnMoc3RyZWFtSUQpKQorICAgICAgICBtX2NsaWVudExpc3Rz
LnJlbW92ZShzdHJlYW1JRCk7CisKKyAgICBhdXRvIHRhc2sgPSBbdGhpcywgc3RyZWFtSURdKCkg
eworICAgICAgICBBU1NFUlQoIWlzTWFpblRocmVhZCgpKTsKKyAgICAgICAgaWYgKG1fc3RyZWFt
TGlzdHMuY29udGFpbnMoc3RyZWFtSUQpKQorICAgICAgICAgICAgbV9zdHJlYW1MaXN0cy5yZW1v
dmUoc3RyZWFtSUQpOworICAgIH07CisKKyAgICBjYWxsT25Xb3JrZXJUaHJlYWQoV1RGTW92ZSh0
YXNrKSk7Cit9CisKK3ZvaWQgQ3VybFN0cmVhbVNjaGVkdWxlcjo6c2VuZChDdXJsU3RyZWFtSUQg
c3RyZWFtSUQsIFVuaXF1ZUFycmF5PHVpbnQ4X3Q+JiYgZGF0YSwgc2l6ZV90IGxlbmd0aCkKK3sK
KyAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOworCisgICAgYXV0byB0YXNrID0gW3RoaXMsIHN0
cmVhbUlELCBkYXRhID0gV1RGTW92ZShkYXRhKSwgbGVuZ3RoXSgpIG11dGFibGUgeworICAgICAg
ICBBU1NFUlQoIWlzTWFpblRocmVhZCgpKTsKKyAgICAgICAgaWYgKGF1dG8gc3RyZWFtID0gbV9z
dHJlYW1MaXN0cy5nZXQoc3RyZWFtSUQpKQorICAgICAgICAgICAgc3RyZWFtLT5zZW5kKFdURk1v
dmUoZGF0YSksIGxlbmd0aCk7CisgICAgfTsKKworICAgIGNhbGxPbldvcmtlclRocmVhZChXVEZN
b3ZlKHRhc2spKTsKK30KKwordm9pZCBDdXJsU3RyZWFtU2NoZWR1bGVyOjpjYWxsT25Xb3JrZXJU
aHJlYWQoV1RGOjpGdW5jdGlvbjx2b2lkKCk+JiYgdGFzaykKK3sKKyAgICBhcHBlbmRUYXNrKFdU
Rk1vdmUodGFzaykpOworICAgIHN0YXJ0VGhyZWFkSWZOZWVkZWQoKTsKK30KKwordm9pZCBDdXJs
U3RyZWFtU2NoZWR1bGVyOjpjYWxsT25NYWluVGhyZWFkKEN1cmxTdHJlYW1JRCBzdHJlYW1JRCwg
V1RGOjpGdW5jdGlvbjx2b2lkKEN1cmxTdHJlYW06OkNsaWVudCYpPiYmIHRhc2spCit7CisgICAg
QVNTRVJUKCFpc01haW5UaHJlYWQoKSk7CisKKyAgICBhdXRvIHN1YlRhc2sgPSBbdGhpcywgc3Ry
ZWFtSUQsIHRhc2sgPSBXVEZNb3ZlKHRhc2spXSgpIHsKKyAgICAgICAgQVNTRVJUKGlzTWFpblRo
cmVhZCgpKTsKKyAgICAgICAgaWYgKGF1dG8gY2xpZW50ID0gbV9jbGllbnRMaXN0cy5nZXQoc3Ry
ZWFtSUQpKQorICAgICAgICAgICAgdGFzaygqY2xpZW50KTsKKyAgICB9OworCisgICAgV1RGOjpj
YWxsT25NYWluVGhyZWFkKFdURk1vdmUoc3ViVGFzaykpOworfQorCit2b2lkIEN1cmxTdHJlYW1T
Y2hlZHVsZXI6OnN0YXJ0VGhyZWFkSWZOZWVkZWQoKQoreworICAgIEFTU0VSVChpc01haW5UaHJl
YWQoKSk7CisKKyAgICBMb2NrSG9sZGVyIGxvY2tlcihtX211dGV4KTsKKyAgICBpZiAoIW1fcnVu
VGhyZWFkKSB7CisgICAgICAgIGlmIChtX3RocmVhZCkKKyAgICAgICAgICAgIG1fdGhyZWFkLT53
YWl0Rm9yQ29tcGxldGlvbigpOworCisgICAgICAgIG1fcnVuVGhyZWFkID0gdHJ1ZTsKKyAgICAg
ICAgbV90aHJlYWQgPSBUaHJlYWQ6OmNyZWF0ZSgiY3VybFN0cmVhbVRocmVhZCIsIFt0aGlzXSB7
CisgICAgICAgICAgICB3b3JrZXJUaHJlYWQoKTsKKyAgICAgICAgfSk7CisgICAgfQorfQorCit2
b2lkIEN1cmxTdHJlYW1TY2hlZHVsZXI6OnN0b3BUaHJlYWRJZk5vTW9yZUpvYlJ1bm5pbmcoKQor
eworICAgIEFTU0VSVCghaXNNYWluVGhyZWFkKCkpOworCisgICAgTG9ja0hvbGRlciBsb2NrZXIo
bV9tdXRleCk7CisgICAgaWYgKG1fdGFza1F1ZXVlLnNpemUoKSB8fCBtX3N0cmVhbUxpc3RzLnNp
emUoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9ydW5UaHJlYWQgPSBmYWxzZTsKK30KKwor
dm9pZCBDdXJsU3RyZWFtU2NoZWR1bGVyOjpzdG9wVGhyZWFkKCkKK3sKKyAgICBtX3J1blRocmVh
ZCA9IGZhbHNlOworCisgICAgaWYgKG1fdGhyZWFkKSB7CisgICAgICAgIG1fdGhyZWFkLT53YWl0
Rm9yQ29tcGxldGlvbigpOworICAgICAgICBtX3RocmVhZCA9IG51bGxwdHI7CisgICAgfQorfQor
Cit2b2lkIEN1cmxTdHJlYW1TY2hlZHVsZXI6OmFwcGVuZFRhc2soV1RGOjpGdW5jdGlvbjx2b2lk
KCk+JiYgdGFzaykKK3sKKyAgICBMb2NrSG9sZGVyIGxvY2tlcihtX211dGV4KTsKKyAgICBtX3Rh
c2tRdWV1ZS5hcHBlbmQoV1RGTW92ZSh0YXNrKSk7Cit9CisKK3ZvaWQgQ3VybFN0cmVhbVNjaGVk
dWxlcjo6ZXhlY3V0ZVRhc2tzKCkKK3sKKyAgICBBU1NFUlQoIWlzTWFpblRocmVhZCgpKTsKKwor
ICAgIFZlY3RvcjxXVEY6OkZ1bmN0aW9uPHZvaWQoKT4+IHRhc2tRdWV1ZTsKKworICAgIHsKKyAg
ICAgICAgTG9ja0hvbGRlciBsb2NrZXIobV9tdXRleCk7CisgICAgICAgIHRhc2tRdWV1ZSA9IFdU
Rk1vdmUobV90YXNrUXVldWUpOworICAgIH0KKworICAgIGZvciAoYXV0byYgdGFzayA6IHRhc2tR
dWV1ZSkKKyAgICAgICAgdGFzaygpOworfQorCit2b2lkIEN1cmxTdHJlYW1TY2hlZHVsZXI6Ondv
cmtlclRocmVhZCgpCit7CisgICAgQVNTRVJUKCFpc01haW5UaHJlYWQoKSk7CisgICAgc3RhdGlj
IGNvbnN0IGludCBzZWxlY3RUaW1lb3V0TVMgPSAyMDsKKyAgICBzdHJ1Y3QgdGltZXZhbCB0aW1l
b3V0IHsgMCwgc2VsZWN0VGltZW91dE1TICogMTAwMH07CisKKyAgICB3aGlsZSAobV9ydW5UaHJl
YWQpIHsKKyAgICAgICAgZXhlY3V0ZVRhc2tzKCk7CisKKyAgICAgICAgaW50IHJjID0gMDsKKyAg
ICAgICAgZmRfc2V0IHJlYWRmZHM7CisgICAgICAgIGZkX3NldCB3cml0ZWZkczsKKyAgICAgICAg
ZmRfc2V0IGV4Y2VwdGZkczsKKworICAgICAgICBkbyB7CisgICAgICAgICAgICBpbnQgbWF4ZmQg
PSAtMTsKKworICAgICAgICAgICAgRkRfWkVSTygmcmVhZGZkcyk7CisgICAgICAgICAgICBGRF9a
RVJPKCZ3cml0ZWZkcyk7CisgICAgICAgICAgICBGRF9aRVJPKCZleGNlcHRmZHMpOworCisgICAg
ICAgICAgICBmb3IgKGF1dG8mIHN0cmVhbSA6IG1fc3RyZWFtTGlzdHMudmFsdWVzKCkpCisgICAg
ICAgICAgICAgICAgc3RyZWFtLT5hcHBlbmRNb25pdG9yaW5nRmQocmVhZGZkcywgd3JpdGVmZHMs
IGV4Y2VwdGZkcywgbWF4ZmQpOworCisgICAgICAgICAgICBpZiAobWF4ZmQgPj0gMCkKKyAgICAg
ICAgICAgICAgICByYyA9IDo6c2VsZWN0KG1heGZkICsgMSwgJnJlYWRmZHMsICZ3cml0ZWZkcywg
JmV4Y2VwdGZkcywgJnRpbWVvdXQpOworICAgICAgICB9IHdoaWxlIChyYyA9PSAtMSAmJiBlcnJu
byA9PSBFSU5UUik7CisKKyAgICAgICAgZm9yIChhdXRvJiBzdHJlYW0gOiBtX3N0cmVhbUxpc3Rz
LnZhbHVlcygpKQorICAgICAgICAgICAgc3RyZWFtLT50cnlUb1RyYW5zZmVyKHJlYWRmZHMsIHdy
aXRlZmRzLCBleGNlcHRmZHMpOworCisgICAgICAgIHN0b3BUaHJlYWRJZk5vTW9yZUpvYlJ1bm5p
bmcoKTsKKyAgICB9Cit9CisKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybFN0cmVhbVNjaGVkdWxlci5oIGIvU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0N1cmxTdHJlYW1TY2hlZHVsZXIuaApuZXcgZmls
ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uY2ZhZjVlYWU5ZjgKLS0tIC9kZXYvbnVs
bAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybFN0cmVhbVNj
aGVkdWxlci5oCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgU29u
eSBJbnRlcmFjdGl2ZSBFbnRlcnRhaW5tZW50IEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIAorICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBg
QVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklC
VVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5F
U1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNwcmFnbWEgb25j
ZQorCisjaW5jbHVkZSAiQ3VybFN0cmVhbS5oIgorI2luY2x1ZGUgPHd0Zi9GdW5jdGlvbi5oPgor
I2luY2x1ZGUgPHd0Zi9IYXNoTWFwLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3Mg
Q3VybFN0cmVhbVNjaGVkdWxlciB7CisgICAgV1RGX01BS0VfRkFTVF9BTExPQ0FURUQ7CisgICAg
V1RGX01BS0VfTk9OQ09QWUFCTEUoQ3VybFN0cmVhbVNjaGVkdWxlcik7CitwdWJsaWM6CisgICAg
Q3VybFN0cmVhbVNjaGVkdWxlcigpOworICAgIHZpcnR1YWwgfkN1cmxTdHJlYW1TY2hlZHVsZXIo
KTsKKworICAgIEN1cmxTdHJlYW1JRCBjcmVhdGUoY29uc3QgVVJMJiwgQ3VybFN0cmVhbTo6Q2xp
ZW50Jik7CisgICAgdm9pZCBkZXN0b3J5KEN1cmxTdHJlYW1JRCk7CisgICAgdm9pZCBzZW5kKEN1
cmxTdHJlYW1JRCwgVW5pcXVlQXJyYXk8dWludDhfdD4mJiwgc2l6ZV90KTsKKworICAgIHZvaWQg
Y2FsbE9uV29ya2VyVGhyZWFkKFdURjo6RnVuY3Rpb248dm9pZCgpPiYmKTsKKyAgICB2b2lkIGNh
bGxPbk1haW5UaHJlYWQoQ3VybFN0cmVhbUlELCBXVEY6OkZ1bmN0aW9uPHZvaWQoQ3VybFN0cmVh
bTo6Q2xpZW50Jik+JiYpOworCitwcml2YXRlOgorICAgIHZvaWQgc3RhcnRUaHJlYWRJZk5lZWRl
ZCgpOworICAgIHZvaWQgc3RvcFRocmVhZElmTm9Nb3JlSm9iUnVubmluZygpOworICAgIHZvaWQg
c3RvcFRocmVhZCgpOworCisgICAgdm9pZCBhcHBlbmRUYXNrKFdURjo6RnVuY3Rpb248dm9pZCgp
PiYmKTsKKyAgICB2b2lkIGV4ZWN1dGVUYXNrcygpOworCisgICAgdm9pZCB3b3JrZXJUaHJlYWQo
KTsKKworICAgIExvY2sgbV9tdXRleDsKKyAgICBSZWZQdHI8VGhyZWFkPiBtX3RocmVhZDsKKyAg
ICBib29sIG1fcnVuVGhyZWFkIHsgZmFsc2UgfTsKKworICAgIEN1cmxTdHJlYW1JRCBtX25leHRT
dHJlYW1JRCA9IDE7CisKKyAgICBWZWN0b3I8RnVuY3Rpb248dm9pZCgpPj4gbV90YXNrUXVldWU7
CisgICAgSGFzaE1hcDxDdXJsU3RyZWFtSUQsIEN1cmxTdHJlYW06OkNsaWVudCo+IG1fY2xpZW50
TGlzdHM7CisgICAgSGFzaE1hcDxDdXJsU3RyZWFtSUQsIHN0ZDo6dW5pcXVlX3B0cjxDdXJsU3Ry
ZWFtPj4gbV9zdHJlYW1MaXN0czsKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9Tb2NrZXRTdHJlYW1I
YW5kbGVJbXBsLmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvU29ja2V0
U3RyZWFtSGFuZGxlSW1wbC5oCmluZGV4IDI1YmYzYzQ2YTJlLi5jZWQwNWI3ZjRlOSAxMDA2NDQK
LS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL1NvY2tldFN0cmVhbUhh
bmRsZUltcGwuaAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvU29j
a2V0U3RyZWFtSGFuZGxlSW1wbC5oCkBAIC0xLDYgKzEsNyBAQAogLyoKICAqIENvcHlyaWdodCAo
QykgMjAwOS0yMDE4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIENvcHlyaWdo
dCAoQykgMjAwOSBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdo
dCAoQykgMjAyMCBTb255IEludGVyYWN0aXZlIEVudGVydGFpbm1lbnQgSW5jLgogICoKICAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtMzEsMjMgKzMyLDE3IEBACiAKICNwcmFnbWEg
b25jZQogCi0jaW5jbHVkZSAiQ3VybENvbnRleHQuaCIKKyNpbmNsdWRlICJDdXJsU3RyZWFtLmgi
CiAjaW5jbHVkZSAiU29ja2V0U3RyZWFtSGFuZGxlLmgiCiAjaW5jbHVkZSA8cGFsL1Nlc3Npb25J
RC5oPgotI2luY2x1ZGUgPHd0Zi9GdW5jdGlvbi5oPgotI2luY2x1ZGUgPHd0Zi9Mb2NrLmg+Ci0j
aW5jbHVkZSA8d3RmL01lc3NhZ2VRdWV1ZS5oPgotI2luY2x1ZGUgPHd0Zi9SZWZDb3VudGVkLmg+
CiAjaW5jbHVkZSA8d3RmL1N0cmVhbUJ1ZmZlci5oPgotI2luY2x1ZGUgPHd0Zi9UaHJlYWRpbmcu
aD4KLSNpbmNsdWRlIDx3dGYvVW5pcXVlQXJyYXkuaD4KIAogbmFtZXNwYWNlIFdlYkNvcmUgewog
CiBjbGFzcyBTb2NrZXRTdHJlYW1IYW5kbGVDbGllbnQ7CiBjbGFzcyBTdG9yYWdlU2Vzc2lvblBy
b3ZpZGVyOwogCi1jbGFzcyBTb2NrZXRTdHJlYW1IYW5kbGVJbXBsIDogcHVibGljIFNvY2tldFN0
cmVhbUhhbmRsZSB7CitjbGFzcyBTb2NrZXRTdHJlYW1IYW5kbGVJbXBsIDogcHVibGljIFNvY2tl
dFN0cmVhbUhhbmRsZSwgcHVibGljIEN1cmxTdHJlYW06OkNsaWVudCB7CiBwdWJsaWM6CiAgICAg
c3RhdGljIFJlZjxTb2NrZXRTdHJlYW1IYW5kbGVJbXBsPiBjcmVhdGUoY29uc3QgVVJMJiB1cmws
IFNvY2tldFN0cmVhbUhhbmRsZUNsaWVudCYgY2xpZW50LCBQQUw6OlNlc3Npb25JRCwgY29uc3Qg
U3RyaW5nJiwgU291cmNlQXBwbGljYXRpb25BdWRpdFRva2VuJiYsIGNvbnN0IFN0b3JhZ2VTZXNz
aW9uUHJvdmlkZXIqIHByb3ZpZGVyKSB7IHJldHVybiBhZG9wdFJlZigqbmV3IFNvY2tldFN0cmVh
bUhhbmRsZUltcGwodXJsLCBjbGllbnQsIHByb3ZpZGVyKSk7IH0KIApAQCAtNjQsMjggKzU5LDIy
IEBAIHByaXZhdGU6CiAgICAgT3B0aW9uYWw8c2l6ZV90PiBwbGF0Zm9ybVNlbmRJbnRlcm5hbChj
b25zdCB1aW50OF90Kiwgc2l6ZV90KTsKICAgICBib29sIHNlbmRQZW5kaW5nRGF0YSgpOwogCi0g
ICAgdm9pZCB0aHJlYWRFbnRyeVBvaW50KGNvbnN0IFVSTCYpOwotICAgIHZvaWQgaGFuZGxlRXJy
b3IoQ1VSTGNvZGUpOwotICAgIHZvaWQgc3RvcFRocmVhZCgpOworICAgIHZvaWQgZGlkT3Blbigp
IGZpbmFsOworICAgIHZvaWQgZGlkU2VuZERhdGEoKSBmaW5hbDsKKyAgICB2b2lkIGRpZFJlY2Vp
dmVEYXRhKGNvbnN0IGNoYXIqLCBzaXplX3QpIGZpbmFsOworICAgIHZvaWQgZGlkRmFpbFdpdGhF
cnJvcihTb2NrZXRTdHJlYW1FcnJvciYmKSBmaW5hbDsKIAotICAgIHZvaWQgY2FsbE9uV29ya2Vy
VGhyZWFkKEZ1bmN0aW9uPHZvaWQoKT4mJik7Ci0gICAgdm9pZCBleGVjdXRlVGFza3MoKTsKLQot
ICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1JlYWRCdWZmZXJTaXplID0gNCAqIDEwMjQ7CisgICAg
Ym9vbCBpc1N0cmVhbUludmFsaWRhdGVkKCkgeyByZXR1cm4gbV9zdHJlYW1JRCA9PSBpbnZhbGlk
Q3VybFN0cmVhbUlEOyB9CisgICAgdm9pZCBkZXN0cnVjdFN0cmVhbSgpOwogCiAgICAgUmVmUHRy
PGNvbnN0IFN0b3JhZ2VTZXNzaW9uUHJvdmlkZXI+IG1fc3RvcmFnZVNlc3Npb25Qcm92aWRlcjsK
LSAgICBSZWZQdHI8VGhyZWFkPiBtX3dvcmtlclRocmVhZDsKLSAgICBzdGQ6OmF0b21pYzxib29s
PiBtX3J1bm5pbmcgeyB0cnVlIH07Ci0KLSAgICBNZXNzYWdlUXVldWU8RnVuY3Rpb248dm9pZCgp
Pj4gbV90YXNrUXVldWU7Ci0KLSAgICBib29sIG1faGFzUGVuZGluZ1dyaXRlRGF0YSB7IGZhbHNl
IH07Ci0gICAgc2l6ZV90IG1fd3JpdGVCdWZmZXJTaXplIHsgMCB9OwotICAgIHNpemVfdCBtX3dy
aXRlQnVmZmVyT2Zmc2V0IHsgMCB9OwotICAgIFVuaXF1ZUFycmF5PHVpbnQ4X3Q+IG1fd3JpdGVC
dWZmZXI7CiAKICAgICBTdHJlYW1CdWZmZXI8dWludDhfdCwgMTAyNCAqIDEwMjQ+IG1fYnVmZmVy
OwogICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBtYXhCdWZmZXJTaXplID0gMTAwICogMTAyNCAq
IDEwMjQ7CisKKyAgICBDdXJsU3RyZWFtU2NoZWR1bGVyJiBtX3NjaGVkdWxlcjsKKyAgICBDdXJs
U3RyZWFtSUQgbV9zdHJlYW1JRCB7IGludmFsaWRDdXJsU3RyZWFtSUQgfTsKKyAgICBib29sIG1f
aGFzUGVuZGluZ1NlbmREYXRhIHsgZmFsc2UgfTsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIFdlYkNv
cmUKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9Tb2Nr
ZXRTdHJlYW1IYW5kbGVJbXBsQ3VybC5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3
b3JrL2N1cmwvU29ja2V0U3RyZWFtSGFuZGxlSW1wbEN1cmwuY3BwCmluZGV4IDEzYTgzMmMyNjY5
Li5lYTlhMmIxMTQ2MiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29y
ay9jdXJsL1NvY2tldFN0cmVhbUhhbmRsZUltcGxDdXJsLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvU29ja2V0U3RyZWFtSGFuZGxlSW1wbEN1cmwuY3BwCkBA
IC0xLDcgKzEsNyBAQAogLyoKICAqIENvcHlyaWdodCAoQykgMjAwOSBCcmVudCBGdWxnaGFtLiAg
QWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIENvcHlyaWdodCAoQykgMjAwOSBHb29nbGUgSW5jLiAg
QWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIENvcHlyaWdodCAoQykgMjAxOCBTb255IEludGVyYWN0
aXZlIEVudGVydGFpbm1lbnQgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDIwIFNvbnkgSW50ZXJh
Y3RpdmUgRW50ZXJ0YWlubWVudCBJbmMuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMg
YXJlCkBAIC0zNSwxODMgKzM1LDEyMCBAQAogCiAjaWYgVVNFKENVUkwpCiAKKyNpbmNsdWRlICJD
dXJsU3RyZWFtU2NoZWR1bGVyLmgiCiAjaW5jbHVkZSAiRGVwcmVjYXRlZEdsb2JhbFNldHRpbmdz
LmgiCi0jaW5jbHVkZSAiTG9nZ2luZy5oIgogI2luY2x1ZGUgIlNvY2tldFN0cmVhbUVycm9yLmgi
CiAjaW5jbHVkZSAiU29ja2V0U3RyZWFtSGFuZGxlQ2xpZW50LmgiCiAjaW5jbHVkZSAiU3RvcmFn
ZVNlc3Npb25Qcm92aWRlci5oIgotI2luY2x1ZGUgPHd0Zi9NYWluVGhyZWFkLmg+Ci0jaW5jbHVk
ZSA8d3RmL1VSTC5oPgotI2luY2x1ZGUgPHd0Zi90ZXh0L0NTdHJpbmcuaD4KIAogbmFtZXNwYWNl
IFdlYkNvcmUgewogCiBTb2NrZXRTdHJlYW1IYW5kbGVJbXBsOjpTb2NrZXRTdHJlYW1IYW5kbGVJ
bXBsKGNvbnN0IFVSTCYgdXJsLCBTb2NrZXRTdHJlYW1IYW5kbGVDbGllbnQmIGNsaWVudCwgY29u
c3QgU3RvcmFnZVNlc3Npb25Qcm92aWRlciogcHJvdmlkZXIpCiAgICAgOiBTb2NrZXRTdHJlYW1I
YW5kbGUodXJsLCBjbGllbnQpCiAgICAgLCBtX3N0b3JhZ2VTZXNzaW9uUHJvdmlkZXIocHJvdmlk
ZXIpCisgICAgLCBtX3NjaGVkdWxlcihDdXJsQ29udGV4dDo6c2luZ2xldG9uKCkuc3RyZWFtU2No
ZWR1bGVyKCkpCiB7Ci0gICAgTE9HKE5ldHdvcmssICJTb2NrZXRTdHJlYW1IYW5kbGUgJXAgbmV3
IGNsaWVudCAlcCIsIHRoaXMsICZtX2NsaWVudCk7CiAgICAgQVNTRVJUKGlzTWFpblRocmVhZCgp
KTsKIAogICAgIC8vIEZJWE1FOiBVc2luZyBEZXByZWNhdGVkR2xvYmFsU2V0dGluZ3MgZnJvbSBo
ZXJlIGlzIGEgbGF5ZXJpbmcgdmlvbGF0aW9uLgogICAgIGlmIChtX3VybC5wcm90b2NvbElzKCJ3
c3MiKSAmJiBEZXByZWNhdGVkR2xvYmFsU2V0dGluZ3M6OmFsbG93c0FueVNTTENlcnRpZmljYXRl
KCkpCiAgICAgICAgIEN1cmxDb250ZXh0OjpzaW5nbGV0b24oKS5zc2xIYW5kbGUoKS5zZXRJZ25v
cmVTU0xFcnJvcnModHJ1ZSk7CiAKLSAgICBtX3dvcmtlclRocmVhZCA9IFRocmVhZDo6Y3JlYXRl
KCJXZWJTb2NrZXQgdGhyZWFkIiwgW3RoaXMsIHByb3RlY3RlZFRoaXMgPSBtYWtlUmVmKCp0aGlz
KSwgdXJsID0gdXJsLmlzb2xhdGVkQ29weSgpXSB7Ci0gICAgICAgIHRocmVhZEVudHJ5UG9pbnQo
dXJsKTsKLSAgICB9KTsKKyAgICBtX3N0cmVhbUlEID0gbV9zY2hlZHVsZXIuY3JlYXRlKG1fdXJs
LCAqdGhpcyk7CiB9CiAKIFNvY2tldFN0cmVhbUhhbmRsZUltcGw6On5Tb2NrZXRTdHJlYW1IYW5k
bGVJbXBsKCkKIHsKLSAgICBMT0coTmV0d29yaywgIlNvY2tldFN0cmVhbUhhbmRsZSAlcCBkZWxl
dGUiLCB0aGlzKTsKLSAgICBzdG9wVGhyZWFkKCk7CisgICAgQVNTRVJUKGlzTWFpblRocmVhZCgp
KTsKKworICAgIGRlc3RydWN0U3RyZWFtKCk7CiB9CiAKIE9wdGlvbmFsPHNpemVfdD4gU29ja2V0
U3RyZWFtSGFuZGxlSW1wbDo6cGxhdGZvcm1TZW5kSW50ZXJuYWwoY29uc3QgdWludDhfdCogZGF0
YSwgc2l6ZV90IGxlbmd0aCkKIHsKLSAgICBMT0coTmV0d29yaywgIlNvY2tldFN0cmVhbUhhbmRs
ZSAlcCBwbGF0Zm9ybVNlbmQiLCB0aGlzKTsKICAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOwog
Ci0gICAgaWYgKG1faGFzUGVuZGluZ1dyaXRlRGF0YSkKLSAgICAgICAgcmV0dXJuIDA7CisgICAg
aWYgKGlzU3RyZWFtSW52YWxpZGF0ZWQoKSkKKyAgICAgICAgcmV0dXJuIFdURjo6bnVsbG9wdDsK
IAotICAgIG1faGFzUGVuZGluZ1dyaXRlRGF0YSA9IHRydWU7Ci0KLSAgICBhdXRvIHdyaXRlQnVm
ZmVyID0gbWFrZVVuaXF1ZUFycmF5PHVpbnQ4X3Q+KGxlbmd0aCk7Ci0gICAgbWVtY3B5KHdyaXRl
QnVmZmVyLmdldCgpLCBkYXRhLCBsZW5ndGgpOworICAgIGlmIChtX2hhc1BlbmRpbmdTZW5kRGF0
YSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgbV9oYXNQZW5kaW5nU2VuZERhdGEgPSB0cnVlOwog
Ci0gICAgY2FsbE9uV29ya2VyVGhyZWFkKFt0aGlzLCB3cml0ZUJ1ZmZlciA9IFdURk1vdmUod3Jp
dGVCdWZmZXIpLCB3cml0ZUJ1ZmZlclNpemUgPSBsZW5ndGhdKCkgbXV0YWJsZSB7Ci0gICAgICAg
IEFTU0VSVCghaXNNYWluVGhyZWFkKCkpOwotICAgICAgICBtX3dyaXRlQnVmZmVyID0gV1RGTW92
ZSh3cml0ZUJ1ZmZlcik7Ci0gICAgICAgIG1fd3JpdGVCdWZmZXJTaXplID0gd3JpdGVCdWZmZXJT
aXplOwotICAgICAgICBtX3dyaXRlQnVmZmVyT2Zmc2V0ID0gMDsKLSAgICB9KTsKKyAgICBhdXRv
IGJ1ZmZlciA9IG1ha2VVbmlxdWVBcnJheTx1aW50OF90PihsZW5ndGgpOworICAgIG1lbWNweShi
dWZmZXIuZ2V0KCksIGRhdGEsIGxlbmd0aCk7CiAKKyAgICBtX3NjaGVkdWxlci5zZW5kKG1fc3Ry
ZWFtSUQsIFdURk1vdmUoYnVmZmVyKSwgbGVuZ3RoKTsKICAgICByZXR1cm4gbGVuZ3RoOwogfQog
CiB2b2lkIFNvY2tldFN0cmVhbUhhbmRsZUltcGw6OnBsYXRmb3JtQ2xvc2UoKQogewotICAgIExP
RyhOZXR3b3JrLCAiU29ja2V0U3RyZWFtSGFuZGxlICVwIHBsYXRmb3JtQ2xvc2UiLCB0aGlzKTsK
ICAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOwogCisgICAgZGVzdHJ1Y3RTdHJlYW0oKTsKKwog
ICAgIGlmIChtX3N0YXRlID09IENsb3NlZCkKICAgICAgICAgcmV0dXJuOwogICAgIG1fc3RhdGUg
PSBDbG9zZWQ7CiAKLSAgICBzdG9wVGhyZWFkKCk7CiAgICAgbV9jbGllbnQuZGlkQ2xvc2VTb2Nr
ZXRTdHJlYW0oKnRoaXMpOwogfQogCi12b2lkIFNvY2tldFN0cmVhbUhhbmRsZUltcGw6OnRocmVh
ZEVudHJ5UG9pbnQoY29uc3QgVVJMJiB1cmwpCit2b2lkIFNvY2tldFN0cmVhbUhhbmRsZUltcGw6
OmRpZE9wZW4oKQogewotICAgIEFTU0VSVCghaXNNYWluVGhyZWFkKCkpOwotCi0gICAgQ3VybFNv
Y2tldEhhbmRsZSBzb2NrZXQgeyB1cmwsIFt0aGlzXShDVVJMY29kZSBlcnJvckNvZGUpIHsKLSAg
ICAgICAgaGFuZGxlRXJyb3IoZXJyb3JDb2RlKTsKLSAgICB9fTsKKyAgICBBU1NFUlQoaXNNYWlu
VGhyZWFkKCkpOwogCi0gICAgLy8gQ29ubmVjdCB0byBob3N0Ci0gICAgaWYgKCFzb2NrZXQuY29u
bmVjdCgpKQorICAgIGlmIChtX3N0YXRlICE9IENvbm5lY3RpbmcpCiAgICAgICAgIHJldHVybjsK
KyAgICBtX3N0YXRlID0gT3BlbjsKIAotICAgIGNhbGxPbk1haW5UaHJlYWQoW3RoaXMsIHByb3Rl
Y3RlZFRoaXMgPSBtYWtlUmVmKCp0aGlzKV0gewotICAgICAgICBpZiAobV9zdGF0ZSA9PSBDb25u
ZWN0aW5nKSB7Ci0gICAgICAgICAgICBtX3N0YXRlID0gT3BlbjsKLSAgICAgICAgICAgIG1fY2xp
ZW50LmRpZE9wZW5Tb2NrZXRTdHJlYW0oKnRoaXMpOwotICAgICAgICB9Ci0gICAgfSk7Ci0KLSAg
ICB3aGlsZSAobV9ydW5uaW5nKSB7Ci0gICAgICAgIGV4ZWN1dGVUYXNrcygpOwotCi0gICAgICAg
IGF1dG8gcmVzdWx0ID0gc29ja2V0LndhaXQoMjBfbXMsIG1fd3JpdGVCdWZmZXIuZ2V0KCkpOwot
ICAgICAgICBpZiAoIXJlc3VsdCkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIC8v
IFRoZXNlIGxvZ2ljIG9ubHkgcnVuIHdoZW4gdGhlcmUncyBkYXRhIHdhaXRpbmcuCi0gICAgICAg
IGlmIChyZXN1bHQtPndyaXRhYmxlICYmIG1fcnVubmluZykgewotICAgICAgICAgICAgYXV0byBi
eXRlc1NlbnQgPSBzb2NrZXQuc2VuZChtX3dyaXRlQnVmZmVyLmdldCgpICsgbV93cml0ZUJ1ZmZl
ck9mZnNldCwgbV93cml0ZUJ1ZmZlclNpemUgLSBtX3dyaXRlQnVmZmVyT2Zmc2V0KTsKLSAgICAg
ICAgICAgIG1fd3JpdGVCdWZmZXJPZmZzZXQgKz0gYnl0ZXNTZW50OwotCi0gICAgICAgICAgICBp
ZiAobV93cml0ZUJ1ZmZlclNpemUgPD0gbV93cml0ZUJ1ZmZlck9mZnNldCkgewotICAgICAgICAg
ICAgICAgIG1fd3JpdGVCdWZmZXIgPSBudWxscHRyOwotICAgICAgICAgICAgICAgIG1fd3JpdGVC
dWZmZXJTaXplID0gMDsKLSAgICAgICAgICAgICAgICBtX3dyaXRlQnVmZmVyT2Zmc2V0ID0gMDsK
LQotICAgICAgICAgICAgICAgIGNhbGxPbk1haW5UaHJlYWQoW3RoaXMsIHByb3RlY3RlZFRoaXMg
PSBtYWtlUmVmKCp0aGlzKV0gewotICAgICAgICAgICAgICAgICAgICBtX2hhc1BlbmRpbmdXcml0
ZURhdGEgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgc2VuZFBlbmRpbmdEYXRhKCk7Ci0g
ICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBp
ZiAocmVzdWx0LT5yZWFkYWJsZSAmJiBtX3J1bm5pbmcpIHsKLSAgICAgICAgICAgIGF1dG8gcmVh
ZEJ1ZmZlciA9IG1ha2VVbmlxdWVBcnJheTx1aW50OF90PihrUmVhZEJ1ZmZlclNpemUpOwotICAg
ICAgICAgICAgYXV0byBieXRlc1JlYWQgPSBzb2NrZXQucmVjZWl2ZShyZWFkQnVmZmVyLmdldCgp
LCBrUmVhZEJ1ZmZlclNpemUpOwotICAgICAgICAgICAgLy8gYG51bGxvcHRgIHJlc3VsdCBtZWFu
cyBub3RoaW5nIHRvIGhhbmRsZSBhdCB0aGlzIG1vbWVudC4KLSAgICAgICAgICAgIGlmICghYnl0
ZXNSZWFkKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICAvLyAwIGJ5
dGVzIGluZGljYXRlcyBhIGNsb3NlZCBjb25uZWN0aW9uLgotICAgICAgICAgICAgaWYgKCEqYnl0
ZXNSZWFkKSB7Ci0gICAgICAgICAgICAgICAgbV9ydW5uaW5nID0gZmFsc2U7Ci0gICAgICAgICAg
ICAgICAgY2FsbE9uTWFpblRocmVhZChbdGhpcywgcHJvdGVjdGVkVGhpcyA9IG1ha2VSZWYoKnRo
aXMpXSB7Ci0gICAgICAgICAgICAgICAgICAgIGNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfSk7
Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNh
bGxPbk1haW5UaHJlYWQoW3RoaXMsIHByb3RlY3RlZFRoaXMgPSBtYWtlUmVmKCp0aGlzKSwgYnVm
ZmVyID0gV1RGTW92ZShyZWFkQnVmZmVyKSwgc2l6ZSA9ICpieXRlc1JlYWQgXSB7Ci0gICAgICAg
ICAgICAgICAgaWYgKG1fc3RhdGUgPT0gT3BlbikKLSAgICAgICAgICAgICAgICAgICAgbV9jbGll
bnQuZGlkUmVjZWl2ZVNvY2tldFN0cmVhbURhdGEoKnRoaXMsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29u
c3QgY2hhcio+KGJ1ZmZlci5nZXQoKSksIHNpemUpOwotICAgICAgICAgICAgfSk7Ci0gICAgICAg
IH0KLSAgICB9Ci0KLSAgICBtX3dyaXRlQnVmZmVyID0gbnVsbHB0cjsKKyAgICBtX2NsaWVudC5k
aWRPcGVuU29ja2V0U3RyZWFtKCp0aGlzKTsKIH0KIAotdm9pZCBTb2NrZXRTdHJlYW1IYW5kbGVJ
bXBsOjpoYW5kbGVFcnJvcihDVVJMY29kZSBlcnJvckNvZGUpCit2b2lkIFNvY2tldFN0cmVhbUhh
bmRsZUltcGw6OmRpZFNlbmREYXRhKCkKIHsKLSAgICBtX3J1bm5pbmcgPSBmYWxzZTsKLSAgICBj
YWxsT25NYWluVGhyZWFkKFt0aGlzLCBwcm90ZWN0ZWRUaGlzID0gbWFrZVJlZigqdGhpcyksIGVy
cm9yQ29kZSwgbG9jYWxpemVkRGVzY3JpcHRpb24gPSBDdXJsSGFuZGxlOjplcnJvckRlc2NyaXB0
aW9uKGVycm9yQ29kZSkuaXNvbGF0ZWRDb3B5KCldIHsKLSAgICAgICAgaWYgKG1fc3RhdGUgPT0g
Q2xvc2VkKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIGlmIChlcnJvckNvZGUgPT0g
Q1VSTEVfUkVDVl9FUlJPUikKLSAgICAgICAgICAgIG1fY2xpZW50LmRpZEZhaWxUb1JlY2VpdmVT
b2NrZXRTdHJlYW1EYXRhKCp0aGlzKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgbV9jbGll
bnQuZGlkRmFpbFNvY2tldFN0cmVhbSgqdGhpcywgU29ja2V0U3RyZWFtRXJyb3Ioc3RhdGljX2Nh
c3Q8aW50PihlcnJvckNvZGUpLCB7IH0sIGxvY2FsaXplZERlc2NyaXB0aW9uKSk7Ci0gICAgfSk7
CisgICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKKyAgICBBU1NFUlQobV9oYXNQZW5kaW5nU2Vu
ZERhdGEpOworCisgICAgbV9oYXNQZW5kaW5nU2VuZERhdGEgPSBmYWxzZTsKKyAgICBzZW5kUGVu
ZGluZ0RhdGEoKTsKIH0KIAotdm9pZCBTb2NrZXRTdHJlYW1IYW5kbGVJbXBsOjpzdG9wVGhyZWFk
KCkKK3ZvaWQgU29ja2V0U3RyZWFtSGFuZGxlSW1wbDo6ZGlkUmVjZWl2ZURhdGEoY29uc3QgY2hh
ciogZGF0YSwgc2l6ZV90IGxlbmd0aCkKIHsKICAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOwog
Ci0gICAgbV9ydW5uaW5nID0gZmFsc2U7CisgICAgaWYgKG1fc3RhdGUgIT0gT3BlbikKKyAgICAg
ICAgcmV0dXJuOwogCi0gICAgaWYgKG1fd29ya2VyVGhyZWFkKSB7Ci0gICAgICAgIG1fd29ya2Vy
VGhyZWFkLT53YWl0Rm9yQ29tcGxldGlvbigpOwotICAgICAgICBtX3dvcmtlclRocmVhZCA9IG51
bGxwdHI7Ci0gICAgfQorICAgIG1fY2xpZW50LmRpZFJlY2VpdmVTb2NrZXRTdHJlYW1EYXRhKCp0
aGlzLCBkYXRhLCBsZW5ndGgpOwogfQogCi12b2lkIFNvY2tldFN0cmVhbUhhbmRsZUltcGw6OmNh
bGxPbldvcmtlclRocmVhZChGdW5jdGlvbjx2b2lkKCk+JiYgdGFzaykKK3ZvaWQgU29ja2V0U3Ry
ZWFtSGFuZGxlSW1wbDo6ZGlkRmFpbFdpdGhFcnJvcihTb2NrZXRTdHJlYW1FcnJvciYmIGVycm9y
KQogewogICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7Ci0gICAgbV90YXNrUXVldWUuYXBwZW5k
KG1ha2VVbmlxdWU8RnVuY3Rpb248dm9pZCgpPj4oV1RGTW92ZSh0YXNrKSkpOworCisgICAgZGVz
dHJ1Y3RTdHJlYW0oKTsKKworICAgIGlmIChtX3N0YXRlID09IENsb3NlZCkKKyAgICAgICAgcmV0
dXJuOworCisgICAgaWYgKGVycm9yLmVycm9yQ29kZSgpID09IENVUkxFX1JFQ1ZfRVJST1IpCisg
ICAgICAgIG1fY2xpZW50LmRpZEZhaWxUb1JlY2VpdmVTb2NrZXRTdHJlYW1EYXRhKCp0aGlzKTsK
KyAgICBlbHNlCisgICAgICAgIG1fY2xpZW50LmRpZEZhaWxTb2NrZXRTdHJlYW0oKnRoaXMsIGVy
cm9yKTsKIH0KIAotdm9pZCBTb2NrZXRTdHJlYW1IYW5kbGVJbXBsOjpleGVjdXRlVGFza3MoKQor
dm9pZCBTb2NrZXRTdHJlYW1IYW5kbGVJbXBsOjpkZXN0cnVjdFN0cmVhbSgpCiB7Ci0gICAgQVNT
RVJUKCFpc01haW5UaHJlYWQoKSk7CisgICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKKworICAg
IGlmIChpc1N0cmVhbUludmFsaWRhdGVkKCkpCisgICAgICAgIHJldHVybjsKIAotICAgIGF1dG8g
dGFza3MgPSBtX3Rhc2tRdWV1ZS50YWtlQWxsTWVzc2FnZXMoKTsKLSAgICBmb3IgKGF1dG8mIHRh
c2sgOiB0YXNrcykKLSAgICAgICAgKCp0YXNrKSgpOworICAgIG1fc2NoZWR1bGVyLmRlc3Rvcnko
bV9zdHJlYW1JRCk7CisgICAgbV9zdHJlYW1JRCA9IGludmFsaWRDdXJsU3RyZWFtSUQ7CiB9CiAK
IH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>389481</attachid>
            <date>2020-02-02 14:15:39 -0800</date>
            <delta_ts>2020-02-07 12:25:31 -0800</delta_ts>
            <desc>Handling connections by one thread.</desc>
            <filename>sindle-thread-0202.patch</filename>
            <type>text/plain</type>
            <size>35816</size>
            <attacher name="Takashi Komori">takashi.komori</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL0N1cmwuY21ha2UgYi9Tb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9DdXJsLmNtYWtlCmluZGV4IGY2ODk0YWMzZWY0Li5lZGRiNWZhYzJm
MyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vQ3VybC5jbWFrZQorKysgYi9T
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9DdXJsLmNtYWtlCkBAIC0yMiw2ICsyMiw4IEBAIGxpc3Qo
QVBQRU5EIFdlYkNvcmVfU09VUkNFUwogICAgIHBsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsUmVz
b3VyY2VIYW5kbGVEZWxlZ2F0ZS5jcHAKICAgICBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybFNT
TEhhbmRsZS5jcHAKICAgICBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybFNTTFZlcmlmaWVyLmNw
cAorICAgIHBsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsU3RyZWFtLmNwcAorICAgIHBsYXRmb3Jt
L25ldHdvcmsvY3VybC9DdXJsU3RyZWFtU2NoZWR1bGVyLmNwcAogICAgIHBsYXRmb3JtL25ldHdv
cmsvY3VybC9ETlNSZXNvbHZlUXVldWVDdXJsLmNwcAogICAgIHBsYXRmb3JtL25ldHdvcmsvY3Vy
bC9OZXR3b3JrU3RvcmFnZVNlc3Npb25DdXJsLmNwcAogICAgIHBsYXRmb3JtL25ldHdvcmsvY3Vy
bC9PcGVuU1NMSGVscGVyLmNwcApAQCAtNTgsNiArNjAsOCBAQCBsaXN0KEFQUEVORCBXZWJDb3Jl
X1BSSVZBVEVfRlJBTUVXT1JLX0hFQURFUlMKICAgICBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3Vy
bFJlc3BvbnNlLmgKICAgICBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybFNTTEhhbmRsZS5oCiAg
ICAgcGxhdGZvcm0vbmV0d29yay9jdXJsL0N1cmxTU0xWZXJpZmllci5oCisgICAgcGxhdGZvcm0v
bmV0d29yay9jdXJsL0N1cmxTdHJlYW0uaAorICAgIHBsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJs
U3RyZWFtU2NoZWR1bGVyLmgKICAgICBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvRE5TUmVzb2x2ZVF1
ZXVlQ3VybC5oCiAgICAgcGxhdGZvcm0vbmV0d29yay9jdXJsL0Rvd25sb2FkQnVuZGxlLmgKICAg
ICBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvT3BlblNTTEhlbHBlci5oCmRpZmYgLS1naXQgYS9Tb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybENvbnRleHQuY3BwIGIvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0N1cmxDb250ZXh0LmNwcAppbmRleCA3YjA0
ZmEyNmE0Mi4uZTRjNzYwNjY1YTQgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L25ldHdvcmsvY3VybC9DdXJsQ29udGV4dC5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vbmV0d29yay9jdXJsL0N1cmxDb250ZXh0LmNwcApAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1
ZGUgIkN1cmxSZXF1ZXN0U2NoZWR1bGVyLmgiCiAjaW5jbHVkZSAiQ3VybFNTTEhhbmRsZS5oIgog
I2luY2x1ZGUgIkN1cmxTU0xWZXJpZmllci5oIgorI2luY2x1ZGUgIkN1cmxTdHJlYW1TY2hlZHVs
ZXIuaCIKICNpbmNsdWRlICJIVFRQSGVhZGVyTWFwLmgiCiAjaW5jbHVkZSA8TmV0d29ya0xvYWRN
ZXRyaWNzLmg+CiAjaW5jbHVkZSA8bXV0ZXg+CkBAIC0xNDYsNiArMTQ3LDEyIEBAIHZvaWQgQ3Vy
bENvbnRleHQ6OmluaXRTaGFyZUhhbmRsZSgpCiAgICAgY3VybF9lYXN5X2NsZWFudXAoY3VybCk7
CiB9CiAKK0N1cmxTdHJlYW1TY2hlZHVsZXImIEN1cmxDb250ZXh0OjpzdHJlYW1TY2hlZHVsZXIo
KQoreworICAgIHN0YXRpYyBOZXZlckRlc3Ryb3llZDxDdXJsU3RyZWFtU2NoZWR1bGVyPiBzaGFy
ZWRJbnN0YW5jZTsKKyAgICByZXR1cm4gc2hhcmVkSW5zdGFuY2U7Cit9CisKIGJvb2wgQ3VybENv
bnRleHQ6OmlzSHR0cDJFbmFibGVkKCkgY29uc3QKIHsKICAgICBjdXJsX3ZlcnNpb25faW5mb19k
YXRhKiBkYXRhID0gY3VybF92ZXJzaW9uX2luZm8oQ1VSTFZFUlNJT05fTk9XKTsKQEAgLTg4Nywx
MTQgKzg5NCwyNSBAQCB2b2lkIEN1cmxIYW5kbGU6OmVuYWJsZVN0ZEVycklmVXNlZCgpCiAKICNl
bmRpZgogCi0vLyBDdXJsU29ja2V0SGFuZGxlCi0KLUN1cmxTb2NrZXRIYW5kbGU6OkN1cmxTb2Nr
ZXRIYW5kbGUoY29uc3QgVVJMJiB1cmwsIEZ1bmN0aW9uPHZvaWQoQ1VSTGNvZGUpPiYmIGVycm9y
SGFuZGxlcikKLSAgICA6IG1fZXJyb3JIYW5kbGVyKFdURk1vdmUoZXJyb3JIYW5kbGVyKSkKK0V4
cGVjdGVkPGN1cmxfc29ja2V0X3QsIENVUkxjb2RlPiBDdXJsSGFuZGxlOjpnZXRBY3RpdmVTb2Nr
ZXQoKQogewotICAgIC8vIExpYmN1cmwgaXMgbm90IHJlc3BvbnNpYmxlIGZvciB0aGUgcHJvdG9j
b2wgaGFuZGxpbmcuIEl0IGp1c3QgaGFuZGxlcyBjb25uZWN0aW9uLgotICAgIC8vIE9ubHkgc2No
ZW1lLCBob3N0IGFuZCBwb3J0IGlzIHJlcXVpcmVkLgotICAgIFVSTCB1cmxGb3JDb25uZWN0aW9u
OwotICAgIHVybEZvckNvbm5lY3Rpb24uc2V0UHJvdG9jb2wodXJsLnByb3RvY29sSXMoIndzcyIp
ID8gImh0dHBzIiA6ICJodHRwIik7Ci0gICAgdXJsRm9yQ29ubmVjdGlvbi5zZXRIb3N0QW5kUG9y
dCh1cmwuaG9zdEFuZFBvcnQoKSk7Ci0gICAgc2V0VXJsKHVybEZvckNvbm5lY3Rpb24pOwotCi0g
ICAgZW5hYmxlQ29ubmVjdGlvbk9ubHkoKTsKLX0KKyAgICBjdXJsX3NvY2tldF90IHNvY2tldDsK
IAotYm9vbCBDdXJsU29ja2V0SGFuZGxlOjpjb25uZWN0KCkKLXsKLSAgICBDVVJMY29kZSBlcnJv
ckNvZGUgPSBwZXJmb3JtKCk7Ci0gICAgaWYgKGVycm9yQ29kZSAhPSBDVVJMRV9PSykgewotICAg
ICAgICBtX2Vycm9ySGFuZGxlcihlcnJvckNvZGUpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0g
ICAgfQorICAgIENVUkxjb2RlIGVycm9yQ29kZSA9IGN1cmxfZWFzeV9nZXRpbmZvKG1faGFuZGxl
LCBDVVJMSU5GT19BQ1RJVkVTT0NLRVQsICZzb2NrZXQpOworICAgIGlmIChlcnJvckNvZGUgIT0g
Q1VSTEVfT0spCisgICAgICAgIHJldHVybiBtYWtlVW5leHBlY3RlZChlcnJvckNvZGUpOwogCi0g
ICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIHNvY2tldDsKIH0KIAotc2l6ZV90IEN1cmxTb2Nr
ZXRIYW5kbGU6OnNlbmQoY29uc3QgdWludDhfdCogYnVmZmVyLCBzaXplX3Qgc2l6ZSkKK0NVUkxj
b2RlIEN1cmxIYW5kbGU6OnNlbmQoY29uc3QgdWludDhfdCogYnVmZmVyLCBzaXplX3QgYnVmZmVy
U2l6ZSwgc2l6ZV90JiBieXRlc1NlbnQpCiB7Ci0gICAgc2l6ZV90IHRvdGFsQnl0ZXNTZW50ID0g
MDsKLQotICAgIHdoaWxlICh0b3RhbEJ5dGVzU2VudCA8IHNpemUpIHsKLSAgICAgICAgc2l6ZV90
IGJ5dGVzU2VudCA9IDA7Ci0gICAgICAgIENVUkxjb2RlIGVycm9yQ29kZSA9IGN1cmxfZWFzeV9z
ZW5kKGhhbmRsZSgpLCBidWZmZXIgKyB0b3RhbEJ5dGVzU2VudCwgc2l6ZSAtIHRvdGFsQnl0ZXNT
ZW50LCAmYnl0ZXNTZW50KTsKLSAgICAgICAgaWYgKGVycm9yQ29kZSAhPSBDVVJMRV9PSykgewot
ICAgICAgICAgICAgaWYgKGVycm9yQ29kZSAhPSBDVVJMRV9BR0FJTikKLSAgICAgICAgICAgICAg
ICBtX2Vycm9ySGFuZGxlcihlcnJvckNvZGUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAg
IH0KLQotICAgICAgICB0b3RhbEJ5dGVzU2VudCArPSBieXRlc1NlbnQ7Ci0gICAgfQotCi0gICAg
cmV0dXJuIHRvdGFsQnl0ZXNTZW50OworICAgIHJldHVybiBjdXJsX2Vhc3lfc2VuZChtX2hhbmRs
ZSwgYnVmZmVyLCBidWZmZXJTaXplLCAmYnl0ZXNTZW50KTsKIH0KIAotT3B0aW9uYWw8c2l6ZV90
PiBDdXJsU29ja2V0SGFuZGxlOjpyZWNlaXZlKHVpbnQ4X3QqIGJ1ZmZlciwgc2l6ZV90IGJ1ZmZl
clNpemUpCitDVVJMY29kZSBDdXJsSGFuZGxlOjpyZWNlaXZlKHVpbnQ4X3QqIGJ1ZmZlciwgc2l6
ZV90IGJ1ZmZlclNpemUsIHNpemVfdCYgYnl0ZXNSZWFkKQogewotICAgIHNpemVfdCBieXRlc1Jl
YWQgPSAwOwotCi0gICAgQ1VSTGNvZGUgZXJyb3JDb2RlID0gY3VybF9lYXN5X3JlY3YoaGFuZGxl
KCksIGJ1ZmZlciwgYnVmZmVyU2l6ZSwgJmJ5dGVzUmVhZCk7Ci0gICAgaWYgKGVycm9yQ29kZSAh
PSBDVVJMRV9PSykgewotICAgICAgICBpZiAoZXJyb3JDb2RlICE9IENVUkxFX0FHQUlOKQotICAg
ICAgICAgICAgbV9lcnJvckhhbmRsZXIoZXJyb3JDb2RlKTsKLQotICAgICAgICByZXR1cm4gV1RG
OjpudWxsb3B0OwotICAgIH0KLQotICAgIHJldHVybiBieXRlc1JlYWQ7Ci19Ci0KLU9wdGlvbmFs
PEN1cmxTb2NrZXRIYW5kbGU6OldhaXRSZXN1bHQ+IEN1cmxTb2NrZXRIYW5kbGU6OndhaXQoY29u
c3QgU2Vjb25kcyYgdGltZW91dCwgYm9vbCBhbHNvV2FpdEZvcldyaXRlKQotewotICAgIGN1cmxf
c29ja2V0X3Qgc29ja2V0OwotICAgIENVUkxjb2RlIGVycm9yQ29kZSA9IGN1cmxfZWFzeV9nZXRp
bmZvKGhhbmRsZSgpLCBDVVJMSU5GT19BQ1RJVkVTT0NLRVQsICZzb2NrZXQpOwotICAgIGlmIChl
cnJvckNvZGUgIT0gQ1VSTEVfT0spIHsKLSAgICAgICAgbV9lcnJvckhhbmRsZXIoZXJyb3JDb2Rl
KTsKLSAgICAgICAgcmV0dXJuIFdURjo6bnVsbG9wdDsKLSAgICB9Ci0KLSAgICBpbnQ2NF90IHVz
ZWMgPSB0aW1lb3V0Lm1pY3Jvc2Vjb25kc0FzPGludDY0X3Q+KCk7Ci0KLSAgICBzdHJ1Y3QgdGlt
ZXZhbCBzZWxlY3RUaW1lb3V0OwotICAgIGlmICh1c2VjIDw9IDApIHsKLSAgICAgICAgc2VsZWN0
VGltZW91dC50dl9zZWMgPSAwOwotICAgICAgICBzZWxlY3RUaW1lb3V0LnR2X3VzZWMgPSAwOwot
ICAgIH0gZWxzZSB7Ci0gICAgICAgIHNlbGVjdFRpbWVvdXQudHZfc2VjID0gdXNlYyAvIDEwMDAw
MDA7Ci0gICAgICAgIHNlbGVjdFRpbWVvdXQudHZfdXNlYyA9IHVzZWMgJSAxMDAwMDAwOwotICAg
IH0KLQotICAgIGludCByYyA9IDA7Ci0gICAgaW50IG1heGZkID0gc3RhdGljX2Nhc3Q8aW50Pihz
b2NrZXQpICsgMTsKLSAgICBmZF9zZXQgZmRyZWFkOwotICAgIGZkX3NldCBmZHdyaXRlOwotICAg
IGZkX3NldCBmZGVycjsKLQotICAgIC8vIFJldHJ5ICdzZWxlY3QnIGlmIGl0IHdhcyBpbnRlcnJ1
cHRlZCBieSBhIHByb2Nlc3Mgc2lnbmFsLgotICAgIGRvIHsKLSAgICAgICAgRkRfWkVSTygmZmRy
ZWFkKTsKLSAgICAgICAgRkRfU0VUKHNvY2tldCwgJmZkcmVhZCk7Ci0KLSAgICAgICAgRkRfWkVS
TygmZmR3cml0ZSk7Ci0gICAgICAgIGlmIChhbHNvV2FpdEZvcldyaXRlKQotICAgICAgICAgICAg
RkRfU0VUKHNvY2tldCwgJmZkd3JpdGUpOwotCi0gICAgICAgIEZEX1pFUk8oJmZkZXJyKTsKLSAg
ICAgICAgRkRfU0VUKHNvY2tldCwgJmZkZXJyKTsKLQotICAgICAgICByYyA9IDo6c2VsZWN0KG1h
eGZkLCAmZmRyZWFkLCAmZmR3cml0ZSwgJmZkZXJyLCAmc2VsZWN0VGltZW91dCk7Ci0gICAgfSB3
aGlsZSAocmMgPT0gLTEgJiYgZXJybm8gPT0gRUlOVFIpOwotCi0gICAgaWYgKHJjIDw9IDApCi0g
ICAgICAgIHJldHVybiBXVEY6Om51bGxvcHQ7Ci0KLSAgICBXYWl0UmVzdWx0IHJlc3VsdDsKLSAg
ICByZXN1bHQucmVhZGFibGUgPSBGRF9JU1NFVChzb2NrZXQsICZmZHJlYWQpIHx8IEZEX0lTU0VU
KHNvY2tldCwgJmZkZXJyKTsKLSAgICByZXN1bHQud3JpdGFibGUgPSBGRF9JU1NFVChzb2NrZXQs
ICZmZHdyaXRlKTsKLSAgICByZXR1cm4gcmVzdWx0OworICAgIHJldHVybiBjdXJsX2Vhc3lfcmVj
dihtX2hhbmRsZSwgYnVmZmVyLCBidWZmZXJTaXplLCAmYnl0ZXNSZWFkKTsKIH0KIAogfQpkaWZm
IC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0N1cmxDb250ZXh0
LmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybENvbnRleHQuaApp
bmRleCBhNGY4YzAyODI3Ni4uM2M5MGU0YjFlY2MgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsQ29udGV4dC5oCisrKyBiL1NvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsQ29udGV4dC5oCkBAIC04OSw2ICs4OSw3IEBAIHBy
aXZhdGU6CiAvLyBDdXJsQ29udGV4dCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLQogCiBjbGFzcyBDdXJsUmVxdWVzdFNjaGVkdWxlcjsKK2NsYXNzIEN1cmxTdHJl
YW1TY2hlZHVsZXI7CiAKIGNsYXNzIEN1cmxDb250ZXh0IDogcHVibGljIEN1cmxHbG9iYWwgewog
ICAgIFdURl9NQUtFX05PTkNPUFlBQkxFKEN1cmxDb250ZXh0KTsKQEAgLTEwMSw2ICsxMDIsNyBA
QCBwdWJsaWM6CiAgICAgY29uc3QgQ3VybFNoYXJlSGFuZGxlJiBzaGFyZUhhbmRsZSgpIHsgcmV0
dXJuIG1fc2hhcmVIYW5kbGU7IH0KIAogICAgIEN1cmxSZXF1ZXN0U2NoZWR1bGVyJiBzY2hlZHVs
ZXIoKSB7IHJldHVybiAqbV9zY2hlZHVsZXI7IH0KKyAgICBDdXJsU3RyZWFtU2NoZWR1bGVyJiBz
dHJlYW1TY2hlZHVsZXIoKTsKIAogICAgIC8vIFByb3h5CiAgICAgY29uc3QgQ3VybFByb3h5U2V0
dGluZ3MmIHByb3h5U2V0dGluZ3MoKSBjb25zdCB7IHJldHVybiBtX3Byb3h5U2V0dGluZ3M7IH0K
QEAgLTI5Myw2ICsyOTUsMTEgQEAgcHVibGljOgogCiAgICAgc3RhdGljIGxvbmcgbG9uZyBtYXhD
dXJsT2ZmVCgpOwogCisgICAgLy8gc29ja2V0CisgICAgRXhwZWN0ZWQ8Y3VybF9zb2NrZXRfdCwg
Q1VSTGNvZGU+IGdldEFjdGl2ZVNvY2tldCgpOworICAgIENVUkxjb2RlIHNlbmQoY29uc3QgdWlu
dDhfdCosIHNpemVfdCwgc2l6ZV90Jik7CisgICAgQ1VSTGNvZGUgcmVjZWl2ZSh1aW50OF90Kiwg
c2l6ZV90LCBzaXplX3QmKTsKKwogI2lmbmRlZiBOREVCVUcKICAgICB2b2lkIGVuYWJsZVZlcmJv
c2VJZlVzZWQoKTsKICAgICB2b2lkIGVuYWJsZVN0ZEVycklmVXNlZCgpOwpAQCAtMzEzLDI0ICsz
MjAsNCBAQCBwcml2YXRlOgogICAgIHN0ZDo6dW5pcXVlX3B0cjxDdXJsU1NMVmVyaWZpZXI+IG1f
c3NsVmVyaWZpZXI7CiB9OwogCi1jbGFzcyBDdXJsU29ja2V0SGFuZGxlIDogcHVibGljIEN1cmxI
YW5kbGUgewotICAgIFdURl9NQUtFX05PTkNPUFlBQkxFKEN1cmxTb2NrZXRIYW5kbGUpOwotCi1w
dWJsaWM6Ci0gICAgc3RydWN0IFdhaXRSZXN1bHQgewotICAgICAgICBib29sIHJlYWRhYmxlIHsg
ZmFsc2UgfTsKLSAgICAgICAgYm9vbCB3cml0YWJsZSB7IGZhbHNlIH07Ci0gICAgfTsKLQotICAg
IEN1cmxTb2NrZXRIYW5kbGUoY29uc3QgVVJMJiwgRnVuY3Rpb248dm9pZChDVVJMY29kZSk+JiYg
ZXJyb3JIYW5kbGVyKTsKLQotICAgIGJvb2wgY29ubmVjdCgpOwotICAgIHNpemVfdCBzZW5kKGNv
bnN0IHVpbnQ4X3QqLCBzaXplX3QpOwotICAgIE9wdGlvbmFsPHNpemVfdD4gcmVjZWl2ZSh1aW50
OF90Kiwgc2l6ZV90KTsKLSAgICBPcHRpb25hbDxXYWl0UmVzdWx0PiB3YWl0KGNvbnN0IFNlY29u
ZHMmIHRpbWVvdXQsIGJvb2wgYWxzb1dhaXRGb3JXcml0ZSk7Ci0KLXByaXZhdGU6Ci0gICAgRnVu
Y3Rpb248dm9pZChDVVJMY29kZSk+IG1fZXJyb3JIYW5kbGVyOwotfTsKLQogfSAvLyBuYW1lc3Bh
Y2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9j
dXJsL0N1cmxTdHJlYW0uY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJs
L0N1cmxTdHJlYW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi5i
Mjc5MTY4ODBiNQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25l
dHdvcmsvY3VybC9DdXJsU3RyZWFtLmNwcApAQCAtMCwwICsxLDE5NyBAQAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAyMCBTb255IEludGVyYWN0aXZlIEVudGVydGFpbm1lbnQgSW5jLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElU
UyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElO
Qy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YK
KyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
CisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisg
Ki8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkN1cmxTdHJlYW0uaCIKKworI2lu
Y2x1ZGUgIkN1cmxTdHJlYW1TY2hlZHVsZXIuaCIKKyNpbmNsdWRlICJTb2NrZXRTdHJlYW1FcnJv
ci5oIgorCisjaWYgVVNFKENVUkwpCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworQ3VybFN0cmVh
bTo6Q3VybFN0cmVhbShDdXJsU3RyZWFtU2NoZWR1bGVyJiBzY2hlZHVsZXIsIEN1cmxTdHJlYW1J
RCBzdHJlYW1JRCwgVVJMJiYgdXJsKQorICAgIDogbV9zY2hlZHVsZXIoc2NoZWR1bGVyKQorICAg
ICwgbV9zdHJlYW1JRChzdHJlYW1JRCkKKyAgICAsIG1fdXJsKFdURk1vdmUodXJsKSkKK3sKKyAg
ICBBU1NFUlQoIWlzTWFpblRocmVhZCgpKTsKKworICAgIG1fY3VybEhhbmRsZSA9IFdURjo6bWFr
ZVVuaXF1ZTxDdXJsSGFuZGxlPigpOworCisgICAgLy8gTGliY3VybCBpcyBub3QgcmVzcG9uc2li
bGUgZm9yIHRoZSBwcm90b2NvbCBoYW5kbGluZy4gSXQganVzdCBoYW5kbGVzIGNvbm5lY3Rpb24u
CisgICAgLy8gT25seSBzY2hlbWUsIGhvc3QgYW5kIHBvcnQgaXMgcmVxdWlyZWQuCisgICAgVVJM
IHVybEZvckNvbm5lY3Rpb247CisgICAgdXJsRm9yQ29ubmVjdGlvbi5zZXRQcm90b2NvbChtX3Vy
bC5wcm90b2NvbElzKCJ3c3MiKSA/ICJodHRwcyIgOiAiaHR0cCIpOworICAgIHVybEZvckNvbm5l
Y3Rpb24uc2V0SG9zdEFuZFBvcnQobV91cmwuaG9zdEFuZFBvcnQoKSk7CisgICAgbV9jdXJsSGFu
ZGxlLT5zZXRVcmwodXJsRm9yQ29ubmVjdGlvbik7CisKKyAgICBtX2N1cmxIYW5kbGUtPmVuYWJs
ZUNvbm5lY3Rpb25Pbmx5KCk7CisKKyAgICBhdXRvIGVycm9yQ29kZSA9IG1fY3VybEhhbmRsZS0+
cGVyZm9ybSgpOworICAgIGlmIChlcnJvckNvZGUgIT0gQ1VSTEVfT0spIHsKKyAgICAgICAgbm90
aWZ5RmFpbHVyZShlcnJvckNvZGUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbV9z
Y2hlZHVsZXIuY2FsbENsaWVudE9uTWFpblRocmVhZChtX3N0cmVhbUlELCBbXShDbGllbnQmIGNs
aWVudCkgeworICAgICAgICBjbGllbnQuZGlkT3BlbigpOworICAgIH0pOworfQorCitDdXJsU3Ry
ZWFtOjp+Q3VybFN0cmVhbSgpCit7CisgICAgQVNTRVJUKCFpc01haW5UaHJlYWQoKSk7CisgICAg
ZGVzdHJveUhhbmRsZSgpOworfQorCit2b2lkIEN1cmxTdHJlYW06OmRlc3Ryb3lIYW5kbGUoKQor
eworICAgIGlmICghbV9jdXJsSGFuZGxlKQorICAgICAgICByZXR1cm47CisKKyAgICBtX2N1cmxI
YW5kbGUgPSBudWxscHRyOworfQorCit2b2lkIEN1cmxTdHJlYW06OnNlbmQoVW5pcXVlQXJyYXk8
dWludDhfdD4mJiBidWZmZXIsIHNpemVfdCBsZW5ndGgpCit7CisgICAgQVNTRVJUKCFpc01haW5U
aHJlYWQoKSk7CisgICAgQVNTRVJUKCFtX3dyaXRlQnVmZmVyKTsKKworICAgIGlmICghbV9jdXJs
SGFuZGxlIHx8IG1fd3JpdGVCdWZmZXIpCisgICAgICAgIHJldHVybjsKKworICAgIG1fd3JpdGVC
dWZmZXIgPSBXVEZNb3ZlKGJ1ZmZlcik7CisgICAgbV93cml0ZUJ1ZmZlclNpemUgPSBsZW5ndGg7
CisgICAgbV93cml0ZUJ1ZmZlck9mZnNldCA9IDA7Cit9CisKK3ZvaWQgQ3VybFN0cmVhbTo6YXBw
ZW5kTW9uaXRvcmluZ0ZkKGZkX3NldCYgcmVhZGZkcywgZmRfc2V0JiB3cml0ZWZkcywgZmRfc2V0
JiBleGNlcHRmZHMsIGludCYgbWF4ZmQpCit7CisgICAgQVNTRVJUKCFpc01haW5UaHJlYWQoKSk7
CisKKyAgICBpZiAoIW1fY3VybEhhbmRsZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgYXV0byBz
b2NrZXQgPSBtX2N1cmxIYW5kbGUtPmdldEFjdGl2ZVNvY2tldCgpOworICAgIGlmICghc29ja2V0
Lmhhc192YWx1ZSgpKSB7CisgICAgICAgIG5vdGlmeUZhaWx1cmUoc29ja2V0LmVycm9yKCkpOwor
ICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgRkRfU0VUKCpzb2NrZXQsICZyZWFkZmRzKTsK
KyAgICBGRF9TRVQoKnNvY2tldCwgJmV4Y2VwdGZkcyk7CisKKyAgICBpZiAobV93cml0ZUJ1ZmZl
cikKKyAgICAgICAgRkRfU0VUKCpzb2NrZXQsICZ3cml0ZWZkcyk7CisKKyAgICBpZiAobWF4ZmQg
PCAqc29ja2V0KQorICAgICAgICBtYXhmZCA9ICpzb2NrZXQ7Cit9CisKK3ZvaWQgQ3VybFN0cmVh
bTo6dHJ5VG9UcmFuc2Zlcihjb25zdCBmZF9zZXQmIHJlYWRmZHMsIGNvbnN0IGZkX3NldCYgd3Jp
dGVmZHMsIGNvbnN0IGZkX3NldCYgZXhjZXB0ZmRzKQoreworICAgIEFTU0VSVCghaXNNYWluVGhy
ZWFkKCkpOworCisgICAgaWYgKCFtX2N1cmxIYW5kbGUpCisgICAgICAgIHJldHVybjsKKworICAg
IGF1dG8gc29ja2V0ID0gbV9jdXJsSGFuZGxlLT5nZXRBY3RpdmVTb2NrZXQoKTsKKyAgICBpZiAo
IXNvY2tldC5oYXNfdmFsdWUoKSkgeworICAgICAgICBub3RpZnlGYWlsdXJlKHNvY2tldC5lcnJv
cigpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChGRF9JU1NFVCgqc29ja2V0
LCAmcmVhZGZkcykgfHwgRkRfSVNTRVQoKnNvY2tldCwgJmV4Y2VwdGZkcykpCisgICAgICAgIHRy
eVRvUmVhZCgpOworCisgICAgaWYgKEZEX0lTU0VUKCpzb2NrZXQsICZ3cml0ZWZkcykpCisgICAg
ICAgIHRyeVRvV3JpdGUoKTsKK30KKwordm9pZCBDdXJsU3RyZWFtOjp0cnlUb1JlYWQoKQorewor
ICAgIGlmICghbV9jdXJsSGFuZGxlKQorICAgICAgICByZXR1cm47CisKKyAgICBhdXRvIHJlYWRC
dWZmZXIgPSBtYWtlVW5pcXVlQXJyYXk8dWludDhfdD4oa1JlYWRCdWZmZXJTaXplKTsKKyAgICBz
aXplX3QgYnl0ZXNSZWFkID0gMDsKKworICAgIGF1dG8gZXJyb3JDb2RlID0gbV9jdXJsSGFuZGxl
LT5yZWNlaXZlKHJlYWRCdWZmZXIuZ2V0KCksIGtSZWFkQnVmZmVyU2l6ZSwgYnl0ZXNSZWFkKTsK
KyAgICBpZiAoZXJyb3JDb2RlICE9IENVUkxFX09LKSB7CisgICAgICAgIGlmIChlcnJvckNvZGUg
IT0gQ1VSTEVfQUdBSU4pCisgICAgICAgICAgICBub3RpZnlGYWlsdXJlKGVycm9yQ29kZSk7Cisg
ICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyAwIGJ5dGVzIGluZGljYXRlcyBhIGNsb3Nl
ZCBjb25uZWN0aW9uLgorICAgIGlmICghYnl0ZXNSZWFkKQorICAgICAgICBkZXN0cm95SGFuZGxl
KCk7CisKKyAgICBtX3NjaGVkdWxlci5jYWxsQ2xpZW50T25NYWluVGhyZWFkKG1fc3RyZWFtSUQs
IFtidWZmZXIgPSBXVEZNb3ZlKHJlYWRCdWZmZXIpLCBsZW5ndGggPSBieXRlc1JlYWRdKENsaWVu
dCYgY2xpZW50KSBtdXRhYmxlIHsKKyAgICAgICAgY2xpZW50LmRpZFJlY2VpdmVEYXRhKHJlaW50
ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGJ1ZmZlci5nZXQoKSksIGxlbmd0aCk7CisgICAgfSk7
Cit9CisKK3ZvaWQgQ3VybFN0cmVhbTo6dHJ5VG9Xcml0ZSgpCit7CisgICAgaWYgKCFtX2N1cmxI
YW5kbGUgfHwgIW1fd3JpdGVCdWZmZXIpCisgICAgICAgIHJldHVybjsKKworICAgIHdoaWxlICht
X3dyaXRlQnVmZmVyT2Zmc2V0IDwgbV93cml0ZUJ1ZmZlclNpemUpIHsKKyAgICAgICAgc2l6ZV90
IGJ5dGVzV3JpdHRlbiA9IDA7CisKKyAgICAgICAgYXV0byBlcnJvckNvZGUgPSBtX2N1cmxIYW5k
bGUtPnNlbmQobV93cml0ZUJ1ZmZlci5nZXQoKSArIG1fd3JpdGVCdWZmZXJPZmZzZXQsIG1fd3Jp
dGVCdWZmZXJTaXplIC0gbV93cml0ZUJ1ZmZlck9mZnNldCwgYnl0ZXNXcml0dGVuKTsKKyAgICAg
ICAgaWYgKGVycm9yQ29kZSAhPSBDVVJMRV9PSykgeworICAgICAgICAgICAgaWYgKGVycm9yQ29k
ZSAhPSBDVVJMRV9BR0FJTikKKyAgICAgICAgICAgICAgICBub3RpZnlGYWlsdXJlKGVycm9yQ29k
ZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBtX3dyaXRlQnVm
ZmVyT2Zmc2V0ICs9IGJ5dGVzV3JpdHRlbjsKKyAgICB9CisKKyAgICBtX3dyaXRlQnVmZmVyID0g
bnVsbHB0cjsKKyAgICBtX3dyaXRlQnVmZmVyU2l6ZSA9IDA7CisgICAgbV93cml0ZUJ1ZmZlck9m
ZnNldCA9IDA7CisKKyAgICBtX3NjaGVkdWxlci5jYWxsQ2xpZW50T25NYWluVGhyZWFkKG1fc3Ry
ZWFtSUQsIFtdKENsaWVudCYgY2xpZW50KSB7CisgICAgICAgIGNsaWVudC5kaWRTZW5kRGF0YSgp
OworICAgIH0pOworfQorCit2b2lkIEN1cmxTdHJlYW06Om5vdGlmeUZhaWx1cmUoQ1VSTGNvZGUg
ZXJyb3JDb2RlKQoreworICAgIGRlc3Ryb3lIYW5kbGUoKTsKKworICAgIG1fc2NoZWR1bGVyLmNh
bGxDbGllbnRPbk1haW5UaHJlYWQobV9zdHJlYW1JRCwgW2Vycm9yQ29kZSwgdXJsID0gbV91cmwu
aXNvbGF0ZWRDb3B5KCldKENsaWVudCYgY2xpZW50KSBtdXRhYmxlIHsKKyAgICAgICAgY2xpZW50
LmRpZEZhaWwoZXJyb3JDb2RlLCBXVEZNb3ZlKHVybCkpOworICAgIH0pOworfQorCit9CisKKyNl
bmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0N1
cmxTdHJlYW0uaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsU3Ry
ZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLmVmNDY3N2QyY2Iy
Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJs
L0N1cmxTdHJlYW0uaApAQCAtMCwwICsxLDg2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIw
IFNvbnkgSW50ZXJhY3RpdmUgRW50ZXJ0YWlubWVudCBJbmMuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9S
UyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09O
VFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJV
U0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjcHJhZ21h
IG9uY2UKKworI2luY2x1ZGUgIkN1cmxDb250ZXh0LmgiCisjaW5jbHVkZSA8d3RmL1VSTC5oPgor
I2luY2x1ZGUgPHd0Zi9VbmlxdWVBcnJheS5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2Ns
YXNzIEN1cmxTdHJlYW1TY2hlZHVsZXI7CitjbGFzcyBTb2NrZXRTdHJlYW1FcnJvcjsKKwordXNp
bmcgQ3VybFN0cmVhbUlEID0gdWludDE2X3Q7Citjb25zdCBDdXJsU3RyZWFtSUQgaW52YWxpZEN1
cmxTdHJlYW1JRCA9IDA7CisKK2NsYXNzIEN1cmxTdHJlYW0geworICAgIFdURl9NQUtFX0ZBU1Rf
QUxMT0NBVEVEOworICAgIFdURl9NQUtFX05PTkNPUFlBQkxFKEN1cmxTdHJlYW0pOworcHVibGlj
OgorICAgIGNsYXNzIENsaWVudCB7CisgICAgcHVibGljOgorICAgICAgICB2aXJ0dWFsIHZvaWQg
ZGlkT3BlbigpID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIGRpZFNlbmREYXRhKCkgPSAwOwor
ICAgICAgICB2aXJ0dWFsIHZvaWQgZGlkUmVjZWl2ZURhdGEoY29uc3QgY2hhciosIHNpemVfdCkg
PSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgZGlkRmFpbChDVVJMY29kZSwgVVJMJiYpID0gMDsK
KyAgICB9OworCisgICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxDdXJsU3RyZWFtPiBjcmVhdGUo
Q3VybFN0cmVhbVNjaGVkdWxlciYgc2NoZWR1bGVyLCBDdXJsU3RyZWFtSUQgc3RyZWFtSUQsIFVS
TCYmIHVybCkKKyAgICB7CisgICAgICAgIHJldHVybiBXVEY6Om1ha2VVbmlxdWU8Q3VybFN0cmVh
bT4oc2NoZWR1bGVyLCBzdHJlYW1JRCwgV1RGTW92ZSh1cmwpKTsKKyAgICB9CisKKyAgICBDdXJs
U3RyZWFtKEN1cmxTdHJlYW1TY2hlZHVsZXImLCBDdXJsU3RyZWFtSUQsIFVSTCYmKTsKKyAgICB2
aXJ0dWFsIH5DdXJsU3RyZWFtKCk7CisKKyAgICB2b2lkIHNlbmQoVW5pcXVlQXJyYXk8dWludDhf
dD4mJiwgc2l6ZV90KTsKKworICAgIHZvaWQgYXBwZW5kTW9uaXRvcmluZ0ZkKGZkX3NldCYsIGZk
X3NldCYsIGZkX3NldCYsIGludCYpOworICAgIHZvaWQgdHJ5VG9UcmFuc2Zlcihjb25zdCBmZF9z
ZXQmLCBjb25zdCBmZF9zZXQmLCBjb25zdCBmZF9zZXQmKTsKKworcHJpdmF0ZToKKyAgICB2b2lk
IGRlc3Ryb3lIYW5kbGUoKTsKKworICAgIHZvaWQgdHJ5VG9SZWFkKCk7CisgICAgdm9pZCB0cnlU
b1dyaXRlKCk7CisKKyAgICB2b2lkIG5vdGlmeUZhaWx1cmUoQ1VSTGNvZGUpOworCisgICAgc3Rh
dGljIGNvbnN0IHNpemVfdCBrUmVhZEJ1ZmZlclNpemUgPSA2NCAqIDEwMjQ7CisKKyAgICBDdXJs
U3RyZWFtU2NoZWR1bGVyJiBtX3NjaGVkdWxlcjsKKyAgICBDdXJsU3RyZWFtSUQgbV9zdHJlYW1J
RDsKKyAgICBVUkwgbV91cmw7CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q3VybEhhbmRsZT4gbV9j
dXJsSGFuZGxlOworCisgICAgVW5pcXVlQXJyYXk8dWludDhfdD4gbV93cml0ZUJ1ZmZlcjsKKyAg
ICBzaXplX3QgbV93cml0ZUJ1ZmZlclNpemUgeyAwIH07CisgICAgc2l6ZV90IG1fd3JpdGVCdWZm
ZXJPZmZzZXQgeyAwIH07Cit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQg
YS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybFN0cmVhbVNjaGVkdWxl
ci5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybFN0cmVhbVNj
aGVkdWxlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLjAxNTlk
ZTY0NWJlCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29y
ay9jdXJsL0N1cmxTdHJlYW1TY2hlZHVsZXIuY3BwCkBAIC0wLDAgKzEsMTk3IEBACisvKgorICog
Q29weXJpZ2h0IChDKSAyMDIwIFNvbnkgSW50ZXJhY3RpdmUgRW50ZXJ0YWlubWVudCBJbmMuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBB
TkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElN
UExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVO
VCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEs
IE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQ3VybFN0cmVhbVNjaGVk
dWxlci5oIgorCisjaWYgVVNFKENVUkwpCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworQ3VybFN0
cmVhbVNjaGVkdWxlcjo6Q3VybFN0cmVhbVNjaGVkdWxlcigpCit7CisgICAgQVNTRVJUKGlzTWFp
blRocmVhZCgpKTsKK30KKworQ3VybFN0cmVhbVNjaGVkdWxlcjo6fkN1cmxTdHJlYW1TY2hlZHVs
ZXIoKQoreworICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7Cit9CisKK0N1cmxTdHJlYW1JRCBD
dXJsU3RyZWFtU2NoZWR1bGVyOjpjcmVhdGVTdHJlYW0oY29uc3QgVVJMJiB1cmwsIEN1cmxTdHJl
YW06OkNsaWVudCYgY2xpZW50KQoreworICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7CisKKyAg
ICBkbyB7CisgICAgICAgIG1fY3VycmVudFN0cmVhbUlEID0gKG1fY3VycmVudFN0cmVhbUlEICsg
MSAhPSBpbnZhbGlkQ3VybFN0cmVhbUlEKSA/IG1fY3VycmVudFN0cmVhbUlEICsgMSA6IDE7Cisg
ICAgfSB3aGlsZSAobV9jbGllbnRMaXN0cy5jb250YWlucyhtX2N1cnJlbnRTdHJlYW1JRCkpOwor
CisgICAgYXV0byBzdHJlYW1JRCA9IG1fY3VycmVudFN0cmVhbUlEOworICAgIG1fY2xpZW50TGlz
dHMuYWRkKHN0cmVhbUlELCAmY2xpZW50KTsKKworICAgIGNhbGxPbldvcmtlclRocmVhZChbdGhp
cywgc3RyZWFtSUQsIHVybCA9IHVybC5pc29sYXRlZENvcHkoKV0oKSBtdXRhYmxlIHsKKyAgICAg
ICAgbV9zdHJlYW1MaXN0cy5hZGQoc3RyZWFtSUQsIEN1cmxTdHJlYW06OmNyZWF0ZSgqdGhpcywg
c3RyZWFtSUQsIFdURk1vdmUodXJsKSkpOworICAgIH0pOworCisgICAgcmV0dXJuIHN0cmVhbUlE
OworfQorCit2b2lkIEN1cmxTdHJlYW1TY2hlZHVsZXI6OmRlc3Ryb3lTdHJlYW0oQ3VybFN0cmVh
bUlEIHN0cmVhbUlEKQoreworICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7CisKKyAgICBpZiAo
bV9jbGllbnRMaXN0cy5jb250YWlucyhzdHJlYW1JRCkpCisgICAgICAgIG1fY2xpZW50TGlzdHMu
cmVtb3ZlKHN0cmVhbUlEKTsKKworICAgIGNhbGxPbldvcmtlclRocmVhZChbdGhpcywgc3RyZWFt
SURdKCkgeworICAgICAgICBpZiAobV9zdHJlYW1MaXN0cy5jb250YWlucyhzdHJlYW1JRCkpCisg
ICAgICAgICAgICBtX3N0cmVhbUxpc3RzLnJlbW92ZShzdHJlYW1JRCk7CisgICAgfSk7Cit9CisK
K3ZvaWQgQ3VybFN0cmVhbVNjaGVkdWxlcjo6c2VuZChDdXJsU3RyZWFtSUQgc3RyZWFtSUQsIFVu
aXF1ZUFycmF5PHVpbnQ4X3Q+JiYgZGF0YSwgc2l6ZV90IGxlbmd0aCkKK3sKKyAgICBBU1NFUlQo
aXNNYWluVGhyZWFkKCkpOworCisgICAgY2FsbE9uV29ya2VyVGhyZWFkKFt0aGlzLCBzdHJlYW1J
RCwgZGF0YSA9IFdURk1vdmUoZGF0YSksIGxlbmd0aF0oKSBtdXRhYmxlIHsKKyAgICAgICAgaWYg
KGF1dG8gc3RyZWFtID0gbV9zdHJlYW1MaXN0cy5nZXQoc3RyZWFtSUQpKQorICAgICAgICAgICAg
c3RyZWFtLT5zZW5kKFdURk1vdmUoZGF0YSksIGxlbmd0aCk7CisgICAgfSk7Cit9CisKK3ZvaWQg
Q3VybFN0cmVhbVNjaGVkdWxlcjo6Y2FsbE9uV29ya2VyVGhyZWFkKFdURjo6RnVuY3Rpb248dm9p
ZCgpPiYmIHRhc2spCit7CisgICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKKworICAgIHsKKyAg
ICAgICAgYXV0byBsb2NrZXIgPSBob2xkTG9jayhtX211dGV4KTsKKyAgICAgICAgbV90YXNrUXVl
dWUuYXBwZW5kKFdURk1vdmUodGFzaykpOworICAgIH0KKworICAgIHN0YXJ0VGhyZWFkSWZOZWVk
ZWQoKTsKK30KKwordm9pZCBDdXJsU3RyZWFtU2NoZWR1bGVyOjpjYWxsQ2xpZW50T25NYWluVGhy
ZWFkKEN1cmxTdHJlYW1JRCBzdHJlYW1JRCwgV1RGOjpGdW5jdGlvbjx2b2lkKEN1cmxTdHJlYW06
OkNsaWVudCYpPiYmIHRhc2spCit7CisgICAgQVNTRVJUKCFpc01haW5UaHJlYWQoKSk7CisKKyAg
ICBXVEY6OmNhbGxPbk1haW5UaHJlYWQoW3RoaXMsIHN0cmVhbUlELCB0YXNrID0gV1RGTW92ZSh0
YXNrKV0oKSB7CisgICAgICAgIGlmIChhdXRvIGNsaWVudCA9IG1fY2xpZW50TGlzdHMuZ2V0KHN0
cmVhbUlEKSkKKyAgICAgICAgICAgIHRhc2soKmNsaWVudCk7CisgICAgfSk7Cit9CisKK3ZvaWQg
Q3VybFN0cmVhbVNjaGVkdWxlcjo6c3RhcnRUaHJlYWRJZk5lZWRlZCgpCit7CisgICAgeworICAg
ICAgICBhdXRvIGxvY2tlciA9IGhvbGRMb2NrKG1fbXV0ZXgpOworICAgICAgICBpZiAobV9ydW5U
aHJlYWQpCisgICAgICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG1fdGhyZWFkKQor
ICAgICAgICBtX3RocmVhZC0+d2FpdEZvckNvbXBsZXRpb24oKTsKKworICAgIHsKKyAgICAgICAg
YXV0byBsb2NrZXIgPSBob2xkTG9jayhtX211dGV4KTsKKyAgICAgICAgbV9ydW5UaHJlYWQgPSB0
cnVlOworICAgIH0KKworICAgIG1fdGhyZWFkID0gVGhyZWFkOjpjcmVhdGUoImN1cmxTdHJlYW1U
aHJlYWQiLCBbdGhpc10geworICAgICAgICB3b3JrZXJUaHJlYWQoKTsKKworICAgICAgICBhdXRv
IGxvY2tlciA9IGhvbGRMb2NrKG1fbXV0ZXgpOworICAgICAgICBtX3J1blRocmVhZCA9IGZhbHNl
OworICAgIH0pOworfQorCit2b2lkIEN1cmxTdHJlYW1TY2hlZHVsZXI6OnN0b3BUaHJlYWRJZk5v
TW9yZUpvYlJ1bm5pbmcoKQoreworICAgIGF1dG8gbG9ja2VyID0gaG9sZExvY2sobV9tdXRleCk7
CisgICAgaWYgKG1fdGFza1F1ZXVlLnNpemUoKSB8fCBtX3N0cmVhbUxpc3RzLnNpemUoKSkKKyAg
ICAgICAgcmV0dXJuOworCisgICAgbV9ydW5UaHJlYWQgPSBmYWxzZTsKK30KKwordm9pZCBDdXJs
U3RyZWFtU2NoZWR1bGVyOjpleGVjdXRlVGFza3MoKQoreworICAgIEFTU0VSVCghaXNNYWluVGhy
ZWFkKCkpOworCisgICAgVmVjdG9yPFdURjo6RnVuY3Rpb248dm9pZCgpPj4gdGFza1F1ZXVlOwor
CisgICAgeworICAgICAgICBhdXRvIGxvY2tlciA9IGhvbGRMb2NrKG1fbXV0ZXgpOworICAgICAg
ICB0YXNrUXVldWUgPSBXVEZNb3ZlKG1fdGFza1F1ZXVlKTsKKyAgICB9CisKKyAgICBmb3IgKGF1
dG8mIHRhc2sgOiB0YXNrUXVldWUpCisgICAgICAgIHRhc2soKTsKK30KKwordm9pZCBDdXJsU3Ry
ZWFtU2NoZWR1bGVyOjp3b3JrZXJUaHJlYWQoKQoreworICAgIEFTU0VSVCghaXNNYWluVGhyZWFk
KCkpOworICAgIHN0YXRpYyBjb25zdCBpbnQgc2VsZWN0VGltZW91dE1TID0gMjA7CisgICAgc3Ry
dWN0IHRpbWV2YWwgdGltZW91dCB7IDAsIHNlbGVjdFRpbWVvdXRNUyAqIDEwMDB9OworCisgICAg
d2hpbGUgKHRydWUpIHsKKyAgICAgICAgeworICAgICAgICAgICAgYXV0byBsb2NrZXIgPSBob2xk
TG9jayhtX211dGV4KTsKKyAgICAgICAgICAgIGlmICghbV9ydW5UaHJlYWQpCisgICAgICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBleGVjdXRlVGFza3MoKTsKKworICAg
ICAgICBpbnQgcmMgPSAwOworICAgICAgICBmZF9zZXQgcmVhZGZkczsKKyAgICAgICAgZmRfc2V0
IHdyaXRlZmRzOworICAgICAgICBmZF9zZXQgZXhjZXB0ZmRzOworCisgICAgICAgIGRvIHsKKyAg
ICAgICAgICAgIGludCBtYXhmZCA9IC0xOworCisgICAgICAgICAgICBGRF9aRVJPKCZyZWFkZmRz
KTsKKyAgICAgICAgICAgIEZEX1pFUk8oJndyaXRlZmRzKTsKKyAgICAgICAgICAgIEZEX1pFUk8o
JmV4Y2VwdGZkcyk7CisKKyAgICAgICAgICAgIGZvciAoYXV0byYgc3RyZWFtIDogbV9zdHJlYW1M
aXN0cy52YWx1ZXMoKSkKKyAgICAgICAgICAgICAgICBzdHJlYW0tPmFwcGVuZE1vbml0b3JpbmdG
ZChyZWFkZmRzLCB3cml0ZWZkcywgZXhjZXB0ZmRzLCBtYXhmZCk7CisKKyAgICAgICAgICAgIGlm
IChtYXhmZCA+PSAwKQorICAgICAgICAgICAgICAgIHJjID0gOjpzZWxlY3QobWF4ZmQgKyAxLCAm
cmVhZGZkcywgJndyaXRlZmRzLCAmZXhjZXB0ZmRzLCAmdGltZW91dCk7CisgICAgICAgIH0gd2hp
bGUgKHJjID09IC0xICYmIGVycm5vID09IEVJTlRSKTsKKworICAgICAgICBmb3IgKGF1dG8mIHN0
cmVhbSA6IG1fc3RyZWFtTGlzdHMudmFsdWVzKCkpCisgICAgICAgICAgICBzdHJlYW0tPnRyeVRv
VHJhbnNmZXIocmVhZGZkcywgd3JpdGVmZHMsIGV4Y2VwdGZkcyk7CisKKyAgICAgICAgc3RvcFRo
cmVhZElmTm9Nb3JlSm9iUnVubmluZygpOworICAgIH0KK30KKworfQorCisjZW5kaWYKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsU3RyZWFtU2No
ZWR1bGVyLmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybFN0cmVh
bVNjaGVkdWxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi43ZmZl
NzQ2NDg5NAotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdv
cmsvY3VybC9DdXJsU3RyZWFtU2NoZWR1bGVyLmgKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENv
cHlyaWdodCAoQykgMjAyMCBTb255IEludGVyYWN0aXZlIEVudGVydGFpbm1lbnQgSW5jLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5E
IElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQg
T0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
CisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJDdXJsU3RyZWFtLmgiCisjaW5jbHVk
ZSA8d3RmL0Z1bmN0aW9uLmg+CisjaW5jbHVkZSA8d3RmL0hhc2hNYXAuaD4KKworbmFtZXNwYWNl
IFdlYkNvcmUgeworCitjbGFzcyBDdXJsU3RyZWFtU2NoZWR1bGVyIHsKKyAgICBXVEZfTUFLRV9G
QVNUX0FMTE9DQVRFRDsKKyAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShDdXJsU3RyZWFtU2NoZWR1
bGVyKTsKK3B1YmxpYzoKKyAgICBDdXJsU3RyZWFtU2NoZWR1bGVyKCk7CisgICAgdmlydHVhbCB+
Q3VybFN0cmVhbVNjaGVkdWxlcigpOworCisgICAgQ3VybFN0cmVhbUlEIGNyZWF0ZVN0cmVhbShj
b25zdCBVUkwmLCBDdXJsU3RyZWFtOjpDbGllbnQmKTsKKyAgICB2b2lkIGRlc3Ryb3lTdHJlYW0o
Q3VybFN0cmVhbUlEKTsKKyAgICB2b2lkIHNlbmQoQ3VybFN0cmVhbUlELCBVbmlxdWVBcnJheTx1
aW50OF90PiYmLCBzaXplX3QpOworCisgICAgdm9pZCBjYWxsT25Xb3JrZXJUaHJlYWQoV1RGOjpG
dW5jdGlvbjx2b2lkKCk+JiYpOworICAgIHZvaWQgY2FsbENsaWVudE9uTWFpblRocmVhZChDdXJs
U3RyZWFtSUQsIFdURjo6RnVuY3Rpb248dm9pZChDdXJsU3RyZWFtOjpDbGllbnQmKT4mJik7CisK
K3ByaXZhdGU6CisgICAgdm9pZCBzdGFydFRocmVhZElmTmVlZGVkKCk7CisgICAgdm9pZCBzdG9w
VGhyZWFkSWZOb01vcmVKb2JSdW5uaW5nKCk7CisKKyAgICB2b2lkIGV4ZWN1dGVUYXNrcygpOwor
CisgICAgdm9pZCB3b3JrZXJUaHJlYWQoKTsKKworICAgIExvY2sgbV9tdXRleDsKKyAgICBSZWZQ
dHI8VGhyZWFkPiBtX3RocmVhZDsKKyAgICBib29sIG1fcnVuVGhyZWFkIHsgZmFsc2UgfTsKKwor
ICAgIEN1cmxTdHJlYW1JRCBtX2N1cnJlbnRTdHJlYW1JRCA9IDE7CisKKyAgICBWZWN0b3I8RnVu
Y3Rpb248dm9pZCgpPj4gbV90YXNrUXVldWU7CisgICAgSGFzaE1hcDxDdXJsU3RyZWFtSUQsIEN1
cmxTdHJlYW06OkNsaWVudCo+IG1fY2xpZW50TGlzdHM7CisgICAgSGFzaE1hcDxDdXJsU3RyZWFt
SUQsIHN0ZDo6dW5pcXVlX3B0cjxDdXJsU3RyZWFtPj4gbV9zdHJlYW1MaXN0czsKK307CisKK30g
Ly8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L25ldHdvcmsvY3VybC9Tb2NrZXRTdHJlYW1IYW5kbGVJbXBsLmggYi9Tb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9uZXR3b3JrL2N1cmwvU29ja2V0U3RyZWFtSGFuZGxlSW1wbC5oCmluZGV4IDI1YmYz
YzQ2YTJlLi44ZDFiYzYwZDIxZiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
bmV0d29yay9jdXJsL1NvY2tldFN0cmVhbUhhbmRsZUltcGwuaAorKysgYi9Tb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvU29ja2V0U3RyZWFtSGFuZGxlSW1wbC5oCkBAIC0xLDYg
KzEsNyBAQAogLyoKICAqIENvcHlyaWdodCAoQykgMjAwOS0yMDE4IEFwcGxlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KICAqIENvcHlyaWdodCAoQykgMjAwOSBHb29nbGUgSW5jLiAgQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAyMCBTb255IEludGVyYWN0aXZlIEVu
dGVydGFpbm1lbnQgSW5jLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAt
MzEsMjMgKzMyLDE3IEBACiAKICNwcmFnbWEgb25jZQogCi0jaW5jbHVkZSAiQ3VybENvbnRleHQu
aCIKKyNpbmNsdWRlICJDdXJsU3RyZWFtLmgiCiAjaW5jbHVkZSAiU29ja2V0U3RyZWFtSGFuZGxl
LmgiCiAjaW5jbHVkZSA8cGFsL1Nlc3Npb25JRC5oPgotI2luY2x1ZGUgPHd0Zi9GdW5jdGlvbi5o
PgotI2luY2x1ZGUgPHd0Zi9Mb2NrLmg+Ci0jaW5jbHVkZSA8d3RmL01lc3NhZ2VRdWV1ZS5oPgot
I2luY2x1ZGUgPHd0Zi9SZWZDb3VudGVkLmg+CiAjaW5jbHVkZSA8d3RmL1N0cmVhbUJ1ZmZlci5o
PgotI2luY2x1ZGUgPHd0Zi9UaHJlYWRpbmcuaD4KLSNpbmNsdWRlIDx3dGYvVW5pcXVlQXJyYXku
aD4KIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCiBjbGFzcyBTb2NrZXRTdHJlYW1IYW5kbGVDbGll
bnQ7CiBjbGFzcyBTdG9yYWdlU2Vzc2lvblByb3ZpZGVyOwogCi1jbGFzcyBTb2NrZXRTdHJlYW1I
YW5kbGVJbXBsIDogcHVibGljIFNvY2tldFN0cmVhbUhhbmRsZSB7CitjbGFzcyBTb2NrZXRTdHJl
YW1IYW5kbGVJbXBsIDogcHVibGljIFNvY2tldFN0cmVhbUhhbmRsZSwgcHVibGljIEN1cmxTdHJl
YW06OkNsaWVudCB7CiBwdWJsaWM6CiAgICAgc3RhdGljIFJlZjxTb2NrZXRTdHJlYW1IYW5kbGVJ
bXBsPiBjcmVhdGUoY29uc3QgVVJMJiB1cmwsIFNvY2tldFN0cmVhbUhhbmRsZUNsaWVudCYgY2xp
ZW50LCBQQUw6OlNlc3Npb25JRCwgY29uc3QgU3RyaW5nJiwgU291cmNlQXBwbGljYXRpb25BdWRp
dFRva2VuJiYsIGNvbnN0IFN0b3JhZ2VTZXNzaW9uUHJvdmlkZXIqIHByb3ZpZGVyKSB7IHJldHVy
biBhZG9wdFJlZigqbmV3IFNvY2tldFN0cmVhbUhhbmRsZUltcGwodXJsLCBjbGllbnQsIHByb3Zp
ZGVyKSk7IH0KIApAQCAtNjQsMjggKzU5LDIyIEBAIHByaXZhdGU6CiAgICAgT3B0aW9uYWw8c2l6
ZV90PiBwbGF0Zm9ybVNlbmRJbnRlcm5hbChjb25zdCB1aW50OF90Kiwgc2l6ZV90KTsKICAgICBi
b29sIHNlbmRQZW5kaW5nRGF0YSgpOwogCi0gICAgdm9pZCB0aHJlYWRFbnRyeVBvaW50KGNvbnN0
IFVSTCYpOwotICAgIHZvaWQgaGFuZGxlRXJyb3IoQ1VSTGNvZGUpOwotICAgIHZvaWQgc3RvcFRo
cmVhZCgpOworICAgIHZvaWQgZGlkT3BlbigpIGZpbmFsOworICAgIHZvaWQgZGlkU2VuZERhdGEo
KSBmaW5hbDsKKyAgICB2b2lkIGRpZFJlY2VpdmVEYXRhKGNvbnN0IGNoYXIqLCBzaXplX3QpIGZp
bmFsOworICAgIHZvaWQgZGlkRmFpbChDVVJMY29kZSwgVVJMJiYpIGZpbmFsOwogCi0gICAgdm9p
ZCBjYWxsT25Xb3JrZXJUaHJlYWQoRnVuY3Rpb248dm9pZCgpPiYmKTsKLSAgICB2b2lkIGV4ZWN1
dGVUYXNrcygpOwotCi0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBrUmVhZEJ1ZmZlclNpemUgPSA0
ICogMTAyNDsKKyAgICBib29sIGlzU3RyZWFtSW52YWxpZGF0ZWQoKSB7IHJldHVybiBtX3N0cmVh
bUlEID09IGludmFsaWRDdXJsU3RyZWFtSUQ7IH0KKyAgICB2b2lkIGRlc3RydWN0U3RyZWFtKCk7
CiAKICAgICBSZWZQdHI8Y29uc3QgU3RvcmFnZVNlc3Npb25Qcm92aWRlcj4gbV9zdG9yYWdlU2Vz
c2lvblByb3ZpZGVyOwotICAgIFJlZlB0cjxUaHJlYWQ+IG1fd29ya2VyVGhyZWFkOwotICAgIHN0
ZDo6YXRvbWljPGJvb2w+IG1fcnVubmluZyB7IHRydWUgfTsKLQotICAgIE1lc3NhZ2VRdWV1ZTxG
dW5jdGlvbjx2b2lkKCk+PiBtX3Rhc2tRdWV1ZTsKLQotICAgIGJvb2wgbV9oYXNQZW5kaW5nV3Jp
dGVEYXRhIHsgZmFsc2UgfTsKLSAgICBzaXplX3QgbV93cml0ZUJ1ZmZlclNpemUgeyAwIH07Ci0g
ICAgc2l6ZV90IG1fd3JpdGVCdWZmZXJPZmZzZXQgeyAwIH07Ci0gICAgVW5pcXVlQXJyYXk8dWlu
dDhfdD4gbV93cml0ZUJ1ZmZlcjsKIAogICAgIFN0cmVhbUJ1ZmZlcjx1aW50OF90LCAxMDI0ICog
MTAyND4gbV9idWZmZXI7CiAgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIG1heEJ1ZmZlclNpemUg
PSAxMDAgKiAxMDI0ICogMTAyNDsKKworICAgIEN1cmxTdHJlYW1TY2hlZHVsZXImIG1fc2NoZWR1
bGVyOworICAgIEN1cmxTdHJlYW1JRCBtX3N0cmVhbUlEIHsgaW52YWxpZEN1cmxTdHJlYW1JRCB9
OworICAgIGJvb2wgbV9oYXNQZW5kaW5nU2VuZERhdGEgeyBmYWxzZSB9OwogfTsKIAogfSAvLyBu
YW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0
d29yay9jdXJsL1NvY2tldFN0cmVhbUhhbmRsZUltcGxDdXJsLmNwcCBiL1NvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL25ldHdvcmsvY3VybC9Tb2NrZXRTdHJlYW1IYW5kbGVJbXBsQ3VybC5jcHAKaW5k
ZXggMTNhODMyYzI2NjkuLmY2MjM5YjQ3NmUwIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9uZXR3b3JrL2N1cmwvU29ja2V0U3RyZWFtSGFuZGxlSW1wbEN1cmwuY3BwCisrKyBi
L1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9Tb2NrZXRTdHJlYW1IYW5kbGVJ
bXBsQ3VybC5jcHAKQEAgLTEsNyArMSw3IEBACiAvKgogICogQ29weXJpZ2h0IChDKSAyMDA5IEJy
ZW50IEZ1bGdoYW0uICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogQ29weXJpZ2h0IChDKSAyMDA5
IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogQ29weXJpZ2h0IChDKSAyMDE4
IFNvbnkgSW50ZXJhY3RpdmUgRW50ZXJ0YWlubWVudCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIw
MjAgU29ueSBJbnRlcmFjdGl2ZSBFbnRlcnRhaW5tZW50IEluYy4KICAqCiAgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
ICAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucyBhcmUKQEAgLTM1LDE4MyArMzUsMTAzIEBACiAKICNpZiBVU0UoQ1VSTCkK
IAorI2luY2x1ZGUgIkN1cmxTdHJlYW1TY2hlZHVsZXIuaCIKICNpbmNsdWRlICJEZXByZWNhdGVk
R2xvYmFsU2V0dGluZ3MuaCIKLSNpbmNsdWRlICJMb2dnaW5nLmgiCiAjaW5jbHVkZSAiU29ja2V0
U3RyZWFtRXJyb3IuaCIKICNpbmNsdWRlICJTb2NrZXRTdHJlYW1IYW5kbGVDbGllbnQuaCIKICNp
bmNsdWRlICJTdG9yYWdlU2Vzc2lvblByb3ZpZGVyLmgiCi0jaW5jbHVkZSA8d3RmL01haW5UaHJl
YWQuaD4KLSNpbmNsdWRlIDx3dGYvVVJMLmg+Ci0jaW5jbHVkZSA8d3RmL3RleHQvQ1N0cmluZy5o
PgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKIFNvY2tldFN0cmVhbUhhbmRsZUltcGw6OlNvY2tl
dFN0cmVhbUhhbmRsZUltcGwoY29uc3QgVVJMJiB1cmwsIFNvY2tldFN0cmVhbUhhbmRsZUNsaWVu
dCYgY2xpZW50LCBjb25zdCBTdG9yYWdlU2Vzc2lvblByb3ZpZGVyKiBwcm92aWRlcikKICAgICA6
IFNvY2tldFN0cmVhbUhhbmRsZSh1cmwsIGNsaWVudCkKICAgICAsIG1fc3RvcmFnZVNlc3Npb25Q
cm92aWRlcihwcm92aWRlcikKKyAgICAsIG1fc2NoZWR1bGVyKEN1cmxDb250ZXh0OjpzaW5nbGV0
b24oKS5zdHJlYW1TY2hlZHVsZXIoKSkKIHsKLSAgICBMT0coTmV0d29yaywgIlNvY2tldFN0cmVh
bUhhbmRsZSAlcCBuZXcgY2xpZW50ICVwIiwgdGhpcywgJm1fY2xpZW50KTsKLSAgICBBU1NFUlQo
aXNNYWluVGhyZWFkKCkpOwotCiAgICAgLy8gRklYTUU6IFVzaW5nIERlcHJlY2F0ZWRHbG9iYWxT
ZXR0aW5ncyBmcm9tIGhlcmUgaXMgYSBsYXllcmluZyB2aW9sYXRpb24uCiAgICAgaWYgKG1fdXJs
LnByb3RvY29sSXMoIndzcyIpICYmIERlcHJlY2F0ZWRHbG9iYWxTZXR0aW5nczo6YWxsb3dzQW55
U1NMQ2VydGlmaWNhdGUoKSkKICAgICAgICAgQ3VybENvbnRleHQ6OnNpbmdsZXRvbigpLnNzbEhh
bmRsZSgpLnNldElnbm9yZVNTTEVycm9ycyh0cnVlKTsKIAotICAgIG1fd29ya2VyVGhyZWFkID0g
VGhyZWFkOjpjcmVhdGUoIldlYlNvY2tldCB0aHJlYWQiLCBbdGhpcywgcHJvdGVjdGVkVGhpcyA9
IG1ha2VSZWYoKnRoaXMpLCB1cmwgPSB1cmwuaXNvbGF0ZWRDb3B5KCldIHsKLSAgICAgICAgdGhy
ZWFkRW50cnlQb2ludCh1cmwpOwotICAgIH0pOworICAgIG1fc3RyZWFtSUQgPSBtX3NjaGVkdWxl
ci5jcmVhdGVTdHJlYW0obV91cmwsICp0aGlzKTsKIH0KIAogU29ja2V0U3RyZWFtSGFuZGxlSW1w
bDo6flNvY2tldFN0cmVhbUhhbmRsZUltcGwoKQogewotICAgIExPRyhOZXR3b3JrLCAiU29ja2V0
U3RyZWFtSGFuZGxlICVwIGRlbGV0ZSIsIHRoaXMpOwotICAgIHN0b3BUaHJlYWQoKTsKKyAgICBk
ZXN0cnVjdFN0cmVhbSgpOwogfQogCiBPcHRpb25hbDxzaXplX3Q+IFNvY2tldFN0cmVhbUhhbmRs
ZUltcGw6OnBsYXRmb3JtU2VuZEludGVybmFsKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBs
ZW5ndGgpCiB7Ci0gICAgTE9HKE5ldHdvcmssICJTb2NrZXRTdHJlYW1IYW5kbGUgJXAgcGxhdGZv
cm1TZW5kIiwgdGhpcyk7Ci0gICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKKyAgICBpZiAoaXNT
dHJlYW1JbnZhbGlkYXRlZCgpKQorICAgICAgICByZXR1cm4gV1RGOjpudWxsb3B0OwogCi0gICAg
aWYgKG1faGFzUGVuZGluZ1dyaXRlRGF0YSkKKyAgICBpZiAobV9oYXNQZW5kaW5nU2VuZERhdGEp
CiAgICAgICAgIHJldHVybiAwOworICAgIG1faGFzUGVuZGluZ1NlbmREYXRhID0gdHJ1ZTsKIAot
ICAgIG1faGFzUGVuZGluZ1dyaXRlRGF0YSA9IHRydWU7Ci0KLSAgICBhdXRvIHdyaXRlQnVmZmVy
ID0gbWFrZVVuaXF1ZUFycmF5PHVpbnQ4X3Q+KGxlbmd0aCk7Ci0gICAgbWVtY3B5KHdyaXRlQnVm
ZmVyLmdldCgpLCBkYXRhLCBsZW5ndGgpOwotCi0gICAgY2FsbE9uV29ya2VyVGhyZWFkKFt0aGlz
LCB3cml0ZUJ1ZmZlciA9IFdURk1vdmUod3JpdGVCdWZmZXIpLCB3cml0ZUJ1ZmZlclNpemUgPSBs
ZW5ndGhdKCkgbXV0YWJsZSB7Ci0gICAgICAgIEFTU0VSVCghaXNNYWluVGhyZWFkKCkpOwotICAg
ICAgICBtX3dyaXRlQnVmZmVyID0gV1RGTW92ZSh3cml0ZUJ1ZmZlcik7Ci0gICAgICAgIG1fd3Jp
dGVCdWZmZXJTaXplID0gd3JpdGVCdWZmZXJTaXplOwotICAgICAgICBtX3dyaXRlQnVmZmVyT2Zm
c2V0ID0gMDsKLSAgICB9KTsKKyAgICBhdXRvIGJ1ZmZlciA9IG1ha2VVbmlxdWVBcnJheTx1aW50
OF90PihsZW5ndGgpOworICAgIG1lbWNweShidWZmZXIuZ2V0KCksIGRhdGEsIGxlbmd0aCk7CiAK
KyAgICBtX3NjaGVkdWxlci5zZW5kKG1fc3RyZWFtSUQsIFdURk1vdmUoYnVmZmVyKSwgbGVuZ3Ro
KTsKICAgICByZXR1cm4gbGVuZ3RoOwogfQogCiB2b2lkIFNvY2tldFN0cmVhbUhhbmRsZUltcGw6
OnBsYXRmb3JtQ2xvc2UoKQogewotICAgIExPRyhOZXR3b3JrLCAiU29ja2V0U3RyZWFtSGFuZGxl
ICVwIHBsYXRmb3JtQ2xvc2UiLCB0aGlzKTsKLSAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOwor
ICAgIGRlc3RydWN0U3RyZWFtKCk7CiAKICAgICBpZiAobV9zdGF0ZSA9PSBDbG9zZWQpCiAgICAg
ICAgIHJldHVybjsKICAgICBtX3N0YXRlID0gQ2xvc2VkOwogCi0gICAgc3RvcFRocmVhZCgpOwog
ICAgIG1fY2xpZW50LmRpZENsb3NlU29ja2V0U3RyZWFtKCp0aGlzKTsKIH0KIAotdm9pZCBTb2Nr
ZXRTdHJlYW1IYW5kbGVJbXBsOjp0aHJlYWRFbnRyeVBvaW50KGNvbnN0IFVSTCYgdXJsKQordm9p
ZCBTb2NrZXRTdHJlYW1IYW5kbGVJbXBsOjpkaWRPcGVuKCkKIHsKLSAgICBBU1NFUlQoIWlzTWFp
blRocmVhZCgpKTsKLQotICAgIEN1cmxTb2NrZXRIYW5kbGUgc29ja2V0IHsgdXJsLCBbdGhpc10o
Q1VSTGNvZGUgZXJyb3JDb2RlKSB7Ci0gICAgICAgIGhhbmRsZUVycm9yKGVycm9yQ29kZSk7Ci0g
ICAgfX07Ci0KLSAgICAvLyBDb25uZWN0IHRvIGhvc3QKLSAgICBpZiAoIXNvY2tldC5jb25uZWN0
KCkpCisgICAgaWYgKG1fc3RhdGUgIT0gQ29ubmVjdGluZykKICAgICAgICAgcmV0dXJuOworICAg
IG1fc3RhdGUgPSBPcGVuOwogCi0gICAgY2FsbE9uTWFpblRocmVhZChbdGhpcywgcHJvdGVjdGVk
VGhpcyA9IG1ha2VSZWYoKnRoaXMpXSB7Ci0gICAgICAgIGlmIChtX3N0YXRlID09IENvbm5lY3Rp
bmcpIHsKLSAgICAgICAgICAgIG1fc3RhdGUgPSBPcGVuOwotICAgICAgICAgICAgbV9jbGllbnQu
ZGlkT3BlblNvY2tldFN0cmVhbSgqdGhpcyk7Ci0gICAgICAgIH0KLSAgICB9KTsKLQotICAgIHdo
aWxlIChtX3J1bm5pbmcpIHsKLSAgICAgICAgZXhlY3V0ZVRhc2tzKCk7Ci0KLSAgICAgICAgYXV0
byByZXN1bHQgPSBzb2NrZXQud2FpdCgyMF9tcywgbV93cml0ZUJ1ZmZlci5nZXQoKSk7Ci0gICAg
ICAgIGlmICghcmVzdWx0KQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgLy8gVGhl
c2UgbG9naWMgb25seSBydW4gd2hlbiB0aGVyZSdzIGRhdGEgd2FpdGluZy4KLSAgICAgICAgaWYg
KHJlc3VsdC0+d3JpdGFibGUgJiYgbV9ydW5uaW5nKSB7Ci0gICAgICAgICAgICBhdXRvIGJ5dGVz
U2VudCA9IHNvY2tldC5zZW5kKG1fd3JpdGVCdWZmZXIuZ2V0KCkgKyBtX3dyaXRlQnVmZmVyT2Zm
c2V0LCBtX3dyaXRlQnVmZmVyU2l6ZSAtIG1fd3JpdGVCdWZmZXJPZmZzZXQpOwotICAgICAgICAg
ICAgbV93cml0ZUJ1ZmZlck9mZnNldCArPSBieXRlc1NlbnQ7Ci0KLSAgICAgICAgICAgIGlmICht
X3dyaXRlQnVmZmVyU2l6ZSA8PSBtX3dyaXRlQnVmZmVyT2Zmc2V0KSB7Ci0gICAgICAgICAgICAg
ICAgbV93cml0ZUJ1ZmZlciA9IG51bGxwdHI7Ci0gICAgICAgICAgICAgICAgbV93cml0ZUJ1ZmZl
clNpemUgPSAwOwotICAgICAgICAgICAgICAgIG1fd3JpdGVCdWZmZXJPZmZzZXQgPSAwOwotCi0g
ICAgICAgICAgICAgICAgY2FsbE9uTWFpblRocmVhZChbdGhpcywgcHJvdGVjdGVkVGhpcyA9IG1h
a2VSZWYoKnRoaXMpXSB7Ci0gICAgICAgICAgICAgICAgICAgIG1faGFzUGVuZGluZ1dyaXRlRGF0
YSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBzZW5kUGVuZGluZ0RhdGEoKTsKLSAgICAg
ICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChy
ZXN1bHQtPnJlYWRhYmxlICYmIG1fcnVubmluZykgewotICAgICAgICAgICAgYXV0byByZWFkQnVm
ZmVyID0gbWFrZVVuaXF1ZUFycmF5PHVpbnQ4X3Q+KGtSZWFkQnVmZmVyU2l6ZSk7Ci0gICAgICAg
ICAgICBhdXRvIGJ5dGVzUmVhZCA9IHNvY2tldC5yZWNlaXZlKHJlYWRCdWZmZXIuZ2V0KCksIGtS
ZWFkQnVmZmVyU2l6ZSk7Ci0gICAgICAgICAgICAvLyBgbnVsbG9wdGAgcmVzdWx0IG1lYW5zIG5v
dGhpbmcgdG8gaGFuZGxlIGF0IHRoaXMgbW9tZW50LgotICAgICAgICAgICAgaWYgKCFieXRlc1Jl
YWQpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgIC8vIDAgYnl0ZXMg
aW5kaWNhdGVzIGEgY2xvc2VkIGNvbm5lY3Rpb24uCi0gICAgICAgICAgICBpZiAoISpieXRlc1Jl
YWQpIHsKLSAgICAgICAgICAgICAgICBtX3J1bm5pbmcgPSBmYWxzZTsKLSAgICAgICAgICAgICAg
ICBjYWxsT25NYWluVGhyZWFkKFt0aGlzLCBwcm90ZWN0ZWRUaGlzID0gbWFrZVJlZigqdGhpcyld
IHsKLSAgICAgICAgICAgICAgICAgICAgY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9KTsKLSAg
ICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FsbE9u
TWFpblRocmVhZChbdGhpcywgcHJvdGVjdGVkVGhpcyA9IG1ha2VSZWYoKnRoaXMpLCBidWZmZXIg
PSBXVEZNb3ZlKHJlYWRCdWZmZXIpLCBzaXplID0gKmJ5dGVzUmVhZCBdIHsKLSAgICAgICAgICAg
ICAgICBpZiAobV9zdGF0ZSA9PSBPcGVuKQotICAgICAgICAgICAgICAgICAgICBtX2NsaWVudC5k
aWRSZWNlaXZlU29ja2V0U3RyZWFtRGF0YSgqdGhpcywgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBj
aGFyKj4oYnVmZmVyLmdldCgpKSwgc2l6ZSk7Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQot
ICAgIH0KLQotICAgIG1fd3JpdGVCdWZmZXIgPSBudWxscHRyOworICAgIG1fY2xpZW50LmRpZE9w
ZW5Tb2NrZXRTdHJlYW0oKnRoaXMpOwogfQogCi12b2lkIFNvY2tldFN0cmVhbUhhbmRsZUltcGw6
OmhhbmRsZUVycm9yKENVUkxjb2RlIGVycm9yQ29kZSkKK3ZvaWQgU29ja2V0U3RyZWFtSGFuZGxl
SW1wbDo6ZGlkU2VuZERhdGEoKQogewotICAgIG1fcnVubmluZyA9IGZhbHNlOwotICAgIGNhbGxP
bk1haW5UaHJlYWQoW3RoaXMsIHByb3RlY3RlZFRoaXMgPSBtYWtlUmVmKCp0aGlzKSwgZXJyb3JD
b2RlLCBsb2NhbGl6ZWREZXNjcmlwdGlvbiA9IEN1cmxIYW5kbGU6OmVycm9yRGVzY3JpcHRpb24o
ZXJyb3JDb2RlKS5pc29sYXRlZENvcHkoKV0gewotICAgICAgICBpZiAobV9zdGF0ZSA9PSBDbG9z
ZWQpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgaWYgKGVycm9yQ29kZSA9PSBDVVJM
RV9SRUNWX0VSUk9SKQotICAgICAgICAgICAgbV9jbGllbnQuZGlkRmFpbFRvUmVjZWl2ZVNvY2tl
dFN0cmVhbURhdGEoKnRoaXMpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBtX2NsaWVudC5k
aWRGYWlsU29ja2V0U3RyZWFtKCp0aGlzLCBTb2NrZXRTdHJlYW1FcnJvcihzdGF0aWNfY2FzdDxp
bnQ+KGVycm9yQ29kZSksIHsgfSwgbG9jYWxpemVkRGVzY3JpcHRpb24pKTsKLSAgICB9KTsKKyAg
ICBBU1NFUlQobV9oYXNQZW5kaW5nU2VuZERhdGEpOworCisgICAgbV9oYXNQZW5kaW5nU2VuZERh
dGEgPSBmYWxzZTsKKyAgICBzZW5kUGVuZGluZ0RhdGEoKTsKIH0KIAotdm9pZCBTb2NrZXRTdHJl
YW1IYW5kbGVJbXBsOjpzdG9wVGhyZWFkKCkKK3ZvaWQgU29ja2V0U3RyZWFtSGFuZGxlSW1wbDo6
ZGlkUmVjZWl2ZURhdGEoY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IGxlbmd0aCkKIHsKLSAgICBB
U1NFUlQoaXNNYWluVGhyZWFkKCkpOwotCi0gICAgbV9ydW5uaW5nID0gZmFsc2U7CisgICAgaWYg
KG1fc3RhdGUgIT0gT3BlbikKKyAgICAgICAgcmV0dXJuOwogCi0gICAgaWYgKG1fd29ya2VyVGhy
ZWFkKSB7Ci0gICAgICAgIG1fd29ya2VyVGhyZWFkLT53YWl0Rm9yQ29tcGxldGlvbigpOwotICAg
ICAgICBtX3dvcmtlclRocmVhZCA9IG51bGxwdHI7Ci0gICAgfQorICAgIG1fY2xpZW50LmRpZFJl
Y2VpdmVTb2NrZXRTdHJlYW1EYXRhKCp0aGlzLCBkYXRhLCBsZW5ndGgpOwogfQogCi12b2lkIFNv
Y2tldFN0cmVhbUhhbmRsZUltcGw6OmNhbGxPbldvcmtlclRocmVhZChGdW5jdGlvbjx2b2lkKCk+
JiYgdGFzaykKK3ZvaWQgU29ja2V0U3RyZWFtSGFuZGxlSW1wbDo6ZGlkRmFpbChDVVJMY29kZSBl
cnJvckNvZGUsIFVSTCYmIHVybCkKIHsKLSAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOwotICAg
IG1fdGFza1F1ZXVlLmFwcGVuZChtYWtlVW5pcXVlPEZ1bmN0aW9uPHZvaWQoKT4+KFdURk1vdmUo
dGFzaykpKTsKKyAgICBkZXN0cnVjdFN0cmVhbSgpOworCisgICAgaWYgKG1fc3RhdGUgPT0gQ2xv
c2VkKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoZXJyb3JDb2RlID09IENVUkxFX1JFQ1Zf
RVJST1IpCisgICAgICAgIG1fY2xpZW50LmRpZEZhaWxUb1JlY2VpdmVTb2NrZXRTdHJlYW1EYXRh
KCp0aGlzKTsKKyAgICBlbHNlCisgICAgICAgIG1fY2xpZW50LmRpZEZhaWxTb2NrZXRTdHJlYW0o
KnRoaXMsIFNvY2tldFN0cmVhbUVycm9yKGVycm9yQ29kZSwgdXJsLCBDdXJsSGFuZGxlOjplcnJv
ckRlc2NyaXB0aW9uKGVycm9yQ29kZSkpKTsKIH0KIAotdm9pZCBTb2NrZXRTdHJlYW1IYW5kbGVJ
bXBsOjpleGVjdXRlVGFza3MoKQordm9pZCBTb2NrZXRTdHJlYW1IYW5kbGVJbXBsOjpkZXN0cnVj
dFN0cmVhbSgpCiB7Ci0gICAgQVNTRVJUKCFpc01haW5UaHJlYWQoKSk7CisgICAgaWYgKGlzU3Ry
ZWFtSW52YWxpZGF0ZWQoKSkKKyAgICAgICAgcmV0dXJuOwogCi0gICAgYXV0byB0YXNrcyA9IG1f
dGFza1F1ZXVlLnRha2VBbGxNZXNzYWdlcygpOwotICAgIGZvciAoYXV0byYgdGFzayA6IHRhc2tz
KQotICAgICAgICAoKnRhc2spKCk7CisgICAgbV9zY2hlZHVsZXIuZGVzdHJveVN0cmVhbShtX3N0
cmVhbUlEKTsKKyAgICBtX3N0cmVhbUlEID0gaW52YWxpZEN1cmxTdHJlYW1JRDsKIH0KIAogfSAv
LyBuYW1lc3BhY2UgV2ViQ29yZQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>389797</attachid>
            <date>2020-02-05 05:40:23 -0800</date>
            <delta_ts>2020-02-12 22:59:48 -0800</delta_ts>
            <desc>Handling connections by one thread.</desc>
            <filename>shukuwa-org-0205.diff</filename>
            <type>text/plain</type>
            <size>36188</size>
            <attacher name="Takashi Komori">takashi.komori</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL0N1cmwuY21ha2UgYi9Tb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9DdXJsLmNtYWtlCmluZGV4IGY2ODk0YWMzZWY0Li5lZGRiNWZhYzJm
MyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vQ3VybC5jbWFrZQorKysgYi9T
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9DdXJsLmNtYWtlCkBAIC0yMiw2ICsyMiw4IEBAIGxpc3Qo
QVBQRU5EIFdlYkNvcmVfU09VUkNFUwogICAgIHBsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsUmVz
b3VyY2VIYW5kbGVEZWxlZ2F0ZS5jcHAKICAgICBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybFNT
TEhhbmRsZS5jcHAKICAgICBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybFNTTFZlcmlmaWVyLmNw
cAorICAgIHBsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsU3RyZWFtLmNwcAorICAgIHBsYXRmb3Jt
L25ldHdvcmsvY3VybC9DdXJsU3RyZWFtU2NoZWR1bGVyLmNwcAogICAgIHBsYXRmb3JtL25ldHdv
cmsvY3VybC9ETlNSZXNvbHZlUXVldWVDdXJsLmNwcAogICAgIHBsYXRmb3JtL25ldHdvcmsvY3Vy
bC9OZXR3b3JrU3RvcmFnZVNlc3Npb25DdXJsLmNwcAogICAgIHBsYXRmb3JtL25ldHdvcmsvY3Vy
bC9PcGVuU1NMSGVscGVyLmNwcApAQCAtNTgsNiArNjAsOCBAQCBsaXN0KEFQUEVORCBXZWJDb3Jl
X1BSSVZBVEVfRlJBTUVXT1JLX0hFQURFUlMKICAgICBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3Vy
bFJlc3BvbnNlLmgKICAgICBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybFNTTEhhbmRsZS5oCiAg
ICAgcGxhdGZvcm0vbmV0d29yay9jdXJsL0N1cmxTU0xWZXJpZmllci5oCisgICAgcGxhdGZvcm0v
bmV0d29yay9jdXJsL0N1cmxTdHJlYW0uaAorICAgIHBsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJs
U3RyZWFtU2NoZWR1bGVyLmgKICAgICBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvRE5TUmVzb2x2ZVF1
ZXVlQ3VybC5oCiAgICAgcGxhdGZvcm0vbmV0d29yay9jdXJsL0Rvd25sb2FkQnVuZGxlLmgKICAg
ICBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvT3BlblNTTEhlbHBlci5oCmRpZmYgLS1naXQgYS9Tb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybENvbnRleHQuY3BwIGIvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0N1cmxDb250ZXh0LmNwcAppbmRleCA3YjA0
ZmEyNmE0Mi4uZTRjNzYwNjY1YTQgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L25ldHdvcmsvY3VybC9DdXJsQ29udGV4dC5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vbmV0d29yay9jdXJsL0N1cmxDb250ZXh0LmNwcApAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1
ZGUgIkN1cmxSZXF1ZXN0U2NoZWR1bGVyLmgiCiAjaW5jbHVkZSAiQ3VybFNTTEhhbmRsZS5oIgog
I2luY2x1ZGUgIkN1cmxTU0xWZXJpZmllci5oIgorI2luY2x1ZGUgIkN1cmxTdHJlYW1TY2hlZHVs
ZXIuaCIKICNpbmNsdWRlICJIVFRQSGVhZGVyTWFwLmgiCiAjaW5jbHVkZSA8TmV0d29ya0xvYWRN
ZXRyaWNzLmg+CiAjaW5jbHVkZSA8bXV0ZXg+CkBAIC0xNDYsNiArMTQ3LDEyIEBAIHZvaWQgQ3Vy
bENvbnRleHQ6OmluaXRTaGFyZUhhbmRsZSgpCiAgICAgY3VybF9lYXN5X2NsZWFudXAoY3VybCk7
CiB9CiAKK0N1cmxTdHJlYW1TY2hlZHVsZXImIEN1cmxDb250ZXh0OjpzdHJlYW1TY2hlZHVsZXIo
KQoreworICAgIHN0YXRpYyBOZXZlckRlc3Ryb3llZDxDdXJsU3RyZWFtU2NoZWR1bGVyPiBzaGFy
ZWRJbnN0YW5jZTsKKyAgICByZXR1cm4gc2hhcmVkSW5zdGFuY2U7Cit9CisKIGJvb2wgQ3VybENv
bnRleHQ6OmlzSHR0cDJFbmFibGVkKCkgY29uc3QKIHsKICAgICBjdXJsX3ZlcnNpb25faW5mb19k
YXRhKiBkYXRhID0gY3VybF92ZXJzaW9uX2luZm8oQ1VSTFZFUlNJT05fTk9XKTsKQEAgLTg4Nywx
MTQgKzg5NCwyNSBAQCB2b2lkIEN1cmxIYW5kbGU6OmVuYWJsZVN0ZEVycklmVXNlZCgpCiAKICNl
bmRpZgogCi0vLyBDdXJsU29ja2V0SGFuZGxlCi0KLUN1cmxTb2NrZXRIYW5kbGU6OkN1cmxTb2Nr
ZXRIYW5kbGUoY29uc3QgVVJMJiB1cmwsIEZ1bmN0aW9uPHZvaWQoQ1VSTGNvZGUpPiYmIGVycm9y
SGFuZGxlcikKLSAgICA6IG1fZXJyb3JIYW5kbGVyKFdURk1vdmUoZXJyb3JIYW5kbGVyKSkKK0V4
cGVjdGVkPGN1cmxfc29ja2V0X3QsIENVUkxjb2RlPiBDdXJsSGFuZGxlOjpnZXRBY3RpdmVTb2Nr
ZXQoKQogewotICAgIC8vIExpYmN1cmwgaXMgbm90IHJlc3BvbnNpYmxlIGZvciB0aGUgcHJvdG9j
b2wgaGFuZGxpbmcuIEl0IGp1c3QgaGFuZGxlcyBjb25uZWN0aW9uLgotICAgIC8vIE9ubHkgc2No
ZW1lLCBob3N0IGFuZCBwb3J0IGlzIHJlcXVpcmVkLgotICAgIFVSTCB1cmxGb3JDb25uZWN0aW9u
OwotICAgIHVybEZvckNvbm5lY3Rpb24uc2V0UHJvdG9jb2wodXJsLnByb3RvY29sSXMoIndzcyIp
ID8gImh0dHBzIiA6ICJodHRwIik7Ci0gICAgdXJsRm9yQ29ubmVjdGlvbi5zZXRIb3N0QW5kUG9y
dCh1cmwuaG9zdEFuZFBvcnQoKSk7Ci0gICAgc2V0VXJsKHVybEZvckNvbm5lY3Rpb24pOwotCi0g
ICAgZW5hYmxlQ29ubmVjdGlvbk9ubHkoKTsKLX0KKyAgICBjdXJsX3NvY2tldF90IHNvY2tldDsK
IAotYm9vbCBDdXJsU29ja2V0SGFuZGxlOjpjb25uZWN0KCkKLXsKLSAgICBDVVJMY29kZSBlcnJv
ckNvZGUgPSBwZXJmb3JtKCk7Ci0gICAgaWYgKGVycm9yQ29kZSAhPSBDVVJMRV9PSykgewotICAg
ICAgICBtX2Vycm9ySGFuZGxlcihlcnJvckNvZGUpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0g
ICAgfQorICAgIENVUkxjb2RlIGVycm9yQ29kZSA9IGN1cmxfZWFzeV9nZXRpbmZvKG1faGFuZGxl
LCBDVVJMSU5GT19BQ1RJVkVTT0NLRVQsICZzb2NrZXQpOworICAgIGlmIChlcnJvckNvZGUgIT0g
Q1VSTEVfT0spCisgICAgICAgIHJldHVybiBtYWtlVW5leHBlY3RlZChlcnJvckNvZGUpOwogCi0g
ICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIHNvY2tldDsKIH0KIAotc2l6ZV90IEN1cmxTb2Nr
ZXRIYW5kbGU6OnNlbmQoY29uc3QgdWludDhfdCogYnVmZmVyLCBzaXplX3Qgc2l6ZSkKK0NVUkxj
b2RlIEN1cmxIYW5kbGU6OnNlbmQoY29uc3QgdWludDhfdCogYnVmZmVyLCBzaXplX3QgYnVmZmVy
U2l6ZSwgc2l6ZV90JiBieXRlc1NlbnQpCiB7Ci0gICAgc2l6ZV90IHRvdGFsQnl0ZXNTZW50ID0g
MDsKLQotICAgIHdoaWxlICh0b3RhbEJ5dGVzU2VudCA8IHNpemUpIHsKLSAgICAgICAgc2l6ZV90
IGJ5dGVzU2VudCA9IDA7Ci0gICAgICAgIENVUkxjb2RlIGVycm9yQ29kZSA9IGN1cmxfZWFzeV9z
ZW5kKGhhbmRsZSgpLCBidWZmZXIgKyB0b3RhbEJ5dGVzU2VudCwgc2l6ZSAtIHRvdGFsQnl0ZXNT
ZW50LCAmYnl0ZXNTZW50KTsKLSAgICAgICAgaWYgKGVycm9yQ29kZSAhPSBDVVJMRV9PSykgewot
ICAgICAgICAgICAgaWYgKGVycm9yQ29kZSAhPSBDVVJMRV9BR0FJTikKLSAgICAgICAgICAgICAg
ICBtX2Vycm9ySGFuZGxlcihlcnJvckNvZGUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAg
IH0KLQotICAgICAgICB0b3RhbEJ5dGVzU2VudCArPSBieXRlc1NlbnQ7Ci0gICAgfQotCi0gICAg
cmV0dXJuIHRvdGFsQnl0ZXNTZW50OworICAgIHJldHVybiBjdXJsX2Vhc3lfc2VuZChtX2hhbmRs
ZSwgYnVmZmVyLCBidWZmZXJTaXplLCAmYnl0ZXNTZW50KTsKIH0KIAotT3B0aW9uYWw8c2l6ZV90
PiBDdXJsU29ja2V0SGFuZGxlOjpyZWNlaXZlKHVpbnQ4X3QqIGJ1ZmZlciwgc2l6ZV90IGJ1ZmZl
clNpemUpCitDVVJMY29kZSBDdXJsSGFuZGxlOjpyZWNlaXZlKHVpbnQ4X3QqIGJ1ZmZlciwgc2l6
ZV90IGJ1ZmZlclNpemUsIHNpemVfdCYgYnl0ZXNSZWFkKQogewotICAgIHNpemVfdCBieXRlc1Jl
YWQgPSAwOwotCi0gICAgQ1VSTGNvZGUgZXJyb3JDb2RlID0gY3VybF9lYXN5X3JlY3YoaGFuZGxl
KCksIGJ1ZmZlciwgYnVmZmVyU2l6ZSwgJmJ5dGVzUmVhZCk7Ci0gICAgaWYgKGVycm9yQ29kZSAh
PSBDVVJMRV9PSykgewotICAgICAgICBpZiAoZXJyb3JDb2RlICE9IENVUkxFX0FHQUlOKQotICAg
ICAgICAgICAgbV9lcnJvckhhbmRsZXIoZXJyb3JDb2RlKTsKLQotICAgICAgICByZXR1cm4gV1RG
OjpudWxsb3B0OwotICAgIH0KLQotICAgIHJldHVybiBieXRlc1JlYWQ7Ci19Ci0KLU9wdGlvbmFs
PEN1cmxTb2NrZXRIYW5kbGU6OldhaXRSZXN1bHQ+IEN1cmxTb2NrZXRIYW5kbGU6OndhaXQoY29u
c3QgU2Vjb25kcyYgdGltZW91dCwgYm9vbCBhbHNvV2FpdEZvcldyaXRlKQotewotICAgIGN1cmxf
c29ja2V0X3Qgc29ja2V0OwotICAgIENVUkxjb2RlIGVycm9yQ29kZSA9IGN1cmxfZWFzeV9nZXRp
bmZvKGhhbmRsZSgpLCBDVVJMSU5GT19BQ1RJVkVTT0NLRVQsICZzb2NrZXQpOwotICAgIGlmIChl
cnJvckNvZGUgIT0gQ1VSTEVfT0spIHsKLSAgICAgICAgbV9lcnJvckhhbmRsZXIoZXJyb3JDb2Rl
KTsKLSAgICAgICAgcmV0dXJuIFdURjo6bnVsbG9wdDsKLSAgICB9Ci0KLSAgICBpbnQ2NF90IHVz
ZWMgPSB0aW1lb3V0Lm1pY3Jvc2Vjb25kc0FzPGludDY0X3Q+KCk7Ci0KLSAgICBzdHJ1Y3QgdGlt
ZXZhbCBzZWxlY3RUaW1lb3V0OwotICAgIGlmICh1c2VjIDw9IDApIHsKLSAgICAgICAgc2VsZWN0
VGltZW91dC50dl9zZWMgPSAwOwotICAgICAgICBzZWxlY3RUaW1lb3V0LnR2X3VzZWMgPSAwOwot
ICAgIH0gZWxzZSB7Ci0gICAgICAgIHNlbGVjdFRpbWVvdXQudHZfc2VjID0gdXNlYyAvIDEwMDAw
MDA7Ci0gICAgICAgIHNlbGVjdFRpbWVvdXQudHZfdXNlYyA9IHVzZWMgJSAxMDAwMDAwOwotICAg
IH0KLQotICAgIGludCByYyA9IDA7Ci0gICAgaW50IG1heGZkID0gc3RhdGljX2Nhc3Q8aW50Pihz
b2NrZXQpICsgMTsKLSAgICBmZF9zZXQgZmRyZWFkOwotICAgIGZkX3NldCBmZHdyaXRlOwotICAg
IGZkX3NldCBmZGVycjsKLQotICAgIC8vIFJldHJ5ICdzZWxlY3QnIGlmIGl0IHdhcyBpbnRlcnJ1
cHRlZCBieSBhIHByb2Nlc3Mgc2lnbmFsLgotICAgIGRvIHsKLSAgICAgICAgRkRfWkVSTygmZmRy
ZWFkKTsKLSAgICAgICAgRkRfU0VUKHNvY2tldCwgJmZkcmVhZCk7Ci0KLSAgICAgICAgRkRfWkVS
TygmZmR3cml0ZSk7Ci0gICAgICAgIGlmIChhbHNvV2FpdEZvcldyaXRlKQotICAgICAgICAgICAg
RkRfU0VUKHNvY2tldCwgJmZkd3JpdGUpOwotCi0gICAgICAgIEZEX1pFUk8oJmZkZXJyKTsKLSAg
ICAgICAgRkRfU0VUKHNvY2tldCwgJmZkZXJyKTsKLQotICAgICAgICByYyA9IDo6c2VsZWN0KG1h
eGZkLCAmZmRyZWFkLCAmZmR3cml0ZSwgJmZkZXJyLCAmc2VsZWN0VGltZW91dCk7Ci0gICAgfSB3
aGlsZSAocmMgPT0gLTEgJiYgZXJybm8gPT0gRUlOVFIpOwotCi0gICAgaWYgKHJjIDw9IDApCi0g
ICAgICAgIHJldHVybiBXVEY6Om51bGxvcHQ7Ci0KLSAgICBXYWl0UmVzdWx0IHJlc3VsdDsKLSAg
ICByZXN1bHQucmVhZGFibGUgPSBGRF9JU1NFVChzb2NrZXQsICZmZHJlYWQpIHx8IEZEX0lTU0VU
KHNvY2tldCwgJmZkZXJyKTsKLSAgICByZXN1bHQud3JpdGFibGUgPSBGRF9JU1NFVChzb2NrZXQs
ICZmZHdyaXRlKTsKLSAgICByZXR1cm4gcmVzdWx0OworICAgIHJldHVybiBjdXJsX2Vhc3lfcmVj
dihtX2hhbmRsZSwgYnVmZmVyLCBidWZmZXJTaXplLCAmYnl0ZXNSZWFkKTsKIH0KIAogfQpkaWZm
IC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0N1cmxDb250ZXh0
LmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybENvbnRleHQuaApp
bmRleCBhNGY4YzAyODI3Ni4uM2M5MGU0YjFlY2MgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsQ29udGV4dC5oCisrKyBiL1NvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsQ29udGV4dC5oCkBAIC04OSw2ICs4OSw3IEBAIHBy
aXZhdGU6CiAvLyBDdXJsQ29udGV4dCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLQogCiBjbGFzcyBDdXJsUmVxdWVzdFNjaGVkdWxlcjsKK2NsYXNzIEN1cmxTdHJl
YW1TY2hlZHVsZXI7CiAKIGNsYXNzIEN1cmxDb250ZXh0IDogcHVibGljIEN1cmxHbG9iYWwgewog
ICAgIFdURl9NQUtFX05PTkNPUFlBQkxFKEN1cmxDb250ZXh0KTsKQEAgLTEwMSw2ICsxMDIsNyBA
QCBwdWJsaWM6CiAgICAgY29uc3QgQ3VybFNoYXJlSGFuZGxlJiBzaGFyZUhhbmRsZSgpIHsgcmV0
dXJuIG1fc2hhcmVIYW5kbGU7IH0KIAogICAgIEN1cmxSZXF1ZXN0U2NoZWR1bGVyJiBzY2hlZHVs
ZXIoKSB7IHJldHVybiAqbV9zY2hlZHVsZXI7IH0KKyAgICBDdXJsU3RyZWFtU2NoZWR1bGVyJiBz
dHJlYW1TY2hlZHVsZXIoKTsKIAogICAgIC8vIFByb3h5CiAgICAgY29uc3QgQ3VybFByb3h5U2V0
dGluZ3MmIHByb3h5U2V0dGluZ3MoKSBjb25zdCB7IHJldHVybiBtX3Byb3h5U2V0dGluZ3M7IH0K
QEAgLTI5Myw2ICsyOTUsMTEgQEAgcHVibGljOgogCiAgICAgc3RhdGljIGxvbmcgbG9uZyBtYXhD
dXJsT2ZmVCgpOwogCisgICAgLy8gc29ja2V0CisgICAgRXhwZWN0ZWQ8Y3VybF9zb2NrZXRfdCwg
Q1VSTGNvZGU+IGdldEFjdGl2ZVNvY2tldCgpOworICAgIENVUkxjb2RlIHNlbmQoY29uc3QgdWlu
dDhfdCosIHNpemVfdCwgc2l6ZV90Jik7CisgICAgQ1VSTGNvZGUgcmVjZWl2ZSh1aW50OF90Kiwg
c2l6ZV90LCBzaXplX3QmKTsKKwogI2lmbmRlZiBOREVCVUcKICAgICB2b2lkIGVuYWJsZVZlcmJv
c2VJZlVzZWQoKTsKICAgICB2b2lkIGVuYWJsZVN0ZEVycklmVXNlZCgpOwpAQCAtMzEzLDI0ICsz
MjAsNCBAQCBwcml2YXRlOgogICAgIHN0ZDo6dW5pcXVlX3B0cjxDdXJsU1NMVmVyaWZpZXI+IG1f
c3NsVmVyaWZpZXI7CiB9OwogCi1jbGFzcyBDdXJsU29ja2V0SGFuZGxlIDogcHVibGljIEN1cmxI
YW5kbGUgewotICAgIFdURl9NQUtFX05PTkNPUFlBQkxFKEN1cmxTb2NrZXRIYW5kbGUpOwotCi1w
dWJsaWM6Ci0gICAgc3RydWN0IFdhaXRSZXN1bHQgewotICAgICAgICBib29sIHJlYWRhYmxlIHsg
ZmFsc2UgfTsKLSAgICAgICAgYm9vbCB3cml0YWJsZSB7IGZhbHNlIH07Ci0gICAgfTsKLQotICAg
IEN1cmxTb2NrZXRIYW5kbGUoY29uc3QgVVJMJiwgRnVuY3Rpb248dm9pZChDVVJMY29kZSk+JiYg
ZXJyb3JIYW5kbGVyKTsKLQotICAgIGJvb2wgY29ubmVjdCgpOwotICAgIHNpemVfdCBzZW5kKGNv
bnN0IHVpbnQ4X3QqLCBzaXplX3QpOwotICAgIE9wdGlvbmFsPHNpemVfdD4gcmVjZWl2ZSh1aW50
OF90Kiwgc2l6ZV90KTsKLSAgICBPcHRpb25hbDxXYWl0UmVzdWx0PiB3YWl0KGNvbnN0IFNlY29u
ZHMmIHRpbWVvdXQsIGJvb2wgYWxzb1dhaXRGb3JXcml0ZSk7Ci0KLXByaXZhdGU6Ci0gICAgRnVu
Y3Rpb248dm9pZChDVVJMY29kZSk+IG1fZXJyb3JIYW5kbGVyOwotfTsKLQogfSAvLyBuYW1lc3Bh
Y2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9j
dXJsL0N1cmxTdHJlYW0uY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJs
L0N1cmxTdHJlYW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi4z
MzNjZjc5N2MxZQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25l
dHdvcmsvY3VybC9DdXJsU3RyZWFtLmNwcApAQCAtMCwwICsxLDE5NSBAQAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAyMCBTb255IEludGVyYWN0aXZlIEVudGVydGFpbm1lbnQgSW5jLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElU
UyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElO
Qy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YK
KyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
CisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisg
Ki8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkN1cmxTdHJlYW0uaCIKKworI2lu
Y2x1ZGUgIkN1cmxTdHJlYW1TY2hlZHVsZXIuaCIKKyNpbmNsdWRlICJTb2NrZXRTdHJlYW1FcnJv
ci5oIgorCisjaWYgVVNFKENVUkwpCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworQ3VybFN0cmVh
bTo6Q3VybFN0cmVhbShDdXJsU3RyZWFtU2NoZWR1bGVyJiBzY2hlZHVsZXIsIEN1cmxTdHJlYW1J
RCBzdHJlYW1JRCwgVVJMJiYgdXJsKQorICAgIDogbV9zY2hlZHVsZXIoc2NoZWR1bGVyKQorICAg
ICwgbV9zdHJlYW1JRChzdHJlYW1JRCkKKyAgICAsIG1fdXJsKFdURk1vdmUodXJsKSkKK3sKKyAg
ICBBU1NFUlQoIWlzTWFpblRocmVhZCgpKTsKKworICAgIG1fY3VybEhhbmRsZSA9IFdURjo6bWFr
ZVVuaXF1ZTxDdXJsSGFuZGxlPigpOworCisgICAgLy8gTGliY3VybCBpcyBub3QgcmVzcG9uc2li
bGUgZm9yIHRoZSBwcm90b2NvbCBoYW5kbGluZy4gSXQganVzdCBoYW5kbGVzIGNvbm5lY3Rpb24u
CisgICAgLy8gT25seSBzY2hlbWUsIGhvc3QgYW5kIHBvcnQgaXMgcmVxdWlyZWQuCisgICAgVVJM
IHVybEZvckNvbm5lY3Rpb247CisgICAgdXJsRm9yQ29ubmVjdGlvbi5zZXRQcm90b2NvbChtX3Vy
bC5wcm90b2NvbElzKCJ3c3MiKSA/ICJodHRwcyIgOiAiaHR0cCIpOworICAgIHVybEZvckNvbm5l
Y3Rpb24uc2V0SG9zdEFuZFBvcnQobV91cmwuaG9zdEFuZFBvcnQoKSk7CisgICAgbV9jdXJsSGFu
ZGxlLT5zZXRVcmwodXJsRm9yQ29ubmVjdGlvbik7CisKKyAgICBtX2N1cmxIYW5kbGUtPmVuYWJs
ZUNvbm5lY3Rpb25Pbmx5KCk7CisKKyAgICBhdXRvIGVycm9yQ29kZSA9IG1fY3VybEhhbmRsZS0+
cGVyZm9ybSgpOworICAgIGlmIChlcnJvckNvZGUgIT0gQ1VSTEVfT0spIHsKKyAgICAgICAgbm90
aWZ5RmFpbHVyZShlcnJvckNvZGUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbV9z
Y2hlZHVsZXIuY2FsbENsaWVudE9uTWFpblRocmVhZChtX3N0cmVhbUlELCBbc3RyZWFtSUQgPSBt
X3N0cmVhbUlEXShDbGllbnQmIGNsaWVudCkgeworICAgICAgICBjbGllbnQuZGlkT3BlbihzdHJl
YW1JRCk7CisgICAgfSk7Cit9CisKK0N1cmxTdHJlYW06On5DdXJsU3RyZWFtKCkKK3sKKyAgICBB
U1NFUlQoIWlzTWFpblRocmVhZCgpKTsKKyAgICBkZXN0cm95SGFuZGxlKCk7Cit9CisKK3ZvaWQg
Q3VybFN0cmVhbTo6ZGVzdHJveUhhbmRsZSgpCit7CisgICAgaWYgKCFtX2N1cmxIYW5kbGUpCisg
ICAgICAgIHJldHVybjsKKworICAgIG1fY3VybEhhbmRsZSA9IG51bGxwdHI7Cit9CisKK3ZvaWQg
Q3VybFN0cmVhbTo6c2VuZChVbmlxdWVBcnJheTx1aW50OF90PiYmIGJ1ZmZlciwgc2l6ZV90IGxl
bmd0aCkKK3sKKyAgICBBU1NFUlQoIWlzTWFpblRocmVhZCgpKTsKKworICAgIGlmICghbV9jdXJs
SGFuZGxlKQorICAgICAgICByZXR1cm47CisKKyAgICBtX3NlbmRCdWZmZXIuYXBwZW5kKHN0ZDo6
bWFrZV9wYWlyKFdURk1vdmUoYnVmZmVyKSwgbGVuZ3RoKSk7CisgICAgbV9zZW5kQnVmZmVyT2Zm
c2V0ID0gMDsKK30KKwordm9pZCBDdXJsU3RyZWFtOjphcHBlbmRNb25pdG9yaW5nRmQoZmRfc2V0
JiByZWFkZmRzLCBmZF9zZXQmIHdyaXRlZmRzLCBmZF9zZXQmIGV4Y2VwdGZkcywgaW50JiBtYXhm
ZCkKK3sKKyAgICBBU1NFUlQoIWlzTWFpblRocmVhZCgpKTsKKworICAgIGlmICghbV9jdXJsSGFu
ZGxlKQorICAgICAgICByZXR1cm47CisKKyAgICBhdXRvIHNvY2tldCA9IG1fY3VybEhhbmRsZS0+
Z2V0QWN0aXZlU29ja2V0KCk7CisgICAgaWYgKCFzb2NrZXQuaGFzX3ZhbHVlKCkpIHsKKyAgICAg
ICAgbm90aWZ5RmFpbHVyZShzb2NrZXQuZXJyb3IoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9
CisKKyAgICBGRF9TRVQoKnNvY2tldCwgJnJlYWRmZHMpOworICAgIEZEX1NFVCgqc29ja2V0LCAm
ZXhjZXB0ZmRzKTsKKworICAgIGlmIChtX3NlbmRCdWZmZXIuc2l6ZSgpKQorICAgICAgICBGRF9T
RVQoKnNvY2tldCwgJndyaXRlZmRzKTsKKworICAgIGlmIChtYXhmZCA8ICpzb2NrZXQpCisgICAg
ICAgIG1heGZkID0gKnNvY2tldDsKK30KKwordm9pZCBDdXJsU3RyZWFtOjp0cnlUb1RyYW5zZmVy
KGNvbnN0IGZkX3NldCYgcmVhZGZkcywgY29uc3QgZmRfc2V0JiB3cml0ZWZkcywgY29uc3QgZmRf
c2V0JiBleGNlcHRmZHMpCit7CisgICAgQVNTRVJUKCFpc01haW5UaHJlYWQoKSk7CisKKyAgICBp
ZiAoIW1fY3VybEhhbmRsZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgYXV0byBzb2NrZXQgPSBt
X2N1cmxIYW5kbGUtPmdldEFjdGl2ZVNvY2tldCgpOworICAgIGlmICghc29ja2V0Lmhhc192YWx1
ZSgpKSB7CisgICAgICAgIG5vdGlmeUZhaWx1cmUoc29ja2V0LmVycm9yKCkpOworICAgICAgICBy
ZXR1cm47CisgICAgfQorCisgICAgaWYgKEZEX0lTU0VUKCpzb2NrZXQsICZyZWFkZmRzKSB8fCBG
RF9JU1NFVCgqc29ja2V0LCAmZXhjZXB0ZmRzKSkKKyAgICAgICAgdHJ5VG9SZWNlaXZlKCk7CisK
KyAgICBpZiAoRkRfSVNTRVQoKnNvY2tldCwgJndyaXRlZmRzKSkKKyAgICAgICAgdHJ5VG9TZW5k
KCk7Cit9CisKK3ZvaWQgQ3VybFN0cmVhbTo6dHJ5VG9SZWNlaXZlKCkKK3sKKyAgICBpZiAoIW1f
Y3VybEhhbmRsZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgYXV0byByZWNlaXZlQnVmZmVyID0g
bWFrZVVuaXF1ZUFycmF5PHVpbnQ4X3Q+KGtSZWNlaXZlQnVmZmVyU2l6ZSk7CisgICAgc2l6ZV90
IGJ5dGVzUmVjZWl2ZWQgPSAwOworCisgICAgYXV0byBlcnJvckNvZGUgPSBtX2N1cmxIYW5kbGUt
PnJlY2VpdmUocmVjZWl2ZUJ1ZmZlci5nZXQoKSwga1JlY2VpdmVCdWZmZXJTaXplLCBieXRlc1Jl
Y2VpdmVkKTsKKyAgICBpZiAoZXJyb3JDb2RlICE9IENVUkxFX09LKSB7CisgICAgICAgIGlmIChl
cnJvckNvZGUgIT0gQ1VSTEVfQUdBSU4pCisgICAgICAgICAgICBub3RpZnlGYWlsdXJlKGVycm9y
Q29kZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyAwIGJ5dGVzIGluZGljYXRl
cyBhIGNsb3NlZCBjb25uZWN0aW9uLgorICAgIGlmICghYnl0ZXNSZWNlaXZlZCkKKyAgICAgICAg
ZGVzdHJveUhhbmRsZSgpOworCisgICAgbV9zY2hlZHVsZXIuY2FsbENsaWVudE9uTWFpblRocmVh
ZChtX3N0cmVhbUlELCBbc3RyZWFtSUQgPSBtX3N0cmVhbUlELCBidWZmZXIgPSBXVEZNb3ZlKHJl
Y2VpdmVCdWZmZXIpLCBsZW5ndGggPSBieXRlc1JlY2VpdmVkXShDbGllbnQmIGNsaWVudCkgbXV0
YWJsZSB7CisgICAgICAgIGNsaWVudC5kaWRSZWNlaXZlRGF0YShzdHJlYW1JRCwgcmVpbnRlcnBy
ZXRfY2FzdDxjb25zdCBjaGFyKj4oYnVmZmVyLmdldCgpKSwgbGVuZ3RoKTsKKyAgICB9KTsKK30K
Kwordm9pZCBDdXJsU3RyZWFtOjp0cnlUb1NlbmQoKQoreworICAgIGlmICghbV9jdXJsSGFuZGxl
IHx8ICFtX3NlbmRCdWZmZXIuc2l6ZSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBhdXRvJiBz
ZW5kQnVmZmVyID0gbV9zZW5kQnVmZmVyLmZpcnN0KCk7CisgICAgc2l6ZV90IGJ5dGVzU2VudCA9
IDA7CisKKyAgICBhdXRvIGVycm9yQ29kZSA9IG1fY3VybEhhbmRsZS0+c2VuZChzZW5kQnVmZmVy
LmZpcnN0LmdldCgpICsgbV9zZW5kQnVmZmVyT2Zmc2V0LCBzZW5kQnVmZmVyLnNlY29uZCAtIG1f
c2VuZEJ1ZmZlck9mZnNldCwgYnl0ZXNTZW50KTsKKyAgICBpZiAoZXJyb3JDb2RlICE9IENVUkxF
X09LKSB7CisgICAgICAgIGlmIChlcnJvckNvZGUgIT0gQ1VSTEVfQUdBSU4pCisgICAgICAgICAg
ICBub3RpZnlGYWlsdXJlKGVycm9yQ29kZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAg
ICBtX3NlbmRCdWZmZXJPZmZzZXQgKz0gYnl0ZXNTZW50OworCisgICAgaWYgKG1fc2VuZEJ1ZmZl
ck9mZnNldCA+PSBzZW5kQnVmZmVyLnNlY29uZCkgeworICAgICAgICBtX3NlbmRCdWZmZXIucmVt
b3ZlKDApOworICAgICAgICBtX3NlbmRCdWZmZXJPZmZzZXQgPSAwOworICAgIH0KKworICAgIG1f
c2NoZWR1bGVyLmNhbGxDbGllbnRPbk1haW5UaHJlYWQobV9zdHJlYW1JRCwgW3N0cmVhbUlEID0g
bV9zdHJlYW1JRCwgbGVuZ3RoID0gYnl0ZXNTZW50XShDbGllbnQmIGNsaWVudCkgeworICAgICAg
ICBjbGllbnQuZGlkU2VuZERhdGEoc3RyZWFtSUQsIGxlbmd0aCk7CisgICAgfSk7Cit9CisKK3Zv
aWQgQ3VybFN0cmVhbTo6bm90aWZ5RmFpbHVyZShDVVJMY29kZSBlcnJvckNvZGUpCit7CisgICAg
ZGVzdHJveUhhbmRsZSgpOworCisgICAgbV9zY2hlZHVsZXIuY2FsbENsaWVudE9uTWFpblRocmVh
ZChtX3N0cmVhbUlELCBbc3RyZWFtSUQgPSBtX3N0cmVhbUlELCBlcnJvckNvZGUsIHVybCA9IG1f
dXJsLmlzb2xhdGVkQ29weSgpXShDbGllbnQmIGNsaWVudCkgbXV0YWJsZSB7CisgICAgICAgIGNs
aWVudC5kaWRGYWlsKHN0cmVhbUlELCBlcnJvckNvZGUsIFdURk1vdmUodXJsKSk7CisgICAgfSk7
Cit9CisKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9u
ZXR3b3JrL2N1cmwvQ3VybFN0cmVhbS5oIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29y
ay9jdXJsL0N1cmxTdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAw
MC4uZWZlN2YyM2UwMjkKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9uZXR3b3JrL2N1cmwvQ3VybFN0cmVhbS5oCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMjAgU29ueSBJbnRlcmFjdGl2ZSBFbnRlcnRhaW5tZW50IEluYy4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJ
VFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElF
RCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJ
TkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9G
CisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1Ig
UFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgor
ICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiQ3VybENvbnRleHQuaCIKKyNpbmNsdWRl
IDx3dGYvVVJMLmg+CisjaW5jbHVkZSA8d3RmL1VuaXF1ZUFycmF5Lmg+CisjaW5jbHVkZSA8d3Rm
L1ZlY3Rvci5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIEN1cmxTdHJlYW1TY2hl
ZHVsZXI7CitjbGFzcyBTb2NrZXRTdHJlYW1FcnJvcjsKKwordXNpbmcgQ3VybFN0cmVhbUlEID0g
dWludDE2X3Q7Citjb25zdCBDdXJsU3RyZWFtSUQgaW52YWxpZEN1cmxTdHJlYW1JRCA9IDA7CisK
K2NsYXNzIEN1cmxTdHJlYW0geworICAgIFdURl9NQUtFX0ZBU1RfQUxMT0NBVEVEOworICAgIFdU
Rl9NQUtFX05PTkNPUFlBQkxFKEN1cmxTdHJlYW0pOworcHVibGljOgorICAgIGNsYXNzIENsaWVu
dCB7CisgICAgcHVibGljOgorICAgICAgICB2aXJ0dWFsIHZvaWQgZGlkT3BlbihDdXJsU3RyZWFt
SUQpID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIGRpZFNlbmREYXRhKEN1cmxTdHJlYW1JRCwg
c2l6ZV90KSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBkaWRSZWNlaXZlRGF0YShDdXJsU3Ry
ZWFtSUQsIGNvbnN0IGNoYXIqLCBzaXplX3QpID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIGRp
ZEZhaWwoQ3VybFN0cmVhbUlELCBDVVJMY29kZSwgVVJMJiYpID0gMDsKKyAgICB9OworCisgICAg
c3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxDdXJsU3RyZWFtPiBjcmVhdGUoQ3VybFN0cmVhbVNjaGVk
dWxlciYgc2NoZWR1bGVyLCBDdXJsU3RyZWFtSUQgc3RyZWFtSUQsIFVSTCYmIHVybCkKKyAgICB7
CisgICAgICAgIHJldHVybiBXVEY6Om1ha2VVbmlxdWU8Q3VybFN0cmVhbT4oc2NoZWR1bGVyLCBz
dHJlYW1JRCwgV1RGTW92ZSh1cmwpKTsKKyAgICB9CisKKyAgICBDdXJsU3RyZWFtKEN1cmxTdHJl
YW1TY2hlZHVsZXImLCBDdXJsU3RyZWFtSUQsIFVSTCYmKTsKKyAgICB2aXJ0dWFsIH5DdXJsU3Ry
ZWFtKCk7CisKKyAgICB2b2lkIHNlbmQoVW5pcXVlQXJyYXk8dWludDhfdD4mJiwgc2l6ZV90KTsK
KworICAgIHZvaWQgYXBwZW5kTW9uaXRvcmluZ0ZkKGZkX3NldCYsIGZkX3NldCYsIGZkX3NldCYs
IGludCYpOworICAgIHZvaWQgdHJ5VG9UcmFuc2Zlcihjb25zdCBmZF9zZXQmLCBjb25zdCBmZF9z
ZXQmLCBjb25zdCBmZF9zZXQmKTsKKworcHJpdmF0ZToKKyAgICB2b2lkIGRlc3Ryb3lIYW5kbGUo
KTsKKworICAgIHZvaWQgdHJ5VG9SZWNlaXZlKCk7CisgICAgdm9pZCB0cnlUb1NlbmQoKTsKKwor
ICAgIHZvaWQgbm90aWZ5RmFpbHVyZShDVVJMY29kZSk7CisKKyAgICBzdGF0aWMgY29uc3Qgc2l6
ZV90IGtSZWNlaXZlQnVmZmVyU2l6ZSA9IDE2ICogMTAyNDsKKworICAgIEN1cmxTdHJlYW1TY2hl
ZHVsZXImIG1fc2NoZWR1bGVyOworICAgIEN1cmxTdHJlYW1JRCBtX3N0cmVhbUlEOworICAgIFVS
TCBtX3VybDsKKworICAgIHN0ZDo6dW5pcXVlX3B0cjxDdXJsSGFuZGxlPiBtX2N1cmxIYW5kbGU7
CisKKyAgICBXVEY6OlZlY3RvcjxzdGQ6OnBhaXI8VW5pcXVlQXJyYXk8dWludDhfdD4sIHNpemVf
dD4+IG1fc2VuZEJ1ZmZlcjsKKyAgICBzaXplX3QgbV9zZW5kQnVmZmVyT2Zmc2V0IHsgMCB9Owor
fTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vbmV0d29yay9jdXJsL0N1cmxTdHJlYW1TY2hlZHVsZXIuY3BwIGIvU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0N1cmxTdHJlYW1TY2hlZHVsZXIuY3BwCm5ldyBm
aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi43NzZiM2NmOWI1NgotLS0gL2Rldi9u
dWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsU3RyZWFt
U2NoZWR1bGVyLmNwcApAQCAtMCwwICsxLDE5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAy
MCBTb255IEludGVyYWN0aXZlIEVudGVydGFpbm1lbnQgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIu
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRP
UlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENP
TlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBC
VVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1
ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkN1cmxTdHJlYW1TY2hlZHVsZXIuaCIKKworI2lmIFVT
RShDVVJMKQorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK0N1cmxTdHJlYW1TY2hlZHVsZXI6OkN1
cmxTdHJlYW1TY2hlZHVsZXIoKQoreworICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7Cit9CisK
K0N1cmxTdHJlYW1TY2hlZHVsZXI6On5DdXJsU3RyZWFtU2NoZWR1bGVyKCkKK3sKKyAgICBBU1NF
UlQoaXNNYWluVGhyZWFkKCkpOworfQorCitDdXJsU3RyZWFtSUQgQ3VybFN0cmVhbVNjaGVkdWxl
cjo6Y3JlYXRlU3RyZWFtKGNvbnN0IFVSTCYgdXJsLCBDdXJsU3RyZWFtOjpDbGllbnQmIGNsaWVu
dCkKK3sKKyAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOworCisgICAgZG8geworICAgICAgICBt
X2N1cnJlbnRTdHJlYW1JRCA9IChtX2N1cnJlbnRTdHJlYW1JRCArIDEgIT0gaW52YWxpZEN1cmxT
dHJlYW1JRCkgPyBtX2N1cnJlbnRTdHJlYW1JRCArIDEgOiAxOworICAgIH0gd2hpbGUgKG1fY2xp
ZW50TGlzdHMuY29udGFpbnMobV9jdXJyZW50U3RyZWFtSUQpKTsKKworICAgIGF1dG8gc3RyZWFt
SUQgPSBtX2N1cnJlbnRTdHJlYW1JRDsKKyAgICBtX2NsaWVudExpc3RzLmFkZChzdHJlYW1JRCwg
JmNsaWVudCk7CisKKyAgICBjYWxsT25Xb3JrZXJUaHJlYWQoW3RoaXMsIHN0cmVhbUlELCB1cmwg
PSB1cmwuaXNvbGF0ZWRDb3B5KCldKCkgbXV0YWJsZSB7CisgICAgICAgIG1fc3RyZWFtTGlzdHMu
YWRkKHN0cmVhbUlELCBDdXJsU3RyZWFtOjpjcmVhdGUoKnRoaXMsIHN0cmVhbUlELCBXVEZNb3Zl
KHVybCkpKTsKKyAgICB9KTsKKworICAgIHJldHVybiBzdHJlYW1JRDsKK30KKwordm9pZCBDdXJs
U3RyZWFtU2NoZWR1bGVyOjpkZXN0cm95U3RyZWFtKEN1cmxTdHJlYW1JRCBzdHJlYW1JRCkKK3sK
KyAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOworCisgICAgaWYgKG1fY2xpZW50TGlzdHMuY29u
dGFpbnMoc3RyZWFtSUQpKQorICAgICAgICBtX2NsaWVudExpc3RzLnJlbW92ZShzdHJlYW1JRCk7
CisKKyAgICBjYWxsT25Xb3JrZXJUaHJlYWQoW3RoaXMsIHN0cmVhbUlEXSgpIHsKKyAgICAgICAg
aWYgKG1fc3RyZWFtTGlzdHMuY29udGFpbnMoc3RyZWFtSUQpKQorICAgICAgICAgICAgbV9zdHJl
YW1MaXN0cy5yZW1vdmUoc3RyZWFtSUQpOworICAgIH0pOworfQorCit2b2lkIEN1cmxTdHJlYW1T
Y2hlZHVsZXI6OnNlbmQoQ3VybFN0cmVhbUlEIHN0cmVhbUlELCBVbmlxdWVBcnJheTx1aW50OF90
PiYmIGRhdGEsIHNpemVfdCBsZW5ndGgpCit7CisgICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsK
KworICAgIGNhbGxPbldvcmtlclRocmVhZChbdGhpcywgc3RyZWFtSUQsIGRhdGEgPSBXVEZNb3Zl
KGRhdGEpLCBsZW5ndGhdKCkgbXV0YWJsZSB7CisgICAgICAgIGlmIChhdXRvIHN0cmVhbSA9IG1f
c3RyZWFtTGlzdHMuZ2V0KHN0cmVhbUlEKSkKKyAgICAgICAgICAgIHN0cmVhbS0+c2VuZChXVEZN
b3ZlKGRhdGEpLCBsZW5ndGgpOworICAgIH0pOworfQorCit2b2lkIEN1cmxTdHJlYW1TY2hlZHVs
ZXI6OmNhbGxPbldvcmtlclRocmVhZChXVEY6OkZ1bmN0aW9uPHZvaWQoKT4mJiB0YXNrKQorewor
ICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7CisKKyAgICB7CisgICAgICAgIGF1dG8gbG9ja2Vy
ID0gaG9sZExvY2sobV9tdXRleCk7CisgICAgICAgIG1fdGFza1F1ZXVlLmFwcGVuZChXVEZNb3Zl
KHRhc2spKTsKKyAgICB9CisKKyAgICBzdGFydFRocmVhZElmTmVlZGVkKCk7Cit9CisKK3ZvaWQg
Q3VybFN0cmVhbVNjaGVkdWxlcjo6Y2FsbENsaWVudE9uTWFpblRocmVhZChDdXJsU3RyZWFtSUQg
c3RyZWFtSUQsIFdURjo6RnVuY3Rpb248dm9pZChDdXJsU3RyZWFtOjpDbGllbnQmKT4mJiB0YXNr
KQoreworICAgIEFTU0VSVCghaXNNYWluVGhyZWFkKCkpOworCisgICAgY2FsbE9uTWFpblRocmVh
ZChbdGhpcywgc3RyZWFtSUQsIHRhc2sgPSBXVEZNb3ZlKHRhc2spXSgpIHsKKyAgICAgICAgaWYg
KGF1dG8gY2xpZW50ID0gbV9jbGllbnRMaXN0cy5nZXQoc3RyZWFtSUQpKQorICAgICAgICAgICAg
dGFzaygqY2xpZW50KTsKKyAgICB9KTsKK30KKwordm9pZCBDdXJsU3RyZWFtU2NoZWR1bGVyOjpz
dGFydFRocmVhZElmTmVlZGVkKCkKK3sKKyAgICB7CisgICAgICAgIGF1dG8gbG9ja2VyID0gaG9s
ZExvY2sobV9tdXRleCk7CisgICAgICAgIGlmIChtX3J1blRocmVhZCkKKyAgICAgICAgICAgIHJl
dHVybjsKKyAgICB9CisKKyAgICBpZiAobV90aHJlYWQpCisgICAgICAgIG1fdGhyZWFkLT53YWl0
Rm9yQ29tcGxldGlvbigpOworCisgICAgeworICAgICAgICBhdXRvIGxvY2tlciA9IGhvbGRMb2Nr
KG1fbXV0ZXgpOworICAgICAgICBtX3J1blRocmVhZCA9IHRydWU7CisgICAgfQorCisgICAgbV90
aHJlYWQgPSBUaHJlYWQ6OmNyZWF0ZSgiY3VybFN0cmVhbVRocmVhZCIsIFt0aGlzXSB7CisgICAg
ICAgIHdvcmtlclRocmVhZCgpOworCisgICAgICAgIGF1dG8gbG9ja2VyID0gaG9sZExvY2sobV9t
dXRleCk7CisgICAgICAgIG1fcnVuVGhyZWFkID0gZmFsc2U7CisgICAgfSk7Cit9CisKK3ZvaWQg
Q3VybFN0cmVhbVNjaGVkdWxlcjo6c3RvcFRocmVhZElmTm9Nb3JlSm9iUnVubmluZygpCit7Cisg
ICAgYXV0byBsb2NrZXIgPSBob2xkTG9jayhtX211dGV4KTsKKyAgICBpZiAobV90YXNrUXVldWUu
c2l6ZSgpIHx8IG1fc3RyZWFtTGlzdHMuc2l6ZSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBt
X3J1blRocmVhZCA9IGZhbHNlOworfQorCit2b2lkIEN1cmxTdHJlYW1TY2hlZHVsZXI6OmV4ZWN1
dGVUYXNrcygpCit7CisgICAgQVNTRVJUKCFpc01haW5UaHJlYWQoKSk7CisKKyAgICBWZWN0b3I8
V1RGOjpGdW5jdGlvbjx2b2lkKCk+PiB0YXNrUXVldWU7CisKKyAgICB7CisgICAgICAgIGF1dG8g
bG9ja2VyID0gaG9sZExvY2sobV9tdXRleCk7CisgICAgICAgIHRhc2tRdWV1ZSA9IFdURk1vdmUo
bV90YXNrUXVldWUpOworICAgIH0KKworICAgIGZvciAoYXV0byYgdGFzayA6IHRhc2tRdWV1ZSkK
KyAgICAgICAgdGFzaygpOworfQorCit2b2lkIEN1cmxTdHJlYW1TY2hlZHVsZXI6OndvcmtlclRo
cmVhZCgpCit7CisgICAgQVNTRVJUKCFpc01haW5UaHJlYWQoKSk7CisgICAgc3RhdGljIGNvbnN0
IGludCBzZWxlY3RUaW1lb3V0TVMgPSAyMDsKKyAgICBzdHJ1Y3QgdGltZXZhbCB0aW1lb3V0IHsg
MCwgc2VsZWN0VGltZW91dE1TICogMTAwMH07CisKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAg
ICB7CisgICAgICAgICAgICBhdXRvIGxvY2tlciA9IGhvbGRMb2NrKG1fbXV0ZXgpOworICAgICAg
ICAgICAgaWYgKCFtX3J1blRocmVhZCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
fQorCisgICAgICAgIGV4ZWN1dGVUYXNrcygpOworCisgICAgICAgIGludCByYyA9IDA7CisgICAg
ICAgIGZkX3NldCByZWFkZmRzOworICAgICAgICBmZF9zZXQgd3JpdGVmZHM7CisgICAgICAgIGZk
X3NldCBleGNlcHRmZHM7CisKKyAgICAgICAgZG8geworICAgICAgICAgICAgaW50IG1heGZkID0g
LTE7CisKKyAgICAgICAgICAgIEZEX1pFUk8oJnJlYWRmZHMpOworICAgICAgICAgICAgRkRfWkVS
Tygmd3JpdGVmZHMpOworICAgICAgICAgICAgRkRfWkVSTygmZXhjZXB0ZmRzKTsKKworICAgICAg
ICAgICAgZm9yIChhdXRvJiBzdHJlYW0gOiBtX3N0cmVhbUxpc3RzLnZhbHVlcygpKQorICAgICAg
ICAgICAgICAgIHN0cmVhbS0+YXBwZW5kTW9uaXRvcmluZ0ZkKHJlYWRmZHMsIHdyaXRlZmRzLCBl
eGNlcHRmZHMsIG1heGZkKTsKKworICAgICAgICAgICAgaWYgKG1heGZkID49IDApCisgICAgICAg
ICAgICAgICAgcmMgPSA6OnNlbGVjdChtYXhmZCArIDEsICZyZWFkZmRzLCAmd3JpdGVmZHMsICZl
eGNlcHRmZHMsICZ0aW1lb3V0KTsKKyAgICAgICAgfSB3aGlsZSAocmMgPT0gLTEgJiYgZXJybm8g
PT0gRUlOVFIpOworCisgICAgICAgIGZvciAoYXV0byYgc3RyZWFtIDogbV9zdHJlYW1MaXN0cy52
YWx1ZXMoKSkKKyAgICAgICAgICAgIHN0cmVhbS0+dHJ5VG9UcmFuc2ZlcihyZWFkZmRzLCB3cml0
ZWZkcywgZXhjZXB0ZmRzKTsKKworICAgICAgICBzdG9wVGhyZWFkSWZOb01vcmVKb2JSdW5uaW5n
KCk7CisgICAgfQorfQorCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vbmV0d29yay9jdXJsL0N1cmxTdHJlYW1TY2hlZHVsZXIuaCBiL1NvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsU3RyZWFtU2NoZWR1bGVyLmgKbmV3IGZpbGUg
bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLjdmZmU3NDY0ODk0Ci0tLSAvZGV2L251bGwK
KysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0N1cmxTdHJlYW1TY2hl
ZHVsZXIuaApAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFNvbnkg
SW50ZXJhY3RpdmUgRW50ZXJ0YWlubWVudCBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFT
IElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVU
T1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNT
CisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YK
KyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjcHJhZ21hIG9uY2UK
KworI2luY2x1ZGUgIkN1cmxTdHJlYW0uaCIKKyNpbmNsdWRlIDx3dGYvRnVuY3Rpb24uaD4KKyNp
bmNsdWRlIDx3dGYvSGFzaE1hcC5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIEN1
cmxTdHJlYW1TY2hlZHVsZXIgeworICAgIFdURl9NQUtFX0ZBU1RfQUxMT0NBVEVEOworICAgIFdU
Rl9NQUtFX05PTkNPUFlBQkxFKEN1cmxTdHJlYW1TY2hlZHVsZXIpOworcHVibGljOgorICAgIEN1
cmxTdHJlYW1TY2hlZHVsZXIoKTsKKyAgICB2aXJ0dWFsIH5DdXJsU3RyZWFtU2NoZWR1bGVyKCk7
CisKKyAgICBDdXJsU3RyZWFtSUQgY3JlYXRlU3RyZWFtKGNvbnN0IFVSTCYsIEN1cmxTdHJlYW06
OkNsaWVudCYpOworICAgIHZvaWQgZGVzdHJveVN0cmVhbShDdXJsU3RyZWFtSUQpOworICAgIHZv
aWQgc2VuZChDdXJsU3RyZWFtSUQsIFVuaXF1ZUFycmF5PHVpbnQ4X3Q+JiYsIHNpemVfdCk7CisK
KyAgICB2b2lkIGNhbGxPbldvcmtlclRocmVhZChXVEY6OkZ1bmN0aW9uPHZvaWQoKT4mJik7Cisg
ICAgdm9pZCBjYWxsQ2xpZW50T25NYWluVGhyZWFkKEN1cmxTdHJlYW1JRCwgV1RGOjpGdW5jdGlv
bjx2b2lkKEN1cmxTdHJlYW06OkNsaWVudCYpPiYmKTsKKworcHJpdmF0ZToKKyAgICB2b2lkIHN0
YXJ0VGhyZWFkSWZOZWVkZWQoKTsKKyAgICB2b2lkIHN0b3BUaHJlYWRJZk5vTW9yZUpvYlJ1bm5p
bmcoKTsKKworICAgIHZvaWQgZXhlY3V0ZVRhc2tzKCk7CisKKyAgICB2b2lkIHdvcmtlclRocmVh
ZCgpOworCisgICAgTG9jayBtX211dGV4OworICAgIFJlZlB0cjxUaHJlYWQ+IG1fdGhyZWFkOwor
ICAgIGJvb2wgbV9ydW5UaHJlYWQgeyBmYWxzZSB9OworCisgICAgQ3VybFN0cmVhbUlEIG1fY3Vy
cmVudFN0cmVhbUlEID0gMTsKKworICAgIFZlY3RvcjxGdW5jdGlvbjx2b2lkKCk+PiBtX3Rhc2tR
dWV1ZTsKKyAgICBIYXNoTWFwPEN1cmxTdHJlYW1JRCwgQ3VybFN0cmVhbTo6Q2xpZW50Kj4gbV9j
bGllbnRMaXN0czsKKyAgICBIYXNoTWFwPEN1cmxTdHJlYW1JRCwgc3RkOjp1bmlxdWVfcHRyPEN1
cmxTdHJlYW0+PiBtX3N0cmVhbUxpc3RzOworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpk
aWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL1NvY2tldFN0
cmVhbUhhbmRsZUltcGwuaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9T
b2NrZXRTdHJlYW1IYW5kbGVJbXBsLmgKaW5kZXggMjViZjNjNDZhMmUuLjUwMWNmNWMxMjViIDEw
MDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvU29ja2V0U3Ry
ZWFtSGFuZGxlSW1wbC5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3Vy
bC9Tb2NrZXRTdHJlYW1IYW5kbGVJbXBsLmgKQEAgLTEsNiArMSw3IEBACiAvKgogICogQ29weXJp
Z2h0IChDKSAyMDA5LTIwMTggQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogQ29w
eXJpZ2h0IChDKSAyMDA5IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29w
eXJpZ2h0IChDKSAyMDIwIFNvbnkgSW50ZXJhY3RpdmUgRW50ZXJ0YWlubWVudCBJbmMuCiAgKgog
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCkBAIC0zMSwyMyArMzIsMTcgQEAKIAogI3By
YWdtYSBvbmNlCiAKLSNpbmNsdWRlICJDdXJsQ29udGV4dC5oIgorI2luY2x1ZGUgIkN1cmxTdHJl
YW0uaCIKICNpbmNsdWRlICJTb2NrZXRTdHJlYW1IYW5kbGUuaCIKICNpbmNsdWRlIDxwYWwvU2Vz
c2lvbklELmg+Ci0jaW5jbHVkZSA8d3RmL0Z1bmN0aW9uLmg+Ci0jaW5jbHVkZSA8d3RmL0xvY2su
aD4KLSNpbmNsdWRlIDx3dGYvTWVzc2FnZVF1ZXVlLmg+Ci0jaW5jbHVkZSA8d3RmL1JlZkNvdW50
ZWQuaD4KICNpbmNsdWRlIDx3dGYvU3RyZWFtQnVmZmVyLmg+Ci0jaW5jbHVkZSA8d3RmL1RocmVh
ZGluZy5oPgotI2luY2x1ZGUgPHd0Zi9VbmlxdWVBcnJheS5oPgogCiBuYW1lc3BhY2UgV2ViQ29y
ZSB7CiAKIGNsYXNzIFNvY2tldFN0cmVhbUhhbmRsZUNsaWVudDsKIGNsYXNzIFN0b3JhZ2VTZXNz
aW9uUHJvdmlkZXI7CiAKLWNsYXNzIFNvY2tldFN0cmVhbUhhbmRsZUltcGwgOiBwdWJsaWMgU29j
a2V0U3RyZWFtSGFuZGxlIHsKK2NsYXNzIFNvY2tldFN0cmVhbUhhbmRsZUltcGwgOiBwdWJsaWMg
U29ja2V0U3RyZWFtSGFuZGxlLCBwdWJsaWMgQ3VybFN0cmVhbTo6Q2xpZW50IHsKIHB1YmxpYzoK
ICAgICBzdGF0aWMgUmVmPFNvY2tldFN0cmVhbUhhbmRsZUltcGw+IGNyZWF0ZShjb25zdCBVUkwm
IHVybCwgU29ja2V0U3RyZWFtSGFuZGxlQ2xpZW50JiBjbGllbnQsIFBBTDo6U2Vzc2lvbklELCBj
b25zdCBTdHJpbmcmLCBTb3VyY2VBcHBsaWNhdGlvbkF1ZGl0VG9rZW4mJiwgY29uc3QgU3RvcmFn
ZVNlc3Npb25Qcm92aWRlciogcHJvdmlkZXIpIHsgcmV0dXJuIGFkb3B0UmVmKCpuZXcgU29ja2V0
U3RyZWFtSGFuZGxlSW1wbCh1cmwsIGNsaWVudCwgcHJvdmlkZXIpKTsgfQogCkBAIC02NCwyOCAr
NTksMjIgQEAgcHJpdmF0ZToKICAgICBPcHRpb25hbDxzaXplX3Q+IHBsYXRmb3JtU2VuZEludGVy
bmFsKGNvbnN0IHVpbnQ4X3QqLCBzaXplX3QpOwogICAgIGJvb2wgc2VuZFBlbmRpbmdEYXRhKCk7
CiAKLSAgICB2b2lkIHRocmVhZEVudHJ5UG9pbnQoY29uc3QgVVJMJik7Ci0gICAgdm9pZCBoYW5k
bGVFcnJvcihDVVJMY29kZSk7Ci0gICAgdm9pZCBzdG9wVGhyZWFkKCk7CisgICAgdm9pZCBkaWRP
cGVuKEN1cmxTdHJlYW1JRCkgZmluYWw7CisgICAgdm9pZCBkaWRTZW5kRGF0YShDdXJsU3RyZWFt
SUQsIHNpemVfdCkgZmluYWw7CisgICAgdm9pZCBkaWRSZWNlaXZlRGF0YShDdXJsU3RyZWFtSUQs
IGNvbnN0IGNoYXIqLCBzaXplX3QpIGZpbmFsOworICAgIHZvaWQgZGlkRmFpbChDdXJsU3RyZWFt
SUQsIENVUkxjb2RlLCBVUkwmJikgZmluYWw7CiAKLSAgICB2b2lkIGNhbGxPbldvcmtlclRocmVh
ZChGdW5jdGlvbjx2b2lkKCk+JiYpOwotICAgIHZvaWQgZXhlY3V0ZVRhc2tzKCk7Ci0KLSAgICBz
dGF0aWMgY29uc3Qgc2l6ZV90IGtSZWFkQnVmZmVyU2l6ZSA9IDQgKiAxMDI0OworICAgIGJvb2wg
aXNTdHJlYW1JbnZhbGlkYXRlZCgpIHsgcmV0dXJuIG1fc3RyZWFtSUQgPT0gaW52YWxpZEN1cmxT
dHJlYW1JRDsgfQorICAgIHZvaWQgZGVzdHJ1Y3RTdHJlYW0oKTsKIAogICAgIFJlZlB0cjxjb25z
dCBTdG9yYWdlU2Vzc2lvblByb3ZpZGVyPiBtX3N0b3JhZ2VTZXNzaW9uUHJvdmlkZXI7Ci0gICAg
UmVmUHRyPFRocmVhZD4gbV93b3JrZXJUaHJlYWQ7Ci0gICAgc3RkOjphdG9taWM8Ym9vbD4gbV9y
dW5uaW5nIHsgdHJ1ZSB9OwotCi0gICAgTWVzc2FnZVF1ZXVlPEZ1bmN0aW9uPHZvaWQoKT4+IG1f
dGFza1F1ZXVlOwotCi0gICAgYm9vbCBtX2hhc1BlbmRpbmdXcml0ZURhdGEgeyBmYWxzZSB9Owot
ICAgIHNpemVfdCBtX3dyaXRlQnVmZmVyU2l6ZSB7IDAgfTsKLSAgICBzaXplX3QgbV93cml0ZUJ1
ZmZlck9mZnNldCB7IDAgfTsKLSAgICBVbmlxdWVBcnJheTx1aW50OF90PiBtX3dyaXRlQnVmZmVy
OwogCiAgICAgU3RyZWFtQnVmZmVyPHVpbnQ4X3QsIDEwMjQgKiAxMDI0PiBtX2J1ZmZlcjsKICAg
ICBzdGF0aWMgY29uc3QgdW5zaWduZWQgbWF4QnVmZmVyU2l6ZSA9IDEwMCAqIDEwMjQgKiAxMDI0
OworCisgICAgQ3VybFN0cmVhbVNjaGVkdWxlciYgbV9zY2hlZHVsZXI7CisgICAgQ3VybFN0cmVh
bUlEIG1fc3RyZWFtSUQgeyBpbnZhbGlkQ3VybFN0cmVhbUlEIH07CisgICAgdW5zaWduZWQgbV90
b3RhbFNlbmREYXRhU2l6ZSB7IDAgfTsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlm
ZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9Tb2NrZXRTdHJl
YW1IYW5kbGVJbXBsQ3VybC5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1
cmwvU29ja2V0U3RyZWFtSGFuZGxlSW1wbEN1cmwuY3BwCmluZGV4IDEzYTgzMmMyNjY5Li44Y2Qz
OTE0Mjk3NSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJs
L1NvY2tldFN0cmVhbUhhbmRsZUltcGxDdXJsLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9uZXR3b3JrL2N1cmwvU29ja2V0U3RyZWFtSGFuZGxlSW1wbEN1cmwuY3BwCkBAIC0xLDcg
KzEsNyBAQAogLyoKICAqIENvcHlyaWdodCAoQykgMjAwOSBCcmVudCBGdWxnaGFtLiAgQWxsIHJp
Z2h0cyByZXNlcnZlZC4KICAqIENvcHlyaWdodCAoQykgMjAwOSBHb29nbGUgSW5jLiAgQWxsIHJp
Z2h0cyByZXNlcnZlZC4KLSAqIENvcHlyaWdodCAoQykgMjAxOCBTb255IEludGVyYWN0aXZlIEVu
dGVydGFpbm1lbnQgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDIwIFNvbnkgSW50ZXJhY3RpdmUg
RW50ZXJ0YWlubWVudCBJbmMuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCkBA
IC0zNSwxODMgKzM1LDEwMyBAQAogCiAjaWYgVVNFKENVUkwpCiAKKyNpbmNsdWRlICJDdXJsU3Ry
ZWFtU2NoZWR1bGVyLmgiCiAjaW5jbHVkZSAiRGVwcmVjYXRlZEdsb2JhbFNldHRpbmdzLmgiCi0j
aW5jbHVkZSAiTG9nZ2luZy5oIgogI2luY2x1ZGUgIlNvY2tldFN0cmVhbUVycm9yLmgiCiAjaW5j
bHVkZSAiU29ja2V0U3RyZWFtSGFuZGxlQ2xpZW50LmgiCiAjaW5jbHVkZSAiU3RvcmFnZVNlc3Np
b25Qcm92aWRlci5oIgotI2luY2x1ZGUgPHd0Zi9NYWluVGhyZWFkLmg+Ci0jaW5jbHVkZSA8d3Rm
L1VSTC5oPgotI2luY2x1ZGUgPHd0Zi90ZXh0L0NTdHJpbmcuaD4KIAogbmFtZXNwYWNlIFdlYkNv
cmUgewogCiBTb2NrZXRTdHJlYW1IYW5kbGVJbXBsOjpTb2NrZXRTdHJlYW1IYW5kbGVJbXBsKGNv
bnN0IFVSTCYgdXJsLCBTb2NrZXRTdHJlYW1IYW5kbGVDbGllbnQmIGNsaWVudCwgY29uc3QgU3Rv
cmFnZVNlc3Npb25Qcm92aWRlciogcHJvdmlkZXIpCiAgICAgOiBTb2NrZXRTdHJlYW1IYW5kbGUo
dXJsLCBjbGllbnQpCiAgICAgLCBtX3N0b3JhZ2VTZXNzaW9uUHJvdmlkZXIocHJvdmlkZXIpCisg
ICAgLCBtX3NjaGVkdWxlcihDdXJsQ29udGV4dDo6c2luZ2xldG9uKCkuc3RyZWFtU2NoZWR1bGVy
KCkpCiB7Ci0gICAgTE9HKE5ldHdvcmssICJTb2NrZXRTdHJlYW1IYW5kbGUgJXAgbmV3IGNsaWVu
dCAlcCIsIHRoaXMsICZtX2NsaWVudCk7Ci0gICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKLQog
ICAgIC8vIEZJWE1FOiBVc2luZyBEZXByZWNhdGVkR2xvYmFsU2V0dGluZ3MgZnJvbSBoZXJlIGlz
IGEgbGF5ZXJpbmcgdmlvbGF0aW9uLgogICAgIGlmIChtX3VybC5wcm90b2NvbElzKCJ3c3MiKSAm
JiBEZXByZWNhdGVkR2xvYmFsU2V0dGluZ3M6OmFsbG93c0FueVNTTENlcnRpZmljYXRlKCkpCiAg
ICAgICAgIEN1cmxDb250ZXh0OjpzaW5nbGV0b24oKS5zc2xIYW5kbGUoKS5zZXRJZ25vcmVTU0xF
cnJvcnModHJ1ZSk7CiAKLSAgICBtX3dvcmtlclRocmVhZCA9IFRocmVhZDo6Y3JlYXRlKCJXZWJT
b2NrZXQgdGhyZWFkIiwgW3RoaXMsIHByb3RlY3RlZFRoaXMgPSBtYWtlUmVmKCp0aGlzKSwgdXJs
ID0gdXJsLmlzb2xhdGVkQ29weSgpXSB7Ci0gICAgICAgIHRocmVhZEVudHJ5UG9pbnQodXJsKTsK
LSAgICB9KTsKKyAgICBtX3N0cmVhbUlEID0gbV9zY2hlZHVsZXIuY3JlYXRlU3RyZWFtKG1fdXJs
LCAqdGhpcyk7CiB9CiAKIFNvY2tldFN0cmVhbUhhbmRsZUltcGw6On5Tb2NrZXRTdHJlYW1IYW5k
bGVJbXBsKCkKIHsKLSAgICBMT0coTmV0d29yaywgIlNvY2tldFN0cmVhbUhhbmRsZSAlcCBkZWxl
dGUiLCB0aGlzKTsKLSAgICBzdG9wVGhyZWFkKCk7CisgICAgZGVzdHJ1Y3RTdHJlYW0oKTsKIH0K
IAogT3B0aW9uYWw8c2l6ZV90PiBTb2NrZXRTdHJlYW1IYW5kbGVJbXBsOjpwbGF0Zm9ybVNlbmRJ
bnRlcm5hbChjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuZ3RoKQogewotICAgIExPRyhO
ZXR3b3JrLCAiU29ja2V0U3RyZWFtSGFuZGxlICVwIHBsYXRmb3JtU2VuZCIsIHRoaXMpOwotICAg
IEFTU0VSVChpc01haW5UaHJlYWQoKSk7CisgICAgaWYgKGlzU3RyZWFtSW52YWxpZGF0ZWQoKSkK
KyAgICAgICAgcmV0dXJuIFdURjo6bnVsbG9wdDsKIAotICAgIGlmIChtX2hhc1BlbmRpbmdXcml0
ZURhdGEpCisgICAgaWYgKG1fdG90YWxTZW5kRGF0YVNpemUgKyBsZW5ndGggPiBtYXhCdWZmZXJT
aXplKQogICAgICAgICByZXR1cm4gMDsKKyAgICBtX3RvdGFsU2VuZERhdGFTaXplICs9IGxlbmd0
aDsKIAotICAgIG1faGFzUGVuZGluZ1dyaXRlRGF0YSA9IHRydWU7Ci0KLSAgICBhdXRvIHdyaXRl
QnVmZmVyID0gbWFrZVVuaXF1ZUFycmF5PHVpbnQ4X3Q+KGxlbmd0aCk7Ci0gICAgbWVtY3B5KHdy
aXRlQnVmZmVyLmdldCgpLCBkYXRhLCBsZW5ndGgpOwotCi0gICAgY2FsbE9uV29ya2VyVGhyZWFk
KFt0aGlzLCB3cml0ZUJ1ZmZlciA9IFdURk1vdmUod3JpdGVCdWZmZXIpLCB3cml0ZUJ1ZmZlclNp
emUgPSBsZW5ndGhdKCkgbXV0YWJsZSB7Ci0gICAgICAgIEFTU0VSVCghaXNNYWluVGhyZWFkKCkp
OwotICAgICAgICBtX3dyaXRlQnVmZmVyID0gV1RGTW92ZSh3cml0ZUJ1ZmZlcik7Ci0gICAgICAg
IG1fd3JpdGVCdWZmZXJTaXplID0gd3JpdGVCdWZmZXJTaXplOwotICAgICAgICBtX3dyaXRlQnVm
ZmVyT2Zmc2V0ID0gMDsKLSAgICB9KTsKKyAgICBhdXRvIGJ1ZmZlciA9IG1ha2VVbmlxdWVBcnJh
eTx1aW50OF90PihsZW5ndGgpOworICAgIG1lbWNweShidWZmZXIuZ2V0KCksIGRhdGEsIGxlbmd0
aCk7CiAKKyAgICBtX3NjaGVkdWxlci5zZW5kKG1fc3RyZWFtSUQsIFdURk1vdmUoYnVmZmVyKSwg
bGVuZ3RoKTsKICAgICByZXR1cm4gbGVuZ3RoOwogfQogCiB2b2lkIFNvY2tldFN0cmVhbUhhbmRs
ZUltcGw6OnBsYXRmb3JtQ2xvc2UoKQogewotICAgIExPRyhOZXR3b3JrLCAiU29ja2V0U3RyZWFt
SGFuZGxlICVwIHBsYXRmb3JtQ2xvc2UiLCB0aGlzKTsKLSAgICBBU1NFUlQoaXNNYWluVGhyZWFk
KCkpOworICAgIGRlc3RydWN0U3RyZWFtKCk7CiAKICAgICBpZiAobV9zdGF0ZSA9PSBDbG9zZWQp
CiAgICAgICAgIHJldHVybjsKICAgICBtX3N0YXRlID0gQ2xvc2VkOwogCi0gICAgc3RvcFRocmVh
ZCgpOwogICAgIG1fY2xpZW50LmRpZENsb3NlU29ja2V0U3RyZWFtKCp0aGlzKTsKIH0KIAotdm9p
ZCBTb2NrZXRTdHJlYW1IYW5kbGVJbXBsOjp0aHJlYWRFbnRyeVBvaW50KGNvbnN0IFVSTCYgdXJs
KQordm9pZCBTb2NrZXRTdHJlYW1IYW5kbGVJbXBsOjpkaWRPcGVuKEN1cmxTdHJlYW1JRCkKIHsK
LSAgICBBU1NFUlQoIWlzTWFpblRocmVhZCgpKTsKLQotICAgIEN1cmxTb2NrZXRIYW5kbGUgc29j
a2V0IHsgdXJsLCBbdGhpc10oQ1VSTGNvZGUgZXJyb3JDb2RlKSB7Ci0gICAgICAgIGhhbmRsZUVy
cm9yKGVycm9yQ29kZSk7Ci0gICAgfX07Ci0KLSAgICAvLyBDb25uZWN0IHRvIGhvc3QKLSAgICBp
ZiAoIXNvY2tldC5jb25uZWN0KCkpCisgICAgaWYgKG1fc3RhdGUgIT0gQ29ubmVjdGluZykKICAg
ICAgICAgcmV0dXJuOworICAgIG1fc3RhdGUgPSBPcGVuOwogCi0gICAgY2FsbE9uTWFpblRocmVh
ZChbdGhpcywgcHJvdGVjdGVkVGhpcyA9IG1ha2VSZWYoKnRoaXMpXSB7Ci0gICAgICAgIGlmICht
X3N0YXRlID09IENvbm5lY3RpbmcpIHsKLSAgICAgICAgICAgIG1fc3RhdGUgPSBPcGVuOwotICAg
ICAgICAgICAgbV9jbGllbnQuZGlkT3BlblNvY2tldFN0cmVhbSgqdGhpcyk7Ci0gICAgICAgIH0K
LSAgICB9KTsKLQotICAgIHdoaWxlIChtX3J1bm5pbmcpIHsKLSAgICAgICAgZXhlY3V0ZVRhc2tz
KCk7Ci0KLSAgICAgICAgYXV0byByZXN1bHQgPSBzb2NrZXQud2FpdCgyMF9tcywgbV93cml0ZUJ1
ZmZlci5nZXQoKSk7Ci0gICAgICAgIGlmICghcmVzdWx0KQotICAgICAgICAgICAgY29udGludWU7
Ci0KLSAgICAgICAgLy8gVGhlc2UgbG9naWMgb25seSBydW4gd2hlbiB0aGVyZSdzIGRhdGEgd2Fp
dGluZy4KLSAgICAgICAgaWYgKHJlc3VsdC0+d3JpdGFibGUgJiYgbV9ydW5uaW5nKSB7Ci0gICAg
ICAgICAgICBhdXRvIGJ5dGVzU2VudCA9IHNvY2tldC5zZW5kKG1fd3JpdGVCdWZmZXIuZ2V0KCkg
KyBtX3dyaXRlQnVmZmVyT2Zmc2V0LCBtX3dyaXRlQnVmZmVyU2l6ZSAtIG1fd3JpdGVCdWZmZXJP
ZmZzZXQpOwotICAgICAgICAgICAgbV93cml0ZUJ1ZmZlck9mZnNldCArPSBieXRlc1NlbnQ7Ci0K
LSAgICAgICAgICAgIGlmIChtX3dyaXRlQnVmZmVyU2l6ZSA8PSBtX3dyaXRlQnVmZmVyT2Zmc2V0
KSB7Ci0gICAgICAgICAgICAgICAgbV93cml0ZUJ1ZmZlciA9IG51bGxwdHI7Ci0gICAgICAgICAg
ICAgICAgbV93cml0ZUJ1ZmZlclNpemUgPSAwOwotICAgICAgICAgICAgICAgIG1fd3JpdGVCdWZm
ZXJPZmZzZXQgPSAwOwotCi0gICAgICAgICAgICAgICAgY2FsbE9uTWFpblRocmVhZChbdGhpcywg
cHJvdGVjdGVkVGhpcyA9IG1ha2VSZWYoKnRoaXMpXSB7Ci0gICAgICAgICAgICAgICAgICAgIG1f
aGFzUGVuZGluZ1dyaXRlRGF0YSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBzZW5kUGVu
ZGluZ0RhdGEoKTsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAg
fQotCi0gICAgICAgIGlmIChyZXN1bHQtPnJlYWRhYmxlICYmIG1fcnVubmluZykgewotICAgICAg
ICAgICAgYXV0byByZWFkQnVmZmVyID0gbWFrZVVuaXF1ZUFycmF5PHVpbnQ4X3Q+KGtSZWFkQnVm
ZmVyU2l6ZSk7Ci0gICAgICAgICAgICBhdXRvIGJ5dGVzUmVhZCA9IHNvY2tldC5yZWNlaXZlKHJl
YWRCdWZmZXIuZ2V0KCksIGtSZWFkQnVmZmVyU2l6ZSk7Ci0gICAgICAgICAgICAvLyBgbnVsbG9w
dGAgcmVzdWx0IG1lYW5zIG5vdGhpbmcgdG8gaGFuZGxlIGF0IHRoaXMgbW9tZW50LgotICAgICAg
ICAgICAgaWYgKCFieXRlc1JlYWQpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAg
ICAgICAgIC8vIDAgYnl0ZXMgaW5kaWNhdGVzIGEgY2xvc2VkIGNvbm5lY3Rpb24uCi0gICAgICAg
ICAgICBpZiAoISpieXRlc1JlYWQpIHsKLSAgICAgICAgICAgICAgICBtX3J1bm5pbmcgPSBmYWxz
ZTsKLSAgICAgICAgICAgICAgICBjYWxsT25NYWluVGhyZWFkKFt0aGlzLCBwcm90ZWN0ZWRUaGlz
ID0gbWFrZVJlZigqdGhpcyldIHsKLSAgICAgICAgICAgICAgICAgICAgY2xvc2UoKTsKLSAgICAg
ICAgICAgICAgICB9KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQot
ICAgICAgICAgICAgY2FsbE9uTWFpblRocmVhZChbdGhpcywgcHJvdGVjdGVkVGhpcyA9IG1ha2VS
ZWYoKnRoaXMpLCBidWZmZXIgPSBXVEZNb3ZlKHJlYWRCdWZmZXIpLCBzaXplID0gKmJ5dGVzUmVh
ZCBdIHsKLSAgICAgICAgICAgICAgICBpZiAobV9zdGF0ZSA9PSBPcGVuKQotICAgICAgICAgICAg
ICAgICAgICBtX2NsaWVudC5kaWRSZWNlaXZlU29ja2V0U3RyZWFtRGF0YSgqdGhpcywgcmVpbnRl
cnByZXRfY2FzdDxjb25zdCBjaGFyKj4oYnVmZmVyLmdldCgpKSwgc2l6ZSk7Ci0gICAgICAgICAg
ICB9KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIG1fd3JpdGVCdWZmZXIgPSBudWxscHRyOwor
ICAgIG1fY2xpZW50LmRpZE9wZW5Tb2NrZXRTdHJlYW0oKnRoaXMpOwogfQogCi12b2lkIFNvY2tl
dFN0cmVhbUhhbmRsZUltcGw6OmhhbmRsZUVycm9yKENVUkxjb2RlIGVycm9yQ29kZSkKK3ZvaWQg
U29ja2V0U3RyZWFtSGFuZGxlSW1wbDo6ZGlkU2VuZERhdGEoQ3VybFN0cmVhbUlELCBzaXplX3Qg
bGVuZ3RoKQogewotICAgIG1fcnVubmluZyA9IGZhbHNlOwotICAgIGNhbGxPbk1haW5UaHJlYWQo
W3RoaXMsIHByb3RlY3RlZFRoaXMgPSBtYWtlUmVmKCp0aGlzKSwgZXJyb3JDb2RlLCBsb2NhbGl6
ZWREZXNjcmlwdGlvbiA9IEN1cmxIYW5kbGU6OmVycm9yRGVzY3JpcHRpb24oZXJyb3JDb2RlKS5p
c29sYXRlZENvcHkoKV0gewotICAgICAgICBpZiAobV9zdGF0ZSA9PSBDbG9zZWQpCi0gICAgICAg
ICAgICByZXR1cm47Ci0KLSAgICAgICAgaWYgKGVycm9yQ29kZSA9PSBDVVJMRV9SRUNWX0VSUk9S
KQotICAgICAgICAgICAgbV9jbGllbnQuZGlkRmFpbFRvUmVjZWl2ZVNvY2tldFN0cmVhbURhdGEo
KnRoaXMpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBtX2NsaWVudC5kaWRGYWlsU29ja2V0
U3RyZWFtKCp0aGlzLCBTb2NrZXRTdHJlYW1FcnJvcihzdGF0aWNfY2FzdDxpbnQ+KGVycm9yQ29k
ZSksIHsgfSwgbG9jYWxpemVkRGVzY3JpcHRpb24pKTsKLSAgICB9KTsKKyAgICBBU1NFUlQobV90
b3RhbFNlbmREYXRhU2l6ZSAtIGxlbmd0aCA+PSAwKTsKKworICAgIG1fdG90YWxTZW5kRGF0YVNp
emUgLT0gbGVuZ3RoOworICAgIHNlbmRQZW5kaW5nRGF0YSgpOwogfQogCi12b2lkIFNvY2tldFN0
cmVhbUhhbmRsZUltcGw6OnN0b3BUaHJlYWQoKQordm9pZCBTb2NrZXRTdHJlYW1IYW5kbGVJbXBs
OjpkaWRSZWNlaXZlRGF0YShDdXJsU3RyZWFtSUQsIGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBs
ZW5ndGgpCiB7Ci0gICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKLQotICAgIG1fcnVubmluZyA9
IGZhbHNlOworICAgIGlmIChtX3N0YXRlICE9IE9wZW4pCisgICAgICAgIHJldHVybjsKIAotICAg
IGlmIChtX3dvcmtlclRocmVhZCkgewotICAgICAgICBtX3dvcmtlclRocmVhZC0+d2FpdEZvckNv
bXBsZXRpb24oKTsKLSAgICAgICAgbV93b3JrZXJUaHJlYWQgPSBudWxscHRyOwotICAgIH0KKyAg
ICBtX2NsaWVudC5kaWRSZWNlaXZlU29ja2V0U3RyZWFtRGF0YSgqdGhpcywgZGF0YSwgbGVuZ3Ro
KTsKIH0KIAotdm9pZCBTb2NrZXRTdHJlYW1IYW5kbGVJbXBsOjpjYWxsT25Xb3JrZXJUaHJlYWQo
RnVuY3Rpb248dm9pZCgpPiYmIHRhc2spCit2b2lkIFNvY2tldFN0cmVhbUhhbmRsZUltcGw6OmRp
ZEZhaWwoQ3VybFN0cmVhbUlELCBDVVJMY29kZSBlcnJvckNvZGUsIFVSTCYmIHVybCkKIHsKLSAg
ICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOwotICAgIG1fdGFza1F1ZXVlLmFwcGVuZChtYWtlVW5p
cXVlPEZ1bmN0aW9uPHZvaWQoKT4+KFdURk1vdmUodGFzaykpKTsKKyAgICBkZXN0cnVjdFN0cmVh
bSgpOworCisgICAgaWYgKG1fc3RhdGUgPT0gQ2xvc2VkKQorICAgICAgICByZXR1cm47CisKKyAg
ICBpZiAoZXJyb3JDb2RlID09IENVUkxFX1JFQ1ZfRVJST1IpCisgICAgICAgIG1fY2xpZW50LmRp
ZEZhaWxUb1JlY2VpdmVTb2NrZXRTdHJlYW1EYXRhKCp0aGlzKTsKKyAgICBlbHNlCisgICAgICAg
IG1fY2xpZW50LmRpZEZhaWxTb2NrZXRTdHJlYW0oKnRoaXMsIFNvY2tldFN0cmVhbUVycm9yKGVy
cm9yQ29kZSwgdXJsLCBDdXJsSGFuZGxlOjplcnJvckRlc2NyaXB0aW9uKGVycm9yQ29kZSkpKTsK
IH0KIAotdm9pZCBTb2NrZXRTdHJlYW1IYW5kbGVJbXBsOjpleGVjdXRlVGFza3MoKQordm9pZCBT
b2NrZXRTdHJlYW1IYW5kbGVJbXBsOjpkZXN0cnVjdFN0cmVhbSgpCiB7Ci0gICAgQVNTRVJUKCFp
c01haW5UaHJlYWQoKSk7CisgICAgaWYgKGlzU3RyZWFtSW52YWxpZGF0ZWQoKSkKKyAgICAgICAg
cmV0dXJuOwogCi0gICAgYXV0byB0YXNrcyA9IG1fdGFza1F1ZXVlLnRha2VBbGxNZXNzYWdlcygp
OwotICAgIGZvciAoYXV0byYgdGFzayA6IHRhc2tzKQotICAgICAgICAoKnRhc2spKCk7CisgICAg
bV9zY2hlZHVsZXIuZGVzdHJveVN0cmVhbShtX3N0cmVhbUlEKTsKKyAgICBtX3N0cmVhbUlEID0g
aW52YWxpZEN1cmxTdHJlYW1JRDsKIH0KIAogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>390463</attachid>
            <date>2020-02-11 16:38:23 -0800</date>
            <delta_ts>2020-02-12 22:59:50 -0800</delta_ts>
            <desc>Handling connections by one thread.</desc>
            <filename>shukuwa-org-0210.diff</filename>
            <type>text/plain</type>
            <size>35957</size>
            <attacher name="Takashi Komori">takashi.komori</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL0N1cmwuY21ha2UgYi9Tb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9DdXJsLmNtYWtlCmluZGV4IGY2ODk0YWMzZWY0Li5lZGRiNWZhYzJm
MyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vQ3VybC5jbWFrZQorKysgYi9T
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9DdXJsLmNtYWtlCkBAIC0yMiw2ICsyMiw4IEBAIGxpc3Qo
QVBQRU5EIFdlYkNvcmVfU09VUkNFUwogICAgIHBsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsUmVz
b3VyY2VIYW5kbGVEZWxlZ2F0ZS5jcHAKICAgICBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybFNT
TEhhbmRsZS5jcHAKICAgICBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybFNTTFZlcmlmaWVyLmNw
cAorICAgIHBsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsU3RyZWFtLmNwcAorICAgIHBsYXRmb3Jt
L25ldHdvcmsvY3VybC9DdXJsU3RyZWFtU2NoZWR1bGVyLmNwcAogICAgIHBsYXRmb3JtL25ldHdv
cmsvY3VybC9ETlNSZXNvbHZlUXVldWVDdXJsLmNwcAogICAgIHBsYXRmb3JtL25ldHdvcmsvY3Vy
bC9OZXR3b3JrU3RvcmFnZVNlc3Npb25DdXJsLmNwcAogICAgIHBsYXRmb3JtL25ldHdvcmsvY3Vy
bC9PcGVuU1NMSGVscGVyLmNwcApAQCAtNTgsNiArNjAsOCBAQCBsaXN0KEFQUEVORCBXZWJDb3Jl
X1BSSVZBVEVfRlJBTUVXT1JLX0hFQURFUlMKICAgICBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3Vy
bFJlc3BvbnNlLmgKICAgICBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybFNTTEhhbmRsZS5oCiAg
ICAgcGxhdGZvcm0vbmV0d29yay9jdXJsL0N1cmxTU0xWZXJpZmllci5oCisgICAgcGxhdGZvcm0v
bmV0d29yay9jdXJsL0N1cmxTdHJlYW0uaAorICAgIHBsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJs
U3RyZWFtU2NoZWR1bGVyLmgKICAgICBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvRE5TUmVzb2x2ZVF1
ZXVlQ3VybC5oCiAgICAgcGxhdGZvcm0vbmV0d29yay9jdXJsL0Rvd25sb2FkQnVuZGxlLmgKICAg
ICBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvT3BlblNTTEhlbHBlci5oCmRpZmYgLS1naXQgYS9Tb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybENvbnRleHQuY3BwIGIvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0N1cmxDb250ZXh0LmNwcAppbmRleCA3YjA0
ZmEyNmE0Mi4uZTRjNzYwNjY1YTQgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L25ldHdvcmsvY3VybC9DdXJsQ29udGV4dC5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vbmV0d29yay9jdXJsL0N1cmxDb250ZXh0LmNwcApAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1
ZGUgIkN1cmxSZXF1ZXN0U2NoZWR1bGVyLmgiCiAjaW5jbHVkZSAiQ3VybFNTTEhhbmRsZS5oIgog
I2luY2x1ZGUgIkN1cmxTU0xWZXJpZmllci5oIgorI2luY2x1ZGUgIkN1cmxTdHJlYW1TY2hlZHVs
ZXIuaCIKICNpbmNsdWRlICJIVFRQSGVhZGVyTWFwLmgiCiAjaW5jbHVkZSA8TmV0d29ya0xvYWRN
ZXRyaWNzLmg+CiAjaW5jbHVkZSA8bXV0ZXg+CkBAIC0xNDYsNiArMTQ3LDEyIEBAIHZvaWQgQ3Vy
bENvbnRleHQ6OmluaXRTaGFyZUhhbmRsZSgpCiAgICAgY3VybF9lYXN5X2NsZWFudXAoY3VybCk7
CiB9CiAKK0N1cmxTdHJlYW1TY2hlZHVsZXImIEN1cmxDb250ZXh0OjpzdHJlYW1TY2hlZHVsZXIo
KQoreworICAgIHN0YXRpYyBOZXZlckRlc3Ryb3llZDxDdXJsU3RyZWFtU2NoZWR1bGVyPiBzaGFy
ZWRJbnN0YW5jZTsKKyAgICByZXR1cm4gc2hhcmVkSW5zdGFuY2U7Cit9CisKIGJvb2wgQ3VybENv
bnRleHQ6OmlzSHR0cDJFbmFibGVkKCkgY29uc3QKIHsKICAgICBjdXJsX3ZlcnNpb25faW5mb19k
YXRhKiBkYXRhID0gY3VybF92ZXJzaW9uX2luZm8oQ1VSTFZFUlNJT05fTk9XKTsKQEAgLTg4Nywx
MTQgKzg5NCwyNSBAQCB2b2lkIEN1cmxIYW5kbGU6OmVuYWJsZVN0ZEVycklmVXNlZCgpCiAKICNl
bmRpZgogCi0vLyBDdXJsU29ja2V0SGFuZGxlCi0KLUN1cmxTb2NrZXRIYW5kbGU6OkN1cmxTb2Nr
ZXRIYW5kbGUoY29uc3QgVVJMJiB1cmwsIEZ1bmN0aW9uPHZvaWQoQ1VSTGNvZGUpPiYmIGVycm9y
SGFuZGxlcikKLSAgICA6IG1fZXJyb3JIYW5kbGVyKFdURk1vdmUoZXJyb3JIYW5kbGVyKSkKK0V4
cGVjdGVkPGN1cmxfc29ja2V0X3QsIENVUkxjb2RlPiBDdXJsSGFuZGxlOjpnZXRBY3RpdmVTb2Nr
ZXQoKQogewotICAgIC8vIExpYmN1cmwgaXMgbm90IHJlc3BvbnNpYmxlIGZvciB0aGUgcHJvdG9j
b2wgaGFuZGxpbmcuIEl0IGp1c3QgaGFuZGxlcyBjb25uZWN0aW9uLgotICAgIC8vIE9ubHkgc2No
ZW1lLCBob3N0IGFuZCBwb3J0IGlzIHJlcXVpcmVkLgotICAgIFVSTCB1cmxGb3JDb25uZWN0aW9u
OwotICAgIHVybEZvckNvbm5lY3Rpb24uc2V0UHJvdG9jb2wodXJsLnByb3RvY29sSXMoIndzcyIp
ID8gImh0dHBzIiA6ICJodHRwIik7Ci0gICAgdXJsRm9yQ29ubmVjdGlvbi5zZXRIb3N0QW5kUG9y
dCh1cmwuaG9zdEFuZFBvcnQoKSk7Ci0gICAgc2V0VXJsKHVybEZvckNvbm5lY3Rpb24pOwotCi0g
ICAgZW5hYmxlQ29ubmVjdGlvbk9ubHkoKTsKLX0KKyAgICBjdXJsX3NvY2tldF90IHNvY2tldDsK
IAotYm9vbCBDdXJsU29ja2V0SGFuZGxlOjpjb25uZWN0KCkKLXsKLSAgICBDVVJMY29kZSBlcnJv
ckNvZGUgPSBwZXJmb3JtKCk7Ci0gICAgaWYgKGVycm9yQ29kZSAhPSBDVVJMRV9PSykgewotICAg
ICAgICBtX2Vycm9ySGFuZGxlcihlcnJvckNvZGUpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0g
ICAgfQorICAgIENVUkxjb2RlIGVycm9yQ29kZSA9IGN1cmxfZWFzeV9nZXRpbmZvKG1faGFuZGxl
LCBDVVJMSU5GT19BQ1RJVkVTT0NLRVQsICZzb2NrZXQpOworICAgIGlmIChlcnJvckNvZGUgIT0g
Q1VSTEVfT0spCisgICAgICAgIHJldHVybiBtYWtlVW5leHBlY3RlZChlcnJvckNvZGUpOwogCi0g
ICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIHNvY2tldDsKIH0KIAotc2l6ZV90IEN1cmxTb2Nr
ZXRIYW5kbGU6OnNlbmQoY29uc3QgdWludDhfdCogYnVmZmVyLCBzaXplX3Qgc2l6ZSkKK0NVUkxj
b2RlIEN1cmxIYW5kbGU6OnNlbmQoY29uc3QgdWludDhfdCogYnVmZmVyLCBzaXplX3QgYnVmZmVy
U2l6ZSwgc2l6ZV90JiBieXRlc1NlbnQpCiB7Ci0gICAgc2l6ZV90IHRvdGFsQnl0ZXNTZW50ID0g
MDsKLQotICAgIHdoaWxlICh0b3RhbEJ5dGVzU2VudCA8IHNpemUpIHsKLSAgICAgICAgc2l6ZV90
IGJ5dGVzU2VudCA9IDA7Ci0gICAgICAgIENVUkxjb2RlIGVycm9yQ29kZSA9IGN1cmxfZWFzeV9z
ZW5kKGhhbmRsZSgpLCBidWZmZXIgKyB0b3RhbEJ5dGVzU2VudCwgc2l6ZSAtIHRvdGFsQnl0ZXNT
ZW50LCAmYnl0ZXNTZW50KTsKLSAgICAgICAgaWYgKGVycm9yQ29kZSAhPSBDVVJMRV9PSykgewot
ICAgICAgICAgICAgaWYgKGVycm9yQ29kZSAhPSBDVVJMRV9BR0FJTikKLSAgICAgICAgICAgICAg
ICBtX2Vycm9ySGFuZGxlcihlcnJvckNvZGUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAg
IH0KLQotICAgICAgICB0b3RhbEJ5dGVzU2VudCArPSBieXRlc1NlbnQ7Ci0gICAgfQotCi0gICAg
cmV0dXJuIHRvdGFsQnl0ZXNTZW50OworICAgIHJldHVybiBjdXJsX2Vhc3lfc2VuZChtX2hhbmRs
ZSwgYnVmZmVyLCBidWZmZXJTaXplLCAmYnl0ZXNTZW50KTsKIH0KIAotT3B0aW9uYWw8c2l6ZV90
PiBDdXJsU29ja2V0SGFuZGxlOjpyZWNlaXZlKHVpbnQ4X3QqIGJ1ZmZlciwgc2l6ZV90IGJ1ZmZl
clNpemUpCitDVVJMY29kZSBDdXJsSGFuZGxlOjpyZWNlaXZlKHVpbnQ4X3QqIGJ1ZmZlciwgc2l6
ZV90IGJ1ZmZlclNpemUsIHNpemVfdCYgYnl0ZXNSZWFkKQogewotICAgIHNpemVfdCBieXRlc1Jl
YWQgPSAwOwotCi0gICAgQ1VSTGNvZGUgZXJyb3JDb2RlID0gY3VybF9lYXN5X3JlY3YoaGFuZGxl
KCksIGJ1ZmZlciwgYnVmZmVyU2l6ZSwgJmJ5dGVzUmVhZCk7Ci0gICAgaWYgKGVycm9yQ29kZSAh
PSBDVVJMRV9PSykgewotICAgICAgICBpZiAoZXJyb3JDb2RlICE9IENVUkxFX0FHQUlOKQotICAg
ICAgICAgICAgbV9lcnJvckhhbmRsZXIoZXJyb3JDb2RlKTsKLQotICAgICAgICByZXR1cm4gV1RG
OjpudWxsb3B0OwotICAgIH0KLQotICAgIHJldHVybiBieXRlc1JlYWQ7Ci19Ci0KLU9wdGlvbmFs
PEN1cmxTb2NrZXRIYW5kbGU6OldhaXRSZXN1bHQ+IEN1cmxTb2NrZXRIYW5kbGU6OndhaXQoY29u
c3QgU2Vjb25kcyYgdGltZW91dCwgYm9vbCBhbHNvV2FpdEZvcldyaXRlKQotewotICAgIGN1cmxf
c29ja2V0X3Qgc29ja2V0OwotICAgIENVUkxjb2RlIGVycm9yQ29kZSA9IGN1cmxfZWFzeV9nZXRp
bmZvKGhhbmRsZSgpLCBDVVJMSU5GT19BQ1RJVkVTT0NLRVQsICZzb2NrZXQpOwotICAgIGlmIChl
cnJvckNvZGUgIT0gQ1VSTEVfT0spIHsKLSAgICAgICAgbV9lcnJvckhhbmRsZXIoZXJyb3JDb2Rl
KTsKLSAgICAgICAgcmV0dXJuIFdURjo6bnVsbG9wdDsKLSAgICB9Ci0KLSAgICBpbnQ2NF90IHVz
ZWMgPSB0aW1lb3V0Lm1pY3Jvc2Vjb25kc0FzPGludDY0X3Q+KCk7Ci0KLSAgICBzdHJ1Y3QgdGlt
ZXZhbCBzZWxlY3RUaW1lb3V0OwotICAgIGlmICh1c2VjIDw9IDApIHsKLSAgICAgICAgc2VsZWN0
VGltZW91dC50dl9zZWMgPSAwOwotICAgICAgICBzZWxlY3RUaW1lb3V0LnR2X3VzZWMgPSAwOwot
ICAgIH0gZWxzZSB7Ci0gICAgICAgIHNlbGVjdFRpbWVvdXQudHZfc2VjID0gdXNlYyAvIDEwMDAw
MDA7Ci0gICAgICAgIHNlbGVjdFRpbWVvdXQudHZfdXNlYyA9IHVzZWMgJSAxMDAwMDAwOwotICAg
IH0KLQotICAgIGludCByYyA9IDA7Ci0gICAgaW50IG1heGZkID0gc3RhdGljX2Nhc3Q8aW50Pihz
b2NrZXQpICsgMTsKLSAgICBmZF9zZXQgZmRyZWFkOwotICAgIGZkX3NldCBmZHdyaXRlOwotICAg
IGZkX3NldCBmZGVycjsKLQotICAgIC8vIFJldHJ5ICdzZWxlY3QnIGlmIGl0IHdhcyBpbnRlcnJ1
cHRlZCBieSBhIHByb2Nlc3Mgc2lnbmFsLgotICAgIGRvIHsKLSAgICAgICAgRkRfWkVSTygmZmRy
ZWFkKTsKLSAgICAgICAgRkRfU0VUKHNvY2tldCwgJmZkcmVhZCk7Ci0KLSAgICAgICAgRkRfWkVS
TygmZmR3cml0ZSk7Ci0gICAgICAgIGlmIChhbHNvV2FpdEZvcldyaXRlKQotICAgICAgICAgICAg
RkRfU0VUKHNvY2tldCwgJmZkd3JpdGUpOwotCi0gICAgICAgIEZEX1pFUk8oJmZkZXJyKTsKLSAg
ICAgICAgRkRfU0VUKHNvY2tldCwgJmZkZXJyKTsKLQotICAgICAgICByYyA9IDo6c2VsZWN0KG1h
eGZkLCAmZmRyZWFkLCAmZmR3cml0ZSwgJmZkZXJyLCAmc2VsZWN0VGltZW91dCk7Ci0gICAgfSB3
aGlsZSAocmMgPT0gLTEgJiYgZXJybm8gPT0gRUlOVFIpOwotCi0gICAgaWYgKHJjIDw9IDApCi0g
ICAgICAgIHJldHVybiBXVEY6Om51bGxvcHQ7Ci0KLSAgICBXYWl0UmVzdWx0IHJlc3VsdDsKLSAg
ICByZXN1bHQucmVhZGFibGUgPSBGRF9JU1NFVChzb2NrZXQsICZmZHJlYWQpIHx8IEZEX0lTU0VU
KHNvY2tldCwgJmZkZXJyKTsKLSAgICByZXN1bHQud3JpdGFibGUgPSBGRF9JU1NFVChzb2NrZXQs
ICZmZHdyaXRlKTsKLSAgICByZXR1cm4gcmVzdWx0OworICAgIHJldHVybiBjdXJsX2Vhc3lfcmVj
dihtX2hhbmRsZSwgYnVmZmVyLCBidWZmZXJTaXplLCAmYnl0ZXNSZWFkKTsKIH0KIAogfQpkaWZm
IC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0N1cmxDb250ZXh0
LmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybENvbnRleHQuaApp
bmRleCBhNGY4YzAyODI3Ni4uM2M5MGU0YjFlY2MgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsQ29udGV4dC5oCisrKyBiL1NvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsQ29udGV4dC5oCkBAIC04OSw2ICs4OSw3IEBAIHBy
aXZhdGU6CiAvLyBDdXJsQ29udGV4dCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLQogCiBjbGFzcyBDdXJsUmVxdWVzdFNjaGVkdWxlcjsKK2NsYXNzIEN1cmxTdHJl
YW1TY2hlZHVsZXI7CiAKIGNsYXNzIEN1cmxDb250ZXh0IDogcHVibGljIEN1cmxHbG9iYWwgewog
ICAgIFdURl9NQUtFX05PTkNPUFlBQkxFKEN1cmxDb250ZXh0KTsKQEAgLTEwMSw2ICsxMDIsNyBA
QCBwdWJsaWM6CiAgICAgY29uc3QgQ3VybFNoYXJlSGFuZGxlJiBzaGFyZUhhbmRsZSgpIHsgcmV0
dXJuIG1fc2hhcmVIYW5kbGU7IH0KIAogICAgIEN1cmxSZXF1ZXN0U2NoZWR1bGVyJiBzY2hlZHVs
ZXIoKSB7IHJldHVybiAqbV9zY2hlZHVsZXI7IH0KKyAgICBDdXJsU3RyZWFtU2NoZWR1bGVyJiBz
dHJlYW1TY2hlZHVsZXIoKTsKIAogICAgIC8vIFByb3h5CiAgICAgY29uc3QgQ3VybFByb3h5U2V0
dGluZ3MmIHByb3h5U2V0dGluZ3MoKSBjb25zdCB7IHJldHVybiBtX3Byb3h5U2V0dGluZ3M7IH0K
QEAgLTI5Myw2ICsyOTUsMTEgQEAgcHVibGljOgogCiAgICAgc3RhdGljIGxvbmcgbG9uZyBtYXhD
dXJsT2ZmVCgpOwogCisgICAgLy8gc29ja2V0CisgICAgRXhwZWN0ZWQ8Y3VybF9zb2NrZXRfdCwg
Q1VSTGNvZGU+IGdldEFjdGl2ZVNvY2tldCgpOworICAgIENVUkxjb2RlIHNlbmQoY29uc3QgdWlu
dDhfdCosIHNpemVfdCwgc2l6ZV90Jik7CisgICAgQ1VSTGNvZGUgcmVjZWl2ZSh1aW50OF90Kiwg
c2l6ZV90LCBzaXplX3QmKTsKKwogI2lmbmRlZiBOREVCVUcKICAgICB2b2lkIGVuYWJsZVZlcmJv
c2VJZlVzZWQoKTsKICAgICB2b2lkIGVuYWJsZVN0ZEVycklmVXNlZCgpOwpAQCAtMzEzLDI0ICsz
MjAsNCBAQCBwcml2YXRlOgogICAgIHN0ZDo6dW5pcXVlX3B0cjxDdXJsU1NMVmVyaWZpZXI+IG1f
c3NsVmVyaWZpZXI7CiB9OwogCi1jbGFzcyBDdXJsU29ja2V0SGFuZGxlIDogcHVibGljIEN1cmxI
YW5kbGUgewotICAgIFdURl9NQUtFX05PTkNPUFlBQkxFKEN1cmxTb2NrZXRIYW5kbGUpOwotCi1w
dWJsaWM6Ci0gICAgc3RydWN0IFdhaXRSZXN1bHQgewotICAgICAgICBib29sIHJlYWRhYmxlIHsg
ZmFsc2UgfTsKLSAgICAgICAgYm9vbCB3cml0YWJsZSB7IGZhbHNlIH07Ci0gICAgfTsKLQotICAg
IEN1cmxTb2NrZXRIYW5kbGUoY29uc3QgVVJMJiwgRnVuY3Rpb248dm9pZChDVVJMY29kZSk+JiYg
ZXJyb3JIYW5kbGVyKTsKLQotICAgIGJvb2wgY29ubmVjdCgpOwotICAgIHNpemVfdCBzZW5kKGNv
bnN0IHVpbnQ4X3QqLCBzaXplX3QpOwotICAgIE9wdGlvbmFsPHNpemVfdD4gcmVjZWl2ZSh1aW50
OF90Kiwgc2l6ZV90KTsKLSAgICBPcHRpb25hbDxXYWl0UmVzdWx0PiB3YWl0KGNvbnN0IFNlY29u
ZHMmIHRpbWVvdXQsIGJvb2wgYWxzb1dhaXRGb3JXcml0ZSk7Ci0KLXByaXZhdGU6Ci0gICAgRnVu
Y3Rpb248dm9pZChDVVJMY29kZSk+IG1fZXJyb3JIYW5kbGVyOwotfTsKLQogfSAvLyBuYW1lc3Bh
Y2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9j
dXJsL0N1cmxTdHJlYW0uY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJs
L0N1cmxTdHJlYW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi4z
ZWViOGQ3NDQ1YgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25l
dHdvcmsvY3VybC9DdXJsU3RyZWFtLmNwcApAQCAtMCwwICsxLDE5NCBAQAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAyMCBTb255IEludGVyYWN0aXZlIEVudGVydGFpbm1lbnQgSW5jLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElU
UyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElO
Qy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YK
KyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
CisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisg
Ki8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkN1cmxTdHJlYW0uaCIKKworI2lu
Y2x1ZGUgIkN1cmxTdHJlYW1TY2hlZHVsZXIuaCIKKyNpbmNsdWRlICJTb2NrZXRTdHJlYW1FcnJv
ci5oIgorCisjaWYgVVNFKENVUkwpCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworQ3VybFN0cmVh
bTo6Q3VybFN0cmVhbShDdXJsU3RyZWFtU2NoZWR1bGVyJiBzY2hlZHVsZXIsIEN1cmxTdHJlYW1J
RCBzdHJlYW1JRCwgVVJMJiYgdXJsKQorICAgIDogbV9zY2hlZHVsZXIoc2NoZWR1bGVyKQorICAg
ICwgbV9zdHJlYW1JRChzdHJlYW1JRCkKKyAgICAsIG1fdXJsKFdURk1vdmUodXJsKSkKK3sKKyAg
ICBBU1NFUlQoIWlzTWFpblRocmVhZCgpKTsKKworICAgIG1fY3VybEhhbmRsZSA9IFdURjo6bWFr
ZVVuaXF1ZTxDdXJsSGFuZGxlPigpOworCisgICAgLy8gTGliY3VybCBpcyBub3QgcmVzcG9uc2li
bGUgZm9yIHRoZSBwcm90b2NvbCBoYW5kbGluZy4gSXQganVzdCBoYW5kbGVzIGNvbm5lY3Rpb24u
CisgICAgLy8gT25seSBzY2hlbWUsIGhvc3QgYW5kIHBvcnQgaXMgcmVxdWlyZWQuCisgICAgVVJM
IHVybEZvckNvbm5lY3Rpb247CisgICAgdXJsRm9yQ29ubmVjdGlvbi5zZXRQcm90b2NvbChtX3Vy
bC5wcm90b2NvbElzKCJ3c3MiKSA/ICJodHRwcyIgOiAiaHR0cCIpOworICAgIHVybEZvckNvbm5l
Y3Rpb24uc2V0SG9zdEFuZFBvcnQobV91cmwuaG9zdEFuZFBvcnQoKSk7CisgICAgbV9jdXJsSGFu
ZGxlLT5zZXRVcmwodXJsRm9yQ29ubmVjdGlvbik7CisKKyAgICBtX2N1cmxIYW5kbGUtPmVuYWJs
ZUNvbm5lY3Rpb25Pbmx5KCk7CisKKyAgICBhdXRvIGVycm9yQ29kZSA9IG1fY3VybEhhbmRsZS0+
cGVyZm9ybSgpOworICAgIGlmIChlcnJvckNvZGUgIT0gQ1VSTEVfT0spIHsKKyAgICAgICAgbm90
aWZ5RmFpbHVyZShlcnJvckNvZGUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbV9z
Y2hlZHVsZXIuY2FsbENsaWVudE9uTWFpblRocmVhZChtX3N0cmVhbUlELCBbc3RyZWFtSUQgPSBt
X3N0cmVhbUlEXShDbGllbnQmIGNsaWVudCkgeworICAgICAgICBjbGllbnQuZGlkT3BlbihzdHJl
YW1JRCk7CisgICAgfSk7Cit9CisKK0N1cmxTdHJlYW06On5DdXJsU3RyZWFtKCkKK3sKKyAgICBB
U1NFUlQoIWlzTWFpblRocmVhZCgpKTsKKyAgICBkZXN0cm95SGFuZGxlKCk7Cit9CisKK3ZvaWQg
Q3VybFN0cmVhbTo6ZGVzdHJveUhhbmRsZSgpCit7CisgICAgaWYgKCFtX2N1cmxIYW5kbGUpCisg
ICAgICAgIHJldHVybjsKKworICAgIG1fY3VybEhhbmRsZSA9IG51bGxwdHI7Cit9CisKK3ZvaWQg
Q3VybFN0cmVhbTo6c2VuZChVbmlxdWVBcnJheTx1aW50OF90PiYmIGJ1ZmZlciwgc2l6ZV90IGxl
bmd0aCkKK3sKKyAgICBBU1NFUlQoIWlzTWFpblRocmVhZCgpKTsKKworICAgIGlmICghbV9jdXJs
SGFuZGxlKQorICAgICAgICByZXR1cm47CisKKyAgICBtX3NlbmRCdWZmZXJzLmFwcGVuZChzdGQ6
Om1ha2VfcGFpcihXVEZNb3ZlKGJ1ZmZlciksIGxlbmd0aCkpOworfQorCit2b2lkIEN1cmxTdHJl
YW06OmFwcGVuZE1vbml0b3JpbmdGZChmZF9zZXQmIHJlYWRmZHMsIGZkX3NldCYgd3JpdGVmZHMs
IGZkX3NldCYgZXhjZXB0ZmRzLCBpbnQmIG1heGZkKQoreworICAgIEFTU0VSVCghaXNNYWluVGhy
ZWFkKCkpOworCisgICAgaWYgKCFtX2N1cmxIYW5kbGUpCisgICAgICAgIHJldHVybjsKKworICAg
IGF1dG8gc29ja2V0ID0gbV9jdXJsSGFuZGxlLT5nZXRBY3RpdmVTb2NrZXQoKTsKKyAgICBpZiAo
IXNvY2tldC5oYXNfdmFsdWUoKSkgeworICAgICAgICBub3RpZnlGYWlsdXJlKHNvY2tldC5lcnJv
cigpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEZEX1NFVCgqc29ja2V0LCAmcmVh
ZGZkcyk7CisgICAgRkRfU0VUKCpzb2NrZXQsICZleGNlcHRmZHMpOworCisgICAgaWYgKG1fc2Vu
ZEJ1ZmZlcnMuc2l6ZSgpKQorICAgICAgICBGRF9TRVQoKnNvY2tldCwgJndyaXRlZmRzKTsKKwor
ICAgIGlmIChtYXhmZCA8ICpzb2NrZXQpCisgICAgICAgIG1heGZkID0gKnNvY2tldDsKK30KKwor
dm9pZCBDdXJsU3RyZWFtOjp0cnlUb1RyYW5zZmVyKGNvbnN0IGZkX3NldCYgcmVhZGZkcywgY29u
c3QgZmRfc2V0JiB3cml0ZWZkcywgY29uc3QgZmRfc2V0JiBleGNlcHRmZHMpCit7CisgICAgQVNT
RVJUKCFpc01haW5UaHJlYWQoKSk7CisKKyAgICBpZiAoIW1fY3VybEhhbmRsZSkKKyAgICAgICAg
cmV0dXJuOworCisgICAgYXV0byBzb2NrZXQgPSBtX2N1cmxIYW5kbGUtPmdldEFjdGl2ZVNvY2tl
dCgpOworICAgIGlmICghc29ja2V0Lmhhc192YWx1ZSgpKSB7CisgICAgICAgIG5vdGlmeUZhaWx1
cmUoc29ja2V0LmVycm9yKCkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKEZE
X0lTU0VUKCpzb2NrZXQsICZyZWFkZmRzKSB8fCBGRF9JU1NFVCgqc29ja2V0LCAmZXhjZXB0ZmRz
KSkKKyAgICAgICAgdHJ5VG9SZWNlaXZlKCk7CisKKyAgICBpZiAoRkRfSVNTRVQoKnNvY2tldCwg
JndyaXRlZmRzKSkKKyAgICAgICAgdHJ5VG9TZW5kKCk7Cit9CisKK3ZvaWQgQ3VybFN0cmVhbTo6
dHJ5VG9SZWNlaXZlKCkKK3sKKyAgICBpZiAoIW1fY3VybEhhbmRsZSkKKyAgICAgICAgcmV0dXJu
OworCisgICAgYXV0byByZWNlaXZlQnVmZmVyID0gbWFrZVVuaXF1ZUFycmF5PHVpbnQ4X3Q+KGtS
ZWNlaXZlQnVmZmVyU2l6ZSk7CisgICAgc2l6ZV90IGJ5dGVzUmVjZWl2ZWQgPSAwOworCisgICAg
YXV0byBlcnJvckNvZGUgPSBtX2N1cmxIYW5kbGUtPnJlY2VpdmUocmVjZWl2ZUJ1ZmZlci5nZXQo
KSwga1JlY2VpdmVCdWZmZXJTaXplLCBieXRlc1JlY2VpdmVkKTsKKyAgICBpZiAoZXJyb3JDb2Rl
ICE9IENVUkxFX09LKSB7CisgICAgICAgIGlmIChlcnJvckNvZGUgIT0gQ1VSTEVfQUdBSU4pCisg
ICAgICAgICAgICBub3RpZnlGYWlsdXJlKGVycm9yQ29kZSk7CisgICAgICAgIHJldHVybjsKKyAg
ICB9CisKKyAgICAvLyAwIGJ5dGVzIGluZGljYXRlcyBhIGNsb3NlZCBjb25uZWN0aW9uLgorICAg
IGlmICghYnl0ZXNSZWNlaXZlZCkKKyAgICAgICAgZGVzdHJveUhhbmRsZSgpOworCisgICAgbV9z
Y2hlZHVsZXIuY2FsbENsaWVudE9uTWFpblRocmVhZChtX3N0cmVhbUlELCBbc3RyZWFtSUQgPSBt
X3N0cmVhbUlELCBidWZmZXIgPSBXVEZNb3ZlKHJlY2VpdmVCdWZmZXIpLCBsZW5ndGggPSBieXRl
c1JlY2VpdmVkXShDbGllbnQmIGNsaWVudCkgbXV0YWJsZSB7CisgICAgICAgIGNsaWVudC5kaWRS
ZWNlaXZlRGF0YShzdHJlYW1JRCwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oYnVmZmVy
LmdldCgpKSwgbGVuZ3RoKTsKKyAgICB9KTsKK30KKwordm9pZCBDdXJsU3RyZWFtOjp0cnlUb1Nl
bmQoKQoreworICAgIGlmICghbV9jdXJsSGFuZGxlIHx8ICFtX3NlbmRCdWZmZXJzLnNpemUoKSkK
KyAgICAgICAgcmV0dXJuOworCisgICAgYXV0byYgc2VuZEJ1ZmZlciA9IG1fc2VuZEJ1ZmZlcnMu
Zmlyc3QoKTsKKyAgICBzaXplX3QgYnl0ZXNTZW50ID0gMDsKKworICAgIGF1dG8gZXJyb3JDb2Rl
ID0gbV9jdXJsSGFuZGxlLT5zZW5kKHNlbmRCdWZmZXIuZmlyc3QuZ2V0KCkgKyBtX3NlbmRCdWZm
ZXJPZmZzZXQsIHNlbmRCdWZmZXIuc2Vjb25kIC0gbV9zZW5kQnVmZmVyT2Zmc2V0LCBieXRlc1Nl
bnQpOworICAgIGlmIChlcnJvckNvZGUgIT0gQ1VSTEVfT0spIHsKKyAgICAgICAgaWYgKGVycm9y
Q29kZSAhPSBDVVJMRV9BR0FJTikKKyAgICAgICAgICAgIG5vdGlmeUZhaWx1cmUoZXJyb3JDb2Rl
KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1fc2VuZEJ1ZmZlck9mZnNldCArPSBi
eXRlc1NlbnQ7CisKKyAgICBpZiAobV9zZW5kQnVmZmVyT2Zmc2V0ID49IHNlbmRCdWZmZXIuc2Vj
b25kKSB7CisgICAgICAgIG1fc2VuZEJ1ZmZlcnMucmVtb3ZlKDApOworICAgICAgICBtX3NlbmRC
dWZmZXJPZmZzZXQgPSAwOworICAgIH0KKworICAgIG1fc2NoZWR1bGVyLmNhbGxDbGllbnRPbk1h
aW5UaHJlYWQobV9zdHJlYW1JRCwgW3N0cmVhbUlEID0gbV9zdHJlYW1JRCwgbGVuZ3RoID0gYnl0
ZXNTZW50XShDbGllbnQmIGNsaWVudCkgeworICAgICAgICBjbGllbnQuZGlkU2VuZERhdGEoc3Ry
ZWFtSUQsIGxlbmd0aCk7CisgICAgfSk7Cit9CisKK3ZvaWQgQ3VybFN0cmVhbTo6bm90aWZ5RmFp
bHVyZShDVVJMY29kZSBlcnJvckNvZGUpCit7CisgICAgZGVzdHJveUhhbmRsZSgpOworCisgICAg
bV9zY2hlZHVsZXIuY2FsbENsaWVudE9uTWFpblRocmVhZChtX3N0cmVhbUlELCBbc3RyZWFtSUQg
PSBtX3N0cmVhbUlELCBlcnJvckNvZGUsIHVybCA9IG1fdXJsLmlzb2xhdGVkQ29weSgpXShDbGll
bnQmIGNsaWVudCkgbXV0YWJsZSB7CisgICAgICAgIGNsaWVudC5kaWRGYWlsKHN0cmVhbUlELCBl
cnJvckNvZGUsIFdURk1vdmUodXJsKSk7CisgICAgfSk7Cit9CisKK30KKworI2VuZGlmCmRpZmYg
LS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybFN0cmVhbS5o
IGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0N1cmxTdHJlYW0uaApuZXcg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uZmZkNzE5NmI1YzkKLS0tIC9kZXYv
bnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybFN0cmVh
bS5oCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgU29ueSBJbnRl
cmFjdGl2ZSBFbnRlcnRhaW5tZW50IEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIAorICogVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMn
JworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVND
TEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMK
KyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJ
QUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAq
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICog
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNwcmFnbWEgb25jZQorCisj
aW5jbHVkZSAiQ3VybENvbnRleHQuaCIKKyNpbmNsdWRlIDx3dGYvVVJMLmg+CisjaW5jbHVkZSA8
d3RmL1VuaXF1ZUFycmF5Lmg+CisjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgorCituYW1lc3BhY2Ug
V2ViQ29yZSB7CisKK2NsYXNzIEN1cmxTdHJlYW1TY2hlZHVsZXI7CitjbGFzcyBTb2NrZXRTdHJl
YW1FcnJvcjsKKwordXNpbmcgQ3VybFN0cmVhbUlEID0gdWludDE2X3Q7Citjb25zdCBDdXJsU3Ry
ZWFtSUQgaW52YWxpZEN1cmxTdHJlYW1JRCA9IDA7CisKK2NsYXNzIEN1cmxTdHJlYW0geworICAg
IFdURl9NQUtFX0ZBU1RfQUxMT0NBVEVEOworICAgIFdURl9NQUtFX05PTkNPUFlBQkxFKEN1cmxT
dHJlYW0pOworcHVibGljOgorICAgIGNsYXNzIENsaWVudCB7CisgICAgcHVibGljOgorICAgICAg
ICB2aXJ0dWFsIHZvaWQgZGlkT3BlbihDdXJsU3RyZWFtSUQpID0gMDsKKyAgICAgICAgdmlydHVh
bCB2b2lkIGRpZFNlbmREYXRhKEN1cmxTdHJlYW1JRCwgc2l6ZV90KSA9IDA7CisgICAgICAgIHZp
cnR1YWwgdm9pZCBkaWRSZWNlaXZlRGF0YShDdXJsU3RyZWFtSUQsIGNvbnN0IGNoYXIqLCBzaXpl
X3QpID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIGRpZEZhaWwoQ3VybFN0cmVhbUlELCBDVVJM
Y29kZSwgVVJMJiYpID0gMDsKKyAgICB9OworCisgICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxD
dXJsU3RyZWFtPiBjcmVhdGUoQ3VybFN0cmVhbVNjaGVkdWxlciYgc2NoZWR1bGVyLCBDdXJsU3Ry
ZWFtSUQgc3RyZWFtSUQsIFVSTCYmIHVybCkKKyAgICB7CisgICAgICAgIHJldHVybiBXVEY6Om1h
a2VVbmlxdWU8Q3VybFN0cmVhbT4oc2NoZWR1bGVyLCBzdHJlYW1JRCwgV1RGTW92ZSh1cmwpKTsK
KyAgICB9CisKKyAgICBDdXJsU3RyZWFtKEN1cmxTdHJlYW1TY2hlZHVsZXImLCBDdXJsU3RyZWFt
SUQsIFVSTCYmKTsKKyAgICB2aXJ0dWFsIH5DdXJsU3RyZWFtKCk7CisKKyAgICB2b2lkIHNlbmQo
VW5pcXVlQXJyYXk8dWludDhfdD4mJiwgc2l6ZV90KTsKKworICAgIHZvaWQgYXBwZW5kTW9uaXRv
cmluZ0ZkKGZkX3NldCYsIGZkX3NldCYsIGZkX3NldCYsIGludCYpOworICAgIHZvaWQgdHJ5VG9U
cmFuc2Zlcihjb25zdCBmZF9zZXQmLCBjb25zdCBmZF9zZXQmLCBjb25zdCBmZF9zZXQmKTsKKwor
cHJpdmF0ZToKKyAgICB2b2lkIGRlc3Ryb3lIYW5kbGUoKTsKKworICAgIHZvaWQgdHJ5VG9SZWNl
aXZlKCk7CisgICAgdm9pZCB0cnlUb1NlbmQoKTsKKworICAgIHZvaWQgbm90aWZ5RmFpbHVyZShD
VVJMY29kZSk7CisKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtSZWNlaXZlQnVmZmVyU2l6ZSA9
IDE2ICogMTAyNDsKKworICAgIEN1cmxTdHJlYW1TY2hlZHVsZXImIG1fc2NoZWR1bGVyOworICAg
IEN1cmxTdHJlYW1JRCBtX3N0cmVhbUlEOworICAgIFVSTCBtX3VybDsKKworICAgIHN0ZDo6dW5p
cXVlX3B0cjxDdXJsSGFuZGxlPiBtX2N1cmxIYW5kbGU7CisKKyAgICBXVEY6OlZlY3RvcjxzdGQ6
OnBhaXI8VW5pcXVlQXJyYXk8dWludDhfdD4sIHNpemVfdD4+IG1fc2VuZEJ1ZmZlcnM7CisgICAg
c2l6ZV90IG1fc2VuZEJ1ZmZlck9mZnNldCB7IDAgfTsKK307CisKK30gLy8gbmFtZXNwYWNlIFdl
YkNvcmUKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9D
dXJsU3RyZWFtU2NoZWR1bGVyLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsv
Y3VybC9DdXJsU3RyZWFtU2NoZWR1bGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw
MDAwMDAwMDAwMC4uODQ1OGUzYzE0MTYKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybFN0cmVhbVNjaGVkdWxlci5jcHAKQEAgLTAsMCAr
MSwxOTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgU29ueSBJbnRlcmFjdGl2ZSBFbnRl
cnRhaW5tZW50IEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF
RCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFO
WSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFS
WSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRl
ICJDdXJsU3RyZWFtU2NoZWR1bGVyLmgiCisKKyNpZiBVU0UoQ1VSTCkKKworbmFtZXNwYWNlIFdl
YkNvcmUgeworCitDdXJsU3RyZWFtU2NoZWR1bGVyOjpDdXJsU3RyZWFtU2NoZWR1bGVyKCkKK3sK
KyAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOworfQorCitDdXJsU3RyZWFtU2NoZWR1bGVyOjp+
Q3VybFN0cmVhbVNjaGVkdWxlcigpCit7CisgICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKK30K
KworQ3VybFN0cmVhbUlEIEN1cmxTdHJlYW1TY2hlZHVsZXI6OmNyZWF0ZVN0cmVhbShjb25zdCBV
UkwmIHVybCwgQ3VybFN0cmVhbTo6Q2xpZW50JiBjbGllbnQpCit7CisgICAgQVNTRVJUKGlzTWFp
blRocmVhZCgpKTsKKworICAgIGRvIHsKKyAgICAgICAgbV9jdXJyZW50U3RyZWFtSUQgPSAobV9j
dXJyZW50U3RyZWFtSUQgKyAxICE9IGludmFsaWRDdXJsU3RyZWFtSUQpID8gbV9jdXJyZW50U3Ry
ZWFtSUQgKyAxIDogMTsKKyAgICB9IHdoaWxlIChtX2NsaWVudExpc3QuY29udGFpbnMobV9jdXJy
ZW50U3RyZWFtSUQpKTsKKworICAgIGF1dG8gc3RyZWFtSUQgPSBtX2N1cnJlbnRTdHJlYW1JRDsK
KyAgICBtX2NsaWVudExpc3QuYWRkKHN0cmVhbUlELCAmY2xpZW50KTsKKworICAgIGNhbGxPbldv
cmtlclRocmVhZChbdGhpcywgc3RyZWFtSUQsIHVybCA9IHVybC5pc29sYXRlZENvcHkoKV0oKSBt
dXRhYmxlIHsKKyAgICAgICAgbV9zdHJlYW1MaXN0LmFkZChzdHJlYW1JRCwgQ3VybFN0cmVhbTo6
Y3JlYXRlKCp0aGlzLCBzdHJlYW1JRCwgV1RGTW92ZSh1cmwpKSk7CisgICAgfSk7CisKKyAgICBy
ZXR1cm4gc3RyZWFtSUQ7Cit9CisKK3ZvaWQgQ3VybFN0cmVhbVNjaGVkdWxlcjo6ZGVzdHJveVN0
cmVhbShDdXJsU3RyZWFtSUQgc3RyZWFtSUQpCit7CisgICAgQVNTRVJUKGlzTWFpblRocmVhZCgp
KTsKKworICAgIGlmIChtX2NsaWVudExpc3QuY29udGFpbnMoc3RyZWFtSUQpKQorICAgICAgICBt
X2NsaWVudExpc3QucmVtb3ZlKHN0cmVhbUlEKTsKKworICAgIGNhbGxPbldvcmtlclRocmVhZChb
dGhpcywgc3RyZWFtSURdKCkgeworICAgICAgICBpZiAobV9zdHJlYW1MaXN0LmNvbnRhaW5zKHN0
cmVhbUlEKSkKKyAgICAgICAgICAgIG1fc3RyZWFtTGlzdC5yZW1vdmUoc3RyZWFtSUQpOworICAg
IH0pOworfQorCit2b2lkIEN1cmxTdHJlYW1TY2hlZHVsZXI6OnNlbmQoQ3VybFN0cmVhbUlEIHN0
cmVhbUlELCBVbmlxdWVBcnJheTx1aW50OF90PiYmIGRhdGEsIHNpemVfdCBsZW5ndGgpCit7Cisg
ICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKKworICAgIGNhbGxPbldvcmtlclRocmVhZChbdGhp
cywgc3RyZWFtSUQsIGRhdGEgPSBXVEZNb3ZlKGRhdGEpLCBsZW5ndGhdKCkgbXV0YWJsZSB7Cisg
ICAgICAgIGlmIChhdXRvIHN0cmVhbSA9IG1fc3RyZWFtTGlzdC5nZXQoc3RyZWFtSUQpKQorICAg
ICAgICAgICAgc3RyZWFtLT5zZW5kKFdURk1vdmUoZGF0YSksIGxlbmd0aCk7CisgICAgfSk7Cit9
CisKK3ZvaWQgQ3VybFN0cmVhbVNjaGVkdWxlcjo6Y2FsbE9uV29ya2VyVGhyZWFkKFdURjo6RnVu
Y3Rpb248dm9pZCgpPiYmIHRhc2spCit7CisgICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKKwor
ICAgIHsKKyAgICAgICAgYXV0byBsb2NrZXIgPSBob2xkTG9jayhtX211dGV4KTsKKyAgICAgICAg
bV90YXNrUXVldWUuYXBwZW5kKFdURk1vdmUodGFzaykpOworICAgIH0KKworICAgIHN0YXJ0VGhy
ZWFkSWZOZWVkZWQoKTsKK30KKwordm9pZCBDdXJsU3RyZWFtU2NoZWR1bGVyOjpjYWxsQ2xpZW50
T25NYWluVGhyZWFkKEN1cmxTdHJlYW1JRCBzdHJlYW1JRCwgV1RGOjpGdW5jdGlvbjx2b2lkKEN1
cmxTdHJlYW06OkNsaWVudCYpPiYmIHRhc2spCit7CisgICAgQVNTRVJUKCFpc01haW5UaHJlYWQo
KSk7CisKKyAgICBjYWxsT25NYWluVGhyZWFkKFt0aGlzLCBzdHJlYW1JRCwgdGFzayA9IFdURk1v
dmUodGFzayldKCkgeworICAgICAgICBpZiAoYXV0byBjbGllbnQgPSBtX2NsaWVudExpc3QuZ2V0
KHN0cmVhbUlEKSkKKyAgICAgICAgICAgIHRhc2soKmNsaWVudCk7CisgICAgfSk7Cit9CisKK3Zv
aWQgQ3VybFN0cmVhbVNjaGVkdWxlcjo6c3RhcnRUaHJlYWRJZk5lZWRlZCgpCit7CisgICAgewor
ICAgICAgICBhdXRvIGxvY2tlciA9IGhvbGRMb2NrKG1fbXV0ZXgpOworICAgICAgICBpZiAobV9y
dW5UaHJlYWQpCisgICAgICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG1fdGhyZWFk
KQorICAgICAgICBtX3RocmVhZC0+d2FpdEZvckNvbXBsZXRpb24oKTsKKworICAgIG1fcnVuVGhy
ZWFkID0gdHJ1ZTsKKworICAgIG1fdGhyZWFkID0gVGhyZWFkOjpjcmVhdGUoImN1cmxTdHJlYW1U
aHJlYWQiLCBbdGhpc10geworICAgICAgICB3b3JrZXJUaHJlYWQoKTsKKyAgICB9KTsKK30KKwor
dm9pZCBDdXJsU3RyZWFtU2NoZWR1bGVyOjpzdG9wVGhyZWFkSWZOb01vcmVKb2JSdW5uaW5nKCkK
K3sKKyAgICBBU1NFUlQoIWlzTWFpblRocmVhZCgpKTsKKworICAgIGlmIChtX3N0cmVhbUxpc3Qu
c2l6ZSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBhdXRvIGxvY2tlciA9IGhvbGRMb2NrKG1f
bXV0ZXgpOworICAgIGlmIChtX3Rhc2tRdWV1ZS5zaXplKCkpCisgICAgICAgIHJldHVybjsKKwor
ICAgIG1fcnVuVGhyZWFkID0gZmFsc2U7Cit9CisKK3ZvaWQgQ3VybFN0cmVhbVNjaGVkdWxlcjo6
ZXhlY3V0ZVRhc2tzKCkKK3sKKyAgICBBU1NFUlQoIWlzTWFpblRocmVhZCgpKTsKKworICAgIFZl
Y3RvcjxXVEY6OkZ1bmN0aW9uPHZvaWQoKT4+IHRhc2tRdWV1ZTsKKworICAgIHsKKyAgICAgICAg
YXV0byBsb2NrZXIgPSBob2xkTG9jayhtX211dGV4KTsKKyAgICAgICAgdGFza1F1ZXVlID0gV1RG
TW92ZShtX3Rhc2tRdWV1ZSk7CisgICAgfQorCisgICAgZm9yIChhdXRvJiB0YXNrIDogdGFza1F1
ZXVlKQorICAgICAgICB0YXNrKCk7Cit9CisKK3ZvaWQgQ3VybFN0cmVhbVNjaGVkdWxlcjo6d29y
a2VyVGhyZWFkKCkKK3sKKyAgICBBU1NFUlQoIWlzTWFpblRocmVhZCgpKTsKKyAgICBzdGF0aWMg
Y29uc3QgaW50IHNlbGVjdFRpbWVvdXRNUyA9IDIwOworICAgIHN0cnVjdCB0aW1ldmFsIHRpbWVv
dXQgeyAwLCBzZWxlY3RUaW1lb3V0TVMgKiAxMDAwfTsKKworICAgIHdoaWxlIChtX3J1blRocmVh
ZCkgeworICAgICAgICBleGVjdXRlVGFza3MoKTsKKworICAgICAgICBpbnQgcmMgPSAwOworICAg
ICAgICBmZF9zZXQgcmVhZGZkczsKKyAgICAgICAgZmRfc2V0IHdyaXRlZmRzOworICAgICAgICBm
ZF9zZXQgZXhjZXB0ZmRzOworCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGludCBtYXhmZCA9
IC0xOworCisgICAgICAgICAgICBGRF9aRVJPKCZyZWFkZmRzKTsKKyAgICAgICAgICAgIEZEX1pF
Uk8oJndyaXRlZmRzKTsKKyAgICAgICAgICAgIEZEX1pFUk8oJmV4Y2VwdGZkcyk7CisKKyAgICAg
ICAgICAgIGZvciAoYXV0byYgc3RyZWFtIDogbV9zdHJlYW1MaXN0LnZhbHVlcygpKQorICAgICAg
ICAgICAgICAgIHN0cmVhbS0+YXBwZW5kTW9uaXRvcmluZ0ZkKHJlYWRmZHMsIHdyaXRlZmRzLCBl
eGNlcHRmZHMsIG1heGZkKTsKKworICAgICAgICAgICAgaWYgKG1heGZkID49IDApCisgICAgICAg
ICAgICAgICAgcmMgPSA6OnNlbGVjdChtYXhmZCArIDEsICZyZWFkZmRzLCAmd3JpdGVmZHMsICZl
eGNlcHRmZHMsICZ0aW1lb3V0KTsKKyAgICAgICAgfSB3aGlsZSAocmMgPT0gLTEgJiYgZXJybm8g
PT0gRUlOVFIpOworCisgICAgICAgIGZvciAoYXV0byYgc3RyZWFtIDogbV9zdHJlYW1MaXN0LnZh
bHVlcygpKQorICAgICAgICAgICAgc3RyZWFtLT50cnlUb1RyYW5zZmVyKHJlYWRmZHMsIHdyaXRl
ZmRzLCBleGNlcHRmZHMpOworCisgICAgICAgIHN0b3BUaHJlYWRJZk5vTW9yZUpvYlJ1bm5pbmco
KTsKKyAgICB9Cit9CisKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybFN0cmVhbVNjaGVkdWxlci5oIGIvU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0N1cmxTdHJlYW1TY2hlZHVsZXIuaApuZXcgZmlsZSBt
b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uN2Q4ODEyMDZjOTYKLS0tIC9kZXYvbnVsbAor
KysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybFN0cmVhbVNjaGVk
dWxlci5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgU29ueSBJ
bnRlcmFjdGl2ZSBFbnRlcnRhaW5tZW50IEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIAorICogVEhJUyBTT0ZU
V0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMg
SVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRP
UlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MK
KyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgor
ICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNwcmFnbWEgb25jZQor
CisjaW5jbHVkZSAiQ3VybFN0cmVhbS5oIgorI2luY2x1ZGUgPHd0Zi9GdW5jdGlvbi5oPgorI2lu
Y2x1ZGUgPHd0Zi9IYXNoTWFwLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgQ3Vy
bFN0cmVhbVNjaGVkdWxlciB7CisgICAgV1RGX01BS0VfRkFTVF9BTExPQ0FURUQ7CisgICAgV1RG
X01BS0VfTk9OQ09QWUFCTEUoQ3VybFN0cmVhbVNjaGVkdWxlcik7CitwdWJsaWM6CisgICAgQ3Vy
bFN0cmVhbVNjaGVkdWxlcigpOworICAgIHZpcnR1YWwgfkN1cmxTdHJlYW1TY2hlZHVsZXIoKTsK
KworICAgIEN1cmxTdHJlYW1JRCBjcmVhdGVTdHJlYW0oY29uc3QgVVJMJiwgQ3VybFN0cmVhbTo6
Q2xpZW50Jik7CisgICAgdm9pZCBkZXN0cm95U3RyZWFtKEN1cmxTdHJlYW1JRCk7CisgICAgdm9p
ZCBzZW5kKEN1cmxTdHJlYW1JRCwgVW5pcXVlQXJyYXk8dWludDhfdD4mJiwgc2l6ZV90KTsKKwor
ICAgIHZvaWQgY2FsbE9uV29ya2VyVGhyZWFkKFdURjo6RnVuY3Rpb248dm9pZCgpPiYmKTsKKyAg
ICB2b2lkIGNhbGxDbGllbnRPbk1haW5UaHJlYWQoQ3VybFN0cmVhbUlELCBXVEY6OkZ1bmN0aW9u
PHZvaWQoQ3VybFN0cmVhbTo6Q2xpZW50Jik+JiYpOworCitwcml2YXRlOgorICAgIHZvaWQgc3Rh
cnRUaHJlYWRJZk5lZWRlZCgpOworICAgIHZvaWQgc3RvcFRocmVhZElmTm9Nb3JlSm9iUnVubmlu
ZygpOworCisgICAgdm9pZCBleGVjdXRlVGFza3MoKTsKKworICAgIHZvaWQgd29ya2VyVGhyZWFk
KCk7CisKKyAgICBMb2NrIG1fbXV0ZXg7CisgICAgUmVmUHRyPFRocmVhZD4gbV90aHJlYWQ7Cisg
ICAgYm9vbCBtX3J1blRocmVhZCB7IGZhbHNlIH07CisKKyAgICBDdXJsU3RyZWFtSUQgbV9jdXJy
ZW50U3RyZWFtSUQgPSAxOworCisgICAgVmVjdG9yPEZ1bmN0aW9uPHZvaWQoKT4+IG1fdGFza1F1
ZXVlOworICAgIEhhc2hNYXA8Q3VybFN0cmVhbUlELCBDdXJsU3RyZWFtOjpDbGllbnQqPiBtX2Ns
aWVudExpc3Q7CisgICAgSGFzaE1hcDxDdXJsU3RyZWFtSUQsIHN0ZDo6dW5pcXVlX3B0cjxDdXJs
U3RyZWFtPj4gbV9zdHJlYW1MaXN0OworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZm
IC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL1NvY2tldFN0cmVh
bUhhbmRsZUltcGwuaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9Tb2Nr
ZXRTdHJlYW1IYW5kbGVJbXBsLmgKaW5kZXggMjViZjNjNDZhMmUuLjUwMWNmNWMxMjViIDEwMDY0
NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvU29ja2V0U3RyZWFt
SGFuZGxlSW1wbC5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9T
b2NrZXRTdHJlYW1IYW5kbGVJbXBsLmgKQEAgLTEsNiArMSw3IEBACiAvKgogICogQ29weXJpZ2h0
IChDKSAyMDA5LTIwMTggQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogQ29weXJp
Z2h0IChDKSAyMDA5IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJp
Z2h0IChDKSAyMDIwIFNvbnkgSW50ZXJhY3RpdmUgRW50ZXJ0YWlubWVudCBJbmMuCiAgKgogICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCkBAIC0zMSwyMyArMzIsMTcgQEAKIAogI3ByYWdt
YSBvbmNlCiAKLSNpbmNsdWRlICJDdXJsQ29udGV4dC5oIgorI2luY2x1ZGUgIkN1cmxTdHJlYW0u
aCIKICNpbmNsdWRlICJTb2NrZXRTdHJlYW1IYW5kbGUuaCIKICNpbmNsdWRlIDxwYWwvU2Vzc2lv
bklELmg+Ci0jaW5jbHVkZSA8d3RmL0Z1bmN0aW9uLmg+Ci0jaW5jbHVkZSA8d3RmL0xvY2suaD4K
LSNpbmNsdWRlIDx3dGYvTWVzc2FnZVF1ZXVlLmg+Ci0jaW5jbHVkZSA8d3RmL1JlZkNvdW50ZWQu
aD4KICNpbmNsdWRlIDx3dGYvU3RyZWFtQnVmZmVyLmg+Ci0jaW5jbHVkZSA8d3RmL1RocmVhZGlu
Zy5oPgotI2luY2x1ZGUgPHd0Zi9VbmlxdWVBcnJheS5oPgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7
CiAKIGNsYXNzIFNvY2tldFN0cmVhbUhhbmRsZUNsaWVudDsKIGNsYXNzIFN0b3JhZ2VTZXNzaW9u
UHJvdmlkZXI7CiAKLWNsYXNzIFNvY2tldFN0cmVhbUhhbmRsZUltcGwgOiBwdWJsaWMgU29ja2V0
U3RyZWFtSGFuZGxlIHsKK2NsYXNzIFNvY2tldFN0cmVhbUhhbmRsZUltcGwgOiBwdWJsaWMgU29j
a2V0U3RyZWFtSGFuZGxlLCBwdWJsaWMgQ3VybFN0cmVhbTo6Q2xpZW50IHsKIHB1YmxpYzoKICAg
ICBzdGF0aWMgUmVmPFNvY2tldFN0cmVhbUhhbmRsZUltcGw+IGNyZWF0ZShjb25zdCBVUkwmIHVy
bCwgU29ja2V0U3RyZWFtSGFuZGxlQ2xpZW50JiBjbGllbnQsIFBBTDo6U2Vzc2lvbklELCBjb25z
dCBTdHJpbmcmLCBTb3VyY2VBcHBsaWNhdGlvbkF1ZGl0VG9rZW4mJiwgY29uc3QgU3RvcmFnZVNl
c3Npb25Qcm92aWRlciogcHJvdmlkZXIpIHsgcmV0dXJuIGFkb3B0UmVmKCpuZXcgU29ja2V0U3Ry
ZWFtSGFuZGxlSW1wbCh1cmwsIGNsaWVudCwgcHJvdmlkZXIpKTsgfQogCkBAIC02NCwyOCArNTks
MjIgQEAgcHJpdmF0ZToKICAgICBPcHRpb25hbDxzaXplX3Q+IHBsYXRmb3JtU2VuZEludGVybmFs
KGNvbnN0IHVpbnQ4X3QqLCBzaXplX3QpOwogICAgIGJvb2wgc2VuZFBlbmRpbmdEYXRhKCk7CiAK
LSAgICB2b2lkIHRocmVhZEVudHJ5UG9pbnQoY29uc3QgVVJMJik7Ci0gICAgdm9pZCBoYW5kbGVF
cnJvcihDVVJMY29kZSk7Ci0gICAgdm9pZCBzdG9wVGhyZWFkKCk7CisgICAgdm9pZCBkaWRPcGVu
KEN1cmxTdHJlYW1JRCkgZmluYWw7CisgICAgdm9pZCBkaWRTZW5kRGF0YShDdXJsU3RyZWFtSUQs
IHNpemVfdCkgZmluYWw7CisgICAgdm9pZCBkaWRSZWNlaXZlRGF0YShDdXJsU3RyZWFtSUQsIGNv
bnN0IGNoYXIqLCBzaXplX3QpIGZpbmFsOworICAgIHZvaWQgZGlkRmFpbChDdXJsU3RyZWFtSUQs
IENVUkxjb2RlLCBVUkwmJikgZmluYWw7CiAKLSAgICB2b2lkIGNhbGxPbldvcmtlclRocmVhZChG
dW5jdGlvbjx2b2lkKCk+JiYpOwotICAgIHZvaWQgZXhlY3V0ZVRhc2tzKCk7Ci0KLSAgICBzdGF0
aWMgY29uc3Qgc2l6ZV90IGtSZWFkQnVmZmVyU2l6ZSA9IDQgKiAxMDI0OworICAgIGJvb2wgaXNT
dHJlYW1JbnZhbGlkYXRlZCgpIHsgcmV0dXJuIG1fc3RyZWFtSUQgPT0gaW52YWxpZEN1cmxTdHJl
YW1JRDsgfQorICAgIHZvaWQgZGVzdHJ1Y3RTdHJlYW0oKTsKIAogICAgIFJlZlB0cjxjb25zdCBT
dG9yYWdlU2Vzc2lvblByb3ZpZGVyPiBtX3N0b3JhZ2VTZXNzaW9uUHJvdmlkZXI7Ci0gICAgUmVm
UHRyPFRocmVhZD4gbV93b3JrZXJUaHJlYWQ7Ci0gICAgc3RkOjphdG9taWM8Ym9vbD4gbV9ydW5u
aW5nIHsgdHJ1ZSB9OwotCi0gICAgTWVzc2FnZVF1ZXVlPEZ1bmN0aW9uPHZvaWQoKT4+IG1fdGFz
a1F1ZXVlOwotCi0gICAgYm9vbCBtX2hhc1BlbmRpbmdXcml0ZURhdGEgeyBmYWxzZSB9OwotICAg
IHNpemVfdCBtX3dyaXRlQnVmZmVyU2l6ZSB7IDAgfTsKLSAgICBzaXplX3QgbV93cml0ZUJ1ZmZl
ck9mZnNldCB7IDAgfTsKLSAgICBVbmlxdWVBcnJheTx1aW50OF90PiBtX3dyaXRlQnVmZmVyOwog
CiAgICAgU3RyZWFtQnVmZmVyPHVpbnQ4X3QsIDEwMjQgKiAxMDI0PiBtX2J1ZmZlcjsKICAgICBz
dGF0aWMgY29uc3QgdW5zaWduZWQgbWF4QnVmZmVyU2l6ZSA9IDEwMCAqIDEwMjQgKiAxMDI0Owor
CisgICAgQ3VybFN0cmVhbVNjaGVkdWxlciYgbV9zY2hlZHVsZXI7CisgICAgQ3VybFN0cmVhbUlE
IG1fc3RyZWFtSUQgeyBpbnZhbGlkQ3VybFN0cmVhbUlEIH07CisgICAgdW5zaWduZWQgbV90b3Rh
bFNlbmREYXRhU2l6ZSB7IDAgfTsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9Tb2NrZXRTdHJlYW1I
YW5kbGVJbXBsQ3VybC5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwv
U29ja2V0U3RyZWFtSGFuZGxlSW1wbEN1cmwuY3BwCmluZGV4IDEzYTgzMmMyNjY5Li44Y2QzOTE0
Mjk3NSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL1Nv
Y2tldFN0cmVhbUhhbmRsZUltcGxDdXJsLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9uZXR3b3JrL2N1cmwvU29ja2V0U3RyZWFtSGFuZGxlSW1wbEN1cmwuY3BwCkBAIC0xLDcgKzEs
NyBAQAogLyoKICAqIENvcHlyaWdodCAoQykgMjAwOSBCcmVudCBGdWxnaGFtLiAgQWxsIHJpZ2h0
cyByZXNlcnZlZC4KICAqIENvcHlyaWdodCAoQykgMjAwOSBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0
cyByZXNlcnZlZC4KLSAqIENvcHlyaWdodCAoQykgMjAxOCBTb255IEludGVyYWN0aXZlIEVudGVy
dGFpbm1lbnQgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDIwIFNvbnkgSW50ZXJhY3RpdmUgRW50
ZXJ0YWlubWVudCBJbmMuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCkBAIC0z
NSwxODMgKzM1LDEwMyBAQAogCiAjaWYgVVNFKENVUkwpCiAKKyNpbmNsdWRlICJDdXJsU3RyZWFt
U2NoZWR1bGVyLmgiCiAjaW5jbHVkZSAiRGVwcmVjYXRlZEdsb2JhbFNldHRpbmdzLmgiCi0jaW5j
bHVkZSAiTG9nZ2luZy5oIgogI2luY2x1ZGUgIlNvY2tldFN0cmVhbUVycm9yLmgiCiAjaW5jbHVk
ZSAiU29ja2V0U3RyZWFtSGFuZGxlQ2xpZW50LmgiCiAjaW5jbHVkZSAiU3RvcmFnZVNlc3Npb25Q
cm92aWRlci5oIgotI2luY2x1ZGUgPHd0Zi9NYWluVGhyZWFkLmg+Ci0jaW5jbHVkZSA8d3RmL1VS
TC5oPgotI2luY2x1ZGUgPHd0Zi90ZXh0L0NTdHJpbmcuaD4KIAogbmFtZXNwYWNlIFdlYkNvcmUg
ewogCiBTb2NrZXRTdHJlYW1IYW5kbGVJbXBsOjpTb2NrZXRTdHJlYW1IYW5kbGVJbXBsKGNvbnN0
IFVSTCYgdXJsLCBTb2NrZXRTdHJlYW1IYW5kbGVDbGllbnQmIGNsaWVudCwgY29uc3QgU3RvcmFn
ZVNlc3Npb25Qcm92aWRlciogcHJvdmlkZXIpCiAgICAgOiBTb2NrZXRTdHJlYW1IYW5kbGUodXJs
LCBjbGllbnQpCiAgICAgLCBtX3N0b3JhZ2VTZXNzaW9uUHJvdmlkZXIocHJvdmlkZXIpCisgICAg
LCBtX3NjaGVkdWxlcihDdXJsQ29udGV4dDo6c2luZ2xldG9uKCkuc3RyZWFtU2NoZWR1bGVyKCkp
CiB7Ci0gICAgTE9HKE5ldHdvcmssICJTb2NrZXRTdHJlYW1IYW5kbGUgJXAgbmV3IGNsaWVudCAl
cCIsIHRoaXMsICZtX2NsaWVudCk7Ci0gICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKLQogICAg
IC8vIEZJWE1FOiBVc2luZyBEZXByZWNhdGVkR2xvYmFsU2V0dGluZ3MgZnJvbSBoZXJlIGlzIGEg
bGF5ZXJpbmcgdmlvbGF0aW9uLgogICAgIGlmIChtX3VybC5wcm90b2NvbElzKCJ3c3MiKSAmJiBE
ZXByZWNhdGVkR2xvYmFsU2V0dGluZ3M6OmFsbG93c0FueVNTTENlcnRpZmljYXRlKCkpCiAgICAg
ICAgIEN1cmxDb250ZXh0OjpzaW5nbGV0b24oKS5zc2xIYW5kbGUoKS5zZXRJZ25vcmVTU0xFcnJv
cnModHJ1ZSk7CiAKLSAgICBtX3dvcmtlclRocmVhZCA9IFRocmVhZDo6Y3JlYXRlKCJXZWJTb2Nr
ZXQgdGhyZWFkIiwgW3RoaXMsIHByb3RlY3RlZFRoaXMgPSBtYWtlUmVmKCp0aGlzKSwgdXJsID0g
dXJsLmlzb2xhdGVkQ29weSgpXSB7Ci0gICAgICAgIHRocmVhZEVudHJ5UG9pbnQodXJsKTsKLSAg
ICB9KTsKKyAgICBtX3N0cmVhbUlEID0gbV9zY2hlZHVsZXIuY3JlYXRlU3RyZWFtKG1fdXJsLCAq
dGhpcyk7CiB9CiAKIFNvY2tldFN0cmVhbUhhbmRsZUltcGw6On5Tb2NrZXRTdHJlYW1IYW5kbGVJ
bXBsKCkKIHsKLSAgICBMT0coTmV0d29yaywgIlNvY2tldFN0cmVhbUhhbmRsZSAlcCBkZWxldGUi
LCB0aGlzKTsKLSAgICBzdG9wVGhyZWFkKCk7CisgICAgZGVzdHJ1Y3RTdHJlYW0oKTsKIH0KIAog
T3B0aW9uYWw8c2l6ZV90PiBTb2NrZXRTdHJlYW1IYW5kbGVJbXBsOjpwbGF0Zm9ybVNlbmRJbnRl
cm5hbChjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuZ3RoKQogewotICAgIExPRyhOZXR3
b3JrLCAiU29ja2V0U3RyZWFtSGFuZGxlICVwIHBsYXRmb3JtU2VuZCIsIHRoaXMpOwotICAgIEFT
U0VSVChpc01haW5UaHJlYWQoKSk7CisgICAgaWYgKGlzU3RyZWFtSW52YWxpZGF0ZWQoKSkKKyAg
ICAgICAgcmV0dXJuIFdURjo6bnVsbG9wdDsKIAotICAgIGlmIChtX2hhc1BlbmRpbmdXcml0ZURh
dGEpCisgICAgaWYgKG1fdG90YWxTZW5kRGF0YVNpemUgKyBsZW5ndGggPiBtYXhCdWZmZXJTaXpl
KQogICAgICAgICByZXR1cm4gMDsKKyAgICBtX3RvdGFsU2VuZERhdGFTaXplICs9IGxlbmd0aDsK
IAotICAgIG1faGFzUGVuZGluZ1dyaXRlRGF0YSA9IHRydWU7Ci0KLSAgICBhdXRvIHdyaXRlQnVm
ZmVyID0gbWFrZVVuaXF1ZUFycmF5PHVpbnQ4X3Q+KGxlbmd0aCk7Ci0gICAgbWVtY3B5KHdyaXRl
QnVmZmVyLmdldCgpLCBkYXRhLCBsZW5ndGgpOwotCi0gICAgY2FsbE9uV29ya2VyVGhyZWFkKFt0
aGlzLCB3cml0ZUJ1ZmZlciA9IFdURk1vdmUod3JpdGVCdWZmZXIpLCB3cml0ZUJ1ZmZlclNpemUg
PSBsZW5ndGhdKCkgbXV0YWJsZSB7Ci0gICAgICAgIEFTU0VSVCghaXNNYWluVGhyZWFkKCkpOwot
ICAgICAgICBtX3dyaXRlQnVmZmVyID0gV1RGTW92ZSh3cml0ZUJ1ZmZlcik7Ci0gICAgICAgIG1f
d3JpdGVCdWZmZXJTaXplID0gd3JpdGVCdWZmZXJTaXplOwotICAgICAgICBtX3dyaXRlQnVmZmVy
T2Zmc2V0ID0gMDsKLSAgICB9KTsKKyAgICBhdXRvIGJ1ZmZlciA9IG1ha2VVbmlxdWVBcnJheTx1
aW50OF90PihsZW5ndGgpOworICAgIG1lbWNweShidWZmZXIuZ2V0KCksIGRhdGEsIGxlbmd0aCk7
CiAKKyAgICBtX3NjaGVkdWxlci5zZW5kKG1fc3RyZWFtSUQsIFdURk1vdmUoYnVmZmVyKSwgbGVu
Z3RoKTsKICAgICByZXR1cm4gbGVuZ3RoOwogfQogCiB2b2lkIFNvY2tldFN0cmVhbUhhbmRsZUlt
cGw6OnBsYXRmb3JtQ2xvc2UoKQogewotICAgIExPRyhOZXR3b3JrLCAiU29ja2V0U3RyZWFtSGFu
ZGxlICVwIHBsYXRmb3JtQ2xvc2UiLCB0aGlzKTsKLSAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkp
OworICAgIGRlc3RydWN0U3RyZWFtKCk7CiAKICAgICBpZiAobV9zdGF0ZSA9PSBDbG9zZWQpCiAg
ICAgICAgIHJldHVybjsKICAgICBtX3N0YXRlID0gQ2xvc2VkOwogCi0gICAgc3RvcFRocmVhZCgp
OwogICAgIG1fY2xpZW50LmRpZENsb3NlU29ja2V0U3RyZWFtKCp0aGlzKTsKIH0KIAotdm9pZCBT
b2NrZXRTdHJlYW1IYW5kbGVJbXBsOjp0aHJlYWRFbnRyeVBvaW50KGNvbnN0IFVSTCYgdXJsKQor
dm9pZCBTb2NrZXRTdHJlYW1IYW5kbGVJbXBsOjpkaWRPcGVuKEN1cmxTdHJlYW1JRCkKIHsKLSAg
ICBBU1NFUlQoIWlzTWFpblRocmVhZCgpKTsKLQotICAgIEN1cmxTb2NrZXRIYW5kbGUgc29ja2V0
IHsgdXJsLCBbdGhpc10oQ1VSTGNvZGUgZXJyb3JDb2RlKSB7Ci0gICAgICAgIGhhbmRsZUVycm9y
KGVycm9yQ29kZSk7Ci0gICAgfX07Ci0KLSAgICAvLyBDb25uZWN0IHRvIGhvc3QKLSAgICBpZiAo
IXNvY2tldC5jb25uZWN0KCkpCisgICAgaWYgKG1fc3RhdGUgIT0gQ29ubmVjdGluZykKICAgICAg
ICAgcmV0dXJuOworICAgIG1fc3RhdGUgPSBPcGVuOwogCi0gICAgY2FsbE9uTWFpblRocmVhZChb
dGhpcywgcHJvdGVjdGVkVGhpcyA9IG1ha2VSZWYoKnRoaXMpXSB7Ci0gICAgICAgIGlmIChtX3N0
YXRlID09IENvbm5lY3RpbmcpIHsKLSAgICAgICAgICAgIG1fc3RhdGUgPSBPcGVuOwotICAgICAg
ICAgICAgbV9jbGllbnQuZGlkT3BlblNvY2tldFN0cmVhbSgqdGhpcyk7Ci0gICAgICAgIH0KLSAg
ICB9KTsKLQotICAgIHdoaWxlIChtX3J1bm5pbmcpIHsKLSAgICAgICAgZXhlY3V0ZVRhc2tzKCk7
Ci0KLSAgICAgICAgYXV0byByZXN1bHQgPSBzb2NrZXQud2FpdCgyMF9tcywgbV93cml0ZUJ1ZmZl
ci5nZXQoKSk7Ci0gICAgICAgIGlmICghcmVzdWx0KQotICAgICAgICAgICAgY29udGludWU7Ci0K
LSAgICAgICAgLy8gVGhlc2UgbG9naWMgb25seSBydW4gd2hlbiB0aGVyZSdzIGRhdGEgd2FpdGlu
Zy4KLSAgICAgICAgaWYgKHJlc3VsdC0+d3JpdGFibGUgJiYgbV9ydW5uaW5nKSB7Ci0gICAgICAg
ICAgICBhdXRvIGJ5dGVzU2VudCA9IHNvY2tldC5zZW5kKG1fd3JpdGVCdWZmZXIuZ2V0KCkgKyBt
X3dyaXRlQnVmZmVyT2Zmc2V0LCBtX3dyaXRlQnVmZmVyU2l6ZSAtIG1fd3JpdGVCdWZmZXJPZmZz
ZXQpOwotICAgICAgICAgICAgbV93cml0ZUJ1ZmZlck9mZnNldCArPSBieXRlc1NlbnQ7Ci0KLSAg
ICAgICAgICAgIGlmIChtX3dyaXRlQnVmZmVyU2l6ZSA8PSBtX3dyaXRlQnVmZmVyT2Zmc2V0KSB7
Ci0gICAgICAgICAgICAgICAgbV93cml0ZUJ1ZmZlciA9IG51bGxwdHI7Ci0gICAgICAgICAgICAg
ICAgbV93cml0ZUJ1ZmZlclNpemUgPSAwOwotICAgICAgICAgICAgICAgIG1fd3JpdGVCdWZmZXJP
ZmZzZXQgPSAwOwotCi0gICAgICAgICAgICAgICAgY2FsbE9uTWFpblRocmVhZChbdGhpcywgcHJv
dGVjdGVkVGhpcyA9IG1ha2VSZWYoKnRoaXMpXSB7Ci0gICAgICAgICAgICAgICAgICAgIG1faGFz
UGVuZGluZ1dyaXRlRGF0YSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBzZW5kUGVuZGlu
Z0RhdGEoKTsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQot
Ci0gICAgICAgIGlmIChyZXN1bHQtPnJlYWRhYmxlICYmIG1fcnVubmluZykgewotICAgICAgICAg
ICAgYXV0byByZWFkQnVmZmVyID0gbWFrZVVuaXF1ZUFycmF5PHVpbnQ4X3Q+KGtSZWFkQnVmZmVy
U2l6ZSk7Ci0gICAgICAgICAgICBhdXRvIGJ5dGVzUmVhZCA9IHNvY2tldC5yZWNlaXZlKHJlYWRC
dWZmZXIuZ2V0KCksIGtSZWFkQnVmZmVyU2l6ZSk7Ci0gICAgICAgICAgICAvLyBgbnVsbG9wdGAg
cmVzdWx0IG1lYW5zIG5vdGhpbmcgdG8gaGFuZGxlIGF0IHRoaXMgbW9tZW50LgotICAgICAgICAg
ICAgaWYgKCFieXRlc1JlYWQpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAg
ICAgIC8vIDAgYnl0ZXMgaW5kaWNhdGVzIGEgY2xvc2VkIGNvbm5lY3Rpb24uCi0gICAgICAgICAg
ICBpZiAoISpieXRlc1JlYWQpIHsKLSAgICAgICAgICAgICAgICBtX3J1bm5pbmcgPSBmYWxzZTsK
LSAgICAgICAgICAgICAgICBjYWxsT25NYWluVGhyZWFkKFt0aGlzLCBwcm90ZWN0ZWRUaGlzID0g
bWFrZVJlZigqdGhpcyldIHsKLSAgICAgICAgICAgICAgICAgICAgY2xvc2UoKTsKLSAgICAgICAg
ICAgICAgICB9KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAg
ICAgICAgICAgY2FsbE9uTWFpblRocmVhZChbdGhpcywgcHJvdGVjdGVkVGhpcyA9IG1ha2VSZWYo
KnRoaXMpLCBidWZmZXIgPSBXVEZNb3ZlKHJlYWRCdWZmZXIpLCBzaXplID0gKmJ5dGVzUmVhZCBd
IHsKLSAgICAgICAgICAgICAgICBpZiAobV9zdGF0ZSA9PSBPcGVuKQotICAgICAgICAgICAgICAg
ICAgICBtX2NsaWVudC5kaWRSZWNlaXZlU29ja2V0U3RyZWFtRGF0YSgqdGhpcywgcmVpbnRlcnBy
ZXRfY2FzdDxjb25zdCBjaGFyKj4oYnVmZmVyLmdldCgpKSwgc2l6ZSk7Ci0gICAgICAgICAgICB9
KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIG1fd3JpdGVCdWZmZXIgPSBudWxscHRyOworICAg
IG1fY2xpZW50LmRpZE9wZW5Tb2NrZXRTdHJlYW0oKnRoaXMpOwogfQogCi12b2lkIFNvY2tldFN0
cmVhbUhhbmRsZUltcGw6OmhhbmRsZUVycm9yKENVUkxjb2RlIGVycm9yQ29kZSkKK3ZvaWQgU29j
a2V0U3RyZWFtSGFuZGxlSW1wbDo6ZGlkU2VuZERhdGEoQ3VybFN0cmVhbUlELCBzaXplX3QgbGVu
Z3RoKQogewotICAgIG1fcnVubmluZyA9IGZhbHNlOwotICAgIGNhbGxPbk1haW5UaHJlYWQoW3Ro
aXMsIHByb3RlY3RlZFRoaXMgPSBtYWtlUmVmKCp0aGlzKSwgZXJyb3JDb2RlLCBsb2NhbGl6ZWRE
ZXNjcmlwdGlvbiA9IEN1cmxIYW5kbGU6OmVycm9yRGVzY3JpcHRpb24oZXJyb3JDb2RlKS5pc29s
YXRlZENvcHkoKV0gewotICAgICAgICBpZiAobV9zdGF0ZSA9PSBDbG9zZWQpCi0gICAgICAgICAg
ICByZXR1cm47Ci0KLSAgICAgICAgaWYgKGVycm9yQ29kZSA9PSBDVVJMRV9SRUNWX0VSUk9SKQot
ICAgICAgICAgICAgbV9jbGllbnQuZGlkRmFpbFRvUmVjZWl2ZVNvY2tldFN0cmVhbURhdGEoKnRo
aXMpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBtX2NsaWVudC5kaWRGYWlsU29ja2V0U3Ry
ZWFtKCp0aGlzLCBTb2NrZXRTdHJlYW1FcnJvcihzdGF0aWNfY2FzdDxpbnQ+KGVycm9yQ29kZSks
IHsgfSwgbG9jYWxpemVkRGVzY3JpcHRpb24pKTsKLSAgICB9KTsKKyAgICBBU1NFUlQobV90b3Rh
bFNlbmREYXRhU2l6ZSAtIGxlbmd0aCA+PSAwKTsKKworICAgIG1fdG90YWxTZW5kRGF0YVNpemUg
LT0gbGVuZ3RoOworICAgIHNlbmRQZW5kaW5nRGF0YSgpOwogfQogCi12b2lkIFNvY2tldFN0cmVh
bUhhbmRsZUltcGw6OnN0b3BUaHJlYWQoKQordm9pZCBTb2NrZXRTdHJlYW1IYW5kbGVJbXBsOjpk
aWRSZWNlaXZlRGF0YShDdXJsU3RyZWFtSUQsIGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBsZW5n
dGgpCiB7Ci0gICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKLQotICAgIG1fcnVubmluZyA9IGZh
bHNlOworICAgIGlmIChtX3N0YXRlICE9IE9wZW4pCisgICAgICAgIHJldHVybjsKIAotICAgIGlm
IChtX3dvcmtlclRocmVhZCkgewotICAgICAgICBtX3dvcmtlclRocmVhZC0+d2FpdEZvckNvbXBs
ZXRpb24oKTsKLSAgICAgICAgbV93b3JrZXJUaHJlYWQgPSBudWxscHRyOwotICAgIH0KKyAgICBt
X2NsaWVudC5kaWRSZWNlaXZlU29ja2V0U3RyZWFtRGF0YSgqdGhpcywgZGF0YSwgbGVuZ3RoKTsK
IH0KIAotdm9pZCBTb2NrZXRTdHJlYW1IYW5kbGVJbXBsOjpjYWxsT25Xb3JrZXJUaHJlYWQoRnVu
Y3Rpb248dm9pZCgpPiYmIHRhc2spCit2b2lkIFNvY2tldFN0cmVhbUhhbmRsZUltcGw6OmRpZEZh
aWwoQ3VybFN0cmVhbUlELCBDVVJMY29kZSBlcnJvckNvZGUsIFVSTCYmIHVybCkKIHsKLSAgICBB
U1NFUlQoaXNNYWluVGhyZWFkKCkpOwotICAgIG1fdGFza1F1ZXVlLmFwcGVuZChtYWtlVW5pcXVl
PEZ1bmN0aW9uPHZvaWQoKT4+KFdURk1vdmUodGFzaykpKTsKKyAgICBkZXN0cnVjdFN0cmVhbSgp
OworCisgICAgaWYgKG1fc3RhdGUgPT0gQ2xvc2VkKQorICAgICAgICByZXR1cm47CisKKyAgICBp
ZiAoZXJyb3JDb2RlID09IENVUkxFX1JFQ1ZfRVJST1IpCisgICAgICAgIG1fY2xpZW50LmRpZEZh
aWxUb1JlY2VpdmVTb2NrZXRTdHJlYW1EYXRhKCp0aGlzKTsKKyAgICBlbHNlCisgICAgICAgIG1f
Y2xpZW50LmRpZEZhaWxTb2NrZXRTdHJlYW0oKnRoaXMsIFNvY2tldFN0cmVhbUVycm9yKGVycm9y
Q29kZSwgdXJsLCBDdXJsSGFuZGxlOjplcnJvckRlc2NyaXB0aW9uKGVycm9yQ29kZSkpKTsKIH0K
IAotdm9pZCBTb2NrZXRTdHJlYW1IYW5kbGVJbXBsOjpleGVjdXRlVGFza3MoKQordm9pZCBTb2Nr
ZXRTdHJlYW1IYW5kbGVJbXBsOjpkZXN0cnVjdFN0cmVhbSgpCiB7Ci0gICAgQVNTRVJUKCFpc01h
aW5UaHJlYWQoKSk7CisgICAgaWYgKGlzU3RyZWFtSW52YWxpZGF0ZWQoKSkKKyAgICAgICAgcmV0
dXJuOwogCi0gICAgYXV0byB0YXNrcyA9IG1fdGFza1F1ZXVlLnRha2VBbGxNZXNzYWdlcygpOwot
ICAgIGZvciAoYXV0byYgdGFzayA6IHRhc2tzKQotICAgICAgICAoKnRhc2spKCk7CisgICAgbV9z
Y2hlZHVsZXIuZGVzdHJveVN0cmVhbShtX3N0cmVhbUlEKTsKKyAgICBtX3N0cmVhbUlEID0gaW52
YWxpZEN1cmxTdHJlYW1JRDsKIH0KIAogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>390619</attachid>
            <date>2020-02-12 22:59:53 -0800</date>
            <delta_ts>2020-02-17 00:29:29 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-187984-20200213155332.patch</filename>
            <type>text/plain</type>
            <size>40336</size>
            <attacher name="Takashi Komori">takashi.komori</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjU2NDk0CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggZGM4Y2JmZTJjMzY5YWYw
ZGIwOTNhM2I3YmM3Y2I1YTI1NDc2YWFlMi4uY2JiZTliOGZhMmVhMTY5ZjZiY2E4ZTQwOGNhNjMy
NWUyNDU0ZWE5OSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDcwIEBACisyMDIwLTAyLTEyICBUYWth
c2hpIEtvbW9yaSAgPFRha2FzaGkuS29tb3JpQHNvbnkuY29tPgorCisgICAgICAgIFtDdXJsXSBV
c2Ugc2hhcmVkIHNpbmdsZSB0aHJlYWQgZm9yIFdlYlNvY2tldCBjb25uZWN0aW9ucworICAgICAg
ICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTg3OTg0CisKKyAgICAg
ICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgVGhpcyBwYXRjaCBzdXBw
cmVzc2VzIGludm9raW5nIHdvcmtlciB0aHJlYWRzIGZvciB3ZWJzb2NrZXQgY29ubmVjdGlvbnMu
CisgICAgICAgIEN1cmxTdHJlYW1TY2hlZHVsZXIgc3RhcnRzIHVwIHRvIG9uZSB3b3JrZXIgdGhy
ZWFkLgorCisgICAgICAgIE5vIG5ldyB0ZXN0cy4gQ292ZXJlZCBieSBleGlzdGluZyBXZWJTb2Nr
ZXQgdGVzdHMuCisKKyAgICAgICAgKiBwbGF0Zm9ybS9DdXJsLmNtYWtlOgorICAgICAgICAqIHBs
YXRmb3JtL25ldHdvcmsvY3VybC9DdXJsQ29udGV4dC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpD
dXJsQ29udGV4dDo6c3RyZWFtU2NoZWR1bGVyKToKKyAgICAgICAgKFdlYkNvcmU6OkN1cmxIYW5k
bGU6OmdldEFjdGl2ZVNvY2tldCk6CisgICAgICAgIChXZWJDb3JlOjpDdXJsSGFuZGxlOjpzZW5k
KToKKyAgICAgICAgKFdlYkNvcmU6OkN1cmxIYW5kbGU6OnJlY2VpdmUpOgorICAgICAgICAoV2Vi
Q29yZTo6Q3VybFNvY2tldEhhbmRsZTo6Q3VybFNvY2tldEhhbmRsZSk6IERlbGV0ZWQuCisgICAg
ICAgIChXZWJDb3JlOjpDdXJsU29ja2V0SGFuZGxlOjpjb25uZWN0KTogRGVsZXRlZC4KKyAgICAg
ICAgKFdlYkNvcmU6OkN1cmxTb2NrZXRIYW5kbGU6OnNlbmQpOiBEZWxldGVkLgorICAgICAgICAo
V2ViQ29yZTo6Q3VybFNvY2tldEhhbmRsZTo6cmVjZWl2ZSk6IERlbGV0ZWQuCisgICAgICAgIChX
ZWJDb3JlOjpDdXJsU29ja2V0SGFuZGxlOjp3YWl0KTogRGVsZXRlZC4KKyAgICAgICAgKiBwbGF0
Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybENvbnRleHQuaDoKKyAgICAgICAgKiBwbGF0Zm9ybS9uZXR3
b3JrL2N1cmwvQ3VybFN0cmVhbS5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6Q3VybFN0
cmVhbTo6Q3VybFN0cmVhbSk6CisgICAgICAgIChXZWJDb3JlOjpDdXJsU3RyZWFtOjp+Q3VybFN0
cmVhbSk6CisgICAgICAgIChXZWJDb3JlOjpDdXJsU3RyZWFtOjpkZXN0cm95SGFuZGxlKToKKyAg
ICAgICAgKFdlYkNvcmU6OkN1cmxTdHJlYW06OnNlbmQpOgorICAgICAgICAoV2ViQ29yZTo6Q3Vy
bFN0cmVhbTo6YXBwZW5kTW9uaXRvcmluZ0ZkKToKKyAgICAgICAgKFdlYkNvcmU6OkN1cmxTdHJl
YW06OnRyeVRvVHJhbnNmZXIpOgorICAgICAgICAoV2ViQ29yZTo6Q3VybFN0cmVhbTo6dHJ5VG9S
ZWNlaXZlKToKKyAgICAgICAgKFdlYkNvcmU6OkN1cmxTdHJlYW06OnRyeVRvU2VuZCk6CisgICAg
ICAgIChXZWJDb3JlOjpDdXJsU3RyZWFtOjpub3RpZnlGYWlsdXJlKToKKyAgICAgICAgKiBwbGF0
Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybFN0cmVhbS5oOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6
OkN1cmxTdHJlYW06OmNyZWF0ZSk6CisgICAgICAgICogcGxhdGZvcm0vbmV0d29yay9jdXJsL0N1
cmxTdHJlYW1TY2hlZHVsZXIuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkN1cmxTdHJl
YW1TY2hlZHVsZXI6OkN1cmxTdHJlYW1TY2hlZHVsZXIpOgorICAgICAgICAoV2ViQ29yZTo6Q3Vy
bFN0cmVhbVNjaGVkdWxlcjo6fkN1cmxTdHJlYW1TY2hlZHVsZXIpOgorICAgICAgICAoV2ViQ29y
ZTo6Q3VybFN0cmVhbVNjaGVkdWxlcjo6Y3JlYXRlU3RyZWFtKToKKyAgICAgICAgKFdlYkNvcmU6
OkN1cmxTdHJlYW1TY2hlZHVsZXI6OmRlc3Ryb3lTdHJlYW0pOgorICAgICAgICAoV2ViQ29yZTo6
Q3VybFN0cmVhbVNjaGVkdWxlcjo6c2VuZCk6CisgICAgICAgIChXZWJDb3JlOjpDdXJsU3RyZWFt
U2NoZWR1bGVyOjpjYWxsT25Xb3JrZXJUaHJlYWQpOgorICAgICAgICAoV2ViQ29yZTo6Q3VybFN0
cmVhbVNjaGVkdWxlcjo6Y2FsbENsaWVudE9uTWFpblRocmVhZCk6CisgICAgICAgIChXZWJDb3Jl
OjpDdXJsU3RyZWFtU2NoZWR1bGVyOjpzdGFydFRocmVhZElmTmVlZGVkKToKKyAgICAgICAgKFdl
YkNvcmU6OkN1cmxTdHJlYW1TY2hlZHVsZXI6OnN0b3BUaHJlYWRJZk5vTW9yZUpvYlJ1bm5pbmcp
OgorICAgICAgICAoV2ViQ29yZTo6Q3VybFN0cmVhbVNjaGVkdWxlcjo6ZXhlY3V0ZVRhc2tzKToK
KyAgICAgICAgKFdlYkNvcmU6OkN1cmxTdHJlYW1TY2hlZHVsZXI6OndvcmtlclRocmVhZCk6Cisg
ICAgICAgICogcGxhdGZvcm0vbmV0d29yay9jdXJsL0N1cmxTdHJlYW1TY2hlZHVsZXIuaDogQWRk
ZWQuCisgICAgICAgICogcGxhdGZvcm0vbmV0d29yay9jdXJsL1NvY2tldFN0cmVhbUhhbmRsZUlt
cGwuaDoKKyAgICAgICAgKFdlYkNvcmU6OlNvY2tldFN0cmVhbUhhbmRsZUltcGw6OmlzU3RyZWFt
SW52YWxpZGF0ZWQpOgorICAgICAgICAqIHBsYXRmb3JtL25ldHdvcmsvY3VybC9Tb2NrZXRTdHJl
YW1IYW5kbGVJbXBsQ3VybC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpTb2NrZXRTdHJlYW1IYW5k
bGVJbXBsOjpTb2NrZXRTdHJlYW1IYW5kbGVJbXBsKToKKyAgICAgICAgKFdlYkNvcmU6OlNvY2tl
dFN0cmVhbUhhbmRsZUltcGw6On5Tb2NrZXRTdHJlYW1IYW5kbGVJbXBsKToKKyAgICAgICAgKFdl
YkNvcmU6OlNvY2tldFN0cmVhbUhhbmRsZUltcGw6OnBsYXRmb3JtU2VuZEludGVybmFsKToKKyAg
ICAgICAgKFdlYkNvcmU6OlNvY2tldFN0cmVhbUhhbmRsZUltcGw6OnBsYXRmb3JtQ2xvc2UpOgor
ICAgICAgICAoV2ViQ29yZTo6U29ja2V0U3RyZWFtSGFuZGxlSW1wbDo6ZGlkT3Blbik6CisgICAg
ICAgIChXZWJDb3JlOjpTb2NrZXRTdHJlYW1IYW5kbGVJbXBsOjpkaWRTZW5kRGF0YSk6CisgICAg
ICAgIChXZWJDb3JlOjpTb2NrZXRTdHJlYW1IYW5kbGVJbXBsOjpkaWRSZWNlaXZlRGF0YSk6Cisg
ICAgICAgIChXZWJDb3JlOjpTb2NrZXRTdHJlYW1IYW5kbGVJbXBsOjpkaWRGYWlsKToKKyAgICAg
ICAgKFdlYkNvcmU6OlNvY2tldFN0cmVhbUhhbmRsZUltcGw6OmRlc3RydWN0U3RyZWFtKToKKyAg
ICAgICAgKFdlYkNvcmU6OlNvY2tldFN0cmVhbUhhbmRsZUltcGw6OnRocmVhZEVudHJ5UG9pbnQp
OiBEZWxldGVkLgorICAgICAgICAoV2ViQ29yZTo6U29ja2V0U3RyZWFtSGFuZGxlSW1wbDo6aGFu
ZGxlRXJyb3IpOiBEZWxldGVkLgorICAgICAgICAoV2ViQ29yZTo6U29ja2V0U3RyZWFtSGFuZGxl
SW1wbDo6c3RvcFRocmVhZCk6IERlbGV0ZWQuCisgICAgICAgIChXZWJDb3JlOjpTb2NrZXRTdHJl
YW1IYW5kbGVJbXBsOjpjYWxsT25Xb3JrZXJUaHJlYWQpOiBEZWxldGVkLgorICAgICAgICAoV2Vi
Q29yZTo6U29ja2V0U3RyZWFtSGFuZGxlSW1wbDo6ZXhlY3V0ZVRhc2tzKTogRGVsZXRlZC4KKwog
MjAyMC0wMi0xMiAgWXVzdWtlIFN1enVraSAgPHlzdXp1a2lAYXBwbGUuY29tPgogCiAgICAgICAg
IENTU1ZhbHVlUG9vbCdzIGNvbnN0YW50IENTUyB2YWx1ZXMgc2hvdWxkIG5vdCBiZSBhbGxvY2F0
ZWQgZHluYW1pY2FsbHkgKGFuZCBzYW1lIGZvciBWZWN0b3JzKQpkaWZmIC0tZ2l0IGEvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vQ3VybC5jbWFrZSBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL0N1
cmwuY21ha2UKaW5kZXggZjY4OTRhYzNlZjQxZWVmMDM4YzcxN2Q1MDIwNWRjOGU0YzdmYzJjNS4u
ZWRkYjVmYWMyZjM1YjhkNThjZDNjMDFkZTQ5NWQ5NTk0OWE3NzQwMSAxMDA2NDQKLS0tIGEvU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vQ3VybC5jbWFrZQorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9DdXJsLmNtYWtlCkBAIC0yMiw2ICsyMiw4IEBAIGxpc3QoQVBQRU5EIFdlYkNvcmVfU09V
UkNFUwogICAgIHBsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsUmVzb3VyY2VIYW5kbGVEZWxlZ2F0
ZS5jcHAKICAgICBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybFNTTEhhbmRsZS5jcHAKICAgICBw
bGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybFNTTFZlcmlmaWVyLmNwcAorICAgIHBsYXRmb3JtL25l
dHdvcmsvY3VybC9DdXJsU3RyZWFtLmNwcAorICAgIHBsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJs
U3RyZWFtU2NoZWR1bGVyLmNwcAogICAgIHBsYXRmb3JtL25ldHdvcmsvY3VybC9ETlNSZXNvbHZl
UXVldWVDdXJsLmNwcAogICAgIHBsYXRmb3JtL25ldHdvcmsvY3VybC9OZXR3b3JrU3RvcmFnZVNl
c3Npb25DdXJsLmNwcAogICAgIHBsYXRmb3JtL25ldHdvcmsvY3VybC9PcGVuU1NMSGVscGVyLmNw
cApAQCAtNTgsNiArNjAsOCBAQCBsaXN0KEFQUEVORCBXZWJDb3JlX1BSSVZBVEVfRlJBTUVXT1JL
X0hFQURFUlMKICAgICBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybFJlc3BvbnNlLmgKICAgICBw
bGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybFNTTEhhbmRsZS5oCiAgICAgcGxhdGZvcm0vbmV0d29y
ay9jdXJsL0N1cmxTU0xWZXJpZmllci5oCisgICAgcGxhdGZvcm0vbmV0d29yay9jdXJsL0N1cmxT
dHJlYW0uaAorICAgIHBsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsU3RyZWFtU2NoZWR1bGVyLmgK
ICAgICBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvRE5TUmVzb2x2ZVF1ZXVlQ3VybC5oCiAgICAgcGxh
dGZvcm0vbmV0d29yay9jdXJsL0Rvd25sb2FkQnVuZGxlLmgKICAgICBwbGF0Zm9ybS9uZXR3b3Jr
L2N1cmwvT3BlblNTTEhlbHBlci5oCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9uZXR3b3JrL2N1cmwvQ3VybENvbnRleHQuY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
bmV0d29yay9jdXJsL0N1cmxDb250ZXh0LmNwcAppbmRleCA3MTExNWFjZDUxOTAzNTU1MWI4Mzk0
YzNmYjE5YzNiMTMzYzI3NjM4Li4xNDY0ZWIwYzJlZjkzMjMzZmMwNDVhYzUwZWRjMzQ0NzBmNDZl
NTBlIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3Vy
bENvbnRleHQuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9D
dXJsQ29udGV4dC5jcHAKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlICJDdXJsUmVxdWVzdFNj
aGVkdWxlci5oIgogI2luY2x1ZGUgIkN1cmxTU0xIYW5kbGUuaCIKICNpbmNsdWRlICJDdXJsU1NM
VmVyaWZpZXIuaCIKKyNpbmNsdWRlICJDdXJsU3RyZWFtU2NoZWR1bGVyLmgiCiAjaW5jbHVkZSAi
SFRUUEhlYWRlck1hcC5oIgogI2luY2x1ZGUgPE5ldHdvcmtMb2FkTWV0cmljcy5oPgogI2luY2x1
ZGUgPG11dGV4PgpAQCAtMTQ2LDYgKzE0NywxMiBAQCB2b2lkIEN1cmxDb250ZXh0Ojppbml0U2hh
cmVIYW5kbGUoKQogICAgIGN1cmxfZWFzeV9jbGVhbnVwKGN1cmwpOwogfQogCitDdXJsU3RyZWFt
U2NoZWR1bGVyJiBDdXJsQ29udGV4dDo6c3RyZWFtU2NoZWR1bGVyKCkKK3sKKyAgICBzdGF0aWMg
TmV2ZXJEZXN0cm95ZWQ8Q3VybFN0cmVhbVNjaGVkdWxlcj4gc2hhcmVkSW5zdGFuY2U7CisgICAg
cmV0dXJuIHNoYXJlZEluc3RhbmNlOworfQorCiBib29sIEN1cmxDb250ZXh0Ojppc0h0dHAyRW5h
YmxlZCgpIGNvbnN0CiB7CiAgICAgY3VybF92ZXJzaW9uX2luZm9fZGF0YSogZGF0YSA9IGN1cmxf
dmVyc2lvbl9pbmZvKENVUkxWRVJTSU9OX05PVyk7CkBAIC04ODgsMTE0ICs4OTUsMjUgQEAgdm9p
ZCBDdXJsSGFuZGxlOjplbmFibGVTdGRFcnJJZlVzZWQoKQogCiAjZW5kaWYKIAotLy8gQ3VybFNv
Y2tldEhhbmRsZQotCi1DdXJsU29ja2V0SGFuZGxlOjpDdXJsU29ja2V0SGFuZGxlKGNvbnN0IFVS
TCYgdXJsLCBGdW5jdGlvbjx2b2lkKENVUkxjb2RlKT4mJiBlcnJvckhhbmRsZXIpCi0gICAgOiBt
X2Vycm9ySGFuZGxlcihXVEZNb3ZlKGVycm9ySGFuZGxlcikpCitFeHBlY3RlZDxjdXJsX3NvY2tl
dF90LCBDVVJMY29kZT4gQ3VybEhhbmRsZTo6Z2V0QWN0aXZlU29ja2V0KCkKIHsKLSAgICAvLyBM
aWJjdXJsIGlzIG5vdCByZXNwb25zaWJsZSBmb3IgdGhlIHByb3RvY29sIGhhbmRsaW5nLiBJdCBq
dXN0IGhhbmRsZXMgY29ubmVjdGlvbi4KLSAgICAvLyBPbmx5IHNjaGVtZSwgaG9zdCBhbmQgcG9y
dCBpcyByZXF1aXJlZC4KLSAgICBVUkwgdXJsRm9yQ29ubmVjdGlvbjsKLSAgICB1cmxGb3JDb25u
ZWN0aW9uLnNldFByb3RvY29sKHVybC5wcm90b2NvbElzKCJ3c3MiKSA/ICJodHRwcyIgOiAiaHR0
cCIpOwotICAgIHVybEZvckNvbm5lY3Rpb24uc2V0SG9zdEFuZFBvcnQodXJsLmhvc3RBbmRQb3J0
KCkpOwotICAgIHNldFVybCh1cmxGb3JDb25uZWN0aW9uKTsKLQotICAgIGVuYWJsZUNvbm5lY3Rp
b25Pbmx5KCk7Ci19CisgICAgY3VybF9zb2NrZXRfdCBzb2NrZXQ7CiAKLWJvb2wgQ3VybFNvY2tl
dEhhbmRsZTo6Y29ubmVjdCgpCi17Ci0gICAgQ1VSTGNvZGUgZXJyb3JDb2RlID0gcGVyZm9ybSgp
OwotICAgIGlmIChlcnJvckNvZGUgIT0gQ1VSTEVfT0spIHsKLSAgICAgICAgbV9lcnJvckhhbmRs
ZXIoZXJyb3JDb2RlKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KKyAgICBDVVJMY29k
ZSBlcnJvckNvZGUgPSBjdXJsX2Vhc3lfZ2V0aW5mbyhtX2hhbmRsZSwgQ1VSTElORk9fQUNUSVZF
U09DS0VULCAmc29ja2V0KTsKKyAgICBpZiAoZXJyb3JDb2RlICE9IENVUkxFX09LKQorICAgICAg
ICByZXR1cm4gbWFrZVVuZXhwZWN0ZWQoZXJyb3JDb2RlKTsKIAotICAgIHJldHVybiB0cnVlOwor
ICAgIHJldHVybiBzb2NrZXQ7CiB9CiAKLXNpemVfdCBDdXJsU29ja2V0SGFuZGxlOjpzZW5kKGNv
bnN0IHVpbnQ4X3QqIGJ1ZmZlciwgc2l6ZV90IHNpemUpCitDVVJMY29kZSBDdXJsSGFuZGxlOjpz
ZW5kKGNvbnN0IHVpbnQ4X3QqIGJ1ZmZlciwgc2l6ZV90IGJ1ZmZlclNpemUsIHNpemVfdCYgYnl0
ZXNTZW50KQogewotICAgIHNpemVfdCB0b3RhbEJ5dGVzU2VudCA9IDA7Ci0KLSAgICB3aGlsZSAo
dG90YWxCeXRlc1NlbnQgPCBzaXplKSB7Ci0gICAgICAgIHNpemVfdCBieXRlc1NlbnQgPSAwOwot
ICAgICAgICBDVVJMY29kZSBlcnJvckNvZGUgPSBjdXJsX2Vhc3lfc2VuZChoYW5kbGUoKSwgYnVm
ZmVyICsgdG90YWxCeXRlc1NlbnQsIHNpemUgLSB0b3RhbEJ5dGVzU2VudCwgJmJ5dGVzU2VudCk7
Ci0gICAgICAgIGlmIChlcnJvckNvZGUgIT0gQ1VSTEVfT0spIHsKLSAgICAgICAgICAgIGlmIChl
cnJvckNvZGUgIT0gQ1VSTEVfQUdBSU4pCi0gICAgICAgICAgICAgICAgbV9lcnJvckhhbmRsZXIo
ZXJyb3JDb2RlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgdG90
YWxCeXRlc1NlbnQgKz0gYnl0ZXNTZW50OwotICAgIH0KLQotICAgIHJldHVybiB0b3RhbEJ5dGVz
U2VudDsKKyAgICByZXR1cm4gY3VybF9lYXN5X3NlbmQobV9oYW5kbGUsIGJ1ZmZlciwgYnVmZmVy
U2l6ZSwgJmJ5dGVzU2VudCk7CiB9CiAKLU9wdGlvbmFsPHNpemVfdD4gQ3VybFNvY2tldEhhbmRs
ZTo6cmVjZWl2ZSh1aW50OF90KiBidWZmZXIsIHNpemVfdCBidWZmZXJTaXplKQorQ1VSTGNvZGUg
Q3VybEhhbmRsZTo6cmVjZWl2ZSh1aW50OF90KiBidWZmZXIsIHNpemVfdCBidWZmZXJTaXplLCBz
aXplX3QmIGJ5dGVzUmVhZCkKIHsKLSAgICBzaXplX3QgYnl0ZXNSZWFkID0gMDsKLQotICAgIENV
Ukxjb2RlIGVycm9yQ29kZSA9IGN1cmxfZWFzeV9yZWN2KGhhbmRsZSgpLCBidWZmZXIsIGJ1ZmZl
clNpemUsICZieXRlc1JlYWQpOwotICAgIGlmIChlcnJvckNvZGUgIT0gQ1VSTEVfT0spIHsKLSAg
ICAgICAgaWYgKGVycm9yQ29kZSAhPSBDVVJMRV9BR0FJTikKLSAgICAgICAgICAgIG1fZXJyb3JI
YW5kbGVyKGVycm9yQ29kZSk7Ci0KLSAgICAgICAgcmV0dXJuIFdURjo6bnVsbG9wdDsKLSAgICB9
Ci0KLSAgICByZXR1cm4gYnl0ZXNSZWFkOwotfQotCi1PcHRpb25hbDxDdXJsU29ja2V0SGFuZGxl
OjpXYWl0UmVzdWx0PiBDdXJsU29ja2V0SGFuZGxlOjp3YWl0KGNvbnN0IFNlY29uZHMmIHRpbWVv
dXQsIGJvb2wgYWxzb1dhaXRGb3JXcml0ZSkKLXsKLSAgICBjdXJsX3NvY2tldF90IHNvY2tldDsK
LSAgICBDVVJMY29kZSBlcnJvckNvZGUgPSBjdXJsX2Vhc3lfZ2V0aW5mbyhoYW5kbGUoKSwgQ1VS
TElORk9fQUNUSVZFU09DS0VULCAmc29ja2V0KTsKLSAgICBpZiAoZXJyb3JDb2RlICE9IENVUkxF
X09LKSB7Ci0gICAgICAgIG1fZXJyb3JIYW5kbGVyKGVycm9yQ29kZSk7Ci0gICAgICAgIHJldHVy
biBXVEY6Om51bGxvcHQ7Ci0gICAgfQotCi0gICAgaW50NjRfdCB1c2VjID0gdGltZW91dC5taWNy
b3NlY29uZHNBczxpbnQ2NF90PigpOwotCi0gICAgc3RydWN0IHRpbWV2YWwgc2VsZWN0VGltZW91
dDsKLSAgICBpZiAodXNlYyA8PSAwKSB7Ci0gICAgICAgIHNlbGVjdFRpbWVvdXQudHZfc2VjID0g
MDsKLSAgICAgICAgc2VsZWN0VGltZW91dC50dl91c2VjID0gMDsKLSAgICB9IGVsc2UgewotICAg
ICAgICBzZWxlY3RUaW1lb3V0LnR2X3NlYyA9IHVzZWMgLyAxMDAwMDAwOwotICAgICAgICBzZWxl
Y3RUaW1lb3V0LnR2X3VzZWMgPSB1c2VjICUgMTAwMDAwMDsKLSAgICB9Ci0KLSAgICBpbnQgcmMg
PSAwOwotICAgIGludCBtYXhmZCA9IHN0YXRpY19jYXN0PGludD4oc29ja2V0KSArIDE7Ci0gICAg
ZmRfc2V0IGZkcmVhZDsKLSAgICBmZF9zZXQgZmR3cml0ZTsKLSAgICBmZF9zZXQgZmRlcnI7Ci0K
LSAgICAvLyBSZXRyeSAnc2VsZWN0JyBpZiBpdCB3YXMgaW50ZXJydXB0ZWQgYnkgYSBwcm9jZXNz
IHNpZ25hbC4KLSAgICBkbyB7Ci0gICAgICAgIEZEX1pFUk8oJmZkcmVhZCk7Ci0gICAgICAgIEZE
X1NFVChzb2NrZXQsICZmZHJlYWQpOwotCi0gICAgICAgIEZEX1pFUk8oJmZkd3JpdGUpOwotICAg
ICAgICBpZiAoYWxzb1dhaXRGb3JXcml0ZSkKLSAgICAgICAgICAgIEZEX1NFVChzb2NrZXQsICZm
ZHdyaXRlKTsKLQotICAgICAgICBGRF9aRVJPKCZmZGVycik7Ci0gICAgICAgIEZEX1NFVChzb2Nr
ZXQsICZmZGVycik7Ci0KLSAgICAgICAgcmMgPSA6OnNlbGVjdChtYXhmZCwgJmZkcmVhZCwgJmZk
d3JpdGUsICZmZGVyciwgJnNlbGVjdFRpbWVvdXQpOwotICAgIH0gd2hpbGUgKHJjID09IC0xICYm
IGVycm5vID09IEVJTlRSKTsKLQotICAgIGlmIChyYyA8PSAwKQotICAgICAgICByZXR1cm4gV1RG
OjpudWxsb3B0OwotCi0gICAgV2FpdFJlc3VsdCByZXN1bHQ7Ci0gICAgcmVzdWx0LnJlYWRhYmxl
ID0gRkRfSVNTRVQoc29ja2V0LCAmZmRyZWFkKSB8fCBGRF9JU1NFVChzb2NrZXQsICZmZGVycik7
Ci0gICAgcmVzdWx0LndyaXRhYmxlID0gRkRfSVNTRVQoc29ja2V0LCAmZmR3cml0ZSk7Ci0gICAg
cmV0dXJuIHJlc3VsdDsKKyAgICByZXR1cm4gY3VybF9lYXN5X3JlY3YobV9oYW5kbGUsIGJ1ZmZl
ciwgYnVmZmVyU2l6ZSwgJmJ5dGVzUmVhZCk7CiB9CiAKIH0KZGlmZiAtLWdpdCBhL1NvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsQ29udGV4dC5oIGIvU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0N1cmxDb250ZXh0LmgKaW5kZXggYTRmOGMwMjgyNzY3
YjBiNDg3NzBhMDQ4ZWU4NTJmMTY2ZTA3YTdmNS4uM2M5MGU0YjFlY2M5ZTZiNDFmNzFiNjc2MDAz
ZTM2OWYxODYyMDk4OCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29y
ay9jdXJsL0N1cmxDb250ZXh0LmgKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29y
ay9jdXJsL0N1cmxDb250ZXh0LmgKQEAgLTg5LDYgKzg5LDcgQEAgcHJpdmF0ZToKIC8vIEN1cmxD
b250ZXh0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIGNs
YXNzIEN1cmxSZXF1ZXN0U2NoZWR1bGVyOworY2xhc3MgQ3VybFN0cmVhbVNjaGVkdWxlcjsKIAog
Y2xhc3MgQ3VybENvbnRleHQgOiBwdWJsaWMgQ3VybEdsb2JhbCB7CiAgICAgV1RGX01BS0VfTk9O
Q09QWUFCTEUoQ3VybENvbnRleHQpOwpAQCAtMTAxLDYgKzEwMiw3IEBAIHB1YmxpYzoKICAgICBj
b25zdCBDdXJsU2hhcmVIYW5kbGUmIHNoYXJlSGFuZGxlKCkgeyByZXR1cm4gbV9zaGFyZUhhbmRs
ZTsgfQogCiAgICAgQ3VybFJlcXVlc3RTY2hlZHVsZXImIHNjaGVkdWxlcigpIHsgcmV0dXJuICpt
X3NjaGVkdWxlcjsgfQorICAgIEN1cmxTdHJlYW1TY2hlZHVsZXImIHN0cmVhbVNjaGVkdWxlcigp
OwogCiAgICAgLy8gUHJveHkKICAgICBjb25zdCBDdXJsUHJveHlTZXR0aW5ncyYgcHJveHlTZXR0
aW5ncygpIGNvbnN0IHsgcmV0dXJuIG1fcHJveHlTZXR0aW5nczsgfQpAQCAtMjkzLDYgKzI5NSwx
MSBAQCBwdWJsaWM6CiAKICAgICBzdGF0aWMgbG9uZyBsb25nIG1heEN1cmxPZmZUKCk7CiAKKyAg
ICAvLyBzb2NrZXQKKyAgICBFeHBlY3RlZDxjdXJsX3NvY2tldF90LCBDVVJMY29kZT4gZ2V0QWN0
aXZlU29ja2V0KCk7CisgICAgQ1VSTGNvZGUgc2VuZChjb25zdCB1aW50OF90Kiwgc2l6ZV90LCBz
aXplX3QmKTsKKyAgICBDVVJMY29kZSByZWNlaXZlKHVpbnQ4X3QqLCBzaXplX3QsIHNpemVfdCYp
OworCiAjaWZuZGVmIE5ERUJVRwogICAgIHZvaWQgZW5hYmxlVmVyYm9zZUlmVXNlZCgpOwogICAg
IHZvaWQgZW5hYmxlU3RkRXJySWZVc2VkKCk7CkBAIC0zMTMsMjQgKzMyMCw0IEBAIHByaXZhdGU6
CiAgICAgc3RkOjp1bmlxdWVfcHRyPEN1cmxTU0xWZXJpZmllcj4gbV9zc2xWZXJpZmllcjsKIH07
CiAKLWNsYXNzIEN1cmxTb2NrZXRIYW5kbGUgOiBwdWJsaWMgQ3VybEhhbmRsZSB7Ci0gICAgV1RG
X01BS0VfTk9OQ09QWUFCTEUoQ3VybFNvY2tldEhhbmRsZSk7Ci0KLXB1YmxpYzoKLSAgICBzdHJ1
Y3QgV2FpdFJlc3VsdCB7Ci0gICAgICAgIGJvb2wgcmVhZGFibGUgeyBmYWxzZSB9OwotICAgICAg
ICBib29sIHdyaXRhYmxlIHsgZmFsc2UgfTsKLSAgICB9OwotCi0gICAgQ3VybFNvY2tldEhhbmRs
ZShjb25zdCBVUkwmLCBGdW5jdGlvbjx2b2lkKENVUkxjb2RlKT4mJiBlcnJvckhhbmRsZXIpOwot
Ci0gICAgYm9vbCBjb25uZWN0KCk7Ci0gICAgc2l6ZV90IHNlbmQoY29uc3QgdWludDhfdCosIHNp
emVfdCk7Ci0gICAgT3B0aW9uYWw8c2l6ZV90PiByZWNlaXZlKHVpbnQ4X3QqLCBzaXplX3QpOwot
ICAgIE9wdGlvbmFsPFdhaXRSZXN1bHQ+IHdhaXQoY29uc3QgU2Vjb25kcyYgdGltZW91dCwgYm9v
bCBhbHNvV2FpdEZvcldyaXRlKTsKLQotcHJpdmF0ZToKLSAgICBGdW5jdGlvbjx2b2lkKENVUkxj
b2RlKT4gbV9lcnJvckhhbmRsZXI7Ci19OwotCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYg
LS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybFN0cmVhbS5j
cHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybFN0cmVhbS5jcHAK
bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMC4uM2VlYjhkNzQ0NWI5NjkwMjRkM2U2ODkzNmExY2YzOTljMDJhN2JjMwotLS0g
L2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJs
U3RyZWFtLmNwcApAQCAtMCwwICsxLDE5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBT
b255IEludGVyYWN0aXZlIEVudGVydGFpbm1lbnQgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMg
YGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRS
SUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUg
ImNvbmZpZy5oIgorI2luY2x1ZGUgIkN1cmxTdHJlYW0uaCIKKworI2luY2x1ZGUgIkN1cmxTdHJl
YW1TY2hlZHVsZXIuaCIKKyNpbmNsdWRlICJTb2NrZXRTdHJlYW1FcnJvci5oIgorCisjaWYgVVNF
KENVUkwpCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworQ3VybFN0cmVhbTo6Q3VybFN0cmVhbShD
dXJsU3RyZWFtU2NoZWR1bGVyJiBzY2hlZHVsZXIsIEN1cmxTdHJlYW1JRCBzdHJlYW1JRCwgVVJM
JiYgdXJsKQorICAgIDogbV9zY2hlZHVsZXIoc2NoZWR1bGVyKQorICAgICwgbV9zdHJlYW1JRChz
dHJlYW1JRCkKKyAgICAsIG1fdXJsKFdURk1vdmUodXJsKSkKK3sKKyAgICBBU1NFUlQoIWlzTWFp
blRocmVhZCgpKTsKKworICAgIG1fY3VybEhhbmRsZSA9IFdURjo6bWFrZVVuaXF1ZTxDdXJsSGFu
ZGxlPigpOworCisgICAgLy8gTGliY3VybCBpcyBub3QgcmVzcG9uc2libGUgZm9yIHRoZSBwcm90
b2NvbCBoYW5kbGluZy4gSXQganVzdCBoYW5kbGVzIGNvbm5lY3Rpb24uCisgICAgLy8gT25seSBz
Y2hlbWUsIGhvc3QgYW5kIHBvcnQgaXMgcmVxdWlyZWQuCisgICAgVVJMIHVybEZvckNvbm5lY3Rp
b247CisgICAgdXJsRm9yQ29ubmVjdGlvbi5zZXRQcm90b2NvbChtX3VybC5wcm90b2NvbElzKCJ3
c3MiKSA/ICJodHRwcyIgOiAiaHR0cCIpOworICAgIHVybEZvckNvbm5lY3Rpb24uc2V0SG9zdEFu
ZFBvcnQobV91cmwuaG9zdEFuZFBvcnQoKSk7CisgICAgbV9jdXJsSGFuZGxlLT5zZXRVcmwodXJs
Rm9yQ29ubmVjdGlvbik7CisKKyAgICBtX2N1cmxIYW5kbGUtPmVuYWJsZUNvbm5lY3Rpb25Pbmx5
KCk7CisKKyAgICBhdXRvIGVycm9yQ29kZSA9IG1fY3VybEhhbmRsZS0+cGVyZm9ybSgpOworICAg
IGlmIChlcnJvckNvZGUgIT0gQ1VSTEVfT0spIHsKKyAgICAgICAgbm90aWZ5RmFpbHVyZShlcnJv
ckNvZGUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbV9zY2hlZHVsZXIuY2FsbENs
aWVudE9uTWFpblRocmVhZChtX3N0cmVhbUlELCBbc3RyZWFtSUQgPSBtX3N0cmVhbUlEXShDbGll
bnQmIGNsaWVudCkgeworICAgICAgICBjbGllbnQuZGlkT3BlbihzdHJlYW1JRCk7CisgICAgfSk7
Cit9CisKK0N1cmxTdHJlYW06On5DdXJsU3RyZWFtKCkKK3sKKyAgICBBU1NFUlQoIWlzTWFpblRo
cmVhZCgpKTsKKyAgICBkZXN0cm95SGFuZGxlKCk7Cit9CisKK3ZvaWQgQ3VybFN0cmVhbTo6ZGVz
dHJveUhhbmRsZSgpCit7CisgICAgaWYgKCFtX2N1cmxIYW5kbGUpCisgICAgICAgIHJldHVybjsK
KworICAgIG1fY3VybEhhbmRsZSA9IG51bGxwdHI7Cit9CisKK3ZvaWQgQ3VybFN0cmVhbTo6c2Vu
ZChVbmlxdWVBcnJheTx1aW50OF90PiYmIGJ1ZmZlciwgc2l6ZV90IGxlbmd0aCkKK3sKKyAgICBB
U1NFUlQoIWlzTWFpblRocmVhZCgpKTsKKworICAgIGlmICghbV9jdXJsSGFuZGxlKQorICAgICAg
ICByZXR1cm47CisKKyAgICBtX3NlbmRCdWZmZXJzLmFwcGVuZChzdGQ6Om1ha2VfcGFpcihXVEZN
b3ZlKGJ1ZmZlciksIGxlbmd0aCkpOworfQorCit2b2lkIEN1cmxTdHJlYW06OmFwcGVuZE1vbml0
b3JpbmdGZChmZF9zZXQmIHJlYWRmZHMsIGZkX3NldCYgd3JpdGVmZHMsIGZkX3NldCYgZXhjZXB0
ZmRzLCBpbnQmIG1heGZkKQoreworICAgIEFTU0VSVCghaXNNYWluVGhyZWFkKCkpOworCisgICAg
aWYgKCFtX2N1cmxIYW5kbGUpCisgICAgICAgIHJldHVybjsKKworICAgIGF1dG8gc29ja2V0ID0g
bV9jdXJsSGFuZGxlLT5nZXRBY3RpdmVTb2NrZXQoKTsKKyAgICBpZiAoIXNvY2tldC5oYXNfdmFs
dWUoKSkgeworICAgICAgICBub3RpZnlGYWlsdXJlKHNvY2tldC5lcnJvcigpKTsKKyAgICAgICAg
cmV0dXJuOworICAgIH0KKworICAgIEZEX1NFVCgqc29ja2V0LCAmcmVhZGZkcyk7CisgICAgRkRf
U0VUKCpzb2NrZXQsICZleGNlcHRmZHMpOworCisgICAgaWYgKG1fc2VuZEJ1ZmZlcnMuc2l6ZSgp
KQorICAgICAgICBGRF9TRVQoKnNvY2tldCwgJndyaXRlZmRzKTsKKworICAgIGlmIChtYXhmZCA8
ICpzb2NrZXQpCisgICAgICAgIG1heGZkID0gKnNvY2tldDsKK30KKwordm9pZCBDdXJsU3RyZWFt
Ojp0cnlUb1RyYW5zZmVyKGNvbnN0IGZkX3NldCYgcmVhZGZkcywgY29uc3QgZmRfc2V0JiB3cml0
ZWZkcywgY29uc3QgZmRfc2V0JiBleGNlcHRmZHMpCit7CisgICAgQVNTRVJUKCFpc01haW5UaHJl
YWQoKSk7CisKKyAgICBpZiAoIW1fY3VybEhhbmRsZSkKKyAgICAgICAgcmV0dXJuOworCisgICAg
YXV0byBzb2NrZXQgPSBtX2N1cmxIYW5kbGUtPmdldEFjdGl2ZVNvY2tldCgpOworICAgIGlmICgh
c29ja2V0Lmhhc192YWx1ZSgpKSB7CisgICAgICAgIG5vdGlmeUZhaWx1cmUoc29ja2V0LmVycm9y
KCkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKEZEX0lTU0VUKCpzb2NrZXQs
ICZyZWFkZmRzKSB8fCBGRF9JU1NFVCgqc29ja2V0LCAmZXhjZXB0ZmRzKSkKKyAgICAgICAgdHJ5
VG9SZWNlaXZlKCk7CisKKyAgICBpZiAoRkRfSVNTRVQoKnNvY2tldCwgJndyaXRlZmRzKSkKKyAg
ICAgICAgdHJ5VG9TZW5kKCk7Cit9CisKK3ZvaWQgQ3VybFN0cmVhbTo6dHJ5VG9SZWNlaXZlKCkK
K3sKKyAgICBpZiAoIW1fY3VybEhhbmRsZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgYXV0byBy
ZWNlaXZlQnVmZmVyID0gbWFrZVVuaXF1ZUFycmF5PHVpbnQ4X3Q+KGtSZWNlaXZlQnVmZmVyU2l6
ZSk7CisgICAgc2l6ZV90IGJ5dGVzUmVjZWl2ZWQgPSAwOworCisgICAgYXV0byBlcnJvckNvZGUg
PSBtX2N1cmxIYW5kbGUtPnJlY2VpdmUocmVjZWl2ZUJ1ZmZlci5nZXQoKSwga1JlY2VpdmVCdWZm
ZXJTaXplLCBieXRlc1JlY2VpdmVkKTsKKyAgICBpZiAoZXJyb3JDb2RlICE9IENVUkxFX09LKSB7
CisgICAgICAgIGlmIChlcnJvckNvZGUgIT0gQ1VSTEVfQUdBSU4pCisgICAgICAgICAgICBub3Rp
ZnlGYWlsdXJlKGVycm9yQ29kZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyAw
IGJ5dGVzIGluZGljYXRlcyBhIGNsb3NlZCBjb25uZWN0aW9uLgorICAgIGlmICghYnl0ZXNSZWNl
aXZlZCkKKyAgICAgICAgZGVzdHJveUhhbmRsZSgpOworCisgICAgbV9zY2hlZHVsZXIuY2FsbENs
aWVudE9uTWFpblRocmVhZChtX3N0cmVhbUlELCBbc3RyZWFtSUQgPSBtX3N0cmVhbUlELCBidWZm
ZXIgPSBXVEZNb3ZlKHJlY2VpdmVCdWZmZXIpLCBsZW5ndGggPSBieXRlc1JlY2VpdmVkXShDbGll
bnQmIGNsaWVudCkgbXV0YWJsZSB7CisgICAgICAgIGNsaWVudC5kaWRSZWNlaXZlRGF0YShzdHJl
YW1JRCwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oYnVmZmVyLmdldCgpKSwgbGVuZ3Ro
KTsKKyAgICB9KTsKK30KKwordm9pZCBDdXJsU3RyZWFtOjp0cnlUb1NlbmQoKQoreworICAgIGlm
ICghbV9jdXJsSGFuZGxlIHx8ICFtX3NlbmRCdWZmZXJzLnNpemUoKSkKKyAgICAgICAgcmV0dXJu
OworCisgICAgYXV0byYgc2VuZEJ1ZmZlciA9IG1fc2VuZEJ1ZmZlcnMuZmlyc3QoKTsKKyAgICBz
aXplX3QgYnl0ZXNTZW50ID0gMDsKKworICAgIGF1dG8gZXJyb3JDb2RlID0gbV9jdXJsSGFuZGxl
LT5zZW5kKHNlbmRCdWZmZXIuZmlyc3QuZ2V0KCkgKyBtX3NlbmRCdWZmZXJPZmZzZXQsIHNlbmRC
dWZmZXIuc2Vjb25kIC0gbV9zZW5kQnVmZmVyT2Zmc2V0LCBieXRlc1NlbnQpOworICAgIGlmIChl
cnJvckNvZGUgIT0gQ1VSTEVfT0spIHsKKyAgICAgICAgaWYgKGVycm9yQ29kZSAhPSBDVVJMRV9B
R0FJTikKKyAgICAgICAgICAgIG5vdGlmeUZhaWx1cmUoZXJyb3JDb2RlKTsKKyAgICAgICAgcmV0
dXJuOworICAgIH0KKworICAgIG1fc2VuZEJ1ZmZlck9mZnNldCArPSBieXRlc1NlbnQ7CisKKyAg
ICBpZiAobV9zZW5kQnVmZmVyT2Zmc2V0ID49IHNlbmRCdWZmZXIuc2Vjb25kKSB7CisgICAgICAg
IG1fc2VuZEJ1ZmZlcnMucmVtb3ZlKDApOworICAgICAgICBtX3NlbmRCdWZmZXJPZmZzZXQgPSAw
OworICAgIH0KKworICAgIG1fc2NoZWR1bGVyLmNhbGxDbGllbnRPbk1haW5UaHJlYWQobV9zdHJl
YW1JRCwgW3N0cmVhbUlEID0gbV9zdHJlYW1JRCwgbGVuZ3RoID0gYnl0ZXNTZW50XShDbGllbnQm
IGNsaWVudCkgeworICAgICAgICBjbGllbnQuZGlkU2VuZERhdGEoc3RyZWFtSUQsIGxlbmd0aCk7
CisgICAgfSk7Cit9CisKK3ZvaWQgQ3VybFN0cmVhbTo6bm90aWZ5RmFpbHVyZShDVVJMY29kZSBl
cnJvckNvZGUpCit7CisgICAgZGVzdHJveUhhbmRsZSgpOworCisgICAgbV9zY2hlZHVsZXIuY2Fs
bENsaWVudE9uTWFpblRocmVhZChtX3N0cmVhbUlELCBbc3RyZWFtSUQgPSBtX3N0cmVhbUlELCBl
cnJvckNvZGUsIHVybCA9IG1fdXJsLmlzb2xhdGVkQ29weSgpXShDbGllbnQmIGNsaWVudCkgbXV0
YWJsZSB7CisgICAgICAgIGNsaWVudC5kaWRGYWlsKHN0cmVhbUlELCBlcnJvckNvZGUsIFdURk1v
dmUodXJsKSk7CisgICAgfSk7Cit9CisKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybFN0cmVhbS5oIGIvU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0N1cmxTdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0
NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5mZmQ3MTk2
YjVjOTFiYzMxNzFhZjgxOWIzYjJlZTU5MWM3MDBmODhjCi0tLSAvZGV2L251bGwKKysrIGIvU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0N1cmxTdHJlYW0uaApAQCAtMCwwICsx
LDg2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFNvbnkgSW50ZXJhY3RpdmUgRW50ZXJ0
YWlubWVudCBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6
CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkg
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlks
IE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIkN1cmxD
b250ZXh0LmgiCisjaW5jbHVkZSA8d3RmL1VSTC5oPgorI2luY2x1ZGUgPHd0Zi9VbmlxdWVBcnJh
eS5oPgorI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitj
bGFzcyBDdXJsU3RyZWFtU2NoZWR1bGVyOworY2xhc3MgU29ja2V0U3RyZWFtRXJyb3I7CisKK3Vz
aW5nIEN1cmxTdHJlYW1JRCA9IHVpbnQxNl90OworY29uc3QgQ3VybFN0cmVhbUlEIGludmFsaWRD
dXJsU3RyZWFtSUQgPSAwOworCitjbGFzcyBDdXJsU3RyZWFtIHsKKyAgICBXVEZfTUFLRV9GQVNU
X0FMTE9DQVRFRDsKKyAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShDdXJsU3RyZWFtKTsKK3B1Ymxp
YzoKKyAgICBjbGFzcyBDbGllbnQgeworICAgIHB1YmxpYzoKKyAgICAgICAgdmlydHVhbCB2b2lk
IGRpZE9wZW4oQ3VybFN0cmVhbUlEKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBkaWRTZW5k
RGF0YShDdXJsU3RyZWFtSUQsIHNpemVfdCkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgZGlk
UmVjZWl2ZURhdGEoQ3VybFN0cmVhbUlELCBjb25zdCBjaGFyKiwgc2l6ZV90KSA9IDA7CisgICAg
ICAgIHZpcnR1YWwgdm9pZCBkaWRGYWlsKEN1cmxTdHJlYW1JRCwgQ1VSTGNvZGUsIFVSTCYmKSA9
IDA7CisgICAgfTsKKworICAgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8Q3VybFN0cmVhbT4gY3Jl
YXRlKEN1cmxTdHJlYW1TY2hlZHVsZXImIHNjaGVkdWxlciwgQ3VybFN0cmVhbUlEIHN0cmVhbUlE
LCBVUkwmJiB1cmwpCisgICAgeworICAgICAgICByZXR1cm4gV1RGOjptYWtlVW5pcXVlPEN1cmxT
dHJlYW0+KHNjaGVkdWxlciwgc3RyZWFtSUQsIFdURk1vdmUodXJsKSk7CisgICAgfQorCisgICAg
Q3VybFN0cmVhbShDdXJsU3RyZWFtU2NoZWR1bGVyJiwgQ3VybFN0cmVhbUlELCBVUkwmJik7Cisg
ICAgdmlydHVhbCB+Q3VybFN0cmVhbSgpOworCisgICAgdm9pZCBzZW5kKFVuaXF1ZUFycmF5PHVp
bnQ4X3Q+JiYsIHNpemVfdCk7CisKKyAgICB2b2lkIGFwcGVuZE1vbml0b3JpbmdGZChmZF9zZXQm
LCBmZF9zZXQmLCBmZF9zZXQmLCBpbnQmKTsKKyAgICB2b2lkIHRyeVRvVHJhbnNmZXIoY29uc3Qg
ZmRfc2V0JiwgY29uc3QgZmRfc2V0JiwgY29uc3QgZmRfc2V0Jik7CisKK3ByaXZhdGU6CisgICAg
dm9pZCBkZXN0cm95SGFuZGxlKCk7CisKKyAgICB2b2lkIHRyeVRvUmVjZWl2ZSgpOworICAgIHZv
aWQgdHJ5VG9TZW5kKCk7CisKKyAgICB2b2lkIG5vdGlmeUZhaWx1cmUoQ1VSTGNvZGUpOworCisg
ICAgc3RhdGljIGNvbnN0IHNpemVfdCBrUmVjZWl2ZUJ1ZmZlclNpemUgPSAxNiAqIDEwMjQ7CisK
KyAgICBDdXJsU3RyZWFtU2NoZWR1bGVyJiBtX3NjaGVkdWxlcjsKKyAgICBDdXJsU3RyZWFtSUQg
bV9zdHJlYW1JRDsKKyAgICBVUkwgbV91cmw7CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q3VybEhh
bmRsZT4gbV9jdXJsSGFuZGxlOworCisgICAgV1RGOjpWZWN0b3I8c3RkOjpwYWlyPFVuaXF1ZUFy
cmF5PHVpbnQ4X3Q+LCBzaXplX3Q+PiBtX3NlbmRCdWZmZXJzOworICAgIHNpemVfdCBtX3NlbmRC
dWZmZXJPZmZzZXQgeyAwIH07Cit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1n
aXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybFN0cmVhbVNjaGVk
dWxlci5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybFN0cmVh
bVNjaGVkdWxlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uODQ1OGUzYzE0MTY3ZDVjOWI3NWE3NWJkN2U5ZGJk
YjFkMTQzNWQ4NQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25l
dHdvcmsvY3VybC9DdXJsU3RyZWFtU2NoZWR1bGVyLmNwcApAQCAtMCwwICsxLDE5MCBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAyMCBTb255IEludGVyYWN0aXZlIEVudGVydGFpbm1lbnQgSW5j
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElO
Qy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRI
RSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VS
RU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkN1cmxTdHJlYW1T
Y2hlZHVsZXIuaCIKKworI2lmIFVTRShDVVJMKQorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK0N1
cmxTdHJlYW1TY2hlZHVsZXI6OkN1cmxTdHJlYW1TY2hlZHVsZXIoKQoreworICAgIEFTU0VSVChp
c01haW5UaHJlYWQoKSk7Cit9CisKK0N1cmxTdHJlYW1TY2hlZHVsZXI6On5DdXJsU3RyZWFtU2No
ZWR1bGVyKCkKK3sKKyAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOworfQorCitDdXJsU3RyZWFt
SUQgQ3VybFN0cmVhbVNjaGVkdWxlcjo6Y3JlYXRlU3RyZWFtKGNvbnN0IFVSTCYgdXJsLCBDdXJs
U3RyZWFtOjpDbGllbnQmIGNsaWVudCkKK3sKKyAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOwor
CisgICAgZG8geworICAgICAgICBtX2N1cnJlbnRTdHJlYW1JRCA9IChtX2N1cnJlbnRTdHJlYW1J
RCArIDEgIT0gaW52YWxpZEN1cmxTdHJlYW1JRCkgPyBtX2N1cnJlbnRTdHJlYW1JRCArIDEgOiAx
OworICAgIH0gd2hpbGUgKG1fY2xpZW50TGlzdC5jb250YWlucyhtX2N1cnJlbnRTdHJlYW1JRCkp
OworCisgICAgYXV0byBzdHJlYW1JRCA9IG1fY3VycmVudFN0cmVhbUlEOworICAgIG1fY2xpZW50
TGlzdC5hZGQoc3RyZWFtSUQsICZjbGllbnQpOworCisgICAgY2FsbE9uV29ya2VyVGhyZWFkKFt0
aGlzLCBzdHJlYW1JRCwgdXJsID0gdXJsLmlzb2xhdGVkQ29weSgpXSgpIG11dGFibGUgeworICAg
ICAgICBtX3N0cmVhbUxpc3QuYWRkKHN0cmVhbUlELCBDdXJsU3RyZWFtOjpjcmVhdGUoKnRoaXMs
IHN0cmVhbUlELCBXVEZNb3ZlKHVybCkpKTsKKyAgICB9KTsKKworICAgIHJldHVybiBzdHJlYW1J
RDsKK30KKwordm9pZCBDdXJsU3RyZWFtU2NoZWR1bGVyOjpkZXN0cm95U3RyZWFtKEN1cmxTdHJl
YW1JRCBzdHJlYW1JRCkKK3sKKyAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOworCisgICAgaWYg
KG1fY2xpZW50TGlzdC5jb250YWlucyhzdHJlYW1JRCkpCisgICAgICAgIG1fY2xpZW50TGlzdC5y
ZW1vdmUoc3RyZWFtSUQpOworCisgICAgY2FsbE9uV29ya2VyVGhyZWFkKFt0aGlzLCBzdHJlYW1J
RF0oKSB7CisgICAgICAgIGlmIChtX3N0cmVhbUxpc3QuY29udGFpbnMoc3RyZWFtSUQpKQorICAg
ICAgICAgICAgbV9zdHJlYW1MaXN0LnJlbW92ZShzdHJlYW1JRCk7CisgICAgfSk7Cit9CisKK3Zv
aWQgQ3VybFN0cmVhbVNjaGVkdWxlcjo6c2VuZChDdXJsU3RyZWFtSUQgc3RyZWFtSUQsIFVuaXF1
ZUFycmF5PHVpbnQ4X3Q+JiYgZGF0YSwgc2l6ZV90IGxlbmd0aCkKK3sKKyAgICBBU1NFUlQoaXNN
YWluVGhyZWFkKCkpOworCisgICAgY2FsbE9uV29ya2VyVGhyZWFkKFt0aGlzLCBzdHJlYW1JRCwg
ZGF0YSA9IFdURk1vdmUoZGF0YSksIGxlbmd0aF0oKSBtdXRhYmxlIHsKKyAgICAgICAgaWYgKGF1
dG8gc3RyZWFtID0gbV9zdHJlYW1MaXN0LmdldChzdHJlYW1JRCkpCisgICAgICAgICAgICBzdHJl
YW0tPnNlbmQoV1RGTW92ZShkYXRhKSwgbGVuZ3RoKTsKKyAgICB9KTsKK30KKwordm9pZCBDdXJs
U3RyZWFtU2NoZWR1bGVyOjpjYWxsT25Xb3JrZXJUaHJlYWQoV1RGOjpGdW5jdGlvbjx2b2lkKCk+
JiYgdGFzaykKK3sKKyAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOworCisgICAgeworICAgICAg
ICBhdXRvIGxvY2tlciA9IGhvbGRMb2NrKG1fbXV0ZXgpOworICAgICAgICBtX3Rhc2tRdWV1ZS5h
cHBlbmQoV1RGTW92ZSh0YXNrKSk7CisgICAgfQorCisgICAgc3RhcnRUaHJlYWRJZk5lZWRlZCgp
OworfQorCit2b2lkIEN1cmxTdHJlYW1TY2hlZHVsZXI6OmNhbGxDbGllbnRPbk1haW5UaHJlYWQo
Q3VybFN0cmVhbUlEIHN0cmVhbUlELCBXVEY6OkZ1bmN0aW9uPHZvaWQoQ3VybFN0cmVhbTo6Q2xp
ZW50Jik+JiYgdGFzaykKK3sKKyAgICBBU1NFUlQoIWlzTWFpblRocmVhZCgpKTsKKworICAgIGNh
bGxPbk1haW5UaHJlYWQoW3RoaXMsIHN0cmVhbUlELCB0YXNrID0gV1RGTW92ZSh0YXNrKV0oKSB7
CisgICAgICAgIGlmIChhdXRvIGNsaWVudCA9IG1fY2xpZW50TGlzdC5nZXQoc3RyZWFtSUQpKQor
ICAgICAgICAgICAgdGFzaygqY2xpZW50KTsKKyAgICB9KTsKK30KKwordm9pZCBDdXJsU3RyZWFt
U2NoZWR1bGVyOjpzdGFydFRocmVhZElmTmVlZGVkKCkKK3sKKyAgICB7CisgICAgICAgIGF1dG8g
bG9ja2VyID0gaG9sZExvY2sobV9tdXRleCk7CisgICAgICAgIGlmIChtX3J1blRocmVhZCkKKyAg
ICAgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobV90aHJlYWQpCisgICAgICAgIG1f
dGhyZWFkLT53YWl0Rm9yQ29tcGxldGlvbigpOworCisgICAgbV9ydW5UaHJlYWQgPSB0cnVlOwor
CisgICAgbV90aHJlYWQgPSBUaHJlYWQ6OmNyZWF0ZSgiY3VybFN0cmVhbVRocmVhZCIsIFt0aGlz
XSB7CisgICAgICAgIHdvcmtlclRocmVhZCgpOworICAgIH0pOworfQorCit2b2lkIEN1cmxTdHJl
YW1TY2hlZHVsZXI6OnN0b3BUaHJlYWRJZk5vTW9yZUpvYlJ1bm5pbmcoKQoreworICAgIEFTU0VS
VCghaXNNYWluVGhyZWFkKCkpOworCisgICAgaWYgKG1fc3RyZWFtTGlzdC5zaXplKCkpCisgICAg
ICAgIHJldHVybjsKKworICAgIGF1dG8gbG9ja2VyID0gaG9sZExvY2sobV9tdXRleCk7CisgICAg
aWYgKG1fdGFza1F1ZXVlLnNpemUoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9ydW5UaHJl
YWQgPSBmYWxzZTsKK30KKwordm9pZCBDdXJsU3RyZWFtU2NoZWR1bGVyOjpleGVjdXRlVGFza3Mo
KQoreworICAgIEFTU0VSVCghaXNNYWluVGhyZWFkKCkpOworCisgICAgVmVjdG9yPFdURjo6RnVu
Y3Rpb248dm9pZCgpPj4gdGFza1F1ZXVlOworCisgICAgeworICAgICAgICBhdXRvIGxvY2tlciA9
IGhvbGRMb2NrKG1fbXV0ZXgpOworICAgICAgICB0YXNrUXVldWUgPSBXVEZNb3ZlKG1fdGFza1F1
ZXVlKTsKKyAgICB9CisKKyAgICBmb3IgKGF1dG8mIHRhc2sgOiB0YXNrUXVldWUpCisgICAgICAg
IHRhc2soKTsKK30KKwordm9pZCBDdXJsU3RyZWFtU2NoZWR1bGVyOjp3b3JrZXJUaHJlYWQoKQor
eworICAgIEFTU0VSVCghaXNNYWluVGhyZWFkKCkpOworICAgIHN0YXRpYyBjb25zdCBpbnQgc2Vs
ZWN0VGltZW91dE1TID0gMjA7CisgICAgc3RydWN0IHRpbWV2YWwgdGltZW91dCB7IDAsIHNlbGVj
dFRpbWVvdXRNUyAqIDEwMDB9OworCisgICAgd2hpbGUgKG1fcnVuVGhyZWFkKSB7CisgICAgICAg
IGV4ZWN1dGVUYXNrcygpOworCisgICAgICAgIGludCByYyA9IDA7CisgICAgICAgIGZkX3NldCBy
ZWFkZmRzOworICAgICAgICBmZF9zZXQgd3JpdGVmZHM7CisgICAgICAgIGZkX3NldCBleGNlcHRm
ZHM7CisKKyAgICAgICAgZG8geworICAgICAgICAgICAgaW50IG1heGZkID0gLTE7CisKKyAgICAg
ICAgICAgIEZEX1pFUk8oJnJlYWRmZHMpOworICAgICAgICAgICAgRkRfWkVSTygmd3JpdGVmZHMp
OworICAgICAgICAgICAgRkRfWkVSTygmZXhjZXB0ZmRzKTsKKworICAgICAgICAgICAgZm9yIChh
dXRvJiBzdHJlYW0gOiBtX3N0cmVhbUxpc3QudmFsdWVzKCkpCisgICAgICAgICAgICAgICAgc3Ry
ZWFtLT5hcHBlbmRNb25pdG9yaW5nRmQocmVhZGZkcywgd3JpdGVmZHMsIGV4Y2VwdGZkcywgbWF4
ZmQpOworCisgICAgICAgICAgICBpZiAobWF4ZmQgPj0gMCkKKyAgICAgICAgICAgICAgICByYyA9
IDo6c2VsZWN0KG1heGZkICsgMSwgJnJlYWRmZHMsICZ3cml0ZWZkcywgJmV4Y2VwdGZkcywgJnRp
bWVvdXQpOworICAgICAgICB9IHdoaWxlIChyYyA9PSAtMSAmJiBlcnJubyA9PSBFSU5UUik7CisK
KyAgICAgICAgZm9yIChhdXRvJiBzdHJlYW0gOiBtX3N0cmVhbUxpc3QudmFsdWVzKCkpCisgICAg
ICAgICAgICBzdHJlYW0tPnRyeVRvVHJhbnNmZXIocmVhZGZkcywgd3JpdGVmZHMsIGV4Y2VwdGZk
cyk7CisKKyAgICAgICAgc3RvcFRocmVhZElmTm9Nb3JlSm9iUnVubmluZygpOworICAgIH0KK30K
KworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdv
cmsvY3VybC9DdXJsU3RyZWFtU2NoZWR1bGVyLmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9u
ZXR3b3JrL2N1cmwvQ3VybFN0cmVhbVNjaGVkdWxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu
ZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjdkODgxMjA2Yzk2
ODlmNDMzMjI3OTY5YzliN2Y5ZmYyNjhiZGFhZWQKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybFN0cmVhbVNjaGVkdWxlci5oCkBAIC0w
LDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgU29ueSBJbnRlcmFjdGl2ZSBF
bnRlcnRhaW5tZW50IEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5E
IEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJ
QUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1Q
TEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQ
VElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAi
Q3VybFN0cmVhbS5oIgorI2luY2x1ZGUgPHd0Zi9GdW5jdGlvbi5oPgorI2luY2x1ZGUgPHd0Zi9I
YXNoTWFwLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgQ3VybFN0cmVhbVNjaGVk
dWxlciB7CisgICAgV1RGX01BS0VfRkFTVF9BTExPQ0FURUQ7CisgICAgV1RGX01BS0VfTk9OQ09Q
WUFCTEUoQ3VybFN0cmVhbVNjaGVkdWxlcik7CitwdWJsaWM6CisgICAgQ3VybFN0cmVhbVNjaGVk
dWxlcigpOworICAgIHZpcnR1YWwgfkN1cmxTdHJlYW1TY2hlZHVsZXIoKTsKKworICAgIEN1cmxT
dHJlYW1JRCBjcmVhdGVTdHJlYW0oY29uc3QgVVJMJiwgQ3VybFN0cmVhbTo6Q2xpZW50Jik7Cisg
ICAgdm9pZCBkZXN0cm95U3RyZWFtKEN1cmxTdHJlYW1JRCk7CisgICAgdm9pZCBzZW5kKEN1cmxT
dHJlYW1JRCwgVW5pcXVlQXJyYXk8dWludDhfdD4mJiwgc2l6ZV90KTsKKworICAgIHZvaWQgY2Fs
bE9uV29ya2VyVGhyZWFkKFdURjo6RnVuY3Rpb248dm9pZCgpPiYmKTsKKyAgICB2b2lkIGNhbGxD
bGllbnRPbk1haW5UaHJlYWQoQ3VybFN0cmVhbUlELCBXVEY6OkZ1bmN0aW9uPHZvaWQoQ3VybFN0
cmVhbTo6Q2xpZW50Jik+JiYpOworCitwcml2YXRlOgorICAgIHZvaWQgc3RhcnRUaHJlYWRJZk5l
ZWRlZCgpOworICAgIHZvaWQgc3RvcFRocmVhZElmTm9Nb3JlSm9iUnVubmluZygpOworCisgICAg
dm9pZCBleGVjdXRlVGFza3MoKTsKKworICAgIHZvaWQgd29ya2VyVGhyZWFkKCk7CisKKyAgICBM
b2NrIG1fbXV0ZXg7CisgICAgUmVmUHRyPFRocmVhZD4gbV90aHJlYWQ7CisgICAgYm9vbCBtX3J1
blRocmVhZCB7IGZhbHNlIH07CisKKyAgICBDdXJsU3RyZWFtSUQgbV9jdXJyZW50U3RyZWFtSUQg
PSAxOworCisgICAgVmVjdG9yPEZ1bmN0aW9uPHZvaWQoKT4+IG1fdGFza1F1ZXVlOworICAgIEhh
c2hNYXA8Q3VybFN0cmVhbUlELCBDdXJsU3RyZWFtOjpDbGllbnQqPiBtX2NsaWVudExpc3Q7Cisg
ICAgSGFzaE1hcDxDdXJsU3RyZWFtSUQsIHN0ZDo6dW5pcXVlX3B0cjxDdXJsU3RyZWFtPj4gbV9z
dHJlYW1MaXN0OworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEvU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL1NvY2tldFN0cmVhbUhhbmRsZUltcGwu
aCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9Tb2NrZXRTdHJlYW1IYW5k
bGVJbXBsLmgKaW5kZXggMjViZjNjNDZhMmViZGZiYTY1ODhmZWRhMjBhOWU4YzdlYzg3Y2IzMi4u
NTAxY2Y1YzEyNWI3N2VkZjRmYTExMjUzMGVhYTI1MjA3ZWU4N2ExYyAxMDA2NDQKLS0tIGEvU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL1NvY2tldFN0cmVhbUhhbmRsZUltcGwu
aAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvU29ja2V0U3RyZWFt
SGFuZGxlSW1wbC5oCkBAIC0xLDYgKzEsNyBAQAogLyoKICAqIENvcHlyaWdodCAoQykgMjAwOS0y
MDE4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIENvcHlyaWdodCAoQykgMjAw
OSBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAy
MCBTb255IEludGVyYWN0aXZlIEVudGVydGFpbm1lbnQgSW5jLgogICoKICAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAog
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zIGFyZQpAQCAtMzEsMjMgKzMyLDE3IEBACiAKICNwcmFnbWEgb25jZQogCi0j
aW5jbHVkZSAiQ3VybENvbnRleHQuaCIKKyNpbmNsdWRlICJDdXJsU3RyZWFtLmgiCiAjaW5jbHVk
ZSAiU29ja2V0U3RyZWFtSGFuZGxlLmgiCiAjaW5jbHVkZSA8cGFsL1Nlc3Npb25JRC5oPgotI2lu
Y2x1ZGUgPHd0Zi9GdW5jdGlvbi5oPgotI2luY2x1ZGUgPHd0Zi9Mb2NrLmg+Ci0jaW5jbHVkZSA8
d3RmL01lc3NhZ2VRdWV1ZS5oPgotI2luY2x1ZGUgPHd0Zi9SZWZDb3VudGVkLmg+CiAjaW5jbHVk
ZSA8d3RmL1N0cmVhbUJ1ZmZlci5oPgotI2luY2x1ZGUgPHd0Zi9UaHJlYWRpbmcuaD4KLSNpbmNs
dWRlIDx3dGYvVW5pcXVlQXJyYXkuaD4KIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCiBjbGFzcyBT
b2NrZXRTdHJlYW1IYW5kbGVDbGllbnQ7CiBjbGFzcyBTdG9yYWdlU2Vzc2lvblByb3ZpZGVyOwog
Ci1jbGFzcyBTb2NrZXRTdHJlYW1IYW5kbGVJbXBsIDogcHVibGljIFNvY2tldFN0cmVhbUhhbmRs
ZSB7CitjbGFzcyBTb2NrZXRTdHJlYW1IYW5kbGVJbXBsIDogcHVibGljIFNvY2tldFN0cmVhbUhh
bmRsZSwgcHVibGljIEN1cmxTdHJlYW06OkNsaWVudCB7CiBwdWJsaWM6CiAgICAgc3RhdGljIFJl
ZjxTb2NrZXRTdHJlYW1IYW5kbGVJbXBsPiBjcmVhdGUoY29uc3QgVVJMJiB1cmwsIFNvY2tldFN0
cmVhbUhhbmRsZUNsaWVudCYgY2xpZW50LCBQQUw6OlNlc3Npb25JRCwgY29uc3QgU3RyaW5nJiwg
U291cmNlQXBwbGljYXRpb25BdWRpdFRva2VuJiYsIGNvbnN0IFN0b3JhZ2VTZXNzaW9uUHJvdmlk
ZXIqIHByb3ZpZGVyKSB7IHJldHVybiBhZG9wdFJlZigqbmV3IFNvY2tldFN0cmVhbUhhbmRsZUlt
cGwodXJsLCBjbGllbnQsIHByb3ZpZGVyKSk7IH0KIApAQCAtNjQsMjggKzU5LDIyIEBAIHByaXZh
dGU6CiAgICAgT3B0aW9uYWw8c2l6ZV90PiBwbGF0Zm9ybVNlbmRJbnRlcm5hbChjb25zdCB1aW50
OF90Kiwgc2l6ZV90KTsKICAgICBib29sIHNlbmRQZW5kaW5nRGF0YSgpOwogCi0gICAgdm9pZCB0
aHJlYWRFbnRyeVBvaW50KGNvbnN0IFVSTCYpOwotICAgIHZvaWQgaGFuZGxlRXJyb3IoQ1VSTGNv
ZGUpOwotICAgIHZvaWQgc3RvcFRocmVhZCgpOworICAgIHZvaWQgZGlkT3BlbihDdXJsU3RyZWFt
SUQpIGZpbmFsOworICAgIHZvaWQgZGlkU2VuZERhdGEoQ3VybFN0cmVhbUlELCBzaXplX3QpIGZp
bmFsOworICAgIHZvaWQgZGlkUmVjZWl2ZURhdGEoQ3VybFN0cmVhbUlELCBjb25zdCBjaGFyKiwg
c2l6ZV90KSBmaW5hbDsKKyAgICB2b2lkIGRpZEZhaWwoQ3VybFN0cmVhbUlELCBDVVJMY29kZSwg
VVJMJiYpIGZpbmFsOwogCi0gICAgdm9pZCBjYWxsT25Xb3JrZXJUaHJlYWQoRnVuY3Rpb248dm9p
ZCgpPiYmKTsKLSAgICB2b2lkIGV4ZWN1dGVUYXNrcygpOwotCi0gICAgc3RhdGljIGNvbnN0IHNp
emVfdCBrUmVhZEJ1ZmZlclNpemUgPSA0ICogMTAyNDsKKyAgICBib29sIGlzU3RyZWFtSW52YWxp
ZGF0ZWQoKSB7IHJldHVybiBtX3N0cmVhbUlEID09IGludmFsaWRDdXJsU3RyZWFtSUQ7IH0KKyAg
ICB2b2lkIGRlc3RydWN0U3RyZWFtKCk7CiAKICAgICBSZWZQdHI8Y29uc3QgU3RvcmFnZVNlc3Np
b25Qcm92aWRlcj4gbV9zdG9yYWdlU2Vzc2lvblByb3ZpZGVyOwotICAgIFJlZlB0cjxUaHJlYWQ+
IG1fd29ya2VyVGhyZWFkOwotICAgIHN0ZDo6YXRvbWljPGJvb2w+IG1fcnVubmluZyB7IHRydWUg
fTsKLQotICAgIE1lc3NhZ2VRdWV1ZTxGdW5jdGlvbjx2b2lkKCk+PiBtX3Rhc2tRdWV1ZTsKLQot
ICAgIGJvb2wgbV9oYXNQZW5kaW5nV3JpdGVEYXRhIHsgZmFsc2UgfTsKLSAgICBzaXplX3QgbV93
cml0ZUJ1ZmZlclNpemUgeyAwIH07Ci0gICAgc2l6ZV90IG1fd3JpdGVCdWZmZXJPZmZzZXQgeyAw
IH07Ci0gICAgVW5pcXVlQXJyYXk8dWludDhfdD4gbV93cml0ZUJ1ZmZlcjsKIAogICAgIFN0cmVh
bUJ1ZmZlcjx1aW50OF90LCAxMDI0ICogMTAyND4gbV9idWZmZXI7CiAgICAgc3RhdGljIGNvbnN0
IHVuc2lnbmVkIG1heEJ1ZmZlclNpemUgPSAxMDAgKiAxMDI0ICogMTAyNDsKKworICAgIEN1cmxT
dHJlYW1TY2hlZHVsZXImIG1fc2NoZWR1bGVyOworICAgIEN1cmxTdHJlYW1JRCBtX3N0cmVhbUlE
IHsgaW52YWxpZEN1cmxTdHJlYW1JRCB9OworICAgIHVuc2lnbmVkIG1fdG90YWxTZW5kRGF0YVNp
emUgeyAwIH07CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9Tb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvU29ja2V0U3RyZWFtSGFuZGxlSW1wbEN1
cmwuY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL1NvY2tldFN0cmVh
bUhhbmRsZUltcGxDdXJsLmNwcAppbmRleCAxM2E4MzJjMjY2OWI0Y2U4Y2JlYmYzMTM0YmEwODlk
OTAyZGZhOTQ5Li44Y2QzOTE0Mjk3NWE0Mzg4ZTk4OGIyODc0NzFmYjk4MmE1Y2JiMmI4IDEwMDY0
NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvU29ja2V0U3RyZWFt
SGFuZGxlSW1wbEN1cmwuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsv
Y3VybC9Tb2NrZXRTdHJlYW1IYW5kbGVJbXBsQ3VybC5jcHAKQEAgLTEsNyArMSw3IEBACiAvKgog
ICogQ29weXJpZ2h0IChDKSAyMDA5IEJyZW50IEZ1bGdoYW0uICBBbGwgcmlnaHRzIHJlc2VydmVk
LgogICogQ29weXJpZ2h0IChDKSAyMDA5IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVk
LgotICogQ29weXJpZ2h0IChDKSAyMDE4IFNvbnkgSW50ZXJhY3RpdmUgRW50ZXJ0YWlubWVudCBJ
bmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgU29ueSBJbnRlcmFjdGl2ZSBFbnRlcnRhaW5tZW50
IEluYy4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKQEAgLTM1LDE4MyArMzUs
MTAzIEBACiAKICNpZiBVU0UoQ1VSTCkKIAorI2luY2x1ZGUgIkN1cmxTdHJlYW1TY2hlZHVsZXIu
aCIKICNpbmNsdWRlICJEZXByZWNhdGVkR2xvYmFsU2V0dGluZ3MuaCIKLSNpbmNsdWRlICJMb2dn
aW5nLmgiCiAjaW5jbHVkZSAiU29ja2V0U3RyZWFtRXJyb3IuaCIKICNpbmNsdWRlICJTb2NrZXRT
dHJlYW1IYW5kbGVDbGllbnQuaCIKICNpbmNsdWRlICJTdG9yYWdlU2Vzc2lvblByb3ZpZGVyLmgi
Ci0jaW5jbHVkZSA8d3RmL01haW5UaHJlYWQuaD4KLSNpbmNsdWRlIDx3dGYvVVJMLmg+Ci0jaW5j
bHVkZSA8d3RmL3RleHQvQ1N0cmluZy5oPgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKIFNvY2tl
dFN0cmVhbUhhbmRsZUltcGw6OlNvY2tldFN0cmVhbUhhbmRsZUltcGwoY29uc3QgVVJMJiB1cmws
IFNvY2tldFN0cmVhbUhhbmRsZUNsaWVudCYgY2xpZW50LCBjb25zdCBTdG9yYWdlU2Vzc2lvblBy
b3ZpZGVyKiBwcm92aWRlcikKICAgICA6IFNvY2tldFN0cmVhbUhhbmRsZSh1cmwsIGNsaWVudCkK
ICAgICAsIG1fc3RvcmFnZVNlc3Npb25Qcm92aWRlcihwcm92aWRlcikKKyAgICAsIG1fc2NoZWR1
bGVyKEN1cmxDb250ZXh0OjpzaW5nbGV0b24oKS5zdHJlYW1TY2hlZHVsZXIoKSkKIHsKLSAgICBM
T0coTmV0d29yaywgIlNvY2tldFN0cmVhbUhhbmRsZSAlcCBuZXcgY2xpZW50ICVwIiwgdGhpcywg
Jm1fY2xpZW50KTsKLSAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOwotCiAgICAgLy8gRklYTUU6
IFVzaW5nIERlcHJlY2F0ZWRHbG9iYWxTZXR0aW5ncyBmcm9tIGhlcmUgaXMgYSBsYXllcmluZyB2
aW9sYXRpb24uCiAgICAgaWYgKG1fdXJsLnByb3RvY29sSXMoIndzcyIpICYmIERlcHJlY2F0ZWRH
bG9iYWxTZXR0aW5nczo6YWxsb3dzQW55U1NMQ2VydGlmaWNhdGUoKSkKICAgICAgICAgQ3VybENv
bnRleHQ6OnNpbmdsZXRvbigpLnNzbEhhbmRsZSgpLnNldElnbm9yZVNTTEVycm9ycyh0cnVlKTsK
IAotICAgIG1fd29ya2VyVGhyZWFkID0gVGhyZWFkOjpjcmVhdGUoIldlYlNvY2tldCB0aHJlYWQi
LCBbdGhpcywgcHJvdGVjdGVkVGhpcyA9IG1ha2VSZWYoKnRoaXMpLCB1cmwgPSB1cmwuaXNvbGF0
ZWRDb3B5KCldIHsKLSAgICAgICAgdGhyZWFkRW50cnlQb2ludCh1cmwpOwotICAgIH0pOworICAg
IG1fc3RyZWFtSUQgPSBtX3NjaGVkdWxlci5jcmVhdGVTdHJlYW0obV91cmwsICp0aGlzKTsKIH0K
IAogU29ja2V0U3RyZWFtSGFuZGxlSW1wbDo6flNvY2tldFN0cmVhbUhhbmRsZUltcGwoKQogewot
ICAgIExPRyhOZXR3b3JrLCAiU29ja2V0U3RyZWFtSGFuZGxlICVwIGRlbGV0ZSIsIHRoaXMpOwot
ICAgIHN0b3BUaHJlYWQoKTsKKyAgICBkZXN0cnVjdFN0cmVhbSgpOwogfQogCiBPcHRpb25hbDxz
aXplX3Q+IFNvY2tldFN0cmVhbUhhbmRsZUltcGw6OnBsYXRmb3JtU2VuZEludGVybmFsKGNvbnN0
IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW5ndGgpCiB7Ci0gICAgTE9HKE5ldHdvcmssICJTb2Nr
ZXRTdHJlYW1IYW5kbGUgJXAgcGxhdGZvcm1TZW5kIiwgdGhpcyk7Ci0gICAgQVNTRVJUKGlzTWFp
blRocmVhZCgpKTsKKyAgICBpZiAoaXNTdHJlYW1JbnZhbGlkYXRlZCgpKQorICAgICAgICByZXR1
cm4gV1RGOjpudWxsb3B0OwogCi0gICAgaWYgKG1faGFzUGVuZGluZ1dyaXRlRGF0YSkKKyAgICBp
ZiAobV90b3RhbFNlbmREYXRhU2l6ZSArIGxlbmd0aCA+IG1heEJ1ZmZlclNpemUpCiAgICAgICAg
IHJldHVybiAwOworICAgIG1fdG90YWxTZW5kRGF0YVNpemUgKz0gbGVuZ3RoOwogCi0gICAgbV9o
YXNQZW5kaW5nV3JpdGVEYXRhID0gdHJ1ZTsKLQotICAgIGF1dG8gd3JpdGVCdWZmZXIgPSBtYWtl
VW5pcXVlQXJyYXk8dWludDhfdD4obGVuZ3RoKTsKLSAgICBtZW1jcHkod3JpdGVCdWZmZXIuZ2V0
KCksIGRhdGEsIGxlbmd0aCk7Ci0KLSAgICBjYWxsT25Xb3JrZXJUaHJlYWQoW3RoaXMsIHdyaXRl
QnVmZmVyID0gV1RGTW92ZSh3cml0ZUJ1ZmZlciksIHdyaXRlQnVmZmVyU2l6ZSA9IGxlbmd0aF0o
KSBtdXRhYmxlIHsKLSAgICAgICAgQVNTRVJUKCFpc01haW5UaHJlYWQoKSk7Ci0gICAgICAgIG1f
d3JpdGVCdWZmZXIgPSBXVEZNb3ZlKHdyaXRlQnVmZmVyKTsKLSAgICAgICAgbV93cml0ZUJ1ZmZl
clNpemUgPSB3cml0ZUJ1ZmZlclNpemU7Ci0gICAgICAgIG1fd3JpdGVCdWZmZXJPZmZzZXQgPSAw
OwotICAgIH0pOworICAgIGF1dG8gYnVmZmVyID0gbWFrZVVuaXF1ZUFycmF5PHVpbnQ4X3Q+KGxl
bmd0aCk7CisgICAgbWVtY3B5KGJ1ZmZlci5nZXQoKSwgZGF0YSwgbGVuZ3RoKTsKIAorICAgIG1f
c2NoZWR1bGVyLnNlbmQobV9zdHJlYW1JRCwgV1RGTW92ZShidWZmZXIpLCBsZW5ndGgpOwogICAg
IHJldHVybiBsZW5ndGg7CiB9CiAKIHZvaWQgU29ja2V0U3RyZWFtSGFuZGxlSW1wbDo6cGxhdGZv
cm1DbG9zZSgpCiB7Ci0gICAgTE9HKE5ldHdvcmssICJTb2NrZXRTdHJlYW1IYW5kbGUgJXAgcGxh
dGZvcm1DbG9zZSIsIHRoaXMpOwotICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7CisgICAgZGVz
dHJ1Y3RTdHJlYW0oKTsKIAogICAgIGlmIChtX3N0YXRlID09IENsb3NlZCkKICAgICAgICAgcmV0
dXJuOwogICAgIG1fc3RhdGUgPSBDbG9zZWQ7CiAKLSAgICBzdG9wVGhyZWFkKCk7CiAgICAgbV9j
bGllbnQuZGlkQ2xvc2VTb2NrZXRTdHJlYW0oKnRoaXMpOwogfQogCi12b2lkIFNvY2tldFN0cmVh
bUhhbmRsZUltcGw6OnRocmVhZEVudHJ5UG9pbnQoY29uc3QgVVJMJiB1cmwpCit2b2lkIFNvY2tl
dFN0cmVhbUhhbmRsZUltcGw6OmRpZE9wZW4oQ3VybFN0cmVhbUlEKQogewotICAgIEFTU0VSVCgh
aXNNYWluVGhyZWFkKCkpOwotCi0gICAgQ3VybFNvY2tldEhhbmRsZSBzb2NrZXQgeyB1cmwsIFt0
aGlzXShDVVJMY29kZSBlcnJvckNvZGUpIHsKLSAgICAgICAgaGFuZGxlRXJyb3IoZXJyb3JDb2Rl
KTsKLSAgICB9fTsKLQotICAgIC8vIENvbm5lY3QgdG8gaG9zdAotICAgIGlmICghc29ja2V0LmNv
bm5lY3QoKSkKKyAgICBpZiAobV9zdGF0ZSAhPSBDb25uZWN0aW5nKQogICAgICAgICByZXR1cm47
CisgICAgbV9zdGF0ZSA9IE9wZW47CiAKLSAgICBjYWxsT25NYWluVGhyZWFkKFt0aGlzLCBwcm90
ZWN0ZWRUaGlzID0gbWFrZVJlZigqdGhpcyldIHsKLSAgICAgICAgaWYgKG1fc3RhdGUgPT0gQ29u
bmVjdGluZykgewotICAgICAgICAgICAgbV9zdGF0ZSA9IE9wZW47Ci0gICAgICAgICAgICBtX2Ns
aWVudC5kaWRPcGVuU29ja2V0U3RyZWFtKCp0aGlzKTsKLSAgICAgICAgfQotICAgIH0pOwotCi0g
ICAgd2hpbGUgKG1fcnVubmluZykgewotICAgICAgICBleGVjdXRlVGFza3MoKTsKLQotICAgICAg
ICBhdXRvIHJlc3VsdCA9IHNvY2tldC53YWl0KDIwX21zLCBtX3dyaXRlQnVmZmVyLmdldCgpKTsK
LSAgICAgICAgaWYgKCFyZXN1bHQpCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAv
LyBUaGVzZSBsb2dpYyBvbmx5IHJ1biB3aGVuIHRoZXJlJ3MgZGF0YSB3YWl0aW5nLgotICAgICAg
ICBpZiAocmVzdWx0LT53cml0YWJsZSAmJiBtX3J1bm5pbmcpIHsKLSAgICAgICAgICAgIGF1dG8g
Ynl0ZXNTZW50ID0gc29ja2V0LnNlbmQobV93cml0ZUJ1ZmZlci5nZXQoKSArIG1fd3JpdGVCdWZm
ZXJPZmZzZXQsIG1fd3JpdGVCdWZmZXJTaXplIC0gbV93cml0ZUJ1ZmZlck9mZnNldCk7Ci0gICAg
ICAgICAgICBtX3dyaXRlQnVmZmVyT2Zmc2V0ICs9IGJ5dGVzU2VudDsKLQotICAgICAgICAgICAg
aWYgKG1fd3JpdGVCdWZmZXJTaXplIDw9IG1fd3JpdGVCdWZmZXJPZmZzZXQpIHsKLSAgICAgICAg
ICAgICAgICBtX3dyaXRlQnVmZmVyID0gbnVsbHB0cjsKLSAgICAgICAgICAgICAgICBtX3dyaXRl
QnVmZmVyU2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgbV93cml0ZUJ1ZmZlck9mZnNldCA9IDA7
Ci0KLSAgICAgICAgICAgICAgICBjYWxsT25NYWluVGhyZWFkKFt0aGlzLCBwcm90ZWN0ZWRUaGlz
ID0gbWFrZVJlZigqdGhpcyldIHsKLSAgICAgICAgICAgICAgICAgICAgbV9oYXNQZW5kaW5nV3Jp
dGVEYXRhID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIHNlbmRQZW5kaW5nRGF0YSgpOwot
ICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAg
aWYgKHJlc3VsdC0+cmVhZGFibGUgJiYgbV9ydW5uaW5nKSB7Ci0gICAgICAgICAgICBhdXRvIHJl
YWRCdWZmZXIgPSBtYWtlVW5pcXVlQXJyYXk8dWludDhfdD4oa1JlYWRCdWZmZXJTaXplKTsKLSAg
ICAgICAgICAgIGF1dG8gYnl0ZXNSZWFkID0gc29ja2V0LnJlY2VpdmUocmVhZEJ1ZmZlci5nZXQo
KSwga1JlYWRCdWZmZXJTaXplKTsKLSAgICAgICAgICAgIC8vIGBudWxsb3B0YCByZXN1bHQgbWVh
bnMgbm90aGluZyB0byBoYW5kbGUgYXQgdGhpcyBtb21lbnQuCi0gICAgICAgICAgICBpZiAoIWJ5
dGVzUmVhZCkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgLy8gMCBi
eXRlcyBpbmRpY2F0ZXMgYSBjbG9zZWQgY29ubmVjdGlvbi4KLSAgICAgICAgICAgIGlmICghKmJ5
dGVzUmVhZCkgewotICAgICAgICAgICAgICAgIG1fcnVubmluZyA9IGZhbHNlOwotICAgICAgICAg
ICAgICAgIGNhbGxPbk1haW5UaHJlYWQoW3RoaXMsIHByb3RlY3RlZFRoaXMgPSBtYWtlUmVmKCp0
aGlzKV0gewotICAgICAgICAgICAgICAgICAgICBjbG9zZSgpOwotICAgICAgICAgICAgICAgIH0p
OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBj
YWxsT25NYWluVGhyZWFkKFt0aGlzLCBwcm90ZWN0ZWRUaGlzID0gbWFrZVJlZigqdGhpcyksIGJ1
ZmZlciA9IFdURk1vdmUocmVhZEJ1ZmZlciksIHNpemUgPSAqYnl0ZXNSZWFkIF0gewotICAgICAg
ICAgICAgICAgIGlmIChtX3N0YXRlID09IE9wZW4pCi0gICAgICAgICAgICAgICAgICAgIG1fY2xp
ZW50LmRpZFJlY2VpdmVTb2NrZXRTdHJlYW1EYXRhKCp0aGlzLCByZWludGVycHJldF9jYXN0PGNv
bnN0IGNoYXIqPihidWZmZXIuZ2V0KCkpLCBzaXplKTsKLSAgICAgICAgICAgIH0pOwotICAgICAg
ICB9Ci0gICAgfQotCi0gICAgbV93cml0ZUJ1ZmZlciA9IG51bGxwdHI7CisgICAgbV9jbGllbnQu
ZGlkT3BlblNvY2tldFN0cmVhbSgqdGhpcyk7CiB9CiAKLXZvaWQgU29ja2V0U3RyZWFtSGFuZGxl
SW1wbDo6aGFuZGxlRXJyb3IoQ1VSTGNvZGUgZXJyb3JDb2RlKQordm9pZCBTb2NrZXRTdHJlYW1I
YW5kbGVJbXBsOjpkaWRTZW5kRGF0YShDdXJsU3RyZWFtSUQsIHNpemVfdCBsZW5ndGgpCiB7Ci0g
ICAgbV9ydW5uaW5nID0gZmFsc2U7Ci0gICAgY2FsbE9uTWFpblRocmVhZChbdGhpcywgcHJvdGVj
dGVkVGhpcyA9IG1ha2VSZWYoKnRoaXMpLCBlcnJvckNvZGUsIGxvY2FsaXplZERlc2NyaXB0aW9u
ID0gQ3VybEhhbmRsZTo6ZXJyb3JEZXNjcmlwdGlvbihlcnJvckNvZGUpLmlzb2xhdGVkQ29weSgp
XSB7Ci0gICAgICAgIGlmIChtX3N0YXRlID09IENsb3NlZCkKLSAgICAgICAgICAgIHJldHVybjsK
LQotICAgICAgICBpZiAoZXJyb3JDb2RlID09IENVUkxFX1JFQ1ZfRVJST1IpCi0gICAgICAgICAg
ICBtX2NsaWVudC5kaWRGYWlsVG9SZWNlaXZlU29ja2V0U3RyZWFtRGF0YSgqdGhpcyk7Ci0gICAg
ICAgIGVsc2UKLSAgICAgICAgICAgIG1fY2xpZW50LmRpZEZhaWxTb2NrZXRTdHJlYW0oKnRoaXMs
IFNvY2tldFN0cmVhbUVycm9yKHN0YXRpY19jYXN0PGludD4oZXJyb3JDb2RlKSwgeyB9LCBsb2Nh
bGl6ZWREZXNjcmlwdGlvbikpOwotICAgIH0pOworICAgIEFTU0VSVChtX3RvdGFsU2VuZERhdGFT
aXplIC0gbGVuZ3RoID49IDApOworCisgICAgbV90b3RhbFNlbmREYXRhU2l6ZSAtPSBsZW5ndGg7
CisgICAgc2VuZFBlbmRpbmdEYXRhKCk7CiB9CiAKLXZvaWQgU29ja2V0U3RyZWFtSGFuZGxlSW1w
bDo6c3RvcFRocmVhZCgpCit2b2lkIFNvY2tldFN0cmVhbUhhbmRsZUltcGw6OmRpZFJlY2VpdmVE
YXRhKEN1cmxTdHJlYW1JRCwgY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IGxlbmd0aCkKIHsKLSAg
ICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOwotCi0gICAgbV9ydW5uaW5nID0gZmFsc2U7CisgICAg
aWYgKG1fc3RhdGUgIT0gT3BlbikKKyAgICAgICAgcmV0dXJuOwogCi0gICAgaWYgKG1fd29ya2Vy
VGhyZWFkKSB7Ci0gICAgICAgIG1fd29ya2VyVGhyZWFkLT53YWl0Rm9yQ29tcGxldGlvbigpOwot
ICAgICAgICBtX3dvcmtlclRocmVhZCA9IG51bGxwdHI7Ci0gICAgfQorICAgIG1fY2xpZW50LmRp
ZFJlY2VpdmVTb2NrZXRTdHJlYW1EYXRhKCp0aGlzLCBkYXRhLCBsZW5ndGgpOwogfQogCi12b2lk
IFNvY2tldFN0cmVhbUhhbmRsZUltcGw6OmNhbGxPbldvcmtlclRocmVhZChGdW5jdGlvbjx2b2lk
KCk+JiYgdGFzaykKK3ZvaWQgU29ja2V0U3RyZWFtSGFuZGxlSW1wbDo6ZGlkRmFpbChDdXJsU3Ry
ZWFtSUQsIENVUkxjb2RlIGVycm9yQ29kZSwgVVJMJiYgdXJsKQogewotICAgIEFTU0VSVChpc01h
aW5UaHJlYWQoKSk7Ci0gICAgbV90YXNrUXVldWUuYXBwZW5kKG1ha2VVbmlxdWU8RnVuY3Rpb248
dm9pZCgpPj4oV1RGTW92ZSh0YXNrKSkpOworICAgIGRlc3RydWN0U3RyZWFtKCk7CisKKyAgICBp
ZiAobV9zdGF0ZSA9PSBDbG9zZWQpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChlcnJvckNv
ZGUgPT0gQ1VSTEVfUkVDVl9FUlJPUikKKyAgICAgICAgbV9jbGllbnQuZGlkRmFpbFRvUmVjZWl2
ZVNvY2tldFN0cmVhbURhdGEoKnRoaXMpOworICAgIGVsc2UKKyAgICAgICAgbV9jbGllbnQuZGlk
RmFpbFNvY2tldFN0cmVhbSgqdGhpcywgU29ja2V0U3RyZWFtRXJyb3IoZXJyb3JDb2RlLCB1cmws
IEN1cmxIYW5kbGU6OmVycm9yRGVzY3JpcHRpb24oZXJyb3JDb2RlKSkpOwogfQogCi12b2lkIFNv
Y2tldFN0cmVhbUhhbmRsZUltcGw6OmV4ZWN1dGVUYXNrcygpCit2b2lkIFNvY2tldFN0cmVhbUhh
bmRsZUltcGw6OmRlc3RydWN0U3RyZWFtKCkKIHsKLSAgICBBU1NFUlQoIWlzTWFpblRocmVhZCgp
KTsKKyAgICBpZiAoaXNTdHJlYW1JbnZhbGlkYXRlZCgpKQorICAgICAgICByZXR1cm47CiAKLSAg
ICBhdXRvIHRhc2tzID0gbV90YXNrUXVldWUudGFrZUFsbE1lc3NhZ2VzKCk7Ci0gICAgZm9yIChh
dXRvJiB0YXNrIDogdGFza3MpCi0gICAgICAgICgqdGFzaykoKTsKKyAgICBtX3NjaGVkdWxlci5k
ZXN0cm95U3RyZWFtKG1fc3RyZWFtSUQpOworICAgIG1fc3RyZWFtSUQgPSBpbnZhbGlkQ3VybFN0
cmVhbUlEOwogfQogCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>390905</attachid>
            <date>2020-02-17 00:29:32 -0800</date>
            <delta_ts>2020-02-17 02:50:37 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-187984-20200217172314.patch</filename>
            <type>text/plain</type>
            <size>40245</size>
            <attacher name="Takashi Komori">takashi.komori</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjU2NDk0CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggZGM4Y2JmZTJjMzY5YWYw
ZGIwOTNhM2I3YmM3Y2I1YTI1NDc2YWFlMi4uMGY3ZDM1ZjJhMThmNWU4YzE4NDA4NTc3NDlkYWUw
OWViNmU2Y2ZmYSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDcwIEBACisyMDIwLTAyLTE3ICBUYWth
c2hpIEtvbW9yaSAgPFRha2FzaGkuS29tb3JpQHNvbnkuY29tPgorCisgICAgICAgIFtDdXJsXSBV
c2Ugc2hhcmVkIHNpbmdsZSB0aHJlYWQgZm9yIFdlYlNvY2tldCBjb25uZWN0aW9ucworICAgICAg
ICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTg3OTg0CisKKyAgICAg
ICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgVGhpcyBwYXRjaCBzdXBw
cmVzc2VzIGludm9raW5nIHdvcmtlciB0aHJlYWRzIGZvciB3ZWJzb2NrZXQgY29ubmVjdGlvbnMu
CisgICAgICAgIEN1cmxTdHJlYW1TY2hlZHVsZXIgc3RhcnRzIHVwIHRvIG9uZSB3b3JrZXIgdGhy
ZWFkLgorCisgICAgICAgIE5vIG5ldyB0ZXN0cy4gQ292ZXJlZCBieSBleGlzdGluZyBXZWJTb2Nr
ZXQgdGVzdHMuCisKKyAgICAgICAgKiBwbGF0Zm9ybS9DdXJsLmNtYWtlOgorICAgICAgICAqIHBs
YXRmb3JtL25ldHdvcmsvY3VybC9DdXJsQ29udGV4dC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpD
dXJsQ29udGV4dDo6c3RyZWFtU2NoZWR1bGVyKToKKyAgICAgICAgKFdlYkNvcmU6OkN1cmxIYW5k
bGU6OmdldEFjdGl2ZVNvY2tldCk6CisgICAgICAgIChXZWJDb3JlOjpDdXJsSGFuZGxlOjpzZW5k
KToKKyAgICAgICAgKFdlYkNvcmU6OkN1cmxIYW5kbGU6OnJlY2VpdmUpOgorICAgICAgICAoV2Vi
Q29yZTo6Q3VybFNvY2tldEhhbmRsZTo6Q3VybFNvY2tldEhhbmRsZSk6IERlbGV0ZWQuCisgICAg
ICAgIChXZWJDb3JlOjpDdXJsU29ja2V0SGFuZGxlOjpjb25uZWN0KTogRGVsZXRlZC4KKyAgICAg
ICAgKFdlYkNvcmU6OkN1cmxTb2NrZXRIYW5kbGU6OnNlbmQpOiBEZWxldGVkLgorICAgICAgICAo
V2ViQ29yZTo6Q3VybFNvY2tldEhhbmRsZTo6cmVjZWl2ZSk6IERlbGV0ZWQuCisgICAgICAgIChX
ZWJDb3JlOjpDdXJsU29ja2V0SGFuZGxlOjp3YWl0KTogRGVsZXRlZC4KKyAgICAgICAgKiBwbGF0
Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybENvbnRleHQuaDoKKyAgICAgICAgKiBwbGF0Zm9ybS9uZXR3
b3JrL2N1cmwvQ3VybFN0cmVhbS5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6Q3VybFN0
cmVhbTo6Q3VybFN0cmVhbSk6CisgICAgICAgIChXZWJDb3JlOjpDdXJsU3RyZWFtOjp+Q3VybFN0
cmVhbSk6CisgICAgICAgIChXZWJDb3JlOjpDdXJsU3RyZWFtOjpkZXN0cm95SGFuZGxlKToKKyAg
ICAgICAgKFdlYkNvcmU6OkN1cmxTdHJlYW06OnNlbmQpOgorICAgICAgICAoV2ViQ29yZTo6Q3Vy
bFN0cmVhbTo6YXBwZW5kTW9uaXRvcmluZ0ZkKToKKyAgICAgICAgKFdlYkNvcmU6OkN1cmxTdHJl
YW06OnRyeVRvVHJhbnNmZXIpOgorICAgICAgICAoV2ViQ29yZTo6Q3VybFN0cmVhbTo6dHJ5VG9S
ZWNlaXZlKToKKyAgICAgICAgKFdlYkNvcmU6OkN1cmxTdHJlYW06OnRyeVRvU2VuZCk6CisgICAg
ICAgIChXZWJDb3JlOjpDdXJsU3RyZWFtOjpub3RpZnlGYWlsdXJlKToKKyAgICAgICAgKiBwbGF0
Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybFN0cmVhbS5oOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6
OkN1cmxTdHJlYW06OmNyZWF0ZSk6CisgICAgICAgICogcGxhdGZvcm0vbmV0d29yay9jdXJsL0N1
cmxTdHJlYW1TY2hlZHVsZXIuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkN1cmxTdHJl
YW1TY2hlZHVsZXI6OkN1cmxTdHJlYW1TY2hlZHVsZXIpOgorICAgICAgICAoV2ViQ29yZTo6Q3Vy
bFN0cmVhbVNjaGVkdWxlcjo6fkN1cmxTdHJlYW1TY2hlZHVsZXIpOgorICAgICAgICAoV2ViQ29y
ZTo6Q3VybFN0cmVhbVNjaGVkdWxlcjo6Y3JlYXRlU3RyZWFtKToKKyAgICAgICAgKFdlYkNvcmU6
OkN1cmxTdHJlYW1TY2hlZHVsZXI6OmRlc3Ryb3lTdHJlYW0pOgorICAgICAgICAoV2ViQ29yZTo6
Q3VybFN0cmVhbVNjaGVkdWxlcjo6c2VuZCk6CisgICAgICAgIChXZWJDb3JlOjpDdXJsU3RyZWFt
U2NoZWR1bGVyOjpjYWxsT25Xb3JrZXJUaHJlYWQpOgorICAgICAgICAoV2ViQ29yZTo6Q3VybFN0
cmVhbVNjaGVkdWxlcjo6Y2FsbENsaWVudE9uTWFpblRocmVhZCk6CisgICAgICAgIChXZWJDb3Jl
OjpDdXJsU3RyZWFtU2NoZWR1bGVyOjpzdGFydFRocmVhZElmTmVlZGVkKToKKyAgICAgICAgKFdl
YkNvcmU6OkN1cmxTdHJlYW1TY2hlZHVsZXI6OnN0b3BUaHJlYWRJZk5vTW9yZUpvYlJ1bm5pbmcp
OgorICAgICAgICAoV2ViQ29yZTo6Q3VybFN0cmVhbVNjaGVkdWxlcjo6ZXhlY3V0ZVRhc2tzKToK
KyAgICAgICAgKFdlYkNvcmU6OkN1cmxTdHJlYW1TY2hlZHVsZXI6OndvcmtlclRocmVhZCk6Cisg
ICAgICAgICogcGxhdGZvcm0vbmV0d29yay9jdXJsL0N1cmxTdHJlYW1TY2hlZHVsZXIuaDogQWRk
ZWQuCisgICAgICAgICogcGxhdGZvcm0vbmV0d29yay9jdXJsL1NvY2tldFN0cmVhbUhhbmRsZUlt
cGwuaDoKKyAgICAgICAgKFdlYkNvcmU6OlNvY2tldFN0cmVhbUhhbmRsZUltcGw6OmlzU3RyZWFt
SW52YWxpZGF0ZWQpOgorICAgICAgICAqIHBsYXRmb3JtL25ldHdvcmsvY3VybC9Tb2NrZXRTdHJl
YW1IYW5kbGVJbXBsQ3VybC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpTb2NrZXRTdHJlYW1IYW5k
bGVJbXBsOjpTb2NrZXRTdHJlYW1IYW5kbGVJbXBsKToKKyAgICAgICAgKFdlYkNvcmU6OlNvY2tl
dFN0cmVhbUhhbmRsZUltcGw6On5Tb2NrZXRTdHJlYW1IYW5kbGVJbXBsKToKKyAgICAgICAgKFdl
YkNvcmU6OlNvY2tldFN0cmVhbUhhbmRsZUltcGw6OnBsYXRmb3JtU2VuZEludGVybmFsKToKKyAg
ICAgICAgKFdlYkNvcmU6OlNvY2tldFN0cmVhbUhhbmRsZUltcGw6OnBsYXRmb3JtQ2xvc2UpOgor
ICAgICAgICAoV2ViQ29yZTo6U29ja2V0U3RyZWFtSGFuZGxlSW1wbDo6ZGlkT3Blbik6CisgICAg
ICAgIChXZWJDb3JlOjpTb2NrZXRTdHJlYW1IYW5kbGVJbXBsOjpkaWRTZW5kRGF0YSk6CisgICAg
ICAgIChXZWJDb3JlOjpTb2NrZXRTdHJlYW1IYW5kbGVJbXBsOjpkaWRSZWNlaXZlRGF0YSk6Cisg
ICAgICAgIChXZWJDb3JlOjpTb2NrZXRTdHJlYW1IYW5kbGVJbXBsOjpkaWRGYWlsKToKKyAgICAg
ICAgKFdlYkNvcmU6OlNvY2tldFN0cmVhbUhhbmRsZUltcGw6OmRlc3RydWN0U3RyZWFtKToKKyAg
ICAgICAgKFdlYkNvcmU6OlNvY2tldFN0cmVhbUhhbmRsZUltcGw6OnRocmVhZEVudHJ5UG9pbnQp
OiBEZWxldGVkLgorICAgICAgICAoV2ViQ29yZTo6U29ja2V0U3RyZWFtSGFuZGxlSW1wbDo6aGFu
ZGxlRXJyb3IpOiBEZWxldGVkLgorICAgICAgICAoV2ViQ29yZTo6U29ja2V0U3RyZWFtSGFuZGxl
SW1wbDo6c3RvcFRocmVhZCk6IERlbGV0ZWQuCisgICAgICAgIChXZWJDb3JlOjpTb2NrZXRTdHJl
YW1IYW5kbGVJbXBsOjpjYWxsT25Xb3JrZXJUaHJlYWQpOiBEZWxldGVkLgorICAgICAgICAoV2Vi
Q29yZTo6U29ja2V0U3RyZWFtSGFuZGxlSW1wbDo6ZXhlY3V0ZVRhc2tzKTogRGVsZXRlZC4KKwog
MjAyMC0wMi0xMiAgWXVzdWtlIFN1enVraSAgPHlzdXp1a2lAYXBwbGUuY29tPgogCiAgICAgICAg
IENTU1ZhbHVlUG9vbCdzIGNvbnN0YW50IENTUyB2YWx1ZXMgc2hvdWxkIG5vdCBiZSBhbGxvY2F0
ZWQgZHluYW1pY2FsbHkgKGFuZCBzYW1lIGZvciBWZWN0b3JzKQpkaWZmIC0tZ2l0IGEvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vQ3VybC5jbWFrZSBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL0N1
cmwuY21ha2UKaW5kZXggZjY4OTRhYzNlZjQxZWVmMDM4YzcxN2Q1MDIwNWRjOGU0YzdmYzJjNS4u
ZWRkYjVmYWMyZjM1YjhkNThjZDNjMDFkZTQ5NWQ5NTk0OWE3NzQwMSAxMDA2NDQKLS0tIGEvU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vQ3VybC5jbWFrZQorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9DdXJsLmNtYWtlCkBAIC0yMiw2ICsyMiw4IEBAIGxpc3QoQVBQRU5EIFdlYkNvcmVfU09V
UkNFUwogICAgIHBsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsUmVzb3VyY2VIYW5kbGVEZWxlZ2F0
ZS5jcHAKICAgICBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybFNTTEhhbmRsZS5jcHAKICAgICBw
bGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybFNTTFZlcmlmaWVyLmNwcAorICAgIHBsYXRmb3JtL25l
dHdvcmsvY3VybC9DdXJsU3RyZWFtLmNwcAorICAgIHBsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJs
U3RyZWFtU2NoZWR1bGVyLmNwcAogICAgIHBsYXRmb3JtL25ldHdvcmsvY3VybC9ETlNSZXNvbHZl
UXVldWVDdXJsLmNwcAogICAgIHBsYXRmb3JtL25ldHdvcmsvY3VybC9OZXR3b3JrU3RvcmFnZVNl
c3Npb25DdXJsLmNwcAogICAgIHBsYXRmb3JtL25ldHdvcmsvY3VybC9PcGVuU1NMSGVscGVyLmNw
cApAQCAtNTgsNiArNjAsOCBAQCBsaXN0KEFQUEVORCBXZWJDb3JlX1BSSVZBVEVfRlJBTUVXT1JL
X0hFQURFUlMKICAgICBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybFJlc3BvbnNlLmgKICAgICBw
bGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybFNTTEhhbmRsZS5oCiAgICAgcGxhdGZvcm0vbmV0d29y
ay9jdXJsL0N1cmxTU0xWZXJpZmllci5oCisgICAgcGxhdGZvcm0vbmV0d29yay9jdXJsL0N1cmxT
dHJlYW0uaAorICAgIHBsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsU3RyZWFtU2NoZWR1bGVyLmgK
ICAgICBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvRE5TUmVzb2x2ZVF1ZXVlQ3VybC5oCiAgICAgcGxh
dGZvcm0vbmV0d29yay9jdXJsL0Rvd25sb2FkQnVuZGxlLmgKICAgICBwbGF0Zm9ybS9uZXR3b3Jr
L2N1cmwvT3BlblNTTEhlbHBlci5oCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9uZXR3b3JrL2N1cmwvQ3VybENvbnRleHQuY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
bmV0d29yay9jdXJsL0N1cmxDb250ZXh0LmNwcAppbmRleCA3MTExNWFjZDUxOTAzNTU1MWI4Mzk0
YzNmYjE5YzNiMTMzYzI3NjM4Li4xNDY0ZWIwYzJlZjkzMjMzZmMwNDVhYzUwZWRjMzQ0NzBmNDZl
NTBlIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3Vy
bENvbnRleHQuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9D
dXJsQ29udGV4dC5jcHAKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlICJDdXJsUmVxdWVzdFNj
aGVkdWxlci5oIgogI2luY2x1ZGUgIkN1cmxTU0xIYW5kbGUuaCIKICNpbmNsdWRlICJDdXJsU1NM
VmVyaWZpZXIuaCIKKyNpbmNsdWRlICJDdXJsU3RyZWFtU2NoZWR1bGVyLmgiCiAjaW5jbHVkZSAi
SFRUUEhlYWRlck1hcC5oIgogI2luY2x1ZGUgPE5ldHdvcmtMb2FkTWV0cmljcy5oPgogI2luY2x1
ZGUgPG11dGV4PgpAQCAtMTQ2LDYgKzE0NywxMiBAQCB2b2lkIEN1cmxDb250ZXh0Ojppbml0U2hh
cmVIYW5kbGUoKQogICAgIGN1cmxfZWFzeV9jbGVhbnVwKGN1cmwpOwogfQogCitDdXJsU3RyZWFt
U2NoZWR1bGVyJiBDdXJsQ29udGV4dDo6c3RyZWFtU2NoZWR1bGVyKCkKK3sKKyAgICBzdGF0aWMg
TmV2ZXJEZXN0cm95ZWQ8Q3VybFN0cmVhbVNjaGVkdWxlcj4gc2hhcmVkSW5zdGFuY2U7CisgICAg
cmV0dXJuIHNoYXJlZEluc3RhbmNlOworfQorCiBib29sIEN1cmxDb250ZXh0Ojppc0h0dHAyRW5h
YmxlZCgpIGNvbnN0CiB7CiAgICAgY3VybF92ZXJzaW9uX2luZm9fZGF0YSogZGF0YSA9IGN1cmxf
dmVyc2lvbl9pbmZvKENVUkxWRVJTSU9OX05PVyk7CkBAIC04ODgsMTE0ICs4OTUsMjUgQEAgdm9p
ZCBDdXJsSGFuZGxlOjplbmFibGVTdGRFcnJJZlVzZWQoKQogCiAjZW5kaWYKIAotLy8gQ3VybFNv
Y2tldEhhbmRsZQotCi1DdXJsU29ja2V0SGFuZGxlOjpDdXJsU29ja2V0SGFuZGxlKGNvbnN0IFVS
TCYgdXJsLCBGdW5jdGlvbjx2b2lkKENVUkxjb2RlKT4mJiBlcnJvckhhbmRsZXIpCi0gICAgOiBt
X2Vycm9ySGFuZGxlcihXVEZNb3ZlKGVycm9ySGFuZGxlcikpCitFeHBlY3RlZDxjdXJsX3NvY2tl
dF90LCBDVVJMY29kZT4gQ3VybEhhbmRsZTo6Z2V0QWN0aXZlU29ja2V0KCkKIHsKLSAgICAvLyBM
aWJjdXJsIGlzIG5vdCByZXNwb25zaWJsZSBmb3IgdGhlIHByb3RvY29sIGhhbmRsaW5nLiBJdCBq
dXN0IGhhbmRsZXMgY29ubmVjdGlvbi4KLSAgICAvLyBPbmx5IHNjaGVtZSwgaG9zdCBhbmQgcG9y
dCBpcyByZXF1aXJlZC4KLSAgICBVUkwgdXJsRm9yQ29ubmVjdGlvbjsKLSAgICB1cmxGb3JDb25u
ZWN0aW9uLnNldFByb3RvY29sKHVybC5wcm90b2NvbElzKCJ3c3MiKSA/ICJodHRwcyIgOiAiaHR0
cCIpOwotICAgIHVybEZvckNvbm5lY3Rpb24uc2V0SG9zdEFuZFBvcnQodXJsLmhvc3RBbmRQb3J0
KCkpOwotICAgIHNldFVybCh1cmxGb3JDb25uZWN0aW9uKTsKLQotICAgIGVuYWJsZUNvbm5lY3Rp
b25Pbmx5KCk7Ci19CisgICAgY3VybF9zb2NrZXRfdCBzb2NrZXQ7CiAKLWJvb2wgQ3VybFNvY2tl
dEhhbmRsZTo6Y29ubmVjdCgpCi17Ci0gICAgQ1VSTGNvZGUgZXJyb3JDb2RlID0gcGVyZm9ybSgp
OwotICAgIGlmIChlcnJvckNvZGUgIT0gQ1VSTEVfT0spIHsKLSAgICAgICAgbV9lcnJvckhhbmRs
ZXIoZXJyb3JDb2RlKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KKyAgICBDVVJMY29k
ZSBlcnJvckNvZGUgPSBjdXJsX2Vhc3lfZ2V0aW5mbyhtX2hhbmRsZSwgQ1VSTElORk9fQUNUSVZF
U09DS0VULCAmc29ja2V0KTsKKyAgICBpZiAoZXJyb3JDb2RlICE9IENVUkxFX09LKQorICAgICAg
ICByZXR1cm4gbWFrZVVuZXhwZWN0ZWQoZXJyb3JDb2RlKTsKIAotICAgIHJldHVybiB0cnVlOwor
ICAgIHJldHVybiBzb2NrZXQ7CiB9CiAKLXNpemVfdCBDdXJsU29ja2V0SGFuZGxlOjpzZW5kKGNv
bnN0IHVpbnQ4X3QqIGJ1ZmZlciwgc2l6ZV90IHNpemUpCitDVVJMY29kZSBDdXJsSGFuZGxlOjpz
ZW5kKGNvbnN0IHVpbnQ4X3QqIGJ1ZmZlciwgc2l6ZV90IGJ1ZmZlclNpemUsIHNpemVfdCYgYnl0
ZXNTZW50KQogewotICAgIHNpemVfdCB0b3RhbEJ5dGVzU2VudCA9IDA7Ci0KLSAgICB3aGlsZSAo
dG90YWxCeXRlc1NlbnQgPCBzaXplKSB7Ci0gICAgICAgIHNpemVfdCBieXRlc1NlbnQgPSAwOwot
ICAgICAgICBDVVJMY29kZSBlcnJvckNvZGUgPSBjdXJsX2Vhc3lfc2VuZChoYW5kbGUoKSwgYnVm
ZmVyICsgdG90YWxCeXRlc1NlbnQsIHNpemUgLSB0b3RhbEJ5dGVzU2VudCwgJmJ5dGVzU2VudCk7
Ci0gICAgICAgIGlmIChlcnJvckNvZGUgIT0gQ1VSTEVfT0spIHsKLSAgICAgICAgICAgIGlmIChl
cnJvckNvZGUgIT0gQ1VSTEVfQUdBSU4pCi0gICAgICAgICAgICAgICAgbV9lcnJvckhhbmRsZXIo
ZXJyb3JDb2RlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgdG90
YWxCeXRlc1NlbnQgKz0gYnl0ZXNTZW50OwotICAgIH0KLQotICAgIHJldHVybiB0b3RhbEJ5dGVz
U2VudDsKKyAgICByZXR1cm4gY3VybF9lYXN5X3NlbmQobV9oYW5kbGUsIGJ1ZmZlciwgYnVmZmVy
U2l6ZSwgJmJ5dGVzU2VudCk7CiB9CiAKLU9wdGlvbmFsPHNpemVfdD4gQ3VybFNvY2tldEhhbmRs
ZTo6cmVjZWl2ZSh1aW50OF90KiBidWZmZXIsIHNpemVfdCBidWZmZXJTaXplKQorQ1VSTGNvZGUg
Q3VybEhhbmRsZTo6cmVjZWl2ZSh1aW50OF90KiBidWZmZXIsIHNpemVfdCBidWZmZXJTaXplLCBz
aXplX3QmIGJ5dGVzUmVhZCkKIHsKLSAgICBzaXplX3QgYnl0ZXNSZWFkID0gMDsKLQotICAgIENV
Ukxjb2RlIGVycm9yQ29kZSA9IGN1cmxfZWFzeV9yZWN2KGhhbmRsZSgpLCBidWZmZXIsIGJ1ZmZl
clNpemUsICZieXRlc1JlYWQpOwotICAgIGlmIChlcnJvckNvZGUgIT0gQ1VSTEVfT0spIHsKLSAg
ICAgICAgaWYgKGVycm9yQ29kZSAhPSBDVVJMRV9BR0FJTikKLSAgICAgICAgICAgIG1fZXJyb3JI
YW5kbGVyKGVycm9yQ29kZSk7Ci0KLSAgICAgICAgcmV0dXJuIFdURjo6bnVsbG9wdDsKLSAgICB9
Ci0KLSAgICByZXR1cm4gYnl0ZXNSZWFkOwotfQotCi1PcHRpb25hbDxDdXJsU29ja2V0SGFuZGxl
OjpXYWl0UmVzdWx0PiBDdXJsU29ja2V0SGFuZGxlOjp3YWl0KGNvbnN0IFNlY29uZHMmIHRpbWVv
dXQsIGJvb2wgYWxzb1dhaXRGb3JXcml0ZSkKLXsKLSAgICBjdXJsX3NvY2tldF90IHNvY2tldDsK
LSAgICBDVVJMY29kZSBlcnJvckNvZGUgPSBjdXJsX2Vhc3lfZ2V0aW5mbyhoYW5kbGUoKSwgQ1VS
TElORk9fQUNUSVZFU09DS0VULCAmc29ja2V0KTsKLSAgICBpZiAoZXJyb3JDb2RlICE9IENVUkxF
X09LKSB7Ci0gICAgICAgIG1fZXJyb3JIYW5kbGVyKGVycm9yQ29kZSk7Ci0gICAgICAgIHJldHVy
biBXVEY6Om51bGxvcHQ7Ci0gICAgfQotCi0gICAgaW50NjRfdCB1c2VjID0gdGltZW91dC5taWNy
b3NlY29uZHNBczxpbnQ2NF90PigpOwotCi0gICAgc3RydWN0IHRpbWV2YWwgc2VsZWN0VGltZW91
dDsKLSAgICBpZiAodXNlYyA8PSAwKSB7Ci0gICAgICAgIHNlbGVjdFRpbWVvdXQudHZfc2VjID0g
MDsKLSAgICAgICAgc2VsZWN0VGltZW91dC50dl91c2VjID0gMDsKLSAgICB9IGVsc2UgewotICAg
ICAgICBzZWxlY3RUaW1lb3V0LnR2X3NlYyA9IHVzZWMgLyAxMDAwMDAwOwotICAgICAgICBzZWxl
Y3RUaW1lb3V0LnR2X3VzZWMgPSB1c2VjICUgMTAwMDAwMDsKLSAgICB9Ci0KLSAgICBpbnQgcmMg
PSAwOwotICAgIGludCBtYXhmZCA9IHN0YXRpY19jYXN0PGludD4oc29ja2V0KSArIDE7Ci0gICAg
ZmRfc2V0IGZkcmVhZDsKLSAgICBmZF9zZXQgZmR3cml0ZTsKLSAgICBmZF9zZXQgZmRlcnI7Ci0K
LSAgICAvLyBSZXRyeSAnc2VsZWN0JyBpZiBpdCB3YXMgaW50ZXJydXB0ZWQgYnkgYSBwcm9jZXNz
IHNpZ25hbC4KLSAgICBkbyB7Ci0gICAgICAgIEZEX1pFUk8oJmZkcmVhZCk7Ci0gICAgICAgIEZE
X1NFVChzb2NrZXQsICZmZHJlYWQpOwotCi0gICAgICAgIEZEX1pFUk8oJmZkd3JpdGUpOwotICAg
ICAgICBpZiAoYWxzb1dhaXRGb3JXcml0ZSkKLSAgICAgICAgICAgIEZEX1NFVChzb2NrZXQsICZm
ZHdyaXRlKTsKLQotICAgICAgICBGRF9aRVJPKCZmZGVycik7Ci0gICAgICAgIEZEX1NFVChzb2Nr
ZXQsICZmZGVycik7Ci0KLSAgICAgICAgcmMgPSA6OnNlbGVjdChtYXhmZCwgJmZkcmVhZCwgJmZk
d3JpdGUsICZmZGVyciwgJnNlbGVjdFRpbWVvdXQpOwotICAgIH0gd2hpbGUgKHJjID09IC0xICYm
IGVycm5vID09IEVJTlRSKTsKLQotICAgIGlmIChyYyA8PSAwKQotICAgICAgICByZXR1cm4gV1RG
OjpudWxsb3B0OwotCi0gICAgV2FpdFJlc3VsdCByZXN1bHQ7Ci0gICAgcmVzdWx0LnJlYWRhYmxl
ID0gRkRfSVNTRVQoc29ja2V0LCAmZmRyZWFkKSB8fCBGRF9JU1NFVChzb2NrZXQsICZmZGVycik7
Ci0gICAgcmVzdWx0LndyaXRhYmxlID0gRkRfSVNTRVQoc29ja2V0LCAmZmR3cml0ZSk7Ci0gICAg
cmV0dXJuIHJlc3VsdDsKKyAgICByZXR1cm4gY3VybF9lYXN5X3JlY3YobV9oYW5kbGUsIGJ1ZmZl
ciwgYnVmZmVyU2l6ZSwgJmJ5dGVzUmVhZCk7CiB9CiAKIH0KZGlmZiAtLWdpdCBhL1NvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsQ29udGV4dC5oIGIvU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0N1cmxDb250ZXh0LmgKaW5kZXggYTRmOGMwMjgyNzY3
YjBiNDg3NzBhMDQ4ZWU4NTJmMTY2ZTA3YTdmNS4uM2M5MGU0YjFlY2M5ZTZiNDFmNzFiNjc2MDAz
ZTM2OWYxODYyMDk4OCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29y
ay9jdXJsL0N1cmxDb250ZXh0LmgKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29y
ay9jdXJsL0N1cmxDb250ZXh0LmgKQEAgLTg5LDYgKzg5LDcgQEAgcHJpdmF0ZToKIC8vIEN1cmxD
b250ZXh0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIGNs
YXNzIEN1cmxSZXF1ZXN0U2NoZWR1bGVyOworY2xhc3MgQ3VybFN0cmVhbVNjaGVkdWxlcjsKIAog
Y2xhc3MgQ3VybENvbnRleHQgOiBwdWJsaWMgQ3VybEdsb2JhbCB7CiAgICAgV1RGX01BS0VfTk9O
Q09QWUFCTEUoQ3VybENvbnRleHQpOwpAQCAtMTAxLDYgKzEwMiw3IEBAIHB1YmxpYzoKICAgICBj
b25zdCBDdXJsU2hhcmVIYW5kbGUmIHNoYXJlSGFuZGxlKCkgeyByZXR1cm4gbV9zaGFyZUhhbmRs
ZTsgfQogCiAgICAgQ3VybFJlcXVlc3RTY2hlZHVsZXImIHNjaGVkdWxlcigpIHsgcmV0dXJuICpt
X3NjaGVkdWxlcjsgfQorICAgIEN1cmxTdHJlYW1TY2hlZHVsZXImIHN0cmVhbVNjaGVkdWxlcigp
OwogCiAgICAgLy8gUHJveHkKICAgICBjb25zdCBDdXJsUHJveHlTZXR0aW5ncyYgcHJveHlTZXR0
aW5ncygpIGNvbnN0IHsgcmV0dXJuIG1fcHJveHlTZXR0aW5nczsgfQpAQCAtMjkzLDYgKzI5NSwx
MSBAQCBwdWJsaWM6CiAKICAgICBzdGF0aWMgbG9uZyBsb25nIG1heEN1cmxPZmZUKCk7CiAKKyAg
ICAvLyBzb2NrZXQKKyAgICBFeHBlY3RlZDxjdXJsX3NvY2tldF90LCBDVVJMY29kZT4gZ2V0QWN0
aXZlU29ja2V0KCk7CisgICAgQ1VSTGNvZGUgc2VuZChjb25zdCB1aW50OF90Kiwgc2l6ZV90LCBz
aXplX3QmKTsKKyAgICBDVVJMY29kZSByZWNlaXZlKHVpbnQ4X3QqLCBzaXplX3QsIHNpemVfdCYp
OworCiAjaWZuZGVmIE5ERUJVRwogICAgIHZvaWQgZW5hYmxlVmVyYm9zZUlmVXNlZCgpOwogICAg
IHZvaWQgZW5hYmxlU3RkRXJySWZVc2VkKCk7CkBAIC0zMTMsMjQgKzMyMCw0IEBAIHByaXZhdGU6
CiAgICAgc3RkOjp1bmlxdWVfcHRyPEN1cmxTU0xWZXJpZmllcj4gbV9zc2xWZXJpZmllcjsKIH07
CiAKLWNsYXNzIEN1cmxTb2NrZXRIYW5kbGUgOiBwdWJsaWMgQ3VybEhhbmRsZSB7Ci0gICAgV1RG
X01BS0VfTk9OQ09QWUFCTEUoQ3VybFNvY2tldEhhbmRsZSk7Ci0KLXB1YmxpYzoKLSAgICBzdHJ1
Y3QgV2FpdFJlc3VsdCB7Ci0gICAgICAgIGJvb2wgcmVhZGFibGUgeyBmYWxzZSB9OwotICAgICAg
ICBib29sIHdyaXRhYmxlIHsgZmFsc2UgfTsKLSAgICB9OwotCi0gICAgQ3VybFNvY2tldEhhbmRs
ZShjb25zdCBVUkwmLCBGdW5jdGlvbjx2b2lkKENVUkxjb2RlKT4mJiBlcnJvckhhbmRsZXIpOwot
Ci0gICAgYm9vbCBjb25uZWN0KCk7Ci0gICAgc2l6ZV90IHNlbmQoY29uc3QgdWludDhfdCosIHNp
emVfdCk7Ci0gICAgT3B0aW9uYWw8c2l6ZV90PiByZWNlaXZlKHVpbnQ4X3QqLCBzaXplX3QpOwot
ICAgIE9wdGlvbmFsPFdhaXRSZXN1bHQ+IHdhaXQoY29uc3QgU2Vjb25kcyYgdGltZW91dCwgYm9v
bCBhbHNvV2FpdEZvcldyaXRlKTsKLQotcHJpdmF0ZToKLSAgICBGdW5jdGlvbjx2b2lkKENVUkxj
b2RlKT4gbV9lcnJvckhhbmRsZXI7Ci19OwotCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYg
LS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybFN0cmVhbS5j
cHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybFN0cmVhbS5jcHAK
bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMC4uYzk4OTA5NzQ0OWQ2MTkxNjBmYTMzNDJjMjFiZWI5YzljZWVjNDQ2MAotLS0g
L2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJs
U3RyZWFtLmNwcApAQCAtMCwwICsxLDE5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBT
b255IEludGVyYWN0aXZlIEVudGVydGFpbm1lbnQgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMg
YGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRS
SUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUg
ImNvbmZpZy5oIgorI2luY2x1ZGUgIkN1cmxTdHJlYW0uaCIKKworI2luY2x1ZGUgIkN1cmxTdHJl
YW1TY2hlZHVsZXIuaCIKKyNpbmNsdWRlICJTb2NrZXRTdHJlYW1FcnJvci5oIgorCisjaWYgVVNF
KENVUkwpCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworQ3VybFN0cmVhbTo6Q3VybFN0cmVhbShD
dXJsU3RyZWFtU2NoZWR1bGVyJiBzY2hlZHVsZXIsIEN1cmxTdHJlYW1JRCBzdHJlYW1JRCwgVVJM
JiYgdXJsKQorICAgIDogbV9zY2hlZHVsZXIoc2NoZWR1bGVyKQorICAgICwgbV9zdHJlYW1JRChz
dHJlYW1JRCkKKyAgICAsIG1fdXJsKFdURk1vdmUodXJsKSkKK3sKKyAgICBBU1NFUlQoIWlzTWFp
blRocmVhZCgpKTsKKworICAgIG1fY3VybEhhbmRsZSA9IFdURjo6bWFrZVVuaXF1ZTxDdXJsSGFu
ZGxlPigpOworCisgICAgLy8gTGliY3VybCBpcyBub3QgcmVzcG9uc2libGUgZm9yIHRoZSBwcm90
b2NvbCBoYW5kbGluZy4gSXQganVzdCBoYW5kbGVzIGNvbm5lY3Rpb24uCisgICAgLy8gT25seSBz
Y2hlbWUsIGhvc3QgYW5kIHBvcnQgaXMgcmVxdWlyZWQuCisgICAgVVJMIHVybEZvckNvbm5lY3Rp
b247CisgICAgdXJsRm9yQ29ubmVjdGlvbi5zZXRQcm90b2NvbChtX3VybC5wcm90b2NvbElzKCJ3
c3MiKSA/ICJodHRwcyIgOiAiaHR0cCIpOworICAgIHVybEZvckNvbm5lY3Rpb24uc2V0SG9zdEFu
ZFBvcnQobV91cmwuaG9zdEFuZFBvcnQoKSk7CisgICAgbV9jdXJsSGFuZGxlLT5zZXRVcmwodXJs
Rm9yQ29ubmVjdGlvbik7CisKKyAgICBtX2N1cmxIYW5kbGUtPmVuYWJsZUNvbm5lY3Rpb25Pbmx5
KCk7CisKKyAgICBhdXRvIGVycm9yQ29kZSA9IG1fY3VybEhhbmRsZS0+cGVyZm9ybSgpOworICAg
IGlmIChlcnJvckNvZGUgIT0gQ1VSTEVfT0spIHsKKyAgICAgICAgbm90aWZ5RmFpbHVyZShlcnJv
ckNvZGUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbV9zY2hlZHVsZXIuY2FsbENs
aWVudE9uTWFpblRocmVhZChtX3N0cmVhbUlELCBbc3RyZWFtSUQgPSBtX3N0cmVhbUlEXShDbGll
bnQmIGNsaWVudCkgeworICAgICAgICBjbGllbnQuZGlkT3BlbihzdHJlYW1JRCk7CisgICAgfSk7
Cit9CisKK0N1cmxTdHJlYW06On5DdXJsU3RyZWFtKCkKK3sKKyAgICBBU1NFUlQoIWlzTWFpblRo
cmVhZCgpKTsKKyAgICBkZXN0cm95SGFuZGxlKCk7Cit9CisKK3ZvaWQgQ3VybFN0cmVhbTo6ZGVz
dHJveUhhbmRsZSgpCit7CisgICAgaWYgKCFtX2N1cmxIYW5kbGUpCisgICAgICAgIHJldHVybjsK
KworICAgIG1fY3VybEhhbmRsZSA9IG51bGxwdHI7Cit9CisKK3ZvaWQgQ3VybFN0cmVhbTo6c2Vu
ZChVbmlxdWVBcnJheTx1aW50OF90PiYmIGJ1ZmZlciwgc2l6ZV90IGxlbmd0aCkKK3sKKyAgICBB
U1NFUlQoIWlzTWFpblRocmVhZCgpKTsKKworICAgIGlmICghbV9jdXJsSGFuZGxlKQorICAgICAg
ICByZXR1cm47CisKKyAgICBtX3NlbmRCdWZmZXJzLmFwcGVuZChzdGQ6Om1ha2VfcGFpcihXVEZN
b3ZlKGJ1ZmZlciksIGxlbmd0aCkpOworfQorCit2b2lkIEN1cmxTdHJlYW06OmFwcGVuZE1vbml0
b3JpbmdGZChmZF9zZXQmIHJlYWRmZHMsIGZkX3NldCYgd3JpdGVmZHMsIGZkX3NldCYgZXhjZXB0
ZmRzLCBpbnQmIG1heGZkKQoreworICAgIEFTU0VSVCghaXNNYWluVGhyZWFkKCkpOworCisgICAg
aWYgKCFtX2N1cmxIYW5kbGUpCisgICAgICAgIHJldHVybjsKKworICAgIGF1dG8gc29ja2V0ID0g
bV9jdXJsSGFuZGxlLT5nZXRBY3RpdmVTb2NrZXQoKTsKKyAgICBpZiAoIXNvY2tldC5oYXNfdmFs
dWUoKSkgeworICAgICAgICBub3RpZnlGYWlsdXJlKHNvY2tldC5lcnJvcigpKTsKKyAgICAgICAg
cmV0dXJuOworICAgIH0KKworICAgIEZEX1NFVCgqc29ja2V0LCAmcmVhZGZkcyk7CisgICAgRkRf
U0VUKCpzb2NrZXQsICZleGNlcHRmZHMpOworCisgICAgaWYgKG1fc2VuZEJ1ZmZlcnMuc2l6ZSgp
KQorICAgICAgICBGRF9TRVQoKnNvY2tldCwgJndyaXRlZmRzKTsKKworICAgIGlmIChtYXhmZCA8
ICpzb2NrZXQpCisgICAgICAgIG1heGZkID0gKnNvY2tldDsKK30KKwordm9pZCBDdXJsU3RyZWFt
Ojp0cnlUb1RyYW5zZmVyKGNvbnN0IGZkX3NldCYgcmVhZGZkcywgY29uc3QgZmRfc2V0JiB3cml0
ZWZkcywgY29uc3QgZmRfc2V0JiBleGNlcHRmZHMpCit7CisgICAgQVNTRVJUKCFpc01haW5UaHJl
YWQoKSk7CisKKyAgICBpZiAoIW1fY3VybEhhbmRsZSkKKyAgICAgICAgcmV0dXJuOworCisgICAg
YXV0byBzb2NrZXQgPSBtX2N1cmxIYW5kbGUtPmdldEFjdGl2ZVNvY2tldCgpOworICAgIGlmICgh
c29ja2V0Lmhhc192YWx1ZSgpKSB7CisgICAgICAgIG5vdGlmeUZhaWx1cmUoc29ja2V0LmVycm9y
KCkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKEZEX0lTU0VUKCpzb2NrZXQs
ICZyZWFkZmRzKSB8fCBGRF9JU1NFVCgqc29ja2V0LCAmZXhjZXB0ZmRzKSkKKyAgICAgICAgdHJ5
VG9SZWNlaXZlKCk7CisKKyAgICBpZiAoRkRfSVNTRVQoKnNvY2tldCwgJndyaXRlZmRzKSkKKyAg
ICAgICAgdHJ5VG9TZW5kKCk7Cit9CisKK3ZvaWQgQ3VybFN0cmVhbTo6dHJ5VG9SZWNlaXZlKCkK
K3sKKyAgICBpZiAoIW1fY3VybEhhbmRsZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgYXV0byBy
ZWNlaXZlQnVmZmVyID0gbWFrZVVuaXF1ZUFycmF5PHVpbnQ4X3Q+KGtSZWNlaXZlQnVmZmVyU2l6
ZSk7CisgICAgc2l6ZV90IGJ5dGVzUmVjZWl2ZWQgPSAwOworCisgICAgYXV0byBlcnJvckNvZGUg
PSBtX2N1cmxIYW5kbGUtPnJlY2VpdmUocmVjZWl2ZUJ1ZmZlci5nZXQoKSwga1JlY2VpdmVCdWZm
ZXJTaXplLCBieXRlc1JlY2VpdmVkKTsKKyAgICBpZiAoZXJyb3JDb2RlICE9IENVUkxFX09LKSB7
CisgICAgICAgIGlmIChlcnJvckNvZGUgIT0gQ1VSTEVfQUdBSU4pCisgICAgICAgICAgICBub3Rp
ZnlGYWlsdXJlKGVycm9yQ29kZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyAw
IGJ5dGVzIGluZGljYXRlcyBhIGNsb3NlZCBjb25uZWN0aW9uLgorICAgIGlmICghYnl0ZXNSZWNl
aXZlZCkKKyAgICAgICAgZGVzdHJveUhhbmRsZSgpOworCisgICAgbV9zY2hlZHVsZXIuY2FsbENs
aWVudE9uTWFpblRocmVhZChtX3N0cmVhbUlELCBbc3RyZWFtSUQgPSBtX3N0cmVhbUlELCBidWZm
ZXIgPSBXVEZNb3ZlKHJlY2VpdmVCdWZmZXIpLCBsZW5ndGggPSBieXRlc1JlY2VpdmVkXShDbGll
bnQmIGNsaWVudCkgbXV0YWJsZSB7CisgICAgICAgIGNsaWVudC5kaWRSZWNlaXZlRGF0YShzdHJl
YW1JRCwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oYnVmZmVyLmdldCgpKSwgbGVuZ3Ro
KTsKKyAgICB9KTsKK30KKwordm9pZCBDdXJsU3RyZWFtOjp0cnlUb1NlbmQoKQoreworICAgIGlm
ICghbV9jdXJsSGFuZGxlIHx8ICFtX3NlbmRCdWZmZXJzLnNpemUoKSkKKyAgICAgICAgcmV0dXJu
OworCisgICAgYXV0byYgW2J1ZmZlciwgbGVuZ3RoXSA9IG1fc2VuZEJ1ZmZlcnMuZmlyc3QoKTsK
KyAgICBzaXplX3QgYnl0ZXNTZW50ID0gMDsKKworICAgIGF1dG8gZXJyb3JDb2RlID0gbV9jdXJs
SGFuZGxlLT5zZW5kKGJ1ZmZlci5nZXQoKSArIG1fc2VuZEJ1ZmZlck9mZnNldCwgbGVuZ3RoIC0g
bV9zZW5kQnVmZmVyT2Zmc2V0LCBieXRlc1NlbnQpOworICAgIGlmIChlcnJvckNvZGUgIT0gQ1VS
TEVfT0spIHsKKyAgICAgICAgaWYgKGVycm9yQ29kZSAhPSBDVVJMRV9BR0FJTikKKyAgICAgICAg
ICAgIG5vdGlmeUZhaWx1cmUoZXJyb3JDb2RlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKwor
ICAgIG1fc2VuZEJ1ZmZlck9mZnNldCArPSBieXRlc1NlbnQ7CisKKyAgICBpZiAobV9zZW5kQnVm
ZmVyT2Zmc2V0ID49IGxlbmd0aCkgeworICAgICAgICBtX3NlbmRCdWZmZXJzLnJlbW92ZSgwKTsK
KyAgICAgICAgbV9zZW5kQnVmZmVyT2Zmc2V0ID0gMDsKKyAgICB9CisKKyAgICBtX3NjaGVkdWxl
ci5jYWxsQ2xpZW50T25NYWluVGhyZWFkKG1fc3RyZWFtSUQsIFtzdHJlYW1JRCA9IG1fc3RyZWFt
SUQsIGxlbmd0aCA9IGJ5dGVzU2VudF0oQ2xpZW50JiBjbGllbnQpIHsKKyAgICAgICAgY2xpZW50
LmRpZFNlbmREYXRhKHN0cmVhbUlELCBsZW5ndGgpOworICAgIH0pOworfQorCit2b2lkIEN1cmxT
dHJlYW06Om5vdGlmeUZhaWx1cmUoQ1VSTGNvZGUgZXJyb3JDb2RlKQoreworICAgIGRlc3Ryb3lI
YW5kbGUoKTsKKworICAgIG1fc2NoZWR1bGVyLmNhbGxDbGllbnRPbk1haW5UaHJlYWQobV9zdHJl
YW1JRCwgW3N0cmVhbUlEID0gbV9zdHJlYW1JRCwgZXJyb3JDb2RlXShDbGllbnQmIGNsaWVudCkg
bXV0YWJsZSB7CisgICAgICAgIGNsaWVudC5kaWRGYWlsKHN0cmVhbUlELCBlcnJvckNvZGUpOwor
ICAgIH0pOworfQorCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vbmV0d29yay9jdXJsL0N1cmxTdHJlYW0uaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L25ldHdvcmsvY3VybC9DdXJsU3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uN2I0ZDU1YWY5NDc5NThhMWM4
YzVlZDQ0NzA2NzM5YzI2ZDNlYzRmZQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsU3RyZWFtLmgKQEAgLTAsMCArMSw4NiBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAyMCBTb255IEludGVyYWN0aXZlIEVudGVydGFpbm1lbnQgSW5j
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElO
Qy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRI
RSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VS
RU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJDdXJsQ29udGV4dC5oIgor
I2luY2x1ZGUgPHd0Zi9VUkwuaD4KKyNpbmNsdWRlIDx3dGYvVW5pcXVlQXJyYXkuaD4KKyNpbmNs
dWRlIDx3dGYvVmVjdG9yLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgQ3VybFN0
cmVhbVNjaGVkdWxlcjsKK2NsYXNzIFNvY2tldFN0cmVhbUVycm9yOworCit1c2luZyBDdXJsU3Ry
ZWFtSUQgPSB1aW50MTZfdDsKK2NvbnN0IEN1cmxTdHJlYW1JRCBpbnZhbGlkQ3VybFN0cmVhbUlE
ID0gMDsKKworY2xhc3MgQ3VybFN0cmVhbSB7CisgICAgV1RGX01BS0VfRkFTVF9BTExPQ0FURUQ7
CisgICAgV1RGX01BS0VfTk9OQ09QWUFCTEUoQ3VybFN0cmVhbSk7CitwdWJsaWM6CisgICAgY2xh
c3MgQ2xpZW50IHsKKyAgICBwdWJsaWM6CisgICAgICAgIHZpcnR1YWwgdm9pZCBkaWRPcGVuKEN1
cmxTdHJlYW1JRCkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgZGlkU2VuZERhdGEoQ3VybFN0
cmVhbUlELCBzaXplX3QpID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIGRpZFJlY2VpdmVEYXRh
KEN1cmxTdHJlYW1JRCwgY29uc3QgY2hhciosIHNpemVfdCkgPSAwOworICAgICAgICB2aXJ0dWFs
IHZvaWQgZGlkRmFpbChDdXJsU3RyZWFtSUQsIENVUkxjb2RlKSA9IDA7CisgICAgfTsKKworICAg
IHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8Q3VybFN0cmVhbT4gY3JlYXRlKEN1cmxTdHJlYW1TY2hl
ZHVsZXImIHNjaGVkdWxlciwgQ3VybFN0cmVhbUlEIHN0cmVhbUlELCBVUkwmJiB1cmwpCisgICAg
eworICAgICAgICByZXR1cm4gV1RGOjptYWtlVW5pcXVlPEN1cmxTdHJlYW0+KHNjaGVkdWxlciwg
c3RyZWFtSUQsIFdURk1vdmUodXJsKSk7CisgICAgfQorCisgICAgQ3VybFN0cmVhbShDdXJsU3Ry
ZWFtU2NoZWR1bGVyJiwgQ3VybFN0cmVhbUlELCBVUkwmJik7CisgICAgdmlydHVhbCB+Q3VybFN0
cmVhbSgpOworCisgICAgdm9pZCBzZW5kKFVuaXF1ZUFycmF5PHVpbnQ4X3Q+JiYsIHNpemVfdCk7
CisKKyAgICB2b2lkIGFwcGVuZE1vbml0b3JpbmdGZChmZF9zZXQmLCBmZF9zZXQmLCBmZF9zZXQm
LCBpbnQmKTsKKyAgICB2b2lkIHRyeVRvVHJhbnNmZXIoY29uc3QgZmRfc2V0JiwgY29uc3QgZmRf
c2V0JiwgY29uc3QgZmRfc2V0Jik7CisKK3ByaXZhdGU6CisgICAgdm9pZCBkZXN0cm95SGFuZGxl
KCk7CisKKyAgICB2b2lkIHRyeVRvUmVjZWl2ZSgpOworICAgIHZvaWQgdHJ5VG9TZW5kKCk7CisK
KyAgICB2b2lkIG5vdGlmeUZhaWx1cmUoQ1VSTGNvZGUpOworCisgICAgc3RhdGljIGNvbnN0IHNp
emVfdCBrUmVjZWl2ZUJ1ZmZlclNpemUgPSAxNiAqIDEwMjQ7CisKKyAgICBDdXJsU3RyZWFtU2No
ZWR1bGVyJiBtX3NjaGVkdWxlcjsKKyAgICBDdXJsU3RyZWFtSUQgbV9zdHJlYW1JRDsKKyAgICBV
UkwgbV91cmw7CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q3VybEhhbmRsZT4gbV9jdXJsSGFuZGxl
OworCisgICAgV1RGOjpWZWN0b3I8c3RkOjpwYWlyPFVuaXF1ZUFycmF5PHVpbnQ4X3Q+LCBzaXpl
X3Q+PiBtX3NlbmRCdWZmZXJzOworICAgIHNpemVfdCBtX3NlbmRCdWZmZXJPZmZzZXQgeyAwIH07
Cit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybFN0cmVhbVNjaGVkdWxlci5jcHAgYi9Tb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybFN0cmVhbVNjaGVkdWxlci5jcHAKbmV3
IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMC4uODQ1OGUzYzE0MTY3ZDVjOWI3NWE3NWJkN2U5ZGJkYjFkMTQzNWQ4NQotLS0gL2Rl
di9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsU3Ry
ZWFtU2NoZWR1bGVyLmNwcApAQCAtMCwwICsxLDE5MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAyMCBTb255IEludGVyYWN0aXZlIEVudGVydGFpbm1lbnQgSW5jLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogCisg
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklC
VVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRT
IENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBP
UiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRI
RU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lu
Y2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkN1cmxTdHJlYW1TY2hlZHVsZXIuaCIKKworI2lm
IFVTRShDVVJMKQorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK0N1cmxTdHJlYW1TY2hlZHVsZXI6
OkN1cmxTdHJlYW1TY2hlZHVsZXIoKQoreworICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7Cit9
CisKK0N1cmxTdHJlYW1TY2hlZHVsZXI6On5DdXJsU3RyZWFtU2NoZWR1bGVyKCkKK3sKKyAgICBB
U1NFUlQoaXNNYWluVGhyZWFkKCkpOworfQorCitDdXJsU3RyZWFtSUQgQ3VybFN0cmVhbVNjaGVk
dWxlcjo6Y3JlYXRlU3RyZWFtKGNvbnN0IFVSTCYgdXJsLCBDdXJsU3RyZWFtOjpDbGllbnQmIGNs
aWVudCkKK3sKKyAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOworCisgICAgZG8geworICAgICAg
ICBtX2N1cnJlbnRTdHJlYW1JRCA9IChtX2N1cnJlbnRTdHJlYW1JRCArIDEgIT0gaW52YWxpZEN1
cmxTdHJlYW1JRCkgPyBtX2N1cnJlbnRTdHJlYW1JRCArIDEgOiAxOworICAgIH0gd2hpbGUgKG1f
Y2xpZW50TGlzdC5jb250YWlucyhtX2N1cnJlbnRTdHJlYW1JRCkpOworCisgICAgYXV0byBzdHJl
YW1JRCA9IG1fY3VycmVudFN0cmVhbUlEOworICAgIG1fY2xpZW50TGlzdC5hZGQoc3RyZWFtSUQs
ICZjbGllbnQpOworCisgICAgY2FsbE9uV29ya2VyVGhyZWFkKFt0aGlzLCBzdHJlYW1JRCwgdXJs
ID0gdXJsLmlzb2xhdGVkQ29weSgpXSgpIG11dGFibGUgeworICAgICAgICBtX3N0cmVhbUxpc3Qu
YWRkKHN0cmVhbUlELCBDdXJsU3RyZWFtOjpjcmVhdGUoKnRoaXMsIHN0cmVhbUlELCBXVEZNb3Zl
KHVybCkpKTsKKyAgICB9KTsKKworICAgIHJldHVybiBzdHJlYW1JRDsKK30KKwordm9pZCBDdXJs
U3RyZWFtU2NoZWR1bGVyOjpkZXN0cm95U3RyZWFtKEN1cmxTdHJlYW1JRCBzdHJlYW1JRCkKK3sK
KyAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOworCisgICAgaWYgKG1fY2xpZW50TGlzdC5jb250
YWlucyhzdHJlYW1JRCkpCisgICAgICAgIG1fY2xpZW50TGlzdC5yZW1vdmUoc3RyZWFtSUQpOwor
CisgICAgY2FsbE9uV29ya2VyVGhyZWFkKFt0aGlzLCBzdHJlYW1JRF0oKSB7CisgICAgICAgIGlm
IChtX3N0cmVhbUxpc3QuY29udGFpbnMoc3RyZWFtSUQpKQorICAgICAgICAgICAgbV9zdHJlYW1M
aXN0LnJlbW92ZShzdHJlYW1JRCk7CisgICAgfSk7Cit9CisKK3ZvaWQgQ3VybFN0cmVhbVNjaGVk
dWxlcjo6c2VuZChDdXJsU3RyZWFtSUQgc3RyZWFtSUQsIFVuaXF1ZUFycmF5PHVpbnQ4X3Q+JiYg
ZGF0YSwgc2l6ZV90IGxlbmd0aCkKK3sKKyAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOworCisg
ICAgY2FsbE9uV29ya2VyVGhyZWFkKFt0aGlzLCBzdHJlYW1JRCwgZGF0YSA9IFdURk1vdmUoZGF0
YSksIGxlbmd0aF0oKSBtdXRhYmxlIHsKKyAgICAgICAgaWYgKGF1dG8gc3RyZWFtID0gbV9zdHJl
YW1MaXN0LmdldChzdHJlYW1JRCkpCisgICAgICAgICAgICBzdHJlYW0tPnNlbmQoV1RGTW92ZShk
YXRhKSwgbGVuZ3RoKTsKKyAgICB9KTsKK30KKwordm9pZCBDdXJsU3RyZWFtU2NoZWR1bGVyOjpj
YWxsT25Xb3JrZXJUaHJlYWQoV1RGOjpGdW5jdGlvbjx2b2lkKCk+JiYgdGFzaykKK3sKKyAgICBB
U1NFUlQoaXNNYWluVGhyZWFkKCkpOworCisgICAgeworICAgICAgICBhdXRvIGxvY2tlciA9IGhv
bGRMb2NrKG1fbXV0ZXgpOworICAgICAgICBtX3Rhc2tRdWV1ZS5hcHBlbmQoV1RGTW92ZSh0YXNr
KSk7CisgICAgfQorCisgICAgc3RhcnRUaHJlYWRJZk5lZWRlZCgpOworfQorCit2b2lkIEN1cmxT
dHJlYW1TY2hlZHVsZXI6OmNhbGxDbGllbnRPbk1haW5UaHJlYWQoQ3VybFN0cmVhbUlEIHN0cmVh
bUlELCBXVEY6OkZ1bmN0aW9uPHZvaWQoQ3VybFN0cmVhbTo6Q2xpZW50Jik+JiYgdGFzaykKK3sK
KyAgICBBU1NFUlQoIWlzTWFpblRocmVhZCgpKTsKKworICAgIGNhbGxPbk1haW5UaHJlYWQoW3Ro
aXMsIHN0cmVhbUlELCB0YXNrID0gV1RGTW92ZSh0YXNrKV0oKSB7CisgICAgICAgIGlmIChhdXRv
IGNsaWVudCA9IG1fY2xpZW50TGlzdC5nZXQoc3RyZWFtSUQpKQorICAgICAgICAgICAgdGFzaygq
Y2xpZW50KTsKKyAgICB9KTsKK30KKwordm9pZCBDdXJsU3RyZWFtU2NoZWR1bGVyOjpzdGFydFRo
cmVhZElmTmVlZGVkKCkKK3sKKyAgICB7CisgICAgICAgIGF1dG8gbG9ja2VyID0gaG9sZExvY2so
bV9tdXRleCk7CisgICAgICAgIGlmIChtX3J1blRocmVhZCkKKyAgICAgICAgICAgIHJldHVybjsK
KyAgICB9CisKKyAgICBpZiAobV90aHJlYWQpCisgICAgICAgIG1fdGhyZWFkLT53YWl0Rm9yQ29t
cGxldGlvbigpOworCisgICAgbV9ydW5UaHJlYWQgPSB0cnVlOworCisgICAgbV90aHJlYWQgPSBU
aHJlYWQ6OmNyZWF0ZSgiY3VybFN0cmVhbVRocmVhZCIsIFt0aGlzXSB7CisgICAgICAgIHdvcmtl
clRocmVhZCgpOworICAgIH0pOworfQorCit2b2lkIEN1cmxTdHJlYW1TY2hlZHVsZXI6OnN0b3BU
aHJlYWRJZk5vTW9yZUpvYlJ1bm5pbmcoKQoreworICAgIEFTU0VSVCghaXNNYWluVGhyZWFkKCkp
OworCisgICAgaWYgKG1fc3RyZWFtTGlzdC5zaXplKCkpCisgICAgICAgIHJldHVybjsKKworICAg
IGF1dG8gbG9ja2VyID0gaG9sZExvY2sobV9tdXRleCk7CisgICAgaWYgKG1fdGFza1F1ZXVlLnNp
emUoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9ydW5UaHJlYWQgPSBmYWxzZTsKK30KKwor
dm9pZCBDdXJsU3RyZWFtU2NoZWR1bGVyOjpleGVjdXRlVGFza3MoKQoreworICAgIEFTU0VSVCgh
aXNNYWluVGhyZWFkKCkpOworCisgICAgVmVjdG9yPFdURjo6RnVuY3Rpb248dm9pZCgpPj4gdGFz
a1F1ZXVlOworCisgICAgeworICAgICAgICBhdXRvIGxvY2tlciA9IGhvbGRMb2NrKG1fbXV0ZXgp
OworICAgICAgICB0YXNrUXVldWUgPSBXVEZNb3ZlKG1fdGFza1F1ZXVlKTsKKyAgICB9CisKKyAg
ICBmb3IgKGF1dG8mIHRhc2sgOiB0YXNrUXVldWUpCisgICAgICAgIHRhc2soKTsKK30KKwordm9p
ZCBDdXJsU3RyZWFtU2NoZWR1bGVyOjp3b3JrZXJUaHJlYWQoKQoreworICAgIEFTU0VSVCghaXNN
YWluVGhyZWFkKCkpOworICAgIHN0YXRpYyBjb25zdCBpbnQgc2VsZWN0VGltZW91dE1TID0gMjA7
CisgICAgc3RydWN0IHRpbWV2YWwgdGltZW91dCB7IDAsIHNlbGVjdFRpbWVvdXRNUyAqIDEwMDB9
OworCisgICAgd2hpbGUgKG1fcnVuVGhyZWFkKSB7CisgICAgICAgIGV4ZWN1dGVUYXNrcygpOwor
CisgICAgICAgIGludCByYyA9IDA7CisgICAgICAgIGZkX3NldCByZWFkZmRzOworICAgICAgICBm
ZF9zZXQgd3JpdGVmZHM7CisgICAgICAgIGZkX3NldCBleGNlcHRmZHM7CisKKyAgICAgICAgZG8g
eworICAgICAgICAgICAgaW50IG1heGZkID0gLTE7CisKKyAgICAgICAgICAgIEZEX1pFUk8oJnJl
YWRmZHMpOworICAgICAgICAgICAgRkRfWkVSTygmd3JpdGVmZHMpOworICAgICAgICAgICAgRkRf
WkVSTygmZXhjZXB0ZmRzKTsKKworICAgICAgICAgICAgZm9yIChhdXRvJiBzdHJlYW0gOiBtX3N0
cmVhbUxpc3QudmFsdWVzKCkpCisgICAgICAgICAgICAgICAgc3RyZWFtLT5hcHBlbmRNb25pdG9y
aW5nRmQocmVhZGZkcywgd3JpdGVmZHMsIGV4Y2VwdGZkcywgbWF4ZmQpOworCisgICAgICAgICAg
ICBpZiAobWF4ZmQgPj0gMCkKKyAgICAgICAgICAgICAgICByYyA9IDo6c2VsZWN0KG1heGZkICsg
MSwgJnJlYWRmZHMsICZ3cml0ZWZkcywgJmV4Y2VwdGZkcywgJnRpbWVvdXQpOworICAgICAgICB9
IHdoaWxlIChyYyA9PSAtMSAmJiBlcnJubyA9PSBFSU5UUik7CisKKyAgICAgICAgZm9yIChhdXRv
JiBzdHJlYW0gOiBtX3N0cmVhbUxpc3QudmFsdWVzKCkpCisgICAgICAgICAgICBzdHJlYW0tPnRy
eVRvVHJhbnNmZXIocmVhZGZkcywgd3JpdGVmZHMsIGV4Y2VwdGZkcyk7CisKKyAgICAgICAgc3Rv
cFRocmVhZElmTm9Nb3JlSm9iUnVubmluZygpOworICAgIH0KK30KKworfQorCisjZW5kaWYKZGlm
ZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsU3RyZWFt
U2NoZWR1bGVyLmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybFN0
cmVhbVNjaGVkdWxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjdkODgxMjA2Yzk2ODlmNDMzMjI3OTY5YzliN2Y5
ZmYyNjhiZGFhZWQKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9u
ZXR3b3JrL2N1cmwvQ3VybFN0cmVhbVNjaGVkdWxlci5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMjAgU29ueSBJbnRlcmFjdGl2ZSBFbnRlcnRhaW5tZW50IEluYy4K
KyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMu
IEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUg
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVN
RU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiQ3VybFN0cmVhbS5oIgorI2lu
Y2x1ZGUgPHd0Zi9GdW5jdGlvbi5oPgorI2luY2x1ZGUgPHd0Zi9IYXNoTWFwLmg+CisKK25hbWVz
cGFjZSBXZWJDb3JlIHsKKworY2xhc3MgQ3VybFN0cmVhbVNjaGVkdWxlciB7CisgICAgV1RGX01B
S0VfRkFTVF9BTExPQ0FURUQ7CisgICAgV1RGX01BS0VfTk9OQ09QWUFCTEUoQ3VybFN0cmVhbVNj
aGVkdWxlcik7CitwdWJsaWM6CisgICAgQ3VybFN0cmVhbVNjaGVkdWxlcigpOworICAgIHZpcnR1
YWwgfkN1cmxTdHJlYW1TY2hlZHVsZXIoKTsKKworICAgIEN1cmxTdHJlYW1JRCBjcmVhdGVTdHJl
YW0oY29uc3QgVVJMJiwgQ3VybFN0cmVhbTo6Q2xpZW50Jik7CisgICAgdm9pZCBkZXN0cm95U3Ry
ZWFtKEN1cmxTdHJlYW1JRCk7CisgICAgdm9pZCBzZW5kKEN1cmxTdHJlYW1JRCwgVW5pcXVlQXJy
YXk8dWludDhfdD4mJiwgc2l6ZV90KTsKKworICAgIHZvaWQgY2FsbE9uV29ya2VyVGhyZWFkKFdU
Rjo6RnVuY3Rpb248dm9pZCgpPiYmKTsKKyAgICB2b2lkIGNhbGxDbGllbnRPbk1haW5UaHJlYWQo
Q3VybFN0cmVhbUlELCBXVEY6OkZ1bmN0aW9uPHZvaWQoQ3VybFN0cmVhbTo6Q2xpZW50Jik+JiYp
OworCitwcml2YXRlOgorICAgIHZvaWQgc3RhcnRUaHJlYWRJZk5lZWRlZCgpOworICAgIHZvaWQg
c3RvcFRocmVhZElmTm9Nb3JlSm9iUnVubmluZygpOworCisgICAgdm9pZCBleGVjdXRlVGFza3Mo
KTsKKworICAgIHZvaWQgd29ya2VyVGhyZWFkKCk7CisKKyAgICBMb2NrIG1fbXV0ZXg7CisgICAg
UmVmUHRyPFRocmVhZD4gbV90aHJlYWQ7CisgICAgYm9vbCBtX3J1blRocmVhZCB7IGZhbHNlIH07
CisKKyAgICBDdXJsU3RyZWFtSUQgbV9jdXJyZW50U3RyZWFtSUQgPSAxOworCisgICAgVmVjdG9y
PEZ1bmN0aW9uPHZvaWQoKT4+IG1fdGFza1F1ZXVlOworICAgIEhhc2hNYXA8Q3VybFN0cmVhbUlE
LCBDdXJsU3RyZWFtOjpDbGllbnQqPiBtX2NsaWVudExpc3Q7CisgICAgSGFzaE1hcDxDdXJsU3Ry
ZWFtSUQsIHN0ZDo6dW5pcXVlX3B0cjxDdXJsU3RyZWFtPj4gbV9zdHJlYW1MaXN0OworfTsKKwor
fSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vbmV0d29yay9jdXJsL1NvY2tldFN0cmVhbUhhbmRsZUltcGwuaCBiL1NvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL25ldHdvcmsvY3VybC9Tb2NrZXRTdHJlYW1IYW5kbGVJbXBsLmgKaW5kZXggMjVi
ZjNjNDZhMmViZGZiYTY1ODhmZWRhMjBhOWU4YzdlYzg3Y2IzMi4uZmFkNGVmOTE5ODExOGY1ZTZl
NWVkN2QzYzE0Yjk5ZTU3NDU5MzQ1MSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vbmV0d29yay9jdXJsL1NvY2tldFN0cmVhbUhhbmRsZUltcGwuaAorKysgYi9Tb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvU29ja2V0U3RyZWFtSGFuZGxlSW1wbC5oCkBAIC0x
LDYgKzEsNyBAQAogLyoKICAqIENvcHlyaWdodCAoQykgMjAwOS0yMDE4IEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KICAqIENvcHlyaWdodCAoQykgMjAwOSBHb29nbGUgSW5jLiAgQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAyMCBTb255IEludGVyYWN0aXZl
IEVudGVydGFpbm1lbnQgSW5jLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpA
QCAtMzEsMjMgKzMyLDE3IEBACiAKICNwcmFnbWEgb25jZQogCi0jaW5jbHVkZSAiQ3VybENvbnRl
eHQuaCIKKyNpbmNsdWRlICJDdXJsU3RyZWFtLmgiCiAjaW5jbHVkZSAiU29ja2V0U3RyZWFtSGFu
ZGxlLmgiCiAjaW5jbHVkZSA8cGFsL1Nlc3Npb25JRC5oPgotI2luY2x1ZGUgPHd0Zi9GdW5jdGlv
bi5oPgotI2luY2x1ZGUgPHd0Zi9Mb2NrLmg+Ci0jaW5jbHVkZSA8d3RmL01lc3NhZ2VRdWV1ZS5o
PgotI2luY2x1ZGUgPHd0Zi9SZWZDb3VudGVkLmg+CiAjaW5jbHVkZSA8d3RmL1N0cmVhbUJ1ZmZl
ci5oPgotI2luY2x1ZGUgPHd0Zi9UaHJlYWRpbmcuaD4KLSNpbmNsdWRlIDx3dGYvVW5pcXVlQXJy
YXkuaD4KIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCiBjbGFzcyBTb2NrZXRTdHJlYW1IYW5kbGVD
bGllbnQ7CiBjbGFzcyBTdG9yYWdlU2Vzc2lvblByb3ZpZGVyOwogCi1jbGFzcyBTb2NrZXRTdHJl
YW1IYW5kbGVJbXBsIDogcHVibGljIFNvY2tldFN0cmVhbUhhbmRsZSB7CitjbGFzcyBTb2NrZXRT
dHJlYW1IYW5kbGVJbXBsIDogcHVibGljIFNvY2tldFN0cmVhbUhhbmRsZSwgcHVibGljIEN1cmxT
dHJlYW06OkNsaWVudCB7CiBwdWJsaWM6CiAgICAgc3RhdGljIFJlZjxTb2NrZXRTdHJlYW1IYW5k
bGVJbXBsPiBjcmVhdGUoY29uc3QgVVJMJiB1cmwsIFNvY2tldFN0cmVhbUhhbmRsZUNsaWVudCYg
Y2xpZW50LCBQQUw6OlNlc3Npb25JRCwgY29uc3QgU3RyaW5nJiwgU291cmNlQXBwbGljYXRpb25B
dWRpdFRva2VuJiYsIGNvbnN0IFN0b3JhZ2VTZXNzaW9uUHJvdmlkZXIqIHByb3ZpZGVyKSB7IHJl
dHVybiBhZG9wdFJlZigqbmV3IFNvY2tldFN0cmVhbUhhbmRsZUltcGwodXJsLCBjbGllbnQsIHBy
b3ZpZGVyKSk7IH0KIApAQCAtNjQsMjggKzU5LDIyIEBAIHByaXZhdGU6CiAgICAgT3B0aW9uYWw8
c2l6ZV90PiBwbGF0Zm9ybVNlbmRJbnRlcm5hbChjb25zdCB1aW50OF90Kiwgc2l6ZV90KTsKICAg
ICBib29sIHNlbmRQZW5kaW5nRGF0YSgpOwogCi0gICAgdm9pZCB0aHJlYWRFbnRyeVBvaW50KGNv
bnN0IFVSTCYpOwotICAgIHZvaWQgaGFuZGxlRXJyb3IoQ1VSTGNvZGUpOwotICAgIHZvaWQgc3Rv
cFRocmVhZCgpOworICAgIHZvaWQgZGlkT3BlbihDdXJsU3RyZWFtSUQpIGZpbmFsOworICAgIHZv
aWQgZGlkU2VuZERhdGEoQ3VybFN0cmVhbUlELCBzaXplX3QpIGZpbmFsOworICAgIHZvaWQgZGlk
UmVjZWl2ZURhdGEoQ3VybFN0cmVhbUlELCBjb25zdCBjaGFyKiwgc2l6ZV90KSBmaW5hbDsKKyAg
ICB2b2lkIGRpZEZhaWwoQ3VybFN0cmVhbUlELCBDVVJMY29kZSkgZmluYWw7CiAKLSAgICB2b2lk
IGNhbGxPbldvcmtlclRocmVhZChGdW5jdGlvbjx2b2lkKCk+JiYpOwotICAgIHZvaWQgZXhlY3V0
ZVRhc2tzKCk7Ci0KLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtSZWFkQnVmZmVyU2l6ZSA9IDQg
KiAxMDI0OworICAgIGJvb2wgaXNTdHJlYW1JbnZhbGlkYXRlZCgpIHsgcmV0dXJuIG1fc3RyZWFt
SUQgPT0gaW52YWxpZEN1cmxTdHJlYW1JRDsgfQorICAgIHZvaWQgZGVzdHJ1Y3RTdHJlYW0oKTsK
IAogICAgIFJlZlB0cjxjb25zdCBTdG9yYWdlU2Vzc2lvblByb3ZpZGVyPiBtX3N0b3JhZ2VTZXNz
aW9uUHJvdmlkZXI7Ci0gICAgUmVmUHRyPFRocmVhZD4gbV93b3JrZXJUaHJlYWQ7Ci0gICAgc3Rk
OjphdG9taWM8Ym9vbD4gbV9ydW5uaW5nIHsgdHJ1ZSB9OwotCi0gICAgTWVzc2FnZVF1ZXVlPEZ1
bmN0aW9uPHZvaWQoKT4+IG1fdGFza1F1ZXVlOwotCi0gICAgYm9vbCBtX2hhc1BlbmRpbmdXcml0
ZURhdGEgeyBmYWxzZSB9OwotICAgIHNpemVfdCBtX3dyaXRlQnVmZmVyU2l6ZSB7IDAgfTsKLSAg
ICBzaXplX3QgbV93cml0ZUJ1ZmZlck9mZnNldCB7IDAgfTsKLSAgICBVbmlxdWVBcnJheTx1aW50
OF90PiBtX3dyaXRlQnVmZmVyOwogCiAgICAgU3RyZWFtQnVmZmVyPHVpbnQ4X3QsIDEwMjQgKiAx
MDI0PiBtX2J1ZmZlcjsKICAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgbWF4QnVmZmVyU2l6ZSA9
IDEwMCAqIDEwMjQgKiAxMDI0OworCisgICAgQ3VybFN0cmVhbVNjaGVkdWxlciYgbV9zY2hlZHVs
ZXI7CisgICAgQ3VybFN0cmVhbUlEIG1fc3RyZWFtSUQgeyBpbnZhbGlkQ3VybFN0cmVhbUlEIH07
CisgICAgdW5zaWduZWQgbV90b3RhbFNlbmREYXRhU2l6ZSB7IDAgfTsKIH07CiAKIH0gLy8gbmFt
ZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdv
cmsvY3VybC9Tb2NrZXRTdHJlYW1IYW5kbGVJbXBsQ3VybC5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9uZXR3b3JrL2N1cmwvU29ja2V0U3RyZWFtSGFuZGxlSW1wbEN1cmwuY3BwCmluZGV4
IDEzYTgzMmMyNjY5YjRjZThjYmViZjMxMzRiYTA4OWQ5MDJkZmE5NDkuLjNiNmRlYTllZDI1NTJk
ODFhYWY3ZTY5NGE1ZjkyMmU5NmRiZjk0ZDYgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL25ldHdvcmsvY3VybC9Tb2NrZXRTdHJlYW1IYW5kbGVJbXBsQ3VybC5jcHAKKysrIGIv
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL1NvY2tldFN0cmVhbUhhbmRsZUlt
cGxDdXJsLmNwcApAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDkgQnJl
bnQgRnVsZ2hhbS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDkg
R29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTgg
U29ueSBJbnRlcmFjdGl2ZSBFbnRlcnRhaW5tZW50IEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAy
MCBTb255IEludGVyYWN0aXZlIEVudGVydGFpbm1lbnQgSW5jLgogICoKICAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAog
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zIGFyZQpAQCAtMzUsMTgzICszNSwxMDMgQEAKIAogI2lmIFVTRShDVVJMKQog
CisjaW5jbHVkZSAiQ3VybFN0cmVhbVNjaGVkdWxlci5oIgogI2luY2x1ZGUgIkRlcHJlY2F0ZWRH
bG9iYWxTZXR0aW5ncy5oIgotI2luY2x1ZGUgIkxvZ2dpbmcuaCIKICNpbmNsdWRlICJTb2NrZXRT
dHJlYW1FcnJvci5oIgogI2luY2x1ZGUgIlNvY2tldFN0cmVhbUhhbmRsZUNsaWVudC5oIgogI2lu
Y2x1ZGUgIlN0b3JhZ2VTZXNzaW9uUHJvdmlkZXIuaCIKLSNpbmNsdWRlIDx3dGYvTWFpblRocmVh
ZC5oPgotI2luY2x1ZGUgPHd0Zi9VUkwuaD4KLSNpbmNsdWRlIDx3dGYvdGV4dC9DU3RyaW5nLmg+
CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogU29ja2V0U3RyZWFtSGFuZGxlSW1wbDo6U29ja2V0
U3RyZWFtSGFuZGxlSW1wbChjb25zdCBVUkwmIHVybCwgU29ja2V0U3RyZWFtSGFuZGxlQ2xpZW50
JiBjbGllbnQsIGNvbnN0IFN0b3JhZ2VTZXNzaW9uUHJvdmlkZXIqIHByb3ZpZGVyKQogICAgIDog
U29ja2V0U3RyZWFtSGFuZGxlKHVybCwgY2xpZW50KQogICAgICwgbV9zdG9yYWdlU2Vzc2lvblBy
b3ZpZGVyKHByb3ZpZGVyKQorICAgICwgbV9zY2hlZHVsZXIoQ3VybENvbnRleHQ6OnNpbmdsZXRv
bigpLnN0cmVhbVNjaGVkdWxlcigpKQogewotICAgIExPRyhOZXR3b3JrLCAiU29ja2V0U3RyZWFt
SGFuZGxlICVwIG5ldyBjbGllbnQgJXAiLCB0aGlzLCAmbV9jbGllbnQpOwotICAgIEFTU0VSVChp
c01haW5UaHJlYWQoKSk7Ci0KICAgICAvLyBGSVhNRTogVXNpbmcgRGVwcmVjYXRlZEdsb2JhbFNl
dHRpbmdzIGZyb20gaGVyZSBpcyBhIGxheWVyaW5nIHZpb2xhdGlvbi4KICAgICBpZiAobV91cmwu
cHJvdG9jb2xJcygid3NzIikgJiYgRGVwcmVjYXRlZEdsb2JhbFNldHRpbmdzOjphbGxvd3NBbnlT
U0xDZXJ0aWZpY2F0ZSgpKQogICAgICAgICBDdXJsQ29udGV4dDo6c2luZ2xldG9uKCkuc3NsSGFu
ZGxlKCkuc2V0SWdub3JlU1NMRXJyb3JzKHRydWUpOwogCi0gICAgbV93b3JrZXJUaHJlYWQgPSBU
aHJlYWQ6OmNyZWF0ZSgiV2ViU29ja2V0IHRocmVhZCIsIFt0aGlzLCBwcm90ZWN0ZWRUaGlzID0g
bWFrZVJlZigqdGhpcyksIHVybCA9IHVybC5pc29sYXRlZENvcHkoKV0gewotICAgICAgICB0aHJl
YWRFbnRyeVBvaW50KHVybCk7Ci0gICAgfSk7CisgICAgbV9zdHJlYW1JRCA9IG1fc2NoZWR1bGVy
LmNyZWF0ZVN0cmVhbShtX3VybCwgKnRoaXMpOwogfQogCiBTb2NrZXRTdHJlYW1IYW5kbGVJbXBs
Ojp+U29ja2V0U3RyZWFtSGFuZGxlSW1wbCgpCiB7Ci0gICAgTE9HKE5ldHdvcmssICJTb2NrZXRT
dHJlYW1IYW5kbGUgJXAgZGVsZXRlIiwgdGhpcyk7Ci0gICAgc3RvcFRocmVhZCgpOworICAgIGRl
c3RydWN0U3RyZWFtKCk7CiB9CiAKIE9wdGlvbmFsPHNpemVfdD4gU29ja2V0U3RyZWFtSGFuZGxl
SW1wbDo6cGxhdGZvcm1TZW5kSW50ZXJuYWwoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxl
bmd0aCkKIHsKLSAgICBMT0coTmV0d29yaywgIlNvY2tldFN0cmVhbUhhbmRsZSAlcCBwbGF0Zm9y
bVNlbmQiLCB0aGlzKTsKLSAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOworICAgIGlmIChpc1N0
cmVhbUludmFsaWRhdGVkKCkpCisgICAgICAgIHJldHVybiBXVEY6Om51bGxvcHQ7CiAKLSAgICBp
ZiAobV9oYXNQZW5kaW5nV3JpdGVEYXRhKQorICAgIGlmIChtX3RvdGFsU2VuZERhdGFTaXplICsg
bGVuZ3RoID4gbWF4QnVmZmVyU2l6ZSkKICAgICAgICAgcmV0dXJuIDA7CisgICAgbV90b3RhbFNl
bmREYXRhU2l6ZSArPSBsZW5ndGg7CiAKLSAgICBtX2hhc1BlbmRpbmdXcml0ZURhdGEgPSB0cnVl
OwotCi0gICAgYXV0byB3cml0ZUJ1ZmZlciA9IG1ha2VVbmlxdWVBcnJheTx1aW50OF90PihsZW5n
dGgpOwotICAgIG1lbWNweSh3cml0ZUJ1ZmZlci5nZXQoKSwgZGF0YSwgbGVuZ3RoKTsKLQotICAg
IGNhbGxPbldvcmtlclRocmVhZChbdGhpcywgd3JpdGVCdWZmZXIgPSBXVEZNb3ZlKHdyaXRlQnVm
ZmVyKSwgd3JpdGVCdWZmZXJTaXplID0gbGVuZ3RoXSgpIG11dGFibGUgewotICAgICAgICBBU1NF
UlQoIWlzTWFpblRocmVhZCgpKTsKLSAgICAgICAgbV93cml0ZUJ1ZmZlciA9IFdURk1vdmUod3Jp
dGVCdWZmZXIpOwotICAgICAgICBtX3dyaXRlQnVmZmVyU2l6ZSA9IHdyaXRlQnVmZmVyU2l6ZTsK
LSAgICAgICAgbV93cml0ZUJ1ZmZlck9mZnNldCA9IDA7Ci0gICAgfSk7CisgICAgYXV0byBidWZm
ZXIgPSBtYWtlVW5pcXVlQXJyYXk8dWludDhfdD4obGVuZ3RoKTsKKyAgICBtZW1jcHkoYnVmZmVy
LmdldCgpLCBkYXRhLCBsZW5ndGgpOwogCisgICAgbV9zY2hlZHVsZXIuc2VuZChtX3N0cmVhbUlE
LCBXVEZNb3ZlKGJ1ZmZlciksIGxlbmd0aCk7CiAgICAgcmV0dXJuIGxlbmd0aDsKIH0KIAogdm9p
ZCBTb2NrZXRTdHJlYW1IYW5kbGVJbXBsOjpwbGF0Zm9ybUNsb3NlKCkKIHsKLSAgICBMT0coTmV0
d29yaywgIlNvY2tldFN0cmVhbUhhbmRsZSAlcCBwbGF0Zm9ybUNsb3NlIiwgdGhpcyk7Ci0gICAg
QVNTRVJUKGlzTWFpblRocmVhZCgpKTsKKyAgICBkZXN0cnVjdFN0cmVhbSgpOwogCiAgICAgaWYg
KG1fc3RhdGUgPT0gQ2xvc2VkKQogICAgICAgICByZXR1cm47CiAgICAgbV9zdGF0ZSA9IENsb3Nl
ZDsKIAotICAgIHN0b3BUaHJlYWQoKTsKICAgICBtX2NsaWVudC5kaWRDbG9zZVNvY2tldFN0cmVh
bSgqdGhpcyk7CiB9CiAKLXZvaWQgU29ja2V0U3RyZWFtSGFuZGxlSW1wbDo6dGhyZWFkRW50cnlQ
b2ludChjb25zdCBVUkwmIHVybCkKK3ZvaWQgU29ja2V0U3RyZWFtSGFuZGxlSW1wbDo6ZGlkT3Bl
bihDdXJsU3RyZWFtSUQpCiB7Ci0gICAgQVNTRVJUKCFpc01haW5UaHJlYWQoKSk7Ci0KLSAgICBD
dXJsU29ja2V0SGFuZGxlIHNvY2tldCB7IHVybCwgW3RoaXNdKENVUkxjb2RlIGVycm9yQ29kZSkg
ewotICAgICAgICBoYW5kbGVFcnJvcihlcnJvckNvZGUpOwotICAgIH19OwotCi0gICAgLy8gQ29u
bmVjdCB0byBob3N0Ci0gICAgaWYgKCFzb2NrZXQuY29ubmVjdCgpKQorICAgIGlmIChtX3N0YXRl
ICE9IENvbm5lY3RpbmcpCiAgICAgICAgIHJldHVybjsKKyAgICBtX3N0YXRlID0gT3BlbjsKIAot
ICAgIGNhbGxPbk1haW5UaHJlYWQoW3RoaXMsIHByb3RlY3RlZFRoaXMgPSBtYWtlUmVmKCp0aGlz
KV0gewotICAgICAgICBpZiAobV9zdGF0ZSA9PSBDb25uZWN0aW5nKSB7Ci0gICAgICAgICAgICBt
X3N0YXRlID0gT3BlbjsKLSAgICAgICAgICAgIG1fY2xpZW50LmRpZE9wZW5Tb2NrZXRTdHJlYW0o
KnRoaXMpOwotICAgICAgICB9Ci0gICAgfSk7Ci0KLSAgICB3aGlsZSAobV9ydW5uaW5nKSB7Ci0g
ICAgICAgIGV4ZWN1dGVUYXNrcygpOwotCi0gICAgICAgIGF1dG8gcmVzdWx0ID0gc29ja2V0Lndh
aXQoMjBfbXMsIG1fd3JpdGVCdWZmZXIuZ2V0KCkpOwotICAgICAgICBpZiAoIXJlc3VsdCkKLSAg
ICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIC8vIFRoZXNlIGxvZ2ljIG9ubHkgcnVuIHdo
ZW4gdGhlcmUncyBkYXRhIHdhaXRpbmcuCi0gICAgICAgIGlmIChyZXN1bHQtPndyaXRhYmxlICYm
IG1fcnVubmluZykgewotICAgICAgICAgICAgYXV0byBieXRlc1NlbnQgPSBzb2NrZXQuc2VuZCht
X3dyaXRlQnVmZmVyLmdldCgpICsgbV93cml0ZUJ1ZmZlck9mZnNldCwgbV93cml0ZUJ1ZmZlclNp
emUgLSBtX3dyaXRlQnVmZmVyT2Zmc2V0KTsKLSAgICAgICAgICAgIG1fd3JpdGVCdWZmZXJPZmZz
ZXQgKz0gYnl0ZXNTZW50OwotCi0gICAgICAgICAgICBpZiAobV93cml0ZUJ1ZmZlclNpemUgPD0g
bV93cml0ZUJ1ZmZlck9mZnNldCkgewotICAgICAgICAgICAgICAgIG1fd3JpdGVCdWZmZXIgPSBu
dWxscHRyOwotICAgICAgICAgICAgICAgIG1fd3JpdGVCdWZmZXJTaXplID0gMDsKLSAgICAgICAg
ICAgICAgICBtX3dyaXRlQnVmZmVyT2Zmc2V0ID0gMDsKLQotICAgICAgICAgICAgICAgIGNhbGxP
bk1haW5UaHJlYWQoW3RoaXMsIHByb3RlY3RlZFRoaXMgPSBtYWtlUmVmKCp0aGlzKV0gewotICAg
ICAgICAgICAgICAgICAgICBtX2hhc1BlbmRpbmdXcml0ZURhdGEgPSBmYWxzZTsKLSAgICAgICAg
ICAgICAgICAgICAgc2VuZFBlbmRpbmdEYXRhKCk7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAg
ICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocmVzdWx0LT5yZWFkYWJsZSAmJiBt
X3J1bm5pbmcpIHsKLSAgICAgICAgICAgIGF1dG8gcmVhZEJ1ZmZlciA9IG1ha2VVbmlxdWVBcnJh
eTx1aW50OF90PihrUmVhZEJ1ZmZlclNpemUpOwotICAgICAgICAgICAgYXV0byBieXRlc1JlYWQg
PSBzb2NrZXQucmVjZWl2ZShyZWFkQnVmZmVyLmdldCgpLCBrUmVhZEJ1ZmZlclNpemUpOwotICAg
ICAgICAgICAgLy8gYG51bGxvcHRgIHJlc3VsdCBtZWFucyBub3RoaW5nIHRvIGhhbmRsZSBhdCB0
aGlzIG1vbWVudC4KLSAgICAgICAgICAgIGlmICghYnl0ZXNSZWFkKQotICAgICAgICAgICAgICAg
IGNvbnRpbnVlOwotCi0gICAgICAgICAgICAvLyAwIGJ5dGVzIGluZGljYXRlcyBhIGNsb3NlZCBj
b25uZWN0aW9uLgotICAgICAgICAgICAgaWYgKCEqYnl0ZXNSZWFkKSB7Ci0gICAgICAgICAgICAg
ICAgbV9ydW5uaW5nID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgY2FsbE9uTWFpblRocmVhZChb
dGhpcywgcHJvdGVjdGVkVGhpcyA9IG1ha2VSZWYoKnRoaXMpXSB7Ci0gICAgICAgICAgICAgICAg
ICAgIGNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7
Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhbGxPbk1haW5UaHJlYWQoW3RoaXMsIHBy
b3RlY3RlZFRoaXMgPSBtYWtlUmVmKCp0aGlzKSwgYnVmZmVyID0gV1RGTW92ZShyZWFkQnVmZmVy
KSwgc2l6ZSA9ICpieXRlc1JlYWQgXSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1fc3RhdGUgPT0g
T3BlbikKLSAgICAgICAgICAgICAgICAgICAgbV9jbGllbnQuZGlkUmVjZWl2ZVNvY2tldFN0cmVh
bURhdGEoKnRoaXMsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGJ1ZmZlci5nZXQoKSks
IHNpemUpOwotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBtX3dyaXRl
QnVmZmVyID0gbnVsbHB0cjsKKyAgICBtX2NsaWVudC5kaWRPcGVuU29ja2V0U3RyZWFtKCp0aGlz
KTsKIH0KIAotdm9pZCBTb2NrZXRTdHJlYW1IYW5kbGVJbXBsOjpoYW5kbGVFcnJvcihDVVJMY29k
ZSBlcnJvckNvZGUpCit2b2lkIFNvY2tldFN0cmVhbUhhbmRsZUltcGw6OmRpZFNlbmREYXRhKEN1
cmxTdHJlYW1JRCwgc2l6ZV90IGxlbmd0aCkKIHsKLSAgICBtX3J1bm5pbmcgPSBmYWxzZTsKLSAg
ICBjYWxsT25NYWluVGhyZWFkKFt0aGlzLCBwcm90ZWN0ZWRUaGlzID0gbWFrZVJlZigqdGhpcyks
IGVycm9yQ29kZSwgbG9jYWxpemVkRGVzY3JpcHRpb24gPSBDdXJsSGFuZGxlOjplcnJvckRlc2Ny
aXB0aW9uKGVycm9yQ29kZSkuaXNvbGF0ZWRDb3B5KCldIHsKLSAgICAgICAgaWYgKG1fc3RhdGUg
PT0gQ2xvc2VkKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIGlmIChlcnJvckNvZGUg
PT0gQ1VSTEVfUkVDVl9FUlJPUikKLSAgICAgICAgICAgIG1fY2xpZW50LmRpZEZhaWxUb1JlY2Vp
dmVTb2NrZXRTdHJlYW1EYXRhKCp0aGlzKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgbV9j
bGllbnQuZGlkRmFpbFNvY2tldFN0cmVhbSgqdGhpcywgU29ja2V0U3RyZWFtRXJyb3Ioc3RhdGlj
X2Nhc3Q8aW50PihlcnJvckNvZGUpLCB7IH0sIGxvY2FsaXplZERlc2NyaXB0aW9uKSk7Ci0gICAg
fSk7CisgICAgQVNTRVJUKG1fdG90YWxTZW5kRGF0YVNpemUgLSBsZW5ndGggPj0gMCk7CisKKyAg
ICBtX3RvdGFsU2VuZERhdGFTaXplIC09IGxlbmd0aDsKKyAgICBzZW5kUGVuZGluZ0RhdGEoKTsK
IH0KIAotdm9pZCBTb2NrZXRTdHJlYW1IYW5kbGVJbXBsOjpzdG9wVGhyZWFkKCkKK3ZvaWQgU29j
a2V0U3RyZWFtSGFuZGxlSW1wbDo6ZGlkUmVjZWl2ZURhdGEoQ3VybFN0cmVhbUlELCBjb25zdCBj
aGFyKiBkYXRhLCBzaXplX3QgbGVuZ3RoKQogewotICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7
Ci0KLSAgICBtX3J1bm5pbmcgPSBmYWxzZTsKKyAgICBpZiAobV9zdGF0ZSAhPSBPcGVuKQorICAg
ICAgICByZXR1cm47CiAKLSAgICBpZiAobV93b3JrZXJUaHJlYWQpIHsKLSAgICAgICAgbV93b3Jr
ZXJUaHJlYWQtPndhaXRGb3JDb21wbGV0aW9uKCk7Ci0gICAgICAgIG1fd29ya2VyVGhyZWFkID0g
bnVsbHB0cjsKLSAgICB9CisgICAgbV9jbGllbnQuZGlkUmVjZWl2ZVNvY2tldFN0cmVhbURhdGEo
KnRoaXMsIGRhdGEsIGxlbmd0aCk7CiB9CiAKLXZvaWQgU29ja2V0U3RyZWFtSGFuZGxlSW1wbDo6
Y2FsbE9uV29ya2VyVGhyZWFkKEZ1bmN0aW9uPHZvaWQoKT4mJiB0YXNrKQordm9pZCBTb2NrZXRT
dHJlYW1IYW5kbGVJbXBsOjpkaWRGYWlsKEN1cmxTdHJlYW1JRCwgQ1VSTGNvZGUgZXJyb3JDb2Rl
KQogewotICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7Ci0gICAgbV90YXNrUXVldWUuYXBwZW5k
KG1ha2VVbmlxdWU8RnVuY3Rpb248dm9pZCgpPj4oV1RGTW92ZSh0YXNrKSkpOworICAgIGRlc3Ry
dWN0U3RyZWFtKCk7CisKKyAgICBpZiAobV9zdGF0ZSA9PSBDbG9zZWQpCisgICAgICAgIHJldHVy
bjsKKworICAgIGlmIChlcnJvckNvZGUgPT0gQ1VSTEVfUkVDVl9FUlJPUikKKyAgICAgICAgbV9j
bGllbnQuZGlkRmFpbFRvUmVjZWl2ZVNvY2tldFN0cmVhbURhdGEoKnRoaXMpOworICAgIGVsc2UK
KyAgICAgICAgbV9jbGllbnQuZGlkRmFpbFNvY2tldFN0cmVhbSgqdGhpcywgU29ja2V0U3RyZWFt
RXJyb3IoZXJyb3JDb2RlLCBtX3VybCwgQ3VybEhhbmRsZTo6ZXJyb3JEZXNjcmlwdGlvbihlcnJv
ckNvZGUpKSk7CiB9CiAKLXZvaWQgU29ja2V0U3RyZWFtSGFuZGxlSW1wbDo6ZXhlY3V0ZVRhc2tz
KCkKK3ZvaWQgU29ja2V0U3RyZWFtSGFuZGxlSW1wbDo6ZGVzdHJ1Y3RTdHJlYW0oKQogewotICAg
IEFTU0VSVCghaXNNYWluVGhyZWFkKCkpOworICAgIGlmIChpc1N0cmVhbUludmFsaWRhdGVkKCkp
CisgICAgICAgIHJldHVybjsKIAotICAgIGF1dG8gdGFza3MgPSBtX3Rhc2tRdWV1ZS50YWtlQWxs
TWVzc2FnZXMoKTsKLSAgICBmb3IgKGF1dG8mIHRhc2sgOiB0YXNrcykKLSAgICAgICAgKCp0YXNr
KSgpOworICAgIG1fc2NoZWR1bGVyLmRlc3Ryb3lTdHJlYW0obV9zdHJlYW1JRCk7CisgICAgbV9z
dHJlYW1JRCA9IGludmFsaWRDdXJsU3RyZWFtSUQ7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIFdlYkNv
cmUK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>390907</attachid>
            <date>2020-02-17 02:50:41 -0800</date>
            <delta_ts>2020-02-17 04:07:14 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-187984-20200217194422.patch</filename>
            <type>text/plain</type>
            <size>40198</size>
            <attacher name="Takashi Komori">takashi.komori</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjU2NDk0CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggZGM4Y2JmZTJjMzY5YWYw
ZGIwOTNhM2I3YmM3Y2I1YTI1NDc2YWFlMi4uMGY3ZDM1ZjJhMThmNWU4YzE4NDA4NTc3NDlkYWUw
OWViNmU2Y2ZmYSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDcwIEBACisyMDIwLTAyLTE3ICBUYWth
c2hpIEtvbW9yaSAgPFRha2FzaGkuS29tb3JpQHNvbnkuY29tPgorCisgICAgICAgIFtDdXJsXSBV
c2Ugc2hhcmVkIHNpbmdsZSB0aHJlYWQgZm9yIFdlYlNvY2tldCBjb25uZWN0aW9ucworICAgICAg
ICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTg3OTg0CisKKyAgICAg
ICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgVGhpcyBwYXRjaCBzdXBw
cmVzc2VzIGludm9raW5nIHdvcmtlciB0aHJlYWRzIGZvciB3ZWJzb2NrZXQgY29ubmVjdGlvbnMu
CisgICAgICAgIEN1cmxTdHJlYW1TY2hlZHVsZXIgc3RhcnRzIHVwIHRvIG9uZSB3b3JrZXIgdGhy
ZWFkLgorCisgICAgICAgIE5vIG5ldyB0ZXN0cy4gQ292ZXJlZCBieSBleGlzdGluZyBXZWJTb2Nr
ZXQgdGVzdHMuCisKKyAgICAgICAgKiBwbGF0Zm9ybS9DdXJsLmNtYWtlOgorICAgICAgICAqIHBs
YXRmb3JtL25ldHdvcmsvY3VybC9DdXJsQ29udGV4dC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpD
dXJsQ29udGV4dDo6c3RyZWFtU2NoZWR1bGVyKToKKyAgICAgICAgKFdlYkNvcmU6OkN1cmxIYW5k
bGU6OmdldEFjdGl2ZVNvY2tldCk6CisgICAgICAgIChXZWJDb3JlOjpDdXJsSGFuZGxlOjpzZW5k
KToKKyAgICAgICAgKFdlYkNvcmU6OkN1cmxIYW5kbGU6OnJlY2VpdmUpOgorICAgICAgICAoV2Vi
Q29yZTo6Q3VybFNvY2tldEhhbmRsZTo6Q3VybFNvY2tldEhhbmRsZSk6IERlbGV0ZWQuCisgICAg
ICAgIChXZWJDb3JlOjpDdXJsU29ja2V0SGFuZGxlOjpjb25uZWN0KTogRGVsZXRlZC4KKyAgICAg
ICAgKFdlYkNvcmU6OkN1cmxTb2NrZXRIYW5kbGU6OnNlbmQpOiBEZWxldGVkLgorICAgICAgICAo
V2ViQ29yZTo6Q3VybFNvY2tldEhhbmRsZTo6cmVjZWl2ZSk6IERlbGV0ZWQuCisgICAgICAgIChX
ZWJDb3JlOjpDdXJsU29ja2V0SGFuZGxlOjp3YWl0KTogRGVsZXRlZC4KKyAgICAgICAgKiBwbGF0
Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybENvbnRleHQuaDoKKyAgICAgICAgKiBwbGF0Zm9ybS9uZXR3
b3JrL2N1cmwvQ3VybFN0cmVhbS5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6Q3VybFN0
cmVhbTo6Q3VybFN0cmVhbSk6CisgICAgICAgIChXZWJDb3JlOjpDdXJsU3RyZWFtOjp+Q3VybFN0
cmVhbSk6CisgICAgICAgIChXZWJDb3JlOjpDdXJsU3RyZWFtOjpkZXN0cm95SGFuZGxlKToKKyAg
ICAgICAgKFdlYkNvcmU6OkN1cmxTdHJlYW06OnNlbmQpOgorICAgICAgICAoV2ViQ29yZTo6Q3Vy
bFN0cmVhbTo6YXBwZW5kTW9uaXRvcmluZ0ZkKToKKyAgICAgICAgKFdlYkNvcmU6OkN1cmxTdHJl
YW06OnRyeVRvVHJhbnNmZXIpOgorICAgICAgICAoV2ViQ29yZTo6Q3VybFN0cmVhbTo6dHJ5VG9S
ZWNlaXZlKToKKyAgICAgICAgKFdlYkNvcmU6OkN1cmxTdHJlYW06OnRyeVRvU2VuZCk6CisgICAg
ICAgIChXZWJDb3JlOjpDdXJsU3RyZWFtOjpub3RpZnlGYWlsdXJlKToKKyAgICAgICAgKiBwbGF0
Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybFN0cmVhbS5oOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6
OkN1cmxTdHJlYW06OmNyZWF0ZSk6CisgICAgICAgICogcGxhdGZvcm0vbmV0d29yay9jdXJsL0N1
cmxTdHJlYW1TY2hlZHVsZXIuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkN1cmxTdHJl
YW1TY2hlZHVsZXI6OkN1cmxTdHJlYW1TY2hlZHVsZXIpOgorICAgICAgICAoV2ViQ29yZTo6Q3Vy
bFN0cmVhbVNjaGVkdWxlcjo6fkN1cmxTdHJlYW1TY2hlZHVsZXIpOgorICAgICAgICAoV2ViQ29y
ZTo6Q3VybFN0cmVhbVNjaGVkdWxlcjo6Y3JlYXRlU3RyZWFtKToKKyAgICAgICAgKFdlYkNvcmU6
OkN1cmxTdHJlYW1TY2hlZHVsZXI6OmRlc3Ryb3lTdHJlYW0pOgorICAgICAgICAoV2ViQ29yZTo6
Q3VybFN0cmVhbVNjaGVkdWxlcjo6c2VuZCk6CisgICAgICAgIChXZWJDb3JlOjpDdXJsU3RyZWFt
U2NoZWR1bGVyOjpjYWxsT25Xb3JrZXJUaHJlYWQpOgorICAgICAgICAoV2ViQ29yZTo6Q3VybFN0
cmVhbVNjaGVkdWxlcjo6Y2FsbENsaWVudE9uTWFpblRocmVhZCk6CisgICAgICAgIChXZWJDb3Jl
OjpDdXJsU3RyZWFtU2NoZWR1bGVyOjpzdGFydFRocmVhZElmTmVlZGVkKToKKyAgICAgICAgKFdl
YkNvcmU6OkN1cmxTdHJlYW1TY2hlZHVsZXI6OnN0b3BUaHJlYWRJZk5vTW9yZUpvYlJ1bm5pbmcp
OgorICAgICAgICAoV2ViQ29yZTo6Q3VybFN0cmVhbVNjaGVkdWxlcjo6ZXhlY3V0ZVRhc2tzKToK
KyAgICAgICAgKFdlYkNvcmU6OkN1cmxTdHJlYW1TY2hlZHVsZXI6OndvcmtlclRocmVhZCk6Cisg
ICAgICAgICogcGxhdGZvcm0vbmV0d29yay9jdXJsL0N1cmxTdHJlYW1TY2hlZHVsZXIuaDogQWRk
ZWQuCisgICAgICAgICogcGxhdGZvcm0vbmV0d29yay9jdXJsL1NvY2tldFN0cmVhbUhhbmRsZUlt
cGwuaDoKKyAgICAgICAgKFdlYkNvcmU6OlNvY2tldFN0cmVhbUhhbmRsZUltcGw6OmlzU3RyZWFt
SW52YWxpZGF0ZWQpOgorICAgICAgICAqIHBsYXRmb3JtL25ldHdvcmsvY3VybC9Tb2NrZXRTdHJl
YW1IYW5kbGVJbXBsQ3VybC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpTb2NrZXRTdHJlYW1IYW5k
bGVJbXBsOjpTb2NrZXRTdHJlYW1IYW5kbGVJbXBsKToKKyAgICAgICAgKFdlYkNvcmU6OlNvY2tl
dFN0cmVhbUhhbmRsZUltcGw6On5Tb2NrZXRTdHJlYW1IYW5kbGVJbXBsKToKKyAgICAgICAgKFdl
YkNvcmU6OlNvY2tldFN0cmVhbUhhbmRsZUltcGw6OnBsYXRmb3JtU2VuZEludGVybmFsKToKKyAg
ICAgICAgKFdlYkNvcmU6OlNvY2tldFN0cmVhbUhhbmRsZUltcGw6OnBsYXRmb3JtQ2xvc2UpOgor
ICAgICAgICAoV2ViQ29yZTo6U29ja2V0U3RyZWFtSGFuZGxlSW1wbDo6ZGlkT3Blbik6CisgICAg
ICAgIChXZWJDb3JlOjpTb2NrZXRTdHJlYW1IYW5kbGVJbXBsOjpkaWRTZW5kRGF0YSk6CisgICAg
ICAgIChXZWJDb3JlOjpTb2NrZXRTdHJlYW1IYW5kbGVJbXBsOjpkaWRSZWNlaXZlRGF0YSk6Cisg
ICAgICAgIChXZWJDb3JlOjpTb2NrZXRTdHJlYW1IYW5kbGVJbXBsOjpkaWRGYWlsKToKKyAgICAg
ICAgKFdlYkNvcmU6OlNvY2tldFN0cmVhbUhhbmRsZUltcGw6OmRlc3RydWN0U3RyZWFtKToKKyAg
ICAgICAgKFdlYkNvcmU6OlNvY2tldFN0cmVhbUhhbmRsZUltcGw6OnRocmVhZEVudHJ5UG9pbnQp
OiBEZWxldGVkLgorICAgICAgICAoV2ViQ29yZTo6U29ja2V0U3RyZWFtSGFuZGxlSW1wbDo6aGFu
ZGxlRXJyb3IpOiBEZWxldGVkLgorICAgICAgICAoV2ViQ29yZTo6U29ja2V0U3RyZWFtSGFuZGxl
SW1wbDo6c3RvcFRocmVhZCk6IERlbGV0ZWQuCisgICAgICAgIChXZWJDb3JlOjpTb2NrZXRTdHJl
YW1IYW5kbGVJbXBsOjpjYWxsT25Xb3JrZXJUaHJlYWQpOiBEZWxldGVkLgorICAgICAgICAoV2Vi
Q29yZTo6U29ja2V0U3RyZWFtSGFuZGxlSW1wbDo6ZXhlY3V0ZVRhc2tzKTogRGVsZXRlZC4KKwog
MjAyMC0wMi0xMiAgWXVzdWtlIFN1enVraSAgPHlzdXp1a2lAYXBwbGUuY29tPgogCiAgICAgICAg
IENTU1ZhbHVlUG9vbCdzIGNvbnN0YW50IENTUyB2YWx1ZXMgc2hvdWxkIG5vdCBiZSBhbGxvY2F0
ZWQgZHluYW1pY2FsbHkgKGFuZCBzYW1lIGZvciBWZWN0b3JzKQpkaWZmIC0tZ2l0IGEvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vQ3VybC5jbWFrZSBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL0N1
cmwuY21ha2UKaW5kZXggZjY4OTRhYzNlZjQxZWVmMDM4YzcxN2Q1MDIwNWRjOGU0YzdmYzJjNS4u
ZWRkYjVmYWMyZjM1YjhkNThjZDNjMDFkZTQ5NWQ5NTk0OWE3NzQwMSAxMDA2NDQKLS0tIGEvU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vQ3VybC5jbWFrZQorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9DdXJsLmNtYWtlCkBAIC0yMiw2ICsyMiw4IEBAIGxpc3QoQVBQRU5EIFdlYkNvcmVfU09V
UkNFUwogICAgIHBsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsUmVzb3VyY2VIYW5kbGVEZWxlZ2F0
ZS5jcHAKICAgICBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybFNTTEhhbmRsZS5jcHAKICAgICBw
bGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybFNTTFZlcmlmaWVyLmNwcAorICAgIHBsYXRmb3JtL25l
dHdvcmsvY3VybC9DdXJsU3RyZWFtLmNwcAorICAgIHBsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJs
U3RyZWFtU2NoZWR1bGVyLmNwcAogICAgIHBsYXRmb3JtL25ldHdvcmsvY3VybC9ETlNSZXNvbHZl
UXVldWVDdXJsLmNwcAogICAgIHBsYXRmb3JtL25ldHdvcmsvY3VybC9OZXR3b3JrU3RvcmFnZVNl
c3Npb25DdXJsLmNwcAogICAgIHBsYXRmb3JtL25ldHdvcmsvY3VybC9PcGVuU1NMSGVscGVyLmNw
cApAQCAtNTgsNiArNjAsOCBAQCBsaXN0KEFQUEVORCBXZWJDb3JlX1BSSVZBVEVfRlJBTUVXT1JL
X0hFQURFUlMKICAgICBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybFJlc3BvbnNlLmgKICAgICBw
bGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybFNTTEhhbmRsZS5oCiAgICAgcGxhdGZvcm0vbmV0d29y
ay9jdXJsL0N1cmxTU0xWZXJpZmllci5oCisgICAgcGxhdGZvcm0vbmV0d29yay9jdXJsL0N1cmxT
dHJlYW0uaAorICAgIHBsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsU3RyZWFtU2NoZWR1bGVyLmgK
ICAgICBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvRE5TUmVzb2x2ZVF1ZXVlQ3VybC5oCiAgICAgcGxh
dGZvcm0vbmV0d29yay9jdXJsL0Rvd25sb2FkQnVuZGxlLmgKICAgICBwbGF0Zm9ybS9uZXR3b3Jr
L2N1cmwvT3BlblNTTEhlbHBlci5oCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9uZXR3b3JrL2N1cmwvQ3VybENvbnRleHQuY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
bmV0d29yay9jdXJsL0N1cmxDb250ZXh0LmNwcAppbmRleCA3MTExNWFjZDUxOTAzNTU1MWI4Mzk0
YzNmYjE5YzNiMTMzYzI3NjM4Li4xNDY0ZWIwYzJlZjkzMjMzZmMwNDVhYzUwZWRjMzQ0NzBmNDZl
NTBlIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3Vy
bENvbnRleHQuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9D
dXJsQ29udGV4dC5jcHAKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlICJDdXJsUmVxdWVzdFNj
aGVkdWxlci5oIgogI2luY2x1ZGUgIkN1cmxTU0xIYW5kbGUuaCIKICNpbmNsdWRlICJDdXJsU1NM
VmVyaWZpZXIuaCIKKyNpbmNsdWRlICJDdXJsU3RyZWFtU2NoZWR1bGVyLmgiCiAjaW5jbHVkZSAi
SFRUUEhlYWRlck1hcC5oIgogI2luY2x1ZGUgPE5ldHdvcmtMb2FkTWV0cmljcy5oPgogI2luY2x1
ZGUgPG11dGV4PgpAQCAtMTQ2LDYgKzE0NywxMiBAQCB2b2lkIEN1cmxDb250ZXh0Ojppbml0U2hh
cmVIYW5kbGUoKQogICAgIGN1cmxfZWFzeV9jbGVhbnVwKGN1cmwpOwogfQogCitDdXJsU3RyZWFt
U2NoZWR1bGVyJiBDdXJsQ29udGV4dDo6c3RyZWFtU2NoZWR1bGVyKCkKK3sKKyAgICBzdGF0aWMg
TmV2ZXJEZXN0cm95ZWQ8Q3VybFN0cmVhbVNjaGVkdWxlcj4gc2hhcmVkSW5zdGFuY2U7CisgICAg
cmV0dXJuIHNoYXJlZEluc3RhbmNlOworfQorCiBib29sIEN1cmxDb250ZXh0Ojppc0h0dHAyRW5h
YmxlZCgpIGNvbnN0CiB7CiAgICAgY3VybF92ZXJzaW9uX2luZm9fZGF0YSogZGF0YSA9IGN1cmxf
dmVyc2lvbl9pbmZvKENVUkxWRVJTSU9OX05PVyk7CkBAIC04ODgsMTE0ICs4OTUsMjUgQEAgdm9p
ZCBDdXJsSGFuZGxlOjplbmFibGVTdGRFcnJJZlVzZWQoKQogCiAjZW5kaWYKIAotLy8gQ3VybFNv
Y2tldEhhbmRsZQotCi1DdXJsU29ja2V0SGFuZGxlOjpDdXJsU29ja2V0SGFuZGxlKGNvbnN0IFVS
TCYgdXJsLCBGdW5jdGlvbjx2b2lkKENVUkxjb2RlKT4mJiBlcnJvckhhbmRsZXIpCi0gICAgOiBt
X2Vycm9ySGFuZGxlcihXVEZNb3ZlKGVycm9ySGFuZGxlcikpCitFeHBlY3RlZDxjdXJsX3NvY2tl
dF90LCBDVVJMY29kZT4gQ3VybEhhbmRsZTo6Z2V0QWN0aXZlU29ja2V0KCkKIHsKLSAgICAvLyBM
aWJjdXJsIGlzIG5vdCByZXNwb25zaWJsZSBmb3IgdGhlIHByb3RvY29sIGhhbmRsaW5nLiBJdCBq
dXN0IGhhbmRsZXMgY29ubmVjdGlvbi4KLSAgICAvLyBPbmx5IHNjaGVtZSwgaG9zdCBhbmQgcG9y
dCBpcyByZXF1aXJlZC4KLSAgICBVUkwgdXJsRm9yQ29ubmVjdGlvbjsKLSAgICB1cmxGb3JDb25u
ZWN0aW9uLnNldFByb3RvY29sKHVybC5wcm90b2NvbElzKCJ3c3MiKSA/ICJodHRwcyIgOiAiaHR0
cCIpOwotICAgIHVybEZvckNvbm5lY3Rpb24uc2V0SG9zdEFuZFBvcnQodXJsLmhvc3RBbmRQb3J0
KCkpOwotICAgIHNldFVybCh1cmxGb3JDb25uZWN0aW9uKTsKLQotICAgIGVuYWJsZUNvbm5lY3Rp
b25Pbmx5KCk7Ci19CisgICAgY3VybF9zb2NrZXRfdCBzb2NrZXQ7CiAKLWJvb2wgQ3VybFNvY2tl
dEhhbmRsZTo6Y29ubmVjdCgpCi17Ci0gICAgQ1VSTGNvZGUgZXJyb3JDb2RlID0gcGVyZm9ybSgp
OwotICAgIGlmIChlcnJvckNvZGUgIT0gQ1VSTEVfT0spIHsKLSAgICAgICAgbV9lcnJvckhhbmRs
ZXIoZXJyb3JDb2RlKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KKyAgICBDVVJMY29k
ZSBlcnJvckNvZGUgPSBjdXJsX2Vhc3lfZ2V0aW5mbyhtX2hhbmRsZSwgQ1VSTElORk9fQUNUSVZF
U09DS0VULCAmc29ja2V0KTsKKyAgICBpZiAoZXJyb3JDb2RlICE9IENVUkxFX09LKQorICAgICAg
ICByZXR1cm4gbWFrZVVuZXhwZWN0ZWQoZXJyb3JDb2RlKTsKIAotICAgIHJldHVybiB0cnVlOwor
ICAgIHJldHVybiBzb2NrZXQ7CiB9CiAKLXNpemVfdCBDdXJsU29ja2V0SGFuZGxlOjpzZW5kKGNv
bnN0IHVpbnQ4X3QqIGJ1ZmZlciwgc2l6ZV90IHNpemUpCitDVVJMY29kZSBDdXJsSGFuZGxlOjpz
ZW5kKGNvbnN0IHVpbnQ4X3QqIGJ1ZmZlciwgc2l6ZV90IGJ1ZmZlclNpemUsIHNpemVfdCYgYnl0
ZXNTZW50KQogewotICAgIHNpemVfdCB0b3RhbEJ5dGVzU2VudCA9IDA7Ci0KLSAgICB3aGlsZSAo
dG90YWxCeXRlc1NlbnQgPCBzaXplKSB7Ci0gICAgICAgIHNpemVfdCBieXRlc1NlbnQgPSAwOwot
ICAgICAgICBDVVJMY29kZSBlcnJvckNvZGUgPSBjdXJsX2Vhc3lfc2VuZChoYW5kbGUoKSwgYnVm
ZmVyICsgdG90YWxCeXRlc1NlbnQsIHNpemUgLSB0b3RhbEJ5dGVzU2VudCwgJmJ5dGVzU2VudCk7
Ci0gICAgICAgIGlmIChlcnJvckNvZGUgIT0gQ1VSTEVfT0spIHsKLSAgICAgICAgICAgIGlmIChl
cnJvckNvZGUgIT0gQ1VSTEVfQUdBSU4pCi0gICAgICAgICAgICAgICAgbV9lcnJvckhhbmRsZXIo
ZXJyb3JDb2RlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgdG90
YWxCeXRlc1NlbnQgKz0gYnl0ZXNTZW50OwotICAgIH0KLQotICAgIHJldHVybiB0b3RhbEJ5dGVz
U2VudDsKKyAgICByZXR1cm4gY3VybF9lYXN5X3NlbmQobV9oYW5kbGUsIGJ1ZmZlciwgYnVmZmVy
U2l6ZSwgJmJ5dGVzU2VudCk7CiB9CiAKLU9wdGlvbmFsPHNpemVfdD4gQ3VybFNvY2tldEhhbmRs
ZTo6cmVjZWl2ZSh1aW50OF90KiBidWZmZXIsIHNpemVfdCBidWZmZXJTaXplKQorQ1VSTGNvZGUg
Q3VybEhhbmRsZTo6cmVjZWl2ZSh1aW50OF90KiBidWZmZXIsIHNpemVfdCBidWZmZXJTaXplLCBz
aXplX3QmIGJ5dGVzUmVhZCkKIHsKLSAgICBzaXplX3QgYnl0ZXNSZWFkID0gMDsKLQotICAgIENV
Ukxjb2RlIGVycm9yQ29kZSA9IGN1cmxfZWFzeV9yZWN2KGhhbmRsZSgpLCBidWZmZXIsIGJ1ZmZl
clNpemUsICZieXRlc1JlYWQpOwotICAgIGlmIChlcnJvckNvZGUgIT0gQ1VSTEVfT0spIHsKLSAg
ICAgICAgaWYgKGVycm9yQ29kZSAhPSBDVVJMRV9BR0FJTikKLSAgICAgICAgICAgIG1fZXJyb3JI
YW5kbGVyKGVycm9yQ29kZSk7Ci0KLSAgICAgICAgcmV0dXJuIFdURjo6bnVsbG9wdDsKLSAgICB9
Ci0KLSAgICByZXR1cm4gYnl0ZXNSZWFkOwotfQotCi1PcHRpb25hbDxDdXJsU29ja2V0SGFuZGxl
OjpXYWl0UmVzdWx0PiBDdXJsU29ja2V0SGFuZGxlOjp3YWl0KGNvbnN0IFNlY29uZHMmIHRpbWVv
dXQsIGJvb2wgYWxzb1dhaXRGb3JXcml0ZSkKLXsKLSAgICBjdXJsX3NvY2tldF90IHNvY2tldDsK
LSAgICBDVVJMY29kZSBlcnJvckNvZGUgPSBjdXJsX2Vhc3lfZ2V0aW5mbyhoYW5kbGUoKSwgQ1VS
TElORk9fQUNUSVZFU09DS0VULCAmc29ja2V0KTsKLSAgICBpZiAoZXJyb3JDb2RlICE9IENVUkxF
X09LKSB7Ci0gICAgICAgIG1fZXJyb3JIYW5kbGVyKGVycm9yQ29kZSk7Ci0gICAgICAgIHJldHVy
biBXVEY6Om51bGxvcHQ7Ci0gICAgfQotCi0gICAgaW50NjRfdCB1c2VjID0gdGltZW91dC5taWNy
b3NlY29uZHNBczxpbnQ2NF90PigpOwotCi0gICAgc3RydWN0IHRpbWV2YWwgc2VsZWN0VGltZW91
dDsKLSAgICBpZiAodXNlYyA8PSAwKSB7Ci0gICAgICAgIHNlbGVjdFRpbWVvdXQudHZfc2VjID0g
MDsKLSAgICAgICAgc2VsZWN0VGltZW91dC50dl91c2VjID0gMDsKLSAgICB9IGVsc2UgewotICAg
ICAgICBzZWxlY3RUaW1lb3V0LnR2X3NlYyA9IHVzZWMgLyAxMDAwMDAwOwotICAgICAgICBzZWxl
Y3RUaW1lb3V0LnR2X3VzZWMgPSB1c2VjICUgMTAwMDAwMDsKLSAgICB9Ci0KLSAgICBpbnQgcmMg
PSAwOwotICAgIGludCBtYXhmZCA9IHN0YXRpY19jYXN0PGludD4oc29ja2V0KSArIDE7Ci0gICAg
ZmRfc2V0IGZkcmVhZDsKLSAgICBmZF9zZXQgZmR3cml0ZTsKLSAgICBmZF9zZXQgZmRlcnI7Ci0K
LSAgICAvLyBSZXRyeSAnc2VsZWN0JyBpZiBpdCB3YXMgaW50ZXJydXB0ZWQgYnkgYSBwcm9jZXNz
IHNpZ25hbC4KLSAgICBkbyB7Ci0gICAgICAgIEZEX1pFUk8oJmZkcmVhZCk7Ci0gICAgICAgIEZE
X1NFVChzb2NrZXQsICZmZHJlYWQpOwotCi0gICAgICAgIEZEX1pFUk8oJmZkd3JpdGUpOwotICAg
ICAgICBpZiAoYWxzb1dhaXRGb3JXcml0ZSkKLSAgICAgICAgICAgIEZEX1NFVChzb2NrZXQsICZm
ZHdyaXRlKTsKLQotICAgICAgICBGRF9aRVJPKCZmZGVycik7Ci0gICAgICAgIEZEX1NFVChzb2Nr
ZXQsICZmZGVycik7Ci0KLSAgICAgICAgcmMgPSA6OnNlbGVjdChtYXhmZCwgJmZkcmVhZCwgJmZk
d3JpdGUsICZmZGVyciwgJnNlbGVjdFRpbWVvdXQpOwotICAgIH0gd2hpbGUgKHJjID09IC0xICYm
IGVycm5vID09IEVJTlRSKTsKLQotICAgIGlmIChyYyA8PSAwKQotICAgICAgICByZXR1cm4gV1RG
OjpudWxsb3B0OwotCi0gICAgV2FpdFJlc3VsdCByZXN1bHQ7Ci0gICAgcmVzdWx0LnJlYWRhYmxl
ID0gRkRfSVNTRVQoc29ja2V0LCAmZmRyZWFkKSB8fCBGRF9JU1NFVChzb2NrZXQsICZmZGVycik7
Ci0gICAgcmVzdWx0LndyaXRhYmxlID0gRkRfSVNTRVQoc29ja2V0LCAmZmR3cml0ZSk7Ci0gICAg
cmV0dXJuIHJlc3VsdDsKKyAgICByZXR1cm4gY3VybF9lYXN5X3JlY3YobV9oYW5kbGUsIGJ1ZmZl
ciwgYnVmZmVyU2l6ZSwgJmJ5dGVzUmVhZCk7CiB9CiAKIH0KZGlmZiAtLWdpdCBhL1NvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsQ29udGV4dC5oIGIvU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0N1cmxDb250ZXh0LmgKaW5kZXggYTRmOGMwMjgyNzY3
YjBiNDg3NzBhMDQ4ZWU4NTJmMTY2ZTA3YTdmNS4uM2M5MGU0YjFlY2M5ZTZiNDFmNzFiNjc2MDAz
ZTM2OWYxODYyMDk4OCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29y
ay9jdXJsL0N1cmxDb250ZXh0LmgKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29y
ay9jdXJsL0N1cmxDb250ZXh0LmgKQEAgLTg5LDYgKzg5LDcgQEAgcHJpdmF0ZToKIC8vIEN1cmxD
b250ZXh0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIGNs
YXNzIEN1cmxSZXF1ZXN0U2NoZWR1bGVyOworY2xhc3MgQ3VybFN0cmVhbVNjaGVkdWxlcjsKIAog
Y2xhc3MgQ3VybENvbnRleHQgOiBwdWJsaWMgQ3VybEdsb2JhbCB7CiAgICAgV1RGX01BS0VfTk9O
Q09QWUFCTEUoQ3VybENvbnRleHQpOwpAQCAtMTAxLDYgKzEwMiw3IEBAIHB1YmxpYzoKICAgICBj
b25zdCBDdXJsU2hhcmVIYW5kbGUmIHNoYXJlSGFuZGxlKCkgeyByZXR1cm4gbV9zaGFyZUhhbmRs
ZTsgfQogCiAgICAgQ3VybFJlcXVlc3RTY2hlZHVsZXImIHNjaGVkdWxlcigpIHsgcmV0dXJuICpt
X3NjaGVkdWxlcjsgfQorICAgIEN1cmxTdHJlYW1TY2hlZHVsZXImIHN0cmVhbVNjaGVkdWxlcigp
OwogCiAgICAgLy8gUHJveHkKICAgICBjb25zdCBDdXJsUHJveHlTZXR0aW5ncyYgcHJveHlTZXR0
aW5ncygpIGNvbnN0IHsgcmV0dXJuIG1fcHJveHlTZXR0aW5nczsgfQpAQCAtMjkzLDYgKzI5NSwx
MSBAQCBwdWJsaWM6CiAKICAgICBzdGF0aWMgbG9uZyBsb25nIG1heEN1cmxPZmZUKCk7CiAKKyAg
ICAvLyBzb2NrZXQKKyAgICBFeHBlY3RlZDxjdXJsX3NvY2tldF90LCBDVVJMY29kZT4gZ2V0QWN0
aXZlU29ja2V0KCk7CisgICAgQ1VSTGNvZGUgc2VuZChjb25zdCB1aW50OF90Kiwgc2l6ZV90LCBz
aXplX3QmKTsKKyAgICBDVVJMY29kZSByZWNlaXZlKHVpbnQ4X3QqLCBzaXplX3QsIHNpemVfdCYp
OworCiAjaWZuZGVmIE5ERUJVRwogICAgIHZvaWQgZW5hYmxlVmVyYm9zZUlmVXNlZCgpOwogICAg
IHZvaWQgZW5hYmxlU3RkRXJySWZVc2VkKCk7CkBAIC0zMTMsMjQgKzMyMCw0IEBAIHByaXZhdGU6
CiAgICAgc3RkOjp1bmlxdWVfcHRyPEN1cmxTU0xWZXJpZmllcj4gbV9zc2xWZXJpZmllcjsKIH07
CiAKLWNsYXNzIEN1cmxTb2NrZXRIYW5kbGUgOiBwdWJsaWMgQ3VybEhhbmRsZSB7Ci0gICAgV1RG
X01BS0VfTk9OQ09QWUFCTEUoQ3VybFNvY2tldEhhbmRsZSk7Ci0KLXB1YmxpYzoKLSAgICBzdHJ1
Y3QgV2FpdFJlc3VsdCB7Ci0gICAgICAgIGJvb2wgcmVhZGFibGUgeyBmYWxzZSB9OwotICAgICAg
ICBib29sIHdyaXRhYmxlIHsgZmFsc2UgfTsKLSAgICB9OwotCi0gICAgQ3VybFNvY2tldEhhbmRs
ZShjb25zdCBVUkwmLCBGdW5jdGlvbjx2b2lkKENVUkxjb2RlKT4mJiBlcnJvckhhbmRsZXIpOwot
Ci0gICAgYm9vbCBjb25uZWN0KCk7Ci0gICAgc2l6ZV90IHNlbmQoY29uc3QgdWludDhfdCosIHNp
emVfdCk7Ci0gICAgT3B0aW9uYWw8c2l6ZV90PiByZWNlaXZlKHVpbnQ4X3QqLCBzaXplX3QpOwot
ICAgIE9wdGlvbmFsPFdhaXRSZXN1bHQ+IHdhaXQoY29uc3QgU2Vjb25kcyYgdGltZW91dCwgYm9v
bCBhbHNvV2FpdEZvcldyaXRlKTsKLQotcHJpdmF0ZToKLSAgICBGdW5jdGlvbjx2b2lkKENVUkxj
b2RlKT4gbV9lcnJvckhhbmRsZXI7Ci19OwotCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYg
LS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybFN0cmVhbS5j
cHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybFN0cmVhbS5jcHAK
bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMC4uMjZkYzdiZWY0Yjc0YmM2YjRlMmU1MjZkZWM2NTIzYzNhZDZkMzY0MwotLS0g
L2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJs
U3RyZWFtLmNwcApAQCAtMCwwICsxLDE5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBT
b255IEludGVyYWN0aXZlIEVudGVydGFpbm1lbnQgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMg
YGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRS
SUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUg
ImNvbmZpZy5oIgorI2luY2x1ZGUgIkN1cmxTdHJlYW0uaCIKKworI2luY2x1ZGUgIkN1cmxTdHJl
YW1TY2hlZHVsZXIuaCIKKyNpbmNsdWRlICJTb2NrZXRTdHJlYW1FcnJvci5oIgorCisjaWYgVVNF
KENVUkwpCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworQ3VybFN0cmVhbTo6Q3VybFN0cmVhbShD
dXJsU3RyZWFtU2NoZWR1bGVyJiBzY2hlZHVsZXIsIEN1cmxTdHJlYW1JRCBzdHJlYW1JRCwgVVJM
JiYgdXJsKQorICAgIDogbV9zY2hlZHVsZXIoc2NoZWR1bGVyKQorICAgICwgbV9zdHJlYW1JRChz
dHJlYW1JRCkKK3sKKyAgICBBU1NFUlQoIWlzTWFpblRocmVhZCgpKTsKKworICAgIG1fY3VybEhh
bmRsZSA9IFdURjo6bWFrZVVuaXF1ZTxDdXJsSGFuZGxlPigpOworCisgICAgLy8gTGliY3VybCBp
cyBub3QgcmVzcG9uc2libGUgZm9yIHRoZSBwcm90b2NvbCBoYW5kbGluZy4gSXQganVzdCBoYW5k
bGVzIGNvbm5lY3Rpb24uCisgICAgLy8gT25seSBzY2hlbWUsIGhvc3QgYW5kIHBvcnQgaXMgcmVx
dWlyZWQuCisgICAgVVJMIHVybEZvckNvbm5lY3Rpb247CisgICAgdXJsRm9yQ29ubmVjdGlvbi5z
ZXRQcm90b2NvbCh1cmwucHJvdG9jb2xJcygid3NzIikgPyAiaHR0cHMiIDogImh0dHAiKTsKKyAg
ICB1cmxGb3JDb25uZWN0aW9uLnNldEhvc3RBbmRQb3J0KHVybC5ob3N0QW5kUG9ydCgpKTsKKyAg
ICBtX2N1cmxIYW5kbGUtPnNldFVybCh1cmxGb3JDb25uZWN0aW9uKTsKKworICAgIG1fY3VybEhh
bmRsZS0+ZW5hYmxlQ29ubmVjdGlvbk9ubHkoKTsKKworICAgIGF1dG8gZXJyb3JDb2RlID0gbV9j
dXJsSGFuZGxlLT5wZXJmb3JtKCk7CisgICAgaWYgKGVycm9yQ29kZSAhPSBDVVJMRV9PSykgewor
ICAgICAgICBub3RpZnlGYWlsdXJlKGVycm9yQ29kZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9
CisKKyAgICBtX3NjaGVkdWxlci5jYWxsQ2xpZW50T25NYWluVGhyZWFkKG1fc3RyZWFtSUQsIFtz
dHJlYW1JRCA9IG1fc3RyZWFtSURdKENsaWVudCYgY2xpZW50KSB7CisgICAgICAgIGNsaWVudC5k
aWRPcGVuKHN0cmVhbUlEKTsKKyAgICB9KTsKK30KKworQ3VybFN0cmVhbTo6fkN1cmxTdHJlYW0o
KQoreworICAgIEFTU0VSVCghaXNNYWluVGhyZWFkKCkpOworICAgIGRlc3Ryb3lIYW5kbGUoKTsK
K30KKwordm9pZCBDdXJsU3RyZWFtOjpkZXN0cm95SGFuZGxlKCkKK3sKKyAgICBpZiAoIW1fY3Vy
bEhhbmRsZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9jdXJsSGFuZGxlID0gbnVsbHB0cjsK
K30KKwordm9pZCBDdXJsU3RyZWFtOjpzZW5kKFVuaXF1ZUFycmF5PHVpbnQ4X3Q+JiYgYnVmZmVy
LCBzaXplX3QgbGVuZ3RoKQoreworICAgIEFTU0VSVCghaXNNYWluVGhyZWFkKCkpOworCisgICAg
aWYgKCFtX2N1cmxIYW5kbGUpCisgICAgICAgIHJldHVybjsKKworICAgIG1fc2VuZEJ1ZmZlcnMu
YXBwZW5kKHN0ZDo6bWFrZV9wYWlyKFdURk1vdmUoYnVmZmVyKSwgbGVuZ3RoKSk7Cit9CisKK3Zv
aWQgQ3VybFN0cmVhbTo6YXBwZW5kTW9uaXRvcmluZ0ZkKGZkX3NldCYgcmVhZGZkcywgZmRfc2V0
JiB3cml0ZWZkcywgZmRfc2V0JiBleGNlcHRmZHMsIGludCYgbWF4ZmQpCit7CisgICAgQVNTRVJU
KCFpc01haW5UaHJlYWQoKSk7CisKKyAgICBpZiAoIW1fY3VybEhhbmRsZSkKKyAgICAgICAgcmV0
dXJuOworCisgICAgYXV0byBzb2NrZXQgPSBtX2N1cmxIYW5kbGUtPmdldEFjdGl2ZVNvY2tldCgp
OworICAgIGlmICghc29ja2V0Lmhhc192YWx1ZSgpKSB7CisgICAgICAgIG5vdGlmeUZhaWx1cmUo
c29ja2V0LmVycm9yKCkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgRkRfU0VUKCpz
b2NrZXQsICZyZWFkZmRzKTsKKyAgICBGRF9TRVQoKnNvY2tldCwgJmV4Y2VwdGZkcyk7CisKKyAg
ICBpZiAobV9zZW5kQnVmZmVycy5zaXplKCkpCisgICAgICAgIEZEX1NFVCgqc29ja2V0LCAmd3Jp
dGVmZHMpOworCisgICAgaWYgKG1heGZkIDwgKnNvY2tldCkKKyAgICAgICAgbWF4ZmQgPSAqc29j
a2V0OworfQorCit2b2lkIEN1cmxTdHJlYW06OnRyeVRvVHJhbnNmZXIoY29uc3QgZmRfc2V0JiBy
ZWFkZmRzLCBjb25zdCBmZF9zZXQmIHdyaXRlZmRzLCBjb25zdCBmZF9zZXQmIGV4Y2VwdGZkcykK
K3sKKyAgICBBU1NFUlQoIWlzTWFpblRocmVhZCgpKTsKKworICAgIGlmICghbV9jdXJsSGFuZGxl
KQorICAgICAgICByZXR1cm47CisKKyAgICBhdXRvIHNvY2tldCA9IG1fY3VybEhhbmRsZS0+Z2V0
QWN0aXZlU29ja2V0KCk7CisgICAgaWYgKCFzb2NrZXQuaGFzX3ZhbHVlKCkpIHsKKyAgICAgICAg
bm90aWZ5RmFpbHVyZShzb2NrZXQuZXJyb3IoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisK
KyAgICBpZiAoRkRfSVNTRVQoKnNvY2tldCwgJnJlYWRmZHMpIHx8IEZEX0lTU0VUKCpzb2NrZXQs
ICZleGNlcHRmZHMpKQorICAgICAgICB0cnlUb1JlY2VpdmUoKTsKKworICAgIGlmIChGRF9JU1NF
VCgqc29ja2V0LCAmd3JpdGVmZHMpKQorICAgICAgICB0cnlUb1NlbmQoKTsKK30KKwordm9pZCBD
dXJsU3RyZWFtOjp0cnlUb1JlY2VpdmUoKQoreworICAgIGlmICghbV9jdXJsSGFuZGxlKQorICAg
ICAgICByZXR1cm47CisKKyAgICBhdXRvIHJlY2VpdmVCdWZmZXIgPSBtYWtlVW5pcXVlQXJyYXk8
dWludDhfdD4oa1JlY2VpdmVCdWZmZXJTaXplKTsKKyAgICBzaXplX3QgYnl0ZXNSZWNlaXZlZCA9
IDA7CisKKyAgICBhdXRvIGVycm9yQ29kZSA9IG1fY3VybEhhbmRsZS0+cmVjZWl2ZShyZWNlaXZl
QnVmZmVyLmdldCgpLCBrUmVjZWl2ZUJ1ZmZlclNpemUsIGJ5dGVzUmVjZWl2ZWQpOworICAgIGlm
IChlcnJvckNvZGUgIT0gQ1VSTEVfT0spIHsKKyAgICAgICAgaWYgKGVycm9yQ29kZSAhPSBDVVJM
RV9BR0FJTikKKyAgICAgICAgICAgIG5vdGlmeUZhaWx1cmUoZXJyb3JDb2RlKTsKKyAgICAgICAg
cmV0dXJuOworICAgIH0KKworICAgIC8vIDAgYnl0ZXMgaW5kaWNhdGVzIGEgY2xvc2VkIGNvbm5l
Y3Rpb24uCisgICAgaWYgKCFieXRlc1JlY2VpdmVkKQorICAgICAgICBkZXN0cm95SGFuZGxlKCk7
CisKKyAgICBtX3NjaGVkdWxlci5jYWxsQ2xpZW50T25NYWluVGhyZWFkKG1fc3RyZWFtSUQsIFtz
dHJlYW1JRCA9IG1fc3RyZWFtSUQsIGJ1ZmZlciA9IFdURk1vdmUocmVjZWl2ZUJ1ZmZlciksIGxl
bmd0aCA9IGJ5dGVzUmVjZWl2ZWRdKENsaWVudCYgY2xpZW50KSBtdXRhYmxlIHsKKyAgICAgICAg
Y2xpZW50LmRpZFJlY2VpdmVEYXRhKHN0cmVhbUlELCByZWludGVycHJldF9jYXN0PGNvbnN0IGNo
YXIqPihidWZmZXIuZ2V0KCkpLCBsZW5ndGgpOworICAgIH0pOworfQorCit2b2lkIEN1cmxTdHJl
YW06OnRyeVRvU2VuZCgpCit7CisgICAgaWYgKCFtX2N1cmxIYW5kbGUgfHwgIW1fc2VuZEJ1ZmZl
cnMuc2l6ZSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBhdXRvJiBbYnVmZmVyLCBsZW5ndGhd
ID0gbV9zZW5kQnVmZmVycy5maXJzdCgpOworICAgIHNpemVfdCBieXRlc1NlbnQgPSAwOworCisg
ICAgYXV0byBlcnJvckNvZGUgPSBtX2N1cmxIYW5kbGUtPnNlbmQoYnVmZmVyLmdldCgpICsgbV9z
ZW5kQnVmZmVyT2Zmc2V0LCBsZW5ndGggLSBtX3NlbmRCdWZmZXJPZmZzZXQsIGJ5dGVzU2VudCk7
CisgICAgaWYgKGVycm9yQ29kZSAhPSBDVVJMRV9PSykgeworICAgICAgICBpZiAoZXJyb3JDb2Rl
ICE9IENVUkxFX0FHQUlOKQorICAgICAgICAgICAgbm90aWZ5RmFpbHVyZShlcnJvckNvZGUpOwor
ICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbV9zZW5kQnVmZmVyT2Zmc2V0ICs9IGJ5dGVz
U2VudDsKKworICAgIGlmIChtX3NlbmRCdWZmZXJPZmZzZXQgPj0gbGVuZ3RoKSB7CisgICAgICAg
IG1fc2VuZEJ1ZmZlcnMucmVtb3ZlKDApOworICAgICAgICBtX3NlbmRCdWZmZXJPZmZzZXQgPSAw
OworICAgIH0KKworICAgIG1fc2NoZWR1bGVyLmNhbGxDbGllbnRPbk1haW5UaHJlYWQobV9zdHJl
YW1JRCwgW3N0cmVhbUlEID0gbV9zdHJlYW1JRCwgbGVuZ3RoID0gYnl0ZXNTZW50XShDbGllbnQm
IGNsaWVudCkgeworICAgICAgICBjbGllbnQuZGlkU2VuZERhdGEoc3RyZWFtSUQsIGxlbmd0aCk7
CisgICAgfSk7Cit9CisKK3ZvaWQgQ3VybFN0cmVhbTo6bm90aWZ5RmFpbHVyZShDVVJMY29kZSBl
cnJvckNvZGUpCit7CisgICAgZGVzdHJveUhhbmRsZSgpOworCisgICAgbV9zY2hlZHVsZXIuY2Fs
bENsaWVudE9uTWFpblRocmVhZChtX3N0cmVhbUlELCBbc3RyZWFtSUQgPSBtX3N0cmVhbUlELCBl
cnJvckNvZGVdKENsaWVudCYgY2xpZW50KSBtdXRhYmxlIHsKKyAgICAgICAgY2xpZW50LmRpZEZh
aWwoc3RyZWFtSUQsIGVycm9yQ29kZSk7CisgICAgfSk7Cit9CisKK30KKworI2VuZGlmCmRpZmYg
LS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybFN0cmVhbS5o
IGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0N1cmxTdHJlYW0uaApuZXcg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwLi4zMTNiMDE3M2RhNWNkNDA0YTFlM2ZjYWQ5NTczYjhmZjdjM2FiZDRmCi0tLSAvZGV2
L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0N1cmxTdHJl
YW0uaApAQCAtMCwwICsxLDg1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFNvbnkgSW50
ZXJhY3RpdmUgRW50ZXJ0YWlubWVudCBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz
dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmli
dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVy
aWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAKKyAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElT
JycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JT
CisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisg
KiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQg
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAq
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjcHJhZ21hIG9uY2UKKwor
I2luY2x1ZGUgIkN1cmxDb250ZXh0LmgiCisjaW5jbHVkZSA8d3RmL1VSTC5oPgorI2luY2x1ZGUg
PHd0Zi9VbmlxdWVBcnJheS5oPgorI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKworbmFtZXNwYWNl
IFdlYkNvcmUgeworCitjbGFzcyBDdXJsU3RyZWFtU2NoZWR1bGVyOworY2xhc3MgU29ja2V0U3Ry
ZWFtRXJyb3I7CisKK3VzaW5nIEN1cmxTdHJlYW1JRCA9IHVpbnQxNl90OworY29uc3QgQ3VybFN0
cmVhbUlEIGludmFsaWRDdXJsU3RyZWFtSUQgPSAwOworCitjbGFzcyBDdXJsU3RyZWFtIHsKKyAg
ICBXVEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsKKyAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShDdXJs
U3RyZWFtKTsKK3B1YmxpYzoKKyAgICBjbGFzcyBDbGllbnQgeworICAgIHB1YmxpYzoKKyAgICAg
ICAgdmlydHVhbCB2b2lkIGRpZE9wZW4oQ3VybFN0cmVhbUlEKSA9IDA7CisgICAgICAgIHZpcnR1
YWwgdm9pZCBkaWRTZW5kRGF0YShDdXJsU3RyZWFtSUQsIHNpemVfdCkgPSAwOworICAgICAgICB2
aXJ0dWFsIHZvaWQgZGlkUmVjZWl2ZURhdGEoQ3VybFN0cmVhbUlELCBjb25zdCBjaGFyKiwgc2l6
ZV90KSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBkaWRGYWlsKEN1cmxTdHJlYW1JRCwgQ1VS
TGNvZGUpID0gMDsKKyAgICB9OworCisgICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxDdXJsU3Ry
ZWFtPiBjcmVhdGUoQ3VybFN0cmVhbVNjaGVkdWxlciYgc2NoZWR1bGVyLCBDdXJsU3RyZWFtSUQg
c3RyZWFtSUQsIFVSTCYmIHVybCkKKyAgICB7CisgICAgICAgIHJldHVybiBXVEY6Om1ha2VVbmlx
dWU8Q3VybFN0cmVhbT4oc2NoZWR1bGVyLCBzdHJlYW1JRCwgV1RGTW92ZSh1cmwpKTsKKyAgICB9
CisKKyAgICBDdXJsU3RyZWFtKEN1cmxTdHJlYW1TY2hlZHVsZXImLCBDdXJsU3RyZWFtSUQsIFVS
TCYmKTsKKyAgICB2aXJ0dWFsIH5DdXJsU3RyZWFtKCk7CisKKyAgICB2b2lkIHNlbmQoVW5pcXVl
QXJyYXk8dWludDhfdD4mJiwgc2l6ZV90KTsKKworICAgIHZvaWQgYXBwZW5kTW9uaXRvcmluZ0Zk
KGZkX3NldCYsIGZkX3NldCYsIGZkX3NldCYsIGludCYpOworICAgIHZvaWQgdHJ5VG9UcmFuc2Zl
cihjb25zdCBmZF9zZXQmLCBjb25zdCBmZF9zZXQmLCBjb25zdCBmZF9zZXQmKTsKKworcHJpdmF0
ZToKKyAgICB2b2lkIGRlc3Ryb3lIYW5kbGUoKTsKKworICAgIHZvaWQgdHJ5VG9SZWNlaXZlKCk7
CisgICAgdm9pZCB0cnlUb1NlbmQoKTsKKworICAgIHZvaWQgbm90aWZ5RmFpbHVyZShDVVJMY29k
ZSk7CisKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtSZWNlaXZlQnVmZmVyU2l6ZSA9IDE2ICog
MTAyNDsKKworICAgIEN1cmxTdHJlYW1TY2hlZHVsZXImIG1fc2NoZWR1bGVyOworICAgIEN1cmxT
dHJlYW1JRCBtX3N0cmVhbUlEOworCisgICAgc3RkOjp1bmlxdWVfcHRyPEN1cmxIYW5kbGU+IG1f
Y3VybEhhbmRsZTsKKworICAgIFdURjo6VmVjdG9yPHN0ZDo6cGFpcjxVbmlxdWVBcnJheTx1aW50
OF90Piwgc2l6ZV90Pj4gbV9zZW5kQnVmZmVyczsKKyAgICBzaXplX3QgbV9zZW5kQnVmZmVyT2Zm
c2V0IHsgMCB9OworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEvU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0N1cmxTdHJlYW1TY2hlZHVsZXIuY3Bw
IGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0N1cmxTdHJlYW1TY2hlZHVs
ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAuLjg0NThlM2MxNDE2N2Q1YzliNzVhNzViZDdlOWRiZGIxZDE0MzVk
ODUKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1
cmwvQ3VybFN0cmVhbVNjaGVkdWxlci5jcHAKQEAgLTAsMCArMSwxOTAgQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMjAgU29ueSBJbnRlcmFjdGl2ZSBFbnRlcnRhaW5tZW50IEluYy4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJ
VFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElF
RCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJ
TkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9G
CisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1Ig
UFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgor
ICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJDdXJsU3RyZWFtU2NoZWR1bGVy
LmgiCisKKyNpZiBVU0UoQ1VSTCkKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitDdXJsU3RyZWFt
U2NoZWR1bGVyOjpDdXJsU3RyZWFtU2NoZWR1bGVyKCkKK3sKKyAgICBBU1NFUlQoaXNNYWluVGhy
ZWFkKCkpOworfQorCitDdXJsU3RyZWFtU2NoZWR1bGVyOjp+Q3VybFN0cmVhbVNjaGVkdWxlcigp
Cit7CisgICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKK30KKworQ3VybFN0cmVhbUlEIEN1cmxT
dHJlYW1TY2hlZHVsZXI6OmNyZWF0ZVN0cmVhbShjb25zdCBVUkwmIHVybCwgQ3VybFN0cmVhbTo6
Q2xpZW50JiBjbGllbnQpCit7CisgICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKKworICAgIGRv
IHsKKyAgICAgICAgbV9jdXJyZW50U3RyZWFtSUQgPSAobV9jdXJyZW50U3RyZWFtSUQgKyAxICE9
IGludmFsaWRDdXJsU3RyZWFtSUQpID8gbV9jdXJyZW50U3RyZWFtSUQgKyAxIDogMTsKKyAgICB9
IHdoaWxlIChtX2NsaWVudExpc3QuY29udGFpbnMobV9jdXJyZW50U3RyZWFtSUQpKTsKKworICAg
IGF1dG8gc3RyZWFtSUQgPSBtX2N1cnJlbnRTdHJlYW1JRDsKKyAgICBtX2NsaWVudExpc3QuYWRk
KHN0cmVhbUlELCAmY2xpZW50KTsKKworICAgIGNhbGxPbldvcmtlclRocmVhZChbdGhpcywgc3Ry
ZWFtSUQsIHVybCA9IHVybC5pc29sYXRlZENvcHkoKV0oKSBtdXRhYmxlIHsKKyAgICAgICAgbV9z
dHJlYW1MaXN0LmFkZChzdHJlYW1JRCwgQ3VybFN0cmVhbTo6Y3JlYXRlKCp0aGlzLCBzdHJlYW1J
RCwgV1RGTW92ZSh1cmwpKSk7CisgICAgfSk7CisKKyAgICByZXR1cm4gc3RyZWFtSUQ7Cit9CisK
K3ZvaWQgQ3VybFN0cmVhbVNjaGVkdWxlcjo6ZGVzdHJveVN0cmVhbShDdXJsU3RyZWFtSUQgc3Ry
ZWFtSUQpCit7CisgICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKKworICAgIGlmIChtX2NsaWVu
dExpc3QuY29udGFpbnMoc3RyZWFtSUQpKQorICAgICAgICBtX2NsaWVudExpc3QucmVtb3ZlKHN0
cmVhbUlEKTsKKworICAgIGNhbGxPbldvcmtlclRocmVhZChbdGhpcywgc3RyZWFtSURdKCkgewor
ICAgICAgICBpZiAobV9zdHJlYW1MaXN0LmNvbnRhaW5zKHN0cmVhbUlEKSkKKyAgICAgICAgICAg
IG1fc3RyZWFtTGlzdC5yZW1vdmUoc3RyZWFtSUQpOworICAgIH0pOworfQorCit2b2lkIEN1cmxT
dHJlYW1TY2hlZHVsZXI6OnNlbmQoQ3VybFN0cmVhbUlEIHN0cmVhbUlELCBVbmlxdWVBcnJheTx1
aW50OF90PiYmIGRhdGEsIHNpemVfdCBsZW5ndGgpCit7CisgICAgQVNTRVJUKGlzTWFpblRocmVh
ZCgpKTsKKworICAgIGNhbGxPbldvcmtlclRocmVhZChbdGhpcywgc3RyZWFtSUQsIGRhdGEgPSBX
VEZNb3ZlKGRhdGEpLCBsZW5ndGhdKCkgbXV0YWJsZSB7CisgICAgICAgIGlmIChhdXRvIHN0cmVh
bSA9IG1fc3RyZWFtTGlzdC5nZXQoc3RyZWFtSUQpKQorICAgICAgICAgICAgc3RyZWFtLT5zZW5k
KFdURk1vdmUoZGF0YSksIGxlbmd0aCk7CisgICAgfSk7Cit9CisKK3ZvaWQgQ3VybFN0cmVhbVNj
aGVkdWxlcjo6Y2FsbE9uV29ya2VyVGhyZWFkKFdURjo6RnVuY3Rpb248dm9pZCgpPiYmIHRhc2sp
Cit7CisgICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKKworICAgIHsKKyAgICAgICAgYXV0byBs
b2NrZXIgPSBob2xkTG9jayhtX211dGV4KTsKKyAgICAgICAgbV90YXNrUXVldWUuYXBwZW5kKFdU
Rk1vdmUodGFzaykpOworICAgIH0KKworICAgIHN0YXJ0VGhyZWFkSWZOZWVkZWQoKTsKK30KKwor
dm9pZCBDdXJsU3RyZWFtU2NoZWR1bGVyOjpjYWxsQ2xpZW50T25NYWluVGhyZWFkKEN1cmxTdHJl
YW1JRCBzdHJlYW1JRCwgV1RGOjpGdW5jdGlvbjx2b2lkKEN1cmxTdHJlYW06OkNsaWVudCYpPiYm
IHRhc2spCit7CisgICAgQVNTRVJUKCFpc01haW5UaHJlYWQoKSk7CisKKyAgICBjYWxsT25NYWlu
VGhyZWFkKFt0aGlzLCBzdHJlYW1JRCwgdGFzayA9IFdURk1vdmUodGFzayldKCkgeworICAgICAg
ICBpZiAoYXV0byBjbGllbnQgPSBtX2NsaWVudExpc3QuZ2V0KHN0cmVhbUlEKSkKKyAgICAgICAg
ICAgIHRhc2soKmNsaWVudCk7CisgICAgfSk7Cit9CisKK3ZvaWQgQ3VybFN0cmVhbVNjaGVkdWxl
cjo6c3RhcnRUaHJlYWRJZk5lZWRlZCgpCit7CisgICAgeworICAgICAgICBhdXRvIGxvY2tlciA9
IGhvbGRMb2NrKG1fbXV0ZXgpOworICAgICAgICBpZiAobV9ydW5UaHJlYWQpCisgICAgICAgICAg
ICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG1fdGhyZWFkKQorICAgICAgICBtX3RocmVhZC0+
d2FpdEZvckNvbXBsZXRpb24oKTsKKworICAgIG1fcnVuVGhyZWFkID0gdHJ1ZTsKKworICAgIG1f
dGhyZWFkID0gVGhyZWFkOjpjcmVhdGUoImN1cmxTdHJlYW1UaHJlYWQiLCBbdGhpc10geworICAg
ICAgICB3b3JrZXJUaHJlYWQoKTsKKyAgICB9KTsKK30KKwordm9pZCBDdXJsU3RyZWFtU2NoZWR1
bGVyOjpzdG9wVGhyZWFkSWZOb01vcmVKb2JSdW5uaW5nKCkKK3sKKyAgICBBU1NFUlQoIWlzTWFp
blRocmVhZCgpKTsKKworICAgIGlmIChtX3N0cmVhbUxpc3Quc2l6ZSgpKQorICAgICAgICByZXR1
cm47CisKKyAgICBhdXRvIGxvY2tlciA9IGhvbGRMb2NrKG1fbXV0ZXgpOworICAgIGlmIChtX3Rh
c2tRdWV1ZS5zaXplKCkpCisgICAgICAgIHJldHVybjsKKworICAgIG1fcnVuVGhyZWFkID0gZmFs
c2U7Cit9CisKK3ZvaWQgQ3VybFN0cmVhbVNjaGVkdWxlcjo6ZXhlY3V0ZVRhc2tzKCkKK3sKKyAg
ICBBU1NFUlQoIWlzTWFpblRocmVhZCgpKTsKKworICAgIFZlY3RvcjxXVEY6OkZ1bmN0aW9uPHZv
aWQoKT4+IHRhc2tRdWV1ZTsKKworICAgIHsKKyAgICAgICAgYXV0byBsb2NrZXIgPSBob2xkTG9j
ayhtX211dGV4KTsKKyAgICAgICAgdGFza1F1ZXVlID0gV1RGTW92ZShtX3Rhc2tRdWV1ZSk7Cisg
ICAgfQorCisgICAgZm9yIChhdXRvJiB0YXNrIDogdGFza1F1ZXVlKQorICAgICAgICB0YXNrKCk7
Cit9CisKK3ZvaWQgQ3VybFN0cmVhbVNjaGVkdWxlcjo6d29ya2VyVGhyZWFkKCkKK3sKKyAgICBB
U1NFUlQoIWlzTWFpblRocmVhZCgpKTsKKyAgICBzdGF0aWMgY29uc3QgaW50IHNlbGVjdFRpbWVv
dXRNUyA9IDIwOworICAgIHN0cnVjdCB0aW1ldmFsIHRpbWVvdXQgeyAwLCBzZWxlY3RUaW1lb3V0
TVMgKiAxMDAwfTsKKworICAgIHdoaWxlIChtX3J1blRocmVhZCkgeworICAgICAgICBleGVjdXRl
VGFza3MoKTsKKworICAgICAgICBpbnQgcmMgPSAwOworICAgICAgICBmZF9zZXQgcmVhZGZkczsK
KyAgICAgICAgZmRfc2V0IHdyaXRlZmRzOworICAgICAgICBmZF9zZXQgZXhjZXB0ZmRzOworCisg
ICAgICAgIGRvIHsKKyAgICAgICAgICAgIGludCBtYXhmZCA9IC0xOworCisgICAgICAgICAgICBG
RF9aRVJPKCZyZWFkZmRzKTsKKyAgICAgICAgICAgIEZEX1pFUk8oJndyaXRlZmRzKTsKKyAgICAg
ICAgICAgIEZEX1pFUk8oJmV4Y2VwdGZkcyk7CisKKyAgICAgICAgICAgIGZvciAoYXV0byYgc3Ry
ZWFtIDogbV9zdHJlYW1MaXN0LnZhbHVlcygpKQorICAgICAgICAgICAgICAgIHN0cmVhbS0+YXBw
ZW5kTW9uaXRvcmluZ0ZkKHJlYWRmZHMsIHdyaXRlZmRzLCBleGNlcHRmZHMsIG1heGZkKTsKKwor
ICAgICAgICAgICAgaWYgKG1heGZkID49IDApCisgICAgICAgICAgICAgICAgcmMgPSA6OnNlbGVj
dChtYXhmZCArIDEsICZyZWFkZmRzLCAmd3JpdGVmZHMsICZleGNlcHRmZHMsICZ0aW1lb3V0KTsK
KyAgICAgICAgfSB3aGlsZSAocmMgPT0gLTEgJiYgZXJybm8gPT0gRUlOVFIpOworCisgICAgICAg
IGZvciAoYXV0byYgc3RyZWFtIDogbV9zdHJlYW1MaXN0LnZhbHVlcygpKQorICAgICAgICAgICAg
c3RyZWFtLT50cnlUb1RyYW5zZmVyKHJlYWRmZHMsIHdyaXRlZmRzLCBleGNlcHRmZHMpOworCisg
ICAgICAgIHN0b3BUaHJlYWRJZk5vTW9yZUpvYlJ1bm5pbmcoKTsKKyAgICB9Cit9CisKK30KKwor
I2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwv
Q3VybFN0cmVhbVNjaGVkdWxlci5oIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9j
dXJsL0N1cmxTdHJlYW1TY2hlZHVsZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi43ZDg4MTIwNmM5Njg5ZjQzMzIy
Nzk2OWM5YjdmOWZmMjY4YmRhYWVkCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vbmV0d29yay9jdXJsL0N1cmxTdHJlYW1TY2hlZHVsZXIuaApAQCAtMCwwICsxLDY3
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFNvbnkgSW50ZXJhY3RpdmUgRW50ZXJ0YWlu
bWVudCBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg
KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZF
TlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9S
CisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgor
ICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBP
RiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIkN1cmxTdHJl
YW0uaCIKKyNpbmNsdWRlIDx3dGYvRnVuY3Rpb24uaD4KKyNpbmNsdWRlIDx3dGYvSGFzaE1hcC5o
PgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIEN1cmxTdHJlYW1TY2hlZHVsZXIgewor
ICAgIFdURl9NQUtFX0ZBU1RfQUxMT0NBVEVEOworICAgIFdURl9NQUtFX05PTkNPUFlBQkxFKEN1
cmxTdHJlYW1TY2hlZHVsZXIpOworcHVibGljOgorICAgIEN1cmxTdHJlYW1TY2hlZHVsZXIoKTsK
KyAgICB2aXJ0dWFsIH5DdXJsU3RyZWFtU2NoZWR1bGVyKCk7CisKKyAgICBDdXJsU3RyZWFtSUQg
Y3JlYXRlU3RyZWFtKGNvbnN0IFVSTCYsIEN1cmxTdHJlYW06OkNsaWVudCYpOworICAgIHZvaWQg
ZGVzdHJveVN0cmVhbShDdXJsU3RyZWFtSUQpOworICAgIHZvaWQgc2VuZChDdXJsU3RyZWFtSUQs
IFVuaXF1ZUFycmF5PHVpbnQ4X3Q+JiYsIHNpemVfdCk7CisKKyAgICB2b2lkIGNhbGxPbldvcmtl
clRocmVhZChXVEY6OkZ1bmN0aW9uPHZvaWQoKT4mJik7CisgICAgdm9pZCBjYWxsQ2xpZW50T25N
YWluVGhyZWFkKEN1cmxTdHJlYW1JRCwgV1RGOjpGdW5jdGlvbjx2b2lkKEN1cmxTdHJlYW06OkNs
aWVudCYpPiYmKTsKKworcHJpdmF0ZToKKyAgICB2b2lkIHN0YXJ0VGhyZWFkSWZOZWVkZWQoKTsK
KyAgICB2b2lkIHN0b3BUaHJlYWRJZk5vTW9yZUpvYlJ1bm5pbmcoKTsKKworICAgIHZvaWQgZXhl
Y3V0ZVRhc2tzKCk7CisKKyAgICB2b2lkIHdvcmtlclRocmVhZCgpOworCisgICAgTG9jayBtX211
dGV4OworICAgIFJlZlB0cjxUaHJlYWQ+IG1fdGhyZWFkOworICAgIGJvb2wgbV9ydW5UaHJlYWQg
eyBmYWxzZSB9OworCisgICAgQ3VybFN0cmVhbUlEIG1fY3VycmVudFN0cmVhbUlEID0gMTsKKwor
ICAgIFZlY3RvcjxGdW5jdGlvbjx2b2lkKCk+PiBtX3Rhc2tRdWV1ZTsKKyAgICBIYXNoTWFwPEN1
cmxTdHJlYW1JRCwgQ3VybFN0cmVhbTo6Q2xpZW50Kj4gbV9jbGllbnRMaXN0OworICAgIEhhc2hN
YXA8Q3VybFN0cmVhbUlELCBzdGQ6OnVuaXF1ZV9wdHI8Q3VybFN0cmVhbT4+IG1fc3RyZWFtTGlz
dDsKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9Tb2NrZXRTdHJlYW1IYW5kbGVJbXBsLmggYi9Tb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvU29ja2V0U3RyZWFtSGFuZGxlSW1wbC5o
CmluZGV4IDI1YmYzYzQ2YTJlYmRmYmE2NTg4ZmVkYTIwYTllOGM3ZWM4N2NiMzIuLmZhZDRlZjkx
OTgxMThmNWU2ZTVlZDdkM2MxNGI5OWU1NzQ1OTM0NTEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9Tb2NrZXRTdHJlYW1IYW5kbGVJbXBsLmgKKysrIGIv
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL1NvY2tldFN0cmVhbUhhbmRsZUlt
cGwuaApAQCAtMSw2ICsxLDcgQEAKIC8qCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDktMjAxOCBBcHBs
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xl
IEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgU29ueSBJ
bnRlcmFjdGl2ZSBFbnRlcnRhaW5tZW50IEluYy4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucyBhcmUKQEAgLTMxLDIzICszMiwxNyBAQAogCiAjcHJhZ21hIG9uY2UKIAotI2luY2x1ZGUg
IkN1cmxDb250ZXh0LmgiCisjaW5jbHVkZSAiQ3VybFN0cmVhbS5oIgogI2luY2x1ZGUgIlNvY2tl
dFN0cmVhbUhhbmRsZS5oIgogI2luY2x1ZGUgPHBhbC9TZXNzaW9uSUQuaD4KLSNpbmNsdWRlIDx3
dGYvRnVuY3Rpb24uaD4KLSNpbmNsdWRlIDx3dGYvTG9jay5oPgotI2luY2x1ZGUgPHd0Zi9NZXNz
YWdlUXVldWUuaD4KLSNpbmNsdWRlIDx3dGYvUmVmQ291bnRlZC5oPgogI2luY2x1ZGUgPHd0Zi9T
dHJlYW1CdWZmZXIuaD4KLSNpbmNsdWRlIDx3dGYvVGhyZWFkaW5nLmg+Ci0jaW5jbHVkZSA8d3Rm
L1VuaXF1ZUFycmF5Lmg+CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogY2xhc3MgU29ja2V0U3Ry
ZWFtSGFuZGxlQ2xpZW50OwogY2xhc3MgU3RvcmFnZVNlc3Npb25Qcm92aWRlcjsKIAotY2xhc3Mg
U29ja2V0U3RyZWFtSGFuZGxlSW1wbCA6IHB1YmxpYyBTb2NrZXRTdHJlYW1IYW5kbGUgeworY2xh
c3MgU29ja2V0U3RyZWFtSGFuZGxlSW1wbCA6IHB1YmxpYyBTb2NrZXRTdHJlYW1IYW5kbGUsIHB1
YmxpYyBDdXJsU3RyZWFtOjpDbGllbnQgewogcHVibGljOgogICAgIHN0YXRpYyBSZWY8U29ja2V0
U3RyZWFtSGFuZGxlSW1wbD4gY3JlYXRlKGNvbnN0IFVSTCYgdXJsLCBTb2NrZXRTdHJlYW1IYW5k
bGVDbGllbnQmIGNsaWVudCwgUEFMOjpTZXNzaW9uSUQsIGNvbnN0IFN0cmluZyYsIFNvdXJjZUFw
cGxpY2F0aW9uQXVkaXRUb2tlbiYmLCBjb25zdCBTdG9yYWdlU2Vzc2lvblByb3ZpZGVyKiBwcm92
aWRlcikgeyByZXR1cm4gYWRvcHRSZWYoKm5ldyBTb2NrZXRTdHJlYW1IYW5kbGVJbXBsKHVybCwg
Y2xpZW50LCBwcm92aWRlcikpOyB9CiAKQEAgLTY0LDI4ICs1OSwyMiBAQCBwcml2YXRlOgogICAg
IE9wdGlvbmFsPHNpemVfdD4gcGxhdGZvcm1TZW5kSW50ZXJuYWwoY29uc3QgdWludDhfdCosIHNp
emVfdCk7CiAgICAgYm9vbCBzZW5kUGVuZGluZ0RhdGEoKTsKIAotICAgIHZvaWQgdGhyZWFkRW50
cnlQb2ludChjb25zdCBVUkwmKTsKLSAgICB2b2lkIGhhbmRsZUVycm9yKENVUkxjb2RlKTsKLSAg
ICB2b2lkIHN0b3BUaHJlYWQoKTsKKyAgICB2b2lkIGRpZE9wZW4oQ3VybFN0cmVhbUlEKSBmaW5h
bDsKKyAgICB2b2lkIGRpZFNlbmREYXRhKEN1cmxTdHJlYW1JRCwgc2l6ZV90KSBmaW5hbDsKKyAg
ICB2b2lkIGRpZFJlY2VpdmVEYXRhKEN1cmxTdHJlYW1JRCwgY29uc3QgY2hhciosIHNpemVfdCkg
ZmluYWw7CisgICAgdm9pZCBkaWRGYWlsKEN1cmxTdHJlYW1JRCwgQ1VSTGNvZGUpIGZpbmFsOwog
Ci0gICAgdm9pZCBjYWxsT25Xb3JrZXJUaHJlYWQoRnVuY3Rpb248dm9pZCgpPiYmKTsKLSAgICB2
b2lkIGV4ZWN1dGVUYXNrcygpOwotCi0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBrUmVhZEJ1ZmZl
clNpemUgPSA0ICogMTAyNDsKKyAgICBib29sIGlzU3RyZWFtSW52YWxpZGF0ZWQoKSB7IHJldHVy
biBtX3N0cmVhbUlEID09IGludmFsaWRDdXJsU3RyZWFtSUQ7IH0KKyAgICB2b2lkIGRlc3RydWN0
U3RyZWFtKCk7CiAKICAgICBSZWZQdHI8Y29uc3QgU3RvcmFnZVNlc3Npb25Qcm92aWRlcj4gbV9z
dG9yYWdlU2Vzc2lvblByb3ZpZGVyOwotICAgIFJlZlB0cjxUaHJlYWQ+IG1fd29ya2VyVGhyZWFk
OwotICAgIHN0ZDo6YXRvbWljPGJvb2w+IG1fcnVubmluZyB7IHRydWUgfTsKLQotICAgIE1lc3Nh
Z2VRdWV1ZTxGdW5jdGlvbjx2b2lkKCk+PiBtX3Rhc2tRdWV1ZTsKLQotICAgIGJvb2wgbV9oYXNQ
ZW5kaW5nV3JpdGVEYXRhIHsgZmFsc2UgfTsKLSAgICBzaXplX3QgbV93cml0ZUJ1ZmZlclNpemUg
eyAwIH07Ci0gICAgc2l6ZV90IG1fd3JpdGVCdWZmZXJPZmZzZXQgeyAwIH07Ci0gICAgVW5pcXVl
QXJyYXk8dWludDhfdD4gbV93cml0ZUJ1ZmZlcjsKIAogICAgIFN0cmVhbUJ1ZmZlcjx1aW50OF90
LCAxMDI0ICogMTAyND4gbV9idWZmZXI7CiAgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIG1heEJ1
ZmZlclNpemUgPSAxMDAgKiAxMDI0ICogMTAyNDsKKworICAgIEN1cmxTdHJlYW1TY2hlZHVsZXIm
IG1fc2NoZWR1bGVyOworICAgIEN1cmxTdHJlYW1JRCBtX3N0cmVhbUlEIHsgaW52YWxpZEN1cmxT
dHJlYW1JRCB9OworICAgIHVuc2lnbmVkIG1fdG90YWxTZW5kRGF0YVNpemUgeyAwIH07CiB9Owog
CiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9uZXR3b3JrL2N1cmwvU29ja2V0U3RyZWFtSGFuZGxlSW1wbEN1cmwuY3BwIGIvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL1NvY2tldFN0cmVhbUhhbmRsZUltcGxDdXJs
LmNwcAppbmRleCAxM2E4MzJjMjY2OWI0Y2U4Y2JlYmYzMTM0YmEwODlkOTAyZGZhOTQ5Li4zYjZk
ZWE5ZWQyNTUyZDgxYWFmN2U2OTRhNWY5MjJlOTZkYmY5NGQ2IDEwMDY0NAotLS0gYS9Tb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvU29ja2V0U3RyZWFtSGFuZGxlSW1wbEN1cmwu
Y3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9Tb2NrZXRTdHJl
YW1IYW5kbGVJbXBsQ3VybC5jcHAKQEAgLTEsNyArMSw3IEBACiAvKgogICogQ29weXJpZ2h0IChD
KSAyMDA5IEJyZW50IEZ1bGdoYW0uICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogQ29weXJpZ2h0
IChDKSAyMDA5IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogQ29weXJpZ2h0
IChDKSAyMDE4IFNvbnkgSW50ZXJhY3RpdmUgRW50ZXJ0YWlubWVudCBJbmMuCisgKiBDb3B5cmln
aHQgKEMpIDIwMjAgU29ueSBJbnRlcmFjdGl2ZSBFbnRlcnRhaW5tZW50IEluYy4KICAqCiAgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKICAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKQEAgLTM1LDE4MyArMzUsMTAzIEBACiAKICNpZiBV
U0UoQ1VSTCkKIAorI2luY2x1ZGUgIkN1cmxTdHJlYW1TY2hlZHVsZXIuaCIKICNpbmNsdWRlICJE
ZXByZWNhdGVkR2xvYmFsU2V0dGluZ3MuaCIKLSNpbmNsdWRlICJMb2dnaW5nLmgiCiAjaW5jbHVk
ZSAiU29ja2V0U3RyZWFtRXJyb3IuaCIKICNpbmNsdWRlICJTb2NrZXRTdHJlYW1IYW5kbGVDbGll
bnQuaCIKICNpbmNsdWRlICJTdG9yYWdlU2Vzc2lvblByb3ZpZGVyLmgiCi0jaW5jbHVkZSA8d3Rm
L01haW5UaHJlYWQuaD4KLSNpbmNsdWRlIDx3dGYvVVJMLmg+Ci0jaW5jbHVkZSA8d3RmL3RleHQv
Q1N0cmluZy5oPgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKIFNvY2tldFN0cmVhbUhhbmRsZUlt
cGw6OlNvY2tldFN0cmVhbUhhbmRsZUltcGwoY29uc3QgVVJMJiB1cmwsIFNvY2tldFN0cmVhbUhh
bmRsZUNsaWVudCYgY2xpZW50LCBjb25zdCBTdG9yYWdlU2Vzc2lvblByb3ZpZGVyKiBwcm92aWRl
cikKICAgICA6IFNvY2tldFN0cmVhbUhhbmRsZSh1cmwsIGNsaWVudCkKICAgICAsIG1fc3RvcmFn
ZVNlc3Npb25Qcm92aWRlcihwcm92aWRlcikKKyAgICAsIG1fc2NoZWR1bGVyKEN1cmxDb250ZXh0
OjpzaW5nbGV0b24oKS5zdHJlYW1TY2hlZHVsZXIoKSkKIHsKLSAgICBMT0coTmV0d29yaywgIlNv
Y2tldFN0cmVhbUhhbmRsZSAlcCBuZXcgY2xpZW50ICVwIiwgdGhpcywgJm1fY2xpZW50KTsKLSAg
ICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOwotCiAgICAgLy8gRklYTUU6IFVzaW5nIERlcHJlY2F0
ZWRHbG9iYWxTZXR0aW5ncyBmcm9tIGhlcmUgaXMgYSBsYXllcmluZyB2aW9sYXRpb24uCiAgICAg
aWYgKG1fdXJsLnByb3RvY29sSXMoIndzcyIpICYmIERlcHJlY2F0ZWRHbG9iYWxTZXR0aW5nczo6
YWxsb3dzQW55U1NMQ2VydGlmaWNhdGUoKSkKICAgICAgICAgQ3VybENvbnRleHQ6OnNpbmdsZXRv
bigpLnNzbEhhbmRsZSgpLnNldElnbm9yZVNTTEVycm9ycyh0cnVlKTsKIAotICAgIG1fd29ya2Vy
VGhyZWFkID0gVGhyZWFkOjpjcmVhdGUoIldlYlNvY2tldCB0aHJlYWQiLCBbdGhpcywgcHJvdGVj
dGVkVGhpcyA9IG1ha2VSZWYoKnRoaXMpLCB1cmwgPSB1cmwuaXNvbGF0ZWRDb3B5KCldIHsKLSAg
ICAgICAgdGhyZWFkRW50cnlQb2ludCh1cmwpOwotICAgIH0pOworICAgIG1fc3RyZWFtSUQgPSBt
X3NjaGVkdWxlci5jcmVhdGVTdHJlYW0obV91cmwsICp0aGlzKTsKIH0KIAogU29ja2V0U3RyZWFt
SGFuZGxlSW1wbDo6flNvY2tldFN0cmVhbUhhbmRsZUltcGwoKQogewotICAgIExPRyhOZXR3b3Jr
LCAiU29ja2V0U3RyZWFtSGFuZGxlICVwIGRlbGV0ZSIsIHRoaXMpOwotICAgIHN0b3BUaHJlYWQo
KTsKKyAgICBkZXN0cnVjdFN0cmVhbSgpOwogfQogCiBPcHRpb25hbDxzaXplX3Q+IFNvY2tldFN0
cmVhbUhhbmRsZUltcGw6OnBsYXRmb3JtU2VuZEludGVybmFsKGNvbnN0IHVpbnQ4X3QqIGRhdGEs
IHNpemVfdCBsZW5ndGgpCiB7Ci0gICAgTE9HKE5ldHdvcmssICJTb2NrZXRTdHJlYW1IYW5kbGUg
JXAgcGxhdGZvcm1TZW5kIiwgdGhpcyk7Ci0gICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKKyAg
ICBpZiAoaXNTdHJlYW1JbnZhbGlkYXRlZCgpKQorICAgICAgICByZXR1cm4gV1RGOjpudWxsb3B0
OwogCi0gICAgaWYgKG1faGFzUGVuZGluZ1dyaXRlRGF0YSkKKyAgICBpZiAobV90b3RhbFNlbmRE
YXRhU2l6ZSArIGxlbmd0aCA+IG1heEJ1ZmZlclNpemUpCiAgICAgICAgIHJldHVybiAwOworICAg
IG1fdG90YWxTZW5kRGF0YVNpemUgKz0gbGVuZ3RoOwogCi0gICAgbV9oYXNQZW5kaW5nV3JpdGVE
YXRhID0gdHJ1ZTsKLQotICAgIGF1dG8gd3JpdGVCdWZmZXIgPSBtYWtlVW5pcXVlQXJyYXk8dWlu
dDhfdD4obGVuZ3RoKTsKLSAgICBtZW1jcHkod3JpdGVCdWZmZXIuZ2V0KCksIGRhdGEsIGxlbmd0
aCk7Ci0KLSAgICBjYWxsT25Xb3JrZXJUaHJlYWQoW3RoaXMsIHdyaXRlQnVmZmVyID0gV1RGTW92
ZSh3cml0ZUJ1ZmZlciksIHdyaXRlQnVmZmVyU2l6ZSA9IGxlbmd0aF0oKSBtdXRhYmxlIHsKLSAg
ICAgICAgQVNTRVJUKCFpc01haW5UaHJlYWQoKSk7Ci0gICAgICAgIG1fd3JpdGVCdWZmZXIgPSBX
VEZNb3ZlKHdyaXRlQnVmZmVyKTsKLSAgICAgICAgbV93cml0ZUJ1ZmZlclNpemUgPSB3cml0ZUJ1
ZmZlclNpemU7Ci0gICAgICAgIG1fd3JpdGVCdWZmZXJPZmZzZXQgPSAwOwotICAgIH0pOworICAg
IGF1dG8gYnVmZmVyID0gbWFrZVVuaXF1ZUFycmF5PHVpbnQ4X3Q+KGxlbmd0aCk7CisgICAgbWVt
Y3B5KGJ1ZmZlci5nZXQoKSwgZGF0YSwgbGVuZ3RoKTsKIAorICAgIG1fc2NoZWR1bGVyLnNlbmQo
bV9zdHJlYW1JRCwgV1RGTW92ZShidWZmZXIpLCBsZW5ndGgpOwogICAgIHJldHVybiBsZW5ndGg7
CiB9CiAKIHZvaWQgU29ja2V0U3RyZWFtSGFuZGxlSW1wbDo6cGxhdGZvcm1DbG9zZSgpCiB7Ci0g
ICAgTE9HKE5ldHdvcmssICJTb2NrZXRTdHJlYW1IYW5kbGUgJXAgcGxhdGZvcm1DbG9zZSIsIHRo
aXMpOwotICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7CisgICAgZGVzdHJ1Y3RTdHJlYW0oKTsK
IAogICAgIGlmIChtX3N0YXRlID09IENsb3NlZCkKICAgICAgICAgcmV0dXJuOwogICAgIG1fc3Rh
dGUgPSBDbG9zZWQ7CiAKLSAgICBzdG9wVGhyZWFkKCk7CiAgICAgbV9jbGllbnQuZGlkQ2xvc2VT
b2NrZXRTdHJlYW0oKnRoaXMpOwogfQogCi12b2lkIFNvY2tldFN0cmVhbUhhbmRsZUltcGw6OnRo
cmVhZEVudHJ5UG9pbnQoY29uc3QgVVJMJiB1cmwpCit2b2lkIFNvY2tldFN0cmVhbUhhbmRsZUlt
cGw6OmRpZE9wZW4oQ3VybFN0cmVhbUlEKQogewotICAgIEFTU0VSVCghaXNNYWluVGhyZWFkKCkp
OwotCi0gICAgQ3VybFNvY2tldEhhbmRsZSBzb2NrZXQgeyB1cmwsIFt0aGlzXShDVVJMY29kZSBl
cnJvckNvZGUpIHsKLSAgICAgICAgaGFuZGxlRXJyb3IoZXJyb3JDb2RlKTsKLSAgICB9fTsKLQot
ICAgIC8vIENvbm5lY3QgdG8gaG9zdAotICAgIGlmICghc29ja2V0LmNvbm5lY3QoKSkKKyAgICBp
ZiAobV9zdGF0ZSAhPSBDb25uZWN0aW5nKQogICAgICAgICByZXR1cm47CisgICAgbV9zdGF0ZSA9
IE9wZW47CiAKLSAgICBjYWxsT25NYWluVGhyZWFkKFt0aGlzLCBwcm90ZWN0ZWRUaGlzID0gbWFr
ZVJlZigqdGhpcyldIHsKLSAgICAgICAgaWYgKG1fc3RhdGUgPT0gQ29ubmVjdGluZykgewotICAg
ICAgICAgICAgbV9zdGF0ZSA9IE9wZW47Ci0gICAgICAgICAgICBtX2NsaWVudC5kaWRPcGVuU29j
a2V0U3RyZWFtKCp0aGlzKTsKLSAgICAgICAgfQotICAgIH0pOwotCi0gICAgd2hpbGUgKG1fcnVu
bmluZykgewotICAgICAgICBleGVjdXRlVGFza3MoKTsKLQotICAgICAgICBhdXRvIHJlc3VsdCA9
IHNvY2tldC53YWl0KDIwX21zLCBtX3dyaXRlQnVmZmVyLmdldCgpKTsKLSAgICAgICAgaWYgKCFy
ZXN1bHQpCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAvLyBUaGVzZSBsb2dpYyBv
bmx5IHJ1biB3aGVuIHRoZXJlJ3MgZGF0YSB3YWl0aW5nLgotICAgICAgICBpZiAocmVzdWx0LT53
cml0YWJsZSAmJiBtX3J1bm5pbmcpIHsKLSAgICAgICAgICAgIGF1dG8gYnl0ZXNTZW50ID0gc29j
a2V0LnNlbmQobV93cml0ZUJ1ZmZlci5nZXQoKSArIG1fd3JpdGVCdWZmZXJPZmZzZXQsIG1fd3Jp
dGVCdWZmZXJTaXplIC0gbV93cml0ZUJ1ZmZlck9mZnNldCk7Ci0gICAgICAgICAgICBtX3dyaXRl
QnVmZmVyT2Zmc2V0ICs9IGJ5dGVzU2VudDsKLQotICAgICAgICAgICAgaWYgKG1fd3JpdGVCdWZm
ZXJTaXplIDw9IG1fd3JpdGVCdWZmZXJPZmZzZXQpIHsKLSAgICAgICAgICAgICAgICBtX3dyaXRl
QnVmZmVyID0gbnVsbHB0cjsKLSAgICAgICAgICAgICAgICBtX3dyaXRlQnVmZmVyU2l6ZSA9IDA7
Ci0gICAgICAgICAgICAgICAgbV93cml0ZUJ1ZmZlck9mZnNldCA9IDA7Ci0KLSAgICAgICAgICAg
ICAgICBjYWxsT25NYWluVGhyZWFkKFt0aGlzLCBwcm90ZWN0ZWRUaGlzID0gbWFrZVJlZigqdGhp
cyldIHsKLSAgICAgICAgICAgICAgICAgICAgbV9oYXNQZW5kaW5nV3JpdGVEYXRhID0gZmFsc2U7
Ci0gICAgICAgICAgICAgICAgICAgIHNlbmRQZW5kaW5nRGF0YSgpOwotICAgICAgICAgICAgICAg
IH0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHJlc3VsdC0+cmVh
ZGFibGUgJiYgbV9ydW5uaW5nKSB7Ci0gICAgICAgICAgICBhdXRvIHJlYWRCdWZmZXIgPSBtYWtl
VW5pcXVlQXJyYXk8dWludDhfdD4oa1JlYWRCdWZmZXJTaXplKTsKLSAgICAgICAgICAgIGF1dG8g
Ynl0ZXNSZWFkID0gc29ja2V0LnJlY2VpdmUocmVhZEJ1ZmZlci5nZXQoKSwga1JlYWRCdWZmZXJT
aXplKTsKLSAgICAgICAgICAgIC8vIGBudWxsb3B0YCByZXN1bHQgbWVhbnMgbm90aGluZyB0byBo
YW5kbGUgYXQgdGhpcyBtb21lbnQuCi0gICAgICAgICAgICBpZiAoIWJ5dGVzUmVhZCkKLSAgICAg
ICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgLy8gMCBieXRlcyBpbmRpY2F0ZXMg
YSBjbG9zZWQgY29ubmVjdGlvbi4KLSAgICAgICAgICAgIGlmICghKmJ5dGVzUmVhZCkgewotICAg
ICAgICAgICAgICAgIG1fcnVubmluZyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGNhbGxPbk1h
aW5UaHJlYWQoW3RoaXMsIHByb3RlY3RlZFRoaXMgPSBtYWtlUmVmKCp0aGlzKV0gewotICAgICAg
ICAgICAgICAgICAgICBjbG9zZSgpOwotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAg
ICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYWxsT25NYWluVGhyZWFk
KFt0aGlzLCBwcm90ZWN0ZWRUaGlzID0gbWFrZVJlZigqdGhpcyksIGJ1ZmZlciA9IFdURk1vdmUo
cmVhZEJ1ZmZlciksIHNpemUgPSAqYnl0ZXNSZWFkIF0gewotICAgICAgICAgICAgICAgIGlmICht
X3N0YXRlID09IE9wZW4pCi0gICAgICAgICAgICAgICAgICAgIG1fY2xpZW50LmRpZFJlY2VpdmVT
b2NrZXRTdHJlYW1EYXRhKCp0aGlzLCByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihidWZm
ZXIuZ2V0KCkpLCBzaXplKTsKLSAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0gICAgfQotCi0g
ICAgbV93cml0ZUJ1ZmZlciA9IG51bGxwdHI7CisgICAgbV9jbGllbnQuZGlkT3BlblNvY2tldFN0
cmVhbSgqdGhpcyk7CiB9CiAKLXZvaWQgU29ja2V0U3RyZWFtSGFuZGxlSW1wbDo6aGFuZGxlRXJy
b3IoQ1VSTGNvZGUgZXJyb3JDb2RlKQordm9pZCBTb2NrZXRTdHJlYW1IYW5kbGVJbXBsOjpkaWRT
ZW5kRGF0YShDdXJsU3RyZWFtSUQsIHNpemVfdCBsZW5ndGgpCiB7Ci0gICAgbV9ydW5uaW5nID0g
ZmFsc2U7Ci0gICAgY2FsbE9uTWFpblRocmVhZChbdGhpcywgcHJvdGVjdGVkVGhpcyA9IG1ha2VS
ZWYoKnRoaXMpLCBlcnJvckNvZGUsIGxvY2FsaXplZERlc2NyaXB0aW9uID0gQ3VybEhhbmRsZTo6
ZXJyb3JEZXNjcmlwdGlvbihlcnJvckNvZGUpLmlzb2xhdGVkQ29weSgpXSB7Ci0gICAgICAgIGlm
IChtX3N0YXRlID09IENsb3NlZCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBpZiAo
ZXJyb3JDb2RlID09IENVUkxFX1JFQ1ZfRVJST1IpCi0gICAgICAgICAgICBtX2NsaWVudC5kaWRG
YWlsVG9SZWNlaXZlU29ja2V0U3RyZWFtRGF0YSgqdGhpcyk7Ci0gICAgICAgIGVsc2UKLSAgICAg
ICAgICAgIG1fY2xpZW50LmRpZEZhaWxTb2NrZXRTdHJlYW0oKnRoaXMsIFNvY2tldFN0cmVhbUVy
cm9yKHN0YXRpY19jYXN0PGludD4oZXJyb3JDb2RlKSwgeyB9LCBsb2NhbGl6ZWREZXNjcmlwdGlv
bikpOwotICAgIH0pOworICAgIEFTU0VSVChtX3RvdGFsU2VuZERhdGFTaXplIC0gbGVuZ3RoID49
IDApOworCisgICAgbV90b3RhbFNlbmREYXRhU2l6ZSAtPSBsZW5ndGg7CisgICAgc2VuZFBlbmRp
bmdEYXRhKCk7CiB9CiAKLXZvaWQgU29ja2V0U3RyZWFtSGFuZGxlSW1wbDo6c3RvcFRocmVhZCgp
Cit2b2lkIFNvY2tldFN0cmVhbUhhbmRsZUltcGw6OmRpZFJlY2VpdmVEYXRhKEN1cmxTdHJlYW1J
RCwgY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IGxlbmd0aCkKIHsKLSAgICBBU1NFUlQoaXNNYWlu
VGhyZWFkKCkpOwotCi0gICAgbV9ydW5uaW5nID0gZmFsc2U7CisgICAgaWYgKG1fc3RhdGUgIT0g
T3BlbikKKyAgICAgICAgcmV0dXJuOwogCi0gICAgaWYgKG1fd29ya2VyVGhyZWFkKSB7Ci0gICAg
ICAgIG1fd29ya2VyVGhyZWFkLT53YWl0Rm9yQ29tcGxldGlvbigpOwotICAgICAgICBtX3dvcmtl
clRocmVhZCA9IG51bGxwdHI7Ci0gICAgfQorICAgIG1fY2xpZW50LmRpZFJlY2VpdmVTb2NrZXRT
dHJlYW1EYXRhKCp0aGlzLCBkYXRhLCBsZW5ndGgpOwogfQogCi12b2lkIFNvY2tldFN0cmVhbUhh
bmRsZUltcGw6OmNhbGxPbldvcmtlclRocmVhZChGdW5jdGlvbjx2b2lkKCk+JiYgdGFzaykKK3Zv
aWQgU29ja2V0U3RyZWFtSGFuZGxlSW1wbDo6ZGlkRmFpbChDdXJsU3RyZWFtSUQsIENVUkxjb2Rl
IGVycm9yQ29kZSkKIHsKLSAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOwotICAgIG1fdGFza1F1
ZXVlLmFwcGVuZChtYWtlVW5pcXVlPEZ1bmN0aW9uPHZvaWQoKT4+KFdURk1vdmUodGFzaykpKTsK
KyAgICBkZXN0cnVjdFN0cmVhbSgpOworCisgICAgaWYgKG1fc3RhdGUgPT0gQ2xvc2VkKQorICAg
ICAgICByZXR1cm47CisKKyAgICBpZiAoZXJyb3JDb2RlID09IENVUkxFX1JFQ1ZfRVJST1IpCisg
ICAgICAgIG1fY2xpZW50LmRpZEZhaWxUb1JlY2VpdmVTb2NrZXRTdHJlYW1EYXRhKCp0aGlzKTsK
KyAgICBlbHNlCisgICAgICAgIG1fY2xpZW50LmRpZEZhaWxTb2NrZXRTdHJlYW0oKnRoaXMsIFNv
Y2tldFN0cmVhbUVycm9yKGVycm9yQ29kZSwgbV91cmwsIEN1cmxIYW5kbGU6OmVycm9yRGVzY3Jp
cHRpb24oZXJyb3JDb2RlKSkpOwogfQogCi12b2lkIFNvY2tldFN0cmVhbUhhbmRsZUltcGw6OmV4
ZWN1dGVUYXNrcygpCit2b2lkIFNvY2tldFN0cmVhbUhhbmRsZUltcGw6OmRlc3RydWN0U3RyZWFt
KCkKIHsKLSAgICBBU1NFUlQoIWlzTWFpblRocmVhZCgpKTsKKyAgICBpZiAoaXNTdHJlYW1JbnZh
bGlkYXRlZCgpKQorICAgICAgICByZXR1cm47CiAKLSAgICBhdXRvIHRhc2tzID0gbV90YXNrUXVl
dWUudGFrZUFsbE1lc3NhZ2VzKCk7Ci0gICAgZm9yIChhdXRvJiB0YXNrIDogdGFza3MpCi0gICAg
ICAgICgqdGFzaykoKTsKKyAgICBtX3NjaGVkdWxlci5kZXN0cm95U3RyZWFtKG1fc3RyZWFtSUQp
OworICAgIG1fc3RyZWFtSUQgPSBpbnZhbGlkQ3VybFN0cmVhbUlEOwogfQogCiB9IC8vIG5hbWVz
cGFjZSBXZWJDb3JlCg==
</data>

          </attachment>
      

    </bug>

</bugzilla>