<?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>35634</bug_id>
          
          <creation_ts>2010-03-03 02:59:33 -0800</creation_ts>
          <short_desc>[DRT/Chromium] Add CppVariant and CppBoundClass</short_desc>
          <delta_ts>2010-03-09 03:56:01 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>New Bugs</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Other</rep_platform>
          <op_sys>OS X 10.5</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>35902</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Kent Tamura">tkent</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>abarth</cc>
    
    <cc>dglazkov</cc>
    
    <cc>fishd</cc>
    
    <cc>hamaji</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>195426</commentid>
    <comment_count>0</comment_count>
    <who name="Kent Tamura">tkent</who>
    <bug_when>2010-03-03 02:59:33 -0800</bug_when>
    <thetext>[DRT/Chromium] Add CppVariant and CppBoundClass</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>195427</commentid>
    <comment_count>1</comment_count>
      <attachid>49892</attachid>
    <who name="Kent Tamura">tkent</who>
    <bug_when>2010-03-03 03:03:55 -0800</bug_when>
    <thetext>Created attachment 49892
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>195650</commentid>
    <comment_count>2</comment_count>
      <attachid>49892</attachid>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2010-03-03 09:56:50 -0800</bug_when>
    <thetext>Comment on attachment 49892
Patch

Minor comments overall. Do you think Cpp* prefix on these classes makes any sense in the context of DRT? I am having naming doubts, but can&apos;t come up with anything better. Maybe fishd would have some ideas.

&gt; +// Copyright (c) 2010 The Chromium Authors. All rights reserved.
&gt; +// Use of this source code is governed by a BSD-style license that can be
&gt; +// found in the LICENSE file.

Incorrect license header. Please use standard WebKit header.

&gt; +#include &quot;config.h&quot;
&gt; +#include &quot;CppBoundClass.h&quot;
&gt; +
&gt; +#include &quot;base/compiler_specific.h&quot;
&gt; +#include &quot;base/string_util.h&quot;
&gt; +#include &quot;public/WebBindings.h&quot;
&gt; +#include &quot;public/WebFrame.h&quot;
&gt; +#include &quot;public/WebString.h&quot;
&gt; +#include &lt;wtf/Assertions.h&gt;

&gt; +
&gt; +private:
&gt; +    scoped_ptr&lt;CppBoundClass::GetterCallback&gt; m_callback;

Since we&apos;re using WTF already, let&apos;s use OwnPtr here.

&gt; +    // If the given method is exposed by the C++ class associated with this
&gt; +    // NPObject, invokes it with the given args and returns a result.  Otherwise,
&gt; +    // returns &quot;undefined&quot; (in the JavaScript sense).  Called by the JS runtime.
&gt; +    static bool invoke(NPObject*, NPIdentifier,
&gt; +                       const NPVariant* args, uint32_t arg_count,
&gt; +                       NPVariant* result);

arguments, argumentCount

&gt; +/* static */

No need for these comments in WebKit-land.

&gt; +    PropertyCallback* propertyCallback =
&gt; +        callback ? new GetterPropertyCallback(callback) : 0;

Let&apos;s just keep these on one line.

&gt; +
&gt; +void CppBoundClass::bindProperty(const string&amp; name, CppVariant* prop)
&gt; +{
&gt; +    PropertyCallback* propertyCallback =
&gt; +        prop ? new CppVariantPropertyCallback(prop) : 0;

Ditto.

&gt; +void CppBoundClass::bindToJavascript(WebFrame* frame, const WebString&amp; classname)
&gt; +{
&gt; +#if USE(JSC)
&gt; +#error &quot;This is not going to work anymore...but it&apos;s not clear what the solution is...or if it&apos;s still necessary.&quot;
&gt; +    JSC::JSLock lock(false);
&gt; +#endif

This is not needed here.

&gt; +
&gt; +    // BindToWindowObject will take its own reference to the NPObject, and clean
&gt; +    // up after itself.  It will also (indirectly) register the object with V8,
&gt; +    // so we must remember this so we can unregister it when we&apos;re destroyed.
&gt; +    frame-&gt;bindToWindowObject(classname,
&gt; +                              NPVARIANT_TO_OBJECT(*getAsCppVariant()));

Keep on one line.

&gt; @@ -0,0 +1,179 @@
&gt; +// Copyright (c) 2010 The Chromium Authors. All rights reserved.
&gt; +// Use of this source code is governed by a BSD-style license that can be
&gt; +// found in the LICENSE file.

Wrong header.

&gt; +
&gt; +/*
&gt; +  CppBoundClass class:
&gt; +  This base class serves as a parent for C++ classes designed to be bound to
&gt; +  JavaScript objects.
&gt; +
&gt; +  Subclasses should define the constructor to build the property and method
&gt; +  lists needed to bind this class to a JS object.  They should also declare
&gt; +  and define member variables and methods to be exposed to JS through
&gt; +  that object.
&gt; +*/

&gt; +
&gt; +#ifndef CppBoundClass_h
&gt; +#define CppBoundClass_h
&gt; +
&gt; +#include &quot;CppVariant.h&quot;
&gt; +#include &quot;base/callback.h&quot;

This dependency can be broken fairly easily. We only use a very small subset of Chromium callback machinery.

&gt; +#include &quot;base/scoped_ptr.h&quot;

As mentioned before, might be good to break this dependency and use wtf/OwnPtr.h

&gt; +#include &lt;map&gt;
&gt; +#include &lt;vector&gt;

Can use wtf primitives here as well.

&gt; +
&gt; +    DISALLOW_COPY_AND_ASSIGN(CppBoundClass);

Can use wtf/Noncopyable

&gt; +++ b/WebKitTools/DumpRenderTree/chromium/CppVariant.cpp
&gt; @@ -0,0 +1,284 @@
&gt; +// Copyright (c) 2010 The Chromium Authors. All rights reserved.
&gt; +// Use of this source code is governed by a BSD-style license that can be
&gt; +// found in the LICENSE file.

Wrong header.

&gt; +
&gt; +// This file contains definitions for CppVariant.
&gt; +

Gratuitous comment :)

&gt; @@ -0,0 +1,109 @@
&gt; +// Copyright (c) 2010 The Chromium Authors. All rights reserved.
&gt; +// Use of this source code is governed by a BSD-style license that can be
&gt; +// found in the LICENSE file.

Header fail.

&gt; +
&gt; +  For a usage example, see cpp_binding_example.{h|cc}.

Rename this?

&gt; +#include &quot;third_party/npapi/bindings/npruntime.h&quot;

This seems odd. How will this build here?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>195700</commentid>
    <comment_count>3</comment_count>
    <who name="Darin Fisher (:fishd, Google)">fishd</who>
    <bug_when>2010-03-03 11:56:49 -0800</bug_when>
    <thetext>&gt;&gt; +#include &quot;third_party/npapi/bindings/npruntime.h&quot;
&gt;
&gt;This seems odd. How will this build here?

Use #include &lt;bindings/npruntime.h&gt; just like WebBindings.h, or just include WebBindings.h :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>195837</commentid>
    <comment_count>4</comment_count>
    <who name="Kent Tamura">tkent</who>
    <bug_when>2010-03-03 18:12:01 -0800</bug_when>
    <thetext>(In reply to comment #2)
&gt; (From update of attachment 49892 [details])
&gt; Minor comments overall. Do you think Cpp* prefix on these classes makes any
&gt; sense in the context of DRT? I am having naming doubts, but can&apos;t come up with
&gt; anything better. Maybe fishd would have some ideas.

Cpp* is not so meaningful, but I feel it is not bad.

&gt; &gt; +// Copyright (c) 2010 The Chromium Authors. All rights reserved.
&gt; &gt; +// Use of this source code is governed by a BSD-style license that can be
&gt; &gt; +// found in the LICENSE file.
&gt; 
&gt; Incorrect license header. Please use standard WebKit header.

These files have changes by non-Googler.  What header should we add?  Just replace &quot;Google Inc&quot; with &quot;The Chromium Authors&quot; in the usual header?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>195843</commentid>
    <comment_count>5</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-03-03 18:24:21 -0800</bug_when>
    <thetext>&gt; These files have changes by non-Googler.  What header should we add?  Just
&gt; replace &quot;Google Inc&quot; with &quot;The Chromium Authors&quot; in the usual header?

In the past, folks in the WebKit community have expressed uncertainty about attributing copyright to &quot;The Chromium Authors.&quot;  My understanding is that this is actually ok legally, but we might want to be more specific if its feasible.  There are a few options:

1) Attribute copyright explicitly to everyone in the Chromium AUTHORS file (i.e., by listing them in the copyright notice).

2) Use the revision history of this file to filter that list down to those who have actually contributed to this file.

3) Convince the WebKit community that &quot;The Chromium Authors&quot; is a find entity to which to attribute copyright.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>195845</commentid>
    <comment_count>6</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-03-03 18:24:42 -0800</bug_when>
    <thetext>s/find/fine/</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>195856</commentid>
    <comment_count>7</comment_count>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2010-03-03 18:55:11 -0800</bug_when>
    <thetext>Don&apos;t feel blocked by the name issues. If you have another patch ready today, I am fine with the timezone-friendly reviewer r+ing it today after the rest of the nits are addressed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>195910</commentid>
    <comment_count>8</comment_count>
      <attachid>49991</attachid>
    <who name="Kent Tamura">tkent</who>
    <bug_when>2010-03-03 23:36:05 -0800</bug_when>
    <thetext>Created attachment 49991
Proposed patch (rev.2)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>195912</commentid>
    <comment_count>9</comment_count>
    <who name="Kent Tamura">tkent</who>
    <bug_when>2010-03-03 23:43:01 -0800</bug_when>
    <thetext>&gt; &gt; +// Copyright (c) 2010 The Chromium Authors. All rights reserved.
&gt; &gt; +// Use of this source code is governed by a BSD-style license that can be
&gt; &gt; +// found in the LICENSE file.
&gt; 
&gt; Incorrect license header. Please use standard WebKit header.

I replaced them with the standard one with &quot;The Chromium Authors&quot;.

&gt; &gt; +    scoped_ptr&lt;CppBoundClass::GetterCallback&gt; m_callback;
&gt; 
&gt; Since we&apos;re using WTF already, let&apos;s use OwnPtr here.

Done.

&gt; &gt; +    static bool invoke(NPObject*, NPIdentifier,
&gt; &gt; +                       const NPVariant* args, uint32_t arg_count,
&gt; &gt; +                       NPVariant* result);
&gt; 
&gt; arguments, argumentCount

Done.  Fixed other occurrences.

&gt; &gt; +/* static */
&gt; 
&gt; No need for these comments in WebKit-land.

Done.

&gt; &gt; +    PropertyCallback* propertyCallback =
&gt; &gt; +        callback ? new GetterPropertyCallback(callback) : 0;
&gt; 
&gt; Let&apos;s just keep these on one line.

Done.

&gt; &gt; +    PropertyCallback* propertyCallback =
&gt; &gt; +        prop ? new CppVariantPropertyCallback(prop) : 0;
&gt; 
&gt; Ditto.

Ditto.

&gt; &gt; +#if USE(JSC)
&gt; &gt; +#error &quot;This is not going to work anymore...but it&apos;s not clear what the solution is...or if it&apos;s still necessary.&quot;
&gt; &gt; +    JSC::JSLock lock(false);
&gt; &gt; +#endif
&gt; 
&gt; This is not needed here.

Removed.

&gt; &gt; +    frame-&gt;bindToWindowObject(classname,
&gt; &gt; +                              NPVARIANT_TO_OBJECT(*getAsCppVariant()));
&gt; 
&gt; Keep on one line.

Done.

&gt; &gt; +#include &quot;base/callback.h&quot;
&gt; 
&gt; This dependency can be broken fairly easily. We only use a very small subset of
&gt; Chromium callback machinery.

Ok, I made specialized callback classes and put them into this file.

&gt; &gt; +#include &quot;base/scoped_ptr.h&quot;
&gt; 
&gt; As mentioned before, might be good to break this dependency and use
&gt; wtf/OwnPtr.h

Done.

&gt; &gt; +#include &lt;map&gt;
&gt; &gt; +#include &lt;vector&gt;
&gt; 
&gt; Can use wtf primitives here as well.

Done.

&gt; &gt; +    DISALLOW_COPY_AND_ASSIGN(CppBoundClass);
&gt; 
&gt; Can use wtf/Noncopyable

Done.

&gt; &gt; +
&gt; &gt; +// This file contains definitions for CppVariant.
&gt; &gt; +
&gt; 
&gt; Gratuitous comment :)

Removed.

&gt; &gt; +  For a usage example, see cpp_binding_example.{h|cc}.
&gt; 
&gt; Rename this?

Removed.

&gt; &gt; +#include &quot;third_party/npapi/bindings/npruntime.h&quot;
&gt; 
&gt; This seems odd. How will this build here?

I supposed WebKit/chromium was in the include paths and third_party/npapi was extracted to there.
I changed it to WebBindings.h.  It seems better.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>196080</commentid>
    <comment_count>10</comment_count>
      <attachid>49991</attachid>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2010-03-04 07:42:18 -0800</bug_when>
    <thetext>Comment on attachment 49991
Proposed patch (rev.2)

I think we Adam mentioned &quot;Chromium Authors&quot;, he meant it as a more long-term solution. At this point, finding actual contributors through history and attributing them directly the only option.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>196260</commentid>
    <comment_count>11</comment_count>
      <attachid>50064</attachid>
    <who name="Kent Tamura">tkent</who>
    <bug_when>2010-03-04 16:33:11 -0800</bug_when>
    <thetext>Created attachment 50064
Proposed patch rev.3 (Copyright header change)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>196261</commentid>
    <comment_count>12</comment_count>
    <who name="Kent Tamura">tkent</who>
    <bug_when>2010-03-04 16:33:49 -0800</bug_when>
    <thetext>(In reply to comment #10)
&gt; (From update of attachment 49991 [details])
&gt; I think we Adam mentioned &quot;Chromium Authors&quot;, he meant it as a more long-term
&gt; solution. At this point, finding actual contributors through history and
&gt; attributing them directly the only option.

ok, I updated so.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>196262</commentid>
    <comment_count>13</comment_count>
      <attachid>50064</attachid>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2010-03-04 16:36:18 -0800</bug_when>
    <thetext>Comment on attachment 50064
Proposed patch rev.3 (Copyright header change)

&gt; +/*
&gt; + * Copyright (C) 2010 The Chromium Authors. All rights reserved.

Please fix up on landing..</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>196266</commentid>
    <comment_count>14</comment_count>
    <who name="Kent Tamura">tkent</who>
    <bug_when>2010-03-04 16:40:21 -0800</bug_when>
    <thetext>(In reply to comment #13)
&gt; &gt; + * Copyright (C) 2010 The Chromium Authors. All rights reserved.
&gt; 
&gt; Please fix up on landing..

Oops, sure.
I had a mistake on copying files...</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>196271</commentid>
    <comment_count>15</comment_count>
    <who name="Kent Tamura">tkent</who>
    <bug_when>2010-03-04 16:50:54 -0800</bug_when>
    <thetext>Landed as r55563.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>49892</attachid>
            <date>2010-03-03 03:03:55 -0800</date>
            <delta_ts>2010-03-03 23:35:59 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-35634-20100303200353.patch</filename>
            <type>text/plain</type>
            <size>33755</size>
            <attacher name="Kent Tamura">tkent</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL0NoYW5nZUxvZyBiL1dlYktpdFRvb2xzL0NoYW5nZUxv
ZwppbmRleCAyMzU3NzBhLi4zZDMwNWU3IDEwMDY0NAotLS0gYS9XZWJLaXRUb29scy9DaGFuZ2VM
b2cKKysrIGIvV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjEgQEAKKzIwMTAtMDMt
MDMgIEtlbnQgVGFtdXJhICA8dGtlbnRAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFJldmlld2Vk
IGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFtEUlQvQ2hyb21pdW1dIEFkZCBDcHBWYXJp
YW50IGFuZCBDcHBCb3VuZENsYXNzCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3No
b3dfYnVnLmNnaT9pZD0zNTYzNAorCisgICAgICAgIEFkZCBDcHBWYXJpYW50IGFuZCBDcHBCb3Vu
ZENsYXNzIGNsYXNzZXMsIHdoaWNoIGFyZSBnb2luZyB0byBiZQorICAgICAgICB1c2VkIGJ5IER1
bXBSZW5kZXJUcmVlIENocm9taXVtIHBvcnQuIFRoZXNlIGZpbGVzIGFyZSBiYXNlZCBvbjoKKyAg
ICAgICAgLSBzcmMvd2Via2l0L2dsdWUvY3BwX3ZhcmlhbnQue2NjLGh9IGFuZAorICAgICAgICAt
IHNyYy93ZWJraXQvZ2x1ZS9jcHBfYm91bmRfY2xhc3Mue2NjLGh9CisgICAgICAgIG9mIENocm9t
aXVtIHJldi40MDQ5Mi4KKworICAgICAgICAqIER1bXBSZW5kZXJUcmVlL2Nocm9taXVtL0NwcEJv
dW5kQ2xhc3MuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBEdW1wUmVuZGVyVHJlZS9jaHJvbWl1bS9D
cHBCb3VuZENsYXNzLmg6IEFkZGVkLgorICAgICAgICAqIER1bXBSZW5kZXJUcmVlL2Nocm9taXVt
L0NwcFZhcmlhbnQuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBEdW1wUmVuZGVyVHJlZS9jaHJvbWl1
bS9DcHBWYXJpYW50Lmg6IEFkZGVkLgorCiAyMDEwLTAzLTAyICBBcm5vIFJlbmV2aWVyICA8YXJu
b0ByZW5ldmllci5uZXQ+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgR3VzdGF2byBOb3JvbmhhIFNp
bHZhLgpkaWZmIC0tZ2l0IGEvV2ViS2l0VG9vbHMvRHVtcFJlbmRlclRyZWUvY2hyb21pdW0vQ3Bw
Qm91bmRDbGFzcy5jcHAgYi9XZWJLaXRUb29scy9EdW1wUmVuZGVyVHJlZS9jaHJvbWl1bS9DcHBC
b3VuZENsYXNzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjFmZDY5
Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViS2l0VG9vbHMvRHVtcFJlbmRlclRyZWUvY2hyb21pdW0v
Q3BwQm91bmRDbGFzcy5jcHAKQEAgLTAsMCArMSwzNDEgQEAKKy8vIENvcHlyaWdodCAoYykgMjAx
MCBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0
aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBj
YW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIFRoaXMgZmlsZSBjb250
YWlucyBkZWZpbml0aW9ucyBmb3IgQ3BwQm91bmRDbGFzcworCisvLyBIZXJlJ3MgdGhlIGNvbnRy
b2wgZmxvdyBvZiBhIEpTIG1ldGhvZCBnZXR0aW5nIGZvcndhcmRlZCB0byBhIGNsYXNzLgorLy8g
LSBTb21ldGhpbmcgY2FsbHMgb3VyIE5QT2JqZWN0IHdpdGggYSBmdW5jdGlvbiBsaWtlICJJbnZv
a2UiLgorLy8gLSBDcHBOUE9iamVjdCdzIHN0YXRpYyBpbnZva2UoKSBmdW5jdGlvbiBmb3J3YXJk
cyBpdCB0byBpdHMgYXR0YWNoZWQKKy8vICAgQ3BwQm91bmRDbGFzcydzIGludm9rZSgpIG1ldGhv
ZC4KKy8vIC0gQ3BwQm91bmRDbGFzcyBoYXMgdGhlbiBvdmVycmlkZGVuIGludm9rZSgpIHRvIGxv
b2sgdXAgdGhlIGZ1bmN0aW9uCisvLyAgIG5hbWUgaW4gaXRzIGludGVybmFsIG1hcCBvZiBtZXRo
b2RzLCBhbmQgdGhlbiBjYWxscyB0aGUgYXBwcm9wcmlhdGUKKy8vICAgbWV0aG9kLgorCisjaW5j
bHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQ3BwQm91bmRDbGFzcy5oIgorCisjaW5jbHVkZSAi
YmFzZS9jb21waWxlcl9zcGVjaWZpYy5oIgorI2luY2x1ZGUgImJhc2Uvc3RyaW5nX3V0aWwuaCIK
KyNpbmNsdWRlICJwdWJsaWMvV2ViQmluZGluZ3MuaCIKKyNpbmNsdWRlICJwdWJsaWMvV2ViRnJh
bWUuaCIKKyNpbmNsdWRlICJwdWJsaWMvV2ViU3RyaW5nLmgiCisjaW5jbHVkZSA8d3RmL0Fzc2Vy
dGlvbnMuaD4KKwordXNpbmcgbmFtZXNwYWNlIFdlYktpdDsKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7
CisKK2NsYXNzIENwcFZhcmlhbnRQcm9wZXJ0eUNhbGxiYWNrIDogcHVibGljIENwcEJvdW5kQ2xh
c3M6OlByb3BlcnR5Q2FsbGJhY2sgeworcHVibGljOgorICAgIENwcFZhcmlhbnRQcm9wZXJ0eUNh
bGxiYWNrKENwcFZhcmlhbnQqIHZhbHVlKSA6IG1fdmFsdWUodmFsdWUpIHsgfQorCisgICAgdmly
dHVhbCBib29sIGdldFZhbHVlKENwcFZhcmlhbnQqIHZhbHVlKQorICAgIHsKKyAgICAgICAgdmFs
dWUtPnNldCgqbV92YWx1ZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHZp
cnR1YWwgYm9vbCBzZXRWYWx1ZShjb25zdCBDcHBWYXJpYW50JiB2YWx1ZSkKKyAgICB7CisgICAg
ICAgIG1fdmFsdWUtPnNldCh2YWx1ZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKwor
cHJpdmF0ZToKKyAgICBDcHBWYXJpYW50KiBtX3ZhbHVlOworfTsKKworY2xhc3MgR2V0dGVyUHJv
cGVydHlDYWxsYmFjayA6IHB1YmxpYyBDcHBCb3VuZENsYXNzOjpQcm9wZXJ0eUNhbGxiYWNrIHsK
K3B1YmxpYzoKKyAgICBHZXR0ZXJQcm9wZXJ0eUNhbGxiYWNrKENwcEJvdW5kQ2xhc3M6OkdldHRl
ckNhbGxiYWNrKiBjYWxsYmFjaykKKyAgICAgICAgOiBtX2NhbGxiYWNrKGNhbGxiYWNrKSB7IH0K
KworICAgIHZpcnR1YWwgYm9vbCBnZXRWYWx1ZShDcHBWYXJpYW50KiB2YWx1ZSkKKyAgICB7Cisg
ICAgICAgIG1fY2FsbGJhY2stPlJ1bih2YWx1ZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAg
IH0KKworICAgIHZpcnR1YWwgYm9vbCBzZXRWYWx1ZShjb25zdCBDcHBWYXJpYW50JiB2YWx1ZSkK
KyAgICB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc2Nv
cGVkX3B0cjxDcHBCb3VuZENsYXNzOjpHZXR0ZXJDYWxsYmFjaz4gbV9jYWxsYmFjazsKK307CisK
Ky8vIE91ciBzcGVjaWFsIE5QT2JqZWN0IHR5cGUuICBXZSBleHRlbmQgYW4gTlBPYmplY3Qgd2l0
aCBhIHBvaW50ZXIgdG8gYQorLy8gQ3BwQm91bmRDbGFzcywgd2hpY2ggaXMganVzdCBhIEMrKyBp
bnRlcmZhY2UgdGhhdCB3ZSBmb3J3YXJkIGFsbCBOUE9iamVjdAorLy8gY2FsbGJhY2tzIHRvLgor
c3RydWN0IENwcE5QT2JqZWN0IHsKKyAgICBOUE9iamVjdCBwYXJlbnQ7IC8vIFRoaXMgbXVzdCBi
ZSB0aGUgZmlyc3QgZmllbGQgaW4gdGhlIHN0cnVjdC4KKyAgICBDcHBCb3VuZENsYXNzKiBib3Vu
ZENsYXNzOworCisgICAgLy8KKyAgICAvLyBBbGwgZm9sbG93aW5nIG9iamVjdHMgYW5kIGZ1bmN0
aW9ucyBhcmUgc3RhdGljLCBhbmQganVzdCB1c2VkIHRvIGludGVyZmFjZQorICAgIC8vIHdpdGgg
TlBPYmplY3QvTlBDbGFzcy4KKyAgICAvLworCisgICAgLy8gQW4gTlBDbGFzcyBhc3NvY2lhdGVz
IHN0YXRpYyBmdW5jdGlvbnMgb2YgQ3BwTlBPYmplY3Qgd2l0aCB0aGUKKyAgICAvLyBmdW5jdGlv
biBwb2ludGVycyB1c2VkIGJ5IHRoZSBKUyBydW50aW1lLgorICAgIHN0YXRpYyBOUENsYXNzIG5w
Q2xhc3M7CisKKyAgICAvLyBBbGxvY2F0ZSBhIG5ldyBOUE9iamVjdCB3aXRoIHRoZSBzcGVjaWZp
ZWQgY2xhc3MuCisgICAgc3RhdGljIE5QT2JqZWN0KiBhbGxvY2F0ZShOUFAsIE5QQ2xhc3MqKTsK
KworICAgIC8vIEZyZWUgYW4gb2JqZWN0LgorICAgIHN0YXRpYyB2b2lkIGRlYWxsb2NhdGUoTlBP
YmplY3QqKTsKKworICAgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgQysrIGNsYXNzIGFzc29jaWF0
ZWQgd2l0aCB0aGlzIE5QT2JqZWN0IGV4cG9zZXMgdGhlCisgICAgLy8gZ2l2ZW4gcHJvcGVydHku
ICBDYWxsZWQgYnkgdGhlIEpTIHJ1bnRpbWUuCisgICAgc3RhdGljIGJvb2wgaGFzUHJvcGVydHko
TlBPYmplY3QqLCBOUElkZW50aWZpZXIpOworCisgICAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBD
KysgY2xhc3MgYXNzb2NpYXRlZCB3aXRoIHRoaXMgTlBPYmplY3QgZXhwb3NlcyB0aGUKKyAgICAv
LyBnaXZlbiBtZXRob2QuICBDYWxsZWQgYnkgdGhlIEpTIHJ1bnRpbWUuCisgICAgc3RhdGljIGJv
b2wgaGFzTWV0aG9kKE5QT2JqZWN0KiwgTlBJZGVudGlmaWVyKTsKKworICAgIC8vIElmIHRoZSBn
aXZlbiBtZXRob2QgaXMgZXhwb3NlZCBieSB0aGUgQysrIGNsYXNzIGFzc29jaWF0ZWQgd2l0aCB0
aGlzCisgICAgLy8gTlBPYmplY3QsIGludm9rZXMgaXQgd2l0aCB0aGUgZ2l2ZW4gYXJncyBhbmQg
cmV0dXJucyBhIHJlc3VsdC4gIE90aGVyd2lzZSwKKyAgICAvLyByZXR1cm5zICJ1bmRlZmluZWQi
IChpbiB0aGUgSmF2YVNjcmlwdCBzZW5zZSkuICBDYWxsZWQgYnkgdGhlIEpTIHJ1bnRpbWUuCisg
ICAgc3RhdGljIGJvb2wgaW52b2tlKE5QT2JqZWN0KiwgTlBJZGVudGlmaWVyLAorICAgICAgICAg
ICAgICAgICAgICAgICBjb25zdCBOUFZhcmlhbnQqIGFyZ3MsIHVpbnQzMl90IGFyZ19jb3VudCwK
KyAgICAgICAgICAgICAgICAgICAgICAgTlBWYXJpYW50KiByZXN1bHQpOworCisgICAgLy8gSWYg
dGhlIGdpdmVuIHByb3BlcnR5IGlzIGV4cG9zZWQgYnkgdGhlIEMrKyBjbGFzcyBhc3NvY2lhdGVk
IHdpdGggdGhpcworICAgIC8vIE5QT2JqZWN0LCByZXR1cm5zIGl0cyB2YWx1ZS4gIE90aGVyd2lz
ZSwgcmV0dXJucyAidW5kZWZpbmVkIiAoaW4gdGhlCisgICAgLy8gSmF2YVNjcmlwdCBzZW5zZSku
ICBDYWxsZWQgYnkgdGhlIEpTIHJ1bnRpbWUuCisgICAgc3RhdGljIGJvb2wgZ2V0UHJvcGVydHko
TlBPYmplY3QqLCBOUElkZW50aWZpZXIsIE5QVmFyaWFudCAqcmVzdWx0KTsKKworICAgIC8vIElm
IHRoZSBnaXZlbiBwcm9wZXJ0eSBpcyBleHBvc2VkIGJ5IHRoZSBDKysgY2xhc3MgYXNzb2NpYXRl
ZCB3aXRoIHRoaXMKKyAgICAvLyBOUE9iamVjdCwgc2V0cyBpdHMgdmFsdWUuICBPdGhlcndpc2Us
IGRvZXMgbm90aGluZy4gQ2FsbGVkIGJ5IHRoZSBKUworICAgIC8vIHJ1bnRpbWUuCisgICAgc3Rh
dGljIGJvb2wgc2V0UHJvcGVydHkoTlBPYmplY3QqLCBOUElkZW50aWZpZXIsIGNvbnN0IE5QVmFy
aWFudCAqdmFsdWUpOworfTsKKworLy8gQnVpbGQgQ3BwTlBPYmplY3QncyBzdGF0aWMgZnVuY3Rp
b24gcG9pbnRlcnMgaW50byBhbiBOUENsYXNzLCBmb3IgdXNlCisvLyBpbiBjb25zdHJ1Y3Rpbmcg
TlBPYmplY3RzIGZvciB0aGUgQysrIGNsYXNzZXMuCitOUENsYXNzIENwcE5QT2JqZWN0OjpucENs
YXNzID0geworICAgIE5QX0NMQVNTX1NUUlVDVF9WRVJTSU9OLAorICAgIENwcE5QT2JqZWN0Ojph
bGxvY2F0ZSwKKyAgICBDcHBOUE9iamVjdDo6ZGVhbGxvY2F0ZSwKKyAgICAvKiBOUEludmFsaWRh
dGVGdW5jdGlvblB0ciAqLyAwLAorICAgIENwcE5QT2JqZWN0OjpoYXNNZXRob2QsCisgICAgQ3Bw
TlBPYmplY3Q6Omludm9rZSwKKyAgICAvKiBOUEludm9rZURlZmF1bHRGdW5jdGlvblB0ciAqLyAw
LAorICAgIENwcE5QT2JqZWN0OjpoYXNQcm9wZXJ0eSwKKyAgICBDcHBOUE9iamVjdDo6Z2V0UHJv
cGVydHksCisgICAgQ3BwTlBPYmplY3Q6OnNldFByb3BlcnR5LAorICAgIC8qIE5QUmVtb3ZlUHJv
cGVydHlGdW5jdGlvblB0ciAqLyAwCit9OworCisvKiBzdGF0aWMgKi8KK05QT2JqZWN0KiBDcHBO
UE9iamVjdDo6YWxsb2NhdGUoTlBQIG5wcCwgTlBDbGFzcyogYUNsYXNzKQoreworICAgIENwcE5Q
T2JqZWN0KiBvYmogPSBuZXcgQ3BwTlBPYmplY3Q7CisgICAgLy8gb2JqLT5wYXJlbnQgd2lsbCBi
ZSBpbml0aWFsaXplZCBieSB0aGUgTlBPYmplY3QgY29kZSBjYWxsaW5nIHRoaXMuCisgICAgb2Jq
LT5ib3VuZENsYXNzID0gMDsKKyAgICByZXR1cm4gJm9iai0+cGFyZW50OworfQorCisvKiBzdGF0
aWMgKi8KK3ZvaWQgQ3BwTlBPYmplY3Q6OmRlYWxsb2NhdGUoTlBPYmplY3QqIG5wT2JqKQorewor
ICAgIENwcE5QT2JqZWN0KiBvYmogPSByZWludGVycHJldF9jYXN0PENwcE5QT2JqZWN0Kj4obnBP
YmopOworICAgIGRlbGV0ZSBvYmo7Cit9CisKKy8qIHN0YXRpYyAqLworYm9vbCBDcHBOUE9iamVj
dDo6aGFzTWV0aG9kKE5QT2JqZWN0KiBucE9iaiwgTlBJZGVudGlmaWVyIGlkZW50KQoreworICAg
IENwcE5QT2JqZWN0KiBvYmogPSByZWludGVycHJldF9jYXN0PENwcE5QT2JqZWN0Kj4obnBPYmop
OworICAgIHJldHVybiBvYmotPmJvdW5kQ2xhc3MtPmhhc01ldGhvZChpZGVudCk7Cit9CisKKy8q
IHN0YXRpYyAqLworYm9vbCBDcHBOUE9iamVjdDo6aGFzUHJvcGVydHkoTlBPYmplY3QqIG5wT2Jq
LCBOUElkZW50aWZpZXIgaWRlbnQpCit7CisgICAgQ3BwTlBPYmplY3QqIG9iaiA9IHJlaW50ZXJw
cmV0X2Nhc3Q8Q3BwTlBPYmplY3QqPihucE9iaik7CisgICAgcmV0dXJuIG9iai0+Ym91bmRDbGFz
cy0+aGFzUHJvcGVydHkoaWRlbnQpOworfQorCisvKiBzdGF0aWMgKi8KK2Jvb2wgQ3BwTlBPYmpl
Y3Q6Omludm9rZShOUE9iamVjdCogbnBPYmosIE5QSWRlbnRpZmllciBpZGVudCwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICBjb25zdCBOUFZhcmlhbnQqIGFyZ3MsIHVpbnQzMl90IGFyZ0NvdW50
LAorICAgICAgICAgICAgICAgICAgICAgICAgIE5QVmFyaWFudCogcmVzdWx0KQoreworICAgIENw
cE5QT2JqZWN0KiBvYmogPSByZWludGVycHJldF9jYXN0PENwcE5QT2JqZWN0Kj4obnBPYmopOwor
ICAgIHJldHVybiBvYmotPmJvdW5kQ2xhc3MtPmludm9rZShpZGVudCwgYXJncywgYXJnQ291bnQs
IHJlc3VsdCk7Cit9CisKKy8qIHN0YXRpYyAqLworYm9vbCBDcHBOUE9iamVjdDo6Z2V0UHJvcGVy
dHkoTlBPYmplY3QqIG5wT2JqLCBOUElkZW50aWZpZXIgaWRlbnQsIE5QVmFyaWFudCogcmVzdWx0
KQoreworICAgIENwcE5QT2JqZWN0KiBvYmogPSByZWludGVycHJldF9jYXN0PENwcE5QT2JqZWN0
Kj4obnBPYmopOworICAgIHJldHVybiBvYmotPmJvdW5kQ2xhc3MtPmdldFByb3BlcnR5KGlkZW50
LCByZXN1bHQpOworfQorCisvKiBzdGF0aWMgKi8KK2Jvb2wgQ3BwTlBPYmplY3Q6OnNldFByb3Bl
cnR5KE5QT2JqZWN0KiBucE9iaiwgTlBJZGVudGlmaWVyIGlkZW50LCBjb25zdCBOUFZhcmlhbnQq
IHZhbHVlKQoreworICAgIENwcE5QT2JqZWN0KiBvYmogPSByZWludGVycHJldF9jYXN0PENwcE5Q
T2JqZWN0Kj4obnBPYmopOworICAgIHJldHVybiBvYmotPmJvdW5kQ2xhc3MtPnNldFByb3BlcnR5
KGlkZW50LCB2YWx1ZSk7Cit9CisKK0NwcEJvdW5kQ2xhc3M6On5DcHBCb3VuZENsYXNzKCkKK3sK
KyAgICBmb3IgKE1ldGhvZExpc3Q6Oml0ZXJhdG9yIGkgPSBtX21ldGhvZHMuYmVnaW4oKTsgaSAh
PSBtX21ldGhvZHMuZW5kKCk7ICsraSkKKyAgICAgICAgZGVsZXRlIGktPnNlY29uZDsKKworICAg
IGZvciAoUHJvcGVydHlMaXN0OjppdGVyYXRvciBpID0gbV9wcm9wZXJ0aWVzLmJlZ2luKCk7IGkg
IT0gbV9wcm9wZXJ0aWVzLmVuZCgpOyArK2kpCisgICAgICAgIGRlbGV0ZSBpLT5zZWNvbmQ7CisK
KyAgICAvLyBVbnJlZ2lzdGVyIG91cnNlbHZlcyBpZiB3ZSB3ZXJlIGJvdW5kIHRvIGEgZnJhbWUu
CisgICAgaWYgKG1fYm91bmRUb0ZyYW1lKQorICAgICAgICBXZWJCaW5kaW5nczo6dW5yZWdpc3Rl
ck9iamVjdChOUFZBUklBTlRfVE9fT0JKRUNUKG1fc2VsZlZhcmlhbnQpKTsKK30KKworYm9vbCBD
cHBCb3VuZENsYXNzOjpoYXNNZXRob2QoTlBJZGVudGlmaWVyIGlkZW50KSBjb25zdAoreworICAg
IHJldHVybiBtX21ldGhvZHMuZmluZChpZGVudCkgIT0gbV9tZXRob2RzLmVuZCgpOworfQorCiti
b29sIENwcEJvdW5kQ2xhc3M6Omhhc1Byb3BlcnR5KE5QSWRlbnRpZmllciBpZGVudCkgY29uc3QK
K3sKKyAgICByZXR1cm4gbV9wcm9wZXJ0aWVzLmZpbmQoaWRlbnQpICE9IG1fcHJvcGVydGllcy5l
bmQoKTsKK30KKworYm9vbCBDcHBCb3VuZENsYXNzOjppbnZva2UoTlBJZGVudGlmaWVyIGlkZW50
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTlBWYXJpYW50KiBhcmdzLAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGFyZ0NvdW50LAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgTlBWYXJpYW50KiByZXN1bHQpIHsKKyAgICBNZXRob2RMaXN0Ojpjb25zdF9p
dGVyYXRvciBtZXRob2QgPSBtX21ldGhvZHMuZmluZChpZGVudCk7CisgICAgQ2FsbGJhY2sqIGNh
bGxiYWNrOworICAgIGlmIChtZXRob2QgPT0gbV9tZXRob2RzLmVuZCgpKSB7CisgICAgICAgIGlm
ICghbV9mYWxsYmFja0NhbGxiYWNrLmdldCgpKSB7CisgICAgICAgICAgICBWT0lEX1RPX05QVkFS
SUFOVCgqcmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAg
ICAgICBjYWxsYmFjayA9IG1fZmFsbGJhY2tDYWxsYmFjay5nZXQoKTsKKyAgICB9IGVsc2UKKyAg
ICAgICAgY2FsbGJhY2sgPSAoKm1ldGhvZCkuc2Vjb25kOworCisgICAgLy8gQnVpbGQgYSBDcHBB
cmd1bWVudExpc3QgYXJndW1lbnQgdmVjdG9yIGZyb20gdGhlIE5QVmFyaWFudHMgY29taW5nIGlu
LgorICAgIENwcEFyZ3VtZW50TGlzdCBjcHBBcmdzKGFyZ0NvdW50KTsKKyAgICBmb3IgKHNpemVf
dCBpID0gMDsgaSA8IGFyZ0NvdW50OyBpKyspCisgICAgICAgIGNwcEFyZ3NbaV0uc2V0KGFyZ3Nb
aV0pOworCisgICAgQ3BwVmFyaWFudCBjcHBSZXN1bHQ7CisgICAgY2FsbGJhY2stPlJ1bihjcHBB
cmdzLCAmY3BwUmVzdWx0KTsKKworICAgIGNwcFJlc3VsdC5jb3B5VG9OUFZhcmlhbnQocmVzdWx0
KTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDcHBCb3VuZENsYXNzOjpnZXRQcm9wZXJ0
eShOUElkZW50aWZpZXIgaWRlbnQsIE5QVmFyaWFudCogcmVzdWx0KSBjb25zdAoreworICAgIFBy
b3BlcnR5TGlzdDo6Y29uc3RfaXRlcmF0b3IgY2FsbGJhY2sgPSBtX3Byb3BlcnRpZXMuZmluZChp
ZGVudCk7CisgICAgaWYgKGNhbGxiYWNrID09IG1fcHJvcGVydGllcy5lbmQoKSkgeworICAgICAg
ICBWT0lEX1RPX05QVkFSSUFOVCgqcmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
IH0KKworICAgIENwcFZhcmlhbnQgY3BwVmFsdWU7CisgICAgaWYgKCFjYWxsYmFjay0+c2Vjb25k
LT5nZXRWYWx1ZSgmY3BwVmFsdWUpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgY3BwVmFs
dWUuY29weVRvTlBWYXJpYW50KHJlc3VsdCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wg
Q3BwQm91bmRDbGFzczo6c2V0UHJvcGVydHkoTlBJZGVudGlmaWVyIGlkZW50LCBjb25zdCBOUFZh
cmlhbnQqIHZhbHVlKQoreworICAgIFByb3BlcnR5TGlzdDo6aXRlcmF0b3IgY2FsbGJhY2sgPSBt
X3Byb3BlcnRpZXMuZmluZChpZGVudCk7CisgICAgaWYgKGNhbGxiYWNrID09IG1fcHJvcGVydGll
cy5lbmQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgQ3BwVmFyaWFudCBjcHBWYWx1
ZTsKKyAgICBjcHBWYWx1ZS5zZXQoKnZhbHVlKTsKKyAgICByZXR1cm4gKCpjYWxsYmFjaykuc2Vj
b25kLT5zZXRWYWx1ZShjcHBWYWx1ZSk7Cit9CisKK3ZvaWQgQ3BwQm91bmRDbGFzczo6YmluZENh
bGxiYWNrKGNvbnN0IHN0cmluZyYgbmFtZSwgQ2FsbGJhY2sqIGNhbGxiYWNrKQoreworICAgIE5Q
SWRlbnRpZmllciBpZGVudCA9IFdlYkJpbmRpbmdzOjpnZXRTdHJpbmdJZGVudGlmaWVyKG5hbWUu
Y19zdHIoKSk7CisgICAgTWV0aG9kTGlzdDo6aXRlcmF0b3Igb2xkQ2FsbGJhY2sgPSBtX21ldGhv
ZHMuZmluZChpZGVudCk7CisgICAgaWYgKG9sZENhbGxiYWNrICE9IG1fbWV0aG9kcy5lbmQoKSkg
eworICAgICAgICBkZWxldGUgb2xkQ2FsbGJhY2stPnNlY29uZDsKKyAgICAgICAgaWYgKCFjYWxs
YmFjaykgeworICAgICAgICAgICAgbV9tZXRob2RzLmVyYXNlKG9sZENhbGxiYWNrKTsKKyAgICAg
ICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1fbWV0aG9kc1tpZGVudF0g
PSBjYWxsYmFjazsKK30KKwordm9pZCBDcHBCb3VuZENsYXNzOjpiaW5kR2V0dGVyQ2FsbGJhY2so
Y29uc3Qgc3RyaW5nJiBuYW1lLCBHZXR0ZXJDYWxsYmFjayogY2FsbGJhY2spCit7CisgICAgUHJv
cGVydHlDYWxsYmFjayogcHJvcGVydHlDYWxsYmFjayA9CisgICAgICAgIGNhbGxiYWNrID8gbmV3
IEdldHRlclByb3BlcnR5Q2FsbGJhY2soY2FsbGJhY2spIDogMDsKKyAgICBiaW5kUHJvcGVydHko
bmFtZSwgcHJvcGVydHlDYWxsYmFjayk7Cit9CisKK3ZvaWQgQ3BwQm91bmRDbGFzczo6YmluZFBy
b3BlcnR5KGNvbnN0IHN0cmluZyYgbmFtZSwgQ3BwVmFyaWFudCogcHJvcCkKK3sKKyAgICBQcm9w
ZXJ0eUNhbGxiYWNrKiBwcm9wZXJ0eUNhbGxiYWNrID0KKyAgICAgICAgcHJvcCA/IG5ldyBDcHBW
YXJpYW50UHJvcGVydHlDYWxsYmFjayhwcm9wKSA6IDA7CisgICAgYmluZFByb3BlcnR5KG5hbWUs
IHByb3BlcnR5Q2FsbGJhY2spOworfQorCit2b2lkIENwcEJvdW5kQ2xhc3M6OmJpbmRQcm9wZXJ0
eShjb25zdCBzdHJpbmcmIG5hbWUsIFByb3BlcnR5Q2FsbGJhY2sqIGNhbGxiYWNrKQoreworICAg
IE5QSWRlbnRpZmllciBpZGVudCA9IFdlYkJpbmRpbmdzOjpnZXRTdHJpbmdJZGVudGlmaWVyKG5h
bWUuY19zdHIoKSk7CisgICAgUHJvcGVydHlMaXN0OjppdGVyYXRvciBvbGRDYWxsYmFjayA9IG1f
cHJvcGVydGllcy5maW5kKGlkZW50KTsKKyAgICBpZiAob2xkQ2FsbGJhY2sgIT0gbV9wcm9wZXJ0
aWVzLmVuZCgpKSB7CisgICAgICAgIGRlbGV0ZSBvbGRDYWxsYmFjay0+c2Vjb25kOworICAgICAg
ICBpZiAoIWNhbGxiYWNrKSB7CisgICAgICAgICAgICBtX3Byb3BlcnRpZXMuZXJhc2Uob2xkQ2Fs
bGJhY2spOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgbV9w
cm9wZXJ0aWVzW2lkZW50XSA9IGNhbGxiYWNrOworfQorCitib29sIENwcEJvdW5kQ2xhc3M6Omlz
TWV0aG9kUmVnaXN0ZXJlZChjb25zdCBzdHJpbmcmIG5hbWUpIGNvbnN0Cit7CisgICAgTlBJZGVu
dGlmaWVyIGlkZW50ID0gV2ViQmluZGluZ3M6OmdldFN0cmluZ0lkZW50aWZpZXIobmFtZS5jX3N0
cigpKTsKKyAgICBNZXRob2RMaXN0Ojpjb25zdF9pdGVyYXRvciBjYWxsYmFjayA9IG1fbWV0aG9k
cy5maW5kKGlkZW50KTsKKyAgICByZXR1cm4gY2FsbGJhY2sgIT0gbV9tZXRob2RzLmVuZCgpOwor
fQorCitDcHBWYXJpYW50KiBDcHBCb3VuZENsYXNzOjpnZXRBc0NwcFZhcmlhbnQoKQoreworICAg
IGlmICghbV9zZWxmVmFyaWFudC5pc09iamVjdCgpKSB7CisgICAgICAgIC8vIENyZWF0ZSBhbiBO
UE9iamVjdCB1c2luZyBvdXIgc3RhdGljIE5QQ2xhc3MuICBUaGUgZmlyc3QgYXJndW1lbnQgKGEK
KyAgICAgICAgLy8gcGx1Z2luJ3MgaW5zdGFuY2UgaGFuZGxlKSBpcyBwYXNzZWQgdGhyb3VnaCB0
byB0aGUgYWxsb2NhdGUgZnVuY3Rpb24KKyAgICAgICAgLy8gZGlyZWN0bHksIGFuZCB3ZSBkb24n
dCB1c2UgaXQsIHNvIGl0J3Mgb2sgdG8gYmUgMC4KKyAgICAgICAgTlBPYmplY3QqIG5wT2JqID0g
V2ViQmluZGluZ3M6OmNyZWF0ZU9iamVjdCgwLCAmQ3BwTlBPYmplY3Q6Om5wQ2xhc3MpOworICAg
ICAgICBDcHBOUE9iamVjdCogb2JqID0gcmVpbnRlcnByZXRfY2FzdDxDcHBOUE9iamVjdCo+KG5w
T2JqKTsKKyAgICAgICAgb2JqLT5ib3VuZENsYXNzID0gdGhpczsKKyAgICAgICAgbV9zZWxmVmFy
aWFudC5zZXQobnBPYmopOworICAgICAgICBXZWJCaW5kaW5nczo6cmVsZWFzZU9iamVjdChucE9i
aik7IC8vIENwcFZhcmlhbnQgdGFrZXMgdGhlIHJlZmVyZW5jZS4KKyAgICB9CisgICAgQVNTRVJU
KG1fc2VsZlZhcmlhbnQuaXNPYmplY3QoKSk7CisgICAgcmV0dXJuICZtX3NlbGZWYXJpYW50Owor
fQorCit2b2lkIENwcEJvdW5kQ2xhc3M6OmJpbmRUb0phdmFzY3JpcHQoV2ViRnJhbWUqIGZyYW1l
LCBjb25zdCBXZWJTdHJpbmcmIGNsYXNzbmFtZSkKK3sKKyNpZiBVU0UoSlNDKQorI2Vycm9yICJU
aGlzIGlzIG5vdCBnb2luZyB0byB3b3JrIGFueW1vcmUuLi5idXQgaXQncyBub3QgY2xlYXIgd2hh
dCB0aGUgc29sdXRpb24gaXMuLi5vciBpZiBpdCdzIHN0aWxsIG5lY2Vzc2FyeS4iCisgICAgSlND
OjpKU0xvY2sgbG9jayhmYWxzZSk7CisjZW5kaWYKKworICAgIC8vIEJpbmRUb1dpbmRvd09iamVj
dCB3aWxsIHRha2UgaXRzIG93biByZWZlcmVuY2UgdG8gdGhlIE5QT2JqZWN0LCBhbmQgY2xlYW4K
KyAgICAvLyB1cCBhZnRlciBpdHNlbGYuICBJdCB3aWxsIGFsc28gKGluZGlyZWN0bHkpIHJlZ2lz
dGVyIHRoZSBvYmplY3Qgd2l0aCBWOCwKKyAgICAvLyBzbyB3ZSBtdXN0IHJlbWVtYmVyIHRoaXMg
c28gd2UgY2FuIHVucmVnaXN0ZXIgaXQgd2hlbiB3ZSdyZSBkZXN0cm95ZWQuCisgICAgZnJhbWUt
PmJpbmRUb1dpbmRvd09iamVjdChjbGFzc25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBOUFZBUklBTlRfVE9fT0JKRUNUKCpnZXRBc0NwcFZhcmlhbnQoKSkpOworICAgIG1fYm91
bmRUb0ZyYW1lID0gdHJ1ZTsKK30KZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL0R1bXBSZW5kZXJU
cmVlL2Nocm9taXVtL0NwcEJvdW5kQ2xhc3MuaCBiL1dlYktpdFRvb2xzL0R1bXBSZW5kZXJUcmVl
L2Nocm9taXVtL0NwcEJvdW5kQ2xhc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAw
MDAwLi5hMWI3NzU1Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViS2l0VG9vbHMvRHVtcFJlbmRlclRy
ZWUvY2hyb21pdW0vQ3BwQm91bmRDbGFzcy5oCkBAIC0wLDAgKzEsMTc5IEBACisvLyBDb3B5cmln
aHQgKGMpIDIwMTAgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisv
LyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNl
bnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvKgorICBD
cHBCb3VuZENsYXNzIGNsYXNzOgorICBUaGlzIGJhc2UgY2xhc3Mgc2VydmVzIGFzIGEgcGFyZW50
IGZvciBDKysgY2xhc3NlcyBkZXNpZ25lZCB0byBiZSBib3VuZCB0bworICBKYXZhU2NyaXB0IG9i
amVjdHMuCisKKyAgU3ViY2xhc3NlcyBzaG91bGQgZGVmaW5lIHRoZSBjb25zdHJ1Y3RvciB0byBi
dWlsZCB0aGUgcHJvcGVydHkgYW5kIG1ldGhvZAorICBsaXN0cyBuZWVkZWQgdG8gYmluZCB0aGlz
IGNsYXNzIHRvIGEgSlMgb2JqZWN0LiAgVGhleSBzaG91bGQgYWxzbyBkZWNsYXJlCisgIGFuZCBk
ZWZpbmUgbWVtYmVyIHZhcmlhYmxlcyBhbmQgbWV0aG9kcyB0byBiZSBleHBvc2VkIHRvIEpTIHRo
cm91Z2gKKyAgdGhhdCBvYmplY3QuCisqLworCisjaWZuZGVmIENwcEJvdW5kQ2xhc3NfaAorI2Rl
ZmluZSBDcHBCb3VuZENsYXNzX2gKKworI2luY2x1ZGUgIkNwcFZhcmlhbnQuaCIKKyNpbmNsdWRl
ICJiYXNlL2NhbGxiYWNrLmgiCisjaW5jbHVkZSAiYmFzZS9zY29wZWRfcHRyLmgiCisjaW5jbHVk
ZSA8bWFwPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIFdlYktpdCB7CitjbGFzcyBX
ZWJGcmFtZTsKK2NsYXNzIFdlYlN0cmluZzsKK30KKwordHlwZWRlZiBzdGQ6OnZlY3RvcjxDcHBW
YXJpYW50PiBDcHBBcmd1bWVudExpc3Q7CisKKy8vIENwcEJvdW5kQ2xhc3MgbGV0cyB5b3UgbWFw
IEphdmFzY3JpcHQgbWV0aG9kIGNhbGxzIGFuZCBwcm9wZXJ0eSBhY2Nlc3NlcworLy8gZGlyZWN0
bHkgdG8gQysrIG1ldGhvZCBjYWxscyBhbmQgQ3BwVmFyaWFudCogdmFyaWFibGUgYWNjZXNzLgor
Y2xhc3MgQ3BwQm91bmRDbGFzcyB7CitwdWJsaWM6CisgICAgY2xhc3MgUHJvcGVydHlDYWxsYmFj
ayB7CisgICAgcHVibGljOgorICAgICAgICB2aXJ0dWFsIH5Qcm9wZXJ0eUNhbGxiYWNrKCkgeyB9
CisKKyAgICAgICAgLy8gU2V0cyB8dmFsdWV8IHRvIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHku
IFJldHVybnMgZmFsc2UgaW4gY2FzZSBvZgorICAgICAgICAvLyBmYWlsdXJlLiB8dmFsdWV8IGlz
IGFsd2F5cyBub24tMC4KKyAgICAgICAgdmlydHVhbCBib29sIGdldFZhbHVlKENwcFZhcmlhbnQq
IHJlc3VsdCkgPSAwOworCisgICAgICAgIC8vIHNldHMgdGhlIHByb3BlcnR5IHZhbHVlIHRvIHx2
YWx1ZXwuIFJldHVybnMgZmFsc2UgaW4gY2FzZSBvZiBmYWlsdXJlLgorICAgICAgICB2aXJ0dWFs
IGJvb2wgc2V0VmFsdWUoY29uc3QgQ3BwVmFyaWFudCYpID0gMDsKKyAgICB9OworCisgICAgLy8g
VGhlIGNvbnN0cnVjdG9yIHNob3VsZCBjYWxsIEJpbmRNZXRob2QsIEJpbmRQcm9wZXJ0eSwgYW5k
CisgICAgLy8gU2V0RmFsbGJhY2tNZXRob2QgYXMgbmVlZGVkIHRvIHNldCB1cCB0aGUgbWV0aG9k
cywgcHJvcGVydGllcywgYW5kCisgICAgLy8gZmFsbGJhY2sgbWV0aG9kLgorICAgIENwcEJvdW5k
Q2xhc3MoKSA6IG1fYm91bmRUb0ZyYW1lKGZhbHNlKSB7fQorICAgIHZpcnR1YWwgfkNwcEJvdW5k
Q2xhc3MoKTsKKworICAgIC8vIFJldHVybiBhIENwcFZhcmlhbnQgcmVwcmVzZW50aW5nIHRoaXMg
Y2xhc3MsIGZvciB1c2Ugd2l0aCBCaW5kUHJvcGVydHkoKS4KKyAgICAvLyBUaGUgdmFyaWFudCB0
eXBlIGlzIGd1YXJhbnRlZWQgdG8gYmUgTlBWYXJpYW50VHlwZV9PYmplY3QuCisgICAgQ3BwVmFy
aWFudCogZ2V0QXNDcHBWYXJpYW50KCk7CisKKyAgICAvLyBHaXZlbiBhIFdlYkZyYW1lLCBCaW5k
VG9KYXZhc2NyaXB0IGJ1aWxkcyB0aGUgTlBPYmplY3QgdGhhdCB3aWxsIHJlcHJlc2VudAorICAg
IC8vIHRoZSBjbGFzcyBhbmQgYmluZHMgaXQgdG8gdGhlIGZyYW1lJ3Mgd2luZG93IHVuZGVyIHRo
ZSBnaXZlbiBuYW1lLiAgVGhpcworICAgIC8vIHNob3VsZCBnZW5lcmFsbHkgYmUgY2FsbGVkIGZy
b20gdGhlIFdlYlZpZXcgZGVsZWdhdGUncworICAgIC8vIFdpbmRvd09iamVjdENsZWFyZWQoKS4g
QSBjbGFzcyBzbyBib3VuZCB3aWxsIGJlIGFjY2Vzc2libGUgdG8gSmF2YVNjcmlwdAorICAgIC8v
IGFzIHdpbmRvdy48Y2xhc3NuYW1lPi4gVGhlIG93bmVyIG9mIHRoZSBDcHBCb3VuZE9iamVjdCBp
cyByZXNwb25zaWJsZSBmb3IKKyAgICAvLyBrZWVwaW5nIHRoZSBvYmplY3QgYXJvdW5kIHdoaWxl
IHRoZSBmcmFtZSBpcyBhbGl2ZSwgYW5kIGZvciBkZXN0cm95aW5nIGl0CisgICAgLy8gYWZ0ZXJ3
YXJkcy4KKyAgICB2b2lkIGJpbmRUb0phdmFzY3JpcHQoV2ViS2l0OjpXZWJGcmFtZSosIGNvbnN0
IFdlYktpdDo6V2ViU3RyaW5nJiBjbGFzc25hbWUpOworCisgICAgLy8gVGhlIHR5cGUgb2YgY2Fs
bGJhY2tzLgorICAgIHR5cGVkZWYgQ2FsbGJhY2syPGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENw
cFZhcmlhbnQqPjo6VHlwZSBDYWxsYmFjazsKKyAgICB0eXBlZGVmIENhbGxiYWNrMTxDcHBWYXJp
YW50Kj46OlR5cGUgR2V0dGVyQ2FsbGJhY2s7CisKKyAgICAvLyBVc2VkIGJ5IGEgdGVzdC4gIFJl
dHVybnMgdHJ1ZSBpZiBhIG1ldGhvZCB3aXRoIG5hbWUgfG5hbWV8IGV4aXN0cywKKyAgICAvLyBy
ZWdhcmRsZXNzIG9mIHdoZXRoZXIgYSBmYWxsYmFjayBpcyByZWdpc3RlcmVkLgorICAgIGJvb2wg
aXNNZXRob2RSZWdpc3RlcmVkKGNvbnN0IHN0ZDo6c3RyaW5nJikgY29uc3Q7CisKK3Byb3RlY3Rl
ZDoKKyAgICAvLyBCaW5kIHRoZSBKYXZhc2NyaXB0IG1ldGhvZCBjYWxsZWQgfG5hbWV8IHRvIHRo
ZSBDKysgY2FsbGJhY2sgfGNhbGxiYWNrfC4KKyAgICB2b2lkIGJpbmRDYWxsYmFjayhjb25zdCBz
dGQ6OnN0cmluZyYsIENhbGxiYWNrKik7CisKKyAgICAvLyBBIHdyYXBwZXIgZm9yIEJpbmRDYWxs
YmFjaywgdG8gc2ltcGxpZnkgdGhlIGNvbW1vbiBjYXNlIG9mIGJpbmRpbmcgYQorICAgIC8vIG1l
dGhvZCBvbiB0aGUgY3VycmVudCBvYmplY3QuICBUaG91Z2ggbm90IHZlcmlmaWVkIGhlcmUsIHxt
ZXRob2R8CisgICAgLy8gbXVzdCBiZSBhIG1ldGhvZCBvZiB0aGlzIENwcEJvdW5kQ2xhc3Mgc3Vi
Y2xhc3MuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICB2b2lkIGJpbmRNZXRob2QoY29u
c3Qgc3RkOjpzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgIHZvaWQgKFQ6OiptZXRo
b2QpKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqKSkKKyAgICB7CisgICAgICAg
IENhbGxiYWNrKiBjYWxsYmFjayA9CisgICAgICAgICAgICBOZXdDYWxsYmFjazxULCBjb25zdCBD
cHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50Kj4oCisgICAgICAgICAgICAgICAgc3RhdGljX2Nh
c3Q8VCo+KHRoaXMpLCBtZXRob2QpOworICAgICAgICBiaW5kQ2FsbGJhY2sobmFtZSwgY2FsbGJh
Y2spOworICAgIH0KKworICAgIC8vIEJpbmQgSmF2YXNjcmlwdCBwcm9wZXJ0eSB8bmFtZXwgdG8g
dGhlIEMrKyBnZXR0ZXIgY2FsbGJhY2sgfGNhbGxiYWNrfC4KKyAgICAvLyBUaGlzIGNhbiBiZSB1
c2VkIHRvIGNyZWF0ZSByZWFkLW9ubHkgcHJvcGVydGllcy4KKyAgICB2b2lkIGJpbmRHZXR0ZXJD
YWxsYmFjayhjb25zdCBzdGQ6OnN0cmluZyYsIEdldHRlckNhbGxiYWNrKik7CisKKyAgICAvLyBB
IHdyYXBwZXIgZm9yIEJpbmRHZXR0ZXJDYWxsYmFjaywgdG8gc2ltcGxpZnkgdGhlIGNvbW1vbiBj
YXNlIG9mIGJpbmRpbmcgYQorICAgIC8vIHByb3BlcnR5IG9uIHRoZSBjdXJyZW50IG9iamVjdC4g
IFRob3VnaCBub3QgdmVyaWZpZWQgaGVyZSwgfG1ldGhvZHwKKyAgICAvLyBtdXN0IGJlIGEgbWV0
aG9kIG9mIHRoaXMgQ3BwQm91bmRDbGFzcyBzdWJjbGFzcy4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFt
ZSBUPgorICAgIHZvaWQgYmluZFByb3BlcnR5KGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCB2b2lk
IChUOjoqbWV0aG9kKShDcHBWYXJpYW50KikpCisgICAgeworICAgICAgICBHZXR0ZXJDYWxsYmFj
ayogY2FsbGJhY2sgPQorICAgICAgICAgICAgTmV3Q2FsbGJhY2s8VCwgQ3BwVmFyaWFudCo+KHN0
YXRpY19jYXN0PFQqPih0aGlzKSwgbWV0aG9kKTsKKyAgICAgICAgYmluZEdldHRlckNhbGxiYWNr
KG5hbWUsIGNhbGxiYWNrKTsKKyAgICB9CisKKyAgICAvLyBCaW5kIHRoZSBKYXZhc2NyaXB0IHBy
b3BlcnR5IGNhbGxlZCB8bmFtZXwgdG8gYSBDcHBWYXJpYW50LgorICAgIHZvaWQgYmluZFByb3Bl
cnR5KGNvbnN0IHN0ZDo6c3RyaW5nJiwgQ3BwVmFyaWFudCopOworCisgICAgLy8gQmluZCBKYXZh
c2NyaXB0IHByb3BlcnR5IGNhbGxlZCB8bmFtZXwgdG8gYSBQcm9wZXJ0eUNhbGxiYWNrLgorICAg
IC8vIENwcEJvdW5kQ2xhc3MgYXNzdW1lcyBjb250cm9sIG92ZXIgdGhlIGxpZmUgdGltZSBvZiB0
aGUgY2FsbGJhY2suCisgICAgdm9pZCBiaW5kUHJvcGVydHkoY29uc3Qgc3RkOjpzdHJpbmcmLCBQ
cm9wZXJ0eUNhbGxiYWNrKik7CisKKyAgICAvLyBTZXQgdGhlIGZhbGxiYWNrIGNhbGxiYWNrLCB3
aGljaCBpcyBjYWxsZWQgd2hlbiB3aGVuIGEgY2FsbGJhY2sgaXMKKyAgICAvLyBpbnZva2VkIHRo
YXQgaXNuJ3QgYm91bmQuCisgICAgLy8gSWYgaXQgaXMgMCAoaXRzIGRlZmF1bHQgdmFsdWUpLCBh
IEphdmFTY3JpcHQgZXhjZXB0aW9uIGlzIHRocm93biBpbgorICAgIC8vIHRoYXQgY2FzZSAoYXMg
bm9ybWFsbHkgZXhwZWN0ZWQpLiBJZiBub24gMCwgdGhlIGZhbGxiYWNrIG1ldGhvZCBpcworICAg
IC8vIGludm9rZWQgYW5kIHRoZSBzY3JpcHQgY29udGludWVzIGl0cyBleGVjdXRpb24uCisgICAg
Ly8gUGFzc2luZyAwIGNsZWFycyBvdXQgYW55IGV4aXN0aW5nIGJpbmRpbmcuCisgICAgLy8gSXQg
aXMgdXNlZCBmb3IgdGVzdHMgYW5kIHNob3VsZCBwcm9iYWJseSBvbmx5IGJlIHVzZWQgaW4gc3Vj
aCBjYXNlcworICAgIC8vIGFzIGl0IG1heSBjYXVzZSB1bmV4cGVjdGVkIGJlaGF2aW9ycyAoYSBK
YXZhU2NyaXB0IG9iamVjdCB3aXRoIGEKKyAgICAvLyBmYWxsYmFjayBhbHdheXMgcmV0dXJucyB0
cnVlIHdoZW4gY2hlY2tlZCBmb3IgYSBtZXRob2QncworICAgIC8vIGV4aXN0ZW5jZSkuCisgICAg
dm9pZCBiaW5kRmFsbGJhY2tDYWxsYmFjayhDYWxsYmFjayogZmFsbGJhY2tDYWxsYmFjaykKKyAg
ICB7CisgICAgICAgIG1fZmFsbGJhY2tDYWxsYmFjay5yZXNldChmYWxsYmFja0NhbGxiYWNrKTsK
KyAgICB9CisKKyAgICAvLyBBIHdyYXBwZXIgZm9yIEJpbmRGYWxsYmFja0NhbGxiYWNrLCB0byBz
aW1wbGlmeSB0aGUgY29tbW9uIGNhc2Ugb2YKKyAgICAvLyBiaW5kaW5nIGEgbWV0aG9kIG9uIHRo
ZSBjdXJyZW50IG9iamVjdC4gIFRob3VnaCBub3QgdmVyaWZpZWQgaGVyZSwKKyAgICAvLyB8bWV0
aG9kfCBtdXN0IGJlIGEgbWV0aG9kIG9mIHRoaXMgQ3BwQm91bmRDbGFzcyBzdWJjbGFzcy4KKyAg
ICAvLyBQYXNzaW5nIDAgZm9yIHxtZXRob2R8IGNsZWFycyBvdXQgYW55IGV4aXN0aW5nIGJpbmRp
bmcuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICB2b2lkIGJpbmRGYWxsYmFja01ldGhv
ZCh2b2lkIChUOjoqbWV0aG9kKShjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50Kikp
CisgICAgeworICAgICAgICBpZiAobWV0aG9kKSB7CisgICAgICAgICAgICBDYWxsYmFjayogY2Fs
bGJhY2sgPQorICAgICAgICAgICAgICAgIE5ld0NhbGxiYWNrPFQsIGNvbnN0IENwcEFyZ3VtZW50
TGlzdCYsIENwcFZhcmlhbnQqPigKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8VCo+
KHRoaXMpLCBtZXRob2QpOworICAgICAgICAgICAgYmluZEZhbGxiYWNrQ2FsbGJhY2soY2FsbGJh
Y2spOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGJpbmRGYWxsYmFja0NhbGxiYWNrKDAp
OworICAgIH0KKworICAgIC8vIFNvbWUgZmllbGRzIGFyZSBwcm90ZWN0ZWQgYmVjYXVzZSBzb21l
IHRlc3RzIGRlcGVuZCBvbiBhY2Nlc3NpbmcgdGhlbSwKKyAgICAvLyBidXQgb3RoZXJ3aXNlIHRo
ZXkgc2hvdWxkIGJlIGNvbnNpZGVyZWQgcHJpdmF0ZS4KKworICAgIHR5cGVkZWYgc3RkOjptYXA8
TlBJZGVudGlmaWVyLCBQcm9wZXJ0eUNhbGxiYWNrKj4gUHJvcGVydHlMaXN0OworICAgIHR5cGVk
ZWYgc3RkOjptYXA8TlBJZGVudGlmaWVyLCBDYWxsYmFjayo+IE1ldGhvZExpc3Q7CisgICAgLy8g
VGhlc2UgbWFwcyBhc3NvY2lhdGUgbmFtZXMgd2l0aCBwcm9wZXJ0eSBhbmQgbWV0aG9kIHBvaW50
ZXJzIHRvIGJlCisgICAgLy8gZXhwb3NlZCB0byBKYXZhU2NyaXB0LgorICAgIFByb3BlcnR5TGlz
dCBtX3Byb3BlcnRpZXM7CisgICAgTWV0aG9kTGlzdCBtX21ldGhvZHM7CisKKyAgICAvLyBUaGUg
Y2FsbGJhY2sgZ2V0cyBpbnZva2VkIHdoZW4gYSBjYWxsIGlzIG1hZGUgdG8gYW4gbm9uZXhpc3Rl
bnQgbWV0aG9kLgorICAgIHNjb3BlZF9wdHI8Q2FsbGJhY2s+IG1fZmFsbGJhY2tDYWxsYmFjazsK
KworcHJpdmF0ZToKKyAgICAvLyBOUE9iamVjdCBjYWxsYmFja3MuCisgICAgZnJpZW5kIHN0cnVj
dCBDcHBOUE9iamVjdDsKKyAgICBib29sIGhhc01ldGhvZChOUElkZW50aWZpZXIpIGNvbnN0Owor
ICAgIGJvb2wgaW52b2tlKE5QSWRlbnRpZmllciwgY29uc3QgTlBWYXJpYW50KiBhcmdzLCBzaXpl
X3QgYXJnQ291bnQsCisgICAgICAgICAgICAgICAgTlBWYXJpYW50KiByZXN1bHQpOworICAgIGJv
b2wgaGFzUHJvcGVydHkoTlBJZGVudGlmaWVyKSBjb25zdDsKKyAgICBib29sIGdldFByb3BlcnR5
KE5QSWRlbnRpZmllciwgTlBWYXJpYW50KiByZXN1bHQpIGNvbnN0OworICAgIGJvb2wgc2V0UHJv
cGVydHkoTlBJZGVudGlmaWVyLCBjb25zdCBOUFZhcmlhbnQqKTsKKworICAgIC8vIEEgbGF6aWx5
LWluaXRpYWxpemVkIENwcFZhcmlhbnQgcmVwcmVzZW50aW5nIHRoaXMgY2xhc3MuICBXZSByZXRh
aW4gMQorICAgIC8vIHJlZmVyZW5jZSB0byB0aGlzIG9iamVjdCwgYW5kIGl0IGlzIHJlbGVhc2Vk
IG9uIGRlbGV0aW9uLgorICAgIENwcFZhcmlhbnQgbV9zZWxmVmFyaWFudDsKKworICAgIC8vIFRy
dWUgaWYgb3VyIG5wX29iamVjdCBoYXMgYmVlbiBib3VuZCB0byBhIFdlYkZyYW1lLCBpbiB3aGlj
aCBjYXNlIGl0IG11c3QKKyAgICAvLyBiZSB1bnJlZ2lzdGVyZWQgd2l0aCBWOCB3aGVuIHdlIGRl
bGV0ZSBpdC4KKyAgICBib29sIG1fYm91bmRUb0ZyYW1lOworCisgICAgRElTQUxMT1dfQ09QWV9B
TkRfQVNTSUdOKENwcEJvdW5kQ2xhc3MpOworfTsKKworI2VuZGlmIC8vIENwcEJvdW5kQ2xhc3Nf
aApkaWZmIC0tZ2l0IGEvV2ViS2l0VG9vbHMvRHVtcFJlbmRlclRyZWUvY2hyb21pdW0vQ3BwVmFy
aWFudC5jcHAgYi9XZWJLaXRUb29scy9EdW1wUmVuZGVyVHJlZS9jaHJvbWl1bS9DcHBWYXJpYW50
LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmU0NmU3Ci0tLSAvZGV2
L251bGwKKysrIGIvV2ViS2l0VG9vbHMvRHVtcFJlbmRlclRyZWUvY2hyb21pdW0vQ3BwVmFyaWFu
dC5jcHAKQEAgLTAsMCArMSwyODQgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMCBUaGUgQ2hyb21p
dW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBj
b2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZv
dW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIFRoaXMgZmlsZSBjb250YWlucyBkZWZpbml0
aW9ucyBmb3IgQ3BwVmFyaWFudC4KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkNw
cFZhcmlhbnQuaCIKKworI2luY2x1ZGUgImJhc2Uvc3RyaW5nX3V0aWwuaCIKKyNpbmNsdWRlICJw
dWJsaWMvV2ViQmluZGluZ3MuaCIKKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8d3RmL0Fz
c2VydGlvbnMuaD4KKwordXNpbmcgbmFtZXNwYWNlIFdlYktpdDsKK3VzaW5nIG5hbWVzcGFjZSBz
dGQ7CisKK0NwcFZhcmlhbnQ6OkNwcFZhcmlhbnQoKQoreworICAgIHR5cGUgPSBOUFZhcmlhbnRU
eXBlX051bGw7Cit9CisKKy8vIE5vdGUgdGhhdCBTZXQoKSBwZXJmb3JtcyBhIGRlZXAgY29weSwg
d2hpY2ggaXMgbmVjZXNzYXJ5IHRvIHNhZmVseQorLy8gY2FsbCBGcmVlRGF0YSgpIG9uIHRoZSB2
YWx1ZSBpbiB0aGUgZGVzdHJ1Y3Rvci4KK0NwcFZhcmlhbnQ6OkNwcFZhcmlhbnQoY29uc3QgQ3Bw
VmFyaWFudCYgb3JpZ2luYWwpCit7CisgICAgdHlwZSA9IE5QVmFyaWFudFR5cGVfTnVsbDsKKyAg
ICBzZXQob3JpZ2luYWwpOworfQorCisvLyBTZWUgY29tbWVudCBmb3IgY29weSBjb25zdHJ1Y3Rv
ciwgYWJvdmUuCitDcHBWYXJpYW50JiBDcHBWYXJpYW50OjpvcGVyYXRvcj0oY29uc3QgQ3BwVmFy
aWFudCYgb3JpZ2luYWwpCit7CisgICAgaWYgKCZvcmlnaW5hbCAhPSB0aGlzKQorICAgICAgICBz
ZXQob3JpZ2luYWwpOworICAgIHJldHVybiAqdGhpczsKK30KKworQ3BwVmFyaWFudDo6fkNwcFZh
cmlhbnQoKQoreworICAgIGZyZWVEYXRhKCk7Cit9CisKK3ZvaWQgQ3BwVmFyaWFudDo6ZnJlZURh
dGEoKQoreworICAgIFdlYkJpbmRpbmdzOjpyZWxlYXNlVmFyaWFudFZhbHVlKHRoaXMpOworfQor
Citib29sIENwcFZhcmlhbnQ6OmlzRXF1YWwoY29uc3QgQ3BwVmFyaWFudCYgb3RoZXIpIGNvbnN0
Cit7CisgICAgaWYgKHR5cGUgIT0gb3RoZXIudHlwZSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOwor
CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBOUFZhcmlhbnRUeXBlX0Jvb2w6CisgICAg
ICAgIHJldHVybiAodmFsdWUuYm9vbFZhbHVlID09IG90aGVyLnZhbHVlLmJvb2xWYWx1ZSk7Cisg
ICAgY2FzZSBOUFZhcmlhbnRUeXBlX0ludDMyOgorICAgICAgICByZXR1cm4gKHZhbHVlLmludFZh
bHVlID09IG90aGVyLnZhbHVlLmludFZhbHVlKTsKKyAgICBjYXNlIE5QVmFyaWFudFR5cGVfRG91
YmxlOgorICAgICAgICByZXR1cm4gKHZhbHVlLmRvdWJsZVZhbHVlID09IG90aGVyLnZhbHVlLmRv
dWJsZVZhbHVlKTsKKyAgICBjYXNlIE5QVmFyaWFudFR5cGVfU3RyaW5nOiB7CisgICAgICAgIGNv
bnN0IE5QU3RyaW5nICp0aGlzX3ZhbHVlID0gJnZhbHVlLnN0cmluZ1ZhbHVlOworICAgICAgICBj
b25zdCBOUFN0cmluZyAqb3RoZXJfdmFsdWUgPSAmb3RoZXIudmFsdWUuc3RyaW5nVmFsdWU7Cisg
ICAgICAgIHVpbnQzMl90IGxlbiA9IHRoaXNfdmFsdWUtPlVURjhMZW5ndGg7CisgICAgICAgIHJl
dHVybiBsZW4gPT0gb3RoZXJfdmFsdWUtPlVURjhMZW5ndGgKKyAgICAgICAgICAgICYmICFzdHJu
Y21wKHRoaXNfdmFsdWUtPlVURjhDaGFyYWN0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAg
b3RoZXJfdmFsdWUtPlVURjhDaGFyYWN0ZXJzLCBsZW4pOworICAgIH0KKyAgICBjYXNlIE5QVmFy
aWFudFR5cGVfTnVsbDoKKyAgICBjYXNlIE5QVmFyaWFudFR5cGVfVm9pZDoKKyAgICAgICAgcmV0
dXJuIHRydWU7CisgICAgY2FzZSBOUFZhcmlhbnRUeXBlX09iamVjdDogeworICAgICAgICBOUE9i
amVjdCogdGhpc1ZhbHVlID0gdmFsdWUub2JqZWN0VmFsdWU7CisgICAgICAgIE5QT2JqZWN0KiBv
dGhlclZhbHVlID0gb3RoZXIudmFsdWUub2JqZWN0VmFsdWU7CisgICAgICAgIHJldHVybiB0aGlz
VmFsdWUtPl9jbGFzcyA9PSBvdGhlclZhbHVlLT5fY2xhc3MKKyAgICAgICAgICAgICYmIHRoaXNW
YWx1ZS0+cmVmZXJlbmNlQ291bnQgPT0gb3RoZXJWYWx1ZS0+cmVmZXJlbmNlQ291bnQ7CisgICAg
fQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgQ3BwVmFyaWFudDo6Y29weVRv
TlBWYXJpYW50KE5QVmFyaWFudCogcmVzdWx0KSBjb25zdAoreworICAgIHJlc3VsdC0+dHlwZSA9
IHR5cGU7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBOUFZhcmlhbnRUeXBlX0Jvb2w6
CisgICAgICAgIHJlc3VsdC0+dmFsdWUuYm9vbFZhbHVlID0gdmFsdWUuYm9vbFZhbHVlOworICAg
ICAgICBicmVhazsKKyAgICBjYXNlIE5QVmFyaWFudFR5cGVfSW50MzI6CisgICAgICAgIHJlc3Vs
dC0+dmFsdWUuaW50VmFsdWUgPSB2YWx1ZS5pbnRWYWx1ZTsKKyAgICAgICAgYnJlYWs7CisgICAg
Y2FzZSBOUFZhcmlhbnRUeXBlX0RvdWJsZToKKyAgICAgICAgcmVzdWx0LT52YWx1ZS5kb3VibGVW
YWx1ZSA9IHZhbHVlLmRvdWJsZVZhbHVlOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE5QVmFy
aWFudFR5cGVfU3RyaW5nOgorICAgICAgICBXZWJCaW5kaW5nczo6aW5pdGlhbGl6ZVZhcmlhbnRX
aXRoU3RyaW5nQ29weShyZXN1bHQsICZ2YWx1ZS5zdHJpbmdWYWx1ZSk7CisgICAgICAgIGJyZWFr
OworICAgIGNhc2UgTlBWYXJpYW50VHlwZV9OdWxsOgorICAgIGNhc2UgTlBWYXJpYW50VHlwZV9W
b2lkOgorICAgICAgICAvLyBOb3RoaW5nIHRvIHNldC4KKyAgICAgICAgYnJlYWs7CisgICAgY2Fz
ZSBOUFZhcmlhbnRUeXBlX09iamVjdDoKKyAgICAgICAgcmVzdWx0LT50eXBlID0gTlBWYXJpYW50
VHlwZV9PYmplY3Q7CisgICAgICAgIHJlc3VsdC0+dmFsdWUub2JqZWN0VmFsdWUgPSBXZWJCaW5k
aW5nczo6cmV0YWluT2JqZWN0KHZhbHVlLm9iamVjdFZhbHVlKTsKKyAgICAgICAgYnJlYWs7Cisg
ICAgfQorfQorCit2b2lkIENwcFZhcmlhbnQ6OnNldChjb25zdCBOUFZhcmlhbnQmIG5ld1ZhbHVl
KQoreworICAgIGZyZWVEYXRhKCk7CisgICAgc3dpdGNoIChuZXdWYWx1ZS50eXBlKSB7CisgICAg
Y2FzZSBOUFZhcmlhbnRUeXBlX0Jvb2w6CisgICAgICAgIHNldChuZXdWYWx1ZS52YWx1ZS5ib29s
VmFsdWUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE5QVmFyaWFudFR5cGVfSW50MzI6Cisg
ICAgICAgIHNldChuZXdWYWx1ZS52YWx1ZS5pbnRWYWx1ZSk7CisgICAgICAgIGJyZWFrOworICAg
IGNhc2UgTlBWYXJpYW50VHlwZV9Eb3VibGU6CisgICAgICAgIHNldChuZXdWYWx1ZS52YWx1ZS5k
b3VibGVWYWx1ZSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTlBWYXJpYW50VHlwZV9TdHJp
bmc6CisgICAgICAgIHNldChuZXdWYWx1ZS52YWx1ZS5zdHJpbmdWYWx1ZSk7CisgICAgICAgIGJy
ZWFrOworICAgIGNhc2UgTlBWYXJpYW50VHlwZV9OdWxsOgorICAgIGNhc2UgTlBWYXJpYW50VHlw
ZV9Wb2lkOgorICAgICAgICB0eXBlID0gbmV3VmFsdWUudHlwZTsKKyAgICAgICAgYnJlYWs7Cisg
ICAgY2FzZSBOUFZhcmlhbnRUeXBlX09iamVjdDoKKyAgICAgICAgc2V0KG5ld1ZhbHVlLnZhbHVl
Lm9iamVjdFZhbHVlKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit2b2lkIENwcFZhcmlh
bnQ6OnNldE51bGwoKQoreworICAgIGZyZWVEYXRhKCk7CisgICAgdHlwZSA9IE5QVmFyaWFudFR5
cGVfTnVsbDsKK30KKwordm9pZCBDcHBWYXJpYW50OjpzZXQoYm9vbCBuZXdWYWx1ZSkKK3sKKyAg
ICBmcmVlRGF0YSgpOworICAgIHR5cGUgPSBOUFZhcmlhbnRUeXBlX0Jvb2w7CisgICAgdmFsdWUu
Ym9vbFZhbHVlID0gbmV3VmFsdWU7Cit9CisKK3ZvaWQgQ3BwVmFyaWFudDo6c2V0KGludDMyX3Qg
bmV3VmFsdWUpCit7CisgICAgZnJlZURhdGEoKTsKKyAgICB0eXBlID0gTlBWYXJpYW50VHlwZV9J
bnQzMjsKKyAgICB2YWx1ZS5pbnRWYWx1ZSA9IG5ld1ZhbHVlOworfQorCit2b2lkIENwcFZhcmlh
bnQ6OnNldChkb3VibGUgbmV3VmFsdWUpCit7CisgICAgZnJlZURhdGEoKTsKKyAgICB0eXBlID0g
TlBWYXJpYW50VHlwZV9Eb3VibGU7CisgICAgdmFsdWUuZG91YmxlVmFsdWUgPSBuZXdWYWx1ZTsK
K30KKworLy8gVGhlIG5ld1ZhbHVlIG11c3QgYmUgYSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nLgor
dm9pZCBDcHBWYXJpYW50OjpzZXQoY29uc3QgY2hhciogbmV3VmFsdWUpCit7CisgICAgZnJlZURh
dGEoKTsKKyAgICB0eXBlID0gTlBWYXJpYW50VHlwZV9TdHJpbmc7CisgICAgTlBTdHJpbmcgbmV3
U3RyaW5nID0ge25ld1ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2Fz
dDx1aW50MzJfdD4oc3RybGVuKG5ld1ZhbHVlKSl9OworICAgIFdlYkJpbmRpbmdzOjppbml0aWFs
aXplVmFyaWFudFdpdGhTdHJpbmdDb3B5KHRoaXMsICZuZXdTdHJpbmcpOworfQorCit2b2lkIENw
cFZhcmlhbnQ6OnNldChjb25zdCBzdHJpbmcmIG5ld1ZhbHVlKQoreworICAgIGZyZWVEYXRhKCk7
CisgICAgdHlwZSA9IE5QVmFyaWFudFR5cGVfU3RyaW5nOworICAgIE5QU3RyaW5nIG5ld1N0cmlu
ZyA9IHtuZXdWYWx1ZS5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19j
YXN0PHVpbnQzMl90PihuZXdWYWx1ZS5zaXplKCkpfTsKKyAgICBXZWJCaW5kaW5nczo6aW5pdGlh
bGl6ZVZhcmlhbnRXaXRoU3RyaW5nQ29weSh0aGlzLCAmbmV3U3RyaW5nKTsKK30KKwordm9pZCBD
cHBWYXJpYW50OjpzZXQoY29uc3QgTlBTdHJpbmcmIG5ld1ZhbHVlKQoreworICAgIGZyZWVEYXRh
KCk7CisgICAgdHlwZSA9IE5QVmFyaWFudFR5cGVfU3RyaW5nOworICAgIFdlYkJpbmRpbmdzOjpp
bml0aWFsaXplVmFyaWFudFdpdGhTdHJpbmdDb3B5KHRoaXMsICZuZXdWYWx1ZSk7Cit9CisKK3Zv
aWQgQ3BwVmFyaWFudDo6c2V0KE5QT2JqZWN0KiBuZXdWYWx1ZSkKK3sKKyAgICBmcmVlRGF0YSgp
OworICAgIHR5cGUgPSBOUFZhcmlhbnRUeXBlX09iamVjdDsKKyAgICB2YWx1ZS5vYmplY3RWYWx1
ZSA9IFdlYkJpbmRpbmdzOjpyZXRhaW5PYmplY3QobmV3VmFsdWUpOworfQorCitzdHJpbmcgQ3Bw
VmFyaWFudDo6dG9TdHJpbmcoKSBjb25zdAoreworICAgIEFTU0VSVChpc1N0cmluZygpKTsKKyAg
ICByZXR1cm4gc3RyaW5nKHZhbHVlLnN0cmluZ1ZhbHVlLlVURjhDaGFyYWN0ZXJzLAorICAgICAg
ICAgICAgICAgICAgdmFsdWUuc3RyaW5nVmFsdWUuVVRGOExlbmd0aCk7Cit9CisKK2ludDMyX3Qg
Q3BwVmFyaWFudDo6dG9JbnQzMigpIGNvbnN0Cit7CisgICAgaWYgKGlzSW50MzIoKSkKKyAgICAg
ICAgcmV0dXJuIHZhbHVlLmludFZhbHVlOworICAgIGlmIChpc0RvdWJsZSgpKQorICAgICAgICBy
ZXR1cm4gc3RhdGljX2Nhc3Q8aW50MzJfdD4odmFsdWUuZG91YmxlVmFsdWUpOworICAgIEFTU0VS
VF9OT1RfUkVBQ0hFRCgpOworICAgIHJldHVybiAwOworfQorCitkb3VibGUgQ3BwVmFyaWFudDo6
dG9Eb3VibGUoKSBjb25zdAoreworICAgIGlmIChpc0ludDMyKCkpCisgICAgICAgIHJldHVybiBz
dGF0aWNfY2FzdDxkb3VibGU+KHZhbHVlLmludFZhbHVlKTsKKyAgICBpZiAoaXNEb3VibGUoKSkK
KyAgICAgICAgcmV0dXJuIHZhbHVlLmRvdWJsZVZhbHVlOworICAgIEFTU0VSVF9OT1RfUkVBQ0hF
RCgpOworICAgIHJldHVybiAwOworfQorCitib29sIENwcFZhcmlhbnQ6OnRvQm9vbGVhbigpIGNv
bnN0Cit7CisgICAgQVNTRVJUKGlzQm9vbCgpKTsKKyAgICByZXR1cm4gdmFsdWUuYm9vbFZhbHVl
OworfQorCit2ZWN0b3I8c3RyaW5nPiBDcHBWYXJpYW50Ojp0b1N0cmluZ1ZlY3RvcigpIGNvbnN0
Cit7CisKKyAgICBBU1NFUlQoaXNPYmplY3QoKSk7CisgICAgdmVjdG9yPHN0cmluZz4gc3RyaW5n
VmVjdG9yOworICAgIE5QT2JqZWN0KiBucFZhbHVlID0gdmFsdWUub2JqZWN0VmFsdWU7CisgICAg
TlBJZGVudGlmaWVyIGxlbmd0aElkID0gV2ViQmluZGluZ3M6OmdldFN0cmluZ0lkZW50aWZpZXIo
Imxlbmd0aCIpOworCisgICAgaWYgKCFXZWJCaW5kaW5nczo6aGFzUHJvcGVydHkoMCwgbnBWYWx1
ZSwgbGVuZ3RoSWQpKQorICAgICAgICByZXR1cm4gc3RyaW5nVmVjdG9yOworCisgICAgTlBWYXJp
YW50IGxlbmd0aFZhbHVlOworICAgIGlmICghV2ViQmluZGluZ3M6OmdldFByb3BlcnR5KDAsIG5w
VmFsdWUsIGxlbmd0aElkLCAmbGVuZ3RoVmFsdWUpKQorICAgICAgICByZXR1cm4gc3RyaW5nVmVj
dG9yOworCisgICAgaW50IGxlbmd0aCA9IDA7CisgICAgLy8gVGhlIGxlbmd0aCBpcyBhIGRvdWJs
ZSBpbiBzb21lIGNhc2VzLgorICAgIGlmIChOUFZBUklBTlRfSVNfRE9VQkxFKGxlbmd0aFZhbHVl
KSkKKyAgICAgICAgbGVuZ3RoID0gc3RhdGljX2Nhc3Q8aW50PihOUFZBUklBTlRfVE9fRE9VQkxF
KGxlbmd0aFZhbHVlKSk7CisgICAgZWxzZSBpZiAoTlBWQVJJQU5UX0lTX0lOVDMyKGxlbmd0aFZh
bHVlKSkKKyAgICAgICAgbGVuZ3RoID0gTlBWQVJJQU5UX1RPX0lOVDMyKGxlbmd0aFZhbHVlKTsK
KyAgICBXZWJCaW5kaW5nczo6cmVsZWFzZVZhcmlhbnRWYWx1ZSgmbGVuZ3RoVmFsdWUpOworCisg
ICAgLy8gRm9yIHNhbml0eSwgb25seSBhbGxvdyAxMDAgaXRlbXMuCisgICAgbGVuZ3RoID0gbWlu
KDEwMCwgbGVuZ3RoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7Cisg
ICAgICAgIC8vIEdldCBlYWNoIG9mIHRoZSBpdGVtcy4KKyAgICAgICAgc3RyaW5nIGluZGV4ID0g
U3RyaW5nUHJpbnRmKCIlZCIsIGkpOworICAgICAgICBOUElkZW50aWZpZXIgaW5kZXhJZCA9IFdl
YkJpbmRpbmdzOjpnZXRTdHJpbmdJZGVudGlmaWVyKGluZGV4LmNfc3RyKCkpOworICAgICAgICBp
ZiAoIVdlYkJpbmRpbmdzOjpoYXNQcm9wZXJ0eSgwLCBucFZhbHVlLCBpbmRleElkKSkKKyAgICAg
ICAgICAgIGNvbnRpbnVlOworICAgICAgICBOUFZhcmlhbnQgaW5kZXhWYWx1ZTsKKyAgICAgICAg
aWYgKCFXZWJCaW5kaW5nczo6Z2V0UHJvcGVydHkoMCwgbnBWYWx1ZSwgaW5kZXhJZCwgJmluZGV4
VmFsdWUpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmIChOUFZBUklBTlRfSVNf
U1RSSU5HKGluZGV4VmFsdWUpKSB7CisgICAgICAgICAgICBzdHJpbmcgaXRlbShOUFZBUklBTlRf
VE9fU1RSSU5HKGluZGV4VmFsdWUpLlVURjhDaGFyYWN0ZXJzLAorICAgICAgICAgICAgICAgICAg
ICAgICAgTlBWQVJJQU5UX1RPX1NUUklORyhpbmRleFZhbHVlKS5VVEY4TGVuZ3RoKTsKKyAgICAg
ICAgICAgIHN0cmluZ1ZlY3Rvci5wdXNoX2JhY2soaXRlbSk7CisgICAgICAgIH0KKyAgICAgICAg
V2ViQmluZGluZ3M6OnJlbGVhc2VWYXJpYW50VmFsdWUoJmluZGV4VmFsdWUpOworICAgIH0KKyAg
ICByZXR1cm4gc3RyaW5nVmVjdG9yOworfQorCitib29sIENwcFZhcmlhbnQ6Omludm9rZShjb25z
dCBzdHJpbmcmIG1ldGhvZCwgY29uc3QgQ3BwVmFyaWFudCogYXJncywKKyAgICAgICAgICAgICAg
ICAgICAgICAgIHVpbnQzMl90IGFyZ0NvdW50LCBDcHBWYXJpYW50JiByZXN1bHQpIGNvbnN0Cit7
CisgICAgQVNTRVJUKGlzT2JqZWN0KCkpOworICAgIE5QSWRlbnRpZmllciBtZXRob2ROYW1lID0g
V2ViQmluZGluZ3M6OmdldFN0cmluZ0lkZW50aWZpZXIobWV0aG9kLmNfc3RyKCkpOworICAgIE5Q
T2JqZWN0KiBucE9iamVjdCA9IHZhbHVlLm9iamVjdFZhbHVlOworICAgIGlmICghV2ViQmluZGlu
Z3M6Omhhc01ldGhvZCgwLCBucE9iamVjdCwgbWV0aG9kTmFtZSkpCisgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICBOUFZhcmlhbnQgcjsKKyAgICBib29sIHN0YXR1cyA9IFdlYkJpbmRpbmdzOjpp
bnZva2UoMCwgbnBPYmplY3QsIG1ldGhvZE5hbWUsIGFyZ3MsIGFyZ0NvdW50LCAmcik7CisgICAg
cmVzdWx0LnNldChyKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvV2ViS2l0
VG9vbHMvRHVtcFJlbmRlclRyZWUvY2hyb21pdW0vQ3BwVmFyaWFudC5oIGIvV2ViS2l0VG9vbHMv
RHVtcFJlbmRlclRyZWUvY2hyb21pdW0vQ3BwVmFyaWFudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0
CmluZGV4IDAwMDAwMDAuLjM2YTlmNzAKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJLaXRUb29scy9E
dW1wUmVuZGVyVHJlZS9jaHJvbWl1bS9DcHBWYXJpYW50LmgKQEAgLTAsMCArMSwxMDkgQEAKKy8v
IENvcHlyaWdodCAoYykgMjAxMCBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0
eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisK
Ky8qCisgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gZm9yIENwcFZhcmlhbnQs
IGEgdHlwZSB1c2VkIGJ5IEMrKyBjbGFzc2VzCisgIHRoYXQgYXJlIHRvIGJlIGJvdW5kIHRvIEph
dmFTY3JpcHQgb2JqZWN0cy4KKworICBDcHBWYXJpYW50IGV4aXN0cyBwcmltYXJpbHkgYXMgYW4g
aW50ZXJmYWNlIGJldHdlZW4gQysrIGNhbGxlcnMgYW5kIHRoZQorICBjb3JyZXNwb25kaW5nIE5Q
VmFyaWFudCB0eXBlLiAgQ3BwVmFyaWFudCBhbHNvIHByb3ZpZGVzIGEgbnVtYmVyIG9mCisgIGNv
bnZlbmllbmNlIGNvbnN0cnVjdG9ycyBhbmQgYWNjZXNzb3JzLCBzbyB0aGF0IHRoZSBOUFZhcmlh
bnRUeXBlIHZhbHVlcworICBkb24ndCBuZWVkIHRvIGJlIGV4cG9zZWQsIGFuZCBhIGRlc3RydWN0
b3IgdG8gZnJlZSBhbnkgbWVtb3J5IGFsbG9jYXRlZCBmb3IKKyAgc3RyaW5nIHZhbHVlcy4KKwor
ICBGb3IgYSB1c2FnZSBleGFtcGxlLCBzZWUgY3BwX2JpbmRpbmdfZXhhbXBsZS57aHxjY30uCisq
LworCisjaWZuZGVmIENwcFZhcmlhbnRfaAorI2RlZmluZSBDcHBWYXJpYW50X2gKKworI2luY2x1
ZGUgImJhc2UvYmFzaWN0eXBlcy5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L25wYXBpL2JpbmRp
bmdzL25wcnVudGltZS5oIgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisK
K2NsYXNzIENwcFZhcmlhbnQgOiBwdWJsaWMgTlBWYXJpYW50IHsKK3B1YmxpYzoKKyAgICBDcHBW
YXJpYW50KCk7CisgICAgfkNwcFZhcmlhbnQoKTsKKyAgICB2b2lkIHNldE51bGwoKTsKKyAgICB2
b2lkIHNldChib29sKTsKKyAgICB2b2lkIHNldChpbnQzMl90KTsKKyAgICB2b2lkIHNldChkb3Vi
bGUpOworCisgICAgLy8gTm90ZSB0aGF0IHNldHRpbmcgYSBDcHBWYXJpYW50IHRvIGEgc3RyaW5n
IHZhbHVlIGludm9sdmVzIGNvcHlpbmcgdGhlCisgICAgLy8gc3RyaW5nIGRhdGEsIHdoaWNoIG11
c3QgYmUgZnJlZWQgd2l0aCBhIGNhbGwgdG8gZnJlZURhdGEoKSB3aGVuIHRoZQorICAgIC8vIENw
cFZhcmlhbnQgaXMgc2V0IHRvIGEgZGlmZmVyZW50IHZhbHVlIG9yIGlzIG5vIGxvbmdlciBuZWVk
ZWQuICBOb3JtYWxseQorICAgIC8vIHRoaXMgaXMgaGFuZGxlZCBieSB0aGUgb3RoZXIgc2V0KCkg
bWV0aG9kcyBhbmQgYnkgdGhlIGRlc3RydWN0b3IuCisgICAgdm9pZCBzZXQoY29uc3QgY2hhciop
OyAvLyBNdXN0IGJlIGEgbnVsbC10ZXJtaW5hdGVkIHN0cmluZy4KKyAgICB2b2lkIHNldChjb25z
dCBzdGQ6OnN0cmluZyYpOworICAgIHZvaWQgc2V0KGNvbnN0IE5QU3RyaW5nJik7CisgICAgdm9p
ZCBzZXQoY29uc3QgTlBWYXJpYW50Jik7CisKKyAgICAvLyBOb3RlIHRoYXQgc2V0dGluZyBhIENw
cFZhcmlhbnQgdG8gYW4gTlBPYmplY3QgaW52b2x2ZXMgcmVmLWNvdW50aW5nCisgICAgLy8gdGhl
IGFjdHVhbCBvYmplY3QuIGZyZWVEYXRhKCkgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGlmIHRoZSBD
cHBWYXJpYW50CisgICAgLy8gaXMgbm8gbG9uZ2VyIG5lZWRlZC4gVGhlIG90aGVyIHNldCgpIG1l
dGhvZHMgaGFuZGxlIHRoaXMgaW50ZXJuYWxseS4KKyAgICAvLyBBbHNvLCB0aGUgb2JqZWN0J3Mg
TlBDbGFzcyBpcyBleHBlY3RlZCB0byBiZSBhIHN0YXRpYyBvYmplY3Q6IG5laXRoZXIKKyAgICAv
LyB0aGUgTlAgcnVudGltZSBub3IgQ3BwVmFyaWFudCB3aWxsIGV2ZXIgZnJlZSBpdC4KKyAgICB2
b2lkIHNldChOUE9iamVjdCpfdmFsdWUpOworCisgICAgLy8gVGhlc2UgdGhyZWUgbWV0aG9kcyBh
bGwgcGVyZm9ybSBkZWVwIGNvcGllcyBvZiBhbnkgc3RyaW5nIGRhdGEuICBUaGlzCisgICAgLy8g
YWxsb3dzIGxvY2FsIENwcFZhcmlhbnRzIHRvIGJlIHJlbGVhc2VkIGJ5IHRoZSBkZXN0cnVjdG9y
IHdpdGhvdXQKKyAgICAvLyBjb3JydXB0aW5nIHRoZWlyIHNvdXJjZXMuIEluIHBlcmZvcm1hbmNl
LWNyaXRpY2FsIGNvZGUsIG9yIHdoZW4gc3RyaW5ncworICAgIC8vIGFyZSB2ZXJ5IGxvbmcsIGF2
b2lkIGNyZWF0aW5nIG5ldyBDcHBWYXJpYW50cy4KKyAgICAvLyBJbiBjYXNlIG9mIE5QT2JqZWN0
IGFzIHRoZSBkYXRhLCB0aGUgY29weWluZyBpbnZvbHZlcyByZWYtY291bnRpbmcKKyAgICAvLyBh
cyBvcHBvc2VkIHRvIGRlZXAtY29weWluZy4gVGhlIHJlZi1jb3VudGluZyBlbnN1cmVzIHRoYXQg
c291cmNlcyBkb24ndAorICAgIC8vIGdldCBjb3JydXB0ZWQgd2hlbiB0aGUgY29waWVzIGdldCBk
ZXN0cm95ZWQuCisgICAgdm9pZCBjb3B5VG9OUFZhcmlhbnQoTlBWYXJpYW50KiByZXN1bHQpIGNv
bnN0OworICAgIENwcFZhcmlhbnQmIG9wZXJhdG9yPShjb25zdCBDcHBWYXJpYW50JiBvcmlnaW5h
bCk7CisgICAgQ3BwVmFyaWFudChjb25zdCBDcHBWYXJpYW50JiBvcmlnaW5hbCk7CisKKyAgICAv
LyBDYWxscyBOUE5fUmVsZWFzZVZhcmlhbnRWYWx1ZSwgd2hpY2ggZnJlZXMgYW55IHN0cmluZyBk
YXRhCisgICAgLy8gaGVsZCBieSB0aGUgb2JqZWN0IGFuZCBzZXRzIGl0cyB0eXBlIHRvIG51bGwu
CisgICAgLy8gSW4gY2FzZSBvZiBOUE9iamVjdCwgdGhlIE5QTl9SZWxlYXNlVmFyaWFudFZhbHVl
IGRlY3JlbWVudHMKKyAgICAvLyB0aGUgcmVmLWNvdW50IChyZWxlYXNlcyB3aGVuIHJlZi1jb3Vu
dCBiZWNvbWVzIDApCisgICAgdm9pZCBmcmVlRGF0YSgpOworCisgICAgLy8gQ29tcGFyZXMgdGhp
cyBDcHBWYXJpYW50J3MgdHlwZSBhbmQgdmFsdWUgdG8gYW5vdGhlcidzLiAgVGhleSBtdXN0IGJl
CisgICAgLy8gaWRlbnRpY2FsIGluIGJvdGggdHlwZSBhbmQgdmFsdWUgdG8gYmUgY29uc2lkZXJl
ZCBlcXVhbC4gIEZvciBzdHJpbmcgYW5kCisgICAgLy8gb2JqZWN0IHR5cGVzLCBhIGRlZXAgY29t
cGFyaXNvbiBpcyBwZXJmb3JtZWQ7IHRoYXQgaXMsIHRoZSBjb250ZW50cyBvZiB0aGUKKyAgICAv
LyBzdHJpbmdzLCBvciB0aGUgY2xhc3NlcyBhbmQgcmVmY291bnRzIG9mIHRoZSBvYmplY3RzLCBt
dXN0IGJlIHRoZSBzYW1lLAorICAgIC8vIGJ1dCB0aGV5IG5lZWQgbm90IGJlIHRoZSBzYW1lIHBv
aW50ZXJzLgorICAgIGJvb2wgaXNFcXVhbChjb25zdCBDcHBWYXJpYW50JikgY29uc3Q7CisKKyAg
ICAvLyBUaGUgdmFsdWUgb2YgYSBDcHBWYXJpYW50IG1heSBiZSByZWFkIGRpcmVjdGx5IGZyb20g
aXRzIE5QVmFyaWFudCAoYnV0CisgICAgLy8gc2hvdWxkIG9ubHkgYmUgc2V0IHVzaW5nIG9uZSBv
ZiB0aGUgc2V0KCkgbWV0aG9kcyBhYm92ZSkuIEFsdGhvdWdoIHRoZQorICAgIC8vIHR5cGUgb2Yg
YSBDcHBWYXJpYW50IGlzIGxpa2V3aXNlIHB1YmxpYywgaXQgY2FuIGJlIGFjY2Vzc2VkIHRocm91
Z2ggdGhlc2UKKyAgICAvLyBmdW5jdGlvbnMgcmF0aGVyIHRoYW4gZGlyZWN0bHkgaWYgYSBjYWxs
ZXIgd2lzaGVzIHRvIGF2b2lkIGRlcGVuZGVuY2Ugb24KKyAgICAvLyB0aGUgTlBWYXJpYW50VHlw
ZSB2YWx1ZXMuCisgICAgYm9vbCBpc0Jvb2woKSBjb25zdCB7IHJldHVybiAodHlwZSA9PSBOUFZh
cmlhbnRUeXBlX0Jvb2wpOyB9CisgICAgYm9vbCBpc0ludDMyKCkgY29uc3QgeyByZXR1cm4gKHR5
cGUgPT0gTlBWYXJpYW50VHlwZV9JbnQzMik7IH0KKyAgICBib29sIGlzRG91YmxlKCkgY29uc3Qg
eyByZXR1cm4gKHR5cGUgPT0gTlBWYXJpYW50VHlwZV9Eb3VibGUpOyB9CisgICAgYm9vbCBpc051
bWJlcigpIGNvbnN0IHsgcmV0dXJuIChpc0ludDMyKCkgfHwgaXNEb3VibGUoKSk7IH0KKyAgICBi
b29sIGlzU3RyaW5nKCkgY29uc3QgeyByZXR1cm4gKHR5cGUgPT0gTlBWYXJpYW50VHlwZV9TdHJp
bmcpOyB9CisgICAgYm9vbCBpc1ZvaWQoKSBjb25zdCB7IHJldHVybiAodHlwZSA9PSBOUFZhcmlh
bnRUeXBlX1ZvaWQpOyB9CisgICAgYm9vbCBpc051bGwoKSBjb25zdCB7IHJldHVybiAodHlwZSA9
PSBOUFZhcmlhbnRUeXBlX051bGwpOyB9CisgICAgYm9vbCBpc0VtcHR5KCkgY29uc3QgeyByZXR1
cm4gKGlzVm9pZCgpIHx8IGlzTnVsbCgpKTsgfQorICAgIGJvb2wgaXNPYmplY3QoKSBjb25zdCB7
IHJldHVybiAodHlwZSA9PSBOUFZhcmlhbnRUeXBlX09iamVjdCk7IH0KKworICAgIC8vIENvbnZl
cnRlcnMuICBUaGUgQ3BwVmFyaWFudCBtdXN0IGJlIG9mIGEgdHlwZSBjb252ZXJ0aWJsZSB0byB0
aGVzZSB2YWx1ZXMuCisgICAgLy8gRm9yIGV4YW1wbGUsIHRvSW50MzIoKSB3b3JrcyBvbmx5IGlm
IGlzTnVtYmVyKCkgaXMgdHJ1ZS4KKyAgICBzdGQ6OnN0cmluZyB0b1N0cmluZygpIGNvbnN0Owor
ICAgIGludDMyX3QgdG9JbnQzMigpIGNvbnN0OworICAgIGRvdWJsZSB0b0RvdWJsZSgpIGNvbnN0
OworICAgIGJvb2wgdG9Cb29sZWFuKCkgY29uc3Q7CisgICAgLy8gUmV0dXJucyBhIHZlY3RvciBv
ZiBzdHJpbmdzIGZvciB0aGUgc3BlY2lmaWVkIGFyZ3VtZW50LiBUaGlzIGlzIHVzZWZ1bAorICAg
IC8vIGZvciBjb252ZXJ0aW5nIGEgSmF2YVNjcmlwdCBhcnJheSBvZiBzdHJpbmdzIGludG8gYSB2
ZWN0b3Igb2Ygc3RyaW5ncy4KKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gdG9TdHJpbmdW
ZWN0b3IoKSBjb25zdDsKKworICAgIC8vIEludm9rZSBtZXRob2Qgb2YgdGhlIGdpdmVuIG5hbWUg
b24gYW4gb2JqZWN0IHdpdGggdGhlIHN1cHBsaWVkIGFyZ3VtZW50cy4KKyAgICAvLyBUaGUgZmly
c3QgYXJndW1lbnQgc2hvdWxkIGJlIHRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIG1ldGhvZCBpcyB0
byBiZQorICAgIC8vIGludm9rZWQuICBSZXR1cm5zIHdoZXRoZXIgdGhlIG1ldGhvZCB3YXMgc3Vj
Y2Vzc2Z1bGx5IGludm9rZWQuICBJZiB0aGUKKyAgICAvLyBtZXRob2Qgd2FzIGludm9rZWQgc3Vj
Y2Vzc2Z1bGx5LCBhbnkgcmV0dXJuIHZhbHVlIGlzIHN0b3JlZCBpbiB0aGUKKyAgICAvLyBDcHBW
YXJpYW50IHNwZWNpZmllZCBieSByZXN1bHQuCisgICAgYm9vbCBpbnZva2UoY29uc3Qgc3RkOjpz
dHJpbmcmLCBjb25zdCBDcHBWYXJpYW50KiBhcmdzLAorICAgICAgICAgICAgICAgIHVpbnQzMl90
IGFyZ0NvdW50LCBDcHBWYXJpYW50JiByZXN1bHQpIGNvbnN0OworfTsKKworI2VuZGlmIC8vIENw
cFZhcmlhbnRfaAo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>49991</attachid>
            <date>2010-03-03 23:36:05 -0800</date>
            <delta_ts>2010-03-04 16:33:05 -0800</delta_ts>
            <desc>Proposed patch (rev.2)</desc>
            <filename>bug-35634-20100304163603.patch</filename>
            <type>text/plain</type>
            <size>40312</size>
            <attacher name="Kent Tamura">tkent</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL0NoYW5nZUxvZyBiL1dlYktpdFRvb2xzL0NoYW5nZUxv
ZwppbmRleCAyMzU3NzBhLi4zZDMwNWU3IDEwMDY0NAotLS0gYS9XZWJLaXRUb29scy9DaGFuZ2VM
b2cKKysrIGIvV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjEgQEAKKzIwMTAtMDMt
MDMgIEtlbnQgVGFtdXJhICA8dGtlbnRAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFJldmlld2Vk
IGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFtEUlQvQ2hyb21pdW1dIEFkZCBDcHBWYXJp
YW50IGFuZCBDcHBCb3VuZENsYXNzCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3No
b3dfYnVnLmNnaT9pZD0zNTYzNAorCisgICAgICAgIEFkZCBDcHBWYXJpYW50IGFuZCBDcHBCb3Vu
ZENsYXNzIGNsYXNzZXMsIHdoaWNoIGFyZSBnb2luZyB0byBiZQorICAgICAgICB1c2VkIGJ5IER1
bXBSZW5kZXJUcmVlIENocm9taXVtIHBvcnQuIFRoZXNlIGZpbGVzIGFyZSBiYXNlZCBvbjoKKyAg
ICAgICAgLSBzcmMvd2Via2l0L2dsdWUvY3BwX3ZhcmlhbnQue2NjLGh9IGFuZAorICAgICAgICAt
IHNyYy93ZWJraXQvZ2x1ZS9jcHBfYm91bmRfY2xhc3Mue2NjLGh9CisgICAgICAgIG9mIENocm9t
aXVtIHJldi40MDQ5Mi4KKworICAgICAgICAqIER1bXBSZW5kZXJUcmVlL2Nocm9taXVtL0NwcEJv
dW5kQ2xhc3MuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBEdW1wUmVuZGVyVHJlZS9jaHJvbWl1bS9D
cHBCb3VuZENsYXNzLmg6IEFkZGVkLgorICAgICAgICAqIER1bXBSZW5kZXJUcmVlL2Nocm9taXVt
L0NwcFZhcmlhbnQuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBEdW1wUmVuZGVyVHJlZS9jaHJvbWl1
bS9DcHBWYXJpYW50Lmg6IEFkZGVkLgorCiAyMDEwLTAzLTAyICBBcm5vIFJlbmV2aWVyICA8YXJu
b0ByZW5ldmllci5uZXQ+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgR3VzdGF2byBOb3JvbmhhIFNp
bHZhLgpkaWZmIC0tZ2l0IGEvV2ViS2l0VG9vbHMvRHVtcFJlbmRlclRyZWUvY2hyb21pdW0vQ3Bw
Qm91bmRDbGFzcy5jcHAgYi9XZWJLaXRUb29scy9EdW1wUmVuZGVyVHJlZS9jaHJvbWl1bS9DcHBC
b3VuZENsYXNzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDZmZWI1
Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViS2l0VG9vbHMvRHVtcFJlbmRlclRyZWUvY2hyb21pdW0v
Q3BwQm91bmRDbGFzcy5jcHAKQEAgLTAsMCArMSwzNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMTAgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1
dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBu
YW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHBy
b21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3Bl
Y2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJB
UyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVND
TEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05U
UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwK
KyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVT
SU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkg
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworLy8gVGhpcyBmaWxl
IGNvbnRhaW5zIGRlZmluaXRpb25zIGZvciBDcHBCb3VuZENsYXNzCisKKy8vIEhlcmUncyB0aGUg
Y29udHJvbCBmbG93IG9mIGEgSlMgbWV0aG9kIGdldHRpbmcgZm9yd2FyZGVkIHRvIGEgY2xhc3Mu
CisvLyAtIFNvbWV0aGluZyBjYWxscyBvdXIgTlBPYmplY3Qgd2l0aCBhIGZ1bmN0aW9uIGxpa2Ug
Ikludm9rZSIuCisvLyAtIENwcE5QT2JqZWN0J3Mgc3RhdGljIGludm9rZSgpIGZ1bmN0aW9uIGZv
cndhcmRzIGl0IHRvIGl0cyBhdHRhY2hlZAorLy8gICBDcHBCb3VuZENsYXNzJ3MgaW52b2tlKCkg
bWV0aG9kLgorLy8gLSBDcHBCb3VuZENsYXNzIGhhcyB0aGVuIG92ZXJyaWRkZW4gaW52b2tlKCkg
dG8gbG9vayB1cCB0aGUgZnVuY3Rpb24KKy8vICAgbmFtZSBpbiBpdHMgaW50ZXJuYWwgbWFwIG9m
IG1ldGhvZHMsIGFuZCB0aGVuIGNhbGxzIHRoZSBhcHByb3ByaWF0ZQorLy8gICBtZXRob2QuCisK
KyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJDcHBCb3VuZENsYXNzLmgiCisKKyNpbmNs
dWRlICJwdWJsaWMvV2ViQmluZGluZ3MuaCIKKyNpbmNsdWRlICJwdWJsaWMvV2ViRnJhbWUuaCIK
KyNpbmNsdWRlICJwdWJsaWMvV2ViU3RyaW5nLmgiCisjaW5jbHVkZSA8d3RmL0Fzc2VydGlvbnMu
aD4KKyNpbmNsdWRlIDx3dGYvT3duUHRyLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBXZWJLaXQ7Cit1
c2luZyBuYW1lc3BhY2Ugc3RkOworCitjbGFzcyBDcHBWYXJpYW50UHJvcGVydHlDYWxsYmFjayA6
IHB1YmxpYyBDcHBCb3VuZENsYXNzOjpQcm9wZXJ0eUNhbGxiYWNrIHsKK3B1YmxpYzoKKyAgICBD
cHBWYXJpYW50UHJvcGVydHlDYWxsYmFjayhDcHBWYXJpYW50KiB2YWx1ZSkgOiBtX3ZhbHVlKHZh
bHVlKSB7IH0KKworICAgIHZpcnR1YWwgYm9vbCBnZXRWYWx1ZShDcHBWYXJpYW50KiB2YWx1ZSkK
KyAgICB7CisgICAgICAgIHZhbHVlLT5zZXQoKm1fdmFsdWUpOworICAgICAgICByZXR1cm4gdHJ1
ZTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgc2V0VmFsdWUoY29uc3QgQ3BwVmFyaWFudCYg
dmFsdWUpCisgICAgeworICAgICAgICBtX3ZhbHVlLT5zZXQodmFsdWUpOworICAgICAgICByZXR1
cm4gdHJ1ZTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgQ3BwVmFyaWFudCogbV92YWx1ZTsKK307
CisKK2NsYXNzIEdldHRlclByb3BlcnR5Q2FsbGJhY2sgOiBwdWJsaWMgQ3BwQm91bmRDbGFzczo6
UHJvcGVydHlDYWxsYmFjayB7CitwdWJsaWM6CisgICAgR2V0dGVyUHJvcGVydHlDYWxsYmFjayhD
cHBCb3VuZENsYXNzOjpHZXR0ZXJDYWxsYmFjayogY2FsbGJhY2spCisgICAgICAgIDogbV9jYWxs
YmFjayhjYWxsYmFjaykgeyB9CisKKyAgICB2aXJ0dWFsIGJvb2wgZ2V0VmFsdWUoQ3BwVmFyaWFu
dCogdmFsdWUpCisgICAgeworICAgICAgICBtX2NhbGxiYWNrLT5ydW4odmFsdWUpOworICAgICAg
ICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgc2V0VmFsdWUoY29uc3Qg
Q3BwVmFyaWFudCYgdmFsdWUpIHsgcmV0dXJuIGZhbHNlOyB9CisKK3ByaXZhdGU6CisgICAgT3du
UHRyPENwcEJvdW5kQ2xhc3M6OkdldHRlckNhbGxiYWNrPiBtX2NhbGxiYWNrOworfTsKKworLy8g
T3VyIHNwZWNpYWwgTlBPYmplY3QgdHlwZS4gIFdlIGV4dGVuZCBhbiBOUE9iamVjdCB3aXRoIGEg
cG9pbnRlciB0byBhCisvLyBDcHBCb3VuZENsYXNzLCB3aGljaCBpcyBqdXN0IGEgQysrIGludGVy
ZmFjZSB0aGF0IHdlIGZvcndhcmQgYWxsIE5QT2JqZWN0CisvLyBjYWxsYmFja3MgdG8uCitzdHJ1
Y3QgQ3BwTlBPYmplY3QgeworICAgIE5QT2JqZWN0IHBhcmVudDsgLy8gVGhpcyBtdXN0IGJlIHRo
ZSBmaXJzdCBmaWVsZCBpbiB0aGUgc3RydWN0LgorICAgIENwcEJvdW5kQ2xhc3MqIGJvdW5kQ2xh
c3M7CisKKyAgICAvLworICAgIC8vIEFsbCBmb2xsb3dpbmcgb2JqZWN0cyBhbmQgZnVuY3Rpb25z
IGFyZSBzdGF0aWMsIGFuZCBqdXN0IHVzZWQgdG8gaW50ZXJmYWNlCisgICAgLy8gd2l0aCBOUE9i
amVjdC9OUENsYXNzLgorICAgIC8vCisKKyAgICAvLyBBbiBOUENsYXNzIGFzc29jaWF0ZXMgc3Rh
dGljIGZ1bmN0aW9ucyBvZiBDcHBOUE9iamVjdCB3aXRoIHRoZQorICAgIC8vIGZ1bmN0aW9uIHBv
aW50ZXJzIHVzZWQgYnkgdGhlIEpTIHJ1bnRpbWUuCisgICAgc3RhdGljIE5QQ2xhc3MgbnBDbGFz
czsKKworICAgIC8vIEFsbG9jYXRlIGEgbmV3IE5QT2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBj
bGFzcy4KKyAgICBzdGF0aWMgTlBPYmplY3QqIGFsbG9jYXRlKE5QUCwgTlBDbGFzcyopOworCisg
ICAgLy8gRnJlZSBhbiBvYmplY3QuCisgICAgc3RhdGljIHZvaWQgZGVhbGxvY2F0ZShOUE9iamVj
dCopOworCisgICAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBDKysgY2xhc3MgYXNzb2NpYXRlZCB3
aXRoIHRoaXMgTlBPYmplY3QgZXhwb3NlcyB0aGUKKyAgICAvLyBnaXZlbiBwcm9wZXJ0eS4gIENh
bGxlZCBieSB0aGUgSlMgcnVudGltZS4KKyAgICBzdGF0aWMgYm9vbCBoYXNQcm9wZXJ0eShOUE9i
amVjdCosIE5QSWRlbnRpZmllcik7CisKKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIEMrKyBj
bGFzcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBOUE9iamVjdCBleHBvc2VzIHRoZQorICAgIC8vIGdp
dmVuIG1ldGhvZC4gIENhbGxlZCBieSB0aGUgSlMgcnVudGltZS4KKyAgICBzdGF0aWMgYm9vbCBo
YXNNZXRob2QoTlBPYmplY3QqLCBOUElkZW50aWZpZXIpOworCisgICAgLy8gSWYgdGhlIGdpdmVu
IG1ldGhvZCBpcyBleHBvc2VkIGJ5IHRoZSBDKysgY2xhc3MgYXNzb2NpYXRlZCB3aXRoIHRoaXMK
KyAgICAvLyBOUE9iamVjdCwgaW52b2tlcyBpdCB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMgYW5k
IHJldHVybnMgYSByZXN1bHQuICBPdGhlcndpc2UsCisgICAgLy8gcmV0dXJucyAidW5kZWZpbmVk
IiAoaW4gdGhlIEphdmFTY3JpcHQgc2Vuc2UpLiAgQ2FsbGVkIGJ5IHRoZSBKUyBydW50aW1lLgor
ICAgIHN0YXRpYyBib29sIGludm9rZShOUE9iamVjdCosIE5QSWRlbnRpZmllciwKKyAgICAgICAg
ICAgICAgICAgICAgICAgY29uc3QgTlBWYXJpYW50KiBhcmd1bWVudHMsIHVpbnQzMl90IGFyZ3Vt
ZW50Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgIE5QVmFyaWFudCogcmVzdWx0KTsKKwor
ICAgIC8vIElmIHRoZSBnaXZlbiBwcm9wZXJ0eSBpcyBleHBvc2VkIGJ5IHRoZSBDKysgY2xhc3Mg
YXNzb2NpYXRlZCB3aXRoIHRoaXMKKyAgICAvLyBOUE9iamVjdCwgcmV0dXJucyBpdHMgdmFsdWUu
ICBPdGhlcndpc2UsIHJldHVybnMgInVuZGVmaW5lZCIgKGluIHRoZQorICAgIC8vIEphdmFTY3Jp
cHQgc2Vuc2UpLiAgQ2FsbGVkIGJ5IHRoZSBKUyBydW50aW1lLgorICAgIHN0YXRpYyBib29sIGdl
dFByb3BlcnR5KE5QT2JqZWN0KiwgTlBJZGVudGlmaWVyLCBOUFZhcmlhbnQqIHJlc3VsdCk7CisK
KyAgICAvLyBJZiB0aGUgZ2l2ZW4gcHJvcGVydHkgaXMgZXhwb3NlZCBieSB0aGUgQysrIGNsYXNz
IGFzc29jaWF0ZWQgd2l0aCB0aGlzCisgICAgLy8gTlBPYmplY3QsIHNldHMgaXRzIHZhbHVlLiAg
T3RoZXJ3aXNlLCBkb2VzIG5vdGhpbmcuIENhbGxlZCBieSB0aGUgSlMKKyAgICAvLyBydW50aW1l
LgorICAgIHN0YXRpYyBib29sIHNldFByb3BlcnR5KE5QT2JqZWN0KiwgTlBJZGVudGlmaWVyLCBj
b25zdCBOUFZhcmlhbnQqIHZhbHVlKTsKK307CisKKy8vIEJ1aWxkIENwcE5QT2JqZWN0J3Mgc3Rh
dGljIGZ1bmN0aW9uIHBvaW50ZXJzIGludG8gYW4gTlBDbGFzcywgZm9yIHVzZQorLy8gaW4gY29u
c3RydWN0aW5nIE5QT2JqZWN0cyBmb3IgdGhlIEMrKyBjbGFzc2VzLgorTlBDbGFzcyBDcHBOUE9i
amVjdDo6bnBDbGFzcyA9IHsKKyAgICBOUF9DTEFTU19TVFJVQ1RfVkVSU0lPTiwKKyAgICBDcHBO
UE9iamVjdDo6YWxsb2NhdGUsCisgICAgQ3BwTlBPYmplY3Q6OmRlYWxsb2NhdGUsCisgICAgLyog
TlBJbnZhbGlkYXRlRnVuY3Rpb25QdHIgKi8gMCwKKyAgICBDcHBOUE9iamVjdDo6aGFzTWV0aG9k
LAorICAgIENwcE5QT2JqZWN0OjppbnZva2UsCisgICAgLyogTlBJbnZva2VEZWZhdWx0RnVuY3Rp
b25QdHIgKi8gMCwKKyAgICBDcHBOUE9iamVjdDo6aGFzUHJvcGVydHksCisgICAgQ3BwTlBPYmpl
Y3Q6OmdldFByb3BlcnR5LAorICAgIENwcE5QT2JqZWN0OjpzZXRQcm9wZXJ0eSwKKyAgICAvKiBO
UFJlbW92ZVByb3BlcnR5RnVuY3Rpb25QdHIgKi8gMAorfTsKKworTlBPYmplY3QqIENwcE5QT2Jq
ZWN0OjphbGxvY2F0ZShOUFAgbnBwLCBOUENsYXNzKiBhQ2xhc3MpCit7CisgICAgQ3BwTlBPYmpl
Y3QqIG9iaiA9IG5ldyBDcHBOUE9iamVjdDsKKyAgICAvLyBvYmotPnBhcmVudCB3aWxsIGJlIGlu
aXRpYWxpemVkIGJ5IHRoZSBOUE9iamVjdCBjb2RlIGNhbGxpbmcgdGhpcy4KKyAgICBvYmotPmJv
dW5kQ2xhc3MgPSAwOworICAgIHJldHVybiAmb2JqLT5wYXJlbnQ7Cit9CisKK3ZvaWQgQ3BwTlBP
YmplY3Q6OmRlYWxsb2NhdGUoTlBPYmplY3QqIG5wT2JqKQoreworICAgIENwcE5QT2JqZWN0KiBv
YmogPSByZWludGVycHJldF9jYXN0PENwcE5QT2JqZWN0Kj4obnBPYmopOworICAgIGRlbGV0ZSBv
Ymo7Cit9CisKK2Jvb2wgQ3BwTlBPYmplY3Q6Omhhc01ldGhvZChOUE9iamVjdCogbnBPYmosIE5Q
SWRlbnRpZmllciBpZGVudCkKK3sKKyAgICBDcHBOUE9iamVjdCogb2JqID0gcmVpbnRlcnByZXRf
Y2FzdDxDcHBOUE9iamVjdCo+KG5wT2JqKTsKKyAgICByZXR1cm4gb2JqLT5ib3VuZENsYXNzLT5o
YXNNZXRob2QoaWRlbnQpOworfQorCitib29sIENwcE5QT2JqZWN0OjpoYXNQcm9wZXJ0eShOUE9i
amVjdCogbnBPYmosIE5QSWRlbnRpZmllciBpZGVudCkKK3sKKyAgICBDcHBOUE9iamVjdCogb2Jq
ID0gcmVpbnRlcnByZXRfY2FzdDxDcHBOUE9iamVjdCo+KG5wT2JqKTsKKyAgICByZXR1cm4gb2Jq
LT5ib3VuZENsYXNzLT5oYXNQcm9wZXJ0eShpZGVudCk7Cit9CisKK2Jvb2wgQ3BwTlBPYmplY3Q6
Omludm9rZShOUE9iamVjdCogbnBPYmosIE5QSWRlbnRpZmllciBpZGVudCwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICBjb25zdCBOUFZhcmlhbnQqIGFyZ3VtZW50cywgdWludDMyX3QgYXJndW1l
bnRDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOUFZhcmlhbnQqIHJlc3VsdCkKK3sK
KyAgICBDcHBOUE9iamVjdCogb2JqID0gcmVpbnRlcnByZXRfY2FzdDxDcHBOUE9iamVjdCo+KG5w
T2JqKTsKKyAgICByZXR1cm4gb2JqLT5ib3VuZENsYXNzLT5pbnZva2UoaWRlbnQsIGFyZ3VtZW50
cywgYXJndW1lbnRDb3VudCwgcmVzdWx0KTsKK30KKworYm9vbCBDcHBOUE9iamVjdDo6Z2V0UHJv
cGVydHkoTlBPYmplY3QqIG5wT2JqLCBOUElkZW50aWZpZXIgaWRlbnQsIE5QVmFyaWFudCogcmVz
dWx0KQoreworICAgIENwcE5QT2JqZWN0KiBvYmogPSByZWludGVycHJldF9jYXN0PENwcE5QT2Jq
ZWN0Kj4obnBPYmopOworICAgIHJldHVybiBvYmotPmJvdW5kQ2xhc3MtPmdldFByb3BlcnR5KGlk
ZW50LCByZXN1bHQpOworfQorCitib29sIENwcE5QT2JqZWN0OjpzZXRQcm9wZXJ0eShOUE9iamVj
dCogbnBPYmosIE5QSWRlbnRpZmllciBpZGVudCwgY29uc3QgTlBWYXJpYW50KiB2YWx1ZSkKK3sK
KyAgICBDcHBOUE9iamVjdCogb2JqID0gcmVpbnRlcnByZXRfY2FzdDxDcHBOUE9iamVjdCo+KG5w
T2JqKTsKKyAgICByZXR1cm4gb2JqLT5ib3VuZENsYXNzLT5zZXRQcm9wZXJ0eShpZGVudCwgdmFs
dWUpOworfQorCitDcHBCb3VuZENsYXNzOjp+Q3BwQm91bmRDbGFzcygpCit7CisgICAgZm9yIChN
ZXRob2RMaXN0OjppdGVyYXRvciBpID0gbV9tZXRob2RzLmJlZ2luKCk7IGkgIT0gbV9tZXRob2Rz
LmVuZCgpOyArK2kpCisgICAgICAgIGRlbGV0ZSBpLT5zZWNvbmQ7CisKKyAgICBmb3IgKFByb3Bl
cnR5TGlzdDo6aXRlcmF0b3IgaSA9IG1fcHJvcGVydGllcy5iZWdpbigpOyBpICE9IG1fcHJvcGVy
dGllcy5lbmQoKTsgKytpKQorICAgICAgICBkZWxldGUgaS0+c2Vjb25kOworCisgICAgLy8gVW5y
ZWdpc3RlciBvdXJzZWx2ZXMgaWYgd2Ugd2VyZSBib3VuZCB0byBhIGZyYW1lLgorICAgIGlmICht
X2JvdW5kVG9GcmFtZSkKKyAgICAgICAgV2ViQmluZGluZ3M6OnVucmVnaXN0ZXJPYmplY3QoTlBW
QVJJQU5UX1RPX09CSkVDVChtX3NlbGZWYXJpYW50KSk7Cit9CisKK2Jvb2wgQ3BwQm91bmRDbGFz
czo6aGFzTWV0aG9kKE5QSWRlbnRpZmllciBpZGVudCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9t
ZXRob2RzLmZpbmQoaWRlbnQpICE9IG1fbWV0aG9kcy5lbmQoKTsKK30KKworYm9vbCBDcHBCb3Vu
ZENsYXNzOjpoYXNQcm9wZXJ0eShOUElkZW50aWZpZXIgaWRlbnQpIGNvbnN0Cit7CisgICAgcmV0
dXJuIG1fcHJvcGVydGllcy5maW5kKGlkZW50KSAhPSBtX3Byb3BlcnRpZXMuZW5kKCk7Cit9CisK
K2Jvb2wgQ3BwQm91bmRDbGFzczo6aW52b2tlKE5QSWRlbnRpZmllciBpZGVudCwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGNvbnN0IE5QVmFyaWFudCogYXJndW1lbnRzLAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgc2l6ZV90IGFyZ3VtZW50Q291bnQsCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICBOUFZhcmlhbnQqIHJlc3VsdCkgeworICAgIE1ldGhvZExpc3Q6OmNvbnN0X2l0
ZXJhdG9yIGVuZCA9IG1fbWV0aG9kcy5lbmQoKTsKKyAgICBNZXRob2RMaXN0Ojpjb25zdF9pdGVy
YXRvciBtZXRob2QgPSBtX21ldGhvZHMuZmluZChpZGVudCk7CisgICAgQ2FsbGJhY2sqIGNhbGxi
YWNrOworICAgIGlmIChtZXRob2QgPT0gZW5kKSB7CisgICAgICAgIGlmICghbV9mYWxsYmFja0Nh
bGxiYWNrLmdldCgpKSB7CisgICAgICAgICAgICBWT0lEX1RPX05QVkFSSUFOVCgqcmVzdWx0KTsK
KyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBjYWxsYmFjayA9
IG1fZmFsbGJhY2tDYWxsYmFjay5nZXQoKTsKKyAgICB9IGVsc2UKKyAgICAgICAgY2FsbGJhY2sg
PSAoKm1ldGhvZCkuc2Vjb25kOworCisgICAgLy8gQnVpbGQgYSBDcHBBcmd1bWVudExpc3QgYXJn
dW1lbnQgdmVjdG9yIGZyb20gdGhlIE5QVmFyaWFudHMgY29taW5nIGluLgorICAgIENwcEFyZ3Vt
ZW50TGlzdCBjcHBBcmd1bWVudHMoYXJndW1lbnRDb3VudCk7CisgICAgZm9yIChzaXplX3QgaSA9
IDA7IGkgPCBhcmd1bWVudENvdW50OyBpKyspCisgICAgICAgIGNwcEFyZ3VtZW50c1tpXS5zZXQo
YXJndW1lbnRzW2ldKTsKKworICAgIENwcFZhcmlhbnQgY3BwUmVzdWx0OworICAgIGNhbGxiYWNr
LT5ydW4oY3BwQXJndW1lbnRzLCAmY3BwUmVzdWx0KTsKKworICAgIGNwcFJlc3VsdC5jb3B5VG9O
UFZhcmlhbnQocmVzdWx0KTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDcHBCb3VuZENs
YXNzOjpnZXRQcm9wZXJ0eShOUElkZW50aWZpZXIgaWRlbnQsIE5QVmFyaWFudCogcmVzdWx0KSBj
b25zdAoreworICAgIFByb3BlcnR5TGlzdDo6Y29uc3RfaXRlcmF0b3IgY2FsbGJhY2sgPSBtX3By
b3BlcnRpZXMuZmluZChpZGVudCk7CisgICAgaWYgKGNhbGxiYWNrID09IG1fcHJvcGVydGllcy5l
bmQoKSkgeworICAgICAgICBWT0lEX1RPX05QVkFSSUFOVCgqcmVzdWx0KTsKKyAgICAgICAgcmV0
dXJuIGZhbHNlOworICAgIH0KKworICAgIENwcFZhcmlhbnQgY3BwVmFsdWU7CisgICAgaWYgKCFj
YWxsYmFjay0+c2Vjb25kLT5nZXRWYWx1ZSgmY3BwVmFsdWUpKQorICAgICAgICByZXR1cm4gZmFs
c2U7CisgICAgY3BwVmFsdWUuY29weVRvTlBWYXJpYW50KHJlc3VsdCk7CisgICAgcmV0dXJuIHRy
dWU7Cit9CisKK2Jvb2wgQ3BwQm91bmRDbGFzczo6c2V0UHJvcGVydHkoTlBJZGVudGlmaWVyIGlk
ZW50LCBjb25zdCBOUFZhcmlhbnQqIHZhbHVlKQoreworICAgIFByb3BlcnR5TGlzdDo6aXRlcmF0
b3IgY2FsbGJhY2sgPSBtX3Byb3BlcnRpZXMuZmluZChpZGVudCk7CisgICAgaWYgKGNhbGxiYWNr
ID09IG1fcHJvcGVydGllcy5lbmQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgQ3Bw
VmFyaWFudCBjcHBWYWx1ZTsKKyAgICBjcHBWYWx1ZS5zZXQoKnZhbHVlKTsKKyAgICByZXR1cm4g
KCpjYWxsYmFjaykuc2Vjb25kLT5zZXRWYWx1ZShjcHBWYWx1ZSk7Cit9CisKK3ZvaWQgQ3BwQm91
bmRDbGFzczo6YmluZENhbGxiYWNrKGNvbnN0IHN0cmluZyYgbmFtZSwgQ2FsbGJhY2sqIGNhbGxi
YWNrKQoreworICAgIE5QSWRlbnRpZmllciBpZGVudCA9IFdlYkJpbmRpbmdzOjpnZXRTdHJpbmdJ
ZGVudGlmaWVyKG5hbWUuY19zdHIoKSk7CisgICAgTWV0aG9kTGlzdDo6aXRlcmF0b3Igb2xkQ2Fs
bGJhY2sgPSBtX21ldGhvZHMuZmluZChpZGVudCk7CisgICAgaWYgKG9sZENhbGxiYWNrICE9IG1f
bWV0aG9kcy5lbmQoKSkgeworICAgICAgICBkZWxldGUgb2xkQ2FsbGJhY2stPnNlY29uZDsKKyAg
ICAgICAgaWYgKCFjYWxsYmFjaykgeworICAgICAgICAgICAgbV9tZXRob2RzLnJlbW92ZShvbGRD
YWxsYmFjayk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBt
X21ldGhvZHMuc2V0KGlkZW50LCBjYWxsYmFjayk7Cit9CisKK3ZvaWQgQ3BwQm91bmRDbGFzczo6
YmluZEdldHRlckNhbGxiYWNrKGNvbnN0IHN0cmluZyYgbmFtZSwgR2V0dGVyQ2FsbGJhY2sqIGNh
bGxiYWNrKQoreworICAgIFByb3BlcnR5Q2FsbGJhY2sqIHByb3BlcnR5Q2FsbGJhY2sgPSBjYWxs
YmFjayA/IG5ldyBHZXR0ZXJQcm9wZXJ0eUNhbGxiYWNrKGNhbGxiYWNrKSA6IDA7CisgICAgYmlu
ZFByb3BlcnR5KG5hbWUsIHByb3BlcnR5Q2FsbGJhY2spOworfQorCit2b2lkIENwcEJvdW5kQ2xh
c3M6OmJpbmRQcm9wZXJ0eShjb25zdCBzdHJpbmcmIG5hbWUsIENwcFZhcmlhbnQqIHByb3ApCit7
CisgICAgUHJvcGVydHlDYWxsYmFjayogcHJvcGVydHlDYWxsYmFjayA9IHByb3AgPyBuZXcgQ3Bw
VmFyaWFudFByb3BlcnR5Q2FsbGJhY2socHJvcCkgOiAwOworICAgIGJpbmRQcm9wZXJ0eShuYW1l
LCBwcm9wZXJ0eUNhbGxiYWNrKTsKK30KKwordm9pZCBDcHBCb3VuZENsYXNzOjpiaW5kUHJvcGVy
dHkoY29uc3Qgc3RyaW5nJiBuYW1lLCBQcm9wZXJ0eUNhbGxiYWNrKiBjYWxsYmFjaykKK3sKKyAg
ICBOUElkZW50aWZpZXIgaWRlbnQgPSBXZWJCaW5kaW5nczo6Z2V0U3RyaW5nSWRlbnRpZmllcihu
YW1lLmNfc3RyKCkpOworICAgIFByb3BlcnR5TGlzdDo6aXRlcmF0b3Igb2xkQ2FsbGJhY2sgPSBt
X3Byb3BlcnRpZXMuZmluZChpZGVudCk7CisgICAgaWYgKG9sZENhbGxiYWNrICE9IG1fcHJvcGVy
dGllcy5lbmQoKSkgeworICAgICAgICBkZWxldGUgb2xkQ2FsbGJhY2stPnNlY29uZDsKKyAgICAg
ICAgaWYgKCFjYWxsYmFjaykgeworICAgICAgICAgICAgbV9wcm9wZXJ0aWVzLnJlbW92ZShvbGRD
YWxsYmFjayk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBt
X3Byb3BlcnRpZXMuc2V0KGlkZW50LCBjYWxsYmFjayk7Cit9CisKK2Jvb2wgQ3BwQm91bmRDbGFz
czo6aXNNZXRob2RSZWdpc3RlcmVkKGNvbnN0IHN0cmluZyYgbmFtZSkgY29uc3QKK3sKKyAgICBO
UElkZW50aWZpZXIgaWRlbnQgPSBXZWJCaW5kaW5nczo6Z2V0U3RyaW5nSWRlbnRpZmllcihuYW1l
LmNfc3RyKCkpOworICAgIE1ldGhvZExpc3Q6OmNvbnN0X2l0ZXJhdG9yIGNhbGxiYWNrID0gbV9t
ZXRob2RzLmZpbmQoaWRlbnQpOworICAgIHJldHVybiBjYWxsYmFjayAhPSBtX21ldGhvZHMuZW5k
KCk7Cit9CisKK0NwcFZhcmlhbnQqIENwcEJvdW5kQ2xhc3M6OmdldEFzQ3BwVmFyaWFudCgpCit7
CisgICAgaWYgKCFtX3NlbGZWYXJpYW50LmlzT2JqZWN0KCkpIHsKKyAgICAgICAgLy8gQ3JlYXRl
IGFuIE5QT2JqZWN0IHVzaW5nIG91ciBzdGF0aWMgTlBDbGFzcy4gIFRoZSBmaXJzdCBhcmd1bWVu
dCAoYQorICAgICAgICAvLyBwbHVnaW4ncyBpbnN0YW5jZSBoYW5kbGUpIGlzIHBhc3NlZCB0aHJv
dWdoIHRvIHRoZSBhbGxvY2F0ZSBmdW5jdGlvbgorICAgICAgICAvLyBkaXJlY3RseSwgYW5kIHdl
IGRvbid0IHVzZSBpdCwgc28gaXQncyBvayB0byBiZSAwLgorICAgICAgICBOUE9iamVjdCogbnBP
YmogPSBXZWJCaW5kaW5nczo6Y3JlYXRlT2JqZWN0KDAsICZDcHBOUE9iamVjdDo6bnBDbGFzcyk7
CisgICAgICAgIENwcE5QT2JqZWN0KiBvYmogPSByZWludGVycHJldF9jYXN0PENwcE5QT2JqZWN0
Kj4obnBPYmopOworICAgICAgICBvYmotPmJvdW5kQ2xhc3MgPSB0aGlzOworICAgICAgICBtX3Nl
bGZWYXJpYW50LnNldChucE9iaik7CisgICAgICAgIFdlYkJpbmRpbmdzOjpyZWxlYXNlT2JqZWN0
KG5wT2JqKTsgLy8gQ3BwVmFyaWFudCB0YWtlcyB0aGUgcmVmZXJlbmNlLgorICAgIH0KKyAgICBB
U1NFUlQobV9zZWxmVmFyaWFudC5pc09iamVjdCgpKTsKKyAgICByZXR1cm4gJm1fc2VsZlZhcmlh
bnQ7Cit9CisKK3ZvaWQgQ3BwQm91bmRDbGFzczo6YmluZFRvSmF2YXNjcmlwdChXZWJGcmFtZSog
ZnJhbWUsIGNvbnN0IFdlYlN0cmluZyYgY2xhc3NuYW1lKQoreworICAgIC8vIEJpbmRUb1dpbmRv
d09iamVjdCB3aWxsIHRha2UgaXRzIG93biByZWZlcmVuY2UgdG8gdGhlIE5QT2JqZWN0LCBhbmQg
Y2xlYW4KKyAgICAvLyB1cCBhZnRlciBpdHNlbGYuICBJdCB3aWxsIGFsc28gKGluZGlyZWN0bHkp
IHJlZ2lzdGVyIHRoZSBvYmplY3Qgd2l0aCBWOCwKKyAgICAvLyBzbyB3ZSBtdXN0IHJlbWVtYmVy
IHRoaXMgc28gd2UgY2FuIHVucmVnaXN0ZXIgaXQgd2hlbiB3ZSdyZSBkZXN0cm95ZWQuCisgICAg
ZnJhbWUtPmJpbmRUb1dpbmRvd09iamVjdChjbGFzc25hbWUsIE5QVkFSSUFOVF9UT19PQkpFQ1Qo
KmdldEFzQ3BwVmFyaWFudCgpKSk7CisgICAgbV9ib3VuZFRvRnJhbWUgPSB0cnVlOworfQpkaWZm
IC0tZ2l0IGEvV2ViS2l0VG9vbHMvRHVtcFJlbmRlclRyZWUvY2hyb21pdW0vQ3BwQm91bmRDbGFz
cy5oIGIvV2ViS2l0VG9vbHMvRHVtcFJlbmRlclRyZWUvY2hyb21pdW0vQ3BwQm91bmRDbGFzcy5o
Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxZGY2YzkKLS0tIC9kZXYvbnVs
bAorKysgYi9XZWJLaXRUb29scy9EdW1wUmVuZGVyVHJlZS9jaHJvbWl1bS9DcHBCb3VuZENsYXNz
LmgKQEAgLTAsMCArMSwyNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIENocm9t
aXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAg
ICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAq
IE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAq
IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMg
ZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3Jp
dHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhF
IENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1J
VEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBF
VkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElB
QkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVY
RU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAq
IExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworLyoKKyAgQ3BwQm91bmRDbGFzcyBjbGFzczoK
KyAgVGhpcyBiYXNlIGNsYXNzIHNlcnZlcyBhcyBhIHBhcmVudCBmb3IgQysrIGNsYXNzZXMgZGVz
aWduZWQgdG8gYmUgYm91bmQgdG8KKyAgSmF2YVNjcmlwdCBvYmplY3RzLgorCisgIFN1YmNsYXNz
ZXMgc2hvdWxkIGRlZmluZSB0aGUgY29uc3RydWN0b3IgdG8gYnVpbGQgdGhlIHByb3BlcnR5IGFu
ZCBtZXRob2QKKyAgbGlzdHMgbmVlZGVkIHRvIGJpbmQgdGhpcyBjbGFzcyB0byBhIEpTIG9iamVj
dC4gIFRoZXkgc2hvdWxkIGFsc28gZGVjbGFyZQorICBhbmQgZGVmaW5lIG1lbWJlciB2YXJpYWJs
ZXMgYW5kIG1ldGhvZHMgdG8gYmUgZXhwb3NlZCB0byBKUyB0aHJvdWdoCisgIHRoYXQgb2JqZWN0
LgorKi8KKworI2lmbmRlZiBDcHBCb3VuZENsYXNzX2gKKyNkZWZpbmUgQ3BwQm91bmRDbGFzc19o
CisKKyNpbmNsdWRlICJDcHBWYXJpYW50LmgiCisjaW5jbHVkZSA8d3RmL0hhc2hNYXAuaD4KKyNp
bmNsdWRlIDx3dGYvTm9uY29weWFibGUuaD4KKyNpbmNsdWRlIDx3dGYvT3duUHRyLmg+CisjaW5j
bHVkZSA8d3RmL1ZlY3Rvci5oPgorCituYW1lc3BhY2UgV2ViS2l0IHsKK2NsYXNzIFdlYkZyYW1l
OworY2xhc3MgV2ViU3RyaW5nOworfQorCit0eXBlZGVmIFZlY3RvcjxDcHBWYXJpYW50PiBDcHBB
cmd1bWVudExpc3Q7CisKKy8vIENwcEJvdW5kQ2xhc3MgbGV0cyB5b3UgbWFwIEphdmFzY3JpcHQg
bWV0aG9kIGNhbGxzIGFuZCBwcm9wZXJ0eSBhY2Nlc3NlcworLy8gZGlyZWN0bHkgdG8gQysrIG1l
dGhvZCBjYWxscyBhbmQgQ3BwVmFyaWFudCogdmFyaWFibGUgYWNjZXNzLgorY2xhc3MgQ3BwQm91
bmRDbGFzcyA6IHB1YmxpYyBOb25jb3B5YWJsZSB7CitwdWJsaWM6CisgICAgY2xhc3MgUHJvcGVy
dHlDYWxsYmFjayB7CisgICAgcHVibGljOgorICAgICAgICB2aXJ0dWFsIH5Qcm9wZXJ0eUNhbGxi
YWNrKCkgeyB9CisKKyAgICAgICAgLy8gU2V0cyB8dmFsdWV8IHRvIHRoZSB2YWx1ZSBvZiB0aGUg
cHJvcGVydHkuIFJldHVybnMgZmFsc2UgaW4gY2FzZSBvZgorICAgICAgICAvLyBmYWlsdXJlLiB8
dmFsdWV8IGlzIGFsd2F5cyBub24tMC4KKyAgICAgICAgdmlydHVhbCBib29sIGdldFZhbHVlKENw
cFZhcmlhbnQqIHJlc3VsdCkgPSAwOworCisgICAgICAgIC8vIHNldHMgdGhlIHByb3BlcnR5IHZh
bHVlIHRvIHx2YWx1ZXwuIFJldHVybnMgZmFsc2UgaW4gY2FzZSBvZiBmYWlsdXJlLgorICAgICAg
ICB2aXJ0dWFsIGJvb2wgc2V0VmFsdWUoY29uc3QgQ3BwVmFyaWFudCYpID0gMDsKKyAgICB9Owor
CisgICAgLy8gQ2FsbGJhY2sgY2xhc3MgZm9yICJ2b2lkIGZ1bmN0aW9uKENwcFZhcmlhbnQqKSIK
KyAgICBjbGFzcyBHZXR0ZXJDYWxsYmFjayB7CisgICAgcHVibGljOgorICAgICAgICB2aXJ0dWFs
IH5HZXR0ZXJDYWxsYmFjaygpIHt9CisgICAgICAgIHZpcnR1YWwgdm9pZCBydW4oQ3BwVmFyaWFu
dCopID0gMDsKKyAgICB9OworCisgICAgLy8gVGhlIGNvbnN0cnVjdG9yIHNob3VsZCBjYWxsIEJp
bmRNZXRob2QsIEJpbmRQcm9wZXJ0eSwgYW5kCisgICAgLy8gU2V0RmFsbGJhY2tNZXRob2QgYXMg
bmVlZGVkIHRvIHNldCB1cCB0aGUgbWV0aG9kcywgcHJvcGVydGllcywgYW5kCisgICAgLy8gZmFs
bGJhY2sgbWV0aG9kLgorICAgIENwcEJvdW5kQ2xhc3MoKSA6IG1fYm91bmRUb0ZyYW1lKGZhbHNl
KSB7fQorICAgIHZpcnR1YWwgfkNwcEJvdW5kQ2xhc3MoKTsKKworICAgIC8vIFJldHVybiBhIENw
cFZhcmlhbnQgcmVwcmVzZW50aW5nIHRoaXMgY2xhc3MsIGZvciB1c2Ugd2l0aCBCaW5kUHJvcGVy
dHkoKS4KKyAgICAvLyBUaGUgdmFyaWFudCB0eXBlIGlzIGd1YXJhbnRlZWQgdG8gYmUgTlBWYXJp
YW50VHlwZV9PYmplY3QuCisgICAgQ3BwVmFyaWFudCogZ2V0QXNDcHBWYXJpYW50KCk7CisKKyAg
ICAvLyBHaXZlbiBhIFdlYkZyYW1lLCBCaW5kVG9KYXZhc2NyaXB0IGJ1aWxkcyB0aGUgTlBPYmpl
Y3QgdGhhdCB3aWxsIHJlcHJlc2VudAorICAgIC8vIHRoZSBjbGFzcyBhbmQgYmluZHMgaXQgdG8g
dGhlIGZyYW1lJ3Mgd2luZG93IHVuZGVyIHRoZSBnaXZlbiBuYW1lLiAgVGhpcworICAgIC8vIHNo
b3VsZCBnZW5lcmFsbHkgYmUgY2FsbGVkIGZyb20gdGhlIFdlYlZpZXcgZGVsZWdhdGUncworICAg
IC8vIFdpbmRvd09iamVjdENsZWFyZWQoKS4gQSBjbGFzcyBzbyBib3VuZCB3aWxsIGJlIGFjY2Vz
c2libGUgdG8gSmF2YVNjcmlwdAorICAgIC8vIGFzIHdpbmRvdy48Y2xhc3NuYW1lPi4gVGhlIG93
bmVyIG9mIHRoZSBDcHBCb3VuZE9iamVjdCBpcyByZXNwb25zaWJsZSBmb3IKKyAgICAvLyBrZWVw
aW5nIHRoZSBvYmplY3QgYXJvdW5kIHdoaWxlIHRoZSBmcmFtZSBpcyBhbGl2ZSwgYW5kIGZvciBk
ZXN0cm95aW5nIGl0CisgICAgLy8gYWZ0ZXJ3YXJkcy4KKyAgICB2b2lkIGJpbmRUb0phdmFzY3Jp
cHQoV2ViS2l0OjpXZWJGcmFtZSosIGNvbnN0IFdlYktpdDo6V2ViU3RyaW5nJiBjbGFzc25hbWUp
OworCisgICAgLy8gVXNlZCBieSBhIHRlc3QuICBSZXR1cm5zIHRydWUgaWYgYSBtZXRob2Qgd2l0
aCBuYW1lIHxuYW1lfCBleGlzdHMsCisgICAgLy8gcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGEgZmFs
bGJhY2sgaXMgcmVnaXN0ZXJlZC4KKyAgICBib29sIGlzTWV0aG9kUmVnaXN0ZXJlZChjb25zdCBz
dGQ6OnN0cmluZyYpIGNvbnN0OworCitwcm90ZWN0ZWQ6CisgICAgLy8gQ2FsbGJhY2sgZm9yICJ2
b2lkIGZ1bmN0aW9uKGNvbnN0IENwcEFyZ3VlbW50TGlzdCYsIENwcFZhcmlhbnQqKSIKKyAgICBj
bGFzcyBDYWxsYmFjayB7CisgICAgcHVibGljOgorICAgICAgICB2aXJ0dWFsIH5DYWxsYmFjaygp
IHt9CisgICAgICAgIHZpcnR1YWwgdm9pZCBydW4oY29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3Bw
VmFyaWFudCopID0gMDsKKyAgICB9OworCisgICAgLy8gQ2FsbGJhY2sgZm9yICJ2b2lkIFQ6Om1l
dGhvZChjb25zdCBDcHBBcmd1ZW1udExpc3QmLCBDcHBWYXJpYW50KikiCisgICAgdGVtcGxhdGUg
PGNsYXNzIFQ+IGNsYXNzIE1lbWJlckNhbGxiYWNrIDogcHVibGljIENhbGxiYWNrIHsKKyAgICBw
dWJsaWM6CisgICAgICAgIHR5cGVkZWYgdm9pZCAoVDo6Kk1ldGhvZFR5cGUpKGNvbnN0IENwcEFy
Z3VtZW50TGlzdCYsIENwcFZhcmlhbnQqKTsKKyAgICAgICAgTWVtYmVyQ2FsbGJhY2soVCogb2Jq
ZWN0LCBNZXRob2RUeXBlIG1ldGhvZCkKKyAgICAgICAgICAgIDogbV9vYmplY3Qob2JqZWN0KQor
ICAgICAgICAgICAgLCBtX21ldGhvZChtZXRob2QpIHt9CisgICAgICAgIHZpcnR1YWwgfk1lbWJl
ckNhbGxiYWNrKCkge30KKworICAgICAgICB2aXJ0dWFsIHZvaWQgcnVuKGNvbnN0IENwcEFyZ3Vt
ZW50TGlzdCYgYXJndW1lbnRzLCBDcHBWYXJpYW50KiByZXN1bHQpCisgICAgICAgIHsKKyAgICAg
ICAgICAgIChtX29iamVjdC0+Km1fbWV0aG9kKShhcmd1bWVudHMsIHJlc3VsdCk7CisgICAgICAg
IH0KKyAgICBwcml2YXRlOgorICAgICAgICBUKiBtX29iamVjdDsKKyAgICAgICAgTWV0aG9kVHlw
ZSBtX21ldGhvZDsKKyAgICB9OworCisgICAgLy8gQ2FsbGJhY2sgY2xhc3MgZm9yICJ2b2lkIFQ6
Om1ldGhvZChDcHBWYXJpYW50KikiCisgICAgdGVtcGxhdGUgPGNsYXNzIFQ+IGNsYXNzIE1lbWJl
ckdldHRlckNhbGxiYWNrIDogcHVibGljIEdldHRlckNhbGxiYWNrIHsKKyAgICBwdWJsaWM6Cisg
ICAgICAgIHR5cGVkZWYgdm9pZCAoVDo6Kk1ldGhvZFR5cGUpKENwcFZhcmlhbnQqKTsKKyAgICAg
ICAgTWVtYmVyR2V0dGVyQ2FsbGJhY2soVCogb2JqZWN0LCBNZXRob2RUeXBlIG1ldGhvZCkKKyAg
ICAgICAgICAgIDogbV9vYmplY3Qob2JqZWN0KQorICAgICAgICAgICAgLCBtX21ldGhvZChtZXRo
b2QpIHt9CisgICAgICAgIHZpcnR1YWwgfk1lbWJlckdldHRlckNhbGxiYWNrKCkge30KKworICAg
ICAgICB2aXJ0dWFsIHZvaWQgcnVuKENwcFZhcmlhbnQqIHJlc3VsdCkgeyAobV9vYmplY3QtPipt
X21ldGhvZCkocmVzdWx0KTsgfQorICAgIHByaXZhdGU6CisgICAgICAgIFQqIG1fb2JqZWN0Owor
ICAgICAgICBNZXRob2RUeXBlIG1fbWV0aG9kOworICAgIH07CisKKyAgICAvLyBCaW5kIHRoZSBK
YXZhc2NyaXB0IG1ldGhvZCBjYWxsZWQgdGhlIHN0cmluZyBwYXJhbWV0ZXIgdG8gdGhlIEMrKyBt
ZXRob2QuCisgICAgdm9pZCBiaW5kQ2FsbGJhY2soY29uc3Qgc3RkOjpzdHJpbmcmLCBDYWxsYmFj
ayopOworCisgICAgLy8gQSB3cmFwcGVyIGZvciBiaW5kQ2FsbGJhY2ssIHRvIHNpbXBsaWZ5IHRo
ZSBjb21tb24gY2FzZSBvZiBiaW5kaW5nIGEKKyAgICAvLyBtZXRob2Qgb24gdGhlIGN1cnJlbnQg
b2JqZWN0LiAgVGhvdWdoIG5vdCB2ZXJpZmllZCBoZXJlLCB8bWV0aG9kfAorICAgIC8vIG11c3Qg
YmUgYSBtZXRob2Qgb2YgdGhpcyBDcHBCb3VuZENsYXNzIHN1YmNsYXNzLgorICAgIHRlbXBsYXRl
PGNsYXNzIFQ+CisgICAgdm9pZCBiaW5kTWV0aG9kKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCB2
b2lkIChUOjoqbWV0aG9kKShjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50KikpCisg
ICAgeworICAgICAgICBDYWxsYmFjayogY2FsbGJhY2sgPSBuZXcgTWVtYmVyQ2FsbGJhY2s8VD4o
c3RhdGljX2Nhc3Q8VCo+KHRoaXMpLCBtZXRob2QpOworICAgICAgICBiaW5kQ2FsbGJhY2sobmFt
ZSwgY2FsbGJhY2spOworICAgIH0KKworICAgIC8vIEJpbmQgSmF2YXNjcmlwdCBwcm9wZXJ0eSB8
bmFtZXwgdG8gdGhlIEMrKyBnZXR0ZXIgY2FsbGJhY2sgfGNhbGxiYWNrfC4KKyAgICAvLyBUaGlz
IGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSByZWFkLW9ubHkgcHJvcGVydGllcy4KKyAgICB2b2lkIGJp
bmRHZXR0ZXJDYWxsYmFjayhjb25zdCBzdGQ6OnN0cmluZyYsIEdldHRlckNhbGxiYWNrKik7CisK
KyAgICAvLyBBIHdyYXBwZXIgZm9yIEJpbmRHZXR0ZXJDYWxsYmFjaywgdG8gc2ltcGxpZnkgdGhl
IGNvbW1vbiBjYXNlIG9mIGJpbmRpbmcgYQorICAgIC8vIHByb3BlcnR5IG9uIHRoZSBjdXJyZW50
IG9iamVjdC4gIFRob3VnaCBub3QgdmVyaWZpZWQgaGVyZSwgfG1ldGhvZHwKKyAgICAvLyBtdXN0
IGJlIGEgbWV0aG9kIG9mIHRoaXMgQ3BwQm91bmRDbGFzcyBzdWJjbGFzcy4KKyAgICB0ZW1wbGF0
ZTxjbGFzcyBUPgorICAgIHZvaWQgYmluZFByb3BlcnR5KGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1l
LCB2b2lkIChUOjoqbWV0aG9kKShDcHBWYXJpYW50KikpCisgICAgeworICAgICAgICBHZXR0ZXJD
YWxsYmFjayogY2FsbGJhY2sgPSBuZXcgTWVtYmVyR2V0dGVyQ2FsbGJhY2s8VD4oc3RhdGljX2Nh
c3Q8VCo+KHRoaXMpLCBtZXRob2QpOworICAgICAgICBiaW5kR2V0dGVyQ2FsbGJhY2sobmFtZSwg
Y2FsbGJhY2spOworICAgIH0KKworICAgIC8vIEJpbmQgdGhlIEphdmFzY3JpcHQgcHJvcGVydHkg
Y2FsbGVkIHxuYW1lfCB0byBhIENwcFZhcmlhbnQuCisgICAgdm9pZCBiaW5kUHJvcGVydHkoY29u
c3Qgc3RkOjpzdHJpbmcmLCBDcHBWYXJpYW50Kik7CisKKyAgICAvLyBCaW5kIEphdmFzY3JpcHQg
cHJvcGVydHkgY2FsbGVkIHxuYW1lfCB0byBhIFByb3BlcnR5Q2FsbGJhY2suCisgICAgLy8gQ3Bw
Qm91bmRDbGFzcyBhc3N1bWVzIGNvbnRyb2wgb3ZlciB0aGUgbGlmZSB0aW1lIG9mIHRoZSBjYWxs
YmFjay4KKyAgICB2b2lkIGJpbmRQcm9wZXJ0eShjb25zdCBzdGQ6OnN0cmluZyYsIFByb3BlcnR5
Q2FsbGJhY2sqKTsKKworICAgIC8vIFNldCB0aGUgZmFsbGJhY2sgY2FsbGJhY2ssIHdoaWNoIGlz
IGNhbGxlZCB3aGVuIHdoZW4gYSBjYWxsYmFjayBpcworICAgIC8vIGludm9rZWQgdGhhdCBpc24n
dCBib3VuZC4KKyAgICAvLyBJZiBpdCBpcyAwIChpdHMgZGVmYXVsdCB2YWx1ZSksIGEgSmF2YVNj
cmlwdCBleGNlcHRpb24gaXMgdGhyb3duIGluCisgICAgLy8gdGhhdCBjYXNlIChhcyBub3JtYWxs
eSBleHBlY3RlZCkuIElmIG5vbiAwLCB0aGUgZmFsbGJhY2sgbWV0aG9kIGlzCisgICAgLy8gaW52
b2tlZCBhbmQgdGhlIHNjcmlwdCBjb250aW51ZXMgaXRzIGV4ZWN1dGlvbi4KKyAgICAvLyBQYXNz
aW5nIDAgY2xlYXJzIG91dCBhbnkgZXhpc3RpbmcgYmluZGluZy4KKyAgICAvLyBJdCBpcyB1c2Vk
IGZvciB0ZXN0cyBhbmQgc2hvdWxkIHByb2JhYmx5IG9ubHkgYmUgdXNlZCBpbiBzdWNoIGNhc2Vz
CisgICAgLy8gYXMgaXQgbWF5IGNhdXNlIHVuZXhwZWN0ZWQgYmVoYXZpb3JzIChhIEphdmFTY3Jp
cHQgb2JqZWN0IHdpdGggYQorICAgIC8vIGZhbGxiYWNrIGFsd2F5cyByZXR1cm5zIHRydWUgd2hl
biBjaGVja2VkIGZvciBhIG1ldGhvZCdzCisgICAgLy8gZXhpc3RlbmNlKS4KKyAgICB2b2lkIGJp
bmRGYWxsYmFja0NhbGxiYWNrKENhbGxiYWNrKiBmYWxsYmFja0NhbGxiYWNrKQorICAgIHsKKyAg
ICAgICAgbV9mYWxsYmFja0NhbGxiYWNrLnNldChmYWxsYmFja0NhbGxiYWNrKTsKKyAgICB9CisK
KyAgICAvLyBBIHdyYXBwZXIgZm9yIEJpbmRGYWxsYmFja0NhbGxiYWNrLCB0byBzaW1wbGlmeSB0
aGUgY29tbW9uIGNhc2Ugb2YKKyAgICAvLyBiaW5kaW5nIGEgbWV0aG9kIG9uIHRoZSBjdXJyZW50
IG9iamVjdC4gIFRob3VnaCBub3QgdmVyaWZpZWQgaGVyZSwKKyAgICAvLyB8bWV0aG9kfCBtdXN0
IGJlIGEgbWV0aG9kIG9mIHRoaXMgQ3BwQm91bmRDbGFzcyBzdWJjbGFzcy4KKyAgICAvLyBQYXNz
aW5nIDAgZm9yIHxtZXRob2R8IGNsZWFycyBvdXQgYW55IGV4aXN0aW5nIGJpbmRpbmcuCisgICAg
dGVtcGxhdGU8Y2xhc3MgVD4KKyAgICB2b2lkIGJpbmRGYWxsYmFja01ldGhvZCh2b2lkIChUOjoq
bWV0aG9kKShjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50KikpCisgICAgeworICAg
ICAgICBpZiAobWV0aG9kKSB7CisgICAgICAgICAgICBDYWxsYmFjayogY2FsbGJhY2sgPSBuZXcg
TWVtYmVyQ2FsbGJhY2s8VD4oc3RhdGljX2Nhc3Q8VCo+KHRoaXMpLCBtZXRob2QpOworICAgICAg
ICAgICAgYmluZEZhbGxiYWNrQ2FsbGJhY2soY2FsbGJhY2spOworICAgICAgICB9IGVsc2UKKyAg
ICAgICAgICAgIGJpbmRGYWxsYmFja0NhbGxiYWNrKDApOworICAgIH0KKworICAgIC8vIFNvbWUg
ZmllbGRzIGFyZSBwcm90ZWN0ZWQgYmVjYXVzZSBzb21lIHRlc3RzIGRlcGVuZCBvbiBhY2Nlc3Np
bmcgdGhlbSwKKyAgICAvLyBidXQgb3RoZXJ3aXNlIHRoZXkgc2hvdWxkIGJlIGNvbnNpZGVyZWQg
cHJpdmF0ZS4KKworICAgIHR5cGVkZWYgSGFzaE1hcDxOUElkZW50aWZpZXIsIFByb3BlcnR5Q2Fs
bGJhY2sqPiBQcm9wZXJ0eUxpc3Q7CisgICAgdHlwZWRlZiBIYXNoTWFwPE5QSWRlbnRpZmllciwg
Q2FsbGJhY2sqPiBNZXRob2RMaXN0OworICAgIC8vIFRoZXNlIG1hcHMgYXNzb2NpYXRlIG5hbWVz
IHdpdGggcHJvcGVydHkgYW5kIG1ldGhvZCBwb2ludGVycyB0byBiZQorICAgIC8vIGV4cG9zZWQg
dG8gSmF2YVNjcmlwdC4KKyAgICBQcm9wZXJ0eUxpc3QgbV9wcm9wZXJ0aWVzOworICAgIE1ldGhv
ZExpc3QgbV9tZXRob2RzOworCisgICAgLy8gVGhlIGNhbGxiYWNrIGdldHMgaW52b2tlZCB3aGVu
IGEgY2FsbCBpcyBtYWRlIHRvIGFuIG5vbmV4aXN0ZW50IG1ldGhvZC4KKyAgICBPd25QdHI8Q2Fs
bGJhY2s+IG1fZmFsbGJhY2tDYWxsYmFjazsKKworcHJpdmF0ZToKKyAgICAvLyBOUE9iamVjdCBj
YWxsYmFja3MuCisgICAgZnJpZW5kIHN0cnVjdCBDcHBOUE9iamVjdDsKKyAgICBib29sIGhhc01l
dGhvZChOUElkZW50aWZpZXIpIGNvbnN0OworICAgIGJvb2wgaW52b2tlKE5QSWRlbnRpZmllciwg
Y29uc3QgTlBWYXJpYW50KiBhcmdzLCBzaXplX3QgYXJnQ291bnQsCisgICAgICAgICAgICAgICAg
TlBWYXJpYW50KiByZXN1bHQpOworICAgIGJvb2wgaGFzUHJvcGVydHkoTlBJZGVudGlmaWVyKSBj
b25zdDsKKyAgICBib29sIGdldFByb3BlcnR5KE5QSWRlbnRpZmllciwgTlBWYXJpYW50KiByZXN1
bHQpIGNvbnN0OworICAgIGJvb2wgc2V0UHJvcGVydHkoTlBJZGVudGlmaWVyLCBjb25zdCBOUFZh
cmlhbnQqKTsKKworICAgIC8vIEEgbGF6aWx5LWluaXRpYWxpemVkIENwcFZhcmlhbnQgcmVwcmVz
ZW50aW5nIHRoaXMgY2xhc3MuICBXZSByZXRhaW4gMQorICAgIC8vIHJlZmVyZW5jZSB0byB0aGlz
IG9iamVjdCwgYW5kIGl0IGlzIHJlbGVhc2VkIG9uIGRlbGV0aW9uLgorICAgIENwcFZhcmlhbnQg
bV9zZWxmVmFyaWFudDsKKworICAgIC8vIFRydWUgaWYgb3VyIG5wX29iamVjdCBoYXMgYmVlbiBi
b3VuZCB0byBhIFdlYkZyYW1lLCBpbiB3aGljaCBjYXNlIGl0IG11c3QKKyAgICAvLyBiZSB1bnJl
Z2lzdGVyZWQgd2l0aCBWOCB3aGVuIHdlIGRlbGV0ZSBpdC4KKyAgICBib29sIG1fYm91bmRUb0Zy
YW1lOworfTsKKworI2VuZGlmIC8vIENwcEJvdW5kQ2xhc3NfaApkaWZmIC0tZ2l0IGEvV2ViS2l0
VG9vbHMvRHVtcFJlbmRlclRyZWUvY2hyb21pdW0vQ3BwVmFyaWFudC5jcHAgYi9XZWJLaXRUb29s
cy9EdW1wUmVuZGVyVHJlZS9jaHJvbWl1bS9DcHBWYXJpYW50LmNwcApuZXcgZmlsZSBtb2RlIDEw
MDY0NAppbmRleCAwMDAwMDAwLi41MmRhYjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViS2l0VG9v
bHMvRHVtcFJlbmRlclRyZWUvY2hyb21pdW0vQ3BwVmFyaWFudC5jcHAKQEAgLTAsMCArMSwzMDgg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBt
ZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUg
b2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkg
YmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0
aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgor
ICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJT
IEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElF
RCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFS
VElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09Q
WVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICog
REFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkNwcFZhcmlhbnQuaCIK
KworI2luY2x1ZGUgImJhc2Uvc3RyaW5nX3V0aWwuaCIKKyNpbmNsdWRlICJwdWJsaWMvV2ViQmlu
ZGluZ3MuaCIKKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8d3RmL0Fzc2VydGlvbnMuaD4K
KwordXNpbmcgbmFtZXNwYWNlIFdlYktpdDsKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK0NwcFZh
cmlhbnQ6OkNwcFZhcmlhbnQoKQoreworICAgIHR5cGUgPSBOUFZhcmlhbnRUeXBlX051bGw7Cit9
CisKKy8vIE5vdGUgdGhhdCBTZXQoKSBwZXJmb3JtcyBhIGRlZXAgY29weSwgd2hpY2ggaXMgbmVj
ZXNzYXJ5IHRvIHNhZmVseQorLy8gY2FsbCBGcmVlRGF0YSgpIG9uIHRoZSB2YWx1ZSBpbiB0aGUg
ZGVzdHJ1Y3Rvci4KK0NwcFZhcmlhbnQ6OkNwcFZhcmlhbnQoY29uc3QgQ3BwVmFyaWFudCYgb3Jp
Z2luYWwpCit7CisgICAgdHlwZSA9IE5QVmFyaWFudFR5cGVfTnVsbDsKKyAgICBzZXQob3JpZ2lu
YWwpOworfQorCisvLyBTZWUgY29tbWVudCBmb3IgY29weSBjb25zdHJ1Y3RvciwgYWJvdmUuCitD
cHBWYXJpYW50JiBDcHBWYXJpYW50OjpvcGVyYXRvcj0oY29uc3QgQ3BwVmFyaWFudCYgb3JpZ2lu
YWwpCit7CisgICAgaWYgKCZvcmlnaW5hbCAhPSB0aGlzKQorICAgICAgICBzZXQob3JpZ2luYWwp
OworICAgIHJldHVybiAqdGhpczsKK30KKworQ3BwVmFyaWFudDo6fkNwcFZhcmlhbnQoKQorewor
ICAgIGZyZWVEYXRhKCk7Cit9CisKK3ZvaWQgQ3BwVmFyaWFudDo6ZnJlZURhdGEoKQoreworICAg
IFdlYkJpbmRpbmdzOjpyZWxlYXNlVmFyaWFudFZhbHVlKHRoaXMpOworfQorCitib29sIENwcFZh
cmlhbnQ6OmlzRXF1YWwoY29uc3QgQ3BwVmFyaWFudCYgb3RoZXIpIGNvbnN0Cit7CisgICAgaWYg
KHR5cGUgIT0gb3RoZXIudHlwZSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgc3dpdGNo
ICh0eXBlKSB7CisgICAgY2FzZSBOUFZhcmlhbnRUeXBlX0Jvb2w6CisgICAgICAgIHJldHVybiAo
dmFsdWUuYm9vbFZhbHVlID09IG90aGVyLnZhbHVlLmJvb2xWYWx1ZSk7CisgICAgY2FzZSBOUFZh
cmlhbnRUeXBlX0ludDMyOgorICAgICAgICByZXR1cm4gKHZhbHVlLmludFZhbHVlID09IG90aGVy
LnZhbHVlLmludFZhbHVlKTsKKyAgICBjYXNlIE5QVmFyaWFudFR5cGVfRG91YmxlOgorICAgICAg
ICByZXR1cm4gKHZhbHVlLmRvdWJsZVZhbHVlID09IG90aGVyLnZhbHVlLmRvdWJsZVZhbHVlKTsK
KyAgICBjYXNlIE5QVmFyaWFudFR5cGVfU3RyaW5nOiB7CisgICAgICAgIGNvbnN0IE5QU3RyaW5n
ICp0aGlzX3ZhbHVlID0gJnZhbHVlLnN0cmluZ1ZhbHVlOworICAgICAgICBjb25zdCBOUFN0cmlu
ZyAqb3RoZXJfdmFsdWUgPSAmb3RoZXIudmFsdWUuc3RyaW5nVmFsdWU7CisgICAgICAgIHVpbnQz
Ml90IGxlbiA9IHRoaXNfdmFsdWUtPlVURjhMZW5ndGg7CisgICAgICAgIHJldHVybiBsZW4gPT0g
b3RoZXJfdmFsdWUtPlVURjhMZW5ndGgKKyAgICAgICAgICAgICYmICFzdHJuY21wKHRoaXNfdmFs
dWUtPlVURjhDaGFyYWN0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJfdmFsdWUt
PlVURjhDaGFyYWN0ZXJzLCBsZW4pOworICAgIH0KKyAgICBjYXNlIE5QVmFyaWFudFR5cGVfTnVs
bDoKKyAgICBjYXNlIE5QVmFyaWFudFR5cGVfVm9pZDoKKyAgICAgICAgcmV0dXJuIHRydWU7Cisg
ICAgY2FzZSBOUFZhcmlhbnRUeXBlX09iamVjdDogeworICAgICAgICBOUE9iamVjdCogdGhpc1Zh
bHVlID0gdmFsdWUub2JqZWN0VmFsdWU7CisgICAgICAgIE5QT2JqZWN0KiBvdGhlclZhbHVlID0g
b3RoZXIudmFsdWUub2JqZWN0VmFsdWU7CisgICAgICAgIHJldHVybiB0aGlzVmFsdWUtPl9jbGFz
cyA9PSBvdGhlclZhbHVlLT5fY2xhc3MKKyAgICAgICAgICAgICYmIHRoaXNWYWx1ZS0+cmVmZXJl
bmNlQ291bnQgPT0gb3RoZXJWYWx1ZS0+cmVmZXJlbmNlQ291bnQ7CisgICAgfQorICAgIH0KKyAg
ICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgQ3BwVmFyaWFudDo6Y29weVRvTlBWYXJpYW50KE5Q
VmFyaWFudCogcmVzdWx0KSBjb25zdAoreworICAgIHJlc3VsdC0+dHlwZSA9IHR5cGU7CisgICAg
c3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBOUFZhcmlhbnRUeXBlX0Jvb2w6CisgICAgICAgIHJl
c3VsdC0+dmFsdWUuYm9vbFZhbHVlID0gdmFsdWUuYm9vbFZhbHVlOworICAgICAgICBicmVhazsK
KyAgICBjYXNlIE5QVmFyaWFudFR5cGVfSW50MzI6CisgICAgICAgIHJlc3VsdC0+dmFsdWUuaW50
VmFsdWUgPSB2YWx1ZS5pbnRWYWx1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBOUFZhcmlh
bnRUeXBlX0RvdWJsZToKKyAgICAgICAgcmVzdWx0LT52YWx1ZS5kb3VibGVWYWx1ZSA9IHZhbHVl
LmRvdWJsZVZhbHVlOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE5QVmFyaWFudFR5cGVfU3Ry
aW5nOgorICAgICAgICBXZWJCaW5kaW5nczo6aW5pdGlhbGl6ZVZhcmlhbnRXaXRoU3RyaW5nQ29w
eShyZXN1bHQsICZ2YWx1ZS5zdHJpbmdWYWx1ZSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ug
TlBWYXJpYW50VHlwZV9OdWxsOgorICAgIGNhc2UgTlBWYXJpYW50VHlwZV9Wb2lkOgorICAgICAg
ICAvLyBOb3RoaW5nIHRvIHNldC4KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBOUFZhcmlhbnRU
eXBlX09iamVjdDoKKyAgICAgICAgcmVzdWx0LT50eXBlID0gTlBWYXJpYW50VHlwZV9PYmplY3Q7
CisgICAgICAgIHJlc3VsdC0+dmFsdWUub2JqZWN0VmFsdWUgPSBXZWJCaW5kaW5nczo6cmV0YWlu
T2JqZWN0KHZhbHVlLm9iamVjdFZhbHVlKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit2
b2lkIENwcFZhcmlhbnQ6OnNldChjb25zdCBOUFZhcmlhbnQmIG5ld1ZhbHVlKQoreworICAgIGZy
ZWVEYXRhKCk7CisgICAgc3dpdGNoIChuZXdWYWx1ZS50eXBlKSB7CisgICAgY2FzZSBOUFZhcmlh
bnRUeXBlX0Jvb2w6CisgICAgICAgIHNldChuZXdWYWx1ZS52YWx1ZS5ib29sVmFsdWUpOworICAg
ICAgICBicmVhazsKKyAgICBjYXNlIE5QVmFyaWFudFR5cGVfSW50MzI6CisgICAgICAgIHNldChu
ZXdWYWx1ZS52YWx1ZS5pbnRWYWx1ZSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTlBWYXJp
YW50VHlwZV9Eb3VibGU6CisgICAgICAgIHNldChuZXdWYWx1ZS52YWx1ZS5kb3VibGVWYWx1ZSk7
CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTlBWYXJpYW50VHlwZV9TdHJpbmc6CisgICAgICAg
IHNldChuZXdWYWx1ZS52YWx1ZS5zdHJpbmdWYWx1ZSk7CisgICAgICAgIGJyZWFrOworICAgIGNh
c2UgTlBWYXJpYW50VHlwZV9OdWxsOgorICAgIGNhc2UgTlBWYXJpYW50VHlwZV9Wb2lkOgorICAg
ICAgICB0eXBlID0gbmV3VmFsdWUudHlwZTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBOUFZh
cmlhbnRUeXBlX09iamVjdDoKKyAgICAgICAgc2V0KG5ld1ZhbHVlLnZhbHVlLm9iamVjdFZhbHVl
KTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit2b2lkIENwcFZhcmlhbnQ6OnNldE51bGwo
KQoreworICAgIGZyZWVEYXRhKCk7CisgICAgdHlwZSA9IE5QVmFyaWFudFR5cGVfTnVsbDsKK30K
Kwordm9pZCBDcHBWYXJpYW50OjpzZXQoYm9vbCBuZXdWYWx1ZSkKK3sKKyAgICBmcmVlRGF0YSgp
OworICAgIHR5cGUgPSBOUFZhcmlhbnRUeXBlX0Jvb2w7CisgICAgdmFsdWUuYm9vbFZhbHVlID0g
bmV3VmFsdWU7Cit9CisKK3ZvaWQgQ3BwVmFyaWFudDo6c2V0KGludDMyX3QgbmV3VmFsdWUpCit7
CisgICAgZnJlZURhdGEoKTsKKyAgICB0eXBlID0gTlBWYXJpYW50VHlwZV9JbnQzMjsKKyAgICB2
YWx1ZS5pbnRWYWx1ZSA9IG5ld1ZhbHVlOworfQorCit2b2lkIENwcFZhcmlhbnQ6OnNldChkb3Vi
bGUgbmV3VmFsdWUpCit7CisgICAgZnJlZURhdGEoKTsKKyAgICB0eXBlID0gTlBWYXJpYW50VHlw
ZV9Eb3VibGU7CisgICAgdmFsdWUuZG91YmxlVmFsdWUgPSBuZXdWYWx1ZTsKK30KKworLy8gVGhl
IG5ld1ZhbHVlIG11c3QgYmUgYSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nLgordm9pZCBDcHBWYXJp
YW50OjpzZXQoY29uc3QgY2hhciogbmV3VmFsdWUpCit7CisgICAgZnJlZURhdGEoKTsKKyAgICB0
eXBlID0gTlBWYXJpYW50VHlwZV9TdHJpbmc7CisgICAgTlBTdHJpbmcgbmV3U3RyaW5nID0ge25l
d1ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4o
c3RybGVuKG5ld1ZhbHVlKSl9OworICAgIFdlYkJpbmRpbmdzOjppbml0aWFsaXplVmFyaWFudFdp
dGhTdHJpbmdDb3B5KHRoaXMsICZuZXdTdHJpbmcpOworfQorCit2b2lkIENwcFZhcmlhbnQ6OnNl
dChjb25zdCBzdHJpbmcmIG5ld1ZhbHVlKQoreworICAgIGZyZWVEYXRhKCk7CisgICAgdHlwZSA9
IE5QVmFyaWFudFR5cGVfU3RyaW5nOworICAgIE5QU3RyaW5nIG5ld1N0cmluZyA9IHtuZXdWYWx1
ZS5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90
PihuZXdWYWx1ZS5zaXplKCkpfTsKKyAgICBXZWJCaW5kaW5nczo6aW5pdGlhbGl6ZVZhcmlhbnRX
aXRoU3RyaW5nQ29weSh0aGlzLCAmbmV3U3RyaW5nKTsKK30KKwordm9pZCBDcHBWYXJpYW50Ojpz
ZXQoY29uc3QgTlBTdHJpbmcmIG5ld1ZhbHVlKQoreworICAgIGZyZWVEYXRhKCk7CisgICAgdHlw
ZSA9IE5QVmFyaWFudFR5cGVfU3RyaW5nOworICAgIFdlYkJpbmRpbmdzOjppbml0aWFsaXplVmFy
aWFudFdpdGhTdHJpbmdDb3B5KHRoaXMsICZuZXdWYWx1ZSk7Cit9CisKK3ZvaWQgQ3BwVmFyaWFu
dDo6c2V0KE5QT2JqZWN0KiBuZXdWYWx1ZSkKK3sKKyAgICBmcmVlRGF0YSgpOworICAgIHR5cGUg
PSBOUFZhcmlhbnRUeXBlX09iamVjdDsKKyAgICB2YWx1ZS5vYmplY3RWYWx1ZSA9IFdlYkJpbmRp
bmdzOjpyZXRhaW5PYmplY3QobmV3VmFsdWUpOworfQorCitzdHJpbmcgQ3BwVmFyaWFudDo6dG9T
dHJpbmcoKSBjb25zdAoreworICAgIEFTU0VSVChpc1N0cmluZygpKTsKKyAgICByZXR1cm4gc3Ry
aW5nKHZhbHVlLnN0cmluZ1ZhbHVlLlVURjhDaGFyYWN0ZXJzLAorICAgICAgICAgICAgICAgICAg
dmFsdWUuc3RyaW5nVmFsdWUuVVRGOExlbmd0aCk7Cit9CisKK2ludDMyX3QgQ3BwVmFyaWFudDo6
dG9JbnQzMigpIGNvbnN0Cit7CisgICAgaWYgKGlzSW50MzIoKSkKKyAgICAgICAgcmV0dXJuIHZh
bHVlLmludFZhbHVlOworICAgIGlmIChpc0RvdWJsZSgpKQorICAgICAgICByZXR1cm4gc3RhdGlj
X2Nhc3Q8aW50MzJfdD4odmFsdWUuZG91YmxlVmFsdWUpOworICAgIEFTU0VSVF9OT1RfUkVBQ0hF
RCgpOworICAgIHJldHVybiAwOworfQorCitkb3VibGUgQ3BwVmFyaWFudDo6dG9Eb3VibGUoKSBj
b25zdAoreworICAgIGlmIChpc0ludDMyKCkpCisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxk
b3VibGU+KHZhbHVlLmludFZhbHVlKTsKKyAgICBpZiAoaXNEb3VibGUoKSkKKyAgICAgICAgcmV0
dXJuIHZhbHVlLmRvdWJsZVZhbHVlOworICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIHJl
dHVybiAwOworfQorCitib29sIENwcFZhcmlhbnQ6OnRvQm9vbGVhbigpIGNvbnN0Cit7CisgICAg
QVNTRVJUKGlzQm9vbCgpKTsKKyAgICByZXR1cm4gdmFsdWUuYm9vbFZhbHVlOworfQorCitWZWN0
b3I8c3RyaW5nPiBDcHBWYXJpYW50Ojp0b1N0cmluZ1ZlY3RvcigpIGNvbnN0Cit7CisKKyAgICBB
U1NFUlQoaXNPYmplY3QoKSk7CisgICAgVmVjdG9yPHN0cmluZz4gc3RyaW5nVmVjdG9yOworICAg
IE5QT2JqZWN0KiBucFZhbHVlID0gdmFsdWUub2JqZWN0VmFsdWU7CisgICAgTlBJZGVudGlmaWVy
IGxlbmd0aElkID0gV2ViQmluZGluZ3M6OmdldFN0cmluZ0lkZW50aWZpZXIoImxlbmd0aCIpOwor
CisgICAgaWYgKCFXZWJCaW5kaW5nczo6aGFzUHJvcGVydHkoMCwgbnBWYWx1ZSwgbGVuZ3RoSWQp
KQorICAgICAgICByZXR1cm4gc3RyaW5nVmVjdG9yOworCisgICAgTlBWYXJpYW50IGxlbmd0aFZh
bHVlOworICAgIGlmICghV2ViQmluZGluZ3M6OmdldFByb3BlcnR5KDAsIG5wVmFsdWUsIGxlbmd0
aElkLCAmbGVuZ3RoVmFsdWUpKQorICAgICAgICByZXR1cm4gc3RyaW5nVmVjdG9yOworCisgICAg
aW50IGxlbmd0aCA9IDA7CisgICAgLy8gVGhlIGxlbmd0aCBpcyBhIGRvdWJsZSBpbiBzb21lIGNh
c2VzLgorICAgIGlmIChOUFZBUklBTlRfSVNfRE9VQkxFKGxlbmd0aFZhbHVlKSkKKyAgICAgICAg
bGVuZ3RoID0gc3RhdGljX2Nhc3Q8aW50PihOUFZBUklBTlRfVE9fRE9VQkxFKGxlbmd0aFZhbHVl
KSk7CisgICAgZWxzZSBpZiAoTlBWQVJJQU5UX0lTX0lOVDMyKGxlbmd0aFZhbHVlKSkKKyAgICAg
ICAgbGVuZ3RoID0gTlBWQVJJQU5UX1RPX0lOVDMyKGxlbmd0aFZhbHVlKTsKKyAgICBXZWJCaW5k
aW5nczo6cmVsZWFzZVZhcmlhbnRWYWx1ZSgmbGVuZ3RoVmFsdWUpOworCisgICAgLy8gRm9yIHNh
bml0eSwgb25seSBhbGxvdyAxMDAgaXRlbXMuCisgICAgbGVuZ3RoID0gbWluKDEwMCwgbGVuZ3Ro
KTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CisgICAgICAgIC8vIEdl
dCBlYWNoIG9mIHRoZSBpdGVtcy4KKyAgICAgICAgc3RyaW5nIGluZGV4ID0gU3RyaW5nUHJpbnRm
KCIlZCIsIGkpOworICAgICAgICBOUElkZW50aWZpZXIgaW5kZXhJZCA9IFdlYkJpbmRpbmdzOjpn
ZXRTdHJpbmdJZGVudGlmaWVyKGluZGV4LmNfc3RyKCkpOworICAgICAgICBpZiAoIVdlYkJpbmRp
bmdzOjpoYXNQcm9wZXJ0eSgwLCBucFZhbHVlLCBpbmRleElkKSkKKyAgICAgICAgICAgIGNvbnRp
bnVlOworICAgICAgICBOUFZhcmlhbnQgaW5kZXhWYWx1ZTsKKyAgICAgICAgaWYgKCFXZWJCaW5k
aW5nczo6Z2V0UHJvcGVydHkoMCwgbnBWYWx1ZSwgaW5kZXhJZCwgJmluZGV4VmFsdWUpKQorICAg
ICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmIChOUFZBUklBTlRfSVNfU1RSSU5HKGluZGV4
VmFsdWUpKSB7CisgICAgICAgICAgICBzdHJpbmcgaXRlbShOUFZBUklBTlRfVE9fU1RSSU5HKGlu
ZGV4VmFsdWUpLlVURjhDaGFyYWN0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgTlBWQVJJ
QU5UX1RPX1NUUklORyhpbmRleFZhbHVlKS5VVEY4TGVuZ3RoKTsKKyAgICAgICAgICAgIHN0cmlu
Z1ZlY3Rvci5hcHBlbmQoaXRlbSk7CisgICAgICAgIH0KKyAgICAgICAgV2ViQmluZGluZ3M6OnJl
bGVhc2VWYXJpYW50VmFsdWUoJmluZGV4VmFsdWUpOworICAgIH0KKyAgICByZXR1cm4gc3RyaW5n
VmVjdG9yOworfQorCitib29sIENwcFZhcmlhbnQ6Omludm9rZShjb25zdCBzdHJpbmcmIG1ldGhv
ZCwgY29uc3QgQ3BwVmFyaWFudCogYXJndW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAg
dWludDMyX3QgYXJndW1lbnRDb3VudCwgQ3BwVmFyaWFudCYgcmVzdWx0KSBjb25zdAoreworICAg
IEFTU0VSVChpc09iamVjdCgpKTsKKyAgICBOUElkZW50aWZpZXIgbWV0aG9kTmFtZSA9IFdlYkJp
bmRpbmdzOjpnZXRTdHJpbmdJZGVudGlmaWVyKG1ldGhvZC5jX3N0cigpKTsKKyAgICBOUE9iamVj
dCogbnBPYmplY3QgPSB2YWx1ZS5vYmplY3RWYWx1ZTsKKyAgICBpZiAoIVdlYkJpbmRpbmdzOjpo
YXNNZXRob2QoMCwgbnBPYmplY3QsIG1ldGhvZE5hbWUpKQorICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgTlBWYXJpYW50IHI7CisgICAgYm9vbCBzdGF0dXMgPSBXZWJCaW5kaW5nczo6aW52b2tl
KDAsIG5wT2JqZWN0LCBtZXRob2ROYW1lLCBhcmd1bWVudHMsIGFyZ3VtZW50Q291bnQsICZyKTsK
KyAgICByZXN1bHQuc2V0KHIpOworICAgIHJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9X
ZWJLaXRUb29scy9EdW1wUmVuZGVyVHJlZS9jaHJvbWl1bS9DcHBWYXJpYW50LmggYi9XZWJLaXRU
b29scy9EdW1wUmVuZGVyVHJlZS9jaHJvbWl1bS9DcHBWYXJpYW50LmgKbmV3IGZpbGUgbW9kZSAx
MDA2NDQKaW5kZXggMDAwMDAwMC4uYzVkMDkwYQotLS0gL2Rldi9udWxsCisrKyBiL1dlYktpdFRv
b2xzL0R1bXBSZW5kZXJUcmVlL2Nocm9taXVtL0NwcFZhcmlhbnQuaApAQCAtMCwwICsxLDEzMyBA
QAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1l
dDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
cgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBv
ZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBi
ZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRo
aXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisg
KgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMg
QU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJU
SUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZ
UklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VS
RU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBE
QVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4KKyAqLworCisvKgorICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIGZvciBD
cHBWYXJpYW50LCBhIHR5cGUgdXNlZCBieSBDKysgY2xhc3NlcworICB0aGF0IGFyZSB0byBiZSBi
b3VuZCB0byBKYXZhU2NyaXB0IG9iamVjdHMuCisKKyAgQ3BwVmFyaWFudCBleGlzdHMgcHJpbWFy
aWx5IGFzIGFuIGludGVyZmFjZSBiZXR3ZWVuIEMrKyBjYWxsZXJzIGFuZCB0aGUKKyAgY29ycmVz
cG9uZGluZyBOUFZhcmlhbnQgdHlwZS4gIENwcFZhcmlhbnQgYWxzbyBwcm92aWRlcyBhIG51bWJl
ciBvZgorICBjb252ZW5pZW5jZSBjb25zdHJ1Y3RvcnMgYW5kIGFjY2Vzc29ycywgc28gdGhhdCB0
aGUgTlBWYXJpYW50VHlwZSB2YWx1ZXMKKyAgZG9uJ3QgbmVlZCB0byBiZSBleHBvc2VkLCBhbmQg
YSBkZXN0cnVjdG9yIHRvIGZyZWUgYW55IG1lbW9yeSBhbGxvY2F0ZWQgZm9yCisgIHN0cmluZyB2
YWx1ZXMuCisqLworCisjaWZuZGVmIENwcFZhcmlhbnRfaAorI2RlZmluZSBDcHBWYXJpYW50X2gK
KworI2luY2x1ZGUgImJhc2UvYmFzaWN0eXBlcy5oIgorI2luY2x1ZGUgInB1YmxpYy9XZWJCaW5k
aW5ncy5oIgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+CisKK2Ns
YXNzIENwcFZhcmlhbnQgOiBwdWJsaWMgTlBWYXJpYW50IHsKK3B1YmxpYzoKKyAgICBDcHBWYXJp
YW50KCk7CisgICAgfkNwcFZhcmlhbnQoKTsKKyAgICB2b2lkIHNldE51bGwoKTsKKyAgICB2b2lk
IHNldChib29sKTsKKyAgICB2b2lkIHNldChpbnQzMl90KTsKKyAgICB2b2lkIHNldChkb3VibGUp
OworCisgICAgLy8gTm90ZSB0aGF0IHNldHRpbmcgYSBDcHBWYXJpYW50IHRvIGEgc3RyaW5nIHZh
bHVlIGludm9sdmVzIGNvcHlpbmcgdGhlCisgICAgLy8gc3RyaW5nIGRhdGEsIHdoaWNoIG11c3Qg
YmUgZnJlZWQgd2l0aCBhIGNhbGwgdG8gZnJlZURhdGEoKSB3aGVuIHRoZQorICAgIC8vIENwcFZh
cmlhbnQgaXMgc2V0IHRvIGEgZGlmZmVyZW50IHZhbHVlIG9yIGlzIG5vIGxvbmdlciBuZWVkZWQu
ICBOb3JtYWxseQorICAgIC8vIHRoaXMgaXMgaGFuZGxlZCBieSB0aGUgb3RoZXIgc2V0KCkgbWV0
aG9kcyBhbmQgYnkgdGhlIGRlc3RydWN0b3IuCisgICAgdm9pZCBzZXQoY29uc3QgY2hhciopOyAv
LyBNdXN0IGJlIGEgbnVsbC10ZXJtaW5hdGVkIHN0cmluZy4KKyAgICB2b2lkIHNldChjb25zdCBz
dGQ6OnN0cmluZyYpOworICAgIHZvaWQgc2V0KGNvbnN0IE5QU3RyaW5nJik7CisgICAgdm9pZCBz
ZXQoY29uc3QgTlBWYXJpYW50Jik7CisKKyAgICAvLyBOb3RlIHRoYXQgc2V0dGluZyBhIENwcFZh
cmlhbnQgdG8gYW4gTlBPYmplY3QgaW52b2x2ZXMgcmVmLWNvdW50aW5nCisgICAgLy8gdGhlIGFj
dHVhbCBvYmplY3QuIGZyZWVEYXRhKCkgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGlmIHRoZSBDcHBW
YXJpYW50CisgICAgLy8gaXMgbm8gbG9uZ2VyIG5lZWRlZC4gVGhlIG90aGVyIHNldCgpIG1ldGhv
ZHMgaGFuZGxlIHRoaXMgaW50ZXJuYWxseS4KKyAgICAvLyBBbHNvLCB0aGUgb2JqZWN0J3MgTlBD
bGFzcyBpcyBleHBlY3RlZCB0byBiZSBhIHN0YXRpYyBvYmplY3Q6IG5laXRoZXIKKyAgICAvLyB0
aGUgTlAgcnVudGltZSBub3IgQ3BwVmFyaWFudCB3aWxsIGV2ZXIgZnJlZSBpdC4KKyAgICB2b2lk
IHNldChOUE9iamVjdCpfdmFsdWUpOworCisgICAgLy8gVGhlc2UgdGhyZWUgbWV0aG9kcyBhbGwg
cGVyZm9ybSBkZWVwIGNvcGllcyBvZiBhbnkgc3RyaW5nIGRhdGEuICBUaGlzCisgICAgLy8gYWxs
b3dzIGxvY2FsIENwcFZhcmlhbnRzIHRvIGJlIHJlbGVhc2VkIGJ5IHRoZSBkZXN0cnVjdG9yIHdp
dGhvdXQKKyAgICAvLyBjb3JydXB0aW5nIHRoZWlyIHNvdXJjZXMuIEluIHBlcmZvcm1hbmNlLWNy
aXRpY2FsIGNvZGUsIG9yIHdoZW4gc3RyaW5ncworICAgIC8vIGFyZSB2ZXJ5IGxvbmcsIGF2b2lk
IGNyZWF0aW5nIG5ldyBDcHBWYXJpYW50cy4KKyAgICAvLyBJbiBjYXNlIG9mIE5QT2JqZWN0IGFz
IHRoZSBkYXRhLCB0aGUgY29weWluZyBpbnZvbHZlcyByZWYtY291bnRpbmcKKyAgICAvLyBhcyBv
cHBvc2VkIHRvIGRlZXAtY29weWluZy4gVGhlIHJlZi1jb3VudGluZyBlbnN1cmVzIHRoYXQgc291
cmNlcyBkb24ndAorICAgIC8vIGdldCBjb3JydXB0ZWQgd2hlbiB0aGUgY29waWVzIGdldCBkZXN0
cm95ZWQuCisgICAgdm9pZCBjb3B5VG9OUFZhcmlhbnQoTlBWYXJpYW50KiByZXN1bHQpIGNvbnN0
OworICAgIENwcFZhcmlhbnQmIG9wZXJhdG9yPShjb25zdCBDcHBWYXJpYW50JiBvcmlnaW5hbCk7
CisgICAgQ3BwVmFyaWFudChjb25zdCBDcHBWYXJpYW50JiBvcmlnaW5hbCk7CisKKyAgICAvLyBD
YWxscyBOUE5fUmVsZWFzZVZhcmlhbnRWYWx1ZSwgd2hpY2ggZnJlZXMgYW55IHN0cmluZyBkYXRh
CisgICAgLy8gaGVsZCBieSB0aGUgb2JqZWN0IGFuZCBzZXRzIGl0cyB0eXBlIHRvIG51bGwuCisg
ICAgLy8gSW4gY2FzZSBvZiBOUE9iamVjdCwgdGhlIE5QTl9SZWxlYXNlVmFyaWFudFZhbHVlIGRl
Y3JlbWVudHMKKyAgICAvLyB0aGUgcmVmLWNvdW50IChyZWxlYXNlcyB3aGVuIHJlZi1jb3VudCBi
ZWNvbWVzIDApCisgICAgdm9pZCBmcmVlRGF0YSgpOworCisgICAgLy8gQ29tcGFyZXMgdGhpcyBD
cHBWYXJpYW50J3MgdHlwZSBhbmQgdmFsdWUgdG8gYW5vdGhlcidzLiAgVGhleSBtdXN0IGJlCisg
ICAgLy8gaWRlbnRpY2FsIGluIGJvdGggdHlwZSBhbmQgdmFsdWUgdG8gYmUgY29uc2lkZXJlZCBl
cXVhbC4gIEZvciBzdHJpbmcgYW5kCisgICAgLy8gb2JqZWN0IHR5cGVzLCBhIGRlZXAgY29tcGFy
aXNvbiBpcyBwZXJmb3JtZWQ7IHRoYXQgaXMsIHRoZSBjb250ZW50cyBvZiB0aGUKKyAgICAvLyBz
dHJpbmdzLCBvciB0aGUgY2xhc3NlcyBhbmQgcmVmY291bnRzIG9mIHRoZSBvYmplY3RzLCBtdXN0
IGJlIHRoZSBzYW1lLAorICAgIC8vIGJ1dCB0aGV5IG5lZWQgbm90IGJlIHRoZSBzYW1lIHBvaW50
ZXJzLgorICAgIGJvb2wgaXNFcXVhbChjb25zdCBDcHBWYXJpYW50JikgY29uc3Q7CisKKyAgICAv
LyBUaGUgdmFsdWUgb2YgYSBDcHBWYXJpYW50IG1heSBiZSByZWFkIGRpcmVjdGx5IGZyb20gaXRz
IE5QVmFyaWFudCAoYnV0CisgICAgLy8gc2hvdWxkIG9ubHkgYmUgc2V0IHVzaW5nIG9uZSBvZiB0
aGUgc2V0KCkgbWV0aG9kcyBhYm92ZSkuIEFsdGhvdWdoIHRoZQorICAgIC8vIHR5cGUgb2YgYSBD
cHBWYXJpYW50IGlzIGxpa2V3aXNlIHB1YmxpYywgaXQgY2FuIGJlIGFjY2Vzc2VkIHRocm91Z2gg
dGhlc2UKKyAgICAvLyBmdW5jdGlvbnMgcmF0aGVyIHRoYW4gZGlyZWN0bHkgaWYgYSBjYWxsZXIg
d2lzaGVzIHRvIGF2b2lkIGRlcGVuZGVuY2Ugb24KKyAgICAvLyB0aGUgTlBWYXJpYW50VHlwZSB2
YWx1ZXMuCisgICAgYm9vbCBpc0Jvb2woKSBjb25zdCB7IHJldHVybiAodHlwZSA9PSBOUFZhcmlh
bnRUeXBlX0Jvb2wpOyB9CisgICAgYm9vbCBpc0ludDMyKCkgY29uc3QgeyByZXR1cm4gKHR5cGUg
PT0gTlBWYXJpYW50VHlwZV9JbnQzMik7IH0KKyAgICBib29sIGlzRG91YmxlKCkgY29uc3QgeyBy
ZXR1cm4gKHR5cGUgPT0gTlBWYXJpYW50VHlwZV9Eb3VibGUpOyB9CisgICAgYm9vbCBpc051bWJl
cigpIGNvbnN0IHsgcmV0dXJuIChpc0ludDMyKCkgfHwgaXNEb3VibGUoKSk7IH0KKyAgICBib29s
IGlzU3RyaW5nKCkgY29uc3QgeyByZXR1cm4gKHR5cGUgPT0gTlBWYXJpYW50VHlwZV9TdHJpbmcp
OyB9CisgICAgYm9vbCBpc1ZvaWQoKSBjb25zdCB7IHJldHVybiAodHlwZSA9PSBOUFZhcmlhbnRU
eXBlX1ZvaWQpOyB9CisgICAgYm9vbCBpc051bGwoKSBjb25zdCB7IHJldHVybiAodHlwZSA9PSBO
UFZhcmlhbnRUeXBlX051bGwpOyB9CisgICAgYm9vbCBpc0VtcHR5KCkgY29uc3QgeyByZXR1cm4g
KGlzVm9pZCgpIHx8IGlzTnVsbCgpKTsgfQorICAgIGJvb2wgaXNPYmplY3QoKSBjb25zdCB7IHJl
dHVybiAodHlwZSA9PSBOUFZhcmlhbnRUeXBlX09iamVjdCk7IH0KKworICAgIC8vIENvbnZlcnRl
cnMuICBUaGUgQ3BwVmFyaWFudCBtdXN0IGJlIG9mIGEgdHlwZSBjb252ZXJ0aWJsZSB0byB0aGVz
ZSB2YWx1ZXMuCisgICAgLy8gRm9yIGV4YW1wbGUsIHRvSW50MzIoKSB3b3JrcyBvbmx5IGlmIGlz
TnVtYmVyKCkgaXMgdHJ1ZS4KKyAgICBzdGQ6OnN0cmluZyB0b1N0cmluZygpIGNvbnN0OworICAg
IGludDMyX3QgdG9JbnQzMigpIGNvbnN0OworICAgIGRvdWJsZSB0b0RvdWJsZSgpIGNvbnN0Owor
ICAgIGJvb2wgdG9Cb29sZWFuKCkgY29uc3Q7CisgICAgLy8gUmV0dXJucyBhIHZlY3RvciBvZiBz
dHJpbmdzIGZvciB0aGUgc3BlY2lmaWVkIGFyZ3VtZW50LiBUaGlzIGlzIHVzZWZ1bAorICAgIC8v
IGZvciBjb252ZXJ0aW5nIGEgSmF2YVNjcmlwdCBhcnJheSBvZiBzdHJpbmdzIGludG8gYSB2ZWN0
b3Igb2Ygc3RyaW5ncy4KKyAgICBWZWN0b3I8c3RkOjpzdHJpbmc+IHRvU3RyaW5nVmVjdG9yKCkg
Y29uc3Q7CisKKyAgICAvLyBJbnZva2UgbWV0aG9kIG9mIHRoZSBnaXZlbiBuYW1lIG9uIGFuIG9i
amVjdCB3aXRoIHRoZSBzdXBwbGllZCBhcmd1bWVudHMuCisgICAgLy8gVGhlIGZpcnN0IGFyZ3Vt
ZW50IHNob3VsZCBiZSB0aGUgb2JqZWN0IG9uIHdoaWNoIHRoZSBtZXRob2QgaXMgdG8gYmUKKyAg
ICAvLyBpbnZva2VkLiAgUmV0dXJucyB3aGV0aGVyIHRoZSBtZXRob2Qgd2FzIHN1Y2Nlc3NmdWxs
eSBpbnZva2VkLiAgSWYgdGhlCisgICAgLy8gbWV0aG9kIHdhcyBpbnZva2VkIHN1Y2Nlc3NmdWxs
eSwgYW55IHJldHVybiB2YWx1ZSBpcyBzdG9yZWQgaW4gdGhlCisgICAgLy8gQ3BwVmFyaWFudCBz
cGVjaWZpZWQgYnkgcmVzdWx0LgorICAgIGJvb2wgaW52b2tlKGNvbnN0IHN0ZDo6c3RyaW5nJiwg
Y29uc3QgQ3BwVmFyaWFudCogYXJndW1lbnRzLAorICAgICAgICAgICAgICAgIHVpbnQzMl90IGFy
Z3VtZW50Q291bnQsIENwcFZhcmlhbnQmIHJlc3VsdCkgY29uc3Q7Cit9OworCisjZW5kaWYgLy8g
Q3BwVmFyaWFudF9oCg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>50064</attachid>
            <date>2010-03-04 16:33:11 -0800</date>
            <delta_ts>2010-03-04 16:36:18 -0800</delta_ts>
            <desc>Proposed patch rev.3 (Copyright header change)</desc>
            <filename>bug-35634-20100305093309.patch</filename>
            <type>text/plain</type>
            <size>40406</size>
            <attacher name="Kent Tamura">tkent</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL0NoYW5nZUxvZyBiL1dlYktpdFRvb2xzL0NoYW5nZUxv
ZwppbmRleCAyMzU3NzBhLi4zZDMwNWU3IDEwMDY0NAotLS0gYS9XZWJLaXRUb29scy9DaGFuZ2VM
b2cKKysrIGIvV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjEgQEAKKzIwMTAtMDMt
MDMgIEtlbnQgVGFtdXJhICA8dGtlbnRAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFJldmlld2Vk
IGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFtEUlQvQ2hyb21pdW1dIEFkZCBDcHBWYXJp
YW50IGFuZCBDcHBCb3VuZENsYXNzCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3No
b3dfYnVnLmNnaT9pZD0zNTYzNAorCisgICAgICAgIEFkZCBDcHBWYXJpYW50IGFuZCBDcHBCb3Vu
ZENsYXNzIGNsYXNzZXMsIHdoaWNoIGFyZSBnb2luZyB0byBiZQorICAgICAgICB1c2VkIGJ5IER1
bXBSZW5kZXJUcmVlIENocm9taXVtIHBvcnQuIFRoZXNlIGZpbGVzIGFyZSBiYXNlZCBvbjoKKyAg
ICAgICAgLSBzcmMvd2Via2l0L2dsdWUvY3BwX3ZhcmlhbnQue2NjLGh9IGFuZAorICAgICAgICAt
IHNyYy93ZWJraXQvZ2x1ZS9jcHBfYm91bmRfY2xhc3Mue2NjLGh9CisgICAgICAgIG9mIENocm9t
aXVtIHJldi40MDQ5Mi4KKworICAgICAgICAqIER1bXBSZW5kZXJUcmVlL2Nocm9taXVtL0NwcEJv
dW5kQ2xhc3MuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBEdW1wUmVuZGVyVHJlZS9jaHJvbWl1bS9D
cHBCb3VuZENsYXNzLmg6IEFkZGVkLgorICAgICAgICAqIER1bXBSZW5kZXJUcmVlL2Nocm9taXVt
L0NwcFZhcmlhbnQuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBEdW1wUmVuZGVyVHJlZS9jaHJvbWl1
bS9DcHBWYXJpYW50Lmg6IEFkZGVkLgorCiAyMDEwLTAzLTAyICBBcm5vIFJlbmV2aWVyICA8YXJu
b0ByZW5ldmllci5uZXQ+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgR3VzdGF2byBOb3JvbmhhIFNp
bHZhLgpkaWZmIC0tZ2l0IGEvV2ViS2l0VG9vbHMvRHVtcFJlbmRlclRyZWUvY2hyb21pdW0vQ3Bw
Qm91bmRDbGFzcy5jcHAgYi9XZWJLaXRUb29scy9EdW1wUmVuZGVyVHJlZS9jaHJvbWl1bS9DcHBC
b3VuZENsYXNzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Mzk3ODdh
Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViS2l0VG9vbHMvRHVtcFJlbmRlclRyZWUvY2hyb21pdW0v
Q3BwQm91bmRDbGFzcy5jcHAKQEAgLTAsMCArMSwzNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykg
MjAwOSBQYXdlbCBIYWpkYW4gKHBoYWpkYW4uanJAY2hyb21pdW0ub3JnKQorICoKKyAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24u
CisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMg
b2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3Rl
IHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmlj
IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMi
IEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1F
RC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVU
T1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBT
UEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBC
VVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAor
ICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKy8vIFRoaXMgZmlsZSBjb250
YWlucyBkZWZpbml0aW9ucyBmb3IgQ3BwQm91bmRDbGFzcworCisvLyBIZXJlJ3MgdGhlIGNvbnRy
b2wgZmxvdyBvZiBhIEpTIG1ldGhvZCBnZXR0aW5nIGZvcndhcmRlZCB0byBhIGNsYXNzLgorLy8g
LSBTb21ldGhpbmcgY2FsbHMgb3VyIE5QT2JqZWN0IHdpdGggYSBmdW5jdGlvbiBsaWtlICJJbnZv
a2UiLgorLy8gLSBDcHBOUE9iamVjdCdzIHN0YXRpYyBpbnZva2UoKSBmdW5jdGlvbiBmb3J3YXJk
cyBpdCB0byBpdHMgYXR0YWNoZWQKKy8vICAgQ3BwQm91bmRDbGFzcydzIGludm9rZSgpIG1ldGhv
ZC4KKy8vIC0gQ3BwQm91bmRDbGFzcyBoYXMgdGhlbiBvdmVycmlkZGVuIGludm9rZSgpIHRvIGxv
b2sgdXAgdGhlIGZ1bmN0aW9uCisvLyAgIG5hbWUgaW4gaXRzIGludGVybmFsIG1hcCBvZiBtZXRo
b2RzLCBhbmQgdGhlbiBjYWxscyB0aGUgYXBwcm9wcmlhdGUKKy8vICAgbWV0aG9kLgorCisjaW5j
bHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQ3BwQm91bmRDbGFzcy5oIgorCisjaW5jbHVkZSAi
cHVibGljL1dlYkJpbmRpbmdzLmgiCisjaW5jbHVkZSAicHVibGljL1dlYkZyYW1lLmgiCisjaW5j
bHVkZSAicHVibGljL1dlYlN0cmluZy5oIgorI2luY2x1ZGUgPHd0Zi9Bc3NlcnRpb25zLmg+Cisj
aW5jbHVkZSA8d3RmL093blB0ci5oPgorCit1c2luZyBuYW1lc3BhY2UgV2ViS2l0OwordXNpbmcg
bmFtZXNwYWNlIHN0ZDsKKworY2xhc3MgQ3BwVmFyaWFudFByb3BlcnR5Q2FsbGJhY2sgOiBwdWJs
aWMgQ3BwQm91bmRDbGFzczo6UHJvcGVydHlDYWxsYmFjayB7CitwdWJsaWM6CisgICAgQ3BwVmFy
aWFudFByb3BlcnR5Q2FsbGJhY2soQ3BwVmFyaWFudCogdmFsdWUpIDogbV92YWx1ZSh2YWx1ZSkg
eyB9CisKKyAgICB2aXJ0dWFsIGJvb2wgZ2V0VmFsdWUoQ3BwVmFyaWFudCogdmFsdWUpCisgICAg
eworICAgICAgICB2YWx1ZS0+c2V0KCptX3ZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7Cisg
ICAgfQorCisgICAgdmlydHVhbCBib29sIHNldFZhbHVlKGNvbnN0IENwcFZhcmlhbnQmIHZhbHVl
KQorICAgIHsKKyAgICAgICAgbV92YWx1ZS0+c2V0KHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHRy
dWU7CisgICAgfQorCitwcml2YXRlOgorICAgIENwcFZhcmlhbnQqIG1fdmFsdWU7Cit9OworCitj
bGFzcyBHZXR0ZXJQcm9wZXJ0eUNhbGxiYWNrIDogcHVibGljIENwcEJvdW5kQ2xhc3M6OlByb3Bl
cnR5Q2FsbGJhY2sgeworcHVibGljOgorICAgIEdldHRlclByb3BlcnR5Q2FsbGJhY2soQ3BwQm91
bmRDbGFzczo6R2V0dGVyQ2FsbGJhY2sqIGNhbGxiYWNrKQorICAgICAgICA6IG1fY2FsbGJhY2so
Y2FsbGJhY2spIHsgfQorCisgICAgdmlydHVhbCBib29sIGdldFZhbHVlKENwcFZhcmlhbnQqIHZh
bHVlKQorICAgIHsKKyAgICAgICAgbV9jYWxsYmFjay0+cnVuKHZhbHVlKTsKKyAgICAgICAgcmV0
dXJuIHRydWU7CisgICAgfQorCisgICAgdmlydHVhbCBib29sIHNldFZhbHVlKGNvbnN0IENwcFZh
cmlhbnQmIHZhbHVlKSB7IHJldHVybiBmYWxzZTsgfQorCitwcml2YXRlOgorICAgIE93blB0cjxD
cHBCb3VuZENsYXNzOjpHZXR0ZXJDYWxsYmFjaz4gbV9jYWxsYmFjazsKK307CisKKy8vIE91ciBz
cGVjaWFsIE5QT2JqZWN0IHR5cGUuICBXZSBleHRlbmQgYW4gTlBPYmplY3Qgd2l0aCBhIHBvaW50
ZXIgdG8gYQorLy8gQ3BwQm91bmRDbGFzcywgd2hpY2ggaXMganVzdCBhIEMrKyBpbnRlcmZhY2Ug
dGhhdCB3ZSBmb3J3YXJkIGFsbCBOUE9iamVjdAorLy8gY2FsbGJhY2tzIHRvLgorc3RydWN0IENw
cE5QT2JqZWN0IHsKKyAgICBOUE9iamVjdCBwYXJlbnQ7IC8vIFRoaXMgbXVzdCBiZSB0aGUgZmly
c3QgZmllbGQgaW4gdGhlIHN0cnVjdC4KKyAgICBDcHBCb3VuZENsYXNzKiBib3VuZENsYXNzOwor
CisgICAgLy8KKyAgICAvLyBBbGwgZm9sbG93aW5nIG9iamVjdHMgYW5kIGZ1bmN0aW9ucyBhcmUg
c3RhdGljLCBhbmQganVzdCB1c2VkIHRvIGludGVyZmFjZQorICAgIC8vIHdpdGggTlBPYmplY3Qv
TlBDbGFzcy4KKyAgICAvLworCisgICAgLy8gQW4gTlBDbGFzcyBhc3NvY2lhdGVzIHN0YXRpYyBm
dW5jdGlvbnMgb2YgQ3BwTlBPYmplY3Qgd2l0aCB0aGUKKyAgICAvLyBmdW5jdGlvbiBwb2ludGVy
cyB1c2VkIGJ5IHRoZSBKUyBydW50aW1lLgorICAgIHN0YXRpYyBOUENsYXNzIG5wQ2xhc3M7CisK
KyAgICAvLyBBbGxvY2F0ZSBhIG5ldyBOUE9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgY2xhc3Mu
CisgICAgc3RhdGljIE5QT2JqZWN0KiBhbGxvY2F0ZShOUFAsIE5QQ2xhc3MqKTsKKworICAgIC8v
IEZyZWUgYW4gb2JqZWN0LgorICAgIHN0YXRpYyB2b2lkIGRlYWxsb2NhdGUoTlBPYmplY3QqKTsK
KworICAgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgQysrIGNsYXNzIGFzc29jaWF0ZWQgd2l0aCB0
aGlzIE5QT2JqZWN0IGV4cG9zZXMgdGhlCisgICAgLy8gZ2l2ZW4gcHJvcGVydHkuICBDYWxsZWQg
YnkgdGhlIEpTIHJ1bnRpbWUuCisgICAgc3RhdGljIGJvb2wgaGFzUHJvcGVydHkoTlBPYmplY3Qq
LCBOUElkZW50aWZpZXIpOworCisgICAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBDKysgY2xhc3Mg
YXNzb2NpYXRlZCB3aXRoIHRoaXMgTlBPYmplY3QgZXhwb3NlcyB0aGUKKyAgICAvLyBnaXZlbiBt
ZXRob2QuICBDYWxsZWQgYnkgdGhlIEpTIHJ1bnRpbWUuCisgICAgc3RhdGljIGJvb2wgaGFzTWV0
aG9kKE5QT2JqZWN0KiwgTlBJZGVudGlmaWVyKTsKKworICAgIC8vIElmIHRoZSBnaXZlbiBtZXRo
b2QgaXMgZXhwb3NlZCBieSB0aGUgQysrIGNsYXNzIGFzc29jaWF0ZWQgd2l0aCB0aGlzCisgICAg
Ly8gTlBPYmplY3QsIGludm9rZXMgaXQgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzIGFuZCByZXR1
cm5zIGEgcmVzdWx0LiAgT3RoZXJ3aXNlLAorICAgIC8vIHJldHVybnMgInVuZGVmaW5lZCIgKGlu
IHRoZSBKYXZhU2NyaXB0IHNlbnNlKS4gIENhbGxlZCBieSB0aGUgSlMgcnVudGltZS4KKyAgICBz
dGF0aWMgYm9vbCBpbnZva2UoTlBPYmplY3QqLCBOUElkZW50aWZpZXIsCisgICAgICAgICAgICAg
ICAgICAgICAgIGNvbnN0IE5QVmFyaWFudCogYXJndW1lbnRzLCB1aW50MzJfdCBhcmd1bWVudENv
dW50LAorICAgICAgICAgICAgICAgICAgICAgICBOUFZhcmlhbnQqIHJlc3VsdCk7CisKKyAgICAv
LyBJZiB0aGUgZ2l2ZW4gcHJvcGVydHkgaXMgZXhwb3NlZCBieSB0aGUgQysrIGNsYXNzIGFzc29j
aWF0ZWQgd2l0aCB0aGlzCisgICAgLy8gTlBPYmplY3QsIHJldHVybnMgaXRzIHZhbHVlLiAgT3Ro
ZXJ3aXNlLCByZXR1cm5zICJ1bmRlZmluZWQiIChpbiB0aGUKKyAgICAvLyBKYXZhU2NyaXB0IHNl
bnNlKS4gIENhbGxlZCBieSB0aGUgSlMgcnVudGltZS4KKyAgICBzdGF0aWMgYm9vbCBnZXRQcm9w
ZXJ0eShOUE9iamVjdCosIE5QSWRlbnRpZmllciwgTlBWYXJpYW50KiByZXN1bHQpOworCisgICAg
Ly8gSWYgdGhlIGdpdmVuIHByb3BlcnR5IGlzIGV4cG9zZWQgYnkgdGhlIEMrKyBjbGFzcyBhc3Nv
Y2lhdGVkIHdpdGggdGhpcworICAgIC8vIE5QT2JqZWN0LCBzZXRzIGl0cyB2YWx1ZS4gIE90aGVy
d2lzZSwgZG9lcyBub3RoaW5nLiBDYWxsZWQgYnkgdGhlIEpTCisgICAgLy8gcnVudGltZS4KKyAg
ICBzdGF0aWMgYm9vbCBzZXRQcm9wZXJ0eShOUE9iamVjdCosIE5QSWRlbnRpZmllciwgY29uc3Qg
TlBWYXJpYW50KiB2YWx1ZSk7Cit9OworCisvLyBCdWlsZCBDcHBOUE9iamVjdCdzIHN0YXRpYyBm
dW5jdGlvbiBwb2ludGVycyBpbnRvIGFuIE5QQ2xhc3MsIGZvciB1c2UKKy8vIGluIGNvbnN0cnVj
dGluZyBOUE9iamVjdHMgZm9yIHRoZSBDKysgY2xhc3Nlcy4KK05QQ2xhc3MgQ3BwTlBPYmplY3Q6
Om5wQ2xhc3MgPSB7CisgICAgTlBfQ0xBU1NfU1RSVUNUX1ZFUlNJT04sCisgICAgQ3BwTlBPYmpl
Y3Q6OmFsbG9jYXRlLAorICAgIENwcE5QT2JqZWN0OjpkZWFsbG9jYXRlLAorICAgIC8qIE5QSW52
YWxpZGF0ZUZ1bmN0aW9uUHRyICovIDAsCisgICAgQ3BwTlBPYmplY3Q6Omhhc01ldGhvZCwKKyAg
ICBDcHBOUE9iamVjdDo6aW52b2tlLAorICAgIC8qIE5QSW52b2tlRGVmYXVsdEZ1bmN0aW9uUHRy
ICovIDAsCisgICAgQ3BwTlBPYmplY3Q6Omhhc1Byb3BlcnR5LAorICAgIENwcE5QT2JqZWN0Ojpn
ZXRQcm9wZXJ0eSwKKyAgICBDcHBOUE9iamVjdDo6c2V0UHJvcGVydHksCisgICAgLyogTlBSZW1v
dmVQcm9wZXJ0eUZ1bmN0aW9uUHRyICovIDAKK307CisKK05QT2JqZWN0KiBDcHBOUE9iamVjdDo6
YWxsb2NhdGUoTlBQIG5wcCwgTlBDbGFzcyogYUNsYXNzKQoreworICAgIENwcE5QT2JqZWN0KiBv
YmogPSBuZXcgQ3BwTlBPYmplY3Q7CisgICAgLy8gb2JqLT5wYXJlbnQgd2lsbCBiZSBpbml0aWFs
aXplZCBieSB0aGUgTlBPYmplY3QgY29kZSBjYWxsaW5nIHRoaXMuCisgICAgb2JqLT5ib3VuZENs
YXNzID0gMDsKKyAgICByZXR1cm4gJm9iai0+cGFyZW50OworfQorCit2b2lkIENwcE5QT2JqZWN0
OjpkZWFsbG9jYXRlKE5QT2JqZWN0KiBucE9iaikKK3sKKyAgICBDcHBOUE9iamVjdCogb2JqID0g
cmVpbnRlcnByZXRfY2FzdDxDcHBOUE9iamVjdCo+KG5wT2JqKTsKKyAgICBkZWxldGUgb2JqOwor
fQorCitib29sIENwcE5QT2JqZWN0OjpoYXNNZXRob2QoTlBPYmplY3QqIG5wT2JqLCBOUElkZW50
aWZpZXIgaWRlbnQpCit7CisgICAgQ3BwTlBPYmplY3QqIG9iaiA9IHJlaW50ZXJwcmV0X2Nhc3Q8
Q3BwTlBPYmplY3QqPihucE9iaik7CisgICAgcmV0dXJuIG9iai0+Ym91bmRDbGFzcy0+aGFzTWV0
aG9kKGlkZW50KTsKK30KKworYm9vbCBDcHBOUE9iamVjdDo6aGFzUHJvcGVydHkoTlBPYmplY3Qq
IG5wT2JqLCBOUElkZW50aWZpZXIgaWRlbnQpCit7CisgICAgQ3BwTlBPYmplY3QqIG9iaiA9IHJl
aW50ZXJwcmV0X2Nhc3Q8Q3BwTlBPYmplY3QqPihucE9iaik7CisgICAgcmV0dXJuIG9iai0+Ym91
bmRDbGFzcy0+aGFzUHJvcGVydHkoaWRlbnQpOworfQorCitib29sIENwcE5QT2JqZWN0OjppbnZv
a2UoTlBPYmplY3QqIG5wT2JqLCBOUElkZW50aWZpZXIgaWRlbnQsCisgICAgICAgICAgICAgICAg
ICAgICAgICAgY29uc3QgTlBWYXJpYW50KiBhcmd1bWVudHMsIHVpbnQzMl90IGFyZ3VtZW50Q291
bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgTlBWYXJpYW50KiByZXN1bHQpCit7CisgICAg
Q3BwTlBPYmplY3QqIG9iaiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q3BwTlBPYmplY3QqPihucE9iaik7
CisgICAgcmV0dXJuIG9iai0+Ym91bmRDbGFzcy0+aW52b2tlKGlkZW50LCBhcmd1bWVudHMsIGFy
Z3VtZW50Q291bnQsIHJlc3VsdCk7Cit9CisKK2Jvb2wgQ3BwTlBPYmplY3Q6OmdldFByb3BlcnR5
KE5QT2JqZWN0KiBucE9iaiwgTlBJZGVudGlmaWVyIGlkZW50LCBOUFZhcmlhbnQqIHJlc3VsdCkK
K3sKKyAgICBDcHBOUE9iamVjdCogb2JqID0gcmVpbnRlcnByZXRfY2FzdDxDcHBOUE9iamVjdCo+
KG5wT2JqKTsKKyAgICByZXR1cm4gb2JqLT5ib3VuZENsYXNzLT5nZXRQcm9wZXJ0eShpZGVudCwg
cmVzdWx0KTsKK30KKworYm9vbCBDcHBOUE9iamVjdDo6c2V0UHJvcGVydHkoTlBPYmplY3QqIG5w
T2JqLCBOUElkZW50aWZpZXIgaWRlbnQsIGNvbnN0IE5QVmFyaWFudCogdmFsdWUpCit7CisgICAg
Q3BwTlBPYmplY3QqIG9iaiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q3BwTlBPYmplY3QqPihucE9iaik7
CisgICAgcmV0dXJuIG9iai0+Ym91bmRDbGFzcy0+c2V0UHJvcGVydHkoaWRlbnQsIHZhbHVlKTsK
K30KKworQ3BwQm91bmRDbGFzczo6fkNwcEJvdW5kQ2xhc3MoKQoreworICAgIGZvciAoTWV0aG9k
TGlzdDo6aXRlcmF0b3IgaSA9IG1fbWV0aG9kcy5iZWdpbigpOyBpICE9IG1fbWV0aG9kcy5lbmQo
KTsgKytpKQorICAgICAgICBkZWxldGUgaS0+c2Vjb25kOworCisgICAgZm9yIChQcm9wZXJ0eUxp
c3Q6Oml0ZXJhdG9yIGkgPSBtX3Byb3BlcnRpZXMuYmVnaW4oKTsgaSAhPSBtX3Byb3BlcnRpZXMu
ZW5kKCk7ICsraSkKKyAgICAgICAgZGVsZXRlIGktPnNlY29uZDsKKworICAgIC8vIFVucmVnaXN0
ZXIgb3Vyc2VsdmVzIGlmIHdlIHdlcmUgYm91bmQgdG8gYSBmcmFtZS4KKyAgICBpZiAobV9ib3Vu
ZFRvRnJhbWUpCisgICAgICAgIFdlYkJpbmRpbmdzOjp1bnJlZ2lzdGVyT2JqZWN0KE5QVkFSSUFO
VF9UT19PQkpFQ1QobV9zZWxmVmFyaWFudCkpOworfQorCitib29sIENwcEJvdW5kQ2xhc3M6Omhh
c01ldGhvZChOUElkZW50aWZpZXIgaWRlbnQpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fbWV0aG9k
cy5maW5kKGlkZW50KSAhPSBtX21ldGhvZHMuZW5kKCk7Cit9CisKK2Jvb2wgQ3BwQm91bmRDbGFz
czo6aGFzUHJvcGVydHkoTlBJZGVudGlmaWVyIGlkZW50KSBjb25zdAoreworICAgIHJldHVybiBt
X3Byb3BlcnRpZXMuZmluZChpZGVudCkgIT0gbV9wcm9wZXJ0aWVzLmVuZCgpOworfQorCitib29s
IENwcEJvdW5kQ2xhc3M6Omludm9rZShOUElkZW50aWZpZXIgaWRlbnQsCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICBjb25zdCBOUFZhcmlhbnQqIGFyZ3VtZW50cywKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHNpemVfdCBhcmd1bWVudENvdW50LAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgTlBWYXJpYW50KiByZXN1bHQpIHsKKyAgICBNZXRob2RMaXN0Ojpjb25zdF9pdGVyYXRv
ciBlbmQgPSBtX21ldGhvZHMuZW5kKCk7CisgICAgTWV0aG9kTGlzdDo6Y29uc3RfaXRlcmF0b3Ig
bWV0aG9kID0gbV9tZXRob2RzLmZpbmQoaWRlbnQpOworICAgIENhbGxiYWNrKiBjYWxsYmFjazsK
KyAgICBpZiAobWV0aG9kID09IGVuZCkgeworICAgICAgICBpZiAoIW1fZmFsbGJhY2tDYWxsYmFj
ay5nZXQoKSkgeworICAgICAgICAgICAgVk9JRF9UT19OUFZBUklBTlQoKnJlc3VsdCk7CisgICAg
ICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgY2FsbGJhY2sgPSBtX2Zh
bGxiYWNrQ2FsbGJhY2suZ2V0KCk7CisgICAgfSBlbHNlCisgICAgICAgIGNhbGxiYWNrID0gKCpt
ZXRob2QpLnNlY29uZDsKKworICAgIC8vIEJ1aWxkIGEgQ3BwQXJndW1lbnRMaXN0IGFyZ3VtZW50
IHZlY3RvciBmcm9tIHRoZSBOUFZhcmlhbnRzIGNvbWluZyBpbi4KKyAgICBDcHBBcmd1bWVudExp
c3QgY3BwQXJndW1lbnRzKGFyZ3VtZW50Q291bnQpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBp
IDwgYXJndW1lbnRDb3VudDsgaSsrKQorICAgICAgICBjcHBBcmd1bWVudHNbaV0uc2V0KGFyZ3Vt
ZW50c1tpXSk7CisKKyAgICBDcHBWYXJpYW50IGNwcFJlc3VsdDsKKyAgICBjYWxsYmFjay0+cnVu
KGNwcEFyZ3VtZW50cywgJmNwcFJlc3VsdCk7CisKKyAgICBjcHBSZXN1bHQuY29weVRvTlBWYXJp
YW50KHJlc3VsdCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ3BwQm91bmRDbGFzczo6
Z2V0UHJvcGVydHkoTlBJZGVudGlmaWVyIGlkZW50LCBOUFZhcmlhbnQqIHJlc3VsdCkgY29uc3QK
K3sKKyAgICBQcm9wZXJ0eUxpc3Q6OmNvbnN0X2l0ZXJhdG9yIGNhbGxiYWNrID0gbV9wcm9wZXJ0
aWVzLmZpbmQoaWRlbnQpOworICAgIGlmIChjYWxsYmFjayA9PSBtX3Byb3BlcnRpZXMuZW5kKCkp
IHsKKyAgICAgICAgVk9JRF9UT19OUFZBUklBTlQoKnJlc3VsdCk7CisgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICB9CisKKyAgICBDcHBWYXJpYW50IGNwcFZhbHVlOworICAgIGlmICghY2FsbGJh
Y2stPnNlY29uZC0+Z2V0VmFsdWUoJmNwcFZhbHVlKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgIGNwcFZhbHVlLmNvcHlUb05QVmFyaWFudChyZXN1bHQpOworICAgIHJldHVybiB0cnVlOwor
fQorCitib29sIENwcEJvdW5kQ2xhc3M6OnNldFByb3BlcnR5KE5QSWRlbnRpZmllciBpZGVudCwg
Y29uc3QgTlBWYXJpYW50KiB2YWx1ZSkKK3sKKyAgICBQcm9wZXJ0eUxpc3Q6Oml0ZXJhdG9yIGNh
bGxiYWNrID0gbV9wcm9wZXJ0aWVzLmZpbmQoaWRlbnQpOworICAgIGlmIChjYWxsYmFjayA9PSBt
X3Byb3BlcnRpZXMuZW5kKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIENwcFZhcmlh
bnQgY3BwVmFsdWU7CisgICAgY3BwVmFsdWUuc2V0KCp2YWx1ZSk7CisgICAgcmV0dXJuICgqY2Fs
bGJhY2spLnNlY29uZC0+c2V0VmFsdWUoY3BwVmFsdWUpOworfQorCit2b2lkIENwcEJvdW5kQ2xh
c3M6OmJpbmRDYWxsYmFjayhjb25zdCBzdHJpbmcmIG5hbWUsIENhbGxiYWNrKiBjYWxsYmFjaykK
K3sKKyAgICBOUElkZW50aWZpZXIgaWRlbnQgPSBXZWJCaW5kaW5nczo6Z2V0U3RyaW5nSWRlbnRp
ZmllcihuYW1lLmNfc3RyKCkpOworICAgIE1ldGhvZExpc3Q6Oml0ZXJhdG9yIG9sZENhbGxiYWNr
ID0gbV9tZXRob2RzLmZpbmQoaWRlbnQpOworICAgIGlmIChvbGRDYWxsYmFjayAhPSBtX21ldGhv
ZHMuZW5kKCkpIHsKKyAgICAgICAgZGVsZXRlIG9sZENhbGxiYWNrLT5zZWNvbmQ7CisgICAgICAg
IGlmICghY2FsbGJhY2spIHsKKyAgICAgICAgICAgIG1fbWV0aG9kcy5yZW1vdmUob2xkQ2FsbGJh
Y2spOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgbV9tZXRo
b2RzLnNldChpZGVudCwgY2FsbGJhY2spOworfQorCit2b2lkIENwcEJvdW5kQ2xhc3M6OmJpbmRH
ZXR0ZXJDYWxsYmFjayhjb25zdCBzdHJpbmcmIG5hbWUsIEdldHRlckNhbGxiYWNrKiBjYWxsYmFj
aykKK3sKKyAgICBQcm9wZXJ0eUNhbGxiYWNrKiBwcm9wZXJ0eUNhbGxiYWNrID0gY2FsbGJhY2sg
PyBuZXcgR2V0dGVyUHJvcGVydHlDYWxsYmFjayhjYWxsYmFjaykgOiAwOworICAgIGJpbmRQcm9w
ZXJ0eShuYW1lLCBwcm9wZXJ0eUNhbGxiYWNrKTsKK30KKwordm9pZCBDcHBCb3VuZENsYXNzOjpi
aW5kUHJvcGVydHkoY29uc3Qgc3RyaW5nJiBuYW1lLCBDcHBWYXJpYW50KiBwcm9wKQoreworICAg
IFByb3BlcnR5Q2FsbGJhY2sqIHByb3BlcnR5Q2FsbGJhY2sgPSBwcm9wID8gbmV3IENwcFZhcmlh
bnRQcm9wZXJ0eUNhbGxiYWNrKHByb3ApIDogMDsKKyAgICBiaW5kUHJvcGVydHkobmFtZSwgcHJv
cGVydHlDYWxsYmFjayk7Cit9CisKK3ZvaWQgQ3BwQm91bmRDbGFzczo6YmluZFByb3BlcnR5KGNv
bnN0IHN0cmluZyYgbmFtZSwgUHJvcGVydHlDYWxsYmFjayogY2FsbGJhY2spCit7CisgICAgTlBJ
ZGVudGlmaWVyIGlkZW50ID0gV2ViQmluZGluZ3M6OmdldFN0cmluZ0lkZW50aWZpZXIobmFtZS5j
X3N0cigpKTsKKyAgICBQcm9wZXJ0eUxpc3Q6Oml0ZXJhdG9yIG9sZENhbGxiYWNrID0gbV9wcm9w
ZXJ0aWVzLmZpbmQoaWRlbnQpOworICAgIGlmIChvbGRDYWxsYmFjayAhPSBtX3Byb3BlcnRpZXMu
ZW5kKCkpIHsKKyAgICAgICAgZGVsZXRlIG9sZENhbGxiYWNrLT5zZWNvbmQ7CisgICAgICAgIGlm
ICghY2FsbGJhY2spIHsKKyAgICAgICAgICAgIG1fcHJvcGVydGllcy5yZW1vdmUob2xkQ2FsbGJh
Y2spOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgbV9wcm9w
ZXJ0aWVzLnNldChpZGVudCwgY2FsbGJhY2spOworfQorCitib29sIENwcEJvdW5kQ2xhc3M6Omlz
TWV0aG9kUmVnaXN0ZXJlZChjb25zdCBzdHJpbmcmIG5hbWUpIGNvbnN0Cit7CisgICAgTlBJZGVu
dGlmaWVyIGlkZW50ID0gV2ViQmluZGluZ3M6OmdldFN0cmluZ0lkZW50aWZpZXIobmFtZS5jX3N0
cigpKTsKKyAgICBNZXRob2RMaXN0Ojpjb25zdF9pdGVyYXRvciBjYWxsYmFjayA9IG1fbWV0aG9k
cy5maW5kKGlkZW50KTsKKyAgICByZXR1cm4gY2FsbGJhY2sgIT0gbV9tZXRob2RzLmVuZCgpOwor
fQorCitDcHBWYXJpYW50KiBDcHBCb3VuZENsYXNzOjpnZXRBc0NwcFZhcmlhbnQoKQoreworICAg
IGlmICghbV9zZWxmVmFyaWFudC5pc09iamVjdCgpKSB7CisgICAgICAgIC8vIENyZWF0ZSBhbiBO
UE9iamVjdCB1c2luZyBvdXIgc3RhdGljIE5QQ2xhc3MuICBUaGUgZmlyc3QgYXJndW1lbnQgKGEK
KyAgICAgICAgLy8gcGx1Z2luJ3MgaW5zdGFuY2UgaGFuZGxlKSBpcyBwYXNzZWQgdGhyb3VnaCB0
byB0aGUgYWxsb2NhdGUgZnVuY3Rpb24KKyAgICAgICAgLy8gZGlyZWN0bHksIGFuZCB3ZSBkb24n
dCB1c2UgaXQsIHNvIGl0J3Mgb2sgdG8gYmUgMC4KKyAgICAgICAgTlBPYmplY3QqIG5wT2JqID0g
V2ViQmluZGluZ3M6OmNyZWF0ZU9iamVjdCgwLCAmQ3BwTlBPYmplY3Q6Om5wQ2xhc3MpOworICAg
ICAgICBDcHBOUE9iamVjdCogb2JqID0gcmVpbnRlcnByZXRfY2FzdDxDcHBOUE9iamVjdCo+KG5w
T2JqKTsKKyAgICAgICAgb2JqLT5ib3VuZENsYXNzID0gdGhpczsKKyAgICAgICAgbV9zZWxmVmFy
aWFudC5zZXQobnBPYmopOworICAgICAgICBXZWJCaW5kaW5nczo6cmVsZWFzZU9iamVjdChucE9i
aik7IC8vIENwcFZhcmlhbnQgdGFrZXMgdGhlIHJlZmVyZW5jZS4KKyAgICB9CisgICAgQVNTRVJU
KG1fc2VsZlZhcmlhbnQuaXNPYmplY3QoKSk7CisgICAgcmV0dXJuICZtX3NlbGZWYXJpYW50Owor
fQorCit2b2lkIENwcEJvdW5kQ2xhc3M6OmJpbmRUb0phdmFzY3JpcHQoV2ViRnJhbWUqIGZyYW1l
LCBjb25zdCBXZWJTdHJpbmcmIGNsYXNzbmFtZSkKK3sKKyAgICAvLyBCaW5kVG9XaW5kb3dPYmpl
Y3Qgd2lsbCB0YWtlIGl0cyBvd24gcmVmZXJlbmNlIHRvIHRoZSBOUE9iamVjdCwgYW5kIGNsZWFu
CisgICAgLy8gdXAgYWZ0ZXIgaXRzZWxmLiAgSXQgd2lsbCBhbHNvIChpbmRpcmVjdGx5KSByZWdp
c3RlciB0aGUgb2JqZWN0IHdpdGggVjgsCisgICAgLy8gc28gd2UgbXVzdCByZW1lbWJlciB0aGlz
IHNvIHdlIGNhbiB1bnJlZ2lzdGVyIGl0IHdoZW4gd2UncmUgZGVzdHJveWVkLgorICAgIGZyYW1l
LT5iaW5kVG9XaW5kb3dPYmplY3QoY2xhc3NuYW1lLCBOUFZBUklBTlRfVE9fT0JKRUNUKCpnZXRB
c0NwcFZhcmlhbnQoKSkpOworICAgIG1fYm91bmRUb0ZyYW1lID0gdHJ1ZTsKK30KZGlmZiAtLWdp
dCBhL1dlYktpdFRvb2xzL0R1bXBSZW5kZXJUcmVlL2Nocm9taXVtL0NwcEJvdW5kQ2xhc3MuaCBi
L1dlYktpdFRvb2xzL0R1bXBSZW5kZXJUcmVlL2Nocm9taXVtL0NwcEJvdW5kQ2xhc3MuaApuZXcg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2I2MzhlCi0tLSAvZGV2L251bGwKKysr
IGIvV2ViS2l0VG9vbHMvRHVtcFJlbmRlclRyZWUvY2hyb21pdW0vQ3BwQm91bmRDbGFzcy5oCkBA
IC0wLDAgKzEsMjQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgUGF3ZWwgSGFqZGFuIChw
aGFqZGFuLmpyQGNocm9taXVtLm9yZykKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBh
cmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29w
eXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0
aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0
b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZy
b20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1p
c3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hU
IEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRI
RSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgor
ICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxM
IFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBU
TywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICog
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4KKyAqLworCisvKgorICBDcHBCb3VuZENsYXNzIGNsYXNzOgorICBUaGlzIGJh
c2UgY2xhc3Mgc2VydmVzIGFzIGEgcGFyZW50IGZvciBDKysgY2xhc3NlcyBkZXNpZ25lZCB0byBi
ZSBib3VuZCB0bworICBKYXZhU2NyaXB0IG9iamVjdHMuCisKKyAgU3ViY2xhc3NlcyBzaG91bGQg
ZGVmaW5lIHRoZSBjb25zdHJ1Y3RvciB0byBidWlsZCB0aGUgcHJvcGVydHkgYW5kIG1ldGhvZAor
ICBsaXN0cyBuZWVkZWQgdG8gYmluZCB0aGlzIGNsYXNzIHRvIGEgSlMgb2JqZWN0LiAgVGhleSBz
aG91bGQgYWxzbyBkZWNsYXJlCisgIGFuZCBkZWZpbmUgbWVtYmVyIHZhcmlhYmxlcyBhbmQgbWV0
aG9kcyB0byBiZSBleHBvc2VkIHRvIEpTIHRocm91Z2gKKyAgdGhhdCBvYmplY3QuCisqLworCisj
aWZuZGVmIENwcEJvdW5kQ2xhc3NfaAorI2RlZmluZSBDcHBCb3VuZENsYXNzX2gKKworI2luY2x1
ZGUgIkNwcFZhcmlhbnQuaCIKKyNpbmNsdWRlIDx3dGYvSGFzaE1hcC5oPgorI2luY2x1ZGUgPHd0
Zi9Ob25jb3B5YWJsZS5oPgorI2luY2x1ZGUgPHd0Zi9Pd25QdHIuaD4KKyNpbmNsdWRlIDx3dGYv
VmVjdG9yLmg+CisKK25hbWVzcGFjZSBXZWJLaXQgeworY2xhc3MgV2ViRnJhbWU7CitjbGFzcyBX
ZWJTdHJpbmc7Cit9CisKK3R5cGVkZWYgVmVjdG9yPENwcFZhcmlhbnQ+IENwcEFyZ3VtZW50TGlz
dDsKKworLy8gQ3BwQm91bmRDbGFzcyBsZXRzIHlvdSBtYXAgSmF2YXNjcmlwdCBtZXRob2QgY2Fs
bHMgYW5kIHByb3BlcnR5IGFjY2Vzc2VzCisvLyBkaXJlY3RseSB0byBDKysgbWV0aG9kIGNhbGxz
IGFuZCBDcHBWYXJpYW50KiB2YXJpYWJsZSBhY2Nlc3MuCitjbGFzcyBDcHBCb3VuZENsYXNzIDog
cHVibGljIE5vbmNvcHlhYmxlIHsKK3B1YmxpYzoKKyAgICBjbGFzcyBQcm9wZXJ0eUNhbGxiYWNr
IHsKKyAgICBwdWJsaWM6CisgICAgICAgIHZpcnR1YWwgflByb3BlcnR5Q2FsbGJhY2soKSB7IH0K
KworICAgICAgICAvLyBTZXRzIHx2YWx1ZXwgdG8gdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS4g
UmV0dXJucyBmYWxzZSBpbiBjYXNlIG9mCisgICAgICAgIC8vIGZhaWx1cmUuIHx2YWx1ZXwgaXMg
YWx3YXlzIG5vbi0wLgorICAgICAgICB2aXJ0dWFsIGJvb2wgZ2V0VmFsdWUoQ3BwVmFyaWFudCog
cmVzdWx0KSA9IDA7CisKKyAgICAgICAgLy8gc2V0cyB0aGUgcHJvcGVydHkgdmFsdWUgdG8gfHZh
bHVlfC4gUmV0dXJucyBmYWxzZSBpbiBjYXNlIG9mIGZhaWx1cmUuCisgICAgICAgIHZpcnR1YWwg
Ym9vbCBzZXRWYWx1ZShjb25zdCBDcHBWYXJpYW50JikgPSAwOworICAgIH07CisKKyAgICAvLyBD
YWxsYmFjayBjbGFzcyBmb3IgInZvaWQgZnVuY3Rpb24oQ3BwVmFyaWFudCopIgorICAgIGNsYXNz
IEdldHRlckNhbGxiYWNrIHsKKyAgICBwdWJsaWM6CisgICAgICAgIHZpcnR1YWwgfkdldHRlckNh
bGxiYWNrKCkge30KKyAgICAgICAgdmlydHVhbCB2b2lkIHJ1bihDcHBWYXJpYW50KikgPSAwOwor
ICAgIH07CisKKyAgICAvLyBUaGUgY29uc3RydWN0b3Igc2hvdWxkIGNhbGwgQmluZE1ldGhvZCwg
QmluZFByb3BlcnR5LCBhbmQKKyAgICAvLyBTZXRGYWxsYmFja01ldGhvZCBhcyBuZWVkZWQgdG8g
c2V0IHVwIHRoZSBtZXRob2RzLCBwcm9wZXJ0aWVzLCBhbmQKKyAgICAvLyBmYWxsYmFjayBtZXRo
b2QuCisgICAgQ3BwQm91bmRDbGFzcygpIDogbV9ib3VuZFRvRnJhbWUoZmFsc2UpIHt9CisgICAg
dmlydHVhbCB+Q3BwQm91bmRDbGFzcygpOworCisgICAgLy8gUmV0dXJuIGEgQ3BwVmFyaWFudCBy
ZXByZXNlbnRpbmcgdGhpcyBjbGFzcywgZm9yIHVzZSB3aXRoIEJpbmRQcm9wZXJ0eSgpLgorICAg
IC8vIFRoZSB2YXJpYW50IHR5cGUgaXMgZ3VhcmFudGVlZCB0byBiZSBOUFZhcmlhbnRUeXBlX09i
amVjdC4KKyAgICBDcHBWYXJpYW50KiBnZXRBc0NwcFZhcmlhbnQoKTsKKworICAgIC8vIEdpdmVu
IGEgV2ViRnJhbWUsIEJpbmRUb0phdmFzY3JpcHQgYnVpbGRzIHRoZSBOUE9iamVjdCB0aGF0IHdp
bGwgcmVwcmVzZW50CisgICAgLy8gdGhlIGNsYXNzIGFuZCBiaW5kcyBpdCB0byB0aGUgZnJhbWUn
cyB3aW5kb3cgdW5kZXIgdGhlIGdpdmVuIG5hbWUuICBUaGlzCisgICAgLy8gc2hvdWxkIGdlbmVy
YWxseSBiZSBjYWxsZWQgZnJvbSB0aGUgV2ViVmlldyBkZWxlZ2F0ZSdzCisgICAgLy8gV2luZG93
T2JqZWN0Q2xlYXJlZCgpLiBBIGNsYXNzIHNvIGJvdW5kIHdpbGwgYmUgYWNjZXNzaWJsZSB0byBK
YXZhU2NyaXB0CisgICAgLy8gYXMgd2luZG93LjxjbGFzc25hbWU+LiBUaGUgb3duZXIgb2YgdGhl
IENwcEJvdW5kT2JqZWN0IGlzIHJlc3BvbnNpYmxlIGZvcgorICAgIC8vIGtlZXBpbmcgdGhlIG9i
amVjdCBhcm91bmQgd2hpbGUgdGhlIGZyYW1lIGlzIGFsaXZlLCBhbmQgZm9yIGRlc3Ryb3lpbmcg
aXQKKyAgICAvLyBhZnRlcndhcmRzLgorICAgIHZvaWQgYmluZFRvSmF2YXNjcmlwdChXZWJLaXQ6
OldlYkZyYW1lKiwgY29uc3QgV2ViS2l0OjpXZWJTdHJpbmcmIGNsYXNzbmFtZSk7CisKKyAgICAv
LyBVc2VkIGJ5IGEgdGVzdC4gIFJldHVybnMgdHJ1ZSBpZiBhIG1ldGhvZCB3aXRoIG5hbWUgfG5h
bWV8IGV4aXN0cywKKyAgICAvLyByZWdhcmRsZXNzIG9mIHdoZXRoZXIgYSBmYWxsYmFjayBpcyBy
ZWdpc3RlcmVkLgorICAgIGJvb2wgaXNNZXRob2RSZWdpc3RlcmVkKGNvbnN0IHN0ZDo6c3RyaW5n
JikgY29uc3Q7CisKK3Byb3RlY3RlZDoKKyAgICAvLyBDYWxsYmFjayBmb3IgInZvaWQgZnVuY3Rp
b24oY29uc3QgQ3BwQXJndWVtbnRMaXN0JiwgQ3BwVmFyaWFudCopIgorICAgIGNsYXNzIENhbGxi
YWNrIHsKKyAgICBwdWJsaWM6CisgICAgICAgIHZpcnR1YWwgfkNhbGxiYWNrKCkge30KKyAgICAg
ICAgdmlydHVhbCB2b2lkIHJ1bihjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50Kikg
PSAwOworICAgIH07CisKKyAgICAvLyBDYWxsYmFjayBmb3IgInZvaWQgVDo6bWV0aG9kKGNvbnN0
IENwcEFyZ3VlbW50TGlzdCYsIENwcFZhcmlhbnQqKSIKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4g
Y2xhc3MgTWVtYmVyQ2FsbGJhY2sgOiBwdWJsaWMgQ2FsbGJhY2sgeworICAgIHB1YmxpYzoKKyAg
ICAgICAgdHlwZWRlZiB2b2lkIChUOjoqTWV0aG9kVHlwZSkoY29uc3QgQ3BwQXJndW1lbnRMaXN0
JiwgQ3BwVmFyaWFudCopOworICAgICAgICBNZW1iZXJDYWxsYmFjayhUKiBvYmplY3QsIE1ldGhv
ZFR5cGUgbWV0aG9kKQorICAgICAgICAgICAgOiBtX29iamVjdChvYmplY3QpCisgICAgICAgICAg
ICAsIG1fbWV0aG9kKG1ldGhvZCkge30KKyAgICAgICAgdmlydHVhbCB+TWVtYmVyQ2FsbGJhY2so
KSB7fQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBydW4oY29uc3QgQ3BwQXJndW1lbnRMaXN0JiBh
cmd1bWVudHMsIENwcFZhcmlhbnQqIHJlc3VsdCkKKyAgICAgICAgeworICAgICAgICAgICAgKG1f
b2JqZWN0LT4qbV9tZXRob2QpKGFyZ3VtZW50cywgcmVzdWx0KTsKKyAgICAgICAgfQorICAgIHBy
aXZhdGU6CisgICAgICAgIFQqIG1fb2JqZWN0OworICAgICAgICBNZXRob2RUeXBlIG1fbWV0aG9k
OworICAgIH07CisKKyAgICAvLyBDYWxsYmFjayBjbGFzcyBmb3IgInZvaWQgVDo6bWV0aG9kKENw
cFZhcmlhbnQqKSIKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gY2xhc3MgTWVtYmVyR2V0dGVyQ2Fs
bGJhY2sgOiBwdWJsaWMgR2V0dGVyQ2FsbGJhY2sgeworICAgIHB1YmxpYzoKKyAgICAgICAgdHlw
ZWRlZiB2b2lkIChUOjoqTWV0aG9kVHlwZSkoQ3BwVmFyaWFudCopOworICAgICAgICBNZW1iZXJH
ZXR0ZXJDYWxsYmFjayhUKiBvYmplY3QsIE1ldGhvZFR5cGUgbWV0aG9kKQorICAgICAgICAgICAg
OiBtX29iamVjdChvYmplY3QpCisgICAgICAgICAgICAsIG1fbWV0aG9kKG1ldGhvZCkge30KKyAg
ICAgICAgdmlydHVhbCB+TWVtYmVyR2V0dGVyQ2FsbGJhY2soKSB7fQorCisgICAgICAgIHZpcnR1
YWwgdm9pZCBydW4oQ3BwVmFyaWFudCogcmVzdWx0KSB7IChtX29iamVjdC0+Km1fbWV0aG9kKShy
ZXN1bHQpOyB9CisgICAgcHJpdmF0ZToKKyAgICAgICAgVCogbV9vYmplY3Q7CisgICAgICAgIE1l
dGhvZFR5cGUgbV9tZXRob2Q7CisgICAgfTsKKworICAgIC8vIEJpbmQgdGhlIEphdmFzY3JpcHQg
bWV0aG9kIGNhbGxlZCB0aGUgc3RyaW5nIHBhcmFtZXRlciB0byB0aGUgQysrIG1ldGhvZC4KKyAg
ICB2b2lkIGJpbmRDYWxsYmFjayhjb25zdCBzdGQ6OnN0cmluZyYsIENhbGxiYWNrKik7CisKKyAg
ICAvLyBBIHdyYXBwZXIgZm9yIGJpbmRDYWxsYmFjaywgdG8gc2ltcGxpZnkgdGhlIGNvbW1vbiBj
YXNlIG9mIGJpbmRpbmcgYQorICAgIC8vIG1ldGhvZCBvbiB0aGUgY3VycmVudCBvYmplY3QuICBU
aG91Z2ggbm90IHZlcmlmaWVkIGhlcmUsIHxtZXRob2R8CisgICAgLy8gbXVzdCBiZSBhIG1ldGhv
ZCBvZiB0aGlzIENwcEJvdW5kQ2xhc3Mgc3ViY2xhc3MuCisgICAgdGVtcGxhdGU8Y2xhc3MgVD4K
KyAgICB2b2lkIGJpbmRNZXRob2QoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIHZvaWQgKFQ6Oipt
ZXRob2QpKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqKSkKKyAgICB7CisgICAg
ICAgIENhbGxiYWNrKiBjYWxsYmFjayA9IG5ldyBNZW1iZXJDYWxsYmFjazxUPihzdGF0aWNfY2Fz
dDxUKj4odGhpcyksIG1ldGhvZCk7CisgICAgICAgIGJpbmRDYWxsYmFjayhuYW1lLCBjYWxsYmFj
ayk7CisgICAgfQorCisgICAgLy8gQmluZCBKYXZhc2NyaXB0IHByb3BlcnR5IHxuYW1lfCB0byB0
aGUgQysrIGdldHRlciBjYWxsYmFjayB8Y2FsbGJhY2t8LgorICAgIC8vIFRoaXMgY2FuIGJlIHVz
ZWQgdG8gY3JlYXRlIHJlYWQtb25seSBwcm9wZXJ0aWVzLgorICAgIHZvaWQgYmluZEdldHRlckNh
bGxiYWNrKGNvbnN0IHN0ZDo6c3RyaW5nJiwgR2V0dGVyQ2FsbGJhY2sqKTsKKworICAgIC8vIEEg
d3JhcHBlciBmb3IgQmluZEdldHRlckNhbGxiYWNrLCB0byBzaW1wbGlmeSB0aGUgY29tbW9uIGNh
c2Ugb2YgYmluZGluZyBhCisgICAgLy8gcHJvcGVydHkgb24gdGhlIGN1cnJlbnQgb2JqZWN0LiAg
VGhvdWdoIG5vdCB2ZXJpZmllZCBoZXJlLCB8bWV0aG9kfAorICAgIC8vIG11c3QgYmUgYSBtZXRo
b2Qgb2YgdGhpcyBDcHBCb3VuZENsYXNzIHN1YmNsYXNzLgorICAgIHRlbXBsYXRlPGNsYXNzIFQ+
CisgICAgdm9pZCBiaW5kUHJvcGVydHkoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIHZvaWQgKFQ6
OiptZXRob2QpKENwcFZhcmlhbnQqKSkKKyAgICB7CisgICAgICAgIEdldHRlckNhbGxiYWNrKiBj
YWxsYmFjayA9IG5ldyBNZW1iZXJHZXR0ZXJDYWxsYmFjazxUPihzdGF0aWNfY2FzdDxUKj4odGhp
cyksIG1ldGhvZCk7CisgICAgICAgIGJpbmRHZXR0ZXJDYWxsYmFjayhuYW1lLCBjYWxsYmFjayk7
CisgICAgfQorCisgICAgLy8gQmluZCB0aGUgSmF2YXNjcmlwdCBwcm9wZXJ0eSBjYWxsZWQgfG5h
bWV8IHRvIGEgQ3BwVmFyaWFudC4KKyAgICB2b2lkIGJpbmRQcm9wZXJ0eShjb25zdCBzdGQ6OnN0
cmluZyYsIENwcFZhcmlhbnQqKTsKKworICAgIC8vIEJpbmQgSmF2YXNjcmlwdCBwcm9wZXJ0eSBj
YWxsZWQgfG5hbWV8IHRvIGEgUHJvcGVydHlDYWxsYmFjay4KKyAgICAvLyBDcHBCb3VuZENsYXNz
IGFzc3VtZXMgY29udHJvbCBvdmVyIHRoZSBsaWZlIHRpbWUgb2YgdGhlIGNhbGxiYWNrLgorICAg
IHZvaWQgYmluZFByb3BlcnR5KGNvbnN0IHN0ZDo6c3RyaW5nJiwgUHJvcGVydHlDYWxsYmFjayop
OworCisgICAgLy8gU2V0IHRoZSBmYWxsYmFjayBjYWxsYmFjaywgd2hpY2ggaXMgY2FsbGVkIHdo
ZW4gd2hlbiBhIGNhbGxiYWNrIGlzCisgICAgLy8gaW52b2tlZCB0aGF0IGlzbid0IGJvdW5kLgor
ICAgIC8vIElmIGl0IGlzIDAgKGl0cyBkZWZhdWx0IHZhbHVlKSwgYSBKYXZhU2NyaXB0IGV4Y2Vw
dGlvbiBpcyB0aHJvd24gaW4KKyAgICAvLyB0aGF0IGNhc2UgKGFzIG5vcm1hbGx5IGV4cGVjdGVk
KS4gSWYgbm9uIDAsIHRoZSBmYWxsYmFjayBtZXRob2QgaXMKKyAgICAvLyBpbnZva2VkIGFuZCB0
aGUgc2NyaXB0IGNvbnRpbnVlcyBpdHMgZXhlY3V0aW9uLgorICAgIC8vIFBhc3NpbmcgMCBjbGVh
cnMgb3V0IGFueSBleGlzdGluZyBiaW5kaW5nLgorICAgIC8vIEl0IGlzIHVzZWQgZm9yIHRlc3Rz
IGFuZCBzaG91bGQgcHJvYmFibHkgb25seSBiZSB1c2VkIGluIHN1Y2ggY2FzZXMKKyAgICAvLyBh
cyBpdCBtYXkgY2F1c2UgdW5leHBlY3RlZCBiZWhhdmlvcnMgKGEgSmF2YVNjcmlwdCBvYmplY3Qg
d2l0aCBhCisgICAgLy8gZmFsbGJhY2sgYWx3YXlzIHJldHVybnMgdHJ1ZSB3aGVuIGNoZWNrZWQg
Zm9yIGEgbWV0aG9kJ3MKKyAgICAvLyBleGlzdGVuY2UpLgorICAgIHZvaWQgYmluZEZhbGxiYWNr
Q2FsbGJhY2soQ2FsbGJhY2sqIGZhbGxiYWNrQ2FsbGJhY2spCisgICAgeworICAgICAgICBtX2Zh
bGxiYWNrQ2FsbGJhY2suc2V0KGZhbGxiYWNrQ2FsbGJhY2spOworICAgIH0KKworICAgIC8vIEEg
d3JhcHBlciBmb3IgQmluZEZhbGxiYWNrQ2FsbGJhY2ssIHRvIHNpbXBsaWZ5IHRoZSBjb21tb24g
Y2FzZSBvZgorICAgIC8vIGJpbmRpbmcgYSBtZXRob2Qgb24gdGhlIGN1cnJlbnQgb2JqZWN0LiAg
VGhvdWdoIG5vdCB2ZXJpZmllZCBoZXJlLAorICAgIC8vIHxtZXRob2R8IG11c3QgYmUgYSBtZXRo
b2Qgb2YgdGhpcyBDcHBCb3VuZENsYXNzIHN1YmNsYXNzLgorICAgIC8vIFBhc3NpbmcgMCBmb3Ig
fG1ldGhvZHwgY2xlYXJzIG91dCBhbnkgZXhpc3RpbmcgYmluZGluZy4KKyAgICB0ZW1wbGF0ZTxj
bGFzcyBUPgorICAgIHZvaWQgYmluZEZhbGxiYWNrTWV0aG9kKHZvaWQgKFQ6OiptZXRob2QpKGNv
bnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqKSkKKyAgICB7CisgICAgICAgIGlmICht
ZXRob2QpIHsKKyAgICAgICAgICAgIENhbGxiYWNrKiBjYWxsYmFjayA9IG5ldyBNZW1iZXJDYWxs
YmFjazxUPihzdGF0aWNfY2FzdDxUKj4odGhpcyksIG1ldGhvZCk7CisgICAgICAgICAgICBiaW5k
RmFsbGJhY2tDYWxsYmFjayhjYWxsYmFjayk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAg
YmluZEZhbGxiYWNrQ2FsbGJhY2soMCk7CisgICAgfQorCisgICAgLy8gU29tZSBmaWVsZHMgYXJl
IHByb3RlY3RlZCBiZWNhdXNlIHNvbWUgdGVzdHMgZGVwZW5kIG9uIGFjY2Vzc2luZyB0aGVtLAor
ICAgIC8vIGJ1dCBvdGhlcndpc2UgdGhleSBzaG91bGQgYmUgY29uc2lkZXJlZCBwcml2YXRlLgor
CisgICAgdHlwZWRlZiBIYXNoTWFwPE5QSWRlbnRpZmllciwgUHJvcGVydHlDYWxsYmFjayo+IFBy
b3BlcnR5TGlzdDsKKyAgICB0eXBlZGVmIEhhc2hNYXA8TlBJZGVudGlmaWVyLCBDYWxsYmFjayo+
IE1ldGhvZExpc3Q7CisgICAgLy8gVGhlc2UgbWFwcyBhc3NvY2lhdGUgbmFtZXMgd2l0aCBwcm9w
ZXJ0eSBhbmQgbWV0aG9kIHBvaW50ZXJzIHRvIGJlCisgICAgLy8gZXhwb3NlZCB0byBKYXZhU2Ny
aXB0LgorICAgIFByb3BlcnR5TGlzdCBtX3Byb3BlcnRpZXM7CisgICAgTWV0aG9kTGlzdCBtX21l
dGhvZHM7CisKKyAgICAvLyBUaGUgY2FsbGJhY2sgZ2V0cyBpbnZva2VkIHdoZW4gYSBjYWxsIGlz
IG1hZGUgdG8gYW4gbm9uZXhpc3RlbnQgbWV0aG9kLgorICAgIE93blB0cjxDYWxsYmFjaz4gbV9m
YWxsYmFja0NhbGxiYWNrOworCitwcml2YXRlOgorICAgIC8vIE5QT2JqZWN0IGNhbGxiYWNrcy4K
KyAgICBmcmllbmQgc3RydWN0IENwcE5QT2JqZWN0OworICAgIGJvb2wgaGFzTWV0aG9kKE5QSWRl
bnRpZmllcikgY29uc3Q7CisgICAgYm9vbCBpbnZva2UoTlBJZGVudGlmaWVyLCBjb25zdCBOUFZh
cmlhbnQqIGFyZ3MsIHNpemVfdCBhcmdDb3VudCwKKyAgICAgICAgICAgICAgICBOUFZhcmlhbnQq
IHJlc3VsdCk7CisgICAgYm9vbCBoYXNQcm9wZXJ0eShOUElkZW50aWZpZXIpIGNvbnN0OworICAg
IGJvb2wgZ2V0UHJvcGVydHkoTlBJZGVudGlmaWVyLCBOUFZhcmlhbnQqIHJlc3VsdCkgY29uc3Q7
CisgICAgYm9vbCBzZXRQcm9wZXJ0eShOUElkZW50aWZpZXIsIGNvbnN0IE5QVmFyaWFudCopOwor
CisgICAgLy8gQSBsYXppbHktaW5pdGlhbGl6ZWQgQ3BwVmFyaWFudCByZXByZXNlbnRpbmcgdGhp
cyBjbGFzcy4gIFdlIHJldGFpbiAxCisgICAgLy8gcmVmZXJlbmNlIHRvIHRoaXMgb2JqZWN0LCBh
bmQgaXQgaXMgcmVsZWFzZWQgb24gZGVsZXRpb24uCisgICAgQ3BwVmFyaWFudCBtX3NlbGZWYXJp
YW50OworCisgICAgLy8gVHJ1ZSBpZiBvdXIgbnBfb2JqZWN0IGhhcyBiZWVuIGJvdW5kIHRvIGEg
V2ViRnJhbWUsIGluIHdoaWNoIGNhc2UgaXQgbXVzdAorICAgIC8vIGJlIHVucmVnaXN0ZXJlZCB3
aXRoIFY4IHdoZW4gd2UgZGVsZXRlIGl0LgorICAgIGJvb2wgbV9ib3VuZFRvRnJhbWU7Cit9Owor
CisjZW5kaWYgLy8gQ3BwQm91bmRDbGFzc19oCmRpZmYgLS1naXQgYS9XZWJLaXRUb29scy9EdW1w
UmVuZGVyVHJlZS9jaHJvbWl1bS9DcHBWYXJpYW50LmNwcCBiL1dlYktpdFRvb2xzL0R1bXBSZW5k
ZXJUcmVlL2Nocm9taXVtL0NwcFZhcmlhbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4
IDAwMDAwMDAuLmVmMDRiZjMKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJLaXRUb29scy9EdW1wUmVu
ZGVyVHJlZS9jaHJvbWl1bS9DcHBWYXJpYW50LmNwcApAQCAtMCwwICsxLDMwOCBAQAorLyoKKyAq
IENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0
cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0
aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBv
ciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0
IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisg
KiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1Ig
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhF
T1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRl
ICJjb25maWcuaCIKKyNpbmNsdWRlICJDcHBWYXJpYW50LmgiCisKKyNpbmNsdWRlICJiYXNlL3N0
cmluZ191dGlsLmgiCisjaW5jbHVkZSAicHVibGljL1dlYkJpbmRpbmdzLmgiCisjaW5jbHVkZSA8
bGltaXRzPgorI2luY2x1ZGUgPHd0Zi9Bc3NlcnRpb25zLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBX
ZWJLaXQ7Cit1c2luZyBuYW1lc3BhY2Ugc3RkOworCitDcHBWYXJpYW50OjpDcHBWYXJpYW50KCkK
K3sKKyAgICB0eXBlID0gTlBWYXJpYW50VHlwZV9OdWxsOworfQorCisvLyBOb3RlIHRoYXQgU2V0
KCkgcGVyZm9ybXMgYSBkZWVwIGNvcHksIHdoaWNoIGlzIG5lY2Vzc2FyeSB0byBzYWZlbHkKKy8v
IGNhbGwgRnJlZURhdGEoKSBvbiB0aGUgdmFsdWUgaW4gdGhlIGRlc3RydWN0b3IuCitDcHBWYXJp
YW50OjpDcHBWYXJpYW50KGNvbnN0IENwcFZhcmlhbnQmIG9yaWdpbmFsKQoreworICAgIHR5cGUg
PSBOUFZhcmlhbnRUeXBlX051bGw7CisgICAgc2V0KG9yaWdpbmFsKTsKK30KKworLy8gU2VlIGNv
bW1lbnQgZm9yIGNvcHkgY29uc3RydWN0b3IsIGFib3ZlLgorQ3BwVmFyaWFudCYgQ3BwVmFyaWFu
dDo6b3BlcmF0b3I9KGNvbnN0IENwcFZhcmlhbnQmIG9yaWdpbmFsKQoreworICAgIGlmICgmb3Jp
Z2luYWwgIT0gdGhpcykKKyAgICAgICAgc2V0KG9yaWdpbmFsKTsKKyAgICByZXR1cm4gKnRoaXM7
Cit9CisKK0NwcFZhcmlhbnQ6On5DcHBWYXJpYW50KCkKK3sKKyAgICBmcmVlRGF0YSgpOworfQor
Cit2b2lkIENwcFZhcmlhbnQ6OmZyZWVEYXRhKCkKK3sKKyAgICBXZWJCaW5kaW5nczo6cmVsZWFz
ZVZhcmlhbnRWYWx1ZSh0aGlzKTsKK30KKworYm9vbCBDcHBWYXJpYW50Ojppc0VxdWFsKGNvbnN0
IENwcFZhcmlhbnQmIG90aGVyKSBjb25zdAoreworICAgIGlmICh0eXBlICE9IG90aGVyLnR5cGUp
CisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2Ug
TlBWYXJpYW50VHlwZV9Cb29sOgorICAgICAgICByZXR1cm4gKHZhbHVlLmJvb2xWYWx1ZSA9PSBv
dGhlci52YWx1ZS5ib29sVmFsdWUpOworICAgIGNhc2UgTlBWYXJpYW50VHlwZV9JbnQzMjoKKyAg
ICAgICAgcmV0dXJuICh2YWx1ZS5pbnRWYWx1ZSA9PSBvdGhlci52YWx1ZS5pbnRWYWx1ZSk7Cisg
ICAgY2FzZSBOUFZhcmlhbnRUeXBlX0RvdWJsZToKKyAgICAgICAgcmV0dXJuICh2YWx1ZS5kb3Vi
bGVWYWx1ZSA9PSBvdGhlci52YWx1ZS5kb3VibGVWYWx1ZSk7CisgICAgY2FzZSBOUFZhcmlhbnRU
eXBlX1N0cmluZzogeworICAgICAgICBjb25zdCBOUFN0cmluZyAqdGhpc192YWx1ZSA9ICZ2YWx1
ZS5zdHJpbmdWYWx1ZTsKKyAgICAgICAgY29uc3QgTlBTdHJpbmcgKm90aGVyX3ZhbHVlID0gJm90
aGVyLnZhbHVlLnN0cmluZ1ZhbHVlOworICAgICAgICB1aW50MzJfdCBsZW4gPSB0aGlzX3ZhbHVl
LT5VVEY4TGVuZ3RoOworICAgICAgICByZXR1cm4gbGVuID09IG90aGVyX3ZhbHVlLT5VVEY4TGVu
Z3RoCisgICAgICAgICAgICAmJiAhc3RybmNtcCh0aGlzX3ZhbHVlLT5VVEY4Q2hhcmFjdGVycywK
KyAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyX3ZhbHVlLT5VVEY4Q2hhcmFjdGVycywgbGVu
KTsKKyAgICB9CisgICAgY2FzZSBOUFZhcmlhbnRUeXBlX051bGw6CisgICAgY2FzZSBOUFZhcmlh
bnRUeXBlX1ZvaWQ6CisgICAgICAgIHJldHVybiB0cnVlOworICAgIGNhc2UgTlBWYXJpYW50VHlw
ZV9PYmplY3Q6IHsKKyAgICAgICAgTlBPYmplY3QqIHRoaXNWYWx1ZSA9IHZhbHVlLm9iamVjdFZh
bHVlOworICAgICAgICBOUE9iamVjdCogb3RoZXJWYWx1ZSA9IG90aGVyLnZhbHVlLm9iamVjdFZh
bHVlOworICAgICAgICByZXR1cm4gdGhpc1ZhbHVlLT5fY2xhc3MgPT0gb3RoZXJWYWx1ZS0+X2Ns
YXNzCisgICAgICAgICAgICAmJiB0aGlzVmFsdWUtPnJlZmVyZW5jZUNvdW50ID09IG90aGVyVmFs
dWUtPnJlZmVyZW5jZUNvdW50OworICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQor
Cit2b2lkIENwcFZhcmlhbnQ6OmNvcHlUb05QVmFyaWFudChOUFZhcmlhbnQqIHJlc3VsdCkgY29u
c3QKK3sKKyAgICByZXN1bHQtPnR5cGUgPSB0eXBlOworICAgIHN3aXRjaCAodHlwZSkgeworICAg
IGNhc2UgTlBWYXJpYW50VHlwZV9Cb29sOgorICAgICAgICByZXN1bHQtPnZhbHVlLmJvb2xWYWx1
ZSA9IHZhbHVlLmJvb2xWYWx1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBOUFZhcmlhbnRU
eXBlX0ludDMyOgorICAgICAgICByZXN1bHQtPnZhbHVlLmludFZhbHVlID0gdmFsdWUuaW50VmFs
dWU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTlBWYXJpYW50VHlwZV9Eb3VibGU6CisgICAg
ICAgIHJlc3VsdC0+dmFsdWUuZG91YmxlVmFsdWUgPSB2YWx1ZS5kb3VibGVWYWx1ZTsKKyAgICAg
ICAgYnJlYWs7CisgICAgY2FzZSBOUFZhcmlhbnRUeXBlX1N0cmluZzoKKyAgICAgICAgV2ViQmlu
ZGluZ3M6OmluaXRpYWxpemVWYXJpYW50V2l0aFN0cmluZ0NvcHkocmVzdWx0LCAmdmFsdWUuc3Ry
aW5nVmFsdWUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE5QVmFyaWFudFR5cGVfTnVsbDoK
KyAgICBjYXNlIE5QVmFyaWFudFR5cGVfVm9pZDoKKyAgICAgICAgLy8gTm90aGluZyB0byBzZXQu
CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTlBWYXJpYW50VHlwZV9PYmplY3Q6CisgICAgICAg
IHJlc3VsdC0+dHlwZSA9IE5QVmFyaWFudFR5cGVfT2JqZWN0OworICAgICAgICByZXN1bHQtPnZh
bHVlLm9iamVjdFZhbHVlID0gV2ViQmluZGluZ3M6OnJldGFpbk9iamVjdCh2YWx1ZS5vYmplY3RW
YWx1ZSk7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKwordm9pZCBDcHBWYXJpYW50OjpzZXQo
Y29uc3QgTlBWYXJpYW50JiBuZXdWYWx1ZSkKK3sKKyAgICBmcmVlRGF0YSgpOworICAgIHN3aXRj
aCAobmV3VmFsdWUudHlwZSkgeworICAgIGNhc2UgTlBWYXJpYW50VHlwZV9Cb29sOgorICAgICAg
ICBzZXQobmV3VmFsdWUudmFsdWUuYm9vbFZhbHVlKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2Fz
ZSBOUFZhcmlhbnRUeXBlX0ludDMyOgorICAgICAgICBzZXQobmV3VmFsdWUudmFsdWUuaW50VmFs
dWUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE5QVmFyaWFudFR5cGVfRG91YmxlOgorICAg
ICAgICBzZXQobmV3VmFsdWUudmFsdWUuZG91YmxlVmFsdWUpOworICAgICAgICBicmVhazsKKyAg
ICBjYXNlIE5QVmFyaWFudFR5cGVfU3RyaW5nOgorICAgICAgICBzZXQobmV3VmFsdWUudmFsdWUu
c3RyaW5nVmFsdWUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE5QVmFyaWFudFR5cGVfTnVs
bDoKKyAgICBjYXNlIE5QVmFyaWFudFR5cGVfVm9pZDoKKyAgICAgICAgdHlwZSA9IG5ld1ZhbHVl
LnR5cGU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTlBWYXJpYW50VHlwZV9PYmplY3Q6Cisg
ICAgICAgIHNldChuZXdWYWx1ZS52YWx1ZS5vYmplY3RWYWx1ZSk7CisgICAgICAgIGJyZWFrOwor
ICAgIH0KK30KKwordm9pZCBDcHBWYXJpYW50OjpzZXROdWxsKCkKK3sKKyAgICBmcmVlRGF0YSgp
OworICAgIHR5cGUgPSBOUFZhcmlhbnRUeXBlX051bGw7Cit9CisKK3ZvaWQgQ3BwVmFyaWFudDo6
c2V0KGJvb2wgbmV3VmFsdWUpCit7CisgICAgZnJlZURhdGEoKTsKKyAgICB0eXBlID0gTlBWYXJp
YW50VHlwZV9Cb29sOworICAgIHZhbHVlLmJvb2xWYWx1ZSA9IG5ld1ZhbHVlOworfQorCit2b2lk
IENwcFZhcmlhbnQ6OnNldChpbnQzMl90IG5ld1ZhbHVlKQoreworICAgIGZyZWVEYXRhKCk7Cisg
ICAgdHlwZSA9IE5QVmFyaWFudFR5cGVfSW50MzI7CisgICAgdmFsdWUuaW50VmFsdWUgPSBuZXdW
YWx1ZTsKK30KKwordm9pZCBDcHBWYXJpYW50OjpzZXQoZG91YmxlIG5ld1ZhbHVlKQoreworICAg
IGZyZWVEYXRhKCk7CisgICAgdHlwZSA9IE5QVmFyaWFudFR5cGVfRG91YmxlOworICAgIHZhbHVl
LmRvdWJsZVZhbHVlID0gbmV3VmFsdWU7Cit9CisKKy8vIFRoZSBuZXdWYWx1ZSBtdXN0IGJlIGEg
bnVsbC10ZXJtaW5hdGVkIHN0cmluZy4KK3ZvaWQgQ3BwVmFyaWFudDo6c2V0KGNvbnN0IGNoYXIq
IG5ld1ZhbHVlKQoreworICAgIGZyZWVEYXRhKCk7CisgICAgdHlwZSA9IE5QVmFyaWFudFR5cGVf
U3RyaW5nOworICAgIE5QU3RyaW5nIG5ld1N0cmluZyA9IHtuZXdWYWx1ZSwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHN0cmxlbihuZXdWYWx1ZSkpfTsK
KyAgICBXZWJCaW5kaW5nczo6aW5pdGlhbGl6ZVZhcmlhbnRXaXRoU3RyaW5nQ29weSh0aGlzLCAm
bmV3U3RyaW5nKTsKK30KKwordm9pZCBDcHBWYXJpYW50OjpzZXQoY29uc3Qgc3RyaW5nJiBuZXdW
YWx1ZSkKK3sKKyAgICBmcmVlRGF0YSgpOworICAgIHR5cGUgPSBOUFZhcmlhbnRUeXBlX1N0cmlu
ZzsKKyAgICBOUFN0cmluZyBuZXdTdHJpbmcgPSB7bmV3VmFsdWUuZGF0YSgpLAorICAgICAgICAg
ICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4obmV3VmFsdWUuc2l6ZSgpKX07
CisgICAgV2ViQmluZGluZ3M6OmluaXRpYWxpemVWYXJpYW50V2l0aFN0cmluZ0NvcHkodGhpcywg
Jm5ld1N0cmluZyk7Cit9CisKK3ZvaWQgQ3BwVmFyaWFudDo6c2V0KGNvbnN0IE5QU3RyaW5nJiBu
ZXdWYWx1ZSkKK3sKKyAgICBmcmVlRGF0YSgpOworICAgIHR5cGUgPSBOUFZhcmlhbnRUeXBlX1N0
cmluZzsKKyAgICBXZWJCaW5kaW5nczo6aW5pdGlhbGl6ZVZhcmlhbnRXaXRoU3RyaW5nQ29weSh0
aGlzLCAmbmV3VmFsdWUpOworfQorCit2b2lkIENwcFZhcmlhbnQ6OnNldChOUE9iamVjdCogbmV3
VmFsdWUpCit7CisgICAgZnJlZURhdGEoKTsKKyAgICB0eXBlID0gTlBWYXJpYW50VHlwZV9PYmpl
Y3Q7CisgICAgdmFsdWUub2JqZWN0VmFsdWUgPSBXZWJCaW5kaW5nczo6cmV0YWluT2JqZWN0KG5l
d1ZhbHVlKTsKK30KKworc3RyaW5nIENwcFZhcmlhbnQ6OnRvU3RyaW5nKCkgY29uc3QKK3sKKyAg
ICBBU1NFUlQoaXNTdHJpbmcoKSk7CisgICAgcmV0dXJuIHN0cmluZyh2YWx1ZS5zdHJpbmdWYWx1
ZS5VVEY4Q2hhcmFjdGVycywKKyAgICAgICAgICAgICAgICAgIHZhbHVlLnN0cmluZ1ZhbHVlLlVU
RjhMZW5ndGgpOworfQorCitpbnQzMl90IENwcFZhcmlhbnQ6OnRvSW50MzIoKSBjb25zdAorewor
ICAgIGlmIChpc0ludDMyKCkpCisgICAgICAgIHJldHVybiB2YWx1ZS5pbnRWYWx1ZTsKKyAgICBp
ZiAoaXNEb3VibGUoKSkKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludDMyX3Q+KHZhbHVl
LmRvdWJsZVZhbHVlKTsKKyAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4gMDsK
K30KKworZG91YmxlIENwcFZhcmlhbnQ6OnRvRG91YmxlKCkgY29uc3QKK3sKKyAgICBpZiAoaXNJ
bnQzMigpKQorICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8ZG91YmxlPih2YWx1ZS5pbnRWYWx1
ZSk7CisgICAgaWYgKGlzRG91YmxlKCkpCisgICAgICAgIHJldHVybiB2YWx1ZS5kb3VibGVWYWx1
ZTsKKyAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4gMDsKK30KKworYm9vbCBD
cHBWYXJpYW50Ojp0b0Jvb2xlYW4oKSBjb25zdAoreworICAgIEFTU0VSVChpc0Jvb2woKSk7Cisg
ICAgcmV0dXJuIHZhbHVlLmJvb2xWYWx1ZTsKK30KKworVmVjdG9yPHN0cmluZz4gQ3BwVmFyaWFu
dDo6dG9TdHJpbmdWZWN0b3IoKSBjb25zdAoreworCisgICAgQVNTRVJUKGlzT2JqZWN0KCkpOwor
ICAgIFZlY3RvcjxzdHJpbmc+IHN0cmluZ1ZlY3RvcjsKKyAgICBOUE9iamVjdCogbnBWYWx1ZSA9
IHZhbHVlLm9iamVjdFZhbHVlOworICAgIE5QSWRlbnRpZmllciBsZW5ndGhJZCA9IFdlYkJpbmRp
bmdzOjpnZXRTdHJpbmdJZGVudGlmaWVyKCJsZW5ndGgiKTsKKworICAgIGlmICghV2ViQmluZGlu
Z3M6Omhhc1Byb3BlcnR5KDAsIG5wVmFsdWUsIGxlbmd0aElkKSkKKyAgICAgICAgcmV0dXJuIHN0
cmluZ1ZlY3RvcjsKKworICAgIE5QVmFyaWFudCBsZW5ndGhWYWx1ZTsKKyAgICBpZiAoIVdlYkJp
bmRpbmdzOjpnZXRQcm9wZXJ0eSgwLCBucFZhbHVlLCBsZW5ndGhJZCwgJmxlbmd0aFZhbHVlKSkK
KyAgICAgICAgcmV0dXJuIHN0cmluZ1ZlY3RvcjsKKworICAgIGludCBsZW5ndGggPSAwOworICAg
IC8vIFRoZSBsZW5ndGggaXMgYSBkb3VibGUgaW4gc29tZSBjYXNlcy4KKyAgICBpZiAoTlBWQVJJ
QU5UX0lTX0RPVUJMRShsZW5ndGhWYWx1ZSkpCisgICAgICAgIGxlbmd0aCA9IHN0YXRpY19jYXN0
PGludD4oTlBWQVJJQU5UX1RPX0RPVUJMRShsZW5ndGhWYWx1ZSkpOworICAgIGVsc2UgaWYgKE5Q
VkFSSUFOVF9JU19JTlQzMihsZW5ndGhWYWx1ZSkpCisgICAgICAgIGxlbmd0aCA9IE5QVkFSSUFO
VF9UT19JTlQzMihsZW5ndGhWYWx1ZSk7CisgICAgV2ViQmluZGluZ3M6OnJlbGVhc2VWYXJpYW50
VmFsdWUoJmxlbmd0aFZhbHVlKTsKKworICAgIC8vIEZvciBzYW5pdHksIG9ubHkgYWxsb3cgMTAw
IGl0ZW1zLgorICAgIGxlbmd0aCA9IG1pbigxMDAsIGxlbmd0aCk7CisgICAgZm9yIChpbnQgaSA9
IDA7IGkgPCBsZW5ndGg7ICsraSkgeworICAgICAgICAvLyBHZXQgZWFjaCBvZiB0aGUgaXRlbXMu
CisgICAgICAgIHN0cmluZyBpbmRleCA9IFN0cmluZ1ByaW50ZigiJWQiLCBpKTsKKyAgICAgICAg
TlBJZGVudGlmaWVyIGluZGV4SWQgPSBXZWJCaW5kaW5nczo6Z2V0U3RyaW5nSWRlbnRpZmllcihp
bmRleC5jX3N0cigpKTsKKyAgICAgICAgaWYgKCFXZWJCaW5kaW5nczo6aGFzUHJvcGVydHkoMCwg
bnBWYWx1ZSwgaW5kZXhJZCkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgTlBWYXJp
YW50IGluZGV4VmFsdWU7CisgICAgICAgIGlmICghV2ViQmluZGluZ3M6OmdldFByb3BlcnR5KDAs
IG5wVmFsdWUsIGluZGV4SWQsICZpbmRleFZhbHVlKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOwor
ICAgICAgICBpZiAoTlBWQVJJQU5UX0lTX1NUUklORyhpbmRleFZhbHVlKSkgeworICAgICAgICAg
ICAgc3RyaW5nIGl0ZW0oTlBWQVJJQU5UX1RPX1NUUklORyhpbmRleFZhbHVlKS5VVEY4Q2hhcmFj
dGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgIE5QVkFSSUFOVF9UT19TVFJJTkcoaW5kZXhW
YWx1ZSkuVVRGOExlbmd0aCk7CisgICAgICAgICAgICBzdHJpbmdWZWN0b3IuYXBwZW5kKGl0ZW0p
OworICAgICAgICB9CisgICAgICAgIFdlYkJpbmRpbmdzOjpyZWxlYXNlVmFyaWFudFZhbHVlKCZp
bmRleFZhbHVlKTsKKyAgICB9CisgICAgcmV0dXJuIHN0cmluZ1ZlY3RvcjsKK30KKworYm9vbCBD
cHBWYXJpYW50OjppbnZva2UoY29uc3Qgc3RyaW5nJiBtZXRob2QsIGNvbnN0IENwcFZhcmlhbnQq
IGFyZ3VtZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFyZ3VtZW50Q291
bnQsIENwcFZhcmlhbnQmIHJlc3VsdCkgY29uc3QKK3sKKyAgICBBU1NFUlQoaXNPYmplY3QoKSk7
CisgICAgTlBJZGVudGlmaWVyIG1ldGhvZE5hbWUgPSBXZWJCaW5kaW5nczo6Z2V0U3RyaW5nSWRl
bnRpZmllcihtZXRob2QuY19zdHIoKSk7CisgICAgTlBPYmplY3QqIG5wT2JqZWN0ID0gdmFsdWUu
b2JqZWN0VmFsdWU7CisgICAgaWYgKCFXZWJCaW5kaW5nczo6aGFzTWV0aG9kKDAsIG5wT2JqZWN0
LCBtZXRob2ROYW1lKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIE5QVmFyaWFudCByOwor
ICAgIGJvb2wgc3RhdHVzID0gV2ViQmluZGluZ3M6Omludm9rZSgwLCBucE9iamVjdCwgbWV0aG9k
TmFtZSwgYXJndW1lbnRzLCBhcmd1bWVudENvdW50LCAmcik7CisgICAgcmVzdWx0LnNldChyKTsK
KyAgICByZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvV2ViS2l0VG9vbHMvRHVtcFJlbmRl
clRyZWUvY2hyb21pdW0vQ3BwVmFyaWFudC5oIGIvV2ViS2l0VG9vbHMvRHVtcFJlbmRlclRyZWUv
Y2hyb21pdW0vQ3BwVmFyaWFudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAu
LmM1ZDA5MGEKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJLaXRUb29scy9EdW1wUmVuZGVyVHJlZS9j
aHJvbWl1bS9DcHBWYXJpYW50LmgKQEAgLTAsMCArMSwxMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTAgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgor
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3Ry
aWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRo
ZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9y
IHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQg
c3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAq
ICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVP
UlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworLyoKKyAgVGhp
cyBmaWxlIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBmb3IgQ3BwVmFyaWFudCwgYSB0eXBlIHVz
ZWQgYnkgQysrIGNsYXNzZXMKKyAgdGhhdCBhcmUgdG8gYmUgYm91bmQgdG8gSmF2YVNjcmlwdCBv
YmplY3RzLgorCisgIENwcFZhcmlhbnQgZXhpc3RzIHByaW1hcmlseSBhcyBhbiBpbnRlcmZhY2Ug
YmV0d2VlbiBDKysgY2FsbGVycyBhbmQgdGhlCisgIGNvcnJlc3BvbmRpbmcgTlBWYXJpYW50IHR5
cGUuICBDcHBWYXJpYW50IGFsc28gcHJvdmlkZXMgYSBudW1iZXIgb2YKKyAgY29udmVuaWVuY2Ug
Y29uc3RydWN0b3JzIGFuZCBhY2Nlc3NvcnMsIHNvIHRoYXQgdGhlIE5QVmFyaWFudFR5cGUgdmFs
dWVzCisgIGRvbid0IG5lZWQgdG8gYmUgZXhwb3NlZCwgYW5kIGEgZGVzdHJ1Y3RvciB0byBmcmVl
IGFueSBtZW1vcnkgYWxsb2NhdGVkIGZvcgorICBzdHJpbmcgdmFsdWVzLgorKi8KKworI2lmbmRl
ZiBDcHBWYXJpYW50X2gKKyNkZWZpbmUgQ3BwVmFyaWFudF9oCisKKyNpbmNsdWRlICJiYXNlL2Jh
c2ljdHlwZXMuaCIKKyNpbmNsdWRlICJwdWJsaWMvV2ViQmluZGluZ3MuaCIKKyNpbmNsdWRlIDxz
dHJpbmc+CisjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgorCitjbGFzcyBDcHBWYXJpYW50IDogcHVi
bGljIE5QVmFyaWFudCB7CitwdWJsaWM6CisgICAgQ3BwVmFyaWFudCgpOworICAgIH5DcHBWYXJp
YW50KCk7CisgICAgdm9pZCBzZXROdWxsKCk7CisgICAgdm9pZCBzZXQoYm9vbCk7CisgICAgdm9p
ZCBzZXQoaW50MzJfdCk7CisgICAgdm9pZCBzZXQoZG91YmxlKTsKKworICAgIC8vIE5vdGUgdGhh
dCBzZXR0aW5nIGEgQ3BwVmFyaWFudCB0byBhIHN0cmluZyB2YWx1ZSBpbnZvbHZlcyBjb3B5aW5n
IHRoZQorICAgIC8vIHN0cmluZyBkYXRhLCB3aGljaCBtdXN0IGJlIGZyZWVkIHdpdGggYSBjYWxs
IHRvIGZyZWVEYXRhKCkgd2hlbiB0aGUKKyAgICAvLyBDcHBWYXJpYW50IGlzIHNldCB0byBhIGRp
ZmZlcmVudCB2YWx1ZSBvciBpcyBubyBsb25nZXIgbmVlZGVkLiAgTm9ybWFsbHkKKyAgICAvLyB0
aGlzIGlzIGhhbmRsZWQgYnkgdGhlIG90aGVyIHNldCgpIG1ldGhvZHMgYW5kIGJ5IHRoZSBkZXN0
cnVjdG9yLgorICAgIHZvaWQgc2V0KGNvbnN0IGNoYXIqKTsgLy8gTXVzdCBiZSBhIG51bGwtdGVy
bWluYXRlZCBzdHJpbmcuCisgICAgdm9pZCBzZXQoY29uc3Qgc3RkOjpzdHJpbmcmKTsKKyAgICB2
b2lkIHNldChjb25zdCBOUFN0cmluZyYpOworICAgIHZvaWQgc2V0KGNvbnN0IE5QVmFyaWFudCYp
OworCisgICAgLy8gTm90ZSB0aGF0IHNldHRpbmcgYSBDcHBWYXJpYW50IHRvIGFuIE5QT2JqZWN0
IGludm9sdmVzIHJlZi1jb3VudGluZworICAgIC8vIHRoZSBhY3R1YWwgb2JqZWN0LiBmcmVlRGF0
YSgpIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBpZiB0aGUgQ3BwVmFyaWFudAorICAgIC8vIGlzIG5v
IGxvbmdlciBuZWVkZWQuIFRoZSBvdGhlciBzZXQoKSBtZXRob2RzIGhhbmRsZSB0aGlzIGludGVy
bmFsbHkuCisgICAgLy8gQWxzbywgdGhlIG9iamVjdCdzIE5QQ2xhc3MgaXMgZXhwZWN0ZWQgdG8g
YmUgYSBzdGF0aWMgb2JqZWN0OiBuZWl0aGVyCisgICAgLy8gdGhlIE5QIHJ1bnRpbWUgbm9yIENw
cFZhcmlhbnQgd2lsbCBldmVyIGZyZWUgaXQuCisgICAgdm9pZCBzZXQoTlBPYmplY3QqX3ZhbHVl
KTsKKworICAgIC8vIFRoZXNlIHRocmVlIG1ldGhvZHMgYWxsIHBlcmZvcm0gZGVlcCBjb3BpZXMg
b2YgYW55IHN0cmluZyBkYXRhLiAgVGhpcworICAgIC8vIGFsbG93cyBsb2NhbCBDcHBWYXJpYW50
cyB0byBiZSByZWxlYXNlZCBieSB0aGUgZGVzdHJ1Y3RvciB3aXRob3V0CisgICAgLy8gY29ycnVw
dGluZyB0aGVpciBzb3VyY2VzLiBJbiBwZXJmb3JtYW5jZS1jcml0aWNhbCBjb2RlLCBvciB3aGVu
IHN0cmluZ3MKKyAgICAvLyBhcmUgdmVyeSBsb25nLCBhdm9pZCBjcmVhdGluZyBuZXcgQ3BwVmFy
aWFudHMuCisgICAgLy8gSW4gY2FzZSBvZiBOUE9iamVjdCBhcyB0aGUgZGF0YSwgdGhlIGNvcHlp
bmcgaW52b2x2ZXMgcmVmLWNvdW50aW5nCisgICAgLy8gYXMgb3Bwb3NlZCB0byBkZWVwLWNvcHlp
bmcuIFRoZSByZWYtY291bnRpbmcgZW5zdXJlcyB0aGF0IHNvdXJjZXMgZG9uJ3QKKyAgICAvLyBn
ZXQgY29ycnVwdGVkIHdoZW4gdGhlIGNvcGllcyBnZXQgZGVzdHJveWVkLgorICAgIHZvaWQgY29w
eVRvTlBWYXJpYW50KE5QVmFyaWFudCogcmVzdWx0KSBjb25zdDsKKyAgICBDcHBWYXJpYW50JiBv
cGVyYXRvcj0oY29uc3QgQ3BwVmFyaWFudCYgb3JpZ2luYWwpOworICAgIENwcFZhcmlhbnQoY29u
c3QgQ3BwVmFyaWFudCYgb3JpZ2luYWwpOworCisgICAgLy8gQ2FsbHMgTlBOX1JlbGVhc2VWYXJp
YW50VmFsdWUsIHdoaWNoIGZyZWVzIGFueSBzdHJpbmcgZGF0YQorICAgIC8vIGhlbGQgYnkgdGhl
IG9iamVjdCBhbmQgc2V0cyBpdHMgdHlwZSB0byBudWxsLgorICAgIC8vIEluIGNhc2Ugb2YgTlBP
YmplY3QsIHRoZSBOUE5fUmVsZWFzZVZhcmlhbnRWYWx1ZSBkZWNyZW1lbnRzCisgICAgLy8gdGhl
IHJlZi1jb3VudCAocmVsZWFzZXMgd2hlbiByZWYtY291bnQgYmVjb21lcyAwKQorICAgIHZvaWQg
ZnJlZURhdGEoKTsKKworICAgIC8vIENvbXBhcmVzIHRoaXMgQ3BwVmFyaWFudCdzIHR5cGUgYW5k
IHZhbHVlIHRvIGFub3RoZXIncy4gIFRoZXkgbXVzdCBiZQorICAgIC8vIGlkZW50aWNhbCBpbiBi
b3RoIHR5cGUgYW5kIHZhbHVlIHRvIGJlIGNvbnNpZGVyZWQgZXF1YWwuICBGb3Igc3RyaW5nIGFu
ZAorICAgIC8vIG9iamVjdCB0eXBlcywgYSBkZWVwIGNvbXBhcmlzb24gaXMgcGVyZm9ybWVkOyB0
aGF0IGlzLCB0aGUgY29udGVudHMgb2YgdGhlCisgICAgLy8gc3RyaW5ncywgb3IgdGhlIGNsYXNz
ZXMgYW5kIHJlZmNvdW50cyBvZiB0aGUgb2JqZWN0cywgbXVzdCBiZSB0aGUgc2FtZSwKKyAgICAv
LyBidXQgdGhleSBuZWVkIG5vdCBiZSB0aGUgc2FtZSBwb2ludGVycy4KKyAgICBib29sIGlzRXF1
YWwoY29uc3QgQ3BwVmFyaWFudCYpIGNvbnN0OworCisgICAgLy8gVGhlIHZhbHVlIG9mIGEgQ3Bw
VmFyaWFudCBtYXkgYmUgcmVhZCBkaXJlY3RseSBmcm9tIGl0cyBOUFZhcmlhbnQgKGJ1dAorICAg
IC8vIHNob3VsZCBvbmx5IGJlIHNldCB1c2luZyBvbmUgb2YgdGhlIHNldCgpIG1ldGhvZHMgYWJv
dmUpLiBBbHRob3VnaCB0aGUKKyAgICAvLyB0eXBlIG9mIGEgQ3BwVmFyaWFudCBpcyBsaWtld2lz
ZSBwdWJsaWMsIGl0IGNhbiBiZSBhY2Nlc3NlZCB0aHJvdWdoIHRoZXNlCisgICAgLy8gZnVuY3Rp
b25zIHJhdGhlciB0aGFuIGRpcmVjdGx5IGlmIGEgY2FsbGVyIHdpc2hlcyB0byBhdm9pZCBkZXBl
bmRlbmNlIG9uCisgICAgLy8gdGhlIE5QVmFyaWFudFR5cGUgdmFsdWVzLgorICAgIGJvb2wgaXNC
b29sKCkgY29uc3QgeyByZXR1cm4gKHR5cGUgPT0gTlBWYXJpYW50VHlwZV9Cb29sKTsgfQorICAg
IGJvb2wgaXNJbnQzMigpIGNvbnN0IHsgcmV0dXJuICh0eXBlID09IE5QVmFyaWFudFR5cGVfSW50
MzIpOyB9CisgICAgYm9vbCBpc0RvdWJsZSgpIGNvbnN0IHsgcmV0dXJuICh0eXBlID09IE5QVmFy
aWFudFR5cGVfRG91YmxlKTsgfQorICAgIGJvb2wgaXNOdW1iZXIoKSBjb25zdCB7IHJldHVybiAo
aXNJbnQzMigpIHx8IGlzRG91YmxlKCkpOyB9CisgICAgYm9vbCBpc1N0cmluZygpIGNvbnN0IHsg
cmV0dXJuICh0eXBlID09IE5QVmFyaWFudFR5cGVfU3RyaW5nKTsgfQorICAgIGJvb2wgaXNWb2lk
KCkgY29uc3QgeyByZXR1cm4gKHR5cGUgPT0gTlBWYXJpYW50VHlwZV9Wb2lkKTsgfQorICAgIGJv
b2wgaXNOdWxsKCkgY29uc3QgeyByZXR1cm4gKHR5cGUgPT0gTlBWYXJpYW50VHlwZV9OdWxsKTsg
fQorICAgIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJuIChpc1ZvaWQoKSB8fCBpc051bGwo
KSk7IH0KKyAgICBib29sIGlzT2JqZWN0KCkgY29uc3QgeyByZXR1cm4gKHR5cGUgPT0gTlBWYXJp
YW50VHlwZV9PYmplY3QpOyB9CisKKyAgICAvLyBDb252ZXJ0ZXJzLiAgVGhlIENwcFZhcmlhbnQg
bXVzdCBiZSBvZiBhIHR5cGUgY29udmVydGlibGUgdG8gdGhlc2UgdmFsdWVzLgorICAgIC8vIEZv
ciBleGFtcGxlLCB0b0ludDMyKCkgd29ya3Mgb25seSBpZiBpc051bWJlcigpIGlzIHRydWUuCisg
ICAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdDsKKyAgICBpbnQzMl90IHRvSW50MzIoKSBj
b25zdDsKKyAgICBkb3VibGUgdG9Eb3VibGUoKSBjb25zdDsKKyAgICBib29sIHRvQm9vbGVhbigp
IGNvbnN0OworICAgIC8vIFJldHVybnMgYSB2ZWN0b3Igb2Ygc3RyaW5ncyBmb3IgdGhlIHNwZWNp
ZmllZCBhcmd1bWVudC4gVGhpcyBpcyB1c2VmdWwKKyAgICAvLyBmb3IgY29udmVydGluZyBhIEph
dmFTY3JpcHQgYXJyYXkgb2Ygc3RyaW5ncyBpbnRvIGEgdmVjdG9yIG9mIHN0cmluZ3MuCisgICAg
VmVjdG9yPHN0ZDo6c3RyaW5nPiB0b1N0cmluZ1ZlY3RvcigpIGNvbnN0OworCisgICAgLy8gSW52
b2tlIG1ldGhvZCBvZiB0aGUgZ2l2ZW4gbmFtZSBvbiBhbiBvYmplY3Qgd2l0aCB0aGUgc3VwcGxp
ZWQgYXJndW1lbnRzLgorICAgIC8vIFRoZSBmaXJzdCBhcmd1bWVudCBzaG91bGQgYmUgdGhlIG9i
amVjdCBvbiB3aGljaCB0aGUgbWV0aG9kIGlzIHRvIGJlCisgICAgLy8gaW52b2tlZC4gIFJldHVy
bnMgd2hldGhlciB0aGUgbWV0aG9kIHdhcyBzdWNjZXNzZnVsbHkgaW52b2tlZC4gIElmIHRoZQor
ICAgIC8vIG1ldGhvZCB3YXMgaW52b2tlZCBzdWNjZXNzZnVsbHksIGFueSByZXR1cm4gdmFsdWUg
aXMgc3RvcmVkIGluIHRoZQorICAgIC8vIENwcFZhcmlhbnQgc3BlY2lmaWVkIGJ5IHJlc3VsdC4K
KyAgICBib29sIGludm9rZShjb25zdCBzdGQ6OnN0cmluZyYsIGNvbnN0IENwcFZhcmlhbnQqIGFy
Z3VtZW50cywKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBhcmd1bWVudENvdW50LCBDcHBWYXJp
YW50JiByZXN1bHQpIGNvbnN0OworfTsKKworI2VuZGlmIC8vIENwcFZhcmlhbnRfaAo=
</data>
<flag name="review"
          id="33112"
          type_id="1"
          status="+"
          setter="dglazkov"
    />
    <flag name="commit-queue"
          id="33113"
          type_id="3"
          status="-"
          setter="dglazkov"
    />
          </attachment>
      

    </bug>

</bugzilla>