<?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>94048</bug_id>
          
          <creation_ts>2012-08-14 17:03:17 -0700</creation_ts>
          <short_desc>SVGPathSegList has O(n) append!</short_desc>
          <delta_ts>2012-09-23 19:10:42 -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>SVG</component>
          <version>528+ (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></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Philip Rogers">pdr</reporter>
          <assigned_to name="Philip Rogers">pdr</assigned_to>
          <cc>enjalot</cc>
    
    <cc>fmalita</cc>
    
    <cc>krit</cc>
    
    <cc>stephen.bannasch</cc>
    
    <cc>tomhudson</cc>
    
    <cc>webkit.review.bot</cc>
    
    <cc>zimmermann</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>695562</commentid>
    <comment_count>0</comment_count>
    <who name="Philip Rogers">pdr</who>
    <bug_when>2012-08-14 17:03:17 -0700</bug_when>
    <thetext>Original bug: crbug.com/142675

PathSegList has O(n) append! Looks like every time appendItem is called we throw away the whole path and re-create it. This causes us to be really poor at the SVG path list benchmark: http://bl.ocks.org/1296930</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>695923</commentid>
    <comment_count>1</comment_count>
    <who name="Tom Hudson">tomhudson</who>
    <bug_when>2012-08-15 05:31:15 -0700</bug_when>
    <thetext>I assume that you&apos;re looking at the expandCapacity(size()+1, ...) in appendSlowCase(); doesn&apos;t it percolate down to 

reserveCapacity(max(newMinCapacity, max(static_cast&lt;size_t&gt;(16), capacity() + capacity() / 4 + 1)))

which at least tries to grow by 25% each time?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>696005</commentid>
    <comment_count>2</comment_count>
    <who name="Florin Malita">fmalita</who>
    <bug_when>2012-08-15 07:55:37 -0700</bug_when>
    <thetext>(In reply to comment #1)
&gt; I assume that you&apos;re looking at the expandCapacity(size()+1, ...) in appendSlowCase(); doesn&apos;t it percolate down to 
&gt; 
&gt; reserveCapacity(max(newMinCapacity, max(static_cast&lt;size_t&gt;(16), capacity() + capacity() / 4 + 1)))
&gt; 
&gt; which at least tries to grow by 25% each time?

It&apos;s actually the way dynamic updates to the segment list are handled: SVGPathElement::pathSegListChanged() calls buildSVGPathByteStreamFromSVGPathSegList() which in turn just throws away the current result and rebuilds it -

bool buildSVGPathByteStreamFromSVGPathSegList(const SVGPathSegList&amp; list, SVGPathByteStream* result, PathParsingMode parsingMode)
{
    ASSERT(result);
    result-&gt;clear();
    if (list.isEmpty())
        return false;

    SVGPathByteStreamBuilder* builder = globalSVGPathByteStreamBuilder(result);

    OwnPtr&lt;SVGPathSegListSource&gt; source = SVGPathSegListSource::create(list);
    SVGPathParser* parser = globalSVGPathParser(source.get(), builder);
    bool ok = parser-&gt;parsePathDataFromSource(parsingMode);

So for each JS path.pathSegList.appendItem() call, the byte stream gets rebuilt from scratch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>696022</commentid>
    <comment_count>3</comment_count>
    <who name="Florin Malita">fmalita</who>
    <bug_when>2012-08-15 08:42:36 -0700</bug_when>
    <thetext>BTW, this also means that currently setting the path data in one go (using the &apos;d&apos; attribute) is a *lot* more efficient, as it avoids the problem above.

I&apos;ve run a  quick test with a modified benchmark, and using that method CR is roughly twice as fast as FF on my Linux box:


--- bench_orig.html	2012-08-15 11:25:19.521652393 -0400
+++ bench2.html	2012-08-15 11:34:06.524369474 -0400
@@ -84,7 +84,7 @@
         for (i=0; i &lt; num; i++) {
           xpos += (factor * Math.random() - factor_div_2) + (half_width  - xpos) * correction;
           ypos += (factor * Math.random() - factor_div_2) + (half_height - ypos) * correction;
-          path_seglist.appendItem(path.createSVGPathSegLinetoAbs(xpos, ypos));
+	  pdata += &apos; L &apos; + xpos + &apos; &apos; + ypos;
         }
       };
 
@@ -109,10 +109,12 @@
       var count = 0;
       var elapsed_time = 0;
       var sample_time, sample_start, sample_end;
+      var pdata = &apos;M &apos; + half_width + &apos; &apos; + half_height;
 
       function runSet() {
         sample_start = +new Date();
         addLineSegments(increment);
+        path.setAttribute(&apos;d&apos;, pdata);
         sample_end = +new Date();
         sample_time = sample_end-sample_start;
         elapsed_time += sample_time;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>696061</commentid>
    <comment_count>4</comment_count>
    <who name="Stephen Bannasch">stephen.bannasch</who>
    <bug_when>2012-08-15 09:30:00 -0700</bug_when>
    <thetext>The reason I wrote the SVG Path Benchmark http://bl.ocks.org/1296930 the way I did was because my original use case was to show fast dynamically updating lines graphs. 

The extremely slow performance using SVG in webkit-based browsers caused me to recode this feature by overlaying a 2D Canvas over the SVG.

Being able to quickly and efficiently extend and render existing Paths is important to me.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>696064</commentid>
    <comment_count>5</comment_count>
    <who name="Stephen Bannasch">stephen.bannasch</who>
    <bug_when>2012-08-15 09:34:04 -0700</bug_when>
    <thetext>Here&apos;s a google spreadsheet that compares performance drawing Paths in both Canvas and SVG on many different browsers and operating systems:

https://docs.google.com/a/concord.org/spreadsheet/ccc?key=0AtvlFoSBUC5kdEZJNVFySG9wSHZka0NsOTZDSkt3Nnc#gid=0</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>696069</commentid>
    <comment_count>6</comment_count>
    <who name="Florin Malita">fmalita</who>
    <bug_when>2012-08-15 09:40:52 -0700</bug_when>
    <thetext>(In reply to comment #4)
&gt; 
&gt; Being able to quickly and efficiently extend and render existing Paths is important to me.

Absolutely, no argument there - this will be addressed. I am just documenting a workaround that others may find useful, not saying that things work as intended :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>699228</commentid>
    <comment_count>7</comment_count>
    <who name="Philip Rogers">pdr</who>
    <bug_when>2012-08-19 22:22:25 -0700</bug_when>
    <thetext>Just a quick update: I put together a demo of a O(1) appendItem() but it&apos;s only a hack at the moment as I don&apos;t think it&apos;s possible to implement the rest of SVGPathSegList&apos;s methods (removeItem, replaceItem, or insertItemBefore) in any performant way on our current infrastructure because our internal path representation is a flattened bytestream. I&apos;m debating whether we should go forward with this approach, or restructure how we store paths internally.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>712501</commentid>
    <comment_count>8</comment_count>
      <attachid>162324</attachid>
    <who name="Philip Rogers">pdr</who>
    <bug_when>2012-09-05 13:52:27 -0700</bug_when>
    <thetext>Created attachment 162324
First pass</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>712540</commentid>
    <comment_count>9</comment_count>
      <attachid>162324</attachid>
    <who name="Dirk Schulze">krit</who>
    <bug_when>2012-09-05 14:30:25 -0700</bug_when>
    <thetext>Comment on attachment 162324
First pass

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

Needs a real review later. Just some comments and questions.

&gt; Source/WebCore/ChangeLog:9
&gt; +        to&amp;from an SVGPathSegList and a string representation of a path.

to and from   looks better.

&gt; Source/WebCore/ChangeLog:31
&gt; +        * svg/SVGPathByteStream.h:
&gt; +        (WebCore::SVGPathByteStream::append):
&gt; +        * svg/SVGPathElement.cpp:
&gt; +        (WebCore::SVGPathElement::pathSegListChanged):
&gt; +        * svg/SVGPathElement.h:
&gt; +        (SVGPathElement):
&gt; +        * svg/SVGPathParser.cpp:

Some inline comments can be helpful here.

&gt; Source/WebCore/svg/SVGPathByteStream.h:68
&gt; +    void append(SVGPathByteStream* other)
&gt; +    {
&gt; +        for (DataIterator it = other-&gt;begin(); it != other-&gt;end(); ++it)
&gt; +            append(*it);

Are you adding the other string at the end of the current string? why?

&gt; Source/WebCore/svg/SVGPathElement.cpp:336
&gt; +void SVGPathElement::pathSegListChanged(SVGPathSegRole role, ListModification listModification, unsigned affectedIndex)

usually I am not a fan of adding unused variables. In this case why do we have the unsigned? Second, you can also just omit the name, then you don&apos;t need the UNUSED_PARAM makro.

&gt; Source/WebCore/svg/SVGPathElement.cpp:345
&gt; +        if (listModification == ListModificationAppend) {

I see, you want to extend this later.

&gt; Source/WebCore/svg/SVGPathElement.h:96
&gt; +    void pathSegListChanged(SVGPathSegRole, ListModification, unsigned affectedIndex);

As far this is not a virtual function, so why do you introduce the variable if you don&apos;t use it? Add it in a later patch when you use it.

&gt; Source/WebCore/svg/SVGPathSegList.cpp:41
&gt; +void SVGPathSegList::commitChange(SVGElement* contextElement, ListModification listModification, unsigned affectedIndex)

Ditto. Remove the index for now.

&gt; LayoutTests/perf/svg-path-appenditem.html:17
&gt; +        path.pathSegList.appendItem(path.createSVGPathSegLinetoAbs(20, 20));

This is what I may not understood above, here you add just a new segment. Above you call the append method that adds another byte stream. Do you create a bytestream just for the one segment?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>712839</commentid>
    <comment_count>10</comment_count>
      <attachid>162406</attachid>
    <who name="Philip Rogers">pdr</who>
    <bug_when>2012-09-05 21:13:15 -0700</bug_when>
    <thetext>Created attachment 162406
Update per reviewer comments</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>712843</commentid>
    <comment_count>11</comment_count>
    <who name="Philip Rogers">pdr</who>
    <bug_when>2012-09-05 21:19:53 -0700</bug_when>
    <thetext>(In reply to comment #9)
Thanks for the quick review! I&apos;ve updated the patch to address your points and made the ChangeLog less bad with a better description and benchmark data.

I&apos;ve also started a meta-bug about the possibility of not using a byte stream and instead using a different data structure for our internal path representation (if we were to do that, the plumbing added in this patch would still be valid): https://bugs.webkit.org/show_bug.cgi?id=95909.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>715750</commentid>
    <comment_count>12</comment_count>
      <attachid>162406</attachid>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2012-09-09 23:51:02 -0700</bug_when>
    <thetext>Comment on attachment 162406
Update per reviewer comments

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

Indeed a new SVGPathByteStream has to be created, serialized from the to-be-appended SVGPathSeg. This is a good idea still, as appending two byte streams is cheaper, than what we do right now (rebuild).
I&apos;d r+ this as-is, but will wait for Dirk, if he has additional comments.

&gt; Source/WebCore/svg/properties/SVGListProperty.h:32
&gt; +    ListModificationUnknown = 0,

I don&apos;t think you need to specify = 0,  = 1, .. it&apos;s redundant.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>716707</commentid>
    <comment_count>13</comment_count>
    <who name="Dirk Schulze">krit</who>
    <bug_when>2012-09-10 17:09:19 -0700</bug_when>
    <thetext>My concerns are just that it fixes specific cases. We don&apos;t have a concept how we want to deal with it on excessive SVG DOM access in general. Especially for insert and other things. Please go ahead with the review, since I am a bit stock with SVG Open at the moment.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>718859</commentid>
    <comment_count>14</comment_count>
    <who name="Philip Rogers">pdr</who>
    <bug_when>2012-09-12 16:19:37 -0700</bug_when>
    <thetext>Friendly ping for a review :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>721645</commentid>
    <comment_count>15</comment_count>
    <who name="Philip Rogers">pdr</who>
    <bug_when>2012-09-16 17:27:24 -0700</bug_when>
    <thetext>@Dirk, do you have time to look at this?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>721754</commentid>
    <comment_count>16</comment_count>
      <attachid>162406</attachid>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2012-09-17 01:47:56 -0700</bug_when>
    <thetext>Comment on attachment 162406
Update per reviewer comments

Sorry phil, I forgot to login before submitting, two days ago :-( You should have mailed me in private, to remind me.. :-)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>721755</commentid>
    <comment_count>17</comment_count>
      <attachid>162406</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-09-17 01:55:42 -0700</bug_when>
    <thetext>Comment on attachment 162406
Update per reviewer comments

Clearing flags on attachment: 162406

Committed r128729: &lt;http://trac.webkit.org/changeset/128729&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>721756</commentid>
    <comment_count>18</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-09-17 01:55:45 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>721880</commentid>
    <comment_count>19</comment_count>
    <who name="Stephen Bannasch">stephen.bannasch</who>
    <bug_when>2012-09-17 06:47:33 -0700</bug_when>
    <thetext>Thanks a bunch Philip and reviewers!

How can I follow progress for whether, how, and when this change propagates into the the nightly-releases of WebKit-based browsers?

I expect this work to be folded into Chrome and Safari at some point but am not sure what I can track to monitor this progress.

Will this work also end up in webkit-based browsers on other systems?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>722039</commentid>
    <comment_count>20</comment_count>
    <who name="Philip Rogers">pdr</who>
    <bug_when>2012-09-17 10:43:09 -0700</bug_when>
    <thetext>Thanks Niko!

(In reply to comment #19)
&gt; Thanks a bunch Philip and reviewers!
&gt; 
&gt; How can I follow progress for whether, how, and when this change propagates into the the nightly-releases of WebKit-based browsers?
&gt; 
&gt; I expect this work to be folded into Chrome and Safari at some point but am not sure what I can track to monitor this progress.
&gt; 
&gt; Will this work also end up in webkit-based browsers on other systems?


The Chrome port releases very often and has 4 channels: canary (aka nightly), dev (chrome 23), beta (chrome 22), and stable (chrome 21). Every couple months the versions tick up one, so stable will be moving to Chrome 22 very soon. This patch is in canary right now if you want to test it, and the patch will likely be in dev channel in the next few days. You can watch the progress here: http://omahaproxy.appspot.com/viewer
base_webkit_revision is the version you&apos;re looking for, and this landed in webkit r128729

Safari releases a little slower, I think roughly once or twice a year.

Unfortunately I don&apos;t know about the iOS and Android browser release cycle :/</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>722132</commentid>
    <comment_count>21</comment_count>
    <who name="Stephen Bannasch">stephen.bannasch</who>
    <bug_when>2012-09-17 11:55:09 -0700</bug_when>
    <thetext>It&apos;s in Nightly Safari already.

The total elapsed time drawing 5000 line segments in this benchmark dropped from about 900ms to 9ms!  http://bl.ocks.org/1296930.

I have Chrome 23.0.1269.0 canary installed. It&apos;s not reporting any update available and the total elapsed time is still 871 ms.

Presumably the update will appear shortly.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>725136</commentid>
    <comment_count>22</comment_count>
    <who name="Stephen Bannasch">stephen.bannasch</who>
    <bug_when>2012-09-20 21:21:38 -0700</bug_when>
    <thetext>The Nightly version of Safari/Webkit now runs this SVG Path performance benchmark in just 8ms:

http://bl.ocks.org/1296930

While Chrome 24.0.1272.1 canary now takes 18ms.

I&apos;ve updated my google spreadsheet with these new results:

https://docs.google.com/a/concord.org/spreadsheet/ccc?key=0AtvlFoSBUC5kdEZJNVFySG9wSHZka0NsOTZDSkt3Nnc#gid=0</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>725141</commentid>
    <comment_count>23</comment_count>
    <who name="Stephen Bannasch">stephen.bannasch</who>
    <bug_when>2012-09-20 21:39:58 -0700</bug_when>
    <thetext>The just released Nightly Safari/Webkit (5.1.7 (6534.57.2, r129183)) now runs the benchmark in 25ms almost 3 times slower than it did just a day ago. This performance is still reasonably fast and is now somewhat slower than the equivalent Chrome release..</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>726335</commentid>
    <comment_count>24</comment_count>
    <who name="Philip Rogers">pdr</who>
    <bug_when>2012-09-23 19:10:42 -0700</bug_when>
    <thetext>(In reply to comment #23)
&gt; The just released Nightly Safari/Webkit (5.1.7 (6534.57.2, r129183)) now runs the benchmark in 25ms almost 3 times slower than it did just a day ago. This performance is still reasonably fast and is now somewhat slower than the equivalent Chrome release..

I think it&apos;s likely this is an edge case in the V8 &lt;-&gt; SVG code. I&apos;ve followed this bug to track it:
https://bugs.webkit.org/show_bug.cgi?id=97420

I did confirm that Chromium nightly and Safari nightly have this fix as the time is constant across runs, albeit slightly slower on Chromium.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>162324</attachid>
            <date>2012-09-05 13:52:27 -0700</date>
            <delta_ts>2012-09-05 21:13:15 -0700</delta_ts>
            <desc>First pass</desc>
            <filename>94048.1.patch</filename>
            <type>text/plain</type>
            <size>15423</size>
            <attacher name="Philip Rogers">pdr</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDEyNzYzOSkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDU3IEBACisyMDEyLTA5LTA1ICBQaGlsaXAg
Um9nZXJzICA8cGRyQGdvb2dsZS5jb20+CisKKyAgICAgICAgTWFrZSBTVkdQYXRoU2VnTGlzdC5h
cHBlbmQgTygxKSBpbnN0ZWFkIG9mIE8obikKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5v
cmcvc2hvd19idWcuY2dpP2lkPTk0MDQ4CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChP
T1BTISkuCisKKyAgICAgICAgUGF0aHMgYXJlIGJhY2tlZCBieSBhbiBTVkdQYXRoQnl0ZVN0cmVh
bSB3aGljaCBjYW4gYmUgY29udmVydGVkCisgICAgICAgIHRvJmZyb20gYW4gU1ZHUGF0aFNlZ0xp
c3QgYW5kIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgcGF0aC4KKyAgICAgICAgVGhpcyBk
YXRhc3RydWN0dXJlIGlzIG5vdCBvcHRpbWFsIGFuZCBiZWZvcmUgdGhpcyBwYXRjaCBhbGwKKyAg
ICAgICAgb3BlcmF0aW9ucyB3ZXJlIE8obik6IGFwcGVuZCwgcmVtb3ZlLCBpbnNlcnQsLi4uIGV2
ZW4gbW9kaWZ5LgorCisgICAgICAgIFRoaXMgcGF0Y2ggYWRkcyBzb21lIGJhc2ljIGluZnJhc3Ry
dWN0dXJlIChTVkdMaXN0UHJvcGVydHk6Okxpc3RNb2RpZmljYXRpb24pCisgICAgICAgIGZvciB0
cmFja2luZyB3aGF0IHR5cGVzIG9mIG9wZXJhdGlvbnMgYXJlIG1hZGUgb24gU1ZHTGlzdFByb3Bl
cnR5IHNvIHRoYXQKKyAgICAgICAgdGhlIFNWR1BhdGhTZWdMaXN0IC0+IFNWR1BhdGhCeXRlU3Ry
ZWFtIG9wZXJhdGlvbiBjYW4gYmUgc21hcnRlciBpbgorICAgICAgICB0aGUgZnV0dXJlIGluc3Rl
YWQgb2YgY29tcGxldGVseSByZWJ1aWxkaW5nIHRoZSBieXRlc3RyZWFtIG9uIGV2ZXJ5CisgICAg
ICAgIGNvbW1pdCgpLgorCisgICAgICAgIFRoaXMgcGF0Y2ggdGhlbiBidWlsZHMgb24gdGhpcyBp
bmZyYXN0cnVjdHVyZSB0byBtYWtlCisgICAgICAgIFNWR1BhdGhTZWdMaXN0LmFwcGVuZCBPKDEp
IGluc3RlYWQgb2YgTyhuKS4gVGhpcyBsb2dpYyBpcyBtb3N0bHkKKyAgICAgICAgY29udGFpbmVk
IGluIFNWR1BhdGhVdGlsaXRpZXM6OmFwcGVuZFNWR1BhdGhCeXRlU3RyZWFtRnJvbVNWR1BhdGhT
ZWcuCisKKyAgICAgICAgVGVzdDogcGVyZi9zdmctcGF0aC1hcHBlbmRpdGVtLmh0bWwKKworICAg
ICAgICAqIHN2Zy9TVkdQYXRoQnl0ZVN0cmVhbS5oOgorICAgICAgICAoV2ViQ29yZTo6U1ZHUGF0
aEJ5dGVTdHJlYW06OmFwcGVuZCk6CisgICAgICAgICogc3ZnL1NWR1BhdGhFbGVtZW50LmNwcDoK
KyAgICAgICAgKFdlYkNvcmU6OlNWR1BhdGhFbGVtZW50OjpwYXRoU2VnTGlzdENoYW5nZWQpOgor
ICAgICAgICAqIHN2Zy9TVkdQYXRoRWxlbWVudC5oOgorICAgICAgICAoU1ZHUGF0aEVsZW1lbnQp
OgorICAgICAgICAqIHN2Zy9TVkdQYXRoUGFyc2VyLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlNW
R1BhdGhQYXJzZXI6OnBhcnNlUGF0aERhdGFGcm9tU291cmNlKToKKyAgICAgICAgKiBzdmcvU1ZH
UGF0aFBhcnNlci5oOgorICAgICAgICAoU1ZHUGF0aFBhcnNlcik6CisgICAgICAgICogc3ZnL1NW
R1BhdGhTZWdMaXN0LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlNWR1BhdGhTZWdMaXN0Ojpjb21t
aXRDaGFuZ2UpOgorICAgICAgICAqIHN2Zy9TVkdQYXRoU2VnTGlzdC5oOgorICAgICAgICAoU1ZH
UGF0aFNlZ0xpc3QpOgorICAgICAgICAqIHN2Zy9TVkdQYXRoU2VnV2l0aENvbnRleHQuaDoKKyAg
ICAgICAgKFdlYkNvcmU6OlNWR1BhdGhTZWdXaXRoQ29udGV4dDo6Y29tbWl0Q2hhbmdlKToKKyAg
ICAgICAgKiBzdmcvU1ZHUGF0aFV0aWxpdGllcy5jcHA6CisgICAgICAgIChXZWJDb3JlOjphcHBl
bmRTVkdQYXRoQnl0ZVN0cmVhbUZyb21TVkdQYXRoU2VnKToKKyAgICAgICAgKFdlYkNvcmUpOgor
ICAgICAgICAqIHN2Zy9TVkdQYXRoVXRpbGl0aWVzLmg6CisgICAgICAgIChXZWJDb3JlKToKKyAg
ICAgICAgKiBzdmcvcHJvcGVydGllcy9TVkdMaXN0UHJvcGVydHkuaDoKKyAgICAgICAgKFdlYkNv
cmU6OlNWR0xpc3RQcm9wZXJ0eTo6YXBwZW5kSXRlbVZhbHVlcyk6CisgICAgICAgIChXZWJDb3Jl
OjpTVkdMaXN0UHJvcGVydHk6OmFwcGVuZEl0ZW1WYWx1ZXNBbmRXcmFwcGVycyk6CisgICAgICAg
IChXZWJDb3JlOjpTVkdMaXN0UHJvcGVydHk6OmNvbW1pdENoYW5nZSk6CisgICAgICAgIChTVkdM
aXN0UHJvcGVydHkpOgorICAgICAgICAqIHN2Zy9wcm9wZXJ0aWVzL1NWR1BhdGhTZWdMaXN0UHJv
cGVydHlUZWFyT2ZmLmg6CisgICAgICAgIChXZWJDb3JlOjpTVkdQYXRoU2VnTGlzdFByb3BlcnR5
VGVhck9mZjo6Y29tbWl0Q2hhbmdlKToKKyAgICAgICAgKFNWR1BhdGhTZWdMaXN0UHJvcGVydHlU
ZWFyT2ZmKToKKwogMjAxMi0wOS0wNSAgQmVuamFtaW4gUG91bGFpbiAgPGJwb3VsYWluQGFwcGxl
LmNvbT4KIAogICAgICAgICBNb3JlIGZpeGVzIGZvciBTdHJpbmc6Om9wZXJhdG9yKz0oKSBvbiBN
YWMKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3N2Zy9TVkdQYXRoQnl0ZVN0cmVhbS5oCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3N2Zy9TVkdQYXRoQnl0ZVN0cmVhbS5oCShyZXZpc2lvbiAx
Mjc2MDQpCisrKyBTb3VyY2UvV2ViQ29yZS9zdmcvU1ZHUGF0aEJ5dGVTdHJlYW0uaAkod29ya2lu
ZyBjb3B5KQpAQCAtNjIsNiArNjIsMTEgQEAgcHVibGljOgogICAgIERhdGFJdGVyYXRvciBiZWdp
bigpIHsgcmV0dXJuIG1fZGF0YS5iZWdpbigpOyB9CiAgICAgRGF0YUl0ZXJhdG9yIGVuZCgpIHsg
cmV0dXJuIG1fZGF0YS5lbmQoKTsgfQogICAgIHZvaWQgYXBwZW5kKHVuc2lnbmVkIGNoYXIgYnl0
ZSkgeyBtX2RhdGEuYXBwZW5kKGJ5dGUpOyB9CisgICAgdm9pZCBhcHBlbmQoU1ZHUGF0aEJ5dGVT
dHJlYW0qIG90aGVyKQorICAgIHsKKyAgICAgICAgZm9yIChEYXRhSXRlcmF0b3IgaXQgPSBvdGhl
ci0+YmVnaW4oKTsgaXQgIT0gb3RoZXItPmVuZCgpOyArK2l0KQorICAgICAgICAgICAgYXBwZW5k
KCppdCk7CisgICAgfQogICAgIHZvaWQgY2xlYXIoKSB7IG1fZGF0YS5jbGVhcigpOyB9CiAgICAg
Ym9vbCBpc0VtcHR5KCkgY29uc3QgeyByZXR1cm4gIW1fZGF0YS5zaXplKCk7IH0KICAgICB1bnNp
Z25lZCBzaXplKCkgY29uc3QgeyByZXR1cm4gbV9kYXRhLnNpemUoKTsgfQpJbmRleDogU291cmNl
L1dlYkNvcmUvc3ZnL1NWR1BhdGhFbGVtZW50LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9zdmcvU1ZHUGF0aEVsZW1lbnQuY3BwCShyZXZpc2lvbiAxMjc2MDQpCisrKyBTb3VyY2Uv
V2ViQ29yZS9zdmcvU1ZHUGF0aEVsZW1lbnQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMzMsMTQg
KzMzMywyMCBAQCBTVkdQYXRoU2VnTGlzdFByb3BlcnR5VGVhck9mZiogU1ZHUGF0aEVsCiAgICAg
cmV0dXJuIDA7CiB9CiAKLXZvaWQgU1ZHUGF0aEVsZW1lbnQ6OnBhdGhTZWdMaXN0Q2hhbmdlZChT
VkdQYXRoU2VnUm9sZSByb2xlKQordm9pZCBTVkdQYXRoRWxlbWVudDo6cGF0aFNlZ0xpc3RDaGFu
Z2VkKFNWR1BhdGhTZWdSb2xlIHJvbGUsIExpc3RNb2RpZmljYXRpb24gbGlzdE1vZGlmaWNhdGlv
biwgdW5zaWduZWQgYWZmZWN0ZWRJbmRleCkKIHsKKyAgICBVTlVTRURfUEFSQU0oYWZmZWN0ZWRJ
bmRleCk7CisKICAgICBzd2l0Y2ggKHJvbGUpIHsKICAgICBjYXNlIFBhdGhTZWdOb3JtYWxpemVk
Um9sZToKICAgICAgICAgLy8gRklYTUU6IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVn
LmNnaT9pZD0xNTQxMiAtIEltcGxlbWVudCBub3JtYWxpemVkIHBhdGggc2VnbWVudCBsaXN0cyEK
ICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBQYXRoU2VnVW5hbHRlcmVkUm9sZToKLSAgICAgICAg
YnVpbGRTVkdQYXRoQnl0ZVN0cmVhbUZyb21TVkdQYXRoU2VnTGlzdChtX3BhdGhTZWdMaXN0LnZh
bHVlLCBtX3BhdGhCeXRlU3RyZWFtLmdldCgpLCBVbmFsdGVyZWRQYXJzaW5nKTsKKyAgICAgICAg
aWYgKGxpc3RNb2RpZmljYXRpb24gPT0gTGlzdE1vZGlmaWNhdGlvbkFwcGVuZCkgeworICAgICAg
ICAgICAgQVNTRVJUKCFtX3BhdGhTZWdMaXN0LnZhbHVlLmlzRW1wdHkoKSk7CisgICAgICAgICAg
ICBhcHBlbmRTVkdQYXRoQnl0ZVN0cmVhbUZyb21TVkdQYXRoU2VnKG1fcGF0aFNlZ0xpc3QudmFs
dWUubGFzdCgpLCBtX3BhdGhCeXRlU3RyZWFtLmdldCgpLCBVbmFsdGVyZWRQYXJzaW5nKTsKKyAg
ICAgICAgfSBlbHNlCisgICAgICAgICAgICBidWlsZFNWR1BhdGhCeXRlU3RyZWFtRnJvbVNWR1Bh
dGhTZWdMaXN0KG1fcGF0aFNlZ0xpc3QudmFsdWUsIG1fcGF0aEJ5dGVTdHJlYW0uZ2V0KCksIFVu
YWx0ZXJlZFBhcnNpbmcpOwogICAgICAgICBicmVhazsKICAgICBjYXNlIFBhdGhTZWdVbmRlZmlu
ZWRSb2xlOgogICAgICAgICByZXR1cm47CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9zdmcvU1ZHUGF0
aEVsZW1lbnQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9zdmcvU1ZHUGF0aEVsZW1l
bnQuaAkocmV2aXNpb24gMTI3NjA0KQorKysgU291cmNlL1dlYkNvcmUvc3ZnL1NWR1BhdGhFbGVt
ZW50LmgJKHdvcmtpbmcgY29weSkKQEAgLTkzLDcgKzkzLDcgQEAgcHVibGljOgogCiAgICAgU1ZH
UGF0aEJ5dGVTdHJlYW0qIHBhdGhCeXRlU3RyZWFtKCkgY29uc3Q7CiAKLSAgICB2b2lkIHBhdGhT
ZWdMaXN0Q2hhbmdlZChTVkdQYXRoU2VnUm9sZSk7CisgICAgdm9pZCBwYXRoU2VnTGlzdENoYW5n
ZWQoU1ZHUGF0aFNlZ1JvbGUsIExpc3RNb2RpZmljYXRpb24sIHVuc2lnbmVkIGFmZmVjdGVkSW5k
ZXgpOwogCiAgICAgdmlydHVhbCBGbG9hdFJlY3QgZ2V0QkJveChTdHlsZVVwZGF0ZVN0cmF0ZWd5
ID0gQWxsb3dTdHlsZVVwZGF0ZSk7CiAKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3N2Zy9TVkdQYXRo
UGFyc2VyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9zdmcvU1ZHUGF0aFBhcnNl
ci5jcHAJKHJldmlzaW9uIDEyNzYwNCkKKysrIFNvdXJjZS9XZWJDb3JlL3N2Zy9TVkdQYXRoUGFy
c2VyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjgyLDcgKzI4Miw3IEBAIGJvb2wgU1ZHUGF0aFBh
cnNlcjo6cGFyc2VBcmNUb1NlZ21lbnQoKQogICAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIFNW
R1BhdGhQYXJzZXI6OnBhcnNlUGF0aERhdGFGcm9tU291cmNlKFBhdGhQYXJzaW5nTW9kZSBwYXRo
UGFyc2luZ01vZGUpCitib29sIFNWR1BhdGhQYXJzZXI6OnBhcnNlUGF0aERhdGFGcm9tU291cmNl
KFBhdGhQYXJzaW5nTW9kZSBwYXRoUGFyc2luZ01vZGUsIGJvb2wgY2hlY2tGb3JJbml0aWFsTW92
ZVRvKQogewogICAgIEFTU0VSVChtX3NvdXJjZSk7CiAgICAgQVNTRVJUKG1fY29uc3VtZXIpOwpA
QCAtMzAzLDcgKzMwMyw3IEBAIGJvb2wgU1ZHUGF0aFBhcnNlcjo6cGFyc2VQYXRoRGF0YUZyb21T
b3UKICAgICBtX2xhc3RDb21tYW5kID0gUGF0aFNlZ1Vua25vd247CiAKICAgICAvLyBQYXRoIG11
c3Qgc3RhcnQgd2l0aCBtb3ZldG8uCi0gICAgaWYgKGNvbW1hbmQgIT0gUGF0aFNlZ01vdmVUb0Fi
cyAmJiBjb21tYW5kICE9IFBhdGhTZWdNb3ZlVG9SZWwpCisgICAgaWYgKGNoZWNrRm9ySW5pdGlh
bE1vdmVUbyAmJiBjb21tYW5kICE9IFBhdGhTZWdNb3ZlVG9BYnMgJiYgY29tbWFuZCAhPSBQYXRo
U2VnTW92ZVRvUmVsKQogICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICB3aGlsZSAodHJ1ZSkg
ewpJbmRleDogU291cmNlL1dlYkNvcmUvc3ZnL1NWR1BhdGhQYXJzZXIuaAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvV2ViQ29yZS9zdmcvU1ZHUGF0aFBhcnNlci5oCShyZXZpc2lvbiAxMjc2MDQpCisr
KyBTb3VyY2UvV2ViQ29yZS9zdmcvU1ZHUGF0aFBhcnNlci5oCSh3b3JraW5nIGNvcHkpCkBAIC0z
OCw3ICszOCw3IEBAIGNsYXNzIFNWR1BhdGhQYXJzZXIgewogcHVibGljOgogICAgIFNWR1BhdGhQ
YXJzZXIoKTsKIAotICAgIGJvb2wgcGFyc2VQYXRoRGF0YUZyb21Tb3VyY2UoUGF0aFBhcnNpbmdN
b2RlIHBhdGhQYXJzaW5nTW9kZSk7CisgICAgYm9vbCBwYXJzZVBhdGhEYXRhRnJvbVNvdXJjZShQ
YXRoUGFyc2luZ01vZGUsIGJvb2wgY2hlY2tGb3JJbml0aWFsTW92ZVRvID0gdHJ1ZSk7CiAgICAg
dm9pZCBzZXRDdXJyZW50Q29uc3VtZXIoU1ZHUGF0aENvbnN1bWVyKiBjb25zdW1lcikgeyBtX2Nv
bnN1bWVyID0gY29uc3VtZXI7IH0KICAgICB2b2lkIHNldEN1cnJlbnRTb3VyY2UoU1ZHUGF0aFNv
dXJjZSogc291cmNlKSB7IG1fc291cmNlID0gc291cmNlOyB9CiAgICAgdm9pZCBjbGVhbnVwKCk7
CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9zdmcvU1ZHUGF0aFNlZ0xpc3QuY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9XZWJDb3JlL3N2Zy9TVkdQYXRoU2VnTGlzdC5jcHAJKHJldmlzaW9uIDEyNzYw
NCkKKysrIFNvdXJjZS9XZWJDb3JlL3N2Zy9TVkdQYXRoU2VnTGlzdC5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTM4LDExICszOCwxMSBAQCBTdHJpbmcgU1ZHUGF0aFNlZ0xpc3Q6OnZhbHVlQXNTdHJp
bmcoKSBjCiAgICAgcmV0dXJuIHBhdGhTdHJpbmc7CiB9CiAKLXZvaWQgU1ZHUGF0aFNlZ0xpc3Q6
OmNvbW1pdENoYW5nZShTVkdFbGVtZW50KiBjb250ZXh0RWxlbWVudCkKK3ZvaWQgU1ZHUGF0aFNl
Z0xpc3Q6OmNvbW1pdENoYW5nZShTVkdFbGVtZW50KiBjb250ZXh0RWxlbWVudCwgTGlzdE1vZGlm
aWNhdGlvbiBsaXN0TW9kaWZpY2F0aW9uLCB1bnNpZ25lZCBhZmZlY3RlZEluZGV4KQogewogICAg
IEFTU0VSVChjb250ZXh0RWxlbWVudCk7CiAgICAgQVNTRVJUKGNvbnRleHRFbGVtZW50LT5oYXNU
YWdOYW1lKFNWR05hbWVzOjpwYXRoVGFnKSk7Ci0gICAgc3RhdGljX2Nhc3Q8U1ZHUGF0aEVsZW1l
bnQqPihjb250ZXh0RWxlbWVudCktPnBhdGhTZWdMaXN0Q2hhbmdlZChtX3JvbGUpOworICAgIHN0
YXRpY19jYXN0PFNWR1BhdGhFbGVtZW50Kj4oY29udGV4dEVsZW1lbnQpLT5wYXRoU2VnTGlzdENo
YW5nZWQobV9yb2xlLCBsaXN0TW9kaWZpY2F0aW9uLCBhZmZlY3RlZEluZGV4KTsKIH0KIAogfQpJ
bmRleDogU291cmNlL1dlYkNvcmUvc3ZnL1NWR1BhdGhTZWdMaXN0LmgKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL1dlYkNvcmUvc3ZnL1NWR1BhdGhTZWdMaXN0LmgJKHJldmlzaW9uIDEyNzYwNCkKKysr
IFNvdXJjZS9XZWJDb3JlL3N2Zy9TVkdQYXRoU2VnTGlzdC5oCSh3b3JraW5nIGNvcHkpCkBAIC0y
MSw2ICsyMSw3IEBACiAjZGVmaW5lIFNWR1BhdGhTZWdMaXN0X2gKIAogI2lmIEVOQUJMRShTVkcp
CisjaW5jbHVkZSAiU1ZHTGlzdFByb3BlcnR5LmgiCiAjaW5jbHVkZSAiU1ZHUGF0aFNlZy5oIgog
I2luY2x1ZGUgIlNWR1Byb3BlcnR5VHJhaXRzLmgiCiAKQEAgLTQxLDcgKzQyLDcgQEAgcHVibGlj
OgogICAgIFN0cmluZyB2YWx1ZUFzU3RyaW5nKCkgY29uc3Q7CiAKICAgICAvLyBPbmx5IHVzZWQg
YnkgU1ZHUGF0aFNlZ0xpc3RQcm9wZXJ0eVRlYXJPZmYuCi0gICAgdm9pZCBjb21taXRDaGFuZ2Uo
U1ZHRWxlbWVudCogY29udGV4dEVsZW1lbnQpOworICAgIHZvaWQgY29tbWl0Q2hhbmdlKFNWR0Vs
ZW1lbnQqIGNvbnRleHRFbGVtZW50LCBMaXN0TW9kaWZpY2F0aW9uLCB1bnNpZ25lZCBhZmZlY3Rl
ZEluZGV4KTsKIAogcHJpdmF0ZToKICAgICBTVkdQYXRoU2VnUm9sZSBtX3JvbGU7CkluZGV4OiBT
b3VyY2UvV2ViQ29yZS9zdmcvU1ZHUGF0aFNlZ1dpdGhDb250ZXh0LmgKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL1dlYkNvcmUvc3ZnL1NWR1BhdGhTZWdXaXRoQ29udGV4dC5oCShyZXZpc2lvbiAxMjc2
MDQpCisrKyBTb3VyY2UvV2ViQ29yZS9zdmcvU1ZHUGF0aFNlZ1dpdGhDb250ZXh0LmgJKHdvcmtp
bmcgY29weSkKQEAgLTY2LDcgKzY2LDcgQEAgcHJvdGVjdGVkOgogICAgICAgICB9CiAKICAgICAg
ICAgQVNTRVJUKG1fcm9sZSAhPSBQYXRoU2VnVW5kZWZpbmVkUm9sZSk7Ci0gICAgICAgIG1fZWxl
bWVudC0+cGF0aFNlZ0xpc3RDaGFuZ2VkKG1fcm9sZSk7CisgICAgICAgIG1fZWxlbWVudC0+cGF0
aFNlZ0xpc3RDaGFuZ2VkKG1fcm9sZSwgTGlzdE1vZGlmaWNhdGlvblVua25vd24sIDApOwogICAg
IH0KIAogcHJpdmF0ZToKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3N2Zy9TVkdQYXRoVXRpbGl0aWVz
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9zdmcvU1ZHUGF0aFV0aWxpdGllcy5j
cHAJKHJldmlzaW9uIDEyNzYwNCkKKysrIFNvdXJjZS9XZWJDb3JlL3N2Zy9TVkdQYXRoVXRpbGl0
aWVzLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTQwLDYgKzE0MCwyOCBAQCBib29sIGJ1aWxkU1ZH
UGF0aEJ5dGVTdHJlYW1Gcm9tU1ZHUGF0aFNlCiAgICAgcmV0dXJuIG9rOwogfQogCitib29sIGFw
cGVuZFNWR1BhdGhCeXRlU3RyZWFtRnJvbVNWR1BhdGhTZWcoUGFzc1JlZlB0cjxTVkdQYXRoU2Vn
PiBwYXRoU2VnLCBTVkdQYXRoQnl0ZVN0cmVhbSogcmVzdWx0LCBQYXRoUGFyc2luZ01vZGUgcGFy
c2luZ01vZGUpCit7CisgICAgQVNTRVJUKHJlc3VsdCk7CisgICAgLy8gRklYTUU6IGh0dHBzOi8v
YnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNTQxMiAtIEltcGxlbWVudCBub3JtYWxp
emVkIHBhdGggc2VnbWVudCBsaXN0cyEKKyAgICBBU1NFUlQocGFyc2luZ01vZGUgPT0gVW5hbHRl
cmVkUGFyc2luZyk7CisKKyAgICBTVkdQYXRoU2VnTGlzdCBhcHBlbmRlZEl0ZW1MaXN0KFBhdGhT
ZWdVbmFsdGVyZWRSb2xlKTsKKyAgICBhcHBlbmRlZEl0ZW1MaXN0LmFwcGVuZChwYXRoU2VnKTsK
KyAgICBPd25QdHI8U1ZHUGF0aEJ5dGVTdHJlYW0+IGFwcGVuZGVkQnl0ZVN0cmVhbSA9IFNWR1Bh
dGhCeXRlU3RyZWFtOjpjcmVhdGUoKTsKKworICAgIFNWR1BhdGhCeXRlU3RyZWFtQnVpbGRlciog
YnVpbGRlciA9IGdsb2JhbFNWR1BhdGhCeXRlU3RyZWFtQnVpbGRlcihhcHBlbmRlZEJ5dGVTdHJl
YW0uZ2V0KCkpOworICAgIE93blB0cjxTVkdQYXRoU2VnTGlzdFNvdXJjZT4gc291cmNlID0gU1ZH
UGF0aFNlZ0xpc3RTb3VyY2U6OmNyZWF0ZShhcHBlbmRlZEl0ZW1MaXN0KTsKKyAgICBTVkdQYXRo
UGFyc2VyKiBwYXJzZXIgPSBnbG9iYWxTVkdQYXRoUGFyc2VyKHNvdXJjZS5nZXQoKSwgYnVpbGRl
cik7CisgICAgYm9vbCBvayA9IHBhcnNlci0+cGFyc2VQYXRoRGF0YUZyb21Tb3VyY2UocGFyc2lu
Z01vZGUsIGZhbHNlKTsKKyAgICBwYXJzZXItPmNsZWFudXAoKTsKKworICAgIGlmIChvaykKKyAg
ICAgICAgcmVzdWx0LT5hcHBlbmQoYXBwZW5kZWRCeXRlU3RyZWFtLmdldCgpKTsKKworICAgIHJl
dHVybiBvazsKK30KKwogYm9vbCBidWlsZFBhdGhGcm9tQnl0ZVN0cmVhbShTVkdQYXRoQnl0ZVN0
cmVhbSogc3RyZWFtLCBQYXRoJiByZXN1bHQpCiB7CiAgICAgQVNTRVJUKHN0cmVhbSk7CkluZGV4
OiBTb3VyY2UvV2ViQ29yZS9zdmcvU1ZHUGF0aFV0aWxpdGllcy5oCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9XZWJDb3JlL3N2Zy9TVkdQYXRoVXRpbGl0aWVzLmgJKHJldmlzaW9uIDEyNzYwNCkKKysr
IFNvdXJjZS9XZWJDb3JlL3N2Zy9TVkdQYXRoVXRpbGl0aWVzLmgJKHdvcmtpbmcgY29weSkKQEAg
LTIzLDYgKzIzLDcgQEAKICNpZiBFTkFCTEUoU1ZHKQogI2luY2x1ZGUgIlNWR1BhdGhCeXRlU3Ry
ZWFtLmgiCiAjaW5jbHVkZSAiU1ZHUGF0aENvbnN1bWVyLmgiCisjaW5jbHVkZSAiU1ZHUGF0aFNl
Zy5oIgogI2luY2x1ZGUgPHd0Zi9Pd25QdHIuaD4KICNpbmNsdWRlIDx3dGYvdGV4dC9XVEZTdHJp
bmcuaD4KIApAQCAtMzksNiArNDAsNyBAQCBib29sIGJ1aWxkUGF0aEZyb21CeXRlU3RyZWFtKFNW
R1BhdGhCeXRlCiAKIC8vIFNWR1BhdGhTZWdMaXN0L1N0cmluZyAtPiBTVkdQYXRoQnl0ZVN0cmVh
bQogYm9vbCBidWlsZFNWR1BhdGhCeXRlU3RyZWFtRnJvbVNWR1BhdGhTZWdMaXN0KGNvbnN0IFNW
R1BhdGhTZWdMaXN0JiwgU1ZHUGF0aEJ5dGVTdHJlYW0qLCBQYXRoUGFyc2luZ01vZGUpOworYm9v
bCBhcHBlbmRTVkdQYXRoQnl0ZVN0cmVhbUZyb21TVkdQYXRoU2VnKFBhc3NSZWZQdHI8U1ZHUGF0
aFNlZz4sIFNWR1BhdGhCeXRlU3RyZWFtKiwgUGF0aFBhcnNpbmdNb2RlKTsKIGJvb2wgYnVpbGRT
VkdQYXRoQnl0ZVN0cmVhbUZyb21TdHJpbmcoY29uc3QgU3RyaW5nJiwgU1ZHUGF0aEJ5dGVTdHJl
YW0qLCBQYXRoUGFyc2luZ01vZGUpOwogCiAvLyBTVkdQYXRoQnl0ZVN0cmVhbS9TVkdQYXRoU2Vn
TGlzdCAtPiBTdHJpbmcKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3N2Zy9wcm9wZXJ0aWVzL1NWR0xp
c3RQcm9wZXJ0eS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3N2Zy9wcm9wZXJ0aWVz
L1NWR0xpc3RQcm9wZXJ0eS5oCShyZXZpc2lvbiAxMjc2MDQpCisrKyBTb3VyY2UvV2ViQ29yZS9z
dmcvcHJvcGVydGllcy9TVkdMaXN0UHJvcGVydHkuaAkod29ya2luZyBjb3B5KQpAQCAtMjgsNiAr
MjgsMTQgQEAKIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCitlbnVtIExpc3RNb2RpZmljYXRpb24g
eworICAgIExpc3RNb2RpZmljYXRpb25Vbmtub3duID0gMCwKKyAgICBMaXN0TW9kaWZpY2F0aW9u
SW5zZXJ0ID0gMSwKKyAgICBMaXN0TW9kaWZpY2F0aW9uUmVwbGFjZSA9IDIsCisgICAgTGlzdE1v
ZGlmaWNhdGlvblJlbW92ZSA9IDMsCisgICAgTGlzdE1vZGlmaWNhdGlvbkFwcGVuZCA9IDQKK307
CisKIHRlbXBsYXRlPHR5cGVuYW1lIFByb3BlcnR5VHlwZT4KIGNsYXNzIFNWR0FuaW1hdGVkTGlz
dFByb3BlcnR5VGVhck9mZjsKIApAQCAtMzkwLDcgKzM5OCw3IEBAIHB1YmxpYzoKICAgICAgICAg
Ly8gQXBwZW5kIHRoZSB2YWx1ZSBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0LgogICAgICAgICBtX3Zh
bHVlcy0+YXBwZW5kKG5ld0l0ZW0pOwogCi0gICAgICAgIGNvbW1pdENoYW5nZSgpOworICAgICAg
ICBjb21taXRDaGFuZ2UoTGlzdE1vZGlmaWNhdGlvbkFwcGVuZCwgbV92YWx1ZXMtPnNpemUoKSk7
CiAgICAgICAgIHJldHVybiBuZXdJdGVtOwogICAgIH0KIApAQCAtNDE2LDcgKzQyNCw3IEBAIHB1
YmxpYzoKICAgICAgICAgbV92YWx1ZXMtPmFwcGVuZChuZXdJdGVtLT5wcm9wZXJ0eVJlZmVyZW5j
ZSgpKTsKICAgICAgICAgbV93cmFwcGVycy0+YXBwZW5kKG5ld0l0ZW0pOwogCi0gICAgICAgIGNv
bW1pdENoYW5nZSgpOworICAgICAgICBjb21taXRDaGFuZ2UoTGlzdE1vZGlmaWNhdGlvbkFwcGVu
ZCwgbV92YWx1ZXMtPnNpemUoKSk7CiAgICAgICAgIHJldHVybiBuZXdJdGVtLnJlbGVhc2UoKTsK
ICAgICB9CiAKQEAgLTQ0OCw2ICs0NTYsMTMgQEAgcHJvdGVjdGVkOgogICAgIH0KIAogICAgIHZp
cnR1YWwgdm9pZCBjb21taXRDaGFuZ2UoKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIGNvbW1pdENo
YW5nZShMaXN0TW9kaWZpY2F0aW9uIGxpc3RNb2RpZmljYXRpb24sIHVuc2lnbmVkIGFmZmVjdGVk
SW5kZXgpCisgICAgeworICAgICAgICBVTlVTRURfUEFSQU0obGlzdE1vZGlmaWNhdGlvbik7Cisg
ICAgICAgIFVOVVNFRF9QQVJBTShhZmZlY3RlZEluZGV4KTsKKyAgICAgICAgY29tbWl0Q2hhbmdl
KCk7CisgICAgfQorCiAgICAgdmlydHVhbCB2b2lkIHByb2Nlc3NJbmNvbWluZ0xpc3RJdGVtVmFs
dWUoY29uc3QgTGlzdEl0ZW1UeXBlJiBuZXdJdGVtLCB1bnNpZ25lZCogaW5kZXhUb01vZGlmeSkg
PSAwOwogICAgIHZpcnR1YWwgdm9pZCBwcm9jZXNzSW5jb21pbmdMaXN0SXRlbVdyYXBwZXIoUmVm
UHRyPExpc3RJdGVtVGVhck9mZj4mIG5ld0l0ZW0sIHVuc2lnbmVkKiBpbmRleFRvTW9kaWZ5KSA9
IDA7CiAKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3N2Zy9wcm9wZXJ0aWVzL1NWR1BhdGhTZWdMaXN0
UHJvcGVydHlUZWFyT2ZmLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvc3ZnL3Byb3Bl
cnRpZXMvU1ZHUGF0aFNlZ0xpc3RQcm9wZXJ0eVRlYXJPZmYuaAkocmV2aXNpb24gMTI3NjA0KQor
KysgU291cmNlL1dlYkNvcmUvc3ZnL3Byb3BlcnRpZXMvU1ZHUGF0aFNlZ0xpc3RQcm9wZXJ0eVRl
YXJPZmYuaAkod29ya2luZyBjb3B5KQpAQCAtMTQwLDcgKzE0MCwxMyBAQCBwcml2YXRlOgogICAg
IHZpcnR1YWwgdm9pZCBjb21taXRDaGFuZ2UoKQogICAgIHsKICAgICAgICAgQVNTRVJUKG1fdmFs
dWVzKTsKLSAgICAgICAgbV92YWx1ZXMtPmNvbW1pdENoYW5nZShtX2FuaW1hdGVkUHJvcGVydHkt
PmNvbnRleHRFbGVtZW50KCkpOworICAgICAgICBtX3ZhbHVlcy0+Y29tbWl0Q2hhbmdlKG1fYW5p
bWF0ZWRQcm9wZXJ0eS0+Y29udGV4dEVsZW1lbnQoKSwgTGlzdE1vZGlmaWNhdGlvblVua25vd24s
IDApOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBjb21taXRDaGFuZ2UoTGlzdE1vZGlmaWNh
dGlvbiBsaXN0TW9kaWZpY2F0aW9uLCB1bnNpZ25lZCBhZmZlY3RlZEluZGV4KQorICAgIHsKKyAg
ICAgICAgQVNTRVJUKG1fdmFsdWVzKTsKKyAgICAgICAgbV92YWx1ZXMtPmNvbW1pdENoYW5nZSht
X2FuaW1hdGVkUHJvcGVydHktPmNvbnRleHRFbGVtZW50KCksIGxpc3RNb2RpZmljYXRpb24sIGFm
ZmVjdGVkSW5kZXgpOwogICAgIH0KIAogICAgIHZpcnR1YWwgdm9pZCBwcm9jZXNzSW5jb21pbmdM
aXN0SXRlbVZhbHVlKGNvbnN0IExpc3RJdGVtVHlwZSYgbmV3SXRlbSwgdW5zaWduZWQqIGluZGV4
VG9Nb2RpZnkpOwpJbmRleDogTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExh
eW91dFRlc3RzL0NoYW5nZUxvZwkocmV2aXNpb24gMTI3NjM5KQorKysgTGF5b3V0VGVzdHMvQ2hh
bmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTYgQEAKKzIwMTItMDktMDUgIFBoaWxp
cCBSb2dlcnMgIDxwZHJAZ29vZ2xlLmNvbT4KKworICAgICAgICBNYWtlIFNWR1BhdGhTZWdMaXN0
LmFwcGVuZCBPKDEpIGluc3RlYWQgb2YgTyhuKQorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0
Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9OTQwNDgKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkg
KE9PUFMhKS4KKworICAgICAgICBBZGQgcGVyZm9ybWFuY2UgdGVzdCB0byBwcm92ZSB0aGlzIHBh
dGNoIHdvcmtzLiBUaGUgcmVzdCBvZiBTVkdQYXRoU2VnTGlzdC5hcHBlbmQgc2hvdWxkIGJlIGNv
dmVyZWQKKyAgICAgICAgaW4gZXhpc3RpbmcgdGVzdHMuCisKKyAgICAgICAgKiBwZXJmL3N2Zy1w
YXRoLWFwcGVuZGl0ZW0tZXhwZWN0ZWQudHh0OiBBZGRlZC4KKyAgICAgICAgKiBwZXJmL3N2Zy1w
YXRoLWFwcGVuZGl0ZW0uaHRtbDogQWRkZWQuCisKIDIwMTItMDktMDUgIFRoaWFnbyBNYXJjb3Mg
UC4gU2FudG9zICA8dGhpYWdvLnNhbnRvc0BpbnRlbC5jb20+CiAKICAgICAgICAgW0VGTF0gU2xp
ZGVyIHByb2dyZXNzIGJhciBnb2VzIGNyYXp5IHdpdGggbmVnYXRpdmUgcmFuZ2VzCkluZGV4OiBM
YXlvdXRUZXN0cy9wZXJmL3N2Zy1wYXRoLWFwcGVuZGl0ZW0tZXhwZWN0ZWQudHh0Cj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIExheW91dFRlc3RzL3BlcmYvc3ZnLXBhdGgtYXBwZW5kaXRlbS1leHBlY3RlZC50eHQJ
KHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0cy9wZXJmL3N2Zy1wYXRoLWFwcGVuZGl0ZW0tZXhw
ZWN0ZWQudHh0CShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDMgQEAKK1Rlc3RzIHRoYXQgU1ZHIHBh
dGguYXBwZW5kSXRlbSgpIGlzIGNvbnN0YW50IHdpdGggcmVzcGVjdCB0byB0aGUgbGVuZ3RoIG9m
IHRoZSBwYXRoLgorUEFTUworCkluZGV4OiBMYXlvdXRUZXN0cy9wZXJmL3N2Zy1wYXRoLWFwcGVu
ZGl0ZW0uaHRtbAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9wZXJmL3N2Zy1wYXRoLWFwcGVu
ZGl0ZW0uaHRtbAkocmV2aXNpb24gMCkKKysrIExheW91dFRlc3RzL3BlcmYvc3ZnLXBhdGgtYXBw
ZW5kaXRlbS5odG1sCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDIzIEBACis8Ym9keT4KKzxzY3Jp
cHQgc3JjPSIuLi9yZXNvdXJjZXMvbWFnbml0dWRlLXBlcmYuanMiPjwvc2NyaXB0PgorPHNjcmlw
dD4KKyAgICB2YXIgcGF0aDsKKworICAgIGZ1bmN0aW9uIHNldHVwKG1hZ25pdHVkZSkKKyAgICB7
CisgICAgICAgIHBhdGggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMu
b3JnLzIwMDAvc3ZnIiwgInBhdGgiKTsKKyAgICAgICAgdmFyIHBhdGhEID0gIiI7CisgICAgICAg
IGZvciAodmFyIGkgPSAwOyBpIDwgbWFnbml0dWRlOyBpKyspCisgICAgICAgICAgICBwYXRoRCAr
PSAiTTIwIDIwWiI7CisgICAgICAgIHBhdGguc2V0QXR0cmlidXRlKCdkJywgcGF0aEQpOworICAg
IH0KKworICAgIGZ1bmN0aW9uIHRlc3QobWFnbml0dWRlKQorICAgIHsKKyAgICAgICAgcGF0aC5w
YXRoU2VnTGlzdC5hcHBlbmRJdGVtKHBhdGguY3JlYXRlU1ZHUGF0aFNlZ0xpbmV0b0FicygyMCwg
MjApKTsKKyAgICB9CisKKyAgICBNYWduaXR1ZGUuZGVzY3JpcHRpb24oIlRlc3RzIHRoYXQgU1ZH
IHBhdGguYXBwZW5kSXRlbSgpIGlzIGNvbnN0YW50IHdpdGggcmVzcGVjdCB0byB0aGUgbGVuZ3Ro
IG9mIHRoZSBwYXRoLiIpOworICAgIE1hZ25pdHVkZS5ydW4oc2V0dXAsIHRlc3QsIE1hZ25pdHVk
ZS5DT05TVEFOVCk7Cis8L3NjcmlwdD4KKzwvYm9keT4K
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>162406</attachid>
            <date>2012-09-05 21:13:15 -0700</date>
            <delta_ts>2012-09-17 01:55:41 -0700</delta_ts>
            <desc>Update per reviewer comments</desc>
            <filename>94048.2.patch</filename>
            <type>text/plain</type>
            <size>16538</size>
            <attacher name="Philip Rogers">pdr</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDEyNzYzOSkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDk1IEBACisyMDEyLTA5LTA1ICBQaGlsaXAg
Um9nZXJzICA8cGRyQGdvb2dsZS5jb20+CisKKyAgICAgICAgTWFrZSBTVkdQYXRoU2VnTGlzdC5h
cHBlbmRJdGVtIE8oMSkgaW5zdGVhZCBvZiBPKG4pCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD05NDA0OAorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9E
WSAoT09QUyEpLgorCisgICAgICAgIFBhdGhzIGluIFNWRyBjYW4gYmUgc3BlY2lmaWVkIHdpdGgg
YSBTdHJpbmcgKHdpdGggdGhlIGQgYXR0cmlidXRlKSBvcgorICAgICAgICB3aXRoIGFuIFNWR1Bh
dGhTZWdMaXN0LiBJbiBTVkdQYXRoRWxlbWVudCBhIHNpbmdsZSByZXByZXNlbnRhdGlvbiBpcwor
ICAgICAgICBtYWludGFpbmVkOiBhbiBTVkdQYXRoQnl0ZVN0cmVhbS4gVG8ga2VlcCB0aGUgYnl0
ZSBzdHJlYW0gc3luY2hyb25pemVkIHdpdGgKKyAgICAgICAgdGhlIGQgYXR0cmlidXRlIGFuZCB0
aGUgUGF0aFNlZ0xpc3QsIHRoaXMgYnl0ZSBzdHJlYW0gaXMKKyAgICAgICAgcmVidWlsdCBvbiBl
dmVyeSBvcGVyYXRpb24uIEFzIGEgcmVzdWx0LCBhbnkgbW9kaWZpY2F0aW9uIHRvIHRoZQorICAg
ICAgICBwYXRoIGlzIGFuIE8obikgb3BlcmF0aW9uLgorCisgICAgICAgIFRoaXMgcGF0Y2ggdGFr
ZXMgYWR2YW50YWdlIG9mIHRoZSBzdHJlYW0gYXNwZWN0IG9mIFNWR1BhdGhCeXRlU3RyZWFtCisg
ICAgICAgIHRvIG1ha2UgU1ZHUGF0aFNlZ0xpc3QuYXBwZW5kIGFuIE8oMSkgb3BlcmF0aW9uIGlu
c3RlYWQgb2YgTyhuKS4KKyAgICAgICAgV2hlbiBhbiBTVkdQYXRoU2VnIGlzIGFwcGVuZGVkIHRv
IGFuIFNWR1BhdGhTZWdMaXN0LCB0aGlzIHBhdGNoIHBhcnNlcworICAgICAgICB0aGUgU1ZHUGF0
aFNlZyBhbmQgZGlyZWN0bHkgYXBwZW5kcyB0aGUgcmVzdWx0aW5nIGJ5dGVzIHRvIHRoZQorICAg
ICAgICBieXRlIHN0cmVhbS4KKworICAgICAgICBUbyBhY2hpZXZlIHRoaXMgc29tZSBwbHVtYmlu
ZyBoYXMgYmVlbiBhZGRlZCB0byBwYXNzIG1vcmUgaW5mb3JtYXRpb24KKyAgICAgICAgYWJvdXQg
dGhlIGFjdHVhbCBwYXRoIGNoYW5nZXMgZnJvbSB0aGUgU1ZHUGF0aFNlZ0xpc3RUZWFyT2ZmIHRv
IHRoZQorICAgICAgICBTVkdQYXRoRWxlbWVudDogaW5zdGVhZCBvZiB0aGUgZ2VuZXJpYyBjb21t
aXRDaGFuZ2UoKSB0aGlzIHBhdGNoIGFkZHMKKyAgICAgICAgY29tbWl0Q2hhbmdlKExpc3RNb2Rp
ZmljYXRpb24gdHlwZSkuIElmIHdlIGRlY2lkZSB0byBjaGFuZ2Ugb3VyCisgICAgICAgIGludGVy
bmFsIHBhdGggZGF0YSBzdHJ1Y3R1cmUgaW4gdGhlIGZ1dHVyZSwgdGhpcyBhZGRpdGlvbmFsIGNv
bW1pdENoYW5nZQorICAgICAgICBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBwYXNzIHRoZSBpbmZv
cm1hdGlvbiBuZWVkZWQgdG8gbWFrZQorICAgICAgICBTVkdQYXRoU2VnTGlzdCBzeW5jaHJvbml6
YXRpb24gZmFzdGVyLgorCisgICAgICAgIFNWRyBQYXRoIEJlbmNobWFyayAoaHR0cDovL2JsLm9j
a3Mub3JnLzEyOTY5MzApIHNob3dpbmcganVzdCB0aGUKKyAgICAgICAgYXBwZW5kSXRlbSgpIHRp
bWUgdXNlZCBpbiBidWlsZGluZyBhIDUwMDAgc2VnbWVudCBwYXRoIChhdmcgb2YgMyBydW5zKToK
KyAgICAgICAgV2ViS2l0IHdpdGhvdXQgcGF0Y2g6IDU2MiBtcworICAgICAgICBGaXJlZm94IDE4
LjAxYTogICAgICAgNTUgbXMKKyAgICAgICAgT3BlcmEgMTIuNTAgaW50ZXJuYWw6IDI3IG1zCisg
ICAgICAgIFdlYktpdCB3aXRoIHBhdGNoOiAgICA3IG1zCisKKyAgICAgICAgVGVzdDogcGVyZi9z
dmctcGF0aC1hcHBlbmRpdGVtLmh0bWwKKworICAgICAgICAgICAgVGhpcyB0ZXN0IHByb3ZlcyB0
aGUgY2xhaW06IFNWR1BhdGhTZWdMaXN0LmFwcGVuZEl0ZW0gaXMgbm93IE8oMSkuCisgICAgICAg
ICAgICBBZGRpdGlvbmFsIHRlc3RzIHRoYXQgYXBwZW5kSXRlbSB3b3JrcyBhcmUgY292ZXJlZCB3
aXRoIGV4aXN0aW5nIHRlc3RzLgorCisgICAgICAgICogc3ZnL1NWR1BhdGhCeXRlU3RyZWFtLmg6
CisgICAgICAgIChXZWJDb3JlOjpTVkdQYXRoQnl0ZVN0cmVhbTo6YXBwZW5kKToKKworICAgICAg
ICAgICAgVGhpcyBhZGRpdGlvbmFsIGFwcGVuZCBtZXRob2QgYWxsb3dzIGFuIFNWR1BhdGhCeXRl
U3RyZWFtIHRvIGJlCisgICAgICAgICAgICBhcHBlbmRlZCB0byBhbm90aGVyLgorCisgICAgICAg
ICogc3ZnL1NWR1BhdGhFbGVtZW50LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlNWR1BhdGhFbGVt
ZW50OjpwYXRoU2VnTGlzdENoYW5nZWQpOgorCisgICAgICAgICAgICBCeSBwYXNzaW5nIHRoZSBl
eHRyYSBMaXN0TW9kaWZpY2F0aW9uIHR5cGUgdG8gcGF0aFNlZ0xpc3RDaGFuZ2VkLAorICAgICAg
ICAgICAgU1ZHUGF0aEVsZW1lbnQgaXMgbm93IGFibGUgdG8gb25seSBzeW5jaHJvbml6ZSB0aGUg
cGFydHMgb2YgdGhlIGJ5dGUgc3RyZWFtCisgICAgICAgICAgICB0aGF0IGFjdHVhbGx5IGNoYW5n
ZWQuIEluIHRoaXMgcGF0Y2ggb25seSBhcHBlbmQgaXMgdHJlYXRlZAorICAgICAgICAgICAgZGlm
ZmVyZW50bHkgYnV0IG9uZSBjYW4gaW1hZ2luZSBvdGhlciBwZXJmb3JtYW5jZSBpbXByb3ZlbWVu
dHMgdGhpcworICAgICAgICAgICAgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhbGxvd3MuCisKKyAg
ICAgICAgKiBzdmcvU1ZHUGF0aEVsZW1lbnQuaDoKKyAgICAgICAgKFNWR1BhdGhFbGVtZW50KToK
KyAgICAgICAgKiBzdmcvU1ZHUGF0aFBhcnNlci5jcHA6CisgICAgICAgIChXZWJDb3JlOjpTVkdQ
YXRoUGFyc2VyOjpwYXJzZVBhdGhEYXRhRnJvbVNvdXJjZSk6CisKKyAgICAgICAgICAgIER1cmlu
ZyBub3JtYWwgU1ZHUGF0aFNlZ0xpc3QgcGFyc2luZyB3ZSBlbmZvcmNlIHRoYXQgdGhlIHBhdGgg
c3RhcnQgd2l0aCBhIG1vdmV0bworICAgICAgICAgICAgY29tbWFuZC4gVGhpcyBmdW5jdGlvbiBo
YXMgYmVlbiBleHBhbmRlZCB0byBtYWtlIHRoYXQgb3B0aW9uYWwgc28gdGhhdCBwYXJzaW5nCisg
ICAgICAgICAgICBjYW4gYmUgcGVyZm9ybWVkIGVsc2V3aGVyZSBpbiB0aGUgcGF0aCAoZS5nLiwg
aW4gdGhlIG1pZGRsZSkuCisKKyAgICAgICAgKiBzdmcvU1ZHUGF0aFBhcnNlci5oOgorICAgICAg
ICAoU1ZHUGF0aFBhcnNlcik6CisgICAgICAgICogc3ZnL1NWR1BhdGhTZWdMaXN0LmNwcDoKKyAg
ICAgICAgKFdlYkNvcmU6OlNWR1BhdGhTZWdMaXN0Ojpjb21taXRDaGFuZ2UpOgorICAgICAgICAq
IHN2Zy9TVkdQYXRoU2VnTGlzdC5oOgorICAgICAgICAoU1ZHUGF0aFNlZ0xpc3QpOgorICAgICAg
ICAqIHN2Zy9TVkdQYXRoU2VnV2l0aENvbnRleHQuaDoKKyAgICAgICAgKFdlYkNvcmU6OlNWR1Bh
dGhTZWdXaXRoQ29udGV4dDo6Y29tbWl0Q2hhbmdlKToKKyAgICAgICAgKiBzdmcvU1ZHUGF0aFV0
aWxpdGllcy5jcHA6CisgICAgICAgIChXZWJDb3JlOjphcHBlbmRTVkdQYXRoQnl0ZVN0cmVhbUZy
b21TVkdQYXRoU2VnKToKKworICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiByZXVzZXMgdGhlIFNW
R1BhdGhTZWdMaXN0IHBhcnNpbmcgaW5mcmFzdHJ1Y3R1cmUKKyAgICAgICAgICAgIHRvIHBhcnNl
IGFuIFNWR1BhdGhTZWdMaXN0IHdpdGgganVzdCB0aGUgc2luZ2xlIFNWR1BhdGhTZWcgdGhhdAor
ICAgICAgICAgICAgaXMgYmVpbmcgYXBwZW5kZWQuIFRoZSByZXN1bHRpbmcgYnl0ZSBzdHJlYW0g
Y2FuIHRoZW4gYmUgYXBwZW5kZWQKKyAgICAgICAgICAgIHRvIHRoZSByZXN1bHQgcGF0aCBieXRl
IHN0cmVhbS4KKworICAgICAgICAoV2ViQ29yZSk6CisgICAgICAgICogc3ZnL1NWR1BhdGhVdGls
aXRpZXMuaDoKKyAgICAgICAgKFdlYkNvcmUpOgorICAgICAgICAqIHN2Zy9wcm9wZXJ0aWVzL1NW
R0xpc3RQcm9wZXJ0eS5oOgorICAgICAgICAoV2ViQ29yZTo6U1ZHTGlzdFByb3BlcnR5OjphcHBl
bmRJdGVtVmFsdWVzKToKKyAgICAgICAgKFdlYkNvcmU6OlNWR0xpc3RQcm9wZXJ0eTo6YXBwZW5k
SXRlbVZhbHVlc0FuZFdyYXBwZXJzKToKKyAgICAgICAgKFdlYkNvcmU6OlNWR0xpc3RQcm9wZXJ0
eTo6Y29tbWl0Q2hhbmdlKToKKyAgICAgICAgKFNWR0xpc3RQcm9wZXJ0eSk6CisgICAgICAgICog
c3ZnL3Byb3BlcnRpZXMvU1ZHUGF0aFNlZ0xpc3RQcm9wZXJ0eVRlYXJPZmYuaDoKKyAgICAgICAg
KFdlYkNvcmU6OlNWR1BhdGhTZWdMaXN0UHJvcGVydHlUZWFyT2ZmOjpjb21taXRDaGFuZ2UpOgor
ICAgICAgICAoU1ZHUGF0aFNlZ0xpc3RQcm9wZXJ0eVRlYXJPZmYpOgorCiAyMDEyLTA5LTA1ICBC
ZW5qYW1pbiBQb3VsYWluICA8YnBvdWxhaW5AYXBwbGUuY29tPgogCiAgICAgICAgIE1vcmUgZml4
ZXMgZm9yIFN0cmluZzo6b3BlcmF0b3IrPSgpIG9uIE1hYwpJbmRleDogU291cmNlL1dlYkNvcmUv
c3ZnL1NWR1BhdGhCeXRlU3RyZWFtLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvc3Zn
L1NWR1BhdGhCeXRlU3RyZWFtLmgJKHJldmlzaW9uIDEyNzYwNCkKKysrIFNvdXJjZS9XZWJDb3Jl
L3N2Zy9TVkdQYXRoQnl0ZVN0cmVhbS5oCSh3b3JraW5nIGNvcHkpCkBAIC02Miw2ICs2MiwxMSBA
QCBwdWJsaWM6CiAgICAgRGF0YUl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gbV9kYXRhLmJlZ2lu
KCk7IH0KICAgICBEYXRhSXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gbV9kYXRhLmVuZCgpOyB9CiAg
ICAgdm9pZCBhcHBlbmQodW5zaWduZWQgY2hhciBieXRlKSB7IG1fZGF0YS5hcHBlbmQoYnl0ZSk7
IH0KKyAgICB2b2lkIGFwcGVuZChTVkdQYXRoQnl0ZVN0cmVhbSogb3RoZXIpCisgICAgeworICAg
ICAgICBmb3IgKERhdGFJdGVyYXRvciBpdCA9IG90aGVyLT5iZWdpbigpOyBpdCAhPSBvdGhlci0+
ZW5kKCk7ICsraXQpCisgICAgICAgICAgICBhcHBlbmQoKml0KTsKKyAgICB9CiAgICAgdm9pZCBj
bGVhcigpIHsgbV9kYXRhLmNsZWFyKCk7IH0KICAgICBib29sIGlzRW1wdHkoKSBjb25zdCB7IHJl
dHVybiAhbV9kYXRhLnNpemUoKTsgfQogICAgIHVuc2lnbmVkIHNpemUoKSBjb25zdCB7IHJldHVy
biBtX2RhdGEuc2l6ZSgpOyB9CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9zdmcvU1ZHUGF0aEVsZW1l
bnQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3N2Zy9TVkdQYXRoRWxlbWVudC5j
cHAJKHJldmlzaW9uIDEyNzYwNCkKKysrIFNvdXJjZS9XZWJDb3JlL3N2Zy9TVkdQYXRoRWxlbWVu
dC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMzMywxNCArMzMzLDE4IEBAIFNWR1BhdGhTZWdMaXN0
UHJvcGVydHlUZWFyT2ZmKiBTVkdQYXRoRWwKICAgICByZXR1cm4gMDsKIH0KIAotdm9pZCBTVkdQ
YXRoRWxlbWVudDo6cGF0aFNlZ0xpc3RDaGFuZ2VkKFNWR1BhdGhTZWdSb2xlIHJvbGUpCit2b2lk
IFNWR1BhdGhFbGVtZW50OjpwYXRoU2VnTGlzdENoYW5nZWQoU1ZHUGF0aFNlZ1JvbGUgcm9sZSwg
TGlzdE1vZGlmaWNhdGlvbiBsaXN0TW9kaWZpY2F0aW9uKQogewogICAgIHN3aXRjaCAocm9sZSkg
ewogICAgIGNhc2UgUGF0aFNlZ05vcm1hbGl6ZWRSb2xlOgogICAgICAgICAvLyBGSVhNRTogaHR0
cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE1NDEyIC0gSW1wbGVtZW50IG5v
cm1hbGl6ZWQgcGF0aCBzZWdtZW50IGxpc3RzIQogICAgICAgICBicmVhazsKICAgICBjYXNlIFBh
dGhTZWdVbmFsdGVyZWRSb2xlOgotICAgICAgICBidWlsZFNWR1BhdGhCeXRlU3RyZWFtRnJvbVNW
R1BhdGhTZWdMaXN0KG1fcGF0aFNlZ0xpc3QudmFsdWUsIG1fcGF0aEJ5dGVTdHJlYW0uZ2V0KCks
IFVuYWx0ZXJlZFBhcnNpbmcpOworICAgICAgICBpZiAobGlzdE1vZGlmaWNhdGlvbiA9PSBMaXN0
TW9kaWZpY2F0aW9uQXBwZW5kKSB7CisgICAgICAgICAgICBBU1NFUlQoIW1fcGF0aFNlZ0xpc3Qu
dmFsdWUuaXNFbXB0eSgpKTsKKyAgICAgICAgICAgIGFwcGVuZFNWR1BhdGhCeXRlU3RyZWFtRnJv
bVNWR1BhdGhTZWcobV9wYXRoU2VnTGlzdC52YWx1ZS5sYXN0KCksIG1fcGF0aEJ5dGVTdHJlYW0u
Z2V0KCksIFVuYWx0ZXJlZFBhcnNpbmcpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGJ1
aWxkU1ZHUGF0aEJ5dGVTdHJlYW1Gcm9tU1ZHUGF0aFNlZ0xpc3QobV9wYXRoU2VnTGlzdC52YWx1
ZSwgbV9wYXRoQnl0ZVN0cmVhbS5nZXQoKSwgVW5hbHRlcmVkUGFyc2luZyk7CiAgICAgICAgIGJy
ZWFrOwogICAgIGNhc2UgUGF0aFNlZ1VuZGVmaW5lZFJvbGU6CiAgICAgICAgIHJldHVybjsKSW5k
ZXg6IFNvdXJjZS9XZWJDb3JlL3N2Zy9TVkdQYXRoRWxlbWVudC5oCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9XZWJDb3JlL3N2Zy9TVkdQYXRoRWxlbWVudC5oCShyZXZpc2lvbiAxMjc2MDQpCisrKyBT
b3VyY2UvV2ViQ29yZS9zdmcvU1ZHUGF0aEVsZW1lbnQuaAkod29ya2luZyBjb3B5KQpAQCAtOTMs
NyArOTMsNyBAQCBwdWJsaWM6CiAKICAgICBTVkdQYXRoQnl0ZVN0cmVhbSogcGF0aEJ5dGVTdHJl
YW0oKSBjb25zdDsKIAotICAgIHZvaWQgcGF0aFNlZ0xpc3RDaGFuZ2VkKFNWR1BhdGhTZWdSb2xl
KTsKKyAgICB2b2lkIHBhdGhTZWdMaXN0Q2hhbmdlZChTVkdQYXRoU2VnUm9sZSwgTGlzdE1vZGlm
aWNhdGlvbiA9IExpc3RNb2RpZmljYXRpb25Vbmtub3duKTsKIAogICAgIHZpcnR1YWwgRmxvYXRS
ZWN0IGdldEJCb3goU3R5bGVVcGRhdGVTdHJhdGVneSA9IEFsbG93U3R5bGVVcGRhdGUpOwogCklu
ZGV4OiBTb3VyY2UvV2ViQ29yZS9zdmcvU1ZHUGF0aFBhcnNlci5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL1dlYkNvcmUvc3ZnL1NWR1BhdGhQYXJzZXIuY3BwCShyZXZpc2lvbiAxMjc2MDQpCisr
KyBTb3VyY2UvV2ViQ29yZS9zdmcvU1ZHUGF0aFBhcnNlci5jcHAJKHdvcmtpbmcgY29weSkKQEAg
LTI4Miw3ICsyODIsNyBAQCBib29sIFNWR1BhdGhQYXJzZXI6OnBhcnNlQXJjVG9TZWdtZW50KCkK
ICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBTVkdQYXRoUGFyc2VyOjpwYXJzZVBhdGhEYXRh
RnJvbVNvdXJjZShQYXRoUGFyc2luZ01vZGUgcGF0aFBhcnNpbmdNb2RlKQorYm9vbCBTVkdQYXRo
UGFyc2VyOjpwYXJzZVBhdGhEYXRhRnJvbVNvdXJjZShQYXRoUGFyc2luZ01vZGUgcGF0aFBhcnNp
bmdNb2RlLCBib29sIGNoZWNrRm9ySW5pdGlhbE1vdmVUbykKIHsKICAgICBBU1NFUlQobV9zb3Vy
Y2UpOwogICAgIEFTU0VSVChtX2NvbnN1bWVyKTsKQEAgLTMwMyw3ICszMDMsNyBAQCBib29sIFNW
R1BhdGhQYXJzZXI6OnBhcnNlUGF0aERhdGFGcm9tU291CiAgICAgbV9sYXN0Q29tbWFuZCA9IFBh
dGhTZWdVbmtub3duOwogCiAgICAgLy8gUGF0aCBtdXN0IHN0YXJ0IHdpdGggbW92ZXRvLgotICAg
IGlmIChjb21tYW5kICE9IFBhdGhTZWdNb3ZlVG9BYnMgJiYgY29tbWFuZCAhPSBQYXRoU2VnTW92
ZVRvUmVsKQorICAgIGlmIChjaGVja0ZvckluaXRpYWxNb3ZlVG8gJiYgY29tbWFuZCAhPSBQYXRo
U2VnTW92ZVRvQWJzICYmIGNvbW1hbmQgIT0gUGF0aFNlZ01vdmVUb1JlbCkKICAgICAgICAgcmV0
dXJuIGZhbHNlOwogCiAgICAgd2hpbGUgKHRydWUpIHsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3N2
Zy9TVkdQYXRoUGFyc2VyLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvc3ZnL1NWR1Bh
dGhQYXJzZXIuaAkocmV2aXNpb24gMTI3NjA0KQorKysgU291cmNlL1dlYkNvcmUvc3ZnL1NWR1Bh
dGhQYXJzZXIuaAkod29ya2luZyBjb3B5KQpAQCAtMzgsNyArMzgsNyBAQCBjbGFzcyBTVkdQYXRo
UGFyc2VyIHsKIHB1YmxpYzoKICAgICBTVkdQYXRoUGFyc2VyKCk7CiAKLSAgICBib29sIHBhcnNl
UGF0aERhdGFGcm9tU291cmNlKFBhdGhQYXJzaW5nTW9kZSBwYXRoUGFyc2luZ01vZGUpOworICAg
IGJvb2wgcGFyc2VQYXRoRGF0YUZyb21Tb3VyY2UoUGF0aFBhcnNpbmdNb2RlLCBib29sIGNoZWNr
Rm9ySW5pdGlhbE1vdmVUbyA9IHRydWUpOwogICAgIHZvaWQgc2V0Q3VycmVudENvbnN1bWVyKFNW
R1BhdGhDb25zdW1lciogY29uc3VtZXIpIHsgbV9jb25zdW1lciA9IGNvbnN1bWVyOyB9CiAgICAg
dm9pZCBzZXRDdXJyZW50U291cmNlKFNWR1BhdGhTb3VyY2UqIHNvdXJjZSkgeyBtX3NvdXJjZSA9
IHNvdXJjZTsgfQogICAgIHZvaWQgY2xlYW51cCgpOwpJbmRleDogU291cmNlL1dlYkNvcmUvc3Zn
L1NWR1BhdGhTZWdMaXN0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9zdmcvU1ZH
UGF0aFNlZ0xpc3QuY3BwCShyZXZpc2lvbiAxMjc2MDQpCisrKyBTb3VyY2UvV2ViQ29yZS9zdmcv
U1ZHUGF0aFNlZ0xpc3QuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zOCwxMSArMzgsMTEgQEAgU3Ry
aW5nIFNWR1BhdGhTZWdMaXN0Ojp2YWx1ZUFzU3RyaW5nKCkgYwogICAgIHJldHVybiBwYXRoU3Ry
aW5nOwogfQogCi12b2lkIFNWR1BhdGhTZWdMaXN0Ojpjb21taXRDaGFuZ2UoU1ZHRWxlbWVudCog
Y29udGV4dEVsZW1lbnQpCit2b2lkIFNWR1BhdGhTZWdMaXN0Ojpjb21taXRDaGFuZ2UoU1ZHRWxl
bWVudCogY29udGV4dEVsZW1lbnQsIExpc3RNb2RpZmljYXRpb24gbGlzdE1vZGlmaWNhdGlvbikK
IHsKICAgICBBU1NFUlQoY29udGV4dEVsZW1lbnQpOwogICAgIEFTU0VSVChjb250ZXh0RWxlbWVu
dC0+aGFzVGFnTmFtZShTVkdOYW1lczo6cGF0aFRhZykpOwotICAgIHN0YXRpY19jYXN0PFNWR1Bh
dGhFbGVtZW50Kj4oY29udGV4dEVsZW1lbnQpLT5wYXRoU2VnTGlzdENoYW5nZWQobV9yb2xlKTsK
KyAgICBzdGF0aWNfY2FzdDxTVkdQYXRoRWxlbWVudCo+KGNvbnRleHRFbGVtZW50KS0+cGF0aFNl
Z0xpc3RDaGFuZ2VkKG1fcm9sZSwgbGlzdE1vZGlmaWNhdGlvbik7CiB9CiAKIH0KSW5kZXg6IFNv
dXJjZS9XZWJDb3JlL3N2Zy9TVkdQYXRoU2VnTGlzdC5oCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9X
ZWJDb3JlL3N2Zy9TVkdQYXRoU2VnTGlzdC5oCShyZXZpc2lvbiAxMjc2MDQpCisrKyBTb3VyY2Uv
V2ViQ29yZS9zdmcvU1ZHUGF0aFNlZ0xpc3QuaAkod29ya2luZyBjb3B5KQpAQCAtMjEsNiArMjEs
NyBAQAogI2RlZmluZSBTVkdQYXRoU2VnTGlzdF9oCiAKICNpZiBFTkFCTEUoU1ZHKQorI2luY2x1
ZGUgIlNWR0xpc3RQcm9wZXJ0eS5oIgogI2luY2x1ZGUgIlNWR1BhdGhTZWcuaCIKICNpbmNsdWRl
ICJTVkdQcm9wZXJ0eVRyYWl0cy5oIgogCkBAIC00MSw3ICs0Miw3IEBAIHB1YmxpYzoKICAgICBT
dHJpbmcgdmFsdWVBc1N0cmluZygpIGNvbnN0OwogCiAgICAgLy8gT25seSB1c2VkIGJ5IFNWR1Bh
dGhTZWdMaXN0UHJvcGVydHlUZWFyT2ZmLgotICAgIHZvaWQgY29tbWl0Q2hhbmdlKFNWR0VsZW1l
bnQqIGNvbnRleHRFbGVtZW50KTsKKyAgICB2b2lkIGNvbW1pdENoYW5nZShTVkdFbGVtZW50KiBj
b250ZXh0RWxlbWVudCwgTGlzdE1vZGlmaWNhdGlvbik7CiAKIHByaXZhdGU6CiAgICAgU1ZHUGF0
aFNlZ1JvbGUgbV9yb2xlOwpJbmRleDogU291cmNlL1dlYkNvcmUvc3ZnL1NWR1BhdGhVdGlsaXRp
ZXMuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3N2Zy9TVkdQYXRoVXRpbGl0aWVz
LmNwcAkocmV2aXNpb24gMTI3NjA0KQorKysgU291cmNlL1dlYkNvcmUvc3ZnL1NWR1BhdGhVdGls
aXRpZXMuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xNDAsNiArMTQwLDI4IEBAIGJvb2wgYnVpbGRT
VkdQYXRoQnl0ZVN0cmVhbUZyb21TVkdQYXRoU2UKICAgICByZXR1cm4gb2s7CiB9CiAKK2Jvb2wg
YXBwZW5kU1ZHUGF0aEJ5dGVTdHJlYW1Gcm9tU1ZHUGF0aFNlZyhQYXNzUmVmUHRyPFNWR1BhdGhT
ZWc+IHBhdGhTZWcsIFNWR1BhdGhCeXRlU3RyZWFtKiByZXN1bHQsIFBhdGhQYXJzaW5nTW9kZSBw
YXJzaW5nTW9kZSkKK3sKKyAgICBBU1NFUlQocmVzdWx0KTsKKyAgICAvLyBGSVhNRTogaHR0cHM6
Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE1NDEyIC0gSW1wbGVtZW50IG5vcm1h
bGl6ZWQgcGF0aCBzZWdtZW50IGxpc3RzIQorICAgIEFTU0VSVChwYXJzaW5nTW9kZSA9PSBVbmFs
dGVyZWRQYXJzaW5nKTsKKworICAgIFNWR1BhdGhTZWdMaXN0IGFwcGVuZGVkSXRlbUxpc3QoUGF0
aFNlZ1VuYWx0ZXJlZFJvbGUpOworICAgIGFwcGVuZGVkSXRlbUxpc3QuYXBwZW5kKHBhdGhTZWcp
OworICAgIE93blB0cjxTVkdQYXRoQnl0ZVN0cmVhbT4gYXBwZW5kZWRCeXRlU3RyZWFtID0gU1ZH
UGF0aEJ5dGVTdHJlYW06OmNyZWF0ZSgpOworCisgICAgU1ZHUGF0aEJ5dGVTdHJlYW1CdWlsZGVy
KiBidWlsZGVyID0gZ2xvYmFsU1ZHUGF0aEJ5dGVTdHJlYW1CdWlsZGVyKGFwcGVuZGVkQnl0ZVN0
cmVhbS5nZXQoKSk7CisgICAgT3duUHRyPFNWR1BhdGhTZWdMaXN0U291cmNlPiBzb3VyY2UgPSBT
VkdQYXRoU2VnTGlzdFNvdXJjZTo6Y3JlYXRlKGFwcGVuZGVkSXRlbUxpc3QpOworICAgIFNWR1Bh
dGhQYXJzZXIqIHBhcnNlciA9IGdsb2JhbFNWR1BhdGhQYXJzZXIoc291cmNlLmdldCgpLCBidWls
ZGVyKTsKKyAgICBib29sIG9rID0gcGFyc2VyLT5wYXJzZVBhdGhEYXRhRnJvbVNvdXJjZShwYXJz
aW5nTW9kZSwgZmFsc2UpOworICAgIHBhcnNlci0+Y2xlYW51cCgpOworCisgICAgaWYgKG9rKQor
ICAgICAgICByZXN1bHQtPmFwcGVuZChhcHBlbmRlZEJ5dGVTdHJlYW0uZ2V0KCkpOworCisgICAg
cmV0dXJuIG9rOworfQorCiBib29sIGJ1aWxkUGF0aEZyb21CeXRlU3RyZWFtKFNWR1BhdGhCeXRl
U3RyZWFtKiBzdHJlYW0sIFBhdGgmIHJlc3VsdCkKIHsKICAgICBBU1NFUlQoc3RyZWFtKTsKSW5k
ZXg6IFNvdXJjZS9XZWJDb3JlL3N2Zy9TVkdQYXRoVXRpbGl0aWVzLmgKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL1dlYkNvcmUvc3ZnL1NWR1BhdGhVdGlsaXRpZXMuaAkocmV2aXNpb24gMTI3NjA0KQor
KysgU291cmNlL1dlYkNvcmUvc3ZnL1NWR1BhdGhVdGlsaXRpZXMuaAkod29ya2luZyBjb3B5KQpA
QCAtMjMsNiArMjMsNyBAQAogI2lmIEVOQUJMRShTVkcpCiAjaW5jbHVkZSAiU1ZHUGF0aEJ5dGVT
dHJlYW0uaCIKICNpbmNsdWRlICJTVkdQYXRoQ29uc3VtZXIuaCIKKyNpbmNsdWRlICJTVkdQYXRo
U2VnLmgiCiAjaW5jbHVkZSA8d3RmL093blB0ci5oPgogI2luY2x1ZGUgPHd0Zi90ZXh0L1dURlN0
cmluZy5oPgogCkBAIC0zOSw2ICs0MCw3IEBAIGJvb2wgYnVpbGRQYXRoRnJvbUJ5dGVTdHJlYW0o
U1ZHUGF0aEJ5dGUKIAogLy8gU1ZHUGF0aFNlZ0xpc3QvU3RyaW5nIC0+IFNWR1BhdGhCeXRlU3Ry
ZWFtCiBib29sIGJ1aWxkU1ZHUGF0aEJ5dGVTdHJlYW1Gcm9tU1ZHUGF0aFNlZ0xpc3QoY29uc3Qg
U1ZHUGF0aFNlZ0xpc3QmLCBTVkdQYXRoQnl0ZVN0cmVhbSosIFBhdGhQYXJzaW5nTW9kZSk7Citi
b29sIGFwcGVuZFNWR1BhdGhCeXRlU3RyZWFtRnJvbVNWR1BhdGhTZWcoUGFzc1JlZlB0cjxTVkdQ
YXRoU2VnPiwgU1ZHUGF0aEJ5dGVTdHJlYW0qLCBQYXRoUGFyc2luZ01vZGUpOwogYm9vbCBidWls
ZFNWR1BhdGhCeXRlU3RyZWFtRnJvbVN0cmluZyhjb25zdCBTdHJpbmcmLCBTVkdQYXRoQnl0ZVN0
cmVhbSosIFBhdGhQYXJzaW5nTW9kZSk7CiAKIC8vIFNWR1BhdGhCeXRlU3RyZWFtL1NWR1BhdGhT
ZWdMaXN0IC0+IFN0cmluZwpJbmRleDogU291cmNlL1dlYkNvcmUvc3ZnL3Byb3BlcnRpZXMvU1ZH
TGlzdFByb3BlcnR5LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvc3ZnL3Byb3BlcnRp
ZXMvU1ZHTGlzdFByb3BlcnR5LmgJKHJldmlzaW9uIDEyNzYwNCkKKysrIFNvdXJjZS9XZWJDb3Jl
L3N2Zy9wcm9wZXJ0aWVzL1NWR0xpc3RQcm9wZXJ0eS5oCSh3b3JraW5nIGNvcHkpCkBAIC0yOCw2
ICsyOCwxNCBAQAogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKK2VudW0gTGlzdE1vZGlmaWNhdGlv
biB7CisgICAgTGlzdE1vZGlmaWNhdGlvblVua25vd24gPSAwLAorICAgIExpc3RNb2RpZmljYXRp
b25JbnNlcnQgPSAxLAorICAgIExpc3RNb2RpZmljYXRpb25SZXBsYWNlID0gMiwKKyAgICBMaXN0
TW9kaWZpY2F0aW9uUmVtb3ZlID0gMywKKyAgICBMaXN0TW9kaWZpY2F0aW9uQXBwZW5kID0gNAor
fTsKKwogdGVtcGxhdGU8dHlwZW5hbWUgUHJvcGVydHlUeXBlPgogY2xhc3MgU1ZHQW5pbWF0ZWRM
aXN0UHJvcGVydHlUZWFyT2ZmOwogCkBAIC0zOTAsNyArMzk4LDcgQEAgcHVibGljOgogICAgICAg
ICAvLyBBcHBlbmQgdGhlIHZhbHVlIGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QuCiAgICAgICAgIG1f
dmFsdWVzLT5hcHBlbmQobmV3SXRlbSk7CiAKLSAgICAgICAgY29tbWl0Q2hhbmdlKCk7CisgICAg
ICAgIGNvbW1pdENoYW5nZShMaXN0TW9kaWZpY2F0aW9uQXBwZW5kKTsKICAgICAgICAgcmV0dXJu
IG5ld0l0ZW07CiAgICAgfQogCkBAIC00MTYsNyArNDI0LDcgQEAgcHVibGljOgogICAgICAgICBt
X3ZhbHVlcy0+YXBwZW5kKG5ld0l0ZW0tPnByb3BlcnR5UmVmZXJlbmNlKCkpOwogICAgICAgICBt
X3dyYXBwZXJzLT5hcHBlbmQobmV3SXRlbSk7CiAKLSAgICAgICAgY29tbWl0Q2hhbmdlKCk7Cisg
ICAgICAgIGNvbW1pdENoYW5nZShMaXN0TW9kaWZpY2F0aW9uQXBwZW5kKTsKICAgICAgICAgcmV0
dXJuIG5ld0l0ZW0ucmVsZWFzZSgpOwogICAgIH0KIApAQCAtNDQ4LDYgKzQ1NiwxMSBAQCBwcm90
ZWN0ZWQ6CiAgICAgfQogCiAgICAgdmlydHVhbCB2b2lkIGNvbW1pdENoYW5nZSgpID0gMDsKKyAg
ICB2aXJ0dWFsIHZvaWQgY29tbWl0Q2hhbmdlKExpc3RNb2RpZmljYXRpb24pCisgICAgeworICAg
ICAgICBjb21taXRDaGFuZ2UoKTsKKyAgICB9CisKICAgICB2aXJ0dWFsIHZvaWQgcHJvY2Vzc0lu
Y29taW5nTGlzdEl0ZW1WYWx1ZShjb25zdCBMaXN0SXRlbVR5cGUmIG5ld0l0ZW0sIHVuc2lnbmVk
KiBpbmRleFRvTW9kaWZ5KSA9IDA7CiAgICAgdmlydHVhbCB2b2lkIHByb2Nlc3NJbmNvbWluZ0xp
c3RJdGVtV3JhcHBlcihSZWZQdHI8TGlzdEl0ZW1UZWFyT2ZmPiYgbmV3SXRlbSwgdW5zaWduZWQq
IGluZGV4VG9Nb2RpZnkpID0gMDsKIApJbmRleDogU291cmNlL1dlYkNvcmUvc3ZnL3Byb3BlcnRp
ZXMvU1ZHUGF0aFNlZ0xpc3RQcm9wZXJ0eVRlYXJPZmYuaAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
V2ViQ29yZS9zdmcvcHJvcGVydGllcy9TVkdQYXRoU2VnTGlzdFByb3BlcnR5VGVhck9mZi5oCShy
ZXZpc2lvbiAxMjc2MDQpCisrKyBTb3VyY2UvV2ViQ29yZS9zdmcvcHJvcGVydGllcy9TVkdQYXRo
U2VnTGlzdFByb3BlcnR5VGVhck9mZi5oCSh3b3JraW5nIGNvcHkpCkBAIC0xNDAsNyArMTQwLDEz
IEBAIHByaXZhdGU6CiAgICAgdmlydHVhbCB2b2lkIGNvbW1pdENoYW5nZSgpCiAgICAgewogICAg
ICAgICBBU1NFUlQobV92YWx1ZXMpOwotICAgICAgICBtX3ZhbHVlcy0+Y29tbWl0Q2hhbmdlKG1f
YW5pbWF0ZWRQcm9wZXJ0eS0+Y29udGV4dEVsZW1lbnQoKSk7CisgICAgICAgIG1fdmFsdWVzLT5j
b21taXRDaGFuZ2UobV9hbmltYXRlZFByb3BlcnR5LT5jb250ZXh0RWxlbWVudCgpLCBMaXN0TW9k
aWZpY2F0aW9uVW5rbm93bik7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIGNvbW1pdENoYW5n
ZShMaXN0TW9kaWZpY2F0aW9uIGxpc3RNb2RpZmljYXRpb24pCisgICAgeworICAgICAgICBBU1NF
UlQobV92YWx1ZXMpOworICAgICAgICBtX3ZhbHVlcy0+Y29tbWl0Q2hhbmdlKG1fYW5pbWF0ZWRQ
cm9wZXJ0eS0+Y29udGV4dEVsZW1lbnQoKSwgbGlzdE1vZGlmaWNhdGlvbik7CiAgICAgfQogCiAg
ICAgdmlydHVhbCB2b2lkIHByb2Nlc3NJbmNvbWluZ0xpc3RJdGVtVmFsdWUoY29uc3QgTGlzdEl0
ZW1UeXBlJiBuZXdJdGVtLCB1bnNpZ25lZCogaW5kZXhUb01vZGlmeSk7CkluZGV4OiBMYXlvdXRU
ZXN0cy9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCShyZXZp
c2lvbiAxMjc2MzkpCisrKyBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cJKHdvcmtpbmcgY29weSkKQEAg
LTEsMyArMSwxNiBAQAorMjAxMi0wOS0wNSAgUGhpbGlwIFJvZ2VycyAgPHBkckBnb29nbGUuY29t
PgorCisgICAgICAgIE1ha2UgU1ZHUGF0aFNlZ0xpc3QuYXBwZW5kIE8oMSkgaW5zdGVhZCBvZiBP
KG4pCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD05NDA0
OAorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIEFkZCBw
ZXJmb3JtYW5jZSB0ZXN0IHRvIHByb3ZlIHRoaXMgcGF0Y2ggd29ya3MuIFRoZSByZXN0IG9mIFNW
R1BhdGhTZWdMaXN0LmFwcGVuZCBzaG91bGQgYmUgY292ZXJlZAorICAgICAgICBpbiBleGlzdGlu
ZyB0ZXN0cy4KKworICAgICAgICAqIHBlcmYvc3ZnLXBhdGgtYXBwZW5kaXRlbS1leHBlY3RlZC50
eHQ6IEFkZGVkLgorICAgICAgICAqIHBlcmYvc3ZnLXBhdGgtYXBwZW5kaXRlbS5odG1sOiBBZGRl
ZC4KKwogMjAxMi0wOS0wNSAgVGhpYWdvIE1hcmNvcyBQLiBTYW50b3MgIDx0aGlhZ28uc2FudG9z
QGludGVsLmNvbT4KIAogICAgICAgICBbRUZMXSBTbGlkZXIgcHJvZ3Jlc3MgYmFyIGdvZXMgY3Jh
enkgd2l0aCBuZWdhdGl2ZSByYW5nZXMKSW5kZXg6IExheW91dFRlc3RzL3BlcmYvc3ZnLXBhdGgt
YXBwZW5kaXRlbS1leHBlY3RlZC50eHQKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvcGVyZi9z
dmctcGF0aC1hcHBlbmRpdGVtLWV4cGVjdGVkLnR4dAkocmV2aXNpb24gMCkKKysrIExheW91dFRl
c3RzL3BlcmYvc3ZnLXBhdGgtYXBwZW5kaXRlbS1leHBlY3RlZC50eHQJKHJldmlzaW9uIDApCkBA
IC0wLDAgKzEsMyBAQAorVGVzdHMgdGhhdCBTVkcgcGF0aC5hcHBlbmRJdGVtKCkgaXMgY29uc3Rh
bnQgd2l0aCByZXNwZWN0IHRvIHRoZSBsZW5ndGggb2YgdGhlIHBhdGguCitQQVNTCisKSW5kZXg6
IExheW91dFRlc3RzL3BlcmYvc3ZnLXBhdGgtYXBwZW5kaXRlbS5odG1sCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IExheW91dFRlc3RzL3BlcmYvc3ZnLXBhdGgtYXBwZW5kaXRlbS5odG1sCShyZXZpc2lvbiAwKQor
KysgTGF5b3V0VGVzdHMvcGVyZi9zdmctcGF0aC1hcHBlbmRpdGVtLmh0bWwJKHJldmlzaW9uIDAp
CkBAIC0wLDAgKzEsMjMgQEAKKzxib2R5PgorPHNjcmlwdCBzcmM9Ii4uL3Jlc291cmNlcy9tYWdu
aXR1ZGUtcGVyZi5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0PgorICAgIHZhciBwYXRoOworCisgICAg
ZnVuY3Rpb24gc2V0dXAobWFnbml0dWRlKQorICAgIHsKKyAgICAgICAgcGF0aCA9IGRvY3VtZW50
LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLCAicGF0aCIpOwor
ICAgICAgICB2YXIgcGF0aEQgPSAiIjsKKyAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtYWdu
aXR1ZGU7IGkrKykKKyAgICAgICAgICAgIHBhdGhEICs9ICJNMjAgMjBaIjsKKyAgICAgICAgcGF0
aC5zZXRBdHRyaWJ1dGUoJ2QnLCBwYXRoRCk7CisgICAgfQorCisgICAgZnVuY3Rpb24gdGVzdCht
YWduaXR1ZGUpCisgICAgeworICAgICAgICBwYXRoLnBhdGhTZWdMaXN0LmFwcGVuZEl0ZW0ocGF0
aC5jcmVhdGVTVkdQYXRoU2VnTGluZXRvQWJzKDIwLCAyMCkpOworICAgIH0KKworICAgIE1hZ25p
dHVkZS5kZXNjcmlwdGlvbigiVGVzdHMgdGhhdCBTVkcgcGF0aC5hcHBlbmRJdGVtKCkgaXMgY29u
c3RhbnQgd2l0aCByZXNwZWN0IHRvIHRoZSBsZW5ndGggb2YgdGhlIHBhdGguIik7CisgICAgTWFn
bml0dWRlLnJ1bihzZXR1cCwgdGVzdCwgTWFnbml0dWRlLkNPTlNUQU5UKTsKKzwvc2NyaXB0Pgor
PC9ib2R5Pgo=
</data>

          </attachment>
      

    </bug>

</bugzilla>