<?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>52983</bug_id>
          
          <creation_ts>2011-01-23 14:42:16 -0800</creation_ts>
          <short_desc>Eliminate m_tagHistory pointer from CSSSelector</short_desc>
          <delta_ts>2011-01-25 15:32:15 -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>CSS</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>PC</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>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Antti Koivisto">koivisto</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>darin</cc>
    
    <cc>hyatt</cc>
    
    <cc>mitz</cc>
    
    <cc>simon.fraser</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>338761</commentid>
    <comment_count>0</comment_count>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2011-01-23 14:42:16 -0800</bug_when>
    <thetext>Eliminate m_tagHistory pointer from CSSSelector. Tag history can be maintained in an array (in CSSSelectorList) instead. This saves memory (selectors are a major memory user on some pages) and help style selector performance by improving locality.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>338767</commentid>
    <comment_count>1</comment_count>
      <attachid>79876</attachid>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2011-01-23 15:05:38 -0800</bug_when>
    <thetext>Created attachment 79876
patch for review</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>338785</commentid>
    <comment_count>2</comment_count>
      <attachid>79876</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2011-01-23 16:20:27 -0800</bug_when>
    <thetext>Comment on attachment 79876
patch for review

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

For some reason the EWS bot can’t apply this patch. You may want to find out why, because it can be useful to know if any builds are broken.

Basic technique seems good; it’s unfortunate the details get a bit messy. More smart pointer use may help a little even though we’ll need to move things in and out of the smart pointers with adopt and leak.

I think that CSSParserSelector would be better if it had functions for all the things that the grammar wants to do to a selector. There’s no reason the grammar needs to reach through it by calling selector() each time. A few inline functions for the operations done by the grammar wouldn’t be all that hard to write, and generally speaking we want to keep the grammar file as simple as possible and put as much of the complexity in code outside that file.

I’m going to say review+ because after reading all my comments none seems mandatory, but I think there is room for improvement here, and I’d really like to see EWS results.

&gt; Source/WebCore/css/CSSGrammar.y:1218
&gt; +            CSSParserSelector* parserSelector = p-&gt;sinkFloatingSelector($4);
&gt; +            CSSSelector* simpleSelector = parserSelector-&gt;releaseSelector();
&gt; +            $$-&gt;selector()-&gt;setSimpleSelector(simpleSelector);
&gt; +            delete parserSelector;

The sinkFloatingSelector function should return a PassOwnPtr&lt;CSSParserSelector&gt;. Similarly, the releaseSelector function should return a PassOwnPtr&lt;CSSSelector&gt; and the setSimpleSelctor function should take a PassOwnPtr. Then we would not need any local variables here. It would just read:

    $$-&gt;selector()-&gt;setSimpleSelector(p-&gt;sinkFloatingSelector($4)-&gt;releaseSelector());

And all the ownership transfer would be taken care of.

&gt; Source/WebCore/css/CSSParser.cpp:5706
&gt; -CSSSelector* CSSParser::sinkFloatingSelector(CSSSelector* selector)
&gt; +CSSParserSelector* CSSParser::sinkFloatingSelector(CSSParserSelector* selector)

This should return a PassOwnPtr as I mentioned above.

&gt; Source/WebCore/css/CSSParserValues.cpp:80
&gt; +    , m_tagHistory(0)

I find the name “tag history” confusing. But it’s not like it’s a new term, so not your problem.

&gt; Source/WebCore/css/CSSParserValues.h:98
&gt; +    CSSSelector* releaseSelector() { return m_selector.leakPtr(); }

This should return a PassOwnPtr.

&gt; Source/WebCore/css/CSSParserValues.h:100
&gt; +    void setTagHistory(CSSParserSelector* selector) { m_tagHistory = selector; }

This should take a PassOwnPtr.

&gt; Source/WebCore/css/CSSParserValues.h:104
&gt; +    CSSParserSelector* m_tagHistory;

This should be an OwnPtr too. You can call leakPtr on it in the destructor.

&gt; Source/WebCore/css/CSSSelector.h:256
&gt; +        // AtomicString is really just an AtomicStringImpl* so the cast below is safe.
&gt; +        const AtomicString&amp; value() const { return *reinterpret_cast&lt;const AtomicString*&gt;(m_hasRareData ? &amp;m_data.m_rareData-&gt;m_value : &amp;m_data.m_value); }

I wonder if there’s a way to avoid this. I believe we’ve had trouble with this kind of code in the past, with high optimization settings in the compiler. Maybe we can have value() just return an AtomicStringImpl*?

&gt; Source/WebCore/css/CSSSelector.h:272
&gt; +        void setValue(const AtomicString&amp; value)
&gt; +        { 
&gt; +            if (m_hasRareData) {
&gt; +                m_data.m_rareData-&gt;m_value = value.impl();
&gt; +                m_data.m_rareData-&gt;m_value-&gt;ref();
&gt; +                return;
&gt; +            }
&gt; +            // Need to do ref counting manually in the union.
&gt; +            m_data.m_value = value.impl();
&gt; +            m_data.m_value-&gt;ref();
&gt; +        }

When a function gets this long I prefer to put the definition outside the class. Maybe we should take a pass through this class and move the function bodies out of the class. I find it makes the class way easier to read.

&gt; Source/WebCore/css/CSSSelector.h:329
&gt; +            RareData(AtomicStringImpl* value)
&gt; +                : m_value(value)
&gt; +                , m_a(0)
&gt;                  , m_b(0)
&gt; -                , m_tagHistory(tagHistory)
&gt;                  , m_attribute(anyQName())
&gt;                  , m_argument(nullAtom)
&gt;              {
&gt;              }
&gt; +            ~RareData()
&gt; +            {
&gt; +                if (m_value)
&gt; +                    m_value-&gt;deref();
&gt; +            }

This seems hard to use correctly. The constructor doesn’t ref but the destructor does deref. I have no doubt the code currently handles this correctly, but I suspect it will be easy to screw this up later.

One way to do this is to make the constructor argument be a PassRefPtr&lt;AtomicStringImpl&gt; and then call leakPtr on it. This makes it much harder to use it incorrectly.

&gt; Source/WebCore/css/CSSSelector.h:334
&gt; +            AtomicStringImpl* m_value;

Why not use AtomicString or RefPtr&lt;AtomicStringImpl&gt; here? I don’t think a raw pointer is best. It’s easy to transfer ownership from a raw pointer, by calling adoptRef on it. Even though you need to use a raw pointer in the union, I think it’s better to not use a raw pointer here as well.

&gt; Source/WebCore/css/CSSSelector.h:353
&gt; -            DataUnion() : m_tagHistory(0) { }
&gt; -            CSSSelector* m_tagHistory;
&gt; +            DataUnion() : m_value(0) { }
&gt;              RareData* m_rareData;
&gt; +            AtomicStringImpl* m_value;

The old union used to initialize the first value. Now you’re initializing the second, which is a little stranger. Obviously the order doesn’t matter, but it kind of attracts the attention a tiny bit.

&gt; Source/WebCore/css/CSSSelectorList.cpp:50
&gt; +    const size_t vectorSize = selectorVector.size();
&gt; +    size_t arraySize = 0;

I don’t think it’s all that helpful to distinguish the passed-in vector from the adopted one by calling the latter an array. I know it’s using malloc directly, but that seems an implementation detail. I think the internal one could be called something like “flattened” instead. Or “complete”. Or we could call it the “list” since it’s the actual list.

&gt; Source/WebCore/css/CSSSelectorList.cpp:60
&gt; +        delete selectorVector[0];

This makes it clear that selectorVector should be a Vector&lt;OwnPtr&lt;CSSParserSelector&gt; &gt;.

Doing the deletion by hand is trickier than it needs to be.

&gt; Source/WebCore/css/CSSSelectorList.cpp:64
&gt; +    m_selectorArray = reinterpret_cast&lt;CSSSelector*&gt;(fastMalloc(sizeof(CSSSelector) * arraySize));

This should be static_cast, not reinterpret_cast.

&gt; Source/WebCore/css/CSSSelectorList.cpp:70
&gt; +            memcpy(&amp;m_selectorArray[arrayIndex], selector, sizeof(CSSSelector));

It’s dangerous to move a CSSSelector this way unless the class knows about it; some classes have pointers into themselves or other such things. If we really need this move operation, we should make a function member of the CSSSelector class to do the work. That makes it more likely that someone changing CSSSelector around won’t invalidate this operation. We can just name the function move or moveIntoUninitializedMemory or something like that and make it either a member function or static member function.

&gt; Source/WebCore/css/CSSSelectorList.h:49
&gt; +    static CSSSelector* next(CSSSelector* current) {
&gt; +        while (!current-&gt;isLastInTagHistory())
&gt; +            current++;
&gt; +        return current-&gt;isLastInSelectorList() ? 0 : current + 1;
&gt; +    }

Same comment about keeping long functions out of the class. I also think that the various places where we do the “+ 1” trick to find adjacent elements need “why” comments.

&gt; Source/WebCore/css/CSSSelectorList.h:50
&gt; +    bool hasOneSelector() const { return m_selectorArray ? !next(m_selectorArray) : false; }

I prefer &amp;&amp; over ? : for cases like this, even thought the old code used ? :</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>339456</commentid>
    <comment_count>3</comment_count>
      <attachid>80009</attachid>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2011-01-24 20:05:54 -0800</bug_when>
    <thetext>Created attachment 80009
better CSSParserSelector, more OwnPtrs

Implemented most of Darin&apos;s comments and updated to current trunk. Nasty casting trick in CSSSelector::value() is still there as trying to switch the interface to return AtomicStringImpl* resulted in a ballooning refactoring.

Requesting re-review due to significant changes.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>339457</commentid>
    <comment_count>4</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-01-24 20:07:26 -0800</bug_when>
    <thetext>Attachment 80009 did not pass style-queue:

Failed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;Source/WebCore/ChangeLog&apos;, u&apos;Source/WebCor...&quot; exit_code: 1

Source/WebCore/css/CSSSelectorList.cpp:68:  Local variables should never be PassOwnPtr (see http://webkit.org/coding/RefPtr.html).  [readability/pass_ptr] [5]
Source/WebCore/css/CSSSelector.cpp:701:  Boolean expressions that span multiple lines should have their operators on the left side of the line instead of the right side.  [whitespace/operators] [4]
Source/WebCore/css/CSSSelector.h:257:  Extra space before last semicolon. If this should be an empty statement, use { } instead.  [whitespace/semicolon] [5]
Source/WebCore/css/CSSSelector.h:266:  The parameter name &quot;value&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebCore/css/CSSParserValues.h:25:  Alphabetical sorting problem.  [build/include_order] [4]
Total errors found: 5 in 17 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>339458</commentid>
    <comment_count>5</comment_count>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2011-01-24 20:10:48 -0800</bug_when>
    <thetext>&gt; &gt; Source/WebCore/css/CSSSelectorList.cpp:70
&gt; &gt; +            memcpy(&amp;m_selectorArray[arrayIndex], selector, sizeof(CSSSelector));
&gt; 
&gt; It’s dangerous to move a CSSSelector this way unless the class knows about it; some classes have pointers into themselves or other such things. If we really need this move operation, we should make a function member of the CSSSelector class to do the work. That makes it more likely that someone changing CSSSelector around won’t invalidate this operation. We can just name the function move or moveIntoUninitializedMemory or something like that and make it either a member function or static member function.

I left this as is for now as CSSSelectorList and CSSSelector are already very tightly coupled.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>339661</commentid>
    <comment_count>6</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2011-01-25 08:46:33 -0800</bug_when>
    <thetext>(In reply to comment #5)
&gt; &gt; &gt; Source/WebCore/css/CSSSelectorList.cpp:70
&gt; &gt; &gt; +            memcpy(&amp;m_selectorArray[arrayIndex], selector, sizeof(CSSSelector));
&gt; &gt; 
&gt; &gt; It’s dangerous to move a CSSSelector this way unless the class knows about it; some classes have pointers into themselves or other such things. If we really need this move operation, we should make a function member of the CSSSelector class to do the work. That makes it more likely that someone changing CSSSelector around won’t invalidate this operation. We can just name the function move or moveIntoUninitializedMemory or something like that and make it either a member function or static member function.
&gt; 
&gt; I left this as is for now as CSSSelectorList and CSSSelector are already very tightly coupled.

I’m not convinced. It would be straightforward to do what I asked.

Anyway, I’ll review again.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>339665</commentid>
    <comment_count>7</comment_count>
      <attachid>80009</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2011-01-25 08:57:47 -0800</bug_when>
    <thetext>Comment on attachment 80009
better CSSParserSelector, more OwnPtrs

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

Patch looks great. I’m going to say review+ even though I have suggestions for further improvement.

&gt; Source/WebCore/css/CSSParser.cpp:5940
&gt; +    CSSParserSelector* elementNameSelector = new CSSParserSelector;
&gt; +    elementNameSelector-&gt;setTag(tag);
&gt;      specifiers-&gt;setTagHistory(elementNameSelector);

The local variable here should be an OwnPtr&lt;CSSParserSelector&gt; and the call to setTagHistory should have a release in it. That way, the adoptPtr will be right next to the new, which is how we want it. We want an adopt right next to new as much as possible. We could even make CSSParserSelector::create(), which returns a PassOwnPtr.

&gt; Source/WebCore/css/CSSParserValues.cpp:87
&gt; +    Vector&lt;CSSParserSelector*, 16&gt; toDelete;

I’d use OwnPtr here.

&gt; Source/WebCore/css/CSSParserValues.cpp:88
&gt; +    CSSParserSelector* selector = m_tagHistory.leakPtr();

And OwnPtr here, and release instead of leakPtr.

&gt; Source/WebCore/css/CSSParserValues.cpp:91
&gt; +        toDelete.append(selector);
&gt; +        CSSParserSelector* next = selector-&gt;m_tagHistory.leakPtr();

And get the value of next into an OwnPtr, using release instead of leakPtr. And use another release on the append line.

&gt; Source/WebCore/css/CSSParserValues.cpp:94
&gt; +        selector = next;

And there would be a release here.

&gt; Source/WebCore/css/CSSParserValues.cpp:96
&gt; +    deleteAllValues(toDelete);

And then no deleteAllValues here.

&gt;&gt; Source/WebCore/css/CSSParserValues.h:25
&gt;&gt; +#include &quot;CSSSelector.h&quot;
&gt; 
&gt; Alphabetical sorting problem.  [build/include_order] [4]

The style bot is right. The includes should go in the reverse order.

&gt;&gt; Source/WebCore/css/CSSSelector.h:257
&gt;&gt; +        const QualifiedName&amp; tag() const { return m_tag; } ;
&gt; 
&gt; Extra space before last semicolon. If this should be an empty statement, use { } instead.  [whitespace/semicolon] [5]

We should remove that last semicolon on the line. No semicolon after a function body.

&gt;&gt; Source/WebCore/css/CSSSelector.h:266
&gt;&gt; +        void setValue(const AtomicString&amp; value);
&gt; 
&gt; The parameter name &quot;value&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]

I agree with the bot.

&gt; Source/WebCore/css/CSSSelector.h:269
&gt;          void setAttribute(const QualifiedName&amp; value);
&gt;          void setArgument(const AtomicString&amp; value);
&gt; -        void setSimpleSelector(CSSSelector* value);
&gt; +        void setSimpleSelector(PassOwnPtr&lt;CSSSelector&gt; value);

No need for these “value” argument names either.

&gt; Source/WebCore/css/CSSSelector.h:325
&gt; +            AtomicStringImpl* m_value; // Plain pointer to keep things uniform with the union.

I still think that RefPtr would make things a little safer, but with the comment this is at least not mysterious.

&gt;&gt; Source/WebCore/css/CSSSelectorList.cpp:68
&gt;&gt; +            PassOwnPtr&lt;CSSSelector&gt; selector = current-&gt;releaseSelector();
&gt; 
&gt; Local variables should never be PassOwnPtr (see http://webkit.org/coding/RefPtr.html).  [readability/pass_ptr] [5]

This should be OwnPtr as the stylebot says.

&gt; Source/WebCore/css/CSSSelectorList.cpp:73
&gt; +            memcpy(&amp;m_selectorArray[arrayIndex], selector.get(), sizeof(CSSSelector));
&gt; +            current = current-&gt;tagHistory();
&gt; +            // We want to free the memory (which was allocated with fastNew), but we
&gt; +            // don&apos;t want the destructor to run since it will affect the copy we&apos;ve just made.;
&gt; +            fastDeleteSkippingDestructor(selector.leakPtr());

I’d really like to see a single operation that combines the memcpy with the fastDeleteSkippingDestructor, and have it be a member of the CSSSelector class. When the idiom is tricky like this I want it to be as tightly constrained as possible to make it hard to misuse.

&gt; Source/WebCore/css/CSSSelectorList.cpp:82
&gt; +    m_selectorArray[arrayIndex - 1].setLastInSelectorList();

Can the passed-in vector be empty? I see code above for size 1, but what about size 0?

&gt; Source/WebCore/css/CSSSelectorList.h:45
&gt; +    static CSSSelector* next(CSSSelector* current);

I don’t think the argument name “current” adds anything here.

&gt; Source/WebCore/css/CSSSelectorList.h:64
&gt; +inline CSSSelector* CSSSelectorList::next(CSSSelector* current)
&gt; +{
&gt; +    while (!current-&gt;isLastInTagHistory())
&gt; +        current++;
&gt; +    return current-&gt;isLastInSelectorList() ? 0 : current + 1;
&gt; +}

I think this may need a comment. Skipping the tag history runs is a slightly confusing concept.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>339681</commentid>
    <comment_count>8</comment_count>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2011-01-25 09:23:24 -0800</bug_when>
    <thetext>
&gt; &gt; Source/WebCore/css/CSSSelectorList.cpp:82
&gt; &gt; +    m_selectorArray[arrayIndex - 1].setLastInSelectorList();
&gt; 
&gt; Can the passed-in vector be empty? I see code above for size 1, but what about size 0?

These cover the case:

ASSERT(flattenedSize);
...
ASSERT(flattenedSize == arrayIndex);
Array[arrayIndex - 1].setLastInSelectorList();</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>339684</commentid>
    <comment_count>9</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2011-01-25 09:29:27 -0800</bug_when>
    <thetext>(In reply to comment #8)
&gt; These cover the case:
&gt; 
&gt; ASSERT(flattenedSize);
&gt; ...
&gt; ASSERT(flattenedSize == arrayIndex);
&gt; Array[arrayIndex - 1].setLastInSelectorList();

But what guarantees that assertion will be true?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>339797</commentid>
    <comment_count>10</comment_count>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2011-01-25 11:50:24 -0800</bug_when>
    <thetext>(In reply to comment #9)
&gt; But what guarantees that assertion will be true?

CSS grammar should guarantee it. I&apos;ll throw a return after the assert to be sure.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>339813</commentid>
    <comment_count>11</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2011-01-25 11:59:20 -0800</bug_when>
    <thetext>(In reply to comment #10)
&gt; (In reply to comment #9)
&gt; &gt; But what guarantees that assertion will be true?
&gt; 
&gt; CSS grammar should guarantee it.

Good answer.

&gt; I&apos;ll throw a return after the assert to be sure.

I don’t think you need that.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>339971</commentid>
    <comment_count>12</comment_count>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2011-01-25 15:32:15 -0800</bug_when>
    <thetext>http://trac.webkit.org/changeset/76648</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>79876</attachid>
            <date>2011-01-23 15:05:38 -0800</date>
            <delta_ts>2011-01-24 20:05:54 -0800</delta_ts>
            <desc>patch for review</desc>
            <filename>selector-array-6.patch</filename>
            <type>text/plain</type>
            <size>54192</size>
            <attacher name="Antti Koivisto">koivisto</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDc2NDcwKQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTA4IEBACisyMDExLTAxLTIzICBBbnR0aSBL
b2l2aXN0byAgPGFudHRpQGFwcGxlLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkg
KE9PUFMhKS4KKworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/
aWQ9NTI5ODMKKyAgICAgICAgRWxpbWluYXRlIG1fdGFnSGlzdG9yeSBwb2ludGVyIGZyb20gQ1NT
U2VsZWN0b3IKKworICAgICAgICBLZWVwIHRoZSBjb21wb25lbnQgc2VsZWN0b3JzIGluIHRoZSBh
cnJheSBpbiBDU1NTZWxlY3Rvckxpc3QgaW5zdGVhZAorICAgICAgICBvZiBtYWludGFpbmluZyBh
IGxpbmtlZCBsaXN0IGJldHdlZW4gdGhlbS4gVGhpcyBhbGxvd3MgZWxpbWluYXRpbmcKKyAgICAg
ICAgbV90YWdIaXN0b3J5IHBvaW50ZXIsIHNocmlua2luZyBDU1NTZWxlY3RvciBieSAyNSUgKHNl
bGVjdGlvbiBwZXJmb3JtYW5jZQorICAgICAgICBzZWVtcyB0byBpbXByb3ZlIHNvbWUgdG9vIGR1
ZSB0byBiZXR0ZXIgbG9jYWxpdHkpLgorCisgICAgICAgICogY3NzL0NTU0dyYW1tYXIueToKKyAg
ICAgICAgCisgICAgICAgICAgICBDU1NQYXJzZXJTZWxlY3RvciBpcyB1c2VkIGR1cmluZyBwYXJz
aW5nIHRvIGtlZXAgdGhlIHRhZyBoaXN0b3J5IGluIAorICAgICAgICAgICAgYSBsaW5rZWQgbGlz
dC4gVGhpcyBpcyBmbGF0dGVuZWQgdG8gYW4gYXJyYXkgYWZ0ZXIgcGFyc2luZy4KKyAgICAgICAg
ICAgIFVzZSBhY2Nlc3NvcnMgZm9yIHNlbGVjdG9yIHRhZyBhbmQgdmFsdWUuCisgICAgICAgICAg
ICA6bm90IG5lZWRzIHRvIGNoZWNrIHRhZyBoaXN0b3J5IGV4cGxpY2l0bHkgZnJvbSB0aGUgQ1NT
UGFyc2VyU2VsZWN0b3IuCisgICAgICAgIAorICAgICAgICAqIGNzcy9DU1NQYWdlUnVsZS5jcHA6
CisgICAgICAgIChXZWJDb3JlOjpDU1NQYWdlUnVsZTo6Q1NTUGFnZVJ1bGUpOgorICAgICAgICAq
IGNzcy9DU1NQYWdlUnVsZS5oOgorICAgICAgICAoV2ViQ29yZTo6Q1NTUGFnZVJ1bGU6OmNyZWF0
ZSk6CisgICAgICAgICogY3NzL0NTU1BhcnNlci5jcHA6CisgICAgICAgIAorICAgICAgICAgICAg
U2ltcGxpZnkuCisgICAgICAgIAorICAgICAgICAoV2ViQ29yZTo6Q1NTUGFyc2VyOjpjcmVhdGVG
bG9hdGluZ1NlbGVjdG9yKToKKyAgICAgICAgKFdlYkNvcmU6OkNTU1BhcnNlcjo6c2lua0Zsb2F0
aW5nU2VsZWN0b3IpOgorICAgICAgICAoV2ViQ29yZTo6Q1NTUGFyc2VyOjpjcmVhdGVTdHlsZVJ1
bGUpOgorICAgICAgICAoV2ViQ29yZTo6Q1NTUGFyc2VyOjp1cGRhdGVTcGVjaWZpZXJzV2l0aEVs
ZW1lbnROYW1lKToKKyAgICAgICAgKFdlYkNvcmU6OkNTU1BhcnNlcjo6Y3JlYXRlUGFnZVJ1bGUp
OgorICAgICAgICAqIGNzcy9DU1NQYXJzZXIuaDoKKyAgICAgICAgKFdlYkNvcmU6OkNTU1BhcnNl
cjo6cmV1c2FibGVTZWxlY3RvclZlY3Rvcik6CisgICAgICAgIAorICAgICAgICAgICAgQ1NTUFNl
bGVjdG9yIC0+IENTU1BhcnNlclNlbGVjdG9yLi4KKyAgICAgICAgICAgIFVzZSBhY2Nlc3NvcnMg
Zm9yIHNlbGVjdG9yIHRhZyBhbmQgdmFsdWUuCisgICAgICAgIAorICAgICAgICAqIGNzcy9DU1NQ
YXJzZXJWYWx1ZXMuY3BwOgorICAgICAgICAoV2ViQ29yZTo6Q1NTUGFyc2VyU2VsZWN0b3I6OkNT
U1BhcnNlclNlbGVjdG9yKToKKyAgICAgICAgKFdlYkNvcmU6OkNTU1BhcnNlclNlbGVjdG9yOjp+
Q1NTUGFyc2VyU2VsZWN0b3IpOiAgICAgICAgCisgICAgICAgICogY3NzL0NTU1BhcnNlclZhbHVl
cy5oOgorICAgICAgICAoV2ViQ29yZTo6Q1NTUGFyc2VyU2VsZWN0b3I6OnNlbGVjdG9yKToKKyAg
ICAgICAgKFdlYkNvcmU6OkNTU1BhcnNlclNlbGVjdG9yOjpyZWxlYXNlU2VsZWN0b3IpOgorICAg
ICAgICAoV2ViQ29yZTo6Q1NTUGFyc2VyU2VsZWN0b3I6OnRhZ0hpc3RvcnkpOgorICAgICAgICAo
V2ViQ29yZTo6Q1NTUGFyc2VyU2VsZWN0b3I6OnNldFRhZ0hpc3RvcnkpOgorICAgICAgICAKKyAg
ICAgICAgICAgIExpbmtlZCBsaXN0IHVzZWQgZHVyaW5nIHBhcnNpbmcuIEF2b2lkIHJlY3Vyc2l2
ZSBkZXN0cnVjdGlvbi4KKyAgICAgICAgCisgICAgICAgICogY3NzL0NTU1NlbGVjdG9yLmNwcDoK
KyAgICAgICAgKFdlYkNvcmU6OkNTU1NlbGVjdG9yOjpleHRyYWN0UHNldWRvVHlwZSk6CisgICAg
ICAgIChXZWJDb3JlOjpDU1NTZWxlY3Rvcjo6b3BlcmF0b3I9PSk6CisgICAgICAgIChXZWJDb3Jl
OjpDU1NTZWxlY3Rvcjo6c2VsZWN0b3JUZXh0KToKKyAgICAgICAgKiBjc3MvQ1NTU2VsZWN0b3Iu
aDoKKyAgICAgICAgKFdlYkNvcmU6OkNTU1NlbGVjdG9yOjpDU1NTZWxlY3Rvcik6CisgICAgICAg
IChXZWJDb3JlOjpDU1NTZWxlY3Rvcjo6fkNTU1NlbGVjdG9yKTogICAgICAgIAorICAgICAgICAo
V2ViQ29yZTo6Q1NTU2VsZWN0b3I6OnRhZ0hpc3RvcnkpOgorICAgICAgICAoV2ViQ29yZTo6Q1NT
U2VsZWN0b3I6OnRhZyk6CisgICAgICAgIChXZWJDb3JlOjpDU1NTZWxlY3Rvcjo6dmFsdWUpOgor
ICAgICAgICAoV2ViQ29yZTo6Q1NTU2VsZWN0b3I6OnNldFRhZyk6CisgICAgICAgIChXZWJDb3Jl
OjpDU1NTZWxlY3Rvcjo6c2V0VmFsdWUpOgorICAgICAgICAoV2ViQ29yZTo6Q1NTU2VsZWN0b3I6
OmlzTGFzdEluVGFnSGlzdG9yeSk6CisgICAgICAgIChXZWJDb3JlOjpDU1NTZWxlY3Rvcjo6c2V0
Tm90TGFzdEluVGFnSGlzdG9yeSk6CisgICAgICAgIChXZWJDb3JlOjpDU1NTZWxlY3Rvcjo6UmFy
ZURhdGE6OlJhcmVEYXRhKToKKyAgICAgICAgKFdlYkNvcmU6OkNTU1NlbGVjdG9yOjpSYXJlRGF0
YTo6flJhcmVEYXRhKToKKyAgICAgICAgKFdlYkNvcmU6OkNTU1NlbGVjdG9yOjpjcmVhdGVSYXJl
RGF0YSk6CisgICAgICAgIAorICAgICAgICAgICAgUmVtb3ZlIG1fdGFnSGlzdG9yeS4KKyAgICAg
ICAgICAgIEtlZXAgbV92YWx1ZSBpbiB0aGUgdW5pb24gd2l0aCB0aGUgcmFyZSBkYXRhIHBvaW50
ZXIgaW5zdGVhZC4KKyAgICAgICAgICAgIE1ha2UgbV92YWx1ZSBhbmQgbV90YWcgcHJpdmF0ZSwg
aW1wbGVtZW50IGFjY2Vzc29ycy4KKyAgICAgICAgICAgIEFkZCBhIG5ldyBiaXQgdG8gaW5kaWNh
dGUgZW5kIG9mIHRoZSB0YWcgaGlzdG9yeSAobXVsdGlwYXJ0IHNlbGVjdG9yKS4KKyAgICAgICAg
ICAgIEVsaW1pbmF0ZSBjb21wbGV4IGRlc3RydWN0aW9uLiBTZWxlY3RvcnMgYXJlIG5vdyBkZWxl
dGVkIGFzIGFuIGFycmF5IG9yIGJ5IENTU1BhcnNlclNlbGVjdG9yIGNoYWluLgorICAgICAgICAK
KyAgICAgICAgKiBjc3MvQ1NTU2VsZWN0b3JMaXN0LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkNT
U1NlbGVjdG9yTGlzdDo6YWRvcHRTZWxlY3RvclZlY3Rvcik6CisgICAgICAgIChXZWJDb3JlOjpT
ZWxlY3Rvck5lZWRzTmFtZXNwYWNlUmVzb2x1dGlvbkZ1bmN0b3I6Om9wZXJhdG9yKCkpOgorICAg
ICAgICAKKyAgICAgICAgICAgIEZsYXR0ZW4gZXZlcnl0aGluZyB0byBhbiBhcnJheS4KKyAgICAg
ICAgCisgICAgICAgICogY3NzL0NTU1NlbGVjdG9yTGlzdC5oOgorICAgICAgICAoV2ViQ29yZTo6
Q1NTU2VsZWN0b3JMaXN0OjpuZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OkNTU1NlbGVjdG9yTGlz
dDo6aGFzT25lU2VsZWN0b3IpOgorICAgICAgICAKKyAgICAgICAgICAgIFNraXAgb3ZlciB0aGUg
cGFydHMgb2YgbXVsdGlwYXJ0IHNlbGVjdG9ycyB0byBmaW5kIHRoZSBuZXh0IHNlbGVjdG9yLgor
ICAgICAgICAKKyAgICAgICAgKiBjc3MvQ1NTU3R5bGVSdWxlLmg6CisgICAgICAgIChXZWJDb3Jl
OjpDU1NTdHlsZVJ1bGU6OmFkb3B0U2VsZWN0b3JWZWN0b3IpOgorICAgICAgICAKKyAgICAgICAg
ICAgIENTU1BTZWxlY3RvciAtPiBDU1NQYXJzZXJTZWxlY3Rvci4KKyAgICAgICAgCisgICAgICAg
ICogY3NzL0NTU1N0eWxlU2VsZWN0b3IuY3BwOgorICAgICAgICAoV2ViQ29yZTo6Q1NTU3R5bGVT
ZWxlY3Rvcjo6U2VsZWN0b3JDaGVja2VyOjpjaGVja09uZVNlbGVjdG9yKToKKyAgICAgICAgKFdl
YkNvcmU6OkNTU1J1bGVTZXQ6OmFkZFJ1bGUpOgorICAgICAgICAoV2ViQ29yZTo6Y29sbGVjdElk
c0FuZFNpYmxpbmdSdWxlc0Zyb21MaXN0KToKKyAgICAgICAgKFdlYkNvcmU6OkNTU1N0eWxlU2Vs
ZWN0b3I6Om1hdGNoUGFnZVJ1bGVzRm9yTGlzdCk6CisgICAgICAgIAorICAgICAgICAgICAgVXNl
IGFjY2Vzc29ycyBmb3Igc2VsZWN0b3IgdGFnIGFuZCB2YWx1ZS4KKyAgICAgICAgCisgICAgICAg
ICogZG9tL05vZGUuY3BwOgorICAgICAgICAoV2ViQ29yZTo6Tm9kZTo6cXVlcnlTZWxlY3Rvcik6
CisgICAgICAgICogZG9tL1NlbGVjdG9yTm9kZUxpc3QuY3BwOgorICAgICAgICAoV2ViQ29yZTo6
Y3JlYXRlU2VsZWN0b3JOb2RlTGlzdCk6CisgICAgICAgIAorICAgICAgICAgICAgVXNlIGFjY2Vz
c29ycyBmb3Igc2VsZWN0b3IgdGFnIGFuZCB2YWx1ZS4KKwogMjAxMS0wMS0yMyAgUGF0cmljayBH
YW5zdGVyZXIgIDxwYXJvZ2FAd2Via2l0Lm9yZz4KIAogICAgICAgICBSZXZpZXdlZCBieSBEYXZp
ZCBLaWx6ZXIuCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9jc3MvQ1NTR3JhbW1hci55Cj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2Nzcy9DU1NHcmFtbWFyLnkJKHJldmlzaW9uIDc2MTc2KQor
KysgU291cmNlL1dlYkNvcmUvY3NzL0NTU0dyYW1tYXIueQkod29ya2luZyBjb3B5KQpAQCAtNjks
OCArNjksOCBAQCB1c2luZyBuYW1lc3BhY2UgSFRNTE5hbWVzOwogCiAgICAgQ1NTUnVsZSogcnVs
ZTsKICAgICBDU1NSdWxlTGlzdCogcnVsZUxpc3Q7Ci0gICAgQ1NTU2VsZWN0b3IqIHNlbGVjdG9y
OwotICAgIFZlY3RvcjxDU1NTZWxlY3Rvcio+KiBzZWxlY3Rvckxpc3Q7CisgICAgQ1NTUGFyc2Vy
U2VsZWN0b3IqIHNlbGVjdG9yOworICAgIFZlY3RvcjxDU1NQYXJzZXJTZWxlY3Rvcio+KiBzZWxl
Y3Rvckxpc3Q7CiAgICAgQ1NTU2VsZWN0b3I6Ok1hcmdpbkJveFR5cGUgbWFyZ2luQm94OwogICAg
IENTU1NlbGVjdG9yOjpSZWxhdGlvbiByZWxhdGlvbjsKICAgICBNZWRpYUxpc3QqIG1lZGlhTGlz
dDsKQEAgLTY2MywyNiArNjYzLDI2IEBAIHBhZ2Vfc2VsZWN0b3I6CiAgICAgSURFTlQgewogICAg
ICAgICBDU1NQYXJzZXIqIHAgPSBzdGF0aWNfY2FzdDxDU1NQYXJzZXIqPihwYXJzZXIpOwogICAg
ICAgICAkJCA9IHAtPmNyZWF0ZUZsb2F0aW5nU2VsZWN0b3IoKTsKLSAgICAgICAgJCQtPm1fdGFn
ID0gUXVhbGlmaWVkTmFtZShudWxsQXRvbSwgJDEsIHAtPm1fZGVmYXVsdE5hbWVzcGFjZSk7Ci0g
ICAgICAgICQkLT5zZXRGb3JQYWdlKCk7CisgICAgICAgICQkLT5zZWxlY3RvcigpLT5zZXRUYWco
UXVhbGlmaWVkTmFtZShudWxsQXRvbSwgJDEsIHAtPm1fZGVmYXVsdE5hbWVzcGFjZSkpOworICAg
ICAgICAkJC0+c2VsZWN0b3IoKS0+c2V0Rm9yUGFnZSgpOwogICAgIH0KICAgICB8IElERU5UIHBz
ZXVkb19wYWdlIHsKICAgICAgICAgQ1NTUGFyc2VyKiBwID0gc3RhdGljX2Nhc3Q8Q1NTUGFyc2Vy
Kj4ocGFyc2VyKTsKICAgICAgICAgJCQgPSAkMjsKICAgICAgICAgaWYgKCQkKSB7Ci0gICAgICAg
ICAgICAkJC0+bV90YWcgPSBRdWFsaWZpZWROYW1lKG51bGxBdG9tLCAkMSwgcC0+bV9kZWZhdWx0
TmFtZXNwYWNlKTsKLSAgICAgICAgICAgICQkLT5zZXRGb3JQYWdlKCk7CisgICAgICAgICAgICAk
JC0+c2VsZWN0b3IoKS0+c2V0VGFnKFF1YWxpZmllZE5hbWUobnVsbEF0b20sICQxLCBwLT5tX2Rl
ZmF1bHROYW1lc3BhY2UpKTsKKyAgICAgICAgICAgICQkLT5zZWxlY3RvcigpLT5zZXRGb3JQYWdl
KCk7CiAgICAgICAgIH0KICAgICB9CiAgICAgfCBwc2V1ZG9fcGFnZSB7CiAgICAgICAgICQkID0g
JDE7CiAgICAgICAgIGlmICgkJCkKLSAgICAgICAgICAgICQkLT5zZXRGb3JQYWdlKCk7CisgICAg
ICAgICAgICAkJC0+c2VsZWN0b3IoKS0+c2V0Rm9yUGFnZSgpOwogICAgIH0KICAgICB8IC8qIGVt
cHR5ICovIHsKICAgICAgICAgQ1NTUGFyc2VyKiBwID0gc3RhdGljX2Nhc3Q8Q1NTUGFyc2VyKj4o
cGFyc2VyKTsKICAgICAgICAgJCQgPSBwLT5jcmVhdGVGbG9hdGluZ1NlbGVjdG9yKCk7Ci0gICAg
ICAgICQkLT5zZXRGb3JQYWdlKCk7CisgICAgICAgICQkLT5zZWxlY3RvcigpLT5zZXRGb3JQYWdl
KCk7CiAgICAgfQogICAgIDsKIApAQCAtODUzLDEwICs4NTMsMTAgQEAgc2VsZWN0b3I6CiAgICAg
ICAgICAgICAkJCA9IDA7CiAgICAgICAgIGVsc2UgaWYgKCQkKSB7CiAgICAgICAgICAgICBDU1NQ
YXJzZXIqIHAgPSBzdGF0aWNfY2FzdDxDU1NQYXJzZXIqPihwYXJzZXIpOwotICAgICAgICAgICAg
Q1NTU2VsZWN0b3IqIGVuZCA9ICQkOworICAgICAgICAgICAgQ1NTUGFyc2VyU2VsZWN0b3IqIGVu
ZCA9ICQkOwogICAgICAgICAgICAgd2hpbGUgKGVuZC0+dGFnSGlzdG9yeSgpKQogICAgICAgICAg
ICAgICAgIGVuZCA9IGVuZC0+dGFnSGlzdG9yeSgpOwotICAgICAgICAgICAgZW5kLT5tX3JlbGF0
aW9uID0gQ1NTU2VsZWN0b3I6OkRlc2NlbmRhbnQ7CisgICAgICAgICAgICBlbmQtPnNlbGVjdG9y
KCktPm1fcmVsYXRpb24gPSBDU1NTZWxlY3Rvcjo6RGVzY2VuZGFudDsKICAgICAgICAgICAgIGVu
ZC0+c2V0VGFnSGlzdG9yeShwLT5zaW5rRmxvYXRpbmdTZWxlY3RvcigkMSkpOwogICAgICAgICAg
ICAgaWYgKERvY3VtZW50KiBkb2MgPSBwLT5kb2N1bWVudCgpKQogICAgICAgICAgICAgICAgIGRv
Yy0+c2V0VXNlc0Rlc2NlbmRhbnRSdWxlcyh0cnVlKTsKQEAgLTg2OCwxMCArODY4LDEwIEBAIHNl
bGVjdG9yOgogICAgICAgICAgICAgJCQgPSAwOwogICAgICAgICBlbHNlIGlmICgkJCkgewogICAg
ICAgICAgICAgQ1NTUGFyc2VyKiBwID0gc3RhdGljX2Nhc3Q8Q1NTUGFyc2VyKj4ocGFyc2VyKTsK
LSAgICAgICAgICAgIENTU1NlbGVjdG9yKiBlbmQgPSAkJDsKKyAgICAgICAgICAgIENTU1BhcnNl
clNlbGVjdG9yKiBlbmQgPSAkJDsKICAgICAgICAgICAgIHdoaWxlIChlbmQtPnRhZ0hpc3Rvcnko
KSkKICAgICAgICAgICAgICAgICBlbmQgPSBlbmQtPnRhZ0hpc3RvcnkoKTsKLSAgICAgICAgICAg
IGVuZC0+bV9yZWxhdGlvbiA9ICQyOworICAgICAgICAgICAgZW5kLT5zZWxlY3RvcigpLT5tX3Jl
bGF0aW9uID0gJDI7CiAgICAgICAgICAgICBlbmQtPnNldFRhZ0hpc3RvcnkocC0+c2lua0Zsb2F0
aW5nU2VsZWN0b3IoJDEpKTsKICAgICAgICAgICAgIGlmICgkMiA9PSBDU1NTZWxlY3Rvcjo6Q2hp
bGQpIHsKICAgICAgICAgICAgICAgICBpZiAoRG9jdW1lbnQqIGRvYyA9IHAtPmRvY3VtZW50KCkp
CkBAIC04OTcsNyArODk3LDcgQEAgc2ltcGxlX3NlbGVjdG9yOgogICAgIGVsZW1lbnRfbmFtZSB7
CiAgICAgICAgIENTU1BhcnNlciogcCA9IHN0YXRpY19jYXN0PENTU1BhcnNlcio+KHBhcnNlcik7
CiAgICAgICAgICQkID0gcC0+Y3JlYXRlRmxvYXRpbmdTZWxlY3RvcigpOwotICAgICAgICAkJC0+
bV90YWcgPSBRdWFsaWZpZWROYW1lKG51bGxBdG9tLCAkMSwgcC0+bV9kZWZhdWx0TmFtZXNwYWNl
KTsKKyAgICAgICAgJCQtPnNlbGVjdG9yKCktPnNldFRhZyhRdWFsaWZpZWROYW1lKG51bGxBdG9t
LCAkMSwgcC0+bV9kZWZhdWx0TmFtZXNwYWNlKSk7CiAgICAgfQogICAgIHwgZWxlbWVudF9uYW1l
IHNwZWNpZmllcl9saXN0IHsKICAgICAgICAgJCQgPSAkMjsKQEAgLTkxNCwxMCArOTE0LDEwIEBA
IHNpbXBsZV9zZWxlY3RvcjoKICAgICAgICAgQ1NTUGFyc2VyKiBwID0gc3RhdGljX2Nhc3Q8Q1NT
UGFyc2VyKj4ocGFyc2VyKTsKICAgICAgICAgJCQgPSBwLT5jcmVhdGVGbG9hdGluZ1NlbGVjdG9y
KCk7CiAgICAgICAgIGlmIChwLT5tX3N0eWxlU2hlZXQpCi0gICAgICAgICAgICAkJC0+bV90YWcg
PSBRdWFsaWZpZWROYW1lKG5hbWVzcGFjZVByZWZpeCwgJDIsCi0gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHAtPm1fc3R5bGVTaGVldC0+ZGV0ZXJtaW5lTmFtZXNwYWNlKG5h
bWVzcGFjZVByZWZpeCkpOworICAgICAgICAgICAgJCQtPnNlbGVjdG9yKCktPnNldFRhZyhRdWFs
aWZpZWROYW1lKG5hbWVzcGFjZVByZWZpeCwgJDIsCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHAtPm1fc3R5bGVTaGVldC0+ZGV0ZXJtaW5lTmFtZXNwYWNlKG5hbWVzcGFj
ZVByZWZpeCkpKTsKICAgICAgICAgZWxzZSAvLyBGSVhNRTogU2hvdWxkbid0IHRoaXMgY2FzZSBi
ZSBhbiBlcnJvcj8KLSAgICAgICAgICAgICQkLT5tX3RhZyA9IFF1YWxpZmllZE5hbWUobnVsbEF0
b20sICQyLCBwLT5tX2RlZmF1bHROYW1lc3BhY2UpOworICAgICAgICAgICAgJCQtPnNlbGVjdG9y
KCktPnNldFRhZyhRdWFsaWZpZWROYW1lKG51bGxBdG9tLCAkMiwgcC0+bV9kZWZhdWx0TmFtZXNw
YWNlKSk7CiAgICAgfQogICAgIHwgbmFtZXNwYWNlX3NlbGVjdG9yIGVsZW1lbnRfbmFtZSBzcGVj
aWZpZXJfbGlzdCB7CiAgICAgICAgICQkID0gJDM7CkBAIC05NTYsMTAgKzk1NiwxMCBAQCBzcGVj
aWZpZXJfbGlzdDoKICAgICAgICAgICAgICQkID0gMDsKICAgICAgICAgZWxzZSBpZiAoJDEpIHsK
ICAgICAgICAgICAgIENTU1BhcnNlciogcCA9IHN0YXRpY19jYXN0PENTU1BhcnNlcio+KHBhcnNl
cik7Ci0gICAgICAgICAgICBDU1NTZWxlY3RvciogZW5kOwotICAgICAgICAgICAgQ1NTU2VsZWN0
b3IqIGhpc3Rvcnk7CisgICAgICAgICAgICBDU1NQYXJzZXJTZWxlY3RvciogZW5kOworICAgICAg
ICAgICAgQ1NTUGFyc2VyU2VsZWN0b3IqIGhpc3Rvcnk7CiAgICAgICAgICAgICAvLyBFbnN1cmUg
dGhhdCB1bmtub3duIHBzZXVkbyBlbGVtZW50IGFsd2F5cyBzdGF5cyBhdCB0aGUgdG9wIG9mIHNl
bGVjdG9yIGNoYWluLgotICAgICAgICAgICAgaWYgKCQyLT5pc1Vua25vd25Qc2V1ZG9FbGVtZW50
KCkpIHsKKyAgICAgICAgICAgIGlmICgkMi0+c2VsZWN0b3IoKS0+aXNVbmtub3duUHNldWRvRWxl
bWVudCgpKSB7CiAgICAgICAgICAgICAgICAgZW5kID0gJDI7CiAgICAgICAgICAgICAgICAgaGlz
dG9yeSA9ICQxOwogICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTk2OSw3ICs5NjksNyBAQCBzcGVj
aWZpZXJfbGlzdDoKICAgICAgICAgICAgICQkID0gZW5kOwogICAgICAgICAgICAgd2hpbGUoZW5k
LT50YWdIaXN0b3J5KCkpCiAgICAgICAgICAgICAgICAgZW5kID0gZW5kLT50YWdIaXN0b3J5KCk7
Ci0gICAgICAgICAgICBlbmQtPm1fcmVsYXRpb24gPSBDU1NTZWxlY3Rvcjo6U3ViU2VsZWN0b3I7
CisgICAgICAgICAgICBlbmQtPnNlbGVjdG9yKCktPm1fcmVsYXRpb24gPSBDU1NTZWxlY3Rvcjo6
U3ViU2VsZWN0b3I7CiAgICAgICAgICAgICBlbmQtPnNldFRhZ0hpc3RvcnkocC0+c2lua0Zsb2F0
aW5nU2VsZWN0b3IoaGlzdG9yeSkpOwogICAgICAgICB9CiAgICAgfQpAQCAtOTgyLDEwICs5ODIs
MTAgQEAgc3BlY2lmaWVyOgogICAgIElEU0VMIHsKICAgICAgICAgQ1NTUGFyc2VyKiBwID0gc3Rh
dGljX2Nhc3Q8Q1NTUGFyc2VyKj4ocGFyc2VyKTsKICAgICAgICAgJCQgPSBwLT5jcmVhdGVGbG9h
dGluZ1NlbGVjdG9yKCk7Ci0gICAgICAgICQkLT5tX21hdGNoID0gQ1NTU2VsZWN0b3I6OklkOwor
ICAgICAgICAkJC0+c2VsZWN0b3IoKS0+bV9tYXRjaCA9IENTU1NlbGVjdG9yOjpJZDsKICAgICAg
ICAgaWYgKCFwLT5tX3N0cmljdCkKICAgICAgICAgICAgICQxLmxvd2VyKCk7Ci0gICAgICAgICQk
LT5tX3ZhbHVlID0gJDE7CisgICAgICAgICQkLT5zZWxlY3RvcigpLT5zZXRWYWx1ZSgkMSk7CiAg
ICAgfQogICB8IEhFWCB7CiAgICAgICAgIGlmICgkMS5jaGFyYWN0ZXJzWzBdID49ICcwJyAmJiAk
MS5jaGFyYWN0ZXJzWzBdIDw9ICc5JykgewpAQCAtOTkzLDEwICs5OTMsMTAgQEAgc3BlY2lmaWVy
OgogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgQ1NTUGFyc2VyKiBwID0gc3RhdGljX2Nh
c3Q8Q1NTUGFyc2VyKj4ocGFyc2VyKTsKICAgICAgICAgICAgICQkID0gcC0+Y3JlYXRlRmxvYXRp
bmdTZWxlY3RvcigpOwotICAgICAgICAgICAgJCQtPm1fbWF0Y2ggPSBDU1NTZWxlY3Rvcjo6SWQ7
CisgICAgICAgICAgICAkJC0+c2VsZWN0b3IoKS0+bV9tYXRjaCA9IENTU1NlbGVjdG9yOjpJZDsK
ICAgICAgICAgICAgIGlmICghcC0+bV9zdHJpY3QpCiAgICAgICAgICAgICAgICAgJDEubG93ZXIo
KTsKLSAgICAgICAgICAgICQkLT5tX3ZhbHVlID0gJDE7CisgICAgICAgICAgICAkJC0+c2VsZWN0
b3IoKS0+c2V0VmFsdWUoJDEpOwogICAgICAgICB9CiAgICAgfQogICB8IGNsYXNzCkBAIC0xMDA4
LDEwICsxMDA4LDEwIEBAIGNsYXNzOgogICAgICcuJyBJREVOVCB7CiAgICAgICAgIENTU1BhcnNl
ciogcCA9IHN0YXRpY19jYXN0PENTU1BhcnNlcio+KHBhcnNlcik7CiAgICAgICAgICQkID0gcC0+
Y3JlYXRlRmxvYXRpbmdTZWxlY3RvcigpOwotICAgICAgICAkJC0+bV9tYXRjaCA9IENTU1NlbGVj
dG9yOjpDbGFzczsKKyAgICAgICAgJCQtPnNlbGVjdG9yKCktPm1fbWF0Y2ggPSBDU1NTZWxlY3Rv
cjo6Q2xhc3M7CiAgICAgICAgIGlmICghcC0+bV9zdHJpY3QpCiAgICAgICAgICAgICAkMi5sb3dl
cigpOwotICAgICAgICAkJC0+bV92YWx1ZSA9ICQyOworICAgICAgICAkJC0+c2VsZWN0b3IoKS0+
c2V0VmFsdWUoJDIpOwogICAgIH0KICAgOwogCkBAIC0xMDI5LDMxICsxMDI5LDMxIEBAIGF0dHJf
bmFtZToKIGF0dHJpYjoKICAgICAnWycgbWF5YmVfc3BhY2UgYXR0cl9uYW1lICddJyB7CiAgICAg
ICAgICQkID0gc3RhdGljX2Nhc3Q8Q1NTUGFyc2VyKj4ocGFyc2VyKS0+Y3JlYXRlRmxvYXRpbmdT
ZWxlY3RvcigpOwotICAgICAgICAkJC0+c2V0QXR0cmlidXRlKFF1YWxpZmllZE5hbWUobnVsbEF0
b20sICQzLCBudWxsQXRvbSkpOwotICAgICAgICAkJC0+bV9tYXRjaCA9IENTU1NlbGVjdG9yOjpT
ZXQ7CisgICAgICAgICQkLT5zZWxlY3RvcigpLT5zZXRBdHRyaWJ1dGUoUXVhbGlmaWVkTmFtZShu
dWxsQXRvbSwgJDMsIG51bGxBdG9tKSk7CisgICAgICAgICQkLT5zZWxlY3RvcigpLT5tX21hdGNo
ID0gQ1NTU2VsZWN0b3I6OlNldDsKICAgICB9CiAgICAgfCAnWycgbWF5YmVfc3BhY2UgYXR0cl9u
YW1lIG1hdGNoIG1heWJlX3NwYWNlIGlkZW50X29yX3N0cmluZyBtYXliZV9zcGFjZSAnXScgewog
ICAgICAgICAkJCA9IHN0YXRpY19jYXN0PENTU1BhcnNlcio+KHBhcnNlciktPmNyZWF0ZUZsb2F0
aW5nU2VsZWN0b3IoKTsKLSAgICAgICAgJCQtPnNldEF0dHJpYnV0ZShRdWFsaWZpZWROYW1lKG51
bGxBdG9tLCAkMywgbnVsbEF0b20pKTsKLSAgICAgICAgJCQtPm1fbWF0Y2ggPSAoQ1NTU2VsZWN0
b3I6Ok1hdGNoKSQ0OwotICAgICAgICAkJC0+bV92YWx1ZSA9ICQ2OworICAgICAgICAkJC0+c2Vs
ZWN0b3IoKS0+c2V0QXR0cmlidXRlKFF1YWxpZmllZE5hbWUobnVsbEF0b20sICQzLCBudWxsQXRv
bSkpOworICAgICAgICAkJC0+c2VsZWN0b3IoKS0+bV9tYXRjaCA9IChDU1NTZWxlY3Rvcjo6TWF0
Y2gpJDQ7CisgICAgICAgICQkLT5zZWxlY3RvcigpLT5zZXRWYWx1ZSgkNik7CiAgICAgfQogICAg
IHwgJ1snIG1heWJlX3NwYWNlIG5hbWVzcGFjZV9zZWxlY3RvciBhdHRyX25hbWUgJ10nIHsKICAg
ICAgICAgQXRvbWljU3RyaW5nIG5hbWVzcGFjZVByZWZpeCA9ICQzOwogICAgICAgICBDU1NQYXJz
ZXIqIHAgPSBzdGF0aWNfY2FzdDxDU1NQYXJzZXIqPihwYXJzZXIpOwogICAgICAgICAkJCA9IHAt
PmNyZWF0ZUZsb2F0aW5nU2VsZWN0b3IoKTsKLSAgICAgICAgJCQtPnNldEF0dHJpYnV0ZShRdWFs
aWZpZWROYW1lKG5hbWVzcGFjZVByZWZpeCwgJDQsCisgICAgICAgICQkLT5zZWxlY3RvcigpLT5z
ZXRBdHRyaWJ1dGUoUXVhbGlmaWVkTmFtZShuYW1lc3BhY2VQcmVmaXgsICQ0LAogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5tX3N0eWxlU2hlZXQtPmRldGVybWluZU5hbWVz
cGFjZShuYW1lc3BhY2VQcmVmaXgpKSk7Ci0gICAgICAgICQkLT5tX21hdGNoID0gQ1NTU2VsZWN0
b3I6OlNldDsKKyAgICAgICAgJCQtPnNlbGVjdG9yKCktPm1fbWF0Y2ggPSBDU1NTZWxlY3Rvcjo6
U2V0OwogICAgIH0KICAgICB8ICdbJyBtYXliZV9zcGFjZSBuYW1lc3BhY2Vfc2VsZWN0b3IgYXR0
cl9uYW1lIG1hdGNoIG1heWJlX3NwYWNlIGlkZW50X29yX3N0cmluZyBtYXliZV9zcGFjZSAnXScg
ewogICAgICAgICBBdG9taWNTdHJpbmcgbmFtZXNwYWNlUHJlZml4ID0gJDM7CiAgICAgICAgIENT
U1BhcnNlciogcCA9IHN0YXRpY19jYXN0PENTU1BhcnNlcio+KHBhcnNlcik7CiAgICAgICAgICQk
ID0gcC0+Y3JlYXRlRmxvYXRpbmdTZWxlY3RvcigpOwotICAgICAgICAkJC0+c2V0QXR0cmlidXRl
KFF1YWxpZmllZE5hbWUobmFtZXNwYWNlUHJlZml4LCAkNCwKKyAgICAgICAgJCQtPnNlbGVjdG9y
KCktPnNldEF0dHJpYnV0ZShRdWFsaWZpZWROYW1lKG5hbWVzcGFjZVByZWZpeCwgJDQsCiAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPm1fc3R5bGVTaGVldC0+ZGV0ZXJtaW5l
TmFtZXNwYWNlKG5hbWVzcGFjZVByZWZpeCkpKTsKLSAgICAgICAgJCQtPm1fbWF0Y2ggPSAoQ1NT
U2VsZWN0b3I6Ok1hdGNoKSQ1OwotICAgICAgICAkJC0+bV92YWx1ZSA9ICQ3OworICAgICAgICAk
JC0+c2VsZWN0b3IoKS0+bV9tYXRjaCA9IChDU1NTZWxlY3Rvcjo6TWF0Y2gpJDU7CisgICAgICAg
ICQkLT5zZWxlY3RvcigpLT5zZXRWYWx1ZSgkNyk7CiAgICAgfQogICA7CiAKQEAgLTEwODYsMTAg
KzEwODYsMTAgQEAgaWRlbnRfb3Jfc3RyaW5nOgogcHNldWRvX3BhZ2U6CiAgICAgJzonIElERU5U
IHsKICAgICAgICAgJCQgPSBzdGF0aWNfY2FzdDxDU1NQYXJzZXIqPihwYXJzZXIpLT5jcmVhdGVG
bG9hdGluZ1NlbGVjdG9yKCk7Ci0gICAgICAgICQkLT5tX21hdGNoID0gQ1NTU2VsZWN0b3I6OlBh
Z2VQc2V1ZG9DbGFzczsKKyAgICAgICAgJCQtPnNlbGVjdG9yKCktPm1fbWF0Y2ggPSBDU1NTZWxl
Y3Rvcjo6UGFnZVBzZXVkb0NsYXNzOwogICAgICAgICAkMi5sb3dlcigpOwotICAgICAgICAkJC0+
bV92YWx1ZSA9ICQyOwotICAgICAgICBDU1NTZWxlY3Rvcjo6UHNldWRvVHlwZSB0eXBlID0gJCQt
PnBzZXVkb1R5cGUoKTsKKyAgICAgICAgJCQtPnNlbGVjdG9yKCktPnNldFZhbHVlKCQyKTsKKyAg
ICAgICAgQ1NTU2VsZWN0b3I6OlBzZXVkb1R5cGUgdHlwZSA9ICQkLT5zZWxlY3RvcigpLT5wc2V1
ZG9UeXBlKCk7CiAgICAgICAgIGlmICh0eXBlID09IENTU1NlbGVjdG9yOjpQc2V1ZG9Vbmtub3du
KQogICAgICAgICAgICAgJCQgPSAwOwogICAgIH0KQEAgLTEwOTcsMTAgKzEwOTcsMTAgQEAgcHNl
dWRvX3BhZ2U6CiBwc2V1ZG86CiAgICAgJzonIElERU5UIHsKICAgICAgICAgJCQgPSBzdGF0aWNf
Y2FzdDxDU1NQYXJzZXIqPihwYXJzZXIpLT5jcmVhdGVGbG9hdGluZ1NlbGVjdG9yKCk7Ci0gICAg
ICAgICQkLT5tX21hdGNoID0gQ1NTU2VsZWN0b3I6OlBzZXVkb0NsYXNzOworICAgICAgICAkJC0+
c2VsZWN0b3IoKS0+bV9tYXRjaCA9IENTU1NlbGVjdG9yOjpQc2V1ZG9DbGFzczsKICAgICAgICAg
JDIubG93ZXIoKTsKLSAgICAgICAgJCQtPm1fdmFsdWUgPSAkMjsKLSAgICAgICAgQ1NTU2VsZWN0
b3I6OlBzZXVkb1R5cGUgdHlwZSA9ICQkLT5wc2V1ZG9UeXBlKCk7CisgICAgICAgICQkLT5zZWxl
Y3RvcigpLT5zZXRWYWx1ZSgkMik7CisgICAgICAgIENTU1NlbGVjdG9yOjpQc2V1ZG9UeXBlIHR5
cGUgPSAkJC0+c2VsZWN0b3IoKS0+cHNldWRvVHlwZSgpOwogICAgICAgICBpZiAodHlwZSA9PSBD
U1NTZWxlY3Rvcjo6UHNldWRvVW5rbm93bikKICAgICAgICAgICAgICQkID0gMDsKICAgICAgICAg
ZWxzZSBpZiAodHlwZSA9PSBDU1NTZWxlY3Rvcjo6UHNldWRvRW1wdHkgfHwKQEAgLTExMzEsMTAg
KzExMzEsMTAgQEAgcHNldWRvOgogICAgIH0KICAgICB8ICc6JyAnOicgSURFTlQgewogICAgICAg
ICAkJCA9IHN0YXRpY19jYXN0PENTU1BhcnNlcio+KHBhcnNlciktPmNyZWF0ZUZsb2F0aW5nU2Vs
ZWN0b3IoKTsKLSAgICAgICAgJCQtPm1fbWF0Y2ggPSBDU1NTZWxlY3Rvcjo6UHNldWRvRWxlbWVu
dDsKKyAgICAgICAgJCQtPnNlbGVjdG9yKCktPm1fbWF0Y2ggPSBDU1NTZWxlY3Rvcjo6UHNldWRv
RWxlbWVudDsKICAgICAgICAgJDMubG93ZXIoKTsKLSAgICAgICAgJCQtPm1fdmFsdWUgPSAkMzsK
LSAgICAgICAgQ1NTU2VsZWN0b3I6OlBzZXVkb1R5cGUgdHlwZSA9ICQkLT5wc2V1ZG9UeXBlKCk7
CisgICAgICAgICQkLT5zZWxlY3RvcigpLT5zZXRWYWx1ZSgkMyk7CisgICAgICAgIENTU1NlbGVj
dG9yOjpQc2V1ZG9UeXBlIHR5cGUgPSAkJC0+c2VsZWN0b3IoKS0+cHNldWRvVHlwZSgpOwogICAg
ICAgICBpZiAodHlwZSA9PSBDU1NTZWxlY3Rvcjo6UHNldWRvRmlyc3RMaW5lKSB7CiAgICAgICAg
ICAgICBDU1NQYXJzZXIqIHAgPSBzdGF0aWNfY2FzdDxDU1NQYXJzZXIqPihwYXJzZXIpOwogICAg
ICAgICAgICAgaWYgKERvY3VtZW50KiBkb2MgPSBwLT5kb2N1bWVudCgpKQpAQCAtMTE1MCwxMCAr
MTE1MCwxMCBAQCBwc2V1ZG86CiAgICAgfCAnOicgRlVOQ1RJT04gbWF5YmVfc3BhY2UgTlRIIG1h
eWJlX3NwYWNlICcpJyB7CiAgICAgICAgIENTU1BhcnNlciAqcCA9IHN0YXRpY19jYXN0PENTU1Bh
cnNlcio+KHBhcnNlcik7CiAgICAgICAgICQkID0gcC0+Y3JlYXRlRmxvYXRpbmdTZWxlY3Rvcigp
OwotICAgICAgICAkJC0+bV9tYXRjaCA9IENTU1NlbGVjdG9yOjpQc2V1ZG9DbGFzczsKLSAgICAg
ICAgJCQtPnNldEFyZ3VtZW50KCQ0KTsKLSAgICAgICAgJCQtPm1fdmFsdWUgPSAkMjsKLSAgICAg
ICAgQ1NTU2VsZWN0b3I6OlBzZXVkb1R5cGUgdHlwZSA9ICQkLT5wc2V1ZG9UeXBlKCk7CisgICAg
ICAgICQkLT5zZWxlY3RvcigpLT5tX21hdGNoID0gQ1NTU2VsZWN0b3I6OlBzZXVkb0NsYXNzOwor
ICAgICAgICAkJC0+c2VsZWN0b3IoKS0+c2V0QXJndW1lbnQoJDQpOworICAgICAgICAkJC0+c2Vs
ZWN0b3IoKS0+c2V0VmFsdWUoJDIpOworICAgICAgICBDU1NTZWxlY3Rvcjo6UHNldWRvVHlwZSB0
eXBlID0gJCQtPnNlbGVjdG9yKCktPnBzZXVkb1R5cGUoKTsKICAgICAgICAgaWYgKHR5cGUgPT0g
Q1NTU2VsZWN0b3I6OlBzZXVkb1Vua25vd24pCiAgICAgICAgICAgICAkJCA9IDA7CiAgICAgICAg
IGVsc2UgaWYgKHR5cGUgPT0gQ1NTU2VsZWN0b3I6OlBzZXVkb050aENoaWxkIHx8CkBAIC0xMTY4
LDEwICsxMTY4LDEwIEBAIHBzZXVkbzoKICAgICB8ICc6JyBGVU5DVElPTiBtYXliZV9zcGFjZSBt
YXliZV91bmFyeV9vcGVyYXRvciBJTlRFR0VSIG1heWJlX3NwYWNlICcpJyB7CiAgICAgICAgIENT
U1BhcnNlciAqcCA9IHN0YXRpY19jYXN0PENTU1BhcnNlcio+KHBhcnNlcik7CiAgICAgICAgICQk
ID0gcC0+Y3JlYXRlRmxvYXRpbmdTZWxlY3RvcigpOwotICAgICAgICAkJC0+bV9tYXRjaCA9IENT
U1NlbGVjdG9yOjpQc2V1ZG9DbGFzczsKLSAgICAgICAgJCQtPnNldEFyZ3VtZW50KFN0cmluZzo6
bnVtYmVyKCQ0ICogJDUpKTsKLSAgICAgICAgJCQtPm1fdmFsdWUgPSAkMjsKLSAgICAgICAgQ1NT
U2VsZWN0b3I6OlBzZXVkb1R5cGUgdHlwZSA9ICQkLT5wc2V1ZG9UeXBlKCk7CisgICAgICAgICQk
LT5zZWxlY3RvcigpLT5tX21hdGNoID0gQ1NTU2VsZWN0b3I6OlBzZXVkb0NsYXNzOworICAgICAg
ICAkJC0+c2VsZWN0b3IoKS0+c2V0QXJndW1lbnQoU3RyaW5nOjpudW1iZXIoJDQgKiAkNSkpOwor
ICAgICAgICAkJC0+c2VsZWN0b3IoKS0+c2V0VmFsdWUoJDIpOworICAgICAgICBDU1NTZWxlY3Rv
cjo6UHNldWRvVHlwZSB0eXBlID0gJCQtPnNlbGVjdG9yKCktPnBzZXVkb1R5cGUoKTsKICAgICAg
ICAgaWYgKHR5cGUgPT0gQ1NTU2VsZWN0b3I6OlBzZXVkb1Vua25vd24pCiAgICAgICAgICAgICAk
JCA9IDA7CiAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gQ1NTU2VsZWN0b3I6OlBzZXVkb050aENo
aWxkIHx8CkBAIC0xMTg2LDExICsxMTg2LDExIEBAIHBzZXVkbzoKICAgICB8ICc6JyBGVU5DVElP
TiBtYXliZV9zcGFjZSBJREVOVCBtYXliZV9zcGFjZSAnKScgewogICAgICAgICBDU1NQYXJzZXIg
KnAgPSBzdGF0aWNfY2FzdDxDU1NQYXJzZXIqPihwYXJzZXIpOwogICAgICAgICAkJCA9IHAtPmNy
ZWF0ZUZsb2F0aW5nU2VsZWN0b3IoKTsKLSAgICAgICAgJCQtPm1fbWF0Y2ggPSBDU1NTZWxlY3Rv
cjo6UHNldWRvQ2xhc3M7Ci0gICAgICAgICQkLT5zZXRBcmd1bWVudCgkNCk7CisgICAgICAgICQk
LT5zZWxlY3RvcigpLT5tX21hdGNoID0gQ1NTU2VsZWN0b3I6OlBzZXVkb0NsYXNzOworICAgICAg
ICAkJC0+c2VsZWN0b3IoKS0+c2V0QXJndW1lbnQoJDQpOwogICAgICAgICAkMi5sb3dlcigpOwot
ICAgICAgICAkJC0+bV92YWx1ZSA9ICQyOwotICAgICAgICBDU1NTZWxlY3Rvcjo6UHNldWRvVHlw
ZSB0eXBlID0gJCQtPnBzZXVkb1R5cGUoKTsKKyAgICAgICAgJCQtPnNlbGVjdG9yKCktPnNldFZh
bHVlKCQyKTsKKyAgICAgICAgQ1NTU2VsZWN0b3I6OlBzZXVkb1R5cGUgdHlwZSA9ICQkLT5zZWxl
Y3RvcigpLT5wc2V1ZG9UeXBlKCk7CiAgICAgICAgIGlmICh0eXBlID09IENTU1NlbGVjdG9yOjpQ
c2V1ZG9Vbmtub3duKQogICAgICAgICAgICAgJCQgPSAwOwogICAgICAgICBlbHNlIGlmICh0eXBl
ID09IENTU1NlbGVjdG9yOjpQc2V1ZG9OdGhDaGlsZCB8fApAQCAtMTIwNiwxNSArMTIwNiwxOCBA
QCBwc2V1ZG86CiAgICAgfQogICAgIC8vIHVzZWQgYnkgOm5vdAogICAgIHwgJzonIE5PVEZVTkNU
SU9OIG1heWJlX3NwYWNlIHNpbXBsZV9zZWxlY3RvciBtYXliZV9zcGFjZSAnKScgewotICAgICAg
ICBpZiAoISQ0IHx8ICEkNC0+aXNTaW1wbGUoKSkKKyAgICAgICAgaWYgKCEkNCB8fCAhJDQtPnNl
bGVjdG9yKCktPmlzU2ltcGxlKCkgfHwgJDQtPnRhZ0hpc3RvcnkoKSkKICAgICAgICAgICAgICQk
ID0gMDsKICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICBDU1NQYXJzZXIqIHAgPSBzdGF0aWNf
Y2FzdDxDU1NQYXJzZXIqPihwYXJzZXIpOwogICAgICAgICAgICAgJCQgPSBwLT5jcmVhdGVGbG9h
dGluZ1NlbGVjdG9yKCk7Ci0gICAgICAgICAgICAkJC0+bV9tYXRjaCA9IENTU1NlbGVjdG9yOjpQ
c2V1ZG9DbGFzczsKLSAgICAgICAgICAgICQkLT5zZXRTaW1wbGVTZWxlY3RvcihwLT5zaW5rRmxv
YXRpbmdTZWxlY3RvcigkNCkpOworICAgICAgICAgICAgJCQtPnNlbGVjdG9yKCktPm1fbWF0Y2gg
PSBDU1NTZWxlY3Rvcjo6UHNldWRvQ2xhc3M7CisgICAgICAgICAgICBDU1NQYXJzZXJTZWxlY3Rv
ciogcGFyc2VyU2VsZWN0b3IgPSBwLT5zaW5rRmxvYXRpbmdTZWxlY3RvcigkNCk7CisgICAgICAg
ICAgICBDU1NTZWxlY3Rvciogc2ltcGxlU2VsZWN0b3IgPSBwYXJzZXJTZWxlY3Rvci0+cmVsZWFz
ZVNlbGVjdG9yKCk7CisgICAgICAgICAgICAkJC0+c2VsZWN0b3IoKS0+c2V0U2ltcGxlU2VsZWN0
b3Ioc2ltcGxlU2VsZWN0b3IpOworICAgICAgICAgICAgZGVsZXRlIHBhcnNlclNlbGVjdG9yOwog
ICAgICAgICAgICAgJDIubG93ZXIoKTsKLSAgICAgICAgICAgICQkLT5tX3ZhbHVlID0gJDI7Cisg
ICAgICAgICAgICAkJC0+c2VsZWN0b3IoKS0+c2V0VmFsdWUoJDIpOwogICAgICAgICB9CiAgICAg
fQogICA7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9jc3MvQ1NTUGFnZVJ1bGUuY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2Nzcy9DU1NQYWdlUnVsZS5jcHAJKHJldmlzaW9uIDc2MTc2
KQorKysgU291cmNlL1dlYkNvcmUvY3NzL0NTU1BhZ2VSdWxlLmNwcAkod29ya2luZyBjb3B5KQpA
QCAtMjcsMTIgKzI3LDkgQEAKIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCi1DU1NQYWdlUnVsZTo6
Q1NTUGFnZVJ1bGUoQ1NTU3R5bGVTaGVldCogcGFyZW50LCBDU1NTZWxlY3Rvciogc2VsZWN0b3Is
IGludCBzb3VyY2VMaW5lKQorQ1NTUGFnZVJ1bGU6OkNTU1BhZ2VSdWxlKENTU1N0eWxlU2hlZXQq
IHBhcmVudCwgaW50IHNvdXJjZUxpbmUpCiAgICAgOiBDU1NTdHlsZVJ1bGUocGFyZW50LCBzb3Vy
Y2VMaW5lKQogewotICAgIFZlY3RvcjxDU1NTZWxlY3Rvcio+IHNlbGVjdG9yczsKLSAgICBzZWxl
Y3RvcnMuYXBwZW5kKHNlbGVjdG9yKTsKLSAgICBhZG9wdFNlbGVjdG9yVmVjdG9yKHNlbGVjdG9y
cyk7CiB9CiAKIENTU1BhZ2VSdWxlOjp+Q1NTUGFnZVJ1bGUoKQpJbmRleDogU291cmNlL1dlYkNv
cmUvY3NzL0NTU1BhZ2VSdWxlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvY3NzL0NT
U1BhZ2VSdWxlLmgJKHJldmlzaW9uIDc2MTc2KQorKysgU291cmNlL1dlYkNvcmUvY3NzL0NTU1Bh
Z2VSdWxlLmgJKHdvcmtpbmcgY29weSkKQEAgLTM0LDkgKzM0LDkgQEAgY2xhc3MgQ1NTU2VsZWN0
b3JMaXN0OwogCiBjbGFzcyBDU1NQYWdlUnVsZSA6IHB1YmxpYyBDU1NTdHlsZVJ1bGUgewogcHVi
bGljOgotICAgIHN0YXRpYyBQYXNzUmVmUHRyPENTU1BhZ2VSdWxlPiBjcmVhdGUoQ1NTU3R5bGVT
aGVldCogcGFyZW50LCBDU1NTZWxlY3Rvciogc2VsZWN0b3IsIGludCBzb3VyY2VMaW5lKQorICAg
IHN0YXRpYyBQYXNzUmVmUHRyPENTU1BhZ2VSdWxlPiBjcmVhdGUoQ1NTU3R5bGVTaGVldCogcGFy
ZW50LCBpbnQgc291cmNlTGluZSkKICAgICB7Ci0gICAgICAgIHJldHVybiBhZG9wdFJlZihuZXcg
Q1NTUGFnZVJ1bGUocGFyZW50LCBzZWxlY3Rvciwgc291cmNlTGluZSkpOworICAgICAgICByZXR1
cm4gYWRvcHRSZWYobmV3IENTU1BhZ2VSdWxlKHBhcmVudCwgc291cmNlTGluZSkpOwogICAgIH0K
IAogICAgIHZpcnR1YWwgfkNTU1BhZ2VSdWxlKCk7CkBAIC00NCw3ICs0NCw3IEBAIHB1YmxpYzoK
ICAgICB2aXJ0dWFsIFN0cmluZyBzZWxlY3RvclRleHQoKSBjb25zdDsKIAogcHJpdmF0ZToKLSAg
ICBDU1NQYWdlUnVsZShDU1NTdHlsZVNoZWV0KiBwYXJlbnQsIENTU1NlbGVjdG9yKiBzZWxlY3Rv
ciwgaW50IHNvdXJjZUxpbmUpOworICAgIENTU1BhZ2VSdWxlKENTU1N0eWxlU2hlZXQqIHBhcmVu
dCwgaW50IHNvdXJjZUxpbmUpOwogCiAgICAgdmlydHVhbCBib29sIGlzUGFnZVJ1bGUoKSB7IHJl
dHVybiB0cnVlOyB9CiAKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2Nzcy9DU1NQYXJzZXIuY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2Nzcy9DU1NQYXJzZXIuY3BwCShyZXZpc2lvbiA3
NjE3NikKKysrIFNvdXJjZS9XZWJDb3JlL2Nzcy9DU1NQYXJzZXIuY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC01Njk2LDE0ICs1Njk2LDE0IEBAIHZvaWQgQ1NTUGFyc2VyOjpjb3VudExpbmVzKCkKICAg
ICB9CiB9CiAKLUNTU1NlbGVjdG9yKiBDU1NQYXJzZXI6OmNyZWF0ZUZsb2F0aW5nU2VsZWN0b3Io
KQorQ1NTUGFyc2VyU2VsZWN0b3IqIENTU1BhcnNlcjo6Y3JlYXRlRmxvYXRpbmdTZWxlY3Rvcigp
CiB7Ci0gICAgQ1NTU2VsZWN0b3IqIHNlbGVjdG9yID0gZmFzdE5ldzxDU1NTZWxlY3Rvcj4oKTsK
KyAgICBDU1NQYXJzZXJTZWxlY3Rvciogc2VsZWN0b3IgPSBuZXcgQ1NTUGFyc2VyU2VsZWN0b3I7
CiAgICAgbV9mbG9hdGluZ1NlbGVjdG9ycy5hZGQoc2VsZWN0b3IpOwogICAgIHJldHVybiBzZWxl
Y3RvcjsKIH0KIAotQ1NTU2VsZWN0b3IqIENTU1BhcnNlcjo6c2lua0Zsb2F0aW5nU2VsZWN0b3Io
Q1NTU2VsZWN0b3IqIHNlbGVjdG9yKQorQ1NTUGFyc2VyU2VsZWN0b3IqIENTU1BhcnNlcjo6c2lu
a0Zsb2F0aW5nU2VsZWN0b3IoQ1NTUGFyc2VyU2VsZWN0b3IqIHNlbGVjdG9yKQogewogICAgIGlm
IChzZWxlY3RvcikgewogICAgICAgICBBU1NFUlQobV9mbG9hdGluZ1NlbGVjdG9ycy5jb250YWlu
cyhzZWxlY3RvcikpOwpAQCAtNTg1MSw3ICs1ODUxLDcgQEAgV2ViS2l0Q1NTS2V5ZnJhbWVzUnVs
ZSogQ1NTUGFyc2VyOjpjcmVhdAogICAgIHJldHVybiBydWxlUHRyOwogfQogCi1DU1NSdWxlKiBD
U1NQYXJzZXI6OmNyZWF0ZVN0eWxlUnVsZShWZWN0b3I8Q1NTU2VsZWN0b3IqPiogc2VsZWN0b3Jz
KQorQ1NTUnVsZSogQ1NTUGFyc2VyOjpjcmVhdGVTdHlsZVJ1bGUoVmVjdG9yPENTU1BhcnNlclNl
bGVjdG9yKj4qIHNlbGVjdG9ycykKIHsKICAgICBDU1NTdHlsZVJ1bGUqIHJlc3VsdCA9IDA7CiAg
ICAgbWFya1J1bGVCb2R5RW5kKCk7CkBAIC01OTEzLDIxICs1OTEzLDIxIEBAIHZvaWQgQ1NTUGFy
c2VyOjphZGROYW1lc3BhY2UoY29uc3QgQXRvbWkKICAgICBtX3N0eWxlU2hlZXQtPmFkZE5hbWVz
cGFjZSh0aGlzLCBwcmVmaXgsIHVyaSk7CiB9CiAKLXZvaWQgQ1NTUGFyc2VyOjp1cGRhdGVTcGVj
aWZpZXJzV2l0aEVsZW1lbnROYW1lKGNvbnN0IEF0b21pY1N0cmluZyYgbmFtZXNwYWNlUHJlZml4
LCBjb25zdCBBdG9taWNTdHJpbmcmIGVsZW1lbnROYW1lLCBDU1NTZWxlY3Rvciogc3BlY2lmaWVy
cykKK3ZvaWQgQ1NTUGFyc2VyOjp1cGRhdGVTcGVjaWZpZXJzV2l0aEVsZW1lbnROYW1lKGNvbnN0
IEF0b21pY1N0cmluZyYgbmFtZXNwYWNlUHJlZml4LCBjb25zdCBBdG9taWNTdHJpbmcmIGVsZW1l
bnROYW1lLCBDU1NQYXJzZXJTZWxlY3Rvciogc3BlY2lmaWVycykKIHsKICAgICBBdG9taWNTdHJp
bmcgZGV0ZXJtaW5lZE5hbWVzcGFjZSA9IG5hbWVzcGFjZVByZWZpeCAhPSBudWxsQXRvbSAmJiBt
X3N0eWxlU2hlZXQgPyBtX3N0eWxlU2hlZXQtPmRldGVybWluZU5hbWVzcGFjZShuYW1lc3BhY2VQ
cmVmaXgpIDogbV9kZWZhdWx0TmFtZXNwYWNlOwogICAgIFF1YWxpZmllZE5hbWUgdGFnID0gUXVh
bGlmaWVkTmFtZShuYW1lc3BhY2VQcmVmaXgsIGVsZW1lbnROYW1lLCBkZXRlcm1pbmVkTmFtZXNw
YWNlKTsKLSAgICBpZiAoIXNwZWNpZmllcnMtPmlzVW5rbm93blBzZXVkb0VsZW1lbnQoKSkgewot
ICAgICAgICBzcGVjaWZpZXJzLT5tX3RhZyA9IHRhZzsKKyAgICBpZiAoIXNwZWNpZmllcnMtPnNl
bGVjdG9yKCktPmlzVW5rbm93blBzZXVkb0VsZW1lbnQoKSkgeworICAgICAgICBzcGVjaWZpZXJz
LT5zZWxlY3RvcigpLT5zZXRUYWcodGFnKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAogICAg
IGlmIChEb2N1bWVudCogZG9jID0gZG9jdW1lbnQoKSkKICAgICAgICAgZG9jLT5zZXRVc2VzRGVz
Y2VuZGFudFJ1bGVzKHRydWUpOwogCi0gICAgc3BlY2lmaWVycy0+bV9yZWxhdGlvbiA9IENTU1Nl
bGVjdG9yOjpTaGFkb3dEZXNjZW5kYW50OwotICAgIGlmIChDU1NTZWxlY3RvciogaGlzdG9yeSA9
IHNwZWNpZmllcnMtPnRhZ0hpc3RvcnkoKSkgewotICAgICAgICBoaXN0b3J5LT5tX3RhZyA9IHRh
ZzsKKyAgICBzcGVjaWZpZXJzLT5zZWxlY3RvcigpLT5tX3JlbGF0aW9uID0gQ1NTU2VsZWN0b3I6
OlNoYWRvd0Rlc2NlbmRhbnQ7CisgICAgaWYgKENTU1BhcnNlclNlbGVjdG9yKiBoaXN0b3J5ID0g
c3BlY2lmaWVycy0+dGFnSGlzdG9yeSgpKSB7CisgICAgICAgIGhpc3RvcnktPnNlbGVjdG9yKCkt
PnNldFRhZyh0YWcpOwogICAgICAgICByZXR1cm47CiAgICAgfQogCkBAIC01OTM2LDE5ICs1OTM2
LDIyIEBAIHZvaWQgQ1NTUGFyc2VyOjp1cGRhdGVTcGVjaWZpZXJzV2l0aEVsZW0KICAgICBpZiAo
ZWxlbWVudE5hbWUgPT0gc3RhckF0b20gJiYgbV9kZWZhdWx0TmFtZXNwYWNlID09IHN0YXJBdG9t
KQogICAgICAgICByZXR1cm47CiAKLSAgICBDU1NTZWxlY3RvciogZWxlbWVudE5hbWVTZWxlY3Rv
ciA9IGZhc3ROZXc8Q1NTU2VsZWN0b3I+KCk7Ci0gICAgZWxlbWVudE5hbWVTZWxlY3Rvci0+bV90
YWcgPSB0YWc7CisgICAgQ1NTUGFyc2VyU2VsZWN0b3IqIGVsZW1lbnROYW1lU2VsZWN0b3IgPSBu
ZXcgQ1NTUGFyc2VyU2VsZWN0b3I7CisgICAgZWxlbWVudE5hbWVTZWxlY3Rvci0+c2VsZWN0b3Io
KS0+c2V0VGFnKHRhZyk7CiAgICAgc3BlY2lmaWVycy0+c2V0VGFnSGlzdG9yeShlbGVtZW50TmFt
ZVNlbGVjdG9yKTsKIH0KIAogCi1DU1NSdWxlKiBDU1NQYXJzZXI6OmNyZWF0ZVBhZ2VSdWxlKENT
U1NlbGVjdG9yKiBwYWdlU2VsZWN0b3IpCitDU1NSdWxlKiBDU1NQYXJzZXI6OmNyZWF0ZVBhZ2VS
dWxlKENTU1BhcnNlclNlbGVjdG9yKiBwYWdlU2VsZWN0b3IpCiB7CiAgICAgLy8gRklYTUU6IE1h
cmdpbiBhdC1ydWxlcyBhcmUgaWdub3JlZC4KICAgICBtX2FsbG93SW1wb3J0UnVsZXMgPSBtX2Fs
bG93TmFtZXNwYWNlRGVjbGFyYXRpb25zID0gZmFsc2U7CiAgICAgQ1NTUGFnZVJ1bGUqIHBhZ2VS
dWxlID0gMDsKICAgICBpZiAocGFnZVNlbGVjdG9yKSB7Ci0gICAgICAgIFJlZlB0cjxDU1NQYWdl
UnVsZT4gcnVsZSA9IENTU1BhZ2VSdWxlOjpjcmVhdGUobV9zdHlsZVNoZWV0LCBwYWdlU2VsZWN0
b3IsIG1fbGFzdFNlbGVjdG9yTGluZU51bWJlcik7CisgICAgICAgIFJlZlB0cjxDU1NQYWdlUnVs
ZT4gcnVsZSA9IENTU1BhZ2VSdWxlOjpjcmVhdGUobV9zdHlsZVNoZWV0LCBtX2xhc3RTZWxlY3Rv
ckxpbmVOdW1iZXIpOworICAgICAgICBWZWN0b3I8Q1NTUGFyc2VyU2VsZWN0b3IqPiBzZWxlY3Rv
clZlY3RvcjsKKyAgICAgICAgc2VsZWN0b3JWZWN0b3IuYXBwZW5kKHBhZ2VTZWxlY3Rvcik7Cisg
ICAgICAgIHJ1bGUtPmFkb3B0U2VsZWN0b3JWZWN0b3Ioc2VsZWN0b3JWZWN0b3IpOwogICAgICAg
ICBydWxlLT5zZXREZWNsYXJhdGlvbihDU1NNdXRhYmxlU3R5bGVEZWNsYXJhdGlvbjo6Y3JlYXRl
KHJ1bGUuZ2V0KCksIG1fcGFyc2VkUHJvcGVydGllcywgbV9udW1QYXJzZWRQcm9wZXJ0aWVzKSk7
CiAgICAgICAgIHBhZ2VSdWxlID0gcnVsZS5nZXQoKTsKICAgICAgICAgbV9wYXJzZWRTdHlsZU9i
amVjdHMuYXBwZW5kKHJ1bGUucmVsZWFzZSgpKTsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2Nzcy9D
U1NQYXJzZXIuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9jc3MvQ1NTUGFyc2VyLmgJ
KHJldmlzaW9uIDc2MTc2KQorKysgU291cmNlL1dlYkNvcmUvY3NzL0NTU1BhcnNlci5oCSh3b3Jr
aW5nIGNvcHkpCkBAIC0xNzAsOCArMTcwLDggQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogCiAgICAg
ICAgIGludCB5eXBhcnNlKCk7CiAKLSAgICAgICAgQ1NTU2VsZWN0b3IqIGNyZWF0ZUZsb2F0aW5n
U2VsZWN0b3IoKTsKLSAgICAgICAgQ1NTU2VsZWN0b3IqIHNpbmtGbG9hdGluZ1NlbGVjdG9yKENT
U1NlbGVjdG9yKik7CisgICAgICAgIENTU1BhcnNlclNlbGVjdG9yKiBjcmVhdGVGbG9hdGluZ1Nl
bGVjdG9yKCk7CisgICAgICAgIENTU1BhcnNlclNlbGVjdG9yKiBzaW5rRmxvYXRpbmdTZWxlY3Rv
cihDU1NQYXJzZXJTZWxlY3RvciopOwogCiAgICAgICAgIENTU1BhcnNlclZhbHVlTGlzdCogY3Jl
YXRlRmxvYXRpbmdWYWx1ZUxpc3QoKTsKICAgICAgICAgQ1NTUGFyc2VyVmFsdWVMaXN0KiBzaW5r
RmxvYXRpbmdWYWx1ZUxpc3QoQ1NTUGFyc2VyVmFsdWVMaXN0Kik7CkBAIC0xODgsOSArMTg4LDkg
QEAgbmFtZXNwYWNlIFdlYkNvcmUgewogICAgICAgICBXZWJLaXRDU1NLZXlmcmFtZXNSdWxlKiBj
cmVhdGVLZXlmcmFtZXNSdWxlKCk7CiAgICAgICAgIENTU1J1bGUqIGNyZWF0ZU1lZGlhUnVsZShN
ZWRpYUxpc3QqLCBDU1NSdWxlTGlzdCopOwogICAgICAgICBDU1NSdWxlTGlzdCogY3JlYXRlUnVs
ZUxpc3QoKTsKLSAgICAgICAgQ1NTUnVsZSogY3JlYXRlU3R5bGVSdWxlKFZlY3RvcjxDU1NTZWxl
Y3Rvcio+KiBzZWxlY3RvcnMpOworICAgICAgICBDU1NSdWxlKiBjcmVhdGVTdHlsZVJ1bGUoVmVj
dG9yPENTU1BhcnNlclNlbGVjdG9yKj4qIHNlbGVjdG9ycyk7CiAgICAgICAgIENTU1J1bGUqIGNy
ZWF0ZUZvbnRGYWNlUnVsZSgpOwotICAgICAgICBDU1NSdWxlKiBjcmVhdGVQYWdlUnVsZShDU1NT
ZWxlY3RvciogcGFnZVNlbGVjdG9yKTsKKyAgICAgICAgQ1NTUnVsZSogY3JlYXRlUGFnZVJ1bGUo
Q1NTUGFyc2VyU2VsZWN0b3IqIHBhZ2VTZWxlY3Rvcik7CiAgICAgICAgIENTU1J1bGUqIGNyZWF0
ZU1hcmdpbkF0UnVsZShDU1NTZWxlY3Rvcjo6TWFyZ2luQm94VHlwZSBtYXJnaW5Cb3gpOwogICAg
ICAgICB2b2lkIHN0YXJ0RGVjbGFyYXRpb25zRm9yTWFyZ2luQm94KCk7CiAgICAgICAgIHZvaWQg
ZW5kRGVjbGFyYXRpb25zRm9yTWFyZ2luQm94KCk7CkBAIC0yMDQsMTEgKzIwNCwxMSBAQCBuYW1l
c3BhY2UgV2ViQ29yZSB7CiAgICAgICAgIFBhc3NPd25QdHI8TWVkaWFRdWVyeT4gc2lua0Zsb2F0
aW5nTWVkaWFRdWVyeShNZWRpYVF1ZXJ5Kik7CiAKICAgICAgICAgdm9pZCBhZGROYW1lc3BhY2Uo
Y29uc3QgQXRvbWljU3RyaW5nJiBwcmVmaXgsIGNvbnN0IEF0b21pY1N0cmluZyYgdXJpKTsKLSAg
ICAgICAgdm9pZCB1cGRhdGVTcGVjaWZpZXJzV2l0aEVsZW1lbnROYW1lKGNvbnN0IEF0b21pY1N0
cmluZyYgbmFtZXNwYWNlUHJlZml4LCBjb25zdCBBdG9taWNTdHJpbmcmIGVsZW1lbnROYW1lLCBD
U1NTZWxlY3RvciopOworICAgICAgICB2b2lkIHVwZGF0ZVNwZWNpZmllcnNXaXRoRWxlbWVudE5h
bWUoY29uc3QgQXRvbWljU3RyaW5nJiBuYW1lc3BhY2VQcmVmaXgsIGNvbnN0IEF0b21pY1N0cmlu
ZyYgZWxlbWVudE5hbWUsIENTU1BhcnNlclNlbGVjdG9yKik7CiAKICAgICAgICAgdm9pZCBpbnZh
bGlkQmxvY2tIaXQoKTsKIAotICAgICAgICBWZWN0b3I8Q1NTU2VsZWN0b3IqPiogcmV1c2FibGVT
ZWxlY3RvclZlY3RvcigpIHsgcmV0dXJuICZtX3JldXNhYmxlU2VsZWN0b3JWZWN0b3I7IH0KKyAg
ICAgICAgVmVjdG9yPENTU1BhcnNlclNlbGVjdG9yKj4qIHJldXNhYmxlU2VsZWN0b3JWZWN0b3Io
KSB7IHJldHVybiAmbV9yZXVzYWJsZVNlbGVjdG9yVmVjdG9yOyB9CiAKICAgICAgICAgdm9pZCB1
cGRhdGVMYXN0U2VsZWN0b3JMaW5lQW5kUG9zaXRpb24oKTsKIApAQCAtMzAyLDcgKzMwMiw3IEBA
IG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogICAgICAgICBWZWN0b3I8UmVmUHRyPFN0eWxlQmFzZT4g
PiBtX3BhcnNlZFN0eWxlT2JqZWN0czsKICAgICAgICAgVmVjdG9yPFJlZlB0cjxDU1NSdWxlTGlz
dD4gPiBtX3BhcnNlZFJ1bGVMaXN0czsKLSAgICAgICAgSGFzaFNldDxDU1NTZWxlY3Rvcio+IG1f
ZmxvYXRpbmdTZWxlY3RvcnM7CisgICAgICAgIEhhc2hTZXQ8Q1NTUGFyc2VyU2VsZWN0b3IqPiBt
X2Zsb2F0aW5nU2VsZWN0b3JzOwogICAgICAgICBIYXNoU2V0PENTU1BhcnNlclZhbHVlTGlzdCo+
IG1fZmxvYXRpbmdWYWx1ZUxpc3RzOwogICAgICAgICBIYXNoU2V0PENTU1BhcnNlckZ1bmN0aW9u
Kj4gbV9mbG9hdGluZ0Z1bmN0aW9uczsKIApAQCAtMzEwLDcgKzMxMCw3IEBAIG5hbWVzcGFjZSBX
ZWJDb3JlIHsKICAgICAgICAgT3duUHRyPE1lZGlhUXVlcnlFeHA+IG1fZmxvYXRpbmdNZWRpYVF1
ZXJ5RXhwOwogICAgICAgICBPd25QdHI8VmVjdG9yPE93blB0cjxNZWRpYVF1ZXJ5RXhwPiA+ID4g
bV9mbG9hdGluZ01lZGlhUXVlcnlFeHBMaXN0OwogCi0gICAgICAgIFZlY3RvcjxDU1NTZWxlY3Rv
cio+IG1fcmV1c2FibGVTZWxlY3RvclZlY3RvcjsKKyAgICAgICAgVmVjdG9yPENTU1BhcnNlclNl
bGVjdG9yKj4gbV9yZXVzYWJsZVNlbGVjdG9yVmVjdG9yOwogCiAgICAgICAgIC8vIGRlZmluZXMg
dW5pdHMgYWxsb3dlZCBmb3IgYSBjZXJ0YWluIHByb3BlcnR5LCB1c2VkIGluIHBhcnNlVW5pdAog
ICAgICAgICBlbnVtIFVuaXRzIHsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2Nzcy9DU1NQYXJzZXJW
YWx1ZXMuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2Nzcy9DU1NQYXJzZXJWYWx1
ZXMuY3BwCShyZXZpc2lvbiA3NjE3NikKKysrIFNvdXJjZS9XZWJDb3JlL2Nzcy9DU1NQYXJzZXJW
YWx1ZXMuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yMCwxMSArMjAsMTUgQEAKIAogI2luY2x1ZGUg
ImNvbmZpZy5oIgogI2luY2x1ZGUgIkNTU1BhcnNlclZhbHVlcy5oIgorCiAjaW5jbHVkZSAiQ1NT
UHJpbWl0aXZlVmFsdWUuaCIKICNpbmNsdWRlICJDU1NGdW5jdGlvblZhbHVlLmgiCiAjaW5jbHVk
ZSAiQ1NTUXVpcmtQcmltaXRpdmVWYWx1ZS5oIgorI2luY2x1ZGUgIkNTU1NlbGVjdG9yLmgiCiAK
IG5hbWVzcGFjZSBXZWJDb3JlIHsKKyAgICAgICAgCit1c2luZyBuYW1lc3BhY2UgV1RGOwogCiBD
U1NQYXJzZXJWYWx1ZUxpc3Q6On5DU1NQYXJzZXJWYWx1ZUxpc3QoKQogewpAQCAtNzAsNiArNzQs
MjkgQEAgUGFzc1JlZlB0cjxDU1NWYWx1ZT4gQ1NTUGFyc2VyVmFsdWU6OmNyZQogICAgICAgICBw
YXJzZWRWYWx1ZSA9IENTU1F1aXJrUHJpbWl0aXZlVmFsdWU6OmNyZWF0ZShmVmFsdWUsIENTU1By
aW1pdGl2ZVZhbHVlOjpDU1NfRU1TKTsKICAgICByZXR1cm4gcGFyc2VkVmFsdWU7CiB9CisgICAg
CitDU1NQYXJzZXJTZWxlY3Rvcjo6Q1NTUGFyc2VyU2VsZWN0b3IoKQorICAgIDogbV9zZWxlY3Rv
cihhZG9wdFB0cihmYXN0TmV3PENTU1NlbGVjdG9yPigpKSkKKyAgICAsIG1fdGFnSGlzdG9yeSgw
KQoreworfQorCitDU1NQYXJzZXJTZWxlY3Rvcjo6fkNTU1BhcnNlclNlbGVjdG9yKCkKK3sKKyAg
ICBpZiAoIW1fdGFnSGlzdG9yeSkKKyAgICAgICAgcmV0dXJuOworICAgIFZlY3RvcjxDU1NQYXJz
ZXJTZWxlY3RvciosIDE2PiB0b0RlbGV0ZTsKKyAgICBDU1NQYXJzZXJTZWxlY3Rvciogc2VsZWN0
b3IgPSBtX3RhZ0hpc3Rvcnk7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgdG9EZWxldGUu
YXBwZW5kKHNlbGVjdG9yKTsKKyAgICAgICAgQ1NTUGFyc2VyU2VsZWN0b3IqIG5leHQgPSBzZWxl
Y3Rvci0+bV90YWdIaXN0b3J5OworICAgICAgICBpZiAoIW5leHQpCisgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgc2VsZWN0b3ItPm1fdGFnSGlzdG9yeSA9IDA7CisgICAgICAgIHNlbGVjdG9y
ID0gbmV4dDsKKyAgICB9CisgICAgZGVsZXRlQWxsVmFsdWVzKHRvRGVsZXRlKTsKK30KIAogfQog
CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9jc3MvQ1NTUGFyc2VyVmFsdWVzLmgKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL1dlYkNvcmUvY3NzL0NTU1BhcnNlclZhbHVlcy5oCShyZXZpc2lvbiA3NjE3NikK
KysrIFNvdXJjZS9XZWJDb3JlL2Nzcy9DU1NQYXJzZXJWYWx1ZXMuaAkod29ya2luZyBjb3B5KQpA
QCAtMjUsNiArMjUsNyBAQAogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKK2NsYXNzIENTU1NlbGVj
dG9yOwogY2xhc3MgQ1NTVmFsdWU7CiAKIHN0cnVjdCBDU1NQYXJzZXJTdHJpbmcgewpAQCAtODgs
NiArODksMjEgQEAgc3RydWN0IENTU1BhcnNlckZ1bmN0aW9uIDogRmFzdEFsbG9jQmFzZQogICAg
IE93blB0cjxDU1NQYXJzZXJWYWx1ZUxpc3Q+IGFyZ3M7CiB9OwogCitjbGFzcyBDU1NQYXJzZXJT
ZWxlY3RvciA6IHB1YmxpYyBGYXN0QWxsb2NCYXNlIHsKK3B1YmxpYzoKKyAgICBDU1NQYXJzZXJT
ZWxlY3RvcigpOworICAgIH5DU1NQYXJzZXJTZWxlY3RvcigpOworCisgICAgQ1NTU2VsZWN0b3Iq
IHNlbGVjdG9yKCkgY29uc3QgeyByZXR1cm4gbV9zZWxlY3Rvci5nZXQoKTsgfQorICAgIENTU1Nl
bGVjdG9yKiByZWxlYXNlU2VsZWN0b3IoKSB7IHJldHVybiBtX3NlbGVjdG9yLmxlYWtQdHIoKTsg
fQorICAgIENTU1BhcnNlclNlbGVjdG9yKiB0YWdIaXN0b3J5KCkgY29uc3QgeyByZXR1cm4gbV90
YWdIaXN0b3J5OyB9CisgICAgdm9pZCBzZXRUYWdIaXN0b3J5KENTU1BhcnNlclNlbGVjdG9yKiBz
ZWxlY3RvcikgeyBtX3RhZ0hpc3RvcnkgPSBzZWxlY3RvcjsgfQorCitwcml2YXRlOgorICAgIE93
blB0cjxDU1NTZWxlY3Rvcj4gbV9zZWxlY3RvcjsKKyAgICBDU1NQYXJzZXJTZWxlY3RvciogbV90
YWdIaXN0b3J5OworfTsKKwogfQogCiAjZW5kaWYKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2Nzcy9D
U1NTZWxlY3Rvci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvY3NzL0NTU1NlbGVj
dG9yLmNwcAkocmV2aXNpb24gNzYxNzYpCisrKyBTb3VyY2UvV2ViQ29yZS9jc3MvQ1NTU2VsZWN0
b3IuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zNywzNiArMzcsNiBAQCBuYW1lc3BhY2UgV2ViQ29y
ZSB7CiAKIHVzaW5nIG5hbWVzcGFjZSBIVE1MTmFtZXM7CiAKLWNsYXNzIENTU1NlbGVjdG9yQmFn
IDogcHVibGljIE5vbmNvcHlhYmxlIHsKLXB1YmxpYzoKLSAgICB+Q1NTU2VsZWN0b3JCYWcoKQot
ICAgIHsKLSAgICAgICAgQVNTRVJUKGlzRW1wdHkoKSk7Ci0gICAgfQotCi0gICAgYm9vbCBpc0Vt
cHR5KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3N0YWNrLmlzRW1wdHkoKTsKLSAg
ICB9Ci0KLSAgICB2b2lkIGFkZChQYXNzT3duUHRyPENTU1NlbGVjdG9yPiBzZWxlY3RvcikKLSAg
ICB7Ci0gICAgICAgIGlmIChzZWxlY3RvcikKLSAgICAgICAgICAgIG1fc3RhY2suYXBwZW5kKHNl
bGVjdG9yLmxlYWtQdHIoKSk7Ci0gICAgfQotCi0gICAgUGFzc093blB0cjxDU1NTZWxlY3Rvcj4g
dGFrZUFueSgpCi0gICAgewotICAgICAgICBBU1NFUlQoIWlzRW1wdHkoKSk7Ci0gICAgICAgIE93
blB0cjxDU1NTZWxlY3Rvcj4gc2VsZWN0b3IgPSBhZG9wdFB0cihtX3N0YWNrLmxhc3QoKSk7Ci0g
ICAgICAgIG1fc3RhY2sucmVtb3ZlTGFzdCgpOwotICAgICAgICByZXR1cm4gc2VsZWN0b3IucmVs
ZWFzZSgpOwotICAgIH0KLQotcHJpdmF0ZToKLSAgICBWZWN0b3I8Q1NTU2VsZWN0b3IqLCAxNj4g
bV9zdGFjazsKLX07Ci0KIHVuc2lnbmVkIENTU1NlbGVjdG9yOjpzcGVjaWZpY2l0eSgpIGNvbnN0
CiB7CiAgICAgLy8gbWFrZSBzdXJlIHRoZSByZXN1bHQgZG9lc24ndCBvdmVyZmxvdwpAQCAtNTc1
LDcgKzU0NSw3IEBAIHZvaWQgQ1NTU2VsZWN0b3I6OmV4dHJhY3RQc2V1ZG9UeXBlKCkgY28KICAg
ICBpZiAobV9tYXRjaCAhPSBQc2V1ZG9DbGFzcyAmJiBtX21hdGNoICE9IFBzZXVkb0VsZW1lbnQg
JiYgbV9tYXRjaCAhPSBQYWdlUHNldWRvQ2xhc3MpCiAgICAgICAgIHJldHVybjsKIAotICAgIG1f
cHNldWRvVHlwZSA9IHBhcnNlUHNldWRvVHlwZShtX3ZhbHVlKTsKKyAgICBtX3BzZXVkb1R5cGUg
PSBwYXJzZVBzZXVkb1R5cGUodmFsdWUoKSk7CiAKICAgICBib29sIGVsZW1lbnQgPSBmYWxzZTsg
Ly8gcHNldWRvLWVsZW1lbnQKICAgICBib29sIGNvbXBhdCA9IGZhbHNlOyAvLyBzaW5nbGUgY29s
b24gY29tcGF0YmlsaXR5IG1vZGUKQEAgLTcxOSw3ICs2ODksNyBAQCBib29sIENTU1NlbGVjdG9y
OjpvcGVyYXRvcj09KGNvbnN0IENTU1NlCiAgICAgd2hpbGUgKHNlbDEgJiYgc2VsMikgewogICAg
ICAgICBpZiAoc2VsMS0+bV90YWcgIT0gc2VsMi0+bV90YWcgfHwgc2VsMS0+YXR0cmlidXRlKCkg
IT0gc2VsMi0+YXR0cmlidXRlKCkgfHwKICAgICAgICAgICAgICBzZWwxLT5yZWxhdGlvbigpICE9
IHNlbDItPnJlbGF0aW9uKCkgfHwgc2VsMS0+bV9tYXRjaCAhPSBzZWwyLT5tX21hdGNoIHx8Ci0g
ICAgICAgICAgICAgc2VsMS0+bV92YWx1ZSAhPSBzZWwyLT5tX3ZhbHVlIHx8CisgICAgICAgICAg
ICAgc2VsMS0+dmFsdWUoKSAhPSBzZWwyLT52YWx1ZSgpIHx8CiAgICAgICAgICAgICAgc2VsMS0+
cHNldWRvVHlwZSgpICE9IHNlbDItPnBzZXVkb1R5cGUoKSB8fAogICAgICAgICAgICAgIHNlbDEt
PmFyZ3VtZW50KCkgIT0gc2VsMi0+YXJndW1lbnQoKSkKICAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKQEAgLTc1MywxMyArNzIzLDEzIEBAIFN0cmluZyBDU1NTZWxlY3Rvcjo6c2VsZWN0b3JUZXh0
KCkgY29uc3QKICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICBpZiAoY3MtPm1fbWF0Y2ggPT0g
Q1NTU2VsZWN0b3I6OklkKSB7CiAgICAgICAgICAgICBzdHIgKz0gIiMiOwotICAgICAgICAgICAg
c2VyaWFsaXplSWRlbnRpZmllcihjcy0+bV92YWx1ZSwgc3RyKTsKKyAgICAgICAgICAgIHNlcmlh
bGl6ZUlkZW50aWZpZXIoY3MtPnZhbHVlKCksIHN0cik7CiAgICAgICAgIH0gZWxzZSBpZiAoY3Mt
Pm1fbWF0Y2ggPT0gQ1NTU2VsZWN0b3I6OkNsYXNzKSB7CiAgICAgICAgICAgICBzdHIgKz0gIi4i
OwotICAgICAgICAgICAgc2VyaWFsaXplSWRlbnRpZmllcihjcy0+bV92YWx1ZSwgc3RyKTsKKyAg
ICAgICAgICAgIHNlcmlhbGl6ZUlkZW50aWZpZXIoY3MtPnZhbHVlKCksIHN0cik7CiAgICAgICAg
IH0gZWxzZSBpZiAoY3MtPm1fbWF0Y2ggPT0gQ1NTU2VsZWN0b3I6OlBzZXVkb0NsYXNzIHx8IGNz
LT5tX21hdGNoID09IENTU1NlbGVjdG9yOjpQYWdlUHNldWRvQ2xhc3MpIHsKICAgICAgICAgICAg
IHN0ciArPSAiOiI7Ci0gICAgICAgICAgICBzdHIgKz0gY3MtPm1fdmFsdWU7CisgICAgICAgICAg
ICBzdHIgKz0gY3MtPnZhbHVlKCk7CiAgICAgICAgICAgICBpZiAoY3MtPnBzZXVkb1R5cGUoKSA9
PSBQc2V1ZG9Ob3QpIHsKICAgICAgICAgICAgICAgICBpZiAoQ1NTU2VsZWN0b3IqIHN1YlNlbCA9
IGNzLT5zaW1wbGVTZWxlY3RvcigpKQogICAgICAgICAgICAgICAgICAgICBzdHIgKz0gc3ViU2Vs
LT5zZWxlY3RvclRleHQoKTsKQEAgLTc3NCw3ICs3NDQsNyBAQCBTdHJpbmcgQ1NTU2VsZWN0b3I6
OnNlbGVjdG9yVGV4dCgpIGNvbnN0CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAo
Y3MtPm1fbWF0Y2ggPT0gQ1NTU2VsZWN0b3I6OlBzZXVkb0VsZW1lbnQpIHsKICAgICAgICAgICAg
IHN0ciArPSAiOjoiOwotICAgICAgICAgICAgc3RyICs9IGNzLT5tX3ZhbHVlOworICAgICAgICAg
ICAgc3RyICs9IGNzLT52YWx1ZSgpOwogICAgICAgICB9IGVsc2UgaWYgKGNzLT5oYXNBdHRyaWJ1
dGUoKSkgewogICAgICAgICAgICAgc3RyICs9ICJbIjsKICAgICAgICAgICAgIGNvbnN0IEF0b21p
Y1N0cmluZyYgcHJlZml4ID0gY3MtPmF0dHJpYnV0ZSgpLnByZWZpeCgpOwpAQCAtODEwLDcgKzc4
MCw3IEBAIFN0cmluZyBDU1NTZWxlY3Rvcjo6c2VsZWN0b3JUZXh0KCkgY29uc3QKICAgICAgICAg
ICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoY3MtPm1f
bWF0Y2ggIT0gQ1NTU2VsZWN0b3I6OlNldCkgewotICAgICAgICAgICAgICAgIHNlcmlhbGl6ZVN0
cmluZyhjcy0+bV92YWx1ZSwgc3RyKTsKKyAgICAgICAgICAgICAgICBzZXJpYWxpemVTdHJpbmco
Y3MtPnZhbHVlKCksIHN0cik7CiAgICAgICAgICAgICAgICAgc3RyICs9ICJdIjsKICAgICAgICAg
ICAgIH0KICAgICAgICAgfQpAQCAtODM0LDE0ICs4MDQsNiBAQCBTdHJpbmcgQ1NTU2VsZWN0b3I6
OnNlbGVjdG9yVGV4dCgpIGNvbnN0CiAKICAgICByZXR1cm4gc3RyOwogfQotICAgIAotdm9pZCBD
U1NTZWxlY3Rvcjo6c2V0VGFnSGlzdG9yeShDU1NTZWxlY3RvciogdGFnSGlzdG9yeSkgCi17IAot
ICAgIGlmIChtX2hhc1JhcmVEYXRhKSAKLSAgICAgICAgbV9kYXRhLm1fcmFyZURhdGEtPm1fdGFn
SGlzdG9yeS5zZXQodGFnSGlzdG9yeSk7IAotICAgIGVsc2UgCi0gICAgICAgIG1fZGF0YS5tX3Rh
Z0hpc3RvcnkgPSB0YWdIaXN0b3J5OyAKLX0KIAogY29uc3QgUXVhbGlmaWVkTmFtZSYgQ1NTU2Vs
ZWN0b3I6OmF0dHJpYnV0ZSgpIGNvbnN0CiB7IApAQCAtOTczLDMzICs5MzUsNCBAQCBib29sIENT
U1NlbGVjdG9yOjpSYXJlRGF0YTo6bWF0Y2hOdGgoaW50CiAgICAgfQogfQogCi1pbmxpbmUgdm9p
ZCBDU1NTZWxlY3Rvcjo6cmVsZWFzZU93bmVkU2VsZWN0b3JzVG9CYWcoQ1NTU2VsZWN0b3JCYWcm
IGJhZykKLXsKLSAgICBpZiAobV9oYXNSYXJlRGF0YSkgewotICAgICAgICBBU1NFUlQobV9kYXRh
Lm1fcmFyZURhdGEpOwotICAgICAgICBiYWcuYWRkKG1fZGF0YS5tX3JhcmVEYXRhLT5tX3RhZ0hp
c3RvcnkucmVsZWFzZSgpKTsKLSAgICAgICAgYmFnLmFkZChtX2RhdGEubV9yYXJlRGF0YS0+bV9z
aW1wbGVTZWxlY3Rvci5yZWxlYXNlKCkpOwotICAgICAgICBkZWxldGUgbV9kYXRhLm1fcmFyZURh
dGE7Ci0gICAgICAgIC8vIENsZWFyIHRoZSBwb2ludGVyIHNvIHRoYXQgYSBkZXN0cnVjdG9yIG9m
IHRoaXMgc2VsZWN0b3Igd2lsbCBub3QKLSAgICAgICAgLy8gdHJhdmVyc2UgdGhpcyBjaGFpbi4K
LSAgICAgICAgbV9kYXRhLm1fcmFyZURhdGEgPSAwOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGJh
Zy5hZGQoYWRvcHRQdHIobV9kYXRhLm1fdGFnSGlzdG9yeSkpOwotICAgICAgICAvLyBDbGVhciB0
aGUgcG9pbnRlciBmb3IgdGhlIHNhbWUgcmVhc29uLgotICAgICAgICBtX2RhdGEubV90YWdIaXN0
b3J5ID0gMDsKLSAgICB9Ci19Ci0KLXZvaWQgQ1NTU2VsZWN0b3I6OmRlbGV0ZVJlYWNoYWJsZVNl
bGVjdG9ycygpCi17Ci0gICAgLy8gVHJhdmVyc2UgdGhlIGNoYWluIG9mIHNlbGVjdG9ycyBhbmQg
ZGVsZXRlIGVhY2ggaXRlcmF0aXZlbHkuCi0gICAgQ1NTU2VsZWN0b3JCYWcgc2VsZWN0b3JzVG9C
ZURlbGV0ZWQ7Ci0gICAgcmVsZWFzZU93bmVkU2VsZWN0b3JzVG9CYWcoc2VsZWN0b3JzVG9CZURl
bGV0ZWQpOwotICAgIHdoaWxlICghc2VsZWN0b3JzVG9CZURlbGV0ZWQuaXNFbXB0eSgpKSB7Ci0g
ICAgICAgIE93blB0cjxDU1NTZWxlY3Rvcj4gc2VsZWN0b3Ioc2VsZWN0b3JzVG9CZURlbGV0ZWQu
dGFrZUFueSgpKTsKLSAgICAgICAgQVNTRVJUKHNlbGVjdG9yKTsKLSAgICAgICAgc2VsZWN0b3It
PnJlbGVhc2VPd25lZFNlbGVjdG9yc1RvQmFnKHNlbGVjdG9yc1RvQmVEZWxldGVkKTsKLSAgICB9
Ci19Ci0KIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2Nzcy9D
U1NTZWxlY3Rvci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2Nzcy9DU1NTZWxlY3Rv
ci5oCShyZXZpc2lvbiA3NjE3NikKKysrIFNvdXJjZS9XZWJDb3JlL2Nzcy9DU1NTZWxlY3Rvci5o
CSh3b3JraW5nIGNvcHkpCkBAIC0zMCw4ICszMCw2IEBACiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsK
IAotICAgIGNsYXNzIENTU1NlbGVjdG9yQmFnOwotCiAgICAgLy8gdGhpcyBjbGFzcyByZXByZXNl
bnRzIGEgc2VsZWN0b3IgZm9yIGEgU3R5bGVSdWxlCiAgICAgY2xhc3MgQ1NTU2VsZWN0b3IgOiBw
dWJsaWMgTm9uY29weWFibGUgewogICAgIHB1YmxpYzoKQEAgLTQxLDYgKzM5LDcgQEAgbmFtZXNw
YWNlIFdlYkNvcmUgewogICAgICAgICAgICAgLCBtX3BzZXVkb1R5cGUoUHNldWRvTm90UGFyc2Vk
KQogICAgICAgICAgICAgLCBtX3BhcnNlZE50aChmYWxzZSkKICAgICAgICAgICAgICwgbV9pc0xh
c3RJblNlbGVjdG9yTGlzdChmYWxzZSkKKyAgICAgICAgICAgICwgbV9pc0xhc3RJblRhZ0hpc3Rv
cnkodHJ1ZSkKICAgICAgICAgICAgICwgbV9oYXNSYXJlRGF0YShmYWxzZSkKICAgICAgICAgICAg
ICwgbV9pc0ZvclBhZ2UoZmFsc2UpCiAgICAgICAgICAgICAsIG1fdGFnKGFueVFOYW1lKCkpCkBA
IC01Myw2ICs1Miw3IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAgICAgICAgICAgICwgbV9wc2V1
ZG9UeXBlKFBzZXVkb05vdFBhcnNlZCkKICAgICAgICAgICAgICwgbV9wYXJzZWROdGgoZmFsc2Up
CiAgICAgICAgICAgICAsIG1faXNMYXN0SW5TZWxlY3Rvckxpc3QoZmFsc2UpCisgICAgICAgICAg
ICAsIG1faXNMYXN0SW5UYWdIaXN0b3J5KHRydWUpCiAgICAgICAgICAgICAsIG1faGFzUmFyZURh
dGEoZmFsc2UpCiAgICAgICAgICAgICAsIG1faXNGb3JQYWdlKGZhbHNlKQogICAgICAgICAgICAg
LCBtX3RhZyhxTmFtZSkKQEAgLTYxLDE4ICs2MSwxMCBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAK
ICAgICAgICAgfkNTU1NlbGVjdG9yKCkKICAgICAgICAgewotICAgICAgICAgICAgLy8gRXhpdCBp
ZiB0aGlzIHNlbGVjdG9yIGRvZXMgbm90IG93biBhbnkgb2JqZWN0cyB0byBiZSBkZWxldGVkLgot
ICAgICAgICAgICAgaWYgKG1faGFzUmFyZURhdGEpIHsKLSAgICAgICAgICAgICAgICBpZiAoIW1f
ZGF0YS5tX3JhcmVEYXRhKQotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAg
ICB9IGVsc2UgaWYgKCFtX2RhdGEubV90YWdIaXN0b3J5KQotICAgICAgICAgICAgICAgIHJldHVy
bjsKLQotICAgICAgICAgICAgLy8gV2UgY2FuIG5vdCBkZWxldGUgdGhlIG93bmVkIG9iamVjdChz
KSBieSBzaW1wbHkgY2FsbGluZyBkZWxldGUKLSAgICAgICAgICAgIC8vIGRpcmVjdGx5IG9uIHRo
ZW0uIFRoYXQgd291bGQgbGVhZCB0byByZWN1cnNpdmUgZGVzdHJ1Y3RvciBjYWxscwotICAgICAg
ICAgICAgLy8gd2hpY2ggbWlnaHQgY2F1c2Ugc3RhY2sgb3ZlcmZsb3cuIFdlIGhhdmUgdG8gZGVs
ZXRlIHRoZW0KLSAgICAgICAgICAgIC8vIGl0ZXJhdGl2ZWx5LgotICAgICAgICAgICAgZGVsZXRl
UmVhY2hhYmxlU2VsZWN0b3JzKCk7CisgICAgICAgICAgICBpZiAobV9oYXNSYXJlRGF0YSkKKyAg
ICAgICAgICAgICAgICBkZWxldGUgbV9kYXRhLm1fcmFyZURhdGE7CisgICAgICAgICAgICBlbHNl
IGlmIChtX2RhdGEubV92YWx1ZSkKKyAgICAgICAgICAgICAgICBtX2RhdGEubV92YWx1ZS0+ZGVy
ZWYoKTsKICAgICAgICAgfQogCiAgICAgICAgIC8qKgpAQCAtMjU0LDE2ICsyNDYsMzAgQEAgbmFt
ZXNwYWNlIFdlYkNvcmUgewogICAgICAgICBzdGF0aWMgUHNldWRvVHlwZSBwYXJzZVBzZXVkb1R5
cGUoY29uc3QgQXRvbWljU3RyaW5nJik7CiAgICAgICAgIHN0YXRpYyBQc2V1ZG9JZCBwc2V1ZG9J
ZChQc2V1ZG9UeXBlKTsKIAotICAgICAgICBDU1NTZWxlY3RvciogdGFnSGlzdG9yeSgpIGNvbnN0
IHsgcmV0dXJuIG1faGFzUmFyZURhdGEgPyBtX2RhdGEubV9yYXJlRGF0YS0+bV90YWdIaXN0b3J5
LmdldCgpIDogbV9kYXRhLm1fdGFnSGlzdG9yeTsgfQotICAgICAgICB2b2lkIHNldFRhZ0hpc3Rv
cnkoQ1NTU2VsZWN0b3IqIHRhZ0hpc3RvcnkpOworICAgICAgICBDU1NTZWxlY3RvciogdGFnSGlz
dG9yeSgpIGNvbnN0IHsgcmV0dXJuIG1faXNMYXN0SW5UYWdIaXN0b3J5ID8gMCA6IGNvbnN0X2Nh
c3Q8Q1NTU2VsZWN0b3IqPih0aGlzICsgMSk7IH0KIAogICAgICAgICBib29sIGhhc1RhZygpIGNv
bnN0IHsgcmV0dXJuIG1fdGFnICE9IGFueVFOYW1lKCk7IH0KICAgICAgICAgYm9vbCBoYXNBdHRy
aWJ1dGUoKSBjb25zdCB7IHJldHVybiBtX21hdGNoID09IElkIHx8IG1fbWF0Y2ggPT0gQ2xhc3Mg
fHwgKG1faGFzUmFyZURhdGEgJiYgbV9kYXRhLm1fcmFyZURhdGEtPm1fYXR0cmlidXRlICE9IGFu
eVFOYW1lKCkpOyB9CiAgICAgICAgIAorICAgICAgICBjb25zdCBRdWFsaWZpZWROYW1lJiB0YWco
KSBjb25zdCB7IHJldHVybiBtX3RhZzsgfSA7CisgICAgICAgIC8vIEF0b21pY1N0cmluZyBpcyBy
ZWFsbHkganVzdCBhbiBBdG9taWNTdHJpbmdJbXBsKiBzbyB0aGUgY2FzdCBiZWxvdyBpcyBzYWZl
LgorICAgICAgICBjb25zdCBBdG9taWNTdHJpbmcmIHZhbHVlKCkgY29uc3QgeyByZXR1cm4gKnJl
aW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQXRvbWljU3RyaW5nKj4obV9oYXNSYXJlRGF0YSA/ICZtX2Rh
dGEubV9yYXJlRGF0YS0+bV92YWx1ZSA6ICZtX2RhdGEubV92YWx1ZSk7IH0KICAgICAgICAgY29u
c3QgUXVhbGlmaWVkTmFtZSYgYXR0cmlidXRlKCkgY29uc3Q7CiAgICAgICAgIGNvbnN0IEF0b21p
Y1N0cmluZyYgYXJndW1lbnQoKSBjb25zdCB7IHJldHVybiBtX2hhc1JhcmVEYXRhID8gbV9kYXRh
Lm1fcmFyZURhdGEtPm1fYXJndW1lbnQgOiBudWxsQXRvbTsgfQogICAgICAgICBDU1NTZWxlY3Rv
ciogc2ltcGxlU2VsZWN0b3IoKSBjb25zdCB7IHJldHVybiBtX2hhc1JhcmVEYXRhID8gbV9kYXRh
Lm1fcmFyZURhdGEtPm1fc2ltcGxlU2VsZWN0b3IuZ2V0KCkgOiAwOyB9CiAgICAgICAgIAorICAg
ICAgICB2b2lkIHNldFRhZyhjb25zdCBRdWFsaWZpZWROYW1lJiB2YWx1ZSkgeyBtX3RhZyA9IHZh
bHVlOyB9CisgICAgICAgIHZvaWQgc2V0VmFsdWUoY29uc3QgQXRvbWljU3RyaW5nJiB2YWx1ZSkK
KyAgICAgICAgeyAKKyAgICAgICAgICAgIGlmIChtX2hhc1JhcmVEYXRhKSB7CisgICAgICAgICAg
ICAgICAgbV9kYXRhLm1fcmFyZURhdGEtPm1fdmFsdWUgPSB2YWx1ZS5pbXBsKCk7CisgICAgICAg
ICAgICAgICAgbV9kYXRhLm1fcmFyZURhdGEtPm1fdmFsdWUtPnJlZigpOworICAgICAgICAgICAg
ICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIE5lZWQgdG8gZG8gcmVm
IGNvdW50aW5nIG1hbnVhbGx5IGluIHRoZSB1bmlvbi4KKyAgICAgICAgICAgIG1fZGF0YS5tX3Zh
bHVlID0gdmFsdWUuaW1wbCgpOworICAgICAgICAgICAgbV9kYXRhLm1fdmFsdWUtPnJlZigpOwor
ICAgICAgICB9CiAgICAgICAgIHZvaWQgc2V0QXR0cmlidXRlKGNvbnN0IFF1YWxpZmllZE5hbWUm
IHZhbHVlKTsKICAgICAgICAgdm9pZCBzZXRBcmd1bWVudChjb25zdCBBdG9taWNTdHJpbmcmIHZh
bHVlKTsKICAgICAgICAgdm9pZCBzZXRTaW1wbGVTZWxlY3RvcihDU1NTZWxlY3RvciogdmFsdWUp
OwpAQCAtMjg0LDYgKzI5MCw5IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogICAgICAgICBib29s
IGlzTGFzdEluU2VsZWN0b3JMaXN0KCkgY29uc3QgeyByZXR1cm4gbV9pc0xhc3RJblNlbGVjdG9y
TGlzdDsgfQogICAgICAgICB2b2lkIHNldExhc3RJblNlbGVjdG9yTGlzdCgpIHsgbV9pc0xhc3RJ
blNlbGVjdG9yTGlzdCA9IHRydWU7IH0KKyAgICAgICAgYm9vbCBpc0xhc3RJblRhZ0hpc3Rvcnko
KSBjb25zdCB7IHJldHVybiBtX2lzTGFzdEluVGFnSGlzdG9yeTsgfQorICAgICAgICB2b2lkIHNl
dE5vdExhc3RJblRhZ0hpc3RvcnkoKSB7IG1faXNMYXN0SW5UYWdIaXN0b3J5ID0gZmFsc2U7IH0K
KwogICAgICAgICBib29sIGlzU2ltcGxlKCkgY29uc3Q7CiAKICAgICAgICAgYm9vbCBpc0ZvclBh
Z2UoKSBjb25zdCB7IHJldHVybiBtX2lzRm9yUGFnZTsgfQpAQCAtMjk2LDMyICszMDUsMzUgQEAg
bmFtZXNwYWNlIFdlYkNvcmUgewogICAgIHByaXZhdGU6CiAgICAgICAgIGJvb2wgbV9wYXJzZWRO
dGggICAgICAgICAgICAgIDogMTsgLy8gVXNlZCBmb3IgOm50aC0qIAogICAgICAgICBib29sIG1f
aXNMYXN0SW5TZWxlY3Rvckxpc3QgICA6IDE7CisgICAgICAgIGJvb2wgbV9pc0xhc3RJblRhZ0hp
c3RvcnkgICAgIDogMTsKICAgICAgICAgYm9vbCBtX2hhc1JhcmVEYXRhICAgICAgICAgICAgOiAx
OwogICAgICAgICBib29sIG1faXNGb3JQYWdlICAgICAgICAgICAgICA6IDE7CiAKLSAgICAgICAg
dm9pZCByZWxlYXNlT3duZWRTZWxlY3RvcnNUb0JhZyhDU1NTZWxlY3RvckJhZyYpOwotICAgICAg
ICB2b2lkIGRlbGV0ZVJlYWNoYWJsZVNlbGVjdG9ycygpOwotCiAgICAgICAgIHVuc2lnbmVkIHNw
ZWNpZmljaXR5Rm9yT25lU2VsZWN0b3IoKSBjb25zdDsKICAgICAgICAgdW5zaWduZWQgc3BlY2lm
aWNpdHlGb3JQYWdlKCkgY29uc3Q7CiAgICAgICAgIHZvaWQgZXh0cmFjdFBzZXVkb1R5cGUoKSBj
b25zdDsKIAogICAgICAgICBzdHJ1Y3QgUmFyZURhdGEgOiBOb25jb3B5YWJsZSB7Ci0gICAgICAg
ICAgICBSYXJlRGF0YShQYXNzT3duUHRyPENTU1NlbGVjdG9yPiB0YWdIaXN0b3J5KQotICAgICAg
ICAgICAgICAgIDogbV9hKDApCisgICAgICAgICAgICBSYXJlRGF0YShBdG9taWNTdHJpbmdJbXBs
KiB2YWx1ZSkKKyAgICAgICAgICAgICAgICA6IG1fdmFsdWUodmFsdWUpCisgICAgICAgICAgICAg
ICAgLCBtX2EoMCkKICAgICAgICAgICAgICAgICAsIG1fYigwKQotICAgICAgICAgICAgICAgICwg
bV90YWdIaXN0b3J5KHRhZ0hpc3RvcnkpCiAgICAgICAgICAgICAgICAgLCBtX2F0dHJpYnV0ZShh
bnlRTmFtZSgpKQogICAgICAgICAgICAgICAgICwgbV9hcmd1bWVudChudWxsQXRvbSkKICAgICAg
ICAgICAgIHsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH5SYXJlRGF0YSgpCisgICAgICAg
ICAgICB7CisgICAgICAgICAgICAgICAgaWYgKG1fdmFsdWUpCisgICAgICAgICAgICAgICAgICAg
IG1fdmFsdWUtPmRlcmVmKCk7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGJvb2wgcGFy
c2VOdGgoKTsKICAgICAgICAgICAgIGJvb2wgbWF0Y2hOdGgoaW50IGNvdW50KTsKIAorICAgICAg
ICAgICAgQXRvbWljU3RyaW5nSW1wbCogbV92YWx1ZTsKICAgICAgICAgICAgIGludCBtX2E7IC8v
IFVzZWQgZm9yIDpudGgtKgogICAgICAgICAgICAgaW50IG1fYjsgLy8gVXNlZCBmb3IgOm50aC0q
Ci0gICAgICAgICAgICBPd25QdHI8Q1NTU2VsZWN0b3I+IG1fdGFnSGlzdG9yeTsKICAgICAgICAg
ICAgIE93blB0cjxDU1NTZWxlY3Rvcj4gbV9zaW1wbGVTZWxlY3RvcjsgLy8gVXNlZCBmb3IgOm5v
dC4KICAgICAgICAgICAgIFF1YWxpZmllZE5hbWUgbV9hdHRyaWJ1dGU7IC8vIHVzZWQgZm9yIGF0
dHJpYnV0ZSBzZWxlY3RvcgogICAgICAgICAgICAgQXRvbWljU3RyaW5nIG1fYXJndW1lbnQ7IC8v
IFVzZWQgZm9yIDpjb250YWlucywgOmxhbmcgYW5kIDpudGgtKgpAQCAtMzMxLDE4ICszNDMsMTYg
QEAgbmFtZXNwYWNlIFdlYkNvcmUgewogICAgICAgICB7CiAgICAgICAgICAgICBpZiAobV9oYXNS
YXJlRGF0YSkgCiAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgbV9kYXRhLm1f
cmFyZURhdGEgPSBuZXcgUmFyZURhdGEoYWRvcHRQdHIobV9kYXRhLm1fdGFnSGlzdG9yeSkpOwor
ICAgICAgICAgICAgbV9kYXRhLm1fcmFyZURhdGEgPSBuZXcgUmFyZURhdGEobV9kYXRhLm1fdmFs
dWUpOwogICAgICAgICAgICAgbV9oYXNSYXJlRGF0YSA9IHRydWU7CiAgICAgICAgIH0KICAgICAg
ICAgCiAgICAgICAgIHVuaW9uIERhdGFVbmlvbiB7Ci0gICAgICAgICAgICBEYXRhVW5pb24oKSA6
IG1fdGFnSGlzdG9yeSgwKSB7IH0KLSAgICAgICAgICAgIENTU1NlbGVjdG9yKiBtX3RhZ0hpc3Rv
cnk7CisgICAgICAgICAgICBEYXRhVW5pb24oKSA6IG1fdmFsdWUoMCkgeyB9CiAgICAgICAgICAg
ICBSYXJlRGF0YSogbV9yYXJlRGF0YTsKKyAgICAgICAgICAgIEF0b21pY1N0cmluZ0ltcGwqIG1f
dmFsdWU7CiAgICAgICAgIH0gbV9kYXRhOwogICAgICAgICAKLSAgICBwdWJsaWM6Ci0gICAgICAg
IG11dGFibGUgQXRvbWljU3RyaW5nIG1fdmFsdWU7CiAgICAgICAgIFF1YWxpZmllZE5hbWUgbV90
YWc7CiAgICAgfTsKIApJbmRleDogU291cmNlL1dlYkNvcmUvY3NzL0NTU1NlbGVjdG9yTGlzdC5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvY3NzL0NTU1NlbGVjdG9yTGlzdC5jcHAJ
KHJldmlzaW9uIDc2MTc2KQorKysgU291cmNlL1dlYkNvcmUvY3NzL0NTU1NlbGVjdG9yTGlzdC5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTI3LDYgKzI3LDggQEAKICNpbmNsdWRlICJjb25maWcuaCIK
ICNpbmNsdWRlICJDU1NTZWxlY3Rvckxpc3QuaCIKIAorI2luY2x1ZGUgIkNTU1BhcnNlclZhbHVl
cy5oIgorCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKIENTU1NlbGVjdG9yTGlzdDo6fkNTU1NlbGVj
dG9yTGlzdCgpIApAQCAtNDEsMjYgKzQzLDQ1IEBAIHZvaWQgQ1NTU2VsZWN0b3JMaXN0OjphZG9w
dChDU1NTZWxlY3RvckwKICAgICBsaXN0Lm1fc2VsZWN0b3JBcnJheSA9IDA7CiB9CiAKLXZvaWQg
Q1NTU2VsZWN0b3JMaXN0OjphZG9wdFNlbGVjdG9yVmVjdG9yKFZlY3RvcjxDU1NTZWxlY3Rvcio+
JiBzZWxlY3RvclZlY3RvcikKK3ZvaWQgQ1NTU2VsZWN0b3JMaXN0OjphZG9wdFNlbGVjdG9yVmVj
dG9yKFZlY3RvcjxDU1NQYXJzZXJTZWxlY3Rvcio+JiBzZWxlY3RvclZlY3RvcikKIHsKICAgICBk
ZWxldGVTZWxlY3RvcnMoKTsKLSAgICBjb25zdCBzaXplX3Qgc2l6ZSA9IHNlbGVjdG9yVmVjdG9y
LnNpemUoKTsKLSAgICBBU1NFUlQoc2l6ZSk7Ci0gICAgaWYgKHNpemUgPT0gMSkgewotICAgICAg
ICBtX3NlbGVjdG9yQXJyYXkgPSBzZWxlY3RvclZlY3RvclswXTsKKyAgICBjb25zdCBzaXplX3Qg
dmVjdG9yU2l6ZSA9IHNlbGVjdG9yVmVjdG9yLnNpemUoKTsKKyAgICBzaXplX3QgYXJyYXlTaXpl
ID0gMDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHZlY3RvclNpemU7ICsraSkgeyAgICAg
ICAgCisgICAgICAgIGZvciAoQ1NTUGFyc2VyU2VsZWN0b3IqIHNlbGVjdG9yID0gc2VsZWN0b3JW
ZWN0b3JbaV07IHNlbGVjdG9yOyBzZWxlY3RvciA9IHNlbGVjdG9yLT50YWdIaXN0b3J5KCkpCisg
ICAgICAgICAgICArK2FycmF5U2l6ZTsKKyAgICB9CisgICAgQVNTRVJUKGFycmF5U2l6ZSk7Cisg
ICAgaWYgKGFycmF5U2l6ZSA9PSAxKSB7CisgICAgICAgIG1fc2VsZWN0b3JBcnJheSA9IHNlbGVj
dG9yVmVjdG9yWzBdLT5yZWxlYXNlU2VsZWN0b3IoKTsKICAgICAgICAgbV9zZWxlY3RvckFycmF5
LT5zZXRMYXN0SW5TZWxlY3Rvckxpc3QoKTsKKyAgICAgICAgQVNTRVJUKG1fc2VsZWN0b3JBcnJh
eS0+aXNMYXN0SW5UYWdIaXN0b3J5KCkpOworICAgICAgICBkZWxldGUgc2VsZWN0b3JWZWN0b3Jb
MF07CiAgICAgICAgIHNlbGVjdG9yVmVjdG9yLnNocmluaygwKTsKICAgICAgICAgcmV0dXJuOwog
ICAgIH0KLSAgICBtX3NlbGVjdG9yQXJyYXkgPSByZWludGVycHJldF9jYXN0PENTU1NlbGVjdG9y
Kj4oZmFzdE1hbGxvYyhzaXplb2YoQ1NTU2VsZWN0b3IpICogc2VsZWN0b3JWZWN0b3Iuc2l6ZSgp
KSk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKLSAgICAgICAgbWVt
Y3B5KCZtX3NlbGVjdG9yQXJyYXlbaV0sIHNlbGVjdG9yVmVjdG9yW2ldLCBzaXplb2YoQ1NTU2Vs
ZWN0b3IpKTsKLSAgICAgICAgLy8gV2Ugd2FudCB0byBmcmVlIHRoZSBtZW1vcnkgKHdoaWNoIHdh
cyBhbGxvY2F0ZWQgd2l0aCBmYXN0TmV3KSwgYnV0IHdlCi0gICAgICAgIC8vIGRvbid0IHdhbnQg
dGhlIGRlc3RydWN0b3IgdG8gcnVuIHNpbmNlIGl0IHdpbGwgYWZmZWN0IHRoZSBjb3B5IHdlJ3Zl
IGp1c3QgbWFkZS4KLSAgICAgICAgZmFzdERlbGV0ZVNraXBwaW5nRGVzdHJ1Y3RvcihzZWxlY3Rv
clZlY3RvcltpXSk7Ci0gICAgICAgIEFTU0VSVCghbV9zZWxlY3RvckFycmF5W2ldLmlzTGFzdElu
U2VsZWN0b3JMaXN0KCkpOworICAgIG1fc2VsZWN0b3JBcnJheSA9IHJlaW50ZXJwcmV0X2Nhc3Q8
Q1NTU2VsZWN0b3IqPihmYXN0TWFsbG9jKHNpemVvZihDU1NTZWxlY3RvcikgKiBhcnJheVNpemUp
KTsKKyAgICBzaXplX3QgYXJyYXlJbmRleCA9IDA7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkg
PCB2ZWN0b3JTaXplOyArK2kpIHsKKyAgICAgICAgQ1NTUGFyc2VyU2VsZWN0b3IqIGN1cnJlbnQg
PSBzZWxlY3RvclZlY3RvcltpXTsKKyAgICAgICAgd2hpbGUgKGN1cnJlbnQpIHsKKyAgICAgICAg
ICAgIENTU1NlbGVjdG9yKiBzZWxlY3RvciA9IGN1cnJlbnQtPnJlbGVhc2VTZWxlY3RvcigpOwor
ICAgICAgICAgICAgbWVtY3B5KCZtX3NlbGVjdG9yQXJyYXlbYXJyYXlJbmRleF0sIHNlbGVjdG9y
LCBzaXplb2YoQ1NTU2VsZWN0b3IpKTsKKyAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT50
YWdIaXN0b3J5KCk7CisgICAgICAgICAgICAvLyBXZSB3YW50IHRvIGZyZWUgdGhlIG1lbW9yeSAo
d2hpY2ggd2FzIGFsbG9jYXRlZCB3aXRoIGZhc3ROZXcpLCBidXQgd2UKKyAgICAgICAgICAgIC8v
IGRvbid0IHdhbnQgdGhlIGRlc3RydWN0b3IgdG8gcnVuIHNpbmNlIGl0IHdpbGwgYWZmZWN0IHRo
ZSBjb3B5IHdlJ3ZlIGp1c3QgbWFkZS47CisgICAgICAgICAgICBmYXN0RGVsZXRlU2tpcHBpbmdE
ZXN0cnVjdG9yKHNlbGVjdG9yKTsKKyAgICAgICAgICAgIEFTU0VSVCghbV9zZWxlY3RvckFycmF5
W2FycmF5SW5kZXhdLmlzTGFzdEluU2VsZWN0b3JMaXN0KCkpOworICAgICAgICAgICAgaWYgKGN1
cnJlbnQpCisgICAgICAgICAgICAgICAgbV9zZWxlY3RvckFycmF5W2FycmF5SW5kZXhdLnNldE5v
dExhc3RJblRhZ0hpc3RvcnkoKTsKKyAgICAgICAgICAgICsrYXJyYXlJbmRleDsKKyAgICAgICAg
fQorICAgICAgICBkZWxldGUgc2VsZWN0b3JWZWN0b3JbaV07CisgICAgICAgIEFTU0VSVChtX3Nl
bGVjdG9yQXJyYXlbYXJyYXlJbmRleCAtIDFdLmlzTGFzdEluVGFnSGlzdG9yeSgpKTsKICAgICB9
Ci0gICAgbV9zZWxlY3RvckFycmF5W3NpemUgLSAxXS5zZXRMYXN0SW5TZWxlY3Rvckxpc3QoKTsK
KyAgICBBU1NFUlQoYXJyYXlTaXplID09IGFycmF5SW5kZXgpOworICAgIG1fc2VsZWN0b3JBcnJh
eVthcnJheUluZGV4IC0gMV0uc2V0TGFzdEluU2VsZWN0b3JMaXN0KCk7CiAgICAgc2VsZWN0b3JW
ZWN0b3Iuc2hyaW5rKDApOwogfQogCkBAIC0xMjIsNyArMTQzLDcgQEAgY2xhc3MgU2VsZWN0b3JO
ZWVkc05hbWVzcGFjZVJlc29sdXRpb25GdQogcHVibGljOgogICAgIGJvb2wgb3BlcmF0b3IoKShD
U1NTZWxlY3Rvciogc2VsZWN0b3IpCiAgICAgewotICAgICAgICBpZiAoc2VsZWN0b3ItPmhhc1Rh
ZygpICYmIHNlbGVjdG9yLT5tX3RhZy5wcmVmaXgoKSAhPSBudWxsQXRvbSAmJiBzZWxlY3Rvci0+
bV90YWcucHJlZml4KCkgIT0gc3RhckF0b20pCisgICAgICAgIGlmIChzZWxlY3Rvci0+aGFzVGFn
KCkgJiYgc2VsZWN0b3ItPnRhZygpLnByZWZpeCgpICE9IG51bGxBdG9tICYmIHNlbGVjdG9yLT50
YWcoKS5wcmVmaXgoKSAhPSBzdGFyQXRvbSkKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAg
ICAgICBpZiAoc2VsZWN0b3ItPmhhc0F0dHJpYnV0ZSgpICYmIHNlbGVjdG9yLT5hdHRyaWJ1dGUo
KS5wcmVmaXgoKSAhPSBudWxsQXRvbSAmJiBzZWxlY3Rvci0+YXR0cmlidXRlKCkucHJlZml4KCkg
IT0gc3RhckF0b20pCiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKSW5kZXg6IFNvdXJjZS9XZWJD
b3JlL2Nzcy9DU1NTZWxlY3Rvckxpc3QuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9j
c3MvQ1NTU2VsZWN0b3JMaXN0LmgJKHJldmlzaW9uIDc2MTc2KQorKysgU291cmNlL1dlYkNvcmUv
Y3NzL0NTU1NlbGVjdG9yTGlzdC5oCSh3b3JraW5nIGNvcHkpCkBAIC0zMSwxNyArMzEsMjMgQEAK
IAogbmFtZXNwYWNlIFdlYkNvcmUgewogICAgIAorY2xhc3MgQ1NTUGFyc2VyU2VsZWN0b3I7Cisg
ICAgCiBjbGFzcyBDU1NTZWxlY3Rvckxpc3QgOiBwdWJsaWMgTm9uY29weWFibGUgewogcHVibGlj
OgogICAgIENTU1NlbGVjdG9yTGlzdCgpIDogbV9zZWxlY3RvckFycmF5KDApIHsgfQogICAgIH5D
U1NTZWxlY3Rvckxpc3QoKTsKIAogICAgIHZvaWQgYWRvcHQoQ1NTU2VsZWN0b3JMaXN0JiBsaXN0
KTsKLSAgICB2b2lkIGFkb3B0U2VsZWN0b3JWZWN0b3IoVmVjdG9yPENTU1NlbGVjdG9yKj4mIHNl
bGVjdG9yVmVjdG9yKTsKKyAgICB2b2lkIGFkb3B0U2VsZWN0b3JWZWN0b3IoVmVjdG9yPENTU1Bh
cnNlclNlbGVjdG9yKj4mIHNlbGVjdG9yVmVjdG9yKTsKICAgICAKICAgICBDU1NTZWxlY3Rvciog
Zmlyc3QoKSBjb25zdCB7IHJldHVybiBtX3NlbGVjdG9yQXJyYXkgPyBtX3NlbGVjdG9yQXJyYXkg
OiAwOyB9Ci0gICAgc3RhdGljIENTU1NlbGVjdG9yKiBuZXh0KENTU1NlbGVjdG9yKiBwcmV2aW91
cykgeyByZXR1cm4gcHJldmlvdXMtPmlzTGFzdEluU2VsZWN0b3JMaXN0KCkgPyAwIDogcHJldmlv
dXMgKyAxOyB9Ci0gICAgYm9vbCBoYXNPbmVTZWxlY3RvcigpIGNvbnN0IHsgcmV0dXJuIG1fc2Vs
ZWN0b3JBcnJheSA/IG1fc2VsZWN0b3JBcnJheS0+aXNMYXN0SW5TZWxlY3Rvckxpc3QoKSA6IGZh
bHNlOyB9CisgICAgc3RhdGljIENTU1NlbGVjdG9yKiBuZXh0KENTU1NlbGVjdG9yKiBjdXJyZW50
KSB7CisgICAgICAgIHdoaWxlICghY3VycmVudC0+aXNMYXN0SW5UYWdIaXN0b3J5KCkpCisgICAg
ICAgICAgICBjdXJyZW50Kys7CisgICAgICAgIHJldHVybiBjdXJyZW50LT5pc0xhc3RJblNlbGVj
dG9yTGlzdCgpID8gMCA6IGN1cnJlbnQgKyAxOworICAgIH0KKyAgICBib29sIGhhc09uZVNlbGVj
dG9yKCkgY29uc3QgeyByZXR1cm4gbV9zZWxlY3RvckFycmF5ID8gIW5leHQobV9zZWxlY3RvckFy
cmF5KSA6IGZhbHNlOyB9CiAKICAgICBib29sIHNlbGVjdG9yc05lZWROYW1lc3BhY2VSZXNvbHV0
aW9uKCk7CiAgICAgYm9vbCBoYXNVbmtub3duUHNldWRvRWxlbWVudHMoKSBjb25zdDsKQEAgLTQ5
LDYgKzU1LDcgQEAgcHVibGljOgogcHJpdmF0ZToKICAgICB2b2lkIGRlbGV0ZVNlbGVjdG9ycygp
OwogCisgICAgLy8gRW5kIG9mIGEgbXVsdGlwYXJ0IHNlbGVjdG9yIGlzIGluZGljYXRlZCBieSBt
X2lzTGFzdEluVGFnSGlzdG9yeSBiaXQgaW4gdGhlIGxhc3QgaXRlbS4KICAgICAvLyBFbmQgb2Yg
dGhlIGFycmF5IGlzIGluZGljYXRlZCBieSBtX2lzTGFzdEluU2VsZWN0b3JMaXN0IGJpdCBpbiB0
aGUgbGFzdCBpdGVtLgogICAgIENTU1NlbGVjdG9yKiBtX3NlbGVjdG9yQXJyYXk7CiB9OwpJbmRl
eDogU291cmNlL1dlYkNvcmUvY3NzL0NTU1N0eWxlUnVsZS5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9XZWJDb3JlL2Nzcy9DU1NTdHlsZVJ1bGUuaAkocmV2aXNpb24gNzYxNzYpCisrKyBTb3VyY2Uv
V2ViQ29yZS9jc3MvQ1NTU3R5bGVSdWxlLmgJKHdvcmtpbmcgY29weSkKQEAgLTUwLDcgKzUwLDcg
QEAgcHVibGljOgogICAgIC8vIE5vdCBwYXJ0IG9mIHRoZSBDU1NPTQogICAgIHZpcnR1YWwgYm9v
bCBwYXJzZVN0cmluZyhjb25zdCBTdHJpbmcmLCBib29sID0gZmFsc2UpOwogCi0gICAgdm9pZCBh
ZG9wdFNlbGVjdG9yVmVjdG9yKFZlY3RvcjxDU1NTZWxlY3Rvcio+JiBzZWxlY3RvcnMpIHsgbV9z
ZWxlY3Rvckxpc3QuYWRvcHRTZWxlY3RvclZlY3RvcihzZWxlY3RvcnMpOyB9CisgICAgdm9pZCBh
ZG9wdFNlbGVjdG9yVmVjdG9yKFZlY3RvcjxDU1NQYXJzZXJTZWxlY3Rvcio+JiBzZWxlY3RvcnMp
IHsgbV9zZWxlY3Rvckxpc3QuYWRvcHRTZWxlY3RvclZlY3RvcihzZWxlY3RvcnMpOyB9CiAgICAg
dm9pZCBzZXREZWNsYXJhdGlvbihQYXNzUmVmUHRyPENTU011dGFibGVTdHlsZURlY2xhcmF0aW9u
Pik7CiAKICAgICBjb25zdCBDU1NTZWxlY3Rvckxpc3QmIHNlbGVjdG9yTGlzdCgpIGNvbnN0IHsg
cmV0dXJuIG1fc2VsZWN0b3JMaXN0OyB9CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9jc3MvQ1NTU3R5
bGVTZWxlY3Rvci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvY3NzL0NTU1N0eWxl
U2VsZWN0b3IuY3BwCShyZXZpc2lvbiA3NjE3NikKKysrIFNvdXJjZS9XZWJDb3JlL2Nzcy9DU1NT
dHlsZVNlbGVjdG9yLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjIxNCwyMCArMjIxNCwyMCBAQCBi
b29sIENTU1N0eWxlU2VsZWN0b3I6OlNlbGVjdG9yQ2hlY2tlcjo6CiAgICAgICAgIHJldHVybiBm
YWxzZTsKIAogICAgIGlmIChzZWwtPmhhc1RhZygpKSB7Ci0gICAgICAgIGNvbnN0IEF0b21pY1N0
cmluZyYgc2VsTG9jYWxOYW1lID0gc2VsLT5tX3RhZy5sb2NhbE5hbWUoKTsKKyAgICAgICAgY29u
c3QgQXRvbWljU3RyaW5nJiBzZWxMb2NhbE5hbWUgPSBzZWwtPnRhZygpLmxvY2FsTmFtZSgpOwog
ICAgICAgICBpZiAoc2VsTG9jYWxOYW1lICE9IHN0YXJBdG9tICYmIHNlbExvY2FsTmFtZSAhPSBl
LT5sb2NhbE5hbWUoKSkKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgY29uc3Qg
QXRvbWljU3RyaW5nJiBzZWxOUyA9IHNlbC0+bV90YWcubmFtZXNwYWNlVVJJKCk7CisgICAgICAg
IGNvbnN0IEF0b21pY1N0cmluZyYgc2VsTlMgPSBzZWwtPnRhZygpLm5hbWVzcGFjZVVSSSgpOwog
ICAgICAgICBpZiAoc2VsTlMgIT0gc3RhckF0b20gJiYgc2VsTlMgIT0gZS0+bmFtZXNwYWNlVVJJ
KCkpCiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgaWYgKHNlbC0+aGFz
QXR0cmlidXRlKCkpIHsKICAgICAgICAgaWYgKHNlbC0+bV9tYXRjaCA9PSBDU1NTZWxlY3Rvcjo6
Q2xhc3MpCi0gICAgICAgICAgICByZXR1cm4gZS0+aGFzQ2xhc3MoKSAmJiBzdGF0aWNfY2FzdDxT
dHlsZWRFbGVtZW50Kj4oZSktPmNsYXNzTmFtZXMoKS5jb250YWlucyhzZWwtPm1fdmFsdWUpOwor
ICAgICAgICAgICAgcmV0dXJuIGUtPmhhc0NsYXNzKCkgJiYgc3RhdGljX2Nhc3Q8U3R5bGVkRWxl
bWVudCo+KGUpLT5jbGFzc05hbWVzKCkuY29udGFpbnMoc2VsLT52YWx1ZSgpKTsKIAogICAgICAg
ICBpZiAoc2VsLT5tX21hdGNoID09IENTU1NlbGVjdG9yOjpJZCkKLSAgICAgICAgICAgIHJldHVy
biBlLT5oYXNJRCgpICYmIGUtPmlkRm9yU3R5bGVSZXNvbHV0aW9uKCkgPT0gc2VsLT5tX3ZhbHVl
OworICAgICAgICAgICAgcmV0dXJuIGUtPmhhc0lEKCkgJiYgZS0+aWRGb3JTdHlsZVJlc29sdXRp
b24oKSA9PSBzZWwtPnZhbHVlKCk7CiAgICAgICAgIAogICAgICAgICBjb25zdCBRdWFsaWZpZWRO
YW1lJiBhdHRyID0gc2VsLT5hdHRyaWJ1dGUoKTsKIApAQCAtMjI0NiwyMiArMjI0NiwyMiBAQCBi
b29sIENTU1N0eWxlU2VsZWN0b3I6OlNlbGVjdG9yQ2hlY2tlcjo6CiAKICAgICAgICAgc3dpdGNo
IChzZWwtPm1fbWF0Y2gpIHsKICAgICAgICAgY2FzZSBDU1NTZWxlY3Rvcjo6RXhhY3Q6Ci0gICAg
ICAgICAgICBpZiAoY2FzZVNlbnNpdGl2ZSA/IHNlbC0+bV92YWx1ZSAhPSB2YWx1ZSA6ICFlcXVh
bElnbm9yaW5nQ2FzZShzZWwtPm1fdmFsdWUsIHZhbHVlKSkKKyAgICAgICAgICAgIGlmIChjYXNl
U2Vuc2l0aXZlID8gc2VsLT52YWx1ZSgpICE9IHZhbHVlIDogIWVxdWFsSWdub3JpbmdDYXNlKHNl
bC0+dmFsdWUoKSwgdmFsdWUpKQogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAg
ICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIENTU1NlbGVjdG9yOjpMaXN0OgogICAgICAgICB7
CiAgICAgICAgICAgICAvLyBJZ25vcmUgZW1wdHkgc2VsZWN0b3JzIG9yIHNlbGVjdG9ycyBjb250
YWluaW5nIHNwYWNlcwotICAgICAgICAgICAgaWYgKHNlbC0+bV92YWx1ZS5jb250YWlucygnICcp
IHx8IHNlbC0+bV92YWx1ZS5pc0VtcHR5KCkpCisgICAgICAgICAgICBpZiAoc2VsLT52YWx1ZSgp
LmNvbnRhaW5zKCcgJykgfHwgc2VsLT52YWx1ZSgpLmlzRW1wdHkoKSkKICAgICAgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgICAgIHVuc2lnbmVkIHN0YXJ0U2VhcmNoQXQgPSAw
OwogICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgICAgICBzaXplX3QgZm91
bmRQb3MgPSB2YWx1ZS5maW5kKHNlbC0+bV92YWx1ZSwgc3RhcnRTZWFyY2hBdCwgY2FzZVNlbnNp
dGl2ZSk7CisgICAgICAgICAgICAgICAgc2l6ZV90IGZvdW5kUG9zID0gdmFsdWUuZmluZChzZWwt
PnZhbHVlKCksIHN0YXJ0U2VhcmNoQXQsIGNhc2VTZW5zaXRpdmUpOwogICAgICAgICAgICAgICAg
IGlmIChmb3VuZFBvcyA9PSBub3RGb3VuZCkKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOwogICAgICAgICAgICAgICAgIGlmIChmb3VuZFBvcyA9PSAwIHx8IHZhbHVlW2ZvdW5kUG9z
IC0gMV0gPT0gJyAnKSB7Ci0gICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGVuZFN0ciA9IGZv
dW5kUG9zICsgc2VsLT5tX3ZhbHVlLmxlbmd0aCgpOworICAgICAgICAgICAgICAgICAgICB1bnNp
Z25lZCBlbmRTdHIgPSBmb3VuZFBvcyArIHNlbC0+dmFsdWUoKS5sZW5ndGgoKTsKICAgICAgICAg
ICAgICAgICAgICAgaWYgKGVuZFN0ciA9PSB2YWx1ZS5sZW5ndGgoKSB8fCB2YWx1ZVtlbmRTdHJd
ID09ICcgJykKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBXZSBmb3VuZCBhIG1h
dGNoLgogICAgICAgICAgICAgICAgIH0KQEAgLTIyNzIsMjQgKzIyNzIsMjQgQEAgYm9vbCBDU1NT
dHlsZVNlbGVjdG9yOjpTZWxlY3RvckNoZWNrZXI6OgogICAgICAgICAgICAgYnJlYWs7CiAgICAg
ICAgIH0KICAgICAgICAgY2FzZSBDU1NTZWxlY3Rvcjo6Q29udGFpbjoKLSAgICAgICAgICAgIGlm
ICghdmFsdWUuY29udGFpbnMoc2VsLT5tX3ZhbHVlLCBjYXNlU2Vuc2l0aXZlKSB8fCBzZWwtPm1f
dmFsdWUuaXNFbXB0eSgpKQorICAgICAgICAgICAgaWYgKCF2YWx1ZS5jb250YWlucyhzZWwtPnZh
bHVlKCksIGNhc2VTZW5zaXRpdmUpIHx8IHNlbC0+dmFsdWUoKS5pc0VtcHR5KCkpCiAgICAgICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2Ug
Q1NTU2VsZWN0b3I6OkJlZ2luOgotICAgICAgICAgICAgaWYgKCF2YWx1ZS5zdGFydHNXaXRoKHNl
bC0+bV92YWx1ZSwgY2FzZVNlbnNpdGl2ZSkgfHwgc2VsLT5tX3ZhbHVlLmlzRW1wdHkoKSkKKyAg
ICAgICAgICAgIGlmICghdmFsdWUuc3RhcnRzV2l0aChzZWwtPnZhbHVlKCksIGNhc2VTZW5zaXRp
dmUpIHx8IHNlbC0+dmFsdWUoKS5pc0VtcHR5KCkpCiAgICAgICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgQ1NTU2VsZWN0b3I6OkVuZDoK
LSAgICAgICAgICAgIGlmICghdmFsdWUuZW5kc1dpdGgoc2VsLT5tX3ZhbHVlLCBjYXNlU2Vuc2l0
aXZlKSB8fCBzZWwtPm1fdmFsdWUuaXNFbXB0eSgpKQorICAgICAgICAgICAgaWYgKCF2YWx1ZS5l
bmRzV2l0aChzZWwtPnZhbHVlKCksIGNhc2VTZW5zaXRpdmUpIHx8IHNlbC0+dmFsdWUoKS5pc0Vt
cHR5KCkpCiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgYnJlYWs7
CiAgICAgICAgIGNhc2UgQ1NTU2VsZWN0b3I6Okh5cGhlbjoKLSAgICAgICAgICAgIGlmICh2YWx1
ZS5sZW5ndGgoKSA8IHNlbC0+bV92YWx1ZS5sZW5ndGgoKSkKKyAgICAgICAgICAgIGlmICh2YWx1
ZS5sZW5ndGgoKSA8IHNlbC0+dmFsdWUoKS5sZW5ndGgoKSkKICAgICAgICAgICAgICAgICByZXR1
cm4gZmFsc2U7Ci0gICAgICAgICAgICBpZiAoIXZhbHVlLnN0YXJ0c1dpdGgoc2VsLT5tX3ZhbHVl
LCBjYXNlU2Vuc2l0aXZlKSkKKyAgICAgICAgICAgIGlmICghdmFsdWUuc3RhcnRzV2l0aChzZWwt
PnZhbHVlKCksIGNhc2VTZW5zaXRpdmUpKQogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
ICAgICAgICAgICAgIC8vIEl0IHRoZXkgc3RhcnQgdGhlIHNhbWUsIGNoZWNrIGZvciBleGFjdCBt
YXRjaCBvciBmb2xsb3dpbmcgJy0nOgotICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCgpICE9
IHNlbC0+bV92YWx1ZS5sZW5ndGgoKSAmJiB2YWx1ZVtzZWwtPm1fdmFsdWUubGVuZ3RoKCldICE9
ICctJykKKyAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGgoKSAhPSBzZWwtPnZhbHVlKCkubGVu
Z3RoKCkgJiYgdmFsdWVbc2VsLT52YWx1ZSgpLmxlbmd0aCgpXSAhPSAnLScpCiAgICAgICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgQ1NT
U2VsZWN0b3I6OlBzZXVkb0NsYXNzOgpAQCAtMjkwMSwyMCArMjkwMSwyMCBAQCB2b2lkIENTU1J1
bGVTZXQ6OmFkZFRvUnVsZVNldChBdG9taWNTdHJpCiB2b2lkIENTU1J1bGVTZXQ6OmFkZFJ1bGUo
Q1NTU3R5bGVSdWxlKiBydWxlLCBDU1NTZWxlY3Rvciogc2VsKQogewogICAgIGlmIChzZWwtPm1f
bWF0Y2ggPT0gQ1NTU2VsZWN0b3I6OklkKSB7Ci0gICAgICAgIGFkZFRvUnVsZVNldChzZWwtPm1f
dmFsdWUuaW1wbCgpLCBtX2lkUnVsZXMsIHJ1bGUsIHNlbCk7CisgICAgICAgIGFkZFRvUnVsZVNl
dChzZWwtPnZhbHVlKCkuaW1wbCgpLCBtX2lkUnVsZXMsIHJ1bGUsIHNlbCk7CiAgICAgICAgIHJl
dHVybjsKICAgICB9CiAgICAgaWYgKHNlbC0+bV9tYXRjaCA9PSBDU1NTZWxlY3Rvcjo6Q2xhc3Mp
IHsKLSAgICAgICAgYWRkVG9SdWxlU2V0KHNlbC0+bV92YWx1ZS5pbXBsKCksIG1fY2xhc3NSdWxl
cywgcnVsZSwgc2VsKTsKKyAgICAgICAgYWRkVG9SdWxlU2V0KHNlbC0+dmFsdWUoKS5pbXBsKCks
IG1fY2xhc3NSdWxlcywgcnVsZSwgc2VsKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICAg
CiAgICAgaWYgKHNlbC0+aXNVbmtub3duUHNldWRvRWxlbWVudCgpKSB7Ci0gICAgICAgIGFkZFRv
UnVsZVNldChzZWwtPm1fdmFsdWUuaW1wbCgpLCBtX3BzZXVkb1J1bGVzLCBydWxlLCBzZWwpOwor
ICAgICAgICBhZGRUb1J1bGVTZXQoc2VsLT52YWx1ZSgpLmltcGwoKSwgbV9wc2V1ZG9SdWxlcywg
cnVsZSwgc2VsKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIGNvbnN0IEF0b21pY1N0
cmluZyYgbG9jYWxOYW1lID0gc2VsLT5tX3RhZy5sb2NhbE5hbWUoKTsKKyAgICBjb25zdCBBdG9t
aWNTdHJpbmcmIGxvY2FsTmFtZSA9IHNlbC0+dGFnKCkubG9jYWxOYW1lKCk7CiAgICAgaWYgKGxv
Y2FsTmFtZSAhPSBzdGFyQXRvbSkgewogICAgICAgICBhZGRUb1J1bGVTZXQobG9jYWxOYW1lLmlt
cGwoKSwgbV90YWdSdWxlcywgcnVsZSwgc2VsKTsKICAgICAgICAgcmV0dXJuOwpAQCAtMzAwMiwx
MiArMzAwMiwxMiBAQCBzdGF0aWMgdm9pZCBjb2xsZWN0SWRzQW5kU2libGluZ1J1bGVzRnJvCiAg
ICAgZm9yIChDU1NSdWxlRGF0YSogZGF0YSA9IHJ1bGVzLT5maXJzdCgpOyBkYXRhOyBkYXRhID0g
ZGF0YS0+bmV4dCgpKSB7CiAgICAgICAgIGJvb2wgZm91bmRTaWJsaW5nU2VsZWN0b3IgPSBmYWxz
ZTsKICAgICAgICAgZm9yIChDU1NTZWxlY3Rvciogc2VsZWN0b3IgPSBkYXRhLT5zZWxlY3Rvcigp
OyBzZWxlY3Rvcjsgc2VsZWN0b3IgPSBzZWxlY3Rvci0+dGFnSGlzdG9yeSgpKSB7Ci0gICAgICAg
ICAgICBpZiAoc2VsZWN0b3ItPm1fbWF0Y2ggPT0gQ1NTU2VsZWN0b3I6OklkICYmICFzZWxlY3Rv
ci0+bV92YWx1ZS5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgaWRzLmFkZChzZWxlY3Rvci0+
bV92YWx1ZS5pbXBsKCkpOworICAgICAgICAgICAgaWYgKHNlbGVjdG9yLT5tX21hdGNoID09IENT
U1NlbGVjdG9yOjpJZCAmJiAhc2VsZWN0b3ItPnZhbHVlKCkuaXNFbXB0eSgpKQorICAgICAgICAg
ICAgICAgIGlkcy5hZGQoc2VsZWN0b3ItPnZhbHVlKCkuaW1wbCgpKTsKICAgICAgICAgICAgIGlm
IChDU1NTZWxlY3Rvciogc2ltcGxlU2VsZWN0b3IgPSBzZWxlY3Rvci0+c2ltcGxlU2VsZWN0b3Io
KSkgewogICAgICAgICAgICAgICAgIEFTU0VSVCghc2ltcGxlU2VsZWN0b3ItPnNpbXBsZVNlbGVj
dG9yKCkpOwotICAgICAgICAgICAgICAgIGlmIChzaW1wbGVTZWxlY3Rvci0+bV9tYXRjaCA9PSBD
U1NTZWxlY3Rvcjo6SWQgJiYgIXNpbXBsZVNlbGVjdG9yLT5tX3ZhbHVlLmlzRW1wdHkoKSkKLSAg
ICAgICAgICAgICAgICAgICAgaWRzLmFkZChzaW1wbGVTZWxlY3Rvci0+bV92YWx1ZS5pbXBsKCkp
OworICAgICAgICAgICAgICAgIGlmIChzaW1wbGVTZWxlY3Rvci0+bV9tYXRjaCA9PSBDU1NTZWxl
Y3Rvcjo6SWQgJiYgIXNpbXBsZVNlbGVjdG9yLT52YWx1ZSgpLmlzRW1wdHkoKSkKKyAgICAgICAg
ICAgICAgICAgICAgaWRzLmFkZChzaW1wbGVTZWxlY3Rvci0+dmFsdWUoKS5pbXBsKCkpOwogICAg
ICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHNlbGVjdG9yLT5pc1NpYmxpbmdTZWxlY3Rvcigp
KQogICAgICAgICAgICAgICAgIGZvdW5kU2libGluZ1NlbGVjdG9yID0gdHJ1ZTsKQEAgLTMxMzIs
NyArMzEzMiw3IEBAIHZvaWQgQ1NTU3R5bGVTZWxlY3Rvcjo6bWF0Y2hQYWdlUnVsZXNGb3IKIAog
ICAgIGZvciAoQ1NTUnVsZURhdGEqIGQgPSBydWxlcy0+Zmlyc3QoKTsgZDsgZCA9IGQtPm5leHQo
KSkgewogICAgICAgICBDU1NTdHlsZVJ1bGUqIHJ1bGUgPSBkLT5ydWxlKCk7Ci0gICAgICAgIGNv
bnN0IEF0b21pY1N0cmluZyYgc2VsZWN0b3JMb2NhbE5hbWUgPSBkLT5zZWxlY3RvcigpLT5tX3Rh
Zy5sb2NhbE5hbWUoKTsKKyAgICAgICAgY29uc3QgQXRvbWljU3RyaW5nJiBzZWxlY3RvckxvY2Fs
TmFtZSA9IGQtPnNlbGVjdG9yKCktPnRhZygpLmxvY2FsTmFtZSgpOwogICAgICAgICBpZiAoc2Vs
ZWN0b3JMb2NhbE5hbWUgIT0gc3RhckF0b20gJiYgc2VsZWN0b3JMb2NhbE5hbWUgIT0gcGFnZU5h
bWUpCiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgQ1NTU2VsZWN0b3I6OlBzZXVkb1R5
cGUgcHNldWRvVHlwZSA9IGQtPnNlbGVjdG9yKCktPnBzZXVkb1R5cGUoKTsKSW5kZXg6IFNvdXJj
ZS9XZWJDb3JlL2RvbS9Ob2RlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9kb20v
Tm9kZS5jcHAJKHJldmlzaW9uIDc2MTc2KQorKysgU291cmNlL1dlYkNvcmUvZG9tL05vZGUuY3Bw
CSh3b3JraW5nIGNvcHkpCkBAIC0xNjM1LDcgKzE2MzUsNyBAQCBQYXNzUmVmUHRyPEVsZW1lbnQ+
IE5vZGU6OnF1ZXJ5U2VsZWN0b3IoCiAKICAgICAvLyBGSVhNRTogd2UgY291bGQgYWxzbyBvcHRp
bWl6ZSBmb3IgdGhlIHRoZSBbaWQ9ImZvbyJdIGNhc2UKICAgICBpZiAoc3RyaWN0UGFyc2luZyAm
JiBpbkRvY3VtZW50KCkgJiYgcXVlcnlTZWxlY3Rvckxpc3QuaGFzT25lU2VsZWN0b3IoKSAmJiBx
dWVyeVNlbGVjdG9yTGlzdC5maXJzdCgpLT5tX21hdGNoID09IENTU1NlbGVjdG9yOjpJZCkgewot
ICAgICAgICBFbGVtZW50KiBlbGVtZW50ID0gZG9jdW1lbnQoKS0+Z2V0RWxlbWVudEJ5SWQocXVl
cnlTZWxlY3Rvckxpc3QuZmlyc3QoKS0+bV92YWx1ZSk7CisgICAgICAgIEVsZW1lbnQqIGVsZW1l
bnQgPSBkb2N1bWVudCgpLT5nZXRFbGVtZW50QnlJZChxdWVyeVNlbGVjdG9yTGlzdC5maXJzdCgp
LT52YWx1ZSgpKTsKICAgICAgICAgaWYgKGVsZW1lbnQgJiYgKGlzRG9jdW1lbnROb2RlKCkgfHwg
ZWxlbWVudC0+aXNEZXNjZW5kYW50T2YodGhpcykpICYmIHNlbGVjdG9yQ2hlY2tlci5jaGVja1Nl
bGVjdG9yKHF1ZXJ5U2VsZWN0b3JMaXN0LmZpcnN0KCksIGVsZW1lbnQpKQogICAgICAgICAgICAg
cmV0dXJuIGVsZW1lbnQ7CiAgICAgICAgIHJldHVybiAwOwpJbmRleDogU291cmNlL1dlYkNvcmUv
ZG9tL1NlbGVjdG9yTm9kZUxpc3QuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2Rv
bS9TZWxlY3Rvck5vZGVMaXN0LmNwcAkocmV2aXNpb24gNzYxNzYpCisrKyBTb3VyY2UvV2ViQ29y
ZS9kb20vU2VsZWN0b3JOb2RlTGlzdC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTUwLDggKzUwLDgg
QEAgUGFzc1JlZlB0cjxTdGF0aWNOb2RlTGlzdD4gY3JlYXRlU2VsZWN0bwogCiAgICAgQ1NTU3R5
bGVTZWxlY3Rvcjo6U2VsZWN0b3JDaGVja2VyIHNlbGVjdG9yQ2hlY2tlcihkb2N1bWVudCwgc3Ry
aWN0UGFyc2luZyk7CiAKLSAgICBpZiAoc3RyaWN0UGFyc2luZyAmJiByb290Tm9kZS0+aW5Eb2N1
bWVudCgpICYmIG9ubHlTZWxlY3RvciAmJiBvbmx5U2VsZWN0b3ItPm1fbWF0Y2ggPT0gQ1NTU2Vs
ZWN0b3I6OklkICYmICFkb2N1bWVudC0+Y29udGFpbnNNdWx0aXBsZUVsZW1lbnRzV2l0aElkKG9u
bHlTZWxlY3Rvci0+bV92YWx1ZSkpIHsKLSAgICAgICAgRWxlbWVudCogZWxlbWVudCA9IGRvY3Vt
ZW50LT5nZXRFbGVtZW50QnlJZChvbmx5U2VsZWN0b3ItPm1fdmFsdWUpOworICAgIGlmIChzdHJp
Y3RQYXJzaW5nICYmIHJvb3ROb2RlLT5pbkRvY3VtZW50KCkgJiYgb25seVNlbGVjdG9yICYmIG9u
bHlTZWxlY3Rvci0+bV9tYXRjaCA9PSBDU1NTZWxlY3Rvcjo6SWQgJiYgIWRvY3VtZW50LT5jb250
YWluc011bHRpcGxlRWxlbWVudHNXaXRoSWQob25seVNlbGVjdG9yLT52YWx1ZSgpKSkgeworICAg
ICAgICBFbGVtZW50KiBlbGVtZW50ID0gZG9jdW1lbnQtPmdldEVsZW1lbnRCeUlkKG9ubHlTZWxl
Y3Rvci0+dmFsdWUoKSk7CiAgICAgICAgIGlmIChlbGVtZW50ICYmIChyb290Tm9kZS0+aXNEb2N1
bWVudE5vZGUoKSB8fCBlbGVtZW50LT5pc0Rlc2NlbmRhbnRPZihyb290Tm9kZSkpICYmIHNlbGVj
dG9yQ2hlY2tlci5jaGVja1NlbGVjdG9yKG9ubHlTZWxlY3RvciwgZWxlbWVudCkpCiAgICAgICAg
ICAgICBub2Rlcy5hcHBlbmQoZWxlbWVudCk7CiAgICAgfSBlbHNlIHsK
</data>
<flag name="review"
          id="71328"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>80009</attachid>
            <date>2011-01-24 20:05:54 -0800</date>
            <delta_ts>2011-01-25 08:57:46 -0800</delta_ts>
            <desc>better CSSParserSelector, more OwnPtrs</desc>
            <filename>selector-array-10.patch</filename>
            <type>text/plain</type>
            <size>57490</size>
            <attacher name="Antti Koivisto">koivisto</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDc2NTY1KQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTIyIEBACisyMDExLTAxLTIzICBBbnR0aSBL
b2l2aXN0byAgPGFudHRpQGFwcGxlLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkg
KE9PUFMhKS4KKworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/
aWQ9NTI5ODMKKyAgICAgICAgRWxpbWluYXRlIG1fdGFnSGlzdG9yeSBwb2ludGVyIGZyb20gQ1NT
U2VsZWN0b3IKKworICAgICAgICBLZWVwIHRoZSBjb21wb25lbnQgc2VsZWN0b3JzIGluIHRoZSBh
cnJheSBpbiBDU1NTZWxlY3Rvckxpc3QgaW5zdGVhZAorICAgICAgICBvZiBtYWludGFpbmluZyBh
IGxpbmtlZCBsaXN0IGJldHdlZW4gdGhlbS4gVGhpcyBhbGxvd3MgZWxpbWluYXRpbmcKKyAgICAg
ICAgbV90YWdIaXN0b3J5IHBvaW50ZXIsIHNocmlua2luZyBDU1NTZWxlY3RvciBieSAyNSUgKHNl
bGVjdGlvbiBwZXJmb3JtYW5jZQorICAgICAgICBzZWVtcyB0byBpbXByb3ZlIHNvbWUgdG9vIGR1
ZSB0byBiZXR0ZXIgbG9jYWxpdHkpLgorCisgICAgICAgICogV2ViQ29yZS54Y29kZXByb2ovcHJv
amVjdC5wYnhwcm9qOgorICAgICAgICAKKyAgICAgICAgICAgIE1ha2UgQ1NTU2VsZWN0b3IuaCBh
IHByaXZhdGUgaGVhZGVyLgorICAgICAgICAKKyAgICAgICAgKiBjc3MvQ1NTR3JhbW1hci55Ogor
ICAgICAgICAKKyAgICAgICAgICAgIFVzZSBDU1NQYXJzZXJTZWxlY3RvciBkdXJpbmcgcGFyc2lu
ZyB0byBrZWVwIHRoZSB0YWcgaGlzdG9yeSBpbiAKKyAgICAgICAgICAgIGEgbGlua2VkIGxpc3Qu
IFRoaXMgaXMgZmxhdHRlbmVkIHRvIGFuIGFycmF5IGFmdGVyIHBhcnNpbmcuCisgICAgICAgICAg
ICBVc2UgYWNjZXNzb3JzIGZvciBzZXR0aW5nIHNlbGVjdG9yIHZhbHVlcy4KKyAgICAgICAgICAg
IFVzZSBPd25QdHIgaW4gc2VsZWN0b3IgdmVjdG9yLgorICAgICAgICAgICAgCisgICAgICAgICog
Y3NzL0NTU1BhZ2VSdWxlLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkNTU1BhZ2VSdWxlOjpDU1NQ
YWdlUnVsZSk6CisgICAgICAgICogY3NzL0NTU1BhZ2VSdWxlLmg6CisgICAgICAgIChXZWJDb3Jl
OjpDU1NQYWdlUnVsZTo6Y3JlYXRlKToKKyAgICAgICAgCisgICAgICAgICAgICBTaW1wbGlmeS4K
KyAgICAKKyAgICAgICAgKiBjc3MvQ1NTUGFyc2VyLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkNT
U1BhcnNlcjo6fkNTU1BhcnNlcik6CisgICAgICAgIChXZWJDb3JlOjpDU1NQYXJzZXI6OmNyZWF0
ZUZsb2F0aW5nU2VsZWN0b3IpOgorICAgICAgICAoV2ViQ29yZTo6Q1NTUGFyc2VyOjpzaW5rRmxv
YXRpbmdTZWxlY3Rvcik6CisgICAgICAgIChXZWJDb3JlOjpDU1NQYXJzZXI6OmNyZWF0ZVN0eWxl
UnVsZSk6CisgICAgICAgIChXZWJDb3JlOjpDU1NQYXJzZXI6OnVwZGF0ZVNwZWNpZmllcnNXaXRo
RWxlbWVudE5hbWUpOgorICAgICAgICAoV2ViQ29yZTo6Q1NTUGFyc2VyOjpjcmVhdGVQYWdlUnVs
ZSk6CisgICAgICAgICogY3NzL0NTU1BhcnNlci5oOgorICAgICAgICAoV2ViQ29yZTo6Q1NTUGFy
c2VyOjpyZXVzYWJsZVNlbGVjdG9yVmVjdG9yKToKKyAgICAgICAgCisgICAgICAgICAgICBDU1NT
ZWxlY3RvciAtPiBDU1NQYXJzZXJTZWxlY3Rvci4KKyAgICAgICAgICAgIFVzZSBPd25QdHIgaW4g
c2VsZWN0b3IgdmVjdG9yLgorICAgICAgICAgICAgCisgICAgICAgICogY3NzL0NTU1BhcnNlclZh
bHVlcy5jcHA6CisgICAgICAgIChXZWJDb3JlOjpDU1NQYXJzZXJTZWxlY3Rvcjo6Q1NTUGFyc2Vy
U2VsZWN0b3IpOgorICAgICAgICAoV2ViQ29yZTo6Q1NTUGFyc2VyU2VsZWN0b3I6On5DU1NQYXJz
ZXJTZWxlY3Rvcik6CisgICAgICAgICogY3NzL0NTU1BhcnNlclZhbHVlcy5oOgorICAgICAgICAo
V2ViQ29yZTo6Q1NTUGFyc2VyU2VsZWN0b3I6OnJlbGVhc2VTZWxlY3Rvcik6CisgICAgICAgIChX
ZWJDb3JlOjpDU1NQYXJzZXJTZWxlY3Rvcjo6c2V0VGFnKToKKyAgICAgICAgKFdlYkNvcmU6OkNT
U1BhcnNlclNlbGVjdG9yOjpzZXRWYWx1ZSk6CisgICAgICAgIChXZWJDb3JlOjpDU1NQYXJzZXJT
ZWxlY3Rvcjo6c2V0QXR0cmlidXRlKToKKyAgICAgICAgKFdlYkNvcmU6OkNTU1BhcnNlclNlbGVj
dG9yOjpzZXRBcmd1bWVudCk6CisgICAgICAgIChXZWJDb3JlOjpDU1NQYXJzZXJTZWxlY3Rvcjo6
c2V0U2ltcGxlU2VsZWN0b3IpOgorICAgICAgICAoV2ViQ29yZTo6Q1NTUGFyc2VyU2VsZWN0b3I6
OnNldE1hdGNoKToKKyAgICAgICAgKFdlYkNvcmU6OkNTU1BhcnNlclNlbGVjdG9yOjpzZXRSZWxh
dGlvbik6CisgICAgICAgIChXZWJDb3JlOjpDU1NQYXJzZXJTZWxlY3Rvcjo6c2V0Rm9yUGFnZSk6
CisgICAgICAgIChXZWJDb3JlOjpDU1NQYXJzZXJTZWxlY3Rvcjo6cHNldWRvVHlwZSk6CisgICAg
ICAgIChXZWJDb3JlOjpDU1NQYXJzZXJTZWxlY3Rvcjo6aXNVbmtub3duUHNldWRvRWxlbWVudCk6
CisgICAgICAgIChXZWJDb3JlOjpDU1NQYXJzZXJTZWxlY3Rvcjo6aXNTaW1wbGUpOgorICAgICAg
ICAoV2ViQ29yZTo6Q1NTUGFyc2VyU2VsZWN0b3I6OnRhZ0hpc3RvcnkpOgorICAgICAgICAoV2Vi
Q29yZTo6Q1NTUGFyc2VyU2VsZWN0b3I6OnNldFRhZ0hpc3RvcnkpOgorICAgICAgICAKKyAgICAg
ICAgICAgIExpbmtlZCBsaXN0IHVzZWQgZHVyaW5nIHBhcnNpbmcuCisgICAgICAgICAgICBBdm9p
ZCByZWN1cnNpdmUgZGVzdHJ1Y3Rpb24uCisKKyAgICAgICAgKiBjc3MvQ1NTU2VsZWN0b3IuY3Bw
OgorICAgICAgICAoV2ViQ29yZTo6Q1NTU2VsZWN0b3I6OmV4dHJhY3RQc2V1ZG9UeXBlKToKKyAg
ICAgICAgKFdlYkNvcmU6OkNTU1NlbGVjdG9yOjpvcGVyYXRvcj09KToKKyAgICAgICAgKFdlYkNv
cmU6OkNTU1NlbGVjdG9yOjpzZWxlY3RvclRleHQpOgorICAgICAgICAoV2ViQ29yZTo6Q1NTU2Vs
ZWN0b3I6OnNldFNpbXBsZVNlbGVjdG9yKToKKyAgICAgICAgKiBjc3MvQ1NTU2VsZWN0b3IuaDoK
KyAgICAgICAgKFdlYkNvcmU6OkNTU1NlbGVjdG9yOjpDU1NTZWxlY3Rvcik6CisgICAgICAgIChX
ZWJDb3JlOjpDU1NTZWxlY3Rvcjo6fkNTU1NlbGVjdG9yKToKKyAgICAgICAgKFdlYkNvcmU6OkNT
U1NlbGVjdG9yOjp0YWdIaXN0b3J5KToKKyAgICAgICAgKFdlYkNvcmU6OkNTU1NlbGVjdG9yOjp0
YWcpOgorICAgICAgICAoV2ViQ29yZTo6Q1NTU2VsZWN0b3I6OnZhbHVlKToKKyAgICAgICAgKFdl
YkNvcmU6OkNTU1NlbGVjdG9yOjpzZXRUYWcpOgorICAgICAgICAoV2ViQ29yZTo6Q1NTU2VsZWN0
b3I6OmlzTGFzdEluVGFnSGlzdG9yeSk6CisgICAgICAgIChXZWJDb3JlOjpDU1NTZWxlY3Rvcjo6
c2V0Tm90TGFzdEluVGFnSGlzdG9yeSk6CisgICAgICAgIChXZWJDb3JlOjpDU1NTZWxlY3Rvcjo6
UmFyZURhdGE6OlJhcmVEYXRhKToKKyAgICAgICAgKFdlYkNvcmU6OkNTU1NlbGVjdG9yOjpSYXJl
RGF0YTo6flJhcmVEYXRhKToKKyAgICAgICAgKFdlYkNvcmU6OkNTU1NlbGVjdG9yOjpjcmVhdGVS
YXJlRGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpDU1NTZWxlY3Rvcjo6c2V0VmFsdWUpOgorICAg
ICAgICAKKyAgICAgICAgICAgIFJlbW92ZSBtX3RhZ0hpc3RvcnkuCisgICAgICAgICAgICBLZWVw
IG1fdmFsdWUgaW4gdGhlIHVuaW9uIHdpdGggdGhlIHJhcmUgZGF0YSBwb2ludGVyIGluc3RlYWQu
CisgICAgICAgICAgICBNYWtlIG1fdmFsdWUgYW5kIG1fdGFnIHByaXZhdGUsIGltcGxlbWVudCBh
Y2Nlc3NvcnMuCisgICAgICAgICAgICBBZGQgYSBuZXcgYml0IHRvIGluZGljYXRlIGVuZCBvZiB0
aGUgdGFnIGhpc3RvcnkgKG11bHRpcGFydCBzZWxlY3RvcikuCisgICAgICAgICAgICBFbGltaW5h
dGUgY29tcGxleCBkZXN0cnVjdGlvbi4gU2VsZWN0b3JzIGFyZSBub3cgZGVsZXRlZCBhcyBhbiBh
cnJheSBvciBieSBhIENTU1BhcnNlclNlbGVjdG9yIGNoYWluLgorICAgICAgICAgICAgCisgICAg
ICAgICogY3NzL0NTU1NlbGVjdG9yTGlzdC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpDU1NTZWxl
Y3Rvckxpc3Q6OmFkb3B0U2VsZWN0b3JWZWN0b3IpOgorICAgICAgICAKKyAgICAgICAgICAgIEZs
YXR0ZW4gZXZlcnl0aGluZyB0byBhbiBhcnJheS4KKyAgICAgICAgCisgICAgICAgIChXZWJDb3Jl
OjpTZWxlY3Rvck5lZWRzTmFtZXNwYWNlUmVzb2x1dGlvbkZ1bmN0b3I6Om9wZXJhdG9yKCkpOgor
ICAgICAgICAqIGNzcy9DU1NTZWxlY3Rvckxpc3QuaDoKKyAgICAgICAgKFdlYkNvcmU6OkNTU1Nl
bGVjdG9yTGlzdDo6aGFzT25lU2VsZWN0b3IpOgorICAgICAgICAoV2ViQ29yZTo6Q1NTU2VsZWN0
b3JMaXN0OjpuZXh0KToKKyAgICAgICAgCisgICAgICAgICAgICBTa2lwIG92ZXIgdGhlIHN1YnBh
cnRzIG9mIG11bHRpcGFydCBzZWxlY3RvcnMgdG8gZmluZCB0aGUgbmV4dCBzZWxlY3Rvci4KKyAg
ICAKKyAgICAgICAgKiBjc3MvQ1NTU3R5bGVSdWxlLmg6CisgICAgICAgIChXZWJDb3JlOjpDU1NT
dHlsZVJ1bGU6OmFkb3B0U2VsZWN0b3JWZWN0b3IpOgorICAgICAgICAKKyAgICAgICAgICAgIENT
U1NlbGVjdG9yIC0+IENTU1BhcnNlclNlbGVjdG9yLgorICAgICAgICAgICAgCisgICAgICAgICog
Y3NzL0NTU1N0eWxlU2VsZWN0b3IuY3BwOgorICAgICAgICAoV2ViQ29yZTo6Q1NTU3R5bGVTZWxl
Y3Rvcjo6U2VsZWN0b3JDaGVja2VyOjpjaGVja09uZVNlbGVjdG9yKToKKyAgICAgICAgKFdlYkNv
cmU6OkNTU1J1bGVTZXQ6OmFkZFJ1bGUpOgorICAgICAgICAoV2ViQ29yZTo6Y29sbGVjdElkc0Fu
ZFNpYmxpbmdSdWxlc0Zyb21MaXN0KToKKyAgICAgICAgKFdlYkNvcmU6OkNTU1N0eWxlU2VsZWN0
b3I6Om1hdGNoUGFnZVJ1bGVzRm9yTGlzdCk6CisgICAgICAgICogZG9tL05vZGUuY3BwOgorICAg
ICAgICAoV2ViQ29yZTo6Tm9kZTo6cXVlcnlTZWxlY3Rvcik6CisgICAgICAgICogZG9tL1NlbGVj
dG9yTm9kZUxpc3QuY3BwOgorICAgICAgICAoV2ViQ29yZTo6Y3JlYXRlU2VsZWN0b3JOb2RlTGlz
dCk6CisgICAgICAgIAorICAgICAgICAgICAgVXNlIGFjY2Vzc29ycy4KKwogMjAxMS0wMS0yNCAg
Unlvc3VrZSBOaXdhICA8cm5pd2FAd2Via2l0Lm9yZz4KIAogICAgICAgICBSZXZpZXdlZCBieSBP
amFuIFZhZmFpLgpJbmRleDogU291cmNlL1dlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVj
dC5wYnhwcm9qCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9q
L3Byb2plY3QucGJ4cHJvagkocmV2aXNpb24gNzY1NjUpCisrKyBTb3VyY2UvV2ViQ29yZS9XZWJD
b3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oJKHdvcmtpbmcgY29weSkKQEAgLTMyNzMsNyAr
MzI3Myw3IEBACiAJCUE4MEU3MzRGMEExOTlDNzcwMDdGQjhDNSAvKiBDU1NTZWxlY3Rvci5jcHAg
aW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBBODBFNzM0ODBB
MTk5Qzc3MDA3RkI4QzUgLyogQ1NTU2VsZWN0b3IuY3BwICovOyB9OwogCQlBODBFNzM1MDBBMTk5
Qzc3MDA3RkI4QzUgLyogU3R5bGVCYXNlLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWls
ZEZpbGU7IGZpbGVSZWYgPSBBODBFNzM0OTBBMTk5Qzc3MDA3RkI4QzUgLyogU3R5bGVCYXNlLmgg
Ki87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsKIAkJQTgwRTcz
NTEwQTE5OUM3NzAwN0ZCOEM1IC8qIFN0eWxlTGlzdC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0g
UEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQTgwRTczNEEwQTE5OUM3NzAwN0ZCOEM1IC8qIFN0eWxl
TGlzdC5oICovOyB9OwotCQlBODBFNzM1MjBBMTk5Qzc3MDA3RkI4QzUgLyogQ1NTU2VsZWN0b3Iu
aCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEE4MEU3MzRC
MEExOTlDNzcwMDdGQjhDNSAvKiBDU1NTZWxlY3Rvci5oICovOyB9OworCQlBODBFNzM1MjBBMTk5
Qzc3MDA3RkI4QzUgLyogQ1NTU2VsZWN0b3IuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1
aWxkRmlsZTsgZmlsZVJlZiA9IEE4MEU3MzRCMEExOTlDNzcwMDdGQjhDNSAvKiBDU1NTZWxlY3Rv
ci5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFByaXZhdGUsICk7IH07IH07CiAJCUE4
MEU3MzUzMEExOTlDNzcwMDdGQjhDNSAvKiBTdHlsZUJhc2UuY3BwIGluIFNvdXJjZXMgKi8gPSB7
aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQTgwRTczNEMwQTE5OUM3NzAwN0ZCOEM1IC8q
IFN0eWxlQmFzZS5jcHAgKi87IH07CiAJCUE4MEU3QTE3MEExOUMzRDYwMDdGQjhDNSAvKiBKU0hU
TUxNZXRhRWxlbWVudC5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZp
bGVSZWYgPSBBODBFN0ExNTBBMTlDM0Q2MDA3RkI4QzUgLyogSlNIVE1MTWV0YUVsZW1lbnQuY3Bw
ICovOyB9OwogCQlBODBFN0ExODBBMTlDM0Q2MDA3RkI4QzUgLyogSlNIVE1MTWV0YUVsZW1lbnQu
aCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEE4MEU3QTE2
MEExOUMzRDYwMDdGQjhDNSAvKiBKU0hUTUxNZXRhRWxlbWVudC5oICovOyB9OwpJbmRleDogU291
cmNlL1dlYkNvcmUvY3NzL0NTU0dyYW1tYXIueQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29y
ZS9jc3MvQ1NTR3JhbW1hci55CShyZXZpc2lvbiA3NjU2NSkKKysrIFNvdXJjZS9XZWJDb3JlL2Nz
cy9DU1NHcmFtbWFyLnkJKHdvcmtpbmcgY29weSkKQEAgLTY5LDggKzY5LDggQEAgdXNpbmcgbmFt
ZXNwYWNlIEhUTUxOYW1lczsKIAogICAgIENTU1J1bGUqIHJ1bGU7CiAgICAgQ1NTUnVsZUxpc3Qq
IHJ1bGVMaXN0OwotICAgIENTU1NlbGVjdG9yKiBzZWxlY3RvcjsKLSAgICBWZWN0b3I8Q1NTU2Vs
ZWN0b3IqPiogc2VsZWN0b3JMaXN0OworICAgIENTU1BhcnNlclNlbGVjdG9yKiBzZWxlY3RvcjsK
KyAgICBWZWN0b3I8T3duUHRyPENTU1BhcnNlclNlbGVjdG9yPiA+KiBzZWxlY3Rvckxpc3Q7CiAg
ICAgQ1NTU2VsZWN0b3I6Ok1hcmdpbkJveFR5cGUgbWFyZ2luQm94OwogICAgIENTU1NlbGVjdG9y
OjpSZWxhdGlvbiByZWxhdGlvbjsKICAgICBNZWRpYUxpc3QqIG1lZGlhTGlzdDsKQEAgLTY2Mywx
NCArNjYzLDE0IEBAIHBhZ2Vfc2VsZWN0b3I6CiAgICAgSURFTlQgewogICAgICAgICBDU1NQYXJz
ZXIqIHAgPSBzdGF0aWNfY2FzdDxDU1NQYXJzZXIqPihwYXJzZXIpOwogICAgICAgICAkJCA9IHAt
PmNyZWF0ZUZsb2F0aW5nU2VsZWN0b3IoKTsKLSAgICAgICAgJCQtPm1fdGFnID0gUXVhbGlmaWVk
TmFtZShudWxsQXRvbSwgJDEsIHAtPm1fZGVmYXVsdE5hbWVzcGFjZSk7CisgICAgICAgICQkLT5z
ZXRUYWcoUXVhbGlmaWVkTmFtZShudWxsQXRvbSwgJDEsIHAtPm1fZGVmYXVsdE5hbWVzcGFjZSkp
OwogICAgICAgICAkJC0+c2V0Rm9yUGFnZSgpOwogICAgIH0KICAgICB8IElERU5UIHBzZXVkb19w
YWdlIHsKICAgICAgICAgQ1NTUGFyc2VyKiBwID0gc3RhdGljX2Nhc3Q8Q1NTUGFyc2VyKj4ocGFy
c2VyKTsKICAgICAgICAgJCQgPSAkMjsKICAgICAgICAgaWYgKCQkKSB7Ci0gICAgICAgICAgICAk
JC0+bV90YWcgPSBRdWFsaWZpZWROYW1lKG51bGxBdG9tLCAkMSwgcC0+bV9kZWZhdWx0TmFtZXNw
YWNlKTsKKyAgICAgICAgICAgICQkLT5zZXRUYWcoUXVhbGlmaWVkTmFtZShudWxsQXRvbSwgJDEs
IHAtPm1fZGVmYXVsdE5hbWVzcGFjZSkpOwogICAgICAgICAgICAgJCQtPnNldEZvclBhZ2UoKTsK
ICAgICAgICAgfQogICAgIH0KQEAgLTgxMiw3ICs4MTIsNiBAQCBzZWxlY3Rvcl9saXN0OgogICAg
ICAgICBpZiAoJDEpIHsKICAgICAgICAgICAgIENTU1BhcnNlciogcCA9IHN0YXRpY19jYXN0PENT
U1BhcnNlcio+KHBhcnNlcik7CiAgICAgICAgICAgICAkJCA9IHAtPnJldXNhYmxlU2VsZWN0b3JW
ZWN0b3IoKTsKLSAgICAgICAgICAgIGRlbGV0ZUFsbFZhbHVlcygqJCQpOwogICAgICAgICAgICAg
JCQtPnNocmluaygwKTsKICAgICAgICAgICAgICQkLT5hcHBlbmQocC0+c2lua0Zsb2F0aW5nU2Vs
ZWN0b3IoJDEpKTsKICAgICAgICAgICAgIHAtPnVwZGF0ZUxhc3RTZWxlY3RvckxpbmVBbmRQb3Np
dGlvbigpOwpAQCAtODUzLDEwICs4NTIsMTAgQEAgc2VsZWN0b3I6CiAgICAgICAgICAgICAkJCA9
IDA7CiAgICAgICAgIGVsc2UgaWYgKCQkKSB7CiAgICAgICAgICAgICBDU1NQYXJzZXIqIHAgPSBz
dGF0aWNfY2FzdDxDU1NQYXJzZXIqPihwYXJzZXIpOwotICAgICAgICAgICAgQ1NTU2VsZWN0b3Iq
IGVuZCA9ICQkOworICAgICAgICAgICAgQ1NTUGFyc2VyU2VsZWN0b3IqIGVuZCA9ICQkOwogICAg
ICAgICAgICAgd2hpbGUgKGVuZC0+dGFnSGlzdG9yeSgpKQogICAgICAgICAgICAgICAgIGVuZCA9
IGVuZC0+dGFnSGlzdG9yeSgpOwotICAgICAgICAgICAgZW5kLT5tX3JlbGF0aW9uID0gQ1NTU2Vs
ZWN0b3I6OkRlc2NlbmRhbnQ7CisgICAgICAgICAgICBlbmQtPnNldFJlbGF0aW9uKENTU1NlbGVj
dG9yOjpEZXNjZW5kYW50KTsKICAgICAgICAgICAgIGVuZC0+c2V0VGFnSGlzdG9yeShwLT5zaW5r
RmxvYXRpbmdTZWxlY3RvcigkMSkpOwogICAgICAgICAgICAgaWYgKERvY3VtZW50KiBkb2MgPSBw
LT5kb2N1bWVudCgpKQogICAgICAgICAgICAgICAgIGRvYy0+c2V0VXNlc0Rlc2NlbmRhbnRSdWxl
cyh0cnVlKTsKQEAgLTg2OCwxMCArODY3LDEwIEBAIHNlbGVjdG9yOgogICAgICAgICAgICAgJCQg
PSAwOwogICAgICAgICBlbHNlIGlmICgkJCkgewogICAgICAgICAgICAgQ1NTUGFyc2VyKiBwID0g
c3RhdGljX2Nhc3Q8Q1NTUGFyc2VyKj4ocGFyc2VyKTsKLSAgICAgICAgICAgIENTU1NlbGVjdG9y
KiBlbmQgPSAkJDsKKyAgICAgICAgICAgIENTU1BhcnNlclNlbGVjdG9yKiBlbmQgPSAkJDsKICAg
ICAgICAgICAgIHdoaWxlIChlbmQtPnRhZ0hpc3RvcnkoKSkKICAgICAgICAgICAgICAgICBlbmQg
PSBlbmQtPnRhZ0hpc3RvcnkoKTsKLSAgICAgICAgICAgIGVuZC0+bV9yZWxhdGlvbiA9ICQyOwor
ICAgICAgICAgICAgZW5kLT5zZXRSZWxhdGlvbigkMik7CiAgICAgICAgICAgICBlbmQtPnNldFRh
Z0hpc3RvcnkocC0+c2lua0Zsb2F0aW5nU2VsZWN0b3IoJDEpKTsKICAgICAgICAgICAgIGlmICgk
MiA9PSBDU1NTZWxlY3Rvcjo6Q2hpbGQpIHsKICAgICAgICAgICAgICAgICBpZiAoRG9jdW1lbnQq
IGRvYyA9IHAtPmRvY3VtZW50KCkpCkBAIC04OTcsNyArODk2LDcgQEAgc2ltcGxlX3NlbGVjdG9y
OgogICAgIGVsZW1lbnRfbmFtZSB7CiAgICAgICAgIENTU1BhcnNlciogcCA9IHN0YXRpY19jYXN0
PENTU1BhcnNlcio+KHBhcnNlcik7CiAgICAgICAgICQkID0gcC0+Y3JlYXRlRmxvYXRpbmdTZWxl
Y3RvcigpOwotICAgICAgICAkJC0+bV90YWcgPSBRdWFsaWZpZWROYW1lKG51bGxBdG9tLCAkMSwg
cC0+bV9kZWZhdWx0TmFtZXNwYWNlKTsKKyAgICAgICAgJCQtPnNldFRhZyhRdWFsaWZpZWROYW1l
KG51bGxBdG9tLCAkMSwgcC0+bV9kZWZhdWx0TmFtZXNwYWNlKSk7CiAgICAgfQogICAgIHwgZWxl
bWVudF9uYW1lIHNwZWNpZmllcl9saXN0IHsKICAgICAgICAgJCQgPSAkMjsKQEAgLTkxNCwxMCAr
OTEzLDEwIEBAIHNpbXBsZV9zZWxlY3RvcjoKICAgICAgICAgQ1NTUGFyc2VyKiBwID0gc3RhdGlj
X2Nhc3Q8Q1NTUGFyc2VyKj4ocGFyc2VyKTsKICAgICAgICAgJCQgPSBwLT5jcmVhdGVGbG9hdGlu
Z1NlbGVjdG9yKCk7CiAgICAgICAgIGlmIChwLT5tX3N0eWxlU2hlZXQpCi0gICAgICAgICAgICAk
JC0+bV90YWcgPSBRdWFsaWZpZWROYW1lKG5hbWVzcGFjZVByZWZpeCwgJDIsCi0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPm1fc3R5bGVTaGVldC0+ZGV0ZXJtaW5lTmFt
ZXNwYWNlKG5hbWVzcGFjZVByZWZpeCkpOworICAgICAgICAgICAgJCQtPnNldFRhZyhRdWFsaWZp
ZWROYW1lKG5hbWVzcGFjZVByZWZpeCwgJDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHAtPm1fc3R5bGVTaGVldC0+ZGV0ZXJtaW5lTmFtZXNwYWNlKG5hbWVzcGFjZVBy
ZWZpeCkpKTsKICAgICAgICAgZWxzZSAvLyBGSVhNRTogU2hvdWxkbid0IHRoaXMgY2FzZSBiZSBh
biBlcnJvcj8KLSAgICAgICAgICAgICQkLT5tX3RhZyA9IFF1YWxpZmllZE5hbWUobnVsbEF0b20s
ICQyLCBwLT5tX2RlZmF1bHROYW1lc3BhY2UpOworICAgICAgICAgICAgJCQtPnNldFRhZyhRdWFs
aWZpZWROYW1lKG51bGxBdG9tLCAkMiwgcC0+bV9kZWZhdWx0TmFtZXNwYWNlKSk7CiAgICAgfQog
ICAgIHwgbmFtZXNwYWNlX3NlbGVjdG9yIGVsZW1lbnRfbmFtZSBzcGVjaWZpZXJfbGlzdCB7CiAg
ICAgICAgICQkID0gJDM7CkBAIC05NTYsOCArOTU1LDggQEAgc3BlY2lmaWVyX2xpc3Q6CiAgICAg
ICAgICAgICAkJCA9IDA7CiAgICAgICAgIGVsc2UgaWYgKCQxKSB7CiAgICAgICAgICAgICBDU1NQ
YXJzZXIqIHAgPSBzdGF0aWNfY2FzdDxDU1NQYXJzZXIqPihwYXJzZXIpOwotICAgICAgICAgICAg
Q1NTU2VsZWN0b3IqIGVuZDsKLSAgICAgICAgICAgIENTU1NlbGVjdG9yKiBoaXN0b3J5OworICAg
ICAgICAgICAgQ1NTUGFyc2VyU2VsZWN0b3IqIGVuZDsKKyAgICAgICAgICAgIENTU1BhcnNlclNl
bGVjdG9yKiBoaXN0b3J5OwogICAgICAgICAgICAgLy8gRW5zdXJlIHRoYXQgdW5rbm93biBwc2V1
ZG8gZWxlbWVudCBhbHdheXMgc3RheXMgYXQgdGhlIHRvcCBvZiBzZWxlY3RvciBjaGFpbi4KICAg
ICAgICAgICAgIGlmICgkMi0+aXNVbmtub3duUHNldWRvRWxlbWVudCgpKSB7CiAgICAgICAgICAg
ICAgICAgZW5kID0gJDI7CkBAIC05NjksNyArOTY4LDcgQEAgc3BlY2lmaWVyX2xpc3Q6CiAgICAg
ICAgICAgICAkJCA9IGVuZDsKICAgICAgICAgICAgIHdoaWxlKGVuZC0+dGFnSGlzdG9yeSgpKQog
ICAgICAgICAgICAgICAgIGVuZCA9IGVuZC0+dGFnSGlzdG9yeSgpOwotICAgICAgICAgICAgZW5k
LT5tX3JlbGF0aW9uID0gQ1NTU2VsZWN0b3I6OlN1YlNlbGVjdG9yOworICAgICAgICAgICAgZW5k
LT5zZXRSZWxhdGlvbihDU1NTZWxlY3Rvcjo6U3ViU2VsZWN0b3IpOwogICAgICAgICAgICAgZW5k
LT5zZXRUYWdIaXN0b3J5KHAtPnNpbmtGbG9hdGluZ1NlbGVjdG9yKGhpc3RvcnkpKTsKICAgICAg
ICAgfQogICAgIH0KQEAgLTk4MiwxMCArOTgxLDEwIEBAIHNwZWNpZmllcjoKICAgICBJRFNFTCB7
CiAgICAgICAgIENTU1BhcnNlciogcCA9IHN0YXRpY19jYXN0PENTU1BhcnNlcio+KHBhcnNlcik7
CiAgICAgICAgICQkID0gcC0+Y3JlYXRlRmxvYXRpbmdTZWxlY3RvcigpOwotICAgICAgICAkJC0+
bV9tYXRjaCA9IENTU1NlbGVjdG9yOjpJZDsKKyAgICAgICAgJCQtPnNldE1hdGNoKENTU1NlbGVj
dG9yOjpJZCk7CiAgICAgICAgIGlmICghcC0+bV9zdHJpY3QpCiAgICAgICAgICAgICAkMS5sb3dl
cigpOwotICAgICAgICAkJC0+bV92YWx1ZSA9ICQxOworICAgICAgICAkJC0+c2V0VmFsdWUoJDEp
OwogICAgIH0KICAgfCBIRVggewogICAgICAgICBpZiAoJDEuY2hhcmFjdGVyc1swXSA+PSAnMCcg
JiYgJDEuY2hhcmFjdGVyc1swXSA8PSAnOScpIHsKQEAgLTk5MywxMCArOTkyLDEwIEBAIHNwZWNp
ZmllcjoKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIENTU1BhcnNlciogcCA9IHN0YXRp
Y19jYXN0PENTU1BhcnNlcio+KHBhcnNlcik7CiAgICAgICAgICAgICAkJCA9IHAtPmNyZWF0ZUZs
b2F0aW5nU2VsZWN0b3IoKTsKLSAgICAgICAgICAgICQkLT5tX21hdGNoID0gQ1NTU2VsZWN0b3I6
OklkOworICAgICAgICAgICAgJCQtPnNldE1hdGNoKENTU1NlbGVjdG9yOjpJZCk7CiAgICAgICAg
ICAgICBpZiAoIXAtPm1fc3RyaWN0KQogICAgICAgICAgICAgICAgICQxLmxvd2VyKCk7Ci0gICAg
ICAgICAgICAkJC0+bV92YWx1ZSA9ICQxOworICAgICAgICAgICAgJCQtPnNldFZhbHVlKCQxKTsK
ICAgICAgICAgfQogICAgIH0KICAgfCBjbGFzcwpAQCAtMTAwOCwxMCArMTAwNywxMCBAQCBjbGFz
czoKICAgICAnLicgSURFTlQgewogICAgICAgICBDU1NQYXJzZXIqIHAgPSBzdGF0aWNfY2FzdDxD
U1NQYXJzZXIqPihwYXJzZXIpOwogICAgICAgICAkJCA9IHAtPmNyZWF0ZUZsb2F0aW5nU2VsZWN0
b3IoKTsKLSAgICAgICAgJCQtPm1fbWF0Y2ggPSBDU1NTZWxlY3Rvcjo6Q2xhc3M7CisgICAgICAg
ICQkLT5zZXRNYXRjaChDU1NTZWxlY3Rvcjo6Q2xhc3MpOwogICAgICAgICBpZiAoIXAtPm1fc3Ry
aWN0KQogICAgICAgICAgICAgJDIubG93ZXIoKTsKLSAgICAgICAgJCQtPm1fdmFsdWUgPSAkMjsK
KyAgICAgICAgJCQtPnNldFZhbHVlKCQyKTsKICAgICB9CiAgIDsKIApAQCAtMTAzMCwxMyArMTAy
OSwxMyBAQCBhdHRyaWI6CiAgICAgJ1snIG1heWJlX3NwYWNlIGF0dHJfbmFtZSAnXScgewogICAg
ICAgICAkJCA9IHN0YXRpY19jYXN0PENTU1BhcnNlcio+KHBhcnNlciktPmNyZWF0ZUZsb2F0aW5n
U2VsZWN0b3IoKTsKICAgICAgICAgJCQtPnNldEF0dHJpYnV0ZShRdWFsaWZpZWROYW1lKG51bGxB
dG9tLCAkMywgbnVsbEF0b20pKTsKLSAgICAgICAgJCQtPm1fbWF0Y2ggPSBDU1NTZWxlY3Rvcjo6
U2V0OworICAgICAgICAkJC0+c2V0TWF0Y2goQ1NTU2VsZWN0b3I6OlNldCk7CiAgICAgfQogICAg
IHwgJ1snIG1heWJlX3NwYWNlIGF0dHJfbmFtZSBtYXRjaCBtYXliZV9zcGFjZSBpZGVudF9vcl9z
dHJpbmcgbWF5YmVfc3BhY2UgJ10nIHsKICAgICAgICAgJCQgPSBzdGF0aWNfY2FzdDxDU1NQYXJz
ZXIqPihwYXJzZXIpLT5jcmVhdGVGbG9hdGluZ1NlbGVjdG9yKCk7CiAgICAgICAgICQkLT5zZXRB
dHRyaWJ1dGUoUXVhbGlmaWVkTmFtZShudWxsQXRvbSwgJDMsIG51bGxBdG9tKSk7Ci0gICAgICAg
ICQkLT5tX21hdGNoID0gKENTU1NlbGVjdG9yOjpNYXRjaCkkNDsKLSAgICAgICAgJCQtPm1fdmFs
dWUgPSAkNjsKKyAgICAgICAgJCQtPnNldE1hdGNoKChDU1NTZWxlY3Rvcjo6TWF0Y2gpJDQpOwor
ICAgICAgICAkJC0+c2V0VmFsdWUoJDYpOwogICAgIH0KICAgICB8ICdbJyBtYXliZV9zcGFjZSBu
YW1lc3BhY2Vfc2VsZWN0b3IgYXR0cl9uYW1lICddJyB7CiAgICAgICAgIEF0b21pY1N0cmluZyBu
YW1lc3BhY2VQcmVmaXggPSAkMzsKQEAgLTEwNDQsNyArMTA0Myw3IEBAIGF0dHJpYjoKICAgICAg
ICAgJCQgPSBwLT5jcmVhdGVGbG9hdGluZ1NlbGVjdG9yKCk7CiAgICAgICAgICQkLT5zZXRBdHRy
aWJ1dGUoUXVhbGlmaWVkTmFtZShuYW1lc3BhY2VQcmVmaXgsICQ0LAogICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBwLT5tX3N0eWxlU2hlZXQtPmRldGVybWluZU5hbWVzcGFjZShu
YW1lc3BhY2VQcmVmaXgpKSk7Ci0gICAgICAgICQkLT5tX21hdGNoID0gQ1NTU2VsZWN0b3I6OlNl
dDsKKyAgICAgICAgJCQtPnNldE1hdGNoKENTU1NlbGVjdG9yOjpTZXQpOwogICAgIH0KICAgICB8
ICdbJyBtYXliZV9zcGFjZSBuYW1lc3BhY2Vfc2VsZWN0b3IgYXR0cl9uYW1lIG1hdGNoIG1heWJl
X3NwYWNlIGlkZW50X29yX3N0cmluZyBtYXliZV9zcGFjZSAnXScgewogICAgICAgICBBdG9taWNT
dHJpbmcgbmFtZXNwYWNlUHJlZml4ID0gJDM7CkBAIC0xMDUyLDggKzEwNTEsOCBAQCBhdHRyaWI6
CiAgICAgICAgICQkID0gcC0+Y3JlYXRlRmxvYXRpbmdTZWxlY3RvcigpOwogICAgICAgICAkJC0+
c2V0QXR0cmlidXRlKFF1YWxpZmllZE5hbWUobmFtZXNwYWNlUHJlZml4LCAkNCwKICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+bV9zdHlsZVNoZWV0LT5kZXRlcm1pbmVOYW1l
c3BhY2UobmFtZXNwYWNlUHJlZml4KSkpOwotICAgICAgICAkJC0+bV9tYXRjaCA9IChDU1NTZWxl
Y3Rvcjo6TWF0Y2gpJDU7Ci0gICAgICAgICQkLT5tX3ZhbHVlID0gJDc7CisgICAgICAgICQkLT5z
ZXRNYXRjaCgoQ1NTU2VsZWN0b3I6Ok1hdGNoKSQ1KTsKKyAgICAgICAgJCQtPnNldFZhbHVlKCQ3
KTsKICAgICB9CiAgIDsKIApAQCAtMTA4Niw5ICsxMDg1LDkgQEAgaWRlbnRfb3Jfc3RyaW5nOgog
cHNldWRvX3BhZ2U6CiAgICAgJzonIElERU5UIHsKICAgICAgICAgJCQgPSBzdGF0aWNfY2FzdDxD
U1NQYXJzZXIqPihwYXJzZXIpLT5jcmVhdGVGbG9hdGluZ1NlbGVjdG9yKCk7Ci0gICAgICAgICQk
LT5tX21hdGNoID0gQ1NTU2VsZWN0b3I6OlBhZ2VQc2V1ZG9DbGFzczsKKyAgICAgICAgJCQtPnNl
dE1hdGNoKENTU1NlbGVjdG9yOjpQYWdlUHNldWRvQ2xhc3MpOwogICAgICAgICAkMi5sb3dlcigp
OwotICAgICAgICAkJC0+bV92YWx1ZSA9ICQyOworICAgICAgICAkJC0+c2V0VmFsdWUoJDIpOwog
ICAgICAgICBDU1NTZWxlY3Rvcjo6UHNldWRvVHlwZSB0eXBlID0gJCQtPnBzZXVkb1R5cGUoKTsK
ICAgICAgICAgaWYgKHR5cGUgPT0gQ1NTU2VsZWN0b3I6OlBzZXVkb1Vua25vd24pCiAgICAgICAg
ICAgICAkJCA9IDA7CkBAIC0xMDk3LDkgKzEwOTYsOSBAQCBwc2V1ZG9fcGFnZToKIHBzZXVkbzoK
ICAgICAnOicgSURFTlQgewogICAgICAgICAkJCA9IHN0YXRpY19jYXN0PENTU1BhcnNlcio+KHBh
cnNlciktPmNyZWF0ZUZsb2F0aW5nU2VsZWN0b3IoKTsKLSAgICAgICAgJCQtPm1fbWF0Y2ggPSBD
U1NTZWxlY3Rvcjo6UHNldWRvQ2xhc3M7CisgICAgICAgICQkLT5zZXRNYXRjaChDU1NTZWxlY3Rv
cjo6UHNldWRvQ2xhc3MpOwogICAgICAgICAkMi5sb3dlcigpOwotICAgICAgICAkJC0+bV92YWx1
ZSA9ICQyOworICAgICAgICAkJC0+c2V0VmFsdWUoJDIpOwogICAgICAgICBDU1NTZWxlY3Rvcjo6
UHNldWRvVHlwZSB0eXBlID0gJCQtPnBzZXVkb1R5cGUoKTsKICAgICAgICAgaWYgKHR5cGUgPT0g
Q1NTU2VsZWN0b3I6OlBzZXVkb1Vua25vd24pCiAgICAgICAgICAgICAkJCA9IDA7CkBAIC0xMTMx
LDkgKzExMzAsOSBAQCBwc2V1ZG86CiAgICAgfQogICAgIHwgJzonICc6JyBJREVOVCB7CiAgICAg
ICAgICQkID0gc3RhdGljX2Nhc3Q8Q1NTUGFyc2VyKj4ocGFyc2VyKS0+Y3JlYXRlRmxvYXRpbmdT
ZWxlY3RvcigpOwotICAgICAgICAkJC0+bV9tYXRjaCA9IENTU1NlbGVjdG9yOjpQc2V1ZG9FbGVt
ZW50OworICAgICAgICAkJC0+c2V0TWF0Y2goQ1NTU2VsZWN0b3I6OlBzZXVkb0VsZW1lbnQpOwog
ICAgICAgICAkMy5sb3dlcigpOwotICAgICAgICAkJC0+bV92YWx1ZSA9ICQzOworICAgICAgICAk
JC0+c2V0VmFsdWUoJDMpOwogICAgICAgICBDU1NTZWxlY3Rvcjo6UHNldWRvVHlwZSB0eXBlID0g
JCQtPnBzZXVkb1R5cGUoKTsKICAgICAgICAgaWYgKHR5cGUgPT0gQ1NTU2VsZWN0b3I6OlBzZXVk
b0ZpcnN0TGluZSkgewogICAgICAgICAgICAgQ1NTUGFyc2VyKiBwID0gc3RhdGljX2Nhc3Q8Q1NT
UGFyc2VyKj4ocGFyc2VyKTsKQEAgLTExNTAsOSArMTE0OSw5IEBAIHBzZXVkbzoKICAgICB8ICc6
JyBGVU5DVElPTiBtYXliZV9zcGFjZSBOVEggbWF5YmVfc3BhY2UgJyknIHsKICAgICAgICAgQ1NT
UGFyc2VyICpwID0gc3RhdGljX2Nhc3Q8Q1NTUGFyc2VyKj4ocGFyc2VyKTsKICAgICAgICAgJCQg
PSBwLT5jcmVhdGVGbG9hdGluZ1NlbGVjdG9yKCk7Ci0gICAgICAgICQkLT5tX21hdGNoID0gQ1NT
U2VsZWN0b3I6OlBzZXVkb0NsYXNzOworICAgICAgICAkJC0+c2V0TWF0Y2goQ1NTU2VsZWN0b3I6
OlBzZXVkb0NsYXNzKTsKICAgICAgICAgJCQtPnNldEFyZ3VtZW50KCQ0KTsKLSAgICAgICAgJCQt
Pm1fdmFsdWUgPSAkMjsKKyAgICAgICAgJCQtPnNldFZhbHVlKCQyKTsKICAgICAgICAgQ1NTU2Vs
ZWN0b3I6OlBzZXVkb1R5cGUgdHlwZSA9ICQkLT5wc2V1ZG9UeXBlKCk7CiAgICAgICAgIGlmICh0
eXBlID09IENTU1NlbGVjdG9yOjpQc2V1ZG9Vbmtub3duKQogICAgICAgICAgICAgJCQgPSAwOwpA
QCAtMTE2OCw5ICsxMTY3LDkgQEAgcHNldWRvOgogICAgIHwgJzonIEZVTkNUSU9OIG1heWJlX3Nw
YWNlIG1heWJlX3VuYXJ5X29wZXJhdG9yIElOVEVHRVIgbWF5YmVfc3BhY2UgJyknIHsKICAgICAg
ICAgQ1NTUGFyc2VyICpwID0gc3RhdGljX2Nhc3Q8Q1NTUGFyc2VyKj4ocGFyc2VyKTsKICAgICAg
ICAgJCQgPSBwLT5jcmVhdGVGbG9hdGluZ1NlbGVjdG9yKCk7Ci0gICAgICAgICQkLT5tX21hdGNo
ID0gQ1NTU2VsZWN0b3I6OlBzZXVkb0NsYXNzOworICAgICAgICAkJC0+c2V0TWF0Y2goQ1NTU2Vs
ZWN0b3I6OlBzZXVkb0NsYXNzKTsKICAgICAgICAgJCQtPnNldEFyZ3VtZW50KFN0cmluZzo6bnVt
YmVyKCQ0ICogJDUpKTsKLSAgICAgICAgJCQtPm1fdmFsdWUgPSAkMjsKKyAgICAgICAgJCQtPnNl
dFZhbHVlKCQyKTsKICAgICAgICAgQ1NTU2VsZWN0b3I6OlBzZXVkb1R5cGUgdHlwZSA9ICQkLT5w
c2V1ZG9UeXBlKCk7CiAgICAgICAgIGlmICh0eXBlID09IENTU1NlbGVjdG9yOjpQc2V1ZG9Vbmtu
b3duKQogICAgICAgICAgICAgJCQgPSAwOwpAQCAtMTE4NiwxMCArMTE4NSwxMCBAQCBwc2V1ZG86
CiAgICAgfCAnOicgRlVOQ1RJT04gbWF5YmVfc3BhY2UgSURFTlQgbWF5YmVfc3BhY2UgJyknIHsK
ICAgICAgICAgQ1NTUGFyc2VyICpwID0gc3RhdGljX2Nhc3Q8Q1NTUGFyc2VyKj4ocGFyc2VyKTsK
ICAgICAgICAgJCQgPSBwLT5jcmVhdGVGbG9hdGluZ1NlbGVjdG9yKCk7Ci0gICAgICAgICQkLT5t
X21hdGNoID0gQ1NTU2VsZWN0b3I6OlBzZXVkb0NsYXNzOworICAgICAgICAkJC0+c2V0TWF0Y2go
Q1NTU2VsZWN0b3I6OlBzZXVkb0NsYXNzKTsKICAgICAgICAgJCQtPnNldEFyZ3VtZW50KCQ0KTsK
ICAgICAgICAgJDIubG93ZXIoKTsKLSAgICAgICAgJCQtPm1fdmFsdWUgPSAkMjsKKyAgICAgICAg
JCQtPnNldFZhbHVlKCQyKTsKICAgICAgICAgQ1NTU2VsZWN0b3I6OlBzZXVkb1R5cGUgdHlwZSA9
ICQkLT5wc2V1ZG9UeXBlKCk7CiAgICAgICAgIGlmICh0eXBlID09IENTU1NlbGVjdG9yOjpQc2V1
ZG9Vbmtub3duKQogICAgICAgICAgICAgJCQgPSAwOwpAQCAtMTIxMSwxMCArMTIxMCwxMCBAQCBw
c2V1ZG86CiAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgQ1NTUGFyc2VyKiBwID0gc3RhdGlj
X2Nhc3Q8Q1NTUGFyc2VyKj4ocGFyc2VyKTsKICAgICAgICAgICAgICQkID0gcC0+Y3JlYXRlRmxv
YXRpbmdTZWxlY3RvcigpOwotICAgICAgICAgICAgJCQtPm1fbWF0Y2ggPSBDU1NTZWxlY3Rvcjo6
UHNldWRvQ2xhc3M7Ci0gICAgICAgICAgICAkJC0+c2V0U2ltcGxlU2VsZWN0b3IocC0+c2lua0Zs
b2F0aW5nU2VsZWN0b3IoJDQpKTsKKyAgICAgICAgICAgICQkLT5zZXRNYXRjaChDU1NTZWxlY3Rv
cjo6UHNldWRvQ2xhc3MpOworICAgICAgICAgICAgJCQtPnNldFNpbXBsZVNlbGVjdG9yKHAtPnNp
bmtGbG9hdGluZ1NlbGVjdG9yKCQ0KS0+cmVsZWFzZVNlbGVjdG9yKCkpOwogICAgICAgICAgICAg
JDIubG93ZXIoKTsKLSAgICAgICAgICAgICQkLT5tX3ZhbHVlID0gJDI7CisgICAgICAgICAgICAk
JC0+c2V0VmFsdWUoJDIpOwogICAgICAgICB9CiAgICAgfQogICA7CkluZGV4OiBTb3VyY2UvV2Vi
Q29yZS9jc3MvQ1NTUGFnZVJ1bGUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2Nz
cy9DU1NQYWdlUnVsZS5jcHAJKHJldmlzaW9uIDc2NTY1KQorKysgU291cmNlL1dlYkNvcmUvY3Nz
L0NTU1BhZ2VSdWxlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjcsMTIgKzI3LDkgQEAKIAogbmFt
ZXNwYWNlIFdlYkNvcmUgewogCi1DU1NQYWdlUnVsZTo6Q1NTUGFnZVJ1bGUoQ1NTU3R5bGVTaGVl
dCogcGFyZW50LCBDU1NTZWxlY3Rvciogc2VsZWN0b3IsIGludCBzb3VyY2VMaW5lKQorQ1NTUGFn
ZVJ1bGU6OkNTU1BhZ2VSdWxlKENTU1N0eWxlU2hlZXQqIHBhcmVudCwgaW50IHNvdXJjZUxpbmUp
CiAgICAgOiBDU1NTdHlsZVJ1bGUocGFyZW50LCBzb3VyY2VMaW5lKQogewotICAgIFZlY3RvcjxD
U1NTZWxlY3Rvcio+IHNlbGVjdG9yczsKLSAgICBzZWxlY3RvcnMuYXBwZW5kKHNlbGVjdG9yKTsK
LSAgICBhZG9wdFNlbGVjdG9yVmVjdG9yKHNlbGVjdG9ycyk7CiB9CiAKIENTU1BhZ2VSdWxlOjp+
Q1NTUGFnZVJ1bGUoKQpJbmRleDogU291cmNlL1dlYkNvcmUvY3NzL0NTU1BhZ2VSdWxlLmgKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvY3NzL0NTU1BhZ2VSdWxlLmgJKHJldmlzaW9uIDc2
NTY1KQorKysgU291cmNlL1dlYkNvcmUvY3NzL0NTU1BhZ2VSdWxlLmgJKHdvcmtpbmcgY29weSkK
QEAgLTM0LDkgKzM0LDkgQEAgY2xhc3MgQ1NTU2VsZWN0b3JMaXN0OwogCiBjbGFzcyBDU1NQYWdl
UnVsZSA6IHB1YmxpYyBDU1NTdHlsZVJ1bGUgewogcHVibGljOgotICAgIHN0YXRpYyBQYXNzUmVm
UHRyPENTU1BhZ2VSdWxlPiBjcmVhdGUoQ1NTU3R5bGVTaGVldCogcGFyZW50LCBDU1NTZWxlY3Rv
ciogc2VsZWN0b3IsIGludCBzb3VyY2VMaW5lKQorICAgIHN0YXRpYyBQYXNzUmVmUHRyPENTU1Bh
Z2VSdWxlPiBjcmVhdGUoQ1NTU3R5bGVTaGVldCogcGFyZW50LCBpbnQgc291cmNlTGluZSkKICAg
ICB7Ci0gICAgICAgIHJldHVybiBhZG9wdFJlZihuZXcgQ1NTUGFnZVJ1bGUocGFyZW50LCBzZWxl
Y3Rvciwgc291cmNlTGluZSkpOworICAgICAgICByZXR1cm4gYWRvcHRSZWYobmV3IENTU1BhZ2VS
dWxlKHBhcmVudCwgc291cmNlTGluZSkpOwogICAgIH0KIAogICAgIHZpcnR1YWwgfkNTU1BhZ2VS
dWxlKCk7CkBAIC00NCw3ICs0NCw3IEBAIHB1YmxpYzoKICAgICB2aXJ0dWFsIFN0cmluZyBzZWxl
Y3RvclRleHQoKSBjb25zdDsKIAogcHJpdmF0ZToKLSAgICBDU1NQYWdlUnVsZShDU1NTdHlsZVNo
ZWV0KiBwYXJlbnQsIENTU1NlbGVjdG9yKiBzZWxlY3RvciwgaW50IHNvdXJjZUxpbmUpOworICAg
IENTU1BhZ2VSdWxlKENTU1N0eWxlU2hlZXQqIHBhcmVudCwgaW50IHNvdXJjZUxpbmUpOwogCiAg
ICAgdmlydHVhbCBib29sIGlzUGFnZVJ1bGUoKSB7IHJldHVybiB0cnVlOyB9CiAKSW5kZXg6IFNv
dXJjZS9XZWJDb3JlL2Nzcy9DU1NQYXJzZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJD
b3JlL2Nzcy9DU1NQYXJzZXIuY3BwCShyZXZpc2lvbiA3NjU2NSkKKysrIFNvdXJjZS9XZWJDb3Jl
L2Nzcy9DU1NQYXJzZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xNzksNyArMTc5LDYgQEAgQ1NT
UGFyc2VyOjp+Q1NTUGFyc2VyKCkKICAgICBmYXN0RGVsZXRlQWxsVmFsdWVzKG1fZmxvYXRpbmdT
ZWxlY3RvcnMpOwogICAgIGRlbGV0ZUFsbFZhbHVlcyhtX2Zsb2F0aW5nVmFsdWVMaXN0cyk7CiAg
ICAgZGVsZXRlQWxsVmFsdWVzKG1fZmxvYXRpbmdGdW5jdGlvbnMpOwotICAgIGRlbGV0ZUFsbFZh
bHVlcyhtX3JldXNhYmxlU2VsZWN0b3JWZWN0b3IpOwogfQogCiB2b2lkIENTU1BhcnNlclN0cmlu
Zzo6bG93ZXIoKQpAQCAtNTY5NiwyMCArNTY5NSwyMCBAQCB2b2lkIENTU1BhcnNlcjo6Y291bnRM
aW5lcygpCiAgICAgfQogfQogCi1DU1NTZWxlY3RvciogQ1NTUGFyc2VyOjpjcmVhdGVGbG9hdGlu
Z1NlbGVjdG9yKCkKK0NTU1BhcnNlclNlbGVjdG9yKiBDU1NQYXJzZXI6OmNyZWF0ZUZsb2F0aW5n
U2VsZWN0b3IoKQogewotICAgIENTU1NlbGVjdG9yKiBzZWxlY3RvciA9IGZhc3ROZXc8Q1NTU2Vs
ZWN0b3I+KCk7CisgICAgQ1NTUGFyc2VyU2VsZWN0b3IqIHNlbGVjdG9yID0gbmV3IENTU1BhcnNl
clNlbGVjdG9yOwogICAgIG1fZmxvYXRpbmdTZWxlY3RvcnMuYWRkKHNlbGVjdG9yKTsKICAgICBy
ZXR1cm4gc2VsZWN0b3I7CiB9CiAKLUNTU1NlbGVjdG9yKiBDU1NQYXJzZXI6OnNpbmtGbG9hdGlu
Z1NlbGVjdG9yKENTU1NlbGVjdG9yKiBzZWxlY3RvcikKK1Bhc3NPd25QdHI8Q1NTUGFyc2VyU2Vs
ZWN0b3I+IENTU1BhcnNlcjo6c2lua0Zsb2F0aW5nU2VsZWN0b3IoQ1NTUGFyc2VyU2VsZWN0b3Iq
IHNlbGVjdG9yKQogewogICAgIGlmIChzZWxlY3RvcikgewogICAgICAgICBBU1NFUlQobV9mbG9h
dGluZ1NlbGVjdG9ycy5jb250YWlucyhzZWxlY3RvcikpOwogICAgICAgICBtX2Zsb2F0aW5nU2Vs
ZWN0b3JzLnJlbW92ZShzZWxlY3Rvcik7CiAgICAgfQotICAgIHJldHVybiBzZWxlY3RvcjsKKyAg
ICByZXR1cm4gYWRvcHRQdHIoc2VsZWN0b3IpOwogfQogCiBDU1NQYXJzZXJWYWx1ZUxpc3QqIENT
U1BhcnNlcjo6Y3JlYXRlRmxvYXRpbmdWYWx1ZUxpc3QoKQpAQCAtNTg1MSw3ICs1ODUwLDcgQEAg
V2ViS2l0Q1NTS2V5ZnJhbWVzUnVsZSogQ1NTUGFyc2VyOjpjcmVhdAogICAgIHJldHVybiBydWxl
UHRyOwogfQogCi1DU1NSdWxlKiBDU1NQYXJzZXI6OmNyZWF0ZVN0eWxlUnVsZShWZWN0b3I8Q1NT
U2VsZWN0b3IqPiogc2VsZWN0b3JzKQorQ1NTUnVsZSogQ1NTUGFyc2VyOjpjcmVhdGVTdHlsZVJ1
bGUoVmVjdG9yPE93blB0cjxDU1NQYXJzZXJTZWxlY3Rvcj4gPiogc2VsZWN0b3JzKQogewogICAg
IENTU1N0eWxlUnVsZSogcmVzdWx0ID0gMDsKICAgICBtYXJrUnVsZUJvZHlFbmQoKTsKQEAgLTU5
MTMsMjEgKzU5MTIsMjEgQEAgdm9pZCBDU1NQYXJzZXI6OmFkZE5hbWVzcGFjZShjb25zdCBBdG9t
aQogICAgIG1fc3R5bGVTaGVldC0+YWRkTmFtZXNwYWNlKHRoaXMsIHByZWZpeCwgdXJpKTsKIH0K
IAotdm9pZCBDU1NQYXJzZXI6OnVwZGF0ZVNwZWNpZmllcnNXaXRoRWxlbWVudE5hbWUoY29uc3Qg
QXRvbWljU3RyaW5nJiBuYW1lc3BhY2VQcmVmaXgsIGNvbnN0IEF0b21pY1N0cmluZyYgZWxlbWVu
dE5hbWUsIENTU1NlbGVjdG9yKiBzcGVjaWZpZXJzKQordm9pZCBDU1NQYXJzZXI6OnVwZGF0ZVNw
ZWNpZmllcnNXaXRoRWxlbWVudE5hbWUoY29uc3QgQXRvbWljU3RyaW5nJiBuYW1lc3BhY2VQcmVm
aXgsIGNvbnN0IEF0b21pY1N0cmluZyYgZWxlbWVudE5hbWUsIENTU1BhcnNlclNlbGVjdG9yKiBz
cGVjaWZpZXJzKQogewogICAgIEF0b21pY1N0cmluZyBkZXRlcm1pbmVkTmFtZXNwYWNlID0gbmFt
ZXNwYWNlUHJlZml4ICE9IG51bGxBdG9tICYmIG1fc3R5bGVTaGVldCA/IG1fc3R5bGVTaGVldC0+
ZGV0ZXJtaW5lTmFtZXNwYWNlKG5hbWVzcGFjZVByZWZpeCkgOiBtX2RlZmF1bHROYW1lc3BhY2U7
CiAgICAgUXVhbGlmaWVkTmFtZSB0YWcgPSBRdWFsaWZpZWROYW1lKG5hbWVzcGFjZVByZWZpeCwg
ZWxlbWVudE5hbWUsIGRldGVybWluZWROYW1lc3BhY2UpOwogICAgIGlmICghc3BlY2lmaWVycy0+
aXNVbmtub3duUHNldWRvRWxlbWVudCgpKSB7Ci0gICAgICAgIHNwZWNpZmllcnMtPm1fdGFnID0g
dGFnOworICAgICAgICBzcGVjaWZpZXJzLT5zZXRUYWcodGFnKTsKICAgICAgICAgcmV0dXJuOwog
ICAgIH0KIAogICAgIGlmIChEb2N1bWVudCogZG9jID0gZG9jdW1lbnQoKSkKICAgICAgICAgZG9j
LT5zZXRVc2VzRGVzY2VuZGFudFJ1bGVzKHRydWUpOwogCi0gICAgc3BlY2lmaWVycy0+bV9yZWxh
dGlvbiA9IENTU1NlbGVjdG9yOjpTaGFkb3dEZXNjZW5kYW50OwotICAgIGlmIChDU1NTZWxlY3Rv
ciogaGlzdG9yeSA9IHNwZWNpZmllcnMtPnRhZ0hpc3RvcnkoKSkgewotICAgICAgICBoaXN0b3J5
LT5tX3RhZyA9IHRhZzsKKyAgICBzcGVjaWZpZXJzLT5zZXRSZWxhdGlvbihDU1NTZWxlY3Rvcjo6
U2hhZG93RGVzY2VuZGFudCk7CisgICAgaWYgKENTU1BhcnNlclNlbGVjdG9yKiBoaXN0b3J5ID0g
c3BlY2lmaWVycy0+dGFnSGlzdG9yeSgpKSB7CisgICAgICAgIGhpc3RvcnktPnNldFRhZyh0YWcp
OwogICAgICAgICByZXR1cm47CiAgICAgfQogCkBAIC01OTM2LDE5ICs1OTM1LDIyIEBAIHZvaWQg
Q1NTUGFyc2VyOjp1cGRhdGVTcGVjaWZpZXJzV2l0aEVsZW0KICAgICBpZiAoZWxlbWVudE5hbWUg
PT0gc3RhckF0b20gJiYgbV9kZWZhdWx0TmFtZXNwYWNlID09IHN0YXJBdG9tKQogICAgICAgICBy
ZXR1cm47CiAKLSAgICBDU1NTZWxlY3RvciogZWxlbWVudE5hbWVTZWxlY3RvciA9IGZhc3ROZXc8
Q1NTU2VsZWN0b3I+KCk7Ci0gICAgZWxlbWVudE5hbWVTZWxlY3Rvci0+bV90YWcgPSB0YWc7Cisg
ICAgQ1NTUGFyc2VyU2VsZWN0b3IqIGVsZW1lbnROYW1lU2VsZWN0b3IgPSBuZXcgQ1NTUGFyc2Vy
U2VsZWN0b3I7CisgICAgZWxlbWVudE5hbWVTZWxlY3Rvci0+c2V0VGFnKHRhZyk7CiAgICAgc3Bl
Y2lmaWVycy0+c2V0VGFnSGlzdG9yeShlbGVtZW50TmFtZVNlbGVjdG9yKTsKIH0KIAogCi1DU1NS
dWxlKiBDU1NQYXJzZXI6OmNyZWF0ZVBhZ2VSdWxlKENTU1NlbGVjdG9yKiBwYWdlU2VsZWN0b3Ip
CitDU1NSdWxlKiBDU1NQYXJzZXI6OmNyZWF0ZVBhZ2VSdWxlKFBhc3NPd25QdHI8Q1NTUGFyc2Vy
U2VsZWN0b3I+IHBhZ2VTZWxlY3RvcikKIHsKICAgICAvLyBGSVhNRTogTWFyZ2luIGF0LXJ1bGVz
IGFyZSBpZ25vcmVkLgogICAgIG1fYWxsb3dJbXBvcnRSdWxlcyA9IG1fYWxsb3dOYW1lc3BhY2VE
ZWNsYXJhdGlvbnMgPSBmYWxzZTsKICAgICBDU1NQYWdlUnVsZSogcGFnZVJ1bGUgPSAwOwogICAg
IGlmIChwYWdlU2VsZWN0b3IpIHsKLSAgICAgICAgUmVmUHRyPENTU1BhZ2VSdWxlPiBydWxlID0g
Q1NTUGFnZVJ1bGU6OmNyZWF0ZShtX3N0eWxlU2hlZXQsIHBhZ2VTZWxlY3RvciwgbV9sYXN0U2Vs
ZWN0b3JMaW5lTnVtYmVyKTsKKyAgICAgICAgUmVmUHRyPENTU1BhZ2VSdWxlPiBydWxlID0gQ1NT
UGFnZVJ1bGU6OmNyZWF0ZShtX3N0eWxlU2hlZXQsIG1fbGFzdFNlbGVjdG9yTGluZU51bWJlcik7
CisgICAgICAgIFZlY3RvcjxPd25QdHI8Q1NTUGFyc2VyU2VsZWN0b3I+ID4gc2VsZWN0b3JWZWN0
b3I7CisgICAgICAgIHNlbGVjdG9yVmVjdG9yLmFwcGVuZChwYWdlU2VsZWN0b3IpOworICAgICAg
ICBydWxlLT5hZG9wdFNlbGVjdG9yVmVjdG9yKHNlbGVjdG9yVmVjdG9yKTsKICAgICAgICAgcnVs
ZS0+c2V0RGVjbGFyYXRpb24oQ1NTTXV0YWJsZVN0eWxlRGVjbGFyYXRpb246OmNyZWF0ZShydWxl
LmdldCgpLCBtX3BhcnNlZFByb3BlcnRpZXMsIG1fbnVtUGFyc2VkUHJvcGVydGllcykpOwogICAg
ICAgICBwYWdlUnVsZSA9IHJ1bGUuZ2V0KCk7CiAgICAgICAgIG1fcGFyc2VkU3R5bGVPYmplY3Rz
LmFwcGVuZChydWxlLnJlbGVhc2UoKSk7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9jc3MvQ1NTUGFy
c2VyLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvY3NzL0NTU1BhcnNlci5oCShyZXZp
c2lvbiA3NjU2NSkKKysrIFNvdXJjZS9XZWJDb3JlL2Nzcy9DU1NQYXJzZXIuaAkod29ya2luZyBj
b3B5KQpAQCAtMTcwLDggKzE3MCw4IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogICAgICAgICBp
bnQgeXlwYXJzZSgpOwogCi0gICAgICAgIENTU1NlbGVjdG9yKiBjcmVhdGVGbG9hdGluZ1NlbGVj
dG9yKCk7Ci0gICAgICAgIENTU1NlbGVjdG9yKiBzaW5rRmxvYXRpbmdTZWxlY3RvcihDU1NTZWxl
Y3RvciopOworICAgICAgICBDU1NQYXJzZXJTZWxlY3RvciogY3JlYXRlRmxvYXRpbmdTZWxlY3Rv
cigpOworICAgICAgICBQYXNzT3duUHRyPENTU1BhcnNlclNlbGVjdG9yPiBzaW5rRmxvYXRpbmdT
ZWxlY3RvcihDU1NQYXJzZXJTZWxlY3RvciopOwogCiAgICAgICAgIENTU1BhcnNlclZhbHVlTGlz
dCogY3JlYXRlRmxvYXRpbmdWYWx1ZUxpc3QoKTsKICAgICAgICAgQ1NTUGFyc2VyVmFsdWVMaXN0
KiBzaW5rRmxvYXRpbmdWYWx1ZUxpc3QoQ1NTUGFyc2VyVmFsdWVMaXN0Kik7CkBAIC0xODgsOSAr
MTg4LDkgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogICAgICAgICBXZWJLaXRDU1NLZXlmcmFtZXNS
dWxlKiBjcmVhdGVLZXlmcmFtZXNSdWxlKCk7CiAgICAgICAgIENTU1J1bGUqIGNyZWF0ZU1lZGlh
UnVsZShNZWRpYUxpc3QqLCBDU1NSdWxlTGlzdCopOwogICAgICAgICBDU1NSdWxlTGlzdCogY3Jl
YXRlUnVsZUxpc3QoKTsKLSAgICAgICAgQ1NTUnVsZSogY3JlYXRlU3R5bGVSdWxlKFZlY3RvcjxD
U1NTZWxlY3Rvcio+KiBzZWxlY3RvcnMpOworICAgICAgICBDU1NSdWxlKiBjcmVhdGVTdHlsZVJ1
bGUoVmVjdG9yPE93blB0cjxDU1NQYXJzZXJTZWxlY3Rvcj4gPiogc2VsZWN0b3JzKTsKICAgICAg
ICAgQ1NTUnVsZSogY3JlYXRlRm9udEZhY2VSdWxlKCk7Ci0gICAgICAgIENTU1J1bGUqIGNyZWF0
ZVBhZ2VSdWxlKENTU1NlbGVjdG9yKiBwYWdlU2VsZWN0b3IpOworICAgICAgICBDU1NSdWxlKiBj
cmVhdGVQYWdlUnVsZShQYXNzT3duUHRyPENTU1BhcnNlclNlbGVjdG9yPiBwYWdlU2VsZWN0b3Ip
OwogICAgICAgICBDU1NSdWxlKiBjcmVhdGVNYXJnaW5BdFJ1bGUoQ1NTU2VsZWN0b3I6Ok1hcmdp
bkJveFR5cGUgbWFyZ2luQm94KTsKICAgICAgICAgdm9pZCBzdGFydERlY2xhcmF0aW9uc0Zvck1h
cmdpbkJveCgpOwogICAgICAgICB2b2lkIGVuZERlY2xhcmF0aW9uc0Zvck1hcmdpbkJveCgpOwpA
QCAtMjA0LDExICsyMDQsMTEgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogICAgICAgICBQYXNzT3du
UHRyPE1lZGlhUXVlcnk+IHNpbmtGbG9hdGluZ01lZGlhUXVlcnkoTWVkaWFRdWVyeSopOwogCiAg
ICAgICAgIHZvaWQgYWRkTmFtZXNwYWNlKGNvbnN0IEF0b21pY1N0cmluZyYgcHJlZml4LCBjb25z
dCBBdG9taWNTdHJpbmcmIHVyaSk7Ci0gICAgICAgIHZvaWQgdXBkYXRlU3BlY2lmaWVyc1dpdGhF
bGVtZW50TmFtZShjb25zdCBBdG9taWNTdHJpbmcmIG5hbWVzcGFjZVByZWZpeCwgY29uc3QgQXRv
bWljU3RyaW5nJiBlbGVtZW50TmFtZSwgQ1NTU2VsZWN0b3IqKTsKKyAgICAgICAgdm9pZCB1cGRh
dGVTcGVjaWZpZXJzV2l0aEVsZW1lbnROYW1lKGNvbnN0IEF0b21pY1N0cmluZyYgbmFtZXNwYWNl
UHJlZml4LCBjb25zdCBBdG9taWNTdHJpbmcmIGVsZW1lbnROYW1lLCBDU1NQYXJzZXJTZWxlY3Rv
ciopOwogCiAgICAgICAgIHZvaWQgaW52YWxpZEJsb2NrSGl0KCk7CiAKLSAgICAgICAgVmVjdG9y
PENTU1NlbGVjdG9yKj4qIHJldXNhYmxlU2VsZWN0b3JWZWN0b3IoKSB7IHJldHVybiAmbV9yZXVz
YWJsZVNlbGVjdG9yVmVjdG9yOyB9CisgICAgICAgIFZlY3RvcjxPd25QdHI8Q1NTUGFyc2VyU2Vs
ZWN0b3I+ID4qIHJldXNhYmxlU2VsZWN0b3JWZWN0b3IoKSB7IHJldHVybiAmbV9yZXVzYWJsZVNl
bGVjdG9yVmVjdG9yOyB9CiAKICAgICAgICAgdm9pZCB1cGRhdGVMYXN0U2VsZWN0b3JMaW5lQW5k
UG9zaXRpb24oKTsKIApAQCAtMzAyLDcgKzMwMiw3IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAog
ICAgICAgICBWZWN0b3I8UmVmUHRyPFN0eWxlQmFzZT4gPiBtX3BhcnNlZFN0eWxlT2JqZWN0czsK
ICAgICAgICAgVmVjdG9yPFJlZlB0cjxDU1NSdWxlTGlzdD4gPiBtX3BhcnNlZFJ1bGVMaXN0czsK
LSAgICAgICAgSGFzaFNldDxDU1NTZWxlY3Rvcio+IG1fZmxvYXRpbmdTZWxlY3RvcnM7CisgICAg
ICAgIEhhc2hTZXQ8Q1NTUGFyc2VyU2VsZWN0b3IqPiBtX2Zsb2F0aW5nU2VsZWN0b3JzOwogICAg
ICAgICBIYXNoU2V0PENTU1BhcnNlclZhbHVlTGlzdCo+IG1fZmxvYXRpbmdWYWx1ZUxpc3RzOwog
ICAgICAgICBIYXNoU2V0PENTU1BhcnNlckZ1bmN0aW9uKj4gbV9mbG9hdGluZ0Z1bmN0aW9uczsK
IApAQCAtMzEwLDcgKzMxMCw3IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAgICAgICAgT3duUHRy
PE1lZGlhUXVlcnlFeHA+IG1fZmxvYXRpbmdNZWRpYVF1ZXJ5RXhwOwogICAgICAgICBPd25QdHI8
VmVjdG9yPE93blB0cjxNZWRpYVF1ZXJ5RXhwPiA+ID4gbV9mbG9hdGluZ01lZGlhUXVlcnlFeHBM
aXN0OwogCi0gICAgICAgIFZlY3RvcjxDU1NTZWxlY3Rvcio+IG1fcmV1c2FibGVTZWxlY3RvclZl
Y3RvcjsKKyAgICAgICAgVmVjdG9yPE93blB0cjxDU1NQYXJzZXJTZWxlY3Rvcj4gPiBtX3JldXNh
YmxlU2VsZWN0b3JWZWN0b3I7CiAKICAgICAgICAgLy8gZGVmaW5lcyB1bml0cyBhbGxvd2VkIGZv
ciBhIGNlcnRhaW4gcHJvcGVydHksIHVzZWQgaW4gcGFyc2VVbml0CiAgICAgICAgIGVudW0gVW5p
dHMgewpJbmRleDogU291cmNlL1dlYkNvcmUvY3NzL0NTU1BhcnNlclZhbHVlcy5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL1dlYkNvcmUvY3NzL0NTU1BhcnNlclZhbHVlcy5jcHAJKHJldmlzaW9u
IDc2NTY1KQorKysgU291cmNlL1dlYkNvcmUvY3NzL0NTU1BhcnNlclZhbHVlcy5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTIwLDExICsyMCwxNSBAQAogCiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjaW5j
bHVkZSAiQ1NTUGFyc2VyVmFsdWVzLmgiCisKICNpbmNsdWRlICJDU1NQcmltaXRpdmVWYWx1ZS5o
IgogI2luY2x1ZGUgIkNTU0Z1bmN0aW9uVmFsdWUuaCIKICNpbmNsdWRlICJDU1NRdWlya1ByaW1p
dGl2ZVZhbHVlLmgiCisjaW5jbHVkZSAiQ1NTU2VsZWN0b3IuaCIKIAogbmFtZXNwYWNlIFdlYkNv
cmUgeworICAgICAgICAKK3VzaW5nIG5hbWVzcGFjZSBXVEY7CiAKIENTU1BhcnNlclZhbHVlTGlz
dDo6fkNTU1BhcnNlclZhbHVlTGlzdCgpCiB7CkBAIC03MCw2ICs3NCwyNyBAQCBQYXNzUmVmUHRy
PENTU1ZhbHVlPiBDU1NQYXJzZXJWYWx1ZTo6Y3JlCiAgICAgICAgIHBhcnNlZFZhbHVlID0gQ1NT
UXVpcmtQcmltaXRpdmVWYWx1ZTo6Y3JlYXRlKGZWYWx1ZSwgQ1NTUHJpbWl0aXZlVmFsdWU6OkNT
U19FTVMpOwogICAgIHJldHVybiBwYXJzZWRWYWx1ZTsKIH0KKyAgICAKK0NTU1BhcnNlclNlbGVj
dG9yOjpDU1NQYXJzZXJTZWxlY3RvcigpCisgICAgOiBtX3NlbGVjdG9yKGFkb3B0UHRyKGZhc3RO
ZXc8Q1NTU2VsZWN0b3I+KCkpKQoreworfQorCitDU1NQYXJzZXJTZWxlY3Rvcjo6fkNTU1BhcnNl
clNlbGVjdG9yKCkKK3sKKyAgICBpZiAoIW1fdGFnSGlzdG9yeSkKKyAgICAgICAgcmV0dXJuOwor
ICAgIFZlY3RvcjxDU1NQYXJzZXJTZWxlY3RvciosIDE2PiB0b0RlbGV0ZTsKKyAgICBDU1NQYXJz
ZXJTZWxlY3Rvciogc2VsZWN0b3IgPSBtX3RhZ0hpc3RvcnkubGVha1B0cigpOworICAgIHdoaWxl
ICh0cnVlKSB7CisgICAgICAgIHRvRGVsZXRlLmFwcGVuZChzZWxlY3Rvcik7CisgICAgICAgIENT
U1BhcnNlclNlbGVjdG9yKiBuZXh0ID0gc2VsZWN0b3ItPm1fdGFnSGlzdG9yeS5sZWFrUHRyKCk7
CisgICAgICAgIGlmICghbmV4dCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBzZWxlY3Rv
ciA9IG5leHQ7CisgICAgfQorICAgIGRlbGV0ZUFsbFZhbHVlcyh0b0RlbGV0ZSk7Cit9CiAKIH0K
IApJbmRleDogU291cmNlL1dlYkNvcmUvY3NzL0NTU1BhcnNlclZhbHVlcy5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9XZWJDb3JlL2Nzcy9DU1NQYXJzZXJWYWx1ZXMuaAkocmV2aXNpb24gNzY1NjUp
CisrKyBTb3VyY2UvV2ViQ29yZS9jc3MvQ1NTUGFyc2VyVmFsdWVzLmgJKHdvcmtpbmcgY29weSkK
QEAgLTIyLDEwICsyMiwxMiBAQAogI2RlZmluZSBDU1NQYXJzZXJWYWx1ZXNfaAogCiAjaW5jbHVk
ZSA8d3RmL3RleHQvQXRvbWljU3RyaW5nLmg+CisjaW5jbHVkZSAiQ1NTU2VsZWN0b3IuaCIKIAog
bmFtZXNwYWNlIFdlYkNvcmUgewogCiBjbGFzcyBDU1NWYWx1ZTsKK2NsYXNzIFF1YWxpZmllZE5h
bWU7CiAKIHN0cnVjdCBDU1NQYXJzZXJTdHJpbmcgewogICAgIFVDaGFyKiBjaGFyYWN0ZXJzOwpA
QCAtOTEsNiArOTMsMzUgQEAgcHVibGljOgogICAgIE93blB0cjxDU1NQYXJzZXJWYWx1ZUxpc3Q+
IGFyZ3M7CiB9OwogCitjbGFzcyBDU1NQYXJzZXJTZWxlY3RvciB7CisgICAgV1RGX01BS0VfRkFT
VF9BTExPQ0FURUQ7CitwdWJsaWM6CisgICAgQ1NTUGFyc2VyU2VsZWN0b3IoKTsKKyAgICB+Q1NT
UGFyc2VyU2VsZWN0b3IoKTsKKworICAgIFBhc3NPd25QdHI8Q1NTU2VsZWN0b3I+IHJlbGVhc2VT
ZWxlY3RvcigpIHsgcmV0dXJuIG1fc2VsZWN0b3IucmVsZWFzZSgpOyB9CisgICAgCisgICAgdm9p
ZCBzZXRUYWcoY29uc3QgUXVhbGlmaWVkTmFtZSYgdmFsdWUpIHsgbV9zZWxlY3Rvci0+c2V0VGFn
KHZhbHVlKTsgfQorICAgIHZvaWQgc2V0VmFsdWUoY29uc3QgQXRvbWljU3RyaW5nJiB2YWx1ZSkg
eyBtX3NlbGVjdG9yLT5zZXRWYWx1ZSh2YWx1ZSk7IH0KKyAgICB2b2lkIHNldEF0dHJpYnV0ZShj
b25zdCBRdWFsaWZpZWROYW1lJiB2YWx1ZSkgeyBtX3NlbGVjdG9yLT5zZXRBdHRyaWJ1dGUodmFs
dWUpOyB9CisgICAgdm9pZCBzZXRBcmd1bWVudChjb25zdCBBdG9taWNTdHJpbmcmIHZhbHVlKSB7
IG1fc2VsZWN0b3ItPnNldEFyZ3VtZW50KHZhbHVlKTsgfQorICAgIHZvaWQgc2V0U2ltcGxlU2Vs
ZWN0b3IoUGFzc093blB0cjxDU1NTZWxlY3Rvcj4gdmFsdWUpIHsgbV9zZWxlY3Rvci0+c2V0U2lt
cGxlU2VsZWN0b3IodmFsdWUpOyB9CisgICAgdm9pZCBzZXRNYXRjaChDU1NTZWxlY3Rvcjo6TWF0
Y2ggdmFsdWUpIHsgbV9zZWxlY3Rvci0+bV9tYXRjaCA9IHZhbHVlOyB9CisgICAgdm9pZCBzZXRS
ZWxhdGlvbihDU1NTZWxlY3Rvcjo6UmVsYXRpb24gdmFsdWUpIHsgbV9zZWxlY3Rvci0+bV9yZWxh
dGlvbiA9IHZhbHVlOyB9CisgICAgdm9pZCBzZXRGb3JQYWdlKCkgeyBtX3NlbGVjdG9yLT5zZXRG
b3JQYWdlKCk7IH0KKyAgICAKKyAgICBDU1NTZWxlY3Rvcjo6UHNldWRvVHlwZSBwc2V1ZG9UeXBl
KCkgY29uc3QgeyByZXR1cm4gbV9zZWxlY3Rvci0+cHNldWRvVHlwZSgpOyB9CisgICAgYm9vbCBp
c1Vua25vd25Qc2V1ZG9FbGVtZW50KCkgY29uc3QgeyByZXR1cm4gbV9zZWxlY3Rvci0+aXNVbmtu
b3duUHNldWRvRWxlbWVudCgpOyB9CisgICAgYm9vbCBpc1NpbXBsZSgpIGNvbnN0IHsgcmV0dXJu
ICFtX3RhZ0hpc3RvcnkgJiYgbV9zZWxlY3Rvci0+aXNTaW1wbGUoKTsgfQorCisgICAgQ1NTUGFy
c2VyU2VsZWN0b3IqIHRhZ0hpc3RvcnkoKSBjb25zdCB7IHJldHVybiBtX3RhZ0hpc3RvcnkuZ2V0
KCk7IH0KKyAgICB2b2lkIHNldFRhZ0hpc3RvcnkoUGFzc093blB0cjxDU1NQYXJzZXJTZWxlY3Rv
cj4gc2VsZWN0b3IpIHsgbV90YWdIaXN0b3J5ID0gc2VsZWN0b3I7IH0KKworcHJpdmF0ZToKKyAg
ICBPd25QdHI8Q1NTU2VsZWN0b3I+IG1fc2VsZWN0b3I7CisgICAgT3duUHRyPENTU1BhcnNlclNl
bGVjdG9yPiBtX3RhZ0hpc3Rvcnk7Cit9OworCiB9CiAKICNlbmRpZgpJbmRleDogU291cmNlL1dl
YkNvcmUvY3NzL0NTU1NlbGVjdG9yLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9j
c3MvQ1NTU2VsZWN0b3IuY3BwCShyZXZpc2lvbiA3NjU2NSkKKysrIFNvdXJjZS9XZWJDb3JlL2Nz
cy9DU1NTZWxlY3Rvci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM2LDM4ICszNiwxNSBAQAogbmFt
ZXNwYWNlIFdlYkNvcmUgewogCiB1c2luZyBuYW1lc3BhY2UgSFRNTE5hbWVzOwotCi1jbGFzcyBD
U1NTZWxlY3RvckJhZyB7Ci0gICAgV1RGX01BS0VfTk9OQ09QWUFCTEUoQ1NTU2VsZWN0b3JCYWcp
OwotcHVibGljOgotICAgIENTU1NlbGVjdG9yQmFnKCkgeyB9Ci0gICAgfkNTU1NlbGVjdG9yQmFn
KCkKLSAgICB7Ci0gICAgICAgIEFTU0VSVChpc0VtcHR5KCkpOwotICAgIH0KLQotICAgIGJvb2wg
aXNFbXB0eSgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9zdGFjay5pc0VtcHR5KCk7
Ci0gICAgfQotCi0gICAgdm9pZCBhZGQoUGFzc093blB0cjxDU1NTZWxlY3Rvcj4gc2VsZWN0b3Ip
Ci0gICAgewotICAgICAgICBpZiAoc2VsZWN0b3IpCi0gICAgICAgICAgICBtX3N0YWNrLmFwcGVu
ZChzZWxlY3Rvci5sZWFrUHRyKCkpOwotICAgIH0KLQotICAgIFBhc3NPd25QdHI8Q1NTU2VsZWN0
b3I+IHRha2VBbnkoKQotICAgIHsKLSAgICAgICAgQVNTRVJUKCFpc0VtcHR5KCkpOwotICAgICAg
ICBPd25QdHI8Q1NTU2VsZWN0b3I+IHNlbGVjdG9yID0gYWRvcHRQdHIobV9zdGFjay5sYXN0KCkp
OwotICAgICAgICBtX3N0YWNrLnJlbW92ZUxhc3QoKTsKLSAgICAgICAgcmV0dXJuIHNlbGVjdG9y
LnJlbGVhc2UoKTsKLSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgVmVjdG9yPENTU1NlbGVjdG9yKiwg
MTY+IG1fc3RhY2s7Ci19OworICAgIAordm9pZCBDU1NTZWxlY3Rvcjo6Y3JlYXRlUmFyZURhdGEo
KQoreworICAgIGlmIChtX2hhc1JhcmVEYXRhKSAKKyAgICAgICAgcmV0dXJuOworICAgIC8vIE1v
dmUgdGhlIHZhbHVlIHRvIHRoZSByYXJlIGRhdGEgc3R1Y3R1cmUuCisgICAgbV9kYXRhLm1fcmFy
ZURhdGEgPSBuZXcgUmFyZURhdGEoYWRvcHRSZWYobV9kYXRhLm1fdmFsdWUpKTsKKyAgICBtX2hh
c1JhcmVEYXRhID0gdHJ1ZTsKK30KIAogdW5zaWduZWQgQ1NTU2VsZWN0b3I6OnNwZWNpZmljaXR5
KCkgY29uc3QKIHsKQEAgLTU3Nyw3ICs1NTQsNyBAQCB2b2lkIENTU1NlbGVjdG9yOjpleHRyYWN0
UHNldWRvVHlwZSgpIGNvCiAgICAgaWYgKG1fbWF0Y2ggIT0gUHNldWRvQ2xhc3MgJiYgbV9tYXRj
aCAhPSBQc2V1ZG9FbGVtZW50ICYmIG1fbWF0Y2ggIT0gUGFnZVBzZXVkb0NsYXNzKQogICAgICAg
ICByZXR1cm47CiAKLSAgICBtX3BzZXVkb1R5cGUgPSBwYXJzZVBzZXVkb1R5cGUobV92YWx1ZSk7
CisgICAgbV9wc2V1ZG9UeXBlID0gcGFyc2VQc2V1ZG9UeXBlKHZhbHVlKCkpOwogCiAgICAgYm9v
bCBlbGVtZW50ID0gZmFsc2U7IC8vIHBzZXVkby1lbGVtZW50CiAgICAgYm9vbCBjb21wYXQgPSBm
YWxzZTsgLy8gc2luZ2xlIGNvbG9uIGNvbXBhdGJpbGl0eSBtb2RlCkBAIC03MjEsNyArNjk4LDcg
QEAgYm9vbCBDU1NTZWxlY3Rvcjo6b3BlcmF0b3I9PShjb25zdCBDU1NTZQogICAgIHdoaWxlIChz
ZWwxICYmIHNlbDIpIHsKICAgICAgICAgaWYgKHNlbDEtPm1fdGFnICE9IHNlbDItPm1fdGFnIHx8
IHNlbDEtPmF0dHJpYnV0ZSgpICE9IHNlbDItPmF0dHJpYnV0ZSgpIHx8CiAgICAgICAgICAgICAg
c2VsMS0+cmVsYXRpb24oKSAhPSBzZWwyLT5yZWxhdGlvbigpIHx8IHNlbDEtPm1fbWF0Y2ggIT0g
c2VsMi0+bV9tYXRjaCB8fAotICAgICAgICAgICAgIHNlbDEtPm1fdmFsdWUgIT0gc2VsMi0+bV92
YWx1ZSB8fAorICAgICAgICAgICAgIHNlbDEtPnZhbHVlKCkgIT0gc2VsMi0+dmFsdWUoKSB8fAog
ICAgICAgICAgICAgIHNlbDEtPnBzZXVkb1R5cGUoKSAhPSBzZWwyLT5wc2V1ZG9UeXBlKCkgfHwK
ICAgICAgICAgICAgICBzZWwxLT5hcmd1bWVudCgpICE9IHNlbDItPmFyZ3VtZW50KCkpCiAgICAg
ICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC03NTUsMTMgKzczMiwxMyBAQCBTdHJpbmcgQ1NTU2Vs
ZWN0b3I6OnNlbGVjdG9yVGV4dCgpIGNvbnN0CiAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAg
aWYgKGNzLT5tX21hdGNoID09IENTU1NlbGVjdG9yOjpJZCkgewogICAgICAgICAgICAgc3RyICs9
ICIjIjsKLSAgICAgICAgICAgIHNlcmlhbGl6ZUlkZW50aWZpZXIoY3MtPm1fdmFsdWUsIHN0cik7
CisgICAgICAgICAgICBzZXJpYWxpemVJZGVudGlmaWVyKGNzLT52YWx1ZSgpLCBzdHIpOwogICAg
ICAgICB9IGVsc2UgaWYgKGNzLT5tX21hdGNoID09IENTU1NlbGVjdG9yOjpDbGFzcykgewogICAg
ICAgICAgICAgc3RyICs9ICIuIjsKLSAgICAgICAgICAgIHNlcmlhbGl6ZUlkZW50aWZpZXIoY3Mt
Pm1fdmFsdWUsIHN0cik7CisgICAgICAgICAgICBzZXJpYWxpemVJZGVudGlmaWVyKGNzLT52YWx1
ZSgpLCBzdHIpOwogICAgICAgICB9IGVsc2UgaWYgKGNzLT5tX21hdGNoID09IENTU1NlbGVjdG9y
OjpQc2V1ZG9DbGFzcyB8fCBjcy0+bV9tYXRjaCA9PSBDU1NTZWxlY3Rvcjo6UGFnZVBzZXVkb0Ns
YXNzKSB7CiAgICAgICAgICAgICBzdHIgKz0gIjoiOwotICAgICAgICAgICAgc3RyICs9IGNzLT5t
X3ZhbHVlOworICAgICAgICAgICAgc3RyICs9IGNzLT52YWx1ZSgpOwogICAgICAgICAgICAgaWYg
KGNzLT5wc2V1ZG9UeXBlKCkgPT0gUHNldWRvTm90KSB7CiAgICAgICAgICAgICAgICAgaWYgKENT
U1NlbGVjdG9yKiBzdWJTZWwgPSBjcy0+c2ltcGxlU2VsZWN0b3IoKSkKICAgICAgICAgICAgICAg
ICAgICAgc3RyICs9IHN1YlNlbC0+c2VsZWN0b3JUZXh0KCk7CkBAIC03NzYsNyArNzUzLDcgQEAg
U3RyaW5nIENTU1NlbGVjdG9yOjpzZWxlY3RvclRleHQoKSBjb25zdAogICAgICAgICAgICAgfQog
ICAgICAgICB9IGVsc2UgaWYgKGNzLT5tX21hdGNoID09IENTU1NlbGVjdG9yOjpQc2V1ZG9FbGVt
ZW50KSB7CiAgICAgICAgICAgICBzdHIgKz0gIjo6IjsKLSAgICAgICAgICAgIHN0ciArPSBjcy0+
bV92YWx1ZTsKKyAgICAgICAgICAgIHN0ciArPSBjcy0+dmFsdWUoKTsKICAgICAgICAgfSBlbHNl
IGlmIChjcy0+aGFzQXR0cmlidXRlKCkpIHsKICAgICAgICAgICAgIHN0ciArPSAiWyI7CiAgICAg
ICAgICAgICBjb25zdCBBdG9taWNTdHJpbmcmIHByZWZpeCA9IGNzLT5hdHRyaWJ1dGUoKS5wcmVm
aXgoKTsKQEAgLTgxMiw3ICs3ODksNyBAQCBTdHJpbmcgQ1NTU2VsZWN0b3I6OnNlbGVjdG9yVGV4
dCgpIGNvbnN0CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAg
ICAgICAgICAgaWYgKGNzLT5tX21hdGNoICE9IENTU1NlbGVjdG9yOjpTZXQpIHsKLSAgICAgICAg
ICAgICAgICBzZXJpYWxpemVTdHJpbmcoY3MtPm1fdmFsdWUsIHN0cik7CisgICAgICAgICAgICAg
ICAgc2VyaWFsaXplU3RyaW5nKGNzLT52YWx1ZSgpLCBzdHIpOwogICAgICAgICAgICAgICAgIHN0
ciArPSAiXSI7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTgzNiwxNCArODEzLDYgQEAg
U3RyaW5nIENTU1NlbGVjdG9yOjpzZWxlY3RvclRleHQoKSBjb25zdAogCiAgICAgcmV0dXJuIHN0
cjsKIH0KLSAgICAKLXZvaWQgQ1NTU2VsZWN0b3I6OnNldFRhZ0hpc3RvcnkoQ1NTU2VsZWN0b3Iq
IHRhZ0hpc3RvcnkpIAoteyAKLSAgICBpZiAobV9oYXNSYXJlRGF0YSkgCi0gICAgICAgIG1fZGF0
YS5tX3JhcmVEYXRhLT5tX3RhZ0hpc3Rvcnkuc2V0KHRhZ0hpc3RvcnkpOyAKLSAgICBlbHNlIAot
ICAgICAgICBtX2RhdGEubV90YWdIaXN0b3J5ID0gdGFnSGlzdG9yeTsgCi19CiAKIGNvbnN0IFF1
YWxpZmllZE5hbWUmIENTU1NlbGVjdG9yOjphdHRyaWJ1dGUoKSBjb25zdAogeyAKQEAgLTg2OSwx
MCArODM4LDEwIEBAIHZvaWQgQ1NTU2VsZWN0b3I6OnNldEFyZ3VtZW50KGNvbnN0IEF0b20KICAg
ICBtX2RhdGEubV9yYXJlRGF0YS0+bV9hcmd1bWVudCA9IHZhbHVlOyAKIH0KIAotdm9pZCBDU1NT
ZWxlY3Rvcjo6c2V0U2ltcGxlU2VsZWN0b3IoQ1NTU2VsZWN0b3IqIHZhbHVlKQordm9pZCBDU1NT
ZWxlY3Rvcjo6c2V0U2ltcGxlU2VsZWN0b3IoUGFzc093blB0cjxDU1NTZWxlY3Rvcj4gdmFsdWUp
CiB7CiAgICAgY3JlYXRlUmFyZURhdGEoKTsgCi0gICAgbV9kYXRhLm1fcmFyZURhdGEtPm1fc2lt
cGxlU2VsZWN0b3Iuc2V0KHZhbHVlKTsgCisgICAgbV9kYXRhLm1fcmFyZURhdGEtPm1fc2ltcGxl
U2VsZWN0b3IgPSB2YWx1ZTsgCiB9CiAKIGJvb2wgQ1NTU2VsZWN0b3I6OnBhcnNlTnRoKCkKQEAg
LTk3NSwzMyArOTQ0LDQgQEAgYm9vbCBDU1NTZWxlY3Rvcjo6UmFyZURhdGE6Om1hdGNoTnRoKGlu
dAogICAgIH0KIH0KIAotaW5saW5lIHZvaWQgQ1NTU2VsZWN0b3I6OnJlbGVhc2VPd25lZFNlbGVj
dG9yc1RvQmFnKENTU1NlbGVjdG9yQmFnJiBiYWcpCi17Ci0gICAgaWYgKG1faGFzUmFyZURhdGEp
IHsKLSAgICAgICAgQVNTRVJUKG1fZGF0YS5tX3JhcmVEYXRhKTsKLSAgICAgICAgYmFnLmFkZCht
X2RhdGEubV9yYXJlRGF0YS0+bV90YWdIaXN0b3J5LnJlbGVhc2UoKSk7Ci0gICAgICAgIGJhZy5h
ZGQobV9kYXRhLm1fcmFyZURhdGEtPm1fc2ltcGxlU2VsZWN0b3IucmVsZWFzZSgpKTsKLSAgICAg
ICAgZGVsZXRlIG1fZGF0YS5tX3JhcmVEYXRhOwotICAgICAgICAvLyBDbGVhciB0aGUgcG9pbnRl
ciBzbyB0aGF0IGEgZGVzdHJ1Y3RvciBvZiB0aGlzIHNlbGVjdG9yIHdpbGwgbm90Ci0gICAgICAg
IC8vIHRyYXZlcnNlIHRoaXMgY2hhaW4uCi0gICAgICAgIG1fZGF0YS5tX3JhcmVEYXRhID0gMDsK
LSAgICB9IGVsc2UgewotICAgICAgICBiYWcuYWRkKGFkb3B0UHRyKG1fZGF0YS5tX3RhZ0hpc3Rv
cnkpKTsKLSAgICAgICAgLy8gQ2xlYXIgdGhlIHBvaW50ZXIgZm9yIHRoZSBzYW1lIHJlYXNvbi4K
LSAgICAgICAgbV9kYXRhLm1fdGFnSGlzdG9yeSA9IDA7Ci0gICAgfQotfQotCi12b2lkIENTU1Nl
bGVjdG9yOjpkZWxldGVSZWFjaGFibGVTZWxlY3RvcnMoKQotewotICAgIC8vIFRyYXZlcnNlIHRo
ZSBjaGFpbiBvZiBzZWxlY3RvcnMgYW5kIGRlbGV0ZSBlYWNoIGl0ZXJhdGl2ZWx5LgotICAgIENT
U1NlbGVjdG9yQmFnIHNlbGVjdG9yc1RvQmVEZWxldGVkOwotICAgIHJlbGVhc2VPd25lZFNlbGVj
dG9yc1RvQmFnKHNlbGVjdG9yc1RvQmVEZWxldGVkKTsKLSAgICB3aGlsZSAoIXNlbGVjdG9yc1Rv
QmVEZWxldGVkLmlzRW1wdHkoKSkgewotICAgICAgICBPd25QdHI8Q1NTU2VsZWN0b3I+IHNlbGVj
dG9yKHNlbGVjdG9yc1RvQmVEZWxldGVkLnRha2VBbnkoKSk7Ci0gICAgICAgIEFTU0VSVChzZWxl
Y3Rvcik7Ci0gICAgICAgIHNlbGVjdG9yLT5yZWxlYXNlT3duZWRTZWxlY3RvcnNUb0JhZyhzZWxl
Y3RvcnNUb0JlRGVsZXRlZCk7Ci0gICAgfQotfQotCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCklu
ZGV4OiBTb3VyY2UvV2ViQ29yZS9jc3MvQ1NTU2VsZWN0b3IuaAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3Vy
Y2UvV2ViQ29yZS9jc3MvQ1NTU2VsZWN0b3IuaAkocmV2aXNpb24gNzY1NjUpCisrKyBTb3VyY2Uv
V2ViQ29yZS9jc3MvQ1NTU2VsZWN0b3IuaAkod29ya2luZyBjb3B5KQpAQCAtMzAsOCArMzAsNiBA
QAogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKLSAgICBjbGFzcyBDU1NTZWxlY3RvckJhZzsKLQog
ICAgIC8vIHRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIHNlbGVjdG9yIGZvciBhIFN0eWxlUnVsZQog
ICAgIGNsYXNzIENTU1NlbGVjdG9yIHsKICAgICAgICAgV1RGX01BS0VfTk9OQ09QWUFCTEUoQ1NT
U2VsZWN0b3IpOyBXVEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsKQEAgLTQyLDYgKzQwLDcgQEAgbmFt
ZXNwYWNlIFdlYkNvcmUgewogICAgICAgICAgICAgLCBtX3BzZXVkb1R5cGUoUHNldWRvTm90UGFy
c2VkKQogICAgICAgICAgICAgLCBtX3BhcnNlZE50aChmYWxzZSkKICAgICAgICAgICAgICwgbV9p
c0xhc3RJblNlbGVjdG9yTGlzdChmYWxzZSkKKyAgICAgICAgICAgICwgbV9pc0xhc3RJblRhZ0hp
c3RvcnkodHJ1ZSkKICAgICAgICAgICAgICwgbV9oYXNSYXJlRGF0YShmYWxzZSkKICAgICAgICAg
ICAgICwgbV9pc0ZvclBhZ2UoZmFsc2UpCiAgICAgICAgICAgICAsIG1fdGFnKGFueVFOYW1lKCkp
CkBAIC01NCw2ICs1Myw3IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAgICAgICAgICAgICwgbV9w
c2V1ZG9UeXBlKFBzZXVkb05vdFBhcnNlZCkKICAgICAgICAgICAgICwgbV9wYXJzZWROdGgoZmFs
c2UpCiAgICAgICAgICAgICAsIG1faXNMYXN0SW5TZWxlY3Rvckxpc3QoZmFsc2UpCisgICAgICAg
ICAgICAsIG1faXNMYXN0SW5UYWdIaXN0b3J5KHRydWUpCiAgICAgICAgICAgICAsIG1faGFzUmFy
ZURhdGEoZmFsc2UpCiAgICAgICAgICAgICAsIG1faXNGb3JQYWdlKGZhbHNlKQogICAgICAgICAg
ICAgLCBtX3RhZyhxTmFtZSkKQEAgLTYyLDE4ICs2MiwxMCBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7
CiAKICAgICAgICAgfkNTU1NlbGVjdG9yKCkKICAgICAgICAgewotICAgICAgICAgICAgLy8gRXhp
dCBpZiB0aGlzIHNlbGVjdG9yIGRvZXMgbm90IG93biBhbnkgb2JqZWN0cyB0byBiZSBkZWxldGVk
LgotICAgICAgICAgICAgaWYgKG1faGFzUmFyZURhdGEpIHsKLSAgICAgICAgICAgICAgICBpZiAo
IW1fZGF0YS5tX3JhcmVEYXRhKQotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAg
ICAgICB9IGVsc2UgaWYgKCFtX2RhdGEubV90YWdIaXN0b3J5KQotICAgICAgICAgICAgICAgIHJl
dHVybjsKLQotICAgICAgICAgICAgLy8gV2UgY2FuIG5vdCBkZWxldGUgdGhlIG93bmVkIG9iamVj
dChzKSBieSBzaW1wbHkgY2FsbGluZyBkZWxldGUKLSAgICAgICAgICAgIC8vIGRpcmVjdGx5IG9u
IHRoZW0uIFRoYXQgd291bGQgbGVhZCB0byByZWN1cnNpdmUgZGVzdHJ1Y3RvciBjYWxscwotICAg
ICAgICAgICAgLy8gd2hpY2ggbWlnaHQgY2F1c2Ugc3RhY2sgb3ZlcmZsb3cuIFdlIGhhdmUgdG8g
ZGVsZXRlIHRoZW0KLSAgICAgICAgICAgIC8vIGl0ZXJhdGl2ZWx5LgotICAgICAgICAgICAgZGVs
ZXRlUmVhY2hhYmxlU2VsZWN0b3JzKCk7CisgICAgICAgICAgICBpZiAobV9oYXNSYXJlRGF0YSkK
KyAgICAgICAgICAgICAgICBkZWxldGUgbV9kYXRhLm1fcmFyZURhdGE7CisgICAgICAgICAgICBl
bHNlIGlmIChtX2RhdGEubV92YWx1ZSkKKyAgICAgICAgICAgICAgICBtX2RhdGEubV92YWx1ZS0+
ZGVyZWYoKTsKICAgICAgICAgfQogCiAgICAgICAgIC8qKgpAQCAtMjU1LDI5ICsyNDcsMzEgQEAg
bmFtZXNwYWNlIFdlYkNvcmUgewogICAgICAgICBzdGF0aWMgUHNldWRvVHlwZSBwYXJzZVBzZXVk
b1R5cGUoY29uc3QgQXRvbWljU3RyaW5nJik7CiAgICAgICAgIHN0YXRpYyBQc2V1ZG9JZCBwc2V1
ZG9JZChQc2V1ZG9UeXBlKTsKIAotICAgICAgICBDU1NTZWxlY3RvciogdGFnSGlzdG9yeSgpIGNv
bnN0IHsgcmV0dXJuIG1faGFzUmFyZURhdGEgPyBtX2RhdGEubV9yYXJlRGF0YS0+bV90YWdIaXN0
b3J5LmdldCgpIDogbV9kYXRhLm1fdGFnSGlzdG9yeTsgfQotICAgICAgICB2b2lkIHNldFRhZ0hp
c3RvcnkoQ1NTU2VsZWN0b3IqIHRhZ0hpc3RvcnkpOworICAgICAgICAvLyBTZWxlY3RvcnMgYXJl
IGtlcHQgaW4gYW4gYXJyYXkgYnkgQ1NTU2VsZWN0b3JMaXN0LiBUaGUgbmV4dCBjb21wb25lbnQg
b2YgdGhlIHNlbGVjdG9yIGlzIAorICAgICAgICAvLyB0aGUgbmV4dCBpdGVtIGluIHRoZSBhcnJh
eS4KKyAgICAgICAgQ1NTU2VsZWN0b3IqIHRhZ0hpc3RvcnkoKSBjb25zdCB7IHJldHVybiBtX2lz
TGFzdEluVGFnSGlzdG9yeSA/IDAgOiBjb25zdF9jYXN0PENTU1NlbGVjdG9yKj4odGhpcyArIDEp
OyB9CiAKICAgICAgICAgYm9vbCBoYXNUYWcoKSBjb25zdCB7IHJldHVybiBtX3RhZyAhPSBhbnlR
TmFtZSgpOyB9CiAgICAgICAgIGJvb2wgaGFzQXR0cmlidXRlKCkgY29uc3QgeyByZXR1cm4gbV9t
YXRjaCA9PSBJZCB8fCBtX21hdGNoID09IENsYXNzIHx8IChtX2hhc1JhcmVEYXRhICYmIG1fZGF0
YS5tX3JhcmVEYXRhLT5tX2F0dHJpYnV0ZSAhPSBhbnlRTmFtZSgpKTsgfQogICAgICAgICAKKyAg
ICAgICAgY29uc3QgUXVhbGlmaWVkTmFtZSYgdGFnKCkgY29uc3QgeyByZXR1cm4gbV90YWc7IH0g
OworICAgICAgICAvLyBBdG9taWNTdHJpbmcgaXMgcmVhbGx5IGp1c3QgYW4gQXRvbWljU3RyaW5n
SW1wbCogc28gdGhlIGNhc3QgYmVsb3cgaXMgc2FmZS4KKyAgICAgICAgLy8gRklYTUU6IFBlcmhh
cHMgY2FsbCBzaXRlcyBjb3VsZCBiZSBjaGFuZ2VkIHRvIGFjY2VwdCBBdG9taWNTdHJpbmdJbXBs
PworICAgICAgICBjb25zdCBBdG9taWNTdHJpbmcmIHZhbHVlKCkgY29uc3QgeyByZXR1cm4gKnJl
aW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQXRvbWljU3RyaW5nKj4obV9oYXNSYXJlRGF0YSA/ICZtX2Rh
dGEubV9yYXJlRGF0YS0+bV92YWx1ZSA6ICZtX2RhdGEubV92YWx1ZSk7IH0KICAgICAgICAgY29u
c3QgUXVhbGlmaWVkTmFtZSYgYXR0cmlidXRlKCkgY29uc3Q7CiAgICAgICAgIGNvbnN0IEF0b21p
Y1N0cmluZyYgYXJndW1lbnQoKSBjb25zdCB7IHJldHVybiBtX2hhc1JhcmVEYXRhID8gbV9kYXRh
Lm1fcmFyZURhdGEtPm1fYXJndW1lbnQgOiBudWxsQXRvbTsgfQogICAgICAgICBDU1NTZWxlY3Rv
ciogc2ltcGxlU2VsZWN0b3IoKSBjb25zdCB7IHJldHVybiBtX2hhc1JhcmVEYXRhID8gbV9kYXRh
Lm1fcmFyZURhdGEtPm1fc2ltcGxlU2VsZWN0b3IuZ2V0KCkgOiAwOyB9CiAgICAgICAgIAorICAg
ICAgICB2b2lkIHNldFRhZyhjb25zdCBRdWFsaWZpZWROYW1lJiB2YWx1ZSkgeyBtX3RhZyA9IHZh
bHVlOyB9CisgICAgICAgIHZvaWQgc2V0VmFsdWUoY29uc3QgQXRvbWljU3RyaW5nJiB2YWx1ZSk7
CiAgICAgICAgIHZvaWQgc2V0QXR0cmlidXRlKGNvbnN0IFF1YWxpZmllZE5hbWUmIHZhbHVlKTsK
ICAgICAgICAgdm9pZCBzZXRBcmd1bWVudChjb25zdCBBdG9taWNTdHJpbmcmIHZhbHVlKTsKLSAg
ICAgICAgdm9pZCBzZXRTaW1wbGVTZWxlY3RvcihDU1NTZWxlY3RvciogdmFsdWUpOworICAgICAg
ICB2b2lkIHNldFNpbXBsZVNlbGVjdG9yKFBhc3NPd25QdHI8Q1NTU2VsZWN0b3I+IHZhbHVlKTsK
ICAgICAgICAgCiAgICAgICAgIGJvb2wgcGFyc2VOdGgoKTsKICAgICAgICAgYm9vbCBtYXRjaE50
aChpbnQgY291bnQpOwogCi0gICAgICAgIGJvb2wgbWF0Y2hlc1BzZXVkb0VsZW1lbnQoKSBjb25z
dCAKLSAgICAgICAgeyAKLSAgICAgICAgICAgIGlmIChtX3BzZXVkb1R5cGUgPT0gUHNldWRvVW5r
bm93bikKLSAgICAgICAgICAgICAgICBleHRyYWN0UHNldWRvVHlwZSgpOwotICAgICAgICAgICAg
cmV0dXJuIG1fbWF0Y2ggPT0gUHNldWRvRWxlbWVudDsKLSAgICAgICAgfQorICAgICAgICBib29s
IG1hdGNoZXNQc2V1ZG9FbGVtZW50KCkgY29uc3Q7CiAgICAgICAgIGJvb2wgaXNVbmtub3duUHNl
dWRvRWxlbWVudCgpIGNvbnN0OwogICAgICAgICBib29sIGlzU2libGluZ1NlbGVjdG9yKCkgY29u
c3Q7CiAKQEAgLTI4NSw2ICsyNzksOSBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKICAgICAgICAg
Ym9vbCBpc0xhc3RJblNlbGVjdG9yTGlzdCgpIGNvbnN0IHsgcmV0dXJuIG1faXNMYXN0SW5TZWxl
Y3Rvckxpc3Q7IH0KICAgICAgICAgdm9pZCBzZXRMYXN0SW5TZWxlY3Rvckxpc3QoKSB7IG1faXNM
YXN0SW5TZWxlY3Rvckxpc3QgPSB0cnVlOyB9CisgICAgICAgIGJvb2wgaXNMYXN0SW5UYWdIaXN0
b3J5KCkgY29uc3QgeyByZXR1cm4gbV9pc0xhc3RJblRhZ0hpc3Rvcnk7IH0KKyAgICAgICAgdm9p
ZCBzZXROb3RMYXN0SW5UYWdIaXN0b3J5KCkgeyBtX2lzTGFzdEluVGFnSGlzdG9yeSA9IGZhbHNl
OyB9CisKICAgICAgICAgYm9vbCBpc1NpbXBsZSgpIGNvbnN0OwogCiAgICAgICAgIGJvb2wgaXNG
b3JQYWdlKCkgY29uc3QgeyByZXR1cm4gbV9pc0ZvclBhZ2U7IH0KQEAgLTI5NywxMiArMjk0LDEw
IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAgICBwcml2YXRlOgogICAgICAgICBib29sIG1fcGFy
c2VkTnRoICAgICAgICAgICAgICA6IDE7IC8vIFVzZWQgZm9yIDpudGgtKiAKICAgICAgICAgYm9v
bCBtX2lzTGFzdEluU2VsZWN0b3JMaXN0ICAgOiAxOworICAgICAgICBib29sIG1faXNMYXN0SW5U
YWdIaXN0b3J5ICAgICA6IDE7CiAgICAgICAgIGJvb2wgbV9oYXNSYXJlRGF0YSAgICAgICAgICAg
IDogMTsKICAgICAgICAgYm9vbCBtX2lzRm9yUGFnZSAgICAgICAgICAgICAgOiAxOwogCi0gICAg
ICAgIHZvaWQgcmVsZWFzZU93bmVkU2VsZWN0b3JzVG9CYWcoQ1NTU2VsZWN0b3JCYWcmKTsKLSAg
ICAgICAgdm9pZCBkZWxldGVSZWFjaGFibGVTZWxlY3RvcnMoKTsKLQogICAgICAgICB1bnNpZ25l
ZCBzcGVjaWZpY2l0eUZvck9uZVNlbGVjdG9yKCkgY29uc3Q7CiAgICAgICAgIHVuc2lnbmVkIHNw
ZWNpZmljaXR5Rm9yUGFnZSgpIGNvbnN0OwogICAgICAgICB2b2lkIGV4dHJhY3RQc2V1ZG9UeXBl
KCkgY29uc3Q7CkBAIC0zMTAsNDQgKzMwNSw0NyBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAgICAg
ICAgIHN0cnVjdCBSYXJlRGF0YSB7CiAgICAgICAgICAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShS
YXJlRGF0YSk7IFdURl9NQUtFX0ZBU1RfQUxMT0NBVEVEOwogICAgICAgICBwdWJsaWM6Ci0gICAg
ICAgICAgICBSYXJlRGF0YShQYXNzT3duUHRyPENTU1NlbGVjdG9yPiB0YWdIaXN0b3J5KQotICAg
ICAgICAgICAgICAgIDogbV9hKDApCisgICAgICAgICAgICBSYXJlRGF0YShQYXNzUmVmUHRyPEF0
b21pY1N0cmluZ0ltcGw+IHZhbHVlKQorICAgICAgICAgICAgICAgIDogbV92YWx1ZSh2YWx1ZS5s
ZWFrUmVmKCkpCisgICAgICAgICAgICAgICAgLCBtX2EoMCkKICAgICAgICAgICAgICAgICAsIG1f
YigwKQotICAgICAgICAgICAgICAgICwgbV90YWdIaXN0b3J5KHRhZ0hpc3RvcnkpCiAgICAgICAg
ICAgICAgICAgLCBtX2F0dHJpYnV0ZShhbnlRTmFtZSgpKQogICAgICAgICAgICAgICAgICwgbV9h
cmd1bWVudChudWxsQXRvbSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIH5SYXJlRGF0YSgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKG1fdmFs
dWUpCisgICAgICAgICAgICAgICAgICAgIG1fdmFsdWUtPmRlcmVmKCk7CisgICAgICAgICAgICB9
CiAKICAgICAgICAgICAgIGJvb2wgcGFyc2VOdGgoKTsKICAgICAgICAgICAgIGJvb2wgbWF0Y2hO
dGgoaW50IGNvdW50KTsKIAorICAgICAgICAgICAgQXRvbWljU3RyaW5nSW1wbCogbV92YWx1ZTsg
Ly8gUGxhaW4gcG9pbnRlciB0byBrZWVwIHRoaW5ncyB1bmlmb3JtIHdpdGggdGhlIHVuaW9uLgog
ICAgICAgICAgICAgaW50IG1fYTsgLy8gVXNlZCBmb3IgOm50aC0qCiAgICAgICAgICAgICBpbnQg
bV9iOyAvLyBVc2VkIGZvciA6bnRoLSoKLSAgICAgICAgICAgIE93blB0cjxDU1NTZWxlY3Rvcj4g
bV90YWdIaXN0b3J5OwogICAgICAgICAgICAgT3duUHRyPENTU1NlbGVjdG9yPiBtX3NpbXBsZVNl
bGVjdG9yOyAvLyBVc2VkIGZvciA6bm90LgogICAgICAgICAgICAgUXVhbGlmaWVkTmFtZSBtX2F0
dHJpYnV0ZTsgLy8gdXNlZCBmb3IgYXR0cmlidXRlIHNlbGVjdG9yCiAgICAgICAgICAgICBBdG9t
aWNTdHJpbmcgbV9hcmd1bWVudDsgLy8gVXNlZCBmb3IgOmNvbnRhaW5zLCA6bGFuZyBhbmQgOm50
aC0qCiAgICAgICAgIH07Ci0KLSAgICAgICAgdm9pZCBjcmVhdGVSYXJlRGF0YSgpCi0gICAgICAg
IHsKLSAgICAgICAgICAgIGlmIChtX2hhc1JhcmVEYXRhKSAKLSAgICAgICAgICAgICAgICByZXR1
cm47Ci0gICAgICAgICAgICBtX2RhdGEubV9yYXJlRGF0YSA9IG5ldyBSYXJlRGF0YShhZG9wdFB0
cihtX2RhdGEubV90YWdIaXN0b3J5KSk7Ci0gICAgICAgICAgICBtX2hhc1JhcmVEYXRhID0gdHJ1
ZTsKLSAgICAgICAgfQorICAgICAgICB2b2lkIGNyZWF0ZVJhcmVEYXRhKCk7CiAgICAgICAgIAog
ICAgICAgICB1bmlvbiBEYXRhVW5pb24gewotICAgICAgICAgICAgRGF0YVVuaW9uKCkgOiBtX3Rh
Z0hpc3RvcnkoMCkgeyB9Ci0gICAgICAgICAgICBDU1NTZWxlY3RvciogbV90YWdIaXN0b3J5Owor
ICAgICAgICAgICAgRGF0YVVuaW9uKCkgOiBtX3ZhbHVlKDApIHsgfQorICAgICAgICAgICAgQXRv
bWljU3RyaW5nSW1wbCogbV92YWx1ZTsKICAgICAgICAgICAgIFJhcmVEYXRhKiBtX3JhcmVEYXRh
OwogICAgICAgICB9IG1fZGF0YTsKICAgICAgICAgCi0gICAgcHVibGljOgotICAgICAgICBtdXRh
YmxlIEF0b21pY1N0cmluZyBtX3ZhbHVlOwogICAgICAgICBRdWFsaWZpZWROYW1lIG1fdGFnOwog
ICAgIH07CisgICAgCitpbmxpbmUgYm9vbCBDU1NTZWxlY3Rvcjo6bWF0Y2hlc1BzZXVkb0VsZW1l
bnQoKSBjb25zdCAKK3sgCisgICAgaWYgKG1fcHNldWRvVHlwZSA9PSBQc2V1ZG9Vbmtub3duKQor
ICAgICAgICBleHRyYWN0UHNldWRvVHlwZSgpOworICAgIHJldHVybiBtX21hdGNoID09IFBzZXVk
b0VsZW1lbnQ7Cit9CiAKIGlubGluZSBib29sIENTU1NlbGVjdG9yOjppc1Vua25vd25Qc2V1ZG9F
bGVtZW50KCkgY29uc3QKIHsKQEAgLTM3MSw2ICszNjksMTggQEAgaW5saW5lIGJvb2wgQ1NTU2Vs
ZWN0b3I6OmlzU2libGluZ1NlbGVjdAogICAgICAgICB8fCB0eXBlID09IFBzZXVkb050aExhc3RD
aGlsZAogICAgICAgICB8fCB0eXBlID09IFBzZXVkb050aExhc3RPZlR5cGU7CiB9CisgICAgCitp
bmxpbmUgdm9pZCBDU1NTZWxlY3Rvcjo6c2V0VmFsdWUoY29uc3QgQXRvbWljU3RyaW5nJiB2YWx1
ZSkKK3sgCisgICAgLy8gTmVlZCB0byBkbyByZWYgY291bnRpbmcgbWFudWFsbHkgZm9yIHRoZSB1
bmlvbi4KKyAgICBpZiAobV9oYXNSYXJlRGF0YSkgeworICAgICAgICBtX2RhdGEubV9yYXJlRGF0
YS0+bV92YWx1ZSA9IHZhbHVlLmltcGwoKTsKKyAgICAgICAgbV9kYXRhLm1fcmFyZURhdGEtPm1f
dmFsdWUtPnJlZigpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1fZGF0YS5tX3ZhbHVl
ID0gdmFsdWUuaW1wbCgpOworICAgIG1fZGF0YS5tX3ZhbHVlLT5yZWYoKTsKK30KIAogfSAvLyBu
YW1lc3BhY2UgV2ViQ29yZQogCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9jc3MvQ1NTU2VsZWN0b3JM
aXN0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9jc3MvQ1NTU2VsZWN0b3JMaXN0
LmNwcAkocmV2aXNpb24gNzY1NjUpCisrKyBTb3VyY2UvV2ViQ29yZS9jc3MvQ1NTU2VsZWN0b3JM
aXN0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjcsNiArMjcsOCBAQAogI2luY2x1ZGUgImNvbmZp
Zy5oIgogI2luY2x1ZGUgIkNTU1NlbGVjdG9yTGlzdC5oIgogCisjaW5jbHVkZSAiQ1NTUGFyc2Vy
VmFsdWVzLmgiCisKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogQ1NTU2VsZWN0b3JMaXN0Ojp+Q1NT
U2VsZWN0b3JMaXN0KCkgCkBAIC00MSwyNiArNDMsNDMgQEAgdm9pZCBDU1NTZWxlY3Rvckxpc3Q6
OmFkb3B0KENTU1NlbGVjdG9yTAogICAgIGxpc3QubV9zZWxlY3RvckFycmF5ID0gMDsKIH0KIAot
dm9pZCBDU1NTZWxlY3Rvckxpc3Q6OmFkb3B0U2VsZWN0b3JWZWN0b3IoVmVjdG9yPENTU1NlbGVj
dG9yKj4mIHNlbGVjdG9yVmVjdG9yKQordm9pZCBDU1NTZWxlY3Rvckxpc3Q6OmFkb3B0U2VsZWN0
b3JWZWN0b3IoVmVjdG9yPE93blB0cjxDU1NQYXJzZXJTZWxlY3Rvcj4gPiYgc2VsZWN0b3JWZWN0
b3IpCiB7CiAgICAgZGVsZXRlU2VsZWN0b3JzKCk7Ci0gICAgY29uc3Qgc2l6ZV90IHNpemUgPSBz
ZWxlY3RvclZlY3Rvci5zaXplKCk7Ci0gICAgQVNTRVJUKHNpemUpOwotICAgIGlmIChzaXplID09
IDEpIHsKLSAgICAgICAgbV9zZWxlY3RvckFycmF5ID0gc2VsZWN0b3JWZWN0b3JbMF07CisgICAg
Y29uc3Qgc2l6ZV90IHZlY3RvclNpemUgPSBzZWxlY3RvclZlY3Rvci5zaXplKCk7CisgICAgc2l6
ZV90IGZsYXR0ZW5lZFNpemUgPSAwOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdmVjdG9y
U2l6ZTsgKytpKSB7ICAgICAgICAKKyAgICAgICAgZm9yIChDU1NQYXJzZXJTZWxlY3Rvciogc2Vs
ZWN0b3IgPSBzZWxlY3RvclZlY3RvcltpXS5nZXQoKTsgc2VsZWN0b3I7IHNlbGVjdG9yID0gc2Vs
ZWN0b3ItPnRhZ0hpc3RvcnkoKSkKKyAgICAgICAgICAgICsrZmxhdHRlbmVkU2l6ZTsKKyAgICB9
CisgICAgQVNTRVJUKGZsYXR0ZW5lZFNpemUpOworICAgIGlmIChmbGF0dGVuZWRTaXplID09IDEp
IHsKKyAgICAgICAgbV9zZWxlY3RvckFycmF5ID0gc2VsZWN0b3JWZWN0b3JbMF0tPnJlbGVhc2VT
ZWxlY3RvcigpLmxlYWtQdHIoKTsKICAgICAgICAgbV9zZWxlY3RvckFycmF5LT5zZXRMYXN0SW5T
ZWxlY3Rvckxpc3QoKTsKKyAgICAgICAgQVNTRVJUKG1fc2VsZWN0b3JBcnJheS0+aXNMYXN0SW5U
YWdIaXN0b3J5KCkpOwogICAgICAgICBzZWxlY3RvclZlY3Rvci5zaHJpbmsoMCk7CiAgICAgICAg
IHJldHVybjsKICAgICB9Ci0gICAgbV9zZWxlY3RvckFycmF5ID0gcmVpbnRlcnByZXRfY2FzdDxD
U1NTZWxlY3Rvcio+KGZhc3RNYWxsb2Moc2l6ZW9mKENTU1NlbGVjdG9yKSAqIHNlbGVjdG9yVmVj
dG9yLnNpemUoKSkpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7Ci0g
ICAgICAgIG1lbWNweSgmbV9zZWxlY3RvckFycmF5W2ldLCBzZWxlY3RvclZlY3RvcltpXSwgc2l6
ZW9mKENTU1NlbGVjdG9yKSk7Ci0gICAgICAgIC8vIFdlIHdhbnQgdG8gZnJlZSB0aGUgbWVtb3J5
ICh3aGljaCB3YXMgYWxsb2NhdGVkIHdpdGggZmFzdE5ldyksIGJ1dCB3ZQotICAgICAgICAvLyBk
b24ndCB3YW50IHRoZSBkZXN0cnVjdG9yIHRvIHJ1biBzaW5jZSBpdCB3aWxsIGFmZmVjdCB0aGUg
Y29weSB3ZSd2ZSBqdXN0IG1hZGUuCi0gICAgICAgIGZhc3REZWxldGVTa2lwcGluZ0Rlc3RydWN0
b3Ioc2VsZWN0b3JWZWN0b3JbaV0pOwotICAgICAgICBBU1NFUlQoIW1fc2VsZWN0b3JBcnJheVtp
XS5pc0xhc3RJblNlbGVjdG9yTGlzdCgpKTsKKyAgICBtX3NlbGVjdG9yQXJyYXkgPSByZWludGVy
cHJldF9jYXN0PENTU1NlbGVjdG9yKj4oZmFzdE1hbGxvYyhzaXplb2YoQ1NTU2VsZWN0b3IpICog
ZmxhdHRlbmVkU2l6ZSkpOworICAgIHNpemVfdCBhcnJheUluZGV4ID0gMDsKKyAgICBmb3IgKHNp
emVfdCBpID0gMDsgaSA8IHZlY3RvclNpemU7ICsraSkgeworICAgICAgICBDU1NQYXJzZXJTZWxl
Y3RvciogY3VycmVudCA9IHNlbGVjdG9yVmVjdG9yW2ldLmdldCgpOworICAgICAgICB3aGlsZSAo
Y3VycmVudCkgeworICAgICAgICAgICAgUGFzc093blB0cjxDU1NTZWxlY3Rvcj4gc2VsZWN0b3Ig
PSBjdXJyZW50LT5yZWxlYXNlU2VsZWN0b3IoKTsKKyAgICAgICAgICAgIG1lbWNweSgmbV9zZWxl
Y3RvckFycmF5W2FycmF5SW5kZXhdLCBzZWxlY3Rvci5nZXQoKSwgc2l6ZW9mKENTU1NlbGVjdG9y
KSk7CisgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC0+dGFnSGlzdG9yeSgpOworICAgICAg
ICAgICAgLy8gV2Ugd2FudCB0byBmcmVlIHRoZSBtZW1vcnkgKHdoaWNoIHdhcyBhbGxvY2F0ZWQg
d2l0aCBmYXN0TmV3KSwgYnV0IHdlCisgICAgICAgICAgICAvLyBkb24ndCB3YW50IHRoZSBkZXN0
cnVjdG9yIHRvIHJ1biBzaW5jZSBpdCB3aWxsIGFmZmVjdCB0aGUgY29weSB3ZSd2ZSBqdXN0IG1h
ZGUuOworICAgICAgICAgICAgZmFzdERlbGV0ZVNraXBwaW5nRGVzdHJ1Y3RvcihzZWxlY3Rvci5s
ZWFrUHRyKCkpOworICAgICAgICAgICAgQVNTRVJUKCFtX3NlbGVjdG9yQXJyYXlbYXJyYXlJbmRl
eF0uaXNMYXN0SW5TZWxlY3Rvckxpc3QoKSk7CisgICAgICAgICAgICBpZiAoY3VycmVudCkKKyAg
ICAgICAgICAgICAgICBtX3NlbGVjdG9yQXJyYXlbYXJyYXlJbmRleF0uc2V0Tm90TGFzdEluVGFn
SGlzdG9yeSgpOworICAgICAgICAgICAgKythcnJheUluZGV4OworICAgICAgICB9CisgICAgICAg
IEFTU0VSVChtX3NlbGVjdG9yQXJyYXlbYXJyYXlJbmRleCAtIDFdLmlzTGFzdEluVGFnSGlzdG9y
eSgpKTsKICAgICB9Ci0gICAgbV9zZWxlY3RvckFycmF5W3NpemUgLSAxXS5zZXRMYXN0SW5TZWxl
Y3Rvckxpc3QoKTsKKyAgICBBU1NFUlQoZmxhdHRlbmVkU2l6ZSA9PSBhcnJheUluZGV4KTsKKyAg
ICBtX3NlbGVjdG9yQXJyYXlbYXJyYXlJbmRleCAtIDFdLnNldExhc3RJblNlbGVjdG9yTGlzdCgp
OwogICAgIHNlbGVjdG9yVmVjdG9yLnNocmluaygwKTsKIH0KIApAQCAtMTIyLDcgKzE0MSw3IEBA
IGNsYXNzIFNlbGVjdG9yTmVlZHNOYW1lc3BhY2VSZXNvbHV0aW9uRnUKIHB1YmxpYzoKICAgICBi
b29sIG9wZXJhdG9yKCkoQ1NTU2VsZWN0b3IqIHNlbGVjdG9yKQogICAgIHsKLSAgICAgICAgaWYg
KHNlbGVjdG9yLT5oYXNUYWcoKSAmJiBzZWxlY3Rvci0+bV90YWcucHJlZml4KCkgIT0gbnVsbEF0
b20gJiYgc2VsZWN0b3ItPm1fdGFnLnByZWZpeCgpICE9IHN0YXJBdG9tKQorICAgICAgICBpZiAo
c2VsZWN0b3ItPmhhc1RhZygpICYmIHNlbGVjdG9yLT50YWcoKS5wcmVmaXgoKSAhPSBudWxsQXRv
bSAmJiBzZWxlY3Rvci0+dGFnKCkucHJlZml4KCkgIT0gc3RhckF0b20pCiAgICAgICAgICAgICBy
ZXR1cm4gdHJ1ZTsKICAgICAgICAgaWYgKHNlbGVjdG9yLT5oYXNBdHRyaWJ1dGUoKSAmJiBzZWxl
Y3Rvci0+YXR0cmlidXRlKCkucHJlZml4KCkgIT0gbnVsbEF0b20gJiYgc2VsZWN0b3ItPmF0dHJp
YnV0ZSgpLnByZWZpeCgpICE9IHN0YXJBdG9tKQogICAgICAgICAgICAgcmV0dXJuIHRydWU7Cklu
ZGV4OiBTb3VyY2UvV2ViQ29yZS9jc3MvQ1NTU2VsZWN0b3JMaXN0LmgKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL1dlYkNvcmUvY3NzL0NTU1NlbGVjdG9yTGlzdC5oCShyZXZpc2lvbiA3NjU2NSkKKysr
IFNvdXJjZS9XZWJDb3JlL2Nzcy9DU1NTZWxlY3Rvckxpc3QuaAkod29ya2luZyBjb3B5KQpAQCAt
MzAsNiArMzAsOCBAQAogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAgICAgCitjbGFzcyBDU1NQYXJz
ZXJTZWxlY3RvcjsKKyAgICAKIGNsYXNzIENTU1NlbGVjdG9yTGlzdCB7CiAgICAgV1RGX01BS0Vf
Tk9OQ09QWUFCTEUoQ1NTU2VsZWN0b3JMaXN0KTsgV1RGX01BS0VfRkFTVF9BTExPQ0FURUQ7CiBw
dWJsaWM6CkBAIC0zNywxMSArMzksMTEgQEAgcHVibGljOgogICAgIH5DU1NTZWxlY3Rvckxpc3Qo
KTsKIAogICAgIHZvaWQgYWRvcHQoQ1NTU2VsZWN0b3JMaXN0JiBsaXN0KTsKLSAgICB2b2lkIGFk
b3B0U2VsZWN0b3JWZWN0b3IoVmVjdG9yPENTU1NlbGVjdG9yKj4mIHNlbGVjdG9yVmVjdG9yKTsK
KyAgICB2b2lkIGFkb3B0U2VsZWN0b3JWZWN0b3IoVmVjdG9yPE93blB0cjxDU1NQYXJzZXJTZWxl
Y3Rvcj4gPiYgc2VsZWN0b3JWZWN0b3IpOwogICAgIAogICAgIENTU1NlbGVjdG9yKiBmaXJzdCgp
IGNvbnN0IHsgcmV0dXJuIG1fc2VsZWN0b3JBcnJheSA/IG1fc2VsZWN0b3JBcnJheSA6IDA7IH0K
LSAgICBzdGF0aWMgQ1NTU2VsZWN0b3IqIG5leHQoQ1NTU2VsZWN0b3IqIHByZXZpb3VzKSB7IHJl
dHVybiBwcmV2aW91cy0+aXNMYXN0SW5TZWxlY3Rvckxpc3QoKSA/IDAgOiBwcmV2aW91cyArIDE7
IH0KLSAgICBib29sIGhhc09uZVNlbGVjdG9yKCkgY29uc3QgeyByZXR1cm4gbV9zZWxlY3RvckFy
cmF5ID8gbV9zZWxlY3RvckFycmF5LT5pc0xhc3RJblNlbGVjdG9yTGlzdCgpIDogZmFsc2U7IH0K
KyAgICBzdGF0aWMgQ1NTU2VsZWN0b3IqIG5leHQoQ1NTU2VsZWN0b3IqIGN1cnJlbnQpOworICAg
IGJvb2wgaGFzT25lU2VsZWN0b3IoKSBjb25zdCB7IHJldHVybiBtX3NlbGVjdG9yQXJyYXkgJiYg
IW5leHQobV9zZWxlY3RvckFycmF5KTsgfQogCiAgICAgYm9vbCBzZWxlY3RvcnNOZWVkTmFtZXNw
YWNlUmVzb2x1dGlvbigpOwogICAgIGJvb2wgaGFzVW5rbm93blBzZXVkb0VsZW1lbnRzKCkgY29u
c3Q7CkBAIC00OSwxMCArNTEsMTggQEAgcHVibGljOgogcHJpdmF0ZToKICAgICB2b2lkIGRlbGV0
ZVNlbGVjdG9ycygpOwogCisgICAgLy8gRW5kIG9mIGEgbXVsdGlwYXJ0IHNlbGVjdG9yIGlzIGlu
ZGljYXRlZCBieSBtX2lzTGFzdEluVGFnSGlzdG9yeSBiaXQgaW4gdGhlIGxhc3QgaXRlbS4KICAg
ICAvLyBFbmQgb2YgdGhlIGFycmF5IGlzIGluZGljYXRlZCBieSBtX2lzTGFzdEluU2VsZWN0b3JM
aXN0IGJpdCBpbiB0aGUgbGFzdCBpdGVtLgogICAgIENTU1NlbGVjdG9yKiBtX3NlbGVjdG9yQXJy
YXk7CiB9OwogCitpbmxpbmUgQ1NTU2VsZWN0b3IqIENTU1NlbGVjdG9yTGlzdDo6bmV4dChDU1NT
ZWxlY3RvciogY3VycmVudCkKK3sKKyAgICB3aGlsZSAoIWN1cnJlbnQtPmlzTGFzdEluVGFnSGlz
dG9yeSgpKQorICAgICAgICBjdXJyZW50Kys7CisgICAgcmV0dXJuIGN1cnJlbnQtPmlzTGFzdElu
U2VsZWN0b3JMaXN0KCkgPyAwIDogY3VycmVudCArIDE7Cit9CisKIH0gLy8gbmFtZXNwYWNlIFdl
YkNvcmUKIAogI2VuZGlmIC8vIENTU1NlbGVjdG9yTGlzdF9oCkluZGV4OiBTb3VyY2UvV2ViQ29y
ZS9jc3MvQ1NTU3R5bGVSdWxlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvY3NzL0NT
U1N0eWxlUnVsZS5oCShyZXZpc2lvbiA3NjU2NSkKKysrIFNvdXJjZS9XZWJDb3JlL2Nzcy9DU1NT
dHlsZVJ1bGUuaAkod29ya2luZyBjb3B5KQpAQCAtNTAsNyArNTAsNyBAQCBwdWJsaWM6CiAgICAg
Ly8gTm90IHBhcnQgb2YgdGhlIENTU09NCiAgICAgdmlydHVhbCBib29sIHBhcnNlU3RyaW5nKGNv
bnN0IFN0cmluZyYsIGJvb2wgPSBmYWxzZSk7CiAKLSAgICB2b2lkIGFkb3B0U2VsZWN0b3JWZWN0
b3IoVmVjdG9yPENTU1NlbGVjdG9yKj4mIHNlbGVjdG9ycykgeyBtX3NlbGVjdG9yTGlzdC5hZG9w
dFNlbGVjdG9yVmVjdG9yKHNlbGVjdG9ycyk7IH0KKyAgICB2b2lkIGFkb3B0U2VsZWN0b3JWZWN0
b3IoVmVjdG9yPE93blB0cjxDU1NQYXJzZXJTZWxlY3Rvcj4gPiYgc2VsZWN0b3JzKSB7IG1fc2Vs
ZWN0b3JMaXN0LmFkb3B0U2VsZWN0b3JWZWN0b3Ioc2VsZWN0b3JzKTsgfQogICAgIHZvaWQgc2V0
RGVjbGFyYXRpb24oUGFzc1JlZlB0cjxDU1NNdXRhYmxlU3R5bGVEZWNsYXJhdGlvbj4pOwogCiAg
ICAgY29uc3QgQ1NTU2VsZWN0b3JMaXN0JiBzZWxlY3Rvckxpc3QoKSBjb25zdCB7IHJldHVybiBt
X3NlbGVjdG9yTGlzdDsgfQpJbmRleDogU291cmNlL1dlYkNvcmUvY3NzL0NTU1N0eWxlU2VsZWN0
b3IuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2Nzcy9DU1NTdHlsZVNlbGVjdG9y
LmNwcAkocmV2aXNpb24gNzY1NjUpCisrKyBTb3VyY2UvV2ViQ29yZS9jc3MvQ1NTU3R5bGVTZWxl
Y3Rvci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTIyMTcsMjAgKzIyMTcsMjAgQEAgYm9vbCBDU1NT
dHlsZVNlbGVjdG9yOjpTZWxlY3RvckNoZWNrZXI6OgogICAgICAgICByZXR1cm4gZmFsc2U7CiAK
ICAgICBpZiAoc2VsLT5oYXNUYWcoKSkgewotICAgICAgICBjb25zdCBBdG9taWNTdHJpbmcmIHNl
bExvY2FsTmFtZSA9IHNlbC0+bV90YWcubG9jYWxOYW1lKCk7CisgICAgICAgIGNvbnN0IEF0b21p
Y1N0cmluZyYgc2VsTG9jYWxOYW1lID0gc2VsLT50YWcoKS5sb2NhbE5hbWUoKTsKICAgICAgICAg
aWYgKHNlbExvY2FsTmFtZSAhPSBzdGFyQXRvbSAmJiBzZWxMb2NhbE5hbWUgIT0gZS0+bG9jYWxO
YW1lKCkpCiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGNvbnN0IEF0b21pY1N0
cmluZyYgc2VsTlMgPSBzZWwtPm1fdGFnLm5hbWVzcGFjZVVSSSgpOworICAgICAgICBjb25zdCBB
dG9taWNTdHJpbmcmIHNlbE5TID0gc2VsLT50YWcoKS5uYW1lc3BhY2VVUkkoKTsKICAgICAgICAg
aWYgKHNlbE5TICE9IHN0YXJBdG9tICYmIHNlbE5TICE9IGUtPm5hbWVzcGFjZVVSSSgpKQogICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIGlmIChzZWwtPmhhc0F0dHJpYnV0
ZSgpKSB7CiAgICAgICAgIGlmIChzZWwtPm1fbWF0Y2ggPT0gQ1NTU2VsZWN0b3I6OkNsYXNzKQot
ICAgICAgICAgICAgcmV0dXJuIGUtPmhhc0NsYXNzKCkgJiYgc3RhdGljX2Nhc3Q8U3R5bGVkRWxl
bWVudCo+KGUpLT5jbGFzc05hbWVzKCkuY29udGFpbnMoc2VsLT5tX3ZhbHVlKTsKKyAgICAgICAg
ICAgIHJldHVybiBlLT5oYXNDbGFzcygpICYmIHN0YXRpY19jYXN0PFN0eWxlZEVsZW1lbnQqPihl
KS0+Y2xhc3NOYW1lcygpLmNvbnRhaW5zKHNlbC0+dmFsdWUoKSk7CiAKICAgICAgICAgaWYgKHNl
bC0+bV9tYXRjaCA9PSBDU1NTZWxlY3Rvcjo6SWQpCi0gICAgICAgICAgICByZXR1cm4gZS0+aGFz
SUQoKSAmJiBlLT5pZEZvclN0eWxlUmVzb2x1dGlvbigpID09IHNlbC0+bV92YWx1ZTsKKyAgICAg
ICAgICAgIHJldHVybiBlLT5oYXNJRCgpICYmIGUtPmlkRm9yU3R5bGVSZXNvbHV0aW9uKCkgPT0g
c2VsLT52YWx1ZSgpOwogICAgICAgICAKICAgICAgICAgY29uc3QgUXVhbGlmaWVkTmFtZSYgYXR0
ciA9IHNlbC0+YXR0cmlidXRlKCk7CiAKQEAgLTIyNDksMjIgKzIyNDksMjIgQEAgYm9vbCBDU1NT
dHlsZVNlbGVjdG9yOjpTZWxlY3RvckNoZWNrZXI6OgogCiAgICAgICAgIHN3aXRjaCAoc2VsLT5t
X21hdGNoKSB7CiAgICAgICAgIGNhc2UgQ1NTU2VsZWN0b3I6OkV4YWN0OgotICAgICAgICAgICAg
aWYgKGNhc2VTZW5zaXRpdmUgPyBzZWwtPm1fdmFsdWUgIT0gdmFsdWUgOiAhZXF1YWxJZ25vcmlu
Z0Nhc2Uoc2VsLT5tX3ZhbHVlLCB2YWx1ZSkpCisgICAgICAgICAgICBpZiAoY2FzZVNlbnNpdGl2
ZSA/IHNlbC0+dmFsdWUoKSAhPSB2YWx1ZSA6ICFlcXVhbElnbm9yaW5nQ2FzZShzZWwtPnZhbHVl
KCksIHZhbHVlKSkKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICBi
cmVhazsKICAgICAgICAgY2FzZSBDU1NTZWxlY3Rvcjo6TGlzdDoKICAgICAgICAgewogICAgICAg
ICAgICAgLy8gSWdub3JlIGVtcHR5IHNlbGVjdG9ycyBvciBzZWxlY3RvcnMgY29udGFpbmluZyBz
cGFjZXMKLSAgICAgICAgICAgIGlmIChzZWwtPm1fdmFsdWUuY29udGFpbnMoJyAnKSB8fCBzZWwt
Pm1fdmFsdWUuaXNFbXB0eSgpKQorICAgICAgICAgICAgaWYgKHNlbC0+dmFsdWUoKS5jb250YWlu
cygnICcpIHx8IHNlbC0+dmFsdWUoKS5pc0VtcHR5KCkpCiAgICAgICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOwogCiAgICAgICAgICAgICB1bnNpZ25lZCBzdGFydFNlYXJjaEF0ID0gMDsKICAgICAg
ICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICAgICAgc2l6ZV90IGZvdW5kUG9zID0g
dmFsdWUuZmluZChzZWwtPm1fdmFsdWUsIHN0YXJ0U2VhcmNoQXQsIGNhc2VTZW5zaXRpdmUpOwor
ICAgICAgICAgICAgICAgIHNpemVfdCBmb3VuZFBvcyA9IHZhbHVlLmZpbmQoc2VsLT52YWx1ZSgp
LCBzdGFydFNlYXJjaEF0LCBjYXNlU2Vuc2l0aXZlKTsKICAgICAgICAgICAgICAgICBpZiAoZm91
bmRQb3MgPT0gbm90Rm91bmQpCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAg
ICAgICAgICAgICAgICBpZiAoZm91bmRQb3MgPT0gMCB8fCB2YWx1ZVtmb3VuZFBvcyAtIDFdID09
ICcgJykgewotICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBlbmRTdHIgPSBmb3VuZFBvcyAr
IHNlbC0+bV92YWx1ZS5sZW5ndGgoKTsKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgZW5k
U3RyID0gZm91bmRQb3MgKyBzZWwtPnZhbHVlKCkubGVuZ3RoKCk7CiAgICAgICAgICAgICAgICAg
ICAgIGlmIChlbmRTdHIgPT0gdmFsdWUubGVuZ3RoKCkgfHwgdmFsdWVbZW5kU3RyXSA9PSAnICcp
CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgLy8gV2UgZm91bmQgYSBtYXRjaC4KICAg
ICAgICAgICAgICAgICB9CkBAIC0yMjc1LDI0ICsyMjc1LDI0IEBAIGJvb2wgQ1NTU3R5bGVTZWxl
Y3Rvcjo6U2VsZWN0b3JDaGVja2VyOjoKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAg
ICAgICAgIGNhc2UgQ1NTU2VsZWN0b3I6OkNvbnRhaW46Ci0gICAgICAgICAgICBpZiAoIXZhbHVl
LmNvbnRhaW5zKHNlbC0+bV92YWx1ZSwgY2FzZVNlbnNpdGl2ZSkgfHwgc2VsLT5tX3ZhbHVlLmlz
RW1wdHkoKSkKKyAgICAgICAgICAgIGlmICghdmFsdWUuY29udGFpbnMoc2VsLT52YWx1ZSgpLCBj
YXNlU2Vuc2l0aXZlKSB8fCBzZWwtPnZhbHVlKCkuaXNFbXB0eSgpKQogICAgICAgICAgICAgICAg
IHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIENTU1NlbGVj
dG9yOjpCZWdpbjoKLSAgICAgICAgICAgIGlmICghdmFsdWUuc3RhcnRzV2l0aChzZWwtPm1fdmFs
dWUsIGNhc2VTZW5zaXRpdmUpIHx8IHNlbC0+bV92YWx1ZS5pc0VtcHR5KCkpCisgICAgICAgICAg
ICBpZiAoIXZhbHVlLnN0YXJ0c1dpdGgoc2VsLT52YWx1ZSgpLCBjYXNlU2Vuc2l0aXZlKSB8fCBz
ZWwtPnZhbHVlKCkuaXNFbXB0eSgpKQogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAg
ICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIENTU1NlbGVjdG9yOjpFbmQ6Ci0gICAgICAg
ICAgICBpZiAoIXZhbHVlLmVuZHNXaXRoKHNlbC0+bV92YWx1ZSwgY2FzZVNlbnNpdGl2ZSkgfHwg
c2VsLT5tX3ZhbHVlLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIGlmICghdmFsdWUuZW5kc1dpdGgo
c2VsLT52YWx1ZSgpLCBjYXNlU2Vuc2l0aXZlKSB8fCBzZWwtPnZhbHVlKCkuaXNFbXB0eSgpKQog
ICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAg
ICBjYXNlIENTU1NlbGVjdG9yOjpIeXBoZW46Ci0gICAgICAgICAgICBpZiAodmFsdWUubGVuZ3Ro
KCkgPCBzZWwtPm1fdmFsdWUubGVuZ3RoKCkpCisgICAgICAgICAgICBpZiAodmFsdWUubGVuZ3Ro
KCkgPCBzZWwtPnZhbHVlKCkubGVuZ3RoKCkpCiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OwotICAgICAgICAgICAgaWYgKCF2YWx1ZS5zdGFydHNXaXRoKHNlbC0+bV92YWx1ZSwgY2FzZVNl
bnNpdGl2ZSkpCisgICAgICAgICAgICBpZiAoIXZhbHVlLnN0YXJ0c1dpdGgoc2VsLT52YWx1ZSgp
LCBjYXNlU2Vuc2l0aXZlKSkKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAg
ICAgICAvLyBJdCB0aGV5IHN0YXJ0IHRoZSBzYW1lLCBjaGVjayBmb3IgZXhhY3QgbWF0Y2ggb3Ig
Zm9sbG93aW5nICctJzoKLSAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGgoKSAhPSBzZWwtPm1f
dmFsdWUubGVuZ3RoKCkgJiYgdmFsdWVbc2VsLT5tX3ZhbHVlLmxlbmd0aCgpXSAhPSAnLScpCisg
ICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoKCkgIT0gc2VsLT52YWx1ZSgpLmxlbmd0aCgpICYm
IHZhbHVlW3NlbC0+dmFsdWUoKS5sZW5ndGgoKV0gIT0gJy0nKQogICAgICAgICAgICAgICAgIHJl
dHVybiBmYWxzZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIENTU1NlbGVjdG9y
OjpQc2V1ZG9DbGFzczoKQEAgLTI5MDQsMjAgKzI5MDQsMjAgQEAgdm9pZCBDU1NSdWxlU2V0Ojph
ZGRUb1J1bGVTZXQoQXRvbWljU3RyaQogdm9pZCBDU1NSdWxlU2V0OjphZGRSdWxlKENTU1N0eWxl
UnVsZSogcnVsZSwgQ1NTU2VsZWN0b3IqIHNlbCkKIHsKICAgICBpZiAoc2VsLT5tX21hdGNoID09
IENTU1NlbGVjdG9yOjpJZCkgewotICAgICAgICBhZGRUb1J1bGVTZXQoc2VsLT5tX3ZhbHVlLmlt
cGwoKSwgbV9pZFJ1bGVzLCBydWxlLCBzZWwpOworICAgICAgICBhZGRUb1J1bGVTZXQoc2VsLT52
YWx1ZSgpLmltcGwoKSwgbV9pZFJ1bGVzLCBydWxlLCBzZWwpOwogICAgICAgICByZXR1cm47CiAg
ICAgfQogICAgIGlmIChzZWwtPm1fbWF0Y2ggPT0gQ1NTU2VsZWN0b3I6OkNsYXNzKSB7Ci0gICAg
ICAgIGFkZFRvUnVsZVNldChzZWwtPm1fdmFsdWUuaW1wbCgpLCBtX2NsYXNzUnVsZXMsIHJ1bGUs
IHNlbCk7CisgICAgICAgIGFkZFRvUnVsZVNldChzZWwtPnZhbHVlKCkuaW1wbCgpLCBtX2NsYXNz
UnVsZXMsIHJ1bGUsIHNlbCk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgIAogICAgIGlm
IChzZWwtPmlzVW5rbm93blBzZXVkb0VsZW1lbnQoKSkgewotICAgICAgICBhZGRUb1J1bGVTZXQo
c2VsLT5tX3ZhbHVlLmltcGwoKSwgbV9wc2V1ZG9SdWxlcywgcnVsZSwgc2VsKTsKKyAgICAgICAg
YWRkVG9SdWxlU2V0KHNlbC0+dmFsdWUoKS5pbXBsKCksIG1fcHNldWRvUnVsZXMsIHJ1bGUsIHNl
bCk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBjb25zdCBBdG9taWNTdHJpbmcmIGxv
Y2FsTmFtZSA9IHNlbC0+bV90YWcubG9jYWxOYW1lKCk7CisgICAgY29uc3QgQXRvbWljU3RyaW5n
JiBsb2NhbE5hbWUgPSBzZWwtPnRhZygpLmxvY2FsTmFtZSgpOwogICAgIGlmIChsb2NhbE5hbWUg
IT0gc3RhckF0b20pIHsKICAgICAgICAgYWRkVG9SdWxlU2V0KGxvY2FsTmFtZS5pbXBsKCksIG1f
dGFnUnVsZXMsIHJ1bGUsIHNlbCk7CiAgICAgICAgIHJldHVybjsKQEAgLTMwMDUsMTIgKzMwMDUs
MTIgQEAgc3RhdGljIHZvaWQgY29sbGVjdElkc0FuZFNpYmxpbmdSdWxlc0ZybwogICAgIGZvciAo
Q1NTUnVsZURhdGEqIGRhdGEgPSBydWxlcy0+Zmlyc3QoKTsgZGF0YTsgZGF0YSA9IGRhdGEtPm5l
eHQoKSkgewogICAgICAgICBib29sIGZvdW5kU2libGluZ1NlbGVjdG9yID0gZmFsc2U7CiAgICAg
ICAgIGZvciAoQ1NTU2VsZWN0b3IqIHNlbGVjdG9yID0gZGF0YS0+c2VsZWN0b3IoKTsgc2VsZWN0
b3I7IHNlbGVjdG9yID0gc2VsZWN0b3ItPnRhZ0hpc3RvcnkoKSkgewotICAgICAgICAgICAgaWYg
KHNlbGVjdG9yLT5tX21hdGNoID09IENTU1NlbGVjdG9yOjpJZCAmJiAhc2VsZWN0b3ItPm1fdmFs
dWUuaXNFbXB0eSgpKQotICAgICAgICAgICAgICAgIGlkcy5hZGQoc2VsZWN0b3ItPm1fdmFsdWUu
aW1wbCgpKTsKKyAgICAgICAgICAgIGlmIChzZWxlY3Rvci0+bV9tYXRjaCA9PSBDU1NTZWxlY3Rv
cjo6SWQgJiYgIXNlbGVjdG9yLT52YWx1ZSgpLmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICBp
ZHMuYWRkKHNlbGVjdG9yLT52YWx1ZSgpLmltcGwoKSk7CiAgICAgICAgICAgICBpZiAoQ1NTU2Vs
ZWN0b3IqIHNpbXBsZVNlbGVjdG9yID0gc2VsZWN0b3ItPnNpbXBsZVNlbGVjdG9yKCkpIHsKICAg
ICAgICAgICAgICAgICBBU1NFUlQoIXNpbXBsZVNlbGVjdG9yLT5zaW1wbGVTZWxlY3RvcigpKTsK
LSAgICAgICAgICAgICAgICBpZiAoc2ltcGxlU2VsZWN0b3ItPm1fbWF0Y2ggPT0gQ1NTU2VsZWN0
b3I6OklkICYmICFzaW1wbGVTZWxlY3Rvci0+bV92YWx1ZS5pc0VtcHR5KCkpCi0gICAgICAgICAg
ICAgICAgICAgIGlkcy5hZGQoc2ltcGxlU2VsZWN0b3ItPm1fdmFsdWUuaW1wbCgpKTsKKyAgICAg
ICAgICAgICAgICBpZiAoc2ltcGxlU2VsZWN0b3ItPm1fbWF0Y2ggPT0gQ1NTU2VsZWN0b3I6Oklk
ICYmICFzaW1wbGVTZWxlY3Rvci0+dmFsdWUoKS5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAg
ICAgIGlkcy5hZGQoc2ltcGxlU2VsZWN0b3ItPnZhbHVlKCkuaW1wbCgpKTsKICAgICAgICAgICAg
IH0KICAgICAgICAgICAgIGlmIChzZWxlY3Rvci0+aXNTaWJsaW5nU2VsZWN0b3IoKSkKICAgICAg
ICAgICAgICAgICBmb3VuZFNpYmxpbmdTZWxlY3RvciA9IHRydWU7CkBAIC0zMTM1LDcgKzMxMzUs
NyBAQCB2b2lkIENTU1N0eWxlU2VsZWN0b3I6Om1hdGNoUGFnZVJ1bGVzRm9yCiAKICAgICBmb3Ig
KENTU1J1bGVEYXRhKiBkID0gcnVsZXMtPmZpcnN0KCk7IGQ7IGQgPSBkLT5uZXh0KCkpIHsKICAg
ICAgICAgQ1NTU3R5bGVSdWxlKiBydWxlID0gZC0+cnVsZSgpOwotICAgICAgICBjb25zdCBBdG9t
aWNTdHJpbmcmIHNlbGVjdG9yTG9jYWxOYW1lID0gZC0+c2VsZWN0b3IoKS0+bV90YWcubG9jYWxO
YW1lKCk7CisgICAgICAgIGNvbnN0IEF0b21pY1N0cmluZyYgc2VsZWN0b3JMb2NhbE5hbWUgPSBk
LT5zZWxlY3RvcigpLT50YWcoKS5sb2NhbE5hbWUoKTsKICAgICAgICAgaWYgKHNlbGVjdG9yTG9j
YWxOYW1lICE9IHN0YXJBdG9tICYmIHNlbGVjdG9yTG9jYWxOYW1lICE9IHBhZ2VOYW1lKQogICAg
ICAgICAgICAgY29udGludWU7CiAgICAgICAgIENTU1NlbGVjdG9yOjpQc2V1ZG9UeXBlIHBzZXVk
b1R5cGUgPSBkLT5zZWxlY3RvcigpLT5wc2V1ZG9UeXBlKCk7CkluZGV4OiBTb3VyY2UvV2ViQ29y
ZS9kb20vTm9kZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvZG9tL05vZGUuY3Bw
CShyZXZpc2lvbiA3NjU2NSkKKysrIFNvdXJjZS9XZWJDb3JlL2RvbS9Ob2RlLmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtMTYzNiw3ICsxNjM2LDcgQEAgUGFzc1JlZlB0cjxFbGVtZW50PiBOb2RlOjpx
dWVyeVNlbGVjdG9yKAogCiAgICAgLy8gRklYTUU6IHdlIGNvdWxkIGFsc28gb3B0aW1pemUgZm9y
IHRoZSB0aGUgW2lkPSJmb28iXSBjYXNlCiAgICAgaWYgKHN0cmljdFBhcnNpbmcgJiYgaW5Eb2N1
bWVudCgpICYmIHF1ZXJ5U2VsZWN0b3JMaXN0Lmhhc09uZVNlbGVjdG9yKCkgJiYgcXVlcnlTZWxl
Y3Rvckxpc3QuZmlyc3QoKS0+bV9tYXRjaCA9PSBDU1NTZWxlY3Rvcjo6SWQpIHsKLSAgICAgICAg
RWxlbWVudCogZWxlbWVudCA9IGRvY3VtZW50KCktPmdldEVsZW1lbnRCeUlkKHF1ZXJ5U2VsZWN0
b3JMaXN0LmZpcnN0KCktPm1fdmFsdWUpOworICAgICAgICBFbGVtZW50KiBlbGVtZW50ID0gZG9j
dW1lbnQoKS0+Z2V0RWxlbWVudEJ5SWQocXVlcnlTZWxlY3Rvckxpc3QuZmlyc3QoKS0+dmFsdWUo
KSk7CiAgICAgICAgIGlmIChlbGVtZW50ICYmIChpc0RvY3VtZW50Tm9kZSgpIHx8IGVsZW1lbnQt
PmlzRGVzY2VuZGFudE9mKHRoaXMpKSAmJiBzZWxlY3RvckNoZWNrZXIuY2hlY2tTZWxlY3Rvcihx
dWVyeVNlbGVjdG9yTGlzdC5maXJzdCgpLCBlbGVtZW50KSkKICAgICAgICAgICAgIHJldHVybiBl
bGVtZW50OwogICAgICAgICByZXR1cm4gMDsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2RvbS9TZWxl
Y3Rvck5vZGVMaXN0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9kb20vU2VsZWN0
b3JOb2RlTGlzdC5jcHAJKHJldmlzaW9uIDc2NTY1KQorKysgU291cmNlL1dlYkNvcmUvZG9tL1Nl
bGVjdG9yTm9kZUxpc3QuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01MCw4ICs1MCw4IEBAIFBhc3NS
ZWZQdHI8U3RhdGljTm9kZUxpc3Q+IGNyZWF0ZVNlbGVjdG8KIAogICAgIENTU1N0eWxlU2VsZWN0
b3I6OlNlbGVjdG9yQ2hlY2tlciBzZWxlY3RvckNoZWNrZXIoZG9jdW1lbnQsIHN0cmljdFBhcnNp
bmcpOwogCi0gICAgaWYgKHN0cmljdFBhcnNpbmcgJiYgcm9vdE5vZGUtPmluRG9jdW1lbnQoKSAm
JiBvbmx5U2VsZWN0b3IgJiYgb25seVNlbGVjdG9yLT5tX21hdGNoID09IENTU1NlbGVjdG9yOjpJ
ZCAmJiAhZG9jdW1lbnQtPmNvbnRhaW5zTXVsdGlwbGVFbGVtZW50c1dpdGhJZChvbmx5U2VsZWN0
b3ItPm1fdmFsdWUpKSB7Ci0gICAgICAgIEVsZW1lbnQqIGVsZW1lbnQgPSBkb2N1bWVudC0+Z2V0
RWxlbWVudEJ5SWQob25seVNlbGVjdG9yLT5tX3ZhbHVlKTsKKyAgICBpZiAoc3RyaWN0UGFyc2lu
ZyAmJiByb290Tm9kZS0+aW5Eb2N1bWVudCgpICYmIG9ubHlTZWxlY3RvciAmJiBvbmx5U2VsZWN0
b3ItPm1fbWF0Y2ggPT0gQ1NTU2VsZWN0b3I6OklkICYmICFkb2N1bWVudC0+Y29udGFpbnNNdWx0
aXBsZUVsZW1lbnRzV2l0aElkKG9ubHlTZWxlY3Rvci0+dmFsdWUoKSkpIHsKKyAgICAgICAgRWxl
bWVudCogZWxlbWVudCA9IGRvY3VtZW50LT5nZXRFbGVtZW50QnlJZChvbmx5U2VsZWN0b3ItPnZh
bHVlKCkpOwogICAgICAgICBpZiAoZWxlbWVudCAmJiAocm9vdE5vZGUtPmlzRG9jdW1lbnROb2Rl
KCkgfHwgZWxlbWVudC0+aXNEZXNjZW5kYW50T2Yocm9vdE5vZGUpKSAmJiBzZWxlY3RvckNoZWNr
ZXIuY2hlY2tTZWxlY3Rvcihvbmx5U2VsZWN0b3IsIGVsZW1lbnQpKQogICAgICAgICAgICAgbm9k
ZXMuYXBwZW5kKGVsZW1lbnQpOwogICAgIH0gZWxzZSB7Cg==
</data>
<flag name="review"
          id="71468"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
      

    </bug>

</bugzilla>