<?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>212106</bug_id>
          
          <creation_ts>2020-05-19 13:52:25 -0700</creation_ts>
          <short_desc>[Wasm] Reduce the amount of memory used by the Air register coloring allocator</short_desc>
          <delta_ts>2020-06-17 07:41:18 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>JavaScriptCore</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Michael Saboff">msaboff</reporter>
          <assigned_to name="Michael Saboff">msaboff</assigned_to>
          <cc>ews-watchlist</cc>
    
    <cc>keith_miller</cc>
    
    <cc>mark.lam</cc>
    
    <cc>saam</cc>
    
    <cc>tzagallo</cc>
    
    <cc>webkit-bug-importer</cc>
    
    <cc>ysuzuki</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1654170</commentid>
    <comment_count>0</comment_count>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2020-05-19 13:52:25 -0700</bug_when>
    <thetext>For large Wasm functions, the graph coloring register allocator uses O(N^2) space where N is the number of temps in the Air IR.  We need to reduce the space required by large functions.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1654522</commentid>
    <comment_count>1</comment_count>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2020-05-20 10:53:47 -0700</bug_when>
    <thetext>&lt;rdar://problem/63454420&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1661555</commentid>
    <comment_count>2</comment_count>
      <attachid>401633</attachid>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2020-06-11 04:50:14 -0700</bug_when>
    <thetext>Created attachment 401633
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1661556</commentid>
    <comment_count>3</comment_count>
      <attachid>401634</attachid>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2020-06-11 05:00:08 -0700</bug_when>
    <thetext>Created attachment 401634
Patch with Build Fixes</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1662291</commentid>
    <comment_count>4</comment_count>
      <attachid>401634</attachid>
    <who name="Yusuke Suzuki">ysuzuki</who>
    <bug_when>2020-06-12 19:00:36 -0700</bug_when>
    <thetext>Comment on attachment 401634
Patch with Build Fixes

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

r=me with comment.

&gt; Source/JavaScriptCore/b3/air/AirAllocateRegistersByGraphColoring.cpp:191
&gt; +class InterferenceEdge16Bit {
&gt; +protected:
&gt; +    using IndexType = unsigned;
&gt; +
&gt; +public:
&gt; +    struct InterferenceEdgeHash {
&gt; +        static unsigned hash(const InterferenceEdge16Bit&amp; key) { return key.hash(); }
&gt; +        static bool equal(const InterferenceEdge16Bit&amp; a, const InterferenceEdge16Bit&amp; b) { return a == b; }
&gt; +        static constexpr bool safeToCompareToEmptyOrDeleted = true;
&gt; +    };
&gt; +    typedef SimpleClassHashTraits&lt;InterferenceEdge16Bit&gt; InterferenceEdgeHashTraits;
&gt; +
&gt; +    typedef HashSet&lt;InterferenceEdge16Bit, InterferenceEdgeHash, InterferenceEdgeHashTraits&gt; InterferenceSet;
&gt; +
&gt; +    InterferenceEdge16Bit()
&gt; +    {
&gt; +    }
&gt; +
&gt; +    InterferenceEdge16Bit(IndexType a, IndexType b)
&gt; +    {
&gt; +        ASSERT(a);
&gt; +        ASSERT(b);
&gt; +        ASSERT(a &lt; std::numeric_limits&lt;uint16_t&gt;::max());
&gt; +        ASSERT(b &lt; std::numeric_limits&lt;uint16_t&gt;::max());
&gt; +        ASSERT_WITH_MESSAGE(a != b, &quot;A Tmp can never interfere with itself. Doing so would force it to be the superposition of two registers.&quot;);
&gt; +
&gt; +        if (b &lt; a)
&gt; +            std::swap(a, b);
&gt; +        m_value = static_cast&lt;uint32_t&gt;(a) &lt;&lt; 16 | b;
&gt; +    }
&gt; +
&gt; +    InterferenceEdge16Bit(WTF::HashTableDeletedValueType)
&gt; +        : m_value(std::numeric_limits&lt;uint32_t&gt;::max())
&gt; +    {
&gt; +    }
&gt; +
&gt; +    IndexType first() const
&gt; +    {
&gt; +        return m_value &gt;&gt; 16 &amp; 0xffff;
&gt; +    }
&gt; +
&gt; +    IndexType second() const
&gt; +    {
&gt; +        return m_value &amp; 0xffff;
&gt; +    }
&gt; +
&gt; +    bool operator==(const InterferenceEdge16Bit&amp; other) const
&gt; +    {
&gt; +        return m_value == other.m_value;
&gt; +    }
&gt; +
&gt; +    bool isHashTableDeletedValue() const
&gt; +    {
&gt; +        return *this == InterferenceEdge16Bit(WTF::HashTableDeletedValue);
&gt; +    }
&gt; +
&gt; +    unsigned hash() const
&gt; +    {
&gt; +        return WTF::IntHash&lt;uint32_t&gt;::hash(m_value);
&gt; +    }
&gt; +
&gt; +    void dump(PrintStream&amp; out) const
&gt; +    {
&gt; +        out.print(first(), &quot;&lt;=&gt;&quot;, second());
&gt; +    }
&gt; +
&gt; +private:
&gt; +    uint32_t m_value { 0 };
&gt; +};
&gt; +
&gt; +class InterferenceEdge32Bit {
&gt; +protected:
&gt; +    using IndexType = unsigned;
&gt; +
&gt; +public:
&gt; +    struct InterferenceEdgeHash {
&gt; +        static unsigned hash(const InterferenceEdge32Bit&amp; key) { return key.hash(); }
&gt; +        static bool equal(const InterferenceEdge32Bit&amp; a, const InterferenceEdge32Bit&amp; b) { return a == b; }
&gt; +        static constexpr bool safeToCompareToEmptyOrDeleted = true;
&gt; +    };
&gt; +    typedef SimpleClassHashTraits&lt;InterferenceEdge32Bit&gt; InterferenceEdgeHashTraits;
&gt; +
&gt; +    typedef HashSet&lt;InterferenceEdge32Bit, InterferenceEdgeHash, InterferenceEdgeHashTraits&gt; InterferenceSet;
&gt; +
&gt; +    InterferenceEdge32Bit()
&gt; +    {
&gt; +    }
&gt; +
&gt; +    InterferenceEdge32Bit(IndexType a, IndexType b)
&gt; +    {
&gt; +        ASSERT(a);
&gt; +        ASSERT(b);
&gt; +        ASSERT_WITH_MESSAGE(a != b, &quot;A Tmp can never interfere with itself. Doing so would force it to be the superposition of two registers.&quot;);
&gt; +
&gt; +        if (b &lt; a)
&gt; +            std::swap(a, b);
&gt; +        m_value = static_cast&lt;uint64_t&gt;(a) &lt;&lt; 32 | b;
&gt; +    }
&gt; +
&gt; +    InterferenceEdge32Bit(WTF::HashTableDeletedValueType)
&gt; +        : m_value(std::numeric_limits&lt;uint64_t&gt;::max())
&gt; +    {
&gt; +    }
&gt; +
&gt; +    IndexType first() const
&gt; +    {
&gt; +        return m_value &gt;&gt; 32 &amp; 0xffffffff;
&gt; +    }
&gt; +
&gt; +    IndexType second() const
&gt; +    {
&gt; +        return m_value &amp; 0xffffffff;
&gt; +    }
&gt; +
&gt; +    bool operator==(const InterferenceEdge32Bit&amp; other) const
&gt; +    {
&gt; +        return m_value == other.m_value;
&gt; +    }
&gt; +
&gt; +    bool isHashTableDeletedValue() const
&gt; +    {
&gt; +        return *this == InterferenceEdge32Bit(WTF::HashTableDeletedValue);
&gt; +    }
&gt; +
&gt; +    unsigned hash() const
&gt; +    {
&gt; +        return WTF::IntHash&lt;uint64_t&gt;::hash(m_value);
&gt; +    }
&gt; +
&gt; +    void dump(PrintStream&amp; out) const
&gt; +    {
&gt; +        out.print(first(), &quot;&lt;=&gt;&quot;, second());
&gt; +    }
&gt; +
&gt; +private:
&gt; +    uint64_t m_value { 0 };
&gt; +};

The implementation looks like very similar. Can we make them templatized one? Like,

template&lt;typename IndexType, typename PairStorage&gt;
class InterferenceEdge {
    static_assert(sizeof(IndexType) * 2 == sizeof(PairStorage));
    ...
};

using InferenceEdge16 = InterferenceEdge&lt;uint16_t, uint32_t&gt;;
using InferenceEdge32 = InterferenceEdge&lt;uint32_t, uint64_t&gt;;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1662326</commentid>
    <comment_count>5</comment_count>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2020-06-12 21:23:26 -0700</bug_when>
    <thetext>(In reply to Yusuke Suzuki from comment #4)

Thanks for the review.

&gt; Comment on attachment 401634 [details]
&gt; Patch with Build Fixes
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=401634&amp;action=review
&gt; 
&gt; r=me with comment.
&gt; 
&gt; &gt; Source/JavaScriptCore/b3/air/AirAllocateRegistersByGraphColoring.cpp:191
&gt; &gt; +class InterferenceEdge16Bit {
&gt; &gt; +protected:
&gt; &gt; +    using IndexType = unsigned;
&gt; &gt; +
&gt; &gt; +public:
&gt; &gt; +    struct InterferenceEdgeHash {
&gt; &gt; +        static unsigned hash(const InterferenceEdge16Bit&amp; key) { return key.hash(); }
&gt; &gt; +        static bool equal(const InterferenceEdge16Bit&amp; a, const InterferenceEdge16Bit&amp; b) { return a == b; }
&gt; &gt; +        static constexpr bool safeToCompareToEmptyOrDeleted = true;
&gt; &gt; +    };
&gt; &gt; +    typedef SimpleClassHashTraits&lt;InterferenceEdge16Bit&gt; InterferenceEdgeHashTraits;
&gt; &gt; +
&gt; &gt; +    typedef HashSet&lt;InterferenceEdge16Bit, InterferenceEdgeHash, InterferenceEdgeHashTraits&gt; InterferenceSet;
&gt; &gt; +
&gt; &gt; +    InterferenceEdge16Bit()
&gt; &gt; +    {
&gt; &gt; +    }
&gt; &gt; +
&gt; &gt; +    InterferenceEdge16Bit(IndexType a, IndexType b)
&gt; &gt; +    {
&gt; &gt; +        ASSERT(a);
&gt; &gt; +        ASSERT(b);
&gt; &gt; +        ASSERT(a &lt; std::numeric_limits&lt;uint16_t&gt;::max());
&gt; &gt; +        ASSERT(b &lt; std::numeric_limits&lt;uint16_t&gt;::max());
&gt; &gt; +        ASSERT_WITH_MESSAGE(a != b, &quot;A Tmp can never interfere with itself. Doing so would force it to be the superposition of two registers.&quot;);
&gt; &gt; +
&gt; &gt; +        if (b &lt; a)
&gt; &gt; +            std::swap(a, b);
&gt; &gt; +        m_value = static_cast&lt;uint32_t&gt;(a) &lt;&lt; 16 | b;
&gt; &gt; +    }
&gt; &gt; +
&gt; &gt; +    InterferenceEdge16Bit(WTF::HashTableDeletedValueType)
&gt; &gt; +        : m_value(std::numeric_limits&lt;uint32_t&gt;::max())
&gt; &gt; +    {
&gt; &gt; +    }
&gt; &gt; +
&gt; &gt; +    IndexType first() const
&gt; &gt; +    {
&gt; &gt; +        return m_value &gt;&gt; 16 &amp; 0xffff;
&gt; &gt; +    }
&gt; &gt; +
&gt; &gt; +    IndexType second() const
&gt; &gt; +    {
&gt; &gt; +        return m_value &amp; 0xffff;
&gt; &gt; +    }
&gt; &gt; +
&gt; &gt; +    bool operator==(const InterferenceEdge16Bit&amp; other) const
&gt; &gt; +    {
&gt; &gt; +        return m_value == other.m_value;
&gt; &gt; +    }
&gt; &gt; +
&gt; &gt; +    bool isHashTableDeletedValue() const
&gt; &gt; +    {
&gt; &gt; +        return *this == InterferenceEdge16Bit(WTF::HashTableDeletedValue);
&gt; &gt; +    }
&gt; &gt; +
&gt; &gt; +    unsigned hash() const
&gt; &gt; +    {
&gt; &gt; +        return WTF::IntHash&lt;uint32_t&gt;::hash(m_value);
&gt; &gt; +    }
&gt; &gt; +
&gt; &gt; +    void dump(PrintStream&amp; out) const
&gt; &gt; +    {
&gt; &gt; +        out.print(first(), &quot;&lt;=&gt;&quot;, second());
&gt; &gt; +    }
&gt; &gt; +
&gt; &gt; +private:
&gt; &gt; +    uint32_t m_value { 0 };
&gt; &gt; +};
&gt; &gt; +
&gt; &gt; +class InterferenceEdge32Bit {
&gt; &gt; +protected:
&gt; &gt; +    using IndexType = unsigned;
&gt; &gt; +
&gt; &gt; +public:
&gt; &gt; +    struct InterferenceEdgeHash {
&gt; &gt; +        static unsigned hash(const InterferenceEdge32Bit&amp; key) { return key.hash(); }
&gt; &gt; +        static bool equal(const InterferenceEdge32Bit&amp; a, const InterferenceEdge32Bit&amp; b) { return a == b; }
&gt; &gt; +        static constexpr bool safeToCompareToEmptyOrDeleted = true;
&gt; &gt; +    };
&gt; &gt; +    typedef SimpleClassHashTraits&lt;InterferenceEdge32Bit&gt; InterferenceEdgeHashTraits;
&gt; &gt; +
&gt; &gt; +    typedef HashSet&lt;InterferenceEdge32Bit, InterferenceEdgeHash, InterferenceEdgeHashTraits&gt; InterferenceSet;
&gt; &gt; +
&gt; &gt; +    InterferenceEdge32Bit()
&gt; &gt; +    {
&gt; &gt; +    }
&gt; &gt; +
&gt; &gt; +    InterferenceEdge32Bit(IndexType a, IndexType b)
&gt; &gt; +    {
&gt; &gt; +        ASSERT(a);
&gt; &gt; +        ASSERT(b);
&gt; &gt; +        ASSERT_WITH_MESSAGE(a != b, &quot;A Tmp can never interfere with itself. Doing so would force it to be the superposition of two registers.&quot;);
&gt; &gt; +
&gt; &gt; +        if (b &lt; a)
&gt; &gt; +            std::swap(a, b);
&gt; &gt; +        m_value = static_cast&lt;uint64_t&gt;(a) &lt;&lt; 32 | b;
&gt; &gt; +    }
&gt; &gt; +
&gt; &gt; +    InterferenceEdge32Bit(WTF::HashTableDeletedValueType)
&gt; &gt; +        : m_value(std::numeric_limits&lt;uint64_t&gt;::max())
&gt; &gt; +    {
&gt; &gt; +    }
&gt; &gt; +
&gt; &gt; +    IndexType first() const
&gt; &gt; +    {
&gt; &gt; +        return m_value &gt;&gt; 32 &amp; 0xffffffff;
&gt; &gt; +    }
&gt; &gt; +
&gt; &gt; +    IndexType second() const
&gt; &gt; +    {
&gt; &gt; +        return m_value &amp; 0xffffffff;
&gt; &gt; +    }
&gt; &gt; +
&gt; &gt; +    bool operator==(const InterferenceEdge32Bit&amp; other) const
&gt; &gt; +    {
&gt; &gt; +        return m_value == other.m_value;
&gt; &gt; +    }
&gt; &gt; +
&gt; &gt; +    bool isHashTableDeletedValue() const
&gt; &gt; +    {
&gt; &gt; +        return *this == InterferenceEdge32Bit(WTF::HashTableDeletedValue);
&gt; &gt; +    }
&gt; &gt; +
&gt; &gt; +    unsigned hash() const
&gt; &gt; +    {
&gt; &gt; +        return WTF::IntHash&lt;uint64_t&gt;::hash(m_value);
&gt; &gt; +    }
&gt; &gt; +
&gt; &gt; +    void dump(PrintStream&amp; out) const
&gt; &gt; +    {
&gt; &gt; +        out.print(first(), &quot;&lt;=&gt;&quot;, second());
&gt; &gt; +    }
&gt; &gt; +
&gt; &gt; +private:
&gt; &gt; +    uint64_t m_value { 0 };
&gt; &gt; +};
&gt; 
&gt; The implementation looks like very similar. Can we make them templatized
&gt; one? Like,
&gt; 
&gt; template&lt;typename IndexType, typename PairStorage&gt;
&gt; class InterferenceEdge {
&gt;     static_assert(sizeof(IndexType) * 2 == sizeof(PairStorage));
&gt;     ...
&gt; };
&gt; 
&gt; using InferenceEdge16 = InterferenceEdge&lt;uint16_t, uint32_t&gt;;
&gt; using InferenceEdge32 = InterferenceEdge&lt;uint32_t, uint64_t&gt;;

I did consider templated these classes.  I have 2 minor concerns.

 1. Templated classes could make it a little harder to read given that in addition to the two template parameters, the constants for shifting and masking will need to use derived values.

 2. These types are fed into a templated class hierarchy.  It is already difficult to understand and debug that hierarchy.  Making these templates could make that worse.

I&apos;ll give it a try and see what it looks like.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1663326</commentid>
    <comment_count>6</comment_count>
      <attachid>402060</attachid>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2020-06-16 17:25:30 -0700</bug_when>
    <thetext>Created attachment 402060
Patch for Landing.  Changed to using a templated class.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1663471</commentid>
    <comment_count>7</comment_count>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2020-06-17 07:41:18 -0700</bug_when>
    <thetext>Committed r263146: &lt;https://trac.webkit.org/changeset/263146&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>401633</attachid>
            <date>2020-06-11 04:50:14 -0700</date>
            <delta_ts>2020-06-11 05:00:08 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>212106.patch</filename>
            <type>text/plain</type>
            <size>18107</size>
            <attacher name="Michael Saboff">msaboff</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMjYyOTAwKQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDIyIEBA
CisyMDIwLTA2LTExICBNaWNoYWVsIFNhYm9mZiAgPG1zYWJvZmZAYXBwbGUuY29tPgorCisgICAg
ICAgIFtXYXNtXSBSZWR1Y2UgdGhlIGFtb3VudCBvZiBtZW1vcnkgdXNlZCBieSB0aGUgQWlyIHJl
Z2lzdGVyIGNvbG9yaW5nIGFsbG9jYXRvcgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9y
Zy9zaG93X2J1Zy5jZ2k/aWQ9MjEyMTA2CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChP
T1BTISkuCisKKyAgICAgICAgQWRkZWQgYW4gdW5zaWduZWQgc2hvcnQgdmVyc2lvbiBvZiBJbnRl
cmZlcmVuY2VFZGdlIHRvIGN1dCB0aGUgbWVtb3J5IHVzYWdlIGluIGhhbGYKKyAgICAgICAgZm9y
IGNvZGUgdGhhdCBoYXMgbGVzcyB0aGFuIDJeMTYgdGVtcHMuICBUaHJvdWdoIGluc3RydW1lbnRh
dGlvbiwgbXkgdGVzdGluZworICAgICAgICBzaG93ZWQgdGhhdCBhbG1vc3QgYWxsIGNvbXBpbGF0
aW9ucyB1c2UgdGhlIDE2Yml0IGltcGxlbWVudGF0aW9uLiAgQWx0aG91Z2ggdGhpcworICAgICAg
ICBjaGFuZ2UgaXMgZm9yIGFsbCBCMy9BaXIgY29tcGlsYXRpb25zIGF0IE8yLCBXYXNtIGNvbXBp
bGF0aW9ucyBhcmUgdXNhbGx5IGxhcmdlcgorICAgICAgICBhbmQgdGhlcmVmb3JlIGdldCB0aGUg
Z3JlYXRlc3QgYmVuZWZpdC4KKworICAgICAgICBUaGlzIGFsbG93ZWQgaW5jcmVhc2luZyB0aGUg
ZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIG9wdGlvbiB3ZWJBc3NlbWJseUJCUUZhbGxiYWNrU2l6ZSwK
KyAgICAgICAgd2l0aCBhIHNtYWxsIGluY3JlYXNlIGluIG1lbW9yeSB1c2FnZS4KKworICAgICAg
ICAqIGIzL2Fpci9BaXJBbGxvY2F0ZVJlZ2lzdGVyc0J5R3JhcGhDb2xvcmluZy5jcHA6CisgICAg
ICAgICogcnVudGltZS9PcHRpb25zTGlzdC5oOgorCiAyMDIwLTA2LTEwICBSb3NzIEtpcnNsaW5n
ICA8cm9zcy5raXJzbGluZ0Bzb255LmNvbT4KIAogICAgICAgICBSRUdSRVNTSU9OKHIyNjA2OTcp
OiBbSW50bF0gIm1pc3Npbmcgc2NyaXB0IiBsb2NhbGVzIGxpa2UgemgtVFcgYXJlIG5vIGxvbmdl
ciBtYXBwZWQKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyQWxsb2NhdGVS
ZWdpc3RlcnNCeUdyYXBoQ29sb3JpbmcuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9iMy9haXIvQWlyQWxsb2NhdGVSZWdpc3RlcnNCeUdyYXBoQ29sb3JpbmcuY3BwCShy
ZXZpc2lvbiAyNjI5MDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckFsbG9j
YXRlUmVnaXN0ZXJzQnlHcmFwaENvbG9yaW5nLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMSw1ICsx
LDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxOSBBcHBsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAyMCBBcHBsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTQ3LDkg
KzQ3LDE1MiBAQCBzdGF0aWMgY29uc3RleHByIGJvb2wgZGVidWcgPSBmYWxzZTsKIHN0YXRpYyBj
b25zdGV4cHIgYm9vbCB0cmFjZURlYnVnID0gZmFsc2U7CiBzdGF0aWMgY29uc3RleHByIGJvb2wg
cmVwb3J0U3RhdHMgPSBmYWxzZTsKIAorLy8gSW50ZXJmZXJlbmNlIGVkZ2VzIGFyZSBub3QgZGly
ZWN0ZWQuIEFuIGVkZ2UgYmV0d2VlbiBhbnkgdHdvIFRtcHMgaXMgcmVwcmVzZW50ZWQKKy8vIGJ5
IHRoZSBjb25jYXRlbmF0ZWQgdmFsdWVzIG9mIHRoZSBzbWFsbGVzdCBUbXAgZm9sbG93ZWQgYnkg
dGhlIGJpZ2dlciBUbXAuCisvLyBXZSBoYXZlIGEgMTYgYml0IGFuZCBhIDMyIGJpdCBpbXBsZW1l
bnRhdGlvbiBvZiB0aGlzIGZ1bmN0aW9uYWxpdHkgc2luY2UgdGhlIG51bWJlciBvZiBlbnRyaWVz
CisvLyBpbiBhbiBpbnRlcmZlcmVuY2UgdGFibGUgaXMgTyhOXjIpLiBJbiBtb3N0IGNhc2VzLCB3
ZSB1c2UgdGhlIDE2IGJpdCBpbXBsZW1lbnRhdGlvbiwgdGh1cworLy8gc2F2aW5nIGhhbGYgdGhl
IG1lbW9yeSB3aXRoIGEgc2luZ2xlIGltcGxlbWVudGF0aW9uLgorY2xhc3MgSW50ZXJmZXJlbmNl
RWRnZTE2Qml0IHsKK3Byb3RlY3RlZDoKKyAgICB1c2luZyBJbmRleFR5cGUgPSB1bnNpZ25lZDsK
KworcHVibGljOgorICAgIHN0cnVjdCBJbnRlcmZlcmVuY2VFZGdlSGFzaCB7CisgICAgICAgIHN0
YXRpYyB1bnNpZ25lZCBoYXNoKGNvbnN0IEludGVyZmVyZW5jZUVkZ2UxNkJpdCYga2V5KSB7IHJl
dHVybiBrZXkuaGFzaCgpOyB9CisgICAgICAgIHN0YXRpYyBib29sIGVxdWFsKGNvbnN0IEludGVy
ZmVyZW5jZUVkZ2UxNkJpdCYgYSwgY29uc3QgSW50ZXJmZXJlbmNlRWRnZTE2Qml0JiBiKSB7IHJl
dHVybiBhID09IGI7IH0KKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBib29sIHNhZmVUb0NvbXBh
cmVUb0VtcHR5T3JEZWxldGVkID0gdHJ1ZTsKKyAgICB9OworICAgIHR5cGVkZWYgU2ltcGxlQ2xh
c3NIYXNoVHJhaXRzPEludGVyZmVyZW5jZUVkZ2UxNkJpdD4gSW50ZXJmZXJlbmNlRWRnZUhhc2hU
cmFpdHM7CisKKyAgICB0eXBlZGVmIEhhc2hTZXQ8SW50ZXJmZXJlbmNlRWRnZTE2Qml0LCBJbnRl
cmZlcmVuY2VFZGdlSGFzaCwgSW50ZXJmZXJlbmNlRWRnZUhhc2hUcmFpdHM+IEhhc2hTZXQ7CisK
KyAgICBJbnRlcmZlcmVuY2VFZGdlMTZCaXQoKQorICAgIHsKKyAgICB9CisKKyAgICBJbnRlcmZl
cmVuY2VFZGdlMTZCaXQoSW5kZXhUeXBlIGEsIEluZGV4VHlwZSBiKQorICAgIHsKKyAgICAgICAg
QVNTRVJUKGEpOworICAgICAgICBBU1NFUlQoYik7CisgICAgICAgIEFTU0VSVChhIDwgc3RkOjpu
dW1lcmljX2xpbWl0czx1aW50MTZfdD46Om1heCgpKTsKKyAgICAgICAgQVNTRVJUKGIgPCBzdGQ6
Om51bWVyaWNfbGltaXRzPHVpbnQxNl90Pjo6bWF4KCkpOworICAgICAgICBBU1NFUlRfV0lUSF9N
RVNTQUdFKGEgIT0gYiwgIkEgVG1wIGNhbiBuZXZlciBpbnRlcmZlcmUgd2l0aCBpdHNlbGYuIERv
aW5nIHNvIHdvdWxkIGZvcmNlIGl0IHRvIGJlIHRoZSBzdXBlcnBvc2l0aW9uIG9mIHR3byByZWdp
c3RlcnMuIik7CisKKyAgICAgICAgaWYgKGIgPCBhKQorICAgICAgICAgICAgc3RkOjpzd2FwKGEs
IGIpOworICAgICAgICBtX3ZhbHVlID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGEpIDw8IDE2IHwg
YjsKKyAgICB9CisKKyAgICBJbnRlcmZlcmVuY2VFZGdlMTZCaXQoV1RGOjpIYXNoVGFibGVEZWxl
dGVkVmFsdWVUeXBlKQorICAgICAgICA6IG1fdmFsdWUoc3RkOjpudW1lcmljX2xpbWl0czx1aW50
MzJfdD46Om1heCgpKQorICAgIHsKKyAgICB9CisKKyAgICBJbmRleFR5cGUgZmlyc3QoKSBjb25z
dAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fdmFsdWUgPj4gMTYgJiAweGZmZmY7CisgICAgfQor
CisgICAgSW5kZXhUeXBlIHNlY29uZCgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbV92
YWx1ZSAmIDB4ZmZmZjsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgSW50ZXJm
ZXJlbmNlRWRnZTE2Qml0JiBvdGhlcikgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtX3Zh
bHVlID09IG90aGVyLm1fdmFsdWU7CisgICAgfQorCisgICAgYm9vbCBpc0hhc2hUYWJsZURlbGV0
ZWRWYWx1ZSgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gKnRoaXMgPT0gSW50ZXJmZXJl
bmNlRWRnZTE2Qml0KFdURjo6SGFzaFRhYmxlRGVsZXRlZFZhbHVlKTsKKyAgICB9CisKKyAgICB1
bnNpZ25lZCBoYXNoKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBXVEY6OkludEhhc2g8
dWludDMyX3Q+OjpoYXNoKG1fdmFsdWUpOworICAgIH0KKworICAgIHZvaWQgZHVtcChQcmludFN0
cmVhbSYgb3V0KSBjb25zdAorICAgIHsKKyAgICAgICAgb3V0LnByaW50KGZpcnN0KCksICI8PT4i
LCBzZWNvbmQoKSk7CisgICAgfQorCitwcml2YXRlOgorICAgIHVpbnQzMl90IG1fdmFsdWUgeyAw
IH07Cit9OworCitjbGFzcyBJbnRlcmZlcmVuY2VFZGdlMzJCaXQgeworcHJvdGVjdGVkOgorICAg
IHVzaW5nIEluZGV4VHlwZSA9IHVuc2lnbmVkOworCitwdWJsaWM6CisgICAgc3RydWN0IEludGVy
ZmVyZW5jZUVkZ2VIYXNoIHsKKyAgICAgICAgc3RhdGljIHVuc2lnbmVkIGhhc2goY29uc3QgSW50
ZXJmZXJlbmNlRWRnZTMyQml0JiBrZXkpIHsgcmV0dXJuIGtleS5oYXNoKCk7IH0KKyAgICAgICAg
c3RhdGljIGJvb2wgZXF1YWwoY29uc3QgSW50ZXJmZXJlbmNlRWRnZTMyQml0JiBhLCBjb25zdCBJ
bnRlcmZlcmVuY2VFZGdlMzJCaXQmIGIpIHsgcmV0dXJuIGEgPT0gYjsgfQorICAgICAgICBzdGF0
aWMgY29uc3RleHByIGJvb2wgc2FmZVRvQ29tcGFyZVRvRW1wdHlPckRlbGV0ZWQgPSB0cnVlOwor
ICAgIH07CisgICAgdHlwZWRlZiBTaW1wbGVDbGFzc0hhc2hUcmFpdHM8SW50ZXJmZXJlbmNlRWRn
ZTMyQml0PiBJbnRlcmZlcmVuY2VFZGdlSGFzaFRyYWl0czsKKworICAgIHR5cGVkZWYgSGFzaFNl
dDxJbnRlcmZlcmVuY2VFZGdlMzJCaXQsIEludGVyZmVyZW5jZUVkZ2VIYXNoLCBJbnRlcmZlcmVu
Y2VFZGdlSGFzaFRyYWl0cz4gSGFzaFNldDsKKworICAgIEludGVyZmVyZW5jZUVkZ2UzMkJpdCgp
CisgICAgeworICAgIH0KKworICAgIEludGVyZmVyZW5jZUVkZ2UzMkJpdChJbmRleFR5cGUgYSwg
SW5kZXhUeXBlIGIpCisgICAgeworICAgICAgICBBU1NFUlQoYSk7CisgICAgICAgIEFTU0VSVChi
KTsKKyAgICAgICAgQVNTRVJUX1dJVEhfTUVTU0FHRShhICE9IGIsICJBIFRtcCBjYW4gbmV2ZXIg
aW50ZXJmZXJlIHdpdGggaXRzZWxmLiBEb2luZyBzbyB3b3VsZCBmb3JjZSBpdCB0byBiZSB0aGUg
c3VwZXJwb3NpdGlvbiBvZiB0d28gcmVnaXN0ZXJzLiIpOworCisgICAgICAgIGlmIChiIDwgYSkK
KyAgICAgICAgICAgIHN0ZDo6c3dhcChhLCBiKTsKKyAgICAgICAgbV92YWx1ZSA9IHN0YXRpY19j
YXN0PHVpbnQ2NF90PihhKSA8PCAzMiB8IGI7CisgICAgfQorCisgICAgSW50ZXJmZXJlbmNlRWRn
ZTMyQml0KFdURjo6SGFzaFRhYmxlRGVsZXRlZFZhbHVlVHlwZSkKKyAgICAgICAgOiBtX3ZhbHVl
KHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDY0X3Q+OjptYXgoKSkKKyAgICB7CisgICAgfQorCisg
ICAgSW5kZXhUeXBlIGZpcnN0KCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtX3ZhbHVl
ID4+IDMyICYgMHhmZmZmZmZmZjsKKyAgICB9CisKKyAgICBJbmRleFR5cGUgc2Vjb25kKCkgY29u
c3QKKyAgICB7CisgICAgICAgIHJldHVybiBtX3ZhbHVlICYgMHhmZmZmZmZmZjsKKyAgICB9CisK
KyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgSW50ZXJmZXJlbmNlRWRnZTMyQml0JiBvdGhlcikg
Y29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtX3ZhbHVlID09IG90aGVyLm1fdmFsdWU7Cisg
ICAgfQorCisgICAgYm9vbCBpc0hhc2hUYWJsZURlbGV0ZWRWYWx1ZSgpIGNvbnN0CisgICAgewor
ICAgICAgICByZXR1cm4gKnRoaXMgPT0gSW50ZXJmZXJlbmNlRWRnZTMyQml0KFdURjo6SGFzaFRh
YmxlRGVsZXRlZFZhbHVlKTsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBoYXNoKCkgY29uc3QKKyAg
ICB7CisgICAgICAgIHJldHVybiBXVEY6OkludEhhc2g8dWludDY0X3Q+OjpoYXNoKG1fdmFsdWUp
OworICAgIH0KKworICAgIHZvaWQgZHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25zdAorICAgIHsK
KyAgICAgICAgb3V0LnByaW50KGZpcnN0KCksICI8PT4iLCBzZWNvbmQoKSk7CisgICAgfQorCitw
cml2YXRlOgorICAgIHVpbnQ2NF90IG1fdmFsdWUgeyAwIH07Cit9OworCiAvLyBUaGUgQWJzdHJh
Y3RDb2xvcmluZ0FsbG9jYXRvciBkZWZpbmVzIGFsbCB0aGUgY29kZSB0aGF0IGlzIGluZGVwZW5k
YW50CiAvLyBmcm9tIHRoZSBiYW5rIG9yIHJlZ2lzdGVyIGFuZCBjYW4gYmUgc2hhcmVkIHdoZW4g
YWxsb2NhdGluZyByZWdpc3RlcnMuCi10ZW1wbGF0ZTx0eXBlbmFtZSBJbmRleFR5cGUsIHR5cGVu
YW1lIFRtcE1hcHBlcj4KK3RlbXBsYXRlPHR5cGVuYW1lIEluZGV4VHlwZSwgdHlwZW5hbWUgVG1w
TWFwcGVyLCB0eXBlbmFtZSBJbnRlcmZlcmVuY2VFZGdlVHlwZT4KIGNsYXNzIEFic3RyYWN0Q29s
b3JpbmdBbGxvY2F0b3IgewogcHVibGljOgogICAgIEFic3RyYWN0Q29sb3JpbmdBbGxvY2F0b3Io
Q29kZSYgY29kZSwgY29uc3QgVmVjdG9yPFJlZz4mIHJlZ3NJblByaW9yaXR5T3JkZXIsIEluZGV4
VHlwZSBsYXN0UHJlY29sb3JlZFJlZ2lzdGVySW5kZXgsIHVuc2lnbmVkIHRtcEFycmF5U2l6ZSwg
Y29uc3QgSGFzaFNldDx1bnNpZ25lZD4mIHVuc3BpbGxhYmxlVG1wcywgY29uc3QgVXNlQ291bnRz
PFRtcD4mIHVzZUNvdW50cykKQEAgLTExNSw3ICsyNTgsNyBAQCBwcm90ZWN0ZWQ6CiAgICAgdm9p
ZCBhZGRFZGdlRGlzdGluY3QoSW5kZXhUeXBlIGEsIEluZGV4VHlwZSBiKQogICAgIHsKICAgICAg
ICAgQVNTRVJUKGEgIT0gYik7Ci0gICAgICAgIGJvb2wgaXNOZXdFZGdlID0gYWRkSW50ZXJmZXJl
bmNlRWRnZShJbnRlcmZlcmVuY2VFZGdlKGEsIGIpKTsKKyAgICAgICAgYm9vbCBpc05ld0VkZ2Ug
PSBhZGRJbnRlcmZlcmVuY2VFZGdlKEludGVyZmVyZW5jZUVkZ2VUeXBlKGEsIGIpKTsKICAgICAg
ICAgaWYgKGlzTmV3RWRnZSkgewogICAgICAgICAgICAgaWYgKCFpc1ByZWNvbG9yZWQoYSkpIHsK
ICAgICAgICAgICAgICAgICBBU1NFUlQoIW1fYWRqYWNlbmN5TGlzdFthXS5jb250YWlucyhiKSk7
CkBAIC0xMzQsNyArMjc3LDcgQEAgcHJvdGVjdGVkOgogICAgIGJvb2wgYWRkRWRnZURpc3RpbmN0
V2l0aG91dERlZ3JlZUNoYW5nZShJbmRleFR5cGUgYSwgSW5kZXhUeXBlIGIpCiAgICAgewogICAg
ICAgICBBU1NFUlQoYSAhPSBiKTsKLSAgICAgICAgYm9vbCBpc05ld0VkZ2UgPSBhZGRJbnRlcmZl
cmVuY2VFZGdlKEludGVyZmVyZW5jZUVkZ2UoYSwgYikpOworICAgICAgICBib29sIGlzTmV3RWRn
ZSA9IGFkZEludGVyZmVyZW5jZUVkZ2UoSW50ZXJmZXJlbmNlRWRnZVR5cGUoYSwgYikpOwogICAg
ICAgICBpZiAoaXNOZXdFZGdlKSB7CiAgICAgICAgICAgICBpZiAoIWlzUHJlY29sb3JlZChhKSkg
ewogICAgICAgICAgICAgICAgIEFTU0VSVCghbV9hZGphY2VuY3lMaXN0W2FdLmNvbnRhaW5zKGIp
KTsKQEAgLTI0OSw3ICszOTIsNyBAQCBwcm90ZWN0ZWQ6CiAgICAgICAgICAgICBpZiAoIWlzUHJl
Y29sb3JlZChhZGphY2VudFRtcEluZGV4KQogICAgICAgICAgICAgICAgICYmICFoYXNCZWVuU2lt
cGxpZmllZChhZGphY2VudFRtcEluZGV4KQogICAgICAgICAgICAgICAgICYmIG1fZGVncmVlc1th
ZGphY2VudFRtcEluZGV4XSA+PSByZWdpc3RlckNvdW50KCkKLSAgICAgICAgICAgICAgICAmJiAh
aGFzSW50ZXJmZXJlbmNlRWRnZShJbnRlcmZlcmVuY2VFZGdlKHUsIGFkamFjZW50VG1wSW5kZXgp
KSkKKyAgICAgICAgICAgICAgICAmJiAhaGFzSW50ZXJmZXJlbmNlRWRnZShJbnRlcmZlcmVuY2VF
ZGdlVHlwZSh1LCBhZGphY2VudFRtcEluZGV4KSkpCiAgICAgICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtMzM5LDcgKzQ4Miw3IEBA
IHByb3RlY3RlZDoKICAgICAgICAgQVNTRVJUKG1fc3BpbGxXb3JrbGlzdC5pc0VtcHR5KCkpOwog
CiAgICAgICAgIC8vIFJlY2xhaW0gYXMgbXVjaCBtZW1vcnkgYXMgcG9zc2libGUuCi0gICAgICAg
IG1faW50ZXJmZXJlbmNlRWRnZXMuY2xlYXIoKTsKKyAgICAgICAgY2xlYXJJbnRlcmZlcmVuY2VF
ZGdlcygpOwogCiAgICAgICAgIG1fZGVncmVlcy5jbGVhcigpOwogICAgICAgICBtX21vdmVMaXN0
LmNsZWFyKCk7CkBAIC00MjEsNiArNTY0LDIxIEBAIHByb3RlY3RlZDoKICAgICAgICAgICAgIG1f
Y29sb3JlZFRtcC5jbGVhcigpOwogICAgIH0KIAorICAgIGJvb2wgYWRkSW50ZXJmZXJlbmNlRWRn
ZShJbnRlcmZlcmVuY2VFZGdlVHlwZSBlZGdlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1faW50
ZXJmZXJlbmNlRWRnZXMuYWRkKGVkZ2UpLmlzTmV3RW50cnk7CisgICAgfQorCisgICAgYm9vbCBo
YXNJbnRlcmZlcmVuY2VFZGdlKEludGVyZmVyZW5jZUVkZ2VUeXBlIGVkZ2UpCisgICAgeworICAg
ICAgICByZXR1cm4gbV9pbnRlcmZlcmVuY2VFZGdlcy5jb250YWlucyhlZGdlKTsKKyAgICB9CisK
KyAgICB2b2lkIGNsZWFySW50ZXJmZXJlbmNlRWRnZXMoKQorICAgIHsKKyAgICAgICAgbV9pbnRl
cmZlcmVuY2VFZGdlcy5jbGVhcigpOworICAgIH0KKwogICAgIHZvaWQgZHVtcEludGVyZmVyZW5j
ZUdyYXBoSW5Eb3QoUHJpbnRTdHJlYW0mIG91dCkKICAgICB7CiAgICAgICAgIG91dC5wcmludCgi
Z3JhcGggSW50ZXJmZXJlbmNlR3JhcGggeyBcbiIpOwpAQCAtNDQ0LDg2ICs2MDIsMTAgQEAgcHJv
dGVjdGVkOgogICAgICAgICBvdXQucHJpbnQoIn1cbiIpOwogICAgIH0KIAotICAgIC8vIEludGVy
ZmVyZW5jZSBlZGdlcyBhcmUgbm90IGRpcmVjdGVkLiBBbiBlZGdlIGJldHdlZW4gYW55IHR3byBU
bXBzIGlzIHJlcHJlc2VudGVkCi0gICAgLy8gYnkgdGhlIGNvbmNhdGVuYXRlZCB2YWx1ZXMgb2Yg
dGhlIHNtYWxsZXN0IFRtcCBmb2xsb3dlZCBieSB0aGUgYmlnZ2VyIFRtcC4KLSAgICBjbGFzcyBJ
bnRlcmZlcmVuY2VFZGdlIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIEludGVyZmVyZW5jZUVkZ2Uo
KQotICAgICAgICB7Ci0gICAgICAgIH0KLQotICAgICAgICBJbnRlcmZlcmVuY2VFZGdlKEluZGV4
VHlwZSBhLCBJbmRleFR5cGUgYikKLSAgICAgICAgewotICAgICAgICAgICAgQVNTRVJUKGEpOwot
ICAgICAgICAgICAgQVNTRVJUKGIpOwotICAgICAgICAgICAgQVNTRVJUX1dJVEhfTUVTU0FHRShh
ICE9IGIsICJBIFRtcCBjYW4gbmV2ZXIgaW50ZXJmZXJlIHdpdGggaXRzZWxmLiBEb2luZyBzbyB3
b3VsZCBmb3JjZSBpdCB0byBiZSB0aGUgc3VwZXJwb3NpdGlvbiBvZiB0d28gcmVnaXN0ZXJzLiIp
OwotCi0gICAgICAgICAgICBpZiAoYiA8IGEpCi0gICAgICAgICAgICAgICAgc3RkOjpzd2FwKGEs
IGIpOwotICAgICAgICAgICAgbV92YWx1ZSA9IHN0YXRpY19jYXN0PHVpbnQ2NF90PihhKSA8PCAz
MiB8IGI7Ci0gICAgICAgIH0KLQotICAgICAgICBJbnRlcmZlcmVuY2VFZGdlKFdURjo6SGFzaFRh
YmxlRGVsZXRlZFZhbHVlVHlwZSkKLSAgICAgICAgICAgIDogbV92YWx1ZShzdGQ6Om51bWVyaWNf
bGltaXRzPHVpbnQ2NF90Pjo6bWF4KCkpCi0gICAgICAgIHsKLSAgICAgICAgfQotCi0gICAgICAg
IEluZGV4VHlwZSBmaXJzdCgpIGNvbnN0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBt
X3ZhbHVlID4+IDMyICYgMHhmZmZmZmZmZjsKLSAgICAgICAgfQotCi0gICAgICAgIEluZGV4VHlw
ZSBzZWNvbmQoKSBjb25zdAotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbV92YWx1ZSAm
IDB4ZmZmZmZmZmY7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3Qg
SW50ZXJmZXJlbmNlRWRnZSYgb3RoZXIpIGNvbnN0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJl
dHVybiBtX3ZhbHVlID09IG90aGVyLm1fdmFsdWU7Ci0gICAgICAgIH0KLQotICAgICAgICBib29s
IGlzSGFzaFRhYmxlRGVsZXRlZFZhbHVlKCkgY29uc3QKLSAgICAgICAgewotICAgICAgICAgICAg
cmV0dXJuICp0aGlzID09IEludGVyZmVyZW5jZUVkZ2UoV1RGOjpIYXNoVGFibGVEZWxldGVkVmFs
dWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgdW5zaWduZWQgaGFzaCgpIGNvbnN0Ci0gICAgICAg
IHsKLSAgICAgICAgICAgIHJldHVybiBXVEY6OkludEhhc2g8dWludDY0X3Q+OjpoYXNoKG1fdmFs
dWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBkdW1wKFByaW50U3RyZWFtJiBvdXQpIGNv
bnN0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG91dC5wcmludChmaXJzdCgpLCAiPD0+Iiwgc2Vj
b25kKCkpOwotICAgICAgICB9Ci0KLSAgICBwcml2YXRlOgotICAgICAgICB1aW50NjRfdCBtX3Zh
bHVlIHsgMCB9OwotICAgIH07Ci0KLSAgICBib29sIGFkZEludGVyZmVyZW5jZUVkZ2UoSW50ZXJm
ZXJlbmNlRWRnZSBlZGdlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1faW50ZXJmZXJlbmNlRWRn
ZXMuYWRkKGVkZ2UpLmlzTmV3RW50cnk7Ci0gICAgfQotCi0gICAgYm9vbCBoYXNJbnRlcmZlcmVu
Y2VFZGdlKEludGVyZmVyZW5jZUVkZ2UgZWRnZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX2lu
dGVyZmVyZW5jZUVkZ2VzLmNvbnRhaW5zKGVkZ2UpOwotICAgIH0KLQotICAgIHN0cnVjdCBJbnRl
cmZlcmVuY2VFZGdlSGFzaCB7Ci0gICAgICAgIHN0YXRpYyB1bnNpZ25lZCBoYXNoKGNvbnN0IElu
dGVyZmVyZW5jZUVkZ2UmIGtleSkgeyByZXR1cm4ga2V5Lmhhc2goKTsgfQotICAgICAgICBzdGF0
aWMgYm9vbCBlcXVhbChjb25zdCBJbnRlcmZlcmVuY2VFZGdlJiBhLCBjb25zdCBJbnRlcmZlcmVu
Y2VFZGdlJiBiKSB7IHJldHVybiBhID09IGI7IH0KLSAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBi
b29sIHNhZmVUb0NvbXBhcmVUb0VtcHR5T3JEZWxldGVkID0gdHJ1ZTsKLSAgICB9OwotICAgIHR5
cGVkZWYgU2ltcGxlQ2xhc3NIYXNoVHJhaXRzPEludGVyZmVyZW5jZUVkZ2U+IEludGVyZmVyZW5j
ZUVkZ2VIYXNoVHJhaXRzOwotCiAgICAgVmVjdG9yPFJlZz4gbV9yZWdzSW5Qcmlvcml0eU9yZGVy
OwogICAgIEluZGV4VHlwZSBtX2xhc3RQcmVjb2xvcmVkUmVnaXN0ZXJJbmRleCB7IDAgfTsKIAot
ICAgIC8vIFRoZSBpbnRlcmZlcmVuY2UgZ3JhcGguCi0gICAgSGFzaFNldDxJbnRlcmZlcmVuY2VF
ZGdlLCBJbnRlcmZlcmVuY2VFZGdlSGFzaCwgSW50ZXJmZXJlbmNlRWRnZUhhc2hUcmFpdHM+IG1f
aW50ZXJmZXJlbmNlRWRnZXM7CisgICAgdHlwZW5hbWUgSW50ZXJmZXJlbmNlRWRnZVR5cGU6Okhh
c2hTZXQgbV9pbnRlcmZlcmVuY2VFZGdlczsKIAogICAgIFZlY3RvcjxWZWN0b3I8SW5kZXhUeXBl
LCAwLCBVbnNhZmVWZWN0b3JPdmVyZmxvdywgND4sIDAsIFVuc2FmZVZlY3Rvck92ZXJmbG93PiBt
X2FkamFjZW5jeUxpc3Q7CiAgICAgVmVjdG9yPEluZGV4VHlwZSwgMCwgVW5zYWZlVmVjdG9yT3Zl
cmZsb3c+IG1fZGVncmVlczsKQEAgLTU3Miw5ICs2NTQsOSBAQCBwcm90ZWN0ZWQ6CiAgICAgVmVj
dG9yPFRtcCwgND4gbV9waW5uZWRSZWdzOwogfTsKIAotdGVtcGxhdGUgPHR5cGVuYW1lIEluZGV4
VHlwZSwgdHlwZW5hbWUgVG1wTWFwcGVyPgotY2xhc3MgQnJpZ2dzIDogcHVibGljIEFic3RyYWN0
Q29sb3JpbmdBbGxvY2F0b3I8SW5kZXhUeXBlLCBUbXBNYXBwZXI+IHsKLSAgICB1c2luZyBCYXNl
ID0gQWJzdHJhY3RDb2xvcmluZ0FsbG9jYXRvcjxJbmRleFR5cGUsIFRtcE1hcHBlcj47Cit0ZW1w
bGF0ZSA8dHlwZW5hbWUgSW5kZXhUeXBlLCB0eXBlbmFtZSBUbXBNYXBwZXIsIHR5cGVuYW1lIElu
dGVyZmVyZW5jZUVkZ2U+CitjbGFzcyBCcmlnZ3MgOiBwdWJsaWMgQWJzdHJhY3RDb2xvcmluZ0Fs
bG9jYXRvcjxJbmRleFR5cGUsIFRtcE1hcHBlciwgSW50ZXJmZXJlbmNlRWRnZT4geworICAgIHVz
aW5nIEJhc2UgPSBBYnN0cmFjdENvbG9yaW5nQWxsb2NhdG9yPEluZGV4VHlwZSwgVG1wTWFwcGVy
LCBJbnRlcmZlcmVuY2VFZGdlPjsKIHByb3RlY3RlZDoKICAgICB1c2luZyBCYXNlOjptX2lzT25T
ZWxlY3RTdGFjazsKICAgICB1c2luZyBCYXNlOjptX3NlbGVjdFN0YWNrOwpAQCAtNTk0LDcgKzY3
Niw2IEBAIHByb3RlY3RlZDoKICAgICB1c2luZyBCYXNlOjptX2xhc3RQcmVjb2xvcmVkUmVnaXN0
ZXJJbmRleDsKICAgICB1c2luZyBCYXNlOjptX2NvbG9yZWRUbXA7CiAgICAgdXNpbmcgQmFzZTo6
bV9jb2RlOwotICAgIHVzaW5nIEludGVyZmVyZW5jZUVkZ2UgPSB0eXBlbmFtZSBCYXNlOjpJbnRl
cmZlcmVuY2VFZGdlOwogICAgIHVzaW5nIEJhc2U6Om1fdW5zcGlsbGFibGVUbXBzOwogICAgIHVz
aW5nIEJhc2U6Omhhc0ludGVyZmVyZW5jZUVkZ2U7CiAgICAgdXNpbmcgQmFzZTo6Z2V0QWxpYXM7
CkBAIC02MDUsNyArNjg2LDYgQEAgcHJvdGVjdGVkOgogICAgIHVzaW5nIEJhc2U6OmZvckVhY2hB
ZGphY2VudDsKICAgICB1c2luZyBCYXNlOjpoYXNCZWVuU2ltcGxpZmllZDsKICAgICB1c2luZyBC
YXNlOjphZGRUb1NwaWxsOwotICAgIHVzaW5nIEJhc2U6Om1faW50ZXJmZXJlbmNlRWRnZXM7CiAg
ICAgdXNpbmcgQmFzZTo6YWRkQmlhczsKICAgICB1c2luZyBCYXNlOjptX3Bpbm5lZFJlZ3M7CiAg
ICAgdXNpbmcgQmFzZTo6bV9yZWdzSW5Qcmlvcml0eU9yZGVyOwpAQCAtOTI4LDkgKzEwMDgsOSBA
QCBwcm90ZWN0ZWQ6CiAgICAgTW92ZVNldCBtX3dvcmtsaXN0TW92ZXM7CiB9OwogCi10ZW1wbGF0
ZSA8dHlwZW5hbWUgSW5kZXhUeXBlLCB0eXBlbmFtZSBUbXBNYXBwZXI+Ci1jbGFzcyBJUkMgOiBw
dWJsaWMgQWJzdHJhY3RDb2xvcmluZ0FsbG9jYXRvcjxJbmRleFR5cGUsIFRtcE1hcHBlcj4gewot
ICAgIHVzaW5nIEJhc2UgPSBBYnN0cmFjdENvbG9yaW5nQWxsb2NhdG9yPEluZGV4VHlwZSwgVG1w
TWFwcGVyPjsKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbmRleFR5cGUsIHR5cGVuYW1lIFRtcE1hcHBl
ciwgdHlwZW5hbWUgSW50ZXJmZXJlbmNlRWRnZT4KK2NsYXNzIElSQyA6IHB1YmxpYyBBYnN0cmFj
dENvbG9yaW5nQWxsb2NhdG9yPEluZGV4VHlwZSwgVG1wTWFwcGVyLCBJbnRlcmZlcmVuY2VFZGdl
PiB7CisgICAgdXNpbmcgQmFzZSA9IEFic3RyYWN0Q29sb3JpbmdBbGxvY2F0b3I8SW5kZXhUeXBl
LCBUbXBNYXBwZXIsIEludGVyZmVyZW5jZUVkZ2U+OwogcHJvdGVjdGVkOgogICAgIHVzaW5nIEJh
c2U6Om1faXNPblNlbGVjdFN0YWNrOwogICAgIHVzaW5nIEJhc2U6Om1fc2VsZWN0U3RhY2s7CkBA
IC05NTAsNyArMTAzMCw2IEBAIHByb3RlY3RlZDoKICAgICB1c2luZyBCYXNlOjptX2xhc3RQcmVj
b2xvcmVkUmVnaXN0ZXJJbmRleDsKICAgICB1c2luZyBCYXNlOjptX2NvbG9yZWRUbXA7CiAgICAg
dXNpbmcgQmFzZTo6bV9jb2RlOwotICAgIHVzaW5nIEludGVyZmVyZW5jZUVkZ2UgPSB0eXBlbmFt
ZSBCYXNlOjpJbnRlcmZlcmVuY2VFZGdlOwogICAgIHVzaW5nIEJhc2U6Om1fdW5zcGlsbGFibGVU
bXBzOwogICAgIHVzaW5nIEJhc2U6Omhhc0ludGVyZmVyZW5jZUVkZ2U7CiAgICAgdXNpbmcgQmFz
ZTo6Z2V0QWxpYXM7CkBAIC05NjEsNyArMTA0MCw2IEBAIHByb3RlY3RlZDoKICAgICB1c2luZyBC
YXNlOjpmb3JFYWNoQWRqYWNlbnQ7CiAgICAgdXNpbmcgQmFzZTo6aGFzQmVlblNpbXBsaWZpZWQ7
CiAgICAgdXNpbmcgQmFzZTo6YWRkVG9TcGlsbDsKLSAgICB1c2luZyBCYXNlOjptX2ludGVyZmVy
ZW5jZUVkZ2VzOwogICAgIHVzaW5nIEJhc2U6Om1fYWRqYWNlbmN5TGlzdDsKICAgICB1c2luZyBC
YXNlOjpkdW1wSW50ZXJmZXJlbmNlR3JhcGhJbkRvdDsKICAgICB1c2luZyBCYXNlOjphZGRCaWFz
OwpAQCAtMTM3MSwxMCArMTQ0OSwxMCBAQCBwcm90ZWN0ZWQ6CiB9OwogCiAvLyBUaGlzIHBlcmZv
cm0gYWxsIHRoZSB0YXNrcyB0aGF0IGFyZSBzcGVjaWZpYyB0byBjZXJ0YWluIHJlZ2lzdGVyIHR5
cGUuCi10ZW1wbGF0ZTxCYW5rIGJhbmssIHRlbXBsYXRlPHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xh
c3MgQWxsb2NhdG9yVHlwZT4KLWNsYXNzIENvbG9yaW5nQWxsb2NhdG9yIDogcHVibGljIEFsbG9j
YXRvclR5cGU8dW5zaWduZWQsIEFic29sdXRlVG1wTWFwcGVyPGJhbms+PiB7Cit0ZW1wbGF0ZTxC
YW5rIGJhbmssIHRlbXBsYXRlPHR5cGVuYW1lLCB0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIEFs
bG9jYXRvclR5cGUsIHR5cGVuYW1lIEludGVyZmVyZW5jZUVkZ2VUeXBlPgorY2xhc3MgQ29sb3Jp
bmdBbGxvY2F0b3IgOiBwdWJsaWMgQWxsb2NhdG9yVHlwZTx1bnNpZ25lZCwgQWJzb2x1dGVUbXBN
YXBwZXI8YmFuaz4sIEludGVyZmVyZW5jZUVkZ2VUeXBlPiB7CiAgICAgdXNpbmcgVG1wTWFwcGVy
ID0gQWJzb2x1dGVUbXBNYXBwZXI8YmFuaz47Ci0gICAgdXNpbmcgQmFzZSA9IEFsbG9jYXRvclR5
cGU8dW5zaWduZWQsIFRtcE1hcHBlcj47CisgICAgdXNpbmcgQmFzZSA9IEFsbG9jYXRvclR5cGU8
dW5zaWduZWQsIFRtcE1hcHBlciwgSW50ZXJmZXJlbmNlRWRnZVR5cGU+OwogICAgIHVzaW5nIEJh
c2U6Om1faXNPblNlbGVjdFN0YWNrOwogICAgIHVzaW5nIEJhc2U6Om1fc2VsZWN0U3RhY2s7CiAg
ICAgdXNpbmcgQmFzZTo6bV9zaW1wbGlmeVdvcmtsaXN0OwpAQCAtMTM5MywxMiArMTQ3MSwxMCBA
QCBjbGFzcyBDb2xvcmluZ0FsbG9jYXRvciA6IHB1YmxpYyBBbGxvY2F0CiAgICAgdXNpbmcgQmFz
ZTo6bV9sYXN0UHJlY29sb3JlZFJlZ2lzdGVySW5kZXg7CiAgICAgdXNpbmcgQmFzZTo6bV9jb2xv
cmVkVG1wOwogICAgIHVzaW5nIEJhc2U6Om1fY29kZTsKLSAgICB1c2luZyBJbnRlcmZlcmVuY2VF
ZGdlID0gdHlwZW5hbWUgQmFzZTo6SW50ZXJmZXJlbmNlRWRnZTsKICAgICB1c2luZyBCYXNlOjpt
X3dvcmtsaXN0TW92ZXM7CiAgICAgdXNpbmcgQmFzZTo6aGFzSW50ZXJmZXJlbmNlRWRnZTsKICAg
ICB1c2luZyBCYXNlOjpnZXRBbGlhczsKICAgICB1c2luZyBCYXNlOjphZGRFZGdlOwotICAgIHVz
aW5nIEJhc2U6Om1faW50ZXJmZXJlbmNlRWRnZXM7CiAgICAgdXNpbmcgQmFzZTo6bV9waW5uZWRS
ZWdzOwogICAgIHVzaW5nIEJhc2U6Om1fcmVnc0luUHJpb3JpdHlPcmRlcjsKIApAQCAtMTU1Nyw3
ICsxNjMzLDcgQEAgcHJvdGVjdGVkOgogICAgICAgICB1bnNpZ25lZCBsZWZ0SW5kZXggPSBUbXBN
YXBwZXI6OmFic29sdXRlSW5kZXgobGVmdFRtcCk7CiAgICAgICAgIHVuc2lnbmVkIHJpZ2h0SW5k
ZXggPSBUbXBNYXBwZXI6OmFic29sdXRlSW5kZXgocmlnaHRUbXApOwogCi0gICAgICAgIHJldHVy
biAhaGFzSW50ZXJmZXJlbmNlRWRnZShJbnRlcmZlcmVuY2VFZGdlKGxlZnRJbmRleCwgcmlnaHRJ
bmRleCkpOworICAgICAgICByZXR1cm4gIWhhc0ludGVyZmVyZW5jZUVkZ2UoSW50ZXJmZXJlbmNl
RWRnZVR5cGUobGVmdEluZGV4LCByaWdodEluZGV4KSk7CiAgICAgfQogCiAgICAgdm9pZCBhZGRU
b0xvd1ByaW9yaXR5Q29hbGVzY2luZ0NhbmRpZGF0ZXMoQXJnIGxlZnQsIEFyZyByaWdodCkKQEAg
LTE4NTYsMTEgKzE5MzIsMjEgQEAgcHJpdmF0ZToKICAgICAgICAgICAgIH07CiAKICAgICAgICAg
ICAgIGlmICh1c2VJUkMoKSkgewotICAgICAgICAgICAgICAgIENvbG9yaW5nQWxsb2NhdG9yPGJh
bmssIElSQz4gYWxsb2NhdG9yKG1fY29kZSwgbV90bXBXaWR0aCwgbV91c2VDb3VudHMsIHVuc3Bp
bGxhYmxlVG1wcyk7Ci0gICAgICAgICAgICAgICAgZG9uZSA9IGRvQWxsb2NhdGlvbihhbGxvY2F0
b3IpOworICAgICAgICAgICAgICAgIGlmIChtX2NvZGUubnVtVG1wcyhiYW5rKSA8IHN0ZDo6bnVt
ZXJpY19saW1pdHM8dWludDE2X3Q+OjptYXgoKSkgeworICAgICAgICAgICAgICAgICAgICBDb2xv
cmluZ0FsbG9jYXRvcjxiYW5rLCBJUkMsIEludGVyZmVyZW5jZUVkZ2UxNkJpdD4gYWxsb2NhdG9y
KG1fY29kZSwgbV90bXBXaWR0aCwgbV91c2VDb3VudHMsIHVuc3BpbGxhYmxlVG1wcyk7CisgICAg
ICAgICAgICAgICAgICAgIGRvbmUgPSBkb0FsbG9jYXRpb24oYWxsb2NhdG9yKTsKKyAgICAgICAg
ICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBDb2xvcmluZ0FsbG9jYXRvcjxi
YW5rLCBJUkMsIEludGVyZmVyZW5jZUVkZ2UzMkJpdD4gYWxsb2NhdG9yKG1fY29kZSwgbV90bXBX
aWR0aCwgbV91c2VDb3VudHMsIHVuc3BpbGxhYmxlVG1wcyk7CisgICAgICAgICAgICAgICAgICAg
IGRvbmUgPSBkb0FsbG9jYXRpb24oYWxsb2NhdG9yKTsKKyAgICAgICAgICAgICAgICB9CiAgICAg
ICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIENvbG9yaW5nQWxsb2NhdG9yPGJhbmss
IEJyaWdncz4gYWxsb2NhdG9yKG1fY29kZSwgbV90bXBXaWR0aCwgbV91c2VDb3VudHMsIHVuc3Bp
bGxhYmxlVG1wcyk7Ci0gICAgICAgICAgICAgICAgZG9uZSA9IGRvQWxsb2NhdGlvbihhbGxvY2F0
b3IpOworICAgICAgICAgICAgICAgIGlmIChtX2NvZGUubnVtVG1wcyhiYW5rKSA8IHN0ZDo6bnVt
ZXJpY19saW1pdHM8dWludDE2X3Q+OjptYXgoKSkgeworICAgICAgICAgICAgICAgICAgICBDb2xv
cmluZ0FsbG9jYXRvcjxiYW5rLCBCcmlnZ3MsIEludGVyZmVyZW5jZUVkZ2UxNkJpdD4gYWxsb2Nh
dG9yKG1fY29kZSwgbV90bXBXaWR0aCwgbV91c2VDb3VudHMsIHVuc3BpbGxhYmxlVG1wcyk7Cisg
ICAgICAgICAgICAgICAgICAgIGRvbmUgPSBkb0FsbG9jYXRpb24oYWxsb2NhdG9yKTsKKyAgICAg
ICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBDb2xvcmluZ0FsbG9jYXRv
cjxiYW5rLCBCcmlnZ3MsIEludGVyZmVyZW5jZUVkZ2UzMkJpdD4gYWxsb2NhdG9yKG1fY29kZSwg
bV90bXBXaWR0aCwgbV91c2VDb3VudHMsIHVuc3BpbGxhYmxlVG1wcyk7CisgICAgICAgICAgICAg
ICAgICAgIGRvbmUgPSBkb0FsbG9jYXRpb24oYWxsb2NhdG9yKTsKKyAgICAgICAgICAgICAgICB9
CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgZGF0YUxvZ0xuSWYocmVwb3J0U3Rh
dHMsICJOdW0gaXRlcmF0aW9ucyA9ICIsIG51bUl0ZXJhdGlvbnMsICIgZm9yIGJhbms6ICIsIGJh
bmspOwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvT3B0aW9uc0xpc3QuaAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9PcHRpb25zTGlzdC5o
CShyZXZpc2lvbiAyNjI5MDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9PcHRp
b25zTGlzdC5oCSh3b3JraW5nIGNvcHkpCkBAIC00NTUsNyArNDU1LDcgQEAgY29uc3RleHByIGJv
b2wgZW5hYmxlV2ViQXNzZW1ibHlTdHJlYW1pbgogICAgIHYoVW5zaWduZWQsIHdlYkFzc2VtYmx5
QkJRQWlyT3B0aW1pemF0aW9uTGV2ZWwsIDAsIE5vcm1hbCwgIkFpciBPcHRpbWl6YXRpb24gbGV2
ZWwgZm9yIEJCUSBXZWIgQXNzZW1ibHkgbW9kdWxlIGNvbXBpbGF0aW9ucy4iKSBcCiAgICAgdihV
bnNpZ25lZCwgd2ViQXNzZW1ibHlCQlFCM09wdGltaXphdGlvbkxldmVsLCAxLCBOb3JtYWwsICJC
MyBPcHRpbWl6YXRpb24gbGV2ZWwgZm9yIEJCUSBXZWIgQXNzZW1ibHkgbW9kdWxlIGNvbXBpbGF0
aW9ucy4iKSBcCiAgICAgdihVbnNpZ25lZCwgd2ViQXNzZW1ibHlPTUdPcHRpbWl6YXRpb25MZXZl
bCwgT3B0aW9uczo6ZGVmYXVsdEIzT3B0TGV2ZWwoKSwgTm9ybWFsLCAiQjMgT3B0aW1pemF0aW9u
IGxldmVsIGZvciBPTUcgV2ViIEFzc2VtYmx5IG1vZHVsZSBjb21waWxhdGlvbnMuIikgXAotICAg
IHYoVW5zaWduZWQsIHdlYkFzc2VtYmx5QkJRRmFsbGJhY2tTaXplLCA1MDAwMCwgTm9ybWFsLCAi
TGltaXQgb2YgV2FzbSBmdW5jdGlvbiBzaXplIGFib3ZlIHdoaWNoIHdlIGZhbGxiYWNrIHRvIEJC
USBjb21waWxhdGlvbiBtb2RlLiIpIFwKKyAgICB2KFVuc2lnbmVkLCB3ZWJBc3NlbWJseUJCUUZh
bGxiYWNrU2l6ZSwgNjAwMDAsIE5vcm1hbCwgIkxpbWl0IG9mIFdhc20gZnVuY3Rpb24gc2l6ZSBh
Ym92ZSB3aGljaCB3ZSBmYWxsYmFjayB0byBCQlEgY29tcGlsYXRpb24gbW9kZS4iKSBcCiAgICAg
XAogICAgIHYoQm9vbCwgdXNlQkJRVGllclVwQ2hlY2tzLCB0cnVlLCBOb3JtYWwsICJFbmFibGVz
IHRpZXIgdXAgY2hlY2tzIGZvciBvdXIgQkJRIGNvZGUuIikgXAogICAgIHYoQm9vbCwgdXNlV2Vi
QXNzZW1ibHlPU1IsIHRydWUsIE5vcm1hbCwgbnVsbHB0cikgXAo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>401634</attachid>
            <date>2020-06-11 05:00:08 -0700</date>
            <delta_ts>2020-06-16 17:25:30 -0700</delta_ts>
            <desc>Patch with Build Fixes</desc>
            <filename>212106-2.patch</filename>
            <type>text/plain</type>
            <size>18131</size>
            <attacher name="Michael Saboff">msaboff</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMjYyOTAwKQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDIyIEBA
CisyMDIwLTA2LTExICBNaWNoYWVsIFNhYm9mZiAgPG1zYWJvZmZAYXBwbGUuY29tPgorCisgICAg
ICAgIFtXYXNtXSBSZWR1Y2UgdGhlIGFtb3VudCBvZiBtZW1vcnkgdXNlZCBieSB0aGUgQWlyIHJl
Z2lzdGVyIGNvbG9yaW5nIGFsbG9jYXRvcgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9y
Zy9zaG93X2J1Zy5jZ2k/aWQ9MjEyMTA2CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChP
T1BTISkuCisKKyAgICAgICAgQWRkZWQgYW4gdW5zaWduZWQgc2hvcnQgdmVyc2lvbiBvZiBJbnRl
cmZlcmVuY2VFZGdlIHRvIGN1dCB0aGUgbWVtb3J5IHVzYWdlIGluIGhhbGYKKyAgICAgICAgZm9y
IGNvZGUgdGhhdCBoYXMgbGVzcyB0aGFuIDJeMTYgdGVtcHMuICBUaHJvdWdoIGluc3RydW1lbnRh
dGlvbiwgbXkgdGVzdGluZworICAgICAgICBzaG93ZWQgdGhhdCBhbG1vc3QgYWxsIGNvbXBpbGF0
aW9ucyB1c2UgdGhlIDE2Yml0IGltcGxlbWVudGF0aW9uLiAgQWx0aG91Z2ggdGhpcworICAgICAg
ICBjaGFuZ2UgaXMgZm9yIGFsbCBCMy9BaXIgY29tcGlsYXRpb25zIGF0IE8yLCBXYXNtIGNvbXBp
bGF0aW9ucyBhcmUgdXNhbGx5IGxhcmdlcgorICAgICAgICBhbmQgdGhlcmVmb3JlIGdldCB0aGUg
Z3JlYXRlc3QgYmVuZWZpdC4KKworICAgICAgICBUaGlzIGFsbG93ZWQgaW5jcmVhc2luZyB0aGUg
ZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIG9wdGlvbiB3ZWJBc3NlbWJseUJCUUZhbGxiYWNrU2l6ZSwK
KyAgICAgICAgd2l0aCBhIHNtYWxsIGluY3JlYXNlIGluIG1lbW9yeSB1c2FnZS4KKworICAgICAg
ICAqIGIzL2Fpci9BaXJBbGxvY2F0ZVJlZ2lzdGVyc0J5R3JhcGhDb2xvcmluZy5jcHA6CisgICAg
ICAgICogcnVudGltZS9PcHRpb25zTGlzdC5oOgorCiAyMDIwLTA2LTEwICBSb3NzIEtpcnNsaW5n
ICA8cm9zcy5raXJzbGluZ0Bzb255LmNvbT4KIAogICAgICAgICBSRUdSRVNTSU9OKHIyNjA2OTcp
OiBbSW50bF0gIm1pc3Npbmcgc2NyaXB0IiBsb2NhbGVzIGxpa2UgemgtVFcgYXJlIG5vIGxvbmdl
ciBtYXBwZWQKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyQWxsb2NhdGVS
ZWdpc3RlcnNCeUdyYXBoQ29sb3JpbmcuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9iMy9haXIvQWlyQWxsb2NhdGVSZWdpc3RlcnNCeUdyYXBoQ29sb3JpbmcuY3BwCShy
ZXZpc2lvbiAyNjI5MDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckFsbG9j
YXRlUmVnaXN0ZXJzQnlHcmFwaENvbG9yaW5nLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMSw1ICsx
LDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxOSBBcHBsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAyMCBBcHBsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTQ3LDkg
KzQ3LDE1MiBAQCBzdGF0aWMgY29uc3RleHByIGJvb2wgZGVidWcgPSBmYWxzZTsKIHN0YXRpYyBj
b25zdGV4cHIgYm9vbCB0cmFjZURlYnVnID0gZmFsc2U7CiBzdGF0aWMgY29uc3RleHByIGJvb2wg
cmVwb3J0U3RhdHMgPSBmYWxzZTsKIAorLy8gSW50ZXJmZXJlbmNlIGVkZ2VzIGFyZSBub3QgZGly
ZWN0ZWQuIEFuIGVkZ2UgYmV0d2VlbiBhbnkgdHdvIFRtcHMgaXMgcmVwcmVzZW50ZWQKKy8vIGJ5
IHRoZSBjb25jYXRlbmF0ZWQgdmFsdWVzIG9mIHRoZSBzbWFsbGVzdCBUbXAgZm9sbG93ZWQgYnkg
dGhlIGJpZ2dlciBUbXAuCisvLyBXZSBoYXZlIGEgMTYgYml0IGFuZCBhIDMyIGJpdCBpbXBsZW1l
bnRhdGlvbiBvZiB0aGlzIGZ1bmN0aW9uYWxpdHkgc2luY2UgdGhlIG51bWJlciBvZiBlbnRyaWVz
CisvLyBpbiBhbiBpbnRlcmZlcmVuY2UgdGFibGUgaXMgTyhOXjIpLiBJbiBtb3N0IGNhc2VzLCB3
ZSB1c2UgdGhlIDE2IGJpdCBpbXBsZW1lbnRhdGlvbiwgdGh1cworLy8gc2F2aW5nIGhhbGYgdGhl
IG1lbW9yeSB3aXRoIGEgc2luZ2xlIGltcGxlbWVudGF0aW9uLgorY2xhc3MgSW50ZXJmZXJlbmNl
RWRnZTE2Qml0IHsKK3Byb3RlY3RlZDoKKyAgICB1c2luZyBJbmRleFR5cGUgPSB1bnNpZ25lZDsK
KworcHVibGljOgorICAgIHN0cnVjdCBJbnRlcmZlcmVuY2VFZGdlSGFzaCB7CisgICAgICAgIHN0
YXRpYyB1bnNpZ25lZCBoYXNoKGNvbnN0IEludGVyZmVyZW5jZUVkZ2UxNkJpdCYga2V5KSB7IHJl
dHVybiBrZXkuaGFzaCgpOyB9CisgICAgICAgIHN0YXRpYyBib29sIGVxdWFsKGNvbnN0IEludGVy
ZmVyZW5jZUVkZ2UxNkJpdCYgYSwgY29uc3QgSW50ZXJmZXJlbmNlRWRnZTE2Qml0JiBiKSB7IHJl
dHVybiBhID09IGI7IH0KKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBib29sIHNhZmVUb0NvbXBh
cmVUb0VtcHR5T3JEZWxldGVkID0gdHJ1ZTsKKyAgICB9OworICAgIHR5cGVkZWYgU2ltcGxlQ2xh
c3NIYXNoVHJhaXRzPEludGVyZmVyZW5jZUVkZ2UxNkJpdD4gSW50ZXJmZXJlbmNlRWRnZUhhc2hU
cmFpdHM7CisKKyAgICB0eXBlZGVmIEhhc2hTZXQ8SW50ZXJmZXJlbmNlRWRnZTE2Qml0LCBJbnRl
cmZlcmVuY2VFZGdlSGFzaCwgSW50ZXJmZXJlbmNlRWRnZUhhc2hUcmFpdHM+IEludGVyZmVyZW5j
ZVNldDsKKworICAgIEludGVyZmVyZW5jZUVkZ2UxNkJpdCgpCisgICAgeworICAgIH0KKworICAg
IEludGVyZmVyZW5jZUVkZ2UxNkJpdChJbmRleFR5cGUgYSwgSW5kZXhUeXBlIGIpCisgICAgewor
ICAgICAgICBBU1NFUlQoYSk7CisgICAgICAgIEFTU0VSVChiKTsKKyAgICAgICAgQVNTRVJUKGEg
PCBzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQxNl90Pjo6bWF4KCkpOworICAgICAgICBBU1NFUlQo
YiA8IHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDE2X3Q+OjptYXgoKSk7CisgICAgICAgIEFTU0VS
VF9XSVRIX01FU1NBR0UoYSAhPSBiLCAiQSBUbXAgY2FuIG5ldmVyIGludGVyZmVyZSB3aXRoIGl0
c2VsZi4gRG9pbmcgc28gd291bGQgZm9yY2UgaXQgdG8gYmUgdGhlIHN1cGVycG9zaXRpb24gb2Yg
dHdvIHJlZ2lzdGVycy4iKTsKKworICAgICAgICBpZiAoYiA8IGEpCisgICAgICAgICAgICBzdGQ6
OnN3YXAoYSwgYik7CisgICAgICAgIG1fdmFsdWUgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oYSkg
PDwgMTYgfCBiOworICAgIH0KKworICAgIEludGVyZmVyZW5jZUVkZ2UxNkJpdChXVEY6Okhhc2hU
YWJsZURlbGV0ZWRWYWx1ZVR5cGUpCisgICAgICAgIDogbV92YWx1ZShzdGQ6Om51bWVyaWNfbGlt
aXRzPHVpbnQzMl90Pjo6bWF4KCkpCisgICAgeworICAgIH0KKworICAgIEluZGV4VHlwZSBmaXJz
dCgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbV92YWx1ZSA+PiAxNiAmIDB4ZmZmZjsK
KyAgICB9CisKKyAgICBJbmRleFR5cGUgc2Vjb25kKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJl
dHVybiBtX3ZhbHVlICYgMHhmZmZmOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PShjb25z
dCBJbnRlcmZlcmVuY2VFZGdlMTZCaXQmIG90aGVyKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0
dXJuIG1fdmFsdWUgPT0gb3RoZXIubV92YWx1ZTsKKyAgICB9CisKKyAgICBib29sIGlzSGFzaFRh
YmxlRGVsZXRlZFZhbHVlKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiAqdGhpcyA9PSBJ
bnRlcmZlcmVuY2VFZGdlMTZCaXQoV1RGOjpIYXNoVGFibGVEZWxldGVkVmFsdWUpOworICAgIH0K
KworICAgIHVuc2lnbmVkIGhhc2goKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIFdURjo6
SW50SGFzaDx1aW50MzJfdD46Omhhc2gobV92YWx1ZSk7CisgICAgfQorCisgICAgdm9pZCBkdW1w
KFByaW50U3RyZWFtJiBvdXQpIGNvbnN0CisgICAgeworICAgICAgICBvdXQucHJpbnQoZmlyc3Qo
KSwgIjw9PiIsIHNlY29uZCgpKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgdWludDMyX3QgbV92
YWx1ZSB7IDAgfTsKK307CisKK2NsYXNzIEludGVyZmVyZW5jZUVkZ2UzMkJpdCB7Citwcm90ZWN0
ZWQ6CisgICAgdXNpbmcgSW5kZXhUeXBlID0gdW5zaWduZWQ7CisKK3B1YmxpYzoKKyAgICBzdHJ1
Y3QgSW50ZXJmZXJlbmNlRWRnZUhhc2ggeworICAgICAgICBzdGF0aWMgdW5zaWduZWQgaGFzaChj
b25zdCBJbnRlcmZlcmVuY2VFZGdlMzJCaXQmIGtleSkgeyByZXR1cm4ga2V5Lmhhc2goKTsgfQor
ICAgICAgICBzdGF0aWMgYm9vbCBlcXVhbChjb25zdCBJbnRlcmZlcmVuY2VFZGdlMzJCaXQmIGEs
IGNvbnN0IEludGVyZmVyZW5jZUVkZ2UzMkJpdCYgYikgeyByZXR1cm4gYSA9PSBiOyB9CisgICAg
ICAgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBzYWZlVG9Db21wYXJlVG9FbXB0eU9yRGVsZXRlZCA9
IHRydWU7CisgICAgfTsKKyAgICB0eXBlZGVmIFNpbXBsZUNsYXNzSGFzaFRyYWl0czxJbnRlcmZl
cmVuY2VFZGdlMzJCaXQ+IEludGVyZmVyZW5jZUVkZ2VIYXNoVHJhaXRzOworCisgICAgdHlwZWRl
ZiBIYXNoU2V0PEludGVyZmVyZW5jZUVkZ2UzMkJpdCwgSW50ZXJmZXJlbmNlRWRnZUhhc2gsIElu
dGVyZmVyZW5jZUVkZ2VIYXNoVHJhaXRzPiBJbnRlcmZlcmVuY2VTZXQ7CisKKyAgICBJbnRlcmZl
cmVuY2VFZGdlMzJCaXQoKQorICAgIHsKKyAgICB9CisKKyAgICBJbnRlcmZlcmVuY2VFZGdlMzJC
aXQoSW5kZXhUeXBlIGEsIEluZGV4VHlwZSBiKQorICAgIHsKKyAgICAgICAgQVNTRVJUKGEpOwor
ICAgICAgICBBU1NFUlQoYik7CisgICAgICAgIEFTU0VSVF9XSVRIX01FU1NBR0UoYSAhPSBiLCAi
QSBUbXAgY2FuIG5ldmVyIGludGVyZmVyZSB3aXRoIGl0c2VsZi4gRG9pbmcgc28gd291bGQgZm9y
Y2UgaXQgdG8gYmUgdGhlIHN1cGVycG9zaXRpb24gb2YgdHdvIHJlZ2lzdGVycy4iKTsKKworICAg
ICAgICBpZiAoYiA8IGEpCisgICAgICAgICAgICBzdGQ6OnN3YXAoYSwgYik7CisgICAgICAgIG1f
dmFsdWUgPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4oYSkgPDwgMzIgfCBiOworICAgIH0KKworICAg
IEludGVyZmVyZW5jZUVkZ2UzMkJpdChXVEY6Okhhc2hUYWJsZURlbGV0ZWRWYWx1ZVR5cGUpCisg
ICAgICAgIDogbV92YWx1ZShzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQ2NF90Pjo6bWF4KCkpCisg
ICAgeworICAgIH0KKworICAgIEluZGV4VHlwZSBmaXJzdCgpIGNvbnN0CisgICAgeworICAgICAg
ICByZXR1cm4gbV92YWx1ZSA+PiAzMiAmIDB4ZmZmZmZmZmY7CisgICAgfQorCisgICAgSW5kZXhU
eXBlIHNlY29uZCgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbV92YWx1ZSAmIDB4ZmZm
ZmZmZmY7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEludGVyZmVyZW5jZUVk
Z2UzMkJpdCYgb3RoZXIpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbV92YWx1ZSA9PSBv
dGhlci5tX3ZhbHVlOworICAgIH0KKworICAgIGJvb2wgaXNIYXNoVGFibGVEZWxldGVkVmFsdWUo
KSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuICp0aGlzID09IEludGVyZmVyZW5jZUVkZ2Uz
MkJpdChXVEY6Okhhc2hUYWJsZURlbGV0ZWRWYWx1ZSk7CisgICAgfQorCisgICAgdW5zaWduZWQg
aGFzaCgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gV1RGOjpJbnRIYXNoPHVpbnQ2NF90
Pjo6aGFzaChtX3ZhbHVlKTsKKyAgICB9CisKKyAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mIG91
dCkgY29uc3QKKyAgICB7CisgICAgICAgIG91dC5wcmludChmaXJzdCgpLCAiPD0+Iiwgc2Vjb25k
KCkpOworICAgIH0KKworcHJpdmF0ZToKKyAgICB1aW50NjRfdCBtX3ZhbHVlIHsgMCB9OworfTsK
KwogLy8gVGhlIEFic3RyYWN0Q29sb3JpbmdBbGxvY2F0b3IgZGVmaW5lcyBhbGwgdGhlIGNvZGUg
dGhhdCBpcyBpbmRlcGVuZGFudAogLy8gZnJvbSB0aGUgYmFuayBvciByZWdpc3RlciBhbmQgY2Fu
IGJlIHNoYXJlZCB3aGVuIGFsbG9jYXRpbmcgcmVnaXN0ZXJzLgotdGVtcGxhdGU8dHlwZW5hbWUg
SW5kZXhUeXBlLCB0eXBlbmFtZSBUbXBNYXBwZXI+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBJbmRleFR5
cGUsIHR5cGVuYW1lIFRtcE1hcHBlciwgdHlwZW5hbWUgSW50ZXJmZXJlbmNlRWRnZVR5cGU+CiBj
bGFzcyBBYnN0cmFjdENvbG9yaW5nQWxsb2NhdG9yIHsKIHB1YmxpYzoKICAgICBBYnN0cmFjdENv
bG9yaW5nQWxsb2NhdG9yKENvZGUmIGNvZGUsIGNvbnN0IFZlY3RvcjxSZWc+JiByZWdzSW5Qcmlv
cml0eU9yZGVyLCBJbmRleFR5cGUgbGFzdFByZWNvbG9yZWRSZWdpc3RlckluZGV4LCB1bnNpZ25l
ZCB0bXBBcnJheVNpemUsIGNvbnN0IEhhc2hTZXQ8dW5zaWduZWQ+JiB1bnNwaWxsYWJsZVRtcHMs
IGNvbnN0IFVzZUNvdW50czxUbXA+JiB1c2VDb3VudHMpCkBAIC0xMTUsNyArMjU4LDcgQEAgcHJv
dGVjdGVkOgogICAgIHZvaWQgYWRkRWRnZURpc3RpbmN0KEluZGV4VHlwZSBhLCBJbmRleFR5cGUg
YikKICAgICB7CiAgICAgICAgIEFTU0VSVChhICE9IGIpOwotICAgICAgICBib29sIGlzTmV3RWRn
ZSA9IGFkZEludGVyZmVyZW5jZUVkZ2UoSW50ZXJmZXJlbmNlRWRnZShhLCBiKSk7CisgICAgICAg
IGJvb2wgaXNOZXdFZGdlID0gYWRkSW50ZXJmZXJlbmNlRWRnZShJbnRlcmZlcmVuY2VFZGdlVHlw
ZShhLCBiKSk7CiAgICAgICAgIGlmIChpc05ld0VkZ2UpIHsKICAgICAgICAgICAgIGlmICghaXNQ
cmVjb2xvcmVkKGEpKSB7CiAgICAgICAgICAgICAgICAgQVNTRVJUKCFtX2FkamFjZW5jeUxpc3Rb
YV0uY29udGFpbnMoYikpOwpAQCAtMTM0LDcgKzI3Nyw3IEBAIHByb3RlY3RlZDoKICAgICBib29s
IGFkZEVkZ2VEaXN0aW5jdFdpdGhvdXREZWdyZWVDaGFuZ2UoSW5kZXhUeXBlIGEsIEluZGV4VHlw
ZSBiKQogICAgIHsKICAgICAgICAgQVNTRVJUKGEgIT0gYik7Ci0gICAgICAgIGJvb2wgaXNOZXdF
ZGdlID0gYWRkSW50ZXJmZXJlbmNlRWRnZShJbnRlcmZlcmVuY2VFZGdlKGEsIGIpKTsKKyAgICAg
ICAgYm9vbCBpc05ld0VkZ2UgPSBhZGRJbnRlcmZlcmVuY2VFZGdlKEludGVyZmVyZW5jZUVkZ2VU
eXBlKGEsIGIpKTsKICAgICAgICAgaWYgKGlzTmV3RWRnZSkgewogICAgICAgICAgICAgaWYgKCFp
c1ByZWNvbG9yZWQoYSkpIHsKICAgICAgICAgICAgICAgICBBU1NFUlQoIW1fYWRqYWNlbmN5TGlz
dFthXS5jb250YWlucyhiKSk7CkBAIC0yNDksNyArMzkyLDcgQEAgcHJvdGVjdGVkOgogICAgICAg
ICAgICAgaWYgKCFpc1ByZWNvbG9yZWQoYWRqYWNlbnRUbXBJbmRleCkKICAgICAgICAgICAgICAg
ICAmJiAhaGFzQmVlblNpbXBsaWZpZWQoYWRqYWNlbnRUbXBJbmRleCkKICAgICAgICAgICAgICAg
ICAmJiBtX2RlZ3JlZXNbYWRqYWNlbnRUbXBJbmRleF0gPj0gcmVnaXN0ZXJDb3VudCgpCi0gICAg
ICAgICAgICAgICAgJiYgIWhhc0ludGVyZmVyZW5jZUVkZ2UoSW50ZXJmZXJlbmNlRWRnZSh1LCBh
ZGphY2VudFRtcEluZGV4KSkpCisgICAgICAgICAgICAgICAgJiYgIWhhc0ludGVyZmVyZW5jZUVk
Z2UoSW50ZXJmZXJlbmNlRWRnZVR5cGUodSwgYWRqYWNlbnRUbXBJbmRleCkpKQogICAgICAgICAg
ICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gdHJ1ZTsKQEAg
LTMzOSw3ICs0ODIsNyBAQCBwcm90ZWN0ZWQ6CiAgICAgICAgIEFTU0VSVChtX3NwaWxsV29ya2xp
c3QuaXNFbXB0eSgpKTsKIAogICAgICAgICAvLyBSZWNsYWltIGFzIG11Y2ggbWVtb3J5IGFzIHBv
c3NpYmxlLgotICAgICAgICBtX2ludGVyZmVyZW5jZUVkZ2VzLmNsZWFyKCk7CisgICAgICAgIGNs
ZWFySW50ZXJmZXJlbmNlRWRnZXMoKTsKIAogICAgICAgICBtX2RlZ3JlZXMuY2xlYXIoKTsKICAg
ICAgICAgbV9tb3ZlTGlzdC5jbGVhcigpOwpAQCAtNDIxLDYgKzU2NCwyMSBAQCBwcm90ZWN0ZWQ6
CiAgICAgICAgICAgICBtX2NvbG9yZWRUbXAuY2xlYXIoKTsKICAgICB9CiAKKyAgICBib29sIGFk
ZEludGVyZmVyZW5jZUVkZ2UoSW50ZXJmZXJlbmNlRWRnZVR5cGUgZWRnZSkKKyAgICB7CisgICAg
ICAgIHJldHVybiBtX2ludGVyZmVyZW5jZUVkZ2VzLmFkZChlZGdlKS5pc05ld0VudHJ5OworICAg
IH0KKworICAgIGJvb2wgaGFzSW50ZXJmZXJlbmNlRWRnZShJbnRlcmZlcmVuY2VFZGdlVHlwZSBl
ZGdlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1faW50ZXJmZXJlbmNlRWRnZXMuY29udGFpbnMo
ZWRnZSk7CisgICAgfQorCisgICAgdm9pZCBjbGVhckludGVyZmVyZW5jZUVkZ2VzKCkKKyAgICB7
CisgICAgICAgIG1faW50ZXJmZXJlbmNlRWRnZXMuY2xlYXIoKTsKKyAgICB9CisKICAgICB2b2lk
IGR1bXBJbnRlcmZlcmVuY2VHcmFwaEluRG90KFByaW50U3RyZWFtJiBvdXQpCiAgICAgewogICAg
ICAgICBvdXQucHJpbnQoImdyYXBoIEludGVyZmVyZW5jZUdyYXBoIHsgXG4iKTsKQEAgLTQ0NCw4
NiArNjAyLDEwIEBAIHByb3RlY3RlZDoKICAgICAgICAgb3V0LnByaW50KCJ9XG4iKTsKICAgICB9
CiAKLSAgICAvLyBJbnRlcmZlcmVuY2UgZWRnZXMgYXJlIG5vdCBkaXJlY3RlZC4gQW4gZWRnZSBi
ZXR3ZWVuIGFueSB0d28gVG1wcyBpcyByZXByZXNlbnRlZAotICAgIC8vIGJ5IHRoZSBjb25jYXRl
bmF0ZWQgdmFsdWVzIG9mIHRoZSBzbWFsbGVzdCBUbXAgZm9sbG93ZWQgYnkgdGhlIGJpZ2dlciBU
bXAuCi0gICAgY2xhc3MgSW50ZXJmZXJlbmNlRWRnZSB7Ci0gICAgcHVibGljOgotICAgICAgICBJ
bnRlcmZlcmVuY2VFZGdlKCkKLSAgICAgICAgewotICAgICAgICB9Ci0KLSAgICAgICAgSW50ZXJm
ZXJlbmNlRWRnZShJbmRleFR5cGUgYSwgSW5kZXhUeXBlIGIpCi0gICAgICAgIHsKLSAgICAgICAg
ICAgIEFTU0VSVChhKTsKLSAgICAgICAgICAgIEFTU0VSVChiKTsKLSAgICAgICAgICAgIEFTU0VS
VF9XSVRIX01FU1NBR0UoYSAhPSBiLCAiQSBUbXAgY2FuIG5ldmVyIGludGVyZmVyZSB3aXRoIGl0
c2VsZi4gRG9pbmcgc28gd291bGQgZm9yY2UgaXQgdG8gYmUgdGhlIHN1cGVycG9zaXRpb24gb2Yg
dHdvIHJlZ2lzdGVycy4iKTsKLQotICAgICAgICAgICAgaWYgKGIgPCBhKQotICAgICAgICAgICAg
ICAgIHN0ZDo6c3dhcChhLCBiKTsKLSAgICAgICAgICAgIG1fdmFsdWUgPSBzdGF0aWNfY2FzdDx1
aW50NjRfdD4oYSkgPDwgMzIgfCBiOwotICAgICAgICB9Ci0KLSAgICAgICAgSW50ZXJmZXJlbmNl
RWRnZShXVEY6Okhhc2hUYWJsZURlbGV0ZWRWYWx1ZVR5cGUpCi0gICAgICAgICAgICA6IG1fdmFs
dWUoc3RkOjpudW1lcmljX2xpbWl0czx1aW50NjRfdD46Om1heCgpKQotICAgICAgICB7Ci0gICAg
ICAgIH0KLQotICAgICAgICBJbmRleFR5cGUgZmlyc3QoKSBjb25zdAotICAgICAgICB7Ci0gICAg
ICAgICAgICByZXR1cm4gbV92YWx1ZSA+PiAzMiAmIDB4ZmZmZmZmZmY7Ci0gICAgICAgIH0KLQot
ICAgICAgICBJbmRleFR5cGUgc2Vjb25kKCkgY29uc3QKLSAgICAgICAgewotICAgICAgICAgICAg
cmV0dXJuIG1fdmFsdWUgJiAweGZmZmZmZmZmOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbCBv
cGVyYXRvcj09KGNvbnN0IEludGVyZmVyZW5jZUVkZ2UmIG90aGVyKSBjb25zdAotICAgICAgICB7
Ci0gICAgICAgICAgICByZXR1cm4gbV92YWx1ZSA9PSBvdGhlci5tX3ZhbHVlOwotICAgICAgICB9
Ci0KLSAgICAgICAgYm9vbCBpc0hhc2hUYWJsZURlbGV0ZWRWYWx1ZSgpIGNvbnN0Ci0gICAgICAg
IHsKLSAgICAgICAgICAgIHJldHVybiAqdGhpcyA9PSBJbnRlcmZlcmVuY2VFZGdlKFdURjo6SGFz
aFRhYmxlRGVsZXRlZFZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHVuc2lnbmVkIGhhc2go
KSBjb25zdAotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gV1RGOjpJbnRIYXNoPHVpbnQ2
NF90Pjo6aGFzaChtX3ZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgZHVtcChQcmlu
dFN0cmVhbSYgb3V0KSBjb25zdAotICAgICAgICB7Ci0gICAgICAgICAgICBvdXQucHJpbnQoZmly
c3QoKSwgIjw9PiIsIHNlY29uZCgpKTsKLSAgICAgICAgfQotCi0gICAgcHJpdmF0ZToKLSAgICAg
ICAgdWludDY0X3QgbV92YWx1ZSB7IDAgfTsKLSAgICB9OwotCi0gICAgYm9vbCBhZGRJbnRlcmZl
cmVuY2VFZGdlKEludGVyZmVyZW5jZUVkZ2UgZWRnZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBt
X2ludGVyZmVyZW5jZUVkZ2VzLmFkZChlZGdlKS5pc05ld0VudHJ5OwotICAgIH0KLQotICAgIGJv
b2wgaGFzSW50ZXJmZXJlbmNlRWRnZShJbnRlcmZlcmVuY2VFZGdlIGVkZ2UpCi0gICAgewotICAg
ICAgICByZXR1cm4gbV9pbnRlcmZlcmVuY2VFZGdlcy5jb250YWlucyhlZGdlKTsKLSAgICB9Ci0K
LSAgICBzdHJ1Y3QgSW50ZXJmZXJlbmNlRWRnZUhhc2ggewotICAgICAgICBzdGF0aWMgdW5zaWdu
ZWQgaGFzaChjb25zdCBJbnRlcmZlcmVuY2VFZGdlJiBrZXkpIHsgcmV0dXJuIGtleS5oYXNoKCk7
IH0KLSAgICAgICAgc3RhdGljIGJvb2wgZXF1YWwoY29uc3QgSW50ZXJmZXJlbmNlRWRnZSYgYSwg
Y29uc3QgSW50ZXJmZXJlbmNlRWRnZSYgYikgeyByZXR1cm4gYSA9PSBiOyB9Ci0gICAgICAgIHN0
YXRpYyBjb25zdGV4cHIgYm9vbCBzYWZlVG9Db21wYXJlVG9FbXB0eU9yRGVsZXRlZCA9IHRydWU7
Ci0gICAgfTsKLSAgICB0eXBlZGVmIFNpbXBsZUNsYXNzSGFzaFRyYWl0czxJbnRlcmZlcmVuY2VF
ZGdlPiBJbnRlcmZlcmVuY2VFZGdlSGFzaFRyYWl0czsKLQogICAgIFZlY3RvcjxSZWc+IG1fcmVn
c0luUHJpb3JpdHlPcmRlcjsKICAgICBJbmRleFR5cGUgbV9sYXN0UHJlY29sb3JlZFJlZ2lzdGVy
SW5kZXggeyAwIH07CiAKLSAgICAvLyBUaGUgaW50ZXJmZXJlbmNlIGdyYXBoLgotICAgIEhhc2hT
ZXQ8SW50ZXJmZXJlbmNlRWRnZSwgSW50ZXJmZXJlbmNlRWRnZUhhc2gsIEludGVyZmVyZW5jZUVk
Z2VIYXNoVHJhaXRzPiBtX2ludGVyZmVyZW5jZUVkZ2VzOworICAgIHR5cGVuYW1lIEludGVyZmVy
ZW5jZUVkZ2VUeXBlOjpJbnRlcmZlcmVuY2VTZXQgbV9pbnRlcmZlcmVuY2VFZGdlczsKIAogICAg
IFZlY3RvcjxWZWN0b3I8SW5kZXhUeXBlLCAwLCBVbnNhZmVWZWN0b3JPdmVyZmxvdywgND4sIDAs
IFVuc2FmZVZlY3Rvck92ZXJmbG93PiBtX2FkamFjZW5jeUxpc3Q7CiAgICAgVmVjdG9yPEluZGV4
VHlwZSwgMCwgVW5zYWZlVmVjdG9yT3ZlcmZsb3c+IG1fZGVncmVlczsKQEAgLTU3Miw5ICs2NTQs
OSBAQCBwcm90ZWN0ZWQ6CiAgICAgVmVjdG9yPFRtcCwgND4gbV9waW5uZWRSZWdzOwogfTsKIAot
dGVtcGxhdGUgPHR5cGVuYW1lIEluZGV4VHlwZSwgdHlwZW5hbWUgVG1wTWFwcGVyPgotY2xhc3Mg
QnJpZ2dzIDogcHVibGljIEFic3RyYWN0Q29sb3JpbmdBbGxvY2F0b3I8SW5kZXhUeXBlLCBUbXBN
YXBwZXI+IHsKLSAgICB1c2luZyBCYXNlID0gQWJzdHJhY3RDb2xvcmluZ0FsbG9jYXRvcjxJbmRl
eFR5cGUsIFRtcE1hcHBlcj47Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5kZXhUeXBlLCB0eXBlbmFt
ZSBUbXBNYXBwZXIsIHR5cGVuYW1lIEludGVyZmVyZW5jZUVkZ2U+CitjbGFzcyBCcmlnZ3MgOiBw
dWJsaWMgQWJzdHJhY3RDb2xvcmluZ0FsbG9jYXRvcjxJbmRleFR5cGUsIFRtcE1hcHBlciwgSW50
ZXJmZXJlbmNlRWRnZT4geworICAgIHVzaW5nIEJhc2UgPSBBYnN0cmFjdENvbG9yaW5nQWxsb2Nh
dG9yPEluZGV4VHlwZSwgVG1wTWFwcGVyLCBJbnRlcmZlcmVuY2VFZGdlPjsKIHByb3RlY3RlZDoK
ICAgICB1c2luZyBCYXNlOjptX2lzT25TZWxlY3RTdGFjazsKICAgICB1c2luZyBCYXNlOjptX3Nl
bGVjdFN0YWNrOwpAQCAtNTk0LDcgKzY3Niw2IEBAIHByb3RlY3RlZDoKICAgICB1c2luZyBCYXNl
OjptX2xhc3RQcmVjb2xvcmVkUmVnaXN0ZXJJbmRleDsKICAgICB1c2luZyBCYXNlOjptX2NvbG9y
ZWRUbXA7CiAgICAgdXNpbmcgQmFzZTo6bV9jb2RlOwotICAgIHVzaW5nIEludGVyZmVyZW5jZUVk
Z2UgPSB0eXBlbmFtZSBCYXNlOjpJbnRlcmZlcmVuY2VFZGdlOwogICAgIHVzaW5nIEJhc2U6Om1f
dW5zcGlsbGFibGVUbXBzOwogICAgIHVzaW5nIEJhc2U6Omhhc0ludGVyZmVyZW5jZUVkZ2U7CiAg
ICAgdXNpbmcgQmFzZTo6Z2V0QWxpYXM7CkBAIC02MDUsNyArNjg2LDYgQEAgcHJvdGVjdGVkOgog
ICAgIHVzaW5nIEJhc2U6OmZvckVhY2hBZGphY2VudDsKICAgICB1c2luZyBCYXNlOjpoYXNCZWVu
U2ltcGxpZmllZDsKICAgICB1c2luZyBCYXNlOjphZGRUb1NwaWxsOwotICAgIHVzaW5nIEJhc2U6
Om1faW50ZXJmZXJlbmNlRWRnZXM7CiAgICAgdXNpbmcgQmFzZTo6YWRkQmlhczsKICAgICB1c2lu
ZyBCYXNlOjptX3Bpbm5lZFJlZ3M7CiAgICAgdXNpbmcgQmFzZTo6bV9yZWdzSW5Qcmlvcml0eU9y
ZGVyOwpAQCAtOTI4LDkgKzEwMDgsOSBAQCBwcm90ZWN0ZWQ6CiAgICAgTW92ZVNldCBtX3dvcmts
aXN0TW92ZXM7CiB9OwogCi10ZW1wbGF0ZSA8dHlwZW5hbWUgSW5kZXhUeXBlLCB0eXBlbmFtZSBU
bXBNYXBwZXI+Ci1jbGFzcyBJUkMgOiBwdWJsaWMgQWJzdHJhY3RDb2xvcmluZ0FsbG9jYXRvcjxJ
bmRleFR5cGUsIFRtcE1hcHBlcj4gewotICAgIHVzaW5nIEJhc2UgPSBBYnN0cmFjdENvbG9yaW5n
QWxsb2NhdG9yPEluZGV4VHlwZSwgVG1wTWFwcGVyPjsKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbmRl
eFR5cGUsIHR5cGVuYW1lIFRtcE1hcHBlciwgdHlwZW5hbWUgSW50ZXJmZXJlbmNlRWRnZT4KK2Ns
YXNzIElSQyA6IHB1YmxpYyBBYnN0cmFjdENvbG9yaW5nQWxsb2NhdG9yPEluZGV4VHlwZSwgVG1w
TWFwcGVyLCBJbnRlcmZlcmVuY2VFZGdlPiB7CisgICAgdXNpbmcgQmFzZSA9IEFic3RyYWN0Q29s
b3JpbmdBbGxvY2F0b3I8SW5kZXhUeXBlLCBUbXBNYXBwZXIsIEludGVyZmVyZW5jZUVkZ2U+Owog
cHJvdGVjdGVkOgogICAgIHVzaW5nIEJhc2U6Om1faXNPblNlbGVjdFN0YWNrOwogICAgIHVzaW5n
IEJhc2U6Om1fc2VsZWN0U3RhY2s7CkBAIC05NTAsNyArMTAzMCw2IEBAIHByb3RlY3RlZDoKICAg
ICB1c2luZyBCYXNlOjptX2xhc3RQcmVjb2xvcmVkUmVnaXN0ZXJJbmRleDsKICAgICB1c2luZyBC
YXNlOjptX2NvbG9yZWRUbXA7CiAgICAgdXNpbmcgQmFzZTo6bV9jb2RlOwotICAgIHVzaW5nIElu
dGVyZmVyZW5jZUVkZ2UgPSB0eXBlbmFtZSBCYXNlOjpJbnRlcmZlcmVuY2VFZGdlOwogICAgIHVz
aW5nIEJhc2U6Om1fdW5zcGlsbGFibGVUbXBzOwogICAgIHVzaW5nIEJhc2U6Omhhc0ludGVyZmVy
ZW5jZUVkZ2U7CiAgICAgdXNpbmcgQmFzZTo6Z2V0QWxpYXM7CkBAIC05NjEsNyArMTA0MCw2IEBA
IHByb3RlY3RlZDoKICAgICB1c2luZyBCYXNlOjpmb3JFYWNoQWRqYWNlbnQ7CiAgICAgdXNpbmcg
QmFzZTo6aGFzQmVlblNpbXBsaWZpZWQ7CiAgICAgdXNpbmcgQmFzZTo6YWRkVG9TcGlsbDsKLSAg
ICB1c2luZyBCYXNlOjptX2ludGVyZmVyZW5jZUVkZ2VzOwogICAgIHVzaW5nIEJhc2U6Om1fYWRq
YWNlbmN5TGlzdDsKICAgICB1c2luZyBCYXNlOjpkdW1wSW50ZXJmZXJlbmNlR3JhcGhJbkRvdDsK
ICAgICB1c2luZyBCYXNlOjphZGRCaWFzOwpAQCAtMTM3MSwxMCArMTQ0OSwxMCBAQCBwcm90ZWN0
ZWQ6CiB9OwogCiAvLyBUaGlzIHBlcmZvcm0gYWxsIHRoZSB0YXNrcyB0aGF0IGFyZSBzcGVjaWZp
YyB0byBjZXJ0YWluIHJlZ2lzdGVyIHR5cGUuCi10ZW1wbGF0ZTxCYW5rIGJhbmssIHRlbXBsYXRl
PHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgQWxsb2NhdG9yVHlwZT4KLWNsYXNzIENvbG9yaW5n
QWxsb2NhdG9yIDogcHVibGljIEFsbG9jYXRvclR5cGU8dW5zaWduZWQsIEFic29sdXRlVG1wTWFw
cGVyPGJhbms+PiB7Cit0ZW1wbGF0ZTxCYW5rIGJhbmssIHRlbXBsYXRlPHR5cGVuYW1lLCB0eXBl
bmFtZSwgdHlwZW5hbWU+IGNsYXNzIEFsbG9jYXRvclR5cGUsIHR5cGVuYW1lIEludGVyZmVyZW5j
ZUVkZ2VUeXBlPgorY2xhc3MgQ29sb3JpbmdBbGxvY2F0b3IgOiBwdWJsaWMgQWxsb2NhdG9yVHlw
ZTx1bnNpZ25lZCwgQWJzb2x1dGVUbXBNYXBwZXI8YmFuaz4sIEludGVyZmVyZW5jZUVkZ2VUeXBl
PiB7CiAgICAgdXNpbmcgVG1wTWFwcGVyID0gQWJzb2x1dGVUbXBNYXBwZXI8YmFuaz47Ci0gICAg
dXNpbmcgQmFzZSA9IEFsbG9jYXRvclR5cGU8dW5zaWduZWQsIFRtcE1hcHBlcj47CisgICAgdXNp
bmcgQmFzZSA9IEFsbG9jYXRvclR5cGU8dW5zaWduZWQsIFRtcE1hcHBlciwgSW50ZXJmZXJlbmNl
RWRnZVR5cGU+OwogICAgIHVzaW5nIEJhc2U6Om1faXNPblNlbGVjdFN0YWNrOwogICAgIHVzaW5n
IEJhc2U6Om1fc2VsZWN0U3RhY2s7CiAgICAgdXNpbmcgQmFzZTo6bV9zaW1wbGlmeVdvcmtsaXN0
OwpAQCAtMTM5MywxMiArMTQ3MSwxMCBAQCBjbGFzcyBDb2xvcmluZ0FsbG9jYXRvciA6IHB1Ymxp
YyBBbGxvY2F0CiAgICAgdXNpbmcgQmFzZTo6bV9sYXN0UHJlY29sb3JlZFJlZ2lzdGVySW5kZXg7
CiAgICAgdXNpbmcgQmFzZTo6bV9jb2xvcmVkVG1wOwogICAgIHVzaW5nIEJhc2U6Om1fY29kZTsK
LSAgICB1c2luZyBJbnRlcmZlcmVuY2VFZGdlID0gdHlwZW5hbWUgQmFzZTo6SW50ZXJmZXJlbmNl
RWRnZTsKICAgICB1c2luZyBCYXNlOjptX3dvcmtsaXN0TW92ZXM7CiAgICAgdXNpbmcgQmFzZTo6
aGFzSW50ZXJmZXJlbmNlRWRnZTsKICAgICB1c2luZyBCYXNlOjpnZXRBbGlhczsKICAgICB1c2lu
ZyBCYXNlOjphZGRFZGdlOwotICAgIHVzaW5nIEJhc2U6Om1faW50ZXJmZXJlbmNlRWRnZXM7CiAg
ICAgdXNpbmcgQmFzZTo6bV9waW5uZWRSZWdzOwogICAgIHVzaW5nIEJhc2U6Om1fcmVnc0luUHJp
b3JpdHlPcmRlcjsKIApAQCAtMTU1Nyw3ICsxNjMzLDcgQEAgcHJvdGVjdGVkOgogICAgICAgICB1
bnNpZ25lZCBsZWZ0SW5kZXggPSBUbXBNYXBwZXI6OmFic29sdXRlSW5kZXgobGVmdFRtcCk7CiAg
ICAgICAgIHVuc2lnbmVkIHJpZ2h0SW5kZXggPSBUbXBNYXBwZXI6OmFic29sdXRlSW5kZXgocmln
aHRUbXApOwogCi0gICAgICAgIHJldHVybiAhaGFzSW50ZXJmZXJlbmNlRWRnZShJbnRlcmZlcmVu
Y2VFZGdlKGxlZnRJbmRleCwgcmlnaHRJbmRleCkpOworICAgICAgICByZXR1cm4gIWhhc0ludGVy
ZmVyZW5jZUVkZ2UoSW50ZXJmZXJlbmNlRWRnZVR5cGUobGVmdEluZGV4LCByaWdodEluZGV4KSk7
CiAgICAgfQogCiAgICAgdm9pZCBhZGRUb0xvd1ByaW9yaXR5Q29hbGVzY2luZ0NhbmRpZGF0ZXMo
QXJnIGxlZnQsIEFyZyByaWdodCkKQEAgLTE4NTYsMTEgKzE5MzIsMjEgQEAgcHJpdmF0ZToKICAg
ICAgICAgICAgIH07CiAKICAgICAgICAgICAgIGlmICh1c2VJUkMoKSkgewotICAgICAgICAgICAg
ICAgIENvbG9yaW5nQWxsb2NhdG9yPGJhbmssIElSQz4gYWxsb2NhdG9yKG1fY29kZSwgbV90bXBX
aWR0aCwgbV91c2VDb3VudHMsIHVuc3BpbGxhYmxlVG1wcyk7Ci0gICAgICAgICAgICAgICAgZG9u
ZSA9IGRvQWxsb2NhdGlvbihhbGxvY2F0b3IpOworICAgICAgICAgICAgICAgIGlmIChtX2NvZGUu
bnVtVG1wcyhiYW5rKSA8IHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDE2X3Q+OjptYXgoKSkgewor
ICAgICAgICAgICAgICAgICAgICBDb2xvcmluZ0FsbG9jYXRvcjxiYW5rLCBJUkMsIEludGVyZmVy
ZW5jZUVkZ2UxNkJpdD4gYWxsb2NhdG9yKG1fY29kZSwgbV90bXBXaWR0aCwgbV91c2VDb3VudHMs
IHVuc3BpbGxhYmxlVG1wcyk7CisgICAgICAgICAgICAgICAgICAgIGRvbmUgPSBkb0FsbG9jYXRp
b24oYWxsb2NhdG9yKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAg
ICAgICBDb2xvcmluZ0FsbG9jYXRvcjxiYW5rLCBJUkMsIEludGVyZmVyZW5jZUVkZ2UzMkJpdD4g
YWxsb2NhdG9yKG1fY29kZSwgbV90bXBXaWR0aCwgbV91c2VDb3VudHMsIHVuc3BpbGxhYmxlVG1w
cyk7CisgICAgICAgICAgICAgICAgICAgIGRvbmUgPSBkb0FsbG9jYXRpb24oYWxsb2NhdG9yKTsK
KyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAg
IENvbG9yaW5nQWxsb2NhdG9yPGJhbmssIEJyaWdncz4gYWxsb2NhdG9yKG1fY29kZSwgbV90bXBX
aWR0aCwgbV91c2VDb3VudHMsIHVuc3BpbGxhYmxlVG1wcyk7Ci0gICAgICAgICAgICAgICAgZG9u
ZSA9IGRvQWxsb2NhdGlvbihhbGxvY2F0b3IpOworICAgICAgICAgICAgICAgIGlmIChtX2NvZGUu
bnVtVG1wcyhiYW5rKSA8IHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDE2X3Q+OjptYXgoKSkgewor
ICAgICAgICAgICAgICAgICAgICBDb2xvcmluZ0FsbG9jYXRvcjxiYW5rLCBCcmlnZ3MsIEludGVy
ZmVyZW5jZUVkZ2UxNkJpdD4gYWxsb2NhdG9yKG1fY29kZSwgbV90bXBXaWR0aCwgbV91c2VDb3Vu
dHMsIHVuc3BpbGxhYmxlVG1wcyk7CisgICAgICAgICAgICAgICAgICAgIGRvbmUgPSBkb0FsbG9j
YXRpb24oYWxsb2NhdG9yKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAg
ICAgICAgICBDb2xvcmluZ0FsbG9jYXRvcjxiYW5rLCBCcmlnZ3MsIEludGVyZmVyZW5jZUVkZ2Uz
MkJpdD4gYWxsb2NhdG9yKG1fY29kZSwgbV90bXBXaWR0aCwgbV91c2VDb3VudHMsIHVuc3BpbGxh
YmxlVG1wcyk7CisgICAgICAgICAgICAgICAgICAgIGRvbmUgPSBkb0FsbG9jYXRpb24oYWxsb2Nh
dG9yKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAg
ICAgZGF0YUxvZ0xuSWYocmVwb3J0U3RhdHMsICJOdW0gaXRlcmF0aW9ucyA9ICIsIG51bUl0ZXJh
dGlvbnMsICIgZm9yIGJhbms6ICIsIGJhbmspOwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3Jl
L3J1bnRpbWUvT3B0aW9uc0xpc3QuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvcnVudGltZS9PcHRpb25zTGlzdC5oCShyZXZpc2lvbiAyNjI5MDApCisrKyBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvcnVudGltZS9PcHRpb25zTGlzdC5oCSh3b3JraW5nIGNvcHkpCkBAIC00NTUs
NyArNDU1LDcgQEAgY29uc3RleHByIGJvb2wgZW5hYmxlV2ViQXNzZW1ibHlTdHJlYW1pbgogICAg
IHYoVW5zaWduZWQsIHdlYkFzc2VtYmx5QkJRQWlyT3B0aW1pemF0aW9uTGV2ZWwsIDAsIE5vcm1h
bCwgIkFpciBPcHRpbWl6YXRpb24gbGV2ZWwgZm9yIEJCUSBXZWIgQXNzZW1ibHkgbW9kdWxlIGNv
bXBpbGF0aW9ucy4iKSBcCiAgICAgdihVbnNpZ25lZCwgd2ViQXNzZW1ibHlCQlFCM09wdGltaXph
dGlvbkxldmVsLCAxLCBOb3JtYWwsICJCMyBPcHRpbWl6YXRpb24gbGV2ZWwgZm9yIEJCUSBXZWIg
QXNzZW1ibHkgbW9kdWxlIGNvbXBpbGF0aW9ucy4iKSBcCiAgICAgdihVbnNpZ25lZCwgd2ViQXNz
ZW1ibHlPTUdPcHRpbWl6YXRpb25MZXZlbCwgT3B0aW9uczo6ZGVmYXVsdEIzT3B0TGV2ZWwoKSwg
Tm9ybWFsLCAiQjMgT3B0aW1pemF0aW9uIGxldmVsIGZvciBPTUcgV2ViIEFzc2VtYmx5IG1vZHVs
ZSBjb21waWxhdGlvbnMuIikgXAotICAgIHYoVW5zaWduZWQsIHdlYkFzc2VtYmx5QkJRRmFsbGJh
Y2tTaXplLCA1MDAwMCwgTm9ybWFsLCAiTGltaXQgb2YgV2FzbSBmdW5jdGlvbiBzaXplIGFib3Zl
IHdoaWNoIHdlIGZhbGxiYWNrIHRvIEJCUSBjb21waWxhdGlvbiBtb2RlLiIpIFwKKyAgICB2KFVu
c2lnbmVkLCB3ZWJBc3NlbWJseUJCUUZhbGxiYWNrU2l6ZSwgNjAwMDAsIE5vcm1hbCwgIkxpbWl0
IG9mIFdhc20gZnVuY3Rpb24gc2l6ZSBhYm92ZSB3aGljaCB3ZSBmYWxsYmFjayB0byBCQlEgY29t
cGlsYXRpb24gbW9kZS4iKSBcCiAgICAgXAogICAgIHYoQm9vbCwgdXNlQkJRVGllclVwQ2hlY2tz
LCB0cnVlLCBOb3JtYWwsICJFbmFibGVzIHRpZXIgdXAgY2hlY2tzIGZvciBvdXIgQkJRIGNvZGUu
IikgXAogICAgIHYoQm9vbCwgdXNlV2ViQXNzZW1ibHlPU1IsIHRydWUsIE5vcm1hbCwgbnVsbHB0
cikgXAo=
</data>
<flag name="review"
          id="417047"
          type_id="1"
          status="+"
          setter="ysuzuki"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>402060</attachid>
            <date>2020-06-16 17:25:30 -0700</date>
            <delta_ts>2020-06-16 17:25:30 -0700</delta_ts>
            <desc>Patch for Landing.  Changed to using a templated class.</desc>
            <filename>212106-3.patch</filename>
            <type>text/plain</type>
            <size>17132</size>
            <attacher name="Michael Saboff">msaboff</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMjYzMTI2KQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDIyIEBA
CisyMDIwLTA2LTE2ICBNaWNoYWVsIFNhYm9mZiAgPG1zYWJvZmZAYXBwbGUuY29tPgorCisgICAg
ICAgIFtXYXNtXSBSZWR1Y2UgdGhlIGFtb3VudCBvZiBtZW1vcnkgdXNlZCBieSB0aGUgQWlyIHJl
Z2lzdGVyIGNvbG9yaW5nIGFsbG9jYXRvcgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9y
Zy9zaG93X2J1Zy5jZ2k/aWQ9MjEyMTA2CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgWXVzdWtlIFN1
enVraS4KKworICAgICAgICBDaGFuZ2VkIEludGVyZmVyZW5jZUVkZ2UgdG8gYmUgYSB0ZW1wbGF0
ZWQgY2xhc3Mgc28gd2UgY2FuIGluc3RhbnRpYXRlIGFuIHVuc2lnbmVkCisgICAgICAgIHNob3J0
IHZlcnNpb24gdG8gY3V0IG1lbW9yeSBpbiBoYWxmIGZvciBjb2RlIHRoYXQgaGFzIGxlc3MgdGhh
biAyXjE2IHRlbXBzLgorICAgICAgICBUaHJvdWdoIGluc3RydW1lbnRhdGlvbiwgbXkgdGVzdGlu
ZyBzaG93ZWQgdGhhdCBhbG1vc3QgYWxsIGNvbXBpbGF0aW9ucyB1c2UgdGhlCisgICAgICAgIDE2
Yml0IGltcGxlbWVudGF0aW9uLiAgQWx0aG91Z2ggdGhpcyBjaGFuZ2UgaXMgZm9yIGFsbCBCMy9B
aXIgY29tcGlsYXRpb25zIGF0IE8yLAorICAgICAgICBXYXNtIGNvbXBpbGF0aW9ucyBhcmUgdXNh
bGx5IGxhcmdlciBhbmQgdGhlcmVmb3JlIGdldCB0aGUgZ3JlYXRlc3QgYmVuZWZpdC4KKworICAg
ICAgICBUaGlzIGFsbG93ZWQgaW5jcmVhc2luZyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIG9w
dGlvbiB3ZWJBc3NlbWJseUJCUUZhbGxiYWNrU2l6ZSwKKyAgICAgICAgd2l0aCBhIHNtYWxsIGlu
Y3JlYXNlIGluIG1lbW9yeSB1c2FnZS4KKworICAgICAgICAqIGIzL2Fpci9BaXJBbGxvY2F0ZVJl
Z2lzdGVyc0J5R3JhcGhDb2xvcmluZy5jcHA6CisgICAgICAgICogcnVudGltZS9PcHRpb25zTGlz
dC5oOgorCiAyMDIwLTA2LTE2ICBNYXJrIExhbSAgPG1hcmsubGFtQGFwcGxlLmNvbT4KIAogICAg
ICAgICBNYWtlIE9wdGlvbnM6OnVzZUpJVCgpIGJlIHRoZSBjYW5vbmljYWwgc291cmNlIG9mIHRy
dXRoIG9uIHdoZXRoZXIgd2Ugc2hvdWxkIHVzZSB0aGUgSklULgpJbmRleDogU291cmNlL0phdmFT
Y3JpcHRDb3JlL2IzL2Fpci9BaXJBbGxvY2F0ZVJlZ2lzdGVyc0J5R3JhcGhDb2xvcmluZy5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJBbGxvY2F0ZVJl
Z2lzdGVyc0J5R3JhcGhDb2xvcmluZy5jcHAJKHJldmlzaW9uIDI2MzEyNikKKysrIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyQWxsb2NhdGVSZWdpc3RlcnNCeUdyYXBoQ29sb3Jpbmcu
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykg
MjAxNS0yMDE5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAo
QykgMjAxNS0yMDIwIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKICAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucwpAQCAtNDcsOSArNDcsMTAxIEBAIHN0YXRpYyBjb25zdGV4cHIg
Ym9vbCBkZWJ1ZyA9IGZhbHNlOwogc3RhdGljIGNvbnN0ZXhwciBib29sIHRyYWNlRGVidWcgPSBm
YWxzZTsKIHN0YXRpYyBjb25zdGV4cHIgYm9vbCByZXBvcnRTdGF0cyA9IGZhbHNlOwogCisvLyBJ
bnRlcmZlcmVuY2UgZWRnZXMgYXJlIG5vdCBkaXJlY3RlZC4gQW4gZWRnZSBiZXR3ZWVuIGFueSB0
d28gVG1wcyBpcyByZXByZXNlbnRlZAorLy8gYnkgdGhlIGNvbmNhdGVuYXRlZCB2YWx1ZXMgb2Yg
dGhlIHNtYWxsZXN0IFRtcCBmb2xsb3dlZCBieSB0aGUgYmlnZ2VyIFRtcC4KKy8vIFdlIGhhdmUg
YSB0ZW1wbGF0ZWQgdmVyc2lvbiB0byBzdXBwb3J0IDE2IGJpdCBhbmQgYSAzMiBiaXQgaW1wbGVt
ZW50YXRpb25zCisvLyBzaW5jZSB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gYW4gaW50ZXJmZXJl
bmNlIHRhYmxlIGlzIE8oTl4yKS4KKy8vIEluIG1vc3QgY2FzZXMsIHdlIHVzZSB0aGUgMTYgYml0
IGZsYXZvciwgdGh1cyBzYXZpbmcgaGFsZiB0aGUgbWVtb3J5CisvLyB3aXRoIGEgc2luZ2xlIGlt
cGxlbWVudGF0aW9uLgordGVtcGxhdGUgPHR5cGVuYW1lIEluZGV4SW1wbFR5cGUsIHR5cGVuYW1l
IFBhaXJTdG9yYWdlVHlwZT4KK2NsYXNzIEludGVyZmVyZW5jZUVkZ2UgeworICAgIHN0YXRpY19h
c3NlcnQoc2l6ZW9mKEluZGV4SW1wbFR5cGUpICogMiA9PSBzaXplb2YoUGFpclN0b3JhZ2VUeXBl
KSk7CisgICAgY29uc3QgdW5zaWduZWQgU2hpZnRBbW91bnQgPSBzaXplb2YoSW5kZXhJbXBsVHlw
ZSkgKiA4OworICAgIGNvbnN0IFBhaXJTdG9yYWdlVHlwZSBJbmRleE1hc2sgPSBzdGQ6Om51bWVy
aWNfbGltaXRzPEluZGV4SW1wbFR5cGU+OjptYXgoKTsKKworcHJvdGVjdGVkOgorICAgIHVzaW5n
IEluZGV4VHlwZSA9IHVuc2lnbmVkOworCitwdWJsaWM6CisgICAgc3RydWN0IEludGVyZmVyZW5j
ZUVkZ2VIYXNoIHsKKyAgICAgICAgc3RhdGljIHVuc2lnbmVkIGhhc2goY29uc3QgSW50ZXJmZXJl
bmNlRWRnZTxJbmRleEltcGxUeXBlLCBQYWlyU3RvcmFnZVR5cGU+JiBrZXkpIHsgcmV0dXJuIGtl
eS5oYXNoKCk7IH0KKyAgICAgICAgc3RhdGljIGJvb2wgZXF1YWwoY29uc3QgSW50ZXJmZXJlbmNl
RWRnZTxJbmRleEltcGxUeXBlLCBQYWlyU3RvcmFnZVR5cGU+JiBhLCBjb25zdCBJbnRlcmZlcmVu
Y2VFZGdlPEluZGV4SW1wbFR5cGUsIFBhaXJTdG9yYWdlVHlwZT4mIGIpIHsgcmV0dXJuIGEgPT0g
YjsgfQorICAgICAgICBzdGF0aWMgY29uc3RleHByIGJvb2wgc2FmZVRvQ29tcGFyZVRvRW1wdHlP
ckRlbGV0ZWQgPSB0cnVlOworICAgIH07CisgICAgdHlwZWRlZiBTaW1wbGVDbGFzc0hhc2hUcmFp
dHM8SW50ZXJmZXJlbmNlRWRnZTxJbmRleEltcGxUeXBlLCBQYWlyU3RvcmFnZVR5cGU+PiBJbnRl
cmZlcmVuY2VFZGdlSGFzaFRyYWl0czsKKworICAgIHR5cGVkZWYgSGFzaFNldDxJbnRlcmZlcmVu
Y2VFZGdlPEluZGV4SW1wbFR5cGUsIFBhaXJTdG9yYWdlVHlwZT4sIEludGVyZmVyZW5jZUVkZ2VI
YXNoLCBJbnRlcmZlcmVuY2VFZGdlSGFzaFRyYWl0cz4gSW50ZXJmZXJlbmNlU2V0OworCisgICAg
SW50ZXJmZXJlbmNlRWRnZSgpCisgICAgeworICAgIH0KKworICAgIEludGVyZmVyZW5jZUVkZ2Uo
SW5kZXhUeXBlIGEsIEluZGV4VHlwZSBiKQorICAgIHsKKyAgICAgICAgQVNTRVJUKGEpOworICAg
ICAgICBBU1NFUlQoYik7CisgICAgICAgIEFTU0VSVChhIDwgc3RkOjpudW1lcmljX2xpbWl0czxJ
bmRleEltcGxUeXBlPjo6bWF4KCkpOworICAgICAgICBBU1NFUlQoYiA8IHN0ZDo6bnVtZXJpY19s
aW1pdHM8SW5kZXhJbXBsVHlwZT46Om1heCgpKTsKKyAgICAgICAgQVNTRVJUX1dJVEhfTUVTU0FH
RShhICE9IGIsICJBIFRtcCBjYW4gbmV2ZXIgaW50ZXJmZXJlIHdpdGggaXRzZWxmLiBEb2luZyBz
byB3b3VsZCBmb3JjZSBpdCB0byBiZSB0aGUgc3VwZXJwb3NpdGlvbiBvZiB0d28gcmVnaXN0ZXJz
LiIpOworCisgICAgICAgIGlmIChiIDwgYSkKKyAgICAgICAgICAgIHN0ZDo6c3dhcChhLCBiKTsK
KyAgICAgICAgbV92YWx1ZSA9IHN0YXRpY19jYXN0PFBhaXJTdG9yYWdlVHlwZT4oYSkgPDwgU2hp
ZnRBbW91bnQgfCBiOworICAgIH0KKworICAgIEludGVyZmVyZW5jZUVkZ2UoY29uc3QgSW50ZXJm
ZXJlbmNlRWRnZTxJbmRleEltcGxUeXBlLCBQYWlyU3RvcmFnZVR5cGU+JiBvdGhlcikKKyAgICAg
ICAgOiBtX3ZhbHVlKG90aGVyLm1fdmFsdWUpCisgICAgeworICAgIH0KKworCisgICAgSW50ZXJm
ZXJlbmNlRWRnZShXVEY6Okhhc2hUYWJsZURlbGV0ZWRWYWx1ZVR5cGUpCisgICAgICAgIDogbV92
YWx1ZShzdGQ6Om51bWVyaWNfbGltaXRzPFBhaXJTdG9yYWdlVHlwZT46Om1heCgpKQorICAgIHsK
KyAgICB9CisKKyAgICBJbmRleFR5cGUgZmlyc3QoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0
dXJuIG1fdmFsdWUgPj4gU2hpZnRBbW91bnQgJiBJbmRleE1hc2s7CisgICAgfQorCisgICAgSW5k
ZXhUeXBlIHNlY29uZCgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbV92YWx1ZSAmIElu
ZGV4TWFzazsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgSW50ZXJmZXJlbmNl
RWRnZSYgb3RoZXIpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbV92YWx1ZSA9PSBvdGhl
ci5tX3ZhbHVlOworICAgIH0KKworICAgIEludGVyZmVyZW5jZUVkZ2UmIG9wZXJhdG9yPShjb25z
dCBJbnRlcmZlcmVuY2VFZGdlJiBvdGhlcikKKyAgICB7CisgICAgICAgIG1fdmFsdWUgPSBvdGhl
ci5tX3ZhbHVlOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgIGJvb2wgaXNIYXNo
VGFibGVEZWxldGVkVmFsdWUoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuICp0aGlzID09
IEludGVyZmVyZW5jZUVkZ2UoV1RGOjpIYXNoVGFibGVEZWxldGVkVmFsdWUpOworICAgIH0KKwor
ICAgIHVuc2lnbmVkIGhhc2goKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIFdURjo6SW50
SGFzaDxQYWlyU3RvcmFnZVR5cGU+OjpoYXNoKG1fdmFsdWUpOworICAgIH0KKworICAgIHZvaWQg
ZHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25zdAorICAgIHsKKyAgICAgICAgb3V0LnByaW50KGZp
cnN0KCksICI8PT4iLCBzZWNvbmQoKSk7CisgICAgfQorCitwcml2YXRlOgorICAgIFBhaXJTdG9y
YWdlVHlwZSBtX3ZhbHVlIHsgMCB9OworfTsKKwogLy8gVGhlIEFic3RyYWN0Q29sb3JpbmdBbGxv
Y2F0b3IgZGVmaW5lcyBhbGwgdGhlIGNvZGUgdGhhdCBpcyBpbmRlcGVuZGFudAogLy8gZnJvbSB0
aGUgYmFuayBvciByZWdpc3RlciBhbmQgY2FuIGJlIHNoYXJlZCB3aGVuIGFsbG9jYXRpbmcgcmVn
aXN0ZXJzLgotdGVtcGxhdGU8dHlwZW5hbWUgSW5kZXhUeXBlLCB0eXBlbmFtZSBUbXBNYXBwZXI+
Cit0ZW1wbGF0ZTx0eXBlbmFtZSBJbmRleFR5cGUsIHR5cGVuYW1lIFRtcE1hcHBlciwgdHlwZW5h
bWUgSW50ZXJmZXJlbmNlRWRnZVR5cGU+CiBjbGFzcyBBYnN0cmFjdENvbG9yaW5nQWxsb2NhdG9y
IHsKIHB1YmxpYzoKICAgICBBYnN0cmFjdENvbG9yaW5nQWxsb2NhdG9yKENvZGUmIGNvZGUsIGNv
bnN0IFZlY3RvcjxSZWc+JiByZWdzSW5Qcmlvcml0eU9yZGVyLCBJbmRleFR5cGUgbGFzdFByZWNv
bG9yZWRSZWdpc3RlckluZGV4LCB1bnNpZ25lZCB0bXBBcnJheVNpemUsIGNvbnN0IEhhc2hTZXQ8
dW5zaWduZWQ+JiB1bnNwaWxsYWJsZVRtcHMsIGNvbnN0IFVzZUNvdW50czxUbXA+JiB1c2VDb3Vu
dHMpCkBAIC0xMTUsNyArMjA3LDcgQEAgcHJvdGVjdGVkOgogICAgIHZvaWQgYWRkRWRnZURpc3Rp
bmN0KEluZGV4VHlwZSBhLCBJbmRleFR5cGUgYikKICAgICB7CiAgICAgICAgIEFTU0VSVChhICE9
IGIpOwotICAgICAgICBib29sIGlzTmV3RWRnZSA9IGFkZEludGVyZmVyZW5jZUVkZ2UoSW50ZXJm
ZXJlbmNlRWRnZShhLCBiKSk7CisgICAgICAgIGJvb2wgaXNOZXdFZGdlID0gYWRkSW50ZXJmZXJl
bmNlRWRnZShJbnRlcmZlcmVuY2VFZGdlVHlwZShhLCBiKSk7CiAgICAgICAgIGlmIChpc05ld0Vk
Z2UpIHsKICAgICAgICAgICAgIGlmICghaXNQcmVjb2xvcmVkKGEpKSB7CiAgICAgICAgICAgICAg
ICAgQVNTRVJUKCFtX2FkamFjZW5jeUxpc3RbYV0uY29udGFpbnMoYikpOwpAQCAtMTM0LDcgKzIy
Niw3IEBAIHByb3RlY3RlZDoKICAgICBib29sIGFkZEVkZ2VEaXN0aW5jdFdpdGhvdXREZWdyZWVD
aGFuZ2UoSW5kZXhUeXBlIGEsIEluZGV4VHlwZSBiKQogICAgIHsKICAgICAgICAgQVNTRVJUKGEg
IT0gYik7Ci0gICAgICAgIGJvb2wgaXNOZXdFZGdlID0gYWRkSW50ZXJmZXJlbmNlRWRnZShJbnRl
cmZlcmVuY2VFZGdlKGEsIGIpKTsKKyAgICAgICAgYm9vbCBpc05ld0VkZ2UgPSBhZGRJbnRlcmZl
cmVuY2VFZGdlKEludGVyZmVyZW5jZUVkZ2VUeXBlKGEsIGIpKTsKICAgICAgICAgaWYgKGlzTmV3
RWRnZSkgewogICAgICAgICAgICAgaWYgKCFpc1ByZWNvbG9yZWQoYSkpIHsKICAgICAgICAgICAg
ICAgICBBU1NFUlQoIW1fYWRqYWNlbmN5TGlzdFthXS5jb250YWlucyhiKSk7CkBAIC0yNDksNyAr
MzQxLDcgQEAgcHJvdGVjdGVkOgogICAgICAgICAgICAgaWYgKCFpc1ByZWNvbG9yZWQoYWRqYWNl
bnRUbXBJbmRleCkKICAgICAgICAgICAgICAgICAmJiAhaGFzQmVlblNpbXBsaWZpZWQoYWRqYWNl
bnRUbXBJbmRleCkKICAgICAgICAgICAgICAgICAmJiBtX2RlZ3JlZXNbYWRqYWNlbnRUbXBJbmRl
eF0gPj0gcmVnaXN0ZXJDb3VudCgpCi0gICAgICAgICAgICAgICAgJiYgIWhhc0ludGVyZmVyZW5j
ZUVkZ2UoSW50ZXJmZXJlbmNlRWRnZSh1LCBhZGphY2VudFRtcEluZGV4KSkpCisgICAgICAgICAg
ICAgICAgJiYgIWhhc0ludGVyZmVyZW5jZUVkZ2UoSW50ZXJmZXJlbmNlRWRnZVR5cGUodSwgYWRq
YWNlbnRUbXBJbmRleCkpKQogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAg
fQogICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTMzOSw3ICs0MzEsNyBAQCBwcm90ZWN0ZWQ6CiAg
ICAgICAgIEFTU0VSVChtX3NwaWxsV29ya2xpc3QuaXNFbXB0eSgpKTsKIAogICAgICAgICAvLyBS
ZWNsYWltIGFzIG11Y2ggbWVtb3J5IGFzIHBvc3NpYmxlLgotICAgICAgICBtX2ludGVyZmVyZW5j
ZUVkZ2VzLmNsZWFyKCk7CisgICAgICAgIGNsZWFySW50ZXJmZXJlbmNlRWRnZXMoKTsKIAogICAg
ICAgICBtX2RlZ3JlZXMuY2xlYXIoKTsKICAgICAgICAgbV9tb3ZlTGlzdC5jbGVhcigpOwpAQCAt
NDIxLDYgKzUxMywyMSBAQCBwcm90ZWN0ZWQ6CiAgICAgICAgICAgICBtX2NvbG9yZWRUbXAuY2xl
YXIoKTsKICAgICB9CiAKKyAgICBib29sIGFkZEludGVyZmVyZW5jZUVkZ2UoSW50ZXJmZXJlbmNl
RWRnZVR5cGUgZWRnZSkKKyAgICB7CisgICAgICAgIHJldHVybiBtX2ludGVyZmVyZW5jZUVkZ2Vz
LmFkZChlZGdlKS5pc05ld0VudHJ5OworICAgIH0KKworICAgIGJvb2wgaGFzSW50ZXJmZXJlbmNl
RWRnZShJbnRlcmZlcmVuY2VFZGdlVHlwZSBlZGdlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1f
aW50ZXJmZXJlbmNlRWRnZXMuY29udGFpbnMoZWRnZSk7CisgICAgfQorCisgICAgdm9pZCBjbGVh
ckludGVyZmVyZW5jZUVkZ2VzKCkKKyAgICB7CisgICAgICAgIG1faW50ZXJmZXJlbmNlRWRnZXMu
Y2xlYXIoKTsKKyAgICB9CisKICAgICB2b2lkIGR1bXBJbnRlcmZlcmVuY2VHcmFwaEluRG90KFBy
aW50U3RyZWFtJiBvdXQpCiAgICAgewogICAgICAgICBvdXQucHJpbnQoImdyYXBoIEludGVyZmVy
ZW5jZUdyYXBoIHsgXG4iKTsKQEAgLTQ0NCw4NiArNTUxLDEwIEBAIHByb3RlY3RlZDoKICAgICAg
ICAgb3V0LnByaW50KCJ9XG4iKTsKICAgICB9CiAKLSAgICAvLyBJbnRlcmZlcmVuY2UgZWRnZXMg
YXJlIG5vdCBkaXJlY3RlZC4gQW4gZWRnZSBiZXR3ZWVuIGFueSB0d28gVG1wcyBpcyByZXByZXNl
bnRlZAotICAgIC8vIGJ5IHRoZSBjb25jYXRlbmF0ZWQgdmFsdWVzIG9mIHRoZSBzbWFsbGVzdCBU
bXAgZm9sbG93ZWQgYnkgdGhlIGJpZ2dlciBUbXAuCi0gICAgY2xhc3MgSW50ZXJmZXJlbmNlRWRn
ZSB7Ci0gICAgcHVibGljOgotICAgICAgICBJbnRlcmZlcmVuY2VFZGdlKCkKLSAgICAgICAgewot
ICAgICAgICB9Ci0KLSAgICAgICAgSW50ZXJmZXJlbmNlRWRnZShJbmRleFR5cGUgYSwgSW5kZXhU
eXBlIGIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFTU0VSVChhKTsKLSAgICAgICAgICAgIEFT
U0VSVChiKTsKLSAgICAgICAgICAgIEFTU0VSVF9XSVRIX01FU1NBR0UoYSAhPSBiLCAiQSBUbXAg
Y2FuIG5ldmVyIGludGVyZmVyZSB3aXRoIGl0c2VsZi4gRG9pbmcgc28gd291bGQgZm9yY2UgaXQg
dG8gYmUgdGhlIHN1cGVycG9zaXRpb24gb2YgdHdvIHJlZ2lzdGVycy4iKTsKLQotICAgICAgICAg
ICAgaWYgKGIgPCBhKQotICAgICAgICAgICAgICAgIHN0ZDo6c3dhcChhLCBiKTsKLSAgICAgICAg
ICAgIG1fdmFsdWUgPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4oYSkgPDwgMzIgfCBiOwotICAgICAg
ICB9Ci0KLSAgICAgICAgSW50ZXJmZXJlbmNlRWRnZShXVEY6Okhhc2hUYWJsZURlbGV0ZWRWYWx1
ZVR5cGUpCi0gICAgICAgICAgICA6IG1fdmFsdWUoc3RkOjpudW1lcmljX2xpbWl0czx1aW50NjRf
dD46Om1heCgpKQotICAgICAgICB7Ci0gICAgICAgIH0KLQotICAgICAgICBJbmRleFR5cGUgZmly
c3QoKSBjb25zdAotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbV92YWx1ZSA+PiAzMiAm
IDB4ZmZmZmZmZmY7Ci0gICAgICAgIH0KLQotICAgICAgICBJbmRleFR5cGUgc2Vjb25kKCkgY29u
c3QKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1fdmFsdWUgJiAweGZmZmZmZmZmOwot
ICAgICAgICB9Ci0KLSAgICAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEludGVyZmVyZW5jZUVk
Z2UmIG90aGVyKSBjb25zdAotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbV92YWx1ZSA9
PSBvdGhlci5tX3ZhbHVlOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbCBpc0hhc2hUYWJsZURl
bGV0ZWRWYWx1ZSgpIGNvbnN0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAqdGhpcyA9
PSBJbnRlcmZlcmVuY2VFZGdlKFdURjo6SGFzaFRhYmxlRGVsZXRlZFZhbHVlKTsKLSAgICAgICAg
fQotCi0gICAgICAgIHVuc2lnbmVkIGhhc2goKSBjb25zdAotICAgICAgICB7Ci0gICAgICAgICAg
ICByZXR1cm4gV1RGOjpJbnRIYXNoPHVpbnQ2NF90Pjo6aGFzaChtX3ZhbHVlKTsKLSAgICAgICAg
fQotCi0gICAgICAgIHZvaWQgZHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25zdAotICAgICAgICB7
Ci0gICAgICAgICAgICBvdXQucHJpbnQoZmlyc3QoKSwgIjw9PiIsIHNlY29uZCgpKTsKLSAgICAg
ICAgfQotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgdWludDY0X3QgbV92YWx1ZSB7IDAgfTsKLSAg
ICB9OwotCi0gICAgYm9vbCBhZGRJbnRlcmZlcmVuY2VFZGdlKEludGVyZmVyZW5jZUVkZ2UgZWRn
ZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX2ludGVyZmVyZW5jZUVkZ2VzLmFkZChlZGdlKS5p
c05ld0VudHJ5OwotICAgIH0KLQotICAgIGJvb2wgaGFzSW50ZXJmZXJlbmNlRWRnZShJbnRlcmZl
cmVuY2VFZGdlIGVkZ2UpCi0gICAgewotICAgICAgICByZXR1cm4gbV9pbnRlcmZlcmVuY2VFZGdl
cy5jb250YWlucyhlZGdlKTsKLSAgICB9Ci0KLSAgICBzdHJ1Y3QgSW50ZXJmZXJlbmNlRWRnZUhh
c2ggewotICAgICAgICBzdGF0aWMgdW5zaWduZWQgaGFzaChjb25zdCBJbnRlcmZlcmVuY2VFZGdl
JiBrZXkpIHsgcmV0dXJuIGtleS5oYXNoKCk7IH0KLSAgICAgICAgc3RhdGljIGJvb2wgZXF1YWwo
Y29uc3QgSW50ZXJmZXJlbmNlRWRnZSYgYSwgY29uc3QgSW50ZXJmZXJlbmNlRWRnZSYgYikgeyBy
ZXR1cm4gYSA9PSBiOyB9Ci0gICAgICAgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBzYWZlVG9Db21w
YXJlVG9FbXB0eU9yRGVsZXRlZCA9IHRydWU7Ci0gICAgfTsKLSAgICB0eXBlZGVmIFNpbXBsZUNs
YXNzSGFzaFRyYWl0czxJbnRlcmZlcmVuY2VFZGdlPiBJbnRlcmZlcmVuY2VFZGdlSGFzaFRyYWl0
czsKLQogICAgIFZlY3RvcjxSZWc+IG1fcmVnc0luUHJpb3JpdHlPcmRlcjsKICAgICBJbmRleFR5
cGUgbV9sYXN0UHJlY29sb3JlZFJlZ2lzdGVySW5kZXggeyAwIH07CiAKLSAgICAvLyBUaGUgaW50
ZXJmZXJlbmNlIGdyYXBoLgotICAgIEhhc2hTZXQ8SW50ZXJmZXJlbmNlRWRnZSwgSW50ZXJmZXJl
bmNlRWRnZUhhc2gsIEludGVyZmVyZW5jZUVkZ2VIYXNoVHJhaXRzPiBtX2ludGVyZmVyZW5jZUVk
Z2VzOworICAgIHR5cGVuYW1lIEludGVyZmVyZW5jZUVkZ2VUeXBlOjpJbnRlcmZlcmVuY2VTZXQg
bV9pbnRlcmZlcmVuY2VFZGdlczsKIAogICAgIFZlY3RvcjxWZWN0b3I8SW5kZXhUeXBlLCAwLCBV
bnNhZmVWZWN0b3JPdmVyZmxvdywgND4sIDAsIFVuc2FmZVZlY3Rvck92ZXJmbG93PiBtX2FkamFj
ZW5jeUxpc3Q7CiAgICAgVmVjdG9yPEluZGV4VHlwZSwgMCwgVW5zYWZlVmVjdG9yT3ZlcmZsb3c+
IG1fZGVncmVlczsKQEAgLTU3Miw5ICs2MDMsOSBAQCBwcm90ZWN0ZWQ6CiAgICAgVmVjdG9yPFRt
cCwgND4gbV9waW5uZWRSZWdzOwogfTsKIAotdGVtcGxhdGUgPHR5cGVuYW1lIEluZGV4VHlwZSwg
dHlwZW5hbWUgVG1wTWFwcGVyPgotY2xhc3MgQnJpZ2dzIDogcHVibGljIEFic3RyYWN0Q29sb3Jp
bmdBbGxvY2F0b3I8SW5kZXhUeXBlLCBUbXBNYXBwZXI+IHsKLSAgICB1c2luZyBCYXNlID0gQWJz
dHJhY3RDb2xvcmluZ0FsbG9jYXRvcjxJbmRleFR5cGUsIFRtcE1hcHBlcj47Cit0ZW1wbGF0ZSA8
dHlwZW5hbWUgSW5kZXhUeXBlLCB0eXBlbmFtZSBUbXBNYXBwZXIsIHR5cGVuYW1lIEludGVyZmVy
ZW5jZUVkZ2U+CitjbGFzcyBCcmlnZ3MgOiBwdWJsaWMgQWJzdHJhY3RDb2xvcmluZ0FsbG9jYXRv
cjxJbmRleFR5cGUsIFRtcE1hcHBlciwgSW50ZXJmZXJlbmNlRWRnZT4geworICAgIHVzaW5nIEJh
c2UgPSBBYnN0cmFjdENvbG9yaW5nQWxsb2NhdG9yPEluZGV4VHlwZSwgVG1wTWFwcGVyLCBJbnRl
cmZlcmVuY2VFZGdlPjsKIHByb3RlY3RlZDoKICAgICB1c2luZyBCYXNlOjptX2lzT25TZWxlY3RT
dGFjazsKICAgICB1c2luZyBCYXNlOjptX3NlbGVjdFN0YWNrOwpAQCAtNTk0LDcgKzYyNSw2IEBA
IHByb3RlY3RlZDoKICAgICB1c2luZyBCYXNlOjptX2xhc3RQcmVjb2xvcmVkUmVnaXN0ZXJJbmRl
eDsKICAgICB1c2luZyBCYXNlOjptX2NvbG9yZWRUbXA7CiAgICAgdXNpbmcgQmFzZTo6bV9jb2Rl
OwotICAgIHVzaW5nIEludGVyZmVyZW5jZUVkZ2UgPSB0eXBlbmFtZSBCYXNlOjpJbnRlcmZlcmVu
Y2VFZGdlOwogICAgIHVzaW5nIEJhc2U6Om1fdW5zcGlsbGFibGVUbXBzOwogICAgIHVzaW5nIEJh
c2U6Omhhc0ludGVyZmVyZW5jZUVkZ2U7CiAgICAgdXNpbmcgQmFzZTo6Z2V0QWxpYXM7CkBAIC02
MDUsNyArNjM1LDYgQEAgcHJvdGVjdGVkOgogICAgIHVzaW5nIEJhc2U6OmZvckVhY2hBZGphY2Vu
dDsKICAgICB1c2luZyBCYXNlOjpoYXNCZWVuU2ltcGxpZmllZDsKICAgICB1c2luZyBCYXNlOjph
ZGRUb1NwaWxsOwotICAgIHVzaW5nIEJhc2U6Om1faW50ZXJmZXJlbmNlRWRnZXM7CiAgICAgdXNp
bmcgQmFzZTo6YWRkQmlhczsKICAgICB1c2luZyBCYXNlOjptX3Bpbm5lZFJlZ3M7CiAgICAgdXNp
bmcgQmFzZTo6bV9yZWdzSW5Qcmlvcml0eU9yZGVyOwpAQCAtOTI4LDkgKzk1Nyw5IEBAIHByb3Rl
Y3RlZDoKICAgICBNb3ZlU2V0IG1fd29ya2xpc3RNb3ZlczsKIH07CiAKLXRlbXBsYXRlIDx0eXBl
bmFtZSBJbmRleFR5cGUsIHR5cGVuYW1lIFRtcE1hcHBlcj4KLWNsYXNzIElSQyA6IHB1YmxpYyBB
YnN0cmFjdENvbG9yaW5nQWxsb2NhdG9yPEluZGV4VHlwZSwgVG1wTWFwcGVyPiB7Ci0gICAgdXNp
bmcgQmFzZSA9IEFic3RyYWN0Q29sb3JpbmdBbGxvY2F0b3I8SW5kZXhUeXBlLCBUbXBNYXBwZXI+
OwordGVtcGxhdGUgPHR5cGVuYW1lIEluZGV4VHlwZSwgdHlwZW5hbWUgVG1wTWFwcGVyLCB0eXBl
bmFtZSBJbnRlcmZlcmVuY2VFZGdlPgorY2xhc3MgSVJDIDogcHVibGljIEFic3RyYWN0Q29sb3Jp
bmdBbGxvY2F0b3I8SW5kZXhUeXBlLCBUbXBNYXBwZXIsIEludGVyZmVyZW5jZUVkZ2U+IHsKKyAg
ICB1c2luZyBCYXNlID0gQWJzdHJhY3RDb2xvcmluZ0FsbG9jYXRvcjxJbmRleFR5cGUsIFRtcE1h
cHBlciwgSW50ZXJmZXJlbmNlRWRnZT47CiBwcm90ZWN0ZWQ6CiAgICAgdXNpbmcgQmFzZTo6bV9p
c09uU2VsZWN0U3RhY2s7CiAgICAgdXNpbmcgQmFzZTo6bV9zZWxlY3RTdGFjazsKQEAgLTk1MCw3
ICs5NzksNiBAQCBwcm90ZWN0ZWQ6CiAgICAgdXNpbmcgQmFzZTo6bV9sYXN0UHJlY29sb3JlZFJl
Z2lzdGVySW5kZXg7CiAgICAgdXNpbmcgQmFzZTo6bV9jb2xvcmVkVG1wOwogICAgIHVzaW5nIEJh
c2U6Om1fY29kZTsKLSAgICB1c2luZyBJbnRlcmZlcmVuY2VFZGdlID0gdHlwZW5hbWUgQmFzZTo6
SW50ZXJmZXJlbmNlRWRnZTsKICAgICB1c2luZyBCYXNlOjptX3Vuc3BpbGxhYmxlVG1wczsKICAg
ICB1c2luZyBCYXNlOjpoYXNJbnRlcmZlcmVuY2VFZGdlOwogICAgIHVzaW5nIEJhc2U6OmdldEFs
aWFzOwpAQCAtOTYxLDcgKzk4OSw2IEBAIHByb3RlY3RlZDoKICAgICB1c2luZyBCYXNlOjpmb3JF
YWNoQWRqYWNlbnQ7CiAgICAgdXNpbmcgQmFzZTo6aGFzQmVlblNpbXBsaWZpZWQ7CiAgICAgdXNp
bmcgQmFzZTo6YWRkVG9TcGlsbDsKLSAgICB1c2luZyBCYXNlOjptX2ludGVyZmVyZW5jZUVkZ2Vz
OwogICAgIHVzaW5nIEJhc2U6Om1fYWRqYWNlbmN5TGlzdDsKICAgICB1c2luZyBCYXNlOjpkdW1w
SW50ZXJmZXJlbmNlR3JhcGhJbkRvdDsKICAgICB1c2luZyBCYXNlOjphZGRCaWFzOwpAQCAtMTM3
MSwxMCArMTM5OCwxMCBAQCBwcm90ZWN0ZWQ6CiB9OwogCiAvLyBUaGlzIHBlcmZvcm0gYWxsIHRo
ZSB0YXNrcyB0aGF0IGFyZSBzcGVjaWZpYyB0byBjZXJ0YWluIHJlZ2lzdGVyIHR5cGUuCi10ZW1w
bGF0ZTxCYW5rIGJhbmssIHRlbXBsYXRlPHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgQWxsb2Nh
dG9yVHlwZT4KLWNsYXNzIENvbG9yaW5nQWxsb2NhdG9yIDogcHVibGljIEFsbG9jYXRvclR5cGU8
dW5zaWduZWQsIEFic29sdXRlVG1wTWFwcGVyPGJhbms+PiB7Cit0ZW1wbGF0ZTxCYW5rIGJhbmss
IHRlbXBsYXRlPHR5cGVuYW1lLCB0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIEFsbG9jYXRvclR5
cGUsIHR5cGVuYW1lIEludGVyZmVyZW5jZUVkZ2VUeXBlPgorY2xhc3MgQ29sb3JpbmdBbGxvY2F0
b3IgOiBwdWJsaWMgQWxsb2NhdG9yVHlwZTx1bnNpZ25lZCwgQWJzb2x1dGVUbXBNYXBwZXI8YmFu
az4sIEludGVyZmVyZW5jZUVkZ2VUeXBlPiB7CiAgICAgdXNpbmcgVG1wTWFwcGVyID0gQWJzb2x1
dGVUbXBNYXBwZXI8YmFuaz47Ci0gICAgdXNpbmcgQmFzZSA9IEFsbG9jYXRvclR5cGU8dW5zaWdu
ZWQsIFRtcE1hcHBlcj47CisgICAgdXNpbmcgQmFzZSA9IEFsbG9jYXRvclR5cGU8dW5zaWduZWQs
IFRtcE1hcHBlciwgSW50ZXJmZXJlbmNlRWRnZVR5cGU+OwogICAgIHVzaW5nIEJhc2U6Om1faXNP
blNlbGVjdFN0YWNrOwogICAgIHVzaW5nIEJhc2U6Om1fc2VsZWN0U3RhY2s7CiAgICAgdXNpbmcg
QmFzZTo6bV9zaW1wbGlmeVdvcmtsaXN0OwpAQCAtMTM5MywxMiArMTQyMCwxMCBAQCBjbGFzcyBD
b2xvcmluZ0FsbG9jYXRvciA6IHB1YmxpYyBBbGxvY2F0CiAgICAgdXNpbmcgQmFzZTo6bV9sYXN0
UHJlY29sb3JlZFJlZ2lzdGVySW5kZXg7CiAgICAgdXNpbmcgQmFzZTo6bV9jb2xvcmVkVG1wOwog
ICAgIHVzaW5nIEJhc2U6Om1fY29kZTsKLSAgICB1c2luZyBJbnRlcmZlcmVuY2VFZGdlID0gdHlw
ZW5hbWUgQmFzZTo6SW50ZXJmZXJlbmNlRWRnZTsKICAgICB1c2luZyBCYXNlOjptX3dvcmtsaXN0
TW92ZXM7CiAgICAgdXNpbmcgQmFzZTo6aGFzSW50ZXJmZXJlbmNlRWRnZTsKICAgICB1c2luZyBC
YXNlOjpnZXRBbGlhczsKICAgICB1c2luZyBCYXNlOjphZGRFZGdlOwotICAgIHVzaW5nIEJhc2U6
Om1faW50ZXJmZXJlbmNlRWRnZXM7CiAgICAgdXNpbmcgQmFzZTo6bV9waW5uZWRSZWdzOwogICAg
IHVzaW5nIEJhc2U6Om1fcmVnc0luUHJpb3JpdHlPcmRlcjsKIApAQCAtMTU1Nyw3ICsxNTgyLDcg
QEAgcHJvdGVjdGVkOgogICAgICAgICB1bnNpZ25lZCBsZWZ0SW5kZXggPSBUbXBNYXBwZXI6OmFi
c29sdXRlSW5kZXgobGVmdFRtcCk7CiAgICAgICAgIHVuc2lnbmVkIHJpZ2h0SW5kZXggPSBUbXBN
YXBwZXI6OmFic29sdXRlSW5kZXgocmlnaHRUbXApOwogCi0gICAgICAgIHJldHVybiAhaGFzSW50
ZXJmZXJlbmNlRWRnZShJbnRlcmZlcmVuY2VFZGdlKGxlZnRJbmRleCwgcmlnaHRJbmRleCkpOwor
ICAgICAgICByZXR1cm4gIWhhc0ludGVyZmVyZW5jZUVkZ2UoSW50ZXJmZXJlbmNlRWRnZVR5cGUo
bGVmdEluZGV4LCByaWdodEluZGV4KSk7CiAgICAgfQogCiAgICAgdm9pZCBhZGRUb0xvd1ByaW9y
aXR5Q29hbGVzY2luZ0NhbmRpZGF0ZXMoQXJnIGxlZnQsIEFyZyByaWdodCkKQEAgLTE4NTYsMTEg
KzE4ODEsMjEgQEAgcHJpdmF0ZToKICAgICAgICAgICAgIH07CiAKICAgICAgICAgICAgIGlmICh1
c2VJUkMoKSkgewotICAgICAgICAgICAgICAgIENvbG9yaW5nQWxsb2NhdG9yPGJhbmssIElSQz4g
YWxsb2NhdG9yKG1fY29kZSwgbV90bXBXaWR0aCwgbV91c2VDb3VudHMsIHVuc3BpbGxhYmxlVG1w
cyk7Ci0gICAgICAgICAgICAgICAgZG9uZSA9IGRvQWxsb2NhdGlvbihhbGxvY2F0b3IpOworICAg
ICAgICAgICAgICAgIGlmIChtX2NvZGUubnVtVG1wcyhiYW5rKSA8IHN0ZDo6bnVtZXJpY19saW1p
dHM8dWludDE2X3Q+OjptYXgoKSkgeworICAgICAgICAgICAgICAgICAgICBDb2xvcmluZ0FsbG9j
YXRvcjxiYW5rLCBJUkMsIEludGVyZmVyZW5jZUVkZ2U8dWludDE2X3QsIHVpbnQzMl90Pj4gYWxs
b2NhdG9yKG1fY29kZSwgbV90bXBXaWR0aCwgbV91c2VDb3VudHMsIHVuc3BpbGxhYmxlVG1wcyk7
CisgICAgICAgICAgICAgICAgICAgIGRvbmUgPSBkb0FsbG9jYXRpb24oYWxsb2NhdG9yKTsKKyAg
ICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBDb2xvcmluZ0FsbG9j
YXRvcjxiYW5rLCBJUkMsIEludGVyZmVyZW5jZUVkZ2U8dWludDMyX3QsIHVpbnQ2NF90Pj4gYWxs
b2NhdG9yKG1fY29kZSwgbV90bXBXaWR0aCwgbV91c2VDb3VudHMsIHVuc3BpbGxhYmxlVG1wcyk7
CisgICAgICAgICAgICAgICAgICAgIGRvbmUgPSBkb0FsbG9jYXRpb24oYWxsb2NhdG9yKTsKKyAg
ICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIENv
bG9yaW5nQWxsb2NhdG9yPGJhbmssIEJyaWdncz4gYWxsb2NhdG9yKG1fY29kZSwgbV90bXBXaWR0
aCwgbV91c2VDb3VudHMsIHVuc3BpbGxhYmxlVG1wcyk7Ci0gICAgICAgICAgICAgICAgZG9uZSA9
IGRvQWxsb2NhdGlvbihhbGxvY2F0b3IpOworICAgICAgICAgICAgICAgIGlmIChtX2NvZGUubnVt
VG1wcyhiYW5rKSA8IHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDE2X3Q+OjptYXgoKSkgeworICAg
ICAgICAgICAgICAgICAgICBDb2xvcmluZ0FsbG9jYXRvcjxiYW5rLCBCcmlnZ3MsIEludGVyZmVy
ZW5jZUVkZ2U8dWludDE2X3QsIHVpbnQzMl90Pj4gYWxsb2NhdG9yKG1fY29kZSwgbV90bXBXaWR0
aCwgbV91c2VDb3VudHMsIHVuc3BpbGxhYmxlVG1wcyk7CisgICAgICAgICAgICAgICAgICAgIGRv
bmUgPSBkb0FsbG9jYXRpb24oYWxsb2NhdG9yKTsKKyAgICAgICAgICAgICAgICB9IGVsc2Ugewor
ICAgICAgICAgICAgICAgICAgICBDb2xvcmluZ0FsbG9jYXRvcjxiYW5rLCBCcmlnZ3MsIEludGVy
ZmVyZW5jZUVkZ2U8dWludDMyX3QsIHVpbnQ2NF90Pj4gYWxsb2NhdG9yKG1fY29kZSwgbV90bXBX
aWR0aCwgbV91c2VDb3VudHMsIHVuc3BpbGxhYmxlVG1wcyk7CisgICAgICAgICAgICAgICAgICAg
IGRvbmUgPSBkb0FsbG9jYXRpb24oYWxsb2NhdG9yKTsKKyAgICAgICAgICAgICAgICB9CiAgICAg
ICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgZGF0YUxvZ0xuSWYocmVwb3J0U3RhdHMsICJO
dW0gaXRlcmF0aW9ucyA9ICIsIG51bUl0ZXJhdGlvbnMsICIgZm9yIGJhbms6ICIsIGJhbmspOwpJ
bmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvT3B0aW9uc0xpc3QuaAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9PcHRpb25zTGlzdC5oCShyZXZp
c2lvbiAyNjMxMjYpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9PcHRpb25zTGlz
dC5oCSh3b3JraW5nIGNvcHkpCkBAIC00NTUsNyArNDU1LDcgQEAgY29uc3RleHByIGJvb2wgZW5h
YmxlV2ViQXNzZW1ibHlTdHJlYW1pbgogICAgIHYoVW5zaWduZWQsIHdlYkFzc2VtYmx5QkJRQWly
T3B0aW1pemF0aW9uTGV2ZWwsIDAsIE5vcm1hbCwgIkFpciBPcHRpbWl6YXRpb24gbGV2ZWwgZm9y
IEJCUSBXZWIgQXNzZW1ibHkgbW9kdWxlIGNvbXBpbGF0aW9ucy4iKSBcCiAgICAgdihVbnNpZ25l
ZCwgd2ViQXNzZW1ibHlCQlFCM09wdGltaXphdGlvbkxldmVsLCAxLCBOb3JtYWwsICJCMyBPcHRp
bWl6YXRpb24gbGV2ZWwgZm9yIEJCUSBXZWIgQXNzZW1ibHkgbW9kdWxlIGNvbXBpbGF0aW9ucy4i
KSBcCiAgICAgdihVbnNpZ25lZCwgd2ViQXNzZW1ibHlPTUdPcHRpbWl6YXRpb25MZXZlbCwgT3B0
aW9uczo6ZGVmYXVsdEIzT3B0TGV2ZWwoKSwgTm9ybWFsLCAiQjMgT3B0aW1pemF0aW9uIGxldmVs
IGZvciBPTUcgV2ViIEFzc2VtYmx5IG1vZHVsZSBjb21waWxhdGlvbnMuIikgXAotICAgIHYoVW5z
aWduZWQsIHdlYkFzc2VtYmx5QkJRRmFsbGJhY2tTaXplLCA1MDAwMCwgTm9ybWFsLCAiTGltaXQg
b2YgV2FzbSBmdW5jdGlvbiBzaXplIGFib3ZlIHdoaWNoIHdlIGZhbGxiYWNrIHRvIEJCUSBjb21w
aWxhdGlvbiBtb2RlLiIpIFwKKyAgICB2KFVuc2lnbmVkLCB3ZWJBc3NlbWJseUJCUUZhbGxiYWNr
U2l6ZSwgNjAwMDAsIE5vcm1hbCwgIkxpbWl0IG9mIFdhc20gZnVuY3Rpb24gc2l6ZSBhYm92ZSB3
aGljaCB3ZSBmYWxsYmFjayB0byBCQlEgY29tcGlsYXRpb24gbW9kZS4iKSBcCiAgICAgXAogICAg
IHYoQm9vbCwgdXNlQkJRVGllclVwQ2hlY2tzLCB0cnVlLCBOb3JtYWwsICJFbmFibGVzIHRpZXIg
dXAgY2hlY2tzIGZvciBvdXIgQkJRIGNvZGUuIikgXAogICAgIHYoQm9vbCwgdXNlV2ViQXNzZW1i
bHlPU1IsIHRydWUsIE5vcm1hbCwgbnVsbHB0cikgXAo=
</data>

          </attachment>
      

    </bug>

</bugzilla>