<?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>143652</bug_id>
          
          <creation_ts>2015-04-12 14:40:05 -0700</creation_ts>
          <short_desc>Network Cache: Deduplicate body data</short_desc>
          <delta_ts>2015-04-14 11:41:34 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Page Loading</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Antti Koivisto">koivisto</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>barraclough</cc>
    
    <cc>cdumez</cc>
    
    <cc>commit-queue</cc>
    
    <cc>kling</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1084697</commentid>
    <comment_count>0</comment_count>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2015-04-12 14:40:05 -0700</bug_when>
    <thetext>We can improve disk space efficiency and use less memory by sharing identical body data between cache entries.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1084754</commentid>
    <comment_count>1</comment_count>
      <attachid>250631</attachid>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2015-04-13 01:53:13 -0700</bug_when>
    <thetext>Created attachment 250631
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1084755</commentid>
    <comment_count>2</comment_count>
      <attachid>250632</attachid>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2015-04-13 02:25:01 -0700</bug_when>
    <thetext>Created attachment 250632
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1084837</commentid>
    <comment_count>3</comment_count>
      <attachid>250632</attachid>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2015-04-13 09:49:28 -0700</bug_when>
    <thetext>Comment on attachment 250632
patch

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

&gt; Source/WebKit2/NetworkProcess/cache/NetworkCacheBlobStorage.cpp:37
&gt; +#if ENABLE(NETWORK_CACHE)

Usually between the main header include (#include &quot;NetworkCacheBlobStorage.h&quot;) and the remaining includes (#include &quot;Logging.h&quot; ...)

&gt; Source/WebKit2/NetworkProcess/cache/NetworkCacheBlobStorage.cpp:43
&gt; +    : m_blobDirectoryPath(blobDirectoryPath.utf8())

Why are we storing the path as a CString when we always use it as a String? I am guessing this has to do with thread-safety somehow?

&gt; Source/WebKit2/NetworkProcess/cache/NetworkCacheBlobStorage.cpp:60
&gt; +            unlink(filePath.data());

Why aren&apos;t we using WebCore::deleteFile()?

&gt; Source/WebKit2/NetworkProcess/cache/NetworkCacheBlobStorage.cpp:85
&gt; +    unlink(linkPath.data());

Why aren&apos;t we using WebCore::deleteFile()?

&gt; Source/WebKit2/NetworkProcess/cache/NetworkCacheBlobStorage.cpp:87
&gt; +    bool blobExists = access(blobPath.data(), F_OK) != -1;

WebCore::fileExists() ?

&gt; Source/WebKit2/NetworkProcess/cache/NetworkCacheBlobStorage.cpp:94
&gt; +        unlink(blobPath.data());

WebCore::deleteFile()?

&gt; Source/WebKit2/NetworkProcess/cache/NetworkCacheBlobStorage.cpp:144
&gt; +    unlink(linkPath.data());

WebCore::deleteFile()?

&gt; Source/WebKit2/NetworkProcess/cache/NetworkCacheBlobStorage.cpp:155
&gt; +    return stat.st_nlink - 1;

Why the - 1 ? Maybe add a comment for clarity.

&gt; Source/WebKit2/NetworkProcess/cache/NetworkCacheStorage.cpp:310
&gt; +static Data encodeRecordHeader(const Storage::Record&amp; record, SHA1::Digest bodyHash)

Why are we copying the Digest? (it is an std::array&lt;uint8_t, 20&gt;).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1084840</commentid>
    <comment_count>4</comment_count>
      <attachid>250632</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2015-04-13 09:52:59 -0700</bug_when>
    <thetext>Comment on attachment 250632
patch

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

&gt; Source/WebKit2/NetworkProcess/cache/NetworkCacheBlobStorage.cpp:155
&gt; +    return stat.st_nlink - 1;

Any danger of using more links to a single file than the file system supports?

&gt; Source/WebKit2/NetworkProcess/cache/NetworkCacheBlobStorage.h:35
&gt; +#include &lt;wtf/text/WTFString.h&gt;

Don’t need this include.

&gt; Source/WebKit2/NetworkProcess/cache/NetworkCacheBlobStorage.h:50
&gt; +    // These are all synchronous and should not be used from the main thread.

This comment applies to the constructor of the class too!

&gt; Source/WebKit2/NetworkProcess/cache/NetworkCacheBlobStorage.h:66
&gt; +    const CString m_blobDirectoryPath;

Don’t we have thread safety issues with the reference count of this data member? I don’t understand the threading restrictions on this class. Maybe the only function that is safe to call on another thread is approximateSize()?

&gt; Source/WebKit2/NetworkProcess/cache/NetworkCacheData.h:135
&gt; +Data mapFile(const CString&amp; path);

Unusual style to take a const CString&amp;; wouldn’t we normally take const char* instead?

&gt; Source/WebKit2/NetworkProcess/cache/NetworkCacheDataCocoa.mm:148
&gt; +    if (a.isNull() || b.isNull())
&gt; +        return false;

So null != null? Is that really what we want?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1084843</commentid>
    <comment_count>5</comment_count>
      <attachid>250632</attachid>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2015-04-13 09:57:11 -0700</bug_when>
    <thetext>Comment on attachment 250632
patch

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

&gt; Source/WebKit2/NetworkProcess/cache/NetworkCacheBlobStorage.cpp:121
&gt; +        return { };

Don&apos;t we need to munmap in this case?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1084848</commentid>
    <comment_count>6</comment_count>
      <attachid>250632</attachid>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2015-04-13 10:06:57 -0700</bug_when>
    <thetext>Comment on attachment 250632
patch

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

&gt; Source/WebKit2/NetworkProcess/cache/NetworkCacheDataCocoa.mm:133
&gt; +SHA1::Digest computeSHA1(const Data&amp; data)

Digest is an std::array and therefore cannot cheaply be moved (it is O(n) as it moves each contained element). Maybe we want to use a reference argument for this one, like SHA1::computeHash() does?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1084852</commentid>
    <comment_count>7</comment_count>
      <attachid>250632</attachid>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2015-04-13 10:18:47 -0700</bug_when>
    <thetext>Comment on attachment 250632
patch

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

&gt; Source/WebKit2/NetworkProcess/cache/NetworkCacheStorage.cpp:610
&gt; +        // This cleans unreferences blobs.

&quot;unreferenced&quot; ?

&gt; Source/WebKit2/NetworkProcess/cache/NetworkCacheStorage.cpp:642
&gt; +        effectiveWorth /= std::min(bodyShareCount, maximumEffectiveShareCount);

Maybe I am misreading but shouldn&apos;t it be the opposite? The higher the bodyShareCount, the higher the effectiveWorth should be?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1084880</commentid>
    <comment_count>8</comment_count>
      <attachid>250632</attachid>
    <who name="Andreas Kling">kling</who>
    <bug_when>2015-04-13 11:00:49 -0700</bug_when>
    <thetext>Comment on attachment 250632
patch

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

&gt; Source/WebKit2/NetworkProcess/cache/NetworkCacheBlobStorage.cpp:107
&gt; +    void* map = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);

We should make sure to drop PROT_WRITE once we&apos;re done writing the resource out to disk.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1085112</commentid>
    <comment_count>9</comment_count>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2015-04-14 05:11:17 -0700</bug_when>
    <thetext>&gt; &gt; Source/WebKit2/NetworkProcess/cache/NetworkCacheBlobStorage.cpp:60
&gt; &gt; +            unlink(filePath.data());
&gt; 
&gt; Why aren&apos;t we using WebCore::deleteFile()?

I don&apos;t use the abstractions in this file because

- Existing abstractions don&apos;t cover everything needed and I don&apos;t want to expand them for no practical benefit. For consistency I use system calls everywhere.
- No one seems to be interested in making non-Posix port.
- Here specifically I want to to unlink, not delete anything. deleteFile might do wrong thing on non-Posix platform.

&gt; Why are we copying the Digest? (it is an std::array&lt;uint8_t, 20&gt;).

It is still cheap and it reads better. Compiler may optimize moves.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1085113</commentid>
    <comment_count>10</comment_count>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2015-04-14 05:26:42 -0700</bug_when>
    <thetext>(In reply to comment #4)
&gt; Comment on attachment 250632 [details]
&gt; patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=250632&amp;action=review
&gt; 
&gt; &gt; Source/WebKit2/NetworkProcess/cache/NetworkCacheBlobStorage.cpp:155
&gt; &gt; +    return stat.st_nlink - 1;
&gt; 
&gt; Any danger of using more links to a single file than the file system
&gt; supports?

Not really. On Apple platforms the limit seems to be 32767. If that fills then the link call will fail. We won&apos;t create new cache entries for that resource but it shouldn&apos;t be a problem otherwise.

&gt; Don’t we have thread safety issues with the reference count of this data
&gt; member? I don’t understand the threading restrictions on this class. Maybe
&gt; the only function that is safe to call on another thread is
&gt; approximateSize()?

It is ok as long as the ref count is not accessed from any other thread (and it isn&apos;t). Cache is currently a singleton so these s guaranteed to stay alive. But I&apos;ll switch to isolatedCopy() based scheme suggested by Anders which reads better.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1085115</commentid>
    <comment_count>11</comment_count>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2015-04-14 05:37:10 -0700</bug_when>
    <thetext>&gt; Maybe I am misreading but shouldn&apos;t it be the opposite? The higher the
&gt; bodyShareCount, the higher the effectiveWorth should be?

Good catch, did some last minute changes here and got this one wrong.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1085116</commentid>
    <comment_count>12</comment_count>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2015-04-14 05:52:10 -0700</bug_when>
    <thetext>&gt; So null != null? Is that really what we want?

Debatable. The function is called bytesEqual. Can they be equal if they don&apos;t exist? (we differentiate between null and empty here).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1085117</commentid>
    <comment_count>13</comment_count>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2015-04-14 05:54:09 -0700</bug_when>
    <thetext>&gt; Digest is an std::array and therefore cannot cheaply be moved (it is O(n) as
&gt; it moves each contained element). Maybe we want to use a reference argument
&gt; for this one, like SHA1::computeHash() does?

std::array is a fixed size data structure. Copies of instances are constant time.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1085134</commentid>
    <comment_count>14</comment_count>
      <attachid>250706</attachid>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2015-04-14 07:55:32 -0700</bug_when>
    <thetext>Created attachment 250706
applied comments</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1085203</commentid>
    <comment_count>15</comment_count>
      <attachid>250706</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2015-04-14 11:41:28 -0700</bug_when>
    <thetext>Comment on attachment 250706
applied comments

Clearing flags on attachment: 250706

Committed r182803: &lt;http://trac.webkit.org/changeset/182803&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1085204</commentid>
    <comment_count>16</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2015-04-14 11:41:34 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>250631</attachid>
            <date>2015-04-13 01:53:13 -0700</date>
            <delta_ts>2015-04-13 02:25:01 -0700</delta_ts>
            <desc>patch</desc>
            <filename>disk-cache-deduplication-9.patch</filename>
            <type>text/plain</type>
            <size>57996</size>
            <attacher name="Antti Koivisto">koivisto</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJLaXQyL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
S2l0Mi9DaGFuZ2VMb2cJKHJldmlzaW9uIDE4MjY4NykKKysrIFNvdXJjZS9XZWJLaXQyL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDE1MCBAQAorMjAxNS0wNC0xMiAgQW50dGkg
S29pdmlzdG8gIDxhbnR0aUBhcHBsZS5jb20+CisKKyAgICAgICAgTmV0d29yayBDYWNoZTogRGVk
dXBsaWNhdGUgYm9keSBkYXRhCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3df
YnVnLmNnaT9pZD0xNDM2NTIKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4K
KworICAgICAgICBJdCBpcyBjb21tb24gdG8gaGF2ZSBjYWNoZSBlbnRyaWVzIHRoYXQgaGF2ZSBk
aWZmZXJlbnQgaGVhZGVycyBvciBwYXJ0aXRpb24gYnV0IHNoYXJlIHRoZSBzYW1lIGJvZHkgZGF0
YS4KKyAgICAgICAgV2UgY2FuIGltcHJvdmUgZGlzayBzcGFjZSBlZmZpY2llbmN5IGFuZCB1c2Ug
bGVzcyBtZW1vcnkgYnkgc2hhcmluZyBpZGVudGljYWwgYm9keSBkYXRhIGJldHdlZW4gY2FjaGUg
ZW50cmllcy4KKworICAgICAgICBUaGlzIHBhdGNoIHNwbGl0cyB0aGUgYm9keSBkYXRhIG91dCBm
cm9tIHRoZSByZWNvcmQgZmlsZS4gVGhlIG5ldyByZWNvcmQgZmlsZSBjb250YWlucyBtZXRhIGRh
dGEgYW5kIHJlc3BvbnNlCisgICAgICAgIGhlYWRlcnMgb25seS4gQm9keSBkYXRhIGlzIHN0b3Jl
ZCB1c2luZyB0aGUgbmV3IEJsb2JTdG9yYWdlIGludGVyZmFjZS4gRmlsZXMgYXJlIGRlZHVwbGlj
YXRlZCBieSBjb21wdXRpbmcKKyAgICAgICAgU0hBMSBoYXNoIG92ZXIgdGhlIGRhdGEgYW5kIGxv
b2tpbmcgZm9yIGFuIGV4aXN0aW5nIGJsb2Igd2l0aCB0aGUgc2FtZSBoYXNoLiBJZiBmb3VuZCB0
aGUgZXhpc3RpbmcgZW50cnkKKyAgICAgICAgaXMgcmV1c2VkIGJ5IGNyZWF0aW5nIGEgaGFyZCBs
aW5rIHRvIGl0LgorCisgICAgICAgIFRoZSBuZXcgZGlzayBzdHJ1Y3R1cmUgbG9va3MgbGlrZSB0
aGlzOgorCisgICAgICAgIFdlYktpdENhY2hlLworICAgICAgICAgICAgVmVyc2lvbiAzLworICAg
ICAgICAgICAgICAgIEJsb2JzLworICAgICAgICAgICAgICAgICAgICAwQTNDOUE5NzBBREEyN0ZB
RTlCRDdCQzYzMEJBRDBCOTI5QzI5M0MwCisgICAgICAgICAgICAgICAgICAgIDBBNkI4MDYwQkE3
N0RGOTJDODJBMkZEN0FGNThGNzk1MjREOEYzNEMKKyAgICAgICAgICAgICAgICAgICAgLi4uCisg
ICAgICAgICAgICAgICAgUmVjb3Jkcy8KKyAgICAgICAgICAgICAgICAgICAgYXBwbGUuY29tLwor
ICAgICAgICAgICAgICAgICAgICAgICAgMEI4NjQ1QjA0RTdFQzc4QzE3OEI3NDYwMDUyNjAxQzIK
KyAgICAgICAgICAgICAgICAgICAgICAgIDBCODY0NUIwNEU3RUM3OEMxNzhCNzQ2MDA1MjYwMUMy
LWJvZHkKKyAgICAgICAgICAgICAgICAgICAgICAgIDBDQjFBMzYzOEQxQzVBMDlDNUUzMjgzQTc0
RkEwNDBCCisgICAgICAgICAgICAgICAgICAgICAgICAwQ0IxQTM2MzhEMUM1QTA5QzVFMzI4M0E3
NEZBMDQwQi1ib2R5CisgICAgICAgICAgICAgICAgICAgICAgICAuLi4KKworICAgICAgICBFYWNo
IHJlY29yZCBmaWxlIGhhcyBhbiBhc3NvY2lhdGVkIC1ib2R5IHdoaWNoIGlzIGEgaGFyZCBsaW5r
IHRvIGEgZmlsZSBpbiB0aGUgQmxvYnMgZGlyZWN0b3J5LgorCisgICAgICAgIFRoZSBwYXRjaCBp
bmNyZWFzZXMgZWZmZWN0aXZlIGNhcGFjaXR5IGJ5IDEwLTIwJSB3aXRoIGEgdHlwaWNhbCBjYWNo
ZS4gSXQgYWxzbyBzYXZlcyBtZW1vcnkgZXNwZWNpYWxseSB3aGVuIGlkZW50aWNhbAorICAgICAg
ICByZXNvdXJjZXMgYXJlIHVzZWQgaW4gbXVsdGlwbGUgdGFicy4KKworICAgICAgICBDdXJyZW50
bHkgYWxsID4wIHNpemVkIHJlc291cmNlcyBhcmUgc3RvcmVkIGFzIHNoYXJlZCBibG9icy4gSW4g
ZnV0dXJlIHNtYWxsIHJlc291cmNlcyBzaG91bGQgYmUgaW50ZWdyYXRlZCBpbnRvIHJlY29yZAor
ICAgICAgICBmaWxlcyBhbmQgYmxvYnMgdXNlZCBmb3IgbGFyZ2VyIGZpbGVzIG9ubHkuCisKKyAg
ICAgICAgKiBOZXR3b3JrUHJvY2Vzcy9jYWNoZS9OZXR3b3JrQ2FjaGUuY3BwOgorICAgICAgICAo
V2ViS2l0OjpOZXR3b3JrQ2FjaGU6OkNhY2hlOjpzdG9yZSk6CisgICAgICAgIChXZWJLaXQ6Ok5l
dHdvcmtDYWNoZTo6Q2FjaGU6OnVwZGF0ZSk6CisKKyAgICAgICAgICAgIEFkb3B0IHRoZSBuZXcg
c3RvcmFnZSBpbnRlcmZhY2UuCisKKyAgICAgICAgKFdlYktpdDo6TmV0d29ya0NhY2hlOjpDYWNo
ZTo6ZHVtcENvbnRlbnRzVG9GaWxlKToKKyAgICAgICAgKiBOZXR3b3JrUHJvY2Vzcy9jYWNoZS9O
ZXR3b3JrQ2FjaGVCbG9iU3RvcmFnZS5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViS2l0OjpOZXR3
b3JrQ2FjaGU6OkJsb2JTdG9yYWdlOjpCbG9iU3RvcmFnZSk6CisgICAgICAgIChXZWJLaXQ6Ok5l
dHdvcmtDYWNoZTo6QmxvYlN0b3JhZ2U6OnN5bmNocm9uaXplKToKKworICAgICAgICAgICAgQ29t
cHV0ZSBzaXplIGFuZCBkZWxldGUgdW51c2VkIGZpbGVzIGZyb20gdGhlIEJsb2JzIGRpcmVjdG9y
eSAobGluayBjb3VudCA9PSAxKS4KKworICAgICAgICAoV2ViS2l0OjpOZXR3b3JrQ2FjaGU6OkJs
b2JTdG9yYWdlOjpibG9iUGF0aCk6CisgICAgICAgIChXZWJLaXQ6Ok5ldHdvcmtDYWNoZTo6Qmxv
YlN0b3JhZ2U6OmFkZCk6CisgICAgICAgIChXZWJLaXQ6Ok5ldHdvcmtDYWNoZTo6QmxvYlN0b3Jh
Z2U6OmdldCk6CisKKyAgICAgICAgICAgIEludGVyZmFjZSBmb3Igc3RvcmluZyBhbmQgcmV0cmll
dmluZyBkYXRhIGJsb2JzLiBCbG9icyBhcmUgZGVkdXBsaWNhdGVkIG9uIGFkZC4KKworICAgICAg
ICAoV2ViS2l0OjpOZXR3b3JrQ2FjaGU6OkJsb2JTdG9yYWdlOjpyZW1vdmUpOgorCisgICAgICAg
ICAgICBSZW1vdmVzIHRoZSBsaW5rIGJ1dCBkb2Vzbid0IHJlbW92ZSB0aGUgYmxvYiBldmVuIGlm
IHRoZXJlIGFyZSBubyBvdGhlciBjbGllbnRzLiBUaGF0IGhhcHBlbnMgb24gbmV4dCBzeW5jaHJv
bml6ZSgpLgorCisgICAgICAgIChXZWJLaXQ6Ok5ldHdvcmtDYWNoZTo6QmxvYlN0b3JhZ2U6OnNo
YXJlQ291bnQpOgorCisgICAgICAgICAgICBDaGVja3MgdGhlIGxpbmsgY291bnQgdG8gZ2V0IHRo
ZSBudW1iZXIgb2YgY2xpZW50cy4KKworICAgICAgICAqIE5ldHdvcmtQcm9jZXNzL2NhY2hlL05l
dHdvcmtDYWNoZUJsb2JTdG9yYWdlLmg6IEFkZGVkLgorICAgICAgICAoV2ViS2l0OjpOZXR3b3Jr
Q2FjaGU6OkJsb2JTdG9yYWdlOjphcHByb3hpbWF0ZVNpemUpOgorICAgICAgICAqIE5ldHdvcmtQ
cm9jZXNzL2NhY2hlL05ldHdvcmtDYWNoZUNvZGVycy5jcHA6CisgICAgICAgIChXZWJLaXQ6Ok5l
dHdvcmtDYWNoZTo6Q29kZXI8U0hBMTo6RGlnZXN0Pjo6ZW5jb2RlKToKKyAgICAgICAgKFdlYktp
dDo6TmV0d29ya0NhY2hlOjpDb2RlcjxTSEExOjpEaWdlc3Q+OjpkZWNvZGUpOgorICAgICAgICAq
IE5ldHdvcmtQcm9jZXNzL2NhY2hlL05ldHdvcmtDYWNoZUNvZGVycy5oOgorICAgICAgICAqIE5l
dHdvcmtQcm9jZXNzL2NhY2hlL05ldHdvcmtDYWNoZURhdGEuaDoKKyAgICAgICAgKFdlYktpdDo6
TmV0d29ya0NhY2hlOjpEYXRhOjppc0VtcHR5KToKKyAgICAgICAgKiBOZXR3b3JrUHJvY2Vzcy9j
YWNoZS9OZXR3b3JrQ2FjaGVEYXRhQ29jb2EubW06CisgICAgICAgIChXZWJLaXQ6Ok5ldHdvcmtD
YWNoZTo6RGF0YTo6ZW1wdHkpOgorICAgICAgICAoV2ViS2l0OjpOZXR3b3JrQ2FjaGU6OkRhdGE6
OmZyb21NYXApOgorICAgICAgICAoV2ViS2l0OjpOZXR3b3JrQ2FjaGU6Om1hcEZpbGUpOgorICAg
ICAgICAoV2ViS2l0OjpOZXR3b3JrQ2FjaGU6OmNvbXB1dGVTSEExKToKKyAgICAgICAgKFdlYktp
dDo6TmV0d29ya0NhY2hlOjpieXRlc0VxdWFsKToKKworICAgICAgICAgICAgQWRkIHNvbWUgaGVs
cGVycy4KKworICAgICAgICAqIE5ldHdvcmtQcm9jZXNzL2NhY2hlL05ldHdvcmtDYWNoZUVudHJ5
LmNwcDoKKyAgICAgICAgKFdlYktpdDo6TmV0d29ya0NhY2hlOjpFbnRyeTo6YXNKU09OKToKKyAg
ICAgICAgKiBOZXR3b3JrUHJvY2Vzcy9jYWNoZS9OZXR3b3JrQ2FjaGVJT0NoYW5uZWxDb2NvYS5t
bToKKyAgICAgICAgKFdlYktpdDo6TmV0d29ya0NhY2hlOjpJT0NoYW5uZWw6OklPQ2hhbm5lbCk6
CisgICAgICAgICogTmV0d29ya1Byb2Nlc3MvY2FjaGUvTmV0d29ya0NhY2hlU3RvcmFnZS5jcHA6
CisgICAgICAgIChXZWJLaXQ6Ok5ldHdvcmtDYWNoZTo6bWFrZVJlY29yZERpcmVjdG9yeVBhdGgp
OgorICAgICAgICAoV2ViS2l0OjpOZXR3b3JrQ2FjaGU6Om1ha2VCbG9iRGlyZWN0b3J5UGF0aCk6
CisgICAgICAgIChXZWJLaXQ6Ok5ldHdvcmtDYWNoZTo6U3RvcmFnZTo6U3RvcmFnZSk6CisgICAg
ICAgIChXZWJLaXQ6Ok5ldHdvcmtDYWNoZTo6U3RvcmFnZTo6YXBwcm94aW1hdGVTaXplKToKKyAg
ICAgICAgKFdlYktpdDo6TmV0d29ya0NhY2hlOjpTdG9yYWdlOjpzeW5jaHJvbml6ZSk6CisgICAg
ICAgIChXZWJLaXQ6Ok5ldHdvcmtDYWNoZTo6cGFydGl0aW9uUGF0aEZvcktleSk6CisgICAgICAg
IChXZWJLaXQ6Ok5ldHdvcmtDYWNoZTo6cmVjb3JkUGF0aEZvcktleSk6CisgICAgICAgIChXZWJL
aXQ6Ok5ldHdvcmtDYWNoZTo6Ym9keVBhdGgpOgorICAgICAgICAoV2ViS2l0OjpOZXR3b3JrQ2Fj
aGU6OmRlY29kZVJlY29yZE1ldGFEYXRhKToKKyAgICAgICAgKFdlYktpdDo6TmV0d29ya0NhY2hl
OjpkZWNvZGVSZWNvcmRIZWFkZXIpOgorICAgICAgICAoV2ViS2l0OjpOZXR3b3JrQ2FjaGU6OmNy
ZWF0ZVJlY29yZCk6CisgICAgICAgIChXZWJLaXQ6Ok5ldHdvcmtDYWNoZTo6ZW5jb2RlUmVjb3Jk
TWV0YURhdGEpOgorICAgICAgICAoV2ViS2l0OjpOZXR3b3JrQ2FjaGU6OmVuY29kZVJlY29yZEhl
YWRlcik6CisgICAgICAgIChXZWJLaXQ6Ok5ldHdvcmtDYWNoZTo6U3RvcmFnZTo6cmVtb3ZlKToK
KyAgICAgICAgKFdlYktpdDo6TmV0d29ya0NhY2hlOjpTdG9yYWdlOjp1cGRhdGVGaWxlTW9kaWZp
Y2F0aW9uVGltZSk6CisgICAgICAgIChXZWJLaXQ6Ok5ldHdvcmtDYWNoZTo6U3RvcmFnZTo6ZGlz
cGF0Y2hSZWFkT3BlcmF0aW9uKToKKworICAgICAgICAgICAgUmVhZCBib3RoIHRoZSBibG9iIGFu
ZCB0aGUgcmVjb3JkIGVudHJ5LgorCisgICAgICAgIChXZWJLaXQ6Ok5ldHdvcmtDYWNoZTo6U3Rv
cmFnZTo6ZmluaXNoUmVhZE9wZXJhdGlvbik6CisKKyAgICAgICAgICAgIEZhY3RvciB0byBhIGZ1
bmN0aW9uLgorCisgICAgICAgIChXZWJLaXQ6Ok5ldHdvcmtDYWNoZTo6U3RvcmFnZTo6c3RvcmUp
OgorICAgICAgICAoV2ViS2l0OjpOZXR3b3JrQ2FjaGU6OlN0b3JhZ2U6OnRyYXZlcnNlKToKKyAg
ICAgICAgKFdlYktpdDo6TmV0d29ya0NhY2hlOjpTdG9yYWdlOjpkaXNwYXRjaFBlbmRpbmdXcml0
ZU9wZXJhdGlvbnMpOgorICAgICAgICAoV2ViS2l0OjpOZXR3b3JrQ2FjaGU6OlN0b3JhZ2U6OmRp
c3BhdGNoV3JpdGVPcGVyYXRpb24pOgorCisgICAgICAgICAgICBXZSBkb24ndCBuZWVkIHNlcGFy
YXRlIGZ1bGwgd3JpdGUgYW5kIGhlYWRlciB3cml0ZSBwYXRocyBhbnltb3JlLiBFdmVyeXRoaW5n
IGlzIHRyZWF0ZWQKKyAgICAgICAgICAgIGFzIGEgZnVsbCB3cml0ZSBhbmQgZGVkdXBsaWNhdGlv
biBzdG9wcyB1cyB3cml0aW5nIHRoZSBib2R5IGFnYWluLgorCisgICAgICAgICAgICBUaGlzIHNp
bXBsaWZpZXMgdGhlIGNvZGUgYW5kIGRhdGEgc3RydWN0dXJlcy4KKworICAgICAgICAoV2ViS2l0
OjpOZXR3b3JrQ2FjaGU6OlN0b3JhZ2U6OmZpbmlzaFdyaXRlT3BlcmF0aW9uKToKKworICAgICAg
ICAgICAgRmFjdG9yIHRvIGEgZnVuY3Rpb24uCisKKyAgICAgICAgKFdlYktpdDo6TmV0d29ya0Nh
Y2hlOjpTdG9yYWdlOjpjbGVhcik6CisgICAgICAgIChXZWJLaXQ6Ok5ldHdvcmtDYWNoZTo6ZGVs
ZXRpb25Qcm9iYWJpbGl0eSk6CisKKyAgICAgICAgICAgIFRha2UgdGhlIHNoYXJpbmcgY291bnQg
aW50byBhY2NvdW50IHdoZW4gY29tcHV0aW5nIGRlbGV0aW9uIHByb2JhYmlsaXR5LgorICAgICAg
ICAgICAgSXQgaXMgbGVzcyB1c2VmdWwgdG8gZGVsZXRlIGEgcmVjb3JkIHRoYXQgc2hhcmVzIGl0
cyBib2R5IHdpdGggb3RoZXJzIGFzIGRhdGEgd29uJ3QgZ2V0IGRlbGV0ZWQuCisKKyAgICAgICAg
KFdlYktpdDo6TmV0d29ya0NhY2hlOjpTdG9yYWdlOjpzaHJpbmtJZk5lZWRlZCk6CisgICAgICAg
IChXZWJLaXQ6Ok5ldHdvcmtDYWNoZTo6U3RvcmFnZTo6c2hyaW5rKToKKyAgICAgICAgKFdlYktp
dDo6TmV0d29ya0NhY2hlOjpTdG9yYWdlOjpkZWxldGVPbGRWZXJzaW9ucyk6CisgICAgICAgIChX
ZWJLaXQ6Ok5ldHdvcmtDYWNoZTo6ZGlyZWN0b3J5UGF0aEZvcktleSk6IERlbGV0ZWQuCisgICAg
ICAgIChXZWJLaXQ6Ok5ldHdvcmtDYWNoZTo6ZmlsZVBhdGhGb3JLZXkpOiBEZWxldGVkLgorICAg
ICAgICAoV2ViS2l0OjpOZXR3b3JrQ2FjaGU6Om9wZW5GaWxlRm9yS2V5KTogRGVsZXRlZC4KKyAg
ICAgICAgKFdlYktpdDo6TmV0d29ya0NhY2hlOjpkZWNvZGVSZWNvcmQpOiBEZWxldGVkLgorICAg
ICAgICAoV2ViS2l0OjpOZXR3b3JrQ2FjaGU6OlN0b3JhZ2U6OnVwZGF0ZSk6IERlbGV0ZWQuCisK
KyAgICAgICAgICAgIE5vIG5lZWQgZm9yIHNlcGFyYXRlIHVwZGF0ZSBpbnRlcmZhY2UgYW55bW9y
ZS4gUmVndWxhciBzdG9yZSgpIGF2b2lkcyB1bm5lY2Vzc2FyeSBib2R5IHdyaXRlLgorCisgICAg
ICAgIChXZWJLaXQ6Ok5ldHdvcmtDYWNoZTo6U3RvcmFnZTo6ZGlzcGF0Y2hGdWxsV3JpdGVPcGVy
YXRpb24pOiBEZWxldGVkLgorICAgICAgICAoV2ViS2l0OjpOZXR3b3JrQ2FjaGU6OlN0b3JhZ2U6
OmRpc3BhdGNoSGVhZGVyV3JpdGVPcGVyYXRpb24pOiBEZWxldGVkLgorICAgICAgICAqIE5ldHdv
cmtQcm9jZXNzL2NhY2hlL05ldHdvcmtDYWNoZVN0b3JhZ2UuaDoKKyAgICAgICAgKiBXZWJLaXQy
Lnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2o6CisKIDIwMTUtMDQtMTIgIFN1bmdtYW5uIENobyAg
PHN1bmdtYW5uLmNob0BuYXZlcmNvcnAuY29tPgogCiAgICAgICAgIEZpeCB0cml2YWwgdHlwb3Mg
cmVsYXRlZCB0byB0aGUgd29yZCAiY29vcmRpbmF0ZSIuCkluZGV4OiBTb3VyY2UvV2ViS2l0Mi9O
ZXR3b3JrUHJvY2Vzcy9jYWNoZS9OZXR3b3JrQ2FjaGUuY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9XZWJLaXQyL05ldHdvcmtQcm9jZXNzL2NhY2hlL05ldHdvcmtDYWNoZS5jcHAJKHJldmlzaW9u
IDE4MjY4NykKKysrIFNvdXJjZS9XZWJLaXQyL05ldHdvcmtQcm9jZXNzL2NhY2hlL05ldHdvcmtD
YWNoZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM3MCw3ICszNzAsNyBAQCB2b2lkIENhY2hlOjpz
dG9yZShjb25zdCBXZWJDb3JlOjpSZXNvdXJjCiAKICAgICBhdXRvIHJlY29yZCA9IGNhY2hlRW50
cnkuZW5jb2RlQXNTdG9yYWdlUmVjb3JkKCk7CiAKLSAgICBtX3N0b3JhZ2UtPnN0b3JlKHJlY29y
ZCwgW2NvbXBsZXRpb25IYW5kbGVyXShib29sIHN1Y2Nlc3MsIGNvbnN0IERhdGEmIGJvZHlEYXRh
KSB7CisgICAgbV9zdG9yYWdlLT5zdG9yZShyZWNvcmQsIFtjb21wbGV0aW9uSGFuZGxlcl0oY29u
c3QgRGF0YSYgYm9keURhdGEpIHsKICAgICAgICAgTWFwcGVkQm9keSBtYXBwZWRCb2R5OwogI2lm
IEVOQUJMRShTSEFSRUFCTEVfUkVTT1VSQ0UpCiAgICAgICAgIGlmIChib2R5RGF0YS5pc01hcCgp
KSB7CkBAIC0zODEsNyArMzgxLDcgQEAgdm9pZCBDYWNoZTo6c3RvcmUoY29uc3QgV2ViQ29yZTo6
UmVzb3VyYwogICAgICAgICB9CiAjZW5kaWYKICAgICAgICAgY29tcGxldGlvbkhhbmRsZXIobWFw
cGVkQm9keSk7Ci0gICAgICAgIExPRyhOZXR3b3JrQ2FjaGUsICIoTmV0d29ya1Byb2Nlc3MpIHN0
b3JlIHN1Y2Nlc3M9JWQiLCBzdWNjZXNzKTsKKyAgICAgICAgTE9HKE5ldHdvcmtDYWNoZSwgIihO
ZXR3b3JrUHJvY2Vzcykgc3RvcmVkIik7CiAgICAgfSk7CiB9CiAKQEAgLTM5Niw5ICszOTYsNyBA
QCB2b2lkIENhY2hlOjp1cGRhdGUoY29uc3QgV2ViQ29yZTo6UmVzb3VyCiAKICAgICBhdXRvIHVw
ZGF0ZVJlY29yZCA9IHVwZGF0ZUVudHJ5LmVuY29kZUFzU3RvcmFnZVJlY29yZCgpOwogCi0gICAg
bV9zdG9yYWdlLT51cGRhdGUodXBkYXRlUmVjb3JkLCBleGlzdGluZ0VudHJ5LnNvdXJjZVN0b3Jh
Z2VSZWNvcmQoKSwgW10oYm9vbCBzdWNjZXNzLCBjb25zdCBEYXRhJikgewotICAgICAgICBMT0co
TmV0d29ya0NhY2hlLCAiKE5ldHdvcmtQcm9jZXNzKSB1cGRhdGVkLCBzdWNjZXNzPSVkIiwgc3Vj
Y2Vzcyk7Ci0gICAgfSk7CisgICAgbV9zdG9yYWdlLT5zdG9yZSh1cGRhdGVSZWNvcmQsIHsgfSk7
CiB9CiAKIHZvaWQgQ2FjaGU6OnJlbW92ZShjb25zdCBLZXkmIGtleSkKQEAgLTQ0Nyw3ICs0NDUs
OCBAQCB2b2lkIENhY2hlOjpkdW1wQ29udGVudHNUb0ZpbGUoKQogICAgICAgICBzaXplX3QgYm9k
eVNpemUgeyAwIH07CiAgICAgfTsKICAgICBUb3RhbHMgdG90YWxzOwotICAgIG1fc3RvcmFnZS0+
dHJhdmVyc2UoU3RvcmFnZTo6VHJhdmVyc2VGbGFnOjpDb21wdXRlV29ydGgsIFtmZCwgdG90YWxz
XShjb25zdCBTdG9yYWdlOjpSZWNvcmQqIHJlY29yZCwgY29uc3QgU3RvcmFnZTo6UmVjb3JkSW5m
byYgaW5mbykgbXV0YWJsZSB7CisgICAgYXV0byBmbGFncyA9IFN0b3JhZ2U6OlRyYXZlcnNlRmxh
Zzo6Q29tcHV0ZVdvcnRoIHwgU3RvcmFnZTo6VHJhdmVyc2VGbGFnOjpTaGFyZUNvdW50OworICAg
IG1fc3RvcmFnZS0+dHJhdmVyc2UoZmxhZ3MsIFtmZCwgdG90YWxzXShjb25zdCBTdG9yYWdlOjpS
ZWNvcmQqIHJlY29yZCwgY29uc3QgU3RvcmFnZTo6UmVjb3JkSW5mbyYgaW5mbykgbXV0YWJsZSB7
CiAgICAgICAgIGlmICghcmVjb3JkKSB7CiAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGVwaWxv
Z3VlOwogICAgICAgICAgICAgZXBpbG9ndWUuYXBwZW5kTGl0ZXJhbCgie31cbl0sXG4iKTsKSW5k
ZXg6IFNvdXJjZS9XZWJLaXQyL05ldHdvcmtQcm9jZXNzL2NhY2hlL05ldHdvcmtDYWNoZUJsb2JT
dG9yYWdlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9OZXR3b3JrUHJvY2Vzcy9j
YWNoZS9OZXR3b3JrQ2FjaGVCbG9iU3RvcmFnZS5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2Uv
V2ViS2l0Mi9OZXR3b3JrUHJvY2Vzcy9jYWNoZS9OZXR3b3JrQ2FjaGVCbG9iU3RvcmFnZS5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBg
YEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJ
QlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lO
RVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAi
Y29uZmlnLmgiCisjaW5jbHVkZSAiTmV0d29ya0NhY2hlQmxvYlN0b3JhZ2UuaCIKKworI2luY2x1
ZGUgIkxvZ2dpbmcuaCIKKyNpbmNsdWRlICJOZXR3b3JrQ2FjaGVGaWxlU3lzdGVtUG9zaXguaCIK
KyNpbmNsdWRlIDxXZWJDb3JlL0ZpbGVTeXN0ZW0uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2lu
Y2x1ZGUgPHd0Zi9SdW5Mb29wLmg+CisjaW5jbHVkZSA8d3RmL1NIQTEuaD4KKyNpbmNsdWRlIDx3
dGYvdGV4dC9TdHJpbmdCdWlsZGVyLmg+CisKKyNpZiBFTkFCTEUoTkVUV09SS19DQUNIRSkKKwor
bmFtZXNwYWNlIFdlYktpdCB7CituYW1lc3BhY2UgTmV0d29ya0NhY2hlIHsKKworQmxvYlN0b3Jh
Z2U6OkJsb2JTdG9yYWdlKGNvbnN0IFN0cmluZyYgYmxvYkRpcmVjdG9yeVBhdGgpCisgICAgOiBt
X2Jsb2JEaXJlY3RvcnlQYXRoKGJsb2JEaXJlY3RvcnlQYXRoLnV0ZjgoKSkKK3sKKyAgICBXZWJD
b3JlOjptYWtlQWxsRGlyZWN0b3JpZXMoYmxvYkRpcmVjdG9yeVBhdGgpOworfQorCit2b2lkIEJs
b2JTdG9yYWdlOjpzeW5jaHJvbml6ZSgpCit7CisgICAgQVNTRVJUKCFSdW5Mb29wOjppc01haW4o
KSk7CisKKyAgICBtX2FwcHJveGltYXRlU2l6ZSA9IDA7CisgICAgYXV0byBibG9iRGlyZWN0b3J5
ID0gU3RyaW5nOjpmcm9tVVRGOChtX2Jsb2JEaXJlY3RvcnlQYXRoKTsKKyAgICB0cmF2ZXJzZURp
cmVjdG9yeShibG9iRGlyZWN0b3J5LCBEVF9SRUcsIFt0aGlzLCAmYmxvYkRpcmVjdG9yeV0oY29u
c3QgU3RyaW5nJiBuYW1lKSB7CisgICAgICAgIGF1dG8gcGF0aCA9IFdlYkNvcmU6OnBhdGhCeUFw
cGVuZGluZ0NvbXBvbmVudChibG9iRGlyZWN0b3J5LCBuYW1lKTsKKyAgICAgICAgYXV0byBmaWxl
UGF0aCA9IFdlYkNvcmU6OmZpbGVTeXN0ZW1SZXByZXNlbnRhdGlvbihwYXRoKTsKKyAgICAgICAg
c3RydWN0IHN0YXQgc3RhdDsKKyAgICAgICAgOjpzdGF0KGZpbGVQYXRoLmRhdGEoKSwgJnN0YXQp
OworICAgICAgICBpZiAoc3RhdC5zdF9ubGluayA9PSAxKQorICAgICAgICAgICAgdW5saW5rKGZp
bGVQYXRoLmRhdGEoKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1fYXBwcm94aW1hdGVT
aXplICs9IHN0YXQuc3Rfc2l6ZTsKKyAgICB9KTsKKworICAgIExPRyhOZXR3b3JrQ2FjaGVTdG9y
YWdlLCAiKE5ldHdvcmtQcm9jZXNzKSBibG9iIHN5bmNocm9uaXphdGlvbiBjb21wbGV0ZWQgYXBw
cm94aW1hdGVTaXplPSV6dSIsIGFwcHJveGltYXRlU2l6ZSgpKTsKK30KKworQ1N0cmluZyBCbG9i
U3RvcmFnZTo6YmxvYlBhdGgoY29uc3QgU0hBMTo6RGlnZXN0JiBoYXNoKSBjb25zdAoreworICAg
IGF1dG8gaGFzaEFzU3RyaW5nID0gU0hBMTo6aGV4RGlnZXN0KGhhc2gpOworICAgIGF1dG8gcGF0
aCA9IFdlYkNvcmU6OnBhdGhCeUFwcGVuZGluZ0NvbXBvbmVudChTdHJpbmc6OmZyb21VVEY4KG1f
YmxvYkRpcmVjdG9yeVBhdGgpLCBTdHJpbmc6OmZyb21VVEY4KGhhc2hBc1N0cmluZykpOworICAg
IHJldHVybiBXZWJDb3JlOjpmaWxlU3lzdGVtUmVwcmVzZW50YXRpb24ocGF0aCk7Cit9CisKK0Js
b2JTdG9yYWdlOjpCbG9iIEJsb2JTdG9yYWdlOjphZGQoY29uc3QgU3RyaW5nJiBwYXRoLCBjb25z
dCBEYXRhJiBkYXRhKQoreworICAgIEFTU0VSVCghUnVuTG9vcDo6aXNNYWluKCkpOworCisgICAg
YXV0byBoYXNoID0gY29tcHV0ZVNIQTEoZGF0YSk7CisgICAgaWYgKGRhdGEuaXNFbXB0eSgpKQor
ICAgICAgICByZXR1cm4geyBkYXRhLCBoYXNoIH07CisKKyAgICBhdXRvIGJsb2JQYXRoID0gdGhp
cy0+YmxvYlBhdGgoaGFzaCk7CisgICAgYXV0byBsaW5rUGF0aCA9IFdlYkNvcmU6OmZpbGVTeXN0
ZW1SZXByZXNlbnRhdGlvbihwYXRoKTsKKyAgICB1bmxpbmsobGlua1BhdGguZGF0YSgpKTsKKwor
ICAgIGJvb2wgYmxvYkV4aXN0cyA9IGFjY2VzcyhibG9iUGF0aC5kYXRhKCksIEZfT0spICE9IC0x
OworICAgIGlmIChibG9iRXhpc3RzKSB7CisgICAgICAgIGF1dG8gZXhpc3RpbmdEYXRhID0gbWFw
RmlsZShibG9iUGF0aCk7CisgICAgICAgIGlmIChieXRlc0VxdWFsKGV4aXN0aW5nRGF0YSwgZGF0
YSkpIHsKKyAgICAgICAgICAgIGxpbmsoYmxvYlBhdGguZGF0YSgpLCBsaW5rUGF0aC5kYXRhKCkp
OworICAgICAgICAgICAgcmV0dXJuIHsgZXhpc3RpbmdEYXRhLCBoYXNoIH07CisgICAgICAgIH0K
KyAgICAgICAgdW5saW5rKGJsb2JQYXRoLmRhdGEoKSk7CisgICAgfQorCisgICAgaW50IGZkID0g
b3BlbihibG9iUGF0aC5kYXRhKCksIE9fQ1JFQVQgfCBPX1JEV1IsIFNfSVJVU1IgfCBTX0lXVVNS
KTsKKyAgICBpZiAoZmQgPCAwKQorICAgICAgICByZXR1cm4geyB9OworCisgICAgc2l6ZV90IHNp
emUgPSBkYXRhLnNpemUoKTsKKyAgICBpZiAoZnRydW5jYXRlKGZkLCBzaXplKSA8IDApIHsKKyAg
ICAgICAgY2xvc2UoZmQpOworICAgICAgICByZXR1cm4geyB9OworICAgIH0KKworICAgIHZvaWQq
IG1hcCA9IG1tYXAobnVsbHB0ciwgc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1NI
QVJFRCwgZmQsIDApOworICAgIGNsb3NlKGZkKTsKKworICAgIGlmIChtYXAgPT0gTUFQX0ZBSUxF
RCkKKyAgICAgICAgcmV0dXJuIHsgfTsKKworICAgIHVpbnQ4X3QqIG1hcERhdGEgPSBzdGF0aWNf
Y2FzdDx1aW50OF90Kj4obWFwKTsKKyAgICBkYXRhLmFwcGx5KFsmbWFwRGF0YV0oY29uc3QgdWlu
dDhfdCogYnl0ZXMsIHNpemVfdCBieXRlc1NpemUpIHsKKyAgICAgICAgbWVtY3B5KG1hcERhdGEs
IGJ5dGVzLCBieXRlc1NpemUpOworICAgICAgICBtYXBEYXRhICs9IGJ5dGVzU2l6ZTsKKyAgICAg
ICAgcmV0dXJuIHRydWU7CisgICAgfSk7CisKKyAgICBpZiAobGluayhibG9iUGF0aC5kYXRhKCks
IGxpbmtQYXRoLmRhdGEoKSkgPCAwKQorICAgICAgICByZXR1cm4geyB9OworCisgICAgbV9hcHBy
b3hpbWF0ZVNpemUgKz0gc2l6ZTsKKworICAgIGF1dG8gbWFwcGVkRGF0YSA9IERhdGE6OmZyb21N
YXAobWFwLCBzaXplKTsKKyAgICByZXR1cm4geyBtYXBwZWREYXRhLCBoYXNoIH07Cit9CisKK0Js
b2JTdG9yYWdlOjpCbG9iIEJsb2JTdG9yYWdlOjpnZXQoY29uc3QgU3RyaW5nJiBwYXRoKQorewor
ICAgIEFTU0VSVCghUnVuTG9vcDo6aXNNYWluKCkpOworCisgICAgYXV0byBsaW5rUGF0aCA9IFdl
YkNvcmU6OmZpbGVTeXN0ZW1SZXByZXNlbnRhdGlvbihwYXRoKTsKKyAgICBhdXRvIGRhdGEgPSBt
YXBGaWxlKGxpbmtQYXRoKTsKKworICAgIHJldHVybiB7IGRhdGEsIGNvbXB1dGVTSEExKGRhdGEp
IH07Cit9CisKK3ZvaWQgQmxvYlN0b3JhZ2U6OnJlbW92ZShjb25zdCBTdHJpbmcmIHBhdGgpCit7
CisgICAgQVNTRVJUKCFSdW5Mb29wOjppc01haW4oKSk7CisKKyAgICBhdXRvIGxpbmtQYXRoID0g
V2ViQ29yZTo6ZmlsZVN5c3RlbVJlcHJlc2VudGF0aW9uKHBhdGgpOworICAgIHVubGluayhsaW5r
UGF0aC5kYXRhKCkpOworfQorCit1bnNpZ25lZCBCbG9iU3RvcmFnZTo6c2hhcmVDb3VudChjb25z
dCBTdHJpbmcmIHBhdGgpCit7CisgICAgQVNTRVJUKCFSdW5Mb29wOjppc01haW4oKSk7CisKKyAg
ICBhdXRvIGxpbmtQYXRoID0gV2ViQ29yZTo6ZmlsZVN5c3RlbVJlcHJlc2VudGF0aW9uKHBhdGgp
OworICAgIHN0cnVjdCBzdGF0IHN0YXQ7CisgICAgaWYgKDo6c3RhdChsaW5rUGF0aC5kYXRhKCks
ICZzdGF0KSA8IDApCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiBzdGF0LnN0X25saW5r
IC0gMTsKK30KKworfQorfQorCisjZW5kaWYKSW5kZXg6IFNvdXJjZS9XZWJLaXQyL05ldHdvcmtQ
cm9jZXNzL2NhY2hlL05ldHdvcmtDYWNoZUJsb2JTdG9yYWdlLmgKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL1dlYktpdDIvTmV0d29ya1Byb2Nlc3MvY2FjaGUvTmV0d29ya0NhY2hlQmxvYlN0b3JhZ2Uu
aAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9XZWJLaXQyL05ldHdvcmtQcm9jZXNzL2NhY2hlL05l
dHdvcmtDYWNoZUJsb2JTdG9yYWdlLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw3NSBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMu
IEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUg
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVN
RU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLgorICovCisKKyNpZm5kZWYgTmV0d29ya0NhY2hlQmxvYlN0b3JhZ2VfaAorI2RlZmluZSBO
ZXR3b3JrQ2FjaGVCbG9iU3RvcmFnZV9oCisKKyNpZiBFTkFCTEUoTkVUV09SS19DQUNIRSkKKwor
I2luY2x1ZGUgIk5ldHdvcmtDYWNoZURhdGEuaCIKKyNpbmNsdWRlICJOZXR3b3JrQ2FjaGVLZXku
aCIKKyNpbmNsdWRlIDx3dGYvU0hBMS5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L0NTdHJpbmcuaD4K
KyNpbmNsdWRlIDx3dGYvdGV4dC9XVEZTdHJpbmcuaD4KKworbmFtZXNwYWNlIFdlYktpdCB7Citu
YW1lc3BhY2UgTmV0d29ya0NhY2hlIHsKKworLy8gQmxvYlN0b3JhZ2UgZGVkdXBsaWNhdGVzIHRo
ZSBkYXRhIHVzaW5nIGEgaGFzaCBjb21wdXRlZCBvdmVyIHRoZSBibG9iIGJ5dGVzLgorY2xhc3Mg
QmxvYlN0b3JhZ2UgeworICAgIFdURl9NQUtFX05PTkNPUFlBQkxFKEJsb2JTdG9yYWdlKTsKK3B1
YmxpYzoKKyAgICBCbG9iU3RvcmFnZShjb25zdCBTdHJpbmcmIGJsb2JEaXJlY3RvcnlQYXRoKTsK
KworICAgIHN0cnVjdCBCbG9iIHsKKyAgICAgICAgRGF0YSBkYXRhOworICAgICAgICBTSEExOjpE
aWdlc3QgaGFzaDsKKyAgICB9OworICAgIC8vIFRoZXNlIGFyZSBhbGwgc3luY2hyb25vdXMgYW5k
IHNob3VsZCBub3QgYmUgdXNlZCBmcm9tIHRoZSBtYWluIHRocmVhZC4KKyAgICBCbG9iIGFkZChj
b25zdCBTdHJpbmcmIHBhdGgsIGNvbnN0IERhdGEmKTsKKyAgICBCbG9iIGdldChjb25zdCBTdHJp
bmcmIHBhdGgpOworCisgICAgLy8gQmxvYiB3b24ndCBiZSByZW1vdmVkIHVudGlsIHN5bmNocm9u
aXphdGlvbi4KKyAgICB2b2lkIHJlbW92ZShjb25zdCBTdHJpbmcmIHBhdGgpOworCisgICAgdW5z
aWduZWQgc2hhcmVDb3VudChjb25zdCBTdHJpbmcmIHBhdGgpOworCisgICAgc2l6ZV90IGFwcHJv
eGltYXRlU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fYXBwcm94aW1hdGVTaXplOyB9CisKKyAgICB2
b2lkIHN5bmNocm9uaXplKCk7CisKK3ByaXZhdGU6CisgICAgQ1N0cmluZyBibG9iUGF0aChjb25z
dCBTSEExOjpEaWdlc3QmKSBjb25zdDsKKworICAgIGNvbnN0IENTdHJpbmcgbV9ibG9iRGlyZWN0
b3J5UGF0aDsKKworICAgIHN0ZDo6YXRvbWljPHNpemVfdD4gbV9hcHByb3hpbWF0ZVNpemUgeyAw
IH07Cit9OworCit9Cit9CisKKyNlbmRpZgorI2VuZGlmCkluZGV4OiBTb3VyY2UvV2ViS2l0Mi9O
ZXR3b3JrUHJvY2Vzcy9jYWNoZS9OZXR3b3JrQ2FjaGVDb2RlcnMuY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9XZWJLaXQyL05ldHdvcmtQcm9jZXNzL2NhY2hlL05ldHdvcmtDYWNoZUNvZGVycy5j
cHAJKHJldmlzaW9uIDE4MjY4NykKKysrIFNvdXJjZS9XZWJLaXQyL05ldHdvcmtQcm9jZXNzL2Nh
Y2hlL05ldHdvcmtDYWNoZUNvZGVycy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTE4NCw2ICsxODQs
MTYgQEAgYm9vbCBDb2RlcjxNRDU6OkRpZ2VzdD46OmRlY29kZShEZWNvZGVyJgogICAgIHJldHVy
biBkZWNvZGVyLmRlY29kZUZpeGVkTGVuZ3RoRGF0YShkaWdlc3QuZGF0YSgpLCBzaXplb2YoZGln
ZXN0KSk7CiB9CiAKK3ZvaWQgQ29kZXI8U0hBMTo6RGlnZXN0Pjo6ZW5jb2RlKEVuY29kZXImIGVu
Y29kZXIsIGNvbnN0IFNIQTE6OkRpZ2VzdCYgZGlnZXN0KQoreworICAgIGVuY29kZXIuZW5jb2Rl
Rml4ZWRMZW5ndGhEYXRhKGRpZ2VzdC5kYXRhKCksIHNpemVvZihkaWdlc3QpKTsKK30KKworYm9v
bCBDb2RlcjxTSEExOjpEaWdlc3Q+OjpkZWNvZGUoRGVjb2RlciYgZGVjb2RlciwgU0hBMTo6RGln
ZXN0JiBkaWdlc3QpCit7CisgICAgcmV0dXJuIGRlY29kZXIuZGVjb2RlRml4ZWRMZW5ndGhEYXRh
KGRpZ2VzdC5kYXRhKCksIHNpemVvZihkaWdlc3QpKTsKK30KKwogfQogfQogCkluZGV4OiBTb3Vy
Y2UvV2ViS2l0Mi9OZXR3b3JrUHJvY2Vzcy9jYWNoZS9OZXR3b3JrQ2FjaGVDb2RlcnMuaAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9OZXR3b3JrUHJvY2Vzcy9jYWNoZS9OZXR3b3JrQ2Fj
aGVDb2RlcnMuaAkocmV2aXNpb24gMTgyNjg3KQorKysgU291cmNlL1dlYktpdDIvTmV0d29ya1By
b2Nlc3MvY2FjaGUvTmV0d29ya0NhY2hlQ29kZXJzLmgJKHdvcmtpbmcgY29weSkKQEAgLTM2LDYg
KzM2LDcgQEAKICNpbmNsdWRlIDx3dGYvSGFzaE1hcC5oPgogI2luY2x1ZGUgPHd0Zi9IYXNoU2V0
Lmg+CiAjaW5jbHVkZSA8d3RmL01ENS5oPgorI2luY2x1ZGUgPHd0Zi9TSEExLmg+CiAjaW5jbHVk
ZSA8d3RmL1ZlY3Rvci5oPgogCiBuYW1lc3BhY2UgV2ViS2l0IHsKQEAgLTI2Miw2ICsyNjMsMTEg
QEAgdGVtcGxhdGU8PiBzdHJ1Y3QgQ29kZXI8TUQ1OjpEaWdlc3Q+IHsKICAgICBzdGF0aWMgYm9v
bCBkZWNvZGUoRGVjb2RlciYsIE1ENTo6RGlnZXN0Jik7CiB9OwogCit0ZW1wbGF0ZTw+IHN0cnVj
dCBDb2RlcjxTSEExOjpEaWdlc3Q+IHsKKyAgICBzdGF0aWMgdm9pZCBlbmNvZGUoRW5jb2RlciYs
IGNvbnN0IFNIQTE6OkRpZ2VzdCYpOworICAgIHN0YXRpYyBib29sIGRlY29kZShEZWNvZGVyJiwg
U0hBMTo6RGlnZXN0Jik7Cit9OworCiB9CiB9CiAjZW5kaWYKSW5kZXg6IFNvdXJjZS9XZWJLaXQy
L05ldHdvcmtQcm9jZXNzL2NhY2hlL05ldHdvcmtDYWNoZURhdGEuaAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvV2ViS2l0Mi9OZXR3b3JrUHJvY2Vzcy9jYWNoZS9OZXR3b3JrQ2FjaGVEYXRhLmgJKHJl
dmlzaW9uIDE4MjY4NykKKysrIFNvdXJjZS9XZWJLaXQyL05ldHdvcmtQcm9jZXNzL2NhY2hlL05l
dHdvcmtDYWNoZURhdGEuaAkod29ya2luZyBjb3B5KQpAQCAtMzAsNiArMzAsNyBAQAogCiAjaW5j
bHVkZSA8ZnVuY3Rpb25hbD4KICNpbmNsdWRlIDx3dGYvRnVuY3Rpb25EaXNwYXRjaGVyLmg+Cisj
aW5jbHVkZSA8d3RmL1NIQTEuaD4KICNpbmNsdWRlIDx3dGYvVGhyZWFkU2FmZVJlZkNvdW50ZWQu
aD4KICNpbmNsdWRlIDx3dGYvdGV4dC9XVEZTdHJpbmcuaD4KIApAQCAtOTgsMTEgKzk5LDE1IEBA
IHB1YmxpYzoKICAgICBEYXRhKCkgeyB9CiAgICAgRGF0YShjb25zdCB1aW50OF90Kiwgc2l6ZV90
KTsKIAorICAgIHN0YXRpYyBEYXRhIGVtcHR5KCk7CisgICAgc3RhdGljIERhdGEgZnJvbU1hcCh2
b2lkKiBtYXAsIHNpemVfdCk7CisKICAgICBlbnVtIGNsYXNzIEJhY2tpbmcgeyBCdWZmZXIsIE1h
cCB9OwogI2lmIFBMQVRGT1JNKENPQ09BKQogICAgIERhdGEoRGlzcGF0Y2hQdHI8ZGlzcGF0Y2hf
ZGF0YV90PiwgQmFja2luZyA9IEJhY2tpbmc6OkJ1ZmZlcik7CiAjZW5kaWYKICAgICBib29sIGlz
TnVsbCgpIGNvbnN0OworICAgIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJuICFtX3NpemU7
IH0KIAogICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEoKSBjb25zdDsKICAgICBzaXplX3Qgc2l6ZSgp
IGNvbnN0IHsgcmV0dXJuIG1fc2l6ZTsgfQpAQCAtMTI1LDcgKzEzMCwxMCBAQCBwcml2YXRlOgog
fTsKIAogRGF0YSBjb25jYXRlbmF0ZShjb25zdCBEYXRhJiwgY29uc3QgRGF0YSYpOworYm9vbCBi
eXRlc0VxdWFsKGNvbnN0IERhdGEmLCBjb25zdCBEYXRhJik7CiBEYXRhIG1hcEZpbGUoaW50IGZk
LCBzaXplX3Qgb2Zmc2V0LCBzaXplX3QpOworRGF0YSBtYXBGaWxlKGNvbnN0IENTdHJpbmcmIHBh
dGgpOworU0hBMTo6RGlnZXN0IGNvbXB1dGVTSEExKGNvbnN0IERhdGEmKTsKIAogfQogfQpJbmRl
eDogU291cmNlL1dlYktpdDIvTmV0d29ya1Byb2Nlc3MvY2FjaGUvTmV0d29ya0NhY2hlRGF0YUNv
Y29hLm1tCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQyL05ldHdvcmtQcm9jZXNzL2NhY2hl
L05ldHdvcmtDYWNoZURhdGFDb2NvYS5tbQkocmV2aXNpb24gMTgyNjg3KQorKysgU291cmNlL1dl
YktpdDIvTmV0d29ya1Byb2Nlc3MvY2FjaGUvTmV0d29ya0NhY2hlRGF0YUNvY29hLm1tCSh3b3Jr
aW5nIGNvcHkpCkBAIC0zMCw2ICszMCw3IEBACiAKICNpbmNsdWRlIDxkaXNwYXRjaC9kaXNwYXRj
aC5oPgogI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KIAogbmFt
ZXNwYWNlIFdlYktpdCB7CiBuYW1lc3BhY2UgTmV0d29ya0NhY2hlIHsKQEAgLTQ3LDYgKzQ4LDEx
IEBAIERhdGE6OkRhdGEoRGlzcGF0Y2hQdHI8ZGlzcGF0Y2hfZGF0YV90PiAKIHsKIH0KIAorRGF0
YSBEYXRhOjplbXB0eSgpCit7CisgICAgcmV0dXJuIHsgRGlzcGF0Y2hQdHI8ZGlzcGF0Y2hfZGF0
YV90PihkaXNwYXRjaF9kYXRhX2VtcHR5KSB9OworfQorCiBjb25zdCB1aW50OF90KiBEYXRhOjpk
YXRhKCkgY29uc3QKIHsKICAgICBpZiAoIW1fZGF0YSAmJiBtX2Rpc3BhdGNoRGF0YSkgewpAQCAt
ODcsMTcgKzkzLDY0IEBAIERhdGEgY29uY2F0ZW5hdGUoY29uc3QgRGF0YSYgYSwgY29uc3QgRGEK
ICAgICByZXR1cm4geyBhZG9wdERpc3BhdGNoKGRpc3BhdGNoX2RhdGFfY3JlYXRlX2NvbmNhdChh
LmRpc3BhdGNoRGF0YSgpLCBiLmRpc3BhdGNoRGF0YSgpKSkgfTsKIH0KIAotRGF0YSBtYXBGaWxl
KGludCBmZCwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpCitEYXRhIERhdGE6OmZyb21NYXAo
dm9pZCogbWFwLCBzaXplX3Qgc2l6ZSkKIHsKLSAgICB2b2lkKiBtYXAgPSBtbWFwKG51bGxwdHIs
IHNpemUsIFBST1RfUkVBRCwgTUFQX1BSSVZBVEUsIGZkLCBvZmZzZXQpOwotICAgIGlmIChtYXAg
PT0gTUFQX0ZBSUxFRCkKLSAgICAgICAgcmV0dXJuIHsgfTsKKyAgICBBU1NFUlQobWFwICYmIG1h
cCAhPSBNQVBfRkFJTEVEKTsKICAgICBhdXRvIGJvZHlNYXAgPSBhZG9wdERpc3BhdGNoKGRpc3Bh
dGNoX2RhdGFfY3JlYXRlKG1hcCwgc2l6ZSwgZGlzcGF0Y2hfZ2V0X21haW5fcXVldWUoKSwgW21h
cCwgc2l6ZV0gewogICAgICAgICBtdW5tYXAobWFwLCBzaXplKTsKICAgICB9KSk7CiAgICAgcmV0
dXJuIHsgYm9keU1hcCwgRGF0YTo6QmFja2luZzo6TWFwIH07CiB9CiAKK0RhdGEgbWFwRmlsZShp
bnQgZmQsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKQoreworICAgIGlmICghc2l6ZSkKKyAg
ICAgICAgcmV0dXJuIERhdGE6OmVtcHR5KCk7CisKKyAgICB2b2lkKiBtYXAgPSBtbWFwKG51bGxw
dHIsIHNpemUsIFBST1RfUkVBRCwgTUFQX1BSSVZBVEUsIGZkLCBvZmZzZXQpOworICAgIGlmICht
YXAgPT0gTUFQX0ZBSUxFRCkKKyAgICAgICAgcmV0dXJuIHsgfTsKKyAgICByZXR1cm4gRGF0YTo6
ZnJvbU1hcChtYXAsIHNpemUpOworfQorCitEYXRhIG1hcEZpbGUoY29uc3QgQ1N0cmluZyYgcGF0
aCkKK3sKKyAgICBpbnQgZmQgPSBvcGVuKHBhdGguZGF0YSgpLCBPX1JET05MWSwgMCk7CisgICAg
aWYgKGZkIDwgMCkKKyAgICAgICAgcmV0dXJuIHsgfTsKKyAgICBzdHJ1Y3Qgc3RhdCBzdGF0Owor
ICAgIGlmIChmc3RhdChmZCwgJnN0YXQpIDwgMCkgeworICAgICAgICBjbG9zZShmZCk7CisgICAg
ICAgIHJldHVybiB7IH07CisgICAgfQorICAgIHNpemVfdCBzaXplID0gc3RhdC5zdF9zaXplOwor
ICAgIGF1dG8gZGF0YSA9IG1hcEZpbGUoZmQsIDAsIHNpemUpOworICAgIGNsb3NlKGZkKTsKKwor
ICAgIHJldHVybiBkYXRhOworfQorCitTSEExOjpEaWdlc3QgY29tcHV0ZVNIQTEoY29uc3QgRGF0
YSYgZGF0YSkKK3sKKyAgICBTSEExIHNoYTE7CisgICAgZGF0YS5hcHBseShbJnNoYTFdKGNvbnN0
IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgICAgIHNoYTEuYWRkQnl0ZXMoZGF0
YSwgc2l6ZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0pOworICAgIFNIQTE6OkRpZ2Vz
dCBkaWdlc3Q7CisgICAgc2hhMS5jb21wdXRlSGFzaChkaWdlc3QpOworICAgIHJldHVybiBkaWdl
c3Q7Cit9CisKK2Jvb2wgYnl0ZXNFcXVhbChjb25zdCBEYXRhJiBhLCBjb25zdCBEYXRhJiBiKQor
eworICAgIGlmIChhLmlzTnVsbCgpIHx8IGIuaXNOdWxsKCkpCisgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICBpZiAoYS5zaXplKCkgIT0gYi5zaXplKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsK
KyAgICByZXR1cm4gIW1lbWNtcChhLmRhdGEoKSwgYi5kYXRhKCksIGEuc2l6ZSgpKTsKK30KKwog
fQogfQogCkluZGV4OiBTb3VyY2UvV2ViS2l0Mi9OZXR3b3JrUHJvY2Vzcy9jYWNoZS9OZXR3b3Jr
Q2FjaGVFbnRyeS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdDIvTmV0d29ya1Byb2Nl
c3MvY2FjaGUvTmV0d29ya0NhY2hlRW50cnkuY3BwCShyZXZpc2lvbiAxODI2ODcpCisrKyBTb3Vy
Y2UvV2ViS2l0Mi9OZXR3b3JrUHJvY2Vzcy9jYWNoZS9OZXR3b3JrQ2FjaGVFbnRyeS5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTE2NSw2ICsxNjUsMTIgQEAgdm9pZCBFbnRyeTo6YXNKU09OKFN0cmlu
Z0J1aWxkZXImIGpzb24sIAogICAgIGpzb24uYXBwZW5kTGl0ZXJhbCgiXCJVUkxcIjogIik7CiAg
ICAgSlNDOjphcHBlbmRRdW90ZWRKU09OU3RyaW5nVG9CdWlsZGVyKGpzb24sIG1fcmVzcG9uc2Uu
dXJsKCkuc3RyaW5nKCkpOwogICAgIGpzb24uYXBwZW5kTGl0ZXJhbCgiLFxuIik7CisgICAganNv
bi5hcHBlbmRMaXRlcmFsKCJcImJvZHlIYXNoXCI6ICIpOworICAgIEpTQzo6YXBwZW5kUXVvdGVk
SlNPTlN0cmluZ1RvQnVpbGRlcihqc29uLCBpbmZvLmJvZHlIYXNoKTsKKyAgICBqc29uLmFwcGVu
ZExpdGVyYWwoIixcbiIpOworICAgIGpzb24uYXBwZW5kTGl0ZXJhbCgiXCJib2R5U2hhcmVDb3Vu
dFwiOiAiKTsKKyAgICBqc29uLmFwcGVuZE51bWJlcihpbmZvLmJvZHlTaGFyZUNvdW50KTsKKyAg
ICBqc29uLmFwcGVuZExpdGVyYWwoIixcbiIpOwogICAgIGpzb24uYXBwZW5kTGl0ZXJhbCgiXCJo
ZWFkZXJzXCI6IHtcbiIpOwogICAgIGJvb2wgZmlyc3RIZWFkZXIgPSB0cnVlOwogICAgIGZvciAo
YXV0byYgaGVhZGVyIDogbV9yZXNwb25zZS5odHRwSGVhZGVyRmllbGRzKCkpIHsKSW5kZXg6IFNv
dXJjZS9XZWJLaXQyL05ldHdvcmtQcm9jZXNzL2NhY2hlL05ldHdvcmtDYWNoZVN0b3JhZ2UuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQyL05ldHdvcmtQcm9jZXNzL2NhY2hlL05ldHdv
cmtDYWNoZVN0b3JhZ2UuY3BwCShyZXZpc2lvbiAxODI2ODcpCisrKyBTb3VyY2UvV2ViS2l0Mi9O
ZXR3b3JrUHJvY2Vzcy9jYWNoZS9OZXR3b3JrQ2FjaGVTdG9yYWdlLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtNDMsNiArNDMsOSBAQCBuYW1lc3BhY2UgTmV0d29ya0NhY2hlIHsKIAogc3RhdGljIGNv
bnN0IGNoYXIgbmV0d29ya0NhY2hlU3ViZGlyZWN0b3J5W10gPSAiV2ViS2l0Q2FjaGUiOwogc3Rh
dGljIGNvbnN0IGNoYXIgdmVyc2lvbkRpcmVjdG9yeVByZWZpeFtdID0gIlZlcnNpb24gIjsKK3N0
YXRpYyBjb25zdCBjaGFyIHJlY29yZHNEaXJlY3RvcnlOYW1lW10gPSAiUmVjb3JkcyI7CitzdGF0
aWMgY29uc3QgY2hhciBibG9ic0RpcmVjdG9yeU5hbWVbXSA9ICJCbG9icyI7CitzdGF0aWMgY29u
c3QgY2hhciBib2R5UG9zdGZpeFtdID0gIi1ib2R5IjsKIAogc3RhdGljIGRvdWJsZSBjb21wdXRl
UmVjb3JkV29ydGgoRmlsZVRpbWVzKTsKIApAQCAtNjIsMTcgKzY1LDMzIEBAIHN0YXRpYyBTdHJp
bmcgbWFrZVZlcnNpb25lZERpcmVjdG9yeVBhdGgKICAgICByZXR1cm4gV2ViQ29yZTo6cGF0aEJ5
QXBwZW5kaW5nQ29tcG9uZW50KGJhc2VEaXJlY3RvcnlQYXRoLCB2ZXJzaW9uU3ViZGlyZWN0b3J5
KTsKIH0KIAorc3RhdGljIFN0cmluZyBtYWtlUmVjb3JkRGlyZWN0b3J5UGF0aChjb25zdCBTdHJp
bmcmIGJhc2VEaXJlY3RvcnlQYXRoKQoreworICAgIHJldHVybiBXZWJDb3JlOjpwYXRoQnlBcHBl
bmRpbmdDb21wb25lbnQobWFrZVZlcnNpb25lZERpcmVjdG9yeVBhdGgoYmFzZURpcmVjdG9yeVBh
dGgpLCByZWNvcmRzRGlyZWN0b3J5TmFtZSk7Cit9CisKK3N0YXRpYyBTdHJpbmcgbWFrZUJsb2JE
aXJlY3RvcnlQYXRoKGNvbnN0IFN0cmluZyYgYmFzZURpcmVjdG9yeVBhdGgpCit7CisgICAgcmV0
dXJuIFdlYkNvcmU6OnBhdGhCeUFwcGVuZGluZ0NvbXBvbmVudChtYWtlVmVyc2lvbmVkRGlyZWN0
b3J5UGF0aChiYXNlRGlyZWN0b3J5UGF0aCksIGJsb2JzRGlyZWN0b3J5TmFtZSk7Cit9CisKIFN0
b3JhZ2U6OlN0b3JhZ2UoY29uc3QgU3RyaW5nJiBiYXNlRGlyZWN0b3J5UGF0aCkKICAgICA6IG1f
YmFzZURpcmVjdG9yeVBhdGgoYmFzZURpcmVjdG9yeVBhdGgpCi0gICAgLCBtX2RpcmVjdG9yeVBh
dGgobWFrZVZlcnNpb25lZERpcmVjdG9yeVBhdGgoYmFzZURpcmVjdG9yeVBhdGgpKQorICAgICwg
bV9kaXJlY3RvcnlQYXRoKG1ha2VSZWNvcmREaXJlY3RvcnlQYXRoKGJhc2VEaXJlY3RvcnlQYXRo
KSkKICAgICAsIG1faW9RdWV1ZShXb3JrUXVldWU6OmNyZWF0ZSgiY29tLmFwcGxlLldlYktpdC5D
YWNoZS5TdG9yYWdlIiwgV29ya1F1ZXVlOjpUeXBlOjpDb25jdXJyZW50KSkKICAgICAsIG1fYmFj
a2dyb3VuZElPUXVldWUoV29ya1F1ZXVlOjpjcmVhdGUoImNvbS5hcHBsZS5XZWJLaXQuQ2FjaGUu
U3RvcmFnZS5iYWNrZ3JvdW5kIiwgV29ya1F1ZXVlOjpUeXBlOjpDb25jdXJyZW50LCBXb3JrUXVl
dWU6OlFPUzo6QmFja2dyb3VuZCkpCiAgICAgLCBtX3NlcmlhbEJhY2tncm91bmRJT1F1ZXVlKFdv
cmtRdWV1ZTo6Y3JlYXRlKCJjb20uYXBwbGUuV2ViS2l0LkNhY2hlLlN0b3JhZ2Uuc2VyaWFsQmFj
a2dyb3VuZCIsIFdvcmtRdWV1ZTo6VHlwZTo6U2VyaWFsLCBXb3JrUXVldWU6OlFPUzo6QmFja2dy
b3VuZCkpCisgICAgLCBtX2Jsb2JTdG9yYWdlKG1ha2VCbG9iRGlyZWN0b3J5UGF0aChiYXNlRGly
ZWN0b3J5UGF0aCkpCiB7CiAgICAgZGVsZXRlT2xkVmVyc2lvbnMoKTsKICAgICBzeW5jaHJvbml6
ZSgpOwogfQogCitzaXplX3QgU3RvcmFnZTo6YXBwcm94aW1hdGVTaXplKCkgY29uc3QKK3sKKyAg
ICByZXR1cm4gbV9hcHByb3hpbWF0ZVNpemUgKyBtX2Jsb2JTdG9yYWdlLmFwcHJveGltYXRlU2l6
ZSgpOworfQorCiB2b2lkIFN0b3JhZ2U6OnN5bmNocm9uaXplKCkKIHsKICAgICBBU1NFUlQoUnVu
TG9vcDo6aXNNYWluKCkpOwpAQCAtMTE3LDcgKzEzNiw5IEBAIHZvaWQgU3RvcmFnZTo6c3luY2hy
b25pemUoKQogICAgICAgICAgICAgbV9zeW5jaHJvbml6YXRpb25JblByb2dyZXNzID0gZmFsc2U7
CiAgICAgICAgIH0pOwogCi0gICAgICAgIExPRyhOZXR3b3JrQ2FjaGVTdG9yYWdlLCAiKE5ldHdv
cmtQcm9jZXNzKSBjYWNoZSBzeW5jaHJvbml6YXRpb24gY29tcGxldGVkIGFwcHJveGltYXRlU2l6
ZT0lenUgY291bnQ9JWQiLCBzaXplLCBjb3VudCk7CisgICAgICAgIG1fYmxvYlN0b3JhZ2Uuc3lu
Y2hyb25pemUoKTsKKworICAgICAgICBMT0coTmV0d29ya0NhY2hlU3RvcmFnZSwgIihOZXR3b3Jr
UHJvY2VzcykgY2FjaGUgc3luY2hyb25pemF0aW9uIGNvbXBsZXRlZCBzaXplPSV6dSBjb3VudD0l
ZCIsIHNpemUsIGNvdW50KTsKICAgICB9KTsKIH0KIApAQCAtMTM5LDcgKzE2MCw3IEBAIGJvb2wg
U3RvcmFnZTo6bWF5Q29udGFpbihjb25zdCBLZXkmIGtleSkKICAgICByZXR1cm4gIW1fY29udGVu
dHNGaWx0ZXIgfHwgbV9jb250ZW50c0ZpbHRlci0+bWF5Q29udGFpbihrZXkuaGFzaCgpKTsKIH0K
IAotc3RhdGljIFN0cmluZyBkaXJlY3RvcnlQYXRoRm9yS2V5KGNvbnN0IEtleSYga2V5LCBjb25z
dCBTdHJpbmcmIGNhY2hlUGF0aCkKK3N0YXRpYyBTdHJpbmcgcGFydGl0aW9uUGF0aEZvcktleShj
b25zdCBLZXkmIGtleSwgY29uc3QgU3RyaW5nJiBjYWNoZVBhdGgpCiB7CiAgICAgQVNTRVJUKCFr
ZXkucGFydGl0aW9uKCkuaXNFbXB0eSgpKTsKICAgICByZXR1cm4gV2ViQ29yZTo6cGF0aEJ5QXBw
ZW5kaW5nQ29tcG9uZW50KGNhY2hlUGF0aCwga2V5LnBhcnRpdGlvbigpKTsKQEAgLTE1MCwxOCAr
MTcxLDE5IEBAIHN0YXRpYyBTdHJpbmcgZmlsZU5hbWVGb3JLZXkoY29uc3QgS2V5JiAKICAgICBy
ZXR1cm4ga2V5Lmhhc2hBc1N0cmluZygpOwogfQogCi1zdGF0aWMgU3RyaW5nIGZpbGVQYXRoRm9y
S2V5KGNvbnN0IEtleSYga2V5LCBjb25zdCBTdHJpbmcmIGNhY2hlUGF0aCkKK3N0YXRpYyBTdHJp
bmcgcmVjb3JkUGF0aEZvcktleShjb25zdCBLZXkmIGtleSwgY29uc3QgU3RyaW5nJiBjYWNoZVBh
dGgpCiB7Ci0gICAgcmV0dXJuIFdlYkNvcmU6OnBhdGhCeUFwcGVuZGluZ0NvbXBvbmVudChkaXJl
Y3RvcnlQYXRoRm9yS2V5KGtleSwgY2FjaGVQYXRoKSwgZmlsZU5hbWVGb3JLZXkoa2V5KSk7Cisg
ICAgcmV0dXJuIFdlYkNvcmU6OnBhdGhCeUFwcGVuZGluZ0NvbXBvbmVudChwYXJ0aXRpb25QYXRo
Rm9yS2V5KGtleSwgY2FjaGVQYXRoKSwgZmlsZU5hbWVGb3JLZXkoa2V5KSk7CiB9CiAKLXN0YXRp
YyBSZWY8SU9DaGFubmVsPiBvcGVuRmlsZUZvcktleShjb25zdCBLZXkmIGtleSwgSU9DaGFubmVs
OjpUeXBlIHR5cGUsIGNvbnN0IFN0cmluZyYgY2FjaGVQYXRoKQorc3RhdGljIFN0cmluZyBib2R5
UGF0aEZvclJlY29yZFBhdGgoY29uc3QgU3RyaW5nJiByZWNvcmRQYXRoKQogewotICAgIGF1dG8g
ZGlyZWN0b3J5UGF0aCA9IGRpcmVjdG9yeVBhdGhGb3JLZXkoa2V5LCBjYWNoZVBhdGgpOwotICAg
IGF1dG8gZmlsZVBhdGggPSBXZWJDb3JlOjpwYXRoQnlBcHBlbmRpbmdDb21wb25lbnQoZGlyZWN0
b3J5UGF0aCwgZmlsZU5hbWVGb3JLZXkoa2V5KSk7Ci0gICAgaWYgKHR5cGUgPT0gSU9DaGFubmVs
OjpUeXBlOjpDcmVhdGUpCi0gICAgICAgIFdlYkNvcmU6Om1ha2VBbGxEaXJlY3RvcmllcyhkaXJl
Y3RvcnlQYXRoKTsKLSAgICByZXR1cm4gSU9DaGFubmVsOjpvcGVuKGZpbGVQYXRoLCB0eXBlKTsK
KyAgICByZXR1cm4gcmVjb3JkUGF0aCArIGJvZHlQb3N0Zml4OworfQorCitzdGF0aWMgU3RyaW5n
IGJvZHlQYXRoRm9yS2V5KGNvbnN0IEtleSYga2V5LCBjb25zdCBTdHJpbmcmIGNhY2hlUGF0aCkK
K3sKKyAgICByZXR1cm4gYm9keVBhdGhGb3JSZWNvcmRQYXRoKHJlY29yZFBhdGhGb3JLZXkoa2V5
LCBjYWNoZVBhdGgpKTsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGhhc2hEYXRhKGNvbnN0IERhdGEm
IGRhdGEpCkBAIC0xODgsOCArMjEwLDcgQEAgc3RydWN0IFJlY29yZE1ldGFEYXRhIHsKICAgICB1
bnNpZ25lZCBoZWFkZXJDaGVja3N1bTsKICAgICB1aW50NjRfdCBoZWFkZXJPZmZzZXQ7CiAgICAg
dWludDY0X3QgaGVhZGVyU2l6ZTsKLSAgICB1bnNpZ25lZCBib2R5Q2hlY2tzdW07Ci0gICAgdWlu
dDY0X3QgYm9keU9mZnNldDsKKyAgICBTSEExOjpEaWdlc3QgYm9keUhhc2g7CiAgICAgdWludDY0
X3QgYm9keVNpemU7CiB9OwogCkBAIC0yMDgsMTQgKzIyOSwxMyBAQCBzdGF0aWMgYm9vbCBkZWNv
ZGVSZWNvcmRNZXRhRGF0YShSZWNvcmRNCiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAg
ICAgIGlmICghZGVjb2Rlci5kZWNvZGUobWV0YURhdGEuaGVhZGVyU2l6ZSkpCiAgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGlmICghZGVjb2Rlci5kZWNvZGUobWV0YURhdGEuYm9k
eUNoZWNrc3VtKSkKKyAgICAgICAgaWYgKCFkZWNvZGVyLmRlY29kZShtZXRhRGF0YS5ib2R5SGFz
aCkpCiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIGlmICghZGVjb2Rlci5kZWNv
ZGUobWV0YURhdGEuYm9keVNpemUpKQogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAg
ICBpZiAoIWRlY29kZXIudmVyaWZ5Q2hlY2tzdW0oKSkKICAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKICAgICAgICAgbWV0YURhdGEuaGVhZGVyT2Zmc2V0ID0gZGVjb2Rlci5jdXJyZW50T2Zmc2V0
KCk7Ci0gICAgICAgIG1ldGFEYXRhLmJvZHlPZmZzZXQgPSBXVEY6OnJvdW5kVXBUb011bHRpcGxl
T2YocGFnZVNpemUoKSwgbWV0YURhdGEuaGVhZGVyT2Zmc2V0ICsgbWV0YURhdGEuaGVhZGVyU2l6
ZSk7CiAgICAgICAgIHN1Y2Nlc3MgPSB0cnVlOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAg
fSk7CkBAIC0yMzMsMTAgKzI1Myw2IEBAIHN0YXRpYyBib29sIGRlY29kZVJlY29yZEhlYWRlcihj
b25zdCBEYXQKICAgICAgICAgTE9HKE5ldHdvcmtDYWNoZVN0b3JhZ2UsICIoTmV0d29ya1Byb2Nl
c3MpIHZlcnNpb24gbWlzbWF0Y2giKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAg
ICBpZiAobWV0YURhdGEuaGVhZGVyT2Zmc2V0ICsgbWV0YURhdGEuaGVhZGVyU2l6ZSA+IG1ldGFE
YXRhLmJvZHlPZmZzZXQpIHsKLSAgICAgICAgTE9HKE5ldHdvcmtDYWNoZVN0b3JhZ2UsICIoTmV0
d29ya1Byb2Nlc3MpIGJvZHkgb2Zmc2V0IG1pc21hdGNoIik7Ci0gICAgICAgIHJldHVybiBmYWxz
ZTsKLSAgICB9CiAKICAgICBhdXRvIGhlYWRlckRhdGEgPSBmaWxlRGF0YS5zdWJyYW5nZShtZXRh
RGF0YS5oZWFkZXJPZmZzZXQsIG1ldGFEYXRhLmhlYWRlclNpemUpOwogICAgIGlmIChtZXRhRGF0
YS5oZWFkZXJDaGVja3N1bSAhPSBoYXNoRGF0YShoZWFkZXJEYXRhKSkgewpAQCAtMjQ3LDExICsy
NjMsMTEgQEAgc3RhdGljIGJvb2wgZGVjb2RlUmVjb3JkSGVhZGVyKGNvbnN0IERhdAogICAgIHJl
dHVybiB0cnVlOwogfQogCi1zdGF0aWMgc3RkOjp1bmlxdWVfcHRyPFN0b3JhZ2U6OlJlY29yZD4g
ZGVjb2RlUmVjb3JkKGNvbnN0IERhdGEmIGZpbGVEYXRhLCBpbnQgZmQsIGNvbnN0IEtleSYga2V5
KQorc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxTdG9yYWdlOjpSZWNvcmQ+IGNyZWF0ZVJlY29yZChj
b25zdCBEYXRhJiByZWNvcmREYXRhLCBjb25zdCBCbG9iU3RvcmFnZTo6QmxvYiYgYm9keUJsb2Is
IGNvbnN0IEtleSYga2V5KQogewogICAgIFJlY29yZE1ldGFEYXRhIG1ldGFEYXRhOwogICAgIERh
dGEgaGVhZGVyRGF0YTsKLSAgICBpZiAoIWRlY29kZVJlY29yZEhlYWRlcihmaWxlRGF0YSwgbWV0
YURhdGEsIGhlYWRlckRhdGEpKQorICAgIGlmICghZGVjb2RlUmVjb3JkSGVhZGVyKHJlY29yZERh
dGEsIG1ldGFEYXRhLCBoZWFkZXJEYXRhKSkKICAgICAgICAgcmV0dXJuIG51bGxwdHI7CiAKICAg
ICBpZiAobWV0YURhdGEua2V5ICE9IGtleSkKQEAgLTI2MSwyOSArMjc3LDE2IEBAIHN0YXRpYyBz
dGQ6OnVuaXF1ZV9wdHI8U3RvcmFnZTo6UmVjb3JkPiAKICAgICBhdXRvIHRpbWVTdGFtcCA9IHN0
ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s6OnRpbWVfcG9pbnQobWV0YURhdGEuZXBvY2hSZWxhdGl2
ZVRpbWVTdGFtcCk7CiAgICAgaWYgKHRpbWVTdGFtcCA+IHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xv
Y2s6Om5vdygpKQogICAgICAgICByZXR1cm4gbnVsbHB0cjsKLQotICAgIERhdGEgYm9keURhdGE7
Ci0gICAgaWYgKG1ldGFEYXRhLmJvZHlTaXplKSB7Ci0gICAgICAgIGlmIChtZXRhRGF0YS5ib2R5
T2Zmc2V0ICsgbWV0YURhdGEuYm9keVNpemUgIT0gZmlsZURhdGEuc2l6ZSgpKQotICAgICAgICAg
ICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgICAgICAgYm9keURhdGEgPSBtYXBGaWxlKGZkLCBtZXRh
RGF0YS5ib2R5T2Zmc2V0LCBtZXRhRGF0YS5ib2R5U2l6ZSk7Ci0gICAgICAgIGlmIChib2R5RGF0
YS5pc051bGwoKSkgewotICAgICAgICAgICAgTE9HKE5ldHdvcmtDYWNoZVN0b3JhZ2UsICIoTmV0
d29ya1Byb2Nlc3MpIG1hcCBmYWlsZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBudWxscHRyOwot
ICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1ldGFEYXRhLmJvZHlDaGVja3N1bSAhPSBoYXNoRGF0
YShib2R5RGF0YSkpIHsKLSAgICAgICAgICAgIExPRyhOZXR3b3JrQ2FjaGVTdG9yYWdlLCAiKE5l
dHdvcmtQcm9jZXNzKSBkYXRhIGNoZWNrc3VtIG1pc21hdGNoIik7Ci0gICAgICAgICAgICByZXR1
cm4gbnVsbHB0cjsKLSAgICAgICAgfQotICAgIH0KKyAgICBpZiAobWV0YURhdGEuYm9keVNpemUg
IT0gYm9keUJsb2IuZGF0YS5zaXplKCkpCisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIGlm
IChtZXRhRGF0YS5ib2R5SGFzaCAhPSBib2R5QmxvYi5oYXNoKQorICAgICAgICByZXR1cm4gbnVs
bHB0cjsKIAogICAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPFN0b3JhZ2U6OlJlY29yZD4oU3Rv
cmFnZTo6UmVjb3JkIHsKICAgICAgICAgbWV0YURhdGEua2V5LAogICAgICAgICB0aW1lU3RhbXAs
CiAgICAgICAgIGhlYWRlckRhdGEsCi0gICAgICAgIGJvZHlEYXRhCisgICAgICAgIGJvZHlCbG9i
LmRhdGEKICAgICB9KTsKIH0KIApAQCAtMjk2LDcgKzI5OSw3IEBAIHN0YXRpYyBEYXRhIGVuY29k
ZVJlY29yZE1ldGFEYXRhKGNvbnN0IFIKICAgICBlbmNvZGVyIDw8IG1ldGFEYXRhLmVwb2NoUmVs
YXRpdmVUaW1lU3RhbXA7CiAgICAgZW5jb2RlciA8PCBtZXRhRGF0YS5oZWFkZXJDaGVja3N1bTsK
ICAgICBlbmNvZGVyIDw8IG1ldGFEYXRhLmhlYWRlclNpemU7Ci0gICAgZW5jb2RlciA8PCBtZXRh
RGF0YS5ib2R5Q2hlY2tzdW07CisgICAgZW5jb2RlciA8PCBtZXRhRGF0YS5ib2R5SGFzaDsKICAg
ICBlbmNvZGVyIDw8IG1ldGFEYXRhLmJvZHlTaXplOwogCiAgICAgZW5jb2Rlci5lbmNvZGVDaGVj
a3N1bSgpOwpAQCAtMzA0LDI1ICszMDcsMTggQEAgc3RhdGljIERhdGEgZW5jb2RlUmVjb3JkTWV0
YURhdGEoY29uc3QgUgogICAgIHJldHVybiBEYXRhKGVuY29kZXIuYnVmZmVyKCksIGVuY29kZXIu
YnVmZmVyU2l6ZSgpKTsKIH0KIAotc3RhdGljIERhdGEgZW5jb2RlUmVjb3JkSGVhZGVyKGNvbnN0
IFN0b3JhZ2U6OlJlY29yZCYgcmVjb3JkKQorc3RhdGljIERhdGEgZW5jb2RlUmVjb3JkSGVhZGVy
KGNvbnN0IFN0b3JhZ2U6OlJlY29yZCYgcmVjb3JkLCBTSEExOjpEaWdlc3QgYm9keUhhc2gpCiB7
CiAgICAgUmVjb3JkTWV0YURhdGEgbWV0YURhdGEocmVjb3JkLmtleSk7CiAgICAgbWV0YURhdGEu
ZXBvY2hSZWxhdGl2ZVRpbWVTdGFtcCA9IHN0ZDo6Y2hyb25vOjpkdXJhdGlvbl9jYXN0PHN0ZDo6
Y2hyb25vOjptaWxsaXNlY29uZHM+KHJlY29yZC50aW1lU3RhbXAudGltZV9zaW5jZV9lcG9jaCgp
KTsKICAgICBtZXRhRGF0YS5oZWFkZXJDaGVja3N1bSA9IGhhc2hEYXRhKHJlY29yZC5oZWFkZXIp
OwogICAgIG1ldGFEYXRhLmhlYWRlclNpemUgPSByZWNvcmQuaGVhZGVyLnNpemUoKTsKLSAgICBt
ZXRhRGF0YS5ib2R5Q2hlY2tzdW0gPSBoYXNoRGF0YShyZWNvcmQuYm9keSk7CisgICAgbWV0YURh
dGEuYm9keUhhc2ggPSBib2R5SGFzaDsKICAgICBtZXRhRGF0YS5ib2R5U2l6ZSA9IHJlY29yZC5i
b2R5LnNpemUoKTsKIAogICAgIGF1dG8gZW5jb2RlZE1ldGFEYXRhID0gZW5jb2RlUmVjb3JkTWV0
YURhdGEobWV0YURhdGEpOwogICAgIGF1dG8gaGVhZGVyRGF0YSA9IGNvbmNhdGVuYXRlKGVuY29k
ZWRNZXRhRGF0YSwgcmVjb3JkLmhlYWRlcik7Ci0gICAgaWYgKCFyZWNvcmQuYm9keS5zaXplKCkp
Ci0gICAgICAgIHJldHVybiB7IGhlYWRlckRhdGEgfTsKLQotICAgIHNpemVfdCBkYXRhT2Zmc2V0
ID0gV1RGOjpyb3VuZFVwVG9NdWx0aXBsZU9mKHBhZ2VTaXplKCksIGhlYWRlckRhdGEuc2l6ZSgp
KTsKLSAgICBWZWN0b3I8dWludDhfdCwgNDA5Nj4gZmlsbGVyKGRhdGFPZmZzZXQgLSBoZWFkZXJE
YXRhLnNpemUoKSwgMCk7Ci0gICAgRGF0YSBhbGlnbm1lbnREYXRhKGZpbGxlci5kYXRhKCksIGZp
bGxlci5zaXplKCkpOwotCi0gICAgcmV0dXJuIGNvbmNhdGVuYXRlKGhlYWRlckRhdGEsIGFsaWdu
bWVudERhdGEpOworICAgIHJldHVybiB7IGhlYWRlckRhdGEgfTsKIH0KIAogdm9pZCBTdG9yYWdl
OjpyZW1vdmUoY29uc3QgS2V5JiBrZXkpCkBAIC0zMzMsMTUgKzMyOSwxNyBAQCB2b2lkIFN0b3Jh
Z2U6OnJlbW92ZShjb25zdCBLZXkmIGtleSkKICAgICAvLyBGb3Igc2ltcGxpY2l0eSB3ZSBhbHNv
IGRvbid0IHJlZHVjZSBtX2FwcHJveGltYXRlU2l6ZSBvbiByZW1vdmFscy4KICAgICAvLyBUaGUg
bmV4dCBzeW5jaHJvbml6YXRpb24gd2lsbCB1cGRhdGUgZXZlcnl0aGluZy4KIAotICAgIFN0cmlu
Z0NhcHR1cmUgZmlsZVBhdGhDYXB0dXJlKGZpbGVQYXRoRm9yS2V5KGtleSwgbV9kaXJlY3RvcnlQ
YXRoKSk7Ci0gICAgc2VyaWFsQmFja2dyb3VuZElPUXVldWUoKS5kaXNwYXRjaChbdGhpcywgZmls
ZVBhdGhDYXB0dXJlXSB7Ci0gICAgICAgIFdlYkNvcmU6OmRlbGV0ZUZpbGUoZmlsZVBhdGhDYXB0
dXJlLnN0cmluZygpKTsKKyAgICBTdHJpbmdDYXB0dXJlIHJlY29yZFBhdGhDYXB0dXJlKHJlY29y
ZFBhdGhGb3JLZXkoa2V5LCBtX2RpcmVjdG9yeVBhdGgpKTsKKyAgICBTdHJpbmdDYXB0dXJlIGJv
ZHlQYXRoQ2FwdHVyZShib2R5UGF0aEZvcktleShrZXksIG1fZGlyZWN0b3J5UGF0aCkpOworICAg
IHNlcmlhbEJhY2tncm91bmRJT1F1ZXVlKCkuZGlzcGF0Y2goW3RoaXMsIHJlY29yZFBhdGhDYXB0
dXJlLCBib2R5UGF0aENhcHR1cmVdIHsKKyAgICAgICAgV2ViQ29yZTo6ZGVsZXRlRmlsZShyZWNv
cmRQYXRoQ2FwdHVyZS5zdHJpbmcoKSk7CisgICAgICAgIG1fYmxvYlN0b3JhZ2UucmVtb3ZlKGJv
ZHlQYXRoQ2FwdHVyZS5zdHJpbmcoKSk7CiAgICAgfSk7CiB9CiAKLXZvaWQgU3RvcmFnZTo6dXBk
YXRlRmlsZU1vZGlmaWNhdGlvblRpbWUoSU9DaGFubmVsJiBjaGFubmVsKQordm9pZCBTdG9yYWdl
Ojp1cGRhdGVGaWxlTW9kaWZpY2F0aW9uVGltZShjb25zdCBTdHJpbmcmIHBhdGgpCiB7Ci0gICAg
U3RyaW5nQ2FwdHVyZSBmaWxlUGF0aENhcHR1cmUoY2hhbm5lbC5wYXRoKCkpOworICAgIFN0cmlu
Z0NhcHR1cmUgZmlsZVBhdGhDYXB0dXJlKHBhdGgpOwogICAgIHNlcmlhbEJhY2tncm91bmRJT1F1
ZXVlKCkuZGlzcGF0Y2goW2ZpbGVQYXRoQ2FwdHVyZV0gewogICAgICAgICB1cGRhdGVGaWxlTW9k
aWZpY2F0aW9uVGltZUlmTmVlZGVkKGZpbGVQYXRoQ2FwdHVyZS5zdHJpbmcoKSk7CiAgICAgfSk7
CkBAIC0zNTQsMjkgKzM1MiwzNSBAQCB2b2lkIFN0b3JhZ2U6OmRpc3BhdGNoUmVhZE9wZXJhdGlv
bihjb25zCiAKICAgICBTdHJpbmdDYXB0dXJlIGNhY2hlUGF0aENhcHR1cmUobV9kaXJlY3RvcnlQ
YXRoKTsKICAgICBpb1F1ZXVlKCkuZGlzcGF0Y2goW3RoaXMsICZyZWFkLCBjYWNoZVBhdGhDYXB0
dXJlXSB7Ci0gICAgICAgIFJlZlB0cjxJT0NoYW5uZWw+IGNoYW5uZWwgPSBvcGVuRmlsZUZvcktl
eShyZWFkLmtleSwgSU9DaGFubmVsOjpUeXBlOjpSZWFkLCBjYWNoZVBhdGhDYXB0dXJlLnN0cmlu
ZygpKTsKLSAgICAgICAgY2hhbm5lbC0+cmVhZCgwLCBzdGQ6Om51bWVyaWNfbGltaXRzPHNpemVf
dD46Om1heCgpLCBbdGhpcywgY2hhbm5lbCwgJnJlYWRdKERhdGEmIGZpbGVEYXRhLCBpbnQgZXJy
b3IpIHsKLSAgICAgICAgICAgIGlmIChlcnJvcikgewotICAgICAgICAgICAgICAgIHJlbW92ZShy
ZWFkLmtleSk7Ci0gICAgICAgICAgICAgICAgcmVhZC5jb21wbGV0aW9uSGFuZGxlcihudWxscHRy
KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYXV0byByZWNvcmQgPSBk
ZWNvZGVSZWNvcmQoZmlsZURhdGEsIGNoYW5uZWwtPmZpbGVEZXNjcmlwdG9yKCksIHJlYWQua2V5
KTsKLSAgICAgICAgICAgICAgICBib29sIHN1Y2Nlc3MgPSByZWFkLmNvbXBsZXRpb25IYW5kbGVy
KFdURjo6bW92ZShyZWNvcmQpKTsKLSAgICAgICAgICAgICAgICBpZiAoc3VjY2VzcykKLSAgICAg
ICAgICAgICAgICAgICAgdXBkYXRlRmlsZU1vZGlmaWNhdGlvblRpbWUoKmNoYW5uZWwpOwotICAg
ICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgcmVtb3ZlKHJlYWQua2V5KTsK
LSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQVNTRVJUKG1fYWN0aXZlUmVhZE9wZXJhdGlv
bnMuY29udGFpbnMoJnJlYWQpKTsKLSAgICAgICAgICAgIG1fYWN0aXZlUmVhZE9wZXJhdGlvbnMu
cmVtb3ZlKCZyZWFkKTsKLSAgICAgICAgICAgIGRpc3BhdGNoUGVuZGluZ1JlYWRPcGVyYXRpb25z
KCk7CisgICAgICAgIGF1dG8gcmVjb3JkUGF0aCA9IHJlY29yZFBhdGhGb3JLZXkocmVhZC5rZXks
IGNhY2hlUGF0aENhcHR1cmUuc3RyaW5nKCkpOworICAgICAgICBhdXRvIGJvZHlQYXRoID0gYm9k
eVBhdGhGb3JLZXkocmVhZC5rZXksIGNhY2hlUGF0aENhcHR1cmUuc3RyaW5nKCkpOworICAgICAg
ICAvLyBGSVhNRTogQm9keSBhbmQgaGVhZGVyIHJldHJpZXZlcyBjYW4gYmUgZG9uZSBpbiBwYXJh
bGxlbC4KKyAgICAgICAgYXV0byBib2R5QmxvYiA9IG1fYmxvYlN0b3JhZ2UuZ2V0KGJvZHlQYXRo
KTsKIAotICAgICAgICAgICAgTE9HKE5ldHdvcmtDYWNoZVN0b3JhZ2UsICIoTmV0d29ya1Byb2Nl
c3MpIHJlYWQgY29tcGxldGUgZXJyb3I9JWQiLCBlcnJvcik7CisgICAgICAgIFJlZlB0cjxJT0No
YW5uZWw+IGNoYW5uZWwgPSBJT0NoYW5uZWw6Om9wZW4ocmVjb3JkUGF0aCwgSU9DaGFubmVsOjpU
eXBlOjpSZWFkKTsKKyAgICAgICAgY2hhbm5lbC0+cmVhZCgwLCBzdGQ6Om51bWVyaWNfbGltaXRz
PHNpemVfdD46Om1heCgpLCBbdGhpcywgJnJlYWQsIGJvZHlCbG9iXShEYXRhJiBmaWxlRGF0YSwg
aW50IGVycm9yKSB7CisgICAgICAgICAgICBhdXRvIHJlY29yZCA9IGVycm9yID8gbnVsbHB0ciA6
IGNyZWF0ZVJlY29yZChmaWxlRGF0YSwgYm9keUJsb2IsIHJlYWQua2V5KTsKKyAgICAgICAgICAg
IGZpbmlzaFJlYWRPcGVyYXRpb24ocmVhZCwgV1RGOjptb3ZlKHJlY29yZCkpOwogICAgICAgICB9
KTsKICAgICB9KTsKIH0KIAordm9pZCBTdG9yYWdlOjpmaW5pc2hSZWFkT3BlcmF0aW9uKGNvbnN0
IFJlYWRPcGVyYXRpb24mIHJlYWQsIHN0ZDo6dW5pcXVlX3B0cjxSZWNvcmQ+IHJlY29yZCkKK3sK
KyAgICBBU1NFUlQoUnVuTG9vcDo6aXNNYWluKCkpOworCisgICAgYm9vbCBzdWNjZXNzID0gcmVh
ZC5jb21wbGV0aW9uSGFuZGxlcihXVEY6Om1vdmUocmVjb3JkKSk7CisgICAgaWYgKHN1Y2Nlc3Mp
CisgICAgICAgIHVwZGF0ZUZpbGVNb2RpZmljYXRpb25UaW1lKHJlY29yZFBhdGhGb3JLZXkocmVh
ZC5rZXksIG1fZGlyZWN0b3J5UGF0aCkpOworICAgIGVsc2UKKyAgICAgICAgcmVtb3ZlKHJlYWQu
a2V5KTsKKyAgICBBU1NFUlQobV9hY3RpdmVSZWFkT3BlcmF0aW9ucy5jb250YWlucygmcmVhZCkp
OworICAgIG1fYWN0aXZlUmVhZE9wZXJhdGlvbnMucmVtb3ZlKCZyZWFkKTsKKyAgICBkaXNwYXRj
aFBlbmRpbmdSZWFkT3BlcmF0aW9ucygpOworCisgICAgTE9HKE5ldHdvcmtDYWNoZVN0b3JhZ2Us
ICIoTmV0d29ya1Byb2Nlc3MpIHJlYWQgY29tcGxldGUgc3VjY2Vzcz0lZCIsIHN1Y2Nlc3MpOwor
fQorCiB2b2lkIFN0b3JhZ2U6OmRpc3BhdGNoUGVuZGluZ1JlYWRPcGVyYXRpb25zKCkKIHsKICAg
ICBBU1NFUlQoUnVuTG9vcDo6aXNNYWluKCkpOwpAQCAtNDEzLDYgKzQxNyw4MyBAQCB0ZW1wbGF0
ZSA8Y2xhc3MgVD4gYm9vbCByZXRyaWV2ZUZyb21NZW1vCiAgICAgcmV0dXJuIGZhbHNlOwogfQog
Cit2b2lkIFN0b3JhZ2U6OmRpc3BhdGNoUGVuZGluZ1dyaXRlT3BlcmF0aW9ucygpCit7CisgICAg
QVNTRVJUKFJ1bkxvb3A6OmlzTWFpbigpKTsKKworICAgIGNvbnN0IGludCBtYXhpbXVtQWN0aXZl
V3JpdGVPcGVyYXRpb25Db3VudCB7IDMgfTsKKworICAgIHdoaWxlICghbV9wZW5kaW5nV3JpdGVP
cGVyYXRpb25zLmlzRW1wdHkoKSkgeworICAgICAgICBpZiAobV9hY3RpdmVXcml0ZU9wZXJhdGlv
bnMuc2l6ZSgpID49IG1heGltdW1BY3RpdmVXcml0ZU9wZXJhdGlvbkNvdW50KSB7CisgICAgICAg
ICAgICBMT0coTmV0d29ya0NhY2hlU3RvcmFnZSwgIihOZXR3b3JrUHJvY2VzcykgbGltaXRpbmcg
cGFyYWxsZWwgd3JpdGVzIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAg
ICAgYXV0byB3cml0ZU9wZXJhdGlvbiA9IG1fcGVuZGluZ1dyaXRlT3BlcmF0aW9ucy50YWtlRmly
c3QoKTsKKyAgICAgICAgYXV0byYgd3JpdGUgPSAqd3JpdGVPcGVyYXRpb247CisgICAgICAgIG1f
YWN0aXZlV3JpdGVPcGVyYXRpb25zLmFkZChXVEY6Om1vdmUod3JpdGVPcGVyYXRpb24pKTsKKwor
ICAgICAgICBkaXNwYXRjaFdyaXRlT3BlcmF0aW9uKHdyaXRlKTsKKyAgICB9Cit9CisKK3ZvaWQg
U3RvcmFnZTo6ZGlzcGF0Y2hXcml0ZU9wZXJhdGlvbihjb25zdCBXcml0ZU9wZXJhdGlvbiYgd3Jp
dGUpCit7CisgICAgQVNTRVJUKFJ1bkxvb3A6OmlzTWFpbigpKTsKKyAgICBBU1NFUlQobV9hY3Rp
dmVXcml0ZU9wZXJhdGlvbnMuY29udGFpbnMoJndyaXRlKSk7CisKKyAgICAvLyBUaGlzIHdhcyBh
ZGRlZCBhbHJlYWR5IHdoZW4gc3RhcnRpbmcgdGhlIHN0b3JlIGJ1dCBmaWx0ZXIgbWlnaHQgaGF2
ZSBiZWVuIHdpcGVkLgorICAgIGFkZFRvQ29udGVudHNGaWx0ZXIod3JpdGUucmVjb3JkLmtleSk7
CisKKyAgICBTdHJpbmdDYXB0dXJlIGNhY2hlUGF0aENhcHR1cmUobV9kaXJlY3RvcnlQYXRoKTsK
KyAgICBiYWNrZ3JvdW5kSU9RdWV1ZSgpLmRpc3BhdGNoKFt0aGlzLCAmd3JpdGUsIGNhY2hlUGF0
aENhcHR1cmVdIHsKKyAgICAgICAgYXV0byBwYXJ0aXRpb25QYXRoID0gcGFydGl0aW9uUGF0aEZv
cktleSh3cml0ZS5yZWNvcmQua2V5LCBjYWNoZVBhdGhDYXB0dXJlLnN0cmluZygpKTsKKyAgICAg
ICAgYXV0byByZWNvcmRQYXRoID0gcmVjb3JkUGF0aEZvcktleSh3cml0ZS5yZWNvcmQua2V5LCBj
YWNoZVBhdGhDYXB0dXJlLnN0cmluZygpKTsKKyAgICAgICAgYXV0byBib2R5UGF0aCA9IGJvZHlQ
YXRoRm9yS2V5KHdyaXRlLnJlY29yZC5rZXksIGNhY2hlUGF0aENhcHR1cmUuc3RyaW5nKCkpOwor
CisgICAgICAgIFdlYkNvcmU6Om1ha2VBbGxEaXJlY3RvcmllcyhwYXJ0aXRpb25QYXRoKTsKKwor
ICAgICAgICAvLyBTdG9yZSB0aGUgYm9keS4KKyAgICAgICAgYXV0byBibG9iID0gbV9ibG9iU3Rv
cmFnZS5hZGQoYm9keVBhdGgsIHdyaXRlLnJlY29yZC5ib2R5KTsKKyAgICAgICAgaWYgKGJsb2Iu
ZGF0YS5pc051bGwoKSkgeworICAgICAgICAgICAgUnVuTG9vcDo6bWFpbigpLmRpc3BhdGNoKFt0
aGlzLCAmd3JpdGVdIHsKKyAgICAgICAgICAgICAgICBmaW5pc2hXcml0ZU9wZXJhdGlvbih3cml0
ZSk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisg
ICAgICAgIC8vIFRlbGwgdGhlIGNsaWVudCB3ZSBub3cgaGF2ZSBhIGRpc2stYmFja2VkIG1hcCBm
b3IgdGhpcyBkYXRhLgorICAgICAgICBzaXplX3QgbWluaW11bU1hcFNpemUgPSBwYWdlU2l6ZSgp
OworICAgICAgICBpZiAoYmxvYi5kYXRhLnNpemUoKSA+PSBtaW5pbXVtTWFwU2l6ZSAmJiBibG9i
LmRhdGEuaXNNYXAoKSAmJiB3cml0ZS5tYXBwZWRCb2R5SGFuZGxlcikgeworICAgICAgICAgICAg
YXV0byYgbWFwcGVkQm9keUhhbmRsZXIgPSB3cml0ZS5tYXBwZWRCb2R5SGFuZGxlcjsKKyAgICAg
ICAgICAgIFJ1bkxvb3A6Om1haW4oKS5kaXNwYXRjaChbYmxvYiwgbWFwcGVkQm9keUhhbmRsZXJd
IHsKKyAgICAgICAgICAgICAgICBtYXBwZWRCb2R5SGFuZGxlcihibG9iLmRhdGEpOworICAgICAg
ICAgICAgfSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBTdG9yZSB0aGUgaGVhZGVyIGFuZCBt
ZXRhIGRhdGEuCisgICAgICAgIGF1dG8gZW5jb2RlZEhlYWRlciA9IGVuY29kZVJlY29yZEhlYWRl
cih3cml0ZS5yZWNvcmQsIGJsb2IuaGFzaCk7CisgICAgICAgIGF1dG8gY2hhbm5lbCA9IElPQ2hh
bm5lbDo6b3BlbihyZWNvcmRQYXRoLCBJT0NoYW5uZWw6OlR5cGU6OkNyZWF0ZSk7CisgICAgICAg
IGludCBmZCA9IGNoYW5uZWwtPmZpbGVEZXNjcmlwdG9yKCk7CisgICAgICAgIHNpemVfdCBoZWFk
ZXJTaXplID0gZW5jb2RlZEhlYWRlci5zaXplKCk7CisgICAgICAgIGNoYW5uZWwtPndyaXRlKDAs
IGVuY29kZWRIZWFkZXIsIFt0aGlzLCAmd3JpdGUsIGhlYWRlclNpemUsIGZkXShpbnQgZXJyb3Ip
IHsKKyAgICAgICAgICAgIC8vIE9uIGVycm9yIHRoZSBlbnRyeSBzdGlsbCBzdGF5cyBpbiB0aGUg
Y29udGVudHMgZmlsdGVyIHVudGlsIG5leHQgc3luY2hyb25pemF0aW9uLgorICAgICAgICAgICAg
bV9hcHByb3hpbWF0ZVNpemUgKz0gaGVhZGVyU2l6ZTsKKyAgICAgICAgICAgIGZpbmlzaFdyaXRl
T3BlcmF0aW9uKHdyaXRlKTsKKworICAgICAgICAgICAgTE9HKE5ldHdvcmtDYWNoZVN0b3JhZ2Us
ICIoTmV0d29ya1Byb2Nlc3MpIHdyaXRlIGNvbXBsZXRlIGVycm9yPSVkIiwgZXJyb3IpOworICAg
ICAgICB9KTsKKyAgICB9KTsKK30KKwordm9pZCBTdG9yYWdlOjpmaW5pc2hXcml0ZU9wZXJhdGlv
bihjb25zdCBXcml0ZU9wZXJhdGlvbiYgd3JpdGUpCit7CisgICAgQVNTRVJUKG1fYWN0aXZlV3Jp
dGVPcGVyYXRpb25zLmNvbnRhaW5zKCZ3cml0ZSkpOworICAgIG1fYWN0aXZlV3JpdGVPcGVyYXRp
b25zLnJlbW92ZSgmd3JpdGUpOworICAgIGRpc3BhdGNoUGVuZGluZ1dyaXRlT3BlcmF0aW9ucygp
OworCisgICAgc2hyaW5rSWZOZWVkZWQoKTsKK30KKwogdm9pZCBTdG9yYWdlOjpyZXRyaWV2ZShj
b25zdCBLZXkmIGtleSwgdW5zaWduZWQgcHJpb3JpdHksIFJldHJpZXZlQ29tcGxldGlvbkhhbmRs
ZXImJiBjb21wbGV0aW9uSGFuZGxlcikKIHsKICAgICBBU1NFUlQoUnVuTG9vcDo6aXNNYWluKCkp
OwpAQCAtNDM4LDE3ICs1MTksMTUgQEAgdm9pZCBTdG9yYWdlOjpyZXRyaWV2ZShjb25zdCBLZXkm
IGtleSwgdQogICAgIGRpc3BhdGNoUGVuZGluZ1JlYWRPcGVyYXRpb25zKCk7CiB9CiAKLXZvaWQg
U3RvcmFnZTo6c3RvcmUoY29uc3QgUmVjb3JkJiByZWNvcmQsIFN0b3JlQ29tcGxldGlvbkhhbmRs
ZXImJiBjb21wbGV0aW9uSGFuZGxlcikKK3ZvaWQgU3RvcmFnZTo6c3RvcmUoY29uc3QgUmVjb3Jk
JiByZWNvcmQsIE1hcHBlZEJvZHlIYW5kbGVyJiYgbWFwcGVkQm9keUhhbmRsZXIpCiB7CiAgICAg
QVNTRVJUKFJ1bkxvb3A6OmlzTWFpbigpKTsKICAgICBBU1NFUlQoIXJlY29yZC5rZXkuaXNOdWxs
KCkpOwogCi0gICAgaWYgKCFtX2NhcGFjaXR5KSB7Ci0gICAgICAgIGNvbXBsZXRpb25IYW5kbGVy
KGZhbHNlLCB7IH0pOworICAgIGlmICghbV9jYXBhY2l0eSkKICAgICAgICAgcmV0dXJuOwotICAg
IH0KIAotICAgIG1fcGVuZGluZ1dyaXRlT3BlcmF0aW9ucy5hcHBlbmQobmV3IFdyaXRlT3BlcmF0
aW9uIHsgcmVjb3JkLCB7IH0sIFdURjo6bW92ZShjb21wbGV0aW9uSGFuZGxlcikgfSk7CisgICAg
bV9wZW5kaW5nV3JpdGVPcGVyYXRpb25zLmFwcGVuZChuZXcgV3JpdGVPcGVyYXRpb24geyByZWNv
cmQsIFdURjo6bW92ZShtYXBwZWRCb2R5SGFuZGxlcikgfSk7CiAKICAgICAvLyBBZGQga2V5IHRv
IHRoZSBmaWx0ZXIgYWxyZWFkeSBoZXJlIGFzIHdlIGRvIGxvb2t1cHMgZnJvbSB0aGUgcGVuZGlu
ZyBvcGVyYXRpb25zIHRvby4KICAgICBhZGRUb0NvbnRlbnRzRmlsdGVyKHJlY29yZC5rZXkpOwpA
QCAtNDU2LDQzICs1MzUsMjkgQEAgdm9pZCBTdG9yYWdlOjpzdG9yZShjb25zdCBSZWNvcmQmIHJl
Y29yZAogICAgIGRpc3BhdGNoUGVuZGluZ1dyaXRlT3BlcmF0aW9ucygpOwogfQogCi12b2lkIFN0
b3JhZ2U6OnVwZGF0ZShjb25zdCBSZWNvcmQmIHVwZGF0ZVJlY29yZCwgY29uc3QgUmVjb3JkJiBl
eGlzdGluZ1JlY29yZCwgU3RvcmVDb21wbGV0aW9uSGFuZGxlciYmIGNvbXBsZXRpb25IYW5kbGVy
KQotewotICAgIEFTU0VSVChSdW5Mb29wOjppc01haW4oKSk7Ci0gICAgQVNTRVJUKCFleGlzdGlu
Z1JlY29yZC5rZXkuaXNOdWxsKCkpOwotICAgIEFTU0VSVChleGlzdGluZ1JlY29yZC5rZXkgPT0g
dXBkYXRlUmVjb3JkLmtleSk7Ci0KLSAgICBpZiAoIW1fY2FwYWNpdHkpIHsKLSAgICAgICAgY29t
cGxldGlvbkhhbmRsZXIoZmFsc2UsIHsgfSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAg
ICBtX3BlbmRpbmdXcml0ZU9wZXJhdGlvbnMuYXBwZW5kKG5ldyBXcml0ZU9wZXJhdGlvbiB7IHVw
ZGF0ZVJlY29yZCwgZXhpc3RpbmdSZWNvcmQsIFdURjo6bW92ZShjb21wbGV0aW9uSGFuZGxlcikg
fSk7Ci0KLSAgICBkaXNwYXRjaFBlbmRpbmdXcml0ZU9wZXJhdGlvbnMoKTsKLX0KLQogdm9pZCBT
dG9yYWdlOjp0cmF2ZXJzZShUcmF2ZXJzZUZsYWdzIGZsYWdzLCBzdGQ6OmZ1bmN0aW9uPHZvaWQg
KGNvbnN0IFJlY29yZCosIGNvbnN0IFJlY29yZEluZm8mKT4mJiB0cmF2ZXJzZUhhbmRsZXIpCiB7
CiAgICAgU3RyaW5nQ2FwdHVyZSBjYWNoZVBhdGhDYXB0dXJlKG1fZGlyZWN0b3J5UGF0aCk7CiAg
ICAgaW9RdWV1ZSgpLmRpc3BhdGNoKFt0aGlzLCBmbGFncywgY2FjaGVQYXRoQ2FwdHVyZSwgdHJh
dmVyc2VIYW5kbGVyXSB7CiAgICAgICAgIFN0cmluZyBjYWNoZVBhdGggPSBjYWNoZVBhdGhDYXB0
dXJlLnN0cmluZygpOwogICAgICAgICB0cmF2ZXJzZUNhY2hlRmlsZXMoY2FjaGVQYXRoLCBbdGhp
cywgZmxhZ3MsICZ0cmF2ZXJzZUhhbmRsZXJdKGNvbnN0IFN0cmluZyYgZmlsZU5hbWUsIGNvbnN0
IFN0cmluZyYgcGFydGl0aW9uUGF0aCkgewotICAgICAgICAgICAgYXV0byBmaWxlUGF0aCA9IFdl
YkNvcmU6OnBhdGhCeUFwcGVuZGluZ0NvbXBvbmVudChwYXJ0aXRpb25QYXRoLCBmaWxlTmFtZSk7
CisgICAgICAgICAgICBhdXRvIHJlY29yZFBhdGggPSBXZWJDb3JlOjpwYXRoQnlBcHBlbmRpbmdD
b21wb25lbnQocGFydGl0aW9uUGF0aCwgZmlsZU5hbWUpOwogCiAgICAgICAgICAgICBSZWNvcmRJ
bmZvIGluZm87CiAgICAgICAgICAgICBpZiAoZmxhZ3MgJiBUcmF2ZXJzZUZsYWc6OkNvbXB1dGVX
b3J0aCkKLSAgICAgICAgICAgICAgICBpbmZvLndvcnRoID0gY29tcHV0ZVJlY29yZFdvcnRoKGZp
bGVUaW1lcyhmaWxlUGF0aCkpOworICAgICAgICAgICAgICAgIGluZm8ud29ydGggPSBjb21wdXRl
UmVjb3JkV29ydGgoZmlsZVRpbWVzKHJlY29yZFBhdGgpKTsKKyAgICAgICAgICAgIGlmIChmbGFn
cyAmIFRyYXZlcnNlRmxhZzo6U2hhcmVDb3VudCkKKyAgICAgICAgICAgICAgICBpbmZvLmJvZHlT
aGFyZUNvdW50ID0gbV9ibG9iU3RvcmFnZS5zaGFyZUNvdW50KGJvZHlQYXRoRm9yUmVjb3JkUGF0
aChyZWNvcmRQYXRoKSk7CiAKLSAgICAgICAgICAgIGF1dG8gY2hhbm5lbCA9IElPQ2hhbm5lbDo6
b3BlbihmaWxlUGF0aCwgSU9DaGFubmVsOjpUeXBlOjpSZWFkKTsKLSAgICAgICAgICAgIGNvbnN0
IHNpemVfdCBoZWFkZXJSZWFkU2l6ZSA9IDE2IDw8IDEwOworICAgICAgICAgICAgYXV0byBjaGFu
bmVsID0gSU9DaGFubmVsOjpvcGVuKHJlY29yZFBhdGgsIElPQ2hhbm5lbDo6VHlwZTo6UmVhZCk7
CiAgICAgICAgICAgICAvLyBGSVhNRTogVHJhdmVyc2FsIGlzIHNsb3dlciB0aGFuIGl0IHNob3Vs
ZCBiZSBkdWUgdG8gbGFjayBvZiBwYXJhbGxlbGlzbS4KLSAgICAgICAgICAgIGNoYW5uZWwtPnJl
YWRTeW5jKDAsIGhlYWRlclJlYWRTaXplLCBbdGhpcywgJnRyYXZlcnNlSGFuZGxlciwgJmluZm9d
KERhdGEmIGZpbGVEYXRhLCBpbnQpIHsKKyAgICAgICAgICAgIGNoYW5uZWwtPnJlYWRTeW5jKDAs
IHN0ZDo6bnVtZXJpY19saW1pdHM8c2l6ZV90Pjo6bWF4KCksIFt0aGlzLCAmdHJhdmVyc2VIYW5k
bGVyLCAmaW5mb10oRGF0YSYgZmlsZURhdGEsIGludCkgewogICAgICAgICAgICAgICAgIFJlY29y
ZE1ldGFEYXRhIG1ldGFEYXRhOwogICAgICAgICAgICAgICAgIERhdGEgaGVhZGVyRGF0YTsKICAg
ICAgICAgICAgICAgICBpZiAoZGVjb2RlUmVjb3JkSGVhZGVyKGZpbGVEYXRhLCBtZXRhRGF0YSwg
aGVhZGVyRGF0YSkpIHsKICAgICAgICAgICAgICAgICAgICAgUmVjb3JkIHJlY29yZCB7IG1ldGFE
YXRhLmtleSwgc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6dGltZV9wb2ludChtZXRhRGF0YS5l
cG9jaFJlbGF0aXZlVGltZVN0YW1wKSwgaGVhZGVyRGF0YSwgeyB9IH07CiAgICAgICAgICAgICAg
ICAgICAgIGluZm8uYm9keVNpemUgPSBtZXRhRGF0YS5ib2R5U2l6ZTsKKyAgICAgICAgICAgICAg
ICAgICAgaW5mby5ib2R5SGFzaCA9IFN0cmluZzo6ZnJvbVVURjgoU0hBMTo6aGV4RGlnZXN0KG1l
dGFEYXRhLmJvZHlIYXNoKSk7CiAgICAgICAgICAgICAgICAgICAgIHRyYXZlcnNlSGFuZGxlcigm
cmVjb3JkLCBpbmZvKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9KTsKQEAgLTUw
MywxMDcgKzU2OCw2IEBAIHZvaWQgU3RvcmFnZTo6dHJhdmVyc2UoVHJhdmVyc2VGbGFncyBmbGEK
ICAgICB9KTsKIH0KIAotdm9pZCBTdG9yYWdlOjpkaXNwYXRjaFBlbmRpbmdXcml0ZU9wZXJhdGlv
bnMoKQotewotICAgIEFTU0VSVChSdW5Mb29wOjppc01haW4oKSk7Ci0KLSAgICBjb25zdCBpbnQg
bWF4aW11bUFjdGl2ZVdyaXRlT3BlcmF0aW9uQ291bnQgeyAzIH07Ci0KLSAgICB3aGlsZSAoIW1f
cGVuZGluZ1dyaXRlT3BlcmF0aW9ucy5pc0VtcHR5KCkpIHsKLSAgICAgICAgaWYgKG1fYWN0aXZl
V3JpdGVPcGVyYXRpb25zLnNpemUoKSA+PSBtYXhpbXVtQWN0aXZlV3JpdGVPcGVyYXRpb25Db3Vu
dCkgewotICAgICAgICAgICAgTE9HKE5ldHdvcmtDYWNoZVN0b3JhZ2UsICIoTmV0d29ya1Byb2Nl
c3MpIGxpbWl0aW5nIHBhcmFsbGVsIHdyaXRlcyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAg
ICAgICB9Ci0gICAgICAgIGF1dG8gd3JpdGVPcGVyYXRpb24gPSBtX3BlbmRpbmdXcml0ZU9wZXJh
dGlvbnMudGFrZUZpcnN0KCk7Ci0gICAgICAgIGF1dG8mIHdyaXRlID0gKndyaXRlT3BlcmF0aW9u
OwotICAgICAgICBtX2FjdGl2ZVdyaXRlT3BlcmF0aW9ucy5hZGQoV1RGOjptb3ZlKHdyaXRlT3Bl
cmF0aW9uKSk7Ci0KLSAgICAgICAgaWYgKHdyaXRlLmV4aXN0aW5nUmVjb3JkICYmIG1heUNvbnRh
aW4od3JpdGUucmVjb3JkLmtleSkpIHsKLSAgICAgICAgICAgIGRpc3BhdGNoSGVhZGVyV3JpdGVP
cGVyYXRpb24od3JpdGUpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAg
ICAgZGlzcGF0Y2hGdWxsV3JpdGVPcGVyYXRpb24od3JpdGUpOwotICAgIH0KLX0KLQotdm9pZCBT
dG9yYWdlOjpkaXNwYXRjaEZ1bGxXcml0ZU9wZXJhdGlvbihjb25zdCBXcml0ZU9wZXJhdGlvbiYg
d3JpdGUpCi17Ci0gICAgQVNTRVJUKFJ1bkxvb3A6OmlzTWFpbigpKTsKLSAgICBBU1NFUlQobV9h
Y3RpdmVXcml0ZU9wZXJhdGlvbnMuY29udGFpbnMoJndyaXRlKSk7Ci0KLSAgICAvLyBUaGlzIHdh
cyBhZGRlZCBhbHJlYWR5IHdoZW4gc3RhcnRpbmcgdGhlIHN0b3JlIGJ1dCBmaWx0ZXIgbWlnaHQg
aGF2ZSBiZWVuIHdpcGVkLgotICAgIGFkZFRvQ29udGVudHNGaWx0ZXIod3JpdGUucmVjb3JkLmtl
eSk7Ci0KLSAgICBTdHJpbmdDYXB0dXJlIGNhY2hlUGF0aENhcHR1cmUobV9kaXJlY3RvcnlQYXRo
KTsKLSAgICBiYWNrZ3JvdW5kSU9RdWV1ZSgpLmRpc3BhdGNoKFt0aGlzLCAmd3JpdGUsIGNhY2hl
UGF0aENhcHR1cmVdIHsKLSAgICAgICAgYXV0byBlbmNvZGVkSGVhZGVyID0gZW5jb2RlUmVjb3Jk
SGVhZGVyKHdyaXRlLnJlY29yZCk7Ci0gICAgICAgIGF1dG8gaGVhZGVyQW5kQm9keURhdGEgPSBj
b25jYXRlbmF0ZShlbmNvZGVkSGVhZGVyLCB3cml0ZS5yZWNvcmQuYm9keSk7Ci0KLSAgICAgICAg
YXV0byBjaGFubmVsID0gb3BlbkZpbGVGb3JLZXkod3JpdGUucmVjb3JkLmtleSwgSU9DaGFubmVs
OjpUeXBlOjpDcmVhdGUsIGNhY2hlUGF0aENhcHR1cmUuc3RyaW5nKCkpOwotICAgICAgICBpbnQg
ZmQgPSBjaGFubmVsLT5maWxlRGVzY3JpcHRvcigpOwotICAgICAgICBzaXplX3QgYm9keU9mZnNl
dCA9IGVuY29kZWRIZWFkZXIuc2l6ZSgpOwotCi0gICAgICAgIGNoYW5uZWwtPndyaXRlKDAsIGhl
YWRlckFuZEJvZHlEYXRhLCBbdGhpcywgJndyaXRlLCBib2R5T2Zmc2V0LCBmZF0oaW50IGVycm9y
KSB7Ci0gICAgICAgICAgICBzaXplX3QgYm9keVNpemUgPSB3cml0ZS5yZWNvcmQuYm9keS5zaXpl
KCk7Ci0gICAgICAgICAgICBzaXplX3QgdG90YWxTaXplID0gYm9keU9mZnNldCArIGJvZHlTaXpl
OwotCi0gICAgICAgICAgICAvLyBPbiBlcnJvciB0aGUgZW50cnkgc3RpbGwgc3RheXMgaW4gdGhl
IGNvbnRlbnRzIGZpbHRlciB1bnRpbCBuZXh0IHN5bmNocm9uaXphdGlvbi4KLSAgICAgICAgICAg
IG1fYXBwcm94aW1hdGVTaXplICs9IHRvdGFsU2l6ZTsKLQotICAgICAgICAgICAgYm9vbCBzaG91
bGRNYXBCb2R5ID0gIWVycm9yICYmIGJvZHlTaXplID49IHBhZ2VTaXplKCk7Ci0gICAgICAgICAg
ICBhdXRvIGJvZHlNYXAgPSBzaG91bGRNYXBCb2R5ID8gbWFwRmlsZShmZCwgYm9keU9mZnNldCwg
Ym9keVNpemUpIDogRGF0YSgpOwotCi0gICAgICAgICAgICB3cml0ZS5jb21wbGV0aW9uSGFuZGxl
cighZXJyb3IsIGJvZHlNYXApOwotCi0gICAgICAgICAgICBBU1NFUlQobV9hY3RpdmVXcml0ZU9w
ZXJhdGlvbnMuY29udGFpbnMoJndyaXRlKSk7Ci0gICAgICAgICAgICBtX2FjdGl2ZVdyaXRlT3Bl
cmF0aW9ucy5yZW1vdmUoJndyaXRlKTsKLSAgICAgICAgICAgIGRpc3BhdGNoUGVuZGluZ1dyaXRl
T3BlcmF0aW9ucygpOwotCi0gICAgICAgICAgICBMT0coTmV0d29ya0NhY2hlU3RvcmFnZSwgIihO
ZXR3b3JrUHJvY2Vzcykgd3JpdGUgY29tcGxldGUgZXJyb3I9JWQiLCBlcnJvcik7Ci0gICAgICAg
IH0pOwotICAgIH0pOwotCi0gICAgc2hyaW5rSWZOZWVkZWQoKTsKLX0KLQotdm9pZCBTdG9yYWdl
OjpkaXNwYXRjaEhlYWRlcldyaXRlT3BlcmF0aW9uKGNvbnN0IFdyaXRlT3BlcmF0aW9uJiB3cml0
ZSkKLXsKLSAgICBBU1NFUlQoUnVuTG9vcDo6aXNNYWluKCkpOwotICAgIEFTU0VSVCh3cml0ZS5l
eGlzdGluZ1JlY29yZCk7Ci0gICAgQVNTRVJUKG1fYWN0aXZlV3JpdGVPcGVyYXRpb25zLmNvbnRh
aW5zKCZ3cml0ZSkpOwotICAgIEFTU0VSVChtYXlDb250YWluKHdyaXRlLnJlY29yZC5rZXkpKTsK
LQotICAgIC8vIFRyeSB0byB1cGRhdGUgdGhlIGhlYWRlciBvZiBhbiBleGlzdGluZyBlbnRyeS4K
LSAgICBTdHJpbmdDYXB0dXJlIGNhY2hlUGF0aENhcHR1cmUobV9kaXJlY3RvcnlQYXRoKTsKLSAg
ICBiYWNrZ3JvdW5kSU9RdWV1ZSgpLmRpc3BhdGNoKFt0aGlzLCAmd3JpdGUsIGNhY2hlUGF0aENh
cHR1cmVdIHsKLSAgICAgICAgYXV0byBoZWFkZXJEYXRhID0gZW5jb2RlUmVjb3JkSGVhZGVyKHdy
aXRlLnJlY29yZCk7Ci0gICAgICAgIGF1dG8gZXhpc3RpbmdIZWFkZXJEYXRhID0gZW5jb2RlUmVj
b3JkSGVhZGVyKHdyaXRlLmV4aXN0aW5nUmVjb3JkLnZhbHVlKCkpOwotCi0gICAgICAgIGJvb2wg
cGFnZVJvdW5kZWRIZWFkZXJTaXplQ2hhbmdlZCA9IGhlYWRlckRhdGEuc2l6ZSgpICE9IGV4aXN0
aW5nSGVhZGVyRGF0YS5zaXplKCk7Ci0gICAgICAgIGlmIChwYWdlUm91bmRlZEhlYWRlclNpemVD
aGFuZ2VkKSB7Ci0gICAgICAgICAgICBMT0coTmV0d29ya0NhY2hlU3RvcmFnZSwgIihOZXR3b3Jr
UHJvY2VzcykgcGFnZS1yb3VuZGVkIGhlYWRlciBzaXplIGNoYW5nZWQsIHN0b3JpbmcgZnVsbCBl
bnRyeSIpOwotICAgICAgICAgICAgUnVuTG9vcDo6bWFpbigpLmRpc3BhdGNoKFt0aGlzLCAmd3Jp
dGVdIHsKLSAgICAgICAgICAgICAgICBkaXNwYXRjaEZ1bGxXcml0ZU9wZXJhdGlvbih3cml0ZSk7
Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAg
ICAgIGF1dG8gY2hhbm5lbCA9IG9wZW5GaWxlRm9yS2V5KHdyaXRlLnJlY29yZC5rZXksIElPQ2hh
bm5lbDo6VHlwZTo6V3JpdGUsIGNhY2hlUGF0aENhcHR1cmUuc3RyaW5nKCkpOwotICAgICAgICBj
aGFubmVsLT53cml0ZSgwLCBoZWFkZXJEYXRhLCBbdGhpcywgJndyaXRlXShpbnQgZXJyb3IpIHsK
LSAgICAgICAgICAgIExPRyhOZXR3b3JrQ2FjaGVTdG9yYWdlLCAiKE5ldHdvcmtQcm9jZXNzKSB1
cGRhdGUgY29tcGxldGUgZXJyb3I9JWQiLCBlcnJvcik7Ci0KLSAgICAgICAgICAgIGlmIChlcnJv
cikKLSAgICAgICAgICAgICAgICByZW1vdmUod3JpdGUucmVjb3JkLmtleSk7Ci0KLSAgICAgICAg
ICAgIHdyaXRlLmNvbXBsZXRpb25IYW5kbGVyKCFlcnJvciwgeyB9KTsKLQotICAgICAgICAgICAg
QVNTRVJUKG1fYWN0aXZlV3JpdGVPcGVyYXRpb25zLmNvbnRhaW5zKCZ3cml0ZSkpOwotICAgICAg
ICAgICAgbV9hY3RpdmVXcml0ZU9wZXJhdGlvbnMucmVtb3ZlKCZ3cml0ZSk7Ci0gICAgICAgICAg
ICBkaXNwYXRjaFBlbmRpbmdXcml0ZU9wZXJhdGlvbnMoKTsKLSAgICAgICAgfSk7Ci0gICAgfSk7
Ci19Ci0KIHZvaWQgU3RvcmFnZTo6c2V0Q2FwYWNpdHkoc2l6ZV90IGNhcGFjaXR5KQogewogICAg
IEFTU0VSVChSdW5Mb29wOjppc01haW4oKSk7CkBAIC02MzMsNyArNTk3LDcgQEAgdm9pZCBTdG9y
YWdlOjpjbGVhcigpCiAKICAgICBTdHJpbmdDYXB0dXJlIGRpcmVjdG9yeVBhdGhDYXB0dXJlKG1f
ZGlyZWN0b3J5UGF0aCk7CiAKLSAgICBpb1F1ZXVlKCkuZGlzcGF0Y2goW2RpcmVjdG9yeVBhdGhD
YXB0dXJlXSB7CisgICAgaW9RdWV1ZSgpLmRpc3BhdGNoKFt0aGlzLCBkaXJlY3RvcnlQYXRoQ2Fw
dHVyZV0gewogICAgICAgICBTdHJpbmcgZGlyZWN0b3J5UGF0aCA9IGRpcmVjdG9yeVBhdGhDYXB0
dXJlLnN0cmluZygpOwogICAgICAgICB0cmF2ZXJzZURpcmVjdG9yeShkaXJlY3RvcnlQYXRoLCBE
VF9ESVIsIFsmZGlyZWN0b3J5UGF0aF0oY29uc3QgU3RyaW5nJiBzdWJkaXJOYW1lKSB7CiAgICAg
ICAgICAgICBTdHJpbmcgc3ViZGlyUGF0aCA9IFdlYkNvcmU6OnBhdGhCeUFwcGVuZGluZ0NvbXBv
bmVudChkaXJlY3RvcnlQYXRoLCBzdWJkaXJOYW1lKTsKQEAgLTY0Miw2ICs2MDYsOSBAQCB2b2lk
IFN0b3JhZ2U6OmNsZWFyKCkKICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgV2ViQ29yZTo6
ZGVsZXRlRW1wdHlEaXJlY3Rvcnkoc3ViZGlyUGF0aCk7CiAgICAgICAgIH0pOworCisgICAgICAg
IC8vIFRoaXMgY2xlYW5zIHVucmVmZXJlbmNlcyBibG9icy4KKyAgICAgICAgbV9ibG9iU3RvcmFn
ZS5zeW5jaHJvbml6ZSgpOwogICAgIH0pOwogfQogCkBAIC02NjAsMTYgKzYyNywyMCBAQCBzdGF0
aWMgZG91YmxlIGNvbXB1dGVSZWNvcmRXb3J0aChGaWxlVGltCiAgICAgcmV0dXJuIGR1cmF0aW9u
PGRvdWJsZT4oYWNjZXNzQWdlKSAvIGFnZTsKIH0KIAotCi1zdGF0aWMgZG91YmxlIGRlbGV0aW9u
UHJvYmFiaWxpdHkoRmlsZVRpbWVzIHRpbWVzKQorc3RhdGljIGRvdWJsZSBkZWxldGlvblByb2Jh
YmlsaXR5KEZpbGVUaW1lcyB0aW1lcywgdW5zaWduZWQgYm9keVNoYXJlQ291bnQpCiB7CiAgICAg
c3RhdGljIGNvbnN0IGRvdWJsZSBtYXhpbXVtUHJvYmFiaWxpdHkgeyAwLjMzIH07CisgICAgc3Rh
dGljIGNvbnN0IHVuc2lnbmVkIG1heGltdW1FZmZlY3RpdmVTaGFyZUNvdW50IHsgNSB9OwogCiAg
ICAgYXV0byB3b3J0aCA9IGNvbXB1dGVSZWNvcmRXb3J0aCh0aW1lcyk7CiAKICAgICAvLyBBZGp1
c3QgYSBiaXQgc28gdGhlIG1vc3QgdmFsdWFibGUgZW50cmllcyBkb24ndCBnZXQgZGVsZXRlZCBh
dCBhbGwuCiAgICAgYXV0byBlZmZlY3RpdmVXb3J0aCA9IHN0ZDo6bWluKDEuMSAqIHdvcnRoLCAx
Lik7CiAKKyAgICAvLyBJdCBpcyBsZXNzIHVzZWZ1bCB0byByZW1vdmUgYW4gZW50cnkgdGhhdCBz
aGFyZXMgaXRzIGJvZHkgZGF0YS4KKyAgICBpZiAoYm9keVNoYXJlQ291bnQpCisgICAgICAgIGVm
ZmVjdGl2ZVdvcnRoIC89IHN0ZDo6bWluKGJvZHlTaGFyZUNvdW50LCBtYXhpbXVtRWZmZWN0aXZl
U2hhcmVDb3VudCk7CisKICAgICByZXR1cm4gKDEgLSBlZmZlY3RpdmVXb3J0aCkgKiBtYXhpbXVt
UHJvYmFiaWxpdHk7CiB9CiAKQEAgLTY3Nyw3ICs2NDgsNyBAQCB2b2lkIFN0b3JhZ2U6OnNocmlu
a0lmTmVlZGVkKCkKIHsKICAgICBBU1NFUlQoUnVuTG9vcDo6aXNNYWluKCkpOwogCi0gICAgaWYg
KG1fYXBwcm94aW1hdGVTaXplID4gbV9jYXBhY2l0eSkKKyAgICBpZiAoYXBwcm94aW1hdGVTaXpl
KCkgPiBtX2NhcGFjaXR5KQogICAgICAgICBzaHJpbmsoKTsKIH0KIApAQCAtNjg5LDIyICs2NjAs
MjcgQEAgdm9pZCBTdG9yYWdlOjpzaHJpbmsoKQogICAgICAgICByZXR1cm47CiAgICAgbV9zaHJp
bmtJblByb2dyZXNzID0gdHJ1ZTsKIAotICAgIExPRyhOZXR3b3JrQ2FjaGVTdG9yYWdlLCAiKE5l
dHdvcmtQcm9jZXNzKSBzaHJpbmtpbmcgY2FjaGUgYXBwcm94aW1hdGVTaXplPSV6dSBjYXBhY2l0
eT0lenUiLCBzdGF0aWNfY2FzdDxzaXplX3Q+KG1fYXBwcm94aW1hdGVTaXplKSwgbV9jYXBhY2l0
eSk7CisgICAgTE9HKE5ldHdvcmtDYWNoZVN0b3JhZ2UsICIoTmV0d29ya1Byb2Nlc3MpIHNocmlu
a2luZyBjYWNoZSBhcHByb3hpbWF0ZVNpemU9JXp1IGNhcGFjaXR5PSV6dSIsIGFwcHJveGltYXRl
U2l6ZSgpLCBtX2NhcGFjaXR5KTsKIAogICAgIFN0cmluZ0NhcHR1cmUgY2FjaGVQYXRoQ2FwdHVy
ZShtX2RpcmVjdG9yeVBhdGgpOwogICAgIGJhY2tncm91bmRJT1F1ZXVlKCkuZGlzcGF0Y2goW3Ro
aXMsIGNhY2hlUGF0aENhcHR1cmVdIHsKICAgICAgICAgU3RyaW5nIGNhY2hlUGF0aCA9IGNhY2hl
UGF0aENhcHR1cmUuc3RyaW5nKCk7Ci0gICAgICAgIHRyYXZlcnNlQ2FjaGVGaWxlcyhjYWNoZVBh
dGgsIFtdKGNvbnN0IFN0cmluZyYgZmlsZU5hbWUsIGNvbnN0IFN0cmluZyYgcGFydGl0aW9uUGF0
aCkgewotICAgICAgICAgICAgYXV0byBmaWxlUGF0aCA9IFdlYkNvcmU6OnBhdGhCeUFwcGVuZGlu
Z0NvbXBvbmVudChwYXJ0aXRpb25QYXRoLCBmaWxlTmFtZSk7CisgICAgICAgIHRyYXZlcnNlQ2Fj
aGVGaWxlcyhjYWNoZVBhdGgsIFt0aGlzXShjb25zdCBTdHJpbmcmIGZpbGVOYW1lLCBjb25zdCBT
dHJpbmcmIHBhcnRpdGlvblBhdGgpIHsKKyAgICAgICAgICAgIGF1dG8gcmVjb3JkUGF0aCA9IFdl
YkNvcmU6OnBhdGhCeUFwcGVuZGluZ0NvbXBvbmVudChwYXJ0aXRpb25QYXRoLCBmaWxlTmFtZSk7
CisgICAgICAgICAgICBhdXRvIGJvZHlQYXRoID0gYm9keVBhdGhGb3JSZWNvcmRQYXRoKHJlY29y
ZFBhdGgpOworCisgICAgICAgICAgICBhdXRvIHRpbWVzID0gZmlsZVRpbWVzKHJlY29yZFBhdGgp
OworICAgICAgICAgICAgdW5zaWduZWQgYm9keVNoYXJlQ291bnQgPSBtX2Jsb2JTdG9yYWdlLnNo
YXJlQ291bnQoYm9keVBhdGgpOworICAgICAgICAgICAgYXV0byBwcm9iYWJpbGl0eSA9IGRlbGV0
aW9uUHJvYmFiaWxpdHkodGltZXMsIGJvZHlTaGFyZUNvdW50KTsKIAotICAgICAgICAgICAgYXV0
byB0aW1lcyA9IGZpbGVUaW1lcyhmaWxlUGF0aCk7Ci0gICAgICAgICAgICBhdXRvIHByb2JhYmls
aXR5ID0gZGVsZXRpb25Qcm9iYWJpbGl0eSh0aW1lcyk7CiAgICAgICAgICAgICBib29sIHNob3Vs
ZERlbGV0ZSA9IHJhbmRvbU51bWJlcigpIDwgcHJvYmFiaWxpdHk7CiAKLSAgICAgICAgICAgIExP
RyhOZXR3b3JrQ2FjaGVTdG9yYWdlLCAiRGVsZXRpb24gcHJvYmFiaWxpdHk9JWYgc2hvdWxkRGVs
ZXRlPSVkIiwgcHJvYmFiaWxpdHksIHNob3VsZERlbGV0ZSk7CisgICAgICAgICAgICBMT0coTmV0
d29ya0NhY2hlU3RvcmFnZSwgIkRlbGV0aW9uIHByb2JhYmlsaXR5PSVmIGJvZHlMaW5rQ291bnQ9
JWQgc2hvdWxkRGVsZXRlPSVkIiwgcHJvYmFiaWxpdHksIGJvZHlTaGFyZUNvdW50LCBzaG91bGRE
ZWxldGUpOwogCi0gICAgICAgICAgICBpZiAoc2hvdWxkRGVsZXRlKQotICAgICAgICAgICAgICAg
IFdlYkNvcmU6OmRlbGV0ZUZpbGUoZmlsZVBhdGgpOworICAgICAgICAgICAgaWYgKHNob3VsZERl
bGV0ZSkgeworICAgICAgICAgICAgICAgIFdlYkNvcmU6OmRlbGV0ZUZpbGUocmVjb3JkUGF0aCk7
CisgICAgICAgICAgICAgICAgbV9ibG9iU3RvcmFnZS5yZW1vdmUoYm9keVBhdGgpOworICAgICAg
ICAgICAgfQogICAgICAgICB9KTsKIAogICAgICAgICAvLyBMZXQgc3lzdGVtIGZpZ3VyZSBvdXQg
aWYgdGhleSBhcmUgcmVhbGx5IGVtcHR5LgpAQCAtNzM5LDYgKzcxNSw3IEBAIHZvaWQgU3RvcmFn
ZTo6ZGVsZXRlT2xkVmVyc2lvbnMoKQogICAgICAgICAgICAgV2ViQ29yZTo6ZGVsZXRlRW1wdHlE
aXJlY3RvcnkocGFydGl0aW9uUGF0aCk7CiAgICAgICAgIH0pOwogICAgIH0pOworICAgIC8vIEZJ
WE1FOiBEZWxldGUgVjIgY2FjaGUuCiB9CiAKIH0KSW5kZXg6IFNvdXJjZS9XZWJLaXQyL05ldHdv
cmtQcm9jZXNzL2NhY2hlL05ldHdvcmtDYWNoZVN0b3JhZ2UuaAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3Vy
Y2UvV2ViS2l0Mi9OZXR3b3JrUHJvY2Vzcy9jYWNoZS9OZXR3b3JrQ2FjaGVTdG9yYWdlLmgJKHJl
dmlzaW9uIDE4MjY4NykKKysrIFNvdXJjZS9XZWJLaXQyL05ldHdvcmtQcm9jZXNzL2NhY2hlL05l
dHdvcmtDYWNoZVN0b3JhZ2UuaAkod29ya2luZyBjb3B5KQpAQCAtMjgsNiArMjgsNyBAQAogCiAj
aWYgRU5BQkxFKE5FVFdPUktfQ0FDSEUpCiAKKyNpbmNsdWRlICJOZXR3b3JrQ2FjaGVCbG9iU3Rv
cmFnZS5oIgogI2luY2x1ZGUgIk5ldHdvcmtDYWNoZURhdGEuaCIKICNpbmNsdWRlICJOZXR3b3Jr
Q2FjaGVLZXkuaCIKICNpbmNsdWRlIDx3dGYvQmxvb21GaWx0ZXIuaD4KQEAgLTU3LDI3ICs1OCwz
MCBAQCBwdWJsaWM6CiAgICAgdHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPGJvb2wgKHN0ZDo6dW5pcXVl
X3B0cjxSZWNvcmQ+KT4gUmV0cmlldmVDb21wbGV0aW9uSGFuZGxlcjsKICAgICB2b2lkIHJldHJp
ZXZlKGNvbnN0IEtleSYsIHVuc2lnbmVkIHByaW9yaXR5LCBSZXRyaWV2ZUNvbXBsZXRpb25IYW5k
bGVyJiYpOwogCi0gICAgdHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPHZvaWQgKGJvb2wgc3VjY2Vzcywg
Y29uc3QgRGF0YSYgbWFwcGVkQm9keSk+IFN0b3JlQ29tcGxldGlvbkhhbmRsZXI7Ci0gICAgdm9p
ZCBzdG9yZShjb25zdCBSZWNvcmQmLCBTdG9yZUNvbXBsZXRpb25IYW5kbGVyJiYpOwotICAgIHZv
aWQgdXBkYXRlKGNvbnN0IFJlY29yZCYgdXBkYXRlUmVjb3JkLCBjb25zdCBSZWNvcmQmIGV4aXN0
aW5nUmVjb3JkLCBTdG9yZUNvbXBsZXRpb25IYW5kbGVyJiYpOworICAgIHR5cGVkZWYgc3RkOjpm
dW5jdGlvbjx2b2lkIChjb25zdCBEYXRhJiBtYXBwZWRCb2R5KT4gTWFwcGVkQm9keUhhbmRsZXI7
CisgICAgdm9pZCBzdG9yZShjb25zdCBSZWNvcmQmLCBNYXBwZWRCb2R5SGFuZGxlciYmKTsKIAog
ICAgIHZvaWQgcmVtb3ZlKGNvbnN0IEtleSYpOwogCiAgICAgc3RydWN0IFJlY29yZEluZm8gewog
ICAgICAgICBzaXplX3QgYm9keVNpemUgeyAwIH07CiAgICAgICAgIGRvdWJsZSB3b3J0aCB7IC0x
IH07IC8vIDAtMSB3aGVyZSAxIGlzIHRoZSBtb3N0IHZhbHVhYmxlLgorICAgICAgICB1bnNpZ25l
ZCBib2R5U2hhcmVDb3VudCB7IDAgfTsKKyAgICAgICAgU3RyaW5nIGJvZHlIYXNoOwogICAgIH07
CiAgICAgZW51bSBUcmF2ZXJzZUZsYWcgewogICAgICAgICBDb21wdXRlV29ydGggPSAxIDw8IDAs
CisgICAgICAgIFNoYXJlQ291bnQgPSAxIDw8IDEsCiAgICAgfTsKICAgICB0eXBlZGVmIHVuc2ln
bmVkIFRyYXZlcnNlRmxhZ3M7CiAgICAgLy8gTnVsbCByZWNvcmQgc2lnbmFscyBlbmQuCiAgICAg
dm9pZCB0cmF2ZXJzZShUcmF2ZXJzZUZsYWdzLCBzdGQ6OmZ1bmN0aW9uPHZvaWQgKGNvbnN0IFJl
Y29yZCosIGNvbnN0IFJlY29yZEluZm8mKT4mJik7CiAKICAgICB2b2lkIHNldENhcGFjaXR5KHNp
emVfdCk7CisgICAgc2l6ZV90IGFwcHJveGltYXRlU2l6ZSgpIGNvbnN0OwogICAgIHZvaWQgY2xl
YXIoKTsKIAotICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCB2ZXJzaW9uID0gMjsKKyAgICBzdGF0
aWMgY29uc3QgdW5zaWduZWQgdmVyc2lvbiA9IDM7CiAKICAgICBjb25zdCBTdHJpbmcmIGJhc2VE
aXJlY3RvcnlQYXRoKCkgY29uc3QgeyByZXR1cm4gbV9iYXNlRGlyZWN0b3J5UGF0aDsgfQogICAg
IGNvbnN0IFN0cmluZyYgZGlyZWN0b3J5UGF0aCgpIGNvbnN0IHsgcmV0dXJuIG1fZGlyZWN0b3J5
UGF0aDsgfQpAQCAtOTYsMTcgKzEwMCwxNyBAQCBwcml2YXRlOgogICAgIH07CiAgICAgdm9pZCBk
aXNwYXRjaFJlYWRPcGVyYXRpb24oY29uc3QgUmVhZE9wZXJhdGlvbiYpOwogICAgIHZvaWQgZGlz
cGF0Y2hQZW5kaW5nUmVhZE9wZXJhdGlvbnMoKTsKKyAgICB2b2lkIGZpbmlzaFJlYWRPcGVyYXRp
b24oY29uc3QgUmVhZE9wZXJhdGlvbiYsIHN0ZDo6dW5pcXVlX3B0cjxSZWNvcmQ+KTsKIAogICAg
IHN0cnVjdCBXcml0ZU9wZXJhdGlvbiB7CiAgICAgICAgIFJlY29yZCByZWNvcmQ7Ci0gICAgICAg
IE9wdGlvbmFsPFJlY29yZD4gZXhpc3RpbmdSZWNvcmQ7Ci0gICAgICAgIFN0b3JlQ29tcGxldGlv
bkhhbmRsZXIgY29tcGxldGlvbkhhbmRsZXI7CisgICAgICAgIE1hcHBlZEJvZHlIYW5kbGVyIG1h
cHBlZEJvZHlIYW5kbGVyOwogICAgIH07Ci0gICAgdm9pZCBkaXNwYXRjaEZ1bGxXcml0ZU9wZXJh
dGlvbihjb25zdCBXcml0ZU9wZXJhdGlvbiYpOwotICAgIHZvaWQgZGlzcGF0Y2hIZWFkZXJXcml0
ZU9wZXJhdGlvbihjb25zdCBXcml0ZU9wZXJhdGlvbiYpOworICAgIHZvaWQgZGlzcGF0Y2hXcml0
ZU9wZXJhdGlvbihjb25zdCBXcml0ZU9wZXJhdGlvbiYpOwogICAgIHZvaWQgZGlzcGF0Y2hQZW5k
aW5nV3JpdGVPcGVyYXRpb25zKCk7CisgICAgdm9pZCBmaW5pc2hXcml0ZU9wZXJhdGlvbihjb25z
dCBXcml0ZU9wZXJhdGlvbiYpOwogCi0gICAgdm9pZCB1cGRhdGVGaWxlTW9kaWZpY2F0aW9uVGlt
ZShJT0NoYW5uZWwmKTsKKyAgICB2b2lkIHVwZGF0ZUZpbGVNb2RpZmljYXRpb25UaW1lKGNvbnN0
IFN0cmluZyYgcGF0aCk7CiAKICAgICBXb3JrUXVldWUmIGlvUXVldWUoKSB7IHJldHVybiBtX2lv
UXVldWUuZ2V0KCk7IH0KICAgICBXb3JrUXVldWUmIGJhY2tncm91bmRJT1F1ZXVlKCkgeyByZXR1
cm4gbV9iYWNrZ3JvdW5kSU9RdWV1ZS5nZXQoKTsgfQpAQCAtMTQxLDYgKzE0NSw4IEBAIHByaXZh
dGU6CiAgICAgUmVmPFdvcmtRdWV1ZT4gbV9pb1F1ZXVlOwogICAgIFJlZjxXb3JrUXVldWU+IG1f
YmFja2dyb3VuZElPUXVldWU7CiAgICAgUmVmPFdvcmtRdWV1ZT4gbV9zZXJpYWxCYWNrZ3JvdW5k
SU9RdWV1ZTsKKworICAgIEJsb2JTdG9yYWdlIG1fYmxvYlN0b3JhZ2U7CiB9OwogCiB9CkluZGV4
OiBTb3VyY2UvV2ViS2l0Mi9XZWJLaXQyLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL1dlYktpdDIvV2ViS2l0Mi54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9q
CShyZXZpc2lvbiAxODI2ODcpCisrKyBTb3VyY2UvV2ViS2l0Mi9XZWJLaXQyLnhjb2RlcHJvai9w
cm9qZWN0LnBieHByb2oJKHdvcmtpbmcgY29weSkKQEAgLTE3OTQsNiArMTc5NCw4IEBACiAJCUU0
ODlEMjhFMUEwQTJEQjgwMDc4QzA2QSAvKiBOZXR3b3JrQ2FjaGVEZWNvZGVyLmggaW4gSGVhZGVy
cyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBFNDg5RDI4NzFBMEEyREI4MDA3
OEMwNkEgLyogTmV0d29ya0NhY2hlRGVjb2Rlci5oICovOyB9OwogCQlFNDg5RDI4RjFBMEEyREI4
MDA3OEMwNkEgLyogTmV0d29ya0NhY2hlRW5jb2Rlci5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2Eg
PSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBFNDg5RDI4ODFBMEEyREI4MDA3OEMwNkEgLyogTmV0
d29ya0NhY2hlRW5jb2Rlci5jcHAgKi87IH07CiAJCUU0ODlEMjkwMUEwQTJEQjgwMDc4QzA2QSAv
KiBOZXR3b3JrQ2FjaGVFbmNvZGVyLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZp
bGU7IGZpbGVSZWYgPSBFNDg5RDI4OTFBMEEyREI4MDA3OEMwNkEgLyogTmV0d29ya0NhY2hlRW5j
b2Rlci5oICovOyB9OworCQlFNDlENDBENzFBRDNGQjE3MDA2NkI3QjkgLyogTmV0d29ya0NhY2hl
QmxvYlN0b3JhZ2UuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJl
ZiA9IEU0OUQ0MEQ2MUFEM0ZCMTcwMDY2QjdCOSAvKiBOZXR3b3JrQ2FjaGVCbG9iU3RvcmFnZS5o
ICovOyB9OworCQlFNDlENDBEOTFBRDNGQjIxMDA2NkI3QjkgLyogTmV0d29ya0NhY2hlQmxvYlN0
b3JhZ2UuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0g
RTQ5RDQwRDgxQUQzRkIyMTAwNjZCN0I5IC8qIE5ldHdvcmtDYWNoZUJsb2JTdG9yYWdlLmNwcCAq
LzsgfTsKIAkJRUQ4MkE3RjIxMjhDNkZBRjAwNDQ3N0IzIC8qIFdLQnVuZGxlUGFnZU92ZXJsYXku
aCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBMjJGMEZG
MTI4OUZDRDkwMDg1RTc0RiAvKiBXS0J1bmRsZVBhZ2VPdmVybGF5LmggKi87IHNldHRpbmdzID0g
e0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsKIAkJRURDQTcxQjcxMjhEREE4QzAwMjAx
QjI2IC8qIFdLQnVuZGxlUGFnZU92ZXJsYXkuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJY
QnVpbGRGaWxlOyBmaWxlUmVmID0gMUEyMkYxMDAxMjg5RkNEOTAwODVFNzRGIC8qIFdLQnVuZGxl
UGFnZU92ZXJsYXkuY3BwICovOyB9OwogCQlGMDM2OTc4ODE1RjRCRjA1MDBDM0E4MEUgLyogV2Vi
Q29sb3JQaWNrZXIuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxl
UmVmID0gRjAzNjk3ODcxNUY0QkYwNTAwQzNBODBFIC8qIFdlYkNvbG9yUGlja2VyLmNwcCAqLzsg
fTsKQEAgLTQwNTUsNiArNDA1Nyw4IEBACiAJCUU0ODlEMjg3MUEwQTJEQjgwMDc4QzA2QSAvKiBO
ZXR3b3JrQ2FjaGVEZWNvZGVyLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVu
Y29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IE5l
dHdvcmtDYWNoZURlY29kZXIuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJRTQ4OUQy
ODgxQTBBMkRCODAwNzhDMDZBIC8qIE5ldHdvcmtDYWNoZUVuY29kZXIuY3BwICovID0ge2lzYSA9
IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0g
c291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gTmV0d29ya0NhY2hlRW5jb2Rlci5jcHA7IHNvdXJj
ZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUU0ODlEMjg5MUEwQTJEQjgwMDc4QzA2QSAvKiBOZXR3
b3JrQ2FjaGVFbmNvZGVyLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29k
aW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IE5ldHdv
cmtDYWNoZUVuY29kZXIuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRTQ5RDQwRDYx
QUQzRkIxNzAwNjZCN0I5IC8qIE5ldHdvcmtDYWNoZUJsb2JTdG9yYWdlLmggKi8gPSB7aXNhID0g
UEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBz
b3VyY2Vjb2RlLmMuaDsgcGF0aCA9IE5ldHdvcmtDYWNoZUJsb2JTdG9yYWdlLmg7IHNvdXJjZVRy
ZWUgPSAiPGdyb3VwPiI7IH07CisJCUU0OUQ0MEQ4MUFEM0ZCMjEwMDY2QjdCOSAvKiBOZXR3b3Jr
Q2FjaGVCbG9iU3RvcmFnZS5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVu
Y29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGgg
PSBOZXR3b3JrQ2FjaGVCbG9iU3RvcmFnZS5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07
CiAJCUYwMzY5Nzg3MTVGNEJGMDUwMEMzQTgwRSAvKiBXZWJDb2xvclBpY2tlci5jcHAgKi8gPSB7
aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5
cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBXZWJDb2xvclBpY2tlci5jcHA7IHNvdXJj
ZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUY2MTEzRTI0MTI2Q0UxODIwMDU3RDBBNyAvKiBBUElV
c2VyQ29udGVudFVSTFBhdHRlcm4uaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxl
RW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0g
QVBJVXNlckNvbnRlbnRVUkxQYXR0ZXJuLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJ
CUY2MTEzRTI2MTI2Q0UxOUIwMDU3RDBBNyAvKiBXS1VzZXJDb250ZW50VVJMUGF0dGVybi5jcHAg
Ki8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3du
RmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBXS1VzZXJDb250ZW50VVJMUGF0
dGVybi5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CkBAIC03NDkyLDYgKzc0OTYsOCBA
QAogCQlFNDg5RDI4MjFBMEEyQkU4MDA3OEMwNkEgLyogY2FjaGUgKi8gPSB7CiAJCQlpc2EgPSBQ
QlhHcm91cDsKIAkJCWNoaWxkcmVuID0gKAorCQkJCUU0OUQ0MEQ4MUFEM0ZCMjEwMDY2QjdCOSAv
KiBOZXR3b3JrQ2FjaGVCbG9iU3RvcmFnZS5jcHAgKi8sCisJCQkJRTQ5RDQwRDYxQUQzRkIxNzAw
NjZCN0I5IC8qIE5ldHdvcmtDYWNoZUJsb2JTdG9yYWdlLmggKi8sCiAJCQkJRTQ0MzZFQkUxQTBD
RkRCMjAwRUFEMjA0IC8qIE5ldHdvcmtDYWNoZS5jcHAgKi8sCiAJCQkJRTQ0MzZFQkYxQTBDRkRC
MjAwRUFEMjA0IC8qIE5ldHdvcmtDYWNoZS5oICovLAogCQkJCUU0ODlEMjgzMUEwQTJEQjgwMDc4
QzA2QSAvKiBOZXR3b3JrQ2FjaGVDb2Rlci5oICovLApAQCAtODE0Miw2ICs4MTQ4LDcgQEAKIAkJ
CQkxQUFGMDhBMjE5MjY4MUQxMDBCNjM5MEMgLyogV2ViVXNlckNvbnRlbnRDb250cm9sbGVyUHJv
eHkuaCBpbiBIZWFkZXJzICovLAogCQkJCTdDMzYxRDc5MTkyODAzQkQwMDM2QTU5RCAvKiBXZWJV
c2VyQ29udGVudENvbnRyb2xsZXJQcm94eU1lc3NhZ2VzLmggaW4gSGVhZGVycyAqLywKIAkJCQkz
Rjg4OUQxNTE4ODc3OEM5MDBGRUFEQUYgLyogV2ViVmlkZW9GdWxsc2NyZWVuTWFuYWdlclByb3h5
LmggaW4gSGVhZGVycyAqLywKKwkJCQlFNDlENDBENzFBRDNGQjE3MDA2NkI3QjkgLyogTmV0d29y
a0NhY2hlQmxvYlN0b3JhZ2UuaCBpbiBIZWFkZXJzICovLAogCQkJCTI5Q0Q1NUFBMTI4RTI5NEYw
MDEzM0M4NSAvKiBXS0FjY2Vzc2liaWxpdHlXZWJQYWdlT2JqZWN0QmFzZS5oIGluIEhlYWRlcnMg
Ki8sCiAJCQkJMjkyMzJERjQxOEIyOUQ2ODAwRDA1OTZGIC8qIFdLQWNjZXNzaWJpbGl0eVdlYlBh
Z2VPYmplY3RNYWMuaCBpbiBIZWFkZXJzICovLAogCQkJCTJEMDczMEEzMTlGOUM3REEwMEU5RDlD
NCAvKiBXS0FjdGlvbk1lbnVDb250cm9sbGVyLmggaW4gSGVhZGVycyAqLywKQEAgLTk1MDUsNiAr
OTUxMiw3IEBACiAJCQkJQ0Q2N0QzMEUxNUMwOEY5QTAwODQzQURGIC8qIEluamVjdGVkQnVuZGxl
UGFnZURpYWdub3N0aWNMb2dnaW5nQ2xpZW50LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCUUxRUU1
M0U3MTFGOENGRkIwMENDQkVFNCAvKiBJbmplY3RlZEJ1bmRsZVBhZ2VFZGl0b3JDbGllbnQuY3Bw
IGluIFNvdXJjZXMgKi8sCiAJCQkJQkMxNEUxMDkxMjBCOTA1RTAwODI2QzBDIC8qIEluamVjdGVk
QnVuZGxlUGFnZUZvcm1DbGllbnQuY3BwIGluIFNvdXJjZXMgKi8sCisJCQkJRTQ5RDQwRDkxQUQz
RkIyMTAwNjZCN0I5IC8qIE5ldHdvcmtDYWNoZUJsb2JTdG9yYWdlLmNwcCBpbiBTb3VyY2VzICov
LAogCQkJCUNENUM2NkEwMTM0QjlEMzgwMDRGRTJBOCAvKiBJbmplY3RlZEJ1bmRsZVBhZ2VGdWxs
U2NyZWVuQ2xpZW50LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCUJDQThDNkE4MTFFM0JBNUYwMDgx
MkZCNyAvKiBJbmplY3RlZEJ1bmRsZVBhZ2VMb2FkZXJDbGllbnQuY3BwIGluIFNvdXJjZXMgKi8s
CiAJCQkJQkM4MTQ3QUExMkY2NENEQTAwN0IyQzMyIC8qIEluamVjdGVkQnVuZGxlUGFnZVBvbGlj
eUNsaWVudC5jcHAgaW4gU291cmNlcyAqLywK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>250632</attachid>
            <date>2015-04-13 02:25:01 -0700</date>
            <delta_ts>2015-04-14 07:55:46 -0700</delta_ts>
            <desc>patch</desc>
            <filename>disk-cache-deduplication-10.patch</filename>
            <type>text/plain</type>
            <size>57999</size>
            <attacher name="Antti Koivisto">koivisto</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJLaXQyL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
S2l0Mi9DaGFuZ2VMb2cJKHJldmlzaW9uIDE4MjY4NykKKysrIFNvdXJjZS9XZWJLaXQyL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDE1MCBAQAorMjAxNS0wNC0xMiAgQW50dGkg
S29pdmlzdG8gIDxhbnR0aUBhcHBsZS5jb20+CisKKyAgICAgICAgTmV0d29yayBDYWNoZTogRGVk
dXBsaWNhdGUgYm9keSBkYXRhCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3df
YnVnLmNnaT9pZD0xNDM2NTIKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4K
KworICAgICAgICBJdCBpcyBjb21tb24gdG8gaGF2ZSBjYWNoZSBlbnRyaWVzIHRoYXQgaGF2ZSBk
aWZmZXJlbnQgaGVhZGVycyBvciBwYXJ0aXRpb24gYnV0IHNoYXJlIHRoZSBzYW1lIGJvZHkgZGF0
YS4KKyAgICAgICAgV2UgY2FuIGltcHJvdmUgZGlzayBzcGFjZSBlZmZpY2llbmN5IGFuZCB1c2Ug
bGVzcyBtZW1vcnkgYnkgc2hhcmluZyBpZGVudGljYWwgYm9keSBkYXRhIGJldHdlZW4gY2FjaGUg
ZW50cmllcy4KKworICAgICAgICBUaGlzIHBhdGNoIHNwbGl0cyB0aGUgYm9keSBkYXRhIG91dCBm
cm9tIHRoZSByZWNvcmQgZmlsZS4gVGhlIG5ldyByZWNvcmQgZmlsZSBjb250YWlucyBtZXRhIGRh
dGEgYW5kIHJlc3BvbnNlCisgICAgICAgIGhlYWRlcnMgb25seS4gQm9keSBkYXRhIGlzIHN0b3Jl
ZCB1c2luZyB0aGUgbmV3IEJsb2JTdG9yYWdlIGludGVyZmFjZS4gRmlsZXMgYXJlIGRlZHVwbGlj
YXRlZCBieSBjb21wdXRpbmcKKyAgICAgICAgU0hBMSBoYXNoIG92ZXIgdGhlIGRhdGEgYW5kIGxv
b2tpbmcgZm9yIGFuIGV4aXN0aW5nIGJsb2Igd2l0aCB0aGUgc2FtZSBoYXNoLiBJZiBmb3VuZCB0
aGUgZXhpc3RpbmcgZW50cnkKKyAgICAgICAgaXMgcmV1c2VkIGJ5IGNyZWF0aW5nIGEgaGFyZCBs
aW5rIHRvIGl0LgorCisgICAgICAgIFRoZSBuZXcgZGlzayBzdHJ1Y3R1cmUgbG9va3MgbGlrZSB0
aGlzOgorCisgICAgICAgIFdlYktpdENhY2hlLworICAgICAgICAgICAgVmVyc2lvbiAzLworICAg
ICAgICAgICAgICAgIEJsb2JzLworICAgICAgICAgICAgICAgICAgICAwQTNDOUE5NzBBREEyN0ZB
RTlCRDdCQzYzMEJBRDBCOTI5QzI5M0MwCisgICAgICAgICAgICAgICAgICAgIDBBNkI4MDYwQkE3
N0RGOTJDODJBMkZEN0FGNThGNzk1MjREOEYzNEMKKyAgICAgICAgICAgICAgICAgICAgLi4uCisg
ICAgICAgICAgICAgICAgUmVjb3Jkcy8KKyAgICAgICAgICAgICAgICAgICAgYXBwbGUuY29tLwor
ICAgICAgICAgICAgICAgICAgICAgICAgMEI4NjQ1QjA0RTdFQzc4QzE3OEI3NDYwMDUyNjAxQzIK
KyAgICAgICAgICAgICAgICAgICAgICAgIDBCODY0NUIwNEU3RUM3OEMxNzhCNzQ2MDA1MjYwMUMy
LWJvZHkKKyAgICAgICAgICAgICAgICAgICAgICAgIDBDQjFBMzYzOEQxQzVBMDlDNUUzMjgzQTc0
RkEwNDBCCisgICAgICAgICAgICAgICAgICAgICAgICAwQ0IxQTM2MzhEMUM1QTA5QzVFMzI4M0E3
NEZBMDQwQi1ib2R5CisgICAgICAgICAgICAgICAgICAgICAgICAuLi4KKworICAgICAgICBFYWNo
IHJlY29yZCBmaWxlIGhhcyBhbiBhc3NvY2lhdGVkIC1ib2R5IHdoaWNoIGlzIGEgaGFyZCBsaW5r
IHRvIGEgZmlsZSBpbiB0aGUgQmxvYnMgZGlyZWN0b3J5LgorCisgICAgICAgIFRoZSBwYXRjaCBp
bmNyZWFzZXMgZWZmZWN0aXZlIGNhcGFjaXR5IGJ5IDEwLTIwJSB3aXRoIGEgdHlwaWNhbCBjYWNo
ZS4gSXQgYWxzbyBzYXZlcyBtZW1vcnkgZXNwZWNpYWxseSB3aGVuIGlkZW50aWNhbAorICAgICAg
ICByZXNvdXJjZXMgYXJlIHVzZWQgaW4gbXVsdGlwbGUgdGFicy4KKworICAgICAgICBDdXJyZW50
bHkgYWxsID4wIHNpemVkIHJlc291cmNlcyBhcmUgc3RvcmVkIGFzIHNoYXJlZCBibG9icy4gSW4g
ZnV0dXJlIHNtYWxsIHJlc291cmNlcyBzaG91bGQgYmUgaW50ZWdyYXRlZCBpbnRvIHJlY29yZAor
ICAgICAgICBmaWxlcyBhbmQgYmxvYnMgdXNlZCBmb3IgbGFyZ2VyIGZpbGVzIG9ubHkuCisKKyAg
ICAgICAgKiBOZXR3b3JrUHJvY2Vzcy9jYWNoZS9OZXR3b3JrQ2FjaGUuY3BwOgorICAgICAgICAo
V2ViS2l0OjpOZXR3b3JrQ2FjaGU6OkNhY2hlOjpzdG9yZSk6CisgICAgICAgIChXZWJLaXQ6Ok5l
dHdvcmtDYWNoZTo6Q2FjaGU6OnVwZGF0ZSk6CisKKyAgICAgICAgICAgIEFkb3B0IHRoZSBuZXcg
c3RvcmFnZSBpbnRlcmZhY2UuCisKKyAgICAgICAgKFdlYktpdDo6TmV0d29ya0NhY2hlOjpDYWNo
ZTo6ZHVtcENvbnRlbnRzVG9GaWxlKToKKyAgICAgICAgKiBOZXR3b3JrUHJvY2Vzcy9jYWNoZS9O
ZXR3b3JrQ2FjaGVCbG9iU3RvcmFnZS5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViS2l0OjpOZXR3
b3JrQ2FjaGU6OkJsb2JTdG9yYWdlOjpCbG9iU3RvcmFnZSk6CisgICAgICAgIChXZWJLaXQ6Ok5l
dHdvcmtDYWNoZTo6QmxvYlN0b3JhZ2U6OnN5bmNocm9uaXplKToKKworICAgICAgICAgICAgQ29t
cHV0ZSBzaXplIGFuZCBkZWxldGUgdW51c2VkIGZpbGVzIGZyb20gdGhlIEJsb2JzIGRpcmVjdG9y
eSAobGluayBjb3VudCA9PSAxKS4KKworICAgICAgICAoV2ViS2l0OjpOZXR3b3JrQ2FjaGU6OkJs
b2JTdG9yYWdlOjpibG9iUGF0aCk6CisgICAgICAgIChXZWJLaXQ6Ok5ldHdvcmtDYWNoZTo6Qmxv
YlN0b3JhZ2U6OmFkZCk6CisgICAgICAgIChXZWJLaXQ6Ok5ldHdvcmtDYWNoZTo6QmxvYlN0b3Jh
Z2U6OmdldCk6CisKKyAgICAgICAgICAgIEludGVyZmFjZSBmb3Igc3RvcmluZyBhbmQgcmV0cmll
dmluZyBkYXRhIGJsb2JzLiBCbG9icyBhcmUgZGVkdXBsaWNhdGVkIG9uIGFkZC4KKworICAgICAg
ICAoV2ViS2l0OjpOZXR3b3JrQ2FjaGU6OkJsb2JTdG9yYWdlOjpyZW1vdmUpOgorCisgICAgICAg
ICAgICBSZW1vdmVzIHRoZSBsaW5rIGJ1dCBkb2Vzbid0IHJlbW92ZSB0aGUgYmxvYiBldmVuIGlm
IHRoZXJlIGFyZSBubyBvdGhlciBjbGllbnRzLiBUaGF0IGhhcHBlbnMgb24gbmV4dCBzeW5jaHJv
bml6ZSgpLgorCisgICAgICAgIChXZWJLaXQ6Ok5ldHdvcmtDYWNoZTo6QmxvYlN0b3JhZ2U6OnNo
YXJlQ291bnQpOgorCisgICAgICAgICAgICBDaGVja3MgdGhlIGxpbmsgY291bnQgdG8gZ2V0IHRo
ZSBudW1iZXIgb2YgY2xpZW50cy4KKworICAgICAgICAqIE5ldHdvcmtQcm9jZXNzL2NhY2hlL05l
dHdvcmtDYWNoZUJsb2JTdG9yYWdlLmg6IEFkZGVkLgorICAgICAgICAoV2ViS2l0OjpOZXR3b3Jr
Q2FjaGU6OkJsb2JTdG9yYWdlOjphcHByb3hpbWF0ZVNpemUpOgorICAgICAgICAqIE5ldHdvcmtQ
cm9jZXNzL2NhY2hlL05ldHdvcmtDYWNoZUNvZGVycy5jcHA6CisgICAgICAgIChXZWJLaXQ6Ok5l
dHdvcmtDYWNoZTo6Q29kZXI8U0hBMTo6RGlnZXN0Pjo6ZW5jb2RlKToKKyAgICAgICAgKFdlYktp
dDo6TmV0d29ya0NhY2hlOjpDb2RlcjxTSEExOjpEaWdlc3Q+OjpkZWNvZGUpOgorICAgICAgICAq
IE5ldHdvcmtQcm9jZXNzL2NhY2hlL05ldHdvcmtDYWNoZUNvZGVycy5oOgorICAgICAgICAqIE5l
dHdvcmtQcm9jZXNzL2NhY2hlL05ldHdvcmtDYWNoZURhdGEuaDoKKyAgICAgICAgKFdlYktpdDo6
TmV0d29ya0NhY2hlOjpEYXRhOjppc0VtcHR5KToKKyAgICAgICAgKiBOZXR3b3JrUHJvY2Vzcy9j
YWNoZS9OZXR3b3JrQ2FjaGVEYXRhQ29jb2EubW06CisgICAgICAgIChXZWJLaXQ6Ok5ldHdvcmtD
YWNoZTo6RGF0YTo6ZW1wdHkpOgorICAgICAgICAoV2ViS2l0OjpOZXR3b3JrQ2FjaGU6OkRhdGE6
OmZyb21NYXApOgorICAgICAgICAoV2ViS2l0OjpOZXR3b3JrQ2FjaGU6Om1hcEZpbGUpOgorICAg
ICAgICAoV2ViS2l0OjpOZXR3b3JrQ2FjaGU6OmNvbXB1dGVTSEExKToKKyAgICAgICAgKFdlYktp
dDo6TmV0d29ya0NhY2hlOjpieXRlc0VxdWFsKToKKworICAgICAgICAgICAgQWRkIHNvbWUgaGVs
cGVycy4KKworICAgICAgICAqIE5ldHdvcmtQcm9jZXNzL2NhY2hlL05ldHdvcmtDYWNoZUVudHJ5
LmNwcDoKKyAgICAgICAgKFdlYktpdDo6TmV0d29ya0NhY2hlOjpFbnRyeTo6YXNKU09OKToKKyAg
ICAgICAgKiBOZXR3b3JrUHJvY2Vzcy9jYWNoZS9OZXR3b3JrQ2FjaGVJT0NoYW5uZWxDb2NvYS5t
bToKKyAgICAgICAgKFdlYktpdDo6TmV0d29ya0NhY2hlOjpJT0NoYW5uZWw6OklPQ2hhbm5lbCk6
CisgICAgICAgICogTmV0d29ya1Byb2Nlc3MvY2FjaGUvTmV0d29ya0NhY2hlU3RvcmFnZS5jcHA6
CisgICAgICAgIChXZWJLaXQ6Ok5ldHdvcmtDYWNoZTo6bWFrZVJlY29yZERpcmVjdG9yeVBhdGgp
OgorICAgICAgICAoV2ViS2l0OjpOZXR3b3JrQ2FjaGU6Om1ha2VCbG9iRGlyZWN0b3J5UGF0aCk6
CisgICAgICAgIChXZWJLaXQ6Ok5ldHdvcmtDYWNoZTo6U3RvcmFnZTo6U3RvcmFnZSk6CisgICAg
ICAgIChXZWJLaXQ6Ok5ldHdvcmtDYWNoZTo6U3RvcmFnZTo6YXBwcm94aW1hdGVTaXplKToKKyAg
ICAgICAgKFdlYktpdDo6TmV0d29ya0NhY2hlOjpTdG9yYWdlOjpzeW5jaHJvbml6ZSk6CisgICAg
ICAgIChXZWJLaXQ6Ok5ldHdvcmtDYWNoZTo6cGFydGl0aW9uUGF0aEZvcktleSk6CisgICAgICAg
IChXZWJLaXQ6Ok5ldHdvcmtDYWNoZTo6cmVjb3JkUGF0aEZvcktleSk6CisgICAgICAgIChXZWJL
aXQ6Ok5ldHdvcmtDYWNoZTo6Ym9keVBhdGgpOgorICAgICAgICAoV2ViS2l0OjpOZXR3b3JrQ2Fj
aGU6OmRlY29kZVJlY29yZE1ldGFEYXRhKToKKyAgICAgICAgKFdlYktpdDo6TmV0d29ya0NhY2hl
OjpkZWNvZGVSZWNvcmRIZWFkZXIpOgorICAgICAgICAoV2ViS2l0OjpOZXR3b3JrQ2FjaGU6OmNy
ZWF0ZVJlY29yZCk6CisgICAgICAgIChXZWJLaXQ6Ok5ldHdvcmtDYWNoZTo6ZW5jb2RlUmVjb3Jk
TWV0YURhdGEpOgorICAgICAgICAoV2ViS2l0OjpOZXR3b3JrQ2FjaGU6OmVuY29kZVJlY29yZEhl
YWRlcik6CisgICAgICAgIChXZWJLaXQ6Ok5ldHdvcmtDYWNoZTo6U3RvcmFnZTo6cmVtb3ZlKToK
KyAgICAgICAgKFdlYktpdDo6TmV0d29ya0NhY2hlOjpTdG9yYWdlOjp1cGRhdGVGaWxlTW9kaWZp
Y2F0aW9uVGltZSk6CisgICAgICAgIChXZWJLaXQ6Ok5ldHdvcmtDYWNoZTo6U3RvcmFnZTo6ZGlz
cGF0Y2hSZWFkT3BlcmF0aW9uKToKKworICAgICAgICAgICAgUmVhZCBib3RoIHRoZSBibG9iIGFu
ZCB0aGUgcmVjb3JkIGVudHJ5LgorCisgICAgICAgIChXZWJLaXQ6Ok5ldHdvcmtDYWNoZTo6U3Rv
cmFnZTo6ZmluaXNoUmVhZE9wZXJhdGlvbik6CisKKyAgICAgICAgICAgIEZhY3RvciB0byBhIGZ1
bmN0aW9uLgorCisgICAgICAgIChXZWJLaXQ6Ok5ldHdvcmtDYWNoZTo6U3RvcmFnZTo6c3RvcmUp
OgorICAgICAgICAoV2ViS2l0OjpOZXR3b3JrQ2FjaGU6OlN0b3JhZ2U6OnRyYXZlcnNlKToKKyAg
ICAgICAgKFdlYktpdDo6TmV0d29ya0NhY2hlOjpTdG9yYWdlOjpkaXNwYXRjaFBlbmRpbmdXcml0
ZU9wZXJhdGlvbnMpOgorICAgICAgICAoV2ViS2l0OjpOZXR3b3JrQ2FjaGU6OlN0b3JhZ2U6OmRp
c3BhdGNoV3JpdGVPcGVyYXRpb24pOgorCisgICAgICAgICAgICBXZSBkb24ndCBuZWVkIHNlcGFy
YXRlIGZ1bGwgd3JpdGUgYW5kIGhlYWRlciB3cml0ZSBwYXRocyBhbnltb3JlLiBFdmVyeXRoaW5n
IGlzIHRyZWF0ZWQKKyAgICAgICAgICAgIGFzIGEgZnVsbCB3cml0ZSBhbmQgZGVkdXBsaWNhdGlv
biBzdG9wcyB1cyB3cml0aW5nIHRoZSBib2R5IGFnYWluLgorCisgICAgICAgICAgICBUaGlzIHNp
bXBsaWZpZXMgdGhlIGNvZGUgYW5kIGRhdGEgc3RydWN0dXJlcy4KKworICAgICAgICAoV2ViS2l0
OjpOZXR3b3JrQ2FjaGU6OlN0b3JhZ2U6OmZpbmlzaFdyaXRlT3BlcmF0aW9uKToKKworICAgICAg
ICAgICAgRmFjdG9yIHRvIGEgZnVuY3Rpb24uCisKKyAgICAgICAgKFdlYktpdDo6TmV0d29ya0Nh
Y2hlOjpTdG9yYWdlOjpjbGVhcik6CisgICAgICAgIChXZWJLaXQ6Ok5ldHdvcmtDYWNoZTo6ZGVs
ZXRpb25Qcm9iYWJpbGl0eSk6CisKKyAgICAgICAgICAgIFRha2UgdGhlIHNoYXJpbmcgY291bnQg
aW50byBhY2NvdW50IHdoZW4gY29tcHV0aW5nIGRlbGV0aW9uIHByb2JhYmlsaXR5LgorICAgICAg
ICAgICAgSXQgaXMgbGVzcyB1c2VmdWwgdG8gZGVsZXRlIGEgcmVjb3JkIHRoYXQgc2hhcmVzIGl0
cyBib2R5IHdpdGggb3RoZXJzIGFzIGRhdGEgd29uJ3QgZ2V0IGRlbGV0ZWQuCisKKyAgICAgICAg
KFdlYktpdDo6TmV0d29ya0NhY2hlOjpTdG9yYWdlOjpzaHJpbmtJZk5lZWRlZCk6CisgICAgICAg
IChXZWJLaXQ6Ok5ldHdvcmtDYWNoZTo6U3RvcmFnZTo6c2hyaW5rKToKKyAgICAgICAgKFdlYktp
dDo6TmV0d29ya0NhY2hlOjpTdG9yYWdlOjpkZWxldGVPbGRWZXJzaW9ucyk6CisgICAgICAgIChX
ZWJLaXQ6Ok5ldHdvcmtDYWNoZTo6ZGlyZWN0b3J5UGF0aEZvcktleSk6IERlbGV0ZWQuCisgICAg
ICAgIChXZWJLaXQ6Ok5ldHdvcmtDYWNoZTo6ZmlsZVBhdGhGb3JLZXkpOiBEZWxldGVkLgorICAg
ICAgICAoV2ViS2l0OjpOZXR3b3JrQ2FjaGU6Om9wZW5GaWxlRm9yS2V5KTogRGVsZXRlZC4KKyAg
ICAgICAgKFdlYktpdDo6TmV0d29ya0NhY2hlOjpkZWNvZGVSZWNvcmQpOiBEZWxldGVkLgorICAg
ICAgICAoV2ViS2l0OjpOZXR3b3JrQ2FjaGU6OlN0b3JhZ2U6OnVwZGF0ZSk6IERlbGV0ZWQuCisK
KyAgICAgICAgICAgIE5vIG5lZWQgZm9yIHNlcGFyYXRlIHVwZGF0ZSBpbnRlcmZhY2UgYW55bW9y
ZS4gUmVndWxhciBzdG9yZSgpIGF2b2lkcyB1bm5lY2Vzc2FyeSBib2R5IHdyaXRlLgorCisgICAg
ICAgIChXZWJLaXQ6Ok5ldHdvcmtDYWNoZTo6U3RvcmFnZTo6ZGlzcGF0Y2hGdWxsV3JpdGVPcGVy
YXRpb24pOiBEZWxldGVkLgorICAgICAgICAoV2ViS2l0OjpOZXR3b3JrQ2FjaGU6OlN0b3JhZ2U6
OmRpc3BhdGNoSGVhZGVyV3JpdGVPcGVyYXRpb24pOiBEZWxldGVkLgorICAgICAgICAqIE5ldHdv
cmtQcm9jZXNzL2NhY2hlL05ldHdvcmtDYWNoZVN0b3JhZ2UuaDoKKyAgICAgICAgKiBXZWJLaXQy
Lnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2o6CisKIDIwMTUtMDQtMTIgIFN1bmdtYW5uIENobyAg
PHN1bmdtYW5uLmNob0BuYXZlcmNvcnAuY29tPgogCiAgICAgICAgIEZpeCB0cml2YWwgdHlwb3Mg
cmVsYXRlZCB0byB0aGUgd29yZCAiY29vcmRpbmF0ZSIuCkluZGV4OiBTb3VyY2UvV2ViS2l0Mi9O
ZXR3b3JrUHJvY2Vzcy9jYWNoZS9OZXR3b3JrQ2FjaGUuY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9XZWJLaXQyL05ldHdvcmtQcm9jZXNzL2NhY2hlL05ldHdvcmtDYWNoZS5jcHAJKHJldmlzaW9u
IDE4MjY4NykKKysrIFNvdXJjZS9XZWJLaXQyL05ldHdvcmtQcm9jZXNzL2NhY2hlL05ldHdvcmtD
YWNoZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM3MCw3ICszNzAsNyBAQCB2b2lkIENhY2hlOjpz
dG9yZShjb25zdCBXZWJDb3JlOjpSZXNvdXJjCiAKICAgICBhdXRvIHJlY29yZCA9IGNhY2hlRW50
cnkuZW5jb2RlQXNTdG9yYWdlUmVjb3JkKCk7CiAKLSAgICBtX3N0b3JhZ2UtPnN0b3JlKHJlY29y
ZCwgW2NvbXBsZXRpb25IYW5kbGVyXShib29sIHN1Y2Nlc3MsIGNvbnN0IERhdGEmIGJvZHlEYXRh
KSB7CisgICAgbV9zdG9yYWdlLT5zdG9yZShyZWNvcmQsIFtjb21wbGV0aW9uSGFuZGxlcl0oY29u
c3QgRGF0YSYgYm9keURhdGEpIHsKICAgICAgICAgTWFwcGVkQm9keSBtYXBwZWRCb2R5OwogI2lm
IEVOQUJMRShTSEFSRUFCTEVfUkVTT1VSQ0UpCiAgICAgICAgIGlmIChib2R5RGF0YS5pc01hcCgp
KSB7CkBAIC0zODEsNyArMzgxLDcgQEAgdm9pZCBDYWNoZTo6c3RvcmUoY29uc3QgV2ViQ29yZTo6
UmVzb3VyYwogICAgICAgICB9CiAjZW5kaWYKICAgICAgICAgY29tcGxldGlvbkhhbmRsZXIobWFw
cGVkQm9keSk7Ci0gICAgICAgIExPRyhOZXR3b3JrQ2FjaGUsICIoTmV0d29ya1Byb2Nlc3MpIHN0
b3JlIHN1Y2Nlc3M9JWQiLCBzdWNjZXNzKTsKKyAgICAgICAgTE9HKE5ldHdvcmtDYWNoZSwgIihO
ZXR3b3JrUHJvY2Vzcykgc3RvcmVkIik7CiAgICAgfSk7CiB9CiAKQEAgLTM5Niw5ICszOTYsNyBA
QCB2b2lkIENhY2hlOjp1cGRhdGUoY29uc3QgV2ViQ29yZTo6UmVzb3VyCiAKICAgICBhdXRvIHVw
ZGF0ZVJlY29yZCA9IHVwZGF0ZUVudHJ5LmVuY29kZUFzU3RvcmFnZVJlY29yZCgpOwogCi0gICAg
bV9zdG9yYWdlLT51cGRhdGUodXBkYXRlUmVjb3JkLCBleGlzdGluZ0VudHJ5LnNvdXJjZVN0b3Jh
Z2VSZWNvcmQoKSwgW10oYm9vbCBzdWNjZXNzLCBjb25zdCBEYXRhJikgewotICAgICAgICBMT0co
TmV0d29ya0NhY2hlLCAiKE5ldHdvcmtQcm9jZXNzKSB1cGRhdGVkLCBzdWNjZXNzPSVkIiwgc3Vj
Y2Vzcyk7Ci0gICAgfSk7CisgICAgbV9zdG9yYWdlLT5zdG9yZSh1cGRhdGVSZWNvcmQsIHsgfSk7
CiB9CiAKIHZvaWQgQ2FjaGU6OnJlbW92ZShjb25zdCBLZXkmIGtleSkKQEAgLTQ0Nyw3ICs0NDUs
OCBAQCB2b2lkIENhY2hlOjpkdW1wQ29udGVudHNUb0ZpbGUoKQogICAgICAgICBzaXplX3QgYm9k
eVNpemUgeyAwIH07CiAgICAgfTsKICAgICBUb3RhbHMgdG90YWxzOwotICAgIG1fc3RvcmFnZS0+
dHJhdmVyc2UoU3RvcmFnZTo6VHJhdmVyc2VGbGFnOjpDb21wdXRlV29ydGgsIFtmZCwgdG90YWxz
XShjb25zdCBTdG9yYWdlOjpSZWNvcmQqIHJlY29yZCwgY29uc3QgU3RvcmFnZTo6UmVjb3JkSW5m
byYgaW5mbykgbXV0YWJsZSB7CisgICAgYXV0byBmbGFncyA9IFN0b3JhZ2U6OlRyYXZlcnNlRmxh
Zzo6Q29tcHV0ZVdvcnRoIHwgU3RvcmFnZTo6VHJhdmVyc2VGbGFnOjpTaGFyZUNvdW50OworICAg
IG1fc3RvcmFnZS0+dHJhdmVyc2UoZmxhZ3MsIFtmZCwgdG90YWxzXShjb25zdCBTdG9yYWdlOjpS
ZWNvcmQqIHJlY29yZCwgY29uc3QgU3RvcmFnZTo6UmVjb3JkSW5mbyYgaW5mbykgbXV0YWJsZSB7
CiAgICAgICAgIGlmICghcmVjb3JkKSB7CiAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGVwaWxv
Z3VlOwogICAgICAgICAgICAgZXBpbG9ndWUuYXBwZW5kTGl0ZXJhbCgie31cbl0sXG4iKTsKSW5k
ZXg6IFNvdXJjZS9XZWJLaXQyL05ldHdvcmtQcm9jZXNzL2NhY2hlL05ldHdvcmtDYWNoZUJsb2JT
dG9yYWdlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9OZXR3b3JrUHJvY2Vzcy9j
YWNoZS9OZXR3b3JrQ2FjaGVCbG9iU3RvcmFnZS5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2Uv
V2ViS2l0Mi9OZXR3b3JrUHJvY2Vzcy9jYWNoZS9OZXR3b3JrQ2FjaGVCbG9iU3RvcmFnZS5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBg
YEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJ
QlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lO
RVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAi
Y29uZmlnLmgiCisjaW5jbHVkZSAiTmV0d29ya0NhY2hlQmxvYlN0b3JhZ2UuaCIKKworI2luY2x1
ZGUgIkxvZ2dpbmcuaCIKKyNpbmNsdWRlICJOZXR3b3JrQ2FjaGVGaWxlU3lzdGVtUG9zaXguaCIK
KyNpbmNsdWRlIDxXZWJDb3JlL0ZpbGVTeXN0ZW0uaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgor
I2luY2x1ZGUgPHd0Zi9SdW5Mb29wLmg+CisjaW5jbHVkZSA8d3RmL1NIQTEuaD4KKyNpbmNsdWRl
IDx3dGYvdGV4dC9TdHJpbmdCdWlsZGVyLmg+CisKKyNpZiBFTkFCTEUoTkVUV09SS19DQUNIRSkK
KworbmFtZXNwYWNlIFdlYktpdCB7CituYW1lc3BhY2UgTmV0d29ya0NhY2hlIHsKKworQmxvYlN0
b3JhZ2U6OkJsb2JTdG9yYWdlKGNvbnN0IFN0cmluZyYgYmxvYkRpcmVjdG9yeVBhdGgpCisgICAg
OiBtX2Jsb2JEaXJlY3RvcnlQYXRoKGJsb2JEaXJlY3RvcnlQYXRoLnV0ZjgoKSkKK3sKKyAgICBX
ZWJDb3JlOjptYWtlQWxsRGlyZWN0b3JpZXMoYmxvYkRpcmVjdG9yeVBhdGgpOworfQorCit2b2lk
IEJsb2JTdG9yYWdlOjpzeW5jaHJvbml6ZSgpCit7CisgICAgQVNTRVJUKCFSdW5Mb29wOjppc01h
aW4oKSk7CisKKyAgICBtX2FwcHJveGltYXRlU2l6ZSA9IDA7CisgICAgYXV0byBibG9iRGlyZWN0
b3J5ID0gU3RyaW5nOjpmcm9tVVRGOChtX2Jsb2JEaXJlY3RvcnlQYXRoKTsKKyAgICB0cmF2ZXJz
ZURpcmVjdG9yeShibG9iRGlyZWN0b3J5LCBEVF9SRUcsIFt0aGlzLCAmYmxvYkRpcmVjdG9yeV0o
Y29uc3QgU3RyaW5nJiBuYW1lKSB7CisgICAgICAgIGF1dG8gcGF0aCA9IFdlYkNvcmU6OnBhdGhC
eUFwcGVuZGluZ0NvbXBvbmVudChibG9iRGlyZWN0b3J5LCBuYW1lKTsKKyAgICAgICAgYXV0byBm
aWxlUGF0aCA9IFdlYkNvcmU6OmZpbGVTeXN0ZW1SZXByZXNlbnRhdGlvbihwYXRoKTsKKyAgICAg
ICAgc3RydWN0IHN0YXQgc3RhdDsKKyAgICAgICAgOjpzdGF0KGZpbGVQYXRoLmRhdGEoKSwgJnN0
YXQpOworICAgICAgICBpZiAoc3RhdC5zdF9ubGluayA9PSAxKQorICAgICAgICAgICAgdW5saW5r
KGZpbGVQYXRoLmRhdGEoKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1fYXBwcm94aW1h
dGVTaXplICs9IHN0YXQuc3Rfc2l6ZTsKKyAgICB9KTsKKworICAgIExPRyhOZXR3b3JrQ2FjaGVT
dG9yYWdlLCAiKE5ldHdvcmtQcm9jZXNzKSBibG9iIHN5bmNocm9uaXphdGlvbiBjb21wbGV0ZWQg
YXBwcm94aW1hdGVTaXplPSV6dSIsIGFwcHJveGltYXRlU2l6ZSgpKTsKK30KKworQ1N0cmluZyBC
bG9iU3RvcmFnZTo6YmxvYlBhdGgoY29uc3QgU0hBMTo6RGlnZXN0JiBoYXNoKSBjb25zdAorewor
ICAgIGF1dG8gaGFzaEFzU3RyaW5nID0gU0hBMTo6aGV4RGlnZXN0KGhhc2gpOworICAgIGF1dG8g
cGF0aCA9IFdlYkNvcmU6OnBhdGhCeUFwcGVuZGluZ0NvbXBvbmVudChTdHJpbmc6OmZyb21VVEY4
KG1fYmxvYkRpcmVjdG9yeVBhdGgpLCBTdHJpbmc6OmZyb21VVEY4KGhhc2hBc1N0cmluZykpOwor
ICAgIHJldHVybiBXZWJDb3JlOjpmaWxlU3lzdGVtUmVwcmVzZW50YXRpb24ocGF0aCk7Cit9CisK
K0Jsb2JTdG9yYWdlOjpCbG9iIEJsb2JTdG9yYWdlOjphZGQoY29uc3QgU3RyaW5nJiBwYXRoLCBj
b25zdCBEYXRhJiBkYXRhKQoreworICAgIEFTU0VSVCghUnVuTG9vcDo6aXNNYWluKCkpOworCisg
ICAgYXV0byBoYXNoID0gY29tcHV0ZVNIQTEoZGF0YSk7CisgICAgaWYgKGRhdGEuaXNFbXB0eSgp
KQorICAgICAgICByZXR1cm4geyBkYXRhLCBoYXNoIH07CisKKyAgICBhdXRvIGJsb2JQYXRoID0g
dGhpcy0+YmxvYlBhdGgoaGFzaCk7CisgICAgYXV0byBsaW5rUGF0aCA9IFdlYkNvcmU6OmZpbGVT
eXN0ZW1SZXByZXNlbnRhdGlvbihwYXRoKTsKKyAgICB1bmxpbmsobGlua1BhdGguZGF0YSgpKTsK
KworICAgIGJvb2wgYmxvYkV4aXN0cyA9IGFjY2VzcyhibG9iUGF0aC5kYXRhKCksIEZfT0spICE9
IC0xOworICAgIGlmIChibG9iRXhpc3RzKSB7CisgICAgICAgIGF1dG8gZXhpc3RpbmdEYXRhID0g
bWFwRmlsZShibG9iUGF0aCk7CisgICAgICAgIGlmIChieXRlc0VxdWFsKGV4aXN0aW5nRGF0YSwg
ZGF0YSkpIHsKKyAgICAgICAgICAgIGxpbmsoYmxvYlBhdGguZGF0YSgpLCBsaW5rUGF0aC5kYXRh
KCkpOworICAgICAgICAgICAgcmV0dXJuIHsgZXhpc3RpbmdEYXRhLCBoYXNoIH07CisgICAgICAg
IH0KKyAgICAgICAgdW5saW5rKGJsb2JQYXRoLmRhdGEoKSk7CisgICAgfQorCisgICAgaW50IGZk
ID0gb3BlbihibG9iUGF0aC5kYXRhKCksIE9fQ1JFQVQgfCBPX1JEV1IsIFNfSVJVU1IgfCBTX0lX
VVNSKTsKKyAgICBpZiAoZmQgPCAwKQorICAgICAgICByZXR1cm4geyB9OworCisgICAgc2l6ZV90
IHNpemUgPSBkYXRhLnNpemUoKTsKKyAgICBpZiAoZnRydW5jYXRlKGZkLCBzaXplKSA8IDApIHsK
KyAgICAgICAgY2xvc2UoZmQpOworICAgICAgICByZXR1cm4geyB9OworICAgIH0KKworICAgIHZv
aWQqIG1hcCA9IG1tYXAobnVsbHB0ciwgc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQ
X1NIQVJFRCwgZmQsIDApOworICAgIGNsb3NlKGZkKTsKKworICAgIGlmIChtYXAgPT0gTUFQX0ZB
SUxFRCkKKyAgICAgICAgcmV0dXJuIHsgfTsKKworICAgIHVpbnQ4X3QqIG1hcERhdGEgPSBzdGF0
aWNfY2FzdDx1aW50OF90Kj4obWFwKTsKKyAgICBkYXRhLmFwcGx5KFsmbWFwRGF0YV0oY29uc3Qg
dWludDhfdCogYnl0ZXMsIHNpemVfdCBieXRlc1NpemUpIHsKKyAgICAgICAgbWVtY3B5KG1hcERh
dGEsIGJ5dGVzLCBieXRlc1NpemUpOworICAgICAgICBtYXBEYXRhICs9IGJ5dGVzU2l6ZTsKKyAg
ICAgICAgcmV0dXJuIHRydWU7CisgICAgfSk7CisKKyAgICBpZiAobGluayhibG9iUGF0aC5kYXRh
KCksIGxpbmtQYXRoLmRhdGEoKSkgPCAwKQorICAgICAgICByZXR1cm4geyB9OworCisgICAgbV9h
cHByb3hpbWF0ZVNpemUgKz0gc2l6ZTsKKworICAgIGF1dG8gbWFwcGVkRGF0YSA9IERhdGE6OmZy
b21NYXAobWFwLCBzaXplKTsKKyAgICByZXR1cm4geyBtYXBwZWREYXRhLCBoYXNoIH07Cit9CisK
K0Jsb2JTdG9yYWdlOjpCbG9iIEJsb2JTdG9yYWdlOjpnZXQoY29uc3QgU3RyaW5nJiBwYXRoKQor
eworICAgIEFTU0VSVCghUnVuTG9vcDo6aXNNYWluKCkpOworCisgICAgYXV0byBsaW5rUGF0aCA9
IFdlYkNvcmU6OmZpbGVTeXN0ZW1SZXByZXNlbnRhdGlvbihwYXRoKTsKKyAgICBhdXRvIGRhdGEg
PSBtYXBGaWxlKGxpbmtQYXRoKTsKKworICAgIHJldHVybiB7IGRhdGEsIGNvbXB1dGVTSEExKGRh
dGEpIH07Cit9CisKK3ZvaWQgQmxvYlN0b3JhZ2U6OnJlbW92ZShjb25zdCBTdHJpbmcmIHBhdGgp
Cit7CisgICAgQVNTRVJUKCFSdW5Mb29wOjppc01haW4oKSk7CisKKyAgICBhdXRvIGxpbmtQYXRo
ID0gV2ViQ29yZTo6ZmlsZVN5c3RlbVJlcHJlc2VudGF0aW9uKHBhdGgpOworICAgIHVubGluayhs
aW5rUGF0aC5kYXRhKCkpOworfQorCit1bnNpZ25lZCBCbG9iU3RvcmFnZTo6c2hhcmVDb3VudChj
b25zdCBTdHJpbmcmIHBhdGgpCit7CisgICAgQVNTRVJUKCFSdW5Mb29wOjppc01haW4oKSk7CisK
KyAgICBhdXRvIGxpbmtQYXRoID0gV2ViQ29yZTo6ZmlsZVN5c3RlbVJlcHJlc2VudGF0aW9uKHBh
dGgpOworICAgIHN0cnVjdCBzdGF0IHN0YXQ7CisgICAgaWYgKDo6c3RhdChsaW5rUGF0aC5kYXRh
KCksICZzdGF0KSA8IDApCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiBzdGF0LnN0X25s
aW5rIC0gMTsKK30KKworfQorfQorCisjZW5kaWYKSW5kZXg6IFNvdXJjZS9XZWJLaXQyL05ldHdv
cmtQcm9jZXNzL2NhY2hlL05ldHdvcmtDYWNoZUJsb2JTdG9yYWdlLmgKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL1dlYktpdDIvTmV0d29ya1Byb2Nlc3MvY2FjaGUvTmV0d29ya0NhY2hlQmxvYlN0b3Jh
Z2UuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9XZWJLaXQyL05ldHdvcmtQcm9jZXNzL2NhY2hl
L05ldHdvcmtDYWNoZUJsb2JTdG9yYWdlLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw3NSBA
QAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJ
TkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBU
SEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJ
UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENP
TlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NV
UkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwg
REFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gg
REFNQUdFLgorICovCisKKyNpZm5kZWYgTmV0d29ya0NhY2hlQmxvYlN0b3JhZ2VfaAorI2RlZmlu
ZSBOZXR3b3JrQ2FjaGVCbG9iU3RvcmFnZV9oCisKKyNpZiBFTkFCTEUoTkVUV09SS19DQUNIRSkK
KworI2luY2x1ZGUgIk5ldHdvcmtDYWNoZURhdGEuaCIKKyNpbmNsdWRlICJOZXR3b3JrQ2FjaGVL
ZXkuaCIKKyNpbmNsdWRlIDx3dGYvU0hBMS5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L0NTdHJpbmcu
aD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9XVEZTdHJpbmcuaD4KKworbmFtZXNwYWNlIFdlYktpdCB7
CituYW1lc3BhY2UgTmV0d29ya0NhY2hlIHsKKworLy8gQmxvYlN0b3JhZ2UgZGVkdXBsaWNhdGVz
IHRoZSBkYXRhIHVzaW5nIGEgaGFzaCBjb21wdXRlZCBvdmVyIHRoZSBibG9iIGJ5dGVzLgorY2xh
c3MgQmxvYlN0b3JhZ2UgeworICAgIFdURl9NQUtFX05PTkNPUFlBQkxFKEJsb2JTdG9yYWdlKTsK
K3B1YmxpYzoKKyAgICBCbG9iU3RvcmFnZShjb25zdCBTdHJpbmcmIGJsb2JEaXJlY3RvcnlQYXRo
KTsKKworICAgIHN0cnVjdCBCbG9iIHsKKyAgICAgICAgRGF0YSBkYXRhOworICAgICAgICBTSEEx
OjpEaWdlc3QgaGFzaDsKKyAgICB9OworICAgIC8vIFRoZXNlIGFyZSBhbGwgc3luY2hyb25vdXMg
YW5kIHNob3VsZCBub3QgYmUgdXNlZCBmcm9tIHRoZSBtYWluIHRocmVhZC4KKyAgICBCbG9iIGFk
ZChjb25zdCBTdHJpbmcmIHBhdGgsIGNvbnN0IERhdGEmKTsKKyAgICBCbG9iIGdldChjb25zdCBT
dHJpbmcmIHBhdGgpOworCisgICAgLy8gQmxvYiB3b24ndCBiZSByZW1vdmVkIHVudGlsIHN5bmNo
cm9uaXphdGlvbi4KKyAgICB2b2lkIHJlbW92ZShjb25zdCBTdHJpbmcmIHBhdGgpOworCisgICAg
dW5zaWduZWQgc2hhcmVDb3VudChjb25zdCBTdHJpbmcmIHBhdGgpOworCisgICAgc2l6ZV90IGFw
cHJveGltYXRlU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fYXBwcm94aW1hdGVTaXplOyB9CisKKyAg
ICB2b2lkIHN5bmNocm9uaXplKCk7CisKK3ByaXZhdGU6CisgICAgQ1N0cmluZyBibG9iUGF0aChj
b25zdCBTSEExOjpEaWdlc3QmKSBjb25zdDsKKworICAgIGNvbnN0IENTdHJpbmcgbV9ibG9iRGly
ZWN0b3J5UGF0aDsKKworICAgIHN0ZDo6YXRvbWljPHNpemVfdD4gbV9hcHByb3hpbWF0ZVNpemUg
eyAwIH07Cit9OworCit9Cit9CisKKyNlbmRpZgorI2VuZGlmCkluZGV4OiBTb3VyY2UvV2ViS2l0
Mi9OZXR3b3JrUHJvY2Vzcy9jYWNoZS9OZXR3b3JrQ2FjaGVDb2RlcnMuY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9XZWJLaXQyL05ldHdvcmtQcm9jZXNzL2NhY2hlL05ldHdvcmtDYWNoZUNvZGVy
cy5jcHAJKHJldmlzaW9uIDE4MjY4NykKKysrIFNvdXJjZS9XZWJLaXQyL05ldHdvcmtQcm9jZXNz
L2NhY2hlL05ldHdvcmtDYWNoZUNvZGVycy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTE4NCw2ICsx
ODQsMTYgQEAgYm9vbCBDb2RlcjxNRDU6OkRpZ2VzdD46OmRlY29kZShEZWNvZGVyJgogICAgIHJl
dHVybiBkZWNvZGVyLmRlY29kZUZpeGVkTGVuZ3RoRGF0YShkaWdlc3QuZGF0YSgpLCBzaXplb2Yo
ZGlnZXN0KSk7CiB9CiAKK3ZvaWQgQ29kZXI8U0hBMTo6RGlnZXN0Pjo6ZW5jb2RlKEVuY29kZXIm
IGVuY29kZXIsIGNvbnN0IFNIQTE6OkRpZ2VzdCYgZGlnZXN0KQoreworICAgIGVuY29kZXIuZW5j
b2RlRml4ZWRMZW5ndGhEYXRhKGRpZ2VzdC5kYXRhKCksIHNpemVvZihkaWdlc3QpKTsKK30KKwor
Ym9vbCBDb2RlcjxTSEExOjpEaWdlc3Q+OjpkZWNvZGUoRGVjb2RlciYgZGVjb2RlciwgU0hBMTo6
RGlnZXN0JiBkaWdlc3QpCit7CisgICAgcmV0dXJuIGRlY29kZXIuZGVjb2RlRml4ZWRMZW5ndGhE
YXRhKGRpZ2VzdC5kYXRhKCksIHNpemVvZihkaWdlc3QpKTsKK30KKwogfQogfQogCkluZGV4OiBT
b3VyY2UvV2ViS2l0Mi9OZXR3b3JrUHJvY2Vzcy9jYWNoZS9OZXR3b3JrQ2FjaGVDb2RlcnMuaAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9OZXR3b3JrUHJvY2Vzcy9jYWNoZS9OZXR3b3Jr
Q2FjaGVDb2RlcnMuaAkocmV2aXNpb24gMTgyNjg3KQorKysgU291cmNlL1dlYktpdDIvTmV0d29y
a1Byb2Nlc3MvY2FjaGUvTmV0d29ya0NhY2hlQ29kZXJzLmgJKHdvcmtpbmcgY29weSkKQEAgLTM2
LDYgKzM2LDcgQEAKICNpbmNsdWRlIDx3dGYvSGFzaE1hcC5oPgogI2luY2x1ZGUgPHd0Zi9IYXNo
U2V0Lmg+CiAjaW5jbHVkZSA8d3RmL01ENS5oPgorI2luY2x1ZGUgPHd0Zi9TSEExLmg+CiAjaW5j
bHVkZSA8d3RmL1ZlY3Rvci5oPgogCiBuYW1lc3BhY2UgV2ViS2l0IHsKQEAgLTI2Miw2ICsyNjMs
MTEgQEAgdGVtcGxhdGU8PiBzdHJ1Y3QgQ29kZXI8TUQ1OjpEaWdlc3Q+IHsKICAgICBzdGF0aWMg
Ym9vbCBkZWNvZGUoRGVjb2RlciYsIE1ENTo6RGlnZXN0Jik7CiB9OwogCit0ZW1wbGF0ZTw+IHN0
cnVjdCBDb2RlcjxTSEExOjpEaWdlc3Q+IHsKKyAgICBzdGF0aWMgdm9pZCBlbmNvZGUoRW5jb2Rl
ciYsIGNvbnN0IFNIQTE6OkRpZ2VzdCYpOworICAgIHN0YXRpYyBib29sIGRlY29kZShEZWNvZGVy
JiwgU0hBMTo6RGlnZXN0Jik7Cit9OworCiB9CiB9CiAjZW5kaWYKSW5kZXg6IFNvdXJjZS9XZWJL
aXQyL05ldHdvcmtQcm9jZXNzL2NhY2hlL05ldHdvcmtDYWNoZURhdGEuaAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvV2ViS2l0Mi9OZXR3b3JrUHJvY2Vzcy9jYWNoZS9OZXR3b3JrQ2FjaGVEYXRhLmgJ
KHJldmlzaW9uIDE4MjY4NykKKysrIFNvdXJjZS9XZWJLaXQyL05ldHdvcmtQcm9jZXNzL2NhY2hl
L05ldHdvcmtDYWNoZURhdGEuaAkod29ya2luZyBjb3B5KQpAQCAtMzAsNiArMzAsNyBAQAogCiAj
aW5jbHVkZSA8ZnVuY3Rpb25hbD4KICNpbmNsdWRlIDx3dGYvRnVuY3Rpb25EaXNwYXRjaGVyLmg+
CisjaW5jbHVkZSA8d3RmL1NIQTEuaD4KICNpbmNsdWRlIDx3dGYvVGhyZWFkU2FmZVJlZkNvdW50
ZWQuaD4KICNpbmNsdWRlIDx3dGYvdGV4dC9XVEZTdHJpbmcuaD4KIApAQCAtOTgsMTEgKzk5LDE1
IEBAIHB1YmxpYzoKICAgICBEYXRhKCkgeyB9CiAgICAgRGF0YShjb25zdCB1aW50OF90Kiwgc2l6
ZV90KTsKIAorICAgIHN0YXRpYyBEYXRhIGVtcHR5KCk7CisgICAgc3RhdGljIERhdGEgZnJvbU1h
cCh2b2lkKiBtYXAsIHNpemVfdCk7CisKICAgICBlbnVtIGNsYXNzIEJhY2tpbmcgeyBCdWZmZXIs
IE1hcCB9OwogI2lmIFBMQVRGT1JNKENPQ09BKQogICAgIERhdGEoRGlzcGF0Y2hQdHI8ZGlzcGF0
Y2hfZGF0YV90PiwgQmFja2luZyA9IEJhY2tpbmc6OkJ1ZmZlcik7CiAjZW5kaWYKICAgICBib29s
IGlzTnVsbCgpIGNvbnN0OworICAgIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJuICFtX3Np
emU7IH0KIAogICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEoKSBjb25zdDsKICAgICBzaXplX3Qgc2l6
ZSgpIGNvbnN0IHsgcmV0dXJuIG1fc2l6ZTsgfQpAQCAtMTI1LDcgKzEzMCwxMCBAQCBwcml2YXRl
OgogfTsKIAogRGF0YSBjb25jYXRlbmF0ZShjb25zdCBEYXRhJiwgY29uc3QgRGF0YSYpOworYm9v
bCBieXRlc0VxdWFsKGNvbnN0IERhdGEmLCBjb25zdCBEYXRhJik7CiBEYXRhIG1hcEZpbGUoaW50
IGZkLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3QpOworRGF0YSBtYXBGaWxlKGNvbnN0IENTdHJpbmcm
IHBhdGgpOworU0hBMTo6RGlnZXN0IGNvbXB1dGVTSEExKGNvbnN0IERhdGEmKTsKIAogfQogfQpJ
bmRleDogU291cmNlL1dlYktpdDIvTmV0d29ya1Byb2Nlc3MvY2FjaGUvTmV0d29ya0NhY2hlRGF0
YUNvY29hLm1tCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQyL05ldHdvcmtQcm9jZXNzL2Nh
Y2hlL05ldHdvcmtDYWNoZURhdGFDb2NvYS5tbQkocmV2aXNpb24gMTgyNjg3KQorKysgU291cmNl
L1dlYktpdDIvTmV0d29ya1Byb2Nlc3MvY2FjaGUvTmV0d29ya0NhY2hlRGF0YUNvY29hLm1tCSh3
b3JraW5nIGNvcHkpCkBAIC0zMCw2ICszMCw3IEBACiAKICNpbmNsdWRlIDxkaXNwYXRjaC9kaXNw
YXRjaC5oPgogI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KIAog
bmFtZXNwYWNlIFdlYktpdCB7CiBuYW1lc3BhY2UgTmV0d29ya0NhY2hlIHsKQEAgLTQ3LDYgKzQ4
LDExIEBAIERhdGE6OkRhdGEoRGlzcGF0Y2hQdHI8ZGlzcGF0Y2hfZGF0YV90PiAKIHsKIH0KIAor
RGF0YSBEYXRhOjplbXB0eSgpCit7CisgICAgcmV0dXJuIHsgRGlzcGF0Y2hQdHI8ZGlzcGF0Y2hf
ZGF0YV90PihkaXNwYXRjaF9kYXRhX2VtcHR5KSB9OworfQorCiBjb25zdCB1aW50OF90KiBEYXRh
OjpkYXRhKCkgY29uc3QKIHsKICAgICBpZiAoIW1fZGF0YSAmJiBtX2Rpc3BhdGNoRGF0YSkgewpA
QCAtODcsMTcgKzkzLDY0IEBAIERhdGEgY29uY2F0ZW5hdGUoY29uc3QgRGF0YSYgYSwgY29uc3Qg
RGEKICAgICByZXR1cm4geyBhZG9wdERpc3BhdGNoKGRpc3BhdGNoX2RhdGFfY3JlYXRlX2NvbmNh
dChhLmRpc3BhdGNoRGF0YSgpLCBiLmRpc3BhdGNoRGF0YSgpKSkgfTsKIH0KIAotRGF0YSBtYXBG
aWxlKGludCBmZCwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpCitEYXRhIERhdGE6OmZyb21N
YXAodm9pZCogbWFwLCBzaXplX3Qgc2l6ZSkKIHsKLSAgICB2b2lkKiBtYXAgPSBtbWFwKG51bGxw
dHIsIHNpemUsIFBST1RfUkVBRCwgTUFQX1BSSVZBVEUsIGZkLCBvZmZzZXQpOwotICAgIGlmICht
YXAgPT0gTUFQX0ZBSUxFRCkKLSAgICAgICAgcmV0dXJuIHsgfTsKKyAgICBBU1NFUlQobWFwICYm
IG1hcCAhPSBNQVBfRkFJTEVEKTsKICAgICBhdXRvIGJvZHlNYXAgPSBhZG9wdERpc3BhdGNoKGRp
c3BhdGNoX2RhdGFfY3JlYXRlKG1hcCwgc2l6ZSwgZGlzcGF0Y2hfZ2V0X21haW5fcXVldWUoKSwg
W21hcCwgc2l6ZV0gewogICAgICAgICBtdW5tYXAobWFwLCBzaXplKTsKICAgICB9KSk7CiAgICAg
cmV0dXJuIHsgYm9keU1hcCwgRGF0YTo6QmFja2luZzo6TWFwIH07CiB9CiAKK0RhdGEgbWFwRmls
ZShpbnQgZmQsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKQoreworICAgIGlmICghc2l6ZSkK
KyAgICAgICAgcmV0dXJuIERhdGE6OmVtcHR5KCk7CisKKyAgICB2b2lkKiBtYXAgPSBtbWFwKG51
bGxwdHIsIHNpemUsIFBST1RfUkVBRCwgTUFQX1BSSVZBVEUsIGZkLCBvZmZzZXQpOworICAgIGlm
IChtYXAgPT0gTUFQX0ZBSUxFRCkKKyAgICAgICAgcmV0dXJuIHsgfTsKKyAgICByZXR1cm4gRGF0
YTo6ZnJvbU1hcChtYXAsIHNpemUpOworfQorCitEYXRhIG1hcEZpbGUoY29uc3QgQ1N0cmluZyYg
cGF0aCkKK3sKKyAgICBpbnQgZmQgPSBvcGVuKHBhdGguZGF0YSgpLCBPX1JET05MWSwgMCk7Cisg
ICAgaWYgKGZkIDwgMCkKKyAgICAgICAgcmV0dXJuIHsgfTsKKyAgICBzdHJ1Y3Qgc3RhdCBzdGF0
OworICAgIGlmIChmc3RhdChmZCwgJnN0YXQpIDwgMCkgeworICAgICAgICBjbG9zZShmZCk7Cisg
ICAgICAgIHJldHVybiB7IH07CisgICAgfQorICAgIHNpemVfdCBzaXplID0gc3RhdC5zdF9zaXpl
OworICAgIGF1dG8gZGF0YSA9IG1hcEZpbGUoZmQsIDAsIHNpemUpOworICAgIGNsb3NlKGZkKTsK
KworICAgIHJldHVybiBkYXRhOworfQorCitTSEExOjpEaWdlc3QgY29tcHV0ZVNIQTEoY29uc3Qg
RGF0YSYgZGF0YSkKK3sKKyAgICBTSEExIHNoYTE7CisgICAgZGF0YS5hcHBseShbJnNoYTFdKGNv
bnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgICAgIHNoYTEuYWRkQnl0ZXMo
ZGF0YSwgc2l6ZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0pOworICAgIFNIQTE6OkRp
Z2VzdCBkaWdlc3Q7CisgICAgc2hhMS5jb21wdXRlSGFzaChkaWdlc3QpOworICAgIHJldHVybiBk
aWdlc3Q7Cit9CisKK2Jvb2wgYnl0ZXNFcXVhbChjb25zdCBEYXRhJiBhLCBjb25zdCBEYXRhJiBi
KQoreworICAgIGlmIChhLmlzTnVsbCgpIHx8IGIuaXNOdWxsKCkpCisgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICBpZiAoYS5zaXplKCkgIT0gYi5zaXplKCkpCisgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICByZXR1cm4gIW1lbWNtcChhLmRhdGEoKSwgYi5kYXRhKCksIGEuc2l6ZSgpKTsKK30K
KwogfQogfQogCkluZGV4OiBTb3VyY2UvV2ViS2l0Mi9OZXR3b3JrUHJvY2Vzcy9jYWNoZS9OZXR3
b3JrQ2FjaGVFbnRyeS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdDIvTmV0d29ya1By
b2Nlc3MvY2FjaGUvTmV0d29ya0NhY2hlRW50cnkuY3BwCShyZXZpc2lvbiAxODI2ODcpCisrKyBT
b3VyY2UvV2ViS2l0Mi9OZXR3b3JrUHJvY2Vzcy9jYWNoZS9OZXR3b3JrQ2FjaGVFbnRyeS5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTE2NSw2ICsxNjUsMTIgQEAgdm9pZCBFbnRyeTo6YXNKU09OKFN0
cmluZ0J1aWxkZXImIGpzb24sIAogICAgIGpzb24uYXBwZW5kTGl0ZXJhbCgiXCJVUkxcIjogIik7
CiAgICAgSlNDOjphcHBlbmRRdW90ZWRKU09OU3RyaW5nVG9CdWlsZGVyKGpzb24sIG1fcmVzcG9u
c2UudXJsKCkuc3RyaW5nKCkpOwogICAgIGpzb24uYXBwZW5kTGl0ZXJhbCgiLFxuIik7CisgICAg
anNvbi5hcHBlbmRMaXRlcmFsKCJcImJvZHlIYXNoXCI6ICIpOworICAgIEpTQzo6YXBwZW5kUXVv
dGVkSlNPTlN0cmluZ1RvQnVpbGRlcihqc29uLCBpbmZvLmJvZHlIYXNoKTsKKyAgICBqc29uLmFw
cGVuZExpdGVyYWwoIixcbiIpOworICAgIGpzb24uYXBwZW5kTGl0ZXJhbCgiXCJib2R5U2hhcmVD
b3VudFwiOiAiKTsKKyAgICBqc29uLmFwcGVuZE51bWJlcihpbmZvLmJvZHlTaGFyZUNvdW50KTsK
KyAgICBqc29uLmFwcGVuZExpdGVyYWwoIixcbiIpOwogICAgIGpzb24uYXBwZW5kTGl0ZXJhbCgi
XCJoZWFkZXJzXCI6IHtcbiIpOwogICAgIGJvb2wgZmlyc3RIZWFkZXIgPSB0cnVlOwogICAgIGZv
ciAoYXV0byYgaGVhZGVyIDogbV9yZXNwb25zZS5odHRwSGVhZGVyRmllbGRzKCkpIHsKSW5kZXg6
IFNvdXJjZS9XZWJLaXQyL05ldHdvcmtQcm9jZXNzL2NhY2hlL05ldHdvcmtDYWNoZVN0b3JhZ2Uu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQyL05ldHdvcmtQcm9jZXNzL2NhY2hlL05l
dHdvcmtDYWNoZVN0b3JhZ2UuY3BwCShyZXZpc2lvbiAxODI2ODcpCisrKyBTb3VyY2UvV2ViS2l0
Mi9OZXR3b3JrUHJvY2Vzcy9jYWNoZS9OZXR3b3JrQ2FjaGVTdG9yYWdlLmNwcAkod29ya2luZyBj
b3B5KQpAQCAtNDMsNiArNDMsOSBAQCBuYW1lc3BhY2UgTmV0d29ya0NhY2hlIHsKIAogc3RhdGlj
IGNvbnN0IGNoYXIgbmV0d29ya0NhY2hlU3ViZGlyZWN0b3J5W10gPSAiV2ViS2l0Q2FjaGUiOwog
c3RhdGljIGNvbnN0IGNoYXIgdmVyc2lvbkRpcmVjdG9yeVByZWZpeFtdID0gIlZlcnNpb24gIjsK
K3N0YXRpYyBjb25zdCBjaGFyIHJlY29yZHNEaXJlY3RvcnlOYW1lW10gPSAiUmVjb3JkcyI7Citz
dGF0aWMgY29uc3QgY2hhciBibG9ic0RpcmVjdG9yeU5hbWVbXSA9ICJCbG9icyI7CitzdGF0aWMg
Y29uc3QgY2hhciBib2R5UG9zdGZpeFtdID0gIi1ib2R5IjsKIAogc3RhdGljIGRvdWJsZSBjb21w
dXRlUmVjb3JkV29ydGgoRmlsZVRpbWVzKTsKIApAQCAtNjIsMTcgKzY1LDMzIEBAIHN0YXRpYyBT
dHJpbmcgbWFrZVZlcnNpb25lZERpcmVjdG9yeVBhdGgKICAgICByZXR1cm4gV2ViQ29yZTo6cGF0
aEJ5QXBwZW5kaW5nQ29tcG9uZW50KGJhc2VEaXJlY3RvcnlQYXRoLCB2ZXJzaW9uU3ViZGlyZWN0
b3J5KTsKIH0KIAorc3RhdGljIFN0cmluZyBtYWtlUmVjb3JkRGlyZWN0b3J5UGF0aChjb25zdCBT
dHJpbmcmIGJhc2VEaXJlY3RvcnlQYXRoKQoreworICAgIHJldHVybiBXZWJDb3JlOjpwYXRoQnlB
cHBlbmRpbmdDb21wb25lbnQobWFrZVZlcnNpb25lZERpcmVjdG9yeVBhdGgoYmFzZURpcmVjdG9y
eVBhdGgpLCByZWNvcmRzRGlyZWN0b3J5TmFtZSk7Cit9CisKK3N0YXRpYyBTdHJpbmcgbWFrZUJs
b2JEaXJlY3RvcnlQYXRoKGNvbnN0IFN0cmluZyYgYmFzZURpcmVjdG9yeVBhdGgpCit7CisgICAg
cmV0dXJuIFdlYkNvcmU6OnBhdGhCeUFwcGVuZGluZ0NvbXBvbmVudChtYWtlVmVyc2lvbmVkRGly
ZWN0b3J5UGF0aChiYXNlRGlyZWN0b3J5UGF0aCksIGJsb2JzRGlyZWN0b3J5TmFtZSk7Cit9CisK
IFN0b3JhZ2U6OlN0b3JhZ2UoY29uc3QgU3RyaW5nJiBiYXNlRGlyZWN0b3J5UGF0aCkKICAgICA6
IG1fYmFzZURpcmVjdG9yeVBhdGgoYmFzZURpcmVjdG9yeVBhdGgpCi0gICAgLCBtX2RpcmVjdG9y
eVBhdGgobWFrZVZlcnNpb25lZERpcmVjdG9yeVBhdGgoYmFzZURpcmVjdG9yeVBhdGgpKQorICAg
ICwgbV9kaXJlY3RvcnlQYXRoKG1ha2VSZWNvcmREaXJlY3RvcnlQYXRoKGJhc2VEaXJlY3RvcnlQ
YXRoKSkKICAgICAsIG1faW9RdWV1ZShXb3JrUXVldWU6OmNyZWF0ZSgiY29tLmFwcGxlLldlYktp
dC5DYWNoZS5TdG9yYWdlIiwgV29ya1F1ZXVlOjpUeXBlOjpDb25jdXJyZW50KSkKICAgICAsIG1f
YmFja2dyb3VuZElPUXVldWUoV29ya1F1ZXVlOjpjcmVhdGUoImNvbS5hcHBsZS5XZWJLaXQuQ2Fj
aGUuU3RvcmFnZS5iYWNrZ3JvdW5kIiwgV29ya1F1ZXVlOjpUeXBlOjpDb25jdXJyZW50LCBXb3Jr
UXVldWU6OlFPUzo6QmFja2dyb3VuZCkpCiAgICAgLCBtX3NlcmlhbEJhY2tncm91bmRJT1F1ZXVl
KFdvcmtRdWV1ZTo6Y3JlYXRlKCJjb20uYXBwbGUuV2ViS2l0LkNhY2hlLlN0b3JhZ2Uuc2VyaWFs
QmFja2dyb3VuZCIsIFdvcmtRdWV1ZTo6VHlwZTo6U2VyaWFsLCBXb3JrUXVldWU6OlFPUzo6QmFj
a2dyb3VuZCkpCisgICAgLCBtX2Jsb2JTdG9yYWdlKG1ha2VCbG9iRGlyZWN0b3J5UGF0aChiYXNl
RGlyZWN0b3J5UGF0aCkpCiB7CiAgICAgZGVsZXRlT2xkVmVyc2lvbnMoKTsKICAgICBzeW5jaHJv
bml6ZSgpOwogfQogCitzaXplX3QgU3RvcmFnZTo6YXBwcm94aW1hdGVTaXplKCkgY29uc3QKK3sK
KyAgICByZXR1cm4gbV9hcHByb3hpbWF0ZVNpemUgKyBtX2Jsb2JTdG9yYWdlLmFwcHJveGltYXRl
U2l6ZSgpOworfQorCiB2b2lkIFN0b3JhZ2U6OnN5bmNocm9uaXplKCkKIHsKICAgICBBU1NFUlQo
UnVuTG9vcDo6aXNNYWluKCkpOwpAQCAtMTE3LDcgKzEzNiw5IEBAIHZvaWQgU3RvcmFnZTo6c3lu
Y2hyb25pemUoKQogICAgICAgICAgICAgbV9zeW5jaHJvbml6YXRpb25JblByb2dyZXNzID0gZmFs
c2U7CiAgICAgICAgIH0pOwogCi0gICAgICAgIExPRyhOZXR3b3JrQ2FjaGVTdG9yYWdlLCAiKE5l
dHdvcmtQcm9jZXNzKSBjYWNoZSBzeW5jaHJvbml6YXRpb24gY29tcGxldGVkIGFwcHJveGltYXRl
U2l6ZT0lenUgY291bnQ9JWQiLCBzaXplLCBjb3VudCk7CisgICAgICAgIG1fYmxvYlN0b3JhZ2Uu
c3luY2hyb25pemUoKTsKKworICAgICAgICBMT0coTmV0d29ya0NhY2hlU3RvcmFnZSwgIihOZXR3
b3JrUHJvY2VzcykgY2FjaGUgc3luY2hyb25pemF0aW9uIGNvbXBsZXRlZCBzaXplPSV6dSBjb3Vu
dD0lZCIsIHNpemUsIGNvdW50KTsKICAgICB9KTsKIH0KIApAQCAtMTM5LDcgKzE2MCw3IEBAIGJv
b2wgU3RvcmFnZTo6bWF5Q29udGFpbihjb25zdCBLZXkmIGtleSkKICAgICByZXR1cm4gIW1fY29u
dGVudHNGaWx0ZXIgfHwgbV9jb250ZW50c0ZpbHRlci0+bWF5Q29udGFpbihrZXkuaGFzaCgpKTsK
IH0KIAotc3RhdGljIFN0cmluZyBkaXJlY3RvcnlQYXRoRm9yS2V5KGNvbnN0IEtleSYga2V5LCBj
b25zdCBTdHJpbmcmIGNhY2hlUGF0aCkKK3N0YXRpYyBTdHJpbmcgcGFydGl0aW9uUGF0aEZvcktl
eShjb25zdCBLZXkmIGtleSwgY29uc3QgU3RyaW5nJiBjYWNoZVBhdGgpCiB7CiAgICAgQVNTRVJU
KCFrZXkucGFydGl0aW9uKCkuaXNFbXB0eSgpKTsKICAgICByZXR1cm4gV2ViQ29yZTo6cGF0aEJ5
QXBwZW5kaW5nQ29tcG9uZW50KGNhY2hlUGF0aCwga2V5LnBhcnRpdGlvbigpKTsKQEAgLTE1MCwx
OCArMTcxLDE5IEBAIHN0YXRpYyBTdHJpbmcgZmlsZU5hbWVGb3JLZXkoY29uc3QgS2V5JiAKICAg
ICByZXR1cm4ga2V5Lmhhc2hBc1N0cmluZygpOwogfQogCi1zdGF0aWMgU3RyaW5nIGZpbGVQYXRo
Rm9yS2V5KGNvbnN0IEtleSYga2V5LCBjb25zdCBTdHJpbmcmIGNhY2hlUGF0aCkKK3N0YXRpYyBT
dHJpbmcgcmVjb3JkUGF0aEZvcktleShjb25zdCBLZXkmIGtleSwgY29uc3QgU3RyaW5nJiBjYWNo
ZVBhdGgpCiB7Ci0gICAgcmV0dXJuIFdlYkNvcmU6OnBhdGhCeUFwcGVuZGluZ0NvbXBvbmVudChk
aXJlY3RvcnlQYXRoRm9yS2V5KGtleSwgY2FjaGVQYXRoKSwgZmlsZU5hbWVGb3JLZXkoa2V5KSk7
CisgICAgcmV0dXJuIFdlYkNvcmU6OnBhdGhCeUFwcGVuZGluZ0NvbXBvbmVudChwYXJ0aXRpb25Q
YXRoRm9yS2V5KGtleSwgY2FjaGVQYXRoKSwgZmlsZU5hbWVGb3JLZXkoa2V5KSk7CiB9CiAKLXN0
YXRpYyBSZWY8SU9DaGFubmVsPiBvcGVuRmlsZUZvcktleShjb25zdCBLZXkmIGtleSwgSU9DaGFu
bmVsOjpUeXBlIHR5cGUsIGNvbnN0IFN0cmluZyYgY2FjaGVQYXRoKQorc3RhdGljIFN0cmluZyBi
b2R5UGF0aEZvclJlY29yZFBhdGgoY29uc3QgU3RyaW5nJiByZWNvcmRQYXRoKQogewotICAgIGF1
dG8gZGlyZWN0b3J5UGF0aCA9IGRpcmVjdG9yeVBhdGhGb3JLZXkoa2V5LCBjYWNoZVBhdGgpOwot
ICAgIGF1dG8gZmlsZVBhdGggPSBXZWJDb3JlOjpwYXRoQnlBcHBlbmRpbmdDb21wb25lbnQoZGly
ZWN0b3J5UGF0aCwgZmlsZU5hbWVGb3JLZXkoa2V5KSk7Ci0gICAgaWYgKHR5cGUgPT0gSU9DaGFu
bmVsOjpUeXBlOjpDcmVhdGUpCi0gICAgICAgIFdlYkNvcmU6Om1ha2VBbGxEaXJlY3Rvcmllcyhk
aXJlY3RvcnlQYXRoKTsKLSAgICByZXR1cm4gSU9DaGFubmVsOjpvcGVuKGZpbGVQYXRoLCB0eXBl
KTsKKyAgICByZXR1cm4gcmVjb3JkUGF0aCArIGJvZHlQb3N0Zml4OworfQorCitzdGF0aWMgU3Ry
aW5nIGJvZHlQYXRoRm9yS2V5KGNvbnN0IEtleSYga2V5LCBjb25zdCBTdHJpbmcmIGNhY2hlUGF0
aCkKK3sKKyAgICByZXR1cm4gYm9keVBhdGhGb3JSZWNvcmRQYXRoKHJlY29yZFBhdGhGb3JLZXko
a2V5LCBjYWNoZVBhdGgpKTsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGhhc2hEYXRhKGNvbnN0IERh
dGEmIGRhdGEpCkBAIC0xODgsOCArMjEwLDcgQEAgc3RydWN0IFJlY29yZE1ldGFEYXRhIHsKICAg
ICB1bnNpZ25lZCBoZWFkZXJDaGVja3N1bTsKICAgICB1aW50NjRfdCBoZWFkZXJPZmZzZXQ7CiAg
ICAgdWludDY0X3QgaGVhZGVyU2l6ZTsKLSAgICB1bnNpZ25lZCBib2R5Q2hlY2tzdW07Ci0gICAg
dWludDY0X3QgYm9keU9mZnNldDsKKyAgICBTSEExOjpEaWdlc3QgYm9keUhhc2g7CiAgICAgdWlu
dDY0X3QgYm9keVNpemU7CiB9OwogCkBAIC0yMDgsMTQgKzIyOSwxMyBAQCBzdGF0aWMgYm9vbCBk
ZWNvZGVSZWNvcmRNZXRhRGF0YShSZWNvcmRNCiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAg
ICAgICAgIGlmICghZGVjb2Rlci5kZWNvZGUobWV0YURhdGEuaGVhZGVyU2l6ZSkpCiAgICAgICAg
ICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGlmICghZGVjb2Rlci5kZWNvZGUobWV0YURhdGEu
Ym9keUNoZWNrc3VtKSkKKyAgICAgICAgaWYgKCFkZWNvZGVyLmRlY29kZShtZXRhRGF0YS5ib2R5
SGFzaCkpCiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIGlmICghZGVjb2Rlci5k
ZWNvZGUobWV0YURhdGEuYm9keVNpemUpKQogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAg
ICAgICBpZiAoIWRlY29kZXIudmVyaWZ5Q2hlY2tzdW0oKSkKICAgICAgICAgICAgIHJldHVybiBm
YWxzZTsKICAgICAgICAgbWV0YURhdGEuaGVhZGVyT2Zmc2V0ID0gZGVjb2Rlci5jdXJyZW50T2Zm
c2V0KCk7Ci0gICAgICAgIG1ldGFEYXRhLmJvZHlPZmZzZXQgPSBXVEY6OnJvdW5kVXBUb011bHRp
cGxlT2YocGFnZVNpemUoKSwgbWV0YURhdGEuaGVhZGVyT2Zmc2V0ICsgbWV0YURhdGEuaGVhZGVy
U2l6ZSk7CiAgICAgICAgIHN1Y2Nlc3MgPSB0cnVlOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAg
ICAgfSk7CkBAIC0yMzMsMTAgKzI1Myw2IEBAIHN0YXRpYyBib29sIGRlY29kZVJlY29yZEhlYWRl
cihjb25zdCBEYXQKICAgICAgICAgTE9HKE5ldHdvcmtDYWNoZVN0b3JhZ2UsICIoTmV0d29ya1By
b2Nlc3MpIHZlcnNpb24gbWlzbWF0Y2giKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0K
LSAgICBpZiAobWV0YURhdGEuaGVhZGVyT2Zmc2V0ICsgbWV0YURhdGEuaGVhZGVyU2l6ZSA+IG1l
dGFEYXRhLmJvZHlPZmZzZXQpIHsKLSAgICAgICAgTE9HKE5ldHdvcmtDYWNoZVN0b3JhZ2UsICIo
TmV0d29ya1Byb2Nlc3MpIGJvZHkgb2Zmc2V0IG1pc21hdGNoIik7Ci0gICAgICAgIHJldHVybiBm
YWxzZTsKLSAgICB9CiAKICAgICBhdXRvIGhlYWRlckRhdGEgPSBmaWxlRGF0YS5zdWJyYW5nZSht
ZXRhRGF0YS5oZWFkZXJPZmZzZXQsIG1ldGFEYXRhLmhlYWRlclNpemUpOwogICAgIGlmIChtZXRh
RGF0YS5oZWFkZXJDaGVja3N1bSAhPSBoYXNoRGF0YShoZWFkZXJEYXRhKSkgewpAQCAtMjQ3LDEx
ICsyNjMsMTEgQEAgc3RhdGljIGJvb2wgZGVjb2RlUmVjb3JkSGVhZGVyKGNvbnN0IERhdAogICAg
IHJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgc3RkOjp1bmlxdWVfcHRyPFN0b3JhZ2U6OlJlY29y
ZD4gZGVjb2RlUmVjb3JkKGNvbnN0IERhdGEmIGZpbGVEYXRhLCBpbnQgZmQsIGNvbnN0IEtleSYg
a2V5KQorc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxTdG9yYWdlOjpSZWNvcmQ+IGNyZWF0ZVJlY29y
ZChjb25zdCBEYXRhJiByZWNvcmREYXRhLCBjb25zdCBCbG9iU3RvcmFnZTo6QmxvYiYgYm9keUJs
b2IsIGNvbnN0IEtleSYga2V5KQogewogICAgIFJlY29yZE1ldGFEYXRhIG1ldGFEYXRhOwogICAg
IERhdGEgaGVhZGVyRGF0YTsKLSAgICBpZiAoIWRlY29kZVJlY29yZEhlYWRlcihmaWxlRGF0YSwg
bWV0YURhdGEsIGhlYWRlckRhdGEpKQorICAgIGlmICghZGVjb2RlUmVjb3JkSGVhZGVyKHJlY29y
ZERhdGEsIG1ldGFEYXRhLCBoZWFkZXJEYXRhKSkKICAgICAgICAgcmV0dXJuIG51bGxwdHI7CiAK
ICAgICBpZiAobWV0YURhdGEua2V5ICE9IGtleSkKQEAgLTI2MSwyOSArMjc3LDE2IEBAIHN0YXRp
YyBzdGQ6OnVuaXF1ZV9wdHI8U3RvcmFnZTo6UmVjb3JkPiAKICAgICBhdXRvIHRpbWVTdGFtcCA9
IHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s6OnRpbWVfcG9pbnQobWV0YURhdGEuZXBvY2hSZWxh
dGl2ZVRpbWVTdGFtcCk7CiAgICAgaWYgKHRpbWVTdGFtcCA+IHN0ZDo6Y2hyb25vOjpzeXN0ZW1f
Y2xvY2s6Om5vdygpKQogICAgICAgICByZXR1cm4gbnVsbHB0cjsKLQotICAgIERhdGEgYm9keURh
dGE7Ci0gICAgaWYgKG1ldGFEYXRhLmJvZHlTaXplKSB7Ci0gICAgICAgIGlmIChtZXRhRGF0YS5i
b2R5T2Zmc2V0ICsgbWV0YURhdGEuYm9keVNpemUgIT0gZmlsZURhdGEuc2l6ZSgpKQotICAgICAg
ICAgICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgICAgICAgYm9keURhdGEgPSBtYXBGaWxlKGZkLCBt
ZXRhRGF0YS5ib2R5T2Zmc2V0LCBtZXRhRGF0YS5ib2R5U2l6ZSk7Ci0gICAgICAgIGlmIChib2R5
RGF0YS5pc051bGwoKSkgewotICAgICAgICAgICAgTE9HKE5ldHdvcmtDYWNoZVN0b3JhZ2UsICIo
TmV0d29ya1Byb2Nlc3MpIG1hcCBmYWlsZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBudWxscHRy
OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1ldGFEYXRhLmJvZHlDaGVja3N1bSAhPSBoYXNo
RGF0YShib2R5RGF0YSkpIHsKLSAgICAgICAgICAgIExPRyhOZXR3b3JrQ2FjaGVTdG9yYWdlLCAi
KE5ldHdvcmtQcm9jZXNzKSBkYXRhIGNoZWNrc3VtIG1pc21hdGNoIik7Ci0gICAgICAgICAgICBy
ZXR1cm4gbnVsbHB0cjsKLSAgICAgICAgfQotICAgIH0KKyAgICBpZiAobWV0YURhdGEuYm9keVNp
emUgIT0gYm9keUJsb2IuZGF0YS5zaXplKCkpCisgICAgICAgIHJldHVybiBudWxscHRyOworICAg
IGlmIChtZXRhRGF0YS5ib2R5SGFzaCAhPSBib2R5QmxvYi5oYXNoKQorICAgICAgICByZXR1cm4g
bnVsbHB0cjsKIAogICAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPFN0b3JhZ2U6OlJlY29yZD4o
U3RvcmFnZTo6UmVjb3JkIHsKICAgICAgICAgbWV0YURhdGEua2V5LAogICAgICAgICB0aW1lU3Rh
bXAsCiAgICAgICAgIGhlYWRlckRhdGEsCi0gICAgICAgIGJvZHlEYXRhCisgICAgICAgIGJvZHlC
bG9iLmRhdGEKICAgICB9KTsKIH0KIApAQCAtMjk2LDcgKzI5OSw3IEBAIHN0YXRpYyBEYXRhIGVu
Y29kZVJlY29yZE1ldGFEYXRhKGNvbnN0IFIKICAgICBlbmNvZGVyIDw8IG1ldGFEYXRhLmVwb2No
UmVsYXRpdmVUaW1lU3RhbXA7CiAgICAgZW5jb2RlciA8PCBtZXRhRGF0YS5oZWFkZXJDaGVja3N1
bTsKICAgICBlbmNvZGVyIDw8IG1ldGFEYXRhLmhlYWRlclNpemU7Ci0gICAgZW5jb2RlciA8PCBt
ZXRhRGF0YS5ib2R5Q2hlY2tzdW07CisgICAgZW5jb2RlciA8PCBtZXRhRGF0YS5ib2R5SGFzaDsK
ICAgICBlbmNvZGVyIDw8IG1ldGFEYXRhLmJvZHlTaXplOwogCiAgICAgZW5jb2Rlci5lbmNvZGVD
aGVja3N1bSgpOwpAQCAtMzA0LDI1ICszMDcsMTggQEAgc3RhdGljIERhdGEgZW5jb2RlUmVjb3Jk
TWV0YURhdGEoY29uc3QgUgogICAgIHJldHVybiBEYXRhKGVuY29kZXIuYnVmZmVyKCksIGVuY29k
ZXIuYnVmZmVyU2l6ZSgpKTsKIH0KIAotc3RhdGljIERhdGEgZW5jb2RlUmVjb3JkSGVhZGVyKGNv
bnN0IFN0b3JhZ2U6OlJlY29yZCYgcmVjb3JkKQorc3RhdGljIERhdGEgZW5jb2RlUmVjb3JkSGVh
ZGVyKGNvbnN0IFN0b3JhZ2U6OlJlY29yZCYgcmVjb3JkLCBTSEExOjpEaWdlc3QgYm9keUhhc2gp
CiB7CiAgICAgUmVjb3JkTWV0YURhdGEgbWV0YURhdGEocmVjb3JkLmtleSk7CiAgICAgbWV0YURh
dGEuZXBvY2hSZWxhdGl2ZVRpbWVTdGFtcCA9IHN0ZDo6Y2hyb25vOjpkdXJhdGlvbl9jYXN0PHN0
ZDo6Y2hyb25vOjptaWxsaXNlY29uZHM+KHJlY29yZC50aW1lU3RhbXAudGltZV9zaW5jZV9lcG9j
aCgpKTsKICAgICBtZXRhRGF0YS5oZWFkZXJDaGVja3N1bSA9IGhhc2hEYXRhKHJlY29yZC5oZWFk
ZXIpOwogICAgIG1ldGFEYXRhLmhlYWRlclNpemUgPSByZWNvcmQuaGVhZGVyLnNpemUoKTsKLSAg
ICBtZXRhRGF0YS5ib2R5Q2hlY2tzdW0gPSBoYXNoRGF0YShyZWNvcmQuYm9keSk7CisgICAgbWV0
YURhdGEuYm9keUhhc2ggPSBib2R5SGFzaDsKICAgICBtZXRhRGF0YS5ib2R5U2l6ZSA9IHJlY29y
ZC5ib2R5LnNpemUoKTsKIAogICAgIGF1dG8gZW5jb2RlZE1ldGFEYXRhID0gZW5jb2RlUmVjb3Jk
TWV0YURhdGEobWV0YURhdGEpOwogICAgIGF1dG8gaGVhZGVyRGF0YSA9IGNvbmNhdGVuYXRlKGVu
Y29kZWRNZXRhRGF0YSwgcmVjb3JkLmhlYWRlcik7Ci0gICAgaWYgKCFyZWNvcmQuYm9keS5zaXpl
KCkpCi0gICAgICAgIHJldHVybiB7IGhlYWRlckRhdGEgfTsKLQotICAgIHNpemVfdCBkYXRhT2Zm
c2V0ID0gV1RGOjpyb3VuZFVwVG9NdWx0aXBsZU9mKHBhZ2VTaXplKCksIGhlYWRlckRhdGEuc2l6
ZSgpKTsKLSAgICBWZWN0b3I8dWludDhfdCwgNDA5Nj4gZmlsbGVyKGRhdGFPZmZzZXQgLSBoZWFk
ZXJEYXRhLnNpemUoKSwgMCk7Ci0gICAgRGF0YSBhbGlnbm1lbnREYXRhKGZpbGxlci5kYXRhKCks
IGZpbGxlci5zaXplKCkpOwotCi0gICAgcmV0dXJuIGNvbmNhdGVuYXRlKGhlYWRlckRhdGEsIGFs
aWdubWVudERhdGEpOworICAgIHJldHVybiB7IGhlYWRlckRhdGEgfTsKIH0KIAogdm9pZCBTdG9y
YWdlOjpyZW1vdmUoY29uc3QgS2V5JiBrZXkpCkBAIC0zMzMsMTUgKzMyOSwxNyBAQCB2b2lkIFN0
b3JhZ2U6OnJlbW92ZShjb25zdCBLZXkmIGtleSkKICAgICAvLyBGb3Igc2ltcGxpY2l0eSB3ZSBh
bHNvIGRvbid0IHJlZHVjZSBtX2FwcHJveGltYXRlU2l6ZSBvbiByZW1vdmFscy4KICAgICAvLyBU
aGUgbmV4dCBzeW5jaHJvbml6YXRpb24gd2lsbCB1cGRhdGUgZXZlcnl0aGluZy4KIAotICAgIFN0
cmluZ0NhcHR1cmUgZmlsZVBhdGhDYXB0dXJlKGZpbGVQYXRoRm9yS2V5KGtleSwgbV9kaXJlY3Rv
cnlQYXRoKSk7Ci0gICAgc2VyaWFsQmFja2dyb3VuZElPUXVldWUoKS5kaXNwYXRjaChbdGhpcywg
ZmlsZVBhdGhDYXB0dXJlXSB7Ci0gICAgICAgIFdlYkNvcmU6OmRlbGV0ZUZpbGUoZmlsZVBhdGhD
YXB0dXJlLnN0cmluZygpKTsKKyAgICBTdHJpbmdDYXB0dXJlIHJlY29yZFBhdGhDYXB0dXJlKHJl
Y29yZFBhdGhGb3JLZXkoa2V5LCBtX2RpcmVjdG9yeVBhdGgpKTsKKyAgICBTdHJpbmdDYXB0dXJl
IGJvZHlQYXRoQ2FwdHVyZShib2R5UGF0aEZvcktleShrZXksIG1fZGlyZWN0b3J5UGF0aCkpOwor
ICAgIHNlcmlhbEJhY2tncm91bmRJT1F1ZXVlKCkuZGlzcGF0Y2goW3RoaXMsIHJlY29yZFBhdGhD
YXB0dXJlLCBib2R5UGF0aENhcHR1cmVdIHsKKyAgICAgICAgV2ViQ29yZTo6ZGVsZXRlRmlsZShy
ZWNvcmRQYXRoQ2FwdHVyZS5zdHJpbmcoKSk7CisgICAgICAgIG1fYmxvYlN0b3JhZ2UucmVtb3Zl
KGJvZHlQYXRoQ2FwdHVyZS5zdHJpbmcoKSk7CiAgICAgfSk7CiB9CiAKLXZvaWQgU3RvcmFnZTo6
dXBkYXRlRmlsZU1vZGlmaWNhdGlvblRpbWUoSU9DaGFubmVsJiBjaGFubmVsKQordm9pZCBTdG9y
YWdlOjp1cGRhdGVGaWxlTW9kaWZpY2F0aW9uVGltZShjb25zdCBTdHJpbmcmIHBhdGgpCiB7Ci0g
ICAgU3RyaW5nQ2FwdHVyZSBmaWxlUGF0aENhcHR1cmUoY2hhbm5lbC5wYXRoKCkpOworICAgIFN0
cmluZ0NhcHR1cmUgZmlsZVBhdGhDYXB0dXJlKHBhdGgpOwogICAgIHNlcmlhbEJhY2tncm91bmRJ
T1F1ZXVlKCkuZGlzcGF0Y2goW2ZpbGVQYXRoQ2FwdHVyZV0gewogICAgICAgICB1cGRhdGVGaWxl
TW9kaWZpY2F0aW9uVGltZUlmTmVlZGVkKGZpbGVQYXRoQ2FwdHVyZS5zdHJpbmcoKSk7CiAgICAg
fSk7CkBAIC0zNTQsMjkgKzM1MiwzNSBAQCB2b2lkIFN0b3JhZ2U6OmRpc3BhdGNoUmVhZE9wZXJh
dGlvbihjb25zCiAKICAgICBTdHJpbmdDYXB0dXJlIGNhY2hlUGF0aENhcHR1cmUobV9kaXJlY3Rv
cnlQYXRoKTsKICAgICBpb1F1ZXVlKCkuZGlzcGF0Y2goW3RoaXMsICZyZWFkLCBjYWNoZVBhdGhD
YXB0dXJlXSB7Ci0gICAgICAgIFJlZlB0cjxJT0NoYW5uZWw+IGNoYW5uZWwgPSBvcGVuRmlsZUZv
cktleShyZWFkLmtleSwgSU9DaGFubmVsOjpUeXBlOjpSZWFkLCBjYWNoZVBhdGhDYXB0dXJlLnN0
cmluZygpKTsKLSAgICAgICAgY2hhbm5lbC0+cmVhZCgwLCBzdGQ6Om51bWVyaWNfbGltaXRzPHNp
emVfdD46Om1heCgpLCBbdGhpcywgY2hhbm5lbCwgJnJlYWRdKERhdGEmIGZpbGVEYXRhLCBpbnQg
ZXJyb3IpIHsKLSAgICAgICAgICAgIGlmIChlcnJvcikgewotICAgICAgICAgICAgICAgIHJlbW92
ZShyZWFkLmtleSk7Ci0gICAgICAgICAgICAgICAgcmVhZC5jb21wbGV0aW9uSGFuZGxlcihudWxs
cHRyKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYXV0byByZWNvcmQg
PSBkZWNvZGVSZWNvcmQoZmlsZURhdGEsIGNoYW5uZWwtPmZpbGVEZXNjcmlwdG9yKCksIHJlYWQu
a2V5KTsKLSAgICAgICAgICAgICAgICBib29sIHN1Y2Nlc3MgPSByZWFkLmNvbXBsZXRpb25IYW5k
bGVyKFdURjo6bW92ZShyZWNvcmQpKTsKLSAgICAgICAgICAgICAgICBpZiAoc3VjY2VzcykKLSAg
ICAgICAgICAgICAgICAgICAgdXBkYXRlRmlsZU1vZGlmaWNhdGlvblRpbWUoKmNoYW5uZWwpOwot
ICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgcmVtb3ZlKHJlYWQua2V5
KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQVNTRVJUKG1fYWN0aXZlUmVhZE9wZXJh
dGlvbnMuY29udGFpbnMoJnJlYWQpKTsKLSAgICAgICAgICAgIG1fYWN0aXZlUmVhZE9wZXJhdGlv
bnMucmVtb3ZlKCZyZWFkKTsKLSAgICAgICAgICAgIGRpc3BhdGNoUGVuZGluZ1JlYWRPcGVyYXRp
b25zKCk7CisgICAgICAgIGF1dG8gcmVjb3JkUGF0aCA9IHJlY29yZFBhdGhGb3JLZXkocmVhZC5r
ZXksIGNhY2hlUGF0aENhcHR1cmUuc3RyaW5nKCkpOworICAgICAgICBhdXRvIGJvZHlQYXRoID0g
Ym9keVBhdGhGb3JLZXkocmVhZC5rZXksIGNhY2hlUGF0aENhcHR1cmUuc3RyaW5nKCkpOworICAg
ICAgICAvLyBGSVhNRTogQm9keSBhbmQgaGVhZGVyIHJldHJpZXZlcyBjYW4gYmUgZG9uZSBpbiBw
YXJhbGxlbC4KKyAgICAgICAgYXV0byBib2R5QmxvYiA9IG1fYmxvYlN0b3JhZ2UuZ2V0KGJvZHlQ
YXRoKTsKIAotICAgICAgICAgICAgTE9HKE5ldHdvcmtDYWNoZVN0b3JhZ2UsICIoTmV0d29ya1By
b2Nlc3MpIHJlYWQgY29tcGxldGUgZXJyb3I9JWQiLCBlcnJvcik7CisgICAgICAgIFJlZlB0cjxJ
T0NoYW5uZWw+IGNoYW5uZWwgPSBJT0NoYW5uZWw6Om9wZW4ocmVjb3JkUGF0aCwgSU9DaGFubmVs
OjpUeXBlOjpSZWFkKTsKKyAgICAgICAgY2hhbm5lbC0+cmVhZCgwLCBzdGQ6Om51bWVyaWNfbGlt
aXRzPHNpemVfdD46Om1heCgpLCBbdGhpcywgJnJlYWQsIGJvZHlCbG9iXShEYXRhJiBmaWxlRGF0
YSwgaW50IGVycm9yKSB7CisgICAgICAgICAgICBhdXRvIHJlY29yZCA9IGVycm9yID8gbnVsbHB0
ciA6IGNyZWF0ZVJlY29yZChmaWxlRGF0YSwgYm9keUJsb2IsIHJlYWQua2V5KTsKKyAgICAgICAg
ICAgIGZpbmlzaFJlYWRPcGVyYXRpb24ocmVhZCwgV1RGOjptb3ZlKHJlY29yZCkpOwogICAgICAg
ICB9KTsKICAgICB9KTsKIH0KIAordm9pZCBTdG9yYWdlOjpmaW5pc2hSZWFkT3BlcmF0aW9uKGNv
bnN0IFJlYWRPcGVyYXRpb24mIHJlYWQsIHN0ZDo6dW5pcXVlX3B0cjxSZWNvcmQ+IHJlY29yZCkK
K3sKKyAgICBBU1NFUlQoUnVuTG9vcDo6aXNNYWluKCkpOworCisgICAgYm9vbCBzdWNjZXNzID0g
cmVhZC5jb21wbGV0aW9uSGFuZGxlcihXVEY6Om1vdmUocmVjb3JkKSk7CisgICAgaWYgKHN1Y2Nl
c3MpCisgICAgICAgIHVwZGF0ZUZpbGVNb2RpZmljYXRpb25UaW1lKHJlY29yZFBhdGhGb3JLZXko
cmVhZC5rZXksIG1fZGlyZWN0b3J5UGF0aCkpOworICAgIGVsc2UKKyAgICAgICAgcmVtb3ZlKHJl
YWQua2V5KTsKKyAgICBBU1NFUlQobV9hY3RpdmVSZWFkT3BlcmF0aW9ucy5jb250YWlucygmcmVh
ZCkpOworICAgIG1fYWN0aXZlUmVhZE9wZXJhdGlvbnMucmVtb3ZlKCZyZWFkKTsKKyAgICBkaXNw
YXRjaFBlbmRpbmdSZWFkT3BlcmF0aW9ucygpOworCisgICAgTE9HKE5ldHdvcmtDYWNoZVN0b3Jh
Z2UsICIoTmV0d29ya1Byb2Nlc3MpIHJlYWQgY29tcGxldGUgc3VjY2Vzcz0lZCIsIHN1Y2Nlc3Mp
OworfQorCiB2b2lkIFN0b3JhZ2U6OmRpc3BhdGNoUGVuZGluZ1JlYWRPcGVyYXRpb25zKCkKIHsK
ICAgICBBU1NFUlQoUnVuTG9vcDo6aXNNYWluKCkpOwpAQCAtNDEzLDYgKzQxNyw4MyBAQCB0ZW1w
bGF0ZSA8Y2xhc3MgVD4gYm9vbCByZXRyaWV2ZUZyb21NZW1vCiAgICAgcmV0dXJuIGZhbHNlOwog
fQogCit2b2lkIFN0b3JhZ2U6OmRpc3BhdGNoUGVuZGluZ1dyaXRlT3BlcmF0aW9ucygpCit7Cisg
ICAgQVNTRVJUKFJ1bkxvb3A6OmlzTWFpbigpKTsKKworICAgIGNvbnN0IGludCBtYXhpbXVtQWN0
aXZlV3JpdGVPcGVyYXRpb25Db3VudCB7IDMgfTsKKworICAgIHdoaWxlICghbV9wZW5kaW5nV3Jp
dGVPcGVyYXRpb25zLmlzRW1wdHkoKSkgeworICAgICAgICBpZiAobV9hY3RpdmVXcml0ZU9wZXJh
dGlvbnMuc2l6ZSgpID49IG1heGltdW1BY3RpdmVXcml0ZU9wZXJhdGlvbkNvdW50KSB7CisgICAg
ICAgICAgICBMT0coTmV0d29ya0NhY2hlU3RvcmFnZSwgIihOZXR3b3JrUHJvY2VzcykgbGltaXRp
bmcgcGFyYWxsZWwgd3JpdGVzIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAg
ICAgICAgYXV0byB3cml0ZU9wZXJhdGlvbiA9IG1fcGVuZGluZ1dyaXRlT3BlcmF0aW9ucy50YWtl
Rmlyc3QoKTsKKyAgICAgICAgYXV0byYgd3JpdGUgPSAqd3JpdGVPcGVyYXRpb247CisgICAgICAg
IG1fYWN0aXZlV3JpdGVPcGVyYXRpb25zLmFkZChXVEY6Om1vdmUod3JpdGVPcGVyYXRpb24pKTsK
KworICAgICAgICBkaXNwYXRjaFdyaXRlT3BlcmF0aW9uKHdyaXRlKTsKKyAgICB9Cit9CisKK3Zv
aWQgU3RvcmFnZTo6ZGlzcGF0Y2hXcml0ZU9wZXJhdGlvbihjb25zdCBXcml0ZU9wZXJhdGlvbiYg
d3JpdGUpCit7CisgICAgQVNTRVJUKFJ1bkxvb3A6OmlzTWFpbigpKTsKKyAgICBBU1NFUlQobV9h
Y3RpdmVXcml0ZU9wZXJhdGlvbnMuY29udGFpbnMoJndyaXRlKSk7CisKKyAgICAvLyBUaGlzIHdh
cyBhZGRlZCBhbHJlYWR5IHdoZW4gc3RhcnRpbmcgdGhlIHN0b3JlIGJ1dCBmaWx0ZXIgbWlnaHQg
aGF2ZSBiZWVuIHdpcGVkLgorICAgIGFkZFRvQ29udGVudHNGaWx0ZXIod3JpdGUucmVjb3JkLmtl
eSk7CisKKyAgICBTdHJpbmdDYXB0dXJlIGNhY2hlUGF0aENhcHR1cmUobV9kaXJlY3RvcnlQYXRo
KTsKKyAgICBiYWNrZ3JvdW5kSU9RdWV1ZSgpLmRpc3BhdGNoKFt0aGlzLCAmd3JpdGUsIGNhY2hl
UGF0aENhcHR1cmVdIHsKKyAgICAgICAgYXV0byBwYXJ0aXRpb25QYXRoID0gcGFydGl0aW9uUGF0
aEZvcktleSh3cml0ZS5yZWNvcmQua2V5LCBjYWNoZVBhdGhDYXB0dXJlLnN0cmluZygpKTsKKyAg
ICAgICAgYXV0byByZWNvcmRQYXRoID0gcmVjb3JkUGF0aEZvcktleSh3cml0ZS5yZWNvcmQua2V5
LCBjYWNoZVBhdGhDYXB0dXJlLnN0cmluZygpKTsKKyAgICAgICAgYXV0byBib2R5UGF0aCA9IGJv
ZHlQYXRoRm9yS2V5KHdyaXRlLnJlY29yZC5rZXksIGNhY2hlUGF0aENhcHR1cmUuc3RyaW5nKCkp
OworCisgICAgICAgIFdlYkNvcmU6Om1ha2VBbGxEaXJlY3RvcmllcyhwYXJ0aXRpb25QYXRoKTsK
KworICAgICAgICAvLyBTdG9yZSB0aGUgYm9keS4KKyAgICAgICAgYXV0byBibG9iID0gbV9ibG9i
U3RvcmFnZS5hZGQoYm9keVBhdGgsIHdyaXRlLnJlY29yZC5ib2R5KTsKKyAgICAgICAgaWYgKGJs
b2IuZGF0YS5pc051bGwoKSkgeworICAgICAgICAgICAgUnVuTG9vcDo6bWFpbigpLmRpc3BhdGNo
KFt0aGlzLCAmd3JpdGVdIHsKKyAgICAgICAgICAgICAgICBmaW5pc2hXcml0ZU9wZXJhdGlvbih3
cml0ZSk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQor
CisgICAgICAgIC8vIFRlbGwgdGhlIGNsaWVudCB3ZSBub3cgaGF2ZSBhIGRpc2stYmFja2VkIG1h
cCBmb3IgdGhpcyBkYXRhLgorICAgICAgICBzaXplX3QgbWluaW11bU1hcFNpemUgPSBwYWdlU2l6
ZSgpOworICAgICAgICBpZiAoYmxvYi5kYXRhLnNpemUoKSA+PSBtaW5pbXVtTWFwU2l6ZSAmJiBi
bG9iLmRhdGEuaXNNYXAoKSAmJiB3cml0ZS5tYXBwZWRCb2R5SGFuZGxlcikgeworICAgICAgICAg
ICAgYXV0byYgbWFwcGVkQm9keUhhbmRsZXIgPSB3cml0ZS5tYXBwZWRCb2R5SGFuZGxlcjsKKyAg
ICAgICAgICAgIFJ1bkxvb3A6Om1haW4oKS5kaXNwYXRjaChbYmxvYiwgbWFwcGVkQm9keUhhbmRs
ZXJdIHsKKyAgICAgICAgICAgICAgICBtYXBwZWRCb2R5SGFuZGxlcihibG9iLmRhdGEpOworICAg
ICAgICAgICAgfSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBTdG9yZSB0aGUgaGVhZGVyIGFu
ZCBtZXRhIGRhdGEuCisgICAgICAgIGF1dG8gZW5jb2RlZEhlYWRlciA9IGVuY29kZVJlY29yZEhl
YWRlcih3cml0ZS5yZWNvcmQsIGJsb2IuaGFzaCk7CisgICAgICAgIGF1dG8gY2hhbm5lbCA9IElP
Q2hhbm5lbDo6b3BlbihyZWNvcmRQYXRoLCBJT0NoYW5uZWw6OlR5cGU6OkNyZWF0ZSk7CisgICAg
ICAgIGludCBmZCA9IGNoYW5uZWwtPmZpbGVEZXNjcmlwdG9yKCk7CisgICAgICAgIHNpemVfdCBo
ZWFkZXJTaXplID0gZW5jb2RlZEhlYWRlci5zaXplKCk7CisgICAgICAgIGNoYW5uZWwtPndyaXRl
KDAsIGVuY29kZWRIZWFkZXIsIFt0aGlzLCAmd3JpdGUsIGhlYWRlclNpemUsIGZkXShpbnQgZXJy
b3IpIHsKKyAgICAgICAgICAgIC8vIE9uIGVycm9yIHRoZSBlbnRyeSBzdGlsbCBzdGF5cyBpbiB0
aGUgY29udGVudHMgZmlsdGVyIHVudGlsIG5leHQgc3luY2hyb25pemF0aW9uLgorICAgICAgICAg
ICAgbV9hcHByb3hpbWF0ZVNpemUgKz0gaGVhZGVyU2l6ZTsKKyAgICAgICAgICAgIGZpbmlzaFdy
aXRlT3BlcmF0aW9uKHdyaXRlKTsKKworICAgICAgICAgICAgTE9HKE5ldHdvcmtDYWNoZVN0b3Jh
Z2UsICIoTmV0d29ya1Byb2Nlc3MpIHdyaXRlIGNvbXBsZXRlIGVycm9yPSVkIiwgZXJyb3IpOwor
ICAgICAgICB9KTsKKyAgICB9KTsKK30KKwordm9pZCBTdG9yYWdlOjpmaW5pc2hXcml0ZU9wZXJh
dGlvbihjb25zdCBXcml0ZU9wZXJhdGlvbiYgd3JpdGUpCit7CisgICAgQVNTRVJUKG1fYWN0aXZl
V3JpdGVPcGVyYXRpb25zLmNvbnRhaW5zKCZ3cml0ZSkpOworICAgIG1fYWN0aXZlV3JpdGVPcGVy
YXRpb25zLnJlbW92ZSgmd3JpdGUpOworICAgIGRpc3BhdGNoUGVuZGluZ1dyaXRlT3BlcmF0aW9u
cygpOworCisgICAgc2hyaW5rSWZOZWVkZWQoKTsKK30KKwogdm9pZCBTdG9yYWdlOjpyZXRyaWV2
ZShjb25zdCBLZXkmIGtleSwgdW5zaWduZWQgcHJpb3JpdHksIFJldHJpZXZlQ29tcGxldGlvbkhh
bmRsZXImJiBjb21wbGV0aW9uSGFuZGxlcikKIHsKICAgICBBU1NFUlQoUnVuTG9vcDo6aXNNYWlu
KCkpOwpAQCAtNDM4LDE3ICs1MTksMTUgQEAgdm9pZCBTdG9yYWdlOjpyZXRyaWV2ZShjb25zdCBL
ZXkmIGtleSwgdQogICAgIGRpc3BhdGNoUGVuZGluZ1JlYWRPcGVyYXRpb25zKCk7CiB9CiAKLXZv
aWQgU3RvcmFnZTo6c3RvcmUoY29uc3QgUmVjb3JkJiByZWNvcmQsIFN0b3JlQ29tcGxldGlvbkhh
bmRsZXImJiBjb21wbGV0aW9uSGFuZGxlcikKK3ZvaWQgU3RvcmFnZTo6c3RvcmUoY29uc3QgUmVj
b3JkJiByZWNvcmQsIE1hcHBlZEJvZHlIYW5kbGVyJiYgbWFwcGVkQm9keUhhbmRsZXIpCiB7CiAg
ICAgQVNTRVJUKFJ1bkxvb3A6OmlzTWFpbigpKTsKICAgICBBU1NFUlQoIXJlY29yZC5rZXkuaXNO
dWxsKCkpOwogCi0gICAgaWYgKCFtX2NhcGFjaXR5KSB7Ci0gICAgICAgIGNvbXBsZXRpb25IYW5k
bGVyKGZhbHNlLCB7IH0pOworICAgIGlmICghbV9jYXBhY2l0eSkKICAgICAgICAgcmV0dXJuOwot
ICAgIH0KIAotICAgIG1fcGVuZGluZ1dyaXRlT3BlcmF0aW9ucy5hcHBlbmQobmV3IFdyaXRlT3Bl
cmF0aW9uIHsgcmVjb3JkLCB7IH0sIFdURjo6bW92ZShjb21wbGV0aW9uSGFuZGxlcikgfSk7Cisg
ICAgbV9wZW5kaW5nV3JpdGVPcGVyYXRpb25zLmFwcGVuZChuZXcgV3JpdGVPcGVyYXRpb24geyBy
ZWNvcmQsIFdURjo6bW92ZShtYXBwZWRCb2R5SGFuZGxlcikgfSk7CiAKICAgICAvLyBBZGQga2V5
IHRvIHRoZSBmaWx0ZXIgYWxyZWFkeSBoZXJlIGFzIHdlIGRvIGxvb2t1cHMgZnJvbSB0aGUgcGVu
ZGluZyBvcGVyYXRpb25zIHRvby4KICAgICBhZGRUb0NvbnRlbnRzRmlsdGVyKHJlY29yZC5rZXkp
OwpAQCAtNDU2LDQzICs1MzUsMjkgQEAgdm9pZCBTdG9yYWdlOjpzdG9yZShjb25zdCBSZWNvcmQm
IHJlY29yZAogICAgIGRpc3BhdGNoUGVuZGluZ1dyaXRlT3BlcmF0aW9ucygpOwogfQogCi12b2lk
IFN0b3JhZ2U6OnVwZGF0ZShjb25zdCBSZWNvcmQmIHVwZGF0ZVJlY29yZCwgY29uc3QgUmVjb3Jk
JiBleGlzdGluZ1JlY29yZCwgU3RvcmVDb21wbGV0aW9uSGFuZGxlciYmIGNvbXBsZXRpb25IYW5k
bGVyKQotewotICAgIEFTU0VSVChSdW5Mb29wOjppc01haW4oKSk7Ci0gICAgQVNTRVJUKCFleGlz
dGluZ1JlY29yZC5rZXkuaXNOdWxsKCkpOwotICAgIEFTU0VSVChleGlzdGluZ1JlY29yZC5rZXkg
PT0gdXBkYXRlUmVjb3JkLmtleSk7Ci0KLSAgICBpZiAoIW1fY2FwYWNpdHkpIHsKLSAgICAgICAg
Y29tcGxldGlvbkhhbmRsZXIoZmFsc2UsIHsgfSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0K
LSAgICBtX3BlbmRpbmdXcml0ZU9wZXJhdGlvbnMuYXBwZW5kKG5ldyBXcml0ZU9wZXJhdGlvbiB7
IHVwZGF0ZVJlY29yZCwgZXhpc3RpbmdSZWNvcmQsIFdURjo6bW92ZShjb21wbGV0aW9uSGFuZGxl
cikgfSk7Ci0KLSAgICBkaXNwYXRjaFBlbmRpbmdXcml0ZU9wZXJhdGlvbnMoKTsKLX0KLQogdm9p
ZCBTdG9yYWdlOjp0cmF2ZXJzZShUcmF2ZXJzZUZsYWdzIGZsYWdzLCBzdGQ6OmZ1bmN0aW9uPHZv
aWQgKGNvbnN0IFJlY29yZCosIGNvbnN0IFJlY29yZEluZm8mKT4mJiB0cmF2ZXJzZUhhbmRsZXIp
CiB7CiAgICAgU3RyaW5nQ2FwdHVyZSBjYWNoZVBhdGhDYXB0dXJlKG1fZGlyZWN0b3J5UGF0aCk7
CiAgICAgaW9RdWV1ZSgpLmRpc3BhdGNoKFt0aGlzLCBmbGFncywgY2FjaGVQYXRoQ2FwdHVyZSwg
dHJhdmVyc2VIYW5kbGVyXSB7CiAgICAgICAgIFN0cmluZyBjYWNoZVBhdGggPSBjYWNoZVBhdGhD
YXB0dXJlLnN0cmluZygpOwogICAgICAgICB0cmF2ZXJzZUNhY2hlRmlsZXMoY2FjaGVQYXRoLCBb
dGhpcywgZmxhZ3MsICZ0cmF2ZXJzZUhhbmRsZXJdKGNvbnN0IFN0cmluZyYgZmlsZU5hbWUsIGNv
bnN0IFN0cmluZyYgcGFydGl0aW9uUGF0aCkgewotICAgICAgICAgICAgYXV0byBmaWxlUGF0aCA9
IFdlYkNvcmU6OnBhdGhCeUFwcGVuZGluZ0NvbXBvbmVudChwYXJ0aXRpb25QYXRoLCBmaWxlTmFt
ZSk7CisgICAgICAgICAgICBhdXRvIHJlY29yZFBhdGggPSBXZWJDb3JlOjpwYXRoQnlBcHBlbmRp
bmdDb21wb25lbnQocGFydGl0aW9uUGF0aCwgZmlsZU5hbWUpOwogCiAgICAgICAgICAgICBSZWNv
cmRJbmZvIGluZm87CiAgICAgICAgICAgICBpZiAoZmxhZ3MgJiBUcmF2ZXJzZUZsYWc6OkNvbXB1
dGVXb3J0aCkKLSAgICAgICAgICAgICAgICBpbmZvLndvcnRoID0gY29tcHV0ZVJlY29yZFdvcnRo
KGZpbGVUaW1lcyhmaWxlUGF0aCkpOworICAgICAgICAgICAgICAgIGluZm8ud29ydGggPSBjb21w
dXRlUmVjb3JkV29ydGgoZmlsZVRpbWVzKHJlY29yZFBhdGgpKTsKKyAgICAgICAgICAgIGlmIChm
bGFncyAmIFRyYXZlcnNlRmxhZzo6U2hhcmVDb3VudCkKKyAgICAgICAgICAgICAgICBpbmZvLmJv
ZHlTaGFyZUNvdW50ID0gbV9ibG9iU3RvcmFnZS5zaGFyZUNvdW50KGJvZHlQYXRoRm9yUmVjb3Jk
UGF0aChyZWNvcmRQYXRoKSk7CiAKLSAgICAgICAgICAgIGF1dG8gY2hhbm5lbCA9IElPQ2hhbm5l
bDo6b3BlbihmaWxlUGF0aCwgSU9DaGFubmVsOjpUeXBlOjpSZWFkKTsKLSAgICAgICAgICAgIGNv
bnN0IHNpemVfdCBoZWFkZXJSZWFkU2l6ZSA9IDE2IDw8IDEwOworICAgICAgICAgICAgYXV0byBj
aGFubmVsID0gSU9DaGFubmVsOjpvcGVuKHJlY29yZFBhdGgsIElPQ2hhbm5lbDo6VHlwZTo6UmVh
ZCk7CiAgICAgICAgICAgICAvLyBGSVhNRTogVHJhdmVyc2FsIGlzIHNsb3dlciB0aGFuIGl0IHNo
b3VsZCBiZSBkdWUgdG8gbGFjayBvZiBwYXJhbGxlbGlzbS4KLSAgICAgICAgICAgIGNoYW5uZWwt
PnJlYWRTeW5jKDAsIGhlYWRlclJlYWRTaXplLCBbdGhpcywgJnRyYXZlcnNlSGFuZGxlciwgJmlu
Zm9dKERhdGEmIGZpbGVEYXRhLCBpbnQpIHsKKyAgICAgICAgICAgIGNoYW5uZWwtPnJlYWRTeW5j
KDAsIHN0ZDo6bnVtZXJpY19saW1pdHM8c2l6ZV90Pjo6bWF4KCksIFt0aGlzLCAmdHJhdmVyc2VI
YW5kbGVyLCAmaW5mb10oRGF0YSYgZmlsZURhdGEsIGludCkgewogICAgICAgICAgICAgICAgIFJl
Y29yZE1ldGFEYXRhIG1ldGFEYXRhOwogICAgICAgICAgICAgICAgIERhdGEgaGVhZGVyRGF0YTsK
ICAgICAgICAgICAgICAgICBpZiAoZGVjb2RlUmVjb3JkSGVhZGVyKGZpbGVEYXRhLCBtZXRhRGF0
YSwgaGVhZGVyRGF0YSkpIHsKICAgICAgICAgICAgICAgICAgICAgUmVjb3JkIHJlY29yZCB7IG1l
dGFEYXRhLmtleSwgc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6dGltZV9wb2ludChtZXRhRGF0
YS5lcG9jaFJlbGF0aXZlVGltZVN0YW1wKSwgaGVhZGVyRGF0YSwgeyB9IH07CiAgICAgICAgICAg
ICAgICAgICAgIGluZm8uYm9keVNpemUgPSBtZXRhRGF0YS5ib2R5U2l6ZTsKKyAgICAgICAgICAg
ICAgICAgICAgaW5mby5ib2R5SGFzaCA9IFN0cmluZzo6ZnJvbVVURjgoU0hBMTo6aGV4RGlnZXN0
KG1ldGFEYXRhLmJvZHlIYXNoKSk7CiAgICAgICAgICAgICAgICAgICAgIHRyYXZlcnNlSGFuZGxl
cigmcmVjb3JkLCBpbmZvKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9KTsKQEAg
LTUwMywxMDcgKzU2OCw2IEBAIHZvaWQgU3RvcmFnZTo6dHJhdmVyc2UoVHJhdmVyc2VGbGFncyBm
bGEKICAgICB9KTsKIH0KIAotdm9pZCBTdG9yYWdlOjpkaXNwYXRjaFBlbmRpbmdXcml0ZU9wZXJh
dGlvbnMoKQotewotICAgIEFTU0VSVChSdW5Mb29wOjppc01haW4oKSk7Ci0KLSAgICBjb25zdCBp
bnQgbWF4aW11bUFjdGl2ZVdyaXRlT3BlcmF0aW9uQ291bnQgeyAzIH07Ci0KLSAgICB3aGlsZSAo
IW1fcGVuZGluZ1dyaXRlT3BlcmF0aW9ucy5pc0VtcHR5KCkpIHsKLSAgICAgICAgaWYgKG1fYWN0
aXZlV3JpdGVPcGVyYXRpb25zLnNpemUoKSA+PSBtYXhpbXVtQWN0aXZlV3JpdGVPcGVyYXRpb25D
b3VudCkgewotICAgICAgICAgICAgTE9HKE5ldHdvcmtDYWNoZVN0b3JhZ2UsICIoTmV0d29ya1By
b2Nlc3MpIGxpbWl0aW5nIHBhcmFsbGVsIHdyaXRlcyIpOwotICAgICAgICAgICAgcmV0dXJuOwot
ICAgICAgICB9Ci0gICAgICAgIGF1dG8gd3JpdGVPcGVyYXRpb24gPSBtX3BlbmRpbmdXcml0ZU9w
ZXJhdGlvbnMudGFrZUZpcnN0KCk7Ci0gICAgICAgIGF1dG8mIHdyaXRlID0gKndyaXRlT3BlcmF0
aW9uOwotICAgICAgICBtX2FjdGl2ZVdyaXRlT3BlcmF0aW9ucy5hZGQoV1RGOjptb3ZlKHdyaXRl
T3BlcmF0aW9uKSk7Ci0KLSAgICAgICAgaWYgKHdyaXRlLmV4aXN0aW5nUmVjb3JkICYmIG1heUNv
bnRhaW4od3JpdGUucmVjb3JkLmtleSkpIHsKLSAgICAgICAgICAgIGRpc3BhdGNoSGVhZGVyV3Jp
dGVPcGVyYXRpb24od3JpdGUpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAg
ICAgICAgZGlzcGF0Y2hGdWxsV3JpdGVPcGVyYXRpb24od3JpdGUpOwotICAgIH0KLX0KLQotdm9p
ZCBTdG9yYWdlOjpkaXNwYXRjaEZ1bGxXcml0ZU9wZXJhdGlvbihjb25zdCBXcml0ZU9wZXJhdGlv
biYgd3JpdGUpCi17Ci0gICAgQVNTRVJUKFJ1bkxvb3A6OmlzTWFpbigpKTsKLSAgICBBU1NFUlQo
bV9hY3RpdmVXcml0ZU9wZXJhdGlvbnMuY29udGFpbnMoJndyaXRlKSk7Ci0KLSAgICAvLyBUaGlz
IHdhcyBhZGRlZCBhbHJlYWR5IHdoZW4gc3RhcnRpbmcgdGhlIHN0b3JlIGJ1dCBmaWx0ZXIgbWln
aHQgaGF2ZSBiZWVuIHdpcGVkLgotICAgIGFkZFRvQ29udGVudHNGaWx0ZXIod3JpdGUucmVjb3Jk
LmtleSk7Ci0KLSAgICBTdHJpbmdDYXB0dXJlIGNhY2hlUGF0aENhcHR1cmUobV9kaXJlY3RvcnlQ
YXRoKTsKLSAgICBiYWNrZ3JvdW5kSU9RdWV1ZSgpLmRpc3BhdGNoKFt0aGlzLCAmd3JpdGUsIGNh
Y2hlUGF0aENhcHR1cmVdIHsKLSAgICAgICAgYXV0byBlbmNvZGVkSGVhZGVyID0gZW5jb2RlUmVj
b3JkSGVhZGVyKHdyaXRlLnJlY29yZCk7Ci0gICAgICAgIGF1dG8gaGVhZGVyQW5kQm9keURhdGEg
PSBjb25jYXRlbmF0ZShlbmNvZGVkSGVhZGVyLCB3cml0ZS5yZWNvcmQuYm9keSk7Ci0KLSAgICAg
ICAgYXV0byBjaGFubmVsID0gb3BlbkZpbGVGb3JLZXkod3JpdGUucmVjb3JkLmtleSwgSU9DaGFu
bmVsOjpUeXBlOjpDcmVhdGUsIGNhY2hlUGF0aENhcHR1cmUuc3RyaW5nKCkpOwotICAgICAgICBp
bnQgZmQgPSBjaGFubmVsLT5maWxlRGVzY3JpcHRvcigpOwotICAgICAgICBzaXplX3QgYm9keU9m
ZnNldCA9IGVuY29kZWRIZWFkZXIuc2l6ZSgpOwotCi0gICAgICAgIGNoYW5uZWwtPndyaXRlKDAs
IGhlYWRlckFuZEJvZHlEYXRhLCBbdGhpcywgJndyaXRlLCBib2R5T2Zmc2V0LCBmZF0oaW50IGVy
cm9yKSB7Ci0gICAgICAgICAgICBzaXplX3QgYm9keVNpemUgPSB3cml0ZS5yZWNvcmQuYm9keS5z
aXplKCk7Ci0gICAgICAgICAgICBzaXplX3QgdG90YWxTaXplID0gYm9keU9mZnNldCArIGJvZHlT
aXplOwotCi0gICAgICAgICAgICAvLyBPbiBlcnJvciB0aGUgZW50cnkgc3RpbGwgc3RheXMgaW4g
dGhlIGNvbnRlbnRzIGZpbHRlciB1bnRpbCBuZXh0IHN5bmNocm9uaXphdGlvbi4KLSAgICAgICAg
ICAgIG1fYXBwcm94aW1hdGVTaXplICs9IHRvdGFsU2l6ZTsKLQotICAgICAgICAgICAgYm9vbCBz
aG91bGRNYXBCb2R5ID0gIWVycm9yICYmIGJvZHlTaXplID49IHBhZ2VTaXplKCk7Ci0gICAgICAg
ICAgICBhdXRvIGJvZHlNYXAgPSBzaG91bGRNYXBCb2R5ID8gbWFwRmlsZShmZCwgYm9keU9mZnNl
dCwgYm9keVNpemUpIDogRGF0YSgpOwotCi0gICAgICAgICAgICB3cml0ZS5jb21wbGV0aW9uSGFu
ZGxlcighZXJyb3IsIGJvZHlNYXApOwotCi0gICAgICAgICAgICBBU1NFUlQobV9hY3RpdmVXcml0
ZU9wZXJhdGlvbnMuY29udGFpbnMoJndyaXRlKSk7Ci0gICAgICAgICAgICBtX2FjdGl2ZVdyaXRl
T3BlcmF0aW9ucy5yZW1vdmUoJndyaXRlKTsKLSAgICAgICAgICAgIGRpc3BhdGNoUGVuZGluZ1dy
aXRlT3BlcmF0aW9ucygpOwotCi0gICAgICAgICAgICBMT0coTmV0d29ya0NhY2hlU3RvcmFnZSwg
IihOZXR3b3JrUHJvY2Vzcykgd3JpdGUgY29tcGxldGUgZXJyb3I9JWQiLCBlcnJvcik7Ci0gICAg
ICAgIH0pOwotICAgIH0pOwotCi0gICAgc2hyaW5rSWZOZWVkZWQoKTsKLX0KLQotdm9pZCBTdG9y
YWdlOjpkaXNwYXRjaEhlYWRlcldyaXRlT3BlcmF0aW9uKGNvbnN0IFdyaXRlT3BlcmF0aW9uJiB3
cml0ZSkKLXsKLSAgICBBU1NFUlQoUnVuTG9vcDo6aXNNYWluKCkpOwotICAgIEFTU0VSVCh3cml0
ZS5leGlzdGluZ1JlY29yZCk7Ci0gICAgQVNTRVJUKG1fYWN0aXZlV3JpdGVPcGVyYXRpb25zLmNv
bnRhaW5zKCZ3cml0ZSkpOwotICAgIEFTU0VSVChtYXlDb250YWluKHdyaXRlLnJlY29yZC5rZXkp
KTsKLQotICAgIC8vIFRyeSB0byB1cGRhdGUgdGhlIGhlYWRlciBvZiBhbiBleGlzdGluZyBlbnRy
eS4KLSAgICBTdHJpbmdDYXB0dXJlIGNhY2hlUGF0aENhcHR1cmUobV9kaXJlY3RvcnlQYXRoKTsK
LSAgICBiYWNrZ3JvdW5kSU9RdWV1ZSgpLmRpc3BhdGNoKFt0aGlzLCAmd3JpdGUsIGNhY2hlUGF0
aENhcHR1cmVdIHsKLSAgICAgICAgYXV0byBoZWFkZXJEYXRhID0gZW5jb2RlUmVjb3JkSGVhZGVy
KHdyaXRlLnJlY29yZCk7Ci0gICAgICAgIGF1dG8gZXhpc3RpbmdIZWFkZXJEYXRhID0gZW5jb2Rl
UmVjb3JkSGVhZGVyKHdyaXRlLmV4aXN0aW5nUmVjb3JkLnZhbHVlKCkpOwotCi0gICAgICAgIGJv
b2wgcGFnZVJvdW5kZWRIZWFkZXJTaXplQ2hhbmdlZCA9IGhlYWRlckRhdGEuc2l6ZSgpICE9IGV4
aXN0aW5nSGVhZGVyRGF0YS5zaXplKCk7Ci0gICAgICAgIGlmIChwYWdlUm91bmRlZEhlYWRlclNp
emVDaGFuZ2VkKSB7Ci0gICAgICAgICAgICBMT0coTmV0d29ya0NhY2hlU3RvcmFnZSwgIihOZXR3
b3JrUHJvY2VzcykgcGFnZS1yb3VuZGVkIGhlYWRlciBzaXplIGNoYW5nZWQsIHN0b3JpbmcgZnVs
bCBlbnRyeSIpOwotICAgICAgICAgICAgUnVuTG9vcDo6bWFpbigpLmRpc3BhdGNoKFt0aGlzLCAm
d3JpdGVdIHsKLSAgICAgICAgICAgICAgICBkaXNwYXRjaEZ1bGxXcml0ZU9wZXJhdGlvbih3cml0
ZSk7Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0g
ICAgICAgIGF1dG8gY2hhbm5lbCA9IG9wZW5GaWxlRm9yS2V5KHdyaXRlLnJlY29yZC5rZXksIElP
Q2hhbm5lbDo6VHlwZTo6V3JpdGUsIGNhY2hlUGF0aENhcHR1cmUuc3RyaW5nKCkpOwotICAgICAg
ICBjaGFubmVsLT53cml0ZSgwLCBoZWFkZXJEYXRhLCBbdGhpcywgJndyaXRlXShpbnQgZXJyb3Ip
IHsKLSAgICAgICAgICAgIExPRyhOZXR3b3JrQ2FjaGVTdG9yYWdlLCAiKE5ldHdvcmtQcm9jZXNz
KSB1cGRhdGUgY29tcGxldGUgZXJyb3I9JWQiLCBlcnJvcik7Ci0KLSAgICAgICAgICAgIGlmIChl
cnJvcikKLSAgICAgICAgICAgICAgICByZW1vdmUod3JpdGUucmVjb3JkLmtleSk7Ci0KLSAgICAg
ICAgICAgIHdyaXRlLmNvbXBsZXRpb25IYW5kbGVyKCFlcnJvciwgeyB9KTsKLQotICAgICAgICAg
ICAgQVNTRVJUKG1fYWN0aXZlV3JpdGVPcGVyYXRpb25zLmNvbnRhaW5zKCZ3cml0ZSkpOwotICAg
ICAgICAgICAgbV9hY3RpdmVXcml0ZU9wZXJhdGlvbnMucmVtb3ZlKCZ3cml0ZSk7Ci0gICAgICAg
ICAgICBkaXNwYXRjaFBlbmRpbmdXcml0ZU9wZXJhdGlvbnMoKTsKLSAgICAgICAgfSk7Ci0gICAg
fSk7Ci19Ci0KIHZvaWQgU3RvcmFnZTo6c2V0Q2FwYWNpdHkoc2l6ZV90IGNhcGFjaXR5KQogewog
ICAgIEFTU0VSVChSdW5Mb29wOjppc01haW4oKSk7CkBAIC02MzMsNyArNTk3LDcgQEAgdm9pZCBT
dG9yYWdlOjpjbGVhcigpCiAKICAgICBTdHJpbmdDYXB0dXJlIGRpcmVjdG9yeVBhdGhDYXB0dXJl
KG1fZGlyZWN0b3J5UGF0aCk7CiAKLSAgICBpb1F1ZXVlKCkuZGlzcGF0Y2goW2RpcmVjdG9yeVBh
dGhDYXB0dXJlXSB7CisgICAgaW9RdWV1ZSgpLmRpc3BhdGNoKFt0aGlzLCBkaXJlY3RvcnlQYXRo
Q2FwdHVyZV0gewogICAgICAgICBTdHJpbmcgZGlyZWN0b3J5UGF0aCA9IGRpcmVjdG9yeVBhdGhD
YXB0dXJlLnN0cmluZygpOwogICAgICAgICB0cmF2ZXJzZURpcmVjdG9yeShkaXJlY3RvcnlQYXRo
LCBEVF9ESVIsIFsmZGlyZWN0b3J5UGF0aF0oY29uc3QgU3RyaW5nJiBzdWJkaXJOYW1lKSB7CiAg
ICAgICAgICAgICBTdHJpbmcgc3ViZGlyUGF0aCA9IFdlYkNvcmU6OnBhdGhCeUFwcGVuZGluZ0Nv
bXBvbmVudChkaXJlY3RvcnlQYXRoLCBzdWJkaXJOYW1lKTsKQEAgLTY0Miw2ICs2MDYsOSBAQCB2
b2lkIFN0b3JhZ2U6OmNsZWFyKCkKICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgV2ViQ29y
ZTo6ZGVsZXRlRW1wdHlEaXJlY3Rvcnkoc3ViZGlyUGF0aCk7CiAgICAgICAgIH0pOworCisgICAg
ICAgIC8vIFRoaXMgY2xlYW5zIHVucmVmZXJlbmNlcyBibG9icy4KKyAgICAgICAgbV9ibG9iU3Rv
cmFnZS5zeW5jaHJvbml6ZSgpOwogICAgIH0pOwogfQogCkBAIC02NjAsMTYgKzYyNywyMCBAQCBz
dGF0aWMgZG91YmxlIGNvbXB1dGVSZWNvcmRXb3J0aChGaWxlVGltCiAgICAgcmV0dXJuIGR1cmF0
aW9uPGRvdWJsZT4oYWNjZXNzQWdlKSAvIGFnZTsKIH0KIAotCi1zdGF0aWMgZG91YmxlIGRlbGV0
aW9uUHJvYmFiaWxpdHkoRmlsZVRpbWVzIHRpbWVzKQorc3RhdGljIGRvdWJsZSBkZWxldGlvblBy
b2JhYmlsaXR5KEZpbGVUaW1lcyB0aW1lcywgdW5zaWduZWQgYm9keVNoYXJlQ291bnQpCiB7CiAg
ICAgc3RhdGljIGNvbnN0IGRvdWJsZSBtYXhpbXVtUHJvYmFiaWxpdHkgeyAwLjMzIH07CisgICAg
c3RhdGljIGNvbnN0IHVuc2lnbmVkIG1heGltdW1FZmZlY3RpdmVTaGFyZUNvdW50IHsgNSB9Owog
CiAgICAgYXV0byB3b3J0aCA9IGNvbXB1dGVSZWNvcmRXb3J0aCh0aW1lcyk7CiAKICAgICAvLyBB
ZGp1c3QgYSBiaXQgc28gdGhlIG1vc3QgdmFsdWFibGUgZW50cmllcyBkb24ndCBnZXQgZGVsZXRl
ZCBhdCBhbGwuCiAgICAgYXV0byBlZmZlY3RpdmVXb3J0aCA9IHN0ZDo6bWluKDEuMSAqIHdvcnRo
LCAxLik7CiAKKyAgICAvLyBJdCBpcyBsZXNzIHVzZWZ1bCB0byByZW1vdmUgYW4gZW50cnkgdGhh
dCBzaGFyZXMgaXRzIGJvZHkgZGF0YS4KKyAgICBpZiAoYm9keVNoYXJlQ291bnQpCisgICAgICAg
IGVmZmVjdGl2ZVdvcnRoIC89IHN0ZDo6bWluKGJvZHlTaGFyZUNvdW50LCBtYXhpbXVtRWZmZWN0
aXZlU2hhcmVDb3VudCk7CisKICAgICByZXR1cm4gKDEgLSBlZmZlY3RpdmVXb3J0aCkgKiBtYXhp
bXVtUHJvYmFiaWxpdHk7CiB9CiAKQEAgLTY3Nyw3ICs2NDgsNyBAQCB2b2lkIFN0b3JhZ2U6OnNo
cmlua0lmTmVlZGVkKCkKIHsKICAgICBBU1NFUlQoUnVuTG9vcDo6aXNNYWluKCkpOwogCi0gICAg
aWYgKG1fYXBwcm94aW1hdGVTaXplID4gbV9jYXBhY2l0eSkKKyAgICBpZiAoYXBwcm94aW1hdGVT
aXplKCkgPiBtX2NhcGFjaXR5KQogICAgICAgICBzaHJpbmsoKTsKIH0KIApAQCAtNjg5LDIyICs2
NjAsMjcgQEAgdm9pZCBTdG9yYWdlOjpzaHJpbmsoKQogICAgICAgICByZXR1cm47CiAgICAgbV9z
aHJpbmtJblByb2dyZXNzID0gdHJ1ZTsKIAotICAgIExPRyhOZXR3b3JrQ2FjaGVTdG9yYWdlLCAi
KE5ldHdvcmtQcm9jZXNzKSBzaHJpbmtpbmcgY2FjaGUgYXBwcm94aW1hdGVTaXplPSV6dSBjYXBh
Y2l0eT0lenUiLCBzdGF0aWNfY2FzdDxzaXplX3Q+KG1fYXBwcm94aW1hdGVTaXplKSwgbV9jYXBh
Y2l0eSk7CisgICAgTE9HKE5ldHdvcmtDYWNoZVN0b3JhZ2UsICIoTmV0d29ya1Byb2Nlc3MpIHNo
cmlua2luZyBjYWNoZSBhcHByb3hpbWF0ZVNpemU9JXp1IGNhcGFjaXR5PSV6dSIsIGFwcHJveGlt
YXRlU2l6ZSgpLCBtX2NhcGFjaXR5KTsKIAogICAgIFN0cmluZ0NhcHR1cmUgY2FjaGVQYXRoQ2Fw
dHVyZShtX2RpcmVjdG9yeVBhdGgpOwogICAgIGJhY2tncm91bmRJT1F1ZXVlKCkuZGlzcGF0Y2go
W3RoaXMsIGNhY2hlUGF0aENhcHR1cmVdIHsKICAgICAgICAgU3RyaW5nIGNhY2hlUGF0aCA9IGNh
Y2hlUGF0aENhcHR1cmUuc3RyaW5nKCk7Ci0gICAgICAgIHRyYXZlcnNlQ2FjaGVGaWxlcyhjYWNo
ZVBhdGgsIFtdKGNvbnN0IFN0cmluZyYgZmlsZU5hbWUsIGNvbnN0IFN0cmluZyYgcGFydGl0aW9u
UGF0aCkgewotICAgICAgICAgICAgYXV0byBmaWxlUGF0aCA9IFdlYkNvcmU6OnBhdGhCeUFwcGVu
ZGluZ0NvbXBvbmVudChwYXJ0aXRpb25QYXRoLCBmaWxlTmFtZSk7CisgICAgICAgIHRyYXZlcnNl
Q2FjaGVGaWxlcyhjYWNoZVBhdGgsIFt0aGlzXShjb25zdCBTdHJpbmcmIGZpbGVOYW1lLCBjb25z
dCBTdHJpbmcmIHBhcnRpdGlvblBhdGgpIHsKKyAgICAgICAgICAgIGF1dG8gcmVjb3JkUGF0aCA9
IFdlYkNvcmU6OnBhdGhCeUFwcGVuZGluZ0NvbXBvbmVudChwYXJ0aXRpb25QYXRoLCBmaWxlTmFt
ZSk7CisgICAgICAgICAgICBhdXRvIGJvZHlQYXRoID0gYm9keVBhdGhGb3JSZWNvcmRQYXRoKHJl
Y29yZFBhdGgpOworCisgICAgICAgICAgICBhdXRvIHRpbWVzID0gZmlsZVRpbWVzKHJlY29yZFBh
dGgpOworICAgICAgICAgICAgdW5zaWduZWQgYm9keVNoYXJlQ291bnQgPSBtX2Jsb2JTdG9yYWdl
LnNoYXJlQ291bnQoYm9keVBhdGgpOworICAgICAgICAgICAgYXV0byBwcm9iYWJpbGl0eSA9IGRl
bGV0aW9uUHJvYmFiaWxpdHkodGltZXMsIGJvZHlTaGFyZUNvdW50KTsKIAotICAgICAgICAgICAg
YXV0byB0aW1lcyA9IGZpbGVUaW1lcyhmaWxlUGF0aCk7Ci0gICAgICAgICAgICBhdXRvIHByb2Jh
YmlsaXR5ID0gZGVsZXRpb25Qcm9iYWJpbGl0eSh0aW1lcyk7CiAgICAgICAgICAgICBib29sIHNo
b3VsZERlbGV0ZSA9IHJhbmRvbU51bWJlcigpIDwgcHJvYmFiaWxpdHk7CiAKLSAgICAgICAgICAg
IExPRyhOZXR3b3JrQ2FjaGVTdG9yYWdlLCAiRGVsZXRpb24gcHJvYmFiaWxpdHk9JWYgc2hvdWxk
RGVsZXRlPSVkIiwgcHJvYmFiaWxpdHksIHNob3VsZERlbGV0ZSk7CisgICAgICAgICAgICBMT0co
TmV0d29ya0NhY2hlU3RvcmFnZSwgIkRlbGV0aW9uIHByb2JhYmlsaXR5PSVmIGJvZHlMaW5rQ291
bnQ9JWQgc2hvdWxkRGVsZXRlPSVkIiwgcHJvYmFiaWxpdHksIGJvZHlTaGFyZUNvdW50LCBzaG91
bGREZWxldGUpOwogCi0gICAgICAgICAgICBpZiAoc2hvdWxkRGVsZXRlKQotICAgICAgICAgICAg
ICAgIFdlYkNvcmU6OmRlbGV0ZUZpbGUoZmlsZVBhdGgpOworICAgICAgICAgICAgaWYgKHNob3Vs
ZERlbGV0ZSkgeworICAgICAgICAgICAgICAgIFdlYkNvcmU6OmRlbGV0ZUZpbGUocmVjb3JkUGF0
aCk7CisgICAgICAgICAgICAgICAgbV9ibG9iU3RvcmFnZS5yZW1vdmUoYm9keVBhdGgpOworICAg
ICAgICAgICAgfQogICAgICAgICB9KTsKIAogICAgICAgICAvLyBMZXQgc3lzdGVtIGZpZ3VyZSBv
dXQgaWYgdGhleSBhcmUgcmVhbGx5IGVtcHR5LgpAQCAtNzM5LDYgKzcxNSw3IEBAIHZvaWQgU3Rv
cmFnZTo6ZGVsZXRlT2xkVmVyc2lvbnMoKQogICAgICAgICAgICAgV2ViQ29yZTo6ZGVsZXRlRW1w
dHlEaXJlY3RvcnkocGFydGl0aW9uUGF0aCk7CiAgICAgICAgIH0pOwogICAgIH0pOworICAgIC8v
IEZJWE1FOiBEZWxldGUgVjIgY2FjaGUuCiB9CiAKIH0KSW5kZXg6IFNvdXJjZS9XZWJLaXQyL05l
dHdvcmtQcm9jZXNzL2NhY2hlL05ldHdvcmtDYWNoZVN0b3JhZ2UuaAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvV2ViS2l0Mi9OZXR3b3JrUHJvY2Vzcy9jYWNoZS9OZXR3b3JrQ2FjaGVTdG9yYWdlLmgJ
KHJldmlzaW9uIDE4MjY4NykKKysrIFNvdXJjZS9XZWJLaXQyL05ldHdvcmtQcm9jZXNzL2NhY2hl
L05ldHdvcmtDYWNoZVN0b3JhZ2UuaAkod29ya2luZyBjb3B5KQpAQCAtMjgsNiArMjgsNyBAQAog
CiAjaWYgRU5BQkxFKE5FVFdPUktfQ0FDSEUpCiAKKyNpbmNsdWRlICJOZXR3b3JrQ2FjaGVCbG9i
U3RvcmFnZS5oIgogI2luY2x1ZGUgIk5ldHdvcmtDYWNoZURhdGEuaCIKICNpbmNsdWRlICJOZXR3
b3JrQ2FjaGVLZXkuaCIKICNpbmNsdWRlIDx3dGYvQmxvb21GaWx0ZXIuaD4KQEAgLTU3LDI3ICs1
OCwzMCBAQCBwdWJsaWM6CiAgICAgdHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPGJvb2wgKHN0ZDo6dW5p
cXVlX3B0cjxSZWNvcmQ+KT4gUmV0cmlldmVDb21wbGV0aW9uSGFuZGxlcjsKICAgICB2b2lkIHJl
dHJpZXZlKGNvbnN0IEtleSYsIHVuc2lnbmVkIHByaW9yaXR5LCBSZXRyaWV2ZUNvbXBsZXRpb25I
YW5kbGVyJiYpOwogCi0gICAgdHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPHZvaWQgKGJvb2wgc3VjY2Vz
cywgY29uc3QgRGF0YSYgbWFwcGVkQm9keSk+IFN0b3JlQ29tcGxldGlvbkhhbmRsZXI7Ci0gICAg
dm9pZCBzdG9yZShjb25zdCBSZWNvcmQmLCBTdG9yZUNvbXBsZXRpb25IYW5kbGVyJiYpOwotICAg
IHZvaWQgdXBkYXRlKGNvbnN0IFJlY29yZCYgdXBkYXRlUmVjb3JkLCBjb25zdCBSZWNvcmQmIGV4
aXN0aW5nUmVjb3JkLCBTdG9yZUNvbXBsZXRpb25IYW5kbGVyJiYpOworICAgIHR5cGVkZWYgc3Rk
OjpmdW5jdGlvbjx2b2lkIChjb25zdCBEYXRhJiBtYXBwZWRCb2R5KT4gTWFwcGVkQm9keUhhbmRs
ZXI7CisgICAgdm9pZCBzdG9yZShjb25zdCBSZWNvcmQmLCBNYXBwZWRCb2R5SGFuZGxlciYmKTsK
IAogICAgIHZvaWQgcmVtb3ZlKGNvbnN0IEtleSYpOwogCiAgICAgc3RydWN0IFJlY29yZEluZm8g
ewogICAgICAgICBzaXplX3QgYm9keVNpemUgeyAwIH07CiAgICAgICAgIGRvdWJsZSB3b3J0aCB7
IC0xIH07IC8vIDAtMSB3aGVyZSAxIGlzIHRoZSBtb3N0IHZhbHVhYmxlLgorICAgICAgICB1bnNp
Z25lZCBib2R5U2hhcmVDb3VudCB7IDAgfTsKKyAgICAgICAgU3RyaW5nIGJvZHlIYXNoOwogICAg
IH07CiAgICAgZW51bSBUcmF2ZXJzZUZsYWcgewogICAgICAgICBDb21wdXRlV29ydGggPSAxIDw8
IDAsCisgICAgICAgIFNoYXJlQ291bnQgPSAxIDw8IDEsCiAgICAgfTsKICAgICB0eXBlZGVmIHVu
c2lnbmVkIFRyYXZlcnNlRmxhZ3M7CiAgICAgLy8gTnVsbCByZWNvcmQgc2lnbmFscyBlbmQuCiAg
ICAgdm9pZCB0cmF2ZXJzZShUcmF2ZXJzZUZsYWdzLCBzdGQ6OmZ1bmN0aW9uPHZvaWQgKGNvbnN0
IFJlY29yZCosIGNvbnN0IFJlY29yZEluZm8mKT4mJik7CiAKICAgICB2b2lkIHNldENhcGFjaXR5
KHNpemVfdCk7CisgICAgc2l6ZV90IGFwcHJveGltYXRlU2l6ZSgpIGNvbnN0OwogICAgIHZvaWQg
Y2xlYXIoKTsKIAotICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCB2ZXJzaW9uID0gMjsKKyAgICBz
dGF0aWMgY29uc3QgdW5zaWduZWQgdmVyc2lvbiA9IDM7CiAKICAgICBjb25zdCBTdHJpbmcmIGJh
c2VEaXJlY3RvcnlQYXRoKCkgY29uc3QgeyByZXR1cm4gbV9iYXNlRGlyZWN0b3J5UGF0aDsgfQog
ICAgIGNvbnN0IFN0cmluZyYgZGlyZWN0b3J5UGF0aCgpIGNvbnN0IHsgcmV0dXJuIG1fZGlyZWN0
b3J5UGF0aDsgfQpAQCAtOTYsMTcgKzEwMCwxNyBAQCBwcml2YXRlOgogICAgIH07CiAgICAgdm9p
ZCBkaXNwYXRjaFJlYWRPcGVyYXRpb24oY29uc3QgUmVhZE9wZXJhdGlvbiYpOwogICAgIHZvaWQg
ZGlzcGF0Y2hQZW5kaW5nUmVhZE9wZXJhdGlvbnMoKTsKKyAgICB2b2lkIGZpbmlzaFJlYWRPcGVy
YXRpb24oY29uc3QgUmVhZE9wZXJhdGlvbiYsIHN0ZDo6dW5pcXVlX3B0cjxSZWNvcmQ+KTsKIAog
ICAgIHN0cnVjdCBXcml0ZU9wZXJhdGlvbiB7CiAgICAgICAgIFJlY29yZCByZWNvcmQ7Ci0gICAg
ICAgIE9wdGlvbmFsPFJlY29yZD4gZXhpc3RpbmdSZWNvcmQ7Ci0gICAgICAgIFN0b3JlQ29tcGxl
dGlvbkhhbmRsZXIgY29tcGxldGlvbkhhbmRsZXI7CisgICAgICAgIE1hcHBlZEJvZHlIYW5kbGVy
IG1hcHBlZEJvZHlIYW5kbGVyOwogICAgIH07Ci0gICAgdm9pZCBkaXNwYXRjaEZ1bGxXcml0ZU9w
ZXJhdGlvbihjb25zdCBXcml0ZU9wZXJhdGlvbiYpOwotICAgIHZvaWQgZGlzcGF0Y2hIZWFkZXJX
cml0ZU9wZXJhdGlvbihjb25zdCBXcml0ZU9wZXJhdGlvbiYpOworICAgIHZvaWQgZGlzcGF0Y2hX
cml0ZU9wZXJhdGlvbihjb25zdCBXcml0ZU9wZXJhdGlvbiYpOwogICAgIHZvaWQgZGlzcGF0Y2hQ
ZW5kaW5nV3JpdGVPcGVyYXRpb25zKCk7CisgICAgdm9pZCBmaW5pc2hXcml0ZU9wZXJhdGlvbihj
b25zdCBXcml0ZU9wZXJhdGlvbiYpOwogCi0gICAgdm9pZCB1cGRhdGVGaWxlTW9kaWZpY2F0aW9u
VGltZShJT0NoYW5uZWwmKTsKKyAgICB2b2lkIHVwZGF0ZUZpbGVNb2RpZmljYXRpb25UaW1lKGNv
bnN0IFN0cmluZyYgcGF0aCk7CiAKICAgICBXb3JrUXVldWUmIGlvUXVldWUoKSB7IHJldHVybiBt
X2lvUXVldWUuZ2V0KCk7IH0KICAgICBXb3JrUXVldWUmIGJhY2tncm91bmRJT1F1ZXVlKCkgeyBy
ZXR1cm4gbV9iYWNrZ3JvdW5kSU9RdWV1ZS5nZXQoKTsgfQpAQCAtMTQxLDYgKzE0NSw4IEBAIHBy
aXZhdGU6CiAgICAgUmVmPFdvcmtRdWV1ZT4gbV9pb1F1ZXVlOwogICAgIFJlZjxXb3JrUXVldWU+
IG1fYmFja2dyb3VuZElPUXVldWU7CiAgICAgUmVmPFdvcmtRdWV1ZT4gbV9zZXJpYWxCYWNrZ3Jv
dW5kSU9RdWV1ZTsKKworICAgIEJsb2JTdG9yYWdlIG1fYmxvYlN0b3JhZ2U7CiB9OwogCiB9Cklu
ZGV4OiBTb3VyY2UvV2ViS2l0Mi9XZWJLaXQyLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL1dlYktpdDIvV2ViS2l0Mi54Y29kZXByb2ovcHJvamVjdC5wYnhw
cm9qCShyZXZpc2lvbiAxODI2ODcpCisrKyBTb3VyY2UvV2ViS2l0Mi9XZWJLaXQyLnhjb2RlcHJv
ai9wcm9qZWN0LnBieHByb2oJKHdvcmtpbmcgY29weSkKQEAgLTE3OTQsNiArMTc5NCw4IEBACiAJ
CUU0ODlEMjhFMUEwQTJEQjgwMDc4QzA2QSAvKiBOZXR3b3JrQ2FjaGVEZWNvZGVyLmggaW4gSGVh
ZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBFNDg5RDI4NzFBMEEyREI4
MDA3OEMwNkEgLyogTmV0d29ya0NhY2hlRGVjb2Rlci5oICovOyB9OwogCQlFNDg5RDI4RjFBMEEy
REI4MDA3OEMwNkEgLyogTmV0d29ya0NhY2hlRW5jb2Rlci5jcHAgaW4gU291cmNlcyAqLyA9IHtp
c2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBFNDg5RDI4ODFBMEEyREI4MDA3OEMwNkEgLyog
TmV0d29ya0NhY2hlRW5jb2Rlci5jcHAgKi87IH07CiAJCUU0ODlEMjkwMUEwQTJEQjgwMDc4QzA2
QSAvKiBOZXR3b3JrQ2FjaGVFbmNvZGVyLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWls
ZEZpbGU7IGZpbGVSZWYgPSBFNDg5RDI4OTFBMEEyREI4MDA3OEMwNkEgLyogTmV0d29ya0NhY2hl
RW5jb2Rlci5oICovOyB9OworCQlFNDlENDBENzFBRDNGQjE3MDA2NkI3QjkgLyogTmV0d29ya0Nh
Y2hlQmxvYlN0b3JhZ2UuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmls
ZVJlZiA9IEU0OUQ0MEQ2MUFEM0ZCMTcwMDY2QjdCOSAvKiBOZXR3b3JrQ2FjaGVCbG9iU3RvcmFn
ZS5oICovOyB9OworCQlFNDlENDBEOTFBRDNGQjIxMDA2NkI3QjkgLyogTmV0d29ya0NhY2hlQmxv
YlN0b3JhZ2UuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVm
ID0gRTQ5RDQwRDgxQUQzRkIyMTAwNjZCN0I5IC8qIE5ldHdvcmtDYWNoZUJsb2JTdG9yYWdlLmNw
cCAqLzsgfTsKIAkJRUQ4MkE3RjIxMjhDNkZBRjAwNDQ3N0IzIC8qIFdLQnVuZGxlUGFnZU92ZXJs
YXkuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBMjJG
MEZGMTI4OUZDRDkwMDg1RTc0RiAvKiBXS0J1bmRsZVBhZ2VPdmVybGF5LmggKi87IHNldHRpbmdz
ID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsKIAkJRURDQTcxQjcxMjhEREE4QzAw
MjAxQjI2IC8qIFdLQnVuZGxlUGFnZU92ZXJsYXkuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0g
UEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUEyMkYxMDAxMjg5RkNEOTAwODVFNzRGIC8qIFdLQnVu
ZGxlUGFnZU92ZXJsYXkuY3BwICovOyB9OwogCQlGMDM2OTc4ODE1RjRCRjA1MDBDM0E4MEUgLyog
V2ViQ29sb3JQaWNrZXIuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBm
aWxlUmVmID0gRjAzNjk3ODcxNUY0QkYwNTAwQzNBODBFIC8qIFdlYkNvbG9yUGlja2VyLmNwcCAq
LzsgfTsKQEAgLTQwNTUsNiArNDA1Nyw4IEBACiAJCUU0ODlEMjg3MUEwQTJEQjgwMDc4QzA2QSAv
KiBOZXR3b3JrQ2FjaGVEZWNvZGVyLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmls
ZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9
IE5ldHdvcmtDYWNoZURlY29kZXIuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJRTQ4
OUQyODgxQTBBMkRCODAwNzhDMDZBIC8qIE5ldHdvcmtDYWNoZUVuY29kZXIuY3BwICovID0ge2lz
YSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBl
ID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gTmV0d29ya0NhY2hlRW5jb2Rlci5jcHA7IHNv
dXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUU0ODlEMjg5MUEwQTJEQjgwMDc4QzA2QSAvKiBO
ZXR3b3JrQ2FjaGVFbmNvZGVyLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVu
Y29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IE5l
dHdvcmtDYWNoZUVuY29kZXIuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRTQ5RDQw
RDYxQUQzRkIxNzAwNjZCN0I5IC8qIE5ldHdvcmtDYWNoZUJsb2JTdG9yYWdlLmggKi8gPSB7aXNh
ID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUg
PSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IE5ldHdvcmtDYWNoZUJsb2JTdG9yYWdlLmg7IHNvdXJj
ZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUU0OUQ0MEQ4MUFEM0ZCMjEwMDY2QjdCOSAvKiBOZXR3
b3JrQ2FjaGVCbG9iU3RvcmFnZS5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmls
ZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBh
dGggPSBOZXR3b3JrQ2FjaGVCbG9iU3RvcmFnZS5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7
IH07CiAJCUYwMzY5Nzg3MTVGNEJGMDUwMEMzQTgwRSAvKiBXZWJDb2xvclBpY2tlci5jcHAgKi8g
PSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmls
ZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBXZWJDb2xvclBpY2tlci5jcHA7IHNv
dXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUY2MTEzRTI0MTI2Q0UxODIwMDU3RDBBNyAvKiBB
UElVc2VyQ29udGVudFVSTFBhdHRlcm4uaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBm
aWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRo
ID0gQVBJVXNlckNvbnRlbnRVUkxQYXR0ZXJuLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07
CiAJCUY2MTEzRTI2MTI2Q0UxOUIwMDU3RDBBNyAvKiBXS1VzZXJDb250ZW50VVJMUGF0dGVybi5j
cHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtu
b3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBXS1VzZXJDb250ZW50VVJM
UGF0dGVybi5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CkBAIC03NDkyLDYgKzc0OTYs
OCBAQAogCQlFNDg5RDI4MjFBMEEyQkU4MDA3OEMwNkEgLyogY2FjaGUgKi8gPSB7CiAJCQlpc2Eg
PSBQQlhHcm91cDsKIAkJCWNoaWxkcmVuID0gKAorCQkJCUU0OUQ0MEQ4MUFEM0ZCMjEwMDY2QjdC
OSAvKiBOZXR3b3JrQ2FjaGVCbG9iU3RvcmFnZS5jcHAgKi8sCisJCQkJRTQ5RDQwRDYxQUQzRkIx
NzAwNjZCN0I5IC8qIE5ldHdvcmtDYWNoZUJsb2JTdG9yYWdlLmggKi8sCiAJCQkJRTQ0MzZFQkUx
QTBDRkRCMjAwRUFEMjA0IC8qIE5ldHdvcmtDYWNoZS5jcHAgKi8sCiAJCQkJRTQ0MzZFQkYxQTBD
RkRCMjAwRUFEMjA0IC8qIE5ldHdvcmtDYWNoZS5oICovLAogCQkJCUU0ODlEMjgzMUEwQTJEQjgw
MDc4QzA2QSAvKiBOZXR3b3JrQ2FjaGVDb2Rlci5oICovLApAQCAtODE0Miw2ICs4MTQ4LDcgQEAK
IAkJCQkxQUFGMDhBMjE5MjY4MUQxMDBCNjM5MEMgLyogV2ViVXNlckNvbnRlbnRDb250cm9sbGVy
UHJveHkuaCBpbiBIZWFkZXJzICovLAogCQkJCTdDMzYxRDc5MTkyODAzQkQwMDM2QTU5RCAvKiBX
ZWJVc2VyQ29udGVudENvbnRyb2xsZXJQcm94eU1lc3NhZ2VzLmggaW4gSGVhZGVycyAqLywKIAkJ
CQkzRjg4OUQxNTE4ODc3OEM5MDBGRUFEQUYgLyogV2ViVmlkZW9GdWxsc2NyZWVuTWFuYWdlclBy
b3h5LmggaW4gSGVhZGVycyAqLywKKwkJCQlFNDlENDBENzFBRDNGQjE3MDA2NkI3QjkgLyogTmV0
d29ya0NhY2hlQmxvYlN0b3JhZ2UuaCBpbiBIZWFkZXJzICovLAogCQkJCTI5Q0Q1NUFBMTI4RTI5
NEYwMDEzM0M4NSAvKiBXS0FjY2Vzc2liaWxpdHlXZWJQYWdlT2JqZWN0QmFzZS5oIGluIEhlYWRl
cnMgKi8sCiAJCQkJMjkyMzJERjQxOEIyOUQ2ODAwRDA1OTZGIC8qIFdLQWNjZXNzaWJpbGl0eVdl
YlBhZ2VPYmplY3RNYWMuaCBpbiBIZWFkZXJzICovLAogCQkJCTJEMDczMEEzMTlGOUM3REEwMEU5
RDlDNCAvKiBXS0FjdGlvbk1lbnVDb250cm9sbGVyLmggaW4gSGVhZGVycyAqLywKQEAgLTk1MDUs
NiArOTUxMiw3IEBACiAJCQkJQ0Q2N0QzMEUxNUMwOEY5QTAwODQzQURGIC8qIEluamVjdGVkQnVu
ZGxlUGFnZURpYWdub3N0aWNMb2dnaW5nQ2xpZW50LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCUUx
RUU1M0U3MTFGOENGRkIwMENDQkVFNCAvKiBJbmplY3RlZEJ1bmRsZVBhZ2VFZGl0b3JDbGllbnQu
Y3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJQkMxNEUxMDkxMjBCOTA1RTAwODI2QzBDIC8qIEluamVj
dGVkQnVuZGxlUGFnZUZvcm1DbGllbnQuY3BwIGluIFNvdXJjZXMgKi8sCisJCQkJRTQ5RDQwRDkx
QUQzRkIyMTAwNjZCN0I5IC8qIE5ldHdvcmtDYWNoZUJsb2JTdG9yYWdlLmNwcCBpbiBTb3VyY2Vz
ICovLAogCQkJCUNENUM2NkEwMTM0QjlEMzgwMDRGRTJBOCAvKiBJbmplY3RlZEJ1bmRsZVBhZ2VG
dWxsU2NyZWVuQ2xpZW50LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCUJDQThDNkE4MTFFM0JBNUYw
MDgxMkZCNyAvKiBJbmplY3RlZEJ1bmRsZVBhZ2VMb2FkZXJDbGllbnQuY3BwIGluIFNvdXJjZXMg
Ki8sCiAJCQkJQkM4MTQ3QUExMkY2NENEQTAwN0IyQzMyIC8qIEluamVjdGVkQnVuZGxlUGFnZVBv
bGljeUNsaWVudC5jcHAgaW4gU291cmNlcyAqLywK
</data>
<flag name="review"
          id="275422"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>250706</attachid>
            <date>2015-04-14 07:55:32 -0700</date>
            <delta_ts>2015-04-14 11:41:28 -0700</delta_ts>
            <desc>applied comments</desc>
            <filename>disk-cache-deduplication-10.patch</filename>
            <type>text/plain</type>
            <size>58455</size>
            <attacher name="Antti Koivisto">koivisto</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJLaXQyL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
S2l0Mi9DaGFuZ2VMb2cJKHJldmlzaW9uIDE4MjczMykKKysrIFNvdXJjZS9XZWJLaXQyL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDE1MyBAQAorMjAxNS0wNC0xNCAgQW50dGkg
S29pdmlzdG8gIDxhbnR0aUBhcHBsZS5jb20+CisKKyAgICAgICAgTmV0d29yayBDYWNoZTogRGVk
dXBsaWNhdGUgYm9keSBkYXRhCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3df
YnVnLmNnaT9pZD0xNDM2NTIKKworICAgICAgICBSZXZpZXdlZCBieSBEYXJpbiBBZGxlci4KKwor
ICAgICAgICBJdCBpcyBjb21tb24gdG8gaGF2ZSBjYWNoZSBlbnRyaWVzIHdpdGggaWRlbnRpY2Fs
IGJvZHkgZGF0YS4gVGhpcyBoYXBwZW5zIHdoZW4gdGhlIHNhbWUgcmVzb3VyY2UgaXMgbG9hZGVk
IGZyb20KKyAgICAgICAgYSBkaWZmZXJlbnQgVVJMIChodHRwcyB2cyBodHRwLCBzbGFzaCB2cyBu
by1zbGFzaCBhdCBlbmQsIGV0Yy4pLiBJdCBhbHNvIGhhcHBlbnMgd2hlbiB0aGUgc2FtZSBVUkwg
aXMKKyAgICAgICAgcmVmZXJlbmNlZCBmcm9tIGRpZmZlcmVudCBjYWNoZSBwYXJ0aXRpb25zLgor
CisgICAgICAgIFdlIGNhbiBpbXByb3ZlIGRpc2sgc3BhY2UgZWZmaWNpZW5jeSBhbmQgdXNlIGxl
c3MgbWVtb3J5IGJ5IHNoYXJpbmcgaWRlbnRpY2FsIGJvZHkgZGF0YSBiZXR3ZWVuIGNhY2hlIGVu
dHJpZXMuCisKKyAgICAgICAgVGhpcyBwYXRjaCBzcGxpdHMgdGhlIGJvZHkgZGF0YSBvdXQgZnJv
bSB0aGUgcmVjb3JkIGZpbGUuIFRoZSBuZXcgcmVjb3JkIGZpbGUgY29udGFpbnMgbWV0YSBkYXRh
IGFuZCByZXNwb25zZQorICAgICAgICBoZWFkZXJzIG9ubHkuIEJvZHkgZGF0YSBpcyBzdG9yZWQg
dXNpbmcgdGhlIG5ldyBCbG9iU3RvcmFnZSBpbnRlcmZhY2UuIEZpbGVzIGFyZSBkZWR1cGxpY2F0
ZWQgYnkgY29tcHV0aW5nCisgICAgICAgIFNIQTEgaGFzaCBvdmVyIHRoZSBkYXRhIGFuZCBsb29r
aW5nIGZvciBhbiBleGlzdGluZyBibG9iIHdpdGggdGhlIHNhbWUgaGFzaC4gSWYgZm91bmQgdGhl
IGV4aXN0aW5nIGVudHJ5CisgICAgICAgIGlzIHJldXNlZCBieSBjcmVhdGluZyBhIGhhcmQgbGlu
ayB0byBpdC4KKworICAgICAgICBUaGUgbmV3IGRpc2sgc3RydWN0dXJlIGxvb2tzIGxpa2UgdGhp
czoKKworICAgICAgICBXZWJLaXRDYWNoZS8KKyAgICAgICAgICAgIFZlcnNpb24gMy8KKyAgICAg
ICAgICAgICAgICBCbG9icy8KKyAgICAgICAgICAgICAgICAgICAgMEEzQzlBOTcwQURBMjdGQUU5
QkQ3QkM2MzBCQUQwQjkyOUMyOTNDMAorICAgICAgICAgICAgICAgICAgICAwQTZCODA2MEJBNzdE
RjkyQzgyQTJGRDdBRjU4Rjc5NTI0RDhGMzRDCisgICAgICAgICAgICAgICAgICAgIC4uLgorICAg
ICAgICAgICAgICAgIFJlY29yZHMvCisgICAgICAgICAgICAgICAgICAgIGFwcGxlLmNvbS8KKyAg
ICAgICAgICAgICAgICAgICAgICAgIDBCODY0NUIwNEU3RUM3OEMxNzhCNzQ2MDA1MjYwMUMyCisg
ICAgICAgICAgICAgICAgICAgICAgICAwQjg2NDVCMDRFN0VDNzhDMTc4Qjc0NjAwNTI2MDFDMi1i
b2R5CisgICAgICAgICAgICAgICAgICAgICAgICAwQ0IxQTM2MzhEMUM1QTA5QzVFMzI4M0E3NEZB
MDQwQgorICAgICAgICAgICAgICAgICAgICAgICAgMENCMUEzNjM4RDFDNUEwOUM1RTMyODNBNzRG
QTA0MEItYm9keQorICAgICAgICAgICAgICAgICAgICAgICAgLi4uCisKKyAgICAgICAgRWFjaCBy
ZWNvcmQgZmlsZSBoYXMgYW4gYXNzb2NpYXRlZCAtYm9keSB3aGljaCBpcyBhIGhhcmQgbGluayB0
byBhIGZpbGUgaW4gdGhlIEJsb2JzIGRpcmVjdG9yeS4KKworICAgICAgICBUaGUgcGF0Y2ggaW5j
cmVhc2VzIGVmZmVjdGl2ZSBjYXBhY2l0eSBieSAxMC0yMCUgd2l0aCBhIHR5cGljYWwgY2FjaGUu
IEl0IGFsc28gc2F2ZXMgbWVtb3J5IGVzcGVjaWFsbHkgd2hlbiBpZGVudGljYWwKKyAgICAgICAg
cmVzb3VyY2VzIGFyZSB1c2VkIGluIG11bHRpcGxlIHRhYnMuCisKKyAgICAgICAgQ3VycmVudGx5
IGFsbCA+MCBzaXplZCByZXNvdXJjZXMgYXJlIHN0b3JlZCBhcyBzaGFyZWQgYmxvYnMuIEluIGZ1
dHVyZSBzbWFsbCByZXNvdXJjZXMgc2hvdWxkIGJlIGludGVncmF0ZWQgaW50byByZWNvcmQKKyAg
ICAgICAgZmlsZXMgYW5kIGJsb2JzIHVzZWQgZm9yIGxhcmdlciBmaWxlcyBvbmx5LgorCisgICAg
ICAgICogTmV0d29ya1Byb2Nlc3MvY2FjaGUvTmV0d29ya0NhY2hlLmNwcDoKKyAgICAgICAgKFdl
YktpdDo6TmV0d29ya0NhY2hlOjpDYWNoZTo6c3RvcmUpOgorICAgICAgICAoV2ViS2l0OjpOZXR3
b3JrQ2FjaGU6OkNhY2hlOjp1cGRhdGUpOgorCisgICAgICAgICAgICBBZG9wdCB0aGUgbmV3IHN0
b3JhZ2UgaW50ZXJmYWNlLgorCisgICAgICAgIChXZWJLaXQ6Ok5ldHdvcmtDYWNoZTo6Q2FjaGU6
OmR1bXBDb250ZW50c1RvRmlsZSk6CisgICAgICAgICogTmV0d29ya1Byb2Nlc3MvY2FjaGUvTmV0
d29ya0NhY2hlQmxvYlN0b3JhZ2UuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYktpdDo6TmV0d29y
a0NhY2hlOjpCbG9iU3RvcmFnZTo6QmxvYlN0b3JhZ2UpOgorICAgICAgICAoV2ViS2l0OjpOZXR3
b3JrQ2FjaGU6OkJsb2JTdG9yYWdlOjpzeW5jaHJvbml6ZSk6CisKKyAgICAgICAgICAgIENvbXB1
dGUgc2l6ZSBhbmQgZGVsZXRlIHVudXNlZCBmaWxlcyBmcm9tIHRoZSBCbG9icyBkaXJlY3Rvcnkg
KGxpbmsgY291bnQgPT0gMSkuCisKKyAgICAgICAgKFdlYktpdDo6TmV0d29ya0NhY2hlOjpCbG9i
U3RvcmFnZTo6YmxvYlBhdGgpOgorICAgICAgICAoV2ViS2l0OjpOZXR3b3JrQ2FjaGU6OkJsb2JT
dG9yYWdlOjphZGQpOgorICAgICAgICAoV2ViS2l0OjpOZXR3b3JrQ2FjaGU6OkJsb2JTdG9yYWdl
OjpnZXQpOgorCisgICAgICAgICAgICBJbnRlcmZhY2UgZm9yIHN0b3JpbmcgYW5kIHJldHJpZXZp
bmcgZGF0YSBibG9icy4gQmxvYnMgYXJlIGRlZHVwbGljYXRlZCBvbiBhZGQuCisKKyAgICAgICAg
KFdlYktpdDo6TmV0d29ya0NhY2hlOjpCbG9iU3RvcmFnZTo6cmVtb3ZlKToKKworICAgICAgICAg
ICAgUmVtb3ZlcyB0aGUgbGluayBidXQgZG9lc24ndCByZW1vdmUgdGhlIGJsb2IgZXZlbiBpZiB0
aGVyZSBhcmUgbm8gb3RoZXIgY2xpZW50cy4gVGhhdCBoYXBwZW5zIG9uIG5leHQgc3luY2hyb25p
emUoKS4KKworICAgICAgICAoV2ViS2l0OjpOZXR3b3JrQ2FjaGU6OkJsb2JTdG9yYWdlOjpzaGFy
ZUNvdW50KToKKworICAgICAgICAgICAgQ2hlY2tzIHRoZSBsaW5rIGNvdW50IHRvIGdldCB0aGUg
bnVtYmVyIG9mIGNsaWVudHMuCisKKyAgICAgICAgKiBOZXR3b3JrUHJvY2Vzcy9jYWNoZS9OZXR3
b3JrQ2FjaGVCbG9iU3RvcmFnZS5oOiBBZGRlZC4KKyAgICAgICAgKFdlYktpdDo6TmV0d29ya0Nh
Y2hlOjpCbG9iU3RvcmFnZTo6YXBwcm94aW1hdGVTaXplKToKKyAgICAgICAgKiBOZXR3b3JrUHJv
Y2Vzcy9jYWNoZS9OZXR3b3JrQ2FjaGVDb2RlcnMuY3BwOgorICAgICAgICAoV2ViS2l0OjpOZXR3
b3JrQ2FjaGU6OkNvZGVyPFNIQTE6OkRpZ2VzdD46OmVuY29kZSk6CisgICAgICAgIChXZWJLaXQ6
Ok5ldHdvcmtDYWNoZTo6Q29kZXI8U0hBMTo6RGlnZXN0Pjo6ZGVjb2RlKToKKyAgICAgICAgKiBO
ZXR3b3JrUHJvY2Vzcy9jYWNoZS9OZXR3b3JrQ2FjaGVDb2RlcnMuaDoKKyAgICAgICAgKiBOZXR3
b3JrUHJvY2Vzcy9jYWNoZS9OZXR3b3JrQ2FjaGVEYXRhLmg6CisgICAgICAgIChXZWJLaXQ6Ok5l
dHdvcmtDYWNoZTo6RGF0YTo6aXNFbXB0eSk6CisgICAgICAgICogTmV0d29ya1Byb2Nlc3MvY2Fj
aGUvTmV0d29ya0NhY2hlRGF0YUNvY29hLm1tOgorICAgICAgICAoV2ViS2l0OjpOZXR3b3JrQ2Fj
aGU6OkRhdGE6OmVtcHR5KToKKyAgICAgICAgKFdlYktpdDo6TmV0d29ya0NhY2hlOjpEYXRhOjpm
cm9tTWFwKToKKyAgICAgICAgKFdlYktpdDo6TmV0d29ya0NhY2hlOjptYXBGaWxlKToKKyAgICAg
ICAgKFdlYktpdDo6TmV0d29ya0NhY2hlOjpjb21wdXRlU0hBMSk6CisgICAgICAgIChXZWJLaXQ6
Ok5ldHdvcmtDYWNoZTo6Ynl0ZXNFcXVhbCk6CisKKyAgICAgICAgICAgIEFkZCBzb21lIGhlbHBl
cnMuCisKKyAgICAgICAgKiBOZXR3b3JrUHJvY2Vzcy9jYWNoZS9OZXR3b3JrQ2FjaGVFbnRyeS5j
cHA6CisgICAgICAgIChXZWJLaXQ6Ok5ldHdvcmtDYWNoZTo6RW50cnk6OmFzSlNPTik6CisgICAg
ICAgICogTmV0d29ya1Byb2Nlc3MvY2FjaGUvTmV0d29ya0NhY2hlSU9DaGFubmVsQ29jb2EubW06
CisgICAgICAgIChXZWJLaXQ6Ok5ldHdvcmtDYWNoZTo6SU9DaGFubmVsOjpJT0NoYW5uZWwpOgor
ICAgICAgICAqIE5ldHdvcmtQcm9jZXNzL2NhY2hlL05ldHdvcmtDYWNoZVN0b3JhZ2UuY3BwOgor
ICAgICAgICAoV2ViS2l0OjpOZXR3b3JrQ2FjaGU6Om1ha2VSZWNvcmREaXJlY3RvcnlQYXRoKToK
KyAgICAgICAgKFdlYktpdDo6TmV0d29ya0NhY2hlOjptYWtlQmxvYkRpcmVjdG9yeVBhdGgpOgor
ICAgICAgICAoV2ViS2l0OjpOZXR3b3JrQ2FjaGU6OlN0b3JhZ2U6OlN0b3JhZ2UpOgorICAgICAg
ICAoV2ViS2l0OjpOZXR3b3JrQ2FjaGU6OlN0b3JhZ2U6OmFwcHJveGltYXRlU2l6ZSk6CisgICAg
ICAgIChXZWJLaXQ6Ok5ldHdvcmtDYWNoZTo6U3RvcmFnZTo6c3luY2hyb25pemUpOgorICAgICAg
ICAoV2ViS2l0OjpOZXR3b3JrQ2FjaGU6OnBhcnRpdGlvblBhdGhGb3JLZXkpOgorICAgICAgICAo
V2ViS2l0OjpOZXR3b3JrQ2FjaGU6OnJlY29yZFBhdGhGb3JLZXkpOgorICAgICAgICAoV2ViS2l0
OjpOZXR3b3JrQ2FjaGU6OmJvZHlQYXRoKToKKyAgICAgICAgKFdlYktpdDo6TmV0d29ya0NhY2hl
OjpkZWNvZGVSZWNvcmRNZXRhRGF0YSk6CisgICAgICAgIChXZWJLaXQ6Ok5ldHdvcmtDYWNoZTo6
ZGVjb2RlUmVjb3JkSGVhZGVyKToKKyAgICAgICAgKFdlYktpdDo6TmV0d29ya0NhY2hlOjpjcmVh
dGVSZWNvcmQpOgorICAgICAgICAoV2ViS2l0OjpOZXR3b3JrQ2FjaGU6OmVuY29kZVJlY29yZE1l
dGFEYXRhKToKKyAgICAgICAgKFdlYktpdDo6TmV0d29ya0NhY2hlOjplbmNvZGVSZWNvcmRIZWFk
ZXIpOgorICAgICAgICAoV2ViS2l0OjpOZXR3b3JrQ2FjaGU6OlN0b3JhZ2U6OnJlbW92ZSk6Cisg
ICAgICAgIChXZWJLaXQ6Ok5ldHdvcmtDYWNoZTo6U3RvcmFnZTo6dXBkYXRlRmlsZU1vZGlmaWNh
dGlvblRpbWUpOgorICAgICAgICAoV2ViS2l0OjpOZXR3b3JrQ2FjaGU6OlN0b3JhZ2U6OmRpc3Bh
dGNoUmVhZE9wZXJhdGlvbik6CisKKyAgICAgICAgICAgIFJlYWQgYm90aCB0aGUgYmxvYiBhbmQg
dGhlIHJlY29yZCBlbnRyeS4KKworICAgICAgICAoV2ViS2l0OjpOZXR3b3JrQ2FjaGU6OlN0b3Jh
Z2U6OmZpbmlzaFJlYWRPcGVyYXRpb24pOgorCisgICAgICAgICAgICBGYWN0b3IgdG8gYSBmdW5j
dGlvbi4KKworICAgICAgICAoV2ViS2l0OjpOZXR3b3JrQ2FjaGU6OlN0b3JhZ2U6OnN0b3JlKToK
KyAgICAgICAgKFdlYktpdDo6TmV0d29ya0NhY2hlOjpTdG9yYWdlOjp0cmF2ZXJzZSk6CisgICAg
ICAgIChXZWJLaXQ6Ok5ldHdvcmtDYWNoZTo6U3RvcmFnZTo6ZGlzcGF0Y2hQZW5kaW5nV3JpdGVP
cGVyYXRpb25zKToKKyAgICAgICAgKFdlYktpdDo6TmV0d29ya0NhY2hlOjpTdG9yYWdlOjpkaXNw
YXRjaFdyaXRlT3BlcmF0aW9uKToKKworICAgICAgICAgICAgV2UgZG9uJ3QgbmVlZCBzZXBhcmF0
ZSBmdWxsIHdyaXRlIGFuZCBoZWFkZXIgd3JpdGUgcGF0aHMgYW55bW9yZS4gRXZlcnl0aGluZyBp
cyB0cmVhdGVkCisgICAgICAgICAgICBhcyBhIGZ1bGwgd3JpdGUgYW5kIGRlZHVwbGljYXRpb24g
c3RvcHMgdXMgd3JpdGluZyB0aGUgYm9keSBhZ2Fpbi4KKworICAgICAgICAgICAgVGhpcyBzaW1w
bGlmaWVzIHRoZSBjb2RlIGFuZCBkYXRhIHN0cnVjdHVyZXMuCisKKyAgICAgICAgKFdlYktpdDo6
TmV0d29ya0NhY2hlOjpTdG9yYWdlOjpmaW5pc2hXcml0ZU9wZXJhdGlvbik6CisKKyAgICAgICAg
ICAgIEZhY3RvciB0byBhIGZ1bmN0aW9uLgorCisgICAgICAgIChXZWJLaXQ6Ok5ldHdvcmtDYWNo
ZTo6U3RvcmFnZTo6Y2xlYXIpOgorICAgICAgICAoV2ViS2l0OjpOZXR3b3JrQ2FjaGU6OmRlbGV0
aW9uUHJvYmFiaWxpdHkpOgorCisgICAgICAgICAgICBUYWtlIHRoZSBzaGFyaW5nIGNvdW50IGlu
dG8gYWNjb3VudCB3aGVuIGNvbXB1dGluZyBkZWxldGlvbiBwcm9iYWJpbGl0eS4KKyAgICAgICAg
ICAgIEl0IGlzIGxlc3MgdXNlZnVsIHRvIGRlbGV0ZSBhIHJlY29yZCB0aGF0IHNoYXJlcyBpdHMg
Ym9keSB3aXRoIG90aGVycyBhcyBkYXRhIHdvbid0IGdldCBkZWxldGVkLgorCisgICAgICAgIChX
ZWJLaXQ6Ok5ldHdvcmtDYWNoZTo6U3RvcmFnZTo6c2hyaW5rSWZOZWVkZWQpOgorICAgICAgICAo
V2ViS2l0OjpOZXR3b3JrQ2FjaGU6OlN0b3JhZ2U6OnNocmluayk6CisgICAgICAgIChXZWJLaXQ6
Ok5ldHdvcmtDYWNoZTo6U3RvcmFnZTo6ZGVsZXRlT2xkVmVyc2lvbnMpOgorICAgICAgICAoV2Vi
S2l0OjpOZXR3b3JrQ2FjaGU6OmRpcmVjdG9yeVBhdGhGb3JLZXkpOiBEZWxldGVkLgorICAgICAg
ICAoV2ViS2l0OjpOZXR3b3JrQ2FjaGU6OmZpbGVQYXRoRm9yS2V5KTogRGVsZXRlZC4KKyAgICAg
ICAgKFdlYktpdDo6TmV0d29ya0NhY2hlOjpvcGVuRmlsZUZvcktleSk6IERlbGV0ZWQuCisgICAg
ICAgIChXZWJLaXQ6Ok5ldHdvcmtDYWNoZTo6ZGVjb2RlUmVjb3JkKTogRGVsZXRlZC4KKyAgICAg
ICAgKFdlYktpdDo6TmV0d29ya0NhY2hlOjpTdG9yYWdlOjp1cGRhdGUpOiBEZWxldGVkLgorCisg
ICAgICAgICAgICBObyBuZWVkIGZvciBzZXBhcmF0ZSB1cGRhdGUgaW50ZXJmYWNlIGFueW1vcmUu
IFJlZ3VsYXIgc3RvcmUoKSBhdm9pZHMgdW5uZWNlc3NhcnkgYm9keSB3cml0ZS4KKworICAgICAg
ICAoV2ViS2l0OjpOZXR3b3JrQ2FjaGU6OlN0b3JhZ2U6OmRpc3BhdGNoRnVsbFdyaXRlT3BlcmF0
aW9uKTogRGVsZXRlZC4KKyAgICAgICAgKFdlYktpdDo6TmV0d29ya0NhY2hlOjpTdG9yYWdlOjpk
aXNwYXRjaEhlYWRlcldyaXRlT3BlcmF0aW9uKTogRGVsZXRlZC4KKyAgICAgICAgKiBOZXR3b3Jr
UHJvY2Vzcy9jYWNoZS9OZXR3b3JrQ2FjaGVTdG9yYWdlLmg6CisgICAgICAgICogV2ViS2l0Mi54
Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qOgorCiAyMDE1LTA0LTEyICBTdW5nbWFubiBDaG8gIDxz
dW5nbWFubi5jaG9AbmF2ZXJjb3JwLmNvbT4KIAogICAgICAgICBGaXggdHJpdmFsIHR5cG9zIHJl
bGF0ZWQgdG8gdGhlIHdvcmQgImNvb3JkaW5hdGUiLgpJbmRleDogU291cmNlL1dlYktpdDIvTmV0
d29ya1Byb2Nlc3MvY2FjaGUvTmV0d29ya0NhY2hlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
V2ViS2l0Mi9OZXR3b3JrUHJvY2Vzcy9jYWNoZS9OZXR3b3JrQ2FjaGUuY3BwCShyZXZpc2lvbiAx
ODI2ODcpCisrKyBTb3VyY2UvV2ViS2l0Mi9OZXR3b3JrUHJvY2Vzcy9jYWNoZS9OZXR3b3JrQ2Fj
aGUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zNzAsNyArMzcwLDcgQEAgdm9pZCBDYWNoZTo6c3Rv
cmUoY29uc3QgV2ViQ29yZTo6UmVzb3VyYwogCiAgICAgYXV0byByZWNvcmQgPSBjYWNoZUVudHJ5
LmVuY29kZUFzU3RvcmFnZVJlY29yZCgpOwogCi0gICAgbV9zdG9yYWdlLT5zdG9yZShyZWNvcmQs
IFtjb21wbGV0aW9uSGFuZGxlcl0oYm9vbCBzdWNjZXNzLCBjb25zdCBEYXRhJiBib2R5RGF0YSkg
eworICAgIG1fc3RvcmFnZS0+c3RvcmUocmVjb3JkLCBbY29tcGxldGlvbkhhbmRsZXJdKGNvbnN0
IERhdGEmIGJvZHlEYXRhKSB7CiAgICAgICAgIE1hcHBlZEJvZHkgbWFwcGVkQm9keTsKICNpZiBF
TkFCTEUoU0hBUkVBQkxFX1JFU09VUkNFKQogICAgICAgICBpZiAoYm9keURhdGEuaXNNYXAoKSkg
ewpAQCAtMzgxLDcgKzM4MSw3IEBAIHZvaWQgQ2FjaGU6OnN0b3JlKGNvbnN0IFdlYkNvcmU6OlJl
c291cmMKICAgICAgICAgfQogI2VuZGlmCiAgICAgICAgIGNvbXBsZXRpb25IYW5kbGVyKG1hcHBl
ZEJvZHkpOwotICAgICAgICBMT0coTmV0d29ya0NhY2hlLCAiKE5ldHdvcmtQcm9jZXNzKSBzdG9y
ZSBzdWNjZXNzPSVkIiwgc3VjY2Vzcyk7CisgICAgICAgIExPRyhOZXR3b3JrQ2FjaGUsICIoTmV0
d29ya1Byb2Nlc3MpIHN0b3JlZCIpOwogICAgIH0pOwogfQogCkBAIC0zOTYsOSArMzk2LDcgQEAg
dm9pZCBDYWNoZTo6dXBkYXRlKGNvbnN0IFdlYkNvcmU6OlJlc291cgogCiAgICAgYXV0byB1cGRh
dGVSZWNvcmQgPSB1cGRhdGVFbnRyeS5lbmNvZGVBc1N0b3JhZ2VSZWNvcmQoKTsKIAotICAgIG1f
c3RvcmFnZS0+dXBkYXRlKHVwZGF0ZVJlY29yZCwgZXhpc3RpbmdFbnRyeS5zb3VyY2VTdG9yYWdl
UmVjb3JkKCksIFtdKGJvb2wgc3VjY2VzcywgY29uc3QgRGF0YSYpIHsKLSAgICAgICAgTE9HKE5l
dHdvcmtDYWNoZSwgIihOZXR3b3JrUHJvY2VzcykgdXBkYXRlZCwgc3VjY2Vzcz0lZCIsIHN1Y2Nl
c3MpOwotICAgIH0pOworICAgIG1fc3RvcmFnZS0+c3RvcmUodXBkYXRlUmVjb3JkLCB7IH0pOwog
fQogCiB2b2lkIENhY2hlOjpyZW1vdmUoY29uc3QgS2V5JiBrZXkpCkBAIC00NDcsNyArNDQ1LDgg
QEAgdm9pZCBDYWNoZTo6ZHVtcENvbnRlbnRzVG9GaWxlKCkKICAgICAgICAgc2l6ZV90IGJvZHlT
aXplIHsgMCB9OwogICAgIH07CiAgICAgVG90YWxzIHRvdGFsczsKLSAgICBtX3N0b3JhZ2UtPnRy
YXZlcnNlKFN0b3JhZ2U6OlRyYXZlcnNlRmxhZzo6Q29tcHV0ZVdvcnRoLCBbZmQsIHRvdGFsc10o
Y29uc3QgU3RvcmFnZTo6UmVjb3JkKiByZWNvcmQsIGNvbnN0IFN0b3JhZ2U6OlJlY29yZEluZm8m
IGluZm8pIG11dGFibGUgeworICAgIGF1dG8gZmxhZ3MgPSBTdG9yYWdlOjpUcmF2ZXJzZUZsYWc6
OkNvbXB1dGVXb3J0aCB8IFN0b3JhZ2U6OlRyYXZlcnNlRmxhZzo6U2hhcmVDb3VudDsKKyAgICBt
X3N0b3JhZ2UtPnRyYXZlcnNlKGZsYWdzLCBbZmQsIHRvdGFsc10oY29uc3QgU3RvcmFnZTo6UmVj
b3JkKiByZWNvcmQsIGNvbnN0IFN0b3JhZ2U6OlJlY29yZEluZm8mIGluZm8pIG11dGFibGUgewog
ICAgICAgICBpZiAoIXJlY29yZCkgewogICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBlcGlsb2d1
ZTsKICAgICAgICAgICAgIGVwaWxvZ3VlLmFwcGVuZExpdGVyYWwoInt9XG5dLFxuIik7CkluZGV4
OiBTb3VyY2UvV2ViS2l0Mi9OZXR3b3JrUHJvY2Vzcy9jYWNoZS9OZXR3b3JrQ2FjaGVCbG9iU3Rv
cmFnZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdDIvTmV0d29ya1Byb2Nlc3MvY2Fj
aGUvTmV0d29ya0NhY2hlQmxvYlN0b3JhZ2UuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL1dl
YktpdDIvTmV0d29ya1Byb2Nlc3MvY2FjaGUvTmV0d29ya0NhY2hlQmxvYlN0b3JhZ2UuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTcxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBB
UyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJV
VE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
U1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVT
UworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
CisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNv
bmZpZy5oIgorI2luY2x1ZGUgIk5ldHdvcmtDYWNoZUJsb2JTdG9yYWdlLmgiCisKKyNpZiBFTkFC
TEUoTkVUV09SS19DQUNIRSkKKworI2luY2x1ZGUgIkxvZ2dpbmcuaCIKKyNpbmNsdWRlICJOZXR3
b3JrQ2FjaGVGaWxlU3lzdGVtUG9zaXguaCIKKyNpbmNsdWRlIDxXZWJDb3JlL0ZpbGVTeXN0ZW0u
aD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHd0Zi9SdW5Mb29wLmg+CisjaW5j
bHVkZSA8d3RmL1NIQTEuaD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9TdHJpbmdCdWlsZGVyLmg+CisK
K25hbWVzcGFjZSBXZWJLaXQgeworbmFtZXNwYWNlIE5ldHdvcmtDYWNoZSB7CisKK0Jsb2JTdG9y
YWdlOjpCbG9iU3RvcmFnZShjb25zdCBTdHJpbmcmIGJsb2JEaXJlY3RvcnlQYXRoKQorICAgIDog
bV9ibG9iRGlyZWN0b3J5UGF0aChibG9iRGlyZWN0b3J5UGF0aCkKK3sKK30KKworU3RyaW5nIEJs
b2JTdG9yYWdlOjpibG9iRGlyZWN0b3J5UGF0aCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fYmxv
YkRpcmVjdG9yeVBhdGguaXNvbGF0ZWRDb3B5KCk7Cit9CisKK3ZvaWQgQmxvYlN0b3JhZ2U6OnN5
bmNocm9uaXplKCkKK3sKKyAgICBBU1NFUlQoIVJ1bkxvb3A6OmlzTWFpbigpKTsKKworICAgIFdl
YkNvcmU6Om1ha2VBbGxEaXJlY3RvcmllcyhibG9iRGlyZWN0b3J5UGF0aCgpKTsKKworICAgIG1f
YXBwcm94aW1hdGVTaXplID0gMDsKKyAgICBhdXRvIGJsb2JEaXJlY3RvcnkgPSBibG9iRGlyZWN0
b3J5UGF0aCgpOworICAgIHRyYXZlcnNlRGlyZWN0b3J5KGJsb2JEaXJlY3RvcnksIERUX1JFRywg
W3RoaXMsICZibG9iRGlyZWN0b3J5XShjb25zdCBTdHJpbmcmIG5hbWUpIHsKKyAgICAgICAgYXV0
byBwYXRoID0gV2ViQ29yZTo6cGF0aEJ5QXBwZW5kaW5nQ29tcG9uZW50KGJsb2JEaXJlY3Rvcnks
IG5hbWUpOworICAgICAgICBhdXRvIGZpbGVQYXRoID0gV2ViQ29yZTo6ZmlsZVN5c3RlbVJlcHJl
c2VudGF0aW9uKHBhdGgpOworICAgICAgICBzdHJ1Y3Qgc3RhdCBzdGF0OworICAgICAgICA6OnN0
YXQoZmlsZVBhdGguZGF0YSgpLCAmc3RhdCk7CisgICAgICAgIC8vIE5vIGNsaWVudHMgbGVmdCBm
b3IgdGhpcyBibG9iLgorICAgICAgICBpZiAoc3RhdC5zdF9ubGluayA9PSAxKQorICAgICAgICAg
ICAgdW5saW5rKGZpbGVQYXRoLmRhdGEoKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1f
YXBwcm94aW1hdGVTaXplICs9IHN0YXQuc3Rfc2l6ZTsKKyAgICB9KTsKKworICAgIExPRyhOZXR3
b3JrQ2FjaGVTdG9yYWdlLCAiKE5ldHdvcmtQcm9jZXNzKSBibG9iIHN5bmNocm9uaXphdGlvbiBj
b21wbGV0ZWQgYXBwcm94aW1hdGVTaXplPSV6dSIsIGFwcHJveGltYXRlU2l6ZSgpKTsKK30KKwor
U3RyaW5nIEJsb2JTdG9yYWdlOjpibG9iUGF0aEZvckhhc2goY29uc3QgU0hBMTo6RGlnZXN0JiBo
YXNoKSBjb25zdAoreworICAgIGF1dG8gaGFzaEFzU3RyaW5nID0gU0hBMTo6aGV4RGlnZXN0KGhh
c2gpOworICAgIHJldHVybiBXZWJDb3JlOjpwYXRoQnlBcHBlbmRpbmdDb21wb25lbnQoYmxvYkRp
cmVjdG9yeVBhdGgoKSwgU3RyaW5nOjpmcm9tVVRGOChoYXNoQXNTdHJpbmcpKTsKK30KKworQmxv
YlN0b3JhZ2U6OkJsb2IgQmxvYlN0b3JhZ2U6OmFkZChjb25zdCBTdHJpbmcmIHBhdGgsIGNvbnN0
IERhdGEmIGRhdGEpCit7CisgICAgQVNTRVJUKCFSdW5Mb29wOjppc01haW4oKSk7CisKKyAgICBh
dXRvIGhhc2ggPSBjb21wdXRlU0hBMShkYXRhKTsKKyAgICBpZiAoZGF0YS5pc0VtcHR5KCkpCisg
ICAgICAgIHJldHVybiB7IGRhdGEsIGhhc2ggfTsKKworICAgIGF1dG8gYmxvYlBhdGggPSBXZWJD
b3JlOjpmaWxlU3lzdGVtUmVwcmVzZW50YXRpb24oYmxvYlBhdGhGb3JIYXNoKGhhc2gpKTsKKyAg
ICBhdXRvIGxpbmtQYXRoID0gV2ViQ29yZTo6ZmlsZVN5c3RlbVJlcHJlc2VudGF0aW9uKHBhdGgp
OworICAgIHVubGluayhsaW5rUGF0aC5kYXRhKCkpOworCisgICAgYm9vbCBibG9iRXhpc3RzID0g
YWNjZXNzKGJsb2JQYXRoLmRhdGEoKSwgRl9PSykgIT0gLTE7CisgICAgaWYgKGJsb2JFeGlzdHMp
IHsKKyAgICAgICAgYXV0byBleGlzdGluZ0RhdGEgPSBtYXBGaWxlKGJsb2JQYXRoLmRhdGEoKSk7
CisgICAgICAgIGlmIChieXRlc0VxdWFsKGV4aXN0aW5nRGF0YSwgZGF0YSkpIHsKKyAgICAgICAg
ICAgIGxpbmsoYmxvYlBhdGguZGF0YSgpLCBsaW5rUGF0aC5kYXRhKCkpOworICAgICAgICAgICAg
cmV0dXJuIHsgZXhpc3RpbmdEYXRhLCBoYXNoIH07CisgICAgICAgIH0KKyAgICAgICAgdW5saW5r
KGJsb2JQYXRoLmRhdGEoKSk7CisgICAgfQorCisgICAgaW50IGZkID0gb3BlbihibG9iUGF0aC5k
YXRhKCksIE9fQ1JFQVQgfCBPX0VYQ0wgfCBPX1JEV1IgLCBTX0lSVVNSIHwgU19JV1VTUik7Cisg
ICAgaWYgKGZkIDwgMCkKKyAgICAgICAgcmV0dXJuIHsgfTsKKworICAgIHNpemVfdCBzaXplID0g
ZGF0YS5zaXplKCk7CisgICAgaWYgKGZ0cnVuY2F0ZShmZCwgc2l6ZSkgPCAwKSB7CisgICAgICAg
IGNsb3NlKGZkKTsKKyAgICAgICAgcmV0dXJuIHsgfTsKKyAgICB9CisKKyAgICB2b2lkKiBtYXAg
PSBtbWFwKG51bGxwdHIsIHNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9TSEFSRUQs
IGZkLCAwKTsKKyAgICBjbG9zZShmZCk7CisKKyAgICBpZiAobWFwID09IE1BUF9GQUlMRUQpCisg
ICAgICAgIHJldHVybiB7IH07CisKKyAgICB1aW50OF90KiBtYXBEYXRhID0gc3RhdGljX2Nhc3Q8
dWludDhfdCo+KG1hcCk7CisgICAgZGF0YS5hcHBseShbJm1hcERhdGFdKGNvbnN0IHVpbnQ4X3Qq
IGJ5dGVzLCBzaXplX3QgYnl0ZXNTaXplKSB7CisgICAgICAgIG1lbWNweShtYXBEYXRhLCBieXRl
cywgYnl0ZXNTaXplKTsKKyAgICAgICAgbWFwRGF0YSArPSBieXRlc1NpemU7CisgICAgICAgIHJl
dHVybiB0cnVlOworICAgIH0pOworCisgICAgLy8gRHJvcCB0aGUgd3JpdGUgcGVybWlzc2lvbi4K
KyAgICBtcHJvdGVjdChtYXAsIHNpemUsIFBST1RfUkVBRCk7CisKKyAgICBhdXRvIG1hcHBlZERh
dGEgPSBEYXRhOjphZG9wdE1hcChtYXAsIHNpemUpOworCisgICAgbGluayhibG9iUGF0aC5kYXRh
KCksIGxpbmtQYXRoLmRhdGEoKSk7CisKKyAgICBtX2FwcHJveGltYXRlU2l6ZSArPSBzaXplOwor
CisgICAgcmV0dXJuIHsgbWFwcGVkRGF0YSwgaGFzaCB9OworfQorCitCbG9iU3RvcmFnZTo6Qmxv
YiBCbG9iU3RvcmFnZTo6Z2V0KGNvbnN0IFN0cmluZyYgcGF0aCkKK3sKKyAgICBBU1NFUlQoIVJ1
bkxvb3A6OmlzTWFpbigpKTsKKworICAgIGF1dG8gbGlua1BhdGggPSBXZWJDb3JlOjpmaWxlU3lz
dGVtUmVwcmVzZW50YXRpb24ocGF0aCk7CisgICAgYXV0byBkYXRhID0gbWFwRmlsZShsaW5rUGF0
aC5kYXRhKCkpOworCisgICAgcmV0dXJuIHsgZGF0YSwgY29tcHV0ZVNIQTEoZGF0YSkgfTsKK30K
Kwordm9pZCBCbG9iU3RvcmFnZTo6cmVtb3ZlKGNvbnN0IFN0cmluZyYgcGF0aCkKK3sKKyAgICBB
U1NFUlQoIVJ1bkxvb3A6OmlzTWFpbigpKTsKKworICAgIGF1dG8gbGlua1BhdGggPSBXZWJDb3Jl
OjpmaWxlU3lzdGVtUmVwcmVzZW50YXRpb24ocGF0aCk7CisgICAgdW5saW5rKGxpbmtQYXRoLmRh
dGEoKSk7Cit9CisKK3Vuc2lnbmVkIEJsb2JTdG9yYWdlOjpzaGFyZUNvdW50KGNvbnN0IFN0cmlu
ZyYgcGF0aCkKK3sKKyAgICBBU1NFUlQoIVJ1bkxvb3A6OmlzTWFpbigpKTsKKworICAgIGF1dG8g
bGlua1BhdGggPSBXZWJDb3JlOjpmaWxlU3lzdGVtUmVwcmVzZW50YXRpb24ocGF0aCk7CisgICAg
c3RydWN0IHN0YXQgc3RhdDsKKyAgICBpZiAoOjpzdGF0KGxpbmtQYXRoLmRhdGEoKSwgJnN0YXQp
IDwgMCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgLy8gTGluayBjb3VudCBpcyAyIGluIHRoZSBz
aW5nbGUgY2xpZW50IGNhc2UgKHRoZSBibG9iIGZpbGUgYW5kIGEgbGluaykuCisgICAgcmV0dXJu
IHN0YXQuc3RfbmxpbmsgLSAxOworfQorCit9Cit9CisKKyNlbmRpZgpJbmRleDogU291cmNlL1dl
YktpdDIvTmV0d29ya1Byb2Nlc3MvY2FjaGUvTmV0d29ya0NhY2hlQmxvYlN0b3JhZ2UuaAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9OZXR3b3JrUHJvY2Vzcy9jYWNoZS9OZXR3b3JrQ2Fj
aGVCbG9iU3RvcmFnZS5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL1dlYktpdDIvTmV0d29ya1By
b2Nlc3MvY2FjaGUvTmV0d29ya0NhY2hlQmxvYlN0b3JhZ2UuaAkod29ya2luZyBjb3B5KQpAQCAt
MCwwICsxLDc0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5Z
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxF
IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZ
LCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExP
U1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBOZXR3b3JrQ2FjaGVCbG9iU3RvcmFn
ZV9oCisjZGVmaW5lIE5ldHdvcmtDYWNoZUJsb2JTdG9yYWdlX2gKKworI2lmIEVOQUJMRShORVRX
T1JLX0NBQ0hFKQorCisjaW5jbHVkZSAiTmV0d29ya0NhY2hlRGF0YS5oIgorI2luY2x1ZGUgIk5l
dHdvcmtDYWNoZUtleS5oIgorI2luY2x1ZGUgPHd0Zi9TSEExLmg+CisKK25hbWVzcGFjZSBXZWJL
aXQgeworbmFtZXNwYWNlIE5ldHdvcmtDYWNoZSB7CisKKy8vIEJsb2JTdG9yYWdlIGRlZHVwbGlj
YXRlcyB0aGUgZGF0YSB1c2luZyBTSEExIGhhc2ggY29tcHV0ZWQgb3ZlciB0aGUgYmxvYiBieXRl
cy4KK2NsYXNzIEJsb2JTdG9yYWdlIHsKKyAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShCbG9iU3Rv
cmFnZSk7CitwdWJsaWM6CisgICAgQmxvYlN0b3JhZ2UoY29uc3QgU3RyaW5nJiBibG9iRGlyZWN0
b3J5UGF0aCk7CisKKyAgICBzdHJ1Y3QgQmxvYiB7CisgICAgICAgIERhdGEgZGF0YTsKKyAgICAg
ICAgU0hBMTo6RGlnZXN0IGhhc2g7CisgICAgfTsKKyAgICAvLyBUaGVzZSBhcmUgYWxsIHN5bmNo
cm9ub3VzIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgZnJvbSB0aGUgbWFpbiB0aHJlYWQuCisgICAg
QmxvYiBhZGQoY29uc3QgU3RyaW5nJiBwYXRoLCBjb25zdCBEYXRhJik7CisgICAgQmxvYiBnZXQo
Y29uc3QgU3RyaW5nJiBwYXRoKTsKKworICAgIC8vIEJsb2Igd29uJ3QgYmUgcmVtb3ZlZCB1bnRp
bCBzeW5jaHJvbml6YXRpb24uCisgICAgdm9pZCByZW1vdmUoY29uc3QgU3RyaW5nJiBwYXRoKTsK
KworICAgIHVuc2lnbmVkIHNoYXJlQ291bnQoY29uc3QgU3RyaW5nJiBwYXRoKTsKKworICAgIHNp
emVfdCBhcHByb3hpbWF0ZVNpemUoKSBjb25zdCB7IHJldHVybiBtX2FwcHJveGltYXRlU2l6ZTsg
fQorCisgICAgdm9pZCBzeW5jaHJvbml6ZSgpOworCitwcml2YXRlOgorICAgIFN0cmluZyBibG9i
RGlyZWN0b3J5UGF0aCgpIGNvbnN0OworICAgIFN0cmluZyBibG9iUGF0aEZvckhhc2goY29uc3Qg
U0hBMTo6RGlnZXN0JikgY29uc3Q7CisKKyAgICBjb25zdCBTdHJpbmcgbV9ibG9iRGlyZWN0b3J5
UGF0aDsKKworICAgIHN0ZDo6YXRvbWljPHNpemVfdD4gbV9hcHByb3hpbWF0ZVNpemUgeyAwIH07
Cit9OworCit9Cit9CisKKyNlbmRpZgorI2VuZGlmCkluZGV4OiBTb3VyY2UvV2ViS2l0Mi9OZXR3
b3JrUHJvY2Vzcy9jYWNoZS9OZXR3b3JrQ2FjaGVDb2RlcnMuY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9XZWJLaXQyL05ldHdvcmtQcm9jZXNzL2NhY2hlL05ldHdvcmtDYWNoZUNvZGVycy5jcHAJ
KHJldmlzaW9uIDE4MjY4NykKKysrIFNvdXJjZS9XZWJLaXQyL05ldHdvcmtQcm9jZXNzL2NhY2hl
L05ldHdvcmtDYWNoZUNvZGVycy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTE4NCw2ICsxODQsMTYg
QEAgYm9vbCBDb2RlcjxNRDU6OkRpZ2VzdD46OmRlY29kZShEZWNvZGVyJgogICAgIHJldHVybiBk
ZWNvZGVyLmRlY29kZUZpeGVkTGVuZ3RoRGF0YShkaWdlc3QuZGF0YSgpLCBzaXplb2YoZGlnZXN0
KSk7CiB9CiAKK3ZvaWQgQ29kZXI8U0hBMTo6RGlnZXN0Pjo6ZW5jb2RlKEVuY29kZXImIGVuY29k
ZXIsIGNvbnN0IFNIQTE6OkRpZ2VzdCYgZGlnZXN0KQoreworICAgIGVuY29kZXIuZW5jb2RlRml4
ZWRMZW5ndGhEYXRhKGRpZ2VzdC5kYXRhKCksIHNpemVvZihkaWdlc3QpKTsKK30KKworYm9vbCBD
b2RlcjxTSEExOjpEaWdlc3Q+OjpkZWNvZGUoRGVjb2RlciYgZGVjb2RlciwgU0hBMTo6RGlnZXN0
JiBkaWdlc3QpCit7CisgICAgcmV0dXJuIGRlY29kZXIuZGVjb2RlRml4ZWRMZW5ndGhEYXRhKGRp
Z2VzdC5kYXRhKCksIHNpemVvZihkaWdlc3QpKTsKK30KKwogfQogfQogCkluZGV4OiBTb3VyY2Uv
V2ViS2l0Mi9OZXR3b3JrUHJvY2Vzcy9jYWNoZS9OZXR3b3JrQ2FjaGVDb2RlcnMuaAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9OZXR3b3JrUHJvY2Vzcy9jYWNoZS9OZXR3b3JrQ2FjaGVD
b2RlcnMuaAkocmV2aXNpb24gMTgyNjg3KQorKysgU291cmNlL1dlYktpdDIvTmV0d29ya1Byb2Nl
c3MvY2FjaGUvTmV0d29ya0NhY2hlQ29kZXJzLmgJKHdvcmtpbmcgY29weSkKQEAgLTM2LDYgKzM2
LDcgQEAKICNpbmNsdWRlIDx3dGYvSGFzaE1hcC5oPgogI2luY2x1ZGUgPHd0Zi9IYXNoU2V0Lmg+
CiAjaW5jbHVkZSA8d3RmL01ENS5oPgorI2luY2x1ZGUgPHd0Zi9TSEExLmg+CiAjaW5jbHVkZSA8
d3RmL1ZlY3Rvci5oPgogCiBuYW1lc3BhY2UgV2ViS2l0IHsKQEAgLTI2Miw2ICsyNjMsMTEgQEAg
dGVtcGxhdGU8PiBzdHJ1Y3QgQ29kZXI8TUQ1OjpEaWdlc3Q+IHsKICAgICBzdGF0aWMgYm9vbCBk
ZWNvZGUoRGVjb2RlciYsIE1ENTo6RGlnZXN0Jik7CiB9OwogCit0ZW1wbGF0ZTw+IHN0cnVjdCBD
b2RlcjxTSEExOjpEaWdlc3Q+IHsKKyAgICBzdGF0aWMgdm9pZCBlbmNvZGUoRW5jb2RlciYsIGNv
bnN0IFNIQTE6OkRpZ2VzdCYpOworICAgIHN0YXRpYyBib29sIGRlY29kZShEZWNvZGVyJiwgU0hB
MTo6RGlnZXN0Jik7Cit9OworCiB9CiB9CiAjZW5kaWYKSW5kZXg6IFNvdXJjZS9XZWJLaXQyL05l
dHdvcmtQcm9jZXNzL2NhY2hlL05ldHdvcmtDYWNoZURhdGEuaAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3Vy
Y2UvV2ViS2l0Mi9OZXR3b3JrUHJvY2Vzcy9jYWNoZS9OZXR3b3JrQ2FjaGVEYXRhLmgJKHJldmlz
aW9uIDE4MjY4NykKKysrIFNvdXJjZS9XZWJLaXQyL05ldHdvcmtQcm9jZXNzL2NhY2hlL05ldHdv
cmtDYWNoZURhdGEuaAkod29ya2luZyBjb3B5KQpAQCAtMzAsNiArMzAsNyBAQAogCiAjaW5jbHVk
ZSA8ZnVuY3Rpb25hbD4KICNpbmNsdWRlIDx3dGYvRnVuY3Rpb25EaXNwYXRjaGVyLmg+CisjaW5j
bHVkZSA8d3RmL1NIQTEuaD4KICNpbmNsdWRlIDx3dGYvVGhyZWFkU2FmZVJlZkNvdW50ZWQuaD4K
ICNpbmNsdWRlIDx3dGYvdGV4dC9XVEZTdHJpbmcuaD4KIApAQCAtOTgsMTEgKzk5LDE1IEBAIHB1
YmxpYzoKICAgICBEYXRhKCkgeyB9CiAgICAgRGF0YShjb25zdCB1aW50OF90Kiwgc2l6ZV90KTsK
IAorICAgIHN0YXRpYyBEYXRhIGVtcHR5KCk7CisgICAgc3RhdGljIERhdGEgYWRvcHRNYXAodm9p
ZCogbWFwLCBzaXplX3QpOworCiAgICAgZW51bSBjbGFzcyBCYWNraW5nIHsgQnVmZmVyLCBNYXAg
fTsKICNpZiBQTEFURk9STShDT0NPQSkKICAgICBEYXRhKERpc3BhdGNoUHRyPGRpc3BhdGNoX2Rh
dGFfdD4sIEJhY2tpbmcgPSBCYWNraW5nOjpCdWZmZXIpOwogI2VuZGlmCiAgICAgYm9vbCBpc051
bGwoKSBjb25zdDsKKyAgICBib29sIGlzRW1wdHkoKSBjb25zdCB7IHJldHVybiAhbV9zaXplOyB9
CiAKICAgICBjb25zdCB1aW50OF90KiBkYXRhKCkgY29uc3Q7CiAgICAgc2l6ZV90IHNpemUoKSBj
b25zdCB7IHJldHVybiBtX3NpemU7IH0KQEAgLTEyNSw3ICsxMzAsMTAgQEAgcHJpdmF0ZToKIH07
CiAKIERhdGEgY29uY2F0ZW5hdGUoY29uc3QgRGF0YSYsIGNvbnN0IERhdGEmKTsKK2Jvb2wgYnl0
ZXNFcXVhbChjb25zdCBEYXRhJiwgY29uc3QgRGF0YSYpOwogRGF0YSBtYXBGaWxlKGludCBmZCwg
c2l6ZV90IG9mZnNldCwgc2l6ZV90KTsKK0RhdGEgbWFwRmlsZShjb25zdCBjaGFyKiBwYXRoKTsK
K1NIQTE6OkRpZ2VzdCBjb21wdXRlU0hBMShjb25zdCBEYXRhJik7CiAKIH0KIH0KSW5kZXg6IFNv
dXJjZS9XZWJLaXQyL05ldHdvcmtQcm9jZXNzL2NhY2hlL05ldHdvcmtDYWNoZURhdGFDb2NvYS5t
bQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9OZXR3b3JrUHJvY2Vzcy9jYWNoZS9OZXR3
b3JrQ2FjaGVEYXRhQ29jb2EubW0JKHJldmlzaW9uIDE4MjY4NykKKysrIFNvdXJjZS9XZWJLaXQy
L05ldHdvcmtQcm9jZXNzL2NhY2hlL05ldHdvcmtDYWNoZURhdGFDb2NvYS5tbQkod29ya2luZyBj
b3B5KQpAQCAtMzAsNiArMzAsNyBAQAogCiAjaW5jbHVkZSA8ZGlzcGF0Y2gvZGlzcGF0Y2guaD4K
ICNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiAKIG5hbWVzcGFj
ZSBXZWJLaXQgewogbmFtZXNwYWNlIE5ldHdvcmtDYWNoZSB7CkBAIC00Nyw2ICs0OCwxMSBAQCBE
YXRhOjpEYXRhKERpc3BhdGNoUHRyPGRpc3BhdGNoX2RhdGFfdD4gCiB7CiB9CiAKK0RhdGEgRGF0
YTo6ZW1wdHkoKQoreworICAgIHJldHVybiB7IERpc3BhdGNoUHRyPGRpc3BhdGNoX2RhdGFfdD4o
ZGlzcGF0Y2hfZGF0YV9lbXB0eSkgfTsKK30KKwogY29uc3QgdWludDhfdCogRGF0YTo6ZGF0YSgp
IGNvbnN0CiB7CiAgICAgaWYgKCFtX2RhdGEgJiYgbV9kaXNwYXRjaERhdGEpIHsKQEAgLTg3LDE3
ICs5Myw2NCBAQCBEYXRhIGNvbmNhdGVuYXRlKGNvbnN0IERhdGEmIGEsIGNvbnN0IERhCiAgICAg
cmV0dXJuIHsgYWRvcHREaXNwYXRjaChkaXNwYXRjaF9kYXRhX2NyZWF0ZV9jb25jYXQoYS5kaXNw
YXRjaERhdGEoKSwgYi5kaXNwYXRjaERhdGEoKSkpIH07CiB9CiAKLURhdGEgbWFwRmlsZShpbnQg
ZmQsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKQorRGF0YSBEYXRhOjphZG9wdE1hcCh2b2lk
KiBtYXAsIHNpemVfdCBzaXplKQogewotICAgIHZvaWQqIG1hcCA9IG1tYXAobnVsbHB0ciwgc2l6
ZSwgUFJPVF9SRUFELCBNQVBfUFJJVkFURSwgZmQsIG9mZnNldCk7Ci0gICAgaWYgKG1hcCA9PSBN
QVBfRkFJTEVEKQotICAgICAgICByZXR1cm4geyB9OworICAgIEFTU0VSVChtYXAgJiYgbWFwICE9
IE1BUF9GQUlMRUQpOwogICAgIGF1dG8gYm9keU1hcCA9IGFkb3B0RGlzcGF0Y2goZGlzcGF0Y2hf
ZGF0YV9jcmVhdGUobWFwLCBzaXplLCBkaXNwYXRjaF9nZXRfbWFpbl9xdWV1ZSgpLCBbbWFwLCBz
aXplXSB7CiAgICAgICAgIG11bm1hcChtYXAsIHNpemUpOwogICAgIH0pKTsKICAgICByZXR1cm4g
eyBib2R5TWFwLCBEYXRhOjpCYWNraW5nOjpNYXAgfTsKIH0KIAorRGF0YSBtYXBGaWxlKGludCBm
ZCwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpCit7CisgICAgaWYgKCFzaXplKQorICAgICAg
ICByZXR1cm4gRGF0YTo6ZW1wdHkoKTsKKworICAgIHZvaWQqIG1hcCA9IG1tYXAobnVsbHB0ciwg
c2l6ZSwgUFJPVF9SRUFELCBNQVBfUFJJVkFURSwgZmQsIG9mZnNldCk7CisgICAgaWYgKG1hcCA9
PSBNQVBfRkFJTEVEKQorICAgICAgICByZXR1cm4geyB9OworICAgIHJldHVybiBEYXRhOjphZG9w
dE1hcChtYXAsIHNpemUpOworfQorCitEYXRhIG1hcEZpbGUoY29uc3QgY2hhciogcGF0aCkKK3sK
KyAgICBpbnQgZmQgPSBvcGVuKHBhdGgsIE9fUkRPTkxZLCAwKTsKKyAgICBpZiAoZmQgPCAwKQor
ICAgICAgICByZXR1cm4geyB9OworICAgIHN0cnVjdCBzdGF0IHN0YXQ7CisgICAgaWYgKGZzdGF0
KGZkLCAmc3RhdCkgPCAwKSB7CisgICAgICAgIGNsb3NlKGZkKTsKKyAgICAgICAgcmV0dXJuIHsg
fTsKKyAgICB9CisgICAgc2l6ZV90IHNpemUgPSBzdGF0LnN0X3NpemU7CisgICAgYXV0byBkYXRh
ID0gbWFwRmlsZShmZCwgMCwgc2l6ZSk7CisgICAgY2xvc2UoZmQpOworCisgICAgcmV0dXJuIGRh
dGE7Cit9CisKK1NIQTE6OkRpZ2VzdCBjb21wdXRlU0hBMShjb25zdCBEYXRhJiBkYXRhKQorewor
ICAgIFNIQTEgc2hhMTsKKyAgICBkYXRhLmFwcGx5KFsmc2hhMV0oY29uc3QgdWludDhfdCogZGF0
YSwgc2l6ZV90IHNpemUpIHsKKyAgICAgICAgc2hhMS5hZGRCeXRlcyhkYXRhLCBzaXplKTsKKyAg
ICAgICAgcmV0dXJuIHRydWU7CisgICAgfSk7CisgICAgU0hBMTo6RGlnZXN0IGRpZ2VzdDsKKyAg
ICBzaGExLmNvbXB1dGVIYXNoKGRpZ2VzdCk7CisgICAgcmV0dXJuIGRpZ2VzdDsKK30KKworYm9v
bCBieXRlc0VxdWFsKGNvbnN0IERhdGEmIGEsIGNvbnN0IERhdGEmIGIpCit7CisgICAgaWYgKGEu
aXNOdWxsKCkgfHwgYi5pc051bGwoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChh
LnNpemUoKSAhPSBiLnNpemUoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiAh
bWVtY21wKGEuZGF0YSgpLCBiLmRhdGEoKSwgYS5zaXplKCkpOworfQorCiB9CiB9CiAKSW5kZXg6
IFNvdXJjZS9XZWJLaXQyL05ldHdvcmtQcm9jZXNzL2NhY2hlL05ldHdvcmtDYWNoZUVudHJ5LmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9OZXR3b3JrUHJvY2Vzcy9jYWNoZS9OZXR3
b3JrQ2FjaGVFbnRyeS5jcHAJKHJldmlzaW9uIDE4MjY4NykKKysrIFNvdXJjZS9XZWJLaXQyL05l
dHdvcmtQcm9jZXNzL2NhY2hlL05ldHdvcmtDYWNoZUVudHJ5LmNwcAkod29ya2luZyBjb3B5KQpA
QCAtMTY1LDYgKzE2NSwxMiBAQCB2b2lkIEVudHJ5Ojphc0pTT04oU3RyaW5nQnVpbGRlciYganNv
biwgCiAgICAganNvbi5hcHBlbmRMaXRlcmFsKCJcIlVSTFwiOiAiKTsKICAgICBKU0M6OmFwcGVu
ZFF1b3RlZEpTT05TdHJpbmdUb0J1aWxkZXIoanNvbiwgbV9yZXNwb25zZS51cmwoKS5zdHJpbmco
KSk7CiAgICAganNvbi5hcHBlbmRMaXRlcmFsKCIsXG4iKTsKKyAgICBqc29uLmFwcGVuZExpdGVy
YWwoIlwiYm9keUhhc2hcIjogIik7CisgICAgSlNDOjphcHBlbmRRdW90ZWRKU09OU3RyaW5nVG9C
dWlsZGVyKGpzb24sIGluZm8uYm9keUhhc2gpOworICAgIGpzb24uYXBwZW5kTGl0ZXJhbCgiLFxu
Iik7CisgICAganNvbi5hcHBlbmRMaXRlcmFsKCJcImJvZHlTaGFyZUNvdW50XCI6ICIpOworICAg
IGpzb24uYXBwZW5kTnVtYmVyKGluZm8uYm9keVNoYXJlQ291bnQpOworICAgIGpzb24uYXBwZW5k
TGl0ZXJhbCgiLFxuIik7CiAgICAganNvbi5hcHBlbmRMaXRlcmFsKCJcImhlYWRlcnNcIjoge1xu
Iik7CiAgICAgYm9vbCBmaXJzdEhlYWRlciA9IHRydWU7CiAgICAgZm9yIChhdXRvJiBoZWFkZXIg
OiBtX3Jlc3BvbnNlLmh0dHBIZWFkZXJGaWVsZHMoKSkgewpJbmRleDogU291cmNlL1dlYktpdDIv
TmV0d29ya1Byb2Nlc3MvY2FjaGUvTmV0d29ya0NhY2hlU3RvcmFnZS5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL1dlYktpdDIvTmV0d29ya1Byb2Nlc3MvY2FjaGUvTmV0d29ya0NhY2hlU3RvcmFn
ZS5jcHAJKHJldmlzaW9uIDE4MjY4NykKKysrIFNvdXJjZS9XZWJLaXQyL05ldHdvcmtQcm9jZXNz
L2NhY2hlL05ldHdvcmtDYWNoZVN0b3JhZ2UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00Myw2ICs0
Myw5IEBAIG5hbWVzcGFjZSBOZXR3b3JrQ2FjaGUgewogCiBzdGF0aWMgY29uc3QgY2hhciBuZXR3
b3JrQ2FjaGVTdWJkaXJlY3RvcnlbXSA9ICJXZWJLaXRDYWNoZSI7CiBzdGF0aWMgY29uc3QgY2hh
ciB2ZXJzaW9uRGlyZWN0b3J5UHJlZml4W10gPSAiVmVyc2lvbiAiOworc3RhdGljIGNvbnN0IGNo
YXIgcmVjb3Jkc0RpcmVjdG9yeU5hbWVbXSA9ICJSZWNvcmRzIjsKK3N0YXRpYyBjb25zdCBjaGFy
IGJsb2JzRGlyZWN0b3J5TmFtZVtdID0gIkJsb2JzIjsKK3N0YXRpYyBjb25zdCBjaGFyIGJvZHlQ
b3N0Zml4W10gPSAiLWJvZHkiOwogCiBzdGF0aWMgZG91YmxlIGNvbXB1dGVSZWNvcmRXb3J0aChG
aWxlVGltZXMpOwogCkBAIC02MiwxNyArNjUsMzMgQEAgc3RhdGljIFN0cmluZyBtYWtlVmVyc2lv
bmVkRGlyZWN0b3J5UGF0aAogICAgIHJldHVybiBXZWJDb3JlOjpwYXRoQnlBcHBlbmRpbmdDb21w
b25lbnQoYmFzZURpcmVjdG9yeVBhdGgsIHZlcnNpb25TdWJkaXJlY3RvcnkpOwogfQogCitzdGF0
aWMgU3RyaW5nIG1ha2VSZWNvcmREaXJlY3RvcnlQYXRoKGNvbnN0IFN0cmluZyYgYmFzZURpcmVj
dG9yeVBhdGgpCit7CisgICAgcmV0dXJuIFdlYkNvcmU6OnBhdGhCeUFwcGVuZGluZ0NvbXBvbmVu
dChtYWtlVmVyc2lvbmVkRGlyZWN0b3J5UGF0aChiYXNlRGlyZWN0b3J5UGF0aCksIHJlY29yZHNE
aXJlY3RvcnlOYW1lKTsKK30KKworc3RhdGljIFN0cmluZyBtYWtlQmxvYkRpcmVjdG9yeVBhdGgo
Y29uc3QgU3RyaW5nJiBiYXNlRGlyZWN0b3J5UGF0aCkKK3sKKyAgICByZXR1cm4gV2ViQ29yZTo6
cGF0aEJ5QXBwZW5kaW5nQ29tcG9uZW50KG1ha2VWZXJzaW9uZWREaXJlY3RvcnlQYXRoKGJhc2VE
aXJlY3RvcnlQYXRoKSwgYmxvYnNEaXJlY3RvcnlOYW1lKTsKK30KKwogU3RvcmFnZTo6U3RvcmFn
ZShjb25zdCBTdHJpbmcmIGJhc2VEaXJlY3RvcnlQYXRoKQogICAgIDogbV9iYXNlRGlyZWN0b3J5
UGF0aChiYXNlRGlyZWN0b3J5UGF0aCkKLSAgICAsIG1fZGlyZWN0b3J5UGF0aChtYWtlVmVyc2lv
bmVkRGlyZWN0b3J5UGF0aChiYXNlRGlyZWN0b3J5UGF0aCkpCisgICAgLCBtX2RpcmVjdG9yeVBh
dGgobWFrZVJlY29yZERpcmVjdG9yeVBhdGgoYmFzZURpcmVjdG9yeVBhdGgpKQogICAgICwgbV9p
b1F1ZXVlKFdvcmtRdWV1ZTo6Y3JlYXRlKCJjb20uYXBwbGUuV2ViS2l0LkNhY2hlLlN0b3JhZ2Ui
LCBXb3JrUXVldWU6OlR5cGU6OkNvbmN1cnJlbnQpKQogICAgICwgbV9iYWNrZ3JvdW5kSU9RdWV1
ZShXb3JrUXVldWU6OmNyZWF0ZSgiY29tLmFwcGxlLldlYktpdC5DYWNoZS5TdG9yYWdlLmJhY2tn
cm91bmQiLCBXb3JrUXVldWU6OlR5cGU6OkNvbmN1cnJlbnQsIFdvcmtRdWV1ZTo6UU9TOjpCYWNr
Z3JvdW5kKSkKICAgICAsIG1fc2VyaWFsQmFja2dyb3VuZElPUXVldWUoV29ya1F1ZXVlOjpjcmVh
dGUoImNvbS5hcHBsZS5XZWJLaXQuQ2FjaGUuU3RvcmFnZS5zZXJpYWxCYWNrZ3JvdW5kIiwgV29y
a1F1ZXVlOjpUeXBlOjpTZXJpYWwsIFdvcmtRdWV1ZTo6UU9TOjpCYWNrZ3JvdW5kKSkKKyAgICAs
IG1fYmxvYlN0b3JhZ2UobWFrZUJsb2JEaXJlY3RvcnlQYXRoKGJhc2VEaXJlY3RvcnlQYXRoKSkK
IHsKICAgICBkZWxldGVPbGRWZXJzaW9ucygpOwogICAgIHN5bmNocm9uaXplKCk7CiB9CiAKK3Np
emVfdCBTdG9yYWdlOjphcHByb3hpbWF0ZVNpemUoKSBjb25zdAoreworICAgIHJldHVybiBtX2Fw
cHJveGltYXRlU2l6ZSArIG1fYmxvYlN0b3JhZ2UuYXBwcm94aW1hdGVTaXplKCk7Cit9CisKIHZv
aWQgU3RvcmFnZTo6c3luY2hyb25pemUoKQogewogICAgIEFTU0VSVChSdW5Mb29wOjppc01haW4o
KSk7CkBAIC0xMTcsNyArMTM2LDkgQEAgdm9pZCBTdG9yYWdlOjpzeW5jaHJvbml6ZSgpCiAgICAg
ICAgICAgICBtX3N5bmNocm9uaXphdGlvbkluUHJvZ3Jlc3MgPSBmYWxzZTsKICAgICAgICAgfSk7
CiAKLSAgICAgICAgTE9HKE5ldHdvcmtDYWNoZVN0b3JhZ2UsICIoTmV0d29ya1Byb2Nlc3MpIGNh
Y2hlIHN5bmNocm9uaXphdGlvbiBjb21wbGV0ZWQgYXBwcm94aW1hdGVTaXplPSV6dSBjb3VudD0l
ZCIsIHNpemUsIGNvdW50KTsKKyAgICAgICAgbV9ibG9iU3RvcmFnZS5zeW5jaHJvbml6ZSgpOwor
CisgICAgICAgIExPRyhOZXR3b3JrQ2FjaGVTdG9yYWdlLCAiKE5ldHdvcmtQcm9jZXNzKSBjYWNo
ZSBzeW5jaHJvbml6YXRpb24gY29tcGxldGVkIHNpemU9JXp1IGNvdW50PSVkIiwgc2l6ZSwgY291
bnQpOwogICAgIH0pOwogfQogCkBAIC0xMzksNyArMTYwLDcgQEAgYm9vbCBTdG9yYWdlOjptYXlD
b250YWluKGNvbnN0IEtleSYga2V5KQogICAgIHJldHVybiAhbV9jb250ZW50c0ZpbHRlciB8fCBt
X2NvbnRlbnRzRmlsdGVyLT5tYXlDb250YWluKGtleS5oYXNoKCkpOwogfQogCi1zdGF0aWMgU3Ry
aW5nIGRpcmVjdG9yeVBhdGhGb3JLZXkoY29uc3QgS2V5JiBrZXksIGNvbnN0IFN0cmluZyYgY2Fj
aGVQYXRoKQorc3RhdGljIFN0cmluZyBwYXJ0aXRpb25QYXRoRm9yS2V5KGNvbnN0IEtleSYga2V5
LCBjb25zdCBTdHJpbmcmIGNhY2hlUGF0aCkKIHsKICAgICBBU1NFUlQoIWtleS5wYXJ0aXRpb24o
KS5pc0VtcHR5KCkpOwogICAgIHJldHVybiBXZWJDb3JlOjpwYXRoQnlBcHBlbmRpbmdDb21wb25l
bnQoY2FjaGVQYXRoLCBrZXkucGFydGl0aW9uKCkpOwpAQCAtMTUwLDE4ICsxNzEsMTkgQEAgc3Rh
dGljIFN0cmluZyBmaWxlTmFtZUZvcktleShjb25zdCBLZXkmIAogICAgIHJldHVybiBrZXkuaGFz
aEFzU3RyaW5nKCk7CiB9CiAKLXN0YXRpYyBTdHJpbmcgZmlsZVBhdGhGb3JLZXkoY29uc3QgS2V5
JiBrZXksIGNvbnN0IFN0cmluZyYgY2FjaGVQYXRoKQorc3RhdGljIFN0cmluZyByZWNvcmRQYXRo
Rm9yS2V5KGNvbnN0IEtleSYga2V5LCBjb25zdCBTdHJpbmcmIGNhY2hlUGF0aCkKIHsKLSAgICBy
ZXR1cm4gV2ViQ29yZTo6cGF0aEJ5QXBwZW5kaW5nQ29tcG9uZW50KGRpcmVjdG9yeVBhdGhGb3JL
ZXkoa2V5LCBjYWNoZVBhdGgpLCBmaWxlTmFtZUZvcktleShrZXkpKTsKKyAgICByZXR1cm4gV2Vi
Q29yZTo6cGF0aEJ5QXBwZW5kaW5nQ29tcG9uZW50KHBhcnRpdGlvblBhdGhGb3JLZXkoa2V5LCBj
YWNoZVBhdGgpLCBmaWxlTmFtZUZvcktleShrZXkpKTsKIH0KIAotc3RhdGljIFJlZjxJT0NoYW5u
ZWw+IG9wZW5GaWxlRm9yS2V5KGNvbnN0IEtleSYga2V5LCBJT0NoYW5uZWw6OlR5cGUgdHlwZSwg
Y29uc3QgU3RyaW5nJiBjYWNoZVBhdGgpCitzdGF0aWMgU3RyaW5nIGJvZHlQYXRoRm9yUmVjb3Jk
UGF0aChjb25zdCBTdHJpbmcmIHJlY29yZFBhdGgpCiB7Ci0gICAgYXV0byBkaXJlY3RvcnlQYXRo
ID0gZGlyZWN0b3J5UGF0aEZvcktleShrZXksIGNhY2hlUGF0aCk7Ci0gICAgYXV0byBmaWxlUGF0
aCA9IFdlYkNvcmU6OnBhdGhCeUFwcGVuZGluZ0NvbXBvbmVudChkaXJlY3RvcnlQYXRoLCBmaWxl
TmFtZUZvcktleShrZXkpKTsKLSAgICBpZiAodHlwZSA9PSBJT0NoYW5uZWw6OlR5cGU6OkNyZWF0
ZSkKLSAgICAgICAgV2ViQ29yZTo6bWFrZUFsbERpcmVjdG9yaWVzKGRpcmVjdG9yeVBhdGgpOwot
ICAgIHJldHVybiBJT0NoYW5uZWw6Om9wZW4oZmlsZVBhdGgsIHR5cGUpOworICAgIHJldHVybiBy
ZWNvcmRQYXRoICsgYm9keVBvc3RmaXg7Cit9CisKK3N0YXRpYyBTdHJpbmcgYm9keVBhdGhGb3JL
ZXkoY29uc3QgS2V5JiBrZXksIGNvbnN0IFN0cmluZyYgY2FjaGVQYXRoKQoreworICAgIHJldHVy
biBib2R5UGF0aEZvclJlY29yZFBhdGgocmVjb3JkUGF0aEZvcktleShrZXksIGNhY2hlUGF0aCkp
OwogfQogCiBzdGF0aWMgdW5zaWduZWQgaGFzaERhdGEoY29uc3QgRGF0YSYgZGF0YSkKQEAgLTE4
OCw4ICsyMTAsNyBAQCBzdHJ1Y3QgUmVjb3JkTWV0YURhdGEgewogICAgIHVuc2lnbmVkIGhlYWRl
ckNoZWNrc3VtOwogICAgIHVpbnQ2NF90IGhlYWRlck9mZnNldDsKICAgICB1aW50NjRfdCBoZWFk
ZXJTaXplOwotICAgIHVuc2lnbmVkIGJvZHlDaGVja3N1bTsKLSAgICB1aW50NjRfdCBib2R5T2Zm
c2V0OworICAgIFNIQTE6OkRpZ2VzdCBib2R5SGFzaDsKICAgICB1aW50NjRfdCBib2R5U2l6ZTsK
IH07CiAKQEAgLTIwOCwxNCArMjI5LDEzIEBAIHN0YXRpYyBib29sIGRlY29kZVJlY29yZE1ldGFE
YXRhKFJlY29yZE0KICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgaWYgKCFkZWNv
ZGVyLmRlY29kZShtZXRhRGF0YS5oZWFkZXJTaXplKSkKICAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKLSAgICAgICAgaWYgKCFkZWNvZGVyLmRlY29kZShtZXRhRGF0YS5ib2R5Q2hlY2tzdW0pKQor
ICAgICAgICBpZiAoIWRlY29kZXIuZGVjb2RlKG1ldGFEYXRhLmJvZHlIYXNoKSkKICAgICAgICAg
ICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgaWYgKCFkZWNvZGVyLmRlY29kZShtZXRhRGF0YS5i
b2R5U2l6ZSkpCiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIGlmICghZGVjb2Rl
ci52ZXJpZnlDaGVja3N1bSgpKQogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICBt
ZXRhRGF0YS5oZWFkZXJPZmZzZXQgPSBkZWNvZGVyLmN1cnJlbnRPZmZzZXQoKTsKLSAgICAgICAg
bWV0YURhdGEuYm9keU9mZnNldCA9IFdURjo6cm91bmRVcFRvTXVsdGlwbGVPZihwYWdlU2l6ZSgp
LCBtZXRhRGF0YS5oZWFkZXJPZmZzZXQgKyBtZXRhRGF0YS5oZWFkZXJTaXplKTsKICAgICAgICAg
c3VjY2VzcyA9IHRydWU7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9KTsKQEAgLTIzMywx
MCArMjUzLDYgQEAgc3RhdGljIGJvb2wgZGVjb2RlUmVjb3JkSGVhZGVyKGNvbnN0IERhdAogICAg
ICAgICBMT0coTmV0d29ya0NhY2hlU3RvcmFnZSwgIihOZXR3b3JrUHJvY2VzcykgdmVyc2lvbiBt
aXNtYXRjaCIpOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIGlmIChtZXRhRGF0
YS5oZWFkZXJPZmZzZXQgKyBtZXRhRGF0YS5oZWFkZXJTaXplID4gbWV0YURhdGEuYm9keU9mZnNl
dCkgewotICAgICAgICBMT0coTmV0d29ya0NhY2hlU3RvcmFnZSwgIihOZXR3b3JrUHJvY2Vzcykg
Ym9keSBvZmZzZXQgbWlzbWF0Y2giKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KIAog
ICAgIGF1dG8gaGVhZGVyRGF0YSA9IGZpbGVEYXRhLnN1YnJhbmdlKG1ldGFEYXRhLmhlYWRlck9m
ZnNldCwgbWV0YURhdGEuaGVhZGVyU2l6ZSk7CiAgICAgaWYgKG1ldGFEYXRhLmhlYWRlckNoZWNr
c3VtICE9IGhhc2hEYXRhKGhlYWRlckRhdGEpKSB7CkBAIC0yNDcsMTEgKzI2MywxMSBAQCBzdGF0
aWMgYm9vbCBkZWNvZGVSZWNvcmRIZWFkZXIoY29uc3QgRGF0CiAgICAgcmV0dXJuIHRydWU7CiB9
CiAKLXN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8U3RvcmFnZTo6UmVjb3JkPiBkZWNvZGVSZWNvcmQo
Y29uc3QgRGF0YSYgZmlsZURhdGEsIGludCBmZCwgY29uc3QgS2V5JiBrZXkpCitzdGF0aWMgc3Rk
Ojp1bmlxdWVfcHRyPFN0b3JhZ2U6OlJlY29yZD4gY3JlYXRlUmVjb3JkKGNvbnN0IERhdGEmIHJl
Y29yZERhdGEsIGNvbnN0IEJsb2JTdG9yYWdlOjpCbG9iJiBib2R5QmxvYiwgY29uc3QgS2V5JiBr
ZXkpCiB7CiAgICAgUmVjb3JkTWV0YURhdGEgbWV0YURhdGE7CiAgICAgRGF0YSBoZWFkZXJEYXRh
OwotICAgIGlmICghZGVjb2RlUmVjb3JkSGVhZGVyKGZpbGVEYXRhLCBtZXRhRGF0YSwgaGVhZGVy
RGF0YSkpCisgICAgaWYgKCFkZWNvZGVSZWNvcmRIZWFkZXIocmVjb3JkRGF0YSwgbWV0YURhdGEs
IGhlYWRlckRhdGEpKQogICAgICAgICByZXR1cm4gbnVsbHB0cjsKIAogICAgIGlmIChtZXRhRGF0
YS5rZXkgIT0ga2V5KQpAQCAtMjYxLDI5ICsyNzcsMTYgQEAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0
cjxTdG9yYWdlOjpSZWNvcmQ+IAogICAgIGF1dG8gdGltZVN0YW1wID0gc3RkOjpjaHJvbm86OnN5
c3RlbV9jbG9jazo6dGltZV9wb2ludChtZXRhRGF0YS5lcG9jaFJlbGF0aXZlVGltZVN0YW1wKTsK
ICAgICBpZiAodGltZVN0YW1wID4gc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6bm93KCkpCiAg
ICAgICAgIHJldHVybiBudWxscHRyOwotCi0gICAgRGF0YSBib2R5RGF0YTsKLSAgICBpZiAobWV0
YURhdGEuYm9keVNpemUpIHsKLSAgICAgICAgaWYgKG1ldGFEYXRhLmJvZHlPZmZzZXQgKyBtZXRh
RGF0YS5ib2R5U2l6ZSAhPSBmaWxlRGF0YS5zaXplKCkpCi0gICAgICAgICAgICByZXR1cm4gbnVs
bHB0cjsKLQotICAgICAgICBib2R5RGF0YSA9IG1hcEZpbGUoZmQsIG1ldGFEYXRhLmJvZHlPZmZz
ZXQsIG1ldGFEYXRhLmJvZHlTaXplKTsKLSAgICAgICAgaWYgKGJvZHlEYXRhLmlzTnVsbCgpKSB7
Ci0gICAgICAgICAgICBMT0coTmV0d29ya0NhY2hlU3RvcmFnZSwgIihOZXR3b3JrUHJvY2Vzcykg
bWFwIGZhaWxlZCIpOwotICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgICAgIH0KLQot
ICAgICAgICBpZiAobWV0YURhdGEuYm9keUNoZWNrc3VtICE9IGhhc2hEYXRhKGJvZHlEYXRhKSkg
ewotICAgICAgICAgICAgTE9HKE5ldHdvcmtDYWNoZVN0b3JhZ2UsICIoTmV0d29ya1Byb2Nlc3Mp
IGRhdGEgY2hlY2tzdW0gbWlzbWF0Y2giKTsKLSAgICAgICAgICAgIHJldHVybiBudWxscHRyOwot
ICAgICAgICB9Ci0gICAgfQorICAgIGlmIChtZXRhRGF0YS5ib2R5U2l6ZSAhPSBib2R5QmxvYi5k
YXRhLnNpemUoKSkKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgaWYgKG1ldGFEYXRhLmJv
ZHlIYXNoICE9IGJvZHlCbG9iLmhhc2gpCisgICAgICAgIHJldHVybiBudWxscHRyOwogCiAgICAg
cmV0dXJuIHN0ZDo6bWFrZV91bmlxdWU8U3RvcmFnZTo6UmVjb3JkPihTdG9yYWdlOjpSZWNvcmQg
ewogICAgICAgICBtZXRhRGF0YS5rZXksCiAgICAgICAgIHRpbWVTdGFtcCwKICAgICAgICAgaGVh
ZGVyRGF0YSwKLSAgICAgICAgYm9keURhdGEKKyAgICAgICAgYm9keUJsb2IuZGF0YQogICAgIH0p
OwogfQogCkBAIC0yOTYsNyArMjk5LDcgQEAgc3RhdGljIERhdGEgZW5jb2RlUmVjb3JkTWV0YURh
dGEoY29uc3QgUgogICAgIGVuY29kZXIgPDwgbWV0YURhdGEuZXBvY2hSZWxhdGl2ZVRpbWVTdGFt
cDsKICAgICBlbmNvZGVyIDw8IG1ldGFEYXRhLmhlYWRlckNoZWNrc3VtOwogICAgIGVuY29kZXIg
PDwgbWV0YURhdGEuaGVhZGVyU2l6ZTsKLSAgICBlbmNvZGVyIDw8IG1ldGFEYXRhLmJvZHlDaGVj
a3N1bTsKKyAgICBlbmNvZGVyIDw8IG1ldGFEYXRhLmJvZHlIYXNoOwogICAgIGVuY29kZXIgPDwg
bWV0YURhdGEuYm9keVNpemU7CiAKICAgICBlbmNvZGVyLmVuY29kZUNoZWNrc3VtKCk7CkBAIC0z
MDQsMjUgKzMwNywxOCBAQCBzdGF0aWMgRGF0YSBlbmNvZGVSZWNvcmRNZXRhRGF0YShjb25zdCBS
CiAgICAgcmV0dXJuIERhdGEoZW5jb2Rlci5idWZmZXIoKSwgZW5jb2Rlci5idWZmZXJTaXplKCkp
OwogfQogCi1zdGF0aWMgRGF0YSBlbmNvZGVSZWNvcmRIZWFkZXIoY29uc3QgU3RvcmFnZTo6UmVj
b3JkJiByZWNvcmQpCitzdGF0aWMgRGF0YSBlbmNvZGVSZWNvcmRIZWFkZXIoY29uc3QgU3RvcmFn
ZTo6UmVjb3JkJiByZWNvcmQsIFNIQTE6OkRpZ2VzdCBib2R5SGFzaCkKIHsKICAgICBSZWNvcmRN
ZXRhRGF0YSBtZXRhRGF0YShyZWNvcmQua2V5KTsKICAgICBtZXRhRGF0YS5lcG9jaFJlbGF0aXZl
VGltZVN0YW1wID0gc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8c3RkOjpjaHJvbm86Om1pbGxp
c2Vjb25kcz4ocmVjb3JkLnRpbWVTdGFtcC50aW1lX3NpbmNlX2Vwb2NoKCkpOwogICAgIG1ldGFE
YXRhLmhlYWRlckNoZWNrc3VtID0gaGFzaERhdGEocmVjb3JkLmhlYWRlcik7CiAgICAgbWV0YURh
dGEuaGVhZGVyU2l6ZSA9IHJlY29yZC5oZWFkZXIuc2l6ZSgpOwotICAgIG1ldGFEYXRhLmJvZHlD
aGVja3N1bSA9IGhhc2hEYXRhKHJlY29yZC5ib2R5KTsKKyAgICBtZXRhRGF0YS5ib2R5SGFzaCA9
IGJvZHlIYXNoOwogICAgIG1ldGFEYXRhLmJvZHlTaXplID0gcmVjb3JkLmJvZHkuc2l6ZSgpOwog
CiAgICAgYXV0byBlbmNvZGVkTWV0YURhdGEgPSBlbmNvZGVSZWNvcmRNZXRhRGF0YShtZXRhRGF0
YSk7CiAgICAgYXV0byBoZWFkZXJEYXRhID0gY29uY2F0ZW5hdGUoZW5jb2RlZE1ldGFEYXRhLCBy
ZWNvcmQuaGVhZGVyKTsKLSAgICBpZiAoIXJlY29yZC5ib2R5LnNpemUoKSkKLSAgICAgICAgcmV0
dXJuIHsgaGVhZGVyRGF0YSB9OwotCi0gICAgc2l6ZV90IGRhdGFPZmZzZXQgPSBXVEY6OnJvdW5k
VXBUb011bHRpcGxlT2YocGFnZVNpemUoKSwgaGVhZGVyRGF0YS5zaXplKCkpOwotICAgIFZlY3Rv
cjx1aW50OF90LCA0MDk2PiBmaWxsZXIoZGF0YU9mZnNldCAtIGhlYWRlckRhdGEuc2l6ZSgpLCAw
KTsKLSAgICBEYXRhIGFsaWdubWVudERhdGEoZmlsbGVyLmRhdGEoKSwgZmlsbGVyLnNpemUoKSk7
Ci0KLSAgICByZXR1cm4gY29uY2F0ZW5hdGUoaGVhZGVyRGF0YSwgYWxpZ25tZW50RGF0YSk7Cisg
ICAgcmV0dXJuIHsgaGVhZGVyRGF0YSB9OwogfQogCiB2b2lkIFN0b3JhZ2U6OnJlbW92ZShjb25z
dCBLZXkmIGtleSkKQEAgLTMzMywxNSArMzI5LDE3IEBAIHZvaWQgU3RvcmFnZTo6cmVtb3ZlKGNv
bnN0IEtleSYga2V5KQogICAgIC8vIEZvciBzaW1wbGljaXR5IHdlIGFsc28gZG9uJ3QgcmVkdWNl
IG1fYXBwcm94aW1hdGVTaXplIG9uIHJlbW92YWxzLgogICAgIC8vIFRoZSBuZXh0IHN5bmNocm9u
aXphdGlvbiB3aWxsIHVwZGF0ZSBldmVyeXRoaW5nLgogCi0gICAgU3RyaW5nQ2FwdHVyZSBmaWxl
UGF0aENhcHR1cmUoZmlsZVBhdGhGb3JLZXkoa2V5LCBtX2RpcmVjdG9yeVBhdGgpKTsKLSAgICBz
ZXJpYWxCYWNrZ3JvdW5kSU9RdWV1ZSgpLmRpc3BhdGNoKFt0aGlzLCBmaWxlUGF0aENhcHR1cmVd
IHsKLSAgICAgICAgV2ViQ29yZTo6ZGVsZXRlRmlsZShmaWxlUGF0aENhcHR1cmUuc3RyaW5nKCkp
OworICAgIFN0cmluZ0NhcHR1cmUgcmVjb3JkUGF0aENhcHR1cmUocmVjb3JkUGF0aEZvcktleShr
ZXksIG1fZGlyZWN0b3J5UGF0aCkpOworICAgIFN0cmluZ0NhcHR1cmUgYm9keVBhdGhDYXB0dXJl
KGJvZHlQYXRoRm9yS2V5KGtleSwgbV9kaXJlY3RvcnlQYXRoKSk7CisgICAgc2VyaWFsQmFja2dy
b3VuZElPUXVldWUoKS5kaXNwYXRjaChbdGhpcywgcmVjb3JkUGF0aENhcHR1cmUsIGJvZHlQYXRo
Q2FwdHVyZV0geworICAgICAgICBXZWJDb3JlOjpkZWxldGVGaWxlKHJlY29yZFBhdGhDYXB0dXJl
LnN0cmluZygpKTsKKyAgICAgICAgbV9ibG9iU3RvcmFnZS5yZW1vdmUoYm9keVBhdGhDYXB0dXJl
LnN0cmluZygpKTsKICAgICB9KTsKIH0KIAotdm9pZCBTdG9yYWdlOjp1cGRhdGVGaWxlTW9kaWZp
Y2F0aW9uVGltZShJT0NoYW5uZWwmIGNoYW5uZWwpCit2b2lkIFN0b3JhZ2U6OnVwZGF0ZUZpbGVN
b2RpZmljYXRpb25UaW1lKGNvbnN0IFN0cmluZyYgcGF0aCkKIHsKLSAgICBTdHJpbmdDYXB0dXJl
IGZpbGVQYXRoQ2FwdHVyZShjaGFubmVsLnBhdGgoKSk7CisgICAgU3RyaW5nQ2FwdHVyZSBmaWxl
UGF0aENhcHR1cmUocGF0aCk7CiAgICAgc2VyaWFsQmFja2dyb3VuZElPUXVldWUoKS5kaXNwYXRj
aChbZmlsZVBhdGhDYXB0dXJlXSB7CiAgICAgICAgIHVwZGF0ZUZpbGVNb2RpZmljYXRpb25UaW1l
SWZOZWVkZWQoZmlsZVBhdGhDYXB0dXJlLnN0cmluZygpKTsKICAgICB9KTsKQEAgLTM1NCwyOSAr
MzUyLDM1IEBAIHZvaWQgU3RvcmFnZTo6ZGlzcGF0Y2hSZWFkT3BlcmF0aW9uKGNvbnMKIAogICAg
IFN0cmluZ0NhcHR1cmUgY2FjaGVQYXRoQ2FwdHVyZShtX2RpcmVjdG9yeVBhdGgpOwogICAgIGlv
UXVldWUoKS5kaXNwYXRjaChbdGhpcywgJnJlYWQsIGNhY2hlUGF0aENhcHR1cmVdIHsKLSAgICAg
ICAgUmVmUHRyPElPQ2hhbm5lbD4gY2hhbm5lbCA9IG9wZW5GaWxlRm9yS2V5KHJlYWQua2V5LCBJ
T0NoYW5uZWw6OlR5cGU6OlJlYWQsIGNhY2hlUGF0aENhcHR1cmUuc3RyaW5nKCkpOwotICAgICAg
ICBjaGFubmVsLT5yZWFkKDAsIHN0ZDo6bnVtZXJpY19saW1pdHM8c2l6ZV90Pjo6bWF4KCksIFt0
aGlzLCBjaGFubmVsLCAmcmVhZF0oRGF0YSYgZmlsZURhdGEsIGludCBlcnJvcikgewotICAgICAg
ICAgICAgaWYgKGVycm9yKSB7Ci0gICAgICAgICAgICAgICAgcmVtb3ZlKHJlYWQua2V5KTsKLSAg
ICAgICAgICAgICAgICByZWFkLmNvbXBsZXRpb25IYW5kbGVyKG51bGxwdHIpOwotICAgICAgICAg
ICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBhdXRvIHJlY29yZCA9IGRlY29kZVJlY29yZChm
aWxlRGF0YSwgY2hhbm5lbC0+ZmlsZURlc2NyaXB0b3IoKSwgcmVhZC5rZXkpOwotICAgICAgICAg
ICAgICAgIGJvb2wgc3VjY2VzcyA9IHJlYWQuY29tcGxldGlvbkhhbmRsZXIoV1RGOjptb3ZlKHJl
Y29yZCkpOwotICAgICAgICAgICAgICAgIGlmIChzdWNjZXNzKQotICAgICAgICAgICAgICAgICAg
ICB1cGRhdGVGaWxlTW9kaWZpY2F0aW9uVGltZSgqY2hhbm5lbCk7Ci0gICAgICAgICAgICAgICAg
ZWxzZQotICAgICAgICAgICAgICAgICAgICByZW1vdmUocmVhZC5rZXkpOwotICAgICAgICAgICAg
fQotCi0gICAgICAgICAgICBBU1NFUlQobV9hY3RpdmVSZWFkT3BlcmF0aW9ucy5jb250YWlucygm
cmVhZCkpOwotICAgICAgICAgICAgbV9hY3RpdmVSZWFkT3BlcmF0aW9ucy5yZW1vdmUoJnJlYWQp
OwotICAgICAgICAgICAgZGlzcGF0Y2hQZW5kaW5nUmVhZE9wZXJhdGlvbnMoKTsKKyAgICAgICAg
YXV0byByZWNvcmRQYXRoID0gcmVjb3JkUGF0aEZvcktleShyZWFkLmtleSwgY2FjaGVQYXRoQ2Fw
dHVyZS5zdHJpbmcoKSk7CisgICAgICAgIGF1dG8gYm9keVBhdGggPSBib2R5UGF0aEZvcktleShy
ZWFkLmtleSwgY2FjaGVQYXRoQ2FwdHVyZS5zdHJpbmcoKSk7CisgICAgICAgIC8vIEZJWE1FOiBC
b2R5IGFuZCBoZWFkZXIgcmV0cmlldmVzIGNhbiBiZSBkb25lIGluIHBhcmFsbGVsLgorICAgICAg
ICBhdXRvIGJvZHlCbG9iID0gbV9ibG9iU3RvcmFnZS5nZXQoYm9keVBhdGgpOwogCi0gICAgICAg
ICAgICBMT0coTmV0d29ya0NhY2hlU3RvcmFnZSwgIihOZXR3b3JrUHJvY2VzcykgcmVhZCBjb21w
bGV0ZSBlcnJvcj0lZCIsIGVycm9yKTsKKyAgICAgICAgUmVmUHRyPElPQ2hhbm5lbD4gY2hhbm5l
bCA9IElPQ2hhbm5lbDo6b3BlbihyZWNvcmRQYXRoLCBJT0NoYW5uZWw6OlR5cGU6OlJlYWQpOwor
ICAgICAgICBjaGFubmVsLT5yZWFkKDAsIHN0ZDo6bnVtZXJpY19saW1pdHM8c2l6ZV90Pjo6bWF4
KCksIFt0aGlzLCAmcmVhZCwgYm9keUJsb2JdKERhdGEmIGZpbGVEYXRhLCBpbnQgZXJyb3IpIHsK
KyAgICAgICAgICAgIGF1dG8gcmVjb3JkID0gZXJyb3IgPyBudWxscHRyIDogY3JlYXRlUmVjb3Jk
KGZpbGVEYXRhLCBib2R5QmxvYiwgcmVhZC5rZXkpOworICAgICAgICAgICAgZmluaXNoUmVhZE9w
ZXJhdGlvbihyZWFkLCBXVEY6Om1vdmUocmVjb3JkKSk7CiAgICAgICAgIH0pOwogICAgIH0pOwog
fQogCit2b2lkIFN0b3JhZ2U6OmZpbmlzaFJlYWRPcGVyYXRpb24oY29uc3QgUmVhZE9wZXJhdGlv
biYgcmVhZCwgc3RkOjp1bmlxdWVfcHRyPFJlY29yZD4gcmVjb3JkKQoreworICAgIEFTU0VSVChS
dW5Mb29wOjppc01haW4oKSk7CisKKyAgICBib29sIHN1Y2Nlc3MgPSByZWFkLmNvbXBsZXRpb25I
YW5kbGVyKFdURjo6bW92ZShyZWNvcmQpKTsKKyAgICBpZiAoc3VjY2VzcykKKyAgICAgICAgdXBk
YXRlRmlsZU1vZGlmaWNhdGlvblRpbWUocmVjb3JkUGF0aEZvcktleShyZWFkLmtleSwgbV9kaXJl
Y3RvcnlQYXRoKSk7CisgICAgZWxzZQorICAgICAgICByZW1vdmUocmVhZC5rZXkpOworICAgIEFT
U0VSVChtX2FjdGl2ZVJlYWRPcGVyYXRpb25zLmNvbnRhaW5zKCZyZWFkKSk7CisgICAgbV9hY3Rp
dmVSZWFkT3BlcmF0aW9ucy5yZW1vdmUoJnJlYWQpOworICAgIGRpc3BhdGNoUGVuZGluZ1JlYWRP
cGVyYXRpb25zKCk7CisKKyAgICBMT0coTmV0d29ya0NhY2hlU3RvcmFnZSwgIihOZXR3b3JrUHJv
Y2VzcykgcmVhZCBjb21wbGV0ZSBzdWNjZXNzPSVkIiwgc3VjY2Vzcyk7Cit9CisKIHZvaWQgU3Rv
cmFnZTo6ZGlzcGF0Y2hQZW5kaW5nUmVhZE9wZXJhdGlvbnMoKQogewogICAgIEFTU0VSVChSdW5M
b29wOjppc01haW4oKSk7CkBAIC00MTMsNiArNDE3LDgzIEBAIHRlbXBsYXRlIDxjbGFzcyBUPiBi
b29sIHJldHJpZXZlRnJvbU1lbW8KICAgICByZXR1cm4gZmFsc2U7CiB9CiAKK3ZvaWQgU3RvcmFn
ZTo6ZGlzcGF0Y2hQZW5kaW5nV3JpdGVPcGVyYXRpb25zKCkKK3sKKyAgICBBU1NFUlQoUnVuTG9v
cDo6aXNNYWluKCkpOworCisgICAgY29uc3QgaW50IG1heGltdW1BY3RpdmVXcml0ZU9wZXJhdGlv
bkNvdW50IHsgMyB9OworCisgICAgd2hpbGUgKCFtX3BlbmRpbmdXcml0ZU9wZXJhdGlvbnMuaXNF
bXB0eSgpKSB7CisgICAgICAgIGlmIChtX2FjdGl2ZVdyaXRlT3BlcmF0aW9ucy5zaXplKCkgPj0g
bWF4aW11bUFjdGl2ZVdyaXRlT3BlcmF0aW9uQ291bnQpIHsKKyAgICAgICAgICAgIExPRyhOZXR3
b3JrQ2FjaGVTdG9yYWdlLCAiKE5ldHdvcmtQcm9jZXNzKSBsaW1pdGluZyBwYXJhbGxlbCB3cml0
ZXMiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBhdXRvIHdyaXRl
T3BlcmF0aW9uID0gbV9wZW5kaW5nV3JpdGVPcGVyYXRpb25zLnRha2VGaXJzdCgpOworICAgICAg
ICBhdXRvJiB3cml0ZSA9ICp3cml0ZU9wZXJhdGlvbjsKKyAgICAgICAgbV9hY3RpdmVXcml0ZU9w
ZXJhdGlvbnMuYWRkKFdURjo6bW92ZSh3cml0ZU9wZXJhdGlvbikpOworCisgICAgICAgIGRpc3Bh
dGNoV3JpdGVPcGVyYXRpb24od3JpdGUpOworICAgIH0KK30KKwordm9pZCBTdG9yYWdlOjpkaXNw
YXRjaFdyaXRlT3BlcmF0aW9uKGNvbnN0IFdyaXRlT3BlcmF0aW9uJiB3cml0ZSkKK3sKKyAgICBB
U1NFUlQoUnVuTG9vcDo6aXNNYWluKCkpOworICAgIEFTU0VSVChtX2FjdGl2ZVdyaXRlT3BlcmF0
aW9ucy5jb250YWlucygmd3JpdGUpKTsKKworICAgIC8vIFRoaXMgd2FzIGFkZGVkIGFscmVhZHkg
d2hlbiBzdGFydGluZyB0aGUgc3RvcmUgYnV0IGZpbHRlciBtaWdodCBoYXZlIGJlZW4gd2lwZWQu
CisgICAgYWRkVG9Db250ZW50c0ZpbHRlcih3cml0ZS5yZWNvcmQua2V5KTsKKworICAgIFN0cmlu
Z0NhcHR1cmUgY2FjaGVQYXRoQ2FwdHVyZShtX2RpcmVjdG9yeVBhdGgpOworICAgIGJhY2tncm91
bmRJT1F1ZXVlKCkuZGlzcGF0Y2goW3RoaXMsICZ3cml0ZSwgY2FjaGVQYXRoQ2FwdHVyZV0gewor
ICAgICAgICBhdXRvIHBhcnRpdGlvblBhdGggPSBwYXJ0aXRpb25QYXRoRm9yS2V5KHdyaXRlLnJl
Y29yZC5rZXksIGNhY2hlUGF0aENhcHR1cmUuc3RyaW5nKCkpOworICAgICAgICBhdXRvIHJlY29y
ZFBhdGggPSByZWNvcmRQYXRoRm9yS2V5KHdyaXRlLnJlY29yZC5rZXksIGNhY2hlUGF0aENhcHR1
cmUuc3RyaW5nKCkpOworICAgICAgICBhdXRvIGJvZHlQYXRoID0gYm9keVBhdGhGb3JLZXkod3Jp
dGUucmVjb3JkLmtleSwgY2FjaGVQYXRoQ2FwdHVyZS5zdHJpbmcoKSk7CisKKyAgICAgICAgV2Vi
Q29yZTo6bWFrZUFsbERpcmVjdG9yaWVzKHBhcnRpdGlvblBhdGgpOworCisgICAgICAgIC8vIFN0
b3JlIHRoZSBib2R5LgorICAgICAgICBhdXRvIGJsb2IgPSBtX2Jsb2JTdG9yYWdlLmFkZChib2R5
UGF0aCwgd3JpdGUucmVjb3JkLmJvZHkpOworICAgICAgICBpZiAoYmxvYi5kYXRhLmlzTnVsbCgp
KSB7CisgICAgICAgICAgICBSdW5Mb29wOjptYWluKCkuZGlzcGF0Y2goW3RoaXMsICZ3cml0ZV0g
eworICAgICAgICAgICAgICAgIGZpbmlzaFdyaXRlT3BlcmF0aW9uKHdyaXRlKTsKKyAgICAgICAg
ICAgIH0pOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gVGVs
bCB0aGUgY2xpZW50IHdlIG5vdyBoYXZlIGEgZGlzay1iYWNrZWQgbWFwIGZvciB0aGlzIGRhdGEu
CisgICAgICAgIHNpemVfdCBtaW5pbXVtTWFwU2l6ZSA9IHBhZ2VTaXplKCk7CisgICAgICAgIGlm
IChibG9iLmRhdGEuc2l6ZSgpID49IG1pbmltdW1NYXBTaXplICYmIGJsb2IuZGF0YS5pc01hcCgp
ICYmIHdyaXRlLm1hcHBlZEJvZHlIYW5kbGVyKSB7CisgICAgICAgICAgICBhdXRvJiBtYXBwZWRC
b2R5SGFuZGxlciA9IHdyaXRlLm1hcHBlZEJvZHlIYW5kbGVyOworICAgICAgICAgICAgUnVuTG9v
cDo6bWFpbigpLmRpc3BhdGNoKFtibG9iLCBtYXBwZWRCb2R5SGFuZGxlcl0geworICAgICAgICAg
ICAgICAgIG1hcHBlZEJvZHlIYW5kbGVyKGJsb2IuZGF0YSk7CisgICAgICAgICAgICB9KTsKKyAg
ICAgICAgfQorCisgICAgICAgIC8vIFN0b3JlIHRoZSBoZWFkZXIgYW5kIG1ldGEgZGF0YS4KKyAg
ICAgICAgYXV0byBlbmNvZGVkSGVhZGVyID0gZW5jb2RlUmVjb3JkSGVhZGVyKHdyaXRlLnJlY29y
ZCwgYmxvYi5oYXNoKTsKKyAgICAgICAgYXV0byBjaGFubmVsID0gSU9DaGFubmVsOjpvcGVuKHJl
Y29yZFBhdGgsIElPQ2hhbm5lbDo6VHlwZTo6Q3JlYXRlKTsKKyAgICAgICAgaW50IGZkID0gY2hh
bm5lbC0+ZmlsZURlc2NyaXB0b3IoKTsKKyAgICAgICAgc2l6ZV90IGhlYWRlclNpemUgPSBlbmNv
ZGVkSGVhZGVyLnNpemUoKTsKKyAgICAgICAgY2hhbm5lbC0+d3JpdGUoMCwgZW5jb2RlZEhlYWRl
ciwgW3RoaXMsICZ3cml0ZSwgaGVhZGVyU2l6ZSwgZmRdKGludCBlcnJvcikgeworICAgICAgICAg
ICAgLy8gT24gZXJyb3IgdGhlIGVudHJ5IHN0aWxsIHN0YXlzIGluIHRoZSBjb250ZW50cyBmaWx0
ZXIgdW50aWwgbmV4dCBzeW5jaHJvbml6YXRpb24uCisgICAgICAgICAgICBtX2FwcHJveGltYXRl
U2l6ZSArPSBoZWFkZXJTaXplOworICAgICAgICAgICAgZmluaXNoV3JpdGVPcGVyYXRpb24od3Jp
dGUpOworCisgICAgICAgICAgICBMT0coTmV0d29ya0NhY2hlU3RvcmFnZSwgIihOZXR3b3JrUHJv
Y2Vzcykgd3JpdGUgY29tcGxldGUgZXJyb3I9JWQiLCBlcnJvcik7CisgICAgICAgIH0pOworICAg
IH0pOworfQorCit2b2lkIFN0b3JhZ2U6OmZpbmlzaFdyaXRlT3BlcmF0aW9uKGNvbnN0IFdyaXRl
T3BlcmF0aW9uJiB3cml0ZSkKK3sKKyAgICBBU1NFUlQobV9hY3RpdmVXcml0ZU9wZXJhdGlvbnMu
Y29udGFpbnMoJndyaXRlKSk7CisgICAgbV9hY3RpdmVXcml0ZU9wZXJhdGlvbnMucmVtb3ZlKCZ3
cml0ZSk7CisgICAgZGlzcGF0Y2hQZW5kaW5nV3JpdGVPcGVyYXRpb25zKCk7CisKKyAgICBzaHJp
bmtJZk5lZWRlZCgpOworfQorCiB2b2lkIFN0b3JhZ2U6OnJldHJpZXZlKGNvbnN0IEtleSYga2V5
LCB1bnNpZ25lZCBwcmlvcml0eSwgUmV0cmlldmVDb21wbGV0aW9uSGFuZGxlciYmIGNvbXBsZXRp
b25IYW5kbGVyKQogewogICAgIEFTU0VSVChSdW5Mb29wOjppc01haW4oKSk7CkBAIC00MzgsMTcg
KzUxOSwxNSBAQCB2b2lkIFN0b3JhZ2U6OnJldHJpZXZlKGNvbnN0IEtleSYga2V5LCB1CiAgICAg
ZGlzcGF0Y2hQZW5kaW5nUmVhZE9wZXJhdGlvbnMoKTsKIH0KIAotdm9pZCBTdG9yYWdlOjpzdG9y
ZShjb25zdCBSZWNvcmQmIHJlY29yZCwgU3RvcmVDb21wbGV0aW9uSGFuZGxlciYmIGNvbXBsZXRp
b25IYW5kbGVyKQordm9pZCBTdG9yYWdlOjpzdG9yZShjb25zdCBSZWNvcmQmIHJlY29yZCwgTWFw
cGVkQm9keUhhbmRsZXImJiBtYXBwZWRCb2R5SGFuZGxlcikKIHsKICAgICBBU1NFUlQoUnVuTG9v
cDo6aXNNYWluKCkpOwogICAgIEFTU0VSVCghcmVjb3JkLmtleS5pc051bGwoKSk7CiAKLSAgICBp
ZiAoIW1fY2FwYWNpdHkpIHsKLSAgICAgICAgY29tcGxldGlvbkhhbmRsZXIoZmFsc2UsIHsgfSk7
CisgICAgaWYgKCFtX2NhcGFjaXR5KQogICAgICAgICByZXR1cm47Ci0gICAgfQogCi0gICAgbV9w
ZW5kaW5nV3JpdGVPcGVyYXRpb25zLmFwcGVuZChuZXcgV3JpdGVPcGVyYXRpb24geyByZWNvcmQs
IHsgfSwgV1RGOjptb3ZlKGNvbXBsZXRpb25IYW5kbGVyKSB9KTsKKyAgICBtX3BlbmRpbmdXcml0
ZU9wZXJhdGlvbnMuYXBwZW5kKG5ldyBXcml0ZU9wZXJhdGlvbiB7IHJlY29yZCwgV1RGOjptb3Zl
KG1hcHBlZEJvZHlIYW5kbGVyKSB9KTsKIAogICAgIC8vIEFkZCBrZXkgdG8gdGhlIGZpbHRlciBh
bHJlYWR5IGhlcmUgYXMgd2UgZG8gbG9va3VwcyBmcm9tIHRoZSBwZW5kaW5nIG9wZXJhdGlvbnMg
dG9vLgogICAgIGFkZFRvQ29udGVudHNGaWx0ZXIocmVjb3JkLmtleSk7CkBAIC00NTYsNDMgKzUz
NSwyOSBAQCB2b2lkIFN0b3JhZ2U6OnN0b3JlKGNvbnN0IFJlY29yZCYgcmVjb3JkCiAgICAgZGlz
cGF0Y2hQZW5kaW5nV3JpdGVPcGVyYXRpb25zKCk7CiB9CiAKLXZvaWQgU3RvcmFnZTo6dXBkYXRl
KGNvbnN0IFJlY29yZCYgdXBkYXRlUmVjb3JkLCBjb25zdCBSZWNvcmQmIGV4aXN0aW5nUmVjb3Jk
LCBTdG9yZUNvbXBsZXRpb25IYW5kbGVyJiYgY29tcGxldGlvbkhhbmRsZXIpCi17Ci0gICAgQVNT
RVJUKFJ1bkxvb3A6OmlzTWFpbigpKTsKLSAgICBBU1NFUlQoIWV4aXN0aW5nUmVjb3JkLmtleS5p
c051bGwoKSk7Ci0gICAgQVNTRVJUKGV4aXN0aW5nUmVjb3JkLmtleSA9PSB1cGRhdGVSZWNvcmQu
a2V5KTsKLQotICAgIGlmICghbV9jYXBhY2l0eSkgewotICAgICAgICBjb21wbGV0aW9uSGFuZGxl
cihmYWxzZSwgeyB9KTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIG1fcGVuZGluZ1dy
aXRlT3BlcmF0aW9ucy5hcHBlbmQobmV3IFdyaXRlT3BlcmF0aW9uIHsgdXBkYXRlUmVjb3JkLCBl
eGlzdGluZ1JlY29yZCwgV1RGOjptb3ZlKGNvbXBsZXRpb25IYW5kbGVyKSB9KTsKLQotICAgIGRp
c3BhdGNoUGVuZGluZ1dyaXRlT3BlcmF0aW9ucygpOwotfQotCiB2b2lkIFN0b3JhZ2U6OnRyYXZl
cnNlKFRyYXZlcnNlRmxhZ3MgZmxhZ3MsIHN0ZDo6ZnVuY3Rpb248dm9pZCAoY29uc3QgUmVjb3Jk
KiwgY29uc3QgUmVjb3JkSW5mbyYpPiYmIHRyYXZlcnNlSGFuZGxlcikKIHsKICAgICBTdHJpbmdD
YXB0dXJlIGNhY2hlUGF0aENhcHR1cmUobV9kaXJlY3RvcnlQYXRoKTsKICAgICBpb1F1ZXVlKCku
ZGlzcGF0Y2goW3RoaXMsIGZsYWdzLCBjYWNoZVBhdGhDYXB0dXJlLCB0cmF2ZXJzZUhhbmRsZXJd
IHsKICAgICAgICAgU3RyaW5nIGNhY2hlUGF0aCA9IGNhY2hlUGF0aENhcHR1cmUuc3RyaW5nKCk7
CiAgICAgICAgIHRyYXZlcnNlQ2FjaGVGaWxlcyhjYWNoZVBhdGgsIFt0aGlzLCBmbGFncywgJnRy
YXZlcnNlSGFuZGxlcl0oY29uc3QgU3RyaW5nJiBmaWxlTmFtZSwgY29uc3QgU3RyaW5nJiBwYXJ0
aXRpb25QYXRoKSB7Ci0gICAgICAgICAgICBhdXRvIGZpbGVQYXRoID0gV2ViQ29yZTo6cGF0aEJ5
QXBwZW5kaW5nQ29tcG9uZW50KHBhcnRpdGlvblBhdGgsIGZpbGVOYW1lKTsKKyAgICAgICAgICAg
IGF1dG8gcmVjb3JkUGF0aCA9IFdlYkNvcmU6OnBhdGhCeUFwcGVuZGluZ0NvbXBvbmVudChwYXJ0
aXRpb25QYXRoLCBmaWxlTmFtZSk7CiAKICAgICAgICAgICAgIFJlY29yZEluZm8gaW5mbzsKICAg
ICAgICAgICAgIGlmIChmbGFncyAmIFRyYXZlcnNlRmxhZzo6Q29tcHV0ZVdvcnRoKQotICAgICAg
ICAgICAgICAgIGluZm8ud29ydGggPSBjb21wdXRlUmVjb3JkV29ydGgoZmlsZVRpbWVzKGZpbGVQ
YXRoKSk7CisgICAgICAgICAgICAgICAgaW5mby53b3J0aCA9IGNvbXB1dGVSZWNvcmRXb3J0aChm
aWxlVGltZXMocmVjb3JkUGF0aCkpOworICAgICAgICAgICAgaWYgKGZsYWdzICYgVHJhdmVyc2VG
bGFnOjpTaGFyZUNvdW50KQorICAgICAgICAgICAgICAgIGluZm8uYm9keVNoYXJlQ291bnQgPSBt
X2Jsb2JTdG9yYWdlLnNoYXJlQ291bnQoYm9keVBhdGhGb3JSZWNvcmRQYXRoKHJlY29yZFBhdGgp
KTsKIAotICAgICAgICAgICAgYXV0byBjaGFubmVsID0gSU9DaGFubmVsOjpvcGVuKGZpbGVQYXRo
LCBJT0NoYW5uZWw6OlR5cGU6OlJlYWQpOwotICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGhlYWRl
clJlYWRTaXplID0gMTYgPDwgMTA7CisgICAgICAgICAgICBhdXRvIGNoYW5uZWwgPSBJT0NoYW5u
ZWw6Om9wZW4ocmVjb3JkUGF0aCwgSU9DaGFubmVsOjpUeXBlOjpSZWFkKTsKICAgICAgICAgICAg
IC8vIEZJWE1FOiBUcmF2ZXJzYWwgaXMgc2xvd2VyIHRoYW4gaXQgc2hvdWxkIGJlIGR1ZSB0byBs
YWNrIG9mIHBhcmFsbGVsaXNtLgotICAgICAgICAgICAgY2hhbm5lbC0+cmVhZFN5bmMoMCwgaGVh
ZGVyUmVhZFNpemUsIFt0aGlzLCAmdHJhdmVyc2VIYW5kbGVyLCAmaW5mb10oRGF0YSYgZmlsZURh
dGEsIGludCkgeworICAgICAgICAgICAgY2hhbm5lbC0+cmVhZFN5bmMoMCwgc3RkOjpudW1lcmlj
X2xpbWl0czxzaXplX3Q+OjptYXgoKSwgW3RoaXMsICZ0cmF2ZXJzZUhhbmRsZXIsICZpbmZvXShE
YXRhJiBmaWxlRGF0YSwgaW50KSB7CiAgICAgICAgICAgICAgICAgUmVjb3JkTWV0YURhdGEgbWV0
YURhdGE7CiAgICAgICAgICAgICAgICAgRGF0YSBoZWFkZXJEYXRhOwogICAgICAgICAgICAgICAg
IGlmIChkZWNvZGVSZWNvcmRIZWFkZXIoZmlsZURhdGEsIG1ldGFEYXRhLCBoZWFkZXJEYXRhKSkg
ewogICAgICAgICAgICAgICAgICAgICBSZWNvcmQgcmVjb3JkIHsgbWV0YURhdGEua2V5LCBzdGQ6
OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjp0aW1lX3BvaW50KG1ldGFEYXRhLmVwb2NoUmVsYXRpdmVU
aW1lU3RhbXApLCBoZWFkZXJEYXRhLCB7IH0gfTsKICAgICAgICAgICAgICAgICAgICAgaW5mby5i
b2R5U2l6ZSA9IG1ldGFEYXRhLmJvZHlTaXplOworICAgICAgICAgICAgICAgICAgICBpbmZvLmJv
ZHlIYXNoID0gU3RyaW5nOjpmcm9tVVRGOChTSEExOjpoZXhEaWdlc3QobWV0YURhdGEuYm9keUhh
c2gpKTsKICAgICAgICAgICAgICAgICAgICAgdHJhdmVyc2VIYW5kbGVyKCZyZWNvcmQsIGluZm8p
OwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0pOwpAQCAtNTAzLDEwNyArNTY4LDYg
QEAgdm9pZCBTdG9yYWdlOjp0cmF2ZXJzZShUcmF2ZXJzZUZsYWdzIGZsYQogICAgIH0pOwogfQog
Ci12b2lkIFN0b3JhZ2U6OmRpc3BhdGNoUGVuZGluZ1dyaXRlT3BlcmF0aW9ucygpCi17Ci0gICAg
QVNTRVJUKFJ1bkxvb3A6OmlzTWFpbigpKTsKLQotICAgIGNvbnN0IGludCBtYXhpbXVtQWN0aXZl
V3JpdGVPcGVyYXRpb25Db3VudCB7IDMgfTsKLQotICAgIHdoaWxlICghbV9wZW5kaW5nV3JpdGVP
cGVyYXRpb25zLmlzRW1wdHkoKSkgewotICAgICAgICBpZiAobV9hY3RpdmVXcml0ZU9wZXJhdGlv
bnMuc2l6ZSgpID49IG1heGltdW1BY3RpdmVXcml0ZU9wZXJhdGlvbkNvdW50KSB7Ci0gICAgICAg
ICAgICBMT0coTmV0d29ya0NhY2hlU3RvcmFnZSwgIihOZXR3b3JrUHJvY2VzcykgbGltaXRpbmcg
cGFyYWxsZWwgd3JpdGVzIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAg
ICAgYXV0byB3cml0ZU9wZXJhdGlvbiA9IG1fcGVuZGluZ1dyaXRlT3BlcmF0aW9ucy50YWtlRmly
c3QoKTsKLSAgICAgICAgYXV0byYgd3JpdGUgPSAqd3JpdGVPcGVyYXRpb247Ci0gICAgICAgIG1f
YWN0aXZlV3JpdGVPcGVyYXRpb25zLmFkZChXVEY6Om1vdmUod3JpdGVPcGVyYXRpb24pKTsKLQot
ICAgICAgICBpZiAod3JpdGUuZXhpc3RpbmdSZWNvcmQgJiYgbWF5Q29udGFpbih3cml0ZS5yZWNv
cmQua2V5KSkgewotICAgICAgICAgICAgZGlzcGF0Y2hIZWFkZXJXcml0ZU9wZXJhdGlvbih3cml0
ZSk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBkaXNwYXRjaEZ1
bGxXcml0ZU9wZXJhdGlvbih3cml0ZSk7Ci0gICAgfQotfQotCi12b2lkIFN0b3JhZ2U6OmRpc3Bh
dGNoRnVsbFdyaXRlT3BlcmF0aW9uKGNvbnN0IFdyaXRlT3BlcmF0aW9uJiB3cml0ZSkKLXsKLSAg
ICBBU1NFUlQoUnVuTG9vcDo6aXNNYWluKCkpOwotICAgIEFTU0VSVChtX2FjdGl2ZVdyaXRlT3Bl
cmF0aW9ucy5jb250YWlucygmd3JpdGUpKTsKLQotICAgIC8vIFRoaXMgd2FzIGFkZGVkIGFscmVh
ZHkgd2hlbiBzdGFydGluZyB0aGUgc3RvcmUgYnV0IGZpbHRlciBtaWdodCBoYXZlIGJlZW4gd2lw
ZWQuCi0gICAgYWRkVG9Db250ZW50c0ZpbHRlcih3cml0ZS5yZWNvcmQua2V5KTsKLQotICAgIFN0
cmluZ0NhcHR1cmUgY2FjaGVQYXRoQ2FwdHVyZShtX2RpcmVjdG9yeVBhdGgpOwotICAgIGJhY2tn
cm91bmRJT1F1ZXVlKCkuZGlzcGF0Y2goW3RoaXMsICZ3cml0ZSwgY2FjaGVQYXRoQ2FwdHVyZV0g
ewotICAgICAgICBhdXRvIGVuY29kZWRIZWFkZXIgPSBlbmNvZGVSZWNvcmRIZWFkZXIod3JpdGUu
cmVjb3JkKTsKLSAgICAgICAgYXV0byBoZWFkZXJBbmRCb2R5RGF0YSA9IGNvbmNhdGVuYXRlKGVu
Y29kZWRIZWFkZXIsIHdyaXRlLnJlY29yZC5ib2R5KTsKLQotICAgICAgICBhdXRvIGNoYW5uZWwg
PSBvcGVuRmlsZUZvcktleSh3cml0ZS5yZWNvcmQua2V5LCBJT0NoYW5uZWw6OlR5cGU6OkNyZWF0
ZSwgY2FjaGVQYXRoQ2FwdHVyZS5zdHJpbmcoKSk7Ci0gICAgICAgIGludCBmZCA9IGNoYW5uZWwt
PmZpbGVEZXNjcmlwdG9yKCk7Ci0gICAgICAgIHNpemVfdCBib2R5T2Zmc2V0ID0gZW5jb2RlZEhl
YWRlci5zaXplKCk7Ci0KLSAgICAgICAgY2hhbm5lbC0+d3JpdGUoMCwgaGVhZGVyQW5kQm9keURh
dGEsIFt0aGlzLCAmd3JpdGUsIGJvZHlPZmZzZXQsIGZkXShpbnQgZXJyb3IpIHsKLSAgICAgICAg
ICAgIHNpemVfdCBib2R5U2l6ZSA9IHdyaXRlLnJlY29yZC5ib2R5LnNpemUoKTsKLSAgICAgICAg
ICAgIHNpemVfdCB0b3RhbFNpemUgPSBib2R5T2Zmc2V0ICsgYm9keVNpemU7Ci0KLSAgICAgICAg
ICAgIC8vIE9uIGVycm9yIHRoZSBlbnRyeSBzdGlsbCBzdGF5cyBpbiB0aGUgY29udGVudHMgZmls
dGVyIHVudGlsIG5leHQgc3luY2hyb25pemF0aW9uLgotICAgICAgICAgICAgbV9hcHByb3hpbWF0
ZVNpemUgKz0gdG90YWxTaXplOwotCi0gICAgICAgICAgICBib29sIHNob3VsZE1hcEJvZHkgPSAh
ZXJyb3IgJiYgYm9keVNpemUgPj0gcGFnZVNpemUoKTsKLSAgICAgICAgICAgIGF1dG8gYm9keU1h
cCA9IHNob3VsZE1hcEJvZHkgPyBtYXBGaWxlKGZkLCBib2R5T2Zmc2V0LCBib2R5U2l6ZSkgOiBE
YXRhKCk7Ci0KLSAgICAgICAgICAgIHdyaXRlLmNvbXBsZXRpb25IYW5kbGVyKCFlcnJvciwgYm9k
eU1hcCk7Ci0KLSAgICAgICAgICAgIEFTU0VSVChtX2FjdGl2ZVdyaXRlT3BlcmF0aW9ucy5jb250
YWlucygmd3JpdGUpKTsKLSAgICAgICAgICAgIG1fYWN0aXZlV3JpdGVPcGVyYXRpb25zLnJlbW92
ZSgmd3JpdGUpOwotICAgICAgICAgICAgZGlzcGF0Y2hQZW5kaW5nV3JpdGVPcGVyYXRpb25zKCk7
Ci0KLSAgICAgICAgICAgIExPRyhOZXR3b3JrQ2FjaGVTdG9yYWdlLCAiKE5ldHdvcmtQcm9jZXNz
KSB3cml0ZSBjb21wbGV0ZSBlcnJvcj0lZCIsIGVycm9yKTsKLSAgICAgICAgfSk7Ci0gICAgfSk7
Ci0KLSAgICBzaHJpbmtJZk5lZWRlZCgpOwotfQotCi12b2lkIFN0b3JhZ2U6OmRpc3BhdGNoSGVh
ZGVyV3JpdGVPcGVyYXRpb24oY29uc3QgV3JpdGVPcGVyYXRpb24mIHdyaXRlKQotewotICAgIEFT
U0VSVChSdW5Mb29wOjppc01haW4oKSk7Ci0gICAgQVNTRVJUKHdyaXRlLmV4aXN0aW5nUmVjb3Jk
KTsKLSAgICBBU1NFUlQobV9hY3RpdmVXcml0ZU9wZXJhdGlvbnMuY29udGFpbnMoJndyaXRlKSk7
Ci0gICAgQVNTRVJUKG1heUNvbnRhaW4od3JpdGUucmVjb3JkLmtleSkpOwotCi0gICAgLy8gVHJ5
IHRvIHVwZGF0ZSB0aGUgaGVhZGVyIG9mIGFuIGV4aXN0aW5nIGVudHJ5LgotICAgIFN0cmluZ0Nh
cHR1cmUgY2FjaGVQYXRoQ2FwdHVyZShtX2RpcmVjdG9yeVBhdGgpOwotICAgIGJhY2tncm91bmRJ
T1F1ZXVlKCkuZGlzcGF0Y2goW3RoaXMsICZ3cml0ZSwgY2FjaGVQYXRoQ2FwdHVyZV0gewotICAg
ICAgICBhdXRvIGhlYWRlckRhdGEgPSBlbmNvZGVSZWNvcmRIZWFkZXIod3JpdGUucmVjb3JkKTsK
LSAgICAgICAgYXV0byBleGlzdGluZ0hlYWRlckRhdGEgPSBlbmNvZGVSZWNvcmRIZWFkZXIod3Jp
dGUuZXhpc3RpbmdSZWNvcmQudmFsdWUoKSk7Ci0KLSAgICAgICAgYm9vbCBwYWdlUm91bmRlZEhl
YWRlclNpemVDaGFuZ2VkID0gaGVhZGVyRGF0YS5zaXplKCkgIT0gZXhpc3RpbmdIZWFkZXJEYXRh
LnNpemUoKTsKLSAgICAgICAgaWYgKHBhZ2VSb3VuZGVkSGVhZGVyU2l6ZUNoYW5nZWQpIHsKLSAg
ICAgICAgICAgIExPRyhOZXR3b3JrQ2FjaGVTdG9yYWdlLCAiKE5ldHdvcmtQcm9jZXNzKSBwYWdl
LXJvdW5kZWQgaGVhZGVyIHNpemUgY2hhbmdlZCwgc3RvcmluZyBmdWxsIGVudHJ5Iik7Ci0gICAg
ICAgICAgICBSdW5Mb29wOjptYWluKCkuZGlzcGF0Y2goW3RoaXMsICZ3cml0ZV0gewotICAgICAg
ICAgICAgICAgIGRpc3BhdGNoRnVsbFdyaXRlT3BlcmF0aW9uKHdyaXRlKTsKLSAgICAgICAgICAg
IH0pOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgYXV0byBjaGFu
bmVsID0gb3BlbkZpbGVGb3JLZXkod3JpdGUucmVjb3JkLmtleSwgSU9DaGFubmVsOjpUeXBlOjpX
cml0ZSwgY2FjaGVQYXRoQ2FwdHVyZS5zdHJpbmcoKSk7Ci0gICAgICAgIGNoYW5uZWwtPndyaXRl
KDAsIGhlYWRlckRhdGEsIFt0aGlzLCAmd3JpdGVdKGludCBlcnJvcikgewotICAgICAgICAgICAg
TE9HKE5ldHdvcmtDYWNoZVN0b3JhZ2UsICIoTmV0d29ya1Byb2Nlc3MpIHVwZGF0ZSBjb21wbGV0
ZSBlcnJvcj0lZCIsIGVycm9yKTsKLQotICAgICAgICAgICAgaWYgKGVycm9yKQotICAgICAgICAg
ICAgICAgIHJlbW92ZSh3cml0ZS5yZWNvcmQua2V5KTsKLQotICAgICAgICAgICAgd3JpdGUuY29t
cGxldGlvbkhhbmRsZXIoIWVycm9yLCB7IH0pOwotCi0gICAgICAgICAgICBBU1NFUlQobV9hY3Rp
dmVXcml0ZU9wZXJhdGlvbnMuY29udGFpbnMoJndyaXRlKSk7Ci0gICAgICAgICAgICBtX2FjdGl2
ZVdyaXRlT3BlcmF0aW9ucy5yZW1vdmUoJndyaXRlKTsKLSAgICAgICAgICAgIGRpc3BhdGNoUGVu
ZGluZ1dyaXRlT3BlcmF0aW9ucygpOwotICAgICAgICB9KTsKLSAgICB9KTsKLX0KLQogdm9pZCBT
dG9yYWdlOjpzZXRDYXBhY2l0eShzaXplX3QgY2FwYWNpdHkpCiB7CiAgICAgQVNTRVJUKFJ1bkxv
b3A6OmlzTWFpbigpKTsKQEAgLTYzMyw3ICs1OTcsNyBAQCB2b2lkIFN0b3JhZ2U6OmNsZWFyKCkK
IAogICAgIFN0cmluZ0NhcHR1cmUgZGlyZWN0b3J5UGF0aENhcHR1cmUobV9kaXJlY3RvcnlQYXRo
KTsKIAotICAgIGlvUXVldWUoKS5kaXNwYXRjaChbZGlyZWN0b3J5UGF0aENhcHR1cmVdIHsKKyAg
ICBpb1F1ZXVlKCkuZGlzcGF0Y2goW3RoaXMsIGRpcmVjdG9yeVBhdGhDYXB0dXJlXSB7CiAgICAg
ICAgIFN0cmluZyBkaXJlY3RvcnlQYXRoID0gZGlyZWN0b3J5UGF0aENhcHR1cmUuc3RyaW5nKCk7
CiAgICAgICAgIHRyYXZlcnNlRGlyZWN0b3J5KGRpcmVjdG9yeVBhdGgsIERUX0RJUiwgWyZkaXJl
Y3RvcnlQYXRoXShjb25zdCBTdHJpbmcmIHN1YmRpck5hbWUpIHsKICAgICAgICAgICAgIFN0cmlu
ZyBzdWJkaXJQYXRoID0gV2ViQ29yZTo6cGF0aEJ5QXBwZW5kaW5nQ29tcG9uZW50KGRpcmVjdG9y
eVBhdGgsIHN1YmRpck5hbWUpOwpAQCAtNjQyLDYgKzYwNiw5IEBAIHZvaWQgU3RvcmFnZTo6Y2xl
YXIoKQogICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICBXZWJDb3JlOjpkZWxldGVFbXB0eURp
cmVjdG9yeShzdWJkaXJQYXRoKTsKICAgICAgICAgfSk7CisKKyAgICAgICAgLy8gVGhpcyBjbGVh
bnMgdW5yZWZlcmVuY2VzIGJsb2JzLgorICAgICAgICBtX2Jsb2JTdG9yYWdlLnN5bmNocm9uaXpl
KCk7CiAgICAgfSk7CiB9CiAKQEAgLTY2MCwyNCArNjI3LDMwIEBAIHN0YXRpYyBkb3VibGUgY29t
cHV0ZVJlY29yZFdvcnRoKEZpbGVUaW0KICAgICByZXR1cm4gZHVyYXRpb248ZG91YmxlPihhY2Nl
c3NBZ2UpIC8gYWdlOwogfQogCi0KLXN0YXRpYyBkb3VibGUgZGVsZXRpb25Qcm9iYWJpbGl0eShG
aWxlVGltZXMgdGltZXMpCitzdGF0aWMgZG91YmxlIGRlbGV0aW9uUHJvYmFiaWxpdHkoRmlsZVRp
bWVzIHRpbWVzLCB1bnNpZ25lZCBib2R5U2hhcmVDb3VudCkKIHsKICAgICBzdGF0aWMgY29uc3Qg
ZG91YmxlIG1heGltdW1Qcm9iYWJpbGl0eSB7IDAuMzMgfTsKKyAgICBzdGF0aWMgY29uc3QgdW5z
aWduZWQgbWF4aW11bUVmZmVjdGl2ZVNoYXJlQ291bnQgeyA1IH07CiAKICAgICBhdXRvIHdvcnRo
ID0gY29tcHV0ZVJlY29yZFdvcnRoKHRpbWVzKTsKIAogICAgIC8vIEFkanVzdCBhIGJpdCBzbyB0
aGUgbW9zdCB2YWx1YWJsZSBlbnRyaWVzIGRvbid0IGdldCBkZWxldGVkIGF0IGFsbC4KICAgICBh
dXRvIGVmZmVjdGl2ZVdvcnRoID0gc3RkOjptaW4oMS4xICogd29ydGgsIDEuKTsKIAotICAgIHJl
dHVybiAoMSAtIGVmZmVjdGl2ZVdvcnRoKSAqIG1heGltdW1Qcm9iYWJpbGl0eTsKKyAgICBhdXRv
IHByb2JhYmlsaXR5ID0gICgxIC0gZWZmZWN0aXZlV29ydGgpICogbWF4aW11bVByb2JhYmlsaXR5
OworCisgICAgLy8gSXQgaXMgbGVzcyB1c2VmdWwgdG8gcmVtb3ZlIGFuIGVudHJ5IHRoYXQgc2hh
cmVzIGl0cyBib2R5IGRhdGEuCisgICAgaWYgKGJvZHlTaGFyZUNvdW50KQorICAgICAgICBwcm9i
YWJpbGl0eSAvPSBzdGQ6Om1pbihib2R5U2hhcmVDb3VudCwgbWF4aW11bUVmZmVjdGl2ZVNoYXJl
Q291bnQpOworCisgICAgcmV0dXJuIHByb2JhYmlsaXR5OwogfQogCiB2b2lkIFN0b3JhZ2U6OnNo
cmlua0lmTmVlZGVkKCkKIHsKICAgICBBU1NFUlQoUnVuTG9vcDo6aXNNYWluKCkpOwogCi0gICAg
aWYgKG1fYXBwcm94aW1hdGVTaXplID4gbV9jYXBhY2l0eSkKKyAgICBpZiAoYXBwcm94aW1hdGVT
aXplKCkgPiBtX2NhcGFjaXR5KQogICAgICAgICBzaHJpbmsoKTsKIH0KIApAQCAtNjg5LDIyICs2
NjIsMjcgQEAgdm9pZCBTdG9yYWdlOjpzaHJpbmsoKQogICAgICAgICByZXR1cm47CiAgICAgbV9z
aHJpbmtJblByb2dyZXNzID0gdHJ1ZTsKIAotICAgIExPRyhOZXR3b3JrQ2FjaGVTdG9yYWdlLCAi
KE5ldHdvcmtQcm9jZXNzKSBzaHJpbmtpbmcgY2FjaGUgYXBwcm94aW1hdGVTaXplPSV6dSBjYXBh
Y2l0eT0lenUiLCBzdGF0aWNfY2FzdDxzaXplX3Q+KG1fYXBwcm94aW1hdGVTaXplKSwgbV9jYXBh
Y2l0eSk7CisgICAgTE9HKE5ldHdvcmtDYWNoZVN0b3JhZ2UsICIoTmV0d29ya1Byb2Nlc3MpIHNo
cmlua2luZyBjYWNoZSBhcHByb3hpbWF0ZVNpemU9JXp1IGNhcGFjaXR5PSV6dSIsIGFwcHJveGlt
YXRlU2l6ZSgpLCBtX2NhcGFjaXR5KTsKIAogICAgIFN0cmluZ0NhcHR1cmUgY2FjaGVQYXRoQ2Fw
dHVyZShtX2RpcmVjdG9yeVBhdGgpOwogICAgIGJhY2tncm91bmRJT1F1ZXVlKCkuZGlzcGF0Y2go
W3RoaXMsIGNhY2hlUGF0aENhcHR1cmVdIHsKICAgICAgICAgU3RyaW5nIGNhY2hlUGF0aCA9IGNh
Y2hlUGF0aENhcHR1cmUuc3RyaW5nKCk7Ci0gICAgICAgIHRyYXZlcnNlQ2FjaGVGaWxlcyhjYWNo
ZVBhdGgsIFtdKGNvbnN0IFN0cmluZyYgZmlsZU5hbWUsIGNvbnN0IFN0cmluZyYgcGFydGl0aW9u
UGF0aCkgewotICAgICAgICAgICAgYXV0byBmaWxlUGF0aCA9IFdlYkNvcmU6OnBhdGhCeUFwcGVu
ZGluZ0NvbXBvbmVudChwYXJ0aXRpb25QYXRoLCBmaWxlTmFtZSk7CisgICAgICAgIHRyYXZlcnNl
Q2FjaGVGaWxlcyhjYWNoZVBhdGgsIFt0aGlzXShjb25zdCBTdHJpbmcmIGZpbGVOYW1lLCBjb25z
dCBTdHJpbmcmIHBhcnRpdGlvblBhdGgpIHsKKyAgICAgICAgICAgIGF1dG8gcmVjb3JkUGF0aCA9
IFdlYkNvcmU6OnBhdGhCeUFwcGVuZGluZ0NvbXBvbmVudChwYXJ0aXRpb25QYXRoLCBmaWxlTmFt
ZSk7CisgICAgICAgICAgICBhdXRvIGJvZHlQYXRoID0gYm9keVBhdGhGb3JSZWNvcmRQYXRoKHJl
Y29yZFBhdGgpOworCisgICAgICAgICAgICBhdXRvIHRpbWVzID0gZmlsZVRpbWVzKHJlY29yZFBh
dGgpOworICAgICAgICAgICAgdW5zaWduZWQgYm9keVNoYXJlQ291bnQgPSBtX2Jsb2JTdG9yYWdl
LnNoYXJlQ291bnQoYm9keVBhdGgpOworICAgICAgICAgICAgYXV0byBwcm9iYWJpbGl0eSA9IGRl
bGV0aW9uUHJvYmFiaWxpdHkodGltZXMsIGJvZHlTaGFyZUNvdW50KTsKIAotICAgICAgICAgICAg
YXV0byB0aW1lcyA9IGZpbGVUaW1lcyhmaWxlUGF0aCk7Ci0gICAgICAgICAgICBhdXRvIHByb2Jh
YmlsaXR5ID0gZGVsZXRpb25Qcm9iYWJpbGl0eSh0aW1lcyk7CiAgICAgICAgICAgICBib29sIHNo
b3VsZERlbGV0ZSA9IHJhbmRvbU51bWJlcigpIDwgcHJvYmFiaWxpdHk7CiAKLSAgICAgICAgICAg
IExPRyhOZXR3b3JrQ2FjaGVTdG9yYWdlLCAiRGVsZXRpb24gcHJvYmFiaWxpdHk9JWYgc2hvdWxk
RGVsZXRlPSVkIiwgcHJvYmFiaWxpdHksIHNob3VsZERlbGV0ZSk7CisgICAgICAgICAgICBMT0co
TmV0d29ya0NhY2hlU3RvcmFnZSwgIkRlbGV0aW9uIHByb2JhYmlsaXR5PSVmIGJvZHlMaW5rQ291
bnQ9JWQgc2hvdWxkRGVsZXRlPSVkIiwgcHJvYmFiaWxpdHksIGJvZHlTaGFyZUNvdW50LCBzaG91
bGREZWxldGUpOwogCi0gICAgICAgICAgICBpZiAoc2hvdWxkRGVsZXRlKQotICAgICAgICAgICAg
ICAgIFdlYkNvcmU6OmRlbGV0ZUZpbGUoZmlsZVBhdGgpOworICAgICAgICAgICAgaWYgKHNob3Vs
ZERlbGV0ZSkgeworICAgICAgICAgICAgICAgIFdlYkNvcmU6OmRlbGV0ZUZpbGUocmVjb3JkUGF0
aCk7CisgICAgICAgICAgICAgICAgbV9ibG9iU3RvcmFnZS5yZW1vdmUoYm9keVBhdGgpOworICAg
ICAgICAgICAgfQogICAgICAgICB9KTsKIAogICAgICAgICAvLyBMZXQgc3lzdGVtIGZpZ3VyZSBv
dXQgaWYgdGhleSBhcmUgcmVhbGx5IGVtcHR5LgpAQCAtNzM5LDYgKzcxNyw3IEBAIHZvaWQgU3Rv
cmFnZTo6ZGVsZXRlT2xkVmVyc2lvbnMoKQogICAgICAgICAgICAgV2ViQ29yZTo6ZGVsZXRlRW1w
dHlEaXJlY3RvcnkocGFydGl0aW9uUGF0aCk7CiAgICAgICAgIH0pOwogICAgIH0pOworICAgIC8v
IEZJWE1FOiBEZWxldGUgVjIgY2FjaGUuCiB9CiAKIH0KSW5kZXg6IFNvdXJjZS9XZWJLaXQyL05l
dHdvcmtQcm9jZXNzL2NhY2hlL05ldHdvcmtDYWNoZVN0b3JhZ2UuaAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvV2ViS2l0Mi9OZXR3b3JrUHJvY2Vzcy9jYWNoZS9OZXR3b3JrQ2FjaGVTdG9yYWdlLmgJ
KHJldmlzaW9uIDE4MjY4NykKKysrIFNvdXJjZS9XZWJLaXQyL05ldHdvcmtQcm9jZXNzL2NhY2hl
L05ldHdvcmtDYWNoZVN0b3JhZ2UuaAkod29ya2luZyBjb3B5KQpAQCAtMjgsNiArMjgsNyBAQAog
CiAjaWYgRU5BQkxFKE5FVFdPUktfQ0FDSEUpCiAKKyNpbmNsdWRlICJOZXR3b3JrQ2FjaGVCbG9i
U3RvcmFnZS5oIgogI2luY2x1ZGUgIk5ldHdvcmtDYWNoZURhdGEuaCIKICNpbmNsdWRlICJOZXR3
b3JrQ2FjaGVLZXkuaCIKICNpbmNsdWRlIDx3dGYvQmxvb21GaWx0ZXIuaD4KQEAgLTU3LDI3ICs1
OCwzMCBAQCBwdWJsaWM6CiAgICAgdHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPGJvb2wgKHN0ZDo6dW5p
cXVlX3B0cjxSZWNvcmQ+KT4gUmV0cmlldmVDb21wbGV0aW9uSGFuZGxlcjsKICAgICB2b2lkIHJl
dHJpZXZlKGNvbnN0IEtleSYsIHVuc2lnbmVkIHByaW9yaXR5LCBSZXRyaWV2ZUNvbXBsZXRpb25I
YW5kbGVyJiYpOwogCi0gICAgdHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPHZvaWQgKGJvb2wgc3VjY2Vz
cywgY29uc3QgRGF0YSYgbWFwcGVkQm9keSk+IFN0b3JlQ29tcGxldGlvbkhhbmRsZXI7Ci0gICAg
dm9pZCBzdG9yZShjb25zdCBSZWNvcmQmLCBTdG9yZUNvbXBsZXRpb25IYW5kbGVyJiYpOwotICAg
IHZvaWQgdXBkYXRlKGNvbnN0IFJlY29yZCYgdXBkYXRlUmVjb3JkLCBjb25zdCBSZWNvcmQmIGV4
aXN0aW5nUmVjb3JkLCBTdG9yZUNvbXBsZXRpb25IYW5kbGVyJiYpOworICAgIHR5cGVkZWYgc3Rk
OjpmdW5jdGlvbjx2b2lkIChjb25zdCBEYXRhJiBtYXBwZWRCb2R5KT4gTWFwcGVkQm9keUhhbmRs
ZXI7CisgICAgdm9pZCBzdG9yZShjb25zdCBSZWNvcmQmLCBNYXBwZWRCb2R5SGFuZGxlciYmKTsK
IAogICAgIHZvaWQgcmVtb3ZlKGNvbnN0IEtleSYpOwogCiAgICAgc3RydWN0IFJlY29yZEluZm8g
ewogICAgICAgICBzaXplX3QgYm9keVNpemUgeyAwIH07CiAgICAgICAgIGRvdWJsZSB3b3J0aCB7
IC0xIH07IC8vIDAtMSB3aGVyZSAxIGlzIHRoZSBtb3N0IHZhbHVhYmxlLgorICAgICAgICB1bnNp
Z25lZCBib2R5U2hhcmVDb3VudCB7IDAgfTsKKyAgICAgICAgU3RyaW5nIGJvZHlIYXNoOwogICAg
IH07CiAgICAgZW51bSBUcmF2ZXJzZUZsYWcgewogICAgICAgICBDb21wdXRlV29ydGggPSAxIDw8
IDAsCisgICAgICAgIFNoYXJlQ291bnQgPSAxIDw8IDEsCiAgICAgfTsKICAgICB0eXBlZGVmIHVu
c2lnbmVkIFRyYXZlcnNlRmxhZ3M7CiAgICAgLy8gTnVsbCByZWNvcmQgc2lnbmFscyBlbmQuCiAg
ICAgdm9pZCB0cmF2ZXJzZShUcmF2ZXJzZUZsYWdzLCBzdGQ6OmZ1bmN0aW9uPHZvaWQgKGNvbnN0
IFJlY29yZCosIGNvbnN0IFJlY29yZEluZm8mKT4mJik7CiAKICAgICB2b2lkIHNldENhcGFjaXR5
KHNpemVfdCk7CisgICAgc2l6ZV90IGFwcHJveGltYXRlU2l6ZSgpIGNvbnN0OwogICAgIHZvaWQg
Y2xlYXIoKTsKIAotICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCB2ZXJzaW9uID0gMjsKKyAgICBz
dGF0aWMgY29uc3QgdW5zaWduZWQgdmVyc2lvbiA9IDM7CiAKICAgICBjb25zdCBTdHJpbmcmIGJh
c2VEaXJlY3RvcnlQYXRoKCkgY29uc3QgeyByZXR1cm4gbV9iYXNlRGlyZWN0b3J5UGF0aDsgfQog
ICAgIGNvbnN0IFN0cmluZyYgZGlyZWN0b3J5UGF0aCgpIGNvbnN0IHsgcmV0dXJuIG1fZGlyZWN0
b3J5UGF0aDsgfQpAQCAtOTYsMTcgKzEwMCwxNyBAQCBwcml2YXRlOgogICAgIH07CiAgICAgdm9p
ZCBkaXNwYXRjaFJlYWRPcGVyYXRpb24oY29uc3QgUmVhZE9wZXJhdGlvbiYpOwogICAgIHZvaWQg
ZGlzcGF0Y2hQZW5kaW5nUmVhZE9wZXJhdGlvbnMoKTsKKyAgICB2b2lkIGZpbmlzaFJlYWRPcGVy
YXRpb24oY29uc3QgUmVhZE9wZXJhdGlvbiYsIHN0ZDo6dW5pcXVlX3B0cjxSZWNvcmQ+KTsKIAog
ICAgIHN0cnVjdCBXcml0ZU9wZXJhdGlvbiB7CiAgICAgICAgIFJlY29yZCByZWNvcmQ7Ci0gICAg
ICAgIE9wdGlvbmFsPFJlY29yZD4gZXhpc3RpbmdSZWNvcmQ7Ci0gICAgICAgIFN0b3JlQ29tcGxl
dGlvbkhhbmRsZXIgY29tcGxldGlvbkhhbmRsZXI7CisgICAgICAgIE1hcHBlZEJvZHlIYW5kbGVy
IG1hcHBlZEJvZHlIYW5kbGVyOwogICAgIH07Ci0gICAgdm9pZCBkaXNwYXRjaEZ1bGxXcml0ZU9w
ZXJhdGlvbihjb25zdCBXcml0ZU9wZXJhdGlvbiYpOwotICAgIHZvaWQgZGlzcGF0Y2hIZWFkZXJX
cml0ZU9wZXJhdGlvbihjb25zdCBXcml0ZU9wZXJhdGlvbiYpOworICAgIHZvaWQgZGlzcGF0Y2hX
cml0ZU9wZXJhdGlvbihjb25zdCBXcml0ZU9wZXJhdGlvbiYpOwogICAgIHZvaWQgZGlzcGF0Y2hQ
ZW5kaW5nV3JpdGVPcGVyYXRpb25zKCk7CisgICAgdm9pZCBmaW5pc2hXcml0ZU9wZXJhdGlvbihj
b25zdCBXcml0ZU9wZXJhdGlvbiYpOwogCi0gICAgdm9pZCB1cGRhdGVGaWxlTW9kaWZpY2F0aW9u
VGltZShJT0NoYW5uZWwmKTsKKyAgICB2b2lkIHVwZGF0ZUZpbGVNb2RpZmljYXRpb25UaW1lKGNv
bnN0IFN0cmluZyYgcGF0aCk7CiAKICAgICBXb3JrUXVldWUmIGlvUXVldWUoKSB7IHJldHVybiBt
X2lvUXVldWUuZ2V0KCk7IH0KICAgICBXb3JrUXVldWUmIGJhY2tncm91bmRJT1F1ZXVlKCkgeyBy
ZXR1cm4gbV9iYWNrZ3JvdW5kSU9RdWV1ZS5nZXQoKTsgfQpAQCAtMTQxLDYgKzE0NSw4IEBAIHBy
aXZhdGU6CiAgICAgUmVmPFdvcmtRdWV1ZT4gbV9pb1F1ZXVlOwogICAgIFJlZjxXb3JrUXVldWU+
IG1fYmFja2dyb3VuZElPUXVldWU7CiAgICAgUmVmPFdvcmtRdWV1ZT4gbV9zZXJpYWxCYWNrZ3Jv
dW5kSU9RdWV1ZTsKKworICAgIEJsb2JTdG9yYWdlIG1fYmxvYlN0b3JhZ2U7CiB9OwogCiB9Cklu
ZGV4OiBTb3VyY2UvV2ViS2l0Mi9XZWJLaXQyLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL1dlYktpdDIvV2ViS2l0Mi54Y29kZXByb2ovcHJvamVjdC5wYnhw
cm9qCShyZXZpc2lvbiAxODI2ODcpCisrKyBTb3VyY2UvV2ViS2l0Mi9XZWJLaXQyLnhjb2RlcHJv
ai9wcm9qZWN0LnBieHByb2oJKHdvcmtpbmcgY29weSkKQEAgLTE3OTQsNiArMTc5NCw4IEBACiAJ
CUU0ODlEMjhFMUEwQTJEQjgwMDc4QzA2QSAvKiBOZXR3b3JrQ2FjaGVEZWNvZGVyLmggaW4gSGVh
ZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBFNDg5RDI4NzFBMEEyREI4
MDA3OEMwNkEgLyogTmV0d29ya0NhY2hlRGVjb2Rlci5oICovOyB9OwogCQlFNDg5RDI4RjFBMEEy
REI4MDA3OEMwNkEgLyogTmV0d29ya0NhY2hlRW5jb2Rlci5jcHAgaW4gU291cmNlcyAqLyA9IHtp
c2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBFNDg5RDI4ODFBMEEyREI4MDA3OEMwNkEgLyog
TmV0d29ya0NhY2hlRW5jb2Rlci5jcHAgKi87IH07CiAJCUU0ODlEMjkwMUEwQTJEQjgwMDc4QzA2
QSAvKiBOZXR3b3JrQ2FjaGVFbmNvZGVyLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWls
ZEZpbGU7IGZpbGVSZWYgPSBFNDg5RDI4OTFBMEEyREI4MDA3OEMwNkEgLyogTmV0d29ya0NhY2hl
RW5jb2Rlci5oICovOyB9OworCQlFNDlENDBENzFBRDNGQjE3MDA2NkI3QjkgLyogTmV0d29ya0Nh
Y2hlQmxvYlN0b3JhZ2UuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmls
ZVJlZiA9IEU0OUQ0MEQ2MUFEM0ZCMTcwMDY2QjdCOSAvKiBOZXR3b3JrQ2FjaGVCbG9iU3RvcmFn
ZS5oICovOyB9OworCQlFNDlENDBEOTFBRDNGQjIxMDA2NkI3QjkgLyogTmV0d29ya0NhY2hlQmxv
YlN0b3JhZ2UuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVm
ID0gRTQ5RDQwRDgxQUQzRkIyMTAwNjZCN0I5IC8qIE5ldHdvcmtDYWNoZUJsb2JTdG9yYWdlLmNw
cCAqLzsgfTsKIAkJRUQ4MkE3RjIxMjhDNkZBRjAwNDQ3N0IzIC8qIFdLQnVuZGxlUGFnZU92ZXJs
YXkuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBMjJG
MEZGMTI4OUZDRDkwMDg1RTc0RiAvKiBXS0J1bmRsZVBhZ2VPdmVybGF5LmggKi87IHNldHRpbmdz
ID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsKIAkJRURDQTcxQjcxMjhEREE4QzAw
MjAxQjI2IC8qIFdLQnVuZGxlUGFnZU92ZXJsYXkuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0g
UEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUEyMkYxMDAxMjg5RkNEOTAwODVFNzRGIC8qIFdLQnVu
ZGxlUGFnZU92ZXJsYXkuY3BwICovOyB9OwogCQlGMDM2OTc4ODE1RjRCRjA1MDBDM0E4MEUgLyog
V2ViQ29sb3JQaWNrZXIuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBm
aWxlUmVmID0gRjAzNjk3ODcxNUY0QkYwNTAwQzNBODBFIC8qIFdlYkNvbG9yUGlja2VyLmNwcCAq
LzsgfTsKQEAgLTQwNTUsNiArNDA1Nyw4IEBACiAJCUU0ODlEMjg3MUEwQTJEQjgwMDc4QzA2QSAv
KiBOZXR3b3JrQ2FjaGVEZWNvZGVyLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmls
ZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9
IE5ldHdvcmtDYWNoZURlY29kZXIuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJRTQ4
OUQyODgxQTBBMkRCODAwNzhDMDZBIC8qIE5ldHdvcmtDYWNoZUVuY29kZXIuY3BwICovID0ge2lz
YSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBl
ID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gTmV0d29ya0NhY2hlRW5jb2Rlci5jcHA7IHNv
dXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUU0ODlEMjg5MUEwQTJEQjgwMDc4QzA2QSAvKiBO
ZXR3b3JrQ2FjaGVFbmNvZGVyLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVu
Y29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IE5l
dHdvcmtDYWNoZUVuY29kZXIuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRTQ5RDQw
RDYxQUQzRkIxNzAwNjZCN0I5IC8qIE5ldHdvcmtDYWNoZUJsb2JTdG9yYWdlLmggKi8gPSB7aXNh
ID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUg
PSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IE5ldHdvcmtDYWNoZUJsb2JTdG9yYWdlLmg7IHNvdXJj
ZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUU0OUQ0MEQ4MUFEM0ZCMjEwMDY2QjdCOSAvKiBOZXR3
b3JrQ2FjaGVCbG9iU3RvcmFnZS5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmls
ZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBh
dGggPSBOZXR3b3JrQ2FjaGVCbG9iU3RvcmFnZS5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7
IH07CiAJCUYwMzY5Nzg3MTVGNEJGMDUwMEMzQTgwRSAvKiBXZWJDb2xvclBpY2tlci5jcHAgKi8g
PSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmls
ZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBXZWJDb2xvclBpY2tlci5jcHA7IHNv
dXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUY2MTEzRTI0MTI2Q0UxODIwMDU3RDBBNyAvKiBB
UElVc2VyQ29udGVudFVSTFBhdHRlcm4uaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBm
aWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRo
ID0gQVBJVXNlckNvbnRlbnRVUkxQYXR0ZXJuLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07
CiAJCUY2MTEzRTI2MTI2Q0UxOUIwMDU3RDBBNyAvKiBXS1VzZXJDb250ZW50VVJMUGF0dGVybi5j
cHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtu
b3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBXS1VzZXJDb250ZW50VVJM
UGF0dGVybi5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CkBAIC03NDkyLDYgKzc0OTYs
OCBAQAogCQlFNDg5RDI4MjFBMEEyQkU4MDA3OEMwNkEgLyogY2FjaGUgKi8gPSB7CiAJCQlpc2Eg
PSBQQlhHcm91cDsKIAkJCWNoaWxkcmVuID0gKAorCQkJCUU0OUQ0MEQ4MUFEM0ZCMjEwMDY2QjdC
OSAvKiBOZXR3b3JrQ2FjaGVCbG9iU3RvcmFnZS5jcHAgKi8sCisJCQkJRTQ5RDQwRDYxQUQzRkIx
NzAwNjZCN0I5IC8qIE5ldHdvcmtDYWNoZUJsb2JTdG9yYWdlLmggKi8sCiAJCQkJRTQ0MzZFQkUx
QTBDRkRCMjAwRUFEMjA0IC8qIE5ldHdvcmtDYWNoZS5jcHAgKi8sCiAJCQkJRTQ0MzZFQkYxQTBD
RkRCMjAwRUFEMjA0IC8qIE5ldHdvcmtDYWNoZS5oICovLAogCQkJCUU0ODlEMjgzMUEwQTJEQjgw
MDc4QzA2QSAvKiBOZXR3b3JrQ2FjaGVDb2Rlci5oICovLApAQCAtODE0Miw2ICs4MTQ4LDcgQEAK
IAkJCQkxQUFGMDhBMjE5MjY4MUQxMDBCNjM5MEMgLyogV2ViVXNlckNvbnRlbnRDb250cm9sbGVy
UHJveHkuaCBpbiBIZWFkZXJzICovLAogCQkJCTdDMzYxRDc5MTkyODAzQkQwMDM2QTU5RCAvKiBX
ZWJVc2VyQ29udGVudENvbnRyb2xsZXJQcm94eU1lc3NhZ2VzLmggaW4gSGVhZGVycyAqLywKIAkJ
CQkzRjg4OUQxNTE4ODc3OEM5MDBGRUFEQUYgLyogV2ViVmlkZW9GdWxsc2NyZWVuTWFuYWdlclBy
b3h5LmggaW4gSGVhZGVycyAqLywKKwkJCQlFNDlENDBENzFBRDNGQjE3MDA2NkI3QjkgLyogTmV0
d29ya0NhY2hlQmxvYlN0b3JhZ2UuaCBpbiBIZWFkZXJzICovLAogCQkJCTI5Q0Q1NUFBMTI4RTI5
NEYwMDEzM0M4NSAvKiBXS0FjY2Vzc2liaWxpdHlXZWJQYWdlT2JqZWN0QmFzZS5oIGluIEhlYWRl
cnMgKi8sCiAJCQkJMjkyMzJERjQxOEIyOUQ2ODAwRDA1OTZGIC8qIFdLQWNjZXNzaWJpbGl0eVdl
YlBhZ2VPYmplY3RNYWMuaCBpbiBIZWFkZXJzICovLAogCQkJCTJEMDczMEEzMTlGOUM3REEwMEU5
RDlDNCAvKiBXS0FjdGlvbk1lbnVDb250cm9sbGVyLmggaW4gSGVhZGVycyAqLywKQEAgLTk1MDUs
NiArOTUxMiw3IEBACiAJCQkJQ0Q2N0QzMEUxNUMwOEY5QTAwODQzQURGIC8qIEluamVjdGVkQnVu
ZGxlUGFnZURpYWdub3N0aWNMb2dnaW5nQ2xpZW50LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCUUx
RUU1M0U3MTFGOENGRkIwMENDQkVFNCAvKiBJbmplY3RlZEJ1bmRsZVBhZ2VFZGl0b3JDbGllbnQu
Y3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJQkMxNEUxMDkxMjBCOTA1RTAwODI2QzBDIC8qIEluamVj
dGVkQnVuZGxlUGFnZUZvcm1DbGllbnQuY3BwIGluIFNvdXJjZXMgKi8sCisJCQkJRTQ5RDQwRDkx
QUQzRkIyMTAwNjZCN0I5IC8qIE5ldHdvcmtDYWNoZUJsb2JTdG9yYWdlLmNwcCBpbiBTb3VyY2Vz
ICovLAogCQkJCUNENUM2NkEwMTM0QjlEMzgwMDRGRTJBOCAvKiBJbmplY3RlZEJ1bmRsZVBhZ2VG
dWxsU2NyZWVuQ2xpZW50LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCUJDQThDNkE4MTFFM0JBNUYw
MDgxMkZCNyAvKiBJbmplY3RlZEJ1bmRsZVBhZ2VMb2FkZXJDbGllbnQuY3BwIGluIFNvdXJjZXMg
Ki8sCiAJCQkJQkM4MTQ3QUExMkY2NENEQTAwN0IyQzMyIC8qIEluamVjdGVkQnVuZGxlUGFnZVBv
bGljeUNsaWVudC5jcHAgaW4gU291cmNlcyAqLywK
</data>

          </attachment>
      

    </bug>

</bugzilla>