<?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>190107</bug_id>
          
          <creation_ts>2018-09-28 21:08:23 -0700</creation_ts>
          <short_desc>Use Position instead of Range in createMarkupInternal</short_desc>
          <delta_ts>2018-09-30 22:30:04 -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>HTML Editing</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>
          
          <blocked>190108</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Ryosuke Niwa">rniwa</reporter>
          <assigned_to name="Ryosuke Niwa">rniwa</assigned_to>
          <cc>darin</cc>
    
    <cc>ews-watchlist</cc>
    
    <cc>koivisto</cc>
    
    <cc>webkit-bug-importer</cc>
    
    <cc>wenson_hsieh</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1464698</commentid>
    <comment_count>0</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2018-09-28 21:08:23 -0700</bug_when>
    <thetext>Rename createMarkupInternal to serializePreservingVisualAppearanceInternal to match the rename done in the bug 190086,
and use two Position&apos;s for start and end instead of Range in preparation to support copy &amp; paste across shadow boundaries.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1464704</commentid>
    <comment_count>1</comment_count>
      <attachid>351168</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2018-09-28 21:24:16 -0700</bug_when>
    <thetext>Created attachment 351168
Cleanup</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1464705</commentid>
    <comment_count>2</comment_count>
      <attachid>351169</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2018-09-28 21:25:28 -0700</bug_when>
    <thetext>Created attachment 351169
Cleanup</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1464706</commentid>
    <comment_count>3</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2018-09-28 21:26:07 -0700</bug_when>
    <thetext>&lt;rdar://problem/44882459&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1464707</commentid>
    <comment_count>4</comment_count>
    <who name="EWS Watchlist">ews-watchlist</who>
    <bug_when>2018-09-28 21:26:57 -0700</bug_when>
    <thetext>Attachment 351169 did not pass style-queue:


ERROR: Source/WebCore/editing/markup.cpp:283:  Code inside a namespace should not be indented.  [whitespace/indent] [4]
ERROR: Source/WebCore/editing/markup.cpp:283:  Wrong number of spaces before statement. (expected: 8)  [whitespace/indent] [4]
ERROR: Source/WebCore/editing/markup.cpp:284:  Wrong number of spaces before statement. (expected: 8)  [whitespace/indent] [4]
ERROR: Source/WebCore/editing/markup.cpp:285:  Wrong number of spaces before statement. (expected: 8)  [whitespace/indent] [4]
Total errors found: 4 in 8 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1464715</commentid>
    <comment_count>5</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2018-09-28 22:47:14 -0700</bug_when>
    <thetext>Hm... WinCairo EWS bot appears to be sick :( Will email webkit-dev.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1464724</commentid>
    <comment_count>6</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2018-09-28 23:37:11 -0700</bug_when>
    <thetext>Once this patch is landed, I&apos;m fixing a bug that line breaks inserted for interchange ends up getting inserted inside the last table cell when copying &amp; pasting a whole table, which is demonstrated in LayoutTests/editing/pasteboard/paste-table-003.html

See the bug 190108 for the fix dependent on this refactoring.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1464888</commentid>
    <comment_count>7</comment_count>
      <attachid>351169</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2018-09-30 19:31:51 -0700</bug_when>
    <thetext>Comment on attachment 351169
Cleanup

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

This change is definitely a good idea. Using Range internally in WebKit code is not a great pattern for multiple reasons; creating and destroying Range objects is quite costly because of they feature where ranges automatically update as a document is mutated.

On the other hand, maybe some day we will want to use a structure holding two Position objects for this kind of thing rather than two separate Position objects.

Functions that take two Position objects need to be prepared for them to be out of order. The same is not true for functions that take Range objects. I am concerned that we don’t get this exactly right, although I didn&apos;t spot any obvious problems here.

&gt; Source/WebCore/dom/Position.cpp:253
&gt; +    auto container = makeRefPtr(containerNode());

Seems strange to use a RefPtr here, but not for the result of computeNodeAfterPosition. Neither needs it.

&gt; Source/WebCore/dom/Position.cpp:256
&gt; +    if (is&lt;CharacterData&gt;(container))

Can be &quot;*character&quot;; might save a null check or might have no effect.

&gt; Source/WebCore/dom/Position.h:106
&gt; +    RefPtr&lt;Node&gt; firstNode() const;

In the old days this would return a Node*, not a RefPtr&lt;Node&gt;, but maybe it’s good design direction for newly written functions to use RefPtr to make the use of the function safer.

&gt; Source/WebCore/editing/MarkupAccumulator.cpp:123
&gt;      , m_prefixLevel(0)

Should initialize this in class definition.

&gt; Source/WebCore/editing/markup.cpp:223
&gt; +    StyledMarkupAccumulator(const Position&amp; start, const Position&amp; end, Vector&lt;Node*&gt;* nodes,
&gt; +        ResolveURLs, AnnotateForInterchange, MSOListMode, bool needsPositionStyleConversion, Node* highestNodeToBeSerialized = nullptr);

I think that soon this class should be broken out into its own source file.

&gt; Source/WebCore/editing/markup.cpp:396
&gt; +    if (m_start.isNull() &amp;&amp; m_end.isNull())
&gt; +        return text.data();

This special case is not needed; the code below will do the same. I also don’t think it’s an important performance optimization.

&gt; Source/WebCore/editing/markup.cpp:398
&gt; +    String textData = text.data();

We don’t really need this local variable.

&gt; Source/WebCore/editing/markup.cpp:400
&gt; +    unsigned end = textData.length();

This could be std::numeric_limits&lt;unsigned&gt;::max() with no effect on the behavior of the function; substring clamps properly.

&gt; Source/WebCore/editing/markup.cpp:405
&gt; +    ASSERT(start &lt; end);

This is a very late moment to check this invariant; the mistake that made it untrue will be *very* far from here. It’s possible that m_start and m_end will both point to the same text node, and the offsets will be out of order with the start one after the end one. I don’t know where the checks that guarantee that won’t happen are; I don’t think they are anywhere inside the StyledMarkupAccumulator class.

I think this is a fragile way to construct the code. One possible solution would be to make this function robust in the face of such unusual inputs, which would be very easy to do, just replace &quot;end - start&quot; with zero-clamping subtraction rather than standard subtraction that will underflow and result in a large number. Another solution would be to enforce the invariant in the constructor.

This is a new problem that did not exist when we were using Range, since the Range constructor does enforce this invariant.

&gt; Source/WebCore/editing/markup.cpp:509
&gt; +    Node* startNode = start.firstNode().get();

This line of code seems dangerous. Why is it OK to just call get on a RefPtr and then let it fall out of scope? Doing get() here seems inconsistent with the design direction that inspired us to make the firstNode function return a RefPtr.

&gt; Source/WebCore/editing/markup.cpp:762
&gt; +    if (start.isNull() || end.isNull() || !comparePositions(start, end))

The two null checks here aren’t needed. The comparePositions function already returns 0 if either of the two positions is null.

But also, it seems a bit peculiar and a bit expensive to call comparePositions here and it’s not clear what the check is intended to do. After all &quot;!comparePositions(a, b)&quot; is roughly the same as &quot;a == b&quot;. The expensive operation is figuring out -1 vs. +1, not 0 vs. non-0. Is the check truly required?

&gt; Source/WebCore/editing/markup.h:49
&gt; +class VisibleSelection;

Why are we adding this in this patch? Maybe it’s part of the next patch?

&gt; Source/WebCore/editing/markup.h:74
&gt; -WEBCORE_EXPORT String serializePreservingVisualAppearance(const Range&amp;, Vector&lt;Node*&gt;* = nullptr, AnnotateForInterchange = AnnotateForInterchange::No, ConvertBlocksToInlines = ConvertBlocksToInlines::No, ResolveURLs = ResolveURLs::No);
&gt; +WEBCORE_EXPORT String serializePreservingVisualAppearance(const Range&amp;, Vector&lt;Node*&gt;* = nullptr,
&gt; +    AnnotateForInterchange = AnnotateForInterchange::No, ConvertBlocksToInlines = ConvertBlocksToInlines::No, ResolveURLs = ResolveURLs::No);

This change just seems to be adding a line break. Can we omit it? Maybe it makes more sense in the follow-up patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1464907</commentid>
    <comment_count>8</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2018-09-30 22:03:52 -0700</bug_when>
    <thetext>(In reply to Darin Adler from comment #7)
&gt; Comment on attachment 351169 [details]
&gt; Cleanup
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=351169&amp;action=review
&gt; 
&gt; This change is definitely a good idea. Using Range internally in WebKit code
&gt; is not a great pattern for multiple reasons; creating and destroying Range
&gt; objects is quite costly because of they feature where ranges automatically
&gt; update as a document is mutated.
&gt; 
&gt; On the other hand, maybe some day we will want to use a structure holding
&gt; two Position objects for this kind of thing rather than two separate
&gt; Position objects.

Yes!

We already have VisibleSelection but that one really corresponds to VisibleSelection
so I think we want some kind of PositionRange / PositionPair / etc...

In fact, if I remember correctly, some parts of accessibility code
uses some struct which stores information equivalent to Position.

&gt; Functions that take two Position objects need to be prepared for them to be
&gt; out of order. The same is not true for functions that take Range objects. I
&gt; am concerned that we don’t get this exactly right, although I didn&apos;t spot
&gt; any obvious problems here.

Yeah, that is definitely a concern if this pattern starts getting used in more places.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1464908</commentid>
    <comment_count>9</comment_count>
      <attachid>351169</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2018-09-30 22:23:56 -0700</bug_when>
    <thetext>Comment on attachment 351169
Cleanup

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

Thanks for the review!

&gt;&gt; Source/WebCore/dom/Position.cpp:253
&gt;&gt; +    auto container = makeRefPtr(containerNode());
&gt; 
&gt; Seems strange to use a RefPtr here, but not for the result of computeNodeAfterPosition. Neither needs it.

Yeah, I&apos;m trying to avoid using raw pointers.

&gt;&gt; Source/WebCore/dom/Position.cpp:256
&gt;&gt; +    if (is&lt;CharacterData&gt;(container))
&gt; 
&gt; Can be &quot;*character&quot;; might save a null check or might have no effect.

Will fix.

&gt;&gt; Source/WebCore/dom/Position.h:106
&gt;&gt; +    RefPtr&lt;Node&gt; firstNode() const;
&gt; 
&gt; In the old days this would return a Node*, not a RefPtr&lt;Node&gt;, but maybe it’s good design direction for newly written functions to use RefPtr to make the use of the function safer.

I think the goal of no-raw pointer is to avoid having to think about whether this function is safe to use a raw pointer, etc...
I tend to agree that this function maybe simple enough that it doesn&apos;t warrant a RefPtr
but I think that kind of reasoning can be confusing and may lead to bugs.
We really need to figure out &amp; solidify what the &quot;correct&quot; rule for when &amp; when not to use raw pointers.
For now, I&apos;m gonna stick with RefPtr.

&gt;&gt; Source/WebCore/editing/MarkupAccumulator.cpp:123
&gt;&gt;      , m_prefixLevel(0)
&gt; 
&gt; Should initialize this in class definition.

Will fix.

&gt;&gt; Source/WebCore/editing/markup.cpp:223
&gt;&gt; +        ResolveURLs, AnnotateForInterchange, MSOListMode, bool needsPositionStyleConversion, Node* highestNodeToBeSerialized = nullptr);
&gt; 
&gt; I think that soon this class should be broken out into its own source file.

Yes. In fact, this class probably shouldn&apos;t even inherit from MarkupAccumulator.
This class traverses nodes completely differently from MarkupAccumulator, etc...
I think a better design would be for MarkupAccumulator to expose some helper functions, which StyledMarkupAccumulator uses.

&gt;&gt; Source/WebCore/editing/markup.cpp:396
&gt;&gt; +        return text.data();
&gt; 
&gt; This special case is not needed; the code below will do the same. I also don’t think it’s an important performance optimization.

That&apos;s good point. Will remove.

&gt;&gt; Source/WebCore/editing/markup.cpp:398
&gt;&gt; +    String textData = text.data();
&gt; 
&gt; We don’t really need this local variable.

Sure, will remove.

&gt;&gt; Source/WebCore/editing/markup.cpp:400
&gt;&gt; +    unsigned end = textData.length();
&gt; 
&gt; This could be std::numeric_limits&lt;unsigned&gt;::max() with no effect on the behavior of the function; substring clamps properly.

That&apos;s a good point. Will do.

&gt;&gt; Source/WebCore/editing/markup.cpp:405
&gt;&gt; +    ASSERT(start &lt; end);
&gt; 
&gt; This is a very late moment to check this invariant; the mistake that made it untrue will be *very* far from here. It’s possible that m_start and m_end will both point to the same text node, and the offsets will be out of order with the start one after the end one. I don’t know where the checks that guarantee that won’t happen are; I don’t think they are anywhere inside the StyledMarkupAccumulator class.
&gt; 
&gt; I think this is a fragile way to construct the code. One possible solution would be to make this function robust in the face of such unusual inputs, which would be very easy to do, just replace &quot;end - start&quot; with zero-clamping subtraction rather than standard subtraction that will underflow and result in a large number. Another solution would be to enforce the invariant in the constructor.
&gt; 
&gt; This is a new problem that did not exist when we were using Range, since the Range constructor does enforce this invariant.

Okay, that&apos;s a good point. Let me add ASSERT(comparePositions(start, end) &lt;= 0) in serializeNodes.
I was going to do that but I guess I forgot to actually do it.

&gt;&gt; Source/WebCore/editing/markup.cpp:509
&gt;&gt; +    Node* startNode = start.firstNode().get();
&gt; 
&gt; This line of code seems dangerous. Why is it OK to just call get on a RefPtr and then let it fall out of scope? Doing get() here seems inconsistent with the design direction that inspired us to make the firstNode function return a RefPtr.

Oh oops, that&apos;s just a mistake. Will fix.

&gt;&gt; Source/WebCore/editing/markup.cpp:762
&gt;&gt; +    if (start.isNull() || end.isNull() || !comparePositions(start, end))
&gt; 
&gt; The two null checks here aren’t needed. The comparePositions function already returns 0 if either of the two positions is null.
&gt; 
&gt; But also, it seems a bit peculiar and a bit expensive to call comparePositions here and it’s not clear what the check is intended to do. After all &quot;!comparePositions(a, b)&quot; is roughly the same as &quot;a == b&quot;. The expensive operation is figuring out -1 vs. +1, not 0 vs. non-0. Is the check truly required?

I wanted to guard against the code which invoked this function with end pointing a position before start.
Note that comparePositions doesn&apos;t traverse through all nodes, etc...
It would find the first ancestor node which contains either position and finds which one comes first.
Anyhow, I don&apos;t think this will be the expensive part of this function.

&gt;&gt; Source/WebCore/editing/markup.h:49
&gt;&gt; +class VisibleSelection;
&gt; 
&gt; Why are we adding this in this patch? Maybe it’s part of the next patch?

Oh oops, yes. Will revert this from this patch.

&gt;&gt; Source/WebCore/editing/markup.h:74
&gt;&gt; +    AnnotateForInterchange = AnnotateForInterchange::No, ConvertBlocksToInlines = ConvertBlocksToInlines::No, ResolveURLs = ResolveURLs::No);
&gt; 
&gt; This change just seems to be adding a line break. Can we omit it? Maybe it makes more sense in the follow-up patch.

Hm... this line looked a bit too long to but okay. Will revert.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1464909</commentid>
    <comment_count>10</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2018-09-30 22:30:04 -0700</bug_when>
    <thetext>Committed r236649: &lt;https://trac.webkit.org/changeset/236649&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>351168</attachid>
            <date>2018-09-28 21:24:16 -0700</date>
            <delta_ts>2018-09-28 21:25:27 -0700</delta_ts>
            <desc>Cleanup</desc>
            <filename>bug-190107-20180928212416.patch</filename>
            <type>text/plain</type>
            <size>31005</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDIzNjYxOCkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDU1IEBACisyMDE4LTA5LTI4ICBSeW9zdWtl
IE5pd2EgIDxybml3YUB3ZWJraXQub3JnPgorCisgICAgICAgIFVzZSBQb3NpdGlvbiBpbnN0ZWFk
IG9mIFJhbmdlIGluIGNyZWF0ZU1hcmt1cEludGVybmFsCisgICAgICAgIGh0dHBzOi8vYnVncy53
ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xOTAxMDcKKworICAgICAgICBSZXZpZXdlZCBieSBO
T0JPRFkgKE9PUFMhKS4KKworICAgICAgICBVc2UgdHdvIFBvc2l0aW9uJ3MgaW5kaWNhdGluZyBz
dGFydCBhbmQgZW5kIGluc3RlYWQgb2YgUmFuZ2UgaW4gY3JlYXRlTWFya3VwSW50ZXJuYWwgYW5k
IFN0eWxpemVkTWFya3VwQWNjdW11bGF0b3IKKyAgICAgICAgaW4gb3JkZXIgdG8gc3VwcG9ydCBj
b3B5ICYgcGFzdGUgYWNyb3NzIHNoYWRvdyBib3VuZGFyaWVzIGluIHRoZSBidWcgMTU3NDQzLiBU
aGlzIHBhdGNoIGFsc28gcmVtb3ZlcyB0aGUgdXNlIG9mCisgICAgICAgIFJhbmdlIGluIE1hcmt1
cEFjY3VtdWxhdG9yIHNpbmNlIGFsbCB1c2VzIG9mIHJhbmdlIGlzIHZpYSBTdHlsaXplZE1hcmt1
cEFjY3VtdWxhdG9yLgorCisgICAgICAgIEFsc28gcmVuYW1lZCBjcmVhdGVNYXJrdXBJbnRlcm5h
bCB0byBzZXJpYWxpemVQcmVzZXJ2aW5nVmlzdWFsQXBwZWFyYW5jZUludGVybmFsIHRvIG1hdGNo
IHRoZSByZW5hbWUgaW4gcjIzNjYxMi4KKworICAgICAgICAqIGRvbS9Qb3NpdGlvbi5jcHA6Cisg
ICAgICAgIChXZWJDb3JlOjpQb3NpdGlvbjo6Zmlyc3ROb2RlIGNvbnN0KTogIEFkZGVkLgorICAg
ICAgICAqIGRvbS9Qb3NpdGlvbi5oOgorICAgICAgICAqIGVkaXRpbmcvTWFya3VwQWNjdW11bGF0
b3IuY3BwOgorICAgICAgICAoV2ViQ29yZTo6TWFya3VwQWNjdW11bGF0b3I6Ok1hcmt1cEFjY3Vt
dWxhdG9yKTogTm8gbG9uZ2VyIHRha2VzIFJhbmdlLgorICAgICAgICAoV2ViQ29yZTo6TWFya3Vw
QWNjdW11bGF0b3I6OmFwcGVuZFRleHQpOiBSZW1vdmVkIHRoZSBjb2RlIHRvIHRydW5jYXRlIHN0
cmluZyBhdCB0aGUgYm91bmRhcnkgcG9pbnRzIG9mIHRoZSByYW5nZS4KKyAgICAgICAgKiBlZGl0
aW5nL01hcmt1cEFjY3VtdWxhdG9yLmg6CisgICAgICAgIChXZWJDb3JlOjpNYXJrdXBBY2N1bXVs
YXRvcik6IE1hZGUgdGhpcyBjbGFzcyBub24tY29weWFibGUuCisgICAgICAgICogZWRpdGluZy9t
YXJrdXAuY3BwOgorICAgICAgICAoV2ViQ29yZTo6U3R5bGVkTWFya3VwQWNjdW11bGF0b3I6OlN0
eWxlZE1hcmt1cEFjY3VtdWxhdG9yKTogTm93IHRha2VzIGFuZCBzdG9yZXMgdHdvIHBvc2l0aW9u
cy4KKworICAgICAgICAoV2ViQ29yZTo6U3R5bGVkTWFya3VwQWNjdW11bGF0b3I6OmFwcGVuZFRl
eHQpOiBVc2UgdGV4dENvbnRlbnRSZXNwZWN0aW5nUmFuZ2UgaW4gdGhlIGNhc2UgYW5ub3RhdGlv
biBpcyBkaXNhYmxlZAorICAgICAgICBpbnN0ZWFkIG9mIGNhbGxpbmcgdG8gTWFya3VwQWNjdW11
bGF0b3I6OmFwcGVuZFRleHQsIHdoaWNoIG5vIGxvbmdlciByZXNwZWN0cyBib3VuZGFyeSBvZmZz
ZXRzLgorCisgICAgICAgIChXZWJDb3JlOjpTdHlsZWRNYXJrdXBBY2N1bXVsYXRvcjo6cmVuZGVy
ZWRUZXh0UmVzcGVjdGluZ1JhbmdlKTogUmVuYW1lZCBmcm9tIHJlbmRlcmVkVGV4dC4gVXBkYXRl
ZCB0byByZXNwZWN0CisgICAgICAgIGJvdW5kYXJ5IG9mZnNldHMgZGVmaW5lZCBieSBtX3N0YXJ0
IGFuZCBtX2VuZCBQb3NpdGlvbnMgaW5zdGVhZCBvZiBtX3JhbmdlIFJhbmdlLgorCisgICAgICAg
IChXZWJDb3JlOjpTdHlsZWRNYXJrdXBBY2N1bXVsYXRvcjo6dGV4dENvbnRlbnRSZXNwZWN0aW5n
UmFuZ2UpOiBSZW5hbWVkIGZyb20gc3RyaW5nVmFsdWVGb3JSYW5nZS4gRGl0dG8uCisKKyAgICAg
ICAgKFdlYkNvcmU6OlN0eWxlZE1hcmt1cEFjY3VtdWxhdG9yOjpzZXJpYWxpemVOb2Rlcyk6IE5v
dyBjb21wdXRlcyBzdGFydE5vZGUgYW5kIHBhc3RFbmQgbm9kZXMgZnJvbSBzdGFydCBhbmQgZW5k
CisgICAgICAgIFBvc2l0aW9ucy4gTm90ZSB0aGF0IHRoZSBlbmQgcG9zaXRpb24gaXMgYWx3YXlz
IHRoZSBuZXh0IG5vZGUgaW4gdGhlIHRyZWUgb3JkZXIgIGZvciBhIGNoYXJhY3RlciBub2RlCisg
ICAgICAgIGFuZCBjb21wdXRlTm9kZUFmdGVyUG9zaXRpb24gcmV0dXJucyBudWxscHRyIGZvciBh
IGNoYXJhY3RlciBkYXRhLgorCisgICAgICAgIChXZWJDb3JlOjpoaWdoZXN0QW5jZXN0b3JUb1dy
YXBNYXJrdXApOiBOb3cgdGFrZXMgdHdvIHBvc2l0aW9ucyBpbnN0ZWFkIG9mIGEgcmFuZ2UuCisK
KyAgICAgICAgKFdlYkNvcmU6OnNlcmlhbGl6ZVByZXNlcnZpbmdWaXN1YWxBcHBlYXJhbmNlSW50
ZXJuYWwpOiBSZW5hbWVkIGZyb20gY3JlYXRlTWFya3VwSW50ZXJuYWwuIFJlbW92ZWQgdGhlIG9i
c29sZXRlCisgICAgICAgIGNvbW1lbnRzIHdoaWNoIHdlcmUgYWRkZWQgZm9yIERPTVJhbmdlIGlu
IFdlYktpdExlZ2FjeS4KKworICAgICAgICAoV2ViQ29yZTo6c2VyaWFsaXplUHJlc2VydmluZ1Zp
c3VhbEFwcGVhcmFuY2UpOgorCisgICAgICAgIChXZWJDb3JlOjpzYW5pdGl6ZWRNYXJrdXBGb3JG
cmFnbWVudEluRG9jdW1lbnQpOiBDcmVhdGUgcG9zaXRpb25zIGluc3RlYWQgb2YgYSByYW5nZSB0
byBwYXNzIHRvCisgICAgICAgIHNlcmlhbGl6ZVByZXNlcnZpbmdWaXN1YWxBcHBlYXJhbmNlSW50
ZXJuYWwuCisKKyAgICAgICAgKFdlYkNvcmU6OnNlcmlhbGl6ZUZyYWdtZW50KToKKworICAgICAg
ICAqIGVkaXRpbmcvbWFya3VwLmg6CisgICAgICAgICogcGFnZS9QYWdlU2VyaWFsaXplci5jcHA6
CisgICAgICAgIChXZWJDb3JlOjpQYWdlU2VyaWFsaXplcjo6U2VyaWFsaXplck1hcmt1cEFjY3Vt
dWxhdG9yKTogUmVtb3ZlZCB0aGUgdW5uZWNlc3NhcnkgV2ViQ29yZSBuYW1lc3BhY2UgcXVhbGlm
aWVyLgorCiAyMDE4LTA5LTI4ICBSeW9zdWtlIE5pd2EgIDxybml3YUB3ZWJraXQub3JnPgogCiAg
ICAgICAgIFJFR1JFU1NJT04ocjIzNjYwOSk6IEFQSSB0ZXN0cyBmb3IgbXNvIGxpc3QgcHJlc2Vy
dmF0aW9uIGFyZSBmYWlsaW5nCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9kb20vUG9zaXRpb24uY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2RvbS9Qb3NpdGlvbi5jcHAJKHJldmlzaW9u
IDIzNjYxNikKKysrIFNvdXJjZS9XZWJDb3JlL2RvbS9Qb3NpdGlvbi5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTM4LDYgKzM4LDcgQEAKICNpbmNsdWRlICJJbmxpbmVJdGVyYXRvci5oIgogI2luY2x1
ZGUgIklubGluZVRleHRCb3guaCIKICNpbmNsdWRlICJMb2dnaW5nLmgiCisjaW5jbHVkZSAiTm9k
ZVRyYXZlcnNhbC5oIgogI2luY2x1ZGUgIlBvc2l0aW9uSXRlcmF0b3IuaCIKICNpbmNsdWRlICJS
ZW5kZXJCbG9jay5oIgogI2luY2x1ZGUgIlJlbmRlckZsZXhpYmxlQm94LmgiCkBAIC0yNDcsNiAr
MjQ4LDIwIEBAIFBvc2l0aW9uIFBvc2l0aW9uOjpwYXJlbnRBbmNob3JlZEVxdWl2YWwKICAgICBy
ZXR1cm4geyBjb250YWluZXJOb2RlKCksIGNvbXB1dGVPZmZzZXRJbkNvbnRhaW5lck5vZGUoKSwg
UG9zaXRpb25Jc09mZnNldEluQW5jaG9yIH07CiB9CiAKK1JlZlB0cjxOb2RlPiBQb3NpdGlvbjo6
Zmlyc3ROb2RlKCkgY29uc3QKK3sKKyAgICBhdXRvIGNvbnRhaW5lciA9IG1ha2VSZWZQdHIoY29u
dGFpbmVyTm9kZSgpKTsKKyAgICBpZiAoIWNvbnRhaW5lcikKKyAgICAgICAgcmV0dXJuIG51bGxw
dHI7CisgICAgaWYgKGlzPENoYXJhY3RlckRhdGE+KGNvbnRhaW5lcikpCisgICAgICAgIHJldHVy
biBjb250YWluZXI7CisgICAgaWYgKGF1dG8qIG5vZGUgPSBjb21wdXRlTm9kZUFmdGVyUG9zaXRp
b24oKSkKKyAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgaWYgKCFjb21wdXRlT2Zmc2V0SW5Db250
YWluZXJOb2RlKCkpCisgICAgICAgIHJldHVybiBjb250YWluZXI7CisgICAgcmV0dXJuIE5vZGVU
cmF2ZXJzYWw6Om5leHRTa2lwcGluZ0NoaWxkcmVuKCpjb250YWluZXIpOworfQorCiBOb2RlKiBQ
b3NpdGlvbjo6Y29tcHV0ZU5vZGVCZWZvcmVQb3NpdGlvbigpIGNvbnN0CiB7CiAgICAgaWYgKCFt
X2FuY2hvck5vZGUpCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9kb20vUG9zaXRpb24uaAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9kb20vUG9zaXRpb24uaAkocmV2aXNpb24gMjM2NjE2KQor
KysgU291cmNlL1dlYkNvcmUvZG9tL1Bvc2l0aW9uLmgJKHdvcmtpbmcgY29weSkKQEAgLTEwMyw2
ICsxMDMsOCBAQCBwdWJsaWM6CiAgICAgICAgIHJldHVybiBvZmZzZXRGb3JQb3NpdGlvbkFmdGVy
QW5jaG9yKCk7CiAgICAgfQogCisgICAgUmVmUHRyPE5vZGU+IGZpcnN0Tm9kZSgpIGNvbnN0Owor
CiAgICAgLy8gVGhlc2UgYXJlIGNvbnZlbmllbmNlIG1ldGhvZHMgd2hpY2ggYXJlIHNtYXJ0IGFi
b3V0IHdoZXRoZXIgdGhlIHBvc2l0aW9uIGlzIG5laWdoYm9yIGFuY2hvcmVkIG9yIHBhcmVudCBh
bmNob3JlZAogICAgIE5vZGUqIGNvbXB1dGVOb2RlQmVmb3JlUG9zaXRpb24oKSBjb25zdDsKICAg
ICBOb2RlKiBjb21wdXRlTm9kZUFmdGVyUG9zaXRpb24oKSBjb25zdDsKSW5kZXg6IFNvdXJjZS9X
ZWJDb3JlL2VkaXRpbmcvTWFya3VwQWNjdW11bGF0b3IuY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9XZWJDb3JlL2VkaXRpbmcvTWFya3VwQWNjdW11bGF0b3IuY3BwCShyZXZpc2lvbiAyMzY2MTYp
CisrKyBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL01hcmt1cEFjY3VtdWxhdG9yLmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtMTE2LDkgKzExNiw4IEBAIHZvaWQgTWFya3VwQWNjdW11bGF0b3I6OmFwcGVu
ZENoYXJhY3RlcnMKICAgICAgICAgYXBwZW5kQ2hhcmFjdGVyc1JlcGxhY2luZ0VudGl0aWVzSW50
ZXJuYWw8VUNoYXI+KHJlc3VsdCwgc291cmNlLCBvZmZzZXQsIGxlbmd0aCwgZW50aXR5TWFzayk7
CiB9CiAKLU1hcmt1cEFjY3VtdWxhdG9yOjpNYXJrdXBBY2N1bXVsYXRvcihWZWN0b3I8Tm9kZSo+
KiBub2RlcywgUmVzb2x2ZVVSTHMgcmVzb2x2ZVVSTHMsIGNvbnN0IFJhbmdlKiByYW5nZSwgU2Vy
aWFsaXphdGlvblN5bnRheCBzZXJpYWxpemF0aW9uU3ludGF4KQorTWFya3VwQWNjdW11bGF0b3I6
Ok1hcmt1cEFjY3VtdWxhdG9yKFZlY3RvcjxOb2RlKj4qIG5vZGVzLCBSZXNvbHZlVVJMcyByZXNv
bHZlVVJMcywgU2VyaWFsaXphdGlvblN5bnRheCBzZXJpYWxpemF0aW9uU3ludGF4KQogICAgIDog
bV9ub2Rlcyhub2RlcykKLSAgICAsIG1fcmFuZ2UocmFuZ2UpCiAgICAgLCBtX3Jlc29sdmVVUkxz
KHJlc29sdmVVUkxzKQogICAgICwgbV9zZXJpYWxpemF0aW9uU3ludGF4KHNlcmlhbGl6YXRpb25T
eW50YXgpCiAgICAgLCBtX3ByZWZpeExldmVsKDApCkBAIC0zNDEsMTkgKzM0MCw3IEBAIEVudGl0
eU1hc2sgTWFya3VwQWNjdW11bGF0b3I6OmVudGl0eU1hc2sKIHZvaWQgTWFya3VwQWNjdW11bGF0
b3I6OmFwcGVuZFRleHQoU3RyaW5nQnVpbGRlciYgcmVzdWx0LCBjb25zdCBUZXh0JiB0ZXh0KQog
ewogICAgIGNvbnN0IFN0cmluZyYgdGV4dERhdGEgPSB0ZXh0LmRhdGEoKTsKLSAgICB1bnNpZ25l
ZCBzdGFydCA9IDA7Ci0gICAgdW5zaWduZWQgbGVuZ3RoID0gdGV4dERhdGEubGVuZ3RoKCk7Ci0K
LSAgICBpZiAobV9yYW5nZSkgewotICAgICAgICBpZiAoJnRleHQgPT0gJm1fcmFuZ2UtPmVuZENv
bnRhaW5lcigpKQotICAgICAgICAgICAgbGVuZ3RoID0gbV9yYW5nZS0+ZW5kT2Zmc2V0KCk7Ci0g
ICAgICAgIGlmICgmdGV4dCA9PSAmbV9yYW5nZS0+c3RhcnRDb250YWluZXIoKSkgewotICAgICAg
ICAgICAgc3RhcnQgPSBtX3JhbmdlLT5zdGFydE9mZnNldCgpOwotICAgICAgICAgICAgbGVuZ3Ro
IC09IHN0YXJ0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgYXBwZW5kQ2hhcmFjdGVyc1JlcGxh
Y2luZ0VudGl0aWVzKHJlc3VsdCwgdGV4dERhdGEsIHN0YXJ0LCBsZW5ndGgsIGVudGl0eU1hc2tG
b3JUZXh0KHRleHQpKTsKKyAgICBhcHBlbmRDaGFyYWN0ZXJzUmVwbGFjaW5nRW50aXRpZXMocmVz
dWx0LCB0ZXh0RGF0YSwgMCwgdGV4dERhdGEubGVuZ3RoKCksIGVudGl0eU1hc2tGb3JUZXh0KHRl
eHQpKTsKIH0KIAogc3RhdGljIHZvaWQgYXBwZW5kQ29tbWVudChTdHJpbmdCdWlsZGVyJiByZXN1
bHQsIGNvbnN0IFN0cmluZyYgY29tbWVudCkKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcv
TWFya3VwQWNjdW11bGF0b3IuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9lZGl0aW5n
L01hcmt1cEFjY3VtdWxhdG9yLmgJKHJldmlzaW9uIDIzNjYxNikKKysrIFNvdXJjZS9XZWJDb3Jl
L2VkaXRpbmcvTWFya3VwQWNjdW11bGF0b3IuaAkod29ya2luZyBjb3B5KQpAQCAtNTYsMTAgKzU2
LDEwIEBAIGVudW0gRW50aXR5TWFzayB7CiAgICAgRW50aXR5TWFza0luSFRNTEF0dHJpYnV0ZVZh
bHVlID0gRW50aXR5QW1wIHwgRW50aXR5UXVvdCB8IEVudGl0eU5ic3AsCiB9OwogCi0vLyBGSVhN
RTogTm9uY29weWFibGU/CiBjbGFzcyBNYXJrdXBBY2N1bXVsYXRvciB7CisgICAgV1RGX01BS0Vf
Tk9OQ09QWUFCTEUoTWFya3VwQWNjdW11bGF0b3IpOwogcHVibGljOgotICAgIE1hcmt1cEFjY3Vt
dWxhdG9yKFZlY3RvcjxOb2RlKj4qLCBSZXNvbHZlVVJMcywgY29uc3QgUmFuZ2UqID0gbnVsbHB0
ciwgU2VyaWFsaXphdGlvblN5bnRheCA9IFNlcmlhbGl6YXRpb25TeW50YXg6OkhUTUwpOworICAg
IE1hcmt1cEFjY3VtdWxhdG9yKFZlY3RvcjxOb2RlKj4qLCBSZXNvbHZlVVJMcywgU2VyaWFsaXph
dGlvblN5bnRheCA9IFNlcmlhbGl6YXRpb25TeW50YXg6OkhUTUwpOwogICAgIHZpcnR1YWwgfk1h
cmt1cEFjY3VtdWxhdG9yKCk7CiAKICAgICBTdHJpbmcgc2VyaWFsaXplTm9kZXMoTm9kZSYgdGFy
Z2V0Tm9kZSwgU2VyaWFsaXplZE5vZGVzLCBWZWN0b3I8UXVhbGlmaWVkTmFtZT4qIHRhZ05hbWVz
VG9Ta2lwID0gbnVsbHB0cik7CkBAIC0xMDksNyArMTA5LDYgQEAgcHJvdGVjdGVkOgogICAgIEVu
dGl0eU1hc2sgZW50aXR5TWFza0ZvclRleHQoY29uc3QgVGV4dCYpIGNvbnN0OwogCiAgICAgVmVj
dG9yPE5vZGUqPiogY29uc3QgbV9ub2RlczsKLSAgICBjb25zdCBSYW5nZSogY29uc3QgbV9yYW5n
ZTsKIAogcHJpdmF0ZToKICAgICBTdHJpbmcgcmVzb2x2ZVVSTElmTmVlZGVkKGNvbnN0IEVsZW1l
bnQmLCBjb25zdCBTdHJpbmcmKSBjb25zdDsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcv
bWFya3VwLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL21hcmt1cC5j
cHAJKHJldmlzaW9uIDIzNjYxOCkKKysrIFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvbWFya3VwLmNw
cAkod29ya2luZyBjb3B5KQpAQCAtMjE5LDkgKzIxOSwxMCBAQCBjbGFzcyBTdHlsZWRNYXJrdXBB
Y2N1bXVsYXRvciBmaW5hbCA6IHB1CiBwdWJsaWM6CiAgICAgZW51bSBSYW5nZUZ1bGx5U2VsZWN0
c05vZGUgeyBEb2VzRnVsbHlTZWxlY3ROb2RlLCBEb2VzTm90RnVsbHlTZWxlY3ROb2RlIH07CiAK
LSAgICBTdHlsZWRNYXJrdXBBY2N1bXVsYXRvcihWZWN0b3I8Tm9kZSo+KiBub2RlcywgUmVzb2x2
ZVVSTHMsIEFubm90YXRlRm9ySW50ZXJjaGFuZ2UsIE1TT0xpc3RNb2RlLCBjb25zdCBSYW5nZSos
IGJvb2wgbmVlZHNQb3NpdGlvblN0eWxlQ29udmVyc2lvbiwgTm9kZSogaGlnaGVzdE5vZGVUb0Jl
U2VyaWFsaXplZCA9IG51bGxwdHIpOworICAgIFN0eWxlZE1hcmt1cEFjY3VtdWxhdG9yKGNvbnN0
IFBvc2l0aW9uJiBzdGFydCwgY29uc3QgUG9zaXRpb24mIGVuZCwgVmVjdG9yPE5vZGUqPiogbm9k
ZXMsCisgICAgICAgIFJlc29sdmVVUkxzLCBBbm5vdGF0ZUZvckludGVyY2hhbmdlLCBNU09MaXN0
TW9kZSwgYm9vbCBuZWVkc1Bvc2l0aW9uU3R5bGVDb252ZXJzaW9uLCBOb2RlKiBoaWdoZXN0Tm9k
ZVRvQmVTZXJpYWxpemVkID0gbnVsbHB0cik7CiAKLSAgICBOb2RlKiBzZXJpYWxpemVOb2RlcyhO
b2RlKiBzdGFydE5vZGUsIE5vZGUqIHBhc3RFbmQpOworICAgIE5vZGUqIHNlcmlhbGl6ZU5vZGVz
KGNvbnN0IFBvc2l0aW9uJiBzdGFydCwgY29uc3QgUG9zaXRpb24mIGVuZCk7CiAgICAgdm9pZCB3
cmFwV2l0aE5vZGUoTm9kZSYsIGJvb2wgY29udmVydEJsb2Nrc1RvSW5saW5lcyA9IGZhbHNlLCBS
YW5nZUZ1bGx5U2VsZWN0c05vZGUgPSBEb2VzRnVsbHlTZWxlY3ROb2RlKTsKICAgICB2b2lkIHdy
YXBXaXRoU3R5bGVOb2RlKFN0eWxlUHJvcGVydGllcyosIERvY3VtZW50JiwgYm9vbCBpc0Jsb2Nr
ID0gZmFsc2UpOwogICAgIFN0cmluZyB0YWtlUmVzdWx0cygpOwpAQCAtMjM1LDggKzIzNiw4IEBA
IHByaXZhdGU6CiAgICAgdm9pZCBhcHBlbmRTdHlsZU5vZGVPcGVuVGFnKFN0cmluZ0J1aWxkZXIm
LCBTdHlsZVByb3BlcnRpZXMqLCBEb2N1bWVudCYsIGJvb2wgaXNCbG9jayA9IGZhbHNlKTsKICAg
ICBjb25zdCBTdHJpbmcmIHN0eWxlTm9kZUNsb3NlVGFnKGJvb2wgaXNCbG9jayA9IGZhbHNlKTsK
IAotICAgIFN0cmluZyByZW5kZXJlZFRleHQoY29uc3QgTm9kZSYsIGNvbnN0IFJhbmdlKik7Ci0g
ICAgU3RyaW5nIHN0cmluZ1ZhbHVlRm9yUmFuZ2UoY29uc3QgTm9kZSYsIGNvbnN0IFJhbmdlKik7
CisgICAgU3RyaW5nIHJlbmRlcmVkVGV4dFJlc3BlY3RpbmdSYW5nZShjb25zdCBUZXh0Jik7Cisg
ICAgU3RyaW5nIHRleHRDb250ZW50UmVzcGVjdGluZ1JhbmdlKGNvbnN0IFRleHQmKTsKIAogICAg
IGJvb2wgc2hvdWxkUHJlc2VydmVNU09MaXN0U3R5bGVGb3JFbGVtZW50KGNvbnN0IEVsZW1lbnQm
KTsKIApAQCAtMjY0LDI0ICsyNjUsMjcgQEAgcHJpdmF0ZToKICAgICAgICAgcmV0dXJuIG1faGln
aGVzdE5vZGVUb0JlU2VyaWFsaXplZCAmJiBtX2hpZ2hlc3ROb2RlVG9CZVNlcmlhbGl6ZWQtPnBh
cmVudE5vZGUoKSA9PSBub2RlLnBhcmVudE5vZGUoKSAmJiBtX3dyYXBwaW5nU3R5bGUgJiYgbV93
cmFwcGluZ1N0eWxlLT5zdHlsZSgpOwogICAgIH0KIAorICAgIFBvc2l0aW9uIG1fc3RhcnQ7Cisg
ICAgUG9zaXRpb24gbV9lbmQ7CiAgICAgVmVjdG9yPFN0cmluZz4gbV9yZXZlcnNlZFByZWNlZGlu
Z01hcmt1cDsKICAgICBjb25zdCBBbm5vdGF0ZUZvckludGVyY2hhbmdlIG1fYW5ub3RhdGU7Ci0g
ICAgTm9kZSogbV9oaWdoZXN0Tm9kZVRvQmVTZXJpYWxpemVkOworICAgIFJlZlB0cjxOb2RlPiBt
X2hpZ2hlc3ROb2RlVG9CZVNlcmlhbGl6ZWQ7CiAgICAgUmVmUHRyPEVkaXRpbmdTdHlsZT4gbV93
cmFwcGluZ1N0eWxlOwotICAgIGJvb2wgbV9uZWVkUmVsYXRpdmVTdHlsZVdyYXBwZXI7CiAgICAg
Ym9vbCBtX25lZWRzUG9zaXRpb25TdHlsZUNvbnZlcnNpb247Ci0gICAgYm9vbCBtX25lZWRDbGVh
cmluZ0RpdjsKKyAgICBib29sIG1fbmVlZFJlbGF0aXZlU3R5bGVXcmFwcGVyIHsgZmFsc2UgfTsK
KyAgICBib29sIG1fbmVlZENsZWFyaW5nRGl2IHsgZmFsc2UgfTsKICAgICBib29sIG1fc2hvdWxk
UHJlc2VydmVNU09MaXN0OwogICAgIGJvb2wgbV9pbk1TT0xpc3QgeyBmYWxzZSB9OwogfTsKIAot
aW5saW5lIFN0eWxlZE1hcmt1cEFjY3VtdWxhdG9yOjpTdHlsZWRNYXJrdXBBY2N1bXVsYXRvcihW
ZWN0b3I8Tm9kZSo+KiBub2RlcywgUmVzb2x2ZVVSTHMgdXJsc1RvUmVzb2x2ZSwgQW5ub3RhdGVG
b3JJbnRlcmNoYW5nZSBhbm5vdGF0ZSwgTVNPTGlzdE1vZGUgbXNvTGlzdE1vZGUsIGNvbnN0IFJh
bmdlKiByYW5nZSwgYm9vbCBuZWVkc1Bvc2l0aW9uU3R5bGVDb252ZXJzaW9uLCBOb2RlKiBoaWdo
ZXN0Tm9kZVRvQmVTZXJpYWxpemVkKQotICAgIDogTWFya3VwQWNjdW11bGF0b3Iobm9kZXMsIHVy
bHNUb1Jlc29sdmUsIHJhbmdlKQoraW5saW5lIFN0eWxlZE1hcmt1cEFjY3VtdWxhdG9yOjpTdHls
ZWRNYXJrdXBBY2N1bXVsYXRvcihjb25zdCBQb3NpdGlvbiYgc3RhcnQsIGNvbnN0IFBvc2l0aW9u
JiBlbmQsIFZlY3RvcjxOb2RlKj4qIG5vZGVzLAorICAgIFJlc29sdmVVUkxzIHVybHNUb1Jlc29s
dmUsIEFubm90YXRlRm9ySW50ZXJjaGFuZ2UgYW5ub3RhdGUsIE1TT0xpc3RNb2RlIG1zb0xpc3RN
b2RlLCBib29sIG5lZWRzUG9zaXRpb25TdHlsZUNvbnZlcnNpb24sIE5vZGUqIGhpZ2hlc3ROb2Rl
VG9CZVNlcmlhbGl6ZWQpCisgICAgOiBNYXJrdXBBY2N1bXVsYXRvcihub2RlcywgdXJsc1RvUmVz
b2x2ZSkKKyAgICAsIG1fc3RhcnQoc3RhcnQpCisgICAgLCBtX2VuZChlbmQpCiAgICAgLCBtX2Fu
bm90YXRlKGFubm90YXRlKQogICAgICwgbV9oaWdoZXN0Tm9kZVRvQmVTZXJpYWxpemVkKGhpZ2hl
c3ROb2RlVG9CZVNlcmlhbGl6ZWQpCi0gICAgLCBtX25lZWRSZWxhdGl2ZVN0eWxlV3JhcHBlcihm
YWxzZSkKICAgICAsIG1fbmVlZHNQb3NpdGlvblN0eWxlQ29udmVyc2lvbihuZWVkc1Bvc2l0aW9u
U3R5bGVDb252ZXJzaW9uKQotICAgICwgbV9uZWVkQ2xlYXJpbmdEaXYoZmFsc2UpCiAgICAgLCBt
X3Nob3VsZFByZXNlcnZlTVNPTGlzdChtc29MaXN0TW9kZSA9PSBNU09MaXN0TW9kZTo6UHJlc2Vy
dmUpCiB7CiB9CkBAIC0zNTUsMTEgKzM1OSwxMiBAQCB2b2lkIFN0eWxlZE1hcmt1cEFjY3VtdWxh
dG9yOjphcHBlbmRUZXh0CiAgICAgICAgIGFwcGVuZFN0eWxlTm9kZU9wZW5UYWcob3V0LCB3cmFw
cGluZ1N0eWxlLT5zdHlsZSgpLCB0ZXh0LmRvY3VtZW50KCkpOwogICAgIH0KIAotICAgIGlmICgh
c2hvdWxkQW5ub3RhdGUoKSB8fCBwYXJlbnRJc1RleHRhcmVhKQotICAgICAgICBNYXJrdXBBY2N1
bXVsYXRvcjo6YXBwZW5kVGV4dChvdXQsIHRleHQpOwotICAgIGVsc2UgeworICAgIGlmICghc2hv
dWxkQW5ub3RhdGUoKSB8fCBwYXJlbnRJc1RleHRhcmVhKSB7CisgICAgICAgIGF1dG8gY29udGVu
dCA9IHRleHRDb250ZW50UmVzcGVjdGluZ1JhbmdlKHRleHQpOworICAgICAgICBhcHBlbmRDaGFy
YWN0ZXJzUmVwbGFjaW5nRW50aXRpZXMob3V0LCBjb250ZW50LCAwLCBjb250ZW50Lmxlbmd0aCgp
LCBlbnRpdHlNYXNrRm9yVGV4dCh0ZXh0KSk7CisgICAgfSBlbHNlIHsKICAgICAgICAgY29uc3Qg
Ym9vbCB1c2VSZW5kZXJlZFRleHQgPSAhZW5jbG9zaW5nRWxlbWVudFdpdGhUYWcoZmlyc3RQb3Np
dGlvbkluTm9kZShjb25zdF9jYXN0PFRleHQqPigmdGV4dCkpLCBzZWxlY3RUYWcpOwotICAgICAg
ICBTdHJpbmcgY29udGVudCA9IHVzZVJlbmRlcmVkVGV4dCA/IHJlbmRlcmVkVGV4dCh0ZXh0LCBt
X3JhbmdlKSA6IHN0cmluZ1ZhbHVlRm9yUmFuZ2UodGV4dCwgbV9yYW5nZSk7CisgICAgICAgIFN0
cmluZyBjb250ZW50ID0gdXNlUmVuZGVyZWRUZXh0ID8gcmVuZGVyZWRUZXh0UmVzcGVjdGluZ1Jh
bmdlKHRleHQpIDogdGV4dENvbnRlbnRSZXNwZWN0aW5nUmFuZ2UodGV4dCk7CiAgICAgICAgIFN0
cmluZ0J1aWxkZXIgYnVmZmVyOwogICAgICAgICBhcHBlbmRDaGFyYWN0ZXJzUmVwbGFjaW5nRW50
aXRpZXMoYnVmZmVyLCBjb250ZW50LCAwLCBjb250ZW50Lmxlbmd0aCgpLCBFbnRpdHlNYXNrSW5Q
Q0RBVEEpOwogICAgICAgICBvdXQuYXBwZW5kKGNvbnZlcnRIVE1MVGV4dFRvSW50ZXJjaGFuZ2VG
b3JtYXQoYnVmZmVyLnRvU3RyaW5nKCksICZ0ZXh0KSk7CkBAIC0zNjksMzkgKzM3NCwzNiBAQCB2
b2lkIFN0eWxlZE1hcmt1cEFjY3VtdWxhdG9yOjphcHBlbmRUZXh0CiAgICAgICAgIG91dC5hcHBl
bmQoc3R5bGVOb2RlQ2xvc2VUYWcoKSk7CiB9CiAgICAgCi1TdHJpbmcgU3R5bGVkTWFya3VwQWNj
dW11bGF0b3I6OnJlbmRlcmVkVGV4dChjb25zdCBOb2RlJiBub2RlLCBjb25zdCBSYW5nZSogcmFu
Z2UpCitTdHJpbmcgU3R5bGVkTWFya3VwQWNjdW11bGF0b3I6OnJlbmRlcmVkVGV4dFJlc3BlY3Rp
bmdSYW5nZShjb25zdCBUZXh0JiB0ZXh0KQogewotICAgIGlmICghaXM8VGV4dD4obm9kZSkpCi0g
ICAgICAgIHJldHVybiBTdHJpbmcoKTsKKyAgICBUZXh0SXRlcmF0b3JCZWhhdmlvciBiZWhhdmlv
ciA9IFRleHRJdGVyYXRvckRlZmF1bHRCZWhhdmlvcjsKKyAgICBQb3NpdGlvbiBzdGFydCA9ICZ0
ZXh0ID09IG1fc3RhcnQuY29udGFpbmVyTm9kZSgpID8gbV9zdGFydCA6IGZpcnN0UG9zaXRpb25J
bk5vZGUoY29uc3RfY2FzdDxUZXh0Kj4oJnRleHQpKTsKKyAgICBQb3NpdGlvbiBlbmQ7CisgICAg
aWYgKCZ0ZXh0ID09IG1fZW5kLmNvbnRhaW5lck5vZGUoKSkKKyAgICAgICAgZW5kID0gbV9lbmQ7
CisgICAgZWxzZSB7CisgICAgICAgIGVuZCA9IGxhc3RQb3NpdGlvbkluTm9kZShjb25zdF9jYXN0
PFRleHQqPigmdGV4dCkpOworICAgICAgICBpZiAoIW1fZW5kLmlzTnVsbCgpKQorICAgICAgICAg
ICAgYmVoYXZpb3IgPSBUZXh0SXRlcmF0b3JCZWhhdmVzQXNJZk5vZGVzRm9sbG93aW5nOworICAg
IH0KIAotICAgIGNvbnN0IFRleHQmIHRleHROb2RlID0gZG93bmNhc3Q8VGV4dD4obm9kZSk7Ci0g
ICAgdW5zaWduZWQgc3RhcnRPZmZzZXQgPSAwOwotICAgIHVuc2lnbmVkIGVuZE9mZnNldCA9IHRl
eHROb2RlLmxlbmd0aCgpOworICAgIHJldHVybiBwbGFpblRleHQoUmFuZ2U6OmNyZWF0ZSh0ZXh0
LmRvY3VtZW50KCksIHN0YXJ0LCBlbmQpLnB0cigpLCBiZWhhdmlvcik7Cit9CiAKLSAgICBUZXh0
SXRlcmF0b3JCZWhhdmlvciBiZWhhdmlvciA9IFRleHRJdGVyYXRvckRlZmF1bHRCZWhhdmlvcjsK
LSAgICBpZiAocmFuZ2UgJiYgJm5vZGUgPT0gJnJhbmdlLT5zdGFydENvbnRhaW5lcigpKQotICAg
ICAgICBzdGFydE9mZnNldCA9IHJhbmdlLT5zdGFydE9mZnNldCgpOwotICAgIGlmIChyYW5nZSAm
JiAmbm9kZSA9PSAmcmFuZ2UtPmVuZENvbnRhaW5lcigpKQotICAgICAgICBlbmRPZmZzZXQgPSBy
YW5nZS0+ZW5kT2Zmc2V0KCk7Ci0gICAgZWxzZSBpZiAocmFuZ2UpCi0gICAgICAgIGJlaGF2aW9y
ID0gVGV4dEl0ZXJhdG9yQmVoYXZlc0FzSWZOb2Rlc0ZvbGxvd2luZzsKLQotICAgIFBvc2l0aW9u
IHN0YXJ0ID0gY3JlYXRlTGVnYWN5RWRpdGluZ1Bvc2l0aW9uKGNvbnN0X2Nhc3Q8Tm9kZSo+KCZu
b2RlKSwgc3RhcnRPZmZzZXQpOwotICAgIFBvc2l0aW9uIGVuZCA9IGNyZWF0ZUxlZ2FjeUVkaXRp
bmdQb3NpdGlvbihjb25zdF9jYXN0PE5vZGUqPigmbm9kZSksIGVuZE9mZnNldCk7Ci0gICAgcmV0
dXJuIHBsYWluVGV4dChSYW5nZTo6Y3JlYXRlKG5vZGUuZG9jdW1lbnQoKSwgc3RhcnQsIGVuZCku
cHRyKCksIGJlaGF2aW9yKTsKLX0KLQotU3RyaW5nIFN0eWxlZE1hcmt1cEFjY3VtdWxhdG9yOjpz
dHJpbmdWYWx1ZUZvclJhbmdlKGNvbnN0IE5vZGUmIG5vZGUsIGNvbnN0IFJhbmdlKiByYW5nZSkK
LXsKLSAgICBpZiAoIXJhbmdlKQotICAgICAgICByZXR1cm4gbm9kZS5ub2RlVmFsdWUoKTsKLQot
ICAgIFN0cmluZyBub2RlVmFsdWUgPSBub2RlLm5vZGVWYWx1ZSgpOwotICAgIGlmICgmbm9kZSA9
PSAmcmFuZ2UtPmVuZENvbnRhaW5lcigpKQotICAgICAgICBub2RlVmFsdWUudHJ1bmNhdGUocmFu
Z2UtPmVuZE9mZnNldCgpKTsKLSAgICBpZiAoJm5vZGUgPT0gJnJhbmdlLT5zdGFydENvbnRhaW5l
cigpKQotICAgICAgICBub2RlVmFsdWUucmVtb3ZlKDAsIHJhbmdlLT5zdGFydE9mZnNldCgpKTsK
LSAgICByZXR1cm4gbm9kZVZhbHVlOworU3RyaW5nIFN0eWxlZE1hcmt1cEFjY3VtdWxhdG9yOjp0
ZXh0Q29udGVudFJlc3BlY3RpbmdSYW5nZShjb25zdCBUZXh0JiB0ZXh0KQoreworICAgIGlmICht
X3N0YXJ0LmlzTnVsbCgpICYmIG1fZW5kLmlzTnVsbCgpKQorICAgICAgICByZXR1cm4gdGV4dC5k
YXRhKCk7CisKKyAgICBTdHJpbmcgdGV4dERhdGEgPSB0ZXh0LmRhdGEoKTsKKyAgICB1bnNpZ25l
ZCBzdGFydCA9IDA7CisgICAgdW5zaWduZWQgZW5kID0gdGV4dERhdGEubGVuZ3RoKCk7CisgICAg
aWYgKCZ0ZXh0ID09IG1fc3RhcnQuY29udGFpbmVyTm9kZSgpKQorICAgICAgICBzdGFydCA9IG1f
c3RhcnQub2Zmc2V0SW5Db250YWluZXJOb2RlKCk7CisgICAgaWYgKCZ0ZXh0ID09IG1fZW5kLmNv
bnRhaW5lck5vZGUoKSkKKyAgICAgICAgZW5kID0gbV9lbmQub2Zmc2V0SW5Db250YWluZXJOb2Rl
KCk7CisgICAgQVNTRVJUKHN0YXJ0IDwgZW5kKTsKKyAgICByZXR1cm4gdGV4dERhdGEuc3Vic3Ry
aW5nKHN0YXJ0LCBlbmQgLSBzdGFydCk7CiB9CiAKIHZvaWQgU3R5bGVkTWFya3VwQWNjdW11bGF0
b3I6OmFwcGVuZEN1c3RvbUF0dHJpYnV0ZXMoU3RyaW5nQnVpbGRlciYgb3V0LCBjb25zdCBFbGVt
ZW50JiBlbGVtZW50LCBOYW1lc3BhY2VzKiBuYW1lc3BhY2VzKQpAQCAtNTAyLDggKzUwNCwxMyBA
QCB2b2lkIFN0eWxlZE1hcmt1cEFjY3VtdWxhdG9yOjphcHBlbmRFbGVtCiAgICAgYXBwZW5kQ2xv
c2VUYWcob3V0LCBlbGVtZW50KTsKIH0KIAotTm9kZSogU3R5bGVkTWFya3VwQWNjdW11bGF0b3I6
OnNlcmlhbGl6ZU5vZGVzKE5vZGUqIHN0YXJ0Tm9kZSwgTm9kZSogcGFzdEVuZCkKK05vZGUqIFN0
eWxlZE1hcmt1cEFjY3VtdWxhdG9yOjpzZXJpYWxpemVOb2Rlcyhjb25zdCBQb3NpdGlvbiYgc3Rh
cnQsIGNvbnN0IFBvc2l0aW9uJiBlbmQpCiB7CisgICAgTm9kZSogc3RhcnROb2RlID0gc3RhcnQu
Zmlyc3ROb2RlKCkuZ2V0KCk7CisgICAgTm9kZSogcGFzdEVuZCA9IGVuZC5jb21wdXRlTm9kZUFm
dGVyUG9zaXRpb24oKTsKKyAgICBpZiAoIXBhc3RFbmQpCisgICAgICAgIHBhc3RFbmQgPSBOb2Rl
VHJhdmVyc2FsOjpuZXh0U2tpcHBpbmdDaGlsZHJlbigqZW5kLmNvbnRhaW5lck5vZGUoKSk7CisK
ICAgICBpZiAoIW1faGlnaGVzdE5vZGVUb0JlU2VyaWFsaXplZCkgewogICAgICAgICBOb2RlKiBs
YXN0Q2xvc2VkID0gdHJhdmVyc2VOb2Rlc0ZvclNlcmlhbGl6YXRpb24oc3RhcnROb2RlLCBwYXN0
RW5kLCBOb2RlVHJhdmVyc2FsTW9kZTo6RG9Ob3RFbWl0U3RyaW5nKTsKICAgICAgICAgbV9oaWdo
ZXN0Tm9kZVRvQmVTZXJpYWxpemVkID0gbGFzdENsb3NlZDsKQEAgLTcwNCwxOCArNzExLDE2IEBA
IHN0YXRpYyBib29sIGlzRWxlbWVudFByZXNlbnRhdGlvbmFsKGNvbnMKICAgICAgICAgfHwgbm9k
ZS0+aGFzVGFnTmFtZShpVGFnKSB8fCBub2RlLT5oYXNUYWdOYW1lKGVtVGFnKSB8fCBub2RlLT5o
YXNUYWdOYW1lKGJUYWcpIHx8IG5vZGUtPmhhc1RhZ05hbWUoc3Ryb25nVGFnKTsKIH0KIAotc3Rh
dGljIE5vZGUqIGhpZ2hlc3RBbmNlc3RvclRvV3JhcE1hcmt1cChjb25zdCBSYW5nZSogcmFuZ2Us
IEFubm90YXRlRm9ySW50ZXJjaGFuZ2UgYW5ub3RhdGUpCitzdGF0aWMgTm9kZSogaGlnaGVzdEFu
Y2VzdG9yVG9XcmFwTWFya3VwKGNvbnN0IFBvc2l0aW9uJiBzdGFydCwgY29uc3QgUG9zaXRpb24m
IGVuZCwgTm9kZSYgY29tbW9uQW5jZXN0b3IsIEFubm90YXRlRm9ySW50ZXJjaGFuZ2UgYW5ub3Rh
dGUpCiB7Ci0gICAgYXV0byogY29tbW9uQW5jZXN0b3IgPSByYW5nZS0+Y29tbW9uQW5jZXN0b3JD
b250YWluZXIoKTsKLSAgICBBU1NFUlQoY29tbW9uQW5jZXN0b3IpOwogICAgIE5vZGUqIHNwZWNp
YWxDb21tb25BbmNlc3RvciA9IG51bGxwdHI7CiAgICAgaWYgKGFubm90YXRlID09IEFubm90YXRl
Rm9ySW50ZXJjaGFuZ2U6OlllcykgewogICAgICAgICAvLyBJbmNsdWRlIGFuY2VzdG9ycyB0aGF0
IGFyZW4ndCBjb21wbGV0ZWx5IGluc2lkZSB0aGUgcmFuZ2UgYnV0IGFyZSByZXF1aXJlZCB0byBy
ZXRhaW4gCiAgICAgICAgIC8vIHRoZSBzdHJ1Y3R1cmUgYW5kIGFwcGVhcmFuY2Ugb2YgdGhlIGNv
cGllZCBtYXJrdXAuCi0gICAgICAgIHNwZWNpYWxDb21tb25BbmNlc3RvciA9IGFuY2VzdG9yVG9S
ZXRhaW5TdHJ1Y3R1cmVBbmRBcHBlYXJhbmNlKGNvbW1vbkFuY2VzdG9yKTsKKyAgICAgICAgc3Bl
Y2lhbENvbW1vbkFuY2VzdG9yID0gYW5jZXN0b3JUb1JldGFpblN0cnVjdHVyZUFuZEFwcGVhcmFu
Y2UoJmNvbW1vbkFuY2VzdG9yKTsKIAotICAgICAgICBpZiAoYXV0byogcGFyZW50TGlzdE5vZGUg
PSBlbmNsb3NpbmdOb2RlT2ZUeXBlKGZpcnN0UG9zaXRpb25Jbk9yQmVmb3JlTm9kZShyYW5nZS0+
Zmlyc3ROb2RlKCkpLCBpc0xpc3RJdGVtKSkgewotICAgICAgICAgICAgaWYgKCFlZGl0aW5nSWdu
b3Jlc0NvbnRlbnQoKnBhcmVudExpc3ROb2RlKSAmJiBXZWJDb3JlOjphcmVSYW5nZXNFcXVhbChW
aXNpYmxlU2VsZWN0aW9uOjpzZWxlY3Rpb25Gcm9tQ29udGVudHNPZk5vZGUocGFyZW50TGlzdE5v
ZGUpLnRvTm9ybWFsaXplZFJhbmdlKCkuZ2V0KCksIHJhbmdlKSkgeworICAgICAgICBpZiAoYXV0
byogcGFyZW50TGlzdE5vZGUgPSBlbmNsb3NpbmdOb2RlT2ZUeXBlKHN0YXJ0LCBpc0xpc3RJdGVt
KSkgeworICAgICAgICAgICAgaWYgKCFlZGl0aW5nSWdub3Jlc0NvbnRlbnQoKnBhcmVudExpc3RO
b2RlKSAmJiBWaXNpYmxlU2VsZWN0aW9uOjpzZWxlY3Rpb25Gcm9tQ29udGVudHNPZk5vZGUocGFy
ZW50TGlzdE5vZGUpID09IFZpc2libGVTZWxlY3Rpb24oc3RhcnQsIGVuZCkpIHsKICAgICAgICAg
ICAgICAgICBzcGVjaWFsQ29tbW9uQW5jZXN0b3IgPSBwYXJlbnRMaXN0Tm9kZS0+cGFyZW50Tm9k
ZSgpOwogICAgICAgICAgICAgICAgIHdoaWxlIChzcGVjaWFsQ29tbW9uQW5jZXN0b3IgJiYgIWlz
TGlzdEhUTUxFbGVtZW50KHNwZWNpYWxDb21tb25BbmNlc3RvcikpCiAgICAgICAgICAgICAgICAg
ICAgIHNwZWNpYWxDb21tb25BbmNlc3RvciA9IHNwZWNpYWxDb21tb25BbmNlc3Rvci0+cGFyZW50
Tm9kZSgpOwpAQCAtNzIzLDExICs3MjgsMTEgQEAgc3RhdGljIE5vZGUqIGhpZ2hlc3RBbmNlc3Rv
clRvV3JhcE1hcmt1cAogICAgICAgICB9CiAKICAgICAgICAgLy8gUmV0YWluIHRoZSBNYWlsIHF1
b3RlIGxldmVsIGJ5IGluY2x1ZGluZyBhbGwgYW5jZXN0b3IgbWFpbCBibG9jayBxdW90ZXMuCi0g
ICAgICAgIGlmIChOb2RlKiBoaWdoZXN0TWFpbEJsb2NrcXVvdGUgPSBoaWdoZXN0RW5jbG9zaW5n
Tm9kZU9mVHlwZShmaXJzdFBvc2l0aW9uSW5PckJlZm9yZU5vZGUocmFuZ2UtPmZpcnN0Tm9kZSgp
KSwgaXNNYWlsQmxvY2txdW90ZSwgQ2FuQ3Jvc3NFZGl0aW5nQm91bmRhcnkpKQorICAgICAgICBp
ZiAoTm9kZSogaGlnaGVzdE1haWxCbG9ja3F1b3RlID0gaGlnaGVzdEVuY2xvc2luZ05vZGVPZlR5
cGUoc3RhcnQsIGlzTWFpbEJsb2NrcXVvdGUsIENhbkNyb3NzRWRpdGluZ0JvdW5kYXJ5KSkKICAg
ICAgICAgICAgIHNwZWNpYWxDb21tb25BbmNlc3RvciA9IGhpZ2hlc3RNYWlsQmxvY2txdW90ZTsK
ICAgICB9CiAKLSAgICBhdXRvKiBjaGVja0FuY2VzdG9yID0gc3BlY2lhbENvbW1vbkFuY2VzdG9y
ID8gc3BlY2lhbENvbW1vbkFuY2VzdG9yIDogY29tbW9uQW5jZXN0b3I7CisgICAgYXV0byogY2hl
Y2tBbmNlc3RvciA9IHNwZWNpYWxDb21tb25BbmNlc3RvciA/IHNwZWNpYWxDb21tb25BbmNlc3Rv
ciA6ICZjb21tb25BbmNlc3RvcjsKICAgICBpZiAoY2hlY2tBbmNlc3Rvci0+cmVuZGVyZXIoKSAm
JiBjaGVja0FuY2VzdG9yLT5yZW5kZXJlcigpLT5jb250YWluaW5nQmxvY2soKSkgewogICAgICAg
ICBOb2RlKiBuZXdTcGVjaWFsQ29tbW9uQW5jZXN0b3IgPSBoaWdoZXN0RW5jbG9zaW5nTm9kZU9m
VHlwZShmaXJzdFBvc2l0aW9uSW5Ob2RlKGNoZWNrQW5jZXN0b3IpLCAmaXNFbGVtZW50UHJlc2Vu
dGF0aW9uYWwsIENhbkNyb3NzRWRpdGluZ0JvdW5kYXJ5LCBjaGVja0FuY2VzdG9yLT5yZW5kZXJl
cigpLT5jb250YWluaW5nQmxvY2soKS0+ZWxlbWVudCgpKTsKICAgICAgICAgaWYgKG5ld1NwZWNp
YWxDb21tb25BbmNlc3RvcikKQEAgLTczOCw2MSArNzQzLDU5IEBAIHN0YXRpYyBOb2RlKiBoaWdo
ZXN0QW5jZXN0b3JUb1dyYXBNYXJrdXAKICAgICAvLyBJZiB0d28gb3IgbW9yZSB0YWJzIGFyZSBz
ZWxlY3RlZCwgY29tbW9uQW5jZXN0b3Igd2lsbCBiZSB0aGUgdGFiIHNwYW4uCiAgICAgLy8gSW4g
ZWl0aGVyIGNhc2UsIGlmIHRoZXJlIGlzIGEgc3BlY2lhbENvbW1vbkFuY2VzdG9yIGFscmVhZHks
IGl0IHdpbGwgbmVjZXNzYXJpbHkgYmUgYWJvdmUgCiAgICAgLy8gYW55IHRhYiBzcGFuIHRoYXQg
bmVlZHMgdG8gYmUgaW5jbHVkZWQuCi0gICAgaWYgKCFzcGVjaWFsQ29tbW9uQW5jZXN0b3IgJiYg
aXNUYWJTcGFuVGV4dE5vZGUoY29tbW9uQW5jZXN0b3IpKQotICAgICAgICBzcGVjaWFsQ29tbW9u
QW5jZXN0b3IgPSBjb21tb25BbmNlc3Rvci0+cGFyZW50Tm9kZSgpOwotICAgIGlmICghc3BlY2lh
bENvbW1vbkFuY2VzdG9yICYmIGlzVGFiU3Bhbk5vZGUoY29tbW9uQW5jZXN0b3IpKQotICAgICAg
ICBzcGVjaWFsQ29tbW9uQW5jZXN0b3IgPSBjb21tb25BbmNlc3RvcjsKKyAgICBpZiAoIXNwZWNp
YWxDb21tb25BbmNlc3RvciAmJiBpc1RhYlNwYW5UZXh0Tm9kZSgmY29tbW9uQW5jZXN0b3IpKQor
ICAgICAgICBzcGVjaWFsQ29tbW9uQW5jZXN0b3IgPSBjb21tb25BbmNlc3Rvci5wYXJlbnROb2Rl
KCk7CisgICAgaWYgKCFzcGVjaWFsQ29tbW9uQW5jZXN0b3IgJiYgaXNUYWJTcGFuTm9kZSgmY29t
bW9uQW5jZXN0b3IpKQorICAgICAgICBzcGVjaWFsQ29tbW9uQW5jZXN0b3IgPSAmY29tbW9uQW5j
ZXN0b3I7CiAKLSAgICBpZiAoYXV0byogZW5jbG9zaW5nQW5jaG9yID0gZW5jbG9zaW5nRWxlbWVu
dFdpdGhUYWcoZmlyc3RQb3NpdGlvbkluTm9kZShzcGVjaWFsQ29tbW9uQW5jZXN0b3IgPyBzcGVj
aWFsQ29tbW9uQW5jZXN0b3IgOiBjb21tb25BbmNlc3RvciksIGFUYWcpKQorICAgIGlmIChhdXRv
KiBlbmNsb3NpbmdBbmNob3IgPSBlbmNsb3NpbmdFbGVtZW50V2l0aFRhZyhmaXJzdFBvc2l0aW9u
SW5Ob2RlKHNwZWNpYWxDb21tb25BbmNlc3RvciA/IHNwZWNpYWxDb21tb25BbmNlc3RvciA6ICZj
b21tb25BbmNlc3RvciksIGFUYWcpKQogICAgICAgICBzcGVjaWFsQ29tbW9uQW5jZXN0b3IgPSBl
bmNsb3NpbmdBbmNob3I7CiAKICAgICByZXR1cm4gc3BlY2lhbENvbW1vbkFuY2VzdG9yOwogfQog
Ci0vLyBGSVhNRTogU2hvdWxkbid0IHdlIG9taXQgc3R5bGUgaW5mbyB3aGVuIGFubm90YXRlID09
IEFubm90YXRlRm9ySW50ZXJjaGFuZ2U6Ok5vPwotLy8gRklYTUU6IEF0IGxlYXN0LCBhbm5vdGF0
aW9uIGFuZCBzdHlsZSBpbmZvIHNob3VsZCBwcm9iYWJseSBub3QgYmUgaW5jbHVkZWQgaW4gcmFu
Z2UubWFya3VwU3RyaW5nKCkKLXN0YXRpYyBTdHJpbmcgY3JlYXRlTWFya3VwSW50ZXJuYWwoRG9j
dW1lbnQmIGRvY3VtZW50LCBjb25zdCBSYW5nZSYgcmFuZ2UsIFZlY3RvcjxOb2RlKj4qIG5vZGVz
LAorc3RhdGljIFN0cmluZyBzZXJpYWxpemVQcmVzZXJ2aW5nVmlzdWFsQXBwZWFyYW5jZUludGVy
bmFsKGNvbnN0IFBvc2l0aW9uJiBzdGFydCwgY29uc3QgUG9zaXRpb24mIGVuZCwgVmVjdG9yPE5v
ZGUqPiogbm9kZXMsCiAgICAgQW5ub3RhdGVGb3JJbnRlcmNoYW5nZSBhbm5vdGF0ZSwgQ29udmVy
dEJsb2Nrc1RvSW5saW5lcyBjb252ZXJ0QmxvY2tzVG9JbmxpbmVzLCBSZXNvbHZlVVJMcyB1cmxz
VG9SZXNvbHZlLCBNU09MaXN0TW9kZSBtc29MaXN0TW9kZSkKIHsKICAgICBzdGF0aWMgTmV2ZXJE
ZXN0cm95ZWQ8Y29uc3QgU3RyaW5nPiBpbnRlcmNoYW5nZU5ld2xpbmVTdHJpbmcoTUFLRV9TVEFU
SUNfU1RSSU5HX0lNUEwoIjxiciBjbGFzcz1cIiIgQXBwbGVJbnRlcmNoYW5nZU5ld2xpbmUgIlwi
PiIpKTsKIAotICAgIGJvb2wgY29sbGFwc2VkID0gcmFuZ2UuY29sbGFwc2VkKCk7Ci0gICAgaWYg
KGNvbGxhcHNlZCkKKyAgICBpZiAoc3RhcnQuaXNOdWxsKCkgfHwgZW5kLmlzTnVsbCgpIHx8ICFj
b21wYXJlUG9zaXRpb25zKHN0YXJ0LCBlbmQpKQogICAgICAgICByZXR1cm4gZW1wdHlTdHJpbmco
KTsKLSAgICBSZWZQdHI8Tm9kZT4gY29tbW9uQW5jZXN0b3IgPSByYW5nZS5jb21tb25BbmNlc3Rv
ckNvbnRhaW5lcigpOworCisgICAgUmVmUHRyPE5vZGU+IGNvbW1vbkFuY2VzdG9yID0gUmFuZ2U6
OmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyKHN0YXJ0LmNvbnRhaW5lck5vZGUoKSwgZW5kLmNvbnRh
aW5lck5vZGUoKSk7CiAgICAgaWYgKCFjb21tb25BbmNlc3RvcikKICAgICAgICAgcmV0dXJuIGVt
cHR5U3RyaW5nKCk7CiAKKyAgICBhdXRvJiBkb2N1bWVudCA9ICpzdGFydC5kb2N1bWVudCgpOwog
ICAgIGRvY3VtZW50LnVwZGF0ZUxheW91dElnbm9yZVBlbmRpbmdTdHlsZXNoZWV0cygpOwogCi0g
ICAgYXV0byogYm9keSA9IGVuY2xvc2luZ0VsZW1lbnRXaXRoVGFnKGZpcnN0UG9zaXRpb25Jbk5v
ZGUoY29tbW9uQW5jZXN0b3IuZ2V0KCkpLCBib2R5VGFnKTsKLSAgICBFbGVtZW50KiBmdWxseVNl
bGVjdGVkUm9vdCA9IG51bGxwdHI7CisgICAgVmlzaWJsZVBvc2l0aW9uIHZpc2libGVTdGFydCB7
IHN0YXJ0IH07CisgICAgVmlzaWJsZVBvc2l0aW9uIHZpc2libGVFbmQgeyBlbmQgfTsKKworICAg
IGF1dG8gYm9keSA9IG1ha2VSZWZQdHIoZW5jbG9zaW5nRWxlbWVudFdpdGhUYWcoZmlyc3RQb3Np
dGlvbkluTm9kZShjb21tb25BbmNlc3Rvci5nZXQoKSksIGJvZHlUYWcpKTsKKyAgICBSZWZQdHI8
RWxlbWVudD4gZnVsbHlTZWxlY3RlZFJvb3Q7CiAgICAgLy8gRklYTUU6IERvIHRoaXMgZm9yIGFs
bCBmdWxseSBzZWxlY3RlZCBibG9ja3MsIG5vdCBqdXN0IHRoZSBib2R5LgotICAgIGlmIChib2R5
ICYmIFZpc2libGVQb3NpdGlvbihmaXJzdFBvc2l0aW9uSW5Ob2RlKGJvZHkpKSA9PSBWaXNpYmxl
UG9zaXRpb24ocmFuZ2Uuc3RhcnRQb3NpdGlvbigpKQotICAgICAgICAmJiBWaXNpYmxlUG9zaXRp
b24obGFzdFBvc2l0aW9uSW5Ob2RlKGJvZHkpKSA9PSBWaXNpYmxlUG9zaXRpb24ocmFuZ2UuZW5k
UG9zaXRpb24oKSkpCisgICAgaWYgKGJvZHkgJiYgVmlzaWJsZVBvc2l0aW9uKGZpcnN0UG9zaXRp
b25Jbk5vZGUoYm9keS5nZXQoKSkpID09IHZpc2libGVTdGFydCAmJiBWaXNpYmxlUG9zaXRpb24o
bGFzdFBvc2l0aW9uSW5Ob2RlKGJvZHkuZ2V0KCkpKSA9PSB2aXNpYmxlRW5kKQogICAgICAgICBm
dWxseVNlbGVjdGVkUm9vdCA9IGJvZHk7Ci0gICAgTm9kZSogc3BlY2lhbENvbW1vbkFuY2VzdG9y
ID0gaGlnaGVzdEFuY2VzdG9yVG9XcmFwTWFya3VwKCZyYW5nZSwgYW5ub3RhdGUpOworICAgIGJv
b2wgbmVlZHNQb3NpdGlvblN0eWxlQ29udmVyc2lvbiA9IGJvZHkgJiYgZnVsbHlTZWxlY3RlZFJv
b3QgPT0gYm9keSAmJiBkb2N1bWVudC5zZXR0aW5ncygpLnNob3VsZENvbnZlcnRQb3NpdGlvblN0
eWxlT25Db3B5KCk7CisKKyAgICBOb2RlKiBzcGVjaWFsQ29tbW9uQW5jZXN0b3IgPSBoaWdoZXN0
QW5jZXN0b3JUb1dyYXBNYXJrdXAoc3RhcnQsIGVuZCwgKmNvbW1vbkFuY2VzdG9yLCBhbm5vdGF0
ZSk7CisKKyAgICBTdHlsZWRNYXJrdXBBY2N1bXVsYXRvciBhY2N1bXVsYXRvcihzdGFydCwgZW5k
LCBub2RlcywgdXJsc1RvUmVzb2x2ZSwgYW5ub3RhdGUsIG1zb0xpc3RNb2RlLCBuZWVkc1Bvc2l0
aW9uU3R5bGVDb252ZXJzaW9uLCBzcGVjaWFsQ29tbW9uQW5jZXN0b3IpOwogCi0gICAgYm9vbCBu
ZWVkc1Bvc2l0aW9uU3R5bGVDb252ZXJzaW9uID0gYm9keSAmJiBmdWxseVNlbGVjdGVkUm9vdCA9
PSBib2R5Ci0gICAgICAgICYmIGRvY3VtZW50LnNldHRpbmdzKCkuc2hvdWxkQ29udmVydFBvc2l0
aW9uU3R5bGVPbkNvcHkoKTsKLSAgICBTdHlsZWRNYXJrdXBBY2N1bXVsYXRvciBhY2N1bXVsYXRv
cihub2RlcywgdXJsc1RvUmVzb2x2ZSwgYW5ub3RhdGUsIG1zb0xpc3RNb2RlLCAmcmFuZ2UsIG5l
ZWRzUG9zaXRpb25TdHlsZUNvbnZlcnNpb24sIHNwZWNpYWxDb21tb25BbmNlc3Rvcik7Ci0gICAg
Tm9kZSogcGFzdEVuZCA9IHJhbmdlLnBhc3RMYXN0Tm9kZSgpOwotCi0gICAgTm9kZSogc3RhcnRO
b2RlID0gcmFuZ2UuZmlyc3ROb2RlKCk7Ci0gICAgVmlzaWJsZVBvc2l0aW9uIHZpc2libGVTdGFy
dChyYW5nZS5zdGFydFBvc2l0aW9uKCksIFZQX0RFRkFVTFRfQUZGSU5JVFkpOwotICAgIFZpc2li
bGVQb3NpdGlvbiB2aXNpYmxlRW5kKHJhbmdlLmVuZFBvc2l0aW9uKCksIFZQX0RFRkFVTFRfQUZG
SU5JVFkpOworICAgIFBvc2l0aW9uIHN0YXJ0QWRqdXN0ZWRGb3JJbnRlcmNoYW5nZU5ld2xpbmUg
PSBzdGFydDsKICAgICBpZiAoYW5ub3RhdGUgPT0gQW5ub3RhdGVGb3JJbnRlcmNoYW5nZTo6WWVz
ICYmIG5lZWRJbnRlcmNoYW5nZU5ld2xpbmVBZnRlcih2aXNpYmxlU3RhcnQpKSB7CiAgICAgICAg
IGlmICh2aXNpYmxlU3RhcnQgPT0gdmlzaWJsZUVuZC5wcmV2aW91cygpKQogICAgICAgICAgICAg
cmV0dXJuIGludGVyY2hhbmdlTmV3bGluZVN0cmluZzsKIAogICAgICAgICBhY2N1bXVsYXRvci5h
cHBlbmRTdHJpbmcoaW50ZXJjaGFuZ2VOZXdsaW5lU3RyaW5nKTsKLSAgICAgICAgc3RhcnROb2Rl
ID0gdmlzaWJsZVN0YXJ0Lm5leHQoKS5kZWVwRXF1aXZhbGVudCgpLmRlcHJlY2F0ZWROb2RlKCk7
CisgICAgICAgIHN0YXJ0QWRqdXN0ZWRGb3JJbnRlcmNoYW5nZU5ld2xpbmUgPSB2aXNpYmxlU3Rh
cnQubmV4dCgpLmRlZXBFcXVpdmFsZW50KCk7CiAKLSAgICAgICAgaWYgKHBhc3RFbmQgJiYgUmFu
Z2U6OmNvbXBhcmVCb3VuZGFyeVBvaW50cyhzdGFydE5vZGUsIDAsIHBhc3RFbmQsIDApLnJlbGVh
c2VSZXR1cm5WYWx1ZSgpID49IDApCisgICAgICAgIGlmIChjb21wYXJlUG9zaXRpb25zKHN0YXJ0
QWRqdXN0ZWRGb3JJbnRlcmNoYW5nZU5ld2xpbmUsIGVuZCkgPj0gMCkKICAgICAgICAgICAgIHJl
dHVybiBpbnRlcmNoYW5nZU5ld2xpbmVTdHJpbmc7CiAgICAgfQogCi0gICAgTm9kZSogbGFzdENs
b3NlZCA9IGFjY3VtdWxhdG9yLnNlcmlhbGl6ZU5vZGVzKHN0YXJ0Tm9kZSwgcGFzdEVuZCk7Cisg
ICAgTm9kZSogbGFzdENsb3NlZCA9IGFjY3VtdWxhdG9yLnNlcmlhbGl6ZU5vZGVzKHN0YXJ0QWRq
dXN0ZWRGb3JJbnRlcmNoYW5nZU5ld2xpbmUsIGVuZCk7CiAKICAgICBpZiAoc3BlY2lhbENvbW1v
bkFuY2VzdG9yICYmIGxhc3RDbG9zZWQpIHsKICAgICAgICAgLy8gQWxzbyBpbmNsdWRlIGFsbCBv
ZiB0aGUgYW5jZXN0b3JzIG9mIGxhc3RDbG9zZWQgdXAgdG8gdGhpcyBzcGVjaWFsIGFuY2VzdG9y
LgpAQCAtODQ2LDcgKzg0OSw3IEBAIHN0YXRpYyBTdHJpbmcgY3JlYXRlTWFya3VwSW50ZXJuYWwo
RG9jdW0KIAogU3RyaW5nIHNlcmlhbGl6ZVByZXNlcnZpbmdWaXN1YWxBcHBlYXJhbmNlKGNvbnN0
IFJhbmdlJiByYW5nZSwgVmVjdG9yPE5vZGUqPiogbm9kZXMsIEFubm90YXRlRm9ySW50ZXJjaGFu
Z2UgYW5ub3RhdGUsIENvbnZlcnRCbG9ja3NUb0lubGluZXMgY29udmVydEJsb2Nrc1RvSW5saW5l
cywgUmVzb2x2ZVVSTHMgdXJsc1RvUmVzbHZlKQogewotICAgIHJldHVybiBjcmVhdGVNYXJrdXBJ
bnRlcm5hbChyYW5nZS5vd25lckRvY3VtZW50KCksIHJhbmdlLCBub2RlcywgYW5ub3RhdGUsIGNv
bnZlcnRCbG9ja3NUb0lubGluZXMsIHVybHNUb1Jlc2x2ZSwgTVNPTGlzdE1vZGU6OkRvTm90UHJl
c2VydmUpOworICAgIHJldHVybiBzZXJpYWxpemVQcmVzZXJ2aW5nVmlzdWFsQXBwZWFyYW5jZUlu
dGVybmFsKHJhbmdlLnN0YXJ0UG9zaXRpb24oKSwgcmFuZ2UuZW5kUG9zaXRpb24oKSwgbm9kZXMs
IGFubm90YXRlLCBjb252ZXJ0QmxvY2tzVG9JbmxpbmVzLCB1cmxzVG9SZXNsdmUsIE1TT0xpc3RN
b2RlOjpEb05vdFByZXNlcnZlKTsKIH0KIAogc3RhdGljIGJvb2wgc2hvdWxkUHJlc2VydmVNU09M
aXN0cyhjb25zdCBTdHJpbmcmIG1hcmt1cCkKQEAgLTg3MCw5ICs4NzMsOCBAQCBTdHJpbmcgc2Fu
aXRpemVkTWFya3VwRm9yRnJhZ21lbnRJbkRvY3VtCiAgICAgQVNTRVJUKGJvZHlFbGVtZW50KTsK
ICAgICBib2R5RWxlbWVudC0+YXBwZW5kQ2hpbGQoZnJhZ21lbnQuZ2V0KCkpOwogCi0gICAgYXV0
byByYW5nZSA9IFJhbmdlOjpjcmVhdGUoZG9jdW1lbnQpOwotICAgIHJhbmdlLT5zZWxlY3ROb2Rl
Q29udGVudHMoKmJvZHlFbGVtZW50KTsKLSAgICBhdXRvIHJlc3VsdCA9IGNyZWF0ZU1hcmt1cElu
dGVybmFsKGRvY3VtZW50LCByYW5nZS5nZXQoKSwgbnVsbHB0ciwgQW5ub3RhdGVGb3JJbnRlcmNo
YW5nZTo6WWVzLCBDb252ZXJ0QmxvY2tzVG9JbmxpbmVzOjpObywgUmVzb2x2ZVVSTHM6Olllc0V4
Y2x1ZGluZ0xvY2FsRmlsZVVSTHNGb3JQcml2YWN5LCBtc29MaXN0TW9kZSk7CisgICAgYXV0byBy
ZXN1bHQgPSBzZXJpYWxpemVQcmVzZXJ2aW5nVmlzdWFsQXBwZWFyYW5jZUludGVybmFsKGZpcnN0
UG9zaXRpb25Jbk5vZGUoYm9keUVsZW1lbnQuZ2V0KCkpLCBsYXN0UG9zaXRpb25Jbk5vZGUoYm9k
eUVsZW1lbnQuZ2V0KCkpLCBudWxscHRyLAorICAgICAgICBBbm5vdGF0ZUZvckludGVyY2hhbmdl
OjpZZXMsIENvbnZlcnRCbG9ja3NUb0lubGluZXM6Ok5vLCBSZXNvbHZlVVJMczo6WWVzRXhjbHVk
aW5nTG9jYWxGaWxlVVJMc0ZvclByaXZhY3ksIG1zb0xpc3RNb2RlKTsKIAogICAgIGlmIChtc29M
aXN0TW9kZSA9PSBNU09MaXN0TW9kZTo6UHJlc2VydmUpIHsKICAgICAgICAgU3RyaW5nQnVpbGRl
ciBidWlsZGVyOwpAQCAtOTUwLDcgKzk1Miw3IEBAIFJlZjxEb2N1bWVudEZyYWdtZW50PiBjcmVh
dGVGcmFnbWVudEZyb20KIAogU3RyaW5nIHNlcmlhbGl6ZUZyYWdtZW50KGNvbnN0IE5vZGUmIG5v
ZGUsIFNlcmlhbGl6ZWROb2RlcyByb290LCBWZWN0b3I8Tm9kZSo+KiBub2RlcywgUmVzb2x2ZVVS
THMgdXJsc1RvUmVzb2x2ZSwgVmVjdG9yPFF1YWxpZmllZE5hbWU+KiB0YWdOYW1lc1RvU2tpcCwg
U2VyaWFsaXphdGlvblN5bnRheCBzZXJpYWxpemF0aW9uU3ludGF4KQogewotICAgIE1hcmt1cEFj
Y3VtdWxhdG9yIGFjY3VtdWxhdG9yKG5vZGVzLCB1cmxzVG9SZXNvbHZlLCBudWxscHRyLCBzZXJp
YWxpemF0aW9uU3ludGF4KTsKKyAgICBNYXJrdXBBY2N1bXVsYXRvciBhY2N1bXVsYXRvcihub2Rl
cywgdXJsc1RvUmVzb2x2ZSwgc2VyaWFsaXphdGlvblN5bnRheCk7CiAgICAgcmV0dXJuIGFjY3Vt
dWxhdG9yLnNlcmlhbGl6ZU5vZGVzKGNvbnN0X2Nhc3Q8Tm9kZSY+KG5vZGUpLCByb290LCB0YWdO
YW1lc1RvU2tpcCk7CiB9CiAKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvbWFya3VwLmgK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvZWRpdGluZy9tYXJrdXAuaAkocmV2aXNpb24g
MjM2NjE2KQorKysgU291cmNlL1dlYkNvcmUvZWRpdGluZy9tYXJrdXAuaAkod29ya2luZyBjb3B5
KQpAQCAtNDYsNiArNDYsNyBAQCBjbGFzcyBOb2RlOwogY2xhc3MgUGFnZTsKIGNsYXNzIFF1YWxp
ZmllZE5hbWU7CiBjbGFzcyBSYW5nZTsKK2NsYXNzIFZpc2libGVTZWxlY3Rpb247CiAKIHZvaWQg
cmVwbGFjZVN1YnJlc291cmNlVVJMcyhSZWY8RG9jdW1lbnRGcmFnbWVudD4mJiwgSGFzaE1hcDxB
dG9taWNTdHJpbmcsIEF0b21pY1N0cmluZz4mJik7CiB2b2lkIHJlbW92ZVN1YnJlc291cmNlVVJM
QXR0cmlidXRlcyhSZWY8RG9jdW1lbnRGcmFnbWVudD4mJiwgV1RGOjpGdW5jdGlvbjxib29sKGNv
bnN0IFVSTCYpPiBzaG91bGRSZW1vdmVVUkwpOwpAQCAtNjksNyArNzAsOCBAQCBFeGNlcHRpb25P
cjx2b2lkPiByZXBsYWNlQ2hpbGRyZW5XaXRoRnJhCiAKIGVudW0gY2xhc3MgUmVzb2x2ZVVSTHMg
OiB1aW50OF90IHsgTm8sIFllcywgWWVzRXhjbHVkaW5nTG9jYWxGaWxlVVJMc0ZvclByaXZhY3kg
fTsKIGVudW0gY2xhc3MgQ29udmVydEJsb2Nrc1RvSW5saW5lcyA6IHVpbnQ4X3QgeyBObywgWWVz
IH07Ci1XRUJDT1JFX0VYUE9SVCBTdHJpbmcgc2VyaWFsaXplUHJlc2VydmluZ1Zpc3VhbEFwcGVh
cmFuY2UoY29uc3QgUmFuZ2UmLCBWZWN0b3I8Tm9kZSo+KiA9IG51bGxwdHIsIEFubm90YXRlRm9y
SW50ZXJjaGFuZ2UgPSBBbm5vdGF0ZUZvckludGVyY2hhbmdlOjpObywgQ29udmVydEJsb2Nrc1Rv
SW5saW5lcyA9IENvbnZlcnRCbG9ja3NUb0lubGluZXM6Ok5vLCBSZXNvbHZlVVJMcyA9IFJlc29s
dmVVUkxzOjpObyk7CitXRUJDT1JFX0VYUE9SVCBTdHJpbmcgc2VyaWFsaXplUHJlc2VydmluZ1Zp
c3VhbEFwcGVhcmFuY2UoY29uc3QgUmFuZ2UmLCBWZWN0b3I8Tm9kZSo+KiA9IG51bGxwdHIsCisg
ICAgQW5ub3RhdGVGb3JJbnRlcmNoYW5nZSA9IEFubm90YXRlRm9ySW50ZXJjaGFuZ2U6Ok5vLCBD
b252ZXJ0QmxvY2tzVG9JbmxpbmVzID0gQ29udmVydEJsb2Nrc1RvSW5saW5lczo6Tm8sIFJlc29s
dmVVUkxzID0gUmVzb2x2ZVVSTHM6Ok5vKTsKIAogZW51bSBjbGFzcyBTZXJpYWxpemVkTm9kZXMg
OiB1aW50OF90IHsgU3VidHJlZUluY2x1ZGluZ05vZGUsIFN1YnRyZWVzT2ZDaGlsZHJlbiB9Owog
ZW51bSBjbGFzcyBTZXJpYWxpemF0aW9uU3ludGF4IDogdWludDhfdCB7IEhUTUwsIFhNTCB9OwpJ
bmRleDogU291cmNlL1dlYkNvcmUvcGFnZS9QYWdlU2VyaWFsaXplci5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL1dlYkNvcmUvcGFnZS9QYWdlU2VyaWFsaXplci5jcHAJKHJldmlzaW9uIDIzNjYx
NikKKysrIFNvdXJjZS9XZWJDb3JlL3BhZ2UvUGFnZVNlcmlhbGl6ZXIuY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC05NCw3ICs5NCw3IEBAIHN0YXRpYyBjb25zdCBRdWFsaWZpZWROYW1lJiBmcmFtZU93
bmVyVVIKICAgICByZXR1cm4gaXM8SFRNTE9iamVjdEVsZW1lbnQ+KGZyYW1lT3duZXIpID8gSFRN
TE5hbWVzOjpkYXRhQXR0ciA6IEhUTUxOYW1lczo6c3JjQXR0cjsKIH0KIAotY2xhc3MgUGFnZVNl
cmlhbGl6ZXI6OlNlcmlhbGl6ZXJNYXJrdXBBY2N1bXVsYXRvciBmaW5hbCA6IHB1YmxpYyBXZWJD
b3JlOjpNYXJrdXBBY2N1bXVsYXRvciB7CitjbGFzcyBQYWdlU2VyaWFsaXplcjo6U2VyaWFsaXpl
ck1hcmt1cEFjY3VtdWxhdG9yIGZpbmFsIDogcHVibGljIE1hcmt1cEFjY3VtdWxhdG9yIHsKIHB1
YmxpYzoKICAgICBTZXJpYWxpemVyTWFya3VwQWNjdW11bGF0b3IoUGFnZVNlcmlhbGl6ZXImLCBE
b2N1bWVudCYsIFZlY3RvcjxOb2RlKj4qKTsKIApJbmRleDogV2ViS2l0Lnhjd29ya3NwYWNlL3hj
c2hhcmVkZGF0YS94Y3NjaGVtZXMvQWxsIFNvdXJjZS54Y3NjaGVtZQo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBX
ZWJLaXQueGN3b3Jrc3BhY2UveGNzaGFyZWRkYXRhL3hjc2NoZW1lcy9BbGwgU291cmNlLnhjc2No
ZW1lCShyZXZpc2lvbiAyMzY2MTYpCisrKyBXZWJLaXQueGN3b3Jrc3BhY2UveGNzaGFyZWRkYXRh
L3hjc2NoZW1lcy9BbGwgU291cmNlLnhjc2NoZW1lCSh3b3JraW5nIGNvcHkpCkBAIC0xLDYgKzEs
NiBAQAogPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KIDxTY2hlbWUKLSAg
IHZlcnNpb24gPSAiMS43Ij4KKyAgIHZlcnNpb24gPSAiMS4zIj4KICAgIDxCdWlsZEFjdGlvbgog
ICAgICAgcGFyYWxsZWxpemVCdWlsZGFibGVzID0gIk5PIgogICAgICAgYnVpbGRJbXBsaWNpdERl
cGVuZGVuY2llcyA9ICJZRVMiPgpAQCAtMTM3LDE3ICsxMzcsMTYgQEAKICAgICAgIGJ1aWxkQ29u
ZmlndXJhdGlvbiA9ICJEZWJ1ZyIKICAgICAgIHNlbGVjdGVkRGVidWdnZXJJZGVudGlmaWVyID0g
Ilhjb2RlLkRlYnVnZ2VyRm91bmRhdGlvbi5EZWJ1Z2dlci5MTERCIgogICAgICAgc2VsZWN0ZWRM
YXVuY2hlcklkZW50aWZpZXIgPSAiWGNvZGUuRGVidWdnZXJGb3VuZGF0aW9uLkxhdW5jaGVyLkxM
REIiCi0gICAgICBsYW5ndWFnZSA9ICIiCiAgICAgICBzaG91bGRVc2VMYXVuY2hTY2hlbWVBcmdz
RW52ID0gIllFUyI+CiAgICAgICA8VGVzdGFibGVzPgogICAgICAgPC9UZXN0YWJsZXM+CiAgICAg
ICA8TWFjcm9FeHBhbnNpb24+CiAgICAgICAgICA8QnVpbGRhYmxlUmVmZXJlbmNlCiAgICAgICAg
ICAgICBCdWlsZGFibGVJZGVudGlmaWVyID0gInByaW1hcnkiCi0gICAgICAgICAgICBCbHVlcHJp
bnRJZGVudGlmaWVyID0gIjhEMTEwNzI2MDQ4NkNFQjgwMEU0NzA5MCIKLSAgICAgICAgICAgIEJ1
aWxkYWJsZU5hbWUgPSAiTWluaUJyb3dzZXIuYXBwIgotICAgICAgICAgICAgQmx1ZXByaW50TmFt
ZSA9ICJNaW5pQnJvd3NlciIKLSAgICAgICAgICAgIFJlZmVyZW5jZWRDb250YWluZXIgPSAiY29u
dGFpbmVyOlRvb2xzL01pbmlCcm93c2VyL01pbmlCcm93c2VyLnhjb2RlcHJvaiI+CisgICAgICAg
ICAgICBCbHVlcHJpbnRJZGVudGlmaWVyID0gIjkzNDA5OTRBMDg1NDBDQUUwMDdGM0JDOCIKKyAg
ICAgICAgICAgIEJ1aWxkYWJsZU5hbWUgPSAiRHVtcFJlbmRlclRyZWUiCisgICAgICAgICAgICBC
bHVlcHJpbnROYW1lID0gIkR1bXBSZW5kZXJUcmVlIgorICAgICAgICAgICAgUmVmZXJlbmNlZENv
bnRhaW5lciA9ICJjb250YWluZXI6VG9vbHMvRHVtcFJlbmRlclRyZWUvRHVtcFJlbmRlclRyZWUu
eGNvZGVwcm9qIj4KICAgICAgICAgIDwvQnVpbGRhYmxlUmVmZXJlbmNlPgogICAgICAgPC9NYWNy
b0V4cGFuc2lvbj4KICAgICAgIDxBZGRpdGlvbmFsT3B0aW9ucz4KQEAgLTE1Nyw3ICsxNTYsNiBA
QAogICAgICAgYnVpbGRDb25maWd1cmF0aW9uID0gIkRlYnVnIgogICAgICAgc2VsZWN0ZWREZWJ1
Z2dlcklkZW50aWZpZXIgPSAiWGNvZGUuRGVidWdnZXJGb3VuZGF0aW9uLkRlYnVnZ2VyLkxMREIi
CiAgICAgICBzZWxlY3RlZExhdW5jaGVySWRlbnRpZmllciA9ICJYY29kZS5EZWJ1Z2dlckZvdW5k
YXRpb24uTGF1bmNoZXIuTExEQiIKLSAgICAgIGxhbmd1YWdlID0gIiIKICAgICAgIGxhdW5jaFN0
eWxlID0gIjAiCiAgICAgICB1c2VDdXN0b21Xb3JraW5nRGlyZWN0b3J5ID0gIk5PIgogICAgICAg
aWdub3Jlc1BlcnNpc3RlbnRTdGF0ZU9uTGF1bmNoID0gIllFUyIKQEAgLTE2OCwxMiArMTY2LDQx
IEBACiAgICAgICAgICBydW5uYWJsZURlYnVnZ2luZ01vZGUgPSAiMCI+CiAgICAgICAgICA8QnVp
bGRhYmxlUmVmZXJlbmNlCiAgICAgICAgICAgICBCdWlsZGFibGVJZGVudGlmaWVyID0gInByaW1h
cnkiCi0gICAgICAgICAgICBCbHVlcHJpbnRJZGVudGlmaWVyID0gIjhEMTEwNzI2MDQ4NkNFQjgw
MEU0NzA5MCIKLSAgICAgICAgICAgIEJ1aWxkYWJsZU5hbWUgPSAiTWluaUJyb3dzZXIuYXBwIgot
ICAgICAgICAgICAgQmx1ZXByaW50TmFtZSA9ICJNaW5pQnJvd3NlciIKLSAgICAgICAgICAgIFJl
ZmVyZW5jZWRDb250YWluZXIgPSAiY29udGFpbmVyOlRvb2xzL01pbmlCcm93c2VyL01pbmlCcm93
c2VyLnhjb2RlcHJvaiI+CisgICAgICAgICAgICBCbHVlcHJpbnRJZGVudGlmaWVyID0gIjkzNDA5
OTRBMDg1NDBDQUUwMDdGM0JDOCIKKyAgICAgICAgICAgIEJ1aWxkYWJsZU5hbWUgPSAiRHVtcFJl
bmRlclRyZWUiCisgICAgICAgICAgICBCbHVlcHJpbnROYW1lID0gIkR1bXBSZW5kZXJUcmVlIgor
ICAgICAgICAgICAgUmVmZXJlbmNlZENvbnRhaW5lciA9ICJjb250YWluZXI6VG9vbHMvRHVtcFJl
bmRlclRyZWUvRHVtcFJlbmRlclRyZWUueGNvZGVwcm9qIj4KICAgICAgICAgIDwvQnVpbGRhYmxl
UmVmZXJlbmNlPgogICAgICAgPC9CdWlsZGFibGVQcm9kdWN0UnVubmFibGU+CisgICAgICA8Q29t
bWFuZExpbmVBcmd1bWVudHM+CisgICAgICAgICA8Q29tbWFuZExpbmVBcmd1bWVudAorICAgICAg
ICAgICAgYXJndW1lbnQgPSAiLi4vLi4vTGF5b3V0VGVzdHMvZWRpdGluZy9wYXN0ZWJvYXJkL2Nv
cHktZGlzcGxheS1ub25lLmh0bWwiCisgICAgICAgICAgICBpc0VuYWJsZWQgPSAiTk8iPgorICAg
ICAgICAgPC9Db21tYW5kTGluZUFyZ3VtZW50PgorICAgICAgICAgPENvbW1hbmRMaW5lQXJndW1l
bnQKKyAgICAgICAgICAgIGFyZ3VtZW50ID0gIi4uLy4uL0xheW91dFRlc3RzL2VkaXRpbmcvZXhl
Y0NvbW1hbmQvMTUzODEuaHRtbCIKKyAgICAgICAgICAgIGlzRW5hYmxlZCA9ICJOTyI+CisgICAg
ICAgICA8L0NvbW1hbmRMaW5lQXJndW1lbnQ+CisgICAgICAgICA8Q29tbWFuZExpbmVBcmd1bWVu
dAorICAgICAgICAgICAgYXJndW1lbnQgPSAiLi4vLi4vTGF5b3V0VGVzdHMvZWRpdGluZy9wYXN0
ZWJvYXJkL2Jsb2NrLXdyYXBwZXJzLW5lY2Vzc2FyeS5odG1sIgorICAgICAgICAgICAgaXNFbmFi
bGVkID0gIk5PIj4KKyAgICAgICAgIDwvQ29tbWFuZExpbmVBcmd1bWVudD4KKyAgICAgICAgIDxD
b21tYW5kTGluZUFyZ3VtZW50CisgICAgICAgICAgICBhcmd1bWVudCA9ICIuLi8uLi9MYXlvdXRU
ZXN0cy9lZGl0aW5nL3Bhc3RlYm9hcmQvY29weS1kaXNwbGF5LW5vbmUuaHRtbCIKKyAgICAgICAg
ICAgIGlzRW5hYmxlZCA9ICJOTyI+CisgICAgICAgICA8L0NvbW1hbmRMaW5lQXJndW1lbnQ+Cisg
ICAgICAgICA8Q29tbWFuZExpbmVBcmd1bWVudAorICAgICAgICAgICAgYXJndW1lbnQgPSAiLi4v
Li4vTGF5b3V0VGVzdHMvZWRpdGluZy9wYXN0ZWJvYXJkL3Bhc3RlLXRhYmxlLTAwMy5odG1sIgor
ICAgICAgICAgICAgaXNFbmFibGVkID0gIllFUyI+CisgICAgICAgICA8L0NvbW1hbmRMaW5lQXJn
dW1lbnQ+CisgICAgICA8L0NvbW1hbmRMaW5lQXJndW1lbnRzPgorICAgICAgPEVudmlyb25tZW50
VmFyaWFibGVzPgorICAgICAgICAgPEVudmlyb25tZW50VmFyaWFibGUKKyAgICAgICAgICAgIGtl
eSA9ICJPU19BQ1RJVklUWV9NT0RFIgorICAgICAgICAgICAgdmFsdWUgPSAiZGlzYWJsZSIKKyAg
ICAgICAgICAgIGlzRW5hYmxlZCA9ICJZRVMiPgorICAgICAgICAgPC9FbnZpcm9ubWVudFZhcmlh
YmxlPgorICAgICAgPC9FbnZpcm9ubWVudFZhcmlhYmxlcz4KICAgICAgIDxBZGRpdGlvbmFsT3B0
aW9ucz4KICAgICAgIDwvQWRkaXRpb25hbE9wdGlvbnM+CiAgICA8L0xhdW5jaEFjdGlvbj4K
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>351169</attachid>
            <date>2018-09-28 21:25:28 -0700</date>
            <delta_ts>2018-09-30 19:31:51 -0700</delta_ts>
            <desc>Cleanup</desc>
            <filename>bug-190107-20180928212527.patch</filename>
            <type>text/plain</type>
            <size>27218</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDIzNjYxOCkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDU1IEBACisyMDE4LTA5LTI4ICBSeW9zdWtl
IE5pd2EgIDxybml3YUB3ZWJraXQub3JnPgorCisgICAgICAgIFVzZSBQb3NpdGlvbiBpbnN0ZWFk
IG9mIFJhbmdlIGluIGNyZWF0ZU1hcmt1cEludGVybmFsCisgICAgICAgIGh0dHBzOi8vYnVncy53
ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xOTAxMDcKKworICAgICAgICBSZXZpZXdlZCBieSBO
T0JPRFkgKE9PUFMhKS4KKworICAgICAgICBVc2UgdHdvIFBvc2l0aW9uJ3MgaW5kaWNhdGluZyBz
dGFydCBhbmQgZW5kIGluc3RlYWQgb2YgUmFuZ2UgaW4gY3JlYXRlTWFya3VwSW50ZXJuYWwgYW5k
IFN0eWxpemVkTWFya3VwQWNjdW11bGF0b3IKKyAgICAgICAgaW4gb3JkZXIgdG8gc3VwcG9ydCBj
b3B5ICYgcGFzdGUgYWNyb3NzIHNoYWRvdyBib3VuZGFyaWVzIGluIHRoZSBidWcgMTU3NDQzLiBU
aGlzIHBhdGNoIGFsc28gcmVtb3ZlcyB0aGUgdXNlIG9mCisgICAgICAgIFJhbmdlIGluIE1hcmt1
cEFjY3VtdWxhdG9yIHNpbmNlIGFsbCB1c2VzIG9mIHJhbmdlIGlzIHZpYSBTdHlsaXplZE1hcmt1
cEFjY3VtdWxhdG9yLgorCisgICAgICAgIEFsc28gcmVuYW1lZCBjcmVhdGVNYXJrdXBJbnRlcm5h
bCB0byBzZXJpYWxpemVQcmVzZXJ2aW5nVmlzdWFsQXBwZWFyYW5jZUludGVybmFsIHRvIG1hdGNo
IHRoZSByZW5hbWUgaW4gcjIzNjYxMi4KKworICAgICAgICAqIGRvbS9Qb3NpdGlvbi5jcHA6Cisg
ICAgICAgIChXZWJDb3JlOjpQb3NpdGlvbjo6Zmlyc3ROb2RlIGNvbnN0KTogIEFkZGVkLgorICAg
ICAgICAqIGRvbS9Qb3NpdGlvbi5oOgorICAgICAgICAqIGVkaXRpbmcvTWFya3VwQWNjdW11bGF0
b3IuY3BwOgorICAgICAgICAoV2ViQ29yZTo6TWFya3VwQWNjdW11bGF0b3I6Ok1hcmt1cEFjY3Vt
dWxhdG9yKTogTm8gbG9uZ2VyIHRha2VzIFJhbmdlLgorICAgICAgICAoV2ViQ29yZTo6TWFya3Vw
QWNjdW11bGF0b3I6OmFwcGVuZFRleHQpOiBSZW1vdmVkIHRoZSBjb2RlIHRvIHRydW5jYXRlIHN0
cmluZyBhdCB0aGUgYm91bmRhcnkgcG9pbnRzIG9mIHRoZSByYW5nZS4KKyAgICAgICAgKiBlZGl0
aW5nL01hcmt1cEFjY3VtdWxhdG9yLmg6CisgICAgICAgIChXZWJDb3JlOjpNYXJrdXBBY2N1bXVs
YXRvcik6IE1hZGUgdGhpcyBjbGFzcyBub24tY29weWFibGUuCisgICAgICAgICogZWRpdGluZy9t
YXJrdXAuY3BwOgorICAgICAgICAoV2ViQ29yZTo6U3R5bGVkTWFya3VwQWNjdW11bGF0b3I6OlN0
eWxlZE1hcmt1cEFjY3VtdWxhdG9yKTogTm93IHRha2VzIGFuZCBzdG9yZXMgdHdvIHBvc2l0aW9u
cy4KKworICAgICAgICAoV2ViQ29yZTo6U3R5bGVkTWFya3VwQWNjdW11bGF0b3I6OmFwcGVuZFRl
eHQpOiBVc2UgdGV4dENvbnRlbnRSZXNwZWN0aW5nUmFuZ2UgaW4gdGhlIGNhc2UgYW5ub3RhdGlv
biBpcyBkaXNhYmxlZAorICAgICAgICBpbnN0ZWFkIG9mIGNhbGxpbmcgdG8gTWFya3VwQWNjdW11
bGF0b3I6OmFwcGVuZFRleHQsIHdoaWNoIG5vIGxvbmdlciByZXNwZWN0cyBib3VuZGFyeSBvZmZz
ZXRzLgorCisgICAgICAgIChXZWJDb3JlOjpTdHlsZWRNYXJrdXBBY2N1bXVsYXRvcjo6cmVuZGVy
ZWRUZXh0UmVzcGVjdGluZ1JhbmdlKTogUmVuYW1lZCBmcm9tIHJlbmRlcmVkVGV4dC4gVXBkYXRl
ZCB0byByZXNwZWN0CisgICAgICAgIGJvdW5kYXJ5IG9mZnNldHMgZGVmaW5lZCBieSBtX3N0YXJ0
IGFuZCBtX2VuZCBQb3NpdGlvbnMgaW5zdGVhZCBvZiBtX3JhbmdlIFJhbmdlLgorCisgICAgICAg
IChXZWJDb3JlOjpTdHlsZWRNYXJrdXBBY2N1bXVsYXRvcjo6dGV4dENvbnRlbnRSZXNwZWN0aW5n
UmFuZ2UpOiBSZW5hbWVkIGZyb20gc3RyaW5nVmFsdWVGb3JSYW5nZS4gRGl0dG8uCisKKyAgICAg
ICAgKFdlYkNvcmU6OlN0eWxlZE1hcmt1cEFjY3VtdWxhdG9yOjpzZXJpYWxpemVOb2Rlcyk6IE5v
dyBjb21wdXRlcyBzdGFydE5vZGUgYW5kIHBhc3RFbmQgbm9kZXMgZnJvbSBzdGFydCBhbmQgZW5k
CisgICAgICAgIFBvc2l0aW9ucy4gTm90ZSB0aGF0IHRoZSBlbmQgcG9zaXRpb24gaXMgYWx3YXlz
IHRoZSBuZXh0IG5vZGUgaW4gdGhlIHRyZWUgb3JkZXIgIGZvciBhIGNoYXJhY3RlciBub2RlCisg
ICAgICAgIGFuZCBjb21wdXRlTm9kZUFmdGVyUG9zaXRpb24gcmV0dXJucyBudWxscHRyIGZvciBh
IGNoYXJhY3RlciBkYXRhLgorCisgICAgICAgIChXZWJDb3JlOjpoaWdoZXN0QW5jZXN0b3JUb1dy
YXBNYXJrdXApOiBOb3cgdGFrZXMgdHdvIHBvc2l0aW9ucyBpbnN0ZWFkIG9mIGEgcmFuZ2UuCisK
KyAgICAgICAgKFdlYkNvcmU6OnNlcmlhbGl6ZVByZXNlcnZpbmdWaXN1YWxBcHBlYXJhbmNlSW50
ZXJuYWwpOiBSZW5hbWVkIGZyb20gY3JlYXRlTWFya3VwSW50ZXJuYWwuIFJlbW92ZWQgdGhlIG9i
c29sZXRlCisgICAgICAgIGNvbW1lbnRzIHdoaWNoIHdlcmUgYWRkZWQgZm9yIERPTVJhbmdlIGlu
IFdlYktpdExlZ2FjeS4KKworICAgICAgICAoV2ViQ29yZTo6c2VyaWFsaXplUHJlc2VydmluZ1Zp
c3VhbEFwcGVhcmFuY2UpOgorCisgICAgICAgIChXZWJDb3JlOjpzYW5pdGl6ZWRNYXJrdXBGb3JG
cmFnbWVudEluRG9jdW1lbnQpOiBDcmVhdGUgcG9zaXRpb25zIGluc3RlYWQgb2YgYSByYW5nZSB0
byBwYXNzIHRvCisgICAgICAgIHNlcmlhbGl6ZVByZXNlcnZpbmdWaXN1YWxBcHBlYXJhbmNlSW50
ZXJuYWwuCisKKyAgICAgICAgKFdlYkNvcmU6OnNlcmlhbGl6ZUZyYWdtZW50KToKKworICAgICAg
ICAqIGVkaXRpbmcvbWFya3VwLmg6CisgICAgICAgICogcGFnZS9QYWdlU2VyaWFsaXplci5jcHA6
CisgICAgICAgIChXZWJDb3JlOjpQYWdlU2VyaWFsaXplcjo6U2VyaWFsaXplck1hcmt1cEFjY3Vt
dWxhdG9yKTogUmVtb3ZlZCB0aGUgdW5uZWNlc3NhcnkgV2ViQ29yZSBuYW1lc3BhY2UgcXVhbGlm
aWVyLgorCiAyMDE4LTA5LTI4ICBSeW9zdWtlIE5pd2EgIDxybml3YUB3ZWJraXQub3JnPgogCiAg
ICAgICAgIFJFR1JFU1NJT04ocjIzNjYwOSk6IEFQSSB0ZXN0cyBmb3IgbXNvIGxpc3QgcHJlc2Vy
dmF0aW9uIGFyZSBmYWlsaW5nCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9kb20vUG9zaXRpb24uY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2RvbS9Qb3NpdGlvbi5jcHAJKHJldmlzaW9u
IDIzNjYxNikKKysrIFNvdXJjZS9XZWJDb3JlL2RvbS9Qb3NpdGlvbi5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTM4LDYgKzM4LDcgQEAKICNpbmNsdWRlICJJbmxpbmVJdGVyYXRvci5oIgogI2luY2x1
ZGUgIklubGluZVRleHRCb3guaCIKICNpbmNsdWRlICJMb2dnaW5nLmgiCisjaW5jbHVkZSAiTm9k
ZVRyYXZlcnNhbC5oIgogI2luY2x1ZGUgIlBvc2l0aW9uSXRlcmF0b3IuaCIKICNpbmNsdWRlICJS
ZW5kZXJCbG9jay5oIgogI2luY2x1ZGUgIlJlbmRlckZsZXhpYmxlQm94LmgiCkBAIC0yNDcsNiAr
MjQ4LDIwIEBAIFBvc2l0aW9uIFBvc2l0aW9uOjpwYXJlbnRBbmNob3JlZEVxdWl2YWwKICAgICBy
ZXR1cm4geyBjb250YWluZXJOb2RlKCksIGNvbXB1dGVPZmZzZXRJbkNvbnRhaW5lck5vZGUoKSwg
UG9zaXRpb25Jc09mZnNldEluQW5jaG9yIH07CiB9CiAKK1JlZlB0cjxOb2RlPiBQb3NpdGlvbjo6
Zmlyc3ROb2RlKCkgY29uc3QKK3sKKyAgICBhdXRvIGNvbnRhaW5lciA9IG1ha2VSZWZQdHIoY29u
dGFpbmVyTm9kZSgpKTsKKyAgICBpZiAoIWNvbnRhaW5lcikKKyAgICAgICAgcmV0dXJuIG51bGxw
dHI7CisgICAgaWYgKGlzPENoYXJhY3RlckRhdGE+KGNvbnRhaW5lcikpCisgICAgICAgIHJldHVy
biBjb250YWluZXI7CisgICAgaWYgKGF1dG8qIG5vZGUgPSBjb21wdXRlTm9kZUFmdGVyUG9zaXRp
b24oKSkKKyAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgaWYgKCFjb21wdXRlT2Zmc2V0SW5Db250
YWluZXJOb2RlKCkpCisgICAgICAgIHJldHVybiBjb250YWluZXI7CisgICAgcmV0dXJuIE5vZGVU
cmF2ZXJzYWw6Om5leHRTa2lwcGluZ0NoaWxkcmVuKCpjb250YWluZXIpOworfQorCiBOb2RlKiBQ
b3NpdGlvbjo6Y29tcHV0ZU5vZGVCZWZvcmVQb3NpdGlvbigpIGNvbnN0CiB7CiAgICAgaWYgKCFt
X2FuY2hvck5vZGUpCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9kb20vUG9zaXRpb24uaAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9kb20vUG9zaXRpb24uaAkocmV2aXNpb24gMjM2NjE2KQor
KysgU291cmNlL1dlYkNvcmUvZG9tL1Bvc2l0aW9uLmgJKHdvcmtpbmcgY29weSkKQEAgLTEwMyw2
ICsxMDMsOCBAQCBwdWJsaWM6CiAgICAgICAgIHJldHVybiBvZmZzZXRGb3JQb3NpdGlvbkFmdGVy
QW5jaG9yKCk7CiAgICAgfQogCisgICAgUmVmUHRyPE5vZGU+IGZpcnN0Tm9kZSgpIGNvbnN0Owor
CiAgICAgLy8gVGhlc2UgYXJlIGNvbnZlbmllbmNlIG1ldGhvZHMgd2hpY2ggYXJlIHNtYXJ0IGFi
b3V0IHdoZXRoZXIgdGhlIHBvc2l0aW9uIGlzIG5laWdoYm9yIGFuY2hvcmVkIG9yIHBhcmVudCBh
bmNob3JlZAogICAgIE5vZGUqIGNvbXB1dGVOb2RlQmVmb3JlUG9zaXRpb24oKSBjb25zdDsKICAg
ICBOb2RlKiBjb21wdXRlTm9kZUFmdGVyUG9zaXRpb24oKSBjb25zdDsKSW5kZXg6IFNvdXJjZS9X
ZWJDb3JlL2VkaXRpbmcvTWFya3VwQWNjdW11bGF0b3IuY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9XZWJDb3JlL2VkaXRpbmcvTWFya3VwQWNjdW11bGF0b3IuY3BwCShyZXZpc2lvbiAyMzY2MTYp
CisrKyBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL01hcmt1cEFjY3VtdWxhdG9yLmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtMTE2LDkgKzExNiw4IEBAIHZvaWQgTWFya3VwQWNjdW11bGF0b3I6OmFwcGVu
ZENoYXJhY3RlcnMKICAgICAgICAgYXBwZW5kQ2hhcmFjdGVyc1JlcGxhY2luZ0VudGl0aWVzSW50
ZXJuYWw8VUNoYXI+KHJlc3VsdCwgc291cmNlLCBvZmZzZXQsIGxlbmd0aCwgZW50aXR5TWFzayk7
CiB9CiAKLU1hcmt1cEFjY3VtdWxhdG9yOjpNYXJrdXBBY2N1bXVsYXRvcihWZWN0b3I8Tm9kZSo+
KiBub2RlcywgUmVzb2x2ZVVSTHMgcmVzb2x2ZVVSTHMsIGNvbnN0IFJhbmdlKiByYW5nZSwgU2Vy
aWFsaXphdGlvblN5bnRheCBzZXJpYWxpemF0aW9uU3ludGF4KQorTWFya3VwQWNjdW11bGF0b3I6
Ok1hcmt1cEFjY3VtdWxhdG9yKFZlY3RvcjxOb2RlKj4qIG5vZGVzLCBSZXNvbHZlVVJMcyByZXNv
bHZlVVJMcywgU2VyaWFsaXphdGlvblN5bnRheCBzZXJpYWxpemF0aW9uU3ludGF4KQogICAgIDog
bV9ub2Rlcyhub2RlcykKLSAgICAsIG1fcmFuZ2UocmFuZ2UpCiAgICAgLCBtX3Jlc29sdmVVUkxz
KHJlc29sdmVVUkxzKQogICAgICwgbV9zZXJpYWxpemF0aW9uU3ludGF4KHNlcmlhbGl6YXRpb25T
eW50YXgpCiAgICAgLCBtX3ByZWZpeExldmVsKDApCkBAIC0zNDEsMTkgKzM0MCw3IEBAIEVudGl0
eU1hc2sgTWFya3VwQWNjdW11bGF0b3I6OmVudGl0eU1hc2sKIHZvaWQgTWFya3VwQWNjdW11bGF0
b3I6OmFwcGVuZFRleHQoU3RyaW5nQnVpbGRlciYgcmVzdWx0LCBjb25zdCBUZXh0JiB0ZXh0KQog
ewogICAgIGNvbnN0IFN0cmluZyYgdGV4dERhdGEgPSB0ZXh0LmRhdGEoKTsKLSAgICB1bnNpZ25l
ZCBzdGFydCA9IDA7Ci0gICAgdW5zaWduZWQgbGVuZ3RoID0gdGV4dERhdGEubGVuZ3RoKCk7Ci0K
LSAgICBpZiAobV9yYW5nZSkgewotICAgICAgICBpZiAoJnRleHQgPT0gJm1fcmFuZ2UtPmVuZENv
bnRhaW5lcigpKQotICAgICAgICAgICAgbGVuZ3RoID0gbV9yYW5nZS0+ZW5kT2Zmc2V0KCk7Ci0g
ICAgICAgIGlmICgmdGV4dCA9PSAmbV9yYW5nZS0+c3RhcnRDb250YWluZXIoKSkgewotICAgICAg
ICAgICAgc3RhcnQgPSBtX3JhbmdlLT5zdGFydE9mZnNldCgpOwotICAgICAgICAgICAgbGVuZ3Ro
IC09IHN0YXJ0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgYXBwZW5kQ2hhcmFjdGVyc1JlcGxh
Y2luZ0VudGl0aWVzKHJlc3VsdCwgdGV4dERhdGEsIHN0YXJ0LCBsZW5ndGgsIGVudGl0eU1hc2tG
b3JUZXh0KHRleHQpKTsKKyAgICBhcHBlbmRDaGFyYWN0ZXJzUmVwbGFjaW5nRW50aXRpZXMocmVz
dWx0LCB0ZXh0RGF0YSwgMCwgdGV4dERhdGEubGVuZ3RoKCksIGVudGl0eU1hc2tGb3JUZXh0KHRl
eHQpKTsKIH0KIAogc3RhdGljIHZvaWQgYXBwZW5kQ29tbWVudChTdHJpbmdCdWlsZGVyJiByZXN1
bHQsIGNvbnN0IFN0cmluZyYgY29tbWVudCkKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcv
TWFya3VwQWNjdW11bGF0b3IuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9lZGl0aW5n
L01hcmt1cEFjY3VtdWxhdG9yLmgJKHJldmlzaW9uIDIzNjYxNikKKysrIFNvdXJjZS9XZWJDb3Jl
L2VkaXRpbmcvTWFya3VwQWNjdW11bGF0b3IuaAkod29ya2luZyBjb3B5KQpAQCAtNTYsMTAgKzU2
LDEwIEBAIGVudW0gRW50aXR5TWFzayB7CiAgICAgRW50aXR5TWFza0luSFRNTEF0dHJpYnV0ZVZh
bHVlID0gRW50aXR5QW1wIHwgRW50aXR5UXVvdCB8IEVudGl0eU5ic3AsCiB9OwogCi0vLyBGSVhN
RTogTm9uY29weWFibGU/CiBjbGFzcyBNYXJrdXBBY2N1bXVsYXRvciB7CisgICAgV1RGX01BS0Vf
Tk9OQ09QWUFCTEUoTWFya3VwQWNjdW11bGF0b3IpOwogcHVibGljOgotICAgIE1hcmt1cEFjY3Vt
dWxhdG9yKFZlY3RvcjxOb2RlKj4qLCBSZXNvbHZlVVJMcywgY29uc3QgUmFuZ2UqID0gbnVsbHB0
ciwgU2VyaWFsaXphdGlvblN5bnRheCA9IFNlcmlhbGl6YXRpb25TeW50YXg6OkhUTUwpOworICAg
IE1hcmt1cEFjY3VtdWxhdG9yKFZlY3RvcjxOb2RlKj4qLCBSZXNvbHZlVVJMcywgU2VyaWFsaXph
dGlvblN5bnRheCA9IFNlcmlhbGl6YXRpb25TeW50YXg6OkhUTUwpOwogICAgIHZpcnR1YWwgfk1h
cmt1cEFjY3VtdWxhdG9yKCk7CiAKICAgICBTdHJpbmcgc2VyaWFsaXplTm9kZXMoTm9kZSYgdGFy
Z2V0Tm9kZSwgU2VyaWFsaXplZE5vZGVzLCBWZWN0b3I8UXVhbGlmaWVkTmFtZT4qIHRhZ05hbWVz
VG9Ta2lwID0gbnVsbHB0cik7CkBAIC0xMDksNyArMTA5LDYgQEAgcHJvdGVjdGVkOgogICAgIEVu
dGl0eU1hc2sgZW50aXR5TWFza0ZvclRleHQoY29uc3QgVGV4dCYpIGNvbnN0OwogCiAgICAgVmVj
dG9yPE5vZGUqPiogY29uc3QgbV9ub2RlczsKLSAgICBjb25zdCBSYW5nZSogY29uc3QgbV9yYW5n
ZTsKIAogcHJpdmF0ZToKICAgICBTdHJpbmcgcmVzb2x2ZVVSTElmTmVlZGVkKGNvbnN0IEVsZW1l
bnQmLCBjb25zdCBTdHJpbmcmKSBjb25zdDsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcv
bWFya3VwLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL21hcmt1cC5j
cHAJKHJldmlzaW9uIDIzNjYxOCkKKysrIFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvbWFya3VwLmNw
cAkod29ya2luZyBjb3B5KQpAQCAtMjE5LDkgKzIxOSwxMCBAQCBjbGFzcyBTdHlsZWRNYXJrdXBB
Y2N1bXVsYXRvciBmaW5hbCA6IHB1CiBwdWJsaWM6CiAgICAgZW51bSBSYW5nZUZ1bGx5U2VsZWN0
c05vZGUgeyBEb2VzRnVsbHlTZWxlY3ROb2RlLCBEb2VzTm90RnVsbHlTZWxlY3ROb2RlIH07CiAK
LSAgICBTdHlsZWRNYXJrdXBBY2N1bXVsYXRvcihWZWN0b3I8Tm9kZSo+KiBub2RlcywgUmVzb2x2
ZVVSTHMsIEFubm90YXRlRm9ySW50ZXJjaGFuZ2UsIE1TT0xpc3RNb2RlLCBjb25zdCBSYW5nZSos
IGJvb2wgbmVlZHNQb3NpdGlvblN0eWxlQ29udmVyc2lvbiwgTm9kZSogaGlnaGVzdE5vZGVUb0Jl
U2VyaWFsaXplZCA9IG51bGxwdHIpOworICAgIFN0eWxlZE1hcmt1cEFjY3VtdWxhdG9yKGNvbnN0
IFBvc2l0aW9uJiBzdGFydCwgY29uc3QgUG9zaXRpb24mIGVuZCwgVmVjdG9yPE5vZGUqPiogbm9k
ZXMsCisgICAgICAgIFJlc29sdmVVUkxzLCBBbm5vdGF0ZUZvckludGVyY2hhbmdlLCBNU09MaXN0
TW9kZSwgYm9vbCBuZWVkc1Bvc2l0aW9uU3R5bGVDb252ZXJzaW9uLCBOb2RlKiBoaWdoZXN0Tm9k
ZVRvQmVTZXJpYWxpemVkID0gbnVsbHB0cik7CiAKLSAgICBOb2RlKiBzZXJpYWxpemVOb2RlcyhO
b2RlKiBzdGFydE5vZGUsIE5vZGUqIHBhc3RFbmQpOworICAgIE5vZGUqIHNlcmlhbGl6ZU5vZGVz
KGNvbnN0IFBvc2l0aW9uJiBzdGFydCwgY29uc3QgUG9zaXRpb24mIGVuZCk7CiAgICAgdm9pZCB3
cmFwV2l0aE5vZGUoTm9kZSYsIGJvb2wgY29udmVydEJsb2Nrc1RvSW5saW5lcyA9IGZhbHNlLCBS
YW5nZUZ1bGx5U2VsZWN0c05vZGUgPSBEb2VzRnVsbHlTZWxlY3ROb2RlKTsKICAgICB2b2lkIHdy
YXBXaXRoU3R5bGVOb2RlKFN0eWxlUHJvcGVydGllcyosIERvY3VtZW50JiwgYm9vbCBpc0Jsb2Nr
ID0gZmFsc2UpOwogICAgIFN0cmluZyB0YWtlUmVzdWx0cygpOwpAQCAtMjM1LDggKzIzNiw4IEBA
IHByaXZhdGU6CiAgICAgdm9pZCBhcHBlbmRTdHlsZU5vZGVPcGVuVGFnKFN0cmluZ0J1aWxkZXIm
LCBTdHlsZVByb3BlcnRpZXMqLCBEb2N1bWVudCYsIGJvb2wgaXNCbG9jayA9IGZhbHNlKTsKICAg
ICBjb25zdCBTdHJpbmcmIHN0eWxlTm9kZUNsb3NlVGFnKGJvb2wgaXNCbG9jayA9IGZhbHNlKTsK
IAotICAgIFN0cmluZyByZW5kZXJlZFRleHQoY29uc3QgTm9kZSYsIGNvbnN0IFJhbmdlKik7Ci0g
ICAgU3RyaW5nIHN0cmluZ1ZhbHVlRm9yUmFuZ2UoY29uc3QgTm9kZSYsIGNvbnN0IFJhbmdlKik7
CisgICAgU3RyaW5nIHJlbmRlcmVkVGV4dFJlc3BlY3RpbmdSYW5nZShjb25zdCBUZXh0Jik7Cisg
ICAgU3RyaW5nIHRleHRDb250ZW50UmVzcGVjdGluZ1JhbmdlKGNvbnN0IFRleHQmKTsKIAogICAg
IGJvb2wgc2hvdWxkUHJlc2VydmVNU09MaXN0U3R5bGVGb3JFbGVtZW50KGNvbnN0IEVsZW1lbnQm
KTsKIApAQCAtMjY0LDI0ICsyNjUsMjcgQEAgcHJpdmF0ZToKICAgICAgICAgcmV0dXJuIG1faGln
aGVzdE5vZGVUb0JlU2VyaWFsaXplZCAmJiBtX2hpZ2hlc3ROb2RlVG9CZVNlcmlhbGl6ZWQtPnBh
cmVudE5vZGUoKSA9PSBub2RlLnBhcmVudE5vZGUoKSAmJiBtX3dyYXBwaW5nU3R5bGUgJiYgbV93
cmFwcGluZ1N0eWxlLT5zdHlsZSgpOwogICAgIH0KIAorICAgIFBvc2l0aW9uIG1fc3RhcnQ7Cisg
ICAgUG9zaXRpb24gbV9lbmQ7CiAgICAgVmVjdG9yPFN0cmluZz4gbV9yZXZlcnNlZFByZWNlZGlu
Z01hcmt1cDsKICAgICBjb25zdCBBbm5vdGF0ZUZvckludGVyY2hhbmdlIG1fYW5ub3RhdGU7Ci0g
ICAgTm9kZSogbV9oaWdoZXN0Tm9kZVRvQmVTZXJpYWxpemVkOworICAgIFJlZlB0cjxOb2RlPiBt
X2hpZ2hlc3ROb2RlVG9CZVNlcmlhbGl6ZWQ7CiAgICAgUmVmUHRyPEVkaXRpbmdTdHlsZT4gbV93
cmFwcGluZ1N0eWxlOwotICAgIGJvb2wgbV9uZWVkUmVsYXRpdmVTdHlsZVdyYXBwZXI7CiAgICAg
Ym9vbCBtX25lZWRzUG9zaXRpb25TdHlsZUNvbnZlcnNpb247Ci0gICAgYm9vbCBtX25lZWRDbGVh
cmluZ0RpdjsKKyAgICBib29sIG1fbmVlZFJlbGF0aXZlU3R5bGVXcmFwcGVyIHsgZmFsc2UgfTsK
KyAgICBib29sIG1fbmVlZENsZWFyaW5nRGl2IHsgZmFsc2UgfTsKICAgICBib29sIG1fc2hvdWxk
UHJlc2VydmVNU09MaXN0OwogICAgIGJvb2wgbV9pbk1TT0xpc3QgeyBmYWxzZSB9OwogfTsKIAot
aW5saW5lIFN0eWxlZE1hcmt1cEFjY3VtdWxhdG9yOjpTdHlsZWRNYXJrdXBBY2N1bXVsYXRvcihW
ZWN0b3I8Tm9kZSo+KiBub2RlcywgUmVzb2x2ZVVSTHMgdXJsc1RvUmVzb2x2ZSwgQW5ub3RhdGVG
b3JJbnRlcmNoYW5nZSBhbm5vdGF0ZSwgTVNPTGlzdE1vZGUgbXNvTGlzdE1vZGUsIGNvbnN0IFJh
bmdlKiByYW5nZSwgYm9vbCBuZWVkc1Bvc2l0aW9uU3R5bGVDb252ZXJzaW9uLCBOb2RlKiBoaWdo
ZXN0Tm9kZVRvQmVTZXJpYWxpemVkKQotICAgIDogTWFya3VwQWNjdW11bGF0b3Iobm9kZXMsIHVy
bHNUb1Jlc29sdmUsIHJhbmdlKQoraW5saW5lIFN0eWxlZE1hcmt1cEFjY3VtdWxhdG9yOjpTdHls
ZWRNYXJrdXBBY2N1bXVsYXRvcihjb25zdCBQb3NpdGlvbiYgc3RhcnQsIGNvbnN0IFBvc2l0aW9u
JiBlbmQsIFZlY3RvcjxOb2RlKj4qIG5vZGVzLAorICAgIFJlc29sdmVVUkxzIHVybHNUb1Jlc29s
dmUsIEFubm90YXRlRm9ySW50ZXJjaGFuZ2UgYW5ub3RhdGUsIE1TT0xpc3RNb2RlIG1zb0xpc3RN
b2RlLCBib29sIG5lZWRzUG9zaXRpb25TdHlsZUNvbnZlcnNpb24sIE5vZGUqIGhpZ2hlc3ROb2Rl
VG9CZVNlcmlhbGl6ZWQpCisgICAgOiBNYXJrdXBBY2N1bXVsYXRvcihub2RlcywgdXJsc1RvUmVz
b2x2ZSkKKyAgICAsIG1fc3RhcnQoc3RhcnQpCisgICAgLCBtX2VuZChlbmQpCiAgICAgLCBtX2Fu
bm90YXRlKGFubm90YXRlKQogICAgICwgbV9oaWdoZXN0Tm9kZVRvQmVTZXJpYWxpemVkKGhpZ2hl
c3ROb2RlVG9CZVNlcmlhbGl6ZWQpCi0gICAgLCBtX25lZWRSZWxhdGl2ZVN0eWxlV3JhcHBlcihm
YWxzZSkKICAgICAsIG1fbmVlZHNQb3NpdGlvblN0eWxlQ29udmVyc2lvbihuZWVkc1Bvc2l0aW9u
U3R5bGVDb252ZXJzaW9uKQotICAgICwgbV9uZWVkQ2xlYXJpbmdEaXYoZmFsc2UpCiAgICAgLCBt
X3Nob3VsZFByZXNlcnZlTVNPTGlzdChtc29MaXN0TW9kZSA9PSBNU09MaXN0TW9kZTo6UHJlc2Vy
dmUpCiB7CiB9CkBAIC0zNTUsMTEgKzM1OSwxMiBAQCB2b2lkIFN0eWxlZE1hcmt1cEFjY3VtdWxh
dG9yOjphcHBlbmRUZXh0CiAgICAgICAgIGFwcGVuZFN0eWxlTm9kZU9wZW5UYWcob3V0LCB3cmFw
cGluZ1N0eWxlLT5zdHlsZSgpLCB0ZXh0LmRvY3VtZW50KCkpOwogICAgIH0KIAotICAgIGlmICgh
c2hvdWxkQW5ub3RhdGUoKSB8fCBwYXJlbnRJc1RleHRhcmVhKQotICAgICAgICBNYXJrdXBBY2N1
bXVsYXRvcjo6YXBwZW5kVGV4dChvdXQsIHRleHQpOwotICAgIGVsc2UgeworICAgIGlmICghc2hv
dWxkQW5ub3RhdGUoKSB8fCBwYXJlbnRJc1RleHRhcmVhKSB7CisgICAgICAgIGF1dG8gY29udGVu
dCA9IHRleHRDb250ZW50UmVzcGVjdGluZ1JhbmdlKHRleHQpOworICAgICAgICBhcHBlbmRDaGFy
YWN0ZXJzUmVwbGFjaW5nRW50aXRpZXMob3V0LCBjb250ZW50LCAwLCBjb250ZW50Lmxlbmd0aCgp
LCBlbnRpdHlNYXNrRm9yVGV4dCh0ZXh0KSk7CisgICAgfSBlbHNlIHsKICAgICAgICAgY29uc3Qg
Ym9vbCB1c2VSZW5kZXJlZFRleHQgPSAhZW5jbG9zaW5nRWxlbWVudFdpdGhUYWcoZmlyc3RQb3Np
dGlvbkluTm9kZShjb25zdF9jYXN0PFRleHQqPigmdGV4dCkpLCBzZWxlY3RUYWcpOwotICAgICAg
ICBTdHJpbmcgY29udGVudCA9IHVzZVJlbmRlcmVkVGV4dCA/IHJlbmRlcmVkVGV4dCh0ZXh0LCBt
X3JhbmdlKSA6IHN0cmluZ1ZhbHVlRm9yUmFuZ2UodGV4dCwgbV9yYW5nZSk7CisgICAgICAgIFN0
cmluZyBjb250ZW50ID0gdXNlUmVuZGVyZWRUZXh0ID8gcmVuZGVyZWRUZXh0UmVzcGVjdGluZ1Jh
bmdlKHRleHQpIDogdGV4dENvbnRlbnRSZXNwZWN0aW5nUmFuZ2UodGV4dCk7CiAgICAgICAgIFN0
cmluZ0J1aWxkZXIgYnVmZmVyOwogICAgICAgICBhcHBlbmRDaGFyYWN0ZXJzUmVwbGFjaW5nRW50
aXRpZXMoYnVmZmVyLCBjb250ZW50LCAwLCBjb250ZW50Lmxlbmd0aCgpLCBFbnRpdHlNYXNrSW5Q
Q0RBVEEpOwogICAgICAgICBvdXQuYXBwZW5kKGNvbnZlcnRIVE1MVGV4dFRvSW50ZXJjaGFuZ2VG
b3JtYXQoYnVmZmVyLnRvU3RyaW5nKCksICZ0ZXh0KSk7CkBAIC0zNjksMzkgKzM3NCwzNiBAQCB2
b2lkIFN0eWxlZE1hcmt1cEFjY3VtdWxhdG9yOjphcHBlbmRUZXh0CiAgICAgICAgIG91dC5hcHBl
bmQoc3R5bGVOb2RlQ2xvc2VUYWcoKSk7CiB9CiAgICAgCi1TdHJpbmcgU3R5bGVkTWFya3VwQWNj
dW11bGF0b3I6OnJlbmRlcmVkVGV4dChjb25zdCBOb2RlJiBub2RlLCBjb25zdCBSYW5nZSogcmFu
Z2UpCitTdHJpbmcgU3R5bGVkTWFya3VwQWNjdW11bGF0b3I6OnJlbmRlcmVkVGV4dFJlc3BlY3Rp
bmdSYW5nZShjb25zdCBUZXh0JiB0ZXh0KQogewotICAgIGlmICghaXM8VGV4dD4obm9kZSkpCi0g
ICAgICAgIHJldHVybiBTdHJpbmcoKTsKKyAgICBUZXh0SXRlcmF0b3JCZWhhdmlvciBiZWhhdmlv
ciA9IFRleHRJdGVyYXRvckRlZmF1bHRCZWhhdmlvcjsKKyAgICBQb3NpdGlvbiBzdGFydCA9ICZ0
ZXh0ID09IG1fc3RhcnQuY29udGFpbmVyTm9kZSgpID8gbV9zdGFydCA6IGZpcnN0UG9zaXRpb25J
bk5vZGUoY29uc3RfY2FzdDxUZXh0Kj4oJnRleHQpKTsKKyAgICBQb3NpdGlvbiBlbmQ7CisgICAg
aWYgKCZ0ZXh0ID09IG1fZW5kLmNvbnRhaW5lck5vZGUoKSkKKyAgICAgICAgZW5kID0gbV9lbmQ7
CisgICAgZWxzZSB7CisgICAgICAgIGVuZCA9IGxhc3RQb3NpdGlvbkluTm9kZShjb25zdF9jYXN0
PFRleHQqPigmdGV4dCkpOworICAgICAgICBpZiAoIW1fZW5kLmlzTnVsbCgpKQorICAgICAgICAg
ICAgYmVoYXZpb3IgPSBUZXh0SXRlcmF0b3JCZWhhdmVzQXNJZk5vZGVzRm9sbG93aW5nOworICAg
IH0KIAotICAgIGNvbnN0IFRleHQmIHRleHROb2RlID0gZG93bmNhc3Q8VGV4dD4obm9kZSk7Ci0g
ICAgdW5zaWduZWQgc3RhcnRPZmZzZXQgPSAwOwotICAgIHVuc2lnbmVkIGVuZE9mZnNldCA9IHRl
eHROb2RlLmxlbmd0aCgpOworICAgIHJldHVybiBwbGFpblRleHQoUmFuZ2U6OmNyZWF0ZSh0ZXh0
LmRvY3VtZW50KCksIHN0YXJ0LCBlbmQpLnB0cigpLCBiZWhhdmlvcik7Cit9CiAKLSAgICBUZXh0
SXRlcmF0b3JCZWhhdmlvciBiZWhhdmlvciA9IFRleHRJdGVyYXRvckRlZmF1bHRCZWhhdmlvcjsK
LSAgICBpZiAocmFuZ2UgJiYgJm5vZGUgPT0gJnJhbmdlLT5zdGFydENvbnRhaW5lcigpKQotICAg
ICAgICBzdGFydE9mZnNldCA9IHJhbmdlLT5zdGFydE9mZnNldCgpOwotICAgIGlmIChyYW5nZSAm
JiAmbm9kZSA9PSAmcmFuZ2UtPmVuZENvbnRhaW5lcigpKQotICAgICAgICBlbmRPZmZzZXQgPSBy
YW5nZS0+ZW5kT2Zmc2V0KCk7Ci0gICAgZWxzZSBpZiAocmFuZ2UpCi0gICAgICAgIGJlaGF2aW9y
ID0gVGV4dEl0ZXJhdG9yQmVoYXZlc0FzSWZOb2Rlc0ZvbGxvd2luZzsKLQotICAgIFBvc2l0aW9u
IHN0YXJ0ID0gY3JlYXRlTGVnYWN5RWRpdGluZ1Bvc2l0aW9uKGNvbnN0X2Nhc3Q8Tm9kZSo+KCZu
b2RlKSwgc3RhcnRPZmZzZXQpOwotICAgIFBvc2l0aW9uIGVuZCA9IGNyZWF0ZUxlZ2FjeUVkaXRp
bmdQb3NpdGlvbihjb25zdF9jYXN0PE5vZGUqPigmbm9kZSksIGVuZE9mZnNldCk7Ci0gICAgcmV0
dXJuIHBsYWluVGV4dChSYW5nZTo6Y3JlYXRlKG5vZGUuZG9jdW1lbnQoKSwgc3RhcnQsIGVuZCku
cHRyKCksIGJlaGF2aW9yKTsKLX0KLQotU3RyaW5nIFN0eWxlZE1hcmt1cEFjY3VtdWxhdG9yOjpz
dHJpbmdWYWx1ZUZvclJhbmdlKGNvbnN0IE5vZGUmIG5vZGUsIGNvbnN0IFJhbmdlKiByYW5nZSkK
LXsKLSAgICBpZiAoIXJhbmdlKQotICAgICAgICByZXR1cm4gbm9kZS5ub2RlVmFsdWUoKTsKLQot
ICAgIFN0cmluZyBub2RlVmFsdWUgPSBub2RlLm5vZGVWYWx1ZSgpOwotICAgIGlmICgmbm9kZSA9
PSAmcmFuZ2UtPmVuZENvbnRhaW5lcigpKQotICAgICAgICBub2RlVmFsdWUudHJ1bmNhdGUocmFu
Z2UtPmVuZE9mZnNldCgpKTsKLSAgICBpZiAoJm5vZGUgPT0gJnJhbmdlLT5zdGFydENvbnRhaW5l
cigpKQotICAgICAgICBub2RlVmFsdWUucmVtb3ZlKDAsIHJhbmdlLT5zdGFydE9mZnNldCgpKTsK
LSAgICByZXR1cm4gbm9kZVZhbHVlOworU3RyaW5nIFN0eWxlZE1hcmt1cEFjY3VtdWxhdG9yOjp0
ZXh0Q29udGVudFJlc3BlY3RpbmdSYW5nZShjb25zdCBUZXh0JiB0ZXh0KQoreworICAgIGlmICht
X3N0YXJ0LmlzTnVsbCgpICYmIG1fZW5kLmlzTnVsbCgpKQorICAgICAgICByZXR1cm4gdGV4dC5k
YXRhKCk7CisKKyAgICBTdHJpbmcgdGV4dERhdGEgPSB0ZXh0LmRhdGEoKTsKKyAgICB1bnNpZ25l
ZCBzdGFydCA9IDA7CisgICAgdW5zaWduZWQgZW5kID0gdGV4dERhdGEubGVuZ3RoKCk7CisgICAg
aWYgKCZ0ZXh0ID09IG1fc3RhcnQuY29udGFpbmVyTm9kZSgpKQorICAgICAgICBzdGFydCA9IG1f
c3RhcnQub2Zmc2V0SW5Db250YWluZXJOb2RlKCk7CisgICAgaWYgKCZ0ZXh0ID09IG1fZW5kLmNv
bnRhaW5lck5vZGUoKSkKKyAgICAgICAgZW5kID0gbV9lbmQub2Zmc2V0SW5Db250YWluZXJOb2Rl
KCk7CisgICAgQVNTRVJUKHN0YXJ0IDwgZW5kKTsKKyAgICByZXR1cm4gdGV4dERhdGEuc3Vic3Ry
aW5nKHN0YXJ0LCBlbmQgLSBzdGFydCk7CiB9CiAKIHZvaWQgU3R5bGVkTWFya3VwQWNjdW11bGF0
b3I6OmFwcGVuZEN1c3RvbUF0dHJpYnV0ZXMoU3RyaW5nQnVpbGRlciYgb3V0LCBjb25zdCBFbGVt
ZW50JiBlbGVtZW50LCBOYW1lc3BhY2VzKiBuYW1lc3BhY2VzKQpAQCAtNTAyLDggKzUwNCwxMyBA
QCB2b2lkIFN0eWxlZE1hcmt1cEFjY3VtdWxhdG9yOjphcHBlbmRFbGVtCiAgICAgYXBwZW5kQ2xv
c2VUYWcob3V0LCBlbGVtZW50KTsKIH0KIAotTm9kZSogU3R5bGVkTWFya3VwQWNjdW11bGF0b3I6
OnNlcmlhbGl6ZU5vZGVzKE5vZGUqIHN0YXJ0Tm9kZSwgTm9kZSogcGFzdEVuZCkKK05vZGUqIFN0
eWxlZE1hcmt1cEFjY3VtdWxhdG9yOjpzZXJpYWxpemVOb2Rlcyhjb25zdCBQb3NpdGlvbiYgc3Rh
cnQsIGNvbnN0IFBvc2l0aW9uJiBlbmQpCiB7CisgICAgTm9kZSogc3RhcnROb2RlID0gc3RhcnQu
Zmlyc3ROb2RlKCkuZ2V0KCk7CisgICAgTm9kZSogcGFzdEVuZCA9IGVuZC5jb21wdXRlTm9kZUFm
dGVyUG9zaXRpb24oKTsKKyAgICBpZiAoIXBhc3RFbmQpCisgICAgICAgIHBhc3RFbmQgPSBOb2Rl
VHJhdmVyc2FsOjpuZXh0U2tpcHBpbmdDaGlsZHJlbigqZW5kLmNvbnRhaW5lck5vZGUoKSk7CisK
ICAgICBpZiAoIW1faGlnaGVzdE5vZGVUb0JlU2VyaWFsaXplZCkgewogICAgICAgICBOb2RlKiBs
YXN0Q2xvc2VkID0gdHJhdmVyc2VOb2Rlc0ZvclNlcmlhbGl6YXRpb24oc3RhcnROb2RlLCBwYXN0
RW5kLCBOb2RlVHJhdmVyc2FsTW9kZTo6RG9Ob3RFbWl0U3RyaW5nKTsKICAgICAgICAgbV9oaWdo
ZXN0Tm9kZVRvQmVTZXJpYWxpemVkID0gbGFzdENsb3NlZDsKQEAgLTcwNCwxOCArNzExLDE2IEBA
IHN0YXRpYyBib29sIGlzRWxlbWVudFByZXNlbnRhdGlvbmFsKGNvbnMKICAgICAgICAgfHwgbm9k
ZS0+aGFzVGFnTmFtZShpVGFnKSB8fCBub2RlLT5oYXNUYWdOYW1lKGVtVGFnKSB8fCBub2RlLT5o
YXNUYWdOYW1lKGJUYWcpIHx8IG5vZGUtPmhhc1RhZ05hbWUoc3Ryb25nVGFnKTsKIH0KIAotc3Rh
dGljIE5vZGUqIGhpZ2hlc3RBbmNlc3RvclRvV3JhcE1hcmt1cChjb25zdCBSYW5nZSogcmFuZ2Us
IEFubm90YXRlRm9ySW50ZXJjaGFuZ2UgYW5ub3RhdGUpCitzdGF0aWMgTm9kZSogaGlnaGVzdEFu
Y2VzdG9yVG9XcmFwTWFya3VwKGNvbnN0IFBvc2l0aW9uJiBzdGFydCwgY29uc3QgUG9zaXRpb24m
IGVuZCwgTm9kZSYgY29tbW9uQW5jZXN0b3IsIEFubm90YXRlRm9ySW50ZXJjaGFuZ2UgYW5ub3Rh
dGUpCiB7Ci0gICAgYXV0byogY29tbW9uQW5jZXN0b3IgPSByYW5nZS0+Y29tbW9uQW5jZXN0b3JD
b250YWluZXIoKTsKLSAgICBBU1NFUlQoY29tbW9uQW5jZXN0b3IpOwogICAgIE5vZGUqIHNwZWNp
YWxDb21tb25BbmNlc3RvciA9IG51bGxwdHI7CiAgICAgaWYgKGFubm90YXRlID09IEFubm90YXRl
Rm9ySW50ZXJjaGFuZ2U6OlllcykgewogICAgICAgICAvLyBJbmNsdWRlIGFuY2VzdG9ycyB0aGF0
IGFyZW4ndCBjb21wbGV0ZWx5IGluc2lkZSB0aGUgcmFuZ2UgYnV0IGFyZSByZXF1aXJlZCB0byBy
ZXRhaW4gCiAgICAgICAgIC8vIHRoZSBzdHJ1Y3R1cmUgYW5kIGFwcGVhcmFuY2Ugb2YgdGhlIGNv
cGllZCBtYXJrdXAuCi0gICAgICAgIHNwZWNpYWxDb21tb25BbmNlc3RvciA9IGFuY2VzdG9yVG9S
ZXRhaW5TdHJ1Y3R1cmVBbmRBcHBlYXJhbmNlKGNvbW1vbkFuY2VzdG9yKTsKKyAgICAgICAgc3Bl
Y2lhbENvbW1vbkFuY2VzdG9yID0gYW5jZXN0b3JUb1JldGFpblN0cnVjdHVyZUFuZEFwcGVhcmFu
Y2UoJmNvbW1vbkFuY2VzdG9yKTsKIAotICAgICAgICBpZiAoYXV0byogcGFyZW50TGlzdE5vZGUg
PSBlbmNsb3NpbmdOb2RlT2ZUeXBlKGZpcnN0UG9zaXRpb25Jbk9yQmVmb3JlTm9kZShyYW5nZS0+
Zmlyc3ROb2RlKCkpLCBpc0xpc3RJdGVtKSkgewotICAgICAgICAgICAgaWYgKCFlZGl0aW5nSWdu
b3Jlc0NvbnRlbnQoKnBhcmVudExpc3ROb2RlKSAmJiBXZWJDb3JlOjphcmVSYW5nZXNFcXVhbChW
aXNpYmxlU2VsZWN0aW9uOjpzZWxlY3Rpb25Gcm9tQ29udGVudHNPZk5vZGUocGFyZW50TGlzdE5v
ZGUpLnRvTm9ybWFsaXplZFJhbmdlKCkuZ2V0KCksIHJhbmdlKSkgeworICAgICAgICBpZiAoYXV0
byogcGFyZW50TGlzdE5vZGUgPSBlbmNsb3NpbmdOb2RlT2ZUeXBlKHN0YXJ0LCBpc0xpc3RJdGVt
KSkgeworICAgICAgICAgICAgaWYgKCFlZGl0aW5nSWdub3Jlc0NvbnRlbnQoKnBhcmVudExpc3RO
b2RlKSAmJiBWaXNpYmxlU2VsZWN0aW9uOjpzZWxlY3Rpb25Gcm9tQ29udGVudHNPZk5vZGUocGFy
ZW50TGlzdE5vZGUpID09IFZpc2libGVTZWxlY3Rpb24oc3RhcnQsIGVuZCkpIHsKICAgICAgICAg
ICAgICAgICBzcGVjaWFsQ29tbW9uQW5jZXN0b3IgPSBwYXJlbnRMaXN0Tm9kZS0+cGFyZW50Tm9k
ZSgpOwogICAgICAgICAgICAgICAgIHdoaWxlIChzcGVjaWFsQ29tbW9uQW5jZXN0b3IgJiYgIWlz
TGlzdEhUTUxFbGVtZW50KHNwZWNpYWxDb21tb25BbmNlc3RvcikpCiAgICAgICAgICAgICAgICAg
ICAgIHNwZWNpYWxDb21tb25BbmNlc3RvciA9IHNwZWNpYWxDb21tb25BbmNlc3Rvci0+cGFyZW50
Tm9kZSgpOwpAQCAtNzIzLDExICs3MjgsMTEgQEAgc3RhdGljIE5vZGUqIGhpZ2hlc3RBbmNlc3Rv
clRvV3JhcE1hcmt1cAogICAgICAgICB9CiAKICAgICAgICAgLy8gUmV0YWluIHRoZSBNYWlsIHF1
b3RlIGxldmVsIGJ5IGluY2x1ZGluZyBhbGwgYW5jZXN0b3IgbWFpbCBibG9jayBxdW90ZXMuCi0g
ICAgICAgIGlmIChOb2RlKiBoaWdoZXN0TWFpbEJsb2NrcXVvdGUgPSBoaWdoZXN0RW5jbG9zaW5n
Tm9kZU9mVHlwZShmaXJzdFBvc2l0aW9uSW5PckJlZm9yZU5vZGUocmFuZ2UtPmZpcnN0Tm9kZSgp
KSwgaXNNYWlsQmxvY2txdW90ZSwgQ2FuQ3Jvc3NFZGl0aW5nQm91bmRhcnkpKQorICAgICAgICBp
ZiAoTm9kZSogaGlnaGVzdE1haWxCbG9ja3F1b3RlID0gaGlnaGVzdEVuY2xvc2luZ05vZGVPZlR5
cGUoc3RhcnQsIGlzTWFpbEJsb2NrcXVvdGUsIENhbkNyb3NzRWRpdGluZ0JvdW5kYXJ5KSkKICAg
ICAgICAgICAgIHNwZWNpYWxDb21tb25BbmNlc3RvciA9IGhpZ2hlc3RNYWlsQmxvY2txdW90ZTsK
ICAgICB9CiAKLSAgICBhdXRvKiBjaGVja0FuY2VzdG9yID0gc3BlY2lhbENvbW1vbkFuY2VzdG9y
ID8gc3BlY2lhbENvbW1vbkFuY2VzdG9yIDogY29tbW9uQW5jZXN0b3I7CisgICAgYXV0byogY2hl
Y2tBbmNlc3RvciA9IHNwZWNpYWxDb21tb25BbmNlc3RvciA/IHNwZWNpYWxDb21tb25BbmNlc3Rv
ciA6ICZjb21tb25BbmNlc3RvcjsKICAgICBpZiAoY2hlY2tBbmNlc3Rvci0+cmVuZGVyZXIoKSAm
JiBjaGVja0FuY2VzdG9yLT5yZW5kZXJlcigpLT5jb250YWluaW5nQmxvY2soKSkgewogICAgICAg
ICBOb2RlKiBuZXdTcGVjaWFsQ29tbW9uQW5jZXN0b3IgPSBoaWdoZXN0RW5jbG9zaW5nTm9kZU9m
VHlwZShmaXJzdFBvc2l0aW9uSW5Ob2RlKGNoZWNrQW5jZXN0b3IpLCAmaXNFbGVtZW50UHJlc2Vu
dGF0aW9uYWwsIENhbkNyb3NzRWRpdGluZ0JvdW5kYXJ5LCBjaGVja0FuY2VzdG9yLT5yZW5kZXJl
cigpLT5jb250YWluaW5nQmxvY2soKS0+ZWxlbWVudCgpKTsKICAgICAgICAgaWYgKG5ld1NwZWNp
YWxDb21tb25BbmNlc3RvcikKQEAgLTczOCw2MSArNzQzLDU5IEBAIHN0YXRpYyBOb2RlKiBoaWdo
ZXN0QW5jZXN0b3JUb1dyYXBNYXJrdXAKICAgICAvLyBJZiB0d28gb3IgbW9yZSB0YWJzIGFyZSBz
ZWxlY3RlZCwgY29tbW9uQW5jZXN0b3Igd2lsbCBiZSB0aGUgdGFiIHNwYW4uCiAgICAgLy8gSW4g
ZWl0aGVyIGNhc2UsIGlmIHRoZXJlIGlzIGEgc3BlY2lhbENvbW1vbkFuY2VzdG9yIGFscmVhZHks
IGl0IHdpbGwgbmVjZXNzYXJpbHkgYmUgYWJvdmUgCiAgICAgLy8gYW55IHRhYiBzcGFuIHRoYXQg
bmVlZHMgdG8gYmUgaW5jbHVkZWQuCi0gICAgaWYgKCFzcGVjaWFsQ29tbW9uQW5jZXN0b3IgJiYg
aXNUYWJTcGFuVGV4dE5vZGUoY29tbW9uQW5jZXN0b3IpKQotICAgICAgICBzcGVjaWFsQ29tbW9u
QW5jZXN0b3IgPSBjb21tb25BbmNlc3Rvci0+cGFyZW50Tm9kZSgpOwotICAgIGlmICghc3BlY2lh
bENvbW1vbkFuY2VzdG9yICYmIGlzVGFiU3Bhbk5vZGUoY29tbW9uQW5jZXN0b3IpKQotICAgICAg
ICBzcGVjaWFsQ29tbW9uQW5jZXN0b3IgPSBjb21tb25BbmNlc3RvcjsKKyAgICBpZiAoIXNwZWNp
YWxDb21tb25BbmNlc3RvciAmJiBpc1RhYlNwYW5UZXh0Tm9kZSgmY29tbW9uQW5jZXN0b3IpKQor
ICAgICAgICBzcGVjaWFsQ29tbW9uQW5jZXN0b3IgPSBjb21tb25BbmNlc3Rvci5wYXJlbnROb2Rl
KCk7CisgICAgaWYgKCFzcGVjaWFsQ29tbW9uQW5jZXN0b3IgJiYgaXNUYWJTcGFuTm9kZSgmY29t
bW9uQW5jZXN0b3IpKQorICAgICAgICBzcGVjaWFsQ29tbW9uQW5jZXN0b3IgPSAmY29tbW9uQW5j
ZXN0b3I7CiAKLSAgICBpZiAoYXV0byogZW5jbG9zaW5nQW5jaG9yID0gZW5jbG9zaW5nRWxlbWVu
dFdpdGhUYWcoZmlyc3RQb3NpdGlvbkluTm9kZShzcGVjaWFsQ29tbW9uQW5jZXN0b3IgPyBzcGVj
aWFsQ29tbW9uQW5jZXN0b3IgOiBjb21tb25BbmNlc3RvciksIGFUYWcpKQorICAgIGlmIChhdXRv
KiBlbmNsb3NpbmdBbmNob3IgPSBlbmNsb3NpbmdFbGVtZW50V2l0aFRhZyhmaXJzdFBvc2l0aW9u
SW5Ob2RlKHNwZWNpYWxDb21tb25BbmNlc3RvciA/IHNwZWNpYWxDb21tb25BbmNlc3RvciA6ICZj
b21tb25BbmNlc3RvciksIGFUYWcpKQogICAgICAgICBzcGVjaWFsQ29tbW9uQW5jZXN0b3IgPSBl
bmNsb3NpbmdBbmNob3I7CiAKICAgICByZXR1cm4gc3BlY2lhbENvbW1vbkFuY2VzdG9yOwogfQog
Ci0vLyBGSVhNRTogU2hvdWxkbid0IHdlIG9taXQgc3R5bGUgaW5mbyB3aGVuIGFubm90YXRlID09
IEFubm90YXRlRm9ySW50ZXJjaGFuZ2U6Ok5vPwotLy8gRklYTUU6IEF0IGxlYXN0LCBhbm5vdGF0
aW9uIGFuZCBzdHlsZSBpbmZvIHNob3VsZCBwcm9iYWJseSBub3QgYmUgaW5jbHVkZWQgaW4gcmFu
Z2UubWFya3VwU3RyaW5nKCkKLXN0YXRpYyBTdHJpbmcgY3JlYXRlTWFya3VwSW50ZXJuYWwoRG9j
dW1lbnQmIGRvY3VtZW50LCBjb25zdCBSYW5nZSYgcmFuZ2UsIFZlY3RvcjxOb2RlKj4qIG5vZGVz
LAorc3RhdGljIFN0cmluZyBzZXJpYWxpemVQcmVzZXJ2aW5nVmlzdWFsQXBwZWFyYW5jZUludGVy
bmFsKGNvbnN0IFBvc2l0aW9uJiBzdGFydCwgY29uc3QgUG9zaXRpb24mIGVuZCwgVmVjdG9yPE5v
ZGUqPiogbm9kZXMsCiAgICAgQW5ub3RhdGVGb3JJbnRlcmNoYW5nZSBhbm5vdGF0ZSwgQ29udmVy
dEJsb2Nrc1RvSW5saW5lcyBjb252ZXJ0QmxvY2tzVG9JbmxpbmVzLCBSZXNvbHZlVVJMcyB1cmxz
VG9SZXNvbHZlLCBNU09MaXN0TW9kZSBtc29MaXN0TW9kZSkKIHsKICAgICBzdGF0aWMgTmV2ZXJE
ZXN0cm95ZWQ8Y29uc3QgU3RyaW5nPiBpbnRlcmNoYW5nZU5ld2xpbmVTdHJpbmcoTUFLRV9TVEFU
SUNfU1RSSU5HX0lNUEwoIjxiciBjbGFzcz1cIiIgQXBwbGVJbnRlcmNoYW5nZU5ld2xpbmUgIlwi
PiIpKTsKIAotICAgIGJvb2wgY29sbGFwc2VkID0gcmFuZ2UuY29sbGFwc2VkKCk7Ci0gICAgaWYg
KGNvbGxhcHNlZCkKKyAgICBpZiAoc3RhcnQuaXNOdWxsKCkgfHwgZW5kLmlzTnVsbCgpIHx8ICFj
b21wYXJlUG9zaXRpb25zKHN0YXJ0LCBlbmQpKQogICAgICAgICByZXR1cm4gZW1wdHlTdHJpbmco
KTsKLSAgICBSZWZQdHI8Tm9kZT4gY29tbW9uQW5jZXN0b3IgPSByYW5nZS5jb21tb25BbmNlc3Rv
ckNvbnRhaW5lcigpOworCisgICAgUmVmUHRyPE5vZGU+IGNvbW1vbkFuY2VzdG9yID0gUmFuZ2U6
OmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyKHN0YXJ0LmNvbnRhaW5lck5vZGUoKSwgZW5kLmNvbnRh
aW5lck5vZGUoKSk7CiAgICAgaWYgKCFjb21tb25BbmNlc3RvcikKICAgICAgICAgcmV0dXJuIGVt
cHR5U3RyaW5nKCk7CiAKKyAgICBhdXRvJiBkb2N1bWVudCA9ICpzdGFydC5kb2N1bWVudCgpOwog
ICAgIGRvY3VtZW50LnVwZGF0ZUxheW91dElnbm9yZVBlbmRpbmdTdHlsZXNoZWV0cygpOwogCi0g
ICAgYXV0byogYm9keSA9IGVuY2xvc2luZ0VsZW1lbnRXaXRoVGFnKGZpcnN0UG9zaXRpb25Jbk5v
ZGUoY29tbW9uQW5jZXN0b3IuZ2V0KCkpLCBib2R5VGFnKTsKLSAgICBFbGVtZW50KiBmdWxseVNl
bGVjdGVkUm9vdCA9IG51bGxwdHI7CisgICAgVmlzaWJsZVBvc2l0aW9uIHZpc2libGVTdGFydCB7
IHN0YXJ0IH07CisgICAgVmlzaWJsZVBvc2l0aW9uIHZpc2libGVFbmQgeyBlbmQgfTsKKworICAg
IGF1dG8gYm9keSA9IG1ha2VSZWZQdHIoZW5jbG9zaW5nRWxlbWVudFdpdGhUYWcoZmlyc3RQb3Np
dGlvbkluTm9kZShjb21tb25BbmNlc3Rvci5nZXQoKSksIGJvZHlUYWcpKTsKKyAgICBSZWZQdHI8
RWxlbWVudD4gZnVsbHlTZWxlY3RlZFJvb3Q7CiAgICAgLy8gRklYTUU6IERvIHRoaXMgZm9yIGFs
bCBmdWxseSBzZWxlY3RlZCBibG9ja3MsIG5vdCBqdXN0IHRoZSBib2R5LgotICAgIGlmIChib2R5
ICYmIFZpc2libGVQb3NpdGlvbihmaXJzdFBvc2l0aW9uSW5Ob2RlKGJvZHkpKSA9PSBWaXNpYmxl
UG9zaXRpb24ocmFuZ2Uuc3RhcnRQb3NpdGlvbigpKQotICAgICAgICAmJiBWaXNpYmxlUG9zaXRp
b24obGFzdFBvc2l0aW9uSW5Ob2RlKGJvZHkpKSA9PSBWaXNpYmxlUG9zaXRpb24ocmFuZ2UuZW5k
UG9zaXRpb24oKSkpCisgICAgaWYgKGJvZHkgJiYgVmlzaWJsZVBvc2l0aW9uKGZpcnN0UG9zaXRp
b25Jbk5vZGUoYm9keS5nZXQoKSkpID09IHZpc2libGVTdGFydCAmJiBWaXNpYmxlUG9zaXRpb24o
bGFzdFBvc2l0aW9uSW5Ob2RlKGJvZHkuZ2V0KCkpKSA9PSB2aXNpYmxlRW5kKQogICAgICAgICBm
dWxseVNlbGVjdGVkUm9vdCA9IGJvZHk7Ci0gICAgTm9kZSogc3BlY2lhbENvbW1vbkFuY2VzdG9y
ID0gaGlnaGVzdEFuY2VzdG9yVG9XcmFwTWFya3VwKCZyYW5nZSwgYW5ub3RhdGUpOworICAgIGJv
b2wgbmVlZHNQb3NpdGlvblN0eWxlQ29udmVyc2lvbiA9IGJvZHkgJiYgZnVsbHlTZWxlY3RlZFJv
b3QgPT0gYm9keSAmJiBkb2N1bWVudC5zZXR0aW5ncygpLnNob3VsZENvbnZlcnRQb3NpdGlvblN0
eWxlT25Db3B5KCk7CisKKyAgICBOb2RlKiBzcGVjaWFsQ29tbW9uQW5jZXN0b3IgPSBoaWdoZXN0
QW5jZXN0b3JUb1dyYXBNYXJrdXAoc3RhcnQsIGVuZCwgKmNvbW1vbkFuY2VzdG9yLCBhbm5vdGF0
ZSk7CisKKyAgICBTdHlsZWRNYXJrdXBBY2N1bXVsYXRvciBhY2N1bXVsYXRvcihzdGFydCwgZW5k
LCBub2RlcywgdXJsc1RvUmVzb2x2ZSwgYW5ub3RhdGUsIG1zb0xpc3RNb2RlLCBuZWVkc1Bvc2l0
aW9uU3R5bGVDb252ZXJzaW9uLCBzcGVjaWFsQ29tbW9uQW5jZXN0b3IpOwogCi0gICAgYm9vbCBu
ZWVkc1Bvc2l0aW9uU3R5bGVDb252ZXJzaW9uID0gYm9keSAmJiBmdWxseVNlbGVjdGVkUm9vdCA9
PSBib2R5Ci0gICAgICAgICYmIGRvY3VtZW50LnNldHRpbmdzKCkuc2hvdWxkQ29udmVydFBvc2l0
aW9uU3R5bGVPbkNvcHkoKTsKLSAgICBTdHlsZWRNYXJrdXBBY2N1bXVsYXRvciBhY2N1bXVsYXRv
cihub2RlcywgdXJsc1RvUmVzb2x2ZSwgYW5ub3RhdGUsIG1zb0xpc3RNb2RlLCAmcmFuZ2UsIG5l
ZWRzUG9zaXRpb25TdHlsZUNvbnZlcnNpb24sIHNwZWNpYWxDb21tb25BbmNlc3Rvcik7Ci0gICAg
Tm9kZSogcGFzdEVuZCA9IHJhbmdlLnBhc3RMYXN0Tm9kZSgpOwotCi0gICAgTm9kZSogc3RhcnRO
b2RlID0gcmFuZ2UuZmlyc3ROb2RlKCk7Ci0gICAgVmlzaWJsZVBvc2l0aW9uIHZpc2libGVTdGFy
dChyYW5nZS5zdGFydFBvc2l0aW9uKCksIFZQX0RFRkFVTFRfQUZGSU5JVFkpOwotICAgIFZpc2li
bGVQb3NpdGlvbiB2aXNpYmxlRW5kKHJhbmdlLmVuZFBvc2l0aW9uKCksIFZQX0RFRkFVTFRfQUZG
SU5JVFkpOworICAgIFBvc2l0aW9uIHN0YXJ0QWRqdXN0ZWRGb3JJbnRlcmNoYW5nZU5ld2xpbmUg
PSBzdGFydDsKICAgICBpZiAoYW5ub3RhdGUgPT0gQW5ub3RhdGVGb3JJbnRlcmNoYW5nZTo6WWVz
ICYmIG5lZWRJbnRlcmNoYW5nZU5ld2xpbmVBZnRlcih2aXNpYmxlU3RhcnQpKSB7CiAgICAgICAg
IGlmICh2aXNpYmxlU3RhcnQgPT0gdmlzaWJsZUVuZC5wcmV2aW91cygpKQogICAgICAgICAgICAg
cmV0dXJuIGludGVyY2hhbmdlTmV3bGluZVN0cmluZzsKIAogICAgICAgICBhY2N1bXVsYXRvci5h
cHBlbmRTdHJpbmcoaW50ZXJjaGFuZ2VOZXdsaW5lU3RyaW5nKTsKLSAgICAgICAgc3RhcnROb2Rl
ID0gdmlzaWJsZVN0YXJ0Lm5leHQoKS5kZWVwRXF1aXZhbGVudCgpLmRlcHJlY2F0ZWROb2RlKCk7
CisgICAgICAgIHN0YXJ0QWRqdXN0ZWRGb3JJbnRlcmNoYW5nZU5ld2xpbmUgPSB2aXNpYmxlU3Rh
cnQubmV4dCgpLmRlZXBFcXVpdmFsZW50KCk7CiAKLSAgICAgICAgaWYgKHBhc3RFbmQgJiYgUmFu
Z2U6OmNvbXBhcmVCb3VuZGFyeVBvaW50cyhzdGFydE5vZGUsIDAsIHBhc3RFbmQsIDApLnJlbGVh
c2VSZXR1cm5WYWx1ZSgpID49IDApCisgICAgICAgIGlmIChjb21wYXJlUG9zaXRpb25zKHN0YXJ0
QWRqdXN0ZWRGb3JJbnRlcmNoYW5nZU5ld2xpbmUsIGVuZCkgPj0gMCkKICAgICAgICAgICAgIHJl
dHVybiBpbnRlcmNoYW5nZU5ld2xpbmVTdHJpbmc7CiAgICAgfQogCi0gICAgTm9kZSogbGFzdENs
b3NlZCA9IGFjY3VtdWxhdG9yLnNlcmlhbGl6ZU5vZGVzKHN0YXJ0Tm9kZSwgcGFzdEVuZCk7Cisg
ICAgTm9kZSogbGFzdENsb3NlZCA9IGFjY3VtdWxhdG9yLnNlcmlhbGl6ZU5vZGVzKHN0YXJ0QWRq
dXN0ZWRGb3JJbnRlcmNoYW5nZU5ld2xpbmUsIGVuZCk7CiAKICAgICBpZiAoc3BlY2lhbENvbW1v
bkFuY2VzdG9yICYmIGxhc3RDbG9zZWQpIHsKICAgICAgICAgLy8gQWxzbyBpbmNsdWRlIGFsbCBv
ZiB0aGUgYW5jZXN0b3JzIG9mIGxhc3RDbG9zZWQgdXAgdG8gdGhpcyBzcGVjaWFsIGFuY2VzdG9y
LgpAQCAtODQ2LDcgKzg0OSw3IEBAIHN0YXRpYyBTdHJpbmcgY3JlYXRlTWFya3VwSW50ZXJuYWwo
RG9jdW0KIAogU3RyaW5nIHNlcmlhbGl6ZVByZXNlcnZpbmdWaXN1YWxBcHBlYXJhbmNlKGNvbnN0
IFJhbmdlJiByYW5nZSwgVmVjdG9yPE5vZGUqPiogbm9kZXMsIEFubm90YXRlRm9ySW50ZXJjaGFu
Z2UgYW5ub3RhdGUsIENvbnZlcnRCbG9ja3NUb0lubGluZXMgY29udmVydEJsb2Nrc1RvSW5saW5l
cywgUmVzb2x2ZVVSTHMgdXJsc1RvUmVzbHZlKQogewotICAgIHJldHVybiBjcmVhdGVNYXJrdXBJ
bnRlcm5hbChyYW5nZS5vd25lckRvY3VtZW50KCksIHJhbmdlLCBub2RlcywgYW5ub3RhdGUsIGNv
bnZlcnRCbG9ja3NUb0lubGluZXMsIHVybHNUb1Jlc2x2ZSwgTVNPTGlzdE1vZGU6OkRvTm90UHJl
c2VydmUpOworICAgIHJldHVybiBzZXJpYWxpemVQcmVzZXJ2aW5nVmlzdWFsQXBwZWFyYW5jZUlu
dGVybmFsKHJhbmdlLnN0YXJ0UG9zaXRpb24oKSwgcmFuZ2UuZW5kUG9zaXRpb24oKSwgbm9kZXMs
IGFubm90YXRlLCBjb252ZXJ0QmxvY2tzVG9JbmxpbmVzLCB1cmxzVG9SZXNsdmUsIE1TT0xpc3RN
b2RlOjpEb05vdFByZXNlcnZlKTsKIH0KIAogc3RhdGljIGJvb2wgc2hvdWxkUHJlc2VydmVNU09M
aXN0cyhjb25zdCBTdHJpbmcmIG1hcmt1cCkKQEAgLTg3MCw5ICs4NzMsOCBAQCBTdHJpbmcgc2Fu
aXRpemVkTWFya3VwRm9yRnJhZ21lbnRJbkRvY3VtCiAgICAgQVNTRVJUKGJvZHlFbGVtZW50KTsK
ICAgICBib2R5RWxlbWVudC0+YXBwZW5kQ2hpbGQoZnJhZ21lbnQuZ2V0KCkpOwogCi0gICAgYXV0
byByYW5nZSA9IFJhbmdlOjpjcmVhdGUoZG9jdW1lbnQpOwotICAgIHJhbmdlLT5zZWxlY3ROb2Rl
Q29udGVudHMoKmJvZHlFbGVtZW50KTsKLSAgICBhdXRvIHJlc3VsdCA9IGNyZWF0ZU1hcmt1cElu
dGVybmFsKGRvY3VtZW50LCByYW5nZS5nZXQoKSwgbnVsbHB0ciwgQW5ub3RhdGVGb3JJbnRlcmNo
YW5nZTo6WWVzLCBDb252ZXJ0QmxvY2tzVG9JbmxpbmVzOjpObywgUmVzb2x2ZVVSTHM6Olllc0V4
Y2x1ZGluZ0xvY2FsRmlsZVVSTHNGb3JQcml2YWN5LCBtc29MaXN0TW9kZSk7CisgICAgYXV0byBy
ZXN1bHQgPSBzZXJpYWxpemVQcmVzZXJ2aW5nVmlzdWFsQXBwZWFyYW5jZUludGVybmFsKGZpcnN0
UG9zaXRpb25Jbk5vZGUoYm9keUVsZW1lbnQuZ2V0KCkpLCBsYXN0UG9zaXRpb25Jbk5vZGUoYm9k
eUVsZW1lbnQuZ2V0KCkpLCBudWxscHRyLAorICAgICAgICBBbm5vdGF0ZUZvckludGVyY2hhbmdl
OjpZZXMsIENvbnZlcnRCbG9ja3NUb0lubGluZXM6Ok5vLCBSZXNvbHZlVVJMczo6WWVzRXhjbHVk
aW5nTG9jYWxGaWxlVVJMc0ZvclByaXZhY3ksIG1zb0xpc3RNb2RlKTsKIAogICAgIGlmIChtc29M
aXN0TW9kZSA9PSBNU09MaXN0TW9kZTo6UHJlc2VydmUpIHsKICAgICAgICAgU3RyaW5nQnVpbGRl
ciBidWlsZGVyOwpAQCAtOTUwLDcgKzk1Miw3IEBAIFJlZjxEb2N1bWVudEZyYWdtZW50PiBjcmVh
dGVGcmFnbWVudEZyb20KIAogU3RyaW5nIHNlcmlhbGl6ZUZyYWdtZW50KGNvbnN0IE5vZGUmIG5v
ZGUsIFNlcmlhbGl6ZWROb2RlcyByb290LCBWZWN0b3I8Tm9kZSo+KiBub2RlcywgUmVzb2x2ZVVS
THMgdXJsc1RvUmVzb2x2ZSwgVmVjdG9yPFF1YWxpZmllZE5hbWU+KiB0YWdOYW1lc1RvU2tpcCwg
U2VyaWFsaXphdGlvblN5bnRheCBzZXJpYWxpemF0aW9uU3ludGF4KQogewotICAgIE1hcmt1cEFj
Y3VtdWxhdG9yIGFjY3VtdWxhdG9yKG5vZGVzLCB1cmxzVG9SZXNvbHZlLCBudWxscHRyLCBzZXJp
YWxpemF0aW9uU3ludGF4KTsKKyAgICBNYXJrdXBBY2N1bXVsYXRvciBhY2N1bXVsYXRvcihub2Rl
cywgdXJsc1RvUmVzb2x2ZSwgc2VyaWFsaXphdGlvblN5bnRheCk7CiAgICAgcmV0dXJuIGFjY3Vt
dWxhdG9yLnNlcmlhbGl6ZU5vZGVzKGNvbnN0X2Nhc3Q8Tm9kZSY+KG5vZGUpLCByb290LCB0YWdO
YW1lc1RvU2tpcCk7CiB9CiAKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvbWFya3VwLmgK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvZWRpdGluZy9tYXJrdXAuaAkocmV2aXNpb24g
MjM2NjE2KQorKysgU291cmNlL1dlYkNvcmUvZWRpdGluZy9tYXJrdXAuaAkod29ya2luZyBjb3B5
KQpAQCAtNDYsNiArNDYsNyBAQCBjbGFzcyBOb2RlOwogY2xhc3MgUGFnZTsKIGNsYXNzIFF1YWxp
ZmllZE5hbWU7CiBjbGFzcyBSYW5nZTsKK2NsYXNzIFZpc2libGVTZWxlY3Rpb247CiAKIHZvaWQg
cmVwbGFjZVN1YnJlc291cmNlVVJMcyhSZWY8RG9jdW1lbnRGcmFnbWVudD4mJiwgSGFzaE1hcDxB
dG9taWNTdHJpbmcsIEF0b21pY1N0cmluZz4mJik7CiB2b2lkIHJlbW92ZVN1YnJlc291cmNlVVJM
QXR0cmlidXRlcyhSZWY8RG9jdW1lbnRGcmFnbWVudD4mJiwgV1RGOjpGdW5jdGlvbjxib29sKGNv
bnN0IFVSTCYpPiBzaG91bGRSZW1vdmVVUkwpOwpAQCAtNjksNyArNzAsOCBAQCBFeGNlcHRpb25P
cjx2b2lkPiByZXBsYWNlQ2hpbGRyZW5XaXRoRnJhCiAKIGVudW0gY2xhc3MgUmVzb2x2ZVVSTHMg
OiB1aW50OF90IHsgTm8sIFllcywgWWVzRXhjbHVkaW5nTG9jYWxGaWxlVVJMc0ZvclByaXZhY3kg
fTsKIGVudW0gY2xhc3MgQ29udmVydEJsb2Nrc1RvSW5saW5lcyA6IHVpbnQ4X3QgeyBObywgWWVz
IH07Ci1XRUJDT1JFX0VYUE9SVCBTdHJpbmcgc2VyaWFsaXplUHJlc2VydmluZ1Zpc3VhbEFwcGVh
cmFuY2UoY29uc3QgUmFuZ2UmLCBWZWN0b3I8Tm9kZSo+KiA9IG51bGxwdHIsIEFubm90YXRlRm9y
SW50ZXJjaGFuZ2UgPSBBbm5vdGF0ZUZvckludGVyY2hhbmdlOjpObywgQ29udmVydEJsb2Nrc1Rv
SW5saW5lcyA9IENvbnZlcnRCbG9ja3NUb0lubGluZXM6Ok5vLCBSZXNvbHZlVVJMcyA9IFJlc29s
dmVVUkxzOjpObyk7CitXRUJDT1JFX0VYUE9SVCBTdHJpbmcgc2VyaWFsaXplUHJlc2VydmluZ1Zp
c3VhbEFwcGVhcmFuY2UoY29uc3QgUmFuZ2UmLCBWZWN0b3I8Tm9kZSo+KiA9IG51bGxwdHIsCisg
ICAgQW5ub3RhdGVGb3JJbnRlcmNoYW5nZSA9IEFubm90YXRlRm9ySW50ZXJjaGFuZ2U6Ok5vLCBD
b252ZXJ0QmxvY2tzVG9JbmxpbmVzID0gQ29udmVydEJsb2Nrc1RvSW5saW5lczo6Tm8sIFJlc29s
dmVVUkxzID0gUmVzb2x2ZVVSTHM6Ok5vKTsKIAogZW51bSBjbGFzcyBTZXJpYWxpemVkTm9kZXMg
OiB1aW50OF90IHsgU3VidHJlZUluY2x1ZGluZ05vZGUsIFN1YnRyZWVzT2ZDaGlsZHJlbiB9Owog
ZW51bSBjbGFzcyBTZXJpYWxpemF0aW9uU3ludGF4IDogdWludDhfdCB7IEhUTUwsIFhNTCB9OwpJ
bmRleDogU291cmNlL1dlYkNvcmUvcGFnZS9QYWdlU2VyaWFsaXplci5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL1dlYkNvcmUvcGFnZS9QYWdlU2VyaWFsaXplci5jcHAJKHJldmlzaW9uIDIzNjYx
NikKKysrIFNvdXJjZS9XZWJDb3JlL3BhZ2UvUGFnZVNlcmlhbGl6ZXIuY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC05NCw3ICs5NCw3IEBAIHN0YXRpYyBjb25zdCBRdWFsaWZpZWROYW1lJiBmcmFtZU93
bmVyVVIKICAgICByZXR1cm4gaXM8SFRNTE9iamVjdEVsZW1lbnQ+KGZyYW1lT3duZXIpID8gSFRN
TE5hbWVzOjpkYXRhQXR0ciA6IEhUTUxOYW1lczo6c3JjQXR0cjsKIH0KIAotY2xhc3MgUGFnZVNl
cmlhbGl6ZXI6OlNlcmlhbGl6ZXJNYXJrdXBBY2N1bXVsYXRvciBmaW5hbCA6IHB1YmxpYyBXZWJD
b3JlOjpNYXJrdXBBY2N1bXVsYXRvciB7CitjbGFzcyBQYWdlU2VyaWFsaXplcjo6U2VyaWFsaXpl
ck1hcmt1cEFjY3VtdWxhdG9yIGZpbmFsIDogcHVibGljIE1hcmt1cEFjY3VtdWxhdG9yIHsKIHB1
YmxpYzoKICAgICBTZXJpYWxpemVyTWFya3VwQWNjdW11bGF0b3IoUGFnZVNlcmlhbGl6ZXImLCBE
b2N1bWVudCYsIFZlY3RvcjxOb2RlKj4qKTsKIAo=
</data>
<flag name="review"
          id="368534"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
      

    </bug>

</bugzilla>