<?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>228724</bug_id>
          
          <creation_ts>2021-08-02 16:41:39 -0700</creation_ts>
          <short_desc>Stop tracking form control elements in FormController</short_desc>
          <delta_ts>2021-08-05 20:10:50 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Forms</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Cameron McCormack (:heycam)">heycam</reporter>
          <assigned_to name="Cameron McCormack (:heycam)">heycam</assigned_to>
          <cc>achristensen</cc>
    
    <cc>cdumez</cc>
    
    <cc>changseok</cc>
    
    <cc>cmarcelo</cc>
    
    <cc>darin</cc>
    
    <cc>esprehn+autocc</cc>
    
    <cc>ews-watchlist</cc>
    
    <cc>gyuyoung.kim</cc>
    
    <cc>kangil.han</cc>
    
    <cc>mifenton</cc>
    
    <cc>rniwa</cc>
    
    <cc>webkit-bug-importer</cc>
    
    <cc>wenson_hsieh</cc>
    
    <cc>ysuzuki</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1781458</commentid>
    <comment_count>0</comment_count>
    <who name="Cameron McCormack (:heycam)">heycam</who>
    <bug_when>2021-08-02 16:41:39 -0700</bug_when>
    <thetext>The FormController::m_formElementsWithState ListHashSet accesses show up in Speedometer profiles.  Form control elements are only ever associated with a single FormController, so instead we can place them in their own linked list and avoid having the HashSet.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1781459</commentid>
    <comment_count>1</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2021-08-02 16:41:51 -0700</bug_when>
    <thetext>&lt;rdar://problem/81435095&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1781479</commentid>
    <comment_count>2</comment_count>
      <attachid>434807</attachid>
    <who name="Cameron McCormack (:heycam)">heycam</who>
    <bug_when>2021-08-02 17:17:17 -0700</bug_when>
    <thetext>Created attachment 434807
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1781486</commentid>
    <comment_count>3</comment_count>
    <who name="Cameron McCormack (:heycam)">heycam</who>
    <bug_when>2021-08-02 17:43:31 -0700</bug_when>
    <thetext>(Debug build errors just need some &quot;.&quot; / &quot;-&gt;&quot; replacement and probably moving that debug-only function to a member function so the friendship works.)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1781487</commentid>
    <comment_count>4</comment_count>
      <attachid>434807</attachid>
    <who name="Alex Christensen">achristensen</who>
    <bug_when>2021-08-02 17:47:57 -0700</bug_when>
    <thetext>Comment on attachment 434807
Patch

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

I&apos;m not very familiar with this code.  How do we know that a HTMLFormControlElementWithState can&apos;t be in the list of. more than one FormController at the same time?
Adding raw pointers like this has to be perfect and future proof so nobody comes along later and adds code that introduces use-after-free bugs.  Is there a way we could instead do something like add T* m_prev and m_next to DoublyLinkedListNode instead?

&gt; Source/WebCore/html/FormController.cpp:351
&gt; +        element-&gt;setNext(0);

WebKit style prefers nullptr instead of 0.

&gt; Source/WebCore/html/FormController.cpp:527
&gt; +    control.setNext(0);

ditto

&gt; Source/WebCore/html/HTMLFormControlElementWithState.h:59
&gt; +    HTMLFormControlElementWithState* m_prev;

These should have an initializer list { nullptr } so we don&apos;t accidentally use uninitialized memory.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1781491</commentid>
    <comment_count>5</comment_count>
    <who name="Cameron McCormack (:heycam)">heycam</who>
    <bug_when>2021-08-02 18:02:08 -0700</bug_when>
    <thetext>(In reply to Alex Christensen from comment #4)
&gt; I&apos;m not very familiar with this code.  How do we know that a
&gt; HTMLFormControlElementWithState can&apos;t be in the list of. more than one
&gt; FormController at the same time?

A Document has a unique FormController that doesn&apos;t change, and we only associate and de-associate an HTMLFormControlElementWithState with the FormController when the element is inserted into and removed from a document, and the element can only be inserted into one document at a time.

Existing assertions don&apos;t check that an HTMLFormControlElementWithState is inserted into only one FormController, but the assertions in the patch here should.

&gt; Adding raw pointers like this has to be perfect and future proof so nobody
&gt; comes along later and adds code that introduces use-after-free bugs.  Is
&gt; there a way we could instead do something like add T* m_prev and m_next to
&gt; DoublyLinkedListNode instead?

It looks like the purpose of DoublyLinkedListNode is to give the consumer freedom about where to put those fields, but for our case it makes no difference if the fields are in this base class.  So I could add a DoublyLinkedListNodeStorage or something that inherits from DoublyLinkedListNode and has the fields.

In terms of the other manual manipulation of the raw pointers, it would be better if the clearing of the links is done by code in DoublyLinkedList.h.  And even better if the refcounting were done by some version of DoublyLinkedList too.

&gt; &gt; Source/WebCore/html/FormController.cpp:351
&gt; &gt; +        element-&gt;setNext(0);
&gt; 
&gt; WebKit style prefers nullptr instead of 0.

(I copied that style from DoublyLinkedList.h; I will clean that up elsewhere.)

&gt; These should have an initializer list { nullptr } so we don&apos;t accidentally
&gt; use uninitialized memory.

Should&apos;ve done this, yes.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1781492</commentid>
    <comment_count>6</comment_count>
      <attachid>434807</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2021-08-02 18:03:12 -0700</bug_when>
    <thetext>Comment on attachment 434807
Patch

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

I’m tempted to write review+ since I don’t see any significant problems.

&gt; Source/WebCore/ChangeLog:19
&gt; +        DoublyLinkedList doesn&apos;t clear out prev/next pointers when removing
&gt; +        elements, so we do that manually from FormController.

Do you know why? Are other clients relying on that?

&gt; Source/WebCore/ChangeLog:24
&gt; +        Because we store the list links in the HTMLFormElementWithState objects,
&gt; +        and to avoid wasteful refcount traffic (if we made those links RefPtrs),
&gt; +        we must manually ref and deref the objects when adding and removing from
&gt; +        the list.

Should we add a template derived from DoublyLinkedList so the add/remove with ref/deref is done generically?

I’m not thrilled with the DoublyLinkedListNode design where it requires a m_prev and m_next data member and uses friend and such. I’d like to research why it was designed like this at some point.

&gt; Source/WebCore/ChangeLog:26
&gt; +        As a followup, it would be nice if DoublyLinkedList supported iterators.

Would be easy to add!

&gt; Source/WebCore/html/FormController.h:69
&gt; +    size_t m_formElementsWithStateCount { 0 };

I’m not absolutely sure that it’s important to store this count. If we are already going to iterate the list to build a vector of strings, does not seem prohibitively expensive to iterate it a second time to pre-allocate the appropriately sized vector.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1781496</commentid>
    <comment_count>7</comment_count>
    <who name="Cameron McCormack (:heycam)">heycam</who>
    <bug_when>2021-08-02 18:19:59 -0700</bug_when>
    <thetext>(In reply to Cameron McCormack (:heycam) from comment #5)
&gt; (In reply to Alex Christensen from comment #4)
&gt; &gt; These should have an initializer list { nullptr } so we don&apos;t accidentally
&gt; &gt; use uninitialized memory.
&gt; 
&gt; Should&apos;ve done this, yes.

Ah the DoublyLinkedListNode constructor already does this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1781498</commentid>
    <comment_count>8</comment_count>
    <who name="Cameron McCormack (:heycam)">heycam</who>
    <bug_when>2021-08-02 18:24:31 -0700</bug_when>
    <thetext>(In reply to Darin Adler from comment #6)
&gt; &gt; Source/WebCore/ChangeLog:19
&gt; &gt; +        DoublyLinkedList doesn&apos;t clear out prev/next pointers when removing
&gt; &gt; +        elements, so we do that manually from FormController.
&gt; 
&gt; Do you know why? Are other clients relying on that?

The other clients are JSC GC and memory management.  Yusuke, is it important to avoid clearing out the next/prev links in the JSC uses of DoublyLinkedList?

&gt; &gt; Source/WebCore/ChangeLog:24
&gt; &gt; +        Because we store the list links in the HTMLFormElementWithState objects,
&gt; &gt; +        and to avoid wasteful refcount traffic (if we made those links RefPtrs),
&gt; &gt; +        we must manually ref and deref the objects when adding and removing from
&gt; &gt; +        the list.
&gt; 
&gt; Should we add a template derived from DoublyLinkedList so the add/remove
&gt; with ref/deref is done generically?

I will try and see if it feels right.

&gt; I’m not thrilled with the DoublyLinkedListNode design where it requires a
&gt; m_prev and m_next data member and uses friend and such. I’d like to research
&gt; why it was designed like this at some point.

Assume it&apos;s to avoid separate allocations for the linked list nodes, but maybe it&apos;s possible to still avoid that with a different design.

&gt; &gt; Source/WebCore/html/FormController.h:69
&gt; &gt; +    size_t m_formElementsWithStateCount { 0 };
&gt; 
&gt; I’m not absolutely sure that it’s important to store this count. If we are
&gt; already going to iterate the list to build a vector of strings, does not
&gt; seem prohibitively expensive to iterate it a second time to pre-allocate the
&gt; appropriately sized vector.

Probably true.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1781500</commentid>
    <comment_count>9</comment_count>
      <attachid>434807</attachid>
    <who name="Yusuke Suzuki">ysuzuki</who>
    <bug_when>2021-08-02 18:40:17 -0700</bug_when>
    <thetext>Comment on attachment 434807
Patch

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

&gt;&gt; Source/WebCore/ChangeLog:19
&gt;&gt; +        elements, so we do that manually from FormController.
&gt; 
&gt; Do you know why? Are other clients relying on that?

I don&apos;t think there is a specific reason, possibly just because it was not necessary.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1781501</commentid>
    <comment_count>10</comment_count>
      <attachid>434807</attachid>
    <who name="Yusuke Suzuki">ysuzuki</who>
    <bug_when>2021-08-02 18:44:23 -0700</bug_when>
    <thetext>Comment on attachment 434807
Patch

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

&gt;&gt;&gt; Source/WebCore/ChangeLog:19
&gt;&gt;&gt; +        elements, so we do that manually from FormController.
&gt;&gt; 
&gt;&gt; Do you know why? Are other clients relying on that?
&gt; 
&gt; I don&apos;t think there is a specific reason, possibly just because it was not necessary.

But when changing it, can you ensure that all the clients are not accessing `next()` / `prev()` to retrieve next / prev elements after the removal?
Like, if there is a code like this, it will be broken.

while (!m_list.isEmpty()) {
    Node* node = m_list.removeHead();
    Node* next = node-&gt;next();
    Node::destroy(node);
    node = next;
}</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1781562</commentid>
    <comment_count>11</comment_count>
      <attachid>434807</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2021-08-03 00:56:13 -0700</bug_when>
    <thetext>Comment on attachment 434807
Patch

So this will make an existing bug a security bug. I&apos;ll let you know the details privately.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1782128</commentid>
    <comment_count>12</comment_count>
    <who name="Cameron McCormack (:heycam)">heycam</who>
    <bug_when>2021-08-04 20:15:42 -0700</bug_when>
    <thetext>Ryosuke separately pointed out that it&apos;s likely not necessary to keep FormController::m_formElementsWithState up to date throughout the document&apos;s life, and that it might be sufficient to traverse the document to those elements at the time we need to save the form data.  I tried that, and got similar Speedometer speed gains and no adverse effect on PLT5.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1782130</commentid>
    <comment_count>13</comment_count>
    <who name="Cameron McCormack (:heycam)">heycam</who>
    <bug_when>2021-08-04 20:26:22 -0700</bug_when>
    <thetext>(In reply to Cameron McCormack (:heycam) from comment #12)
&gt; Ryosuke separately pointed out that it&apos;s likely not necessary to keep
&gt; FormController::m_formElementsWithState up to date throughout the document&apos;s
&gt; life, and that it might be sufficient to traverse the document to those
&gt; elements at the time we need to save the form data.  I tried that, and got
&gt; similar Speedometer speed gains and no adverse effect on PLT5.

(Which means I&apos;ll abandon plans to improve DoublyLinkedList etc.)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1782131</commentid>
    <comment_count>14</comment_count>
      <attachid>434962</attachid>
    <who name="Cameron McCormack (:heycam)">heycam</who>
    <bug_when>2021-08-04 20:26:43 -0700</bug_when>
    <thetext>Created attachment 434962
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1782136</commentid>
    <comment_count>15</comment_count>
      <attachid>434962</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2021-08-04 21:00:08 -0700</bug_when>
    <thetext>Comment on attachment 434962
Patch

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

Nice solution. A few thoughts, mostly on existing code rather than the new code.

&gt; Source/WebKitLegacy/mac/ChangeLog:9
&gt; +        formElementsCharacterCount is unused and can be removed.

Hooray!

&gt; Source/WebCore/html/FormController.cpp:354
&gt; +std::unique_ptr&lt;FormController::SavedFormStateMap&gt; FormController::createSavedFormStateMap(const Vector&lt;const HTMLFormControlElementWithState*&gt;&amp; controlList)

Maybe not urgent and required for this fix, but noticed all these things:

1) This could be changed to just return SavedFormStateMap since a HashMap is already just a pointer and just a null pointer if the map is empty. Wrapping it in a unique_ptr makes it use slightly more memory, and makes things slightly slower with no benefit that I am aware  of. At the time this code was originally written that may have been necessary since we didn’t have sufficient move semantics for removing that sort of value, but likely it is sufficient now.

2) Similarly, the values in the map could be SavedFormState instead of unique_ptr&lt;SavedFormState&gt;. The issues aren’t identical since SavedFormState has two members, and thus the map would use a bit more memory for empty hash table slots, but I think it’s similarly unnecessary and the code would be tighter without the null check and makeUnique.

3) We could also consider using a lambda instead of a separate function for this, or just inlining it in the function below, since it’s only used in one place.

4) Further, it’s unclear why this creates a map. While it’s true that we will move this into a map after restoring, here when saving, all we do is iterate the map, and all the hashing does is unnecessarily randomize the order of things and possibly discard form elements with equal keys (can that even happen?). I suggest we consider changing it to a Vector. We’ll still make the map in formStatesFromStateVector.

5) If we do items (3) and (4) I think it will become clear that we can just build the vector of strings (&quot;stateVector&quot;) as we go without making another vector as an intermediate state.

This refactoring would simplify things quite a bit.

&gt; Source/WebCore/html/FormController.cpp:382
&gt; +    std::unique_ptr&lt;SavedFormStateMap&gt; stateMap = createSavedFormStateMap(controls);

Should use auto here. Except that if we do what I suggest above, this code will be gone.

&gt; Source/WebCore/html/FormController.cpp:384
&gt; +    stateVector.reserveInitialCapacity(controls.size() * 4);

Ah, the mysterious 4! Only the most expert programmers can understand why this should be 4 and not 3 or 5, and luckily we didn’t leave any clues around in the form of comments to help the others.

Also, I think we want a shrinkToFit after making stateVector.

&gt; Source/WebCore/html/HTMLFormControlElementWithState.cpp:52
&gt; +    m_insertionIndex = 0;

Why do this? I believe it would have no effect if we removed this line of code. Maybe it’s aesthetically appealing to not leave this old value lying around?

I suppose it makes the assertion more valuable.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1782137</commentid>
    <comment_count>16</comment_count>
    <who name="Cameron McCormack (:heycam)">heycam</who>
    <bug_when>2021-08-04 21:04:39 -0700</bug_when>
    <thetext>(In reply to Darin Adler from comment #15)
&gt; &gt; Source/WebCore/html/HTMLFormControlElementWithState.cpp:52
&gt; &gt; +    m_insertionIndex = 0;
&gt; 
&gt; Why do this? I believe it would have no effect if we removed this line of
&gt; code. Maybe it’s aesthetically appealing to not leave this old value lying
&gt; around?
&gt; 
&gt; I suppose it makes the assertion more valuable.

Right.  I could wrap that in an `#if ASSERT_ENABLED` but it&apos;s cheap.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1782254</commentid>
    <comment_count>17</comment_count>
      <attachid>434962</attachid>
    <who name="Alex Christensen">achristensen</who>
    <bug_when>2021-08-05 10:10:44 -0700</bug_when>
    <thetext>Comment on attachment 434962
Patch

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

&gt; Source/WebCore/html/FormController.cpp:375
&gt; +        controls.append(&amp;control);

Since these are never null, you could use a Vector&lt;std::reference_wrapper&lt;const HTMLFormControlElementWithState&gt;&gt; to indicate such.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1782384</commentid>
    <comment_count>18</comment_count>
      <attachid>435036</attachid>
    <who name="Cameron McCormack (:heycam)">heycam</who>
    <bug_when>2021-08-05 16:07:06 -0700</bug_when>
    <thetext>Created attachment 435036
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1782408</commentid>
    <comment_count>19</comment_count>
      <attachid>435036</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2021-08-05 17:36:25 -0700</bug_when>
    <thetext>Comment on attachment 435036
Patch

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

&gt; Source/WebCore/html/FormController.cpp:382
&gt; +    std::unique_ptr&lt;SavedFormStateMap&gt; stateMap = createSavedFormStateMap(controls);

auto

&gt; Source/WebCore/html/FormController.h:56
&gt; -    typedef ListHashSet&lt;RefPtr&lt;HTMLFormControlElementWithState&gt;&gt; FormElementListHashSet;
&gt; +    typedef Vector&lt;std::reference_wrapper&lt;const HTMLFormControlElementWithState&gt;&gt; FormControlVector;

Typically in new code we are using &quot;using&quot; instead of &quot;typedef&quot;.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1782427</commentid>
    <comment_count>20</comment_count>
      <attachid>435048</attachid>
    <who name="Cameron McCormack (:heycam)">heycam</who>
    <bug_when>2021-08-05 19:22:32 -0700</bug_when>
    <thetext>Created attachment 435048
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1782429</commentid>
    <comment_count>21</comment_count>
    <who name="Cameron McCormack (:heycam)">heycam</who>
    <bug_when>2021-08-05 19:24:49 -0700</bug_when>
    <thetext>Filed bug 228854 to capture the earlier assorted FormController.cpp cleanup that Darin suggested.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1782436</commentid>
    <comment_count>22</comment_count>
    <who name="EWS">ews-feeder</who>
    <bug_when>2021-08-05 20:10:46 -0700</bug_when>
    <thetext>Committed r280718 (240309@main): &lt;https://commits.webkit.org/240309@main&gt;

All reviewed patches have been landed. Closing bug and clearing flags on attachment 435048.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>434807</attachid>
            <date>2021-08-02 17:17:17 -0700</date>
            <delta_ts>2021-08-04 20:26:39 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-228724-20210803101716.patch</filename>
            <type>text/plain</type>
            <size>8836</size>
            <attacher name="Cameron McCormack (:heycam)">heycam</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjgwNTIzCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggZGY1ZGFhNzRiMzQ3OWEx
NGJmODEzZDdkN2I5ODg5Y2Y5YTk4MDZhYi4uMWNkMDA2N2M5NGY5MGJkNDdkZjVkNjQwZDQ5MDgz
NDUzOWM3ODZkYSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDQxIEBACisyMDIxLTA4LTAyICBDYW1l
cm9uIE1jQ29ybWFjayAgPGhleWNhbUBhcHBsZS5jb20+CisKKyAgICAgICAgVXNlIGFuIGludHJ1
c2l2ZSBsaW5rZWQgbGlzdCB0byBhc3NvY2lhdGUgZm9ybSBjb250cm9sIGVsZW1lbnRzIHdpdGgg
Rm9ybUNvbnRyb2xsZXIKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcu
Y2dpP2lkPTIyODcyNAorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisg
ICAgICAgIEZvcm1Db250cm9sbGVyIG5lZWRzIHRvIGtub3cgdGhlIHNldCBvZiBmb3JtIGNvbnRy
b2xzIGluIHRoZSBkb2N1bWVudAorICAgICAgICBhbmQgbWFpbnRhaW4gdGhlbSBpbiBpbnNlcnRp
b24gb3JkZXIuICBDdXJyZW50bHkgd2UgdXNlIGEgTGlzdEhhc2hTZXQsCisgICAgICAgIGJ1dCB3
ZSBkb24ndCBoYXZlIGFueSBuZWVkIHRvIGNoZWNrIGZvciBwcmVzZW5jZSBpbiB0aGUgc2V0LiAg
U28gd2UKKyAgICAgICAgY2FuIGNvbnZlcnQgdGhpcyBpbnRvIGEgRG91Ymx5TGlua2VkTGlzdCwg
d2l0aCBsaW5rcyBzdG9yZWQgb24gdGhlCisgICAgICAgIEhUTUxGb3JtRWxlbWVudFdpdGhTdGF0
ZSBvYmplY3RzIHRoZW1zZWx2ZXMsIHRvIGF2b2lkIHRoZSBvdmVyaGVhZCBvZgorICAgICAgICBo
YXNoaW5nLgorCisgICAgICAgIFRoaXMgaXMgYSBzbWFsbCBzcGVlZHVwICgxLTIlKSBvbiBhIGZl
dyBvZiB0aGUgU3BlZWRvbWV0ZXIgc3VidGVzdHMgdGhhdAorICAgICAgICBpbnNlcnQgYW5kIHJl
bW92ZSBtYW55IGlucHV0IGVsZW1lbnRzLgorCisgICAgICAgIERvdWJseUxpbmtlZExpc3QgZG9l
c24ndCBjbGVhciBvdXQgcHJldi9uZXh0IHBvaW50ZXJzIHdoZW4gcmVtb3ZpbmcKKyAgICAgICAg
ZWxlbWVudHMsIHNvIHdlIGRvIHRoYXQgbWFudWFsbHkgZnJvbSBGb3JtQ29udHJvbGxlci4KKwor
ICAgICAgICBCZWNhdXNlIHdlIHN0b3JlIHRoZSBsaXN0IGxpbmtzIGluIHRoZSBIVE1MRm9ybUVs
ZW1lbnRXaXRoU3RhdGUgb2JqZWN0cywKKyAgICAgICAgYW5kIHRvIGF2b2lkIHdhc3RlZnVsIHJl
ZmNvdW50IHRyYWZmaWMgKGlmIHdlIG1hZGUgdGhvc2UgbGlua3MgUmVmUHRycyksCisgICAgICAg
IHdlIG11c3QgbWFudWFsbHkgcmVmIGFuZCBkZXJlZiB0aGUgb2JqZWN0cyB3aGVuIGFkZGluZyBh
bmQgcmVtb3ZpbmcgZnJvbQorICAgICAgICB0aGUgbGlzdC4KKworICAgICAgICBBcyBhIGZvbGxv
d3VwLCBpdCB3b3VsZCBiZSBuaWNlIGlmIERvdWJseUxpbmtlZExpc3Qgc3VwcG9ydGVkIGl0ZXJh
dG9ycy4KKworICAgICAgICAqIGh0bWwvRm9ybUNvbnRyb2xsZXIuY3BwOgorICAgICAgICAoV2Vi
Q29yZTo6Rm9ybUNvbnRyb2xsZXI6On5Gb3JtQ29udHJvbGxlcik6CisgICAgICAgIChXZWJDb3Jl
OjpGb3JtQ29udHJvbGxlcjo6Zm9ybUVsZW1lbnRzQ2hhcmFjdGVyQ291bnQgY29uc3QpOgorICAg
ICAgICAoV2ViQ29yZTo6Rm9ybUNvbnRyb2xsZXI6OmNyZWF0ZVNhdmVkRm9ybVN0YXRlTWFwIGNv
bnN0KToKKyAgICAgICAgKFdlYkNvcmU6OkZvcm1Db250cm9sbGVyOjpmb3JtRWxlbWVudHNTdGF0
ZSBjb25zdCk6CisgICAgICAgIChXZWJDb3JlOjpsaXN0Q29udGFpbnNGb3JtRWxlbWVudCk6Cisg
ICAgICAgIChXZWJDb3JlOjpGb3JtQ29udHJvbGxlcjo6cmVnaXN0ZXJGb3JtRWxlbWVudFdpdGhT
dGF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpGb3JtQ29udHJvbGxlcjo6dW5yZWdpc3RlckZvcm1F
bGVtZW50V2l0aFN0YXRlKToKKyAgICAgICAgKiBodG1sL0Zvcm1Db250cm9sbGVyLmg6CisgICAg
ICAgICogaHRtbC9IVE1MRm9ybUNvbnRyb2xFbGVtZW50V2l0aFN0YXRlLmg6CisKIDIwMjEtMDct
MzEgIE1hY2llaiBTdGFjaG93aWFrICA8bWpzQGFwcGxlLmNvbT4KIAogICAgICAgICBMaXN0QXR0
cmlidXRlVGFyZ2V0T2JzZXJ2ZXIgaXMgbmVlZGxlc3NseSBjcmVhdGVkIGV2ZW4gd2hlbiB0aGVy
ZSBpcyBubyBsaXN0IGF0dHJpYnV0ZQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvaHRtbC9G
b3JtQ29udHJvbGxlci5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9odG1sL0Zvcm1Db250cm9sbGVyLmNw
cAppbmRleCAxMjhjNzY1OTFkNzc5MmEyZmZmNWY1NzNiZjZkYTQ2OWMwOGRmMDNmLi40NzM1NGJh
NWFiZjc4YTVjZmRjM2ExZDRkYTFjYmY5Zjk0YzczZjIwIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2Vi
Q29yZS9odG1sL0Zvcm1Db250cm9sbGVyLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9odG1sL0Zv
cm1Db250cm9sbGVyLmNwcApAQCAtMzQwLDEyICszNDAsMjggQEAgdm9pZCBGb3JtS2V5R2VuZXJh
dG9yOjp3aWxsRGVsZXRlRm9ybShIVE1MRm9ybUVsZW1lbnQqIGZvcm0pCiAKIEZvcm1Db250cm9s
bGVyOjpGb3JtQ29udHJvbGxlcigpID0gZGVmYXVsdDsKIAotRm9ybUNvbnRyb2xsZXI6On5Gb3Jt
Q29udHJvbGxlcigpID0gZGVmYXVsdDsKK0Zvcm1Db250cm9sbGVyOjp+Rm9ybUNvbnRyb2xsZXIo
KQoreworICAgIGF1dG8qIGVsZW1lbnQgPSBtX2Zvcm1FbGVtZW50c1dpdGhTdGF0ZS5oZWFkKCk7
CisgICAgaWYgKCFlbGVtZW50KQorICAgICAgICByZXR1cm47CisKKyAgICBhdXRvKiBuZXh0RWxl
bWVudCA9IGVsZW1lbnQtPm5leHQoKTsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGVsZW1lbnQt
PnNldE5leHQoMCk7CisgICAgICAgIGVsZW1lbnQtPnNldFByZXYoMCk7CisgICAgICAgIGVsZW1l
bnQtPmRlcmVmKCk7CisgICAgICAgIGVsZW1lbnQgPSBuZXh0RWxlbWVudDsKKyAgICAgICAgaWYg
KCFlbGVtZW50KQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIG5leHRFbGVtZW50ID0gZWxl
bWVudC0+bmV4dCgpOworICAgIH0KK30KIAogdW5zaWduZWQgRm9ybUNvbnRyb2xsZXI6OmZvcm1F
bGVtZW50c0NoYXJhY3RlckNvdW50KCkgY29uc3QKIHsKICAgICB1bnNpZ25lZCBjb3VudCA9IDA7
Ci0gICAgZm9yIChhdXRvJiBlbGVtZW50IDogbV9mb3JtRWxlbWVudHNXaXRoU3RhdGUpIHsKKyAg
ICBmb3IgKGF1dG8qIGVsZW1lbnQgPSBtX2Zvcm1FbGVtZW50c1dpdGhTdGF0ZS5oZWFkKCk7IGVs
ZW1lbnQ7IGVsZW1lbnQgPSBlbGVtZW50LT5uZXh0KCkpIHsKICAgICAgICAgaWYgKGVsZW1lbnQt
PmlzVGV4dEZpZWxkKCkpCiAgICAgICAgICAgICBjb3VudCArPSBlbGVtZW50LT5zYXZlRm9ybUNv
bnRyb2xTdGF0ZSgpWzBdLmxlbmd0aCgpOwogICAgIH0KQEAgLTM2MSwxMSArMzc3LDExIEBAIHN0
YXRpYyBTdHJpbmcgZm9ybVN0YXRlU2lnbmF0dXJlKCkKICAgICByZXR1cm4gc2lnbmF0dXJlOwog
fQogCi1zdGQ6OnVuaXF1ZV9wdHI8Rm9ybUNvbnRyb2xsZXI6OlNhdmVkRm9ybVN0YXRlTWFwPiBG
b3JtQ29udHJvbGxlcjo6Y3JlYXRlU2F2ZWRGb3JtU3RhdGVNYXAoY29uc3QgRm9ybUVsZW1lbnRM
aXN0SGFzaFNldCYgY29udHJvbExpc3QpCitzdGQ6OnVuaXF1ZV9wdHI8Rm9ybUNvbnRyb2xsZXI6
OlNhdmVkRm9ybVN0YXRlTWFwPiBGb3JtQ29udHJvbGxlcjo6Y3JlYXRlU2F2ZWRGb3JtU3RhdGVN
YXAoKSBjb25zdAogewogICAgIEZvcm1LZXlHZW5lcmF0b3Iga2V5R2VuZXJhdG9yOwogICAgIGF1
dG8gc3RhdGVNYXAgPSBtYWtlVW5pcXVlPFNhdmVkRm9ybVN0YXRlTWFwPigpOwotICAgIGZvciAo
YXV0byYgY29udHJvbCA6IGNvbnRyb2xMaXN0KSB7CisgICAgZm9yIChhdXRvKiBjb250cm9sID0g
bV9mb3JtRWxlbWVudHNXaXRoU3RhdGUuaGVhZCgpOyBjb250cm9sOyBjb250cm9sID0gY29udHJv
bC0+bmV4dCgpKSB7CiAgICAgICAgIGlmICghY29udHJvbC0+c2hvdWxkU2F2ZUFuZFJlc3RvcmVG
b3JtQ29udHJvbFN0YXRlKCkpCiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgYXV0byYg
Zm9ybVN0YXRlID0gc3RhdGVNYXAtPmFkZChrZXlHZW5lcmF0b3IuZm9ybUtleSgqY29udHJvbCku
aW1wbCgpLCBudWxscHRyKS5pdGVyYXRvci0+dmFsdWU7CkBAIC0zNzgsOSArMzk0LDkgQEAgc3Rk
Ojp1bmlxdWVfcHRyPEZvcm1Db250cm9sbGVyOjpTYXZlZEZvcm1TdGF0ZU1hcD4gRm9ybUNvbnRy
b2xsZXI6OmNyZWF0ZVNhdmVkRm8KIAogVmVjdG9yPFN0cmluZz4gRm9ybUNvbnRyb2xsZXI6OmZv
cm1FbGVtZW50c1N0YXRlKCkgY29uc3QKIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8U2F2ZWRGb3Jt
U3RhdGVNYXA+IHN0YXRlTWFwID0gY3JlYXRlU2F2ZWRGb3JtU3RhdGVNYXAobV9mb3JtRWxlbWVu
dHNXaXRoU3RhdGUpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxTYXZlZEZvcm1TdGF0ZU1hcD4gc3Rh
dGVNYXAgPSBjcmVhdGVTYXZlZEZvcm1TdGF0ZU1hcCgpOwogICAgIFZlY3RvcjxTdHJpbmc+IHN0
YXRlVmVjdG9yOwotICAgIHN0YXRlVmVjdG9yLnJlc2VydmVJbml0aWFsQ2FwYWNpdHkobV9mb3Jt
RWxlbWVudHNXaXRoU3RhdGUuc2l6ZSgpICogNCk7CisgICAgc3RhdGVWZWN0b3IucmVzZXJ2ZUlu
aXRpYWxDYXBhY2l0eShtX2Zvcm1FbGVtZW50c1dpdGhTdGF0ZUNvdW50ICogNCk7CiAgICAgc3Rh
dGVWZWN0b3IuYXBwZW5kKGZvcm1TdGF0ZVNpZ25hdHVyZSgpKTsKICAgICBmb3IgKGF1dG8mIHN0
YXRlIDogKnN0YXRlTWFwKSB7CiAgICAgICAgIHN0YXRlVmVjdG9yLmFwcGVuZChzdGF0ZS5rZXku
Z2V0KCkpOwpAQCAtNDg0LDE2ICs1MDAsMzQgQEAgVmVjdG9yPFN0cmluZz4gRm9ybUNvbnRyb2xs
ZXI6OnJlZmVyZW5jZWRGaWxlUGF0aHMoY29uc3QgVmVjdG9yPFN0cmluZz4mIHN0YXRlVmUKICAg
ICByZXR1cm4gcGF0aHM7CiB9CiAKKyNpZm5kZWYgTkRFQlVHCitzdGF0aWMgYm9vbCBsaXN0Q29u
dGFpbnNGb3JtRWxlbWVudChjb25zdCBEb3VibHlMaW5rZWRMaXN0PEhUTUxGb3JtQ29udHJvbEVs
ZW1lbnRXaXRoU3RhdGU+JiBsaXN0LCBIVE1MRm9ybUNvbnRyb2xFbGVtZW50V2l0aFN0YXRlJiBj
b250cm9sKQoreworICAgIGZvciAoYXV0byBjdXJyZW50Q29udHJvbCA9IGxpc3QuaGVhZCgpOyBj
dXJyZW50Q29udHJvbDsgY3VycmVudENvbnRyb2wgPSBjdXJyZW50Q29udHJvbC0+bmV4dCgpKSB7
CisgICAgICAgIGlmIChjdXJyZW50Q29udHJvbCA9PSAmY29udHJvbCkKKyAgICAgICAgICAgIHJl
dHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisjZW5kaWYKKwogdm9pZCBG
b3JtQ29udHJvbGxlcjo6cmVnaXN0ZXJGb3JtRWxlbWVudFdpdGhTdGF0ZShIVE1MRm9ybUNvbnRy
b2xFbGVtZW50V2l0aFN0YXRlJiBjb250cm9sKQogewotICAgIEFTU0VSVCghbV9mb3JtRWxlbWVu
dHNXaXRoU3RhdGUuY29udGFpbnMoJmNvbnRyb2wpKTsKLSAgICBtX2Zvcm1FbGVtZW50c1dpdGhT
dGF0ZS5hZGQoJmNvbnRyb2wpOworICAgIEFTU0VSVCghY29udHJvbC0+cHJldigpKTsKKyAgICBB
U1NFUlQoIWNvbnRyb2wtPm5leHQoKSk7CisgICAgbV9mb3JtRWxlbWVudHNXaXRoU3RhdGUuYXBw
ZW5kKCZjb250cm9sKTsKKyAgICBjb250cm9sLnJlZigpOworICAgICsrbV9mb3JtRWxlbWVudHNX
aXRoU3RhdGVDb3VudDsKIH0KIAogdm9pZCBGb3JtQ29udHJvbGxlcjo6dW5yZWdpc3RlckZvcm1F
bGVtZW50V2l0aFN0YXRlKEhUTUxGb3JtQ29udHJvbEVsZW1lbnRXaXRoU3RhdGUmIGNvbnRyb2wp
CiB7Ci0gICAgQVNTRVJUKG1fZm9ybUVsZW1lbnRzV2l0aFN0YXRlLmNvbnRhaW5zKCZjb250cm9s
KSk7CisgICAgQVNTRVJUKGxpc3RDb250YWluc0Zvcm1FbGVtZW50KG1fZm9ybUVsZW1lbnRzV2l0
aFN0YXRlLCBjb250cm9sKSk7CiAgICAgbV9mb3JtRWxlbWVudHNXaXRoU3RhdGUucmVtb3ZlKCZj
b250cm9sKTsKKyAgICBjb250cm9sLnNldE5leHQoMCk7CisgICAgY29udHJvbC5zZXRQcmV2KDAp
OworICAgIGNvbnRyb2wuZGVyZWYoKTsKKyAgICAtLW1fZm9ybUVsZW1lbnRzV2l0aFN0YXRlQ291
bnQ7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJD
b3JlL2h0bWwvRm9ybUNvbnRyb2xsZXIuaCBiL1NvdXJjZS9XZWJDb3JlL2h0bWwvRm9ybUNvbnRy
b2xsZXIuaAppbmRleCBhMTM1MmY1ODZiZWZhYTFmNmIwNzEyYjkwZWJmZGZhYmYzYzBhYzg2Li4x
M2ZlMDM4MzYwODYwNzQ4MGY2ZjlmMTUzNWIwNTE5MDQ1MTJmNWIxIDEwMDY0NAotLS0gYS9Tb3Vy
Y2UvV2ViQ29yZS9odG1sL0Zvcm1Db250cm9sbGVyLmgKKysrIGIvU291cmNlL1dlYkNvcmUvaHRt
bC9Gb3JtQ29udHJvbGxlci5oCkBAIC0yMSw2ICsyMSw3IEBACiAKICNwcmFnbWEgb25jZQogCisj
aW5jbHVkZSA8d3RmL0RvdWJseUxpbmtlZExpc3QuaD4KICNpbmNsdWRlIDx3dGYvRm9yd2FyZC5o
PgogI2luY2x1ZGUgPHd0Zi9IYXNoTWFwLmg+CiAjaW5jbHVkZSA8d3RmL0xpc3RIYXNoU2V0Lmg+
CkBAIC01OCwxNCArNTksMTQgQEAgcHVibGljOgogICAgIFdFQkNPUkVfRVhQT1JUIHN0YXRpYyBW
ZWN0b3I8U3RyaW5nPiByZWZlcmVuY2VkRmlsZVBhdGhzKGNvbnN0IFZlY3RvcjxTdHJpbmc+JiBz
dGF0ZVZlY3Rvcik7CiAKIHByaXZhdGU6Ci0gICAgdHlwZWRlZiBMaXN0SGFzaFNldDxSZWZQdHI8
SFRNTEZvcm1Db250cm9sRWxlbWVudFdpdGhTdGF0ZT4+IEZvcm1FbGVtZW50TGlzdEhhc2hTZXQ7
CiAgICAgdHlwZWRlZiBIYXNoTWFwPFJlZlB0cjxBdG9tU3RyaW5nSW1wbD4sIHN0ZDo6dW5pcXVl
X3B0cjxTYXZlZEZvcm1TdGF0ZT4+IFNhdmVkRm9ybVN0YXRlTWFwOwogCi0gICAgc3RhdGljIHN0
ZDo6dW5pcXVlX3B0cjxTYXZlZEZvcm1TdGF0ZU1hcD4gY3JlYXRlU2F2ZWRGb3JtU3RhdGVNYXAo
Y29uc3QgRm9ybUVsZW1lbnRMaXN0SGFzaFNldCYpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxTYXZl
ZEZvcm1TdGF0ZU1hcD4gY3JlYXRlU2F2ZWRGb3JtU3RhdGVNYXAoKSBjb25zdDsKICAgICBGb3Jt
Q29udHJvbFN0YXRlIHRha2VTdGF0ZUZvckZvcm1FbGVtZW50KGNvbnN0IEhUTUxGb3JtQ29udHJv
bEVsZW1lbnRXaXRoU3RhdGUmKTsKICAgICBzdGF0aWMgdm9pZCBmb3JtU3RhdGVzRnJvbVN0YXRl
VmVjdG9yKGNvbnN0IFZlY3RvcjxTdHJpbmc+JiwgU2F2ZWRGb3JtU3RhdGVNYXAmKTsKIAotICAg
IEZvcm1FbGVtZW50TGlzdEhhc2hTZXQgbV9mb3JtRWxlbWVudHNXaXRoU3RhdGU7CisgICAgRG91
Ymx5TGlua2VkTGlzdDxIVE1MRm9ybUNvbnRyb2xFbGVtZW50V2l0aFN0YXRlPiBtX2Zvcm1FbGVt
ZW50c1dpdGhTdGF0ZTsKKyAgICBzaXplX3QgbV9mb3JtRWxlbWVudHNXaXRoU3RhdGVDb3VudCB7
IDAgfTsKICAgICBTYXZlZEZvcm1TdGF0ZU1hcCBtX3NhdmVkRm9ybVN0YXRlTWFwOwogICAgIHN0
ZDo6dW5pcXVlX3B0cjxGb3JtS2V5R2VuZXJhdG9yPiBtX2Zvcm1LZXlHZW5lcmF0b3I7CiB9Owpk
aWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvaHRtbC9IVE1MRm9ybUNvbnRyb2xFbGVtZW50V2l0
aFN0YXRlLmggYi9Tb3VyY2UvV2ViQ29yZS9odG1sL0hUTUxGb3JtQ29udHJvbEVsZW1lbnRXaXRo
U3RhdGUuaAppbmRleCBmYWZiYjhkMzhiM2NmMzFlNjY2MmMxNzUzOWNhN2E3MWY5ZjRkMWU0Li40
NmQ2NTdlMjljYjY2NDMwMDcwMTJmYjVjZDg3MWE5MGE4OTNlN2RlIDEwMDY0NAotLS0gYS9Tb3Vy
Y2UvV2ViQ29yZS9odG1sL0hUTUxGb3JtQ29udHJvbEVsZW1lbnRXaXRoU3RhdGUuaAorKysgYi9T
b3VyY2UvV2ViQ29yZS9odG1sL0hUTUxGb3JtQ29udHJvbEVsZW1lbnRXaXRoU3RhdGUuaApAQCAt
MjQsMTIgKzI0LDEzIEBACiAjcHJhZ21hIG9uY2UKIAogI2luY2x1ZGUgIkhUTUxGb3JtQ29udHJv
bEVsZW1lbnQuaCIKKyNpbmNsdWRlIDx3dGYvRG91Ymx5TGlua2VkTGlzdC5oPgogCiBuYW1lc3Bh
Y2UgV2ViQ29yZSB7CiAKIHVzaW5nIEZvcm1Db250cm9sU3RhdGUgPSBWZWN0b3I8U3RyaW5nPjsK
IAotY2xhc3MgSFRNTEZvcm1Db250cm9sRWxlbWVudFdpdGhTdGF0ZSA6IHB1YmxpYyBIVE1MRm9y
bUNvbnRyb2xFbGVtZW50IHsKK2NsYXNzIEhUTUxGb3JtQ29udHJvbEVsZW1lbnRXaXRoU3RhdGUg
OiBwdWJsaWMgSFRNTEZvcm1Db250cm9sRWxlbWVudCwgcHJpdmF0ZSBEb3VibHlMaW5rZWRMaXN0
Tm9kZTxIVE1MRm9ybUNvbnRyb2xFbGVtZW50V2l0aFN0YXRlPiB7CiAgICAgV1RGX01BS0VfSVNP
X0FMTE9DQVRFRChIVE1MRm9ybUNvbnRyb2xFbGVtZW50V2l0aFN0YXRlKTsKIHB1YmxpYzoKICAg
ICB2aXJ0dWFsIH5IVE1MRm9ybUNvbnRyb2xFbGVtZW50V2l0aFN0YXRlKCk7CkBAIC00OSw3ICs1
MCwxNCBAQCBwcm90ZWN0ZWQ6CiAgICAgdm9pZCByZW1vdmVkRnJvbUFuY2VzdG9yKFJlbW92YWxU
eXBlLCBDb250YWluZXJOb2RlJikgb3ZlcnJpZGU7CiAKIHByaXZhdGU6CisgICAgZnJpZW5kIGNs
YXNzIERvdWJseUxpbmtlZExpc3Q8SFRNTEZvcm1Db250cm9sRWxlbWVudFdpdGhTdGF0ZT47Cisg
ICAgZnJpZW5kIGNsYXNzIERvdWJseUxpbmtlZExpc3ROb2RlPEhUTUxGb3JtQ29udHJvbEVsZW1l
bnRXaXRoU3RhdGU+OworICAgIGZyaWVuZCBjbGFzcyBGb3JtQ29udHJvbGxlcjsKKwogICAgIGJv
b2wgaXNGb3JtQ29udHJvbEVsZW1lbnRXaXRoU3RhdGUoKSBjb25zdCBmaW5hbDsKKworICAgIEhU
TUxGb3JtQ29udHJvbEVsZW1lbnRXaXRoU3RhdGUqIG1fcHJldjsKKyAgICBIVE1MRm9ybUNvbnRy
b2xFbGVtZW50V2l0aFN0YXRlKiBtX25leHQ7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3Jl
Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>434962</attachid>
            <date>2021-08-04 20:26:43 -0700</date>
            <delta_ts>2021-08-05 16:07:01 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-228724-20210805132642.patch</filename>
            <type>text/plain</type>
            <size>14558</size>
            <attacher name="Cameron McCormack (:heycam)">heycam</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjgwNTIzCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggZGY1ZGFhNzRiMzQ3OWEx
NGJmODEzZDdkN2I5ODg5Y2Y5YTk4MDZhYi4uNDE3ZGJiNjY1ODJmMTc5OTVkNmU0ZDU3NjhiZmY1
NzcyMDNlMmNlMyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDQ1IEBACisyMDIxLTA4LTA0ICBDYW1l
cm9uIE1jQ29ybWFjayAgPGhleWNhbUBhcHBsZS5jb20+CisKKyAgICAgICAgU3RvcCB0cmFja2lu
ZyBmb3JtIGVsZW1lbnRzIHdpdGggRm9ybUNvbnRyb2xsZXIKKyAgICAgICAgaHR0cHM6Ly9idWdz
LndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTIyODcyNAorICAgICAgICA8cmRhcjovL3Byb2Js
ZW0vODE0MzUwOTU+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAg
ICAgICAgRm9ybUNvbnRyb2xsZXIgY3VycmVudGx5IHRyYWNrcyB0aGUgaW5zZXJ0aW9uIG9yZGVy
IG9mCisgICAgICAgIEhUTUxGb3JtRWxlbWVudFdpdGhTdGF0ZSBvYmplY3RzIGluIHRoZSBkb2N1
bWVudC4gIEJ1dCB3ZSBkb24ndCBuZWVkCisgICAgICAgIHRvIGtub3cgdGhpcyBsaXN0IG9mIGZv
cm0gY29udHJvbHMgdW50aWwgdGhlIHRpbWUgd2UgbmVlZCB0byBzYXZlCisgICAgICAgIGZvcm0g
c3RhdGUgZm9yIHRoZSBkb2N1bWVudCAoZS5nLiBvbiBwYWdlaGlkZSkuICBTbyB3ZSBpbnN0ZWFk
CisgICAgICAgIHRyYXZlcnNlIHRoZSBkb2N1bWVudCB0byBmaW5kIHRob3NlIGVsZW1lbnRzIGF0
IHRoZSBwb2ludCB3ZSBuZWVkCisgICAgICAgIHRoZW0sIHJhdGhlciB0aGFuIG1haW50YWluIEZv
cm1Db250cm9sbGVyOjptX2Zvcm1FbGVtZW50c1dpdGhTdGF0ZS4KKworICAgICAgICBUaGlzIGlz
IGEgc21hbGwgc3BlZWR1cCAoMS0yJSkgb24gYSBmZXcgb2YgdGhlIFNwZWVkb21ldGVyIHN1YnRl
c3RzCisgICAgICAgIHRoYXQgaW5zZXJ0IGFuZCByZW1vdmUgbWFueSBpbnB1dCBlbGVtZW50cy4K
KworICAgICAgICBBIGZ1dHVyZSBvcHRpbWl6YXRpb24gY291bGQgcmVjb3JkIG9uIHRoZSBEb2N1
bWVudCB3aGV0aGVyIHRoZXJlIGFyZQorICAgICAgICBhbnkgaW5wdXQgZWxlbWVudHMgdGhhdCBo
YXZlIGhhZCB0aGVpciB2YWx1ZSBjaGFuZ2VkLCBzaW5jZSBpdCdzCisgICAgICAgIHByb2JhYmx5
IGNvbW1vbiBmb3IgcGFnZXMgd2l0aCBmb3JtIGNvbnRyb2xzIHRvIG5ldmVyIGJlIGNoYW5nZWQu
CisKKyAgICAgICAgKiBkb20vRG9jdW1lbnQuY3BwOgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1l
bnQ6OmZvcm1FbGVtZW50c1N0YXRlIGNvbnN0KTogVHJhdmVyc2UgdGhlIGRvY3VtZW50IHRvCisg
ICAgICAgIGZpbmQgYWxsIHRoZSBIVE1MRm9ybUVsZW1lbnRXaXRoU3RhdGUgb2JqZWN0cy4KKyAg
ICAgICAgKiBkb20vRWxlbWVudC5oOgorICAgICAgICAoV2ViQ29yZTo6RWxlbWVudDo6aXNGb3Jt
Q29udHJvbEVsZW1lbnRXaXRoU3RhdGUgY29uc3QpOgorICAgICAgICAqIGh0bWwvRm9ybUNvbnRy
b2xsZXIuY3BwOgorICAgICAgICAoV2ViQ29yZTo6Rm9ybUNvbnRyb2xsZXI6OmNyZWF0ZVNhdmVk
Rm9ybVN0YXRlTWFwKToKKyAgICAgICAgKFdlYkNvcmU6OkZvcm1Db250cm9sbGVyOjpmb3JtRWxl
bWVudHNTdGF0ZSBjb25zdCk6CisgICAgICAgICogaHRtbC9Gb3JtQ29udHJvbGxlci5oOgorICAg
ICAgICAqIGh0bWwvSFRNTEZvcm1Db250cm9sRWxlbWVudFdpdGhTdGF0ZS5jcHA6CisgICAgICAg
IChXZWJDb3JlOjpIVE1MRm9ybUNvbnRyb2xFbGVtZW50V2l0aFN0YXRlOjppbnNlcnRlZEludG9B
bmNlc3Rvcik6CisgICAgICAgIFRyYWNrIHRoZSBvcmRlciB0aGF0IEhUTUxGb3JtQ29udHJvbEVs
ZW1lbnRXaXRoU3RhdGUgb2JqZWN0cyBhcmUKKyAgICAgICAgaW5zZXJ0ZWQgaW50byB0aGUgZG9j
dW1lbnQuCisgICAgICAgIChXZWJDb3JlOjpIVE1MRm9ybUNvbnRyb2xFbGVtZW50V2l0aFN0YXRl
OjpyZW1vdmVkRnJvbUFuY2VzdG9yKToKKyAgICAgICAgKiBodG1sL0hUTUxGb3JtQ29udHJvbEVs
ZW1lbnRXaXRoU3RhdGUuaDoKKyAgICAgICAgKFdlYkNvcmU6OkhUTUxGb3JtQ29udHJvbEVsZW1l
bnRXaXRoU3RhdGU6Omluc2VydGlvbkluZGV4IGNvbnN0KToKKyAgICAgICAgKGlzVHlwZSk6Cisg
ICAgICAgICogcGFnZS9GcmFtZS5oOiBSZW1vdmUgdW51c2VkIGZvcm1FbGVtZW50c0NoYXJhY3Rl
ckNvdW50LgorICAgICAgICAqIHBhZ2UvaW9zL0ZyYW1lSU9TLm1tOgorCiAyMDIxLTA3LTMxICBN
YWNpZWogU3RhY2hvd2lhayAgPG1qc0BhcHBsZS5jb20+CiAKICAgICAgICAgTGlzdEF0dHJpYnV0
ZVRhcmdldE9ic2VydmVyIGlzIG5lZWRsZXNzbHkgY3JlYXRlZCBldmVuIHdoZW4gdGhlcmUgaXMg
bm8gbGlzdCBhdHRyaWJ1dGUKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXRMZWdhY3kvbWFjL0No
YW5nZUxvZyBiL1NvdXJjZS9XZWJLaXRMZWdhY3kvbWFjL0NoYW5nZUxvZwppbmRleCAwZGZmNDM4
YzEyMDc1N2YzNjNlMDBkYjgzMjQ3MzVmNTVlMGExYjljLi5lZmNmZDZhNzk3YjhlZTI2YmNkNWU5
ODBiODBhYmU4MzNlMWYzOTcwIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0TGVnYWN5L21hYy9D
aGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYktpdExlZ2FjeS9tYWMvQ2hhbmdlTG9nCkBAIC0xLDMg
KzEsMTYgQEAKKzIwMjEtMDgtMDQgIENhbWVyb24gTWNDb3JtYWNrICA8aGV5Y2FtQGFwcGxlLmNv
bT4KKworICAgICAgICBTdG9wIHRyYWNraW5nIGZvcm0gZWxlbWVudHMgd2l0aCBGb3JtQ29udHJv
bGxlcgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjI4
NzI0CisgICAgICAgIDxyZGFyOi8vcHJvYmxlbS84MTQzNTA5NT4KKworICAgICAgICBSZXZpZXdl
ZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBmb3JtRWxlbWVudHNDaGFyYWN0ZXJDb3Vu
dCBpcyB1bnVzZWQgYW5kIGNhbiBiZSByZW1vdmVkLgorCisgICAgICAgICogV2ViVmlldy9XZWJG
cmFtZS5tbToKKyAgICAgICAgKiBXZWJWaWV3L1dlYkZyYW1lUHJpdmF0ZS5oOgorCiAyMDIxLTA3
LTI5ICBNeWxlcyBDLiBNYXhmaWVsZCAgPG1tYXhmaWVsZEBhcHBsZS5jb20+CiAKICAgICAgICAg
U3RvcCBidWlsZGluZyBXZWJHUFUgYW5kIHRoZSBXSExTTCBjb21waWxlciB0byBkZWNyZWFzZSBi
aW5hcnkgc2l6ZQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvZG9tL0RvY3VtZW50LmNwcCBi
L1NvdXJjZS9XZWJDb3JlL2RvbS9Eb2N1bWVudC5jcHAKaW5kZXggNmVkYTY5NGM2YTgzYTNiZTJm
NGIwZWI4Zjk1NTQ1MDg4NmNkN2UxNi4uODk1ZDMxMzhlOTM1YzQ3YTVlYjNmN2Q4ZTVmMjQ2Y2U4
NmJkODI3MyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvZG9tL0RvY3VtZW50LmNwcAorKysg
Yi9Tb3VyY2UvV2ViQ29yZS9kb20vRG9jdW1lbnQuY3BwCkBAIC0xOTA5LDcgKzE5MDksNyBAQCBW
ZWN0b3I8U3RyaW5nPiBEb2N1bWVudDo6Zm9ybUVsZW1lbnRzU3RhdGUoKSBjb25zdAogewogICAg
IGlmICghbV9mb3JtQ29udHJvbGxlcikKICAgICAgICAgcmV0dXJuIFZlY3RvcjxTdHJpbmc+KCk7
Ci0gICAgcmV0dXJuIG1fZm9ybUNvbnRyb2xsZXItPmZvcm1FbGVtZW50c1N0YXRlKCk7CisgICAg
cmV0dXJuIG1fZm9ybUNvbnRyb2xsZXItPmZvcm1FbGVtZW50c1N0YXRlKCp0aGlzKTsKIH0KIAog
dm9pZCBEb2N1bWVudDo6c2V0U3RhdGVGb3JOZXdGb3JtRWxlbWVudHMoY29uc3QgVmVjdG9yPFN0
cmluZz4mIHN0YXRlVmVjdG9yKQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvZG9tL0VsZW1l
bnQuaCBiL1NvdXJjZS9XZWJDb3JlL2RvbS9FbGVtZW50LmgKaW5kZXggMzc4NzBmYzNkMGIxNjRh
ZjRhNzIwYzIyNDEzMDYzZTEyNTRlOTNhOS4uOWI0MDljYTlmM2Q5OTg3NjVlMjFlZTNlNTcwOWVk
MzY5MzgwNDA2MCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvZG9tL0VsZW1lbnQuaAorKysg
Yi9Tb3VyY2UvV2ViQ29yZS9kb20vRWxlbWVudC5oCkBAIC00NjgsNiArNDY4LDcgQEAgcHVibGlj
OgogI2VuZGlmCiAKICAgICB2aXJ0dWFsIGJvb2wgaXNGb3JtQ29udHJvbEVsZW1lbnQoKSBjb25z
dCB7IHJldHVybiBmYWxzZTsgfQorICAgIHZpcnR1YWwgYm9vbCBpc0Zvcm1Db250cm9sRWxlbWVu
dFdpdGhTdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CiAgICAgdmlydHVhbCBib29sIGlz
U3BpbkJ1dHRvbkVsZW1lbnQoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQogICAgIHZpcnR1YWwg
Ym9vbCBpc1RleHRGb3JtQ29udHJvbEVsZW1lbnQoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQog
ICAgIHZpcnR1YWwgYm9vbCBpc1RleHRGaWVsZCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CmRp
ZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9odG1sL0Zvcm1Db250cm9sbGVyLmNwcCBiL1NvdXJj
ZS9XZWJDb3JlL2h0bWwvRm9ybUNvbnRyb2xsZXIuY3BwCmluZGV4IDEyOGM3NjU5MWQ3NzkyYTJm
ZmY1ZjU3M2JmNmRhNDY5YzA4ZGYwM2YuLmI2ZDI3MjQyYWZmMTQyMzRjMDllOWY2ZjczMjIwNDBk
Zjg5YmZmNDAgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL2h0bWwvRm9ybUNvbnRyb2xsZXIu
Y3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL2h0bWwvRm9ybUNvbnRyb2xsZXIuY3BwCkBAIC0zNDIs
MTYgKzM0Miw2IEBAIEZvcm1Db250cm9sbGVyOjpGb3JtQ29udHJvbGxlcigpID0gZGVmYXVsdDsK
IAogRm9ybUNvbnRyb2xsZXI6On5Gb3JtQ29udHJvbGxlcigpID0gZGVmYXVsdDsKIAotdW5zaWdu
ZWQgRm9ybUNvbnRyb2xsZXI6OmZvcm1FbGVtZW50c0NoYXJhY3RlckNvdW50KCkgY29uc3QKLXsK
LSAgICB1bnNpZ25lZCBjb3VudCA9IDA7Ci0gICAgZm9yIChhdXRvJiBlbGVtZW50IDogbV9mb3Jt
RWxlbWVudHNXaXRoU3RhdGUpIHsKLSAgICAgICAgaWYgKGVsZW1lbnQtPmlzVGV4dEZpZWxkKCkp
Ci0gICAgICAgICAgICBjb3VudCArPSBlbGVtZW50LT5zYXZlRm9ybUNvbnRyb2xTdGF0ZSgpWzBd
Lmxlbmd0aCgpOwotICAgIH0KLSAgICByZXR1cm4gY291bnQ7Ci19Ci0KIHN0YXRpYyBTdHJpbmcg
Zm9ybVN0YXRlU2lnbmF0dXJlKCkKIHsKICAgICAvLyBJbiB0aGUgbGVnYWN5IHZlcnNpb24gb2Yg
c2VyaWFsaXplZCBzdGF0ZSwgdGhlIGZpcnN0IGl0ZW0gd2FzIGEgbmFtZQpAQCAtMzYxLDcgKzM1
MSw3IEBAIHN0YXRpYyBTdHJpbmcgZm9ybVN0YXRlU2lnbmF0dXJlKCkKICAgICByZXR1cm4gc2ln
bmF0dXJlOwogfQogCi1zdGQ6OnVuaXF1ZV9wdHI8Rm9ybUNvbnRyb2xsZXI6OlNhdmVkRm9ybVN0
YXRlTWFwPiBGb3JtQ29udHJvbGxlcjo6Y3JlYXRlU2F2ZWRGb3JtU3RhdGVNYXAoY29uc3QgRm9y
bUVsZW1lbnRMaXN0SGFzaFNldCYgY29udHJvbExpc3QpCitzdGQ6OnVuaXF1ZV9wdHI8Rm9ybUNv
bnRyb2xsZXI6OlNhdmVkRm9ybVN0YXRlTWFwPiBGb3JtQ29udHJvbGxlcjo6Y3JlYXRlU2F2ZWRG
b3JtU3RhdGVNYXAoY29uc3QgVmVjdG9yPGNvbnN0IEhUTUxGb3JtQ29udHJvbEVsZW1lbnRXaXRo
U3RhdGUqPiYgY29udHJvbExpc3QpCiB7CiAgICAgRm9ybUtleUdlbmVyYXRvciBrZXlHZW5lcmF0
b3I7CiAgICAgYXV0byBzdGF0ZU1hcCA9IG1ha2VVbmlxdWU8U2F2ZWRGb3JtU3RhdGVNYXA+KCk7
CkBAIC0zNzYsMTEgKzM2NiwyMiBAQCBzdGQ6OnVuaXF1ZV9wdHI8Rm9ybUNvbnRyb2xsZXI6OlNh
dmVkRm9ybVN0YXRlTWFwPiBGb3JtQ29udHJvbGxlcjo6Y3JlYXRlU2F2ZWRGbwogICAgIHJldHVy
biBzdGF0ZU1hcDsKIH0KIAotVmVjdG9yPFN0cmluZz4gRm9ybUNvbnRyb2xsZXI6OmZvcm1FbGVt
ZW50c1N0YXRlKCkgY29uc3QKK1ZlY3RvcjxTdHJpbmc+IEZvcm1Db250cm9sbGVyOjpmb3JtRWxl
bWVudHNTdGF0ZShjb25zdCBEb2N1bWVudCYgZG9jdW1lbnQpIGNvbnN0CiB7Ci0gICAgc3RkOjp1
bmlxdWVfcHRyPFNhdmVkRm9ybVN0YXRlTWFwPiBzdGF0ZU1hcCA9IGNyZWF0ZVNhdmVkRm9ybVN0
YXRlTWFwKG1fZm9ybUVsZW1lbnRzV2l0aFN0YXRlKTsKKyAgICAvLyBGSVhNRTogV2Ugc2hvdWxk
IGJlIHNhdmluZyB0aGUgc3RhdGUgb2YgZm9ybSBjb250cm9scyBpbiBzaGFkb3cgdHJlZXMsIHRv
by4KKyAgICBWZWN0b3I8Y29uc3QgSFRNTEZvcm1Db250cm9sRWxlbWVudFdpdGhTdGF0ZSo+IGNv
bnRyb2xzOworICAgIGZvciAoYXV0byYgY29udHJvbCA6IGRlc2NlbmRhbnRzT2ZUeXBlPEhUTUxG
b3JtQ29udHJvbEVsZW1lbnRXaXRoU3RhdGU+KGRvY3VtZW50KSkgeworICAgICAgICBBU1NFUlQo
Y29udHJvbC5pbnNlcnRpb25JbmRleCgpKTsKKyAgICAgICAgY29udHJvbHMuYXBwZW5kKCZjb250
cm9sKTsKKyAgICB9CisKKyAgICBzdGQ6OnNvcnQoY29udHJvbHMuYmVnaW4oKSwgY29udHJvbHMu
ZW5kKCksIFtdKGF1dG8gYSwgYXV0byBiKSB7CisgICAgICAgIHJldHVybiBhLT5pbnNlcnRpb25J
bmRleCgpIDwgYi0+aW5zZXJ0aW9uSW5kZXgoKTsKKyAgICB9KTsKKworICAgIHN0ZDo6dW5pcXVl
X3B0cjxTYXZlZEZvcm1TdGF0ZU1hcD4gc3RhdGVNYXAgPSBjcmVhdGVTYXZlZEZvcm1TdGF0ZU1h
cChjb250cm9scyk7CiAgICAgVmVjdG9yPFN0cmluZz4gc3RhdGVWZWN0b3I7Ci0gICAgc3RhdGVW
ZWN0b3IucmVzZXJ2ZUluaXRpYWxDYXBhY2l0eShtX2Zvcm1FbGVtZW50c1dpdGhTdGF0ZS5zaXpl
KCkgKiA0KTsKKyAgICBzdGF0ZVZlY3Rvci5yZXNlcnZlSW5pdGlhbENhcGFjaXR5KGNvbnRyb2xz
LnNpemUoKSAqIDQpOwogICAgIHN0YXRlVmVjdG9yLmFwcGVuZChmb3JtU3RhdGVTaWduYXR1cmUo
KSk7CiAgICAgZm9yIChhdXRvJiBzdGF0ZSA6ICpzdGF0ZU1hcCkgewogICAgICAgICBzdGF0ZVZl
Y3Rvci5hcHBlbmQoc3RhdGUua2V5LmdldCgpKTsKQEAgLTQ4NCwxNiArNDg1LDQgQEAgVmVjdG9y
PFN0cmluZz4gRm9ybUNvbnRyb2xsZXI6OnJlZmVyZW5jZWRGaWxlUGF0aHMoY29uc3QgVmVjdG9y
PFN0cmluZz4mIHN0YXRlVmUKICAgICByZXR1cm4gcGF0aHM7CiB9CiAKLXZvaWQgRm9ybUNvbnRy
b2xsZXI6OnJlZ2lzdGVyRm9ybUVsZW1lbnRXaXRoU3RhdGUoSFRNTEZvcm1Db250cm9sRWxlbWVu
dFdpdGhTdGF0ZSYgY29udHJvbCkKLXsKLSAgICBBU1NFUlQoIW1fZm9ybUVsZW1lbnRzV2l0aFN0
YXRlLmNvbnRhaW5zKCZjb250cm9sKSk7Ci0gICAgbV9mb3JtRWxlbWVudHNXaXRoU3RhdGUuYWRk
KCZjb250cm9sKTsKLX0KLQotdm9pZCBGb3JtQ29udHJvbGxlcjo6dW5yZWdpc3RlckZvcm1FbGVt
ZW50V2l0aFN0YXRlKEhUTUxGb3JtQ29udHJvbEVsZW1lbnRXaXRoU3RhdGUmIGNvbnRyb2wpCi17
Ci0gICAgQVNTRVJUKG1fZm9ybUVsZW1lbnRzV2l0aFN0YXRlLmNvbnRhaW5zKCZjb250cm9sKSk7
Ci0gICAgbV9mb3JtRWxlbWVudHNXaXRoU3RhdGUucmVtb3ZlKCZjb250cm9sKTsKLX0KLQogfSAv
LyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvaHRtbC9Gb3Jt
Q29udHJvbGxlci5oIGIvU291cmNlL1dlYkNvcmUvaHRtbC9Gb3JtQ29udHJvbGxlci5oCmluZGV4
IGExMzUyZjU4NmJlZmFhMWY2YjA3MTJiOTBlYmZkZmFiZjNjMGFjODYuLjkxMGY5MDJkMDhlZGNh
ZWQ5MzRhYzAyYTE5NDJiODljYmIwYWI3N2EgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL2h0
bWwvRm9ybUNvbnRyb2xsZXIuaAorKysgYi9Tb3VyY2UvV2ViQ29yZS9odG1sL0Zvcm1Db250cm9s
bGVyLmgKQEAgLTQyLDEyICs0Miw3IEBAIHB1YmxpYzoKICAgICBGb3JtQ29udHJvbGxlcigpOwog
ICAgIH5Gb3JtQ29udHJvbGxlcigpOwogCi0gICAgdm9pZCByZWdpc3RlckZvcm1FbGVtZW50V2l0
aFN0YXRlKEhUTUxGb3JtQ29udHJvbEVsZW1lbnRXaXRoU3RhdGUmKTsKLSAgICB2b2lkIHVucmVn
aXN0ZXJGb3JtRWxlbWVudFdpdGhTdGF0ZShIVE1MRm9ybUNvbnRyb2xFbGVtZW50V2l0aFN0YXRl
Jik7Ci0KLSAgICB1bnNpZ25lZCBmb3JtRWxlbWVudHNDaGFyYWN0ZXJDb3VudCgpIGNvbnN0Owot
Ci0gICAgVmVjdG9yPFN0cmluZz4gZm9ybUVsZW1lbnRzU3RhdGUoKSBjb25zdDsKKyAgICBWZWN0
b3I8U3RyaW5nPiBmb3JtRWxlbWVudHNTdGF0ZShjb25zdCBEb2N1bWVudCYpIGNvbnN0OwogICAg
IHZvaWQgc2V0U3RhdGVGb3JOZXdGb3JtRWxlbWVudHMoY29uc3QgVmVjdG9yPFN0cmluZz4mKTsK
IAogICAgIHZvaWQgd2lsbERlbGV0ZUZvcm0oSFRNTEZvcm1FbGVtZW50Jik7CkBAIC01OCwxNCAr
NTMsMTIgQEAgcHVibGljOgogICAgIFdFQkNPUkVfRVhQT1JUIHN0YXRpYyBWZWN0b3I8U3RyaW5n
PiByZWZlcmVuY2VkRmlsZVBhdGhzKGNvbnN0IFZlY3RvcjxTdHJpbmc+JiBzdGF0ZVZlY3Rvcik7
CiAKIHByaXZhdGU6Ci0gICAgdHlwZWRlZiBMaXN0SGFzaFNldDxSZWZQdHI8SFRNTEZvcm1Db250
cm9sRWxlbWVudFdpdGhTdGF0ZT4+IEZvcm1FbGVtZW50TGlzdEhhc2hTZXQ7CiAgICAgdHlwZWRl
ZiBIYXNoTWFwPFJlZlB0cjxBdG9tU3RyaW5nSW1wbD4sIHN0ZDo6dW5pcXVlX3B0cjxTYXZlZEZv
cm1TdGF0ZT4+IFNhdmVkRm9ybVN0YXRlTWFwOwogCi0gICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0
cjxTYXZlZEZvcm1TdGF0ZU1hcD4gY3JlYXRlU2F2ZWRGb3JtU3RhdGVNYXAoY29uc3QgRm9ybUVs
ZW1lbnRMaXN0SGFzaFNldCYpOworICAgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8U2F2ZWRGb3Jt
U3RhdGVNYXA+IGNyZWF0ZVNhdmVkRm9ybVN0YXRlTWFwKGNvbnN0IFZlY3Rvcjxjb25zdCBIVE1M
Rm9ybUNvbnRyb2xFbGVtZW50V2l0aFN0YXRlKj4mKTsKICAgICBGb3JtQ29udHJvbFN0YXRlIHRh
a2VTdGF0ZUZvckZvcm1FbGVtZW50KGNvbnN0IEhUTUxGb3JtQ29udHJvbEVsZW1lbnRXaXRoU3Rh
dGUmKTsKICAgICBzdGF0aWMgdm9pZCBmb3JtU3RhdGVzRnJvbVN0YXRlVmVjdG9yKGNvbnN0IFZl
Y3RvcjxTdHJpbmc+JiwgU2F2ZWRGb3JtU3RhdGVNYXAmKTsKIAotICAgIEZvcm1FbGVtZW50TGlz
dEhhc2hTZXQgbV9mb3JtRWxlbWVudHNXaXRoU3RhdGU7CiAgICAgU2F2ZWRGb3JtU3RhdGVNYXAg
bV9zYXZlZEZvcm1TdGF0ZU1hcDsKICAgICBzdGQ6OnVuaXF1ZV9wdHI8Rm9ybUtleUdlbmVyYXRv
cj4gbV9mb3JtS2V5R2VuZXJhdG9yOwogfTsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2h0
bWwvSFRNTEZvcm1Db250cm9sRWxlbWVudFdpdGhTdGF0ZS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9o
dG1sL0hUTUxGb3JtQ29udHJvbEVsZW1lbnRXaXRoU3RhdGUuY3BwCmluZGV4IGU5YTI4NTI0Nzdk
MGFlYmJjZGNkZjgxNjk5NGI0OTE3ZTg0MDIxMDguLjIwZWQ4M2Y2NjhjNTcxNjc0NGRjNDI3NTNi
ZjNhYTY4ZTFkNjY1MGQgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL2h0bWwvSFRNTEZvcm1D
b250cm9sRWxlbWVudFdpdGhTdGF0ZS5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvaHRtbC9IVE1M
Rm9ybUNvbnRyb2xFbGVtZW50V2l0aFN0YXRlLmNwcApAQCAtNDMsMTUgKzQzLDEzIEBAIEhUTUxG
b3JtQ29udHJvbEVsZW1lbnRXaXRoU3RhdGU6On5IVE1MRm9ybUNvbnRyb2xFbGVtZW50V2l0aFN0
YXRlKCkgPSBkZWZhdWx0OwogCiBOb2RlOjpJbnNlcnRlZEludG9BbmNlc3RvclJlc3VsdCBIVE1M
Rm9ybUNvbnRyb2xFbGVtZW50V2l0aFN0YXRlOjppbnNlcnRlZEludG9BbmNlc3RvcihJbnNlcnRp
b25UeXBlIGluc2VydGlvblR5cGUsIENvbnRhaW5lck5vZGUmIHBhcmVudE9mSW5zZXJ0ZWRUcmVl
KQogewotICAgIGlmIChpbnNlcnRpb25UeXBlLmNvbm5lY3RlZFRvRG9jdW1lbnQgJiYgIWNvbnRh
aW5pbmdTaGFkb3dSb290KCkpCi0gICAgICAgIGRvY3VtZW50KCkuZm9ybUNvbnRyb2xsZXIoKS5y
ZWdpc3RlckZvcm1FbGVtZW50V2l0aFN0YXRlKCp0aGlzKTsKKyAgICBtX2luc2VydGlvbkluZGV4
ID0gKytsYXN0SW5zZXJ0aW9uSW5kZXg7CiAgICAgcmV0dXJuIEhUTUxGb3JtQ29udHJvbEVsZW1l
bnQ6Omluc2VydGVkSW50b0FuY2VzdG9yKGluc2VydGlvblR5cGUsIHBhcmVudE9mSW5zZXJ0ZWRU
cmVlKTsKIH0KIAogdm9pZCBIVE1MRm9ybUNvbnRyb2xFbGVtZW50V2l0aFN0YXRlOjpyZW1vdmVk
RnJvbUFuY2VzdG9yKFJlbW92YWxUeXBlIHJlbW92YWxUeXBlLCBDb250YWluZXJOb2RlJiBvbGRQ
YXJlbnRPZlJlbW92ZWRUcmVlKQogewotICAgIGlmIChyZW1vdmFsVHlwZS5kaXNjb25uZWN0ZWRG
cm9tRG9jdW1lbnQgJiYgIWNvbnRhaW5pbmdTaGFkb3dSb290KCkgJiYgIW9sZFBhcmVudE9mUmVt
b3ZlZFRyZWUuY29udGFpbmluZ1NoYWRvd1Jvb3QoKSkKLSAgICAgICAgZG9jdW1lbnQoKS5mb3Jt
Q29udHJvbGxlcigpLnVucmVnaXN0ZXJGb3JtRWxlbWVudFdpdGhTdGF0ZSgqdGhpcyk7CisgICAg
bV9pbnNlcnRpb25JbmRleCA9IDA7CiAgICAgSFRNTEZvcm1Db250cm9sRWxlbWVudDo6cmVtb3Zl
ZEZyb21BbmNlc3RvcihyZW1vdmFsVHlwZSwgb2xkUGFyZW50T2ZSZW1vdmVkVHJlZSk7CiB9CiAK
QEAgLTg0LDQgKzgyLDYgQEAgYm9vbCBIVE1MRm9ybUNvbnRyb2xFbGVtZW50V2l0aFN0YXRlOjpp
c0Zvcm1Db250cm9sRWxlbWVudFdpdGhTdGF0ZSgpIGNvbnN0CiAgICAgcmV0dXJuIHRydWU7CiB9
CiAKK3VpbnQ2NF90IEhUTUxGb3JtQ29udHJvbEVsZW1lbnRXaXRoU3RhdGU6Omxhc3RJbnNlcnRp
b25JbmRleCB7IDAgfTsKKwogfSAvLyBuYW1lc3BhY2UgV2ViY29yZQpkaWZmIC0tZ2l0IGEvU291
cmNlL1dlYkNvcmUvaHRtbC9IVE1MRm9ybUNvbnRyb2xFbGVtZW50V2l0aFN0YXRlLmggYi9Tb3Vy
Y2UvV2ViQ29yZS9odG1sL0hUTUxGb3JtQ29udHJvbEVsZW1lbnRXaXRoU3RhdGUuaAppbmRleCBm
YWZiYjhkMzhiM2NmMzFlNjY2MmMxNzUzOWNhN2E3MWY5ZjRkMWU0Li4zOTZhYzRhYzUxNjkxODQ0
MzI0Y2M3NGMyODAxNDM5NGUyZjA3NGY3IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9odG1s
L0hUTUxGb3JtQ29udHJvbEVsZW1lbnRXaXRoU3RhdGUuaAorKysgYi9Tb3VyY2UvV2ViQ29yZS9o
dG1sL0hUTUxGb3JtQ29udHJvbEVsZW1lbnRXaXRoU3RhdGUuaApAQCAtMzgsNiArMzgsOCBAQCBw
dWJsaWM6CiAgICAgdmlydHVhbCBGb3JtQ29udHJvbFN0YXRlIHNhdmVGb3JtQ29udHJvbFN0YXRl
KCkgY29uc3Q7CiAgICAgdmlydHVhbCB2b2lkIHJlc3RvcmVGb3JtQ29udHJvbFN0YXRlKGNvbnN0
IEZvcm1Db250cm9sU3RhdGUmKSB7IH0gLy8gQ2FsbGVkIG9ubHkgaWYgc3RhdGUgaXMgbm90IGVt
cHR5LgogCisgICAgdWludDY0X3QgaW5zZXJ0aW9uSW5kZXgoKSBjb25zdCB7IHJldHVybiBtX2lu
c2VydGlvbkluZGV4OyB9CisKIHByb3RlY3RlZDoKICAgICBIVE1MRm9ybUNvbnRyb2xFbGVtZW50
V2l0aFN0YXRlKGNvbnN0IFF1YWxpZmllZE5hbWUmIHRhZ05hbWUsIERvY3VtZW50JiwgSFRNTEZv
cm1FbGVtZW50Kik7CiAKQEAgLTUwLDEwICs1MiwxNSBAQCBwcm90ZWN0ZWQ6CiAKIHByaXZhdGU6
CiAgICAgYm9vbCBpc0Zvcm1Db250cm9sRWxlbWVudFdpdGhTdGF0ZSgpIGNvbnN0IGZpbmFsOwor
CisgICAgdWludDY0X3QgbV9pbnNlcnRpb25JbmRleCB7IDAgfTsKKyAgICBzdGF0aWMgdWludDY0
X3QgbGFzdEluc2VydGlvbkluZGV4OwogfTsKIAogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQogCiBT
UEVDSUFMSVpFX1RZUEVfVFJBSVRTX0JFR0lOKFdlYkNvcmU6OkhUTUxGb3JtQ29udHJvbEVsZW1l
bnRXaXRoU3RhdGUpCisgICAgc3RhdGljIGJvb2wgaXNUeXBlKGNvbnN0IFdlYkNvcmU6OkVsZW1l
bnQmIGVsZW1lbnQpIHsgcmV0dXJuIGVsZW1lbnQuaXNGb3JtQ29udHJvbEVsZW1lbnRXaXRoU3Rh
dGUoKTsgfQorICAgIHN0YXRpYyBib29sIGlzVHlwZShjb25zdCBXZWJDb3JlOjpOb2RlJiBub2Rl
KSB7IHJldHVybiBpczxXZWJDb3JlOjpFbGVtZW50Pihub2RlKSAmJiBpc1R5cGUoZG93bmNhc3Q8
V2ViQ29yZTo6RWxlbWVudD4obm9kZSkpOyB9CiAgICAgc3RhdGljIGJvb2wgaXNUeXBlKGNvbnN0
IFdlYkNvcmU6OkZvcm1Bc3NvY2lhdGVkRWxlbWVudCYgZWxlbWVudCkgeyByZXR1cm4gZWxlbWVu
dC5pc0Zvcm1Db250cm9sRWxlbWVudFdpdGhTdGF0ZSgpOyB9CiBTUEVDSUFMSVpFX1RZUEVfVFJB
SVRTX0VORCgpCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wYWdlL0ZyYW1lLmggYi9Tb3Vy
Y2UvV2ViQ29yZS9wYWdlL0ZyYW1lLmgKaW5kZXggZjBmOWE4YTQyNGM0NjBjZDkzMGFkNWI1NmRl
ZmY1ZGIwOTg0OTVmMC4uMzdjMWNiNmI1ZDc3OWQ1YTNjMmFiZGQ3YTYyNWU5OTAxMWQ5OTcxYyAx
MDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGFnZS9GcmFtZS5oCisrKyBiL1NvdXJjZS9XZWJD
b3JlL3BhZ2UvRnJhbWUuaApAQCAtMjgyLDcgKzI4Miw2IEBAIHB1YmxpYzoKICAgICBXRUJDT1JF
X0VYUE9SVCB2b2lkIHVwZGF0ZUxheW91dCgpIGNvbnN0OwogICAgIFdFQkNPUkVfRVhQT1JUIE5T
UmVjdCBjYXJldFJlY3QoKTsKICAgICBXRUJDT1JFX0VYUE9SVCBOU1JlY3QgcmVjdEZvclNjcm9s
bFRvVmlzaWJsZSgpOwotICAgIFdFQkNPUkVfRVhQT1JUIHVuc2lnbmVkIGZvcm1FbGVtZW50c0No
YXJhY3RlckNvdW50KCkgY29uc3Q7CiAKICAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkg
TGVnYWN5IFdlYktpdC4KICAgICBXRUJDT1JFX0VYUE9SVCB2b2lkIHNldFRpbWVyc1BhdXNlZChi
b29sKTsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BhZ2UvaW9zL0ZyYW1lSU9TLm1tIGIv
U291cmNlL1dlYkNvcmUvcGFnZS9pb3MvRnJhbWVJT1MubW0KaW5kZXggYTQ5OTllMjFmYTJkOTEy
ZGMzMmVlMzlhN2QxZDMyZWVmYTIwODNjNy4uMGEwMzZhMTQ5ZTNhM2UwN2FmMTkyZWYzZWVlNmVi
MjA3OTUwMTVhMSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGFnZS9pb3MvRnJhbWVJT1Mu
bW0KKysrIGIvU291cmNlL1dlYkNvcmUvcGFnZS9pb3MvRnJhbWVJT1MubW0KQEAgLTYyNywxNCAr
NjI3LDYgQEAgTlNSZWN0IEZyYW1lOjpyZWN0Rm9yU2Nyb2xsVG9WaXNpYmxlKCkKICAgICByZXR1
cm4gdW5pb25SZWN0KHNlbGVjdGlvbi52aXNpYmxlU3RhcnQoKS5hYnNvbHV0ZUNhcmV0Qm91bmRz
KCksIHNlbGVjdGlvbi52aXNpYmxlRW5kKCkuYWJzb2x1dGVDYXJldEJvdW5kcygpKTsKIH0KIAot
dW5zaWduZWQgRnJhbWU6OmZvcm1FbGVtZW50c0NoYXJhY3RlckNvdW50KCkgY29uc3QKLXsKLSAg
ICBEb2N1bWVudCogZG9jdW1lbnQgPSB0aGlzLT5kb2N1bWVudCgpOwotICAgIGlmICghZG9jdW1l
bnQpCi0gICAgICAgIHJldHVybiAwOwotICAgIHJldHVybiBkb2N1bWVudC0+Zm9ybUNvbnRyb2xs
ZXIoKS5mb3JtRWxlbWVudHNDaGFyYWN0ZXJDb3VudCgpOwotfQotCiB2b2lkIEZyYW1lOjpzZXRU
aW1lcnNQYXVzZWQoYm9vbCBwYXVzZWQpCiB7CiAgICAgaWYgKCFtX3BhZ2UpCmRpZmYgLS1naXQg
YS9Tb3VyY2UvV2ViS2l0TGVnYWN5L21hYy9XZWJWaWV3L1dlYkZyYW1lLm1tIGIvU291cmNlL1dl
YktpdExlZ2FjeS9tYWMvV2ViVmlldy9XZWJGcmFtZS5tbQppbmRleCBjMDQxOWFmYjcwNTFjZGJk
ZjMwZWExNmUxMjE1ZDMxYTQ1ZDYwZjNkLi4wZDdmMGQyODQ2YThiZmY5OTA1YmRmNDc0N2ZhOTA3
MzEyMDQyNDdiIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0TGVnYWN5L21hYy9XZWJWaWV3L1dl
YkZyYW1lLm1tCisrKyBiL1NvdXJjZS9XZWJLaXRMZWdhY3kvbWFjL1dlYlZpZXcvV2ViRnJhbWUu
bW0KQEAgLTExNjMsMTEgKzExNjMsNiBAQCAtICh2b2lkKV9yZWN1cnNpdmVfcGF1c2VOdWxsRXZl
bnRzRm9yQWxsTmV0c2NhcGVQbHVnaW5zCiAKICNpZiBQTEFURk9STShJT1NfRkFNSUxZKQogCi0t
ICh1bnNpZ25lZClmb3JtRWxlbWVudHNDaGFyYWN0ZXJDb3VudAotewotICAgIHJldHVybiBjb3Jl
KHNlbGYpLT5mb3JtRWxlbWVudHNDaGFyYWN0ZXJDb3VudCgpOwotfQotCiAtICh2b2lkKXNldFRp
bWVvdXRzUGF1c2VkOihCT09MKWZsYWcKIHsKICAgICBpZiAoW3NlbGYgX3dlYkhUTUxEb2N1bWVu
dFZpZXddKSB7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0TGVnYWN5L21hYy9XZWJWaWV3L1dl
YkZyYW1lUHJpdmF0ZS5oIGIvU291cmNlL1dlYktpdExlZ2FjeS9tYWMvV2ViVmlldy9XZWJGcmFt
ZVByaXZhdGUuaAppbmRleCBjZWYxMjJiYmYxYmU5MTY0Yzg0ZjQyMWUxMGVhOTg2MjIwNjI5MTdi
Li5lZDhiNmI2MzZiMGE2ZTU1MDRlMTllOTk1ODQ3NWEzN2U1ZDVkYmUzIDEwMDY0NAotLS0gYS9T
b3VyY2UvV2ViS2l0TGVnYWN5L21hYy9XZWJWaWV3L1dlYkZyYW1lUHJpdmF0ZS5oCisrKyBiL1Nv
dXJjZS9XZWJLaXRMZWdhY3kvbWFjL1dlYlZpZXcvV2ViRnJhbWVQcml2YXRlLmgKQEAgLTk1LDcg
Kzk1LDYgQEAgdHlwZWRlZiBlbnVtIHsKIC0gKEJPT0wpbmVlZHNMYXlvdXQ7IC8vIE5lZWRlZCBm
b3IgTWFpbCA8cmRhcjovL3Byb2JsZW0vNjIyODAzOD4KIC0gKHZvaWQpX3NldExvYWRzU3luY2hy
b25vdXNseTooQk9PTClmbGFnOwogLSAoQk9PTClfbG9hZHNTeW5jaHJvbm91c2x5OwotLSAodW5z
aWduZWQpZm9ybUVsZW1lbnRzQ2hhcmFjdGVyQ291bnQ7CiAtICh2b2lkKXNldFRpbWVvdXRzUGF1
c2VkOihCT09MKWZsYWc7CiAKIC8qIQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>435036</attachid>
            <date>2021-08-05 16:07:06 -0700</date>
            <delta_ts>2021-08-05 19:22:27 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-228724-20210806090704.patch</filename>
            <type>text/plain</type>
            <size>15253</size>
            <attacher name="Cameron McCormack (:heycam)">heycam</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjgwNTIzCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggZGY1ZGFhNzRiMzQ3OWEx
NGJmODEzZDdkN2I5ODg5Y2Y5YTk4MDZhYi4uNDE3ZGJiNjY1ODJmMTc5OTVkNmU0ZDU3NjhiZmY1
NzcyMDNlMmNlMyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDQ1IEBACisyMDIxLTA4LTA0ICBDYW1l
cm9uIE1jQ29ybWFjayAgPGhleWNhbUBhcHBsZS5jb20+CisKKyAgICAgICAgU3RvcCB0cmFja2lu
ZyBmb3JtIGVsZW1lbnRzIHdpdGggRm9ybUNvbnRyb2xsZXIKKyAgICAgICAgaHR0cHM6Ly9idWdz
LndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTIyODcyNAorICAgICAgICA8cmRhcjovL3Byb2Js
ZW0vODE0MzUwOTU+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAg
ICAgICAgRm9ybUNvbnRyb2xsZXIgY3VycmVudGx5IHRyYWNrcyB0aGUgaW5zZXJ0aW9uIG9yZGVy
IG9mCisgICAgICAgIEhUTUxGb3JtRWxlbWVudFdpdGhTdGF0ZSBvYmplY3RzIGluIHRoZSBkb2N1
bWVudC4gIEJ1dCB3ZSBkb24ndCBuZWVkCisgICAgICAgIHRvIGtub3cgdGhpcyBsaXN0IG9mIGZv
cm0gY29udHJvbHMgdW50aWwgdGhlIHRpbWUgd2UgbmVlZCB0byBzYXZlCisgICAgICAgIGZvcm0g
c3RhdGUgZm9yIHRoZSBkb2N1bWVudCAoZS5nLiBvbiBwYWdlaGlkZSkuICBTbyB3ZSBpbnN0ZWFk
CisgICAgICAgIHRyYXZlcnNlIHRoZSBkb2N1bWVudCB0byBmaW5kIHRob3NlIGVsZW1lbnRzIGF0
IHRoZSBwb2ludCB3ZSBuZWVkCisgICAgICAgIHRoZW0sIHJhdGhlciB0aGFuIG1haW50YWluIEZv
cm1Db250cm9sbGVyOjptX2Zvcm1FbGVtZW50c1dpdGhTdGF0ZS4KKworICAgICAgICBUaGlzIGlz
IGEgc21hbGwgc3BlZWR1cCAoMS0yJSkgb24gYSBmZXcgb2YgdGhlIFNwZWVkb21ldGVyIHN1YnRl
c3RzCisgICAgICAgIHRoYXQgaW5zZXJ0IGFuZCByZW1vdmUgbWFueSBpbnB1dCBlbGVtZW50cy4K
KworICAgICAgICBBIGZ1dHVyZSBvcHRpbWl6YXRpb24gY291bGQgcmVjb3JkIG9uIHRoZSBEb2N1
bWVudCB3aGV0aGVyIHRoZXJlIGFyZQorICAgICAgICBhbnkgaW5wdXQgZWxlbWVudHMgdGhhdCBo
YXZlIGhhZCB0aGVpciB2YWx1ZSBjaGFuZ2VkLCBzaW5jZSBpdCdzCisgICAgICAgIHByb2JhYmx5
IGNvbW1vbiBmb3IgcGFnZXMgd2l0aCBmb3JtIGNvbnRyb2xzIHRvIG5ldmVyIGJlIGNoYW5nZWQu
CisKKyAgICAgICAgKiBkb20vRG9jdW1lbnQuY3BwOgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1l
bnQ6OmZvcm1FbGVtZW50c1N0YXRlIGNvbnN0KTogVHJhdmVyc2UgdGhlIGRvY3VtZW50IHRvCisg
ICAgICAgIGZpbmQgYWxsIHRoZSBIVE1MRm9ybUVsZW1lbnRXaXRoU3RhdGUgb2JqZWN0cy4KKyAg
ICAgICAgKiBkb20vRWxlbWVudC5oOgorICAgICAgICAoV2ViQ29yZTo6RWxlbWVudDo6aXNGb3Jt
Q29udHJvbEVsZW1lbnRXaXRoU3RhdGUgY29uc3QpOgorICAgICAgICAqIGh0bWwvRm9ybUNvbnRy
b2xsZXIuY3BwOgorICAgICAgICAoV2ViQ29yZTo6Rm9ybUNvbnRyb2xsZXI6OmNyZWF0ZVNhdmVk
Rm9ybVN0YXRlTWFwKToKKyAgICAgICAgKFdlYkNvcmU6OkZvcm1Db250cm9sbGVyOjpmb3JtRWxl
bWVudHNTdGF0ZSBjb25zdCk6CisgICAgICAgICogaHRtbC9Gb3JtQ29udHJvbGxlci5oOgorICAg
ICAgICAqIGh0bWwvSFRNTEZvcm1Db250cm9sRWxlbWVudFdpdGhTdGF0ZS5jcHA6CisgICAgICAg
IChXZWJDb3JlOjpIVE1MRm9ybUNvbnRyb2xFbGVtZW50V2l0aFN0YXRlOjppbnNlcnRlZEludG9B
bmNlc3Rvcik6CisgICAgICAgIFRyYWNrIHRoZSBvcmRlciB0aGF0IEhUTUxGb3JtQ29udHJvbEVs
ZW1lbnRXaXRoU3RhdGUgb2JqZWN0cyBhcmUKKyAgICAgICAgaW5zZXJ0ZWQgaW50byB0aGUgZG9j
dW1lbnQuCisgICAgICAgIChXZWJDb3JlOjpIVE1MRm9ybUNvbnRyb2xFbGVtZW50V2l0aFN0YXRl
OjpyZW1vdmVkRnJvbUFuY2VzdG9yKToKKyAgICAgICAgKiBodG1sL0hUTUxGb3JtQ29udHJvbEVs
ZW1lbnRXaXRoU3RhdGUuaDoKKyAgICAgICAgKFdlYkNvcmU6OkhUTUxGb3JtQ29udHJvbEVsZW1l
bnRXaXRoU3RhdGU6Omluc2VydGlvbkluZGV4IGNvbnN0KToKKyAgICAgICAgKGlzVHlwZSk6Cisg
ICAgICAgICogcGFnZS9GcmFtZS5oOiBSZW1vdmUgdW51c2VkIGZvcm1FbGVtZW50c0NoYXJhY3Rl
ckNvdW50LgorICAgICAgICAqIHBhZ2UvaW9zL0ZyYW1lSU9TLm1tOgorCiAyMDIxLTA3LTMxICBN
YWNpZWogU3RhY2hvd2lhayAgPG1qc0BhcHBsZS5jb20+CiAKICAgICAgICAgTGlzdEF0dHJpYnV0
ZVRhcmdldE9ic2VydmVyIGlzIG5lZWRsZXNzbHkgY3JlYXRlZCBldmVuIHdoZW4gdGhlcmUgaXMg
bm8gbGlzdCBhdHRyaWJ1dGUKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXRMZWdhY3kvbWFjL0No
YW5nZUxvZyBiL1NvdXJjZS9XZWJLaXRMZWdhY3kvbWFjL0NoYW5nZUxvZwppbmRleCAwZGZmNDM4
YzEyMDc1N2YzNjNlMDBkYjgzMjQ3MzVmNTVlMGExYjljLi5lZmNmZDZhNzk3YjhlZTI2YmNkNWU5
ODBiODBhYmU4MzNlMWYzOTcwIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0TGVnYWN5L21hYy9D
aGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYktpdExlZ2FjeS9tYWMvQ2hhbmdlTG9nCkBAIC0xLDMg
KzEsMTYgQEAKKzIwMjEtMDgtMDQgIENhbWVyb24gTWNDb3JtYWNrICA8aGV5Y2FtQGFwcGxlLmNv
bT4KKworICAgICAgICBTdG9wIHRyYWNraW5nIGZvcm0gZWxlbWVudHMgd2l0aCBGb3JtQ29udHJv
bGxlcgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjI4
NzI0CisgICAgICAgIDxyZGFyOi8vcHJvYmxlbS84MTQzNTA5NT4KKworICAgICAgICBSZXZpZXdl
ZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBmb3JtRWxlbWVudHNDaGFyYWN0ZXJDb3Vu
dCBpcyB1bnVzZWQgYW5kIGNhbiBiZSByZW1vdmVkLgorCisgICAgICAgICogV2ViVmlldy9XZWJG
cmFtZS5tbToKKyAgICAgICAgKiBXZWJWaWV3L1dlYkZyYW1lUHJpdmF0ZS5oOgorCiAyMDIxLTA3
LTI5ICBNeWxlcyBDLiBNYXhmaWVsZCAgPG1tYXhmaWVsZEBhcHBsZS5jb20+CiAKICAgICAgICAg
U3RvcCBidWlsZGluZyBXZWJHUFUgYW5kIHRoZSBXSExTTCBjb21waWxlciB0byBkZWNyZWFzZSBi
aW5hcnkgc2l6ZQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvZG9tL0RvY3VtZW50LmNwcCBi
L1NvdXJjZS9XZWJDb3JlL2RvbS9Eb2N1bWVudC5jcHAKaW5kZXggNmVkYTY5NGM2YTgzYTNiZTJm
NGIwZWI4Zjk1NTQ1MDg4NmNkN2UxNi4uODk1ZDMxMzhlOTM1YzQ3YTVlYjNmN2Q4ZTVmMjQ2Y2U4
NmJkODI3MyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvZG9tL0RvY3VtZW50LmNwcAorKysg
Yi9Tb3VyY2UvV2ViQ29yZS9kb20vRG9jdW1lbnQuY3BwCkBAIC0xOTA5LDcgKzE5MDksNyBAQCBW
ZWN0b3I8U3RyaW5nPiBEb2N1bWVudDo6Zm9ybUVsZW1lbnRzU3RhdGUoKSBjb25zdAogewogICAg
IGlmICghbV9mb3JtQ29udHJvbGxlcikKICAgICAgICAgcmV0dXJuIFZlY3RvcjxTdHJpbmc+KCk7
Ci0gICAgcmV0dXJuIG1fZm9ybUNvbnRyb2xsZXItPmZvcm1FbGVtZW50c1N0YXRlKCk7CisgICAg
cmV0dXJuIG1fZm9ybUNvbnRyb2xsZXItPmZvcm1FbGVtZW50c1N0YXRlKCp0aGlzKTsKIH0KIAog
dm9pZCBEb2N1bWVudDo6c2V0U3RhdGVGb3JOZXdGb3JtRWxlbWVudHMoY29uc3QgVmVjdG9yPFN0
cmluZz4mIHN0YXRlVmVjdG9yKQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvZG9tL0VsZW1l
bnQuaCBiL1NvdXJjZS9XZWJDb3JlL2RvbS9FbGVtZW50LmgKaW5kZXggMzc4NzBmYzNkMGIxNjRh
ZjRhNzIwYzIyNDEzMDYzZTEyNTRlOTNhOS4uOWI0MDljYTlmM2Q5OTg3NjVlMjFlZTNlNTcwOWVk
MzY5MzgwNDA2MCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvZG9tL0VsZW1lbnQuaAorKysg
Yi9Tb3VyY2UvV2ViQ29yZS9kb20vRWxlbWVudC5oCkBAIC00NjgsNiArNDY4LDcgQEAgcHVibGlj
OgogI2VuZGlmCiAKICAgICB2aXJ0dWFsIGJvb2wgaXNGb3JtQ29udHJvbEVsZW1lbnQoKSBjb25z
dCB7IHJldHVybiBmYWxzZTsgfQorICAgIHZpcnR1YWwgYm9vbCBpc0Zvcm1Db250cm9sRWxlbWVu
dFdpdGhTdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CiAgICAgdmlydHVhbCBib29sIGlz
U3BpbkJ1dHRvbkVsZW1lbnQoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQogICAgIHZpcnR1YWwg
Ym9vbCBpc1RleHRGb3JtQ29udHJvbEVsZW1lbnQoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQog
ICAgIHZpcnR1YWwgYm9vbCBpc1RleHRGaWVsZCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CmRp
ZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9odG1sL0Zvcm1Db250cm9sbGVyLmNwcCBiL1NvdXJj
ZS9XZWJDb3JlL2h0bWwvRm9ybUNvbnRyb2xsZXIuY3BwCmluZGV4IDEyOGM3NjU5MWQ3NzkyYTJm
ZmY1ZjU3M2JmNmRhNDY5YzA4ZGYwM2YuLjIyNWFiOGEwZjNhNTM5ODkwYzRhOTZmYzhkMGUzZGRk
ZTYxNTk2YTggMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL2h0bWwvRm9ybUNvbnRyb2xsZXIu
Y3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL2h0bWwvRm9ybUNvbnRyb2xsZXIuY3BwCkBAIC0zNDIs
MTYgKzM0Miw2IEBAIEZvcm1Db250cm9sbGVyOjpGb3JtQ29udHJvbGxlcigpID0gZGVmYXVsdDsK
IAogRm9ybUNvbnRyb2xsZXI6On5Gb3JtQ29udHJvbGxlcigpID0gZGVmYXVsdDsKIAotdW5zaWdu
ZWQgRm9ybUNvbnRyb2xsZXI6OmZvcm1FbGVtZW50c0NoYXJhY3RlckNvdW50KCkgY29uc3QKLXsK
LSAgICB1bnNpZ25lZCBjb3VudCA9IDA7Ci0gICAgZm9yIChhdXRvJiBlbGVtZW50IDogbV9mb3Jt
RWxlbWVudHNXaXRoU3RhdGUpIHsKLSAgICAgICAgaWYgKGVsZW1lbnQtPmlzVGV4dEZpZWxkKCkp
Ci0gICAgICAgICAgICBjb3VudCArPSBlbGVtZW50LT5zYXZlRm9ybUNvbnRyb2xTdGF0ZSgpWzBd
Lmxlbmd0aCgpOwotICAgIH0KLSAgICByZXR1cm4gY291bnQ7Ci19Ci0KIHN0YXRpYyBTdHJpbmcg
Zm9ybVN0YXRlU2lnbmF0dXJlKCkKIHsKICAgICAvLyBJbiB0aGUgbGVnYWN5IHZlcnNpb24gb2Yg
c2VyaWFsaXplZCBzdGF0ZSwgdGhlIGZpcnN0IGl0ZW0gd2FzIGEgbmFtZQpAQCAtMzYxLDI2ICsz
NTEsMzcgQEAgc3RhdGljIFN0cmluZyBmb3JtU3RhdGVTaWduYXR1cmUoKQogICAgIHJldHVybiBz
aWduYXR1cmU7CiB9CiAKLXN0ZDo6dW5pcXVlX3B0cjxGb3JtQ29udHJvbGxlcjo6U2F2ZWRGb3Jt
U3RhdGVNYXA+IEZvcm1Db250cm9sbGVyOjpjcmVhdGVTYXZlZEZvcm1TdGF0ZU1hcChjb25zdCBG
b3JtRWxlbWVudExpc3RIYXNoU2V0JiBjb250cm9sTGlzdCkKK3N0ZDo6dW5pcXVlX3B0cjxGb3Jt
Q29udHJvbGxlcjo6U2F2ZWRGb3JtU3RhdGVNYXA+IEZvcm1Db250cm9sbGVyOjpjcmVhdGVTYXZl
ZEZvcm1TdGF0ZU1hcChjb25zdCBGb3JtQ29udHJvbFZlY3RvciYgY29udHJvbExpc3QpCiB7CiAg
ICAgRm9ybUtleUdlbmVyYXRvciBrZXlHZW5lcmF0b3I7CiAgICAgYXV0byBzdGF0ZU1hcCA9IG1h
a2VVbmlxdWU8U2F2ZWRGb3JtU3RhdGVNYXA+KCk7Ci0gICAgZm9yIChhdXRvJiBjb250cm9sIDog
Y29udHJvbExpc3QpIHsKLSAgICAgICAgaWYgKCFjb250cm9sLT5zaG91bGRTYXZlQW5kUmVzdG9y
ZUZvcm1Db250cm9sU3RhdGUoKSkKKyAgICBmb3IgKGNvbnN0IEhUTUxGb3JtQ29udHJvbEVsZW1l
bnRXaXRoU3RhdGUmIGNvbnRyb2wgOiBjb250cm9sTGlzdCkgeworICAgICAgICBpZiAoIWNvbnRy
b2wuc2hvdWxkU2F2ZUFuZFJlc3RvcmVGb3JtQ29udHJvbFN0YXRlKCkpCiAgICAgICAgICAgICBj
b250aW51ZTsKLSAgICAgICAgYXV0byYgZm9ybVN0YXRlID0gc3RhdGVNYXAtPmFkZChrZXlHZW5l
cmF0b3IuZm9ybUtleSgqY29udHJvbCkuaW1wbCgpLCBudWxscHRyKS5pdGVyYXRvci0+dmFsdWU7
CisgICAgICAgIGF1dG8mIGZvcm1TdGF0ZSA9IHN0YXRlTWFwLT5hZGQoa2V5R2VuZXJhdG9yLmZv
cm1LZXkoY29udHJvbCkuaW1wbCgpLCBudWxscHRyKS5pdGVyYXRvci0+dmFsdWU7CiAgICAgICAg
IGlmICghZm9ybVN0YXRlKQogICAgICAgICAgICAgZm9ybVN0YXRlID0gbWFrZVVuaXF1ZTxTYXZl
ZEZvcm1TdGF0ZT4oKTsKLSAgICAgICAgZm9ybVN0YXRlLT5hcHBlbmRDb250cm9sU3RhdGUoY29u
dHJvbC0+bmFtZSgpLCBjb250cm9sLT50eXBlKCksIGNvbnRyb2wtPnNhdmVGb3JtQ29udHJvbFN0
YXRlKCkpOworICAgICAgICBmb3JtU3RhdGUtPmFwcGVuZENvbnRyb2xTdGF0ZShjb250cm9sLm5h
bWUoKSwgY29udHJvbC50eXBlKCksIGNvbnRyb2wuc2F2ZUZvcm1Db250cm9sU3RhdGUoKSk7CiAg
ICAgfQogICAgIHJldHVybiBzdGF0ZU1hcDsKIH0KIAotVmVjdG9yPFN0cmluZz4gRm9ybUNvbnRy
b2xsZXI6OmZvcm1FbGVtZW50c1N0YXRlKCkgY29uc3QKK1ZlY3RvcjxTdHJpbmc+IEZvcm1Db250
cm9sbGVyOjpmb3JtRWxlbWVudHNTdGF0ZShjb25zdCBEb2N1bWVudCYgZG9jdW1lbnQpIGNvbnN0
CiB7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPFNhdmVkRm9ybVN0YXRlTWFwPiBzdGF0ZU1hcCA9IGNy
ZWF0ZVNhdmVkRm9ybVN0YXRlTWFwKG1fZm9ybUVsZW1lbnRzV2l0aFN0YXRlKTsKKyAgICAvLyBG
SVhNRTogV2Ugc2hvdWxkIGJlIHNhdmluZyB0aGUgc3RhdGUgb2YgZm9ybSBjb250cm9scyBpbiBz
aGFkb3cgdHJlZXMsIHRvby4KKyAgICBGb3JtQ29udHJvbFZlY3RvciBjb250cm9sczsKKyAgICBm
b3IgKGF1dG8mIGNvbnRyb2wgOiBkZXNjZW5kYW50c09mVHlwZTxIVE1MRm9ybUNvbnRyb2xFbGVt
ZW50V2l0aFN0YXRlPihkb2N1bWVudCkpIHsKKyAgICAgICAgQVNTRVJUKGNvbnRyb2wuaW5zZXJ0
aW9uSW5kZXgoKSk7CisgICAgICAgIGNvbnRyb2xzLmFwcGVuZChjb250cm9sKTsKKyAgICB9CisK
KyAgICBzdGQ6OnNvcnQoY29udHJvbHMuYmVnaW4oKSwgY29udHJvbHMuZW5kKCksIFtdKGF1dG8g
YSwgYXV0byBiKSB7CisgICAgICAgIHJldHVybiBhLmdldCgpLmluc2VydGlvbkluZGV4KCkgPCBi
LmdldCgpLmluc2VydGlvbkluZGV4KCk7CisgICAgfSk7CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8
U2F2ZWRGb3JtU3RhdGVNYXA+IHN0YXRlTWFwID0gY3JlYXRlU2F2ZWRGb3JtU3RhdGVNYXAoY29u
dHJvbHMpOwogICAgIFZlY3RvcjxTdHJpbmc+IHN0YXRlVmVjdG9yOwotICAgIHN0YXRlVmVjdG9y
LnJlc2VydmVJbml0aWFsQ2FwYWNpdHkobV9mb3JtRWxlbWVudHNXaXRoU3RhdGUuc2l6ZSgpICog
NCk7CisgICAgc3RhdGVWZWN0b3IucmVzZXJ2ZUluaXRpYWxDYXBhY2l0eShjb250cm9scy5zaXpl
KCkgKiA0KTsKICAgICBzdGF0ZVZlY3Rvci5hcHBlbmQoZm9ybVN0YXRlU2lnbmF0dXJlKCkpOwog
ICAgIGZvciAoYXV0byYgc3RhdGUgOiAqc3RhdGVNYXApIHsKICAgICAgICAgc3RhdGVWZWN0b3Iu
YXBwZW5kKHN0YXRlLmtleS5nZXQoKSk7CkBAIC00ODQsMTYgKzQ4NSw0IEBAIFZlY3RvcjxTdHJp
bmc+IEZvcm1Db250cm9sbGVyOjpyZWZlcmVuY2VkRmlsZVBhdGhzKGNvbnN0IFZlY3RvcjxTdHJp
bmc+JiBzdGF0ZVZlCiAgICAgcmV0dXJuIHBhdGhzOwogfQogCi12b2lkIEZvcm1Db250cm9sbGVy
OjpyZWdpc3RlckZvcm1FbGVtZW50V2l0aFN0YXRlKEhUTUxGb3JtQ29udHJvbEVsZW1lbnRXaXRo
U3RhdGUmIGNvbnRyb2wpCi17Ci0gICAgQVNTRVJUKCFtX2Zvcm1FbGVtZW50c1dpdGhTdGF0ZS5j
b250YWlucygmY29udHJvbCkpOwotICAgIG1fZm9ybUVsZW1lbnRzV2l0aFN0YXRlLmFkZCgmY29u
dHJvbCk7Ci19Ci0KLXZvaWQgRm9ybUNvbnRyb2xsZXI6OnVucmVnaXN0ZXJGb3JtRWxlbWVudFdp
dGhTdGF0ZShIVE1MRm9ybUNvbnRyb2xFbGVtZW50V2l0aFN0YXRlJiBjb250cm9sKQotewotICAg
IEFTU0VSVChtX2Zvcm1FbGVtZW50c1dpdGhTdGF0ZS5jb250YWlucygmY29udHJvbCkpOwotICAg
IG1fZm9ybUVsZW1lbnRzV2l0aFN0YXRlLnJlbW92ZSgmY29udHJvbCk7Ci19Ci0KIH0gLy8gbmFt
ZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2h0bWwvRm9ybUNvbnRy
b2xsZXIuaCBiL1NvdXJjZS9XZWJDb3JlL2h0bWwvRm9ybUNvbnRyb2xsZXIuaAppbmRleCBhMTM1
MmY1ODZiZWZhYTFmNmIwNzEyYjkwZWJmZGZhYmYzYzBhYzg2Li42Y2QzMWJiZTA4Y2NmNDkxNjFj
YmNmOTM1NjBkMGUwYzAxMjU3NmM0IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9odG1sL0Zv
cm1Db250cm9sbGVyLmgKKysrIGIvU291cmNlL1dlYkNvcmUvaHRtbC9Gb3JtQ29udHJvbGxlci5o
CkBAIC00MiwxMiArNDIsNyBAQCBwdWJsaWM6CiAgICAgRm9ybUNvbnRyb2xsZXIoKTsKICAgICB+
Rm9ybUNvbnRyb2xsZXIoKTsKIAotICAgIHZvaWQgcmVnaXN0ZXJGb3JtRWxlbWVudFdpdGhTdGF0
ZShIVE1MRm9ybUNvbnRyb2xFbGVtZW50V2l0aFN0YXRlJik7Ci0gICAgdm9pZCB1bnJlZ2lzdGVy
Rm9ybUVsZW1lbnRXaXRoU3RhdGUoSFRNTEZvcm1Db250cm9sRWxlbWVudFdpdGhTdGF0ZSYpOwot
Ci0gICAgdW5zaWduZWQgZm9ybUVsZW1lbnRzQ2hhcmFjdGVyQ291bnQoKSBjb25zdDsKLQotICAg
IFZlY3RvcjxTdHJpbmc+IGZvcm1FbGVtZW50c1N0YXRlKCkgY29uc3Q7CisgICAgVmVjdG9yPFN0
cmluZz4gZm9ybUVsZW1lbnRzU3RhdGUoY29uc3QgRG9jdW1lbnQmKSBjb25zdDsKICAgICB2b2lk
IHNldFN0YXRlRm9yTmV3Rm9ybUVsZW1lbnRzKGNvbnN0IFZlY3RvcjxTdHJpbmc+Jik7CiAKICAg
ICB2b2lkIHdpbGxEZWxldGVGb3JtKEhUTUxGb3JtRWxlbWVudCYpOwpAQCAtNTgsMTQgKzUzLDEz
IEBAIHB1YmxpYzoKICAgICBXRUJDT1JFX0VYUE9SVCBzdGF0aWMgVmVjdG9yPFN0cmluZz4gcmVm
ZXJlbmNlZEZpbGVQYXRocyhjb25zdCBWZWN0b3I8U3RyaW5nPiYgc3RhdGVWZWN0b3IpOwogCiBw
cml2YXRlOgotICAgIHR5cGVkZWYgTGlzdEhhc2hTZXQ8UmVmUHRyPEhUTUxGb3JtQ29udHJvbEVs
ZW1lbnRXaXRoU3RhdGU+PiBGb3JtRWxlbWVudExpc3RIYXNoU2V0OworICAgIHR5cGVkZWYgVmVj
dG9yPHN0ZDo6cmVmZXJlbmNlX3dyYXBwZXI8Y29uc3QgSFRNTEZvcm1Db250cm9sRWxlbWVudFdp
dGhTdGF0ZT4+IEZvcm1Db250cm9sVmVjdG9yOwogICAgIHR5cGVkZWYgSGFzaE1hcDxSZWZQdHI8
QXRvbVN0cmluZ0ltcGw+LCBzdGQ6OnVuaXF1ZV9wdHI8U2F2ZWRGb3JtU3RhdGU+PiBTYXZlZEZv
cm1TdGF0ZU1hcDsKIAotICAgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8U2F2ZWRGb3JtU3RhdGVN
YXA+IGNyZWF0ZVNhdmVkRm9ybVN0YXRlTWFwKGNvbnN0IEZvcm1FbGVtZW50TGlzdEhhc2hTZXQm
KTsKKyAgICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPFNhdmVkRm9ybVN0YXRlTWFwPiBjcmVhdGVT
YXZlZEZvcm1TdGF0ZU1hcChjb25zdCBGb3JtQ29udHJvbFZlY3RvciYpOwogICAgIEZvcm1Db250
cm9sU3RhdGUgdGFrZVN0YXRlRm9yRm9ybUVsZW1lbnQoY29uc3QgSFRNTEZvcm1Db250cm9sRWxl
bWVudFdpdGhTdGF0ZSYpOwogICAgIHN0YXRpYyB2b2lkIGZvcm1TdGF0ZXNGcm9tU3RhdGVWZWN0
b3IoY29uc3QgVmVjdG9yPFN0cmluZz4mLCBTYXZlZEZvcm1TdGF0ZU1hcCYpOwogCi0gICAgRm9y
bUVsZW1lbnRMaXN0SGFzaFNldCBtX2Zvcm1FbGVtZW50c1dpdGhTdGF0ZTsKICAgICBTYXZlZEZv
cm1TdGF0ZU1hcCBtX3NhdmVkRm9ybVN0YXRlTWFwOwogICAgIHN0ZDo6dW5pcXVlX3B0cjxGb3Jt
S2V5R2VuZXJhdG9yPiBtX2Zvcm1LZXlHZW5lcmF0b3I7CiB9OwpkaWZmIC0tZ2l0IGEvU291cmNl
L1dlYkNvcmUvaHRtbC9IVE1MRm9ybUNvbnRyb2xFbGVtZW50V2l0aFN0YXRlLmNwcCBiL1NvdXJj
ZS9XZWJDb3JlL2h0bWwvSFRNTEZvcm1Db250cm9sRWxlbWVudFdpdGhTdGF0ZS5jcHAKaW5kZXgg
ZTlhMjg1MjQ3N2QwYWViYmNkY2RmODE2OTk0YjQ5MTdlODQwMjEwOC4uMjBlZDgzZjY2OGM1NzE2
NzQ0ZGM0Mjc1M2JmM2FhNjhlMWQ2NjUwZCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvaHRt
bC9IVE1MRm9ybUNvbnRyb2xFbGVtZW50V2l0aFN0YXRlLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29y
ZS9odG1sL0hUTUxGb3JtQ29udHJvbEVsZW1lbnRXaXRoU3RhdGUuY3BwCkBAIC00MywxNSArNDMs
MTMgQEAgSFRNTEZvcm1Db250cm9sRWxlbWVudFdpdGhTdGF0ZTo6fkhUTUxGb3JtQ29udHJvbEVs
ZW1lbnRXaXRoU3RhdGUoKSA9IGRlZmF1bHQ7CiAKIE5vZGU6Okluc2VydGVkSW50b0FuY2VzdG9y
UmVzdWx0IEhUTUxGb3JtQ29udHJvbEVsZW1lbnRXaXRoU3RhdGU6Omluc2VydGVkSW50b0FuY2Vz
dG9yKEluc2VydGlvblR5cGUgaW5zZXJ0aW9uVHlwZSwgQ29udGFpbmVyTm9kZSYgcGFyZW50T2ZJ
bnNlcnRlZFRyZWUpCiB7Ci0gICAgaWYgKGluc2VydGlvblR5cGUuY29ubmVjdGVkVG9Eb2N1bWVu
dCAmJiAhY29udGFpbmluZ1NoYWRvd1Jvb3QoKSkKLSAgICAgICAgZG9jdW1lbnQoKS5mb3JtQ29u
dHJvbGxlcigpLnJlZ2lzdGVyRm9ybUVsZW1lbnRXaXRoU3RhdGUoKnRoaXMpOworICAgIG1faW5z
ZXJ0aW9uSW5kZXggPSArK2xhc3RJbnNlcnRpb25JbmRleDsKICAgICByZXR1cm4gSFRNTEZvcm1D
b250cm9sRWxlbWVudDo6aW5zZXJ0ZWRJbnRvQW5jZXN0b3IoaW5zZXJ0aW9uVHlwZSwgcGFyZW50
T2ZJbnNlcnRlZFRyZWUpOwogfQogCiB2b2lkIEhUTUxGb3JtQ29udHJvbEVsZW1lbnRXaXRoU3Rh
dGU6OnJlbW92ZWRGcm9tQW5jZXN0b3IoUmVtb3ZhbFR5cGUgcmVtb3ZhbFR5cGUsIENvbnRhaW5l
ck5vZGUmIG9sZFBhcmVudE9mUmVtb3ZlZFRyZWUpCiB7Ci0gICAgaWYgKHJlbW92YWxUeXBlLmRp
c2Nvbm5lY3RlZEZyb21Eb2N1bWVudCAmJiAhY29udGFpbmluZ1NoYWRvd1Jvb3QoKSAmJiAhb2xk
UGFyZW50T2ZSZW1vdmVkVHJlZS5jb250YWluaW5nU2hhZG93Um9vdCgpKQotICAgICAgICBkb2N1
bWVudCgpLmZvcm1Db250cm9sbGVyKCkudW5yZWdpc3RlckZvcm1FbGVtZW50V2l0aFN0YXRlKCp0
aGlzKTsKKyAgICBtX2luc2VydGlvbkluZGV4ID0gMDsKICAgICBIVE1MRm9ybUNvbnRyb2xFbGVt
ZW50OjpyZW1vdmVkRnJvbUFuY2VzdG9yKHJlbW92YWxUeXBlLCBvbGRQYXJlbnRPZlJlbW92ZWRU
cmVlKTsKIH0KIApAQCAtODQsNCArODIsNiBAQCBib29sIEhUTUxGb3JtQ29udHJvbEVsZW1lbnRX
aXRoU3RhdGU6OmlzRm9ybUNvbnRyb2xFbGVtZW50V2l0aFN0YXRlKCkgY29uc3QKICAgICByZXR1
cm4gdHJ1ZTsKIH0KIAordWludDY0X3QgSFRNTEZvcm1Db250cm9sRWxlbWVudFdpdGhTdGF0ZTo6
bGFzdEluc2VydGlvbkluZGV4IHsgMCB9OworCiB9IC8vIG5hbWVzcGFjZSBXZWJjb3JlCmRpZmYg
LS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9odG1sL0hUTUxGb3JtQ29udHJvbEVsZW1lbnRXaXRoU3Rh
dGUuaCBiL1NvdXJjZS9XZWJDb3JlL2h0bWwvSFRNTEZvcm1Db250cm9sRWxlbWVudFdpdGhTdGF0
ZS5oCmluZGV4IGZhZmJiOGQzOGIzY2YzMWU2NjYyYzE3NTM5Y2E3YTcxZjlmNGQxZTQuLjM5NmFj
NGFjNTE2OTE4NDQzMjRjYzc0YzI4MDE0Mzk0ZTJmMDc0ZjcgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9X
ZWJDb3JlL2h0bWwvSFRNTEZvcm1Db250cm9sRWxlbWVudFdpdGhTdGF0ZS5oCisrKyBiL1NvdXJj
ZS9XZWJDb3JlL2h0bWwvSFRNTEZvcm1Db250cm9sRWxlbWVudFdpdGhTdGF0ZS5oCkBAIC0zOCw2
ICszOCw4IEBAIHB1YmxpYzoKICAgICB2aXJ0dWFsIEZvcm1Db250cm9sU3RhdGUgc2F2ZUZvcm1D
b250cm9sU3RhdGUoKSBjb25zdDsKICAgICB2aXJ0dWFsIHZvaWQgcmVzdG9yZUZvcm1Db250cm9s
U3RhdGUoY29uc3QgRm9ybUNvbnRyb2xTdGF0ZSYpIHsgfSAvLyBDYWxsZWQgb25seSBpZiBzdGF0
ZSBpcyBub3QgZW1wdHkuCiAKKyAgICB1aW50NjRfdCBpbnNlcnRpb25JbmRleCgpIGNvbnN0IHsg
cmV0dXJuIG1faW5zZXJ0aW9uSW5kZXg7IH0KKwogcHJvdGVjdGVkOgogICAgIEhUTUxGb3JtQ29u
dHJvbEVsZW1lbnRXaXRoU3RhdGUoY29uc3QgUXVhbGlmaWVkTmFtZSYgdGFnTmFtZSwgRG9jdW1l
bnQmLCBIVE1MRm9ybUVsZW1lbnQqKTsKIApAQCAtNTAsMTAgKzUyLDE1IEBAIHByb3RlY3RlZDoK
IAogcHJpdmF0ZToKICAgICBib29sIGlzRm9ybUNvbnRyb2xFbGVtZW50V2l0aFN0YXRlKCkgY29u
c3QgZmluYWw7CisKKyAgICB1aW50NjRfdCBtX2luc2VydGlvbkluZGV4IHsgMCB9OworICAgIHN0
YXRpYyB1aW50NjRfdCBsYXN0SW5zZXJ0aW9uSW5kZXg7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBX
ZWJDb3JlCiAKIFNQRUNJQUxJWkVfVFlQRV9UUkFJVFNfQkVHSU4oV2ViQ29yZTo6SFRNTEZvcm1D
b250cm9sRWxlbWVudFdpdGhTdGF0ZSkKKyAgICBzdGF0aWMgYm9vbCBpc1R5cGUoY29uc3QgV2Vi
Q29yZTo6RWxlbWVudCYgZWxlbWVudCkgeyByZXR1cm4gZWxlbWVudC5pc0Zvcm1Db250cm9sRWxl
bWVudFdpdGhTdGF0ZSgpOyB9CisgICAgc3RhdGljIGJvb2wgaXNUeXBlKGNvbnN0IFdlYkNvcmU6
Ok5vZGUmIG5vZGUpIHsgcmV0dXJuIGlzPFdlYkNvcmU6OkVsZW1lbnQ+KG5vZGUpICYmIGlzVHlw
ZShkb3duY2FzdDxXZWJDb3JlOjpFbGVtZW50Pihub2RlKSk7IH0KICAgICBzdGF0aWMgYm9vbCBp
c1R5cGUoY29uc3QgV2ViQ29yZTo6Rm9ybUFzc29jaWF0ZWRFbGVtZW50JiBlbGVtZW50KSB7IHJl
dHVybiBlbGVtZW50LmlzRm9ybUNvbnRyb2xFbGVtZW50V2l0aFN0YXRlKCk7IH0KIFNQRUNJQUxJ
WkVfVFlQRV9UUkFJVFNfRU5EKCkKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BhZ2UvRnJh
bWUuaCBiL1NvdXJjZS9XZWJDb3JlL3BhZ2UvRnJhbWUuaAppbmRleCBmMGY5YThhNDI0YzQ2MGNk
OTMwYWQ1YjU2ZGVmZjVkYjA5ODQ5NWYwLi4zN2MxY2I2YjVkNzc5ZDVhM2MyYWJkZDdhNjI1ZTk5
MDExZDk5NzFjIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wYWdlL0ZyYW1lLmgKKysrIGIv
U291cmNlL1dlYkNvcmUvcGFnZS9GcmFtZS5oCkBAIC0yODIsNyArMjgyLDYgQEAgcHVibGljOgog
ICAgIFdFQkNPUkVfRVhQT1JUIHZvaWQgdXBkYXRlTGF5b3V0KCkgY29uc3Q7CiAgICAgV0VCQ09S
RV9FWFBPUlQgTlNSZWN0IGNhcmV0UmVjdCgpOwogICAgIFdFQkNPUkVfRVhQT1JUIE5TUmVjdCBy
ZWN0Rm9yU2Nyb2xsVG9WaXNpYmxlKCk7Ci0gICAgV0VCQ09SRV9FWFBPUlQgdW5zaWduZWQgZm9y
bUVsZW1lbnRzQ2hhcmFjdGVyQ291bnQoKSBjb25zdDsKIAogICAgIC8vIFRoaXMgZnVuY3Rpb24g
aXMgdXNlZCBieSBMZWdhY3kgV2ViS2l0LgogICAgIFdFQkNPUkVfRVhQT1JUIHZvaWQgc2V0VGlt
ZXJzUGF1c2VkKGJvb2wpOwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGFnZS9pb3MvRnJh
bWVJT1MubW0gYi9Tb3VyY2UvV2ViQ29yZS9wYWdlL2lvcy9GcmFtZUlPUy5tbQppbmRleCBhNDk5
OWUyMWZhMmQ5MTJkYzMyZWUzOWE3ZDFkMzJlZWZhMjA4M2M3Li4wYTAzNmExNDllM2EzZTA3YWYx
OTJlZjNlZWU2ZWIyMDc5NTAxNWExIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wYWdlL2lv
cy9GcmFtZUlPUy5tbQorKysgYi9Tb3VyY2UvV2ViQ29yZS9wYWdlL2lvcy9GcmFtZUlPUy5tbQpA
QCAtNjI3LDE0ICs2MjcsNiBAQCBOU1JlY3QgRnJhbWU6OnJlY3RGb3JTY3JvbGxUb1Zpc2libGUo
KQogICAgIHJldHVybiB1bmlvblJlY3Qoc2VsZWN0aW9uLnZpc2libGVTdGFydCgpLmFic29sdXRl
Q2FyZXRCb3VuZHMoKSwgc2VsZWN0aW9uLnZpc2libGVFbmQoKS5hYnNvbHV0ZUNhcmV0Qm91bmRz
KCkpOwogfQogCi11bnNpZ25lZCBGcmFtZTo6Zm9ybUVsZW1lbnRzQ2hhcmFjdGVyQ291bnQoKSBj
b25zdAotewotICAgIERvY3VtZW50KiBkb2N1bWVudCA9IHRoaXMtPmRvY3VtZW50KCk7Ci0gICAg
aWYgKCFkb2N1bWVudCkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIGRvY3VtZW50LT5m
b3JtQ29udHJvbGxlcigpLmZvcm1FbGVtZW50c0NoYXJhY3RlckNvdW50KCk7Ci19Ci0KIHZvaWQg
RnJhbWU6OnNldFRpbWVyc1BhdXNlZChib29sIHBhdXNlZCkKIHsKICAgICBpZiAoIW1fcGFnZSkK
ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXRMZWdhY3kvbWFjL1dlYlZpZXcvV2ViRnJhbWUubW0g
Yi9Tb3VyY2UvV2ViS2l0TGVnYWN5L21hYy9XZWJWaWV3L1dlYkZyYW1lLm1tCmluZGV4IGMwNDE5
YWZiNzA1MWNkYmRmMzBlYTE2ZTEyMTVkMzFhNDVkNjBmM2QuLjBkN2YwZDI4NDZhOGJmZjk5MDVi
ZGY0NzQ3ZmE5MDczMTIwNDI0N2IgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXRMZWdhY3kvbWFj
L1dlYlZpZXcvV2ViRnJhbWUubW0KKysrIGIvU291cmNlL1dlYktpdExlZ2FjeS9tYWMvV2ViVmll
dy9XZWJGcmFtZS5tbQpAQCAtMTE2MywxMSArMTE2Myw2IEBAIC0gKHZvaWQpX3JlY3Vyc2l2ZV9w
YXVzZU51bGxFdmVudHNGb3JBbGxOZXRzY2FwZVBsdWdpbnMKIAogI2lmIFBMQVRGT1JNKElPU19G
QU1JTFkpCiAKLS0gKHVuc2lnbmVkKWZvcm1FbGVtZW50c0NoYXJhY3RlckNvdW50Ci17Ci0gICAg
cmV0dXJuIGNvcmUoc2VsZiktPmZvcm1FbGVtZW50c0NoYXJhY3RlckNvdW50KCk7Ci19Ci0KIC0g
KHZvaWQpc2V0VGltZW91dHNQYXVzZWQ6KEJPT0wpZmxhZwogewogICAgIGlmIChbc2VsZiBfd2Vi
SFRNTERvY3VtZW50Vmlld10pIHsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXRMZWdhY3kvbWFj
L1dlYlZpZXcvV2ViRnJhbWVQcml2YXRlLmggYi9Tb3VyY2UvV2ViS2l0TGVnYWN5L21hYy9XZWJW
aWV3L1dlYkZyYW1lUHJpdmF0ZS5oCmluZGV4IGNlZjEyMmJiZjFiZTkxNjRjODRmNDIxZTEwZWE5
ODYyMjA2MjkxN2IuLmVkOGI2YjYzNmIwYTZlNTUwNGUxOWU5OTU4NDc1YTM3ZTVkNWRiZTMgMTAw
NjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXRMZWdhY3kvbWFjL1dlYlZpZXcvV2ViRnJhbWVQcml2YXRl
LmgKKysrIGIvU291cmNlL1dlYktpdExlZ2FjeS9tYWMvV2ViVmlldy9XZWJGcmFtZVByaXZhdGUu
aApAQCAtOTUsNyArOTUsNiBAQCB0eXBlZGVmIGVudW0gewogLSAoQk9PTCluZWVkc0xheW91dDsg
Ly8gTmVlZGVkIGZvciBNYWlsIDxyZGFyOi8vcHJvYmxlbS82MjI4MDM4PgogLSAodm9pZClfc2V0
TG9hZHNTeW5jaHJvbm91c2x5OihCT09MKWZsYWc7CiAtIChCT09MKV9sb2Fkc1N5bmNocm9ub3Vz
bHk7Ci0tICh1bnNpZ25lZClmb3JtRWxlbWVudHNDaGFyYWN0ZXJDb3VudDsKIC0gKHZvaWQpc2V0
VGltZW91dHNQYXVzZWQ6KEJPT0wpZmxhZzsKIAogLyohCg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>435048</attachid>
            <date>2021-08-05 19:22:32 -0700</date>
            <delta_ts>2021-08-05 20:10:48 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-228724-20210806122230.patch</filename>
            <type>text/plain</type>
            <size>15314</size>
            <attacher name="Cameron McCormack (:heycam)">heycam</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjgwNTIzCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggZGY1ZGFhNzRiMzQ3OWEx
NGJmODEzZDdkN2I5ODg5Y2Y5YTk4MDZhYi4uOGQ0YTk2MzRlYmIzNTU0MjQ1YzQxNWY5ODA1OWJh
YzdhOWZkYzA2MSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDQ1IEBACisyMDIxLTA4LTA0ICBDYW1l
cm9uIE1jQ29ybWFjayAgPGhleWNhbUBhcHBsZS5jb20+CisKKyAgICAgICAgU3RvcCB0cmFja2lu
ZyBmb3JtIGVsZW1lbnRzIHdpdGggRm9ybUNvbnRyb2xsZXIKKyAgICAgICAgaHR0cHM6Ly9idWdz
LndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTIyODcyNAorICAgICAgICA8cmRhcjovL3Byb2Js
ZW0vODE0MzUwOTU+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgRGFyaW4gQWRsZXIuCisKKyAgICAg
ICAgRm9ybUNvbnRyb2xsZXIgY3VycmVudGx5IHRyYWNrcyB0aGUgaW5zZXJ0aW9uIG9yZGVyIG9m
CisgICAgICAgIEhUTUxGb3JtRWxlbWVudFdpdGhTdGF0ZSBvYmplY3RzIGluIHRoZSBkb2N1bWVu
dC4gIEJ1dCB3ZSBkb24ndCBuZWVkCisgICAgICAgIHRvIGtub3cgdGhpcyBsaXN0IG9mIGZvcm0g
Y29udHJvbHMgdW50aWwgdGhlIHRpbWUgd2UgbmVlZCB0byBzYXZlCisgICAgICAgIGZvcm0gc3Rh
dGUgZm9yIHRoZSBkb2N1bWVudCAoZS5nLiBvbiBwYWdlaGlkZSkuICBTbyB3ZSBpbnN0ZWFkCisg
ICAgICAgIHRyYXZlcnNlIHRoZSBkb2N1bWVudCB0byBmaW5kIHRob3NlIGVsZW1lbnRzIGF0IHRo
ZSBwb2ludCB3ZSBuZWVkCisgICAgICAgIHRoZW0sIHJhdGhlciB0aGFuIG1haW50YWluIEZvcm1D
b250cm9sbGVyOjptX2Zvcm1FbGVtZW50c1dpdGhTdGF0ZS4KKworICAgICAgICBUaGlzIGlzIGEg
c21hbGwgc3BlZWR1cCAoMS0yJSkgb24gYSBmZXcgb2YgdGhlIFNwZWVkb21ldGVyIHN1YnRlc3Rz
CisgICAgICAgIHRoYXQgaW5zZXJ0IGFuZCByZW1vdmUgbWFueSBpbnB1dCBlbGVtZW50cy4KKwor
ICAgICAgICBBIGZ1dHVyZSBvcHRpbWl6YXRpb24gY291bGQgcmVjb3JkIG9uIHRoZSBEb2N1bWVu
dCB3aGV0aGVyIHRoZXJlIGFyZQorICAgICAgICBhbnkgaW5wdXQgZWxlbWVudHMgdGhhdCBoYXZl
IGhhZCB0aGVpciB2YWx1ZSBjaGFuZ2VkLCBzaW5jZSBpdCdzCisgICAgICAgIHByb2JhYmx5IGNv
bW1vbiBmb3IgcGFnZXMgd2l0aCBmb3JtIGNvbnRyb2xzIHRvIG5ldmVyIGJlIGNoYW5nZWQuCisK
KyAgICAgICAgKiBkb20vRG9jdW1lbnQuY3BwOgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1lbnQ6
OmZvcm1FbGVtZW50c1N0YXRlIGNvbnN0KTogVHJhdmVyc2UgdGhlIGRvY3VtZW50IHRvCisgICAg
ICAgIGZpbmQgYWxsIHRoZSBIVE1MRm9ybUVsZW1lbnRXaXRoU3RhdGUgb2JqZWN0cy4KKyAgICAg
ICAgKiBkb20vRWxlbWVudC5oOgorICAgICAgICAoV2ViQ29yZTo6RWxlbWVudDo6aXNGb3JtQ29u
dHJvbEVsZW1lbnRXaXRoU3RhdGUgY29uc3QpOgorICAgICAgICAqIGh0bWwvRm9ybUNvbnRyb2xs
ZXIuY3BwOgorICAgICAgICAoV2ViQ29yZTo6Rm9ybUNvbnRyb2xsZXI6OmNyZWF0ZVNhdmVkRm9y
bVN0YXRlTWFwKToKKyAgICAgICAgKFdlYkNvcmU6OkZvcm1Db250cm9sbGVyOjpmb3JtRWxlbWVu
dHNTdGF0ZSBjb25zdCk6CisgICAgICAgICogaHRtbC9Gb3JtQ29udHJvbGxlci5oOgorICAgICAg
ICAqIGh0bWwvSFRNTEZvcm1Db250cm9sRWxlbWVudFdpdGhTdGF0ZS5jcHA6CisgICAgICAgIChX
ZWJDb3JlOjpIVE1MRm9ybUNvbnRyb2xFbGVtZW50V2l0aFN0YXRlOjppbnNlcnRlZEludG9BbmNl
c3Rvcik6CisgICAgICAgIFRyYWNrIHRoZSBvcmRlciB0aGF0IEhUTUxGb3JtQ29udHJvbEVsZW1l
bnRXaXRoU3RhdGUgb2JqZWN0cyBhcmUKKyAgICAgICAgaW5zZXJ0ZWQgaW50byB0aGUgZG9jdW1l
bnQuCisgICAgICAgIChXZWJDb3JlOjpIVE1MRm9ybUNvbnRyb2xFbGVtZW50V2l0aFN0YXRlOjpy
ZW1vdmVkRnJvbUFuY2VzdG9yKToKKyAgICAgICAgKiBodG1sL0hUTUxGb3JtQ29udHJvbEVsZW1l
bnRXaXRoU3RhdGUuaDoKKyAgICAgICAgKFdlYkNvcmU6OkhUTUxGb3JtQ29udHJvbEVsZW1lbnRX
aXRoU3RhdGU6Omluc2VydGlvbkluZGV4IGNvbnN0KToKKyAgICAgICAgKGlzVHlwZSk6CisgICAg
ICAgICogcGFnZS9GcmFtZS5oOiBSZW1vdmUgdW51c2VkIGZvcm1FbGVtZW50c0NoYXJhY3RlckNv
dW50LgorICAgICAgICAqIHBhZ2UvaW9zL0ZyYW1lSU9TLm1tOgorCiAyMDIxLTA3LTMxICBNYWNp
ZWogU3RhY2hvd2lhayAgPG1qc0BhcHBsZS5jb20+CiAKICAgICAgICAgTGlzdEF0dHJpYnV0ZVRh
cmdldE9ic2VydmVyIGlzIG5lZWRsZXNzbHkgY3JlYXRlZCBldmVuIHdoZW4gdGhlcmUgaXMgbm8g
bGlzdCBhdHRyaWJ1dGUKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXRMZWdhY3kvbWFjL0NoYW5n
ZUxvZyBiL1NvdXJjZS9XZWJLaXRMZWdhY3kvbWFjL0NoYW5nZUxvZwppbmRleCAwZGZmNDM4YzEy
MDc1N2YzNjNlMDBkYjgzMjQ3MzVmNTVlMGExYjljLi42MTVjZDY1YWIyNDE3NDU2NWZjMGE4N2Y1
ZWMzNDdiZDZiYzM1ZDViIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0TGVnYWN5L21hYy9DaGFu
Z2VMb2cKKysrIGIvU291cmNlL1dlYktpdExlZ2FjeS9tYWMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEs
MTYgQEAKKzIwMjEtMDgtMDQgIENhbWVyb24gTWNDb3JtYWNrICA8aGV5Y2FtQGFwcGxlLmNvbT4K
KworICAgICAgICBTdG9wIHRyYWNraW5nIGZvcm0gZWxlbWVudHMgd2l0aCBGb3JtQ29udHJvbGxl
cgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjI4NzI0
CisgICAgICAgIDxyZGFyOi8vcHJvYmxlbS84MTQzNTA5NT4KKworICAgICAgICBSZXZpZXdlZCBi
eSBEYXJpbiBBZGxlci4KKworICAgICAgICBmb3JtRWxlbWVudHNDaGFyYWN0ZXJDb3VudCBpcyB1
bnVzZWQgYW5kIGNhbiBiZSByZW1vdmVkLgorCisgICAgICAgICogV2ViVmlldy9XZWJGcmFtZS5t
bToKKyAgICAgICAgKiBXZWJWaWV3L1dlYkZyYW1lUHJpdmF0ZS5oOgorCiAyMDIxLTA3LTI5ICBN
eWxlcyBDLiBNYXhmaWVsZCAgPG1tYXhmaWVsZEBhcHBsZS5jb20+CiAKICAgICAgICAgU3RvcCBi
dWlsZGluZyBXZWJHUFUgYW5kIHRoZSBXSExTTCBjb21waWxlciB0byBkZWNyZWFzZSBiaW5hcnkg
c2l6ZQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvZG9tL0RvY3VtZW50LmNwcCBiL1NvdXJj
ZS9XZWJDb3JlL2RvbS9Eb2N1bWVudC5jcHAKaW5kZXggNmVkYTY5NGM2YTgzYTNiZTJmNGIwZWI4
Zjk1NTQ1MDg4NmNkN2UxNi4uODk1ZDMxMzhlOTM1YzQ3YTVlYjNmN2Q4ZTVmMjQ2Y2U4NmJkODI3
MyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvZG9tL0RvY3VtZW50LmNwcAorKysgYi9Tb3Vy
Y2UvV2ViQ29yZS9kb20vRG9jdW1lbnQuY3BwCkBAIC0xOTA5LDcgKzE5MDksNyBAQCBWZWN0b3I8
U3RyaW5nPiBEb2N1bWVudDo6Zm9ybUVsZW1lbnRzU3RhdGUoKSBjb25zdAogewogICAgIGlmICgh
bV9mb3JtQ29udHJvbGxlcikKICAgICAgICAgcmV0dXJuIFZlY3RvcjxTdHJpbmc+KCk7Ci0gICAg
cmV0dXJuIG1fZm9ybUNvbnRyb2xsZXItPmZvcm1FbGVtZW50c1N0YXRlKCk7CisgICAgcmV0dXJu
IG1fZm9ybUNvbnRyb2xsZXItPmZvcm1FbGVtZW50c1N0YXRlKCp0aGlzKTsKIH0KIAogdm9pZCBE
b2N1bWVudDo6c2V0U3RhdGVGb3JOZXdGb3JtRWxlbWVudHMoY29uc3QgVmVjdG9yPFN0cmluZz4m
IHN0YXRlVmVjdG9yKQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvZG9tL0VsZW1lbnQuaCBi
L1NvdXJjZS9XZWJDb3JlL2RvbS9FbGVtZW50LmgKaW5kZXggMzc4NzBmYzNkMGIxNjRhZjRhNzIw
YzIyNDEzMDYzZTEyNTRlOTNhOS4uOWI0MDljYTlmM2Q5OTg3NjVlMjFlZTNlNTcwOWVkMzY5Mzgw
NDA2MCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvZG9tL0VsZW1lbnQuaAorKysgYi9Tb3Vy
Y2UvV2ViQ29yZS9kb20vRWxlbWVudC5oCkBAIC00NjgsNiArNDY4LDcgQEAgcHVibGljOgogI2Vu
ZGlmCiAKICAgICB2aXJ0dWFsIGJvb2wgaXNGb3JtQ29udHJvbEVsZW1lbnQoKSBjb25zdCB7IHJl
dHVybiBmYWxzZTsgfQorICAgIHZpcnR1YWwgYm9vbCBpc0Zvcm1Db250cm9sRWxlbWVudFdpdGhT
dGF0ZSgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CiAgICAgdmlydHVhbCBib29sIGlzU3BpbkJ1
dHRvbkVsZW1lbnQoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQogICAgIHZpcnR1YWwgYm9vbCBp
c1RleHRGb3JtQ29udHJvbEVsZW1lbnQoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQogICAgIHZp
cnR1YWwgYm9vbCBpc1RleHRGaWVsZCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CmRpZmYgLS1n
aXQgYS9Tb3VyY2UvV2ViQ29yZS9odG1sL0Zvcm1Db250cm9sbGVyLmNwcCBiL1NvdXJjZS9XZWJD
b3JlL2h0bWwvRm9ybUNvbnRyb2xsZXIuY3BwCmluZGV4IDEyOGM3NjU5MWQ3NzkyYTJmZmY1ZjU3
M2JmNmRhNDY5YzA4ZGYwM2YuLmQyYzRjNDhkNzBlN2JjNDk1NDU2NTBhNzVmYzA1MDEzNGM4NzI0
MjIgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL2h0bWwvRm9ybUNvbnRyb2xsZXIuY3BwCisr
KyBiL1NvdXJjZS9XZWJDb3JlL2h0bWwvRm9ybUNvbnRyb2xsZXIuY3BwCkBAIC0zNDIsMTYgKzM0
Miw2IEBAIEZvcm1Db250cm9sbGVyOjpGb3JtQ29udHJvbGxlcigpID0gZGVmYXVsdDsKIAogRm9y
bUNvbnRyb2xsZXI6On5Gb3JtQ29udHJvbGxlcigpID0gZGVmYXVsdDsKIAotdW5zaWduZWQgRm9y
bUNvbnRyb2xsZXI6OmZvcm1FbGVtZW50c0NoYXJhY3RlckNvdW50KCkgY29uc3QKLXsKLSAgICB1
bnNpZ25lZCBjb3VudCA9IDA7Ci0gICAgZm9yIChhdXRvJiBlbGVtZW50IDogbV9mb3JtRWxlbWVu
dHNXaXRoU3RhdGUpIHsKLSAgICAgICAgaWYgKGVsZW1lbnQtPmlzVGV4dEZpZWxkKCkpCi0gICAg
ICAgICAgICBjb3VudCArPSBlbGVtZW50LT5zYXZlRm9ybUNvbnRyb2xTdGF0ZSgpWzBdLmxlbmd0
aCgpOwotICAgIH0KLSAgICByZXR1cm4gY291bnQ7Ci19Ci0KIHN0YXRpYyBTdHJpbmcgZm9ybVN0
YXRlU2lnbmF0dXJlKCkKIHsKICAgICAvLyBJbiB0aGUgbGVnYWN5IHZlcnNpb24gb2Ygc2VyaWFs
aXplZCBzdGF0ZSwgdGhlIGZpcnN0IGl0ZW0gd2FzIGEgbmFtZQpAQCAtMzYxLDI2ICszNTEsMzcg
QEAgc3RhdGljIFN0cmluZyBmb3JtU3RhdGVTaWduYXR1cmUoKQogICAgIHJldHVybiBzaWduYXR1
cmU7CiB9CiAKLXN0ZDo6dW5pcXVlX3B0cjxGb3JtQ29udHJvbGxlcjo6U2F2ZWRGb3JtU3RhdGVN
YXA+IEZvcm1Db250cm9sbGVyOjpjcmVhdGVTYXZlZEZvcm1TdGF0ZU1hcChjb25zdCBGb3JtRWxl
bWVudExpc3RIYXNoU2V0JiBjb250cm9sTGlzdCkKK3N0ZDo6dW5pcXVlX3B0cjxGb3JtQ29udHJv
bGxlcjo6U2F2ZWRGb3JtU3RhdGVNYXA+IEZvcm1Db250cm9sbGVyOjpjcmVhdGVTYXZlZEZvcm1T
dGF0ZU1hcChjb25zdCBGb3JtQ29udHJvbFZlY3RvciYgY29udHJvbExpc3QpCiB7CiAgICAgRm9y
bUtleUdlbmVyYXRvciBrZXlHZW5lcmF0b3I7CiAgICAgYXV0byBzdGF0ZU1hcCA9IG1ha2VVbmlx
dWU8U2F2ZWRGb3JtU3RhdGVNYXA+KCk7Ci0gICAgZm9yIChhdXRvJiBjb250cm9sIDogY29udHJv
bExpc3QpIHsKLSAgICAgICAgaWYgKCFjb250cm9sLT5zaG91bGRTYXZlQW5kUmVzdG9yZUZvcm1D
b250cm9sU3RhdGUoKSkKKyAgICBmb3IgKGNvbnN0IEhUTUxGb3JtQ29udHJvbEVsZW1lbnRXaXRo
U3RhdGUmIGNvbnRyb2wgOiBjb250cm9sTGlzdCkgeworICAgICAgICBpZiAoIWNvbnRyb2wuc2hv
dWxkU2F2ZUFuZFJlc3RvcmVGb3JtQ29udHJvbFN0YXRlKCkpCiAgICAgICAgICAgICBjb250aW51
ZTsKLSAgICAgICAgYXV0byYgZm9ybVN0YXRlID0gc3RhdGVNYXAtPmFkZChrZXlHZW5lcmF0b3Iu
Zm9ybUtleSgqY29udHJvbCkuaW1wbCgpLCBudWxscHRyKS5pdGVyYXRvci0+dmFsdWU7CisgICAg
ICAgIGF1dG8mIGZvcm1TdGF0ZSA9IHN0YXRlTWFwLT5hZGQoa2V5R2VuZXJhdG9yLmZvcm1LZXko
Y29udHJvbCkuaW1wbCgpLCBudWxscHRyKS5pdGVyYXRvci0+dmFsdWU7CiAgICAgICAgIGlmICgh
Zm9ybVN0YXRlKQogICAgICAgICAgICAgZm9ybVN0YXRlID0gbWFrZVVuaXF1ZTxTYXZlZEZvcm1T
dGF0ZT4oKTsKLSAgICAgICAgZm9ybVN0YXRlLT5hcHBlbmRDb250cm9sU3RhdGUoY29udHJvbC0+
bmFtZSgpLCBjb250cm9sLT50eXBlKCksIGNvbnRyb2wtPnNhdmVGb3JtQ29udHJvbFN0YXRlKCkp
OworICAgICAgICBmb3JtU3RhdGUtPmFwcGVuZENvbnRyb2xTdGF0ZShjb250cm9sLm5hbWUoKSwg
Y29udHJvbC50eXBlKCksIGNvbnRyb2wuc2F2ZUZvcm1Db250cm9sU3RhdGUoKSk7CiAgICAgfQog
ICAgIHJldHVybiBzdGF0ZU1hcDsKIH0KIAotVmVjdG9yPFN0cmluZz4gRm9ybUNvbnRyb2xsZXI6
OmZvcm1FbGVtZW50c1N0YXRlKCkgY29uc3QKK1ZlY3RvcjxTdHJpbmc+IEZvcm1Db250cm9sbGVy
Ojpmb3JtRWxlbWVudHNTdGF0ZShjb25zdCBEb2N1bWVudCYgZG9jdW1lbnQpIGNvbnN0CiB7Ci0g
ICAgc3RkOjp1bmlxdWVfcHRyPFNhdmVkRm9ybVN0YXRlTWFwPiBzdGF0ZU1hcCA9IGNyZWF0ZVNh
dmVkRm9ybVN0YXRlTWFwKG1fZm9ybUVsZW1lbnRzV2l0aFN0YXRlKTsKKyAgICAvLyBGSVhNRTog
V2Ugc2hvdWxkIGJlIHNhdmluZyB0aGUgc3RhdGUgb2YgZm9ybSBjb250cm9scyBpbiBzaGFkb3cg
dHJlZXMsIHRvby4KKyAgICBGb3JtQ29udHJvbFZlY3RvciBjb250cm9sczsKKyAgICBmb3IgKGF1
dG8mIGNvbnRyb2wgOiBkZXNjZW5kYW50c09mVHlwZTxIVE1MRm9ybUNvbnRyb2xFbGVtZW50V2l0
aFN0YXRlPihkb2N1bWVudCkpIHsKKyAgICAgICAgQVNTRVJUKGNvbnRyb2wuaW5zZXJ0aW9uSW5k
ZXgoKSk7CisgICAgICAgIGNvbnRyb2xzLmFwcGVuZChjb250cm9sKTsKKyAgICB9CisKKyAgICBz
dGQ6OnNvcnQoY29udHJvbHMuYmVnaW4oKSwgY29udHJvbHMuZW5kKCksIFtdKGF1dG8gYSwgYXV0
byBiKSB7CisgICAgICAgIHJldHVybiBhLmdldCgpLmluc2VydGlvbkluZGV4KCkgPCBiLmdldCgp
Lmluc2VydGlvbkluZGV4KCk7CisgICAgfSk7CisKKyAgICBhdXRvIHN0YXRlTWFwID0gY3JlYXRl
U2F2ZWRGb3JtU3RhdGVNYXAoY29udHJvbHMpOwogICAgIFZlY3RvcjxTdHJpbmc+IHN0YXRlVmVj
dG9yOwotICAgIHN0YXRlVmVjdG9yLnJlc2VydmVJbml0aWFsQ2FwYWNpdHkobV9mb3JtRWxlbWVu
dHNXaXRoU3RhdGUuc2l6ZSgpICogNCk7CisgICAgc3RhdGVWZWN0b3IucmVzZXJ2ZUluaXRpYWxD
YXBhY2l0eShjb250cm9scy5zaXplKCkgKiA0KTsKICAgICBzdGF0ZVZlY3Rvci5hcHBlbmQoZm9y
bVN0YXRlU2lnbmF0dXJlKCkpOwogICAgIGZvciAoYXV0byYgc3RhdGUgOiAqc3RhdGVNYXApIHsK
ICAgICAgICAgc3RhdGVWZWN0b3IuYXBwZW5kKHN0YXRlLmtleS5nZXQoKSk7CkBAIC00ODQsMTYg
KzQ4NSw0IEBAIFZlY3RvcjxTdHJpbmc+IEZvcm1Db250cm9sbGVyOjpyZWZlcmVuY2VkRmlsZVBh
dGhzKGNvbnN0IFZlY3RvcjxTdHJpbmc+JiBzdGF0ZVZlCiAgICAgcmV0dXJuIHBhdGhzOwogfQog
Ci12b2lkIEZvcm1Db250cm9sbGVyOjpyZWdpc3RlckZvcm1FbGVtZW50V2l0aFN0YXRlKEhUTUxG
b3JtQ29udHJvbEVsZW1lbnRXaXRoU3RhdGUmIGNvbnRyb2wpCi17Ci0gICAgQVNTRVJUKCFtX2Zv
cm1FbGVtZW50c1dpdGhTdGF0ZS5jb250YWlucygmY29udHJvbCkpOwotICAgIG1fZm9ybUVsZW1l
bnRzV2l0aFN0YXRlLmFkZCgmY29udHJvbCk7Ci19Ci0KLXZvaWQgRm9ybUNvbnRyb2xsZXI6OnVu
cmVnaXN0ZXJGb3JtRWxlbWVudFdpdGhTdGF0ZShIVE1MRm9ybUNvbnRyb2xFbGVtZW50V2l0aFN0
YXRlJiBjb250cm9sKQotewotICAgIEFTU0VSVChtX2Zvcm1FbGVtZW50c1dpdGhTdGF0ZS5jb250
YWlucygmY29udHJvbCkpOwotICAgIG1fZm9ybUVsZW1lbnRzV2l0aFN0YXRlLnJlbW92ZSgmY29u
dHJvbCk7Ci19Ci0KIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1NvdXJjZS9X
ZWJDb3JlL2h0bWwvRm9ybUNvbnRyb2xsZXIuaCBiL1NvdXJjZS9XZWJDb3JlL2h0bWwvRm9ybUNv
bnRyb2xsZXIuaAppbmRleCBhMTM1MmY1ODZiZWZhYTFmNmIwNzEyYjkwZWJmZGZhYmYzYzBhYzg2
Li5hYWNhYTQyNjRlMDFkMmEzYjAxZDc4NWIxMjA2ZTU3NWI5M2Y3Mjc3IDEwMDY0NAotLS0gYS9T
b3VyY2UvV2ViQ29yZS9odG1sL0Zvcm1Db250cm9sbGVyLmgKKysrIGIvU291cmNlL1dlYkNvcmUv
aHRtbC9Gb3JtQ29udHJvbGxlci5oCkBAIC00MiwxMiArNDIsNyBAQCBwdWJsaWM6CiAgICAgRm9y
bUNvbnRyb2xsZXIoKTsKICAgICB+Rm9ybUNvbnRyb2xsZXIoKTsKIAotICAgIHZvaWQgcmVnaXN0
ZXJGb3JtRWxlbWVudFdpdGhTdGF0ZShIVE1MRm9ybUNvbnRyb2xFbGVtZW50V2l0aFN0YXRlJik7
Ci0gICAgdm9pZCB1bnJlZ2lzdGVyRm9ybUVsZW1lbnRXaXRoU3RhdGUoSFRNTEZvcm1Db250cm9s
RWxlbWVudFdpdGhTdGF0ZSYpOwotCi0gICAgdW5zaWduZWQgZm9ybUVsZW1lbnRzQ2hhcmFjdGVy
Q291bnQoKSBjb25zdDsKLQotICAgIFZlY3RvcjxTdHJpbmc+IGZvcm1FbGVtZW50c1N0YXRlKCkg
Y29uc3Q7CisgICAgVmVjdG9yPFN0cmluZz4gZm9ybUVsZW1lbnRzU3RhdGUoY29uc3QgRG9jdW1l
bnQmKSBjb25zdDsKICAgICB2b2lkIHNldFN0YXRlRm9yTmV3Rm9ybUVsZW1lbnRzKGNvbnN0IFZl
Y3RvcjxTdHJpbmc+Jik7CiAKICAgICB2b2lkIHdpbGxEZWxldGVGb3JtKEhUTUxGb3JtRWxlbWVu
dCYpOwpAQCAtNTgsMTQgKzUzLDEzIEBAIHB1YmxpYzoKICAgICBXRUJDT1JFX0VYUE9SVCBzdGF0
aWMgVmVjdG9yPFN0cmluZz4gcmVmZXJlbmNlZEZpbGVQYXRocyhjb25zdCBWZWN0b3I8U3RyaW5n
PiYgc3RhdGVWZWN0b3IpOwogCiBwcml2YXRlOgotICAgIHR5cGVkZWYgTGlzdEhhc2hTZXQ8UmVm
UHRyPEhUTUxGb3JtQ29udHJvbEVsZW1lbnRXaXRoU3RhdGU+PiBGb3JtRWxlbWVudExpc3RIYXNo
U2V0OwotICAgIHR5cGVkZWYgSGFzaE1hcDxSZWZQdHI8QXRvbVN0cmluZ0ltcGw+LCBzdGQ6OnVu
aXF1ZV9wdHI8U2F2ZWRGb3JtU3RhdGU+PiBTYXZlZEZvcm1TdGF0ZU1hcDsKKyAgICB1c2luZyBG
b3JtQ29udHJvbFZlY3RvciA9IFZlY3RvcjxzdGQ6OnJlZmVyZW5jZV93cmFwcGVyPGNvbnN0IEhU
TUxGb3JtQ29udHJvbEVsZW1lbnRXaXRoU3RhdGU+PjsKKyAgICB1c2luZyBTYXZlZEZvcm1TdGF0
ZU1hcCA9IEhhc2hNYXA8UmVmUHRyPEF0b21TdHJpbmdJbXBsPiwgc3RkOjp1bmlxdWVfcHRyPFNh
dmVkRm9ybVN0YXRlPj47CiAKLSAgICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPFNhdmVkRm9ybVN0
YXRlTWFwPiBjcmVhdGVTYXZlZEZvcm1TdGF0ZU1hcChjb25zdCBGb3JtRWxlbWVudExpc3RIYXNo
U2V0Jik7CisgICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxTYXZlZEZvcm1TdGF0ZU1hcD4gY3Jl
YXRlU2F2ZWRGb3JtU3RhdGVNYXAoY29uc3QgRm9ybUNvbnRyb2xWZWN0b3ImKTsKICAgICBGb3Jt
Q29udHJvbFN0YXRlIHRha2VTdGF0ZUZvckZvcm1FbGVtZW50KGNvbnN0IEhUTUxGb3JtQ29udHJv
bEVsZW1lbnRXaXRoU3RhdGUmKTsKICAgICBzdGF0aWMgdm9pZCBmb3JtU3RhdGVzRnJvbVN0YXRl
VmVjdG9yKGNvbnN0IFZlY3RvcjxTdHJpbmc+JiwgU2F2ZWRGb3JtU3RhdGVNYXAmKTsKIAotICAg
IEZvcm1FbGVtZW50TGlzdEhhc2hTZXQgbV9mb3JtRWxlbWVudHNXaXRoU3RhdGU7CiAgICAgU2F2
ZWRGb3JtU3RhdGVNYXAgbV9zYXZlZEZvcm1TdGF0ZU1hcDsKICAgICBzdGQ6OnVuaXF1ZV9wdHI8
Rm9ybUtleUdlbmVyYXRvcj4gbV9mb3JtS2V5R2VuZXJhdG9yOwogfTsKZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJDb3JlL2h0bWwvSFRNTEZvcm1Db250cm9sRWxlbWVudFdpdGhTdGF0ZS5jcHAgYi9T
b3VyY2UvV2ViQ29yZS9odG1sL0hUTUxGb3JtQ29udHJvbEVsZW1lbnRXaXRoU3RhdGUuY3BwCmlu
ZGV4IGU5YTI4NTI0NzdkMGFlYmJjZGNkZjgxNjk5NGI0OTE3ZTg0MDIxMDguLjIwZWQ4M2Y2Njhj
NTcxNjc0NGRjNDI3NTNiZjNhYTY4ZTFkNjY1MGQgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3Jl
L2h0bWwvSFRNTEZvcm1Db250cm9sRWxlbWVudFdpdGhTdGF0ZS5jcHAKKysrIGIvU291cmNlL1dl
YkNvcmUvaHRtbC9IVE1MRm9ybUNvbnRyb2xFbGVtZW50V2l0aFN0YXRlLmNwcApAQCAtNDMsMTUg
KzQzLDEzIEBAIEhUTUxGb3JtQ29udHJvbEVsZW1lbnRXaXRoU3RhdGU6On5IVE1MRm9ybUNvbnRy
b2xFbGVtZW50V2l0aFN0YXRlKCkgPSBkZWZhdWx0OwogCiBOb2RlOjpJbnNlcnRlZEludG9BbmNl
c3RvclJlc3VsdCBIVE1MRm9ybUNvbnRyb2xFbGVtZW50V2l0aFN0YXRlOjppbnNlcnRlZEludG9B
bmNlc3RvcihJbnNlcnRpb25UeXBlIGluc2VydGlvblR5cGUsIENvbnRhaW5lck5vZGUmIHBhcmVu
dE9mSW5zZXJ0ZWRUcmVlKQogewotICAgIGlmIChpbnNlcnRpb25UeXBlLmNvbm5lY3RlZFRvRG9j
dW1lbnQgJiYgIWNvbnRhaW5pbmdTaGFkb3dSb290KCkpCi0gICAgICAgIGRvY3VtZW50KCkuZm9y
bUNvbnRyb2xsZXIoKS5yZWdpc3RlckZvcm1FbGVtZW50V2l0aFN0YXRlKCp0aGlzKTsKKyAgICBt
X2luc2VydGlvbkluZGV4ID0gKytsYXN0SW5zZXJ0aW9uSW5kZXg7CiAgICAgcmV0dXJuIEhUTUxG
b3JtQ29udHJvbEVsZW1lbnQ6Omluc2VydGVkSW50b0FuY2VzdG9yKGluc2VydGlvblR5cGUsIHBh
cmVudE9mSW5zZXJ0ZWRUcmVlKTsKIH0KIAogdm9pZCBIVE1MRm9ybUNvbnRyb2xFbGVtZW50V2l0
aFN0YXRlOjpyZW1vdmVkRnJvbUFuY2VzdG9yKFJlbW92YWxUeXBlIHJlbW92YWxUeXBlLCBDb250
YWluZXJOb2RlJiBvbGRQYXJlbnRPZlJlbW92ZWRUcmVlKQogewotICAgIGlmIChyZW1vdmFsVHlw
ZS5kaXNjb25uZWN0ZWRGcm9tRG9jdW1lbnQgJiYgIWNvbnRhaW5pbmdTaGFkb3dSb290KCkgJiYg
IW9sZFBhcmVudE9mUmVtb3ZlZFRyZWUuY29udGFpbmluZ1NoYWRvd1Jvb3QoKSkKLSAgICAgICAg
ZG9jdW1lbnQoKS5mb3JtQ29udHJvbGxlcigpLnVucmVnaXN0ZXJGb3JtRWxlbWVudFdpdGhTdGF0
ZSgqdGhpcyk7CisgICAgbV9pbnNlcnRpb25JbmRleCA9IDA7CiAgICAgSFRNTEZvcm1Db250cm9s
RWxlbWVudDo6cmVtb3ZlZEZyb21BbmNlc3RvcihyZW1vdmFsVHlwZSwgb2xkUGFyZW50T2ZSZW1v
dmVkVHJlZSk7CiB9CiAKQEAgLTg0LDQgKzgyLDYgQEAgYm9vbCBIVE1MRm9ybUNvbnRyb2xFbGVt
ZW50V2l0aFN0YXRlOjppc0Zvcm1Db250cm9sRWxlbWVudFdpdGhTdGF0ZSgpIGNvbnN0CiAgICAg
cmV0dXJuIHRydWU7CiB9CiAKK3VpbnQ2NF90IEhUTUxGb3JtQ29udHJvbEVsZW1lbnRXaXRoU3Rh
dGU6Omxhc3RJbnNlcnRpb25JbmRleCB7IDAgfTsKKwogfSAvLyBuYW1lc3BhY2UgV2ViY29yZQpk
aWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvaHRtbC9IVE1MRm9ybUNvbnRyb2xFbGVtZW50V2l0
aFN0YXRlLmggYi9Tb3VyY2UvV2ViQ29yZS9odG1sL0hUTUxGb3JtQ29udHJvbEVsZW1lbnRXaXRo
U3RhdGUuaAppbmRleCBmYWZiYjhkMzhiM2NmMzFlNjY2MmMxNzUzOWNhN2E3MWY5ZjRkMWU0Li4z
OTZhYzRhYzUxNjkxODQ0MzI0Y2M3NGMyODAxNDM5NGUyZjA3NGY3IDEwMDY0NAotLS0gYS9Tb3Vy
Y2UvV2ViQ29yZS9odG1sL0hUTUxGb3JtQ29udHJvbEVsZW1lbnRXaXRoU3RhdGUuaAorKysgYi9T
b3VyY2UvV2ViQ29yZS9odG1sL0hUTUxGb3JtQ29udHJvbEVsZW1lbnRXaXRoU3RhdGUuaApAQCAt
MzgsNiArMzgsOCBAQCBwdWJsaWM6CiAgICAgdmlydHVhbCBGb3JtQ29udHJvbFN0YXRlIHNhdmVG
b3JtQ29udHJvbFN0YXRlKCkgY29uc3Q7CiAgICAgdmlydHVhbCB2b2lkIHJlc3RvcmVGb3JtQ29u
dHJvbFN0YXRlKGNvbnN0IEZvcm1Db250cm9sU3RhdGUmKSB7IH0gLy8gQ2FsbGVkIG9ubHkgaWYg
c3RhdGUgaXMgbm90IGVtcHR5LgogCisgICAgdWludDY0X3QgaW5zZXJ0aW9uSW5kZXgoKSBjb25z
dCB7IHJldHVybiBtX2luc2VydGlvbkluZGV4OyB9CisKIHByb3RlY3RlZDoKICAgICBIVE1MRm9y
bUNvbnRyb2xFbGVtZW50V2l0aFN0YXRlKGNvbnN0IFF1YWxpZmllZE5hbWUmIHRhZ05hbWUsIERv
Y3VtZW50JiwgSFRNTEZvcm1FbGVtZW50Kik7CiAKQEAgLTUwLDEwICs1MiwxNSBAQCBwcm90ZWN0
ZWQ6CiAKIHByaXZhdGU6CiAgICAgYm9vbCBpc0Zvcm1Db250cm9sRWxlbWVudFdpdGhTdGF0ZSgp
IGNvbnN0IGZpbmFsOworCisgICAgdWludDY0X3QgbV9pbnNlcnRpb25JbmRleCB7IDAgfTsKKyAg
ICBzdGF0aWMgdWludDY0X3QgbGFzdEluc2VydGlvbkluZGV4OwogfTsKIAogfSAvLyBuYW1lc3Bh
Y2UgV2ViQ29yZQogCiBTUEVDSUFMSVpFX1RZUEVfVFJBSVRTX0JFR0lOKFdlYkNvcmU6OkhUTUxG
b3JtQ29udHJvbEVsZW1lbnRXaXRoU3RhdGUpCisgICAgc3RhdGljIGJvb2wgaXNUeXBlKGNvbnN0
IFdlYkNvcmU6OkVsZW1lbnQmIGVsZW1lbnQpIHsgcmV0dXJuIGVsZW1lbnQuaXNGb3JtQ29udHJv
bEVsZW1lbnRXaXRoU3RhdGUoKTsgfQorICAgIHN0YXRpYyBib29sIGlzVHlwZShjb25zdCBXZWJD
b3JlOjpOb2RlJiBub2RlKSB7IHJldHVybiBpczxXZWJDb3JlOjpFbGVtZW50Pihub2RlKSAmJiBp
c1R5cGUoZG93bmNhc3Q8V2ViQ29yZTo6RWxlbWVudD4obm9kZSkpOyB9CiAgICAgc3RhdGljIGJv
b2wgaXNUeXBlKGNvbnN0IFdlYkNvcmU6OkZvcm1Bc3NvY2lhdGVkRWxlbWVudCYgZWxlbWVudCkg
eyByZXR1cm4gZWxlbWVudC5pc0Zvcm1Db250cm9sRWxlbWVudFdpdGhTdGF0ZSgpOyB9CiBTUEVD
SUFMSVpFX1RZUEVfVFJBSVRTX0VORCgpCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wYWdl
L0ZyYW1lLmggYi9Tb3VyY2UvV2ViQ29yZS9wYWdlL0ZyYW1lLmgKaW5kZXggZjBmOWE4YTQyNGM0
NjBjZDkzMGFkNWI1NmRlZmY1ZGIwOTg0OTVmMC4uMzdjMWNiNmI1ZDc3OWQ1YTNjMmFiZGQ3YTYy
NWU5OTAxMWQ5OTcxYyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGFnZS9GcmFtZS5oCisr
KyBiL1NvdXJjZS9XZWJDb3JlL3BhZ2UvRnJhbWUuaApAQCAtMjgyLDcgKzI4Miw2IEBAIHB1Ymxp
YzoKICAgICBXRUJDT1JFX0VYUE9SVCB2b2lkIHVwZGF0ZUxheW91dCgpIGNvbnN0OwogICAgIFdF
QkNPUkVfRVhQT1JUIE5TUmVjdCBjYXJldFJlY3QoKTsKICAgICBXRUJDT1JFX0VYUE9SVCBOU1Jl
Y3QgcmVjdEZvclNjcm9sbFRvVmlzaWJsZSgpOwotICAgIFdFQkNPUkVfRVhQT1JUIHVuc2lnbmVk
IGZvcm1FbGVtZW50c0NoYXJhY3RlckNvdW50KCkgY29uc3Q7CiAKICAgICAvLyBUaGlzIGZ1bmN0
aW9uIGlzIHVzZWQgYnkgTGVnYWN5IFdlYktpdC4KICAgICBXRUJDT1JFX0VYUE9SVCB2b2lkIHNl
dFRpbWVyc1BhdXNlZChib29sKTsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BhZ2UvaW9z
L0ZyYW1lSU9TLm1tIGIvU291cmNlL1dlYkNvcmUvcGFnZS9pb3MvRnJhbWVJT1MubW0KaW5kZXgg
YTQ5OTllMjFmYTJkOTEyZGMzMmVlMzlhN2QxZDMyZWVmYTIwODNjNy4uMGEwMzZhMTQ5ZTNhM2Uw
N2FmMTkyZWYzZWVlNmViMjA3OTUwMTVhMSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGFn
ZS9pb3MvRnJhbWVJT1MubW0KKysrIGIvU291cmNlL1dlYkNvcmUvcGFnZS9pb3MvRnJhbWVJT1Mu
bW0KQEAgLTYyNywxNCArNjI3LDYgQEAgTlNSZWN0IEZyYW1lOjpyZWN0Rm9yU2Nyb2xsVG9WaXNp
YmxlKCkKICAgICByZXR1cm4gdW5pb25SZWN0KHNlbGVjdGlvbi52aXNpYmxlU3RhcnQoKS5hYnNv
bHV0ZUNhcmV0Qm91bmRzKCksIHNlbGVjdGlvbi52aXNpYmxlRW5kKCkuYWJzb2x1dGVDYXJldEJv
dW5kcygpKTsKIH0KIAotdW5zaWduZWQgRnJhbWU6OmZvcm1FbGVtZW50c0NoYXJhY3RlckNvdW50
KCkgY29uc3QKLXsKLSAgICBEb2N1bWVudCogZG9jdW1lbnQgPSB0aGlzLT5kb2N1bWVudCgpOwot
ICAgIGlmICghZG9jdW1lbnQpCi0gICAgICAgIHJldHVybiAwOwotICAgIHJldHVybiBkb2N1bWVu
dC0+Zm9ybUNvbnRyb2xsZXIoKS5mb3JtRWxlbWVudHNDaGFyYWN0ZXJDb3VudCgpOwotfQotCiB2
b2lkIEZyYW1lOjpzZXRUaW1lcnNQYXVzZWQoYm9vbCBwYXVzZWQpCiB7CiAgICAgaWYgKCFtX3Bh
Z2UpCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0TGVnYWN5L21hYy9XZWJWaWV3L1dlYkZyYW1l
Lm1tIGIvU291cmNlL1dlYktpdExlZ2FjeS9tYWMvV2ViVmlldy9XZWJGcmFtZS5tbQppbmRleCBj
MDQxOWFmYjcwNTFjZGJkZjMwZWExNmUxMjE1ZDMxYTQ1ZDYwZjNkLi4wZDdmMGQyODQ2YThiZmY5
OTA1YmRmNDc0N2ZhOTA3MzEyMDQyNDdiIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0TGVnYWN5
L21hYy9XZWJWaWV3L1dlYkZyYW1lLm1tCisrKyBiL1NvdXJjZS9XZWJLaXRMZWdhY3kvbWFjL1dl
YlZpZXcvV2ViRnJhbWUubW0KQEAgLTExNjMsMTEgKzExNjMsNiBAQCAtICh2b2lkKV9yZWN1cnNp
dmVfcGF1c2VOdWxsRXZlbnRzRm9yQWxsTmV0c2NhcGVQbHVnaW5zCiAKICNpZiBQTEFURk9STShJ
T1NfRkFNSUxZKQogCi0tICh1bnNpZ25lZClmb3JtRWxlbWVudHNDaGFyYWN0ZXJDb3VudAotewot
ICAgIHJldHVybiBjb3JlKHNlbGYpLT5mb3JtRWxlbWVudHNDaGFyYWN0ZXJDb3VudCgpOwotfQot
CiAtICh2b2lkKXNldFRpbWVvdXRzUGF1c2VkOihCT09MKWZsYWcKIHsKICAgICBpZiAoW3NlbGYg
X3dlYkhUTUxEb2N1bWVudFZpZXddKSB7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0TGVnYWN5
L21hYy9XZWJWaWV3L1dlYkZyYW1lUHJpdmF0ZS5oIGIvU291cmNlL1dlYktpdExlZ2FjeS9tYWMv
V2ViVmlldy9XZWJGcmFtZVByaXZhdGUuaAppbmRleCBjZWYxMjJiYmYxYmU5MTY0Yzg0ZjQyMWUx
MGVhOTg2MjIwNjI5MTdiLi5lZDhiNmI2MzZiMGE2ZTU1MDRlMTllOTk1ODQ3NWEzN2U1ZDVkYmUz
IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0TGVnYWN5L21hYy9XZWJWaWV3L1dlYkZyYW1lUHJp
dmF0ZS5oCisrKyBiL1NvdXJjZS9XZWJLaXRMZWdhY3kvbWFjL1dlYlZpZXcvV2ViRnJhbWVQcml2
YXRlLmgKQEAgLTk1LDcgKzk1LDYgQEAgdHlwZWRlZiBlbnVtIHsKIC0gKEJPT0wpbmVlZHNMYXlv
dXQ7IC8vIE5lZWRlZCBmb3IgTWFpbCA8cmRhcjovL3Byb2JsZW0vNjIyODAzOD4KIC0gKHZvaWQp
X3NldExvYWRzU3luY2hyb25vdXNseTooQk9PTClmbGFnOwogLSAoQk9PTClfbG9hZHNTeW5jaHJv
bm91c2x5OwotLSAodW5zaWduZWQpZm9ybUVsZW1lbnRzQ2hhcmFjdGVyQ291bnQ7CiAtICh2b2lk
KXNldFRpbWVvdXRzUGF1c2VkOihCT09MKWZsYWc7CiAKIC8qIQo=
</data>

          </attachment>
      

    </bug>

</bugzilla>