<?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>44854</bug_id>
          
          <creation_ts>2010-08-29 22:55:53 -0700</creation_ts>
          <short_desc>MarkupAccumulator should be broken down into two classes</short_desc>
          <delta_ts>2010-09-12 16:37:43 -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>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Enhancement</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>45624</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Ryosuke Niwa">rniwa</reporter>
          <assigned_to name="Ryosuke Niwa">rniwa</assigned_to>
          <cc>abarth</cc>
    
    <cc>darin</cc>
    
    <cc>enrica</cc>
    
    <cc>eric</cc>
    
    <cc>ojan</cc>
    
    <cc>tony</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>271297</commentid>
    <comment_count>0</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2010-08-29 22:55:53 -0700</bug_when>
    <thetext>Currently, MarkupAccumulator does two things
1. Serialize DOM tree to generate HTML / XHTML markup
2. Stylize markup to preserve the style.

Because 2 is an extension to 1, we should separate 2 into a separate class that inherits from MarkupAccumulator.

This separation is necessary to merge WebPageSerializer with MarkupAccumulator
http://trac.webkit.org/browser/trunk/WebKit/chromium/src/WebPageSerializerImpl.cpp
My current plan is to make a class inherited from MarkupAccumulator and override appending
and URL resolution mechanism. However, since WebPageSerializer needs to push a partial result via IPC
as soon as we filled up a buffer, we cannot support wrapWithNode in this new class.
Separating MarkupAccumulator and &quot;Styled&quot;MarkupAccumulator will solve this problem.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>271306</commentid>
    <comment_count>1</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2010-08-29 23:19:26 -0700</bug_when>
    <thetext>(In reply to comment #0)
&gt; 2. Stylize markup to preserve the style.

Could you be more specific about what &quot;style&quot; means here? Maybe an example?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>271314</commentid>
    <comment_count>2</comment_count>
      <attachid>65883</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2010-08-29 23:37:56 -0700</bug_when>
    <thetext>Created attachment 65883
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>271479</commentid>
    <comment_count>3</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2010-08-30 10:08:27 -0700</bug_when>
    <thetext>(In reply to comment #1)
&gt; (In reply to comment #0)
&gt; &gt; 2. Stylize markup to preserve the style.
&gt; 
&gt; Could you be more specific about what &quot;style&quot; means here? Maybe an example?

First, the range version of createMarkup only copies rendered nodes (this seems to be a bug).  When  DoesFullySelectNode = AnnotateForInterchange, we do more than that.  We copy HTML as it is rendered so we add styles added by CSS rules to inline styles, we call convertHTMLTextToInterchangeFormat on all text nodes, and so on.

But having such annotation-related code inside the serialization code seems rather odd, and I&apos;d like to isolate that outside of MarkupAccumulator.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>275991</commentid>
    <comment_count>4</comment_count>
      <attachid>65883</attachid>
    <who name="Tony Chang">tony</who>
    <bug_when>2010-09-08 12:26:24 -0700</bug_when>
    <thetext>Comment on attachment 65883
Patch

&gt; Index: WebCore/ChangeLog
&gt; +        MarkupAccumulator should be broken down into two classes
&gt; +        https://bugs.webkit.org/show_bug.cgi?id=44854

Please add a short sentence why we want to have 2 classes (so we can expose this to webkit so embedders can implement save page).

&gt; Index: WebCore/editing/markup.cpp
&gt; +    String takeResults();
&gt; +protected:

Nit: Add a blank line before protected:

&gt; +    bool shouldAnnotate() { return m_shouldAnnotate == AnnotateForInterchange; }
&gt; +private:

Nit: blank line before private:</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>276075</commentid>
    <comment_count>5</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2010-09-08 14:31:38 -0700</bug_when>
    <thetext>(In reply to comment #4)
&gt; (From update of attachment 65883 [details])
&gt; &gt; Index: WebCore/ChangeLog
&gt; &gt; +        MarkupAccumulator should be broken down into two classes
&gt; &gt; +        https://bugs.webkit.org/show_bug.cgi?id=44854
&gt; 
&gt; Please add a short sentence why we want to have 2 classes (so we can expose this to webkit so embedders can implement save page).

Would the following sound good to you?

        Extracted wrapWithNode, wrapWithStyleNode, stringValueForRange, renderedText, removeExteriorStyles,
        shouldAnnotate, m_shouldAnnotate, and m_reversedPrecedingMarkup from MarkupAccumulator to create
        StyledMarkupAccumulator in order to isolate annotation related code and prepending of text.

        Isolating MarkupAccumulator as a separate class has two advantages:
        1. Isolated serialization code is easier to understand and easier to security-review.
        2. Embedder can use MarkupAccumulator to implement &quot;Save as&quot; feature.

        Also made takeResults, appendText, and appendElement in MarkupAccumulator virtual to override in
        StyledMarkupAccumulator because prepending text requires overriding takeResults, appendText needs
        to append only rendered text when shouldAnnotate() is true, and appendElement requires a different
        behavior when shouldAnnotate() is true or when called inside wrapWithNode with convertBlocksToInlines = true.

        No new tests are added since this is a cleanup.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>276078</commentid>
    <comment_count>6</comment_count>
    <who name="Tony Chang">tony</who>
    <bug_when>2010-09-08 14:33:33 -0700</bug_when>
    <thetext>(In reply to comment #5)
&gt; Would the following sound good to you?

Sure, that sounds fine to me.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>276329</commentid>
    <comment_count>7</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2010-09-08 23:32:36 -0700</bug_when>
    <thetext>Committed r67064: &lt;http://trac.webkit.org/changeset/67064&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>276689</commentid>
    <comment_count>8</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-09-09 12:59:13 -0700</bug_when>
    <thetext>http://trac.webkit.org/changeset/67064 might have broken Leopard Intel Debug (Tests)</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>65883</attachid>
            <date>2010-08-29 23:37:56 -0700</date>
            <delta_ts>2010-09-08 12:26:23 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-44854-20100829233751.patch</filename>
            <type>text/plain</type>
            <size>23313</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2NjM1NykKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNDggQEAKKzIwMTAtMDgtMjkgIFJ5b3N1a2UgTml3YSAgPHJuaXdhQHdlYmtpdC5v
cmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgTWFy
a3VwQWNjdW11bGF0b3Igc2hvdWxkIGJlIGJyb2tlbiBkb3duIGludG8gdHdvIGNsYXNzZXMKKyAg
ICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTQ0ODU0CisKKyAg
ICAgICAgRXh0cmFjdGVkIHdyYXBXaXRoTm9kZSwgd3JhcFdpdGhTdHlsZU5vZGUsIHN0cmluZ1Zh
bHVlRm9yUmFuZ2UsIHJlbmRlcmVkVGV4dCwgcmVtb3ZlRXh0ZXJpb3JTdHlsZXMsCisgICAgICAg
IHNob3VsZEFubm90YXRlLCBtX3Nob3VsZEFubm90YXRlLCBhbmQgbV9yZXZlcnNlZFByZWNlZGlu
Z01hcmt1cCBmcm9tIE1hcmt1cEFjY3VtdWxhdG9yIHRvIGNyZWF0ZQorICAgICAgICBTdHlsZWRN
YXJrdXBBY2N1bXVsYXRvciBpbiBvcmRlciB0byBpc29sYXRlIGFubm90YXRpb24gcmVsYXRlZCBj
b2RlIGFuZCBwcmVwZW5kaW5nIG9mIHRleHQuCisKKyAgICAgICAgQWxzbyBtYWRlIHRha2VSZXN1
bHRzLCBhcHBlbmRUZXh0LCBhbmQgYXBwZW5kRWxlbWVudCBpbiBNYXJrdXBBY2N1bXVsYXRvciB2
aXJ0dWFsIHRvIG92ZXJyaWRlIGluCisgICAgICAgIFN0eWxlZE1hcmt1cEFjY3VtdWxhdG9yIGJl
Y2F1c2UgcHJlcGVuZGluZyB0ZXh0IHJlcXVpcmVzIG92ZXJyaWRpbmcgdGFrZVJlc3VsdHMsIGFw
cGVuZFRleHQgbmVlZHMKKyAgICAgICAgdG8gYXBwZW5kIG9ubHkgcmVuZGVyZWQgdGV4dCB3aGVu
IHNob3VsZEFubm90YXRlKCkgaXMgdHJ1ZSwgYW5kIGFwcGVuZEVsZW1lbnQgcmVxdWlyZXMgYSBk
aWZmZXJlbnQKKyAgICAgICAgYmVoYXZpb3Igd2hlbiBzaG91bGRBbm5vdGF0ZSgpIGlzIHRydWUg
b3Igd2hlbiBjYWxsZWQgaW5zaWRlIHdyYXBXaXRoTm9kZSB3aXRoIGNvbnZlcnRCbG9ja3NUb0lu
bGluZXMgPSB0cnVlLgorCisgICAgICAgIE5vIG5ldyB0ZXN0cyBhcmUgYWRkZWQgc2luY2UgdGhp
cyBpcyBhIGNsZWFudXAuCisKKyAgICAgICAgKiBlZGl0aW5nL21hcmt1cC5jcHA6CisgICAgICAg
IChXZWJDb3JlOjpNYXJrdXBBY2N1bXVsYXRvcjo6TWFya3VwQWNjdW11bGF0b3IpOiBSZW1vdmVk
IHNob3VsZEFubm90YXRlIGZyb20gYXJndW1lbnQuCisgICAgICAgIChXZWJDb3JlOjpNYXJrdXBB
Y2N1bXVsYXRvcjo6fk1hcmt1cEFjY3VtdWxhdG9yKTogQWRkZWQuCisgICAgICAgIChXZWJDb3Jl
OjpTdHlsZWRNYXJrdXBBY2N1bXVsYXRvcjo6KTogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpT
dHlsZWRNYXJrdXBBY2N1bXVsYXRvcjo6U3R5bGVkTWFya3VwQWNjdW11bGF0b3IpOiBBZGRlZC4K
KyAgICAgICAgKFdlYkNvcmU6OlN0eWxlZE1hcmt1cEFjY3VtdWxhdG9yOjphcHBlbmRFbGVtZW50
KTogQWRkZWQgdG8gc3VwcG9ydCBhbm5vdGF0aW9uLgorICAgICAgICAoV2ViQ29yZTo6U3R5bGVk
TWFya3VwQWNjdW11bGF0b3I6OnNob3VsZEFubm90YXRlKTogTW92ZWQgZnJvbSBNYXJrdXBBY2N1
bXVsYXRvci4KKyAgICAgICAgKFdlYkNvcmU6Ok1hcmt1cEFjY3VtdWxhdG9yOjphcHBlbmRTdGFy
dFRhZyk6IE5vIGxvbmdlciB0YWtlcyBjb252ZXJ0QmxvY2tzVG9JbmxpbmVzIGFuZCBSYW5nZUZ1
bGx5U2VsZWN0c05vZGUuCisgICAgICAgIChXZWJDb3JlOjpTdHlsZWRNYXJrdXBBY2N1bXVsYXRv
cjo6d3JhcFdpdGhTdHlsZU5vZGUpOiBNb3ZlZCBmcm9tIE1hcmt1cEFjY3VtdWxhdG9yLgorICAg
ICAgICAoV2ViQ29yZTo6TWFya3VwQWNjdW11bGF0b3I6OnRha2VSZXN1bHRzKTogTm8gbG9uZ2Vy
IGFjY3VtdWxhdGVzIHByZXBlbmRlZCB0ZXh0LCBhbmQgbWFkZSB2aXJ0dWFsLgorICAgICAgICAo
V2ViQ29yZTo6U3R5bGVkTWFya3VwQWNjdW11bGF0b3I6OnRha2VSZXN1bHRzKTogQWRkZWQgdG8g
c3VwcG9ydCBwcmVwZW5kZWQgdGV4dC4KKyAgICAgICAgKFdlYkNvcmU6Ok1hcmt1cEFjY3VtdWxh
dG9yOjpzaG91bGRBZGROYW1lc3BhY2VBdHRyaWJ1dGUpOiBUYWtlcyBhIHJlZmVyZW5jZSB0byBB
dHRyaWJ1dGUgaW5zdGVhZCBvZiBhIHBvaW50ZXIuCisgICAgICAgIChXZWJDb3JlOjpNYXJrdXBB
Y2N1bXVsYXRvcjo6ZW50aXR5TWFza0ZvclRleHQpOiBFeHRyYWN0ZWQgZnJvbSBhcHBlbmRUZXh0
LgorICAgICAgICAoV2ViQ29yZTo6TWFya3VwQWNjdW11bGF0b3I6OmFwcGVuZFRleHQpOiBObyBs
b25nZXIgZGVhbHMgd2l0aCBhbm5vdGF0aW9uLgorICAgICAgICAoV2ViQ29yZTo6U3R5bGVkTWFy
a3VwQWNjdW11bGF0b3I6OmFwcGVuZFRleHQpOiBBZGRlZCB0byBzdXBwb3J0IGFubm90YXRpb24u
CisgICAgICAgIChXZWJDb3JlOjpTdHlsZWRNYXJrdXBBY2N1bXVsYXRvcjo6c3RyaW5nVmFsdWVG
b3JSYW5nZSk6IE1vdmVkIGZyb20gTWFya3VwQWNjdW11bGF0b3IuCisgICAgICAgIChXZWJDb3Jl
OjpTdHlsZWRNYXJrdXBBY2N1bXVsYXRvcjo6cmVuZGVyZWRUZXh0KTogTW92ZWQgZnJvbSBNYXJr
dXBBY2N1bXVsYXRvci4KKyAgICAgICAgKFdlYkNvcmU6Ok1hcmt1cEFjY3VtdWxhdG9yOjphcHBl
bmRFbGVtZW50KTogTm8gbG9uZ2VyIGRlYWxzIHdpdGggYW5ub3RhdGlvbi4KKyAgICAgICAgKFdl
YkNvcmU6OlN0eWxlZE1hcmt1cEFjY3VtdWxhdG9yOjp3cmFwV2l0aE5vZGUpOiBNb3ZlZCBmcm9t
IE1hcmt1cEFjY3VtdWxhdG9yLgorICAgICAgICAoV2ViQ29yZTo6U3R5bGVkTWFya3VwQWNjdW11
bGF0b3I6OnJlbW92ZUV4dGVyaW9yU3R5bGVzKTogTW92ZWQgZnJvbSBNYXJrdXBBY2N1bXVsYXRv
ci4KKyAgICAgICAgKFdlYkNvcmU6Ok1hcmt1cEFjY3VtdWxhdG9yOjphcHBlbmRPcGVuVGFnKTog
QWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpNYXJrdXBBY2N1bXVsYXRvcjo6YXBwZW5kQ2xvc2VU
YWcpOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6Ok1hcmt1cEFjY3VtdWxhdG9yOjphcHBlbmRB
dHRyaWJ1dGUpOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6Ok1hcmt1cEFjY3VtdWxhdG9yOjph
cHBlbmRTdGFydE1hcmt1cCk6IE5vIGxvbmdlciB0YWtlcyBjb252ZXJ0QmxvY2tzVG9JbmxpbmVz
IGFuZCBSYW5nZUZ1bGx5U2VsZWN0c05vZGUuCisgICAgICAgIChXZWJDb3JlOjpzZXJpYWxpemVO
b2Rlcyk6IFRha2VzIFN0eWxlZE1hcmt1cEFjY3VtdWxhdG9yLgorICAgICAgICAoV2ViQ29yZTo6
Y3JlYXRlTWFya3VwKTogUmFuZ2UgdmVyc2lvbiB1c2VzIFN0eWxlZE1hcmt1cEFjY3VtdWxhdG9y
IGFuZCBub2RlIHZlcnNpb24gdXNlcyBNYXJrdXBBY2N1bXVsYXRvci4KKwogMjAxMC0wOC0yOSAg
S2VudCBUYW11cmEgIDx0a2VudEBjaHJvbWl1bS5vcmc+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkg
RGFyaW4gQWRsZXIuCkluZGV4OiBXZWJDb3JlL2VkaXRpbmcvbWFya3VwLmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBXZWJDb3JlL2VkaXRpbmcvbWFya3VwLmNwcAkocmV2aXNpb24gNjYzMjkpCisrKyBXZWJD
b3JlL2VkaXRpbmcvbWFya3VwLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTQ3LDUxICsxNDcsNzMg
QEAgdHlwZWRlZiBIYXNoTWFwPEF0b21pY1N0cmluZ0ltcGwqLCBBdG9taQogCiBjbGFzcyBNYXJr
dXBBY2N1bXVsYXRvciB7CiBwdWJsaWM6Ci0gICAgZW51bSBSYW5nZUZ1bGx5U2VsZWN0c05vZGUg
eyBEb2VzRnVsbHlTZWxlY3ROb2RlLCBEb2VzTm90RnVsbHlTZWxlY3ROb2RlIH07Ci0KLSAgICBN
YXJrdXBBY2N1bXVsYXRvcihWZWN0b3I8Tm9kZSo+KiBub2RlcywgRUFic29sdXRlVVJMcyBzaG91
bGRSZXNvbHZlVVJMcywgRUFubm90YXRlRm9ySW50ZXJjaGFuZ2Ugc2hvdWxkQW5ub3RhdGUsIGNv
bnN0IFJhbmdlKiByYW5nZSA9IDApCisgICAgTWFya3VwQWNjdW11bGF0b3IoVmVjdG9yPE5vZGUq
Piogbm9kZXMsIEVBYnNvbHV0ZVVSTHMgc2hvdWxkUmVzb2x2ZVVSTHMsIGNvbnN0IFJhbmdlKiBy
YW5nZSA9IDApCiAgICAgICAgIDogbV9ub2Rlcyhub2RlcykKLSAgICAgICAgLCBtX3Nob3VsZFJl
c29sdmVVUkxzKHNob3VsZFJlc29sdmVVUkxzKQotICAgICAgICAsIG1fc2hvdWxkQW5ub3RhdGUo
c2hvdWxkQW5ub3RhdGUpCiAgICAgICAgICwgbV9yYW5nZShyYW5nZSkKKyAgICAgICAgLCBtX3No
b3VsZFJlc29sdmVVUkxzKHNob3VsZFJlc29sdmVVUkxzKQogICAgIHsKICAgICB9CisgICAgdmly
dHVhbCB+TWFya3VwQWNjdW11bGF0b3IoKSB7fQogICAgIHZvaWQgYXBwZW5kU3RyaW5nKGNvbnN0
IFN0cmluZyYpOwogICAgIHZvaWQgYXBwZW5kU3RhcnRUYWcoTm9kZSosIE5hbWVzcGFjZXMqID0g
MCk7CiAgICAgdm9pZCBhcHBlbmRFbmRUYWcoTm9kZSopOwotICAgIHZvaWQgd3JhcFdpdGhOb2Rl
KE5vZGUqLCBib29sIGNvbnZlcnRCbG9ja3NUb0lubGluZXMgPSBmYWxzZSwgUmFuZ2VGdWxseVNl
bGVjdHNOb2RlID0gRG9lc0Z1bGx5U2VsZWN0Tm9kZSk7Ci0gICAgdm9pZCB3cmFwV2l0aFN0eWxl
Tm9kZShDU1NTdHlsZURlY2xhcmF0aW9uKiwgRG9jdW1lbnQqLCBib29sIGlzQmxvY2sgPSBmYWxz
ZSk7Ci0gICAgU3RyaW5nIHRha2VSZXN1bHRzKCk7CisgICAgdmlydHVhbCBTdHJpbmcgdGFrZVJl
c3VsdHMoKTsKIAotcHJpdmF0ZToKK3Byb3RlY3RlZDoKICAgICB2b2lkIGFwcGVuZEF0dHJpYnV0
ZVZhbHVlKFZlY3RvcjxVQ2hhcj4mIHJlc3VsdCwgY29uc3QgU3RyaW5nJiBhdHRyaWJ1dGUsIGJv
b2wgZG9jdW1lbnRJc0hUTUwpOwogICAgIHZvaWQgYXBwZW5kUXVvdGVkVVJMQXR0cmlidXRlVmFs
dWUoVmVjdG9yPFVDaGFyPiYgcmVzdWx0LCBjb25zdCBTdHJpbmcmIHVybFN0cmluZyk7Ci0gICAg
U3RyaW5nIHN0cmluZ1ZhbHVlRm9yUmFuZ2UoY29uc3QgTm9kZSosIGNvbnN0IFJhbmdlKik7CiAg
ICAgdm9pZCBhcHBlbmROb2RlVmFsdWUoVmVjdG9yPFVDaGFyPiYgb3V0LCBjb25zdCBOb2RlKiwg
Y29uc3QgUmFuZ2UqLCBFbnRpdHlNYXNrKTsKLSAgICBTdHJpbmcgcmVuZGVyZWRUZXh0KGNvbnN0
IE5vZGUqLCBjb25zdCBSYW5nZSopOwogICAgIGJvb2wgc2hvdWxkQWRkTmFtZXNwYWNlRWxlbWVu
dChjb25zdCBFbGVtZW50Kik7Ci0gICAgYm9vbCBzaG91bGRBZGROYW1lc3BhY2VBdHRyaWJ1dGUo
Y29uc3QgQXR0cmlidXRlKiwgTmFtZXNwYWNlcyYpOworICAgIGJvb2wgc2hvdWxkQWRkTmFtZXNw
YWNlQXR0cmlidXRlKGNvbnN0IEF0dHJpYnV0ZSYsIE5hbWVzcGFjZXMmKTsKICAgICB2b2lkIGFw
cGVuZE5hbWVzcGFjZShWZWN0b3I8VUNoYXI+JiByZXN1bHQsIGNvbnN0IEF0b21pY1N0cmluZyYg
cHJlZml4LCBjb25zdCBBdG9taWNTdHJpbmcmIG5hbWVzcGFjZVVSSSwgTmFtZXNwYWNlcyYpOwot
ICAgIHZvaWQgYXBwZW5kVGV4dChWZWN0b3I8VUNoYXI+JiBvdXQsIFRleHQqKTsKKyAgICBFbnRp
dHlNYXNrIGVudGl0eU1hc2tGb3JUZXh0KFRleHQqIHRleHQpIGNvbnN0OworICAgIHZpcnR1YWwg
dm9pZCBhcHBlbmRUZXh0KFZlY3RvcjxVQ2hhcj4mIG91dCwgVGV4dCopOwogICAgIHZvaWQgYXBw
ZW5kQ29tbWVudChWZWN0b3I8VUNoYXI+JiBvdXQsIGNvbnN0IFN0cmluZyYgY29tbWVudCk7CiAg
ICAgdm9pZCBhcHBlbmREb2N1bWVudFR5cGUoVmVjdG9yPFVDaGFyPiYgcmVzdWx0LCBjb25zdCBE
b2N1bWVudFR5cGUqKTsKICAgICB2b2lkIGFwcGVuZFByb2Nlc3NpbmdJbnN0cnVjdGlvbihWZWN0
b3I8VUNoYXI+JiBvdXQsIGNvbnN0IFN0cmluZyYgdGFyZ2V0LCBjb25zdCBTdHJpbmcmIGRhdGEp
OwotICAgIHZvaWQgcmVtb3ZlRXh0ZXJpb3JTdHlsZXMoQ1NTTXV0YWJsZVN0eWxlRGVjbGFyYXRp
b24qKTsKLSAgICB2b2lkIGFwcGVuZEVsZW1lbnQoVmVjdG9yPFVDaGFyPiYgb3V0LCBFbGVtZW50
KiBlbGVtZW50LCBib29sIGFkZERpc3BsYXlJbmxpbmUsIE5hbWVzcGFjZXMqLCBSYW5nZUZ1bGx5
U2VsZWN0c05vZGUpOworICAgIHZpcnR1YWwgdm9pZCBhcHBlbmRFbGVtZW50KFZlY3RvcjxVQ2hh
cj4mIG91dCwgRWxlbWVudCosIE5hbWVzcGFjZXMqKTsKKyAgICB2b2lkIGFwcGVuZE9wZW5UYWco
VmVjdG9yPFVDaGFyPiYgb3V0LCBFbGVtZW50KiBlbGVtZW50LCBOYW1lc3BhY2VzKik7CisgICAg
dm9pZCBhcHBlbmRDbG9zZVRhZyhWZWN0b3I8VUNoYXI+JiBvdXQsIEVsZW1lbnQqIGVsZW1lbnQp
OworICAgIHZvaWQgYXBwZW5kQXR0cmlidXRlKFZlY3RvcjxVQ2hhcj4mIG91dCwgRWxlbWVudCog
ZWxlbWVudCwgY29uc3QgQXR0cmlidXRlJiwgTmFtZXNwYWNlcyopOwogICAgIHZvaWQgYXBwZW5k
Q0RBVEFTZWN0aW9uKFZlY3RvcjxVQ2hhcj4mIG91dCwgY29uc3QgU3RyaW5nJiBzZWN0aW9uKTsK
LSAgICB2b2lkIGFwcGVuZFN0YXJ0TWFya3VwKFZlY3RvcjxVQ2hhcj4mIHJlc3VsdCwgY29uc3Qg
Tm9kZSosIGJvb2wgY29udmVydEJsb2Nrc1RvSW5saW5lcywgTmFtZXNwYWNlcyosIFJhbmdlRnVs
bHlTZWxlY3RzTm9kZSk7CisgICAgdm9pZCBhcHBlbmRTdGFydE1hcmt1cChWZWN0b3I8VUNoYXI+
JiByZXN1bHQsIGNvbnN0IE5vZGUqLCBOYW1lc3BhY2VzKik7CiAgICAgYm9vbCBzaG91bGRTZWxm
Q2xvc2UoY29uc3QgTm9kZSopOwogICAgIHZvaWQgYXBwZW5kRW5kTWFya3VwKFZlY3RvcjxVQ2hh
cj4mIHJlc3VsdCwgY29uc3QgTm9kZSopOwogCiAgICAgYm9vbCBzaG91bGRSZXNvbHZlVVJMcygp
IHsgcmV0dXJuIG1fc2hvdWxkUmVzb2x2ZVVSTHMgPT0gQWJzb2x1dGVVUkxzOyB9Ci0gICAgYm9v
bCBzaG91bGRBbm5vdGF0ZSgpIHsgcmV0dXJuIG1fc2hvdWxkQW5ub3RhdGUgPT0gQW5ub3RhdGVG
b3JJbnRlcmNoYW5nZTsgfQogCiAgICAgVmVjdG9yPE5vZGUqPiogY29uc3QgbV9ub2RlczsKLSAg
ICBjb25zdCBib29sIG1fc2hvdWxkUmVzb2x2ZVVSTHM7Ci0gICAgY29uc3QgRUFubm90YXRlRm9y
SW50ZXJjaGFuZ2UgbV9zaG91bGRBbm5vdGF0ZTsKICAgICBjb25zdCBSYW5nZSogY29uc3QgbV9y
YW5nZTsKLSAgICBWZWN0b3I8U3RyaW5nPiBtX3JldmVyc2VkUHJlY2VkaW5nTWFya3VwOwogICAg
IFZlY3RvcjxTdHJpbmc+IG1fc3VjY2VlZGluZ01hcmt1cDsKKworcHJpdmF0ZToKKyAgICBjb25z
dCBib29sIG1fc2hvdWxkUmVzb2x2ZVVSTHM7Cit9OworCitjbGFzcyBTdHlsZWRNYXJrdXBBY2N1
bXVsYXRvciA6IHB1YmxpYyBNYXJrdXBBY2N1bXVsYXRvciB7CitwdWJsaWM6CisgICAgZW51bSBS
YW5nZUZ1bGx5U2VsZWN0c05vZGUgeyBEb2VzRnVsbHlTZWxlY3ROb2RlLCBEb2VzTm90RnVsbHlT
ZWxlY3ROb2RlIH07CisKKyAgICBTdHlsZWRNYXJrdXBBY2N1bXVsYXRvcihWZWN0b3I8Tm9kZSo+
KiBub2RlcywgRUFic29sdXRlVVJMcyBzaG91bGRSZXNvbHZlVVJMcywgRUFubm90YXRlRm9ySW50
ZXJjaGFuZ2Ugc2hvdWxkQW5ub3RhdGUsIGNvbnN0IFJhbmdlKiByYW5nZSkKKyAgICAgICAgOiBN
YXJrdXBBY2N1bXVsYXRvcihub2Rlcywgc2hvdWxkUmVzb2x2ZVVSTHMsIHJhbmdlKQorICAgICAg
ICAsIG1fc2hvdWxkQW5ub3RhdGUoc2hvdWxkQW5ub3RhdGUpCisgICAgeworICAgIH0KKyAgICB2
b2lkIHdyYXBXaXRoTm9kZShOb2RlKiwgYm9vbCBjb252ZXJ0QmxvY2tzVG9JbmxpbmVzID0gZmFs
c2UsIFJhbmdlRnVsbHlTZWxlY3RzTm9kZSA9IERvZXNGdWxseVNlbGVjdE5vZGUpOworICAgIHZv
aWQgd3JhcFdpdGhTdHlsZU5vZGUoQ1NTU3R5bGVEZWNsYXJhdGlvbiosIERvY3VtZW50KiwgYm9v
bCBpc0Jsb2NrID0gZmFsc2UpOworICAgIFN0cmluZyB0YWtlUmVzdWx0cygpOworcHJvdGVjdGVk
OgorICAgIHZpcnR1YWwgdm9pZCBhcHBlbmRUZXh0KFZlY3RvcjxVQ2hhcj4mIG91dCwgVGV4dCop
OworICAgIFN0cmluZyByZW5kZXJlZFRleHQoY29uc3QgTm9kZSosIGNvbnN0IFJhbmdlKik7Cisg
ICAgU3RyaW5nIHN0cmluZ1ZhbHVlRm9yUmFuZ2UoY29uc3QgTm9kZSosIGNvbnN0IFJhbmdlKik7
CisgICAgdm9pZCByZW1vdmVFeHRlcmlvclN0eWxlcyhDU1NNdXRhYmxlU3R5bGVEZWNsYXJhdGlv
biopOworICAgIHZvaWQgYXBwZW5kRWxlbWVudChWZWN0b3I8VUNoYXI+JiBvdXQsIEVsZW1lbnQq
IGVsZW1lbnQsIGJvb2wgYWRkRGlzcGxheUlubGluZSwgUmFuZ2VGdWxseVNlbGVjdHNOb2RlKTsK
KyAgICB2b2lkIGFwcGVuZEVsZW1lbnQoVmVjdG9yPFVDaGFyPiYgb3V0LCBFbGVtZW50KiBlbGVt
ZW50LCBOYW1lc3BhY2VzKikgeyBhcHBlbmRFbGVtZW50KG91dCwgZWxlbWVudCwgZmFsc2UsIERv
ZXNGdWxseVNlbGVjdE5vZGUpOyB9CisKKyAgICBib29sIHNob3VsZEFubm90YXRlKCkgeyByZXR1
cm4gbV9zaG91bGRBbm5vdGF0ZSA9PSBBbm5vdGF0ZUZvckludGVyY2hhbmdlOyB9Citwcml2YXRl
OgorICAgIFZlY3RvcjxTdHJpbmc+IG1fcmV2ZXJzZWRQcmVjZWRpbmdNYXJrdXA7CisgICAgY29u
c3QgRUFubm90YXRlRm9ySW50ZXJjaGFuZ2UgbV9zaG91bGRBbm5vdGF0ZTsKIH07CiAKIHZvaWQg
TWFya3VwQWNjdW11bGF0b3I6OmFwcGVuZFN0cmluZyhjb25zdCBTdHJpbmcmIHN0cmluZykKQEAg
LTIwMiw3ICsyMjQsNyBAQCB2b2lkIE1hcmt1cEFjY3VtdWxhdG9yOjphcHBlbmRTdHJpbmcoY29u
CiB2b2lkIE1hcmt1cEFjY3VtdWxhdG9yOjphcHBlbmRTdGFydFRhZyhOb2RlKiBub2RlLCBOYW1l
c3BhY2VzKiBuYW1lc3BhY2VzKQogewogICAgIFZlY3RvcjxVQ2hhcj4gbWFya3VwOwotICAgIGFw
cGVuZFN0YXJ0TWFya3VwKG1hcmt1cCwgbm9kZSwgZmFsc2UsIG5hbWVzcGFjZXMsIERvZXNGdWxs
eVNlbGVjdE5vZGUpOworICAgIGFwcGVuZFN0YXJ0TWFya3VwKG1hcmt1cCwgbm9kZSwgbmFtZXNw
YWNlcyk7CiAgICAgbV9zdWNjZWVkaW5nTWFya3VwLmFwcGVuZChTdHJpbmc6OmFkb3B0KG1hcmt1
cCkpOwogICAgIGlmIChtX25vZGVzKQogICAgICAgICBtX25vZGVzLT5hcHBlbmQobm9kZSk7CkBA
IC0yMTUsMTcgKzIzNywyMCBAQCB2b2lkIE1hcmt1cEFjY3VtdWxhdG9yOjphcHBlbmRFbmRUYWco
Tm9kCiAgICAgbV9zdWNjZWVkaW5nTWFya3VwLmFwcGVuZChTdHJpbmc6OmFkb3B0KG1hcmt1cCkp
OwogfQogCi12b2lkIE1hcmt1cEFjY3VtdWxhdG9yOjp3cmFwV2l0aE5vZGUoTm9kZSogbm9kZSwg
Ym9vbCBjb252ZXJ0QmxvY2tzVG9JbmxpbmVzLCBSYW5nZUZ1bGx5U2VsZWN0c05vZGUgcmFuZ2VG
dWxseVNlbGVjdHNOb2RlKQordm9pZCBTdHlsZWRNYXJrdXBBY2N1bXVsYXRvcjo6d3JhcFdpdGhO
b2RlKE5vZGUqIG5vZGUsIGJvb2wgY29udmVydEJsb2Nrc1RvSW5saW5lcywgUmFuZ2VGdWxseVNl
bGVjdHNOb2RlIHJhbmdlRnVsbHlTZWxlY3RzTm9kZSkKIHsKICAgICBWZWN0b3I8VUNoYXI+IG1h
cmt1cDsKLSAgICBhcHBlbmRTdGFydE1hcmt1cChtYXJrdXAsIG5vZGUsIGNvbnZlcnRCbG9ja3NU
b0lubGluZXMsIDAsIHJhbmdlRnVsbHlTZWxlY3RzTm9kZSk7CisgICAgaWYgKG5vZGUtPmlzRWxl
bWVudE5vZGUoKSkKKyAgICAgICAgYXBwZW5kRWxlbWVudChtYXJrdXAsIHN0YXRpY19jYXN0PEVs
ZW1lbnQqPihub2RlKSwgY29udmVydEJsb2Nrc1RvSW5saW5lcyAmJiBpc0Jsb2NrKGNvbnN0X2Nh
c3Q8Tm9kZSo+KG5vZGUpKSwgcmFuZ2VGdWxseVNlbGVjdHNOb2RlKTsKKyAgICBlbHNlCisgICAg
ICAgIGFwcGVuZFN0YXJ0TWFya3VwKG1hcmt1cCwgbm9kZSwgMCk7CiAgICAgbV9yZXZlcnNlZFBy
ZWNlZGluZ01hcmt1cC5hcHBlbmQoU3RyaW5nOjphZG9wdChtYXJrdXApKTsKICAgICBhcHBlbmRF
bmRUYWcobm9kZSk7CiAgICAgaWYgKG1fbm9kZXMpCiAgICAgICAgIG1fbm9kZXMtPmFwcGVuZChu
b2RlKTsKIH0KLSAgICAKLXZvaWQgTWFya3VwQWNjdW11bGF0b3I6OndyYXBXaXRoU3R5bGVOb2Rl
KENTU1N0eWxlRGVjbGFyYXRpb24qIHN0eWxlLCBEb2N1bWVudCogZG9jdW1lbnQsIGJvb2wgaXNC
bG9jaykKKwordm9pZCBTdHlsZWRNYXJrdXBBY2N1bXVsYXRvcjo6d3JhcFdpdGhTdHlsZU5vZGUo
Q1NTU3R5bGVEZWNsYXJhdGlvbiogc3R5bGUsIERvY3VtZW50KiBkb2N1bWVudCwgYm9vbCBpc0Js
b2NrKQogewogICAgIC8vIEFsbCB0ZXh0LWRlY29yYXRpb24tcmVsYXRlZCBlbGVtZW50cyBzaG91
bGQgaGF2ZSBiZWVuIHRyZWF0ZWQgYXMgc3BlY2lhbCBhbmNlc3RvcnMKICAgICAvLyBJZiB3ZSBl
dmVyIGhpdCB0aGlzIEFTU0VSVCwgd2Ugc2hvdWxkIGV4cG9ydCBTdHlsZUNoYW5nZSBpbiBBcHBs
eVN0eWxlQ29tbWFuZCBhbmQgdXNlIGl0IGhlcmUKQEAgLTI1MCw2ICsyNzUsMjMgQEAgU3RyaW5n
IE1hcmt1cEFjY3VtdWxhdG9yOjp0YWtlUmVzdWx0cygpCiB7CiAgICAgc2l6ZV90IGxlbmd0aCA9
IDA7CiAKKyAgICBzaXplX3QgcG9zdENvdW50ID0gbV9zdWNjZWVkaW5nTWFya3VwLnNpemUoKTsK
KyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBvc3RDb3VudDsgKytpKQorICAgICAgICBsZW5n
dGggKz0gbV9zdWNjZWVkaW5nTWFya3VwW2ldLmxlbmd0aCgpOworCisgICAgVmVjdG9yPFVDaGFy
PiByZXN1bHQ7CisgICAgcmVzdWx0LnJlc2VydmVJbml0aWFsQ2FwYWNpdHkobGVuZ3RoKTsKKwor
ICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcG9zdENvdW50OyArK2kpCisgICAgICAgIGFwcGVu
ZChyZXN1bHQsIG1fc3VjY2VlZGluZ01hcmt1cFtpXSk7CisKKyAgICByZXR1cm4gU3RyaW5nOjph
ZG9wdChyZXN1bHQpOworfQorCitTdHJpbmcgU3R5bGVkTWFya3VwQWNjdW11bGF0b3I6OnRha2VS
ZXN1bHRzKCkKK3sKKyAgICBzaXplX3QgbGVuZ3RoID0gMDsKKwogICAgIHNpemVfdCBwcmVDb3Vu
dCA9IG1fcmV2ZXJzZWRQcmVjZWRpbmdNYXJrdXAuc2l6ZSgpOwogICAgIGZvciAoc2l6ZV90IGkg
PSAwOyBpIDwgcHJlQ291bnQ7ICsraSkKICAgICAgICAgbGVuZ3RoICs9IG1fcmV2ZXJzZWRQcmVj
ZWRpbmdNYXJrdXBbaV0ubGVuZ3RoKCk7CkBAIC0yOTcsMTAgKzMzOSwxMCBAQCB2b2lkIE1hcmt1
cEFjY3VtdWxhdG9yOjphcHBlbmRRdW90ZWRVUkxBCiAgICAgLy8gRklYTUU6IFRoaXMgZG9lcyBu
b3QgZnVsbHkgbWF0Y2ggb3RoZXIgYnJvd3NlcnMuIEZpcmVmb3ggcGVyY2VudC1lc2NhcGVzIG5v
bi1BU0NJSSBjaGFyYWN0ZXJzIGZvciBpbm5lckhUTUwuCiAgICAgcmVzdWx0LmFwcGVuZChxdW90
ZUNoYXIpOwogICAgIGFwcGVuZEF0dHJpYnV0ZVZhbHVlKHJlc3VsdCwgdXJsU3RyaW5nLCBmYWxz
ZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChxdW90ZUNoYXIpOyAgICAKKyAgICByZXN1bHQuYXBwZW5k
KHF1b3RlQ2hhcik7CiB9CiAKLVN0cmluZyBNYXJrdXBBY2N1bXVsYXRvcjo6c3RyaW5nVmFsdWVG
b3JSYW5nZShjb25zdCBOb2RlKiBub2RlLCBjb25zdCBSYW5nZSogcmFuZ2UpCitTdHJpbmcgU3R5
bGVkTWFya3VwQWNjdW11bGF0b3I6OnN0cmluZ1ZhbHVlRm9yUmFuZ2UoY29uc3QgTm9kZSogbm9k
ZSwgY29uc3QgUmFuZ2UqIHJhbmdlKQogewogICAgIGlmICghcmFuZ2UpCiAgICAgICAgIHJldHVy
biBub2RlLT5ub2RlVmFsdWUoKTsKQEAgLTMzMCwxMSArMzcyLDExIEBAIHZvaWQgTWFya3VwQWNj
dW11bGF0b3I6OmFwcGVuZE5vZGVWYWx1ZSgKICAgICAgICAgICAgIGxlbmd0aCAtPSBzdGFydDsK
ICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIGFwcGVuZENoYXJhY3RlcnNSZXBsYWNpbmdF
bnRpdGllcyhvdXQsIGNoYXJhY3RlcnMsIGxlbmd0aCwgZW50aXR5TWFzayk7CiB9CiAKLVN0cmlu
ZyBNYXJrdXBBY2N1bXVsYXRvcjo6cmVuZGVyZWRUZXh0KGNvbnN0IE5vZGUqIG5vZGUsIGNvbnN0
IFJhbmdlKiByYW5nZSkKK1N0cmluZyBTdHlsZWRNYXJrdXBBY2N1bXVsYXRvcjo6cmVuZGVyZWRU
ZXh0KGNvbnN0IE5vZGUqIG5vZGUsIGNvbnN0IFJhbmdlKiByYW5nZSkKIHsKICAgICBpZiAoIW5v
ZGUtPmlzVGV4dE5vZGUoKSkKICAgICAgICAgcmV0dXJuIFN0cmluZygpOwpAQCAtMzQ4LDcgKzM5
MCw3IEBAIFN0cmluZyBNYXJrdXBBY2N1bXVsYXRvcjo6cmVuZGVyZWRUZXh0KGMKICAgICAgICAg
c3RhcnRPZmZzZXQgPSByYW5nZS0+c3RhcnRPZmZzZXQoZWMpOwogICAgIGlmIChyYW5nZSAmJiBu
b2RlID09IHJhbmdlLT5lbmRDb250YWluZXIoZWMpKQogICAgICAgICBlbmRPZmZzZXQgPSByYW5n
ZS0+ZW5kT2Zmc2V0KGVjKTsKLSAgICAKKwogICAgIFBvc2l0aW9uIHN0YXJ0KGNvbnN0X2Nhc3Q8
Tm9kZSo+KG5vZGUpLCBzdGFydE9mZnNldCk7CiAgICAgUG9zaXRpb24gZW5kKGNvbnN0X2Nhc3Q8
Tm9kZSo+KG5vZGUpLCBlbmRPZmZzZXQpOwogICAgIHJldHVybiBwbGFpblRleHQoUmFuZ2U6OmNy
ZWF0ZShub2RlLT5kb2N1bWVudCgpLCBzdGFydCwgZW5kKS5nZXQoKSk7CkBAIC0zOTUsMTkgKzQz
NywxOSBAQCBib29sIE1hcmt1cEFjY3VtdWxhdG9yOjpzaG91bGRBZGROYW1lc3BhCiAgICAgcmV0
dXJuICFlbGVtZW50LT5oYXNBdHRyaWJ1dGUoYXR0cik7CiB9CiAKLWJvb2wgTWFya3VwQWNjdW11
bGF0b3I6OnNob3VsZEFkZE5hbWVzcGFjZUF0dHJpYnV0ZShjb25zdCBBdHRyaWJ1dGUqIGF0dHJp
YnV0ZSwgTmFtZXNwYWNlcyYgbmFtZXNwYWNlcykKK2Jvb2wgTWFya3VwQWNjdW11bGF0b3I6OnNo
b3VsZEFkZE5hbWVzcGFjZUF0dHJpYnV0ZShjb25zdCBBdHRyaWJ1dGUmIGF0dHJpYnV0ZSwgTmFt
ZXNwYWNlcyYgbmFtZXNwYWNlcykKIHsKICAgICBuYW1lc3BhY2VzLmNoZWNrQ29uc2lzdGVuY3ko
KTsKIAogICAgIC8vIERvbid0IGFkZCBuYW1lc3BhY2UgYXR0cmlidXRlcyB0d2ljZQotICAgIGlm
IChhdHRyaWJ1dGUtPm5hbWUoKSA9PSBYTUxOU05hbWVzOjp4bWxuc0F0dHIpIHsKLSAgICAgICAg
bmFtZXNwYWNlcy5zZXQoZW1wdHlBdG9tLmltcGwoKSwgYXR0cmlidXRlLT52YWx1ZSgpLmltcGwo
KSk7CisgICAgaWYgKGF0dHJpYnV0ZS5uYW1lKCkgPT0gWE1MTlNOYW1lczo6eG1sbnNBdHRyKSB7
CisgICAgICAgIG5hbWVzcGFjZXMuc2V0KGVtcHR5QXRvbS5pbXBsKCksIGF0dHJpYnV0ZS52YWx1
ZSgpLmltcGwoKSk7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgCi0gICAgUXVh
bGlmaWVkTmFtZSB4bWxuc1ByZWZpeEF0dHIoeG1sbnNBdG9tLCBhdHRyaWJ1dGUtPmxvY2FsTmFt
ZSgpLCBYTUxOU05hbWVzOjp4bWxuc05hbWVzcGFjZVVSSSk7Ci0gICAgaWYgKGF0dHJpYnV0ZS0+
bmFtZSgpID09IHhtbG5zUHJlZml4QXR0cikgewotICAgICAgICBuYW1lc3BhY2VzLnNldChhdHRy
aWJ1dGUtPmxvY2FsTmFtZSgpLmltcGwoKSwgYXR0cmlidXRlLT52YWx1ZSgpLmltcGwoKSk7Cisg
ICAgUXVhbGlmaWVkTmFtZSB4bWxuc1ByZWZpeEF0dHIoeG1sbnNBdG9tLCBhdHRyaWJ1dGUubG9j
YWxOYW1lKCksIFhNTE5TTmFtZXM6OnhtbG5zTmFtZXNwYWNlVVJJKTsKKyAgICBpZiAoYXR0cmli
dXRlLm5hbWUoKSA9PSB4bWxuc1ByZWZpeEF0dHIpIHsKKyAgICAgICAgbmFtZXNwYWNlcy5zZXQo
YXR0cmlidXRlLmxvY2FsTmFtZSgpLmltcGwoKSwgYXR0cmlidXRlLnZhbHVlKCkuaW1wbCgpKTsK
ICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICAKQEAgLTQzOSwxOSArNDgxLDI3IEBA
IHZvaWQgTWFya3VwQWNjdW11bGF0b3I6OmFwcGVuZE5hbWVzcGFjZSgKICAgICB9CiB9CiAKLXZv
aWQgTWFya3VwQWNjdW11bGF0b3I6OmFwcGVuZFRleHQoVmVjdG9yPFVDaGFyPiYgb3V0LCBUZXh0
KiB0ZXh0KQorRW50aXR5TWFzayBNYXJrdXBBY2N1bXVsYXRvcjo6ZW50aXR5TWFza0ZvclRleHQo
VGV4dCogdGV4dCkgY29uc3QKIHsKICAgICBjb25zdCBRdWFsaWZpZWROYW1lKiBwYXJlbnROYW1l
ID0gMDsKICAgICBpZiAodGV4dC0+cGFyZW50RWxlbWVudCgpKQogICAgICAgICBwYXJlbnROYW1l
ID0gJnN0YXRpY19jYXN0PEVsZW1lbnQqPih0ZXh0LT5wYXJlbnRFbGVtZW50KCkpLT50YWdRTmFt
ZSgpOworICAgIAorICAgIGlmIChwYXJlbnROYW1lICYmICgqcGFyZW50TmFtZSA9PSBzY3JpcHRU
YWcgfHwgKnBhcmVudE5hbWUgPT0gc3R5bGVUYWcgfHwgKnBhcmVudE5hbWUgPT0geG1wVGFnKSkK
KyAgICAgICAgcmV0dXJuIEVudGl0eU1hc2tJbkNEQVRBOwogCi0gICAgaWYgKHBhcmVudE5hbWUg
JiYgKCpwYXJlbnROYW1lID09IHNjcmlwdFRhZyB8fCAqcGFyZW50TmFtZSA9PSBzdHlsZVRhZyB8
fCAqcGFyZW50TmFtZSA9PSB4bXBUYWcpKSB7Ci0gICAgICAgIGFwcGVuZE5vZGVWYWx1ZShvdXQs
IHRleHQsIG1fcmFuZ2UsIEVudGl0eU1hc2tJbkNEQVRBKTsKLSAgICAgICAgcmV0dXJuOwotICAg
IH0KKyAgICByZXR1cm4gdGV4dC0+ZG9jdW1lbnQoKS0+aXNIVE1MRG9jdW1lbnQoKSA/IEVudGl0
eU1hc2tJbkhUTUxQQ0RBVEEgOiBFbnRpdHlNYXNrSW5QQ0RBVEE7Cit9CiAKLSAgICBpZiAoIXNo
b3VsZEFubm90YXRlKCkgfHwgKHBhcmVudE5hbWUgJiYgKnBhcmVudE5hbWUgPT0gdGV4dGFyZWFU
YWcpKSB7Ci0gICAgICAgIGFwcGVuZE5vZGVWYWx1ZShvdXQsIHRleHQsIG1fcmFuZ2UsIHRleHQt
PmRvY3VtZW50KCktPmlzSFRNTERvY3VtZW50KCkgPyBFbnRpdHlNYXNrSW5IVE1MUENEQVRBIDog
RW50aXR5TWFza0luUENEQVRBKTsKK3ZvaWQgTWFya3VwQWNjdW11bGF0b3I6OmFwcGVuZFRleHQo
VmVjdG9yPFVDaGFyPiYgb3V0LCBUZXh0KiB0ZXh0KQoreworICAgIGFwcGVuZE5vZGVWYWx1ZShv
dXQsIHRleHQsIG1fcmFuZ2UsIGVudGl0eU1hc2tGb3JUZXh0KHRleHQpKTsKK30KKwordm9pZCBT
dHlsZWRNYXJrdXBBY2N1bXVsYXRvcjo6YXBwZW5kVGV4dChWZWN0b3I8VUNoYXI+JiBvdXQsIFRl
eHQqIHRleHQpCit7CisgICAgaWYgKCFzaG91bGRBbm5vdGF0ZSgpIHx8ICh0ZXh0LT5wYXJlbnRF
bGVtZW50KCkgJiYgdGV4dC0+cGFyZW50RWxlbWVudCgpLT50YWdRTmFtZSgpID09IHRleHRhcmVh
VGFnKSkgeworICAgICAgICBNYXJrdXBBY2N1bXVsYXRvcjo6YXBwZW5kVGV4dChvdXQsIHRleHQp
OwogICAgICAgICByZXR1cm47CiAgICAgfQogCkBAIC01MDksMTggKzU1OSwyNyBAQCB2b2lkIE1h
cmt1cEFjY3VtdWxhdG9yOjphcHBlbmRQcm9jZXNzaW5nCiAgICAgYXBwZW5kKG91dCwgIj8+Iik7
CiB9CiAKLXZvaWQgTWFya3VwQWNjdW11bGF0b3I6OnJlbW92ZUV4dGVyaW9yU3R5bGVzKENTU011
dGFibGVTdHlsZURlY2xhcmF0aW9uKiBzdHlsZSkKK3ZvaWQgU3R5bGVkTWFya3VwQWNjdW11bGF0
b3I6OnJlbW92ZUV4dGVyaW9yU3R5bGVzKENTU011dGFibGVTdHlsZURlY2xhcmF0aW9uKiBzdHls
ZSkKIHsKICAgICBzdHlsZS0+cmVtb3ZlUHJvcGVydHkoQ1NTUHJvcGVydHlGbG9hdCk7CiB9CiAK
LXZvaWQgTWFya3VwQWNjdW11bGF0b3I6OmFwcGVuZEVsZW1lbnQoVmVjdG9yPFVDaGFyPiYgb3V0
LCBFbGVtZW50KiBlbGVtZW50LCBib29sIGFkZERpc3BsYXlJbmxpbmUsIE5hbWVzcGFjZXMqIG5h
bWVzcGFjZXMsIFJhbmdlRnVsbHlTZWxlY3RzTm9kZSByYW5nZUZ1bGx5U2VsZWN0c05vZGUpCit2
b2lkIE1hcmt1cEFjY3VtdWxhdG9yOjphcHBlbmRFbGVtZW50KFZlY3RvcjxVQ2hhcj4mIG91dCwg
RWxlbWVudCogZWxlbWVudCwgTmFtZXNwYWNlcyogbmFtZXNwYWNlcykKK3sKKyAgICBhcHBlbmRP
cGVuVGFnKG91dCwgZWxlbWVudCwgbmFtZXNwYWNlcyk7CisKKyAgICBOYW1lZE5vZGVNYXAqIGF0
dHJpYnV0ZXMgPSBlbGVtZW50LT5hdHRyaWJ1dGVzKCk7CisgICAgdW5zaWduZWQgbGVuZ3RoID0g
YXR0cmlidXRlcy0+bGVuZ3RoKCk7CisgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBs
ZW5ndGg7IGkrKykKKyAgICAgICAgYXBwZW5kQXR0cmlidXRlKG91dCwgZWxlbWVudCwgKmF0dHJp
YnV0ZXMtPmF0dHJpYnV0ZUl0ZW0oaSksIG5hbWVzcGFjZXMpOworCisgICAgYXBwZW5kQ2xvc2VU
YWcob3V0LCBlbGVtZW50KTsKK30KKwordm9pZCBTdHlsZWRNYXJrdXBBY2N1bXVsYXRvcjo6YXBw
ZW5kRWxlbWVudChWZWN0b3I8VUNoYXI+JiBvdXQsIEVsZW1lbnQqIGVsZW1lbnQsIGJvb2wgYWRk
RGlzcGxheUlubGluZSwgUmFuZ2VGdWxseVNlbGVjdHNOb2RlIHJhbmdlRnVsbHlTZWxlY3RzTm9k
ZSkKIHsKICAgICBib29sIGRvY3VtZW50SXNIVE1MID0gZWxlbWVudC0+ZG9jdW1lbnQoKS0+aXNI
VE1MRG9jdW1lbnQoKTsKLSAgICBvdXQuYXBwZW5kKCc8Jyk7Ci0gICAgYXBwZW5kKG91dCwgZWxl
bWVudC0+bm9kZU5hbWVQcmVzZXJ2aW5nQ2FzZSgpKTsKLSAgICBpZiAoIWRvY3VtZW50SXNIVE1M
ICYmIG5hbWVzcGFjZXMgJiYgc2hvdWxkQWRkTmFtZXNwYWNlRWxlbWVudChlbGVtZW50KSkKLSAg
ICAgICAgYXBwZW5kTmFtZXNwYWNlKG91dCwgZWxlbWVudC0+cHJlZml4KCksIGVsZW1lbnQtPm5h
bWVzcGFjZVVSSSgpLCAqbmFtZXNwYWNlcyk7CisgICAgYXBwZW5kT3BlblRhZyhvdXQsIGVsZW1l
bnQsIDApOwogCiAgICAgTmFtZWROb2RlTWFwKiBhdHRyaWJ1dGVzID0gZWxlbWVudC0+YXR0cmli
dXRlcygpOwogICAgIHVuc2lnbmVkIGxlbmd0aCA9IGF0dHJpYnV0ZXMtPmxlbmd0aCgpOwpAQCAt
NTI5LDMwICs1ODgsNyBAQCB2b2lkIE1hcmt1cEFjY3VtdWxhdG9yOjphcHBlbmRFbGVtZW50KFZl
CiAgICAgICAgIC8vIFdlJ2xsIGhhbmRsZSB0aGUgc3R5bGUgYXR0cmlidXRlIHNlcGFyYXRlbHks
IGJlbG93LgogICAgICAgICBpZiAoYXR0cmlidXRlLT5uYW1lKCkgPT0gc3R5bGVBdHRyICYmIGVs
ZW1lbnQtPmlzSFRNTEVsZW1lbnQoKSAmJiAoc2hvdWxkQW5ub3RhdGUoKSB8fCBhZGREaXNwbGF5
SW5saW5lKSkKICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBvdXQuYXBwZW5kKCcgJyk7
Ci0gICAgICAgIAotICAgICAgICBpZiAoZG9jdW1lbnRJc0hUTUwpCi0gICAgICAgICAgICBhcHBl
bmQob3V0LCBhdHRyaWJ1dGUtPm5hbWUoKS5sb2NhbE5hbWUoKSk7Ci0gICAgICAgIGVsc2UKLSAg
ICAgICAgICAgIGFwcGVuZChvdXQsIGF0dHJpYnV0ZS0+bmFtZSgpLnRvU3RyaW5nKCkpOwotCi0g
ICAgICAgIG91dC5hcHBlbmQoJz0nKTsKLQotICAgICAgICBpZiAoZWxlbWVudC0+aXNVUkxBdHRy
aWJ1dGUoYXR0cmlidXRlKSkgewotICAgICAgICAgICAgLy8gV2UgZG9uJ3Qgd2FudCB0byBjb21w
bGV0ZSBmaWxlOi8vLyBVUkxzIGJlY2F1c2UgaXQgbWF5IGNvbnRhaW4gc2Vuc2l0aXZlIGluZm9y
bWF0aW9uCi0gICAgICAgICAgICAvLyBhYm91dCB0aGUgdXNlcidzIHN5c3RlbS4KLSAgICAgICAg
ICAgIGlmIChzaG91bGRSZXNvbHZlVVJMcygpICYmICFlbGVtZW50LT5kb2N1bWVudCgpLT51cmwo
KS5pc0xvY2FsRmlsZSgpKQotICAgICAgICAgICAgICAgIGFwcGVuZFF1b3RlZFVSTEF0dHJpYnV0
ZVZhbHVlKG91dCwgZWxlbWVudC0+ZG9jdW1lbnQoKS0+Y29tcGxldGVVUkwoYXR0cmlidXRlLT52
YWx1ZSgpKS5zdHJpbmcoKSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgYXBw
ZW5kUXVvdGVkVVJMQXR0cmlidXRlVmFsdWUob3V0LCBhdHRyaWJ1dGUtPnZhbHVlKCkuc3RyaW5n
KCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgb3V0LmFwcGVuZCgnXCInKTsKLSAg
ICAgICAgICAgIGFwcGVuZEF0dHJpYnV0ZVZhbHVlKG91dCwgYXR0cmlidXRlLT52YWx1ZSgpLCBk
b2N1bWVudElzSFRNTCk7Ci0gICAgICAgICAgICBvdXQuYXBwZW5kKCdcIicpOwotICAgICAgICB9
Ci0KLSAgICAgICAgaWYgKCFkb2N1bWVudElzSFRNTCAmJiBuYW1lc3BhY2VzICYmIHNob3VsZEFk
ZE5hbWVzcGFjZUF0dHJpYnV0ZShhdHRyaWJ1dGUsICpuYW1lc3BhY2VzKSkKLSAgICAgICAgICAg
IGFwcGVuZE5hbWVzcGFjZShvdXQsIGF0dHJpYnV0ZS0+cHJlZml4KCksIGF0dHJpYnV0ZS0+bmFt
ZXNwYWNlVVJJKCksICpuYW1lc3BhY2VzKTsKKyAgICAgICAgYXBwZW5kQXR0cmlidXRlKG91dCwg
ZWxlbWVudCwgKmF0dHJpYnV0ZSwgMCk7CiAgICAgfQogCiAgICAgaWYgKGVsZW1lbnQtPmlzSFRN
TEVsZW1lbnQoKSAmJiAoc2hvdWxkQW5ub3RhdGUoKSB8fCBhZGREaXNwbGF5SW5saW5lKSkgewpA
QCAtNTk3LDYgKzYzMywxOSBAQCB2b2lkIE1hcmt1cEFjY3VtdWxhdG9yOjphcHBlbmRFbGVtZW50
KFZlCiAgICAgICAgIH0KICAgICB9CiAKKyAgICBhcHBlbmRDbG9zZVRhZyhvdXQsIGVsZW1lbnQp
OworfQorICAgIAordm9pZCBNYXJrdXBBY2N1bXVsYXRvcjo6YXBwZW5kT3BlblRhZyhWZWN0b3I8
VUNoYXI+JiBvdXQsIEVsZW1lbnQqIGVsZW1lbnQsIE5hbWVzcGFjZXMqIG5hbWVzcGFjZXMpCit7
CisgICAgb3V0LmFwcGVuZCgnPCcpOworICAgIGFwcGVuZChvdXQsIGVsZW1lbnQtPm5vZGVOYW1l
UHJlc2VydmluZ0Nhc2UoKSk7CisgICAgaWYgKCFlbGVtZW50LT5kb2N1bWVudCgpLT5pc0hUTUxE
b2N1bWVudCgpICYmIG5hbWVzcGFjZXMgJiYgc2hvdWxkQWRkTmFtZXNwYWNlRWxlbWVudChlbGVt
ZW50KSkKKyAgICAgICAgYXBwZW5kTmFtZXNwYWNlKG91dCwgZWxlbWVudC0+cHJlZml4KCksIGVs
ZW1lbnQtPm5hbWVzcGFjZVVSSSgpLCAqbmFtZXNwYWNlcyk7ICAgIAorfQorCit2b2lkIE1hcmt1
cEFjY3VtdWxhdG9yOjphcHBlbmRDbG9zZVRhZyhWZWN0b3I8VUNoYXI+JiBvdXQsIEVsZW1lbnQq
IGVsZW1lbnQpCit7CiAgICAgaWYgKHNob3VsZFNlbGZDbG9zZShlbGVtZW50KSkgewogICAgICAg
ICBpZiAoZWxlbWVudC0+aXNIVE1MRWxlbWVudCgpKQogICAgICAgICAgICAgb3V0LmFwcGVuZCgn
ICcpOyAvLyBYSFRNTCAxLjAgPC0+IEhUTUwgY29tcGF0aWJpbGl0eS4KQEAgLTYwNSw2ICs2NTQs
MzYgQEAgdm9pZCBNYXJrdXBBY2N1bXVsYXRvcjo6YXBwZW5kRWxlbWVudChWZQogICAgIG91dC5h
cHBlbmQoJz4nKTsKIH0KIAordm9pZCBNYXJrdXBBY2N1bXVsYXRvcjo6YXBwZW5kQXR0cmlidXRl
KFZlY3RvcjxVQ2hhcj4mIG91dCwgRWxlbWVudCogZWxlbWVudCwgY29uc3QgQXR0cmlidXRlJiBh
dHRyaWJ1dGUsIE5hbWVzcGFjZXMqIG5hbWVzcGFjZXMpCit7CisgICAgYm9vbCBkb2N1bWVudElz
SFRNTCA9IGVsZW1lbnQtPmRvY3VtZW50KCktPmlzSFRNTERvY3VtZW50KCk7CisKKyAgICBvdXQu
YXBwZW5kKCcgJyk7CisKKyAgICBpZiAoZG9jdW1lbnRJc0hUTUwpCisgICAgICAgIGFwcGVuZChv
dXQsIGF0dHJpYnV0ZS5uYW1lKCkubG9jYWxOYW1lKCkpOworICAgIGVsc2UKKyAgICAgICAgYXBw
ZW5kKG91dCwgYXR0cmlidXRlLm5hbWUoKS50b1N0cmluZygpKTsKKworICAgIG91dC5hcHBlbmQo
Jz0nKTsKKworICAgIGlmIChlbGVtZW50LT5pc1VSTEF0dHJpYnV0ZShjb25zdF9jYXN0PEF0dHJp
YnV0ZSo+KCZhdHRyaWJ1dGUpKSkgeworICAgICAgICAvLyBXZSBkb24ndCB3YW50IHRvIGNvbXBs
ZXRlIGZpbGU6Ly8vIFVSTHMgYmVjYXVzZSBpdCBtYXkgY29udGFpbiBzZW5zaXRpdmUgaW5mb3Jt
YXRpb24KKyAgICAgICAgLy8gYWJvdXQgdGhlIHVzZXIncyBzeXN0ZW0uCisgICAgICAgIGlmIChz
aG91bGRSZXNvbHZlVVJMcygpICYmICFlbGVtZW50LT5kb2N1bWVudCgpLT51cmwoKS5pc0xvY2Fs
RmlsZSgpKQorICAgICAgICAgICAgYXBwZW5kUXVvdGVkVVJMQXR0cmlidXRlVmFsdWUob3V0LCBl
bGVtZW50LT5kb2N1bWVudCgpLT5jb21wbGV0ZVVSTChhdHRyaWJ1dGUudmFsdWUoKSkuc3RyaW5n
KCkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBhcHBlbmRRdW90ZWRVUkxBdHRyaWJ1dGVW
YWx1ZShvdXQsIGF0dHJpYnV0ZS52YWx1ZSgpKTsgCisgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0
LmFwcGVuZCgnXCInKTsKKyAgICAgICAgYXBwZW5kQXR0cmlidXRlVmFsdWUob3V0LCBhdHRyaWJ1
dGUudmFsdWUoKSwgZG9jdW1lbnRJc0hUTUwpOworICAgICAgICBvdXQuYXBwZW5kKCdcIicpOwor
ICAgIH0KKworICAgIGlmICghZG9jdW1lbnRJc0hUTUwgJiYgbmFtZXNwYWNlcyAmJiBzaG91bGRB
ZGROYW1lc3BhY2VBdHRyaWJ1dGUoYXR0cmlidXRlLCAqbmFtZXNwYWNlcykpCisgICAgICAgIGFw
cGVuZE5hbWVzcGFjZShvdXQsIGF0dHJpYnV0ZS5wcmVmaXgoKSwgYXR0cmlidXRlLm5hbWVzcGFj
ZVVSSSgpLCAqbmFtZXNwYWNlcyk7Cit9CisKIHZvaWQgTWFya3VwQWNjdW11bGF0b3I6OmFwcGVu
ZENEQVRBU2VjdGlvbihWZWN0b3I8VUNoYXI+JiBvdXQsIGNvbnN0IFN0cmluZyYgc2VjdGlvbikK
IHsKICAgICAvLyBGSVhNRTogQ0RBVEEgY29udGVudCBpcyBub3QgZXNjYXBlZCwgYnV0IFhNTFNl
cmlhbGl6ZXIgKGFuZCBwb3NzaWJseSBvdGhlciBjYWxsZXJzKSBzaG91bGQgcmFpc2UgYW4gZXhj
ZXB0aW9uIGlmIGl0IGluY2x1ZGVzICJdXT4iLgpAQCAtNjEzLDcgKzY5Miw3IEBAIHZvaWQgTWFy
a3VwQWNjdW11bGF0b3I6OmFwcGVuZENEQVRBU2VjdGkKICAgICBhcHBlbmQob3V0LCAiXV0+Iik7
CiB9CiAKLXZvaWQgTWFya3VwQWNjdW11bGF0b3I6OmFwcGVuZFN0YXJ0TWFya3VwKFZlY3RvcjxV
Q2hhcj4mIHJlc3VsdCwgY29uc3QgTm9kZSogbm9kZSwgYm9vbCBjb252ZXJ0QmxvY2tzVG9Jbmxp
bmVzLCBOYW1lc3BhY2VzKiBuYW1lc3BhY2VzLCBSYW5nZUZ1bGx5U2VsZWN0c05vZGUgcmFuZ2VG
dWxseVNlbGVjdHNOb2RlKQordm9pZCBNYXJrdXBBY2N1bXVsYXRvcjo6YXBwZW5kU3RhcnRNYXJr
dXAoVmVjdG9yPFVDaGFyPiYgcmVzdWx0LCBjb25zdCBOb2RlKiBub2RlLCBOYW1lc3BhY2VzKiBu
YW1lc3BhY2VzKQogewogICAgIGlmIChuYW1lc3BhY2VzKQogICAgICAgICBuYW1lc3BhY2VzLT5j
aGVja0NvbnNpc3RlbmN5KCk7CkBAIC02MzUsNyArNzE0LDcgQEAgdm9pZCBNYXJrdXBBY2N1bXVs
YXRvcjo6YXBwZW5kU3RhcnRNYXJrdQogICAgICAgICBhcHBlbmRQcm9jZXNzaW5nSW5zdHJ1Y3Rp
b24ocmVzdWx0LCBzdGF0aWNfY2FzdDxjb25zdCBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24qPihub2Rl
KS0+dGFyZ2V0KCksIHN0YXRpY19jYXN0PGNvbnN0IFByb2Nlc3NpbmdJbnN0cnVjdGlvbio+KG5v
ZGUpLT5kYXRhKCkpOwogICAgICAgICBicmVhazsKICAgICBjYXNlIE5vZGU6OkVMRU1FTlRfTk9E
RToKLSAgICAgICAgYXBwZW5kRWxlbWVudChyZXN1bHQsIHN0YXRpY19jYXN0PEVsZW1lbnQqPihj
b25zdF9jYXN0PE5vZGUqPihub2RlKSksIGNvbnZlcnRCbG9ja3NUb0lubGluZXMgJiYgaXNCbG9j
ayhjb25zdF9jYXN0PE5vZGUqPihub2RlKSksIG5hbWVzcGFjZXMsIHJhbmdlRnVsbHlTZWxlY3Rz
Tm9kZSk7CisgICAgICAgIGFwcGVuZEVsZW1lbnQocmVzdWx0LCBzdGF0aWNfY2FzdDxFbGVtZW50
Kj4oY29uc3RfY2FzdDxOb2RlKj4obm9kZSkpLCBuYW1lc3BhY2VzKTsKICAgICAgICAgYnJlYWs7
CiAgICAgY2FzZSBOb2RlOjpDREFUQV9TRUNUSU9OX05PREU6CiAgICAgICAgIGFwcGVuZENEQVRB
U2VjdGlvbihyZXN1bHQsIHN0YXRpY19jYXN0PGNvbnN0IENEQVRBU2VjdGlvbio+KG5vZGUpLT5k
YXRhKCkpOwpAQCAtNzg2LDcgKzg2NSw3IEBAIHN0YXRpYyBib29sIHNob3VsZEluY2x1ZGVXcmFw
cGVyRm9yRnVsbHkKICAgICByZXR1cm4gc3R5bGUtPmdldFByb3BlcnR5Q1NTVmFsdWUoQ1NTUHJv
cGVydHlCYWNrZ3JvdW5kSW1hZ2UpIHx8IHN0eWxlLT5nZXRQcm9wZXJ0eUNTU1ZhbHVlKENTU1By
b3BlcnR5QmFja2dyb3VuZENvbG9yKTsKIH0KIAotc3RhdGljIE5vZGUqIHNlcmlhbGl6ZU5vZGVz
KE1hcmt1cEFjY3VtdWxhdG9yJiBhY2N1bXVsYXRvciwgTm9kZSogc3RhcnROb2RlLCBOb2RlKiBw
YXN0RW5kKQorc3RhdGljIE5vZGUqIHNlcmlhbGl6ZU5vZGVzKFN0eWxlZE1hcmt1cEFjY3VtdWxh
dG9yJiBhY2N1bXVsYXRvciwgTm9kZSogc3RhcnROb2RlLCBOb2RlKiBwYXN0RW5kKQogewogICAg
IFZlY3RvcjxOb2RlKj4gYW5jZXN0b3JzVG9DbG9zZTsKICAgICBOb2RlKiBuZXh0OwpAQCAtODk2
LDcgKzk3NSw3IEBAIFN0cmluZyBjcmVhdGVNYXJrdXAoY29uc3QgUmFuZ2UqIHJhbmdlLCAKIAog
ICAgIGRvY3VtZW50LT51cGRhdGVMYXlvdXRJZ25vcmVQZW5kaW5nU3R5bGVzaGVldHMoKTsKIAot
ICAgIE1hcmt1cEFjY3VtdWxhdG9yIGFjY3VtdWxhdG9yKG5vZGVzLCBzaG91bGRSZXNvbHZlVVJM
cywgc2hvdWxkQW5ub3RhdGUsIHVwZGF0ZWRSYW5nZS5nZXQoKSk7CisgICAgU3R5bGVkTWFya3Vw
QWNjdW11bGF0b3IgYWNjdW11bGF0b3Iobm9kZXMsIHNob3VsZFJlc29sdmVVUkxzLCBzaG91bGRB
bm5vdGF0ZSwgdXBkYXRlZFJhbmdlLmdldCgpKTsKICAgICBOb2RlKiBwYXN0RW5kID0gdXBkYXRl
ZFJhbmdlLT5wYXN0TGFzdE5vZGUoKTsKIAogICAgIE5vZGUqIHN0YXJ0Tm9kZSA9IHVwZGF0ZWRS
YW5nZS0+Zmlyc3ROb2RlKCk7CkBAIC05OTQsNyArMTA3Myw3IEBAIFN0cmluZyBjcmVhdGVNYXJr
dXAoY29uc3QgUmFuZ2UqIHJhbmdlLCAKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAg
ICAgICAgLy8gU2luY2UgdGhpcyBub2RlIGFuZCBhbGwgdGhlIG90aGVyIGFuY2VzdG9ycyBhcmUg
bm90IGluIHRoZSBzZWxlY3Rpb24gd2Ugd2FudCB0byBzZXQgUmFuZ2VGdWxseVNlbGVjdHNOb2Rl
IHRvIERvZXNOb3RGdWxseVNlbGVjdE5vZGUKICAgICAgICAgICAgICAgICAvLyBzbyB0aGF0IHN0
eWxlcyB0aGF0IGFmZmVjdCB0aGUgZXh0ZXJpb3Igb2YgdGhlIG5vZGUgYXJlIG5vdCBpbmNsdWRl
ZC4KLSAgICAgICAgICAgICAgICBhY2N1bXVsYXRvci53cmFwV2l0aE5vZGUoYW5jZXN0b3IsIGNv
bnZlcnRCbG9ja3NUb0lubGluZXMsIE1hcmt1cEFjY3VtdWxhdG9yOjpEb2VzTm90RnVsbHlTZWxl
Y3ROb2RlKTsKKyAgICAgICAgICAgICAgICBhY2N1bXVsYXRvci53cmFwV2l0aE5vZGUoYW5jZXN0
b3IsIGNvbnZlcnRCbG9ja3NUb0lubGluZXMsIFN0eWxlZE1hcmt1cEFjY3VtdWxhdG9yOjpEb2Vz
Tm90RnVsbHlTZWxlY3ROb2RlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChub2Rl
cykKICAgICAgICAgICAgICAgICBub2Rlcy0+YXBwZW5kKGFuY2VzdG9yKTsKQEAgLTEwOTcsNyAr
MTE3Niw3IEBAIFN0cmluZyBjcmVhdGVNYXJrdXAoY29uc3QgTm9kZSogbm9kZSwgRUMKICAgICAg
ICAgICAgIHJldHVybiAiIjsKICAgICB9CiAKLSAgICBNYXJrdXBBY2N1bXVsYXRvciBhY2N1bXVs
YXRvcihub2Rlcywgc2hvdWxkUmVzb2x2ZVVSTHMsIERvTm90QW5ub3RhdGVGb3JJbnRlcmNoYW5n
ZSk7CisgICAgTWFya3VwQWNjdW11bGF0b3IgYWNjdW11bGF0b3Iobm9kZXMsIHNob3VsZFJlc29s
dmVVUkxzKTsKICAgICBzZXJpYWxpemVOb2Rlc1dpdGhOYW1lc3BhY2VzKGFjY3VtdWxhdG9yLCBj
b25zdF9jYXN0PE5vZGUqPihub2RlKSwgZGVsZXRlQnV0dG9uQ29udGFpbmVyRWxlbWVudCwgY2hp
bGRyZW5Pbmx5LCAwKTsKICAgICByZXR1cm4gYWNjdW11bGF0b3IudGFrZVJlc3VsdHMoKTsKIH0K
</data>
<flag name="review"
          id="54760"
          type_id="1"
          status="+"
          setter="tony"
    />
          </attachment>
      

    </bug>

</bugzilla>