<?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>26044</bug_id>
          
          <creation_ts>2009-05-27 11:24:05 -0700</creation_ts>
          <short_desc>Crash at Node::nodeIndex()</short_desc>
          <delta_ts>2009-06-14 22:17:23 -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>Text</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>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Dimitri Glazkov (Google)">dglazkov</reporter>
          <assigned_to name="Darin Adler">darin</assigned_to>
          <cc>ap</cc>
    
    <cc>darin</cc>
    
    <cc>eric</cc>
    
    <cc>justin.garcia</cc>
    
    <cc>ojan</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>123307</commentid>
    <comment_count>0</comment_count>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2009-05-27 11:24:05 -0700</bug_when>
    <thetext>Looking at various crash reports, I am seeing a fairly common crash that looks like:

*CRASHED* (EXC_BAD_ACCESS / KERN_INVALID_ADDRESS @0x90e43c50)
 
WebCore::Node::nodeIndex() const
WebCore::Range::textNodesMerged(WebCore::NodeWithIndex&amp;, unsigned int)
WebCore::Document::textNodesMerged(WebCore::Text*, unsigned int)
WebCore::Node::normalize()
WebCore::jsNodePrototypeFunctionNormalize(JSC::ExecState*, JSC::JSObject*, JSC::JSValuePtr, JSC::ArgList const&amp;)
JSC::Interpreter::cti_op_call_NotJSFunction(void*, ...)

or for V8:

*CRASHED* (EXCEPTION_ACCESS_VIOLATION @0x00720078)

WebCore::Node::nodeIndex()
WebCore::RangeBoundaryPoint::offset()
WebCore::boundaryTextNodesMerged
WebCore::Node::normalize()
WebCore::NodeInternal::normalizeCallback
v8::internal::Builtin_HandleApiCall
v8::internal::JavaScriptFrame::is_at_function()

It smells like a crash that occurs while the victim is using an RTE of some sort (TinyMCE or somesuch), given that we die in the .normalize() call.

Sadly, I don&apos;t have any URLs or test cases at the moment.

Any points/ideas on what could be happening are appreciated.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>123309</commentid>
    <comment_count>1</comment_count>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2009-05-27 11:27:11 -0700</bug_when>
    <thetext>Corresponding bug in Chromium Bug Tracker: http://crbug.com/9815</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>123392</commentid>
    <comment_count>2</comment_count>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2009-05-28 04:24:27 -0700</bug_when>
    <thetext>Any info on when it started? r43809 had some changed to normalize(), but there&apos;s not enough data to blame this patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>123425</commentid>
    <comment_count>3</comment_count>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2009-05-28 09:27:51 -0700</bug_when>
    <thetext>I did some digging, and found that this crash shows up as early as Chromium 2.0.158.0, which pulls WebKit at r39953.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>123426</commentid>
    <comment_count>4</comment_count>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2009-05-28 09:47:19 -0700</bug_when>
    <thetext>See also: bug 20471.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>123429</commentid>
    <comment_count>5</comment_count>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2009-05-28 09:57:26 -0700</bug_when>
    <thetext>&lt;rdar://problem/6704578&gt;

This (not the trace from the above bug, but this one) is known to happen when editing notes in Google Notebook sometimes.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>123431</commentid>
    <comment_count>6</comment_count>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2009-05-28 10:04:03 -0700</bug_when>
    <thetext>What an awesome time to crash :) I bet users love this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>123894</commentid>
    <comment_count>7</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-06-01 16:34:18 -0700</bug_when>
    <thetext>Alexey, can you please attach some of the crash traces from crashreporter.  I find them much more readable than Chrome crash traces.

Without a reproducible case, this bug isn&apos;t worth much.  I&apos;ll stare at the code again a bit in a minute.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>124050</commentid>
    <comment_count>8</comment_count>
    <who name="Jon@Chromium">jon</who>
    <bug_when>2009-06-02 13:55:39 -0700</bug_when>
    <thetext>I tried playing with Google Notebook but I could not trigger the crash in WebKit nightly or Chromium.  I am sure it crashes because we continue to get lots of reports but I could not find a repro case.  I do know that there does not appear to be any extra DLLs causing trouble.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>124080</commentid>
    <comment_count>9</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-06-02 17:12:31 -0700</bug_when>
    <thetext>Talked with Alexey.  He doesn&apos;t believe more complete stack traces would be of use, and he can&apos;t post them here anyway due to sekrit Safari symbols.

These look like the Node pointers are trashed.  Certainly the example:
http://crash/reportdetail?reportid=72f0a87465b7174
where it crashes (with the already pasted above stack trace) at 0x13.  0x13 doesn&apos;t even make sense that any of hte &quot;this&quot; in the stack is NULL.  I expect we&apos;re dealing with trashed or deleted memory here.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>124196</commentid>
    <comment_count>10</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-06-03 12:15:35 -0700</bug_when>
    <thetext>WebCore::Node::nodeIndex()
WebCore::RangeBoundaryPoint::offset()
WebCore::boundaryTextNodesMerged
WebCore::Node::normalize()
WebCore::NodeInternal::normalizeCallback

is missing symbols:

normalize is calling:
            document()-&gt;textNodesMerged(nextText.get(), offset);

which in turn is calling Range::textNodesMerged and thus boundaryTextNodesMerged</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>124197</commentid>
    <comment_count>11</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-06-03 12:20:50 -0700</bug_when>
    <thetext>Ok, my first theory is that we&apos;re not detaching ranges correctly.  Ranges hold onto their Nodes, but Documents do not hold onto their attached ranges.  So if ranges fail to detach themselves, documents will still try to call methods on invalid ranges.

Range::~Range()
{
    if (m_start.container())
        m_ownerDocument-&gt;detachRange(this);

It&apos;s possible to change m_start using:
void Range::setStart(PassRefPtr&lt;Node&gt; refNode, int offset, ExceptionCode&amp; ec)

I&apos;m not sure yet if it&apos;s possible to pass refNode = 0.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>124198</commentid>
    <comment_count>12</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-06-03 12:21:42 -0700</bug_when>
    <thetext>Nevermind, there is a check for:
    if (!refNode) {
        ec = NOT_FOUND_ERR;
        return;
    }

It still might be possible that something else is modifying m_start, thus causing a detach failure.  Again, this is only one theory.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>124207</commentid>
    <comment_count>13</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-06-03 13:39:16 -0700</bug_when>
    <thetext>Actually, looks like we always attach ranges,and only detach them when they have a m_start.container().  That seems like this code:

for (var x = 0; x &lt; 10000; x++)
   document.createRange();

would end up with lots of attached Ranges which never got detached.

Going to see if I can make a crashing test case. :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>124209</commentid>
    <comment_count>14</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-06-03 13:49:05 -0700</bug_when>
    <thetext>Hum... document.createRange() creates a range which starts and ends at the document node.  We need ranges which have no start in order to trip this bug.  Still investigating how to create those.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>124226</commentid>
    <comment_count>15</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-06-03 15:23:16 -0700</bug_when>
    <thetext>Ok, I&apos;m still not sure that this crash is caused by a deleted Range ending up left in the Document.  The two places in the code where RangeEndPoint::set() could be called with a null node, seem to be guarded:
void Range::textNodesMerged(NodeWithIndex&amp; oldNode, unsigned offset) -- checks node()-&gt;previousSibling()
void Range::textNodeSplit(Text* oldNode) -- checks oldNode-&gt;nextSibling()

Then again, these crashes are in a release build.  This would of course be a no-brainer to fix if we had a reproducible case...</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>124260</commentid>
    <comment_count>16</comment_count>
      <attachid>30934</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-06-03 17:25:34 -0700</bug_when>
    <thetext>Created attachment 30934
One attempt at a test case.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>124261</commentid>
    <comment_count>17</comment_count>
      <attachid>30935</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-06-03 17:41:56 -0700</bug_when>
    <thetext>Created attachment 30935
Speculative fix

 4 files changed, 52 insertions(+), 11 deletions(-)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>124313</commentid>
    <comment_count>18</comment_count>
      <attachid>30935</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-06-04 09:10:11 -0700</bug_when>
    <thetext>Comment on attachment 30935
Speculative fix

I have no object to speculative fixes, but I don&apos;t see a theory of the bug here. If the theory is that someone m_start.container() becomes 0, could you tell me the hypothetical about how that could happen? Maybe with a little more checking into calls to functions on m_start we can come up with something stronger.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>124315</commentid>
    <comment_count>19</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-06-04 09:20:02 -0700</bug_when>
    <thetext>(In reply to comment #18)
&gt; (From update of attachment 30935 [review])
&gt; I have no object to speculative fixes, but I don&apos;t see a theory of the bug
&gt; here. If the theory is that someone m_start.container() becomes 0, could you
&gt; tell me the hypothetical about how that could happen? Maybe with a little more
&gt; checking into calls to functions on m_start we can come up with something
&gt; stronger.

Sure thing.  I can demonstrate m_start.container() becoming zero.  The attached test case does that by preventing the insertion of the split text node into the document.

// This call will hit an ASSERT due to void Range::textNodeSplit(Text* oldNode)
    // being called with oldNode-&gt;nextSibling() == NULL
    // In release builds, the ASSERT won&apos;t fire and a Range attached to the document
    // will end up with an invalid start.  Ranges with an invalid start aren&apos;t
    // properly detached in ~Range, causing the Document to end up with pointers
    // to deleted ranges.
    text.splitText(1);

Looking at the the code, RangeBoundaryPoint::set() seems like the only way that one can make a RBP have a .container() == NULL.  The only place it&apos;s called is from the text node handling code, which ASSERTs that -&gt;nextSibling() and -&gt;previousSibling() are != NULL, but doesn&apos;t handle when they are (for the release case).  The only case I was able to come up with was using dom mutation events.  There may be others though, I&apos;m not sure.

I never got my test case to crash due to *this* bug, but I did get it to hit the various ASSERTs which try to guard against RBP&apos;s container() ever being NULL.  The test case to just hit those ASSERTs is much simpler than the one attached however. ;)

Making m_start.container() null was the only way I could think of to get a dead range into the Document&apos;s m_ranges list.  It&apos;s also possible that some unrelated memory smasher has smashed the Document, Node or Range.  But a deleted Range left in the Document&apos;s m_ranges list seems to be the most likely theory.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>124317</commentid>
    <comment_count>20</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-06-04 09:35:46 -0700</bug_when>
    <thetext>(In reply to comment #19)
&gt; Sure thing. I can demonstrate m_start.container() becoming zero.

This is where we need to concentrate our fixes. We need to fix the mutation hooks to work properly in all cases, with changes either at the call sites or in the Range class.

Should be straightforward. Lets do it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>124318</commentid>
    <comment_count>21</comment_count>
      <attachid>30935</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-06-04 09:37:02 -0700</bug_when>
    <thetext>Comment on attachment 30935
Speculative fix

Lets fix the problems that cause ranges to get into a bad state instead. We can do this by hardening the DOM mutation calls into Range and/or tightening up the callers.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>124319</commentid>
    <comment_count>22</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-06-04 09:47:04 -0700</bug_when>
    <thetext>(In reply to comment #20)
&gt; (In reply to comment #19)
&gt; &gt; Sure thing. I can demonstrate m_start.container() becoming zero.
&gt; 
&gt; This is where we need to concentrate our fixes. We need to fix the mutation
&gt; hooks to work properly in all cases, with changes either at the call sites or
&gt; in the Range class.
&gt; 
&gt; Should be straightforward. Lets do it.

I disagree. :)

I did not find it straight-forward yesterday.  I spent a while getting this far.  Although now that I&apos;m pretty sure this is due to dead Ranges hanging around in m_ranges on the Document, getting further should be easier.

I think the real broken-ness is using m_start.container() to mean &quot;attached&quot; or &quot;detached&quot;.  Whether m_start.container() ever becomes invalid seems a separate question from &quot;does the document still have a pointer to me&quot;.  One causes bad behavior, one causes crashes.  I&apos;m trying to fix the crashes here, and ignoring the bad behavior for the moment.

The code seemed to fan out enough for me to mentally figure out what cases could be putting us into a bad state.  Fixing design not to crash seemed like the right approach.  This bad state is already caught by *numerous* assertions, but none of them are firing in release mode, and we have no reproducible case with which to hit them in debug mode.

Please re-consider.  I don&apos;t think patching this one case where someone uses mutation events is likely to fix all the crashes we&apos;ve seen from this code (since my impression is so few sites use mutation events anyway).  If you stare at the code and see other case besides the mutation event one, I&apos;m happy to fix those too, but no others were obvious to me yesterday.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>124320</commentid>
    <comment_count>23</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-06-04 09:47:42 -0700</bug_when>
    <thetext>(In reply to comment #22)
&gt; I think the real broken-ness is using m_start.container() to mean &quot;attached&quot; or
&gt; &quot;detached&quot;.

I don&apos;t agree. I&apos;ll take a cut at fixing this myself.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>124321</commentid>
    <comment_count>24</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-06-04 09:48:41 -0700</bug_when>
    <thetext>Yes, I expect that m_start.container() being null can probably cause other crashes too...  I guess the real problem is w/o a reproducible case I&apos;m a blind man swatting flies.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>124324</commentid>
    <comment_count>25</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-06-04 09:51:00 -0700</bug_when>
    <thetext>The only two uses of RangeBoundaryPoint::set():
http://trac.webkit.org/browser/trunk/WebCore/dom/Range.cpp#L1758
http://trac.webkit.org/browser/trunk/WebCore/dom/Range.cpp#L1788
(note that they&apos;re at the end of the document, further than Safari will scroll down due to the anchor)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>124328</commentid>
    <comment_count>26</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-06-04 10:14:19 -0700</bug_when>
    <thetext>(In reply to comment #24)
&gt; Yes, I expect that m_start.container() being null can probably cause other
&gt; crashes too...  I guess the real problem is w/o a reproducible case I&apos;m a blind
&gt; man swatting flies.

I think your sleuthing on this so far has been great! This won&apos;t be hard to fix now.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>124381</commentid>
    <comment_count>27</comment_count>
      <attachid>30960</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-06-04 13:49:32 -0700</bug_when>
    <thetext>Created attachment 30960
fix; needs regression tests and perhaps to be split up since it fixes two bugs</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>124382</commentid>
    <comment_count>28</comment_count>
      <attachid>30960</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-06-04 14:12:24 -0700</bug_when>
    <thetext>Comment on attachment 30960
fix; needs regression tests and perhaps to be split up since it fixes two bugs

I&apos;m glad you took this on.

A couple comments about your intermediary patch:
I think we might still want to add a Document::isRangeAttached(Range*) function at least in #ifndef NDEBUG mode to make sure that the range is actually detached in the destructor.

It seems like this:
0     if (!isDetached())
99111         m_ownerDocument-&gt;detachRange(this);
would now make more sense to just call this-&gt;detach(), since after that call isDetached() will still return true!

I&apos;m very glad that you made isDetached() its own function, that makes the code much clearer.  It&apos;s still worries me that we&apos;ll end up with these notions of attachment out of sync (as demonstrated in the destructor above).


 // because the repercussions of setting a container node of a boundary to 0 are serious.
seems a bit opaque.  We could link to this bug there, or explain that isDetach() depends on that constraint never being violated.

When I was writing the patch I considered documenting in Range.h Range&apos;s assumption that m_start and m_end will either both be null or neither be null.  And that null means detached.

Thanks again for taking this on.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>124603</commentid>
    <comment_count>29</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-06-05 18:01:17 -0700</bug_when>
    <thetext>&gt; -    if (m_start.container())
&gt; -        m_ownerDocument-&gt;detachRange(this);
&gt; +    // We unconditionally detach as a speculative fix for https://bugs.webkit.org/show_bug.cgi?id=26044
&gt; +    m_ownerDocument-&gt;detachRange(this);

I&apos;ve changed my mind. Even though I don&apos;t like this comment, I do like this code change. I think we should fix it this way, and by only making this one change to this function. Then we can do the rest of my patch as a separate check-in.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>124604</commentid>
    <comment_count>30</comment_count>
      <attachid>31022</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-06-05 18:06:25 -0700</bug_when>
    <thetext>Created attachment 31022
more work in progress</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>125373</commentid>
    <comment_count>31</comment_count>
      <attachid>30935</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-06-11 14:15:15 -0700</bug_when>
    <thetext>Comment on attachment 30935
Speculative fix

Darin reviewed this (verbally) at the WebKit party.  Will land with updated comment shortly!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>125374</commentid>
    <comment_count>32</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-06-11 14:21:21 -0700</bug_when>
    <thetext>Hopefully the adjusted comment meets Darin&apos;s expectations.

Darin plans to do more work here, but that can really be broken off into a separate issue.

I&apos;ll leave this open for darin to move his patch elsewhere.  I&apos;ll clear the review flag though.

Committing to http://svn.webkit.org/repository/webkit/trunk ...
	M	WebCore/ChangeLog
	M	WebCore/dom/Document.cpp
	M	WebCore/dom/Range.cpp
	M	WebCore/dom/RangeBoundaryPoint.h
Committed r44617
</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>125375</commentid>
    <comment_count>33</comment_count>
      <attachid>30935</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-06-11 14:21:37 -0700</bug_when>
    <thetext>Comment on attachment 30935
Speculative fix

Landed in r44617</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>125881</commentid>
    <comment_count>34</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-06-14 22:17:23 -0700</bug_when>
    <thetext>This bug is fixed now. The work in progress is a fix for a different bug along with cleanup.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>30934</attachid>
            <date>2009-06-03 17:25:34 -0700</date>
            <delta_ts>2009-06-03 17:25:34 -0700</delta_ts>
            <desc>One attempt at a test case.</desc>
            <filename>range-normalize-crash.js</filename>
            <type>application/x-javascript</type>
            <size>2557</size>
            <attacher name="Eric Seidel (no email)">eric</attacher>
            
              <data encoding="base64">ZnVuY3Rpb24gZ2FyYmFnZUNvbGxlY3QoKQp7CiAgICAvLyBVc2UgR0NDb250cm9sbGVyIGlmIHdl
J3JlIHJ1bm5pbmcgaW4gRHVtcFJlbmRlclRyZWUsIG90aGVyd2lzZSB0cnkgdG8gdHJpZ2dlciBh
IGNvbGxlY3Rpb24gdmlhIGFsbG9jYXRpb25zLgogICAgaWYgKHdpbmRvdy5HQ0NvbnRyb2xsZXIp
CiAgICAgICAgR0NDb250cm9sbGVyLmNvbGxlY3QoKTsKICAgIGVsc2UgewogICAgICAgIGZvciAo
dmFyIHggPSAwOyB4IDwgMTAwMDA7IHgrKykKICAgICAgICAgICAgbmV3IE9iamVjdCgpOwogICAg
fQp9Cgp2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CmRvY3VtZW50LmJv
ZHkuYXBwZW5kQ2hpbGQoZGl2KTsKCmZ1bmN0aW9uIHJlbW92ZUFsbENoaWxkTm9kZXMoZWxlbWVu
dCkKewogICAgd2hpbGUoZWxlbWVudC5maXJzdENoaWxkKSB7CiAgICAgICAgZWxlbWVudC5yZW1v
dmVDaGlsZChlbGVtZW50LmZpcnN0Q2hpbGQpOwogICAgfQp9CgpmdW5jdGlvbiByZW1vdmVOb2Rl
QWZ0ZXJJbnNlcnRpb24oKSB7CiAgICAvLyBQcmV2ZW50IHRoZSBzZWNvbmQgdGV4dCBub2RlIGZy
b20gYmVpbmcgaW5zZXJ0ZWQgZHVyaW5nIHNwbGl0VGV4dAogICAgdmFyIG5ld1RleHROb2RlID0g
ZXZlbnQudGFyZ2V0OwogICAgbmV3VGV4dE5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChuZXdU
ZXh0Tm9kZSk7Cn0KCmZ1bmN0aW9uIGRpc2FibGVOb2RlSW5zZXJ0aW9uKCkKewogICAgZGl2LmFk
ZEV2ZW50TGlzdGVuZXIoIkRPTU5vZGVJbnNlcnRlZCIsIHJlbW92ZU5vZGVBZnRlckluc2VydGlv
biwgZmFsc2UpOwp9CgpmdW5jdGlvbiByZWVuYWJsZU5vZGVJbnNlcmF0aW9uKCkKewogICAgZGl2
LnJlbW92ZUV2ZW50TGlzdGVuZXIoIkRPTU5vZGVJbnNlcnRlZCIsIHJlbW92ZU5vZGVBZnRlcklu
c2VydGlvbiwgZmFsc2UpOwp9CgovLyBUaGlzIGNvZGUgdHJpZ2dlcnMgYSBidWcgaW4gVGV4dC5z
cGxpdFRleHQgd2hlcmUgd2UgdW5jb25kaXRpb25hbGx5Ci8vIGNhbGwgUmFuZ2VCb3VuZGFyeVBv
aW50OjpzZXQoKSBldmVuIGlmIG9sZE5vZGUtPm5leHRTaWJsaW5nKCkgaXMgbnVsbApmdW5jdGlv
biBhZGREZWxldGVkUmFuZ2VUb0RvY3VtZW50KCkKewogICAgcmVtb3ZlQWxsQ2hpbGROb2Rlcyhk
aXYpOwogICAgdmFyIHRleHQgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiQUIiKTsKICAgIGRp
di5hcHBlbmRDaGlsZCh0ZXh0KTsKICAgIAogICAgdmFyIHJhbmdlID0gZG9jdW1lbnQuY3JlYXRl
UmFuZ2UoKTsKICAgIHJhbmdlLnNldFN0YXJ0KHRleHQsIDApOwoKICAgIGRpc2FibGVOb2RlSW5z
ZXJ0aW9uKCk7CiAgICAvLyBUaGlzIGNhbGwgd2lsbCBoaXQgYW4gQVNTRVJUIGR1ZSB0byB2b2lk
IFJhbmdlOjp0ZXh0Tm9kZVNwbGl0KFRleHQqIG9sZE5vZGUpCiAgICAvLyBiZWluZyBjYWxsZWQg
d2l0aCBvbGROb2RlLT5uZXh0U2libGluZygpID09IE5VTEwKICAgIC8vIEluIHJlbGVhc2UgYnVp
bGRzLCB0aGUgQVNTRVJUIHdvbid0IGZpcmUgYW5kIGEgUmFuZ2UgYXR0YWNoZWQgdG8gdGhlIGRv
Y3VtZW50CiAgICAvLyB3aWxsIGVuZCB1cCB3aXRoIGFuIGludmFsaWQgc3RhcnQuICBSYW5nZXMg
d2l0aCBhbiBpbnZhbGlkIHN0YXJ0IGFyZW4ndAogICAgLy8gcHJvcGVybHkgZGV0YWNoZWQgaW4g
flJhbmdlLCBjYXVzaW5nIHRoZSBEb2N1bWVudCB0byBlbmQgdXAgd2l0aCBwb2ludGVycwogICAg
Ly8gdG8gZGVsZXRlZCByYW5nZXMuCiAgICB0ZXh0LnNwbGl0VGV4dCgxKTsKICAgIHJlZW5hYmxl
Tm9kZUluc2VyYXRpb24oKTsKfQoKLy8gQWRkIGEgYnVuY2ggb2YgZGVsZXRlZCByYW5nZXMgdG8g
dGhlIGRvY3VtZW50IHRvIG1ha2UgaXQgZWFzaWVyIHRvIGNyYXNoCmZvciAodmFyIHggPSAwOyB4
IDwgMTAwMDsgeCsrKSB7CiAgICBhZGREZWxldGVkUmFuZ2VUb0RvY3VtZW50KCk7Cn0KCi8vIFRo
ZSBhdHRhY2hlZCByYW5nZXMgYXJlIG5vdyBvdXQgb2Ygc2NvcGUuICBHYXJiYWdlIGNvbGxlY3Qg
dG8gbWFrZSBzdXJlIGl0J3MgZGVzdHJveWVkLgpnYXJiYWdlQ29sbGVjdCgpOwoKZGl2LmFwcGVu
ZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCJDIikpOwoKLy8gTWVyZ2UgIkEiIGFuZCAi
QyIgYW5kIGNhdXNlIGFsbCByYW5nZXMgdG8gYmUgbm90aWZpZWQKLy8gb2YgdGhpcyBtdXRhdGlv
biB0byB0aGUgRE9NLiAgQnV0IGluIHJlbGVhc2UgYnVpbGRzIHdlIGhhdmUgYSBkZWxldGVkCi8v
IHJhbmdlIGxlZnQgaW4gdGhlIERvY3VtZW50LCBzbyB3ZSdsbCBjcmFzaC4KLy8gVGhpcyBpcyBv
bmUgd2F5IHRvIHRyaXAgdGhlIGNyYXNoIHNlZW4gaW4gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcv
c2hvd19idWcuY2dpP2lkPTI2MDQ0CmRpdi5ub3JtYWxpemUoKTsKCnRlc3RQYXNzZWQoIlRoaXMg
dGVzdCBkaWQgbm90IGNyYXNoLiIpOwpzaG91bGRCZUVxdWFsVG9TdHJpbmcoImRpdi5pbm5lclRl
eHQiLCAiQUMiKTsKCi8vIENsZWFuIHVwIGFmdGVyIG91cnNlbHZlcwpkaXYucGFyZW50Tm9kZS5y
ZW1vdmVDaGlsZChkaXYpOwoKdmFyIHN1Y2Nlc3NmdWxseVBhcnNlZCA9IHRydWU7Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>30935</attachid>
            <date>2009-06-03 17:41:56 -0700</date>
            <delta_ts>2009-06-11 14:21:37 -0700</delta_ts>
            <desc>Speculative fix</desc>
            <filename>Speculative-fix.patch</filename>
            <type>text/plain</type>
            <size>5281</size>
            <attacher name="Eric Seidel (no email)">eric</attacher>
            
              <data encoding="base64">NTM3YzAxYzc0NDA0N2I0YmFhMzkyZWFiY2FkYjBiMTA0MmRmNmFiZQpkaWZmIC0tZ2l0IGEvV2Vi
Q29yZS9DaGFuZ2VMb2cgYi9XZWJDb3JlL0NoYW5nZUxvZwppbmRleCAzMjZkMGQyLi4yODdmMzJj
IDEwMDY0NAotLS0gYS9XZWJDb3JlL0NoYW5nZUxvZworKysgYi9XZWJDb3JlL0NoYW5nZUxvZwpA
QCAtMSwzICsxLDQ4IEBACisyMDA5LTA2LTAzICBFcmljIFNlaWRlbCAgPGVyaWNAd2Via2l0Lm9y
Zz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBDcmFz
aCBhdCBOb2RlOjpub2RlSW5kZXgoKQorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9z
aG93X2J1Zy5jZ2k/aWQ9MjYwNDQKKworICAgICAgICBUaGlzIGNyYXNoIHNlZW1zIHRvIGJlIGNh
dXNlZCBieSBjYWxsaW5nIG5vZGVJbmRleCgpIG9uCisgICAgICAgIGFuZCBpbnZhbGlkIE5vZGUg
cG9pbnRlci4gIEFzIGZhciBhcyBJIGNhbiB0ZWxsLCB0aGUgbW9zdCBsaWtlbHkKKyAgICAgICAg
ZXhwbGFuYXRpb24gaXMgdGhhdCB0aGUgUmFuZ2UgaG9sZGluZyB0aGUgbm9kZSBpcyBhY3R1YWxs
eQorICAgICAgICBkZWxldGVkIGFscmVhZHkgKHRodXMgdGhlIG1lbW9yeSBpcyBqdW5rKS4gIExv
b2tpbmcgYXQgdGhlIGNvZGUKKyAgICAgICAgUmFuZ2UgY2hhbmdlcyBtX3N0YXJ0LmNvbnRhaW5l
cigpIGluIGl0cyBkZXN0cnVjdG9yIHRvIHRlbGwgaWYKKyAgICAgICAgdGhlIHJhbmdlIGlzIGRl
dGFjaGVkIG9yIG5vdC4gIElmIHNvbWVob3cgbV9zdGFydC5jb250YWluZXIoKSB3YXMKKyAgICAg
ICAgY2xlYXJlZCwgdGhlIHJhbmdlIHdpbGwgbmV2ZXIgYmUgZGV0YWNoZWQgYW5kIHRoZSBEb2N1
bWVudCB3aWxsIGVuZAorICAgICAgICB1cCB3aXRoIHBvaW50ZXJzIHRvIGRlbGV0ZWQgcmFuZ2Vz
LiAgSSBkb24ndCBrbm93IGhvdyB0byByZXByb2R1Y2UgdGhpcworICAgICAgICBhbnkgcmVwcm9k
dWN0aW9uIEkgY291bGQgdGhpbmsgb2Ygd291bGQgaGl0IEFTU0VSVFMgaW4gRGVidWcgbW9kZS4K
KyAgICAgICAgT25lIHJlcHJvZHVjdGlvbiBJIHRyaWVkLCBkaWQgbm90IGNyYXNoIGluIFJlbGVh
c2UgbW9kZSwgZXZlbiB0aG91Z2ggaXQKKyAgICAgICAgZGlkIGluIERlYnVnIG1vZGUuCisKKyAg
ICAgICAgSSdtIG1ha2luZyBhIHNwZWN1bGF0aXZlIGZpeCBieSBhbHdheXMgZGV0YWNoaW5nIHRo
ZSBSYW5nZSBmcm9tIHRoZSBkb2N1bWVudAorICAgICAgICBkdXJpbmcgflJhbmdlLiAgVGhpcyBp
cyBzYWZlciwgYW5kIGFsbCB3ZSBsb3NlIGlzIGFuIEFTU0VSVCB0byBwcmV2ZW50IGRvdWJsZS1k
ZXRhY2guCisgICAgICAgIAorICAgICAgICBBbm90aGVyIHNvbHV0aW9uIHdvdWxkIGJlIHRvIGlu
c3RlYWQgc3RvcmUgYW4gbV9hdHRhY2hlZCBib29sIG9uIHRoZSBSYW5nZSBvYmplY3QsIG9yCisg
ICAgICAgIGV4cG9zZSBhIERvY3VtZW50Ojppc1JhbmdlQXR0YWNoZWQocmFuZ2UpIGNhbGwuICBF
aXRoZXIgb2YgdGhvc2Ugc29sdXRpb25zCisgICAgICAgIGNvdWxkIGFmZmVjdCBwZXJmb3JtYW5j
ZSwgc28gSSB3ZW50IHdpdGggdGhpcyBzb2x1dGlvbiBmb3Igbm93LgorCisgICAgICAgIEkgYWxz
byByZW1vdmVkIHRoZSBSYW5nZUJvdW5kYXJ5UG9pbnQgZGVmYXVsdCBjb25zdHJ1Y3RvcgorICAg
ICAgICBhcyBpdCBpcyBub3QgdXNlZCBhbnl3aGVyZSAoYW5kIGlzIG1vcmUgbGlrZWx5IHRvIGNh
dXNlIGNvbmZ1c2lvbikuCisKKyAgICAgICAgU2luY2UgSSBjYW4ndCByZXByb2R1Y2UgdGhlIGNy
YXNoLCBubyB0ZXN0LgorCisgICAgICAgICogZG9tL0RvY3VtZW50LmNwcDoKKyAgICAgICAgKFdl
YkNvcmU6OkRvY3VtZW50OjpkZXRhY2hSYW5nZSk6CisgICAgICAgICogZG9tL1JhbmdlLmNwcDoK
KyAgICAgICAgKFdlYkNvcmU6OlJhbmdlOjp+UmFuZ2UpOgorICAgICAgICAoV2ViQ29yZTo6UmFu
Z2U6OmRldGFjaCk6CisgICAgICAgICogZG9tL1JhbmdlQm91bmRhcnlQb2ludC5oOgorICAgICAg
ICAoV2ViQ29yZTo6UmFuZ2VCb3VuZGFyeVBvaW50OjpSYW5nZUJvdW5kYXJ5UG9pbnQpOgorICAg
ICAgICAgIFJhbmdlQm91bmRhcnlQb2ludHMgYWx3YXlzIGhhdmUgYW4gbV9jb250YWluZXJOb2Rl
LCBBU1NFUlQgdGhhdC4KKyAgICAgICAgKFdlYkNvcmU6OlJhbmdlQm91bmRhcnlQb2ludDo6c2V0
KToKKyAgICAgICAgICBBU1NFUlQoY29udGFpbmVyKSB0byBtYXRjaCBhbGwgdGhlIG90aGVyIGZ1
bmN0aW9ucy4KKyAgICAgICAgICBBbGwgY2FsbGVycyBhbHJlYWR5IEFTU0VSVChjb250YWluZXIp
LiAgU2luY2Ugd2Ugb25seQorICAgICAgICAgIGhhdmUgcmVwb3J0cyBpZiB0aGlzIGNyYXNoIGZy
b20gUmVsZWFzZSBtb2RlLCBJIGNhbiBvbmx5CisgICAgICAgICAgYXNzdW1lIHRoYXQgdGhvc2Ug
QVNTRVJUcyB3b3VsZCBoYXZlIGJlZW4gaGl0IGluIGEgRGVidWcgcmVwcm9kdWN0aW9uLgorCiAy
MDA5LTA2LTAzICBDaHJpcyBNYXJyaW4gIDxjbWFycmluQGFwcGxlLmNvbT4KIAogICAgICAgICBS
ZXZpZXdlZCBieSBTaW1vbiBGcmFzZXIgPHNpbW9uZnJAYXBwbGUuY29tPi4KZGlmZiAtLWdpdCBh
L1dlYkNvcmUvZG9tL0RvY3VtZW50LmNwcCBiL1dlYkNvcmUvZG9tL0RvY3VtZW50LmNwcAppbmRl
eCAwMDk2YjhkLi45NGU2ZGM2IDEwMDY0NAotLS0gYS9XZWJDb3JlL2RvbS9Eb2N1bWVudC5jcHAK
KysrIGIvV2ViQ29yZS9kb20vRG9jdW1lbnQuY3BwCkBAIC00Mjc5LDcgKzQyNzksOCBAQCB2b2lk
IERvY3VtZW50OjphdHRhY2hSYW5nZShSYW5nZSogcmFuZ2UpCiAKIHZvaWQgRG9jdW1lbnQ6OmRl
dGFjaFJhbmdlKFJhbmdlKiByYW5nZSkKIHsKLSAgICBBU1NFUlQobV9yYW5nZXMuY29udGFpbnMo
cmFuZ2UpKTsKKyAgICAvLyBXZSBkb24ndCBBU1NFUlQgbV9yYW5nZXMuY29udGFpbnMocmFuZ2Up
IHRvIGFsbG93IHVzIHRvIGNhbGwgdGhpcworICAgIC8vIHVuY29uZGl0aW9uYWxseSB0byBmaXg6
IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yNjA0NAogICAgIG1fcmFu
Z2VzLnJlbW92ZShyYW5nZSk7CiB9CiAKZGlmZiAtLWdpdCBhL1dlYkNvcmUvZG9tL1JhbmdlLmNw
cCBiL1dlYkNvcmUvZG9tL1JhbmdlLmNwcAppbmRleCA4YTNjYThmLi42MjlhN2FiIDEwMDY0NAot
LS0gYS9XZWJDb3JlL2RvbS9SYW5nZS5jcHAKKysrIGIvV2ViQ29yZS9kb20vUmFuZ2UuY3BwCkBA
IC05NSw4ICs5NSw4IEBAIFBhc3NSZWZQdHI8UmFuZ2U+IFJhbmdlOjpjcmVhdGUoUGFzc1JlZlB0
cjxEb2N1bWVudD4gb3duZXJEb2N1bWVudCwgY29uc3QgUG9zaXRpCiAKIFJhbmdlOjp+UmFuZ2Uo
KQogewotICAgIGlmIChtX3N0YXJ0LmNvbnRhaW5lcigpKQotICAgICAgICBtX293bmVyRG9jdW1l
bnQtPmRldGFjaFJhbmdlKHRoaXMpOworICAgIC8vIFdlIHVuY29uZGl0aW9uYWxseSBkZXRhY2gg
YXMgYSBzcGVjdWxhdGl2ZSBmaXggZm9yIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVn
LmNnaT9pZD0yNjA0NAorICAgIG1fb3duZXJEb2N1bWVudC0+ZGV0YWNoUmFuZ2UodGhpcyk7CiAK
ICNpZm5kZWYgTkRFQlVHCiAgICAgcmFuZ2VDb3VudGVyLmRlY3JlbWVudCgpOwpAQCAtMzc5LDcg
KzM3OSw2IEBAIFJhbmdlOjpDb21wYXJlUmVzdWx0cyBSYW5nZTo6Y29tcGFyZU5vZGUoTm9kZSog
cmVmTm9kZSwgRXhjZXB0aW9uQ29kZSYgZWMpCiAgICAgfQogfQogCi0KIHNob3J0IFJhbmdlOjpj
b21wYXJlQm91bmRhcnlQb2ludHMoQ29tcGFyZUhvdyBob3csIGNvbnN0IFJhbmdlKiBzb3VyY2VS
YW5nZSwgRXhjZXB0aW9uQ29kZSYgZWMpIGNvbnN0CiB7CiAgICAgaWYgKCFtX3N0YXJ0LmNvbnRh
aW5lcigpKSB7CkBAIC0xMDcwLDYgKzEwNjksNyBAQCBQYXNzUmVmUHRyPERvY3VtZW50RnJhZ21l
bnQ+IFJhbmdlOjpjcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQoY29uc3QgU3RyaW5nJiBtYXJrdQog
CiB2b2lkIFJhbmdlOjpkZXRhY2goRXhjZXB0aW9uQ29kZSYgZWMpCiB7CisgICAgLy8gQ2hlY2sg
Zmlyc3QgdG8gc2VlIGlmIHdlJ3ZlIGFscmVhZHkgZGV0YWNoZWQ6CiAgICAgaWYgKCFtX3N0YXJ0
LmNvbnRhaW5lcigpKSB7CiAgICAgICAgIGVjID0gSU5WQUxJRF9TVEFURV9FUlI7CiAgICAgICAg
IHJldHVybjsKZGlmZiAtLWdpdCBhL1dlYkNvcmUvZG9tL1JhbmdlQm91bmRhcnlQb2ludC5oIGIv
V2ViQ29yZS9kb20vUmFuZ2VCb3VuZGFyeVBvaW50LmgKaW5kZXggMmZkYTUxZi4uMWJiYmUxYSAx
MDA2NDQKLS0tIGEvV2ViQ29yZS9kb20vUmFuZ2VCb3VuZGFyeVBvaW50LmgKKysrIGIvV2ViQ29y
ZS9kb20vUmFuZ2VCb3VuZGFyeVBvaW50LmgKQEAgLTMzLDcgKzMzLDYgQEAgbmFtZXNwYWNlIFdl
YkNvcmUgewogCiBjbGFzcyBSYW5nZUJvdW5kYXJ5UG9pbnQgewogcHVibGljOgotICAgIFJhbmdl
Qm91bmRhcnlQb2ludCgpOwogICAgIGV4cGxpY2l0IFJhbmdlQm91bmRhcnlQb2ludChQYXNzUmVm
UHRyPE5vZGU+IGNvbnRhaW5lcik7CiAKICAgICBjb25zdCBQb3NpdGlvbiB0b1Bvc2l0aW9uKCkg
Y29uc3Q7CkBAIC02MywxNyArNjIsMTIgQEAgcHJpdmF0ZToKICAgICBOb2RlKiBtX2NoaWxkQmVm
b3JlQm91bmRhcnk7CiB9OwogCi1pbmxpbmUgUmFuZ2VCb3VuZGFyeVBvaW50OjpSYW5nZUJvdW5k
YXJ5UG9pbnQoKQotICAgIDogbV9vZmZzZXRJbkNvbnRhaW5lcigwKQotICAgICwgbV9jaGlsZEJl
Zm9yZUJvdW5kYXJ5KDApCi17Ci19Ci0KIGlubGluZSBSYW5nZUJvdW5kYXJ5UG9pbnQ6OlJhbmdl
Qm91bmRhcnlQb2ludChQYXNzUmVmUHRyPE5vZGU+IGNvbnRhaW5lcikKICAgICA6IG1fY29udGFp
bmVyTm9kZShjb250YWluZXIpCiAgICAgLCBtX29mZnNldEluQ29udGFpbmVyKDApCiAgICAgLCBt
X2NoaWxkQmVmb3JlQm91bmRhcnkoMCkKIHsKKyAgICBBU1NFUlQobV9jb250YWluZXJOb2RlKTsK
IH0KIAogaW5saW5lIE5vZGUqIFJhbmdlQm91bmRhcnlQb2ludDo6Y29udGFpbmVyKCkgY29uc3QK
QEAgLTExNiw2ICsxMTAsNyBAQCBpbmxpbmUgdm9pZCBSYW5nZUJvdW5kYXJ5UG9pbnQ6OmNsZWFy
KCkKIAogaW5saW5lIHZvaWQgUmFuZ2VCb3VuZGFyeVBvaW50OjpzZXQoUGFzc1JlZlB0cjxOb2Rl
PiBjb250YWluZXIsIGludCBvZmZzZXQsIE5vZGUqIGNoaWxkQmVmb3JlKQogeworICAgIEFTU0VS
VChjb250YWluZXIpOwogICAgIEFTU0VSVChvZmZzZXQgPj0gMCk7CiAgICAgQVNTRVJUKGNoaWxk
QmVmb3JlID09IChvZmZzZXQgPyBjb250YWluZXItPmNoaWxkTm9kZShvZmZzZXQgLSAxKSA6IDAp
KTsKICAgICBtX2NvbnRhaW5lck5vZGUgPSBjb250YWluZXI7Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>30960</attachid>
            <date>2009-06-04 13:49:32 -0700</date>
            <delta_ts>2009-06-05 18:06:25 -0700</delta_ts>
            <desc>fix; needs regression tests and perhaps to be split up since it fixes two bugs</desc>
            <filename>RangeMutationPatch.txt</filename>
            <type>text/plain</type>
            <size>32322</size>
            <attacher name="Darin Adler">darin</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA0NDQyNSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsOTEgQEAKKzIwMDktMDYtMDQgIERhcmluIEFkbGVyICA8ZGFyaW5AYXBwbGUuY29t
PgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFdBUk5J
Tkc6IE5PIFRFU1QgQ0FTRVMgQURERUQgT1IgQ0hBTkdFRAorCisgICAgICAgIEZpeGVkIGJ1ZyB3
aGVyZSBSYW5nZS5pbnNlcnROb2RlIGNyZWF0ZXMgZXh0cmEgZW1wdHkgdGV4dCBub2Rlcy4KKwor
ICAgICAgICBCdWcgMjYwNDQ6IENyYXNoIGF0IE5vZGU6Om5vZGVJbmRleCgpCisgICAgICAgIGh0
dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yNjA0NAorCisgICAgICAgICog
ZG9tL0NoYXJhY3RlckRhdGEuY3BwOgorICAgICAgICAoV2ViQ29yZTo6Q2hhcmFjdGVyRGF0YTo6
c2V0RGF0YSk6IENhbGwgdGV4dFJlbW92ZWQgYmVmb3JlCisgICAgICAgIGRpc3BhdGNoaW5nIERP
TSBtdXRhdGlvbiBldmVudHMuIFdlIG5lZWQgdG8gZml4IHVwIHJhbmdlcyBiZWZvcmUKKyAgICAg
ICAgaW52b2tpbmcgY29kZSB0aGF0IG1pZ2h0IGxvb2sgYXQgdGhvc2UgcmFuZ2VzLgorICAgICAg
ICAoV2ViQ29yZTo6Q2hhcmFjdGVyRGF0YTo6aW5zZXJ0RGF0YSk6IERpdHRvLCBmb3IgdGV4dElu
c2VydGVkLgorICAgICAgICAoV2ViQ29yZTo6Q2hhcmFjdGVyRGF0YTo6ZGVsZXRlRGF0YSk6IERp
dHRvLCBmb3IgdGV4dFJlbW92ZWQuCisgICAgICAgIChXZWJDb3JlOjpDaGFyYWN0ZXJEYXRhOjpy
ZXBsYWNlRGF0YSk6IERpdHRvLCBmb3IgYm90aC4KKworICAgICAgICAqIGRvbS9Eb2N1bWVudC5j
cHA6CisgICAgICAgIChXZWJDb3JlOjpEb2N1bWVudDo6dGV4dE5vZGVzV2lsbE1lcmdlKTogUmVu
YW1lZCB0byBtYWtlIGl0IGNsZWFyCisgICAgICAgIHRoaXMgaXMgY2FsbGVkIGJlZm9yZSB0aGUg
bWVyZ2UgaXMgY29tcGxldGUuCisgICAgICAgIChXZWJDb3JlOjpEb2N1bWVudDo6dGV4dE5vZGVX
aWxsU3BsaXQpOiBSZW5hbWVkIHRvIG1ha2UgaXQgY2xlYXIKKyAgICAgICAgdGhpcyBpcyBjYWxs
ZWQgYmVmb3JlIHRoZSBzcGxpdCBpcyBjb21wbGV0ZS4gQWRkZWQgYW4gYXJndW1lbnQgZm9yCisg
ICAgICAgIHRoZSBuZXcgbm9kZSBiZWNhdXNlIHRoaXMgaXMgbm93IGNhbGxlZCBiZWZvcmUgdGhh
dCBub2RlIGlzIGluIHRoZQorICAgICAgICBET00gdHJlZS4KKyAgICAgICAgKiBkb20vRG9jdW1l
bnQuaDogRGl0dG8uCisKKyAgICAgICAgKiBkb20vTm9kZS5jcHA6CisgICAgICAgIChXZWJDb3Jl
OjpOb2RlOjpub3JtYWxpemUpOiBDYWxsIHRleHROb2Rlc1dpbGxNZXJnZSBiZWZvcmUgZG9pbmcK
KyAgICAgICAgdGhlIERPTSBtdXRhdGlvbiwgYmVjYXVzZSB0aGF0IHdpbGwgZGlzcGF0Y2ggRE9N
IG11dGF0aW9uIGV2ZW50cy4KKworICAgICAgICAqIGRvbS9SYW5nZS5jcHA6CisgICAgICAgIChX
ZWJDb3JlOjpSYW5nZTo6aXNEZXRhY2hlZCk6IEFkZGVkLiBFcmljJ3MgY29tbWVudHMgbWFkZSBp
dCBjbGVhcgorICAgICAgICB0aGF0IHRoZSByZWxhdGlvbnNoaXAgb2YgbV9zdGFydC5jb250YWlu
ZXIoKSB0byAiZGV0YWNoZWQtbmVzcyIKKyAgICAgICAgd2FzIHNvbWV0aGluZyB0aGF0IHNob3Vs
ZCBiZSBtYWRlIGNsZWFyZXIgYXQgY2FsbCBzaXRlcy4KKyAgICAgICAgKFdlYkNvcmU6OlJhbmdl
Ojp+UmFuZ2UpOiBVc2UgaXNEZXRhY2hlZCgpLgorICAgICAgICAoV2ViQ29yZTo6UmFuZ2U6OnN0
YXJ0Q29udGFpbmVyKTogRGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpSYW5nZTo6c3RhcnRPZmZz
ZXQpOiBEaXR0by4KKyAgICAgICAgKFdlYkNvcmU6OlJhbmdlOjplbmRDb250YWluZXIpOiBEaXR0
by4KKyAgICAgICAgKFdlYkNvcmU6OlJhbmdlOjplbmRPZmZzZXQpOiBEaXR0by4KKyAgICAgICAg
KFdlYkNvcmU6OlJhbmdlOjpjb21tb25BbmNlc3RvckNvbnRhaW5lcik6IERpdHRvLgorICAgICAg
ICAoV2ViQ29yZTo6UmFuZ2U6OmNvbGxhcHNlZCk6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6
UmFuZ2U6OnNldFN0YXJ0KTogRGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpSYW5nZTo6c2V0RW5k
KTogRGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpSYW5nZTo6Y29sbGFwc2UpOiBEaXR0by4KKyAg
ICAgICAgKFdlYkNvcmU6OlJhbmdlOjppc1BvaW50SW5SYW5nZSk6IERpdHRvLiBBbHNvIGFkZGVk
IGNvbW1lbnRzIGFib3V0CisgICAgICAgIHRoZSBpbmNvcnJlY3QgdXNlIG9mIE5vZGU6OmF0dGFj
aGVkIGhlcmUsIHNvbWV0aW1lIHdlIHNob3VsZCByZXR1cm4KKyAgICAgICAgdG8gYW5kIGZpeC4K
KyAgICAgICAgKFdlYkNvcmU6OlJhbmdlOjpjb21wYXJlUG9pbnQpOiBEaXR0by4KKyAgICAgICAg
KFdlYkNvcmU6OlJhbmdlOjpjb21wYXJlTm9kZSk6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6
UmFuZ2U6OmNvbXBhcmVCb3VuZGFyeVBvaW50cyk6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6
UmFuZ2U6OmludGVyc2VjdHNOb2RlKTogRGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpSYW5nZTo6
Y2xvbmVDb250ZW50cyk6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6UmFuZ2U6Omluc2VydE5v
ZGUpOiBGaXhlZCBidWcgd2hlcmUgaW5zZXJ0Tm9kZSB3aWxsIGNyZWF0ZQorICAgICAgICBleHRy
YSBlbXB0eSB0ZXh0IG5vZGVzLgorICAgICAgICAoV2ViQ29yZTo6UmFuZ2U6OnRvU3RyaW5nKTog
RGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpSYW5nZTo6dGV4dCk6IFVzZSBpc0RldGFjaGVkKCku
CisgICAgICAgIChXZWJDb3JlOjpSYW5nZTo6Y3JlYXRlQ29udGV4dHVhbEZyYWdtZW50KTogRGl0
dG8uCisgICAgICAgIChXZWJDb3JlOjpSYW5nZTo6ZGV0YWNoKTogRGl0dG8uCisgICAgICAgIChX
ZWJDb3JlOjpSYW5nZTo6Y2xvbmVSYW5nZSk6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6UmFu
Z2U6OnNldFN0YXJ0QWZ0ZXIpOiBEaXR0by4KKyAgICAgICAgKFdlYkNvcmU6OlJhbmdlOjpzZXRF
bmRCZWZvcmUpOiBEaXR0by4KKyAgICAgICAgKFdlYkNvcmU6OlJhbmdlOjpzZXRFbmRBZnRlcik6
IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6UmFuZ2U6OnNlbGVjdE5vZGUpOiBEaXR0by4KKyAg
ICAgICAgKFdlYkNvcmU6OlJhbmdlOjpzZWxlY3ROb2RlQ29udGVudHMpOiBEaXR0by4KKyAgICAg
ICAgKFdlYkNvcmU6OlJhbmdlOjpzdXJyb3VuZENvbnRlbnRzKTogRGl0dG8uCisgICAgICAgIChX
ZWJDb3JlOjpSYW5nZTo6c2V0U3RhcnRCZWZvcmUpOiBEaXR0by4KKyAgICAgICAgKFdlYkNvcmU6
OlJhbmdlOjpjaGVja0RlbGV0ZUV4dHJhY3QpOiBEaXR0by4KKyAgICAgICAgKFdlYkNvcmU6OlJh
bmdlOjpmaXJzdE5vZGUpOiBEaXR0by4KKyAgICAgICAgKFdlYkNvcmU6OlJhbmdlOjpwYXN0TGFz
dE5vZGUpOiBEaXR0by4KKyAgICAgICAgKFdlYkNvcmU6OlJhbmdlOjp0ZXh0UmVjdHMpOiBEaXR0
by4KKyAgICAgICAgKFdlYkNvcmU6OlJhbmdlOjpmb3JtYXRGb3JEZWJ1Z2dlcik6IERpdHRvLgor
ICAgICAgICAoV2ViQ29yZTo6UmFuZ2U6Om1heFN0YXJ0T2Zmc2V0KTogRGl0dG8uCisgICAgICAg
IChXZWJDb3JlOjpSYW5nZTo6bWF4RW5kT2Zmc2V0KTogRGl0dG8uCisgICAgICAgIChXZWJDb3Jl
Ojpib3VuZGFyeVRleHROb2Rlc1dpbGxNZXJnZSk6IFVwZGF0ZWQgZm9yIG5hbWUgY2hhbmdlLgor
ICAgICAgICBBbHNvIGFkZGVkIG51bGwgY2hlY2tzLCB0byBtYWtlIHN1cmUgdGhhdCBpZiBhIG51
bGwgbm9kZSBwb2ludGVyCisgICAgICAgIHNvbWVob3cgc25lYWtzIGluIGhlcmUsIGl0IHdvbid0
IGJlIHN0b3JlZCBpbiB0aGUgUmFuZ2UuCisgICAgICAgIChXZWJDb3JlOjpSYW5nZTo6dGV4dE5v
ZGVzV2lsbE1lcmdlKTogVXBkYXRlZCBmb3IgbmFtZSBjaGFuZ2UuCisgICAgICAgIChXZWJDb3Jl
Ojpib3VuZGFyeVRleHROb2RlV2lsbFNwbGl0KTogVXBkYXRlZCBmb3IgbmFtZSBjaGFuZ2UgYW5k
IHRoZQorICAgICAgICBuZXcgYXJndW1lbnQuIEFsc28gYWRkZWQgYSBudWxsIGNoZWNrIGFzIGFi
b3ZlLgorICAgICAgICAoV2ViQ29yZTo6UmFuZ2U6OnRleHROb2RlV2lsbFNwbGl0KTogRGl0dG8u
CisgICAgICAgICogZG9tL1JhbmdlLmg6IFJlbmFtZWQuIEFsc28gYWRkZWQgdGhlIGlzRGV0YWNo
ZWQoKSBmdW5jdGlvbi4KKworICAgICAgICAqIGRvbS9UZXh0LmNwcDoKKyAgICAgICAgKFdlYkNv
cmU6OlRleHQ6OnNwbGl0VGV4dCk6IENhbGwgdGV4dE5vZGVXaWxsU3BsaXQgYmVmb3JlCisgICAg
ICAgIGRpc3BhdGNoaW5nIERPTSBtdXRhdGlvbiBldmVudHMuCisKIDIwMDktMDYtMDQgIEFuZHJl
aSBQb3Blc2N1IDxhbmRyZWlwQGdvb2dsZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgQWxl
eGV5IFByb3NrdXJ5YWtvdi4KSW5kZXg6IFdlYkNvcmUvZG9tL0NoYXJhY3RlckRhdGEuY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFdlYkNvcmUvZG9tL0NoYXJhY3RlckRhdGEuY3BwCShyZXZpc2lvbiA0NDQy
NSkKKysrIFdlYkNvcmUvZG9tL0NoYXJhY3RlckRhdGEuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01
Niw2ICs1Niw4IEBAIHZvaWQgQ2hhcmFjdGVyRGF0YTo6c2V0RGF0YShjb25zdCBTdHJpbmcKICAg
ICBSZWZQdHI8U3RyaW5nSW1wbD4gb2xkU3RyID0gbV9kYXRhOwogICAgIG1fZGF0YSA9IGRhdGFJ
bXBsOwogICAgIAorICAgIGRvY3VtZW50KCktPnRleHRSZW1vdmVkKHRoaXMsIDAsIG9sZExlbmd0
aCk7CisKICAgICBpZiAoKCFyZW5kZXJlcigpIHx8ICFyZW5kZXJlcklzTmVlZGVkKHJlbmRlcmVy
KCktPnN0eWxlKCkpKSAmJiBhdHRhY2hlZCgpKSB7CiAgICAgICAgIGRldGFjaCgpOwogICAgICAg
ICBhdHRhY2goKTsKQEAgLTYzLDggKzY1LDYgQEAgdm9pZCBDaGFyYWN0ZXJEYXRhOjpzZXREYXRh
KGNvbnN0IFN0cmluZwogICAgICAgICB0b1JlbmRlclRleHQocmVuZGVyZXIoKSktPnNldFRleHQo
bV9kYXRhKTsKICAgICAKICAgICBkaXNwYXRjaE1vZGlmaWVkRXZlbnQob2xkU3RyLmdldCgpKTsK
LSAgICAKLSAgICBkb2N1bWVudCgpLT50ZXh0UmVtb3ZlZCh0aGlzLCAwLCBvbGRMZW5ndGgpOwog
fQogCiBTdHJpbmcgQ2hhcmFjdGVyRGF0YTo6c3Vic3RyaW5nRGF0YSh1bnNpZ25lZCBvZmZzZXQs
IHVuc2lnbmVkIGNvdW50LCBFeGNlcHRpb25Db2RlJiBlYykKQEAgLTEwNSwxNSArMTA1LDE1IEBA
IHZvaWQgQ2hhcmFjdGVyRGF0YTo6aW5zZXJ0RGF0YSh1bnNpZ25lZCAKICAgICBSZWZQdHI8U3Ry
aW5nSW1wbD4gb2xkU3RyID0gbV9kYXRhOwogICAgIG1fZGF0YSA9IG5ld1N0ci5pbXBsKCk7CiAK
KyAgICBkb2N1bWVudCgpLT50ZXh0SW5zZXJ0ZWQodGhpcywgb2Zmc2V0LCBhcmcubGVuZ3RoKCkp
OworCiAgICAgaWYgKCghcmVuZGVyZXIoKSB8fCAhcmVuZGVyZXJJc05lZWRlZChyZW5kZXJlcigp
LT5zdHlsZSgpKSkgJiYgYXR0YWNoZWQoKSkgewogICAgICAgICBkZXRhY2goKTsKICAgICAgICAg
YXR0YWNoKCk7CiAgICAgfSBlbHNlIGlmIChyZW5kZXJlcigpKQogICAgICAgICB0b1JlbmRlclRl
eHQocmVuZGVyZXIoKSktPnNldFRleHRXaXRoT2Zmc2V0KG1fZGF0YSwgb2Zmc2V0LCAwKTsKLQot
ICAgIGRpc3BhdGNoTW9kaWZpZWRFdmVudChvbGRTdHIuZ2V0KCkpOwogICAgIAotICAgIGRvY3Vt
ZW50KCktPnRleHRJbnNlcnRlZCh0aGlzLCBvZmZzZXQsIGFyZy5sZW5ndGgoKSk7CisgICAgZGlz
cGF0Y2hNb2RpZmllZEV2ZW50KG9sZFN0ci5nZXQoKSk7CiB9CiAKIHZvaWQgQ2hhcmFjdGVyRGF0
YTo6ZGVsZXRlRGF0YSh1bnNpZ25lZCBvZmZzZXQsIHVuc2lnbmVkIGNvdW50LCBFeGNlcHRpb25D
b2RlJiBlYykKQEAgLTEzMyw3ICsxMzMsOSBAQCB2b2lkIENoYXJhY3RlckRhdGE6OmRlbGV0ZURh
dGEodW5zaWduZWQgCiAKICAgICBSZWZQdHI8U3RyaW5nSW1wbD4gb2xkU3RyID0gbV9kYXRhOwog
ICAgIG1fZGF0YSA9IG5ld1N0ci5pbXBsKCk7Ci0gICAgCisKKyAgICBkb2N1bWVudCgpLT50ZXh0
UmVtb3ZlZCh0aGlzLCBvZmZzZXQsIHJlYWxDb3VudCk7CisKICAgICBpZiAoKCFyZW5kZXJlcigp
IHx8ICFyZW5kZXJlcklzTmVlZGVkKHJlbmRlcmVyKCktPnN0eWxlKCkpKSAmJiBhdHRhY2hlZCgp
KSB7CiAgICAgICAgIGRldGFjaCgpOwogICAgICAgICBhdHRhY2goKTsKQEAgLTE0MSw4ICsxNDMs
NiBAQCB2b2lkIENoYXJhY3RlckRhdGE6OmRlbGV0ZURhdGEodW5zaWduZWQgCiAgICAgICAgIHRv
UmVuZGVyVGV4dChyZW5kZXJlcigpKS0+c2V0VGV4dFdpdGhPZmZzZXQobV9kYXRhLCBvZmZzZXQs
IGNvdW50KTsKIAogICAgIGRpc3BhdGNoTW9kaWZpZWRFdmVudChvbGRTdHIuZ2V0KCkpOwotCi0g
ICAgZG9jdW1lbnQoKS0+dGV4dFJlbW92ZWQodGhpcywgb2Zmc2V0LCByZWFsQ291bnQpOwogfQog
CiB2b2lkIENoYXJhY3RlckRhdGE6OnJlcGxhY2VEYXRhKHVuc2lnbmVkIG9mZnNldCwgdW5zaWdu
ZWQgY291bnQsIGNvbnN0IFN0cmluZyYgYXJnLCBFeGNlcHRpb25Db2RlJiBlYykKQEAgLTE2Myw2
ICsxNjMsOSBAQCB2b2lkIENoYXJhY3RlckRhdGE6OnJlcGxhY2VEYXRhKHVuc2lnbmVkCiAKICAg
ICBSZWZQdHI8U3RyaW5nSW1wbD4gb2xkU3RyID0gbV9kYXRhOwogICAgIG1fZGF0YSA9IG5ld1N0
ci5pbXBsKCk7CisgICAgCisgICAgZG9jdW1lbnQoKS0+dGV4dFJlbW92ZWQodGhpcywgb2Zmc2V0
LCByZWFsQ291bnQpOworICAgIGRvY3VtZW50KCktPnRleHRJbnNlcnRlZCh0aGlzLCBvZmZzZXQs
IGFyZy5sZW5ndGgoKSk7CiAKICAgICBpZiAoKCFyZW5kZXJlcigpIHx8ICFyZW5kZXJlcklzTmVl
ZGVkKHJlbmRlcmVyKCktPnN0eWxlKCkpKSAmJiBhdHRhY2hlZCgpKSB7CiAgICAgICAgIGRldGFj
aCgpOwpAQCAtMTcxLDEwICsxNzQsNiBAQCB2b2lkIENoYXJhY3RlckRhdGE6OnJlcGxhY2VEYXRh
KHVuc2lnbmVkCiAgICAgICAgIHRvUmVuZGVyVGV4dChyZW5kZXJlcigpKS0+c2V0VGV4dFdpdGhP
ZmZzZXQobV9kYXRhLCBvZmZzZXQsIGNvdW50KTsKICAgICAKICAgICBkaXNwYXRjaE1vZGlmaWVk
RXZlbnQob2xkU3RyLmdldCgpKTsKLSAgICAKLSAgICAvLyB1cGRhdGUgdGhlIG1hcmtlcnMgZm9y
IHNwZWxsIGNoZWNraW5nIGFuZCBncmFtbWFyIGNoZWNraW5nCi0gICAgZG9jdW1lbnQoKS0+dGV4
dFJlbW92ZWQodGhpcywgb2Zmc2V0LCByZWFsQ291bnQpOwotICAgIGRvY3VtZW50KCktPnRleHRJ
bnNlcnRlZCh0aGlzLCBvZmZzZXQsIGFyZy5sZW5ndGgoKSk7CiB9CiAKIFN0cmluZyBDaGFyYWN0
ZXJEYXRhOjpub2RlVmFsdWUoKSBjb25zdApJbmRleDogV2ViQ29yZS9kb20vRG9jdW1lbnQuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFdlYkNvcmUvZG9tL0RvY3VtZW50LmNwcAkocmV2aXNpb24gNDQ0MjUp
CisrKyBXZWJDb3JlL2RvbS9Eb2N1bWVudC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI2OTQsMjQg
KzI2OTQsMjQgQEAgdm9pZCBEb2N1bWVudDo6dGV4dFJlbW92ZWQoTm9kZSogdGV4dCwgdQogICAg
IHNoaWZ0TWFya2Vycyh0ZXh0LCBvZmZzZXQgKyBsZW5ndGgsIDAgLSBsZW5ndGgpOwogfQogCi12
b2lkIERvY3VtZW50Ojp0ZXh0Tm9kZXNNZXJnZWQoVGV4dCogb2xkTm9kZSwgdW5zaWduZWQgb2Zm
c2V0KQordm9pZCBEb2N1bWVudDo6dGV4dE5vZGVzV2lsbE1lcmdlKFRleHQqIG9sZE5vZGUsIHVu
c2lnbmVkIG9mZnNldCkKIHsKICAgICBpZiAoIWRpc2FibGVSYW5nZU11dGF0aW9uKHBhZ2UoKSkp
IHsKICAgICAgICAgTm9kZVdpdGhJbmRleCBvbGROb2RlV2l0aEluZGV4KG9sZE5vZGUpOwogICAg
ICAgICBIYXNoU2V0PFJhbmdlKj46OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IG1fcmFuZ2VzLmVuZCgp
OwogICAgICAgICBmb3IgKEhhc2hTZXQ8UmFuZ2UqPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3Jh
bmdlcy5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpCi0gICAgICAgICAgICAoKml0KS0+dGV4dE5v
ZGVzTWVyZ2VkKG9sZE5vZGVXaXRoSW5kZXgsIG9mZnNldCk7CisgICAgICAgICAgICAoKml0KS0+
dGV4dE5vZGVzV2lsbE1lcmdlKG9sZE5vZGVXaXRoSW5kZXgsIG9mZnNldCk7CiAgICAgfQogCiAg
ICAgLy8gRklYTUU6IFRoaXMgc2hvdWxkIHVwZGF0ZSBtYXJrZXJzIGZvciBzcGVsbGluZyBhbmQg
Z3JhbW1hciBjaGVja2luZy4KIH0KIAotdm9pZCBEb2N1bWVudDo6dGV4dE5vZGVTcGxpdChUZXh0
KiBvbGROb2RlKQordm9pZCBEb2N1bWVudDo6dGV4dE5vZGVXaWxsU3BsaXQoVGV4dCogb2xkTm9k
ZSwgVGV4dCogbmV3Tm9kZSkKIHsKICAgICBpZiAoIWRpc2FibGVSYW5nZU11dGF0aW9uKHBhZ2Uo
KSkpIHsKICAgICAgICAgSGFzaFNldDxSYW5nZSo+Ojpjb25zdF9pdGVyYXRvciBlbmQgPSBtX3Jh
bmdlcy5lbmQoKTsKICAgICAgICAgZm9yIChIYXNoU2V0PFJhbmdlKj46OmNvbnN0X2l0ZXJhdG9y
IGl0ID0gbV9yYW5nZXMuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KQotICAgICAgICAgICAgKCpp
dCktPnRleHROb2RlU3BsaXQob2xkTm9kZSk7CisgICAgICAgICAgICAoKml0KS0+dGV4dE5vZGVX
aWxsU3BsaXQob2xkTm9kZSwgbmV3Tm9kZSk7CiAgICAgfQogCiAgICAgLy8gRklYTUU6IFRoaXMg
c2hvdWxkIHVwZGF0ZSBtYXJrZXJzIGZvciBzcGVsbGluZyBhbmQgZ3JhbW1hciBjaGVja2luZy4K
SW5kZXg6IFdlYkNvcmUvZG9tL0RvY3VtZW50LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9kb20v
RG9jdW1lbnQuaAkocmV2aXNpb24gNDQ0MjUpCisrKyBXZWJDb3JlL2RvbS9Eb2N1bWVudC5oCSh3
b3JraW5nIGNvcHkpCkBAIC01NTgsOCArNTU4LDggQEAgcHVibGljOgogCiAgICAgdm9pZCB0ZXh0
SW5zZXJ0ZWQoTm9kZSosIHVuc2lnbmVkIG9mZnNldCwgdW5zaWduZWQgbGVuZ3RoKTsKICAgICB2
b2lkIHRleHRSZW1vdmVkKE5vZGUqLCB1bnNpZ25lZCBvZmZzZXQsIHVuc2lnbmVkIGxlbmd0aCk7
Ci0gICAgdm9pZCB0ZXh0Tm9kZXNNZXJnZWQoVGV4dCogb2xkTm9kZSwgdW5zaWduZWQgb2Zmc2V0
KTsKLSAgICB2b2lkIHRleHROb2RlU3BsaXQoVGV4dCogb2xkTm9kZSk7CisgICAgdm9pZCB0ZXh0
Tm9kZXNXaWxsTWVyZ2UoVGV4dCogb2xkTm9kZSwgdW5zaWduZWQgb2Zmc2V0KTsKKyAgICB2b2lk
IHRleHROb2RlV2lsbFNwbGl0KFRleHQqIG9sZE5vZGUsIFRleHQqIG5ld05vZGUpOwogCiAgICAg
RE9NV2luZG93KiBkZWZhdWx0VmlldygpIGNvbnN0IHsgcmV0dXJuIGRvbVdpbmRvdygpOyB9IAog
ICAgIERPTVdpbmRvdyogZG9tV2luZG93KCkgY29uc3Q7CkluZGV4OiBXZWJDb3JlL2RvbS9Ob2Rl
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2RvbS9Ob2RlLmNwcAkocmV2aXNpb24gNDQ0MjUp
CisrKyBXZWJDb3JlL2RvbS9Ob2RlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNjExLDkgKzYxMSw5
IEBAIHZvaWQgTm9kZTo6bm9ybWFsaXplKCkKIAogICAgICAgICAgICAgLy8gQm90aCBub24tZW1w
dHkgdGV4dCBub2Rlcy4gTWVyZ2UgdGhlbS4KICAgICAgICAgICAgIHVuc2lnbmVkIG9mZnNldCA9
IHRleHQtPmxlbmd0aCgpOworICAgICAgICAgICAgZG9jdW1lbnQoKS0+dGV4dE5vZGVzV2lsbE1l
cmdlKG5leHRUZXh0LmdldCgpLCBvZmZzZXQpOwogICAgICAgICAgICAgRXhjZXB0aW9uQ29kZSBl
YzsKICAgICAgICAgICAgIHRleHQtPmFwcGVuZERhdGEobmV4dFRleHQtPmRhdGEoKSwgZWMpOwot
ICAgICAgICAgICAgZG9jdW1lbnQoKS0+dGV4dE5vZGVzTWVyZ2VkKG5leHRUZXh0LmdldCgpLCBv
ZmZzZXQpOwogICAgICAgICAgICAgbmV4dFRleHQtPnJlbW92ZShlYyk7CiAgICAgICAgIH0KIApJ
bmRleDogV2ViQ29yZS9kb20vUmFuZ2UuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvZG9tL1Jh
bmdlLmNwcAkocmV2aXNpb24gNDQ0MjUpCisrKyBXZWJDb3JlL2RvbS9SYW5nZS5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTQ2LDYgKzQ2LDE4IEBAIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiBzdGF0aWMg
V1RGOjpSZWZDb3VudGVkTGVha0NvdW50ZXIgcmFuZ2VDb3VudGVyKCJSYW5nZSIpOwogI2VuZGlm
CiAKK2lubGluZSBib29sIFJhbmdlOjppc0RldGFjaGVkKCkgY29uc3QKK3sKKyAgICBpZiAobV9z
dGFydC5jb250YWluZXIoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIEFTU0VSVCghbV9z
dGFydC5vZmZzZXQoKSk7CisgICAgQVNTRVJUKCFtX3N0YXJ0LmNoaWxkQmVmb3JlKCkpOworICAg
IEFTU0VSVCghbV9lbmQuY29udGFpbmVyKCkpOworICAgIEFTU0VSVCghbV9lbmQub2Zmc2V0KCkp
OworICAgIEFTU0VSVCghbV9lbmQuY2hpbGRCZWZvcmUoKSk7CisgICAgcmV0dXJuIHRydWU7Cit9
CisKIGlubGluZSBSYW5nZTo6UmFuZ2UoUGFzc1JlZlB0cjxEb2N1bWVudD4gb3duZXJEb2N1bWVu
dCkKICAgICA6IG1fb3duZXJEb2N1bWVudChvd25lckRvY3VtZW50KQogICAgICwgbV9zdGFydCht
X293bmVyRG9jdW1lbnQpCkBAIC05NSw3ICsxMDcsNyBAQCBQYXNzUmVmUHRyPFJhbmdlPiBSYW5n
ZTo6Y3JlYXRlKFBhc3NSZWZQCiAKIFJhbmdlOjp+UmFuZ2UoKQogewotICAgIGlmIChtX3N0YXJ0
LmNvbnRhaW5lcigpKQorICAgIGlmICghaXNEZXRhY2hlZCgpKQogICAgICAgICBtX293bmVyRG9j
dW1lbnQtPmRldGFjaFJhbmdlKHRoaXMpOwogCiAjaWZuZGVmIE5ERUJVRwpAQCAtMTA1LDcgKzEx
Nyw3IEBAIFJhbmdlOjp+UmFuZ2UoKQogCiBOb2RlKiBSYW5nZTo6c3RhcnRDb250YWluZXIoRXhj
ZXB0aW9uQ29kZSYgZWMpIGNvbnN0CiB7Ci0gICAgaWYgKCFtX3N0YXJ0LmNvbnRhaW5lcigpKSB7
CisgICAgaWYgKGlzRGV0YWNoZWQoKSkgewogICAgICAgICBlYyA9IElOVkFMSURfU1RBVEVfRVJS
OwogICAgICAgICByZXR1cm4gMDsKICAgICB9CkBAIC0xMTUsNyArMTI3LDcgQEAgTm9kZSogUmFu
Z2U6OnN0YXJ0Q29udGFpbmVyKEV4Y2VwdGlvbkNvZAogCiBpbnQgUmFuZ2U6OnN0YXJ0T2Zmc2V0
KEV4Y2VwdGlvbkNvZGUmIGVjKSBjb25zdAogewotICAgIGlmICghbV9zdGFydC5jb250YWluZXIo
KSkgeworICAgIGlmIChpc0RldGFjaGVkKCkpIHsKICAgICAgICAgZWMgPSBJTlZBTElEX1NUQVRF
X0VSUjsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQpAQCAtMTI1LDcgKzEzNyw3IEBAIGludCBS
YW5nZTo6c3RhcnRPZmZzZXQoRXhjZXB0aW9uQ29kZSYgZWMKIAogTm9kZSogUmFuZ2U6OmVuZENv
bnRhaW5lcihFeGNlcHRpb25Db2RlJiBlYykgY29uc3QKIHsKLSAgICBpZiAoIW1fc3RhcnQuY29u
dGFpbmVyKCkpIHsKKyAgICBpZiAoaXNEZXRhY2hlZCgpKSB7CiAgICAgICAgIGVjID0gSU5WQUxJ
RF9TVEFURV9FUlI7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KQEAgLTEzNSw3ICsxNDcsNyBA
QCBOb2RlKiBSYW5nZTo6ZW5kQ29udGFpbmVyKEV4Y2VwdGlvbkNvZGUmCiAKIGludCBSYW5nZTo6
ZW5kT2Zmc2V0KEV4Y2VwdGlvbkNvZGUmIGVjKSBjb25zdAogewotICAgIGlmICghbV9zdGFydC5j
b250YWluZXIoKSkgeworICAgIGlmIChpc0RldGFjaGVkKCkpIHsKICAgICAgICAgZWMgPSBJTlZB
TElEX1NUQVRFX0VSUjsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQpAQCAtMTQ1LDcgKzE1Nyw3
IEBAIGludCBSYW5nZTo6ZW5kT2Zmc2V0KEV4Y2VwdGlvbkNvZGUmIGVjKSAKIAogTm9kZSogUmFu
Z2U6OmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyKEV4Y2VwdGlvbkNvZGUmIGVjKSBjb25zdAogewot
ICAgIGlmICghbV9zdGFydC5jb250YWluZXIoKSkgeworICAgIGlmIChpc0RldGFjaGVkKCkpIHsK
ICAgICAgICAgZWMgPSBJTlZBTElEX1NUQVRFX0VSUjsKICAgICAgICAgcmV0dXJuIDA7CiAgICAg
fQpAQCAtMTY2LDcgKzE3OCw3IEBAIE5vZGUqIFJhbmdlOjpjb21tb25BbmNlc3RvckNvbnRhaW5l
cihOb2QKIAogYm9vbCBSYW5nZTo6Y29sbGFwc2VkKEV4Y2VwdGlvbkNvZGUmIGVjKSBjb25zdAog
ewotICAgIGlmICghbV9zdGFydC5jb250YWluZXIoKSkgeworICAgIGlmIChpc0RldGFjaGVkKCkp
IHsKICAgICAgICAgZWMgPSBJTlZBTElEX1NUQVRFX0VSUjsKICAgICAgICAgcmV0dXJuIDA7CiAg
ICAgfQpAQCAtMTc2LDcgKzE4OCw3IEBAIGJvb2wgUmFuZ2U6OmNvbGxhcHNlZChFeGNlcHRpb25D
b2RlJiBlYykKIAogdm9pZCBSYW5nZTo6c2V0U3RhcnQoUGFzc1JlZlB0cjxOb2RlPiByZWZOb2Rl
LCBpbnQgb2Zmc2V0LCBFeGNlcHRpb25Db2RlJiBlYykKIHsKLSAgICBpZiAoIW1fc3RhcnQuY29u
dGFpbmVyKCkpIHsKKyAgICBpZiAoaXNEZXRhY2hlZCgpKSB7CiAgICAgICAgIGVjID0gSU5WQUxJ
RF9TVEFURV9FUlI7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC0yMTQsNyArMjI2LDcgQEAg
dm9pZCBSYW5nZTo6c2V0U3RhcnQoUGFzc1JlZlB0cjxOb2RlPiByZQogCiB2b2lkIFJhbmdlOjpz
ZXRFbmQoUGFzc1JlZlB0cjxOb2RlPiByZWZOb2RlLCBpbnQgb2Zmc2V0LCBFeGNlcHRpb25Db2Rl
JiBlYykKIHsKLSAgICBpZiAoIW1fc3RhcnQuY29udGFpbmVyKCkpIHsKKyAgICBpZiAoaXNEZXRh
Y2hlZCgpKSB7CiAgICAgICAgIGVjID0gSU5WQUxJRF9TVEFURV9FUlI7CiAgICAgICAgIHJldHVy
bjsKICAgICB9CkBAIC0yNTIsNyArMjY0LDcgQEAgdm9pZCBSYW5nZTo6c2V0RW5kKFBhc3NSZWZQ
dHI8Tm9kZT4gcmVmTgogCiB2b2lkIFJhbmdlOjpjb2xsYXBzZShib29sIHRvU3RhcnQsIEV4Y2Vw
dGlvbkNvZGUmIGVjKQogewotICAgIGlmICghbV9zdGFydC5jb250YWluZXIoKSkgeworICAgIGlm
IChpc0RldGFjaGVkKCkpIHsKICAgICAgICAgZWMgPSBJTlZBTElEX1NUQVRFX0VSUjsKICAgICAg
ICAgcmV0dXJuOwogICAgIH0KQEAgLTI2NSw3ICsyNzcsNyBAQCB2b2lkIFJhbmdlOjpjb2xsYXBz
ZShib29sIHRvU3RhcnQsIEV4Y2VwCiAKIGJvb2wgUmFuZ2U6OmlzUG9pbnRJblJhbmdlKE5vZGUq
IHJlZk5vZGUsIGludCBvZmZzZXQsIEV4Y2VwdGlvbkNvZGUmIGVjKQogewotICAgIGlmICghbV9z
dGFydC5jb250YWluZXIoKSkgeworICAgIGlmIChpc0RldGFjaGVkKCkpIHsKICAgICAgICAgZWMg
PSBJTlZBTElEX1NUQVRFX0VSUjsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KQEAgLTI3
NSw2ICsyODcsMTEgQEAgYm9vbCBSYW5nZTo6aXNQb2ludEluUmFuZ2UoTm9kZSogcmVmTm9kZQog
ICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCisgICAgLy8gRklYTUU6IGF0dGFjaGVkKCkg
bWVhbnMgc29tZXRoaW5nIGVudGlyZWx5IGRpZmZlcmVudCBmb3IgRE9NIG5vZGVzIHRoYW4gZm9y
CisgICAgLy8gRE9NIHJhbmdlcywgYW5kIGl0J3Mgbm90IGFwcHJvcHJpYXRlIHRvIGJlIGNoZWNr
aW5nIGl0IGhlcmUuIFByZXN1bWFibHkgdGhpcworICAgIC8vIHdhbnRzIHRvIGNoZWNrIGZvciBu
b2RlcyB0aGF0IGFyZSBub3QgaW4gdGhlIGRvY3VtZW50IGhpZXJhcmNoeSwgYnV0IGl0J3MKKyAg
ICAvLyBub3QgY2xlYXIgd2UgbmVlZCBhIHNwZWNpYWwgY2FzZSBmb3IgdGhpcyBpZiB3ZSBtYWtl
IHN1cmUgY29tcGFyZUJvdW5kYXJ5UG9pbnRzCisgICAgLy8gY2FuIGhhbmRsZSB0aGlzIGNhc2Uu
CiAgICAgaWYgKCFyZWZOb2RlLT5hdHRhY2hlZCgpKSB7CiAgICAgICAgIC8vIEZpcmVmb3ggZG9l
c24ndCB0aHJvdyBhbiBleGNlcHRpb24gZm9yIHRoaXMgY2FzZTsgaXQgcmV0dXJucyBmYWxzZS4K
ICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMzAwLDcgKzMxNyw3IEBAIHNob3J0IFJhbmdlOjpj
b21wYXJlUG9pbnQoTm9kZSogcmVmTm9kZSwKICAgICAvLyBUaGlzIG1ldGhvZCByZXR1cm5zIC0x
LCAwIG9yIDEgZGVwZW5kaW5nIG9uIGlmIHRoZSBwb2ludCBkZXNjcmliZWQgYnkgdGhlIAogICAg
IC8vIHJlZk5vZGUgbm9kZSBhbmQgYW4gb2Zmc2V0IHdpdGhpbiB0aGUgbm9kZSBpcyBiZWZvcmUs
IHNhbWUgYXMsIG9yIGFmdGVyIHRoZSByYW5nZSByZXNwZWN0aXZlbHkuCiAKLSAgICBpZiAoIW1f
c3RhcnQuY29udGFpbmVyKCkpIHsKKyAgICBpZiAoaXNEZXRhY2hlZCgpKSB7CiAgICAgICAgIGVj
ID0gSU5WQUxJRF9TVEFURV9FUlI7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KQEAgLTMxMCw3
ICszMjcsMTcgQEAgc2hvcnQgUmFuZ2U6OmNvbXBhcmVQb2ludChOb2RlKiByZWZOb2RlLAogICAg
ICAgICByZXR1cm4gMDsKICAgICB9CiAKLSAgICBpZiAoIXJlZk5vZGUtPmF0dGFjaGVkKCkgfHwg
cmVmTm9kZS0+ZG9jdW1lbnQoKSAhPSBtX293bmVyRG9jdW1lbnQpIHsKKyAgICBpZiAocmVmTm9k
ZS0+ZG9jdW1lbnQoKSAhPSBtX293bmVyRG9jdW1lbnQpIHsKKyAgICAgICAgZWMgPSBXUk9OR19E
T0NVTUVOVF9FUlI7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8vIEZJWE1FOiBh
dHRhY2hlZCgpIG1lYW5zIHNvbWV0aGluZyBlbnRpcmVseSBkaWZmZXJlbnQgZm9yIERPTSBub2Rl
cyB0aGFuIGZvcgorICAgIC8vIERPTSByYW5nZXMsIGFuZCBpdCdzIG5vdCBhcHByb3ByaWF0ZSB0
byBiZSBjaGVja2luZyBpdCBoZXJlLiBQcmVzdW1hYmx5IHRoaXMKKyAgICAvLyB3YW50cyB0byBj
aGVjayBmb3Igbm9kZXMgdGhhdCBhcmUgbm90IGluIHRoZSBkb2N1bWVudCBoaWVyYXJjaHksIGJ1
dCBpdCdzCisgICAgLy8gbm90IGNsZWFyIHdlIG5lZWQgYSBzcGVjaWFsIGNhc2UgZm9yIHRoaXMg
aWYgd2UgbWFrZSBzdXJlIGNvbXBhcmVCb3VuZGFyeVBvaW50cworICAgIC8vIGNhbiBoYW5kbGUg
dGhpcyBjYXNlLgorICAgIGlmICghcmVmTm9kZS0+YXR0YWNoZWQoKSkgewogICAgICAgICBlYyA9
IFdST05HX0RPQ1VNRU5UX0VSUjsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQpAQCAtMzQyLDE1
ICszNjksMjUgQEAgUmFuZ2U6OkNvbXBhcmVSZXN1bHRzIFJhbmdlOjpjb21wYXJlTm9kZQogICAg
ICAgICBlYyA9IE5PVF9GT1VORF9FUlI7CiAgICAgICAgIHJldHVybiBOT0RFX0JFRk9SRTsKICAg
ICB9Ci0gICAgCi0gICAgaWYgKCFtX3N0YXJ0LmNvbnRhaW5lcigpICYmIHJlZk5vZGUtPmF0dGFj
aGVkKCkpIHsKLSAgICAgICAgZWMgPSBJTlZBTElEX1NUQVRFX0VSUjsKLSAgICAgICAgcmV0dXJu
IE5PREVfQkVGT1JFOwotICAgIH0KIAotICAgIGlmIChtX3N0YXJ0LmNvbnRhaW5lcigpICYmICFy
ZWZOb2RlLT5hdHRhY2hlZCgpKSB7Ci0gICAgICAgIC8vIEZpcmVmb3ggZG9lc24ndCB0aHJvdyBh
biBleGNlcHRpb24gZm9yIHRoaXMgY2FzZTsgaXQgcmV0dXJucyAwLgotICAgICAgICByZXR1cm4g
Tk9ERV9CRUZPUkU7CisgICAgaWYgKGlzRGV0YWNoZWQoKSkgeworICAgICAgICAvLyBGSVhNRTog
YXR0YWNoZWQoKSBtZWFucyBzb21ldGhpbmcgZW50aXJlbHkgZGlmZmVyZW50IGZvciBET00gbm9k
ZXMgdGhhbiBmb3IKKyAgICAgICAgLy8gRE9NIHJhbmdlcywgYW5kIGl0J3Mgbm90IGFwcHJvcHJp
YXRlIHRvIGJlIGNoZWNraW5nIGl0IGhlcmUuIFByZXN1bWFibHkgdGhpcworICAgICAgICAvLyB3
YW50cyB0byBjaGVjayBmb3Igbm9kZXMgdGhhdCBhcmUgaW4gdGhlIGRvY3VtZW50IGhpZXJhcmNo
eSwgYnV0IGl0J3MKKyAgICAgICAgLy8gbm90IGNsZWFyIHdlIG5lZWQgYSBzcGVjaWFsIGNhc2Ug
Zm9yIHRoaXMuCisgICAgICAgIGlmIChyZWZOb2RlLT5hdHRhY2hlZCgpKSB7CisgICAgICAgICAg
ICBlYyA9IElOVkFMSURfU1RBVEVfRVJSOworICAgICAgICAgICAgcmV0dXJuIE5PREVfQkVGT1JF
OworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gRklYTUU6IGF0dGFjaGVkKCkg
bWVhbnMgc29tZXRoaW5nIGVudGlyZWx5IGRpZmZlcmVudCBmb3IgRE9NIG5vZGVzIHRoYW4gZm9y
CisgICAgICAgIC8vIERPTSByYW5nZXMsIGFuZCBpdCdzIG5vdCBhcHByb3ByaWF0ZSB0byBiZSBj
aGVja2luZyBpdCBoZXJlLiBQcmVzdW1hYmx5IHRoaXMKKyAgICAgICAgLy8gd2FudHMgdG8gY2hl
Y2sgZm9yIG5vZGVzIHRoYXQgYXJlIG5vdCBpbiB0aGUgZG9jdW1lbnQgaGllcmFyY2h5LCBidXQg
aXQncworICAgICAgICAvLyBub3QgY2xlYXIgd2UgbmVlZCBhIHNwZWNpYWwgY2FzZSBmb3IgdGhp
cy4KKyAgICAgICAgaWYgKCFyZWZOb2RlLT5hdHRhY2hlZCgpKSB7CisgICAgICAgICAgICAvLyBG
aXJlZm94IGRvZXNuJ3QgdGhyb3cgYW4gZXhjZXB0aW9uIGZvciB0aGlzIGNhc2U7IGl0IHJldHVy
bnMgMC4KKyAgICAgICAgICAgIHJldHVybiBOT0RFX0JFRk9SRTsKKyAgICAgICAgfQogICAgIH0K
IAogICAgIGlmIChyZWZOb2RlLT5kb2N1bWVudCgpICE9IG1fb3duZXJEb2N1bWVudCkgewpAQCAt
MzYyLDggKzM5OSw4IEBAIFJhbmdlOjpDb21wYXJlUmVzdWx0cyBSYW5nZTo6Y29tcGFyZU5vZGUK
ICAgICBpbnQgbm9kZUluZGV4ID0gcmVmTm9kZS0+bm9kZUluZGV4KCk7CiAgICAgCiAgICAgaWYg
KCFwYXJlbnROb2RlKSB7Ci0gICAgICAgIC8vIGlmIHRoZSBub2RlIGlzIHRoZSB0b3AgZG9jdW1l
bnQgd2Ugc2hvdWxkIHJldHVybiBOT0RFX0JFRk9SRV9BTkRfQUZURVIKLSAgICAgICAgLy8gYnV0
IHdlIHRocm93IHRvIG1hdGNoIGZpcmVmb3ggYmVoYXZpb3IKKyAgICAgICAgLy8gSWYgdGhlIG5v
ZGUgaXMgdGhlIGRvY3VtZW50IHdlIHNob3VsZCByZXR1cm4gTk9ERV9CRUZPUkVfQU5EX0FGVEVS
LAorICAgICAgICAvLyBidXQgd2UgdGhyb3cgdG8gbWF0Y2ggRmlyZWZveCBiZWhhdmlvci4KICAg
ICAgICAgZWMgPSBOT1RfRk9VTkRfRVJSOwogICAgICAgICByZXR1cm4gTk9ERV9CRUZPUkU7CiAg
ICAgfQpAQCAtMzgyLDcgKzQxOSw3IEBAIFJhbmdlOjpDb21wYXJlUmVzdWx0cyBSYW5nZTo6Y29t
cGFyZU5vZGUKIAogc2hvcnQgUmFuZ2U6OmNvbXBhcmVCb3VuZGFyeVBvaW50cyhDb21wYXJlSG93
IGhvdywgY29uc3QgUmFuZ2UqIHNvdXJjZVJhbmdlLCBFeGNlcHRpb25Db2RlJiBlYykgY29uc3QK
IHsKLSAgICBpZiAoIW1fc3RhcnQuY29udGFpbmVyKCkpIHsKKyAgICBpZiAoaXNEZXRhY2hlZCgp
KSB7CiAgICAgICAgIGVjID0gSU5WQUxJRF9TVEFURV9FUlI7CiAgICAgICAgIHJldHVybiAwOwog
ICAgIH0KQEAgLTU1MSwzMSArNTg4LDU0IEBAIGJvb2wgUmFuZ2U6OmludGVyc2VjdHNOb2RlKE5v
ZGUqIHJlZk5vZGUKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICAKLSAgICBpZiAo
KCFtX3N0YXJ0LmNvbnRhaW5lcigpICYmIHJlZk5vZGUtPmF0dGFjaGVkKCkpCi0gICAgICAgICAg
ICB8fCAobV9zdGFydC5jb250YWluZXIoKSAmJiAhcmVmTm9kZS0+YXR0YWNoZWQoKSkKLSAgICAg
ICAgICAgIHx8IHJlZk5vZGUtPmRvY3VtZW50KCkgIT0gbV9vd25lckRvY3VtZW50KSB7Ci0gICAg
ICAgIC8vIEZpcmVmb3ggZG9lc24ndCB0aHJvdyBhbiBleGNlcHRpb24gZm9yIHRoZXNlIGNhc2Vz
OyBpdCByZXR1cm5zIGZhbHNlLgorICAgIGlmIChyZWZOb2RlLT5kb2N1bWVudCgpICE9IG1fb3du
ZXJEb2N1bWVudCkgeworICAgICAgICAvLyBGaXJlZm94IGRvZXNuJ3QgdGhyb3cgYW4gZXhjZXB0
aW9uIGZvciB0aGlzIGNhc2U7IGl0IHJldHVybnMgZmFsc2UuCiAgICAgICAgIHJldHVybiBmYWxz
ZTsKICAgICB9CiAKKyAgICBpZiAoaXNEZXRhY2hlZCgpKSB7CisgICAgICAgIC8vIEZJWE1FOiBh
dHRhY2hlZCgpIG1lYW5zIHNvbWV0aGluZyBlbnRpcmVseSBkaWZmZXJlbnQgZm9yIERPTSBub2Rl
cyB0aGFuIGZvcgorICAgICAgICAvLyBET00gcmFuZ2VzLCBhbmQgaXQncyBub3QgYXBwcm9wcmlh
dGUgdG8gYmUgY2hlY2tpbmcgaXQgaGVyZS4gUHJlc3VtYWJseSB0aGlzCisgICAgICAgIC8vIHdh
bnRzIHRvIGNoZWNrIGZvciBub2RlcyB0aGF0IGFyZSBub3QgaW4gdGhlIGRvY3VtZW50IGhpZXJh
cmNoeSwgYnV0IGl0J3MKKyAgICAgICAgLy8gbm90IGNsZWFyIHdlIG5lZWQgYSBzcGVjaWFsIGNh
c2UgZm9yIHRoaXMuCisgICAgICAgIGlmIChyZWZOb2RlLT5hdHRhY2hlZCgpKSB7CisgICAgICAg
ICAgICAvLyBGaXJlZm94IGRvZXNuJ3QgdGhyb3cgYW4gZXhjZXB0aW9uIGZvciB0aGlzIGNhc2U7
IGl0IHJldHVybnMgZmFsc2UuCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0K
KyAgICB9IGVsc2UgeworICAgICAgICAvLyBGSVhNRTogYXR0YWNoZWQoKSBtZWFucyBzb21ldGhp
bmcgZW50aXJlbHkgZGlmZmVyZW50IGZvciBET00gbm9kZXMgdGhhbiBmb3IKKyAgICAgICAgLy8g
RE9NIHJhbmdlcywgYW5kIGl0J3Mgbm90IGFwcHJvcHJpYXRlIHRvIGJlIGNoZWNraW5nIGl0IGhl
cmUuIFByZXN1bWFibHkgdGhpcworICAgICAgICAvLyB3YW50cyB0byBjaGVjayBmb3Igbm9kZXMg
dGhhdCBhcmUgbm90IGluIHRoZSBkb2N1bWVudCBoaWVyYXJjaHksIGJ1dCBpdCdzCisgICAgICAg
IC8vIG5vdCBjbGVhciB3ZSBuZWVkIGEgc3BlY2lhbCBjYXNlIGZvciB0aGlzLgorICAgICAgICBp
ZiAoIXJlZk5vZGUtPmF0dGFjaGVkKCkpIHsKKyAgICAgICAgICAgIC8vIEZpcmVmb3ggZG9lc24n
dCB0aHJvdyBhbiBleGNlcHRpb24gZm9yIHRoaXMgY2FzZTsgaXQgcmV0dXJucyBmYWxzZS4KKyAg
ICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIE5vZGUqIHBh
cmVudE5vZGUgPSByZWZOb2RlLT5wYXJlbnROb2RlKCk7CiAgICAgaW50IG5vZGVJbmRleCA9IHJl
Zk5vZGUtPm5vZGVJbmRleCgpOwotICAgIAorCiAgICAgaWYgKCFwYXJlbnROb2RlKSB7Ci0gICAg
ICAgIC8vIGlmIHRoZSBub2RlIGlzIHRoZSB0b3AgZG9jdW1lbnQgd2Ugc2hvdWxkIHJldHVybiBO
T0RFX0JFRk9SRV9BTkRfQUZURVIKLSAgICAgICAgLy8gYnV0IHdlIHRocm93IHRvIG1hdGNoIGZp
cmVmb3ggYmVoYXZpb3IKKyAgICAgICAgLy8gSWYgdGhlIG5vZGUgaXMgdGhlIGRvY3VtZW50IHdl
IHNob3VsZCByZXR1cm4gTk9ERV9CRUZPUkVfQU5EX0FGVEVSLAorICAgICAgICAvLyBidXQgd2Ug
dGhyb3cgdG8gbWF0Y2ggRmlyZWZveCBiZWhhdmlvci4KICAgICAgICAgZWMgPSBOT1RfRk9VTkRf
RVJSOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgaWYgKGNvbXBhcmVQb2lu
dChwYXJlbnROb2RlLCBub2RlSW5kZXgsIGVjKSA8IDAgJiYgLy8gc3RhcnRzIGJlZm9yZSBzdGFy
dAotICAgICAgICBjb21wYXJlUG9pbnQocGFyZW50Tm9kZSwgbm9kZUluZGV4ICsgMSwgZWMpIDwg
MCkgeyAvLyBlbmRzIGJlZm9yZSBzdGFydAorICAgIGVjID0gMDsKKyAgICBpbnQgZmlyc3RDb21w
YXJpc29uID0gY29tcGFyZVBvaW50KHBhcmVudE5vZGUsIG5vZGVJbmRleCwgZWMpOworICAgIGlm
IChlYykKICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0gZWxzZSBpZiAoY29tcGFyZVBvaW50
KHBhcmVudE5vZGUsIG5vZGVJbmRleCwgZWMpID4gMCAmJiAvLyBzdGFydHMgYWZ0ZXIgZW5kCi0g
ICAgICAgICAgICAgICBjb21wYXJlUG9pbnQocGFyZW50Tm9kZSwgbm9kZUluZGV4ICsgMSwgZWMp
ID4gMCkgeyAvLyBlbmRzIGFmdGVyIGVuZAorCisgICAgLy8gc3RhcnRzIGJlZm9yZSBzdGFydCBh
bmQgZW5kcyBiZWZvcmUgc3RhcnQKKyAgICBpZiAoZmlyc3RDb21wYXJpc29uIDwgMCAmJiBjb21w
YXJlUG9pbnQocGFyZW50Tm9kZSwgbm9kZUluZGV4ICsgMSwgZWMpIDwgMCkKICAgICAgICAgcmV0
dXJuIGZhbHNlOwotICAgIH0KLSAgICAKKworICAgIC8vIHN0YXJ0cyBhZnRlciBlbmQgYW5kIGVu
ZHMgYWZ0ZXIgZW5kCisgICAgaWYgKGZpcnN0Q29tcGFyaXNvbiA+IDAgJiYgY29tcGFyZVBvaW50
KHBhcmVudE5vZGUsIG5vZGVJbmRleCArIDEsIGVjKSA+IDApCisgICAgICAgIHJldHVybiBmYWxz
ZTsKKwogICAgIHJldHVybiB0cnVlOyAvLyBhbGwgb3RoZXIgY2FzZXMKIH0KIApAQCAtODg1LDcg
Kzk0NSw3IEBAIFBhc3NSZWZQdHI8RG9jdW1lbnRGcmFnbWVudD4gUmFuZ2U6OmV4dHIKIAogUGFz
c1JlZlB0cjxEb2N1bWVudEZyYWdtZW50PiBSYW5nZTo6Y2xvbmVDb250ZW50cyhFeGNlcHRpb25D
b2RlJiBlYykKIHsKLSAgICBpZiAoIW1fc3RhcnQuY29udGFpbmVyKCkpIHsKKyAgICBpZiAoaXNE
ZXRhY2hlZCgpKSB7CiAgICAgICAgIGVjID0gSU5WQUxJRF9TVEFURV9FUlI7CiAgICAgICAgIHJl
dHVybiAwOwogICAgIH0KQEAgLTg5OSw3ICs5NTksNyBAQCB2b2lkIFJhbmdlOjppbnNlcnROb2Rl
KFBhc3NSZWZQdHI8Tm9kZT4gCiAKICAgICBlYyA9IDA7CiAKLSAgICBpZiAoIW1fc3RhcnQuY29u
dGFpbmVyKCkpIHsKKyAgICBpZiAoaXNEZXRhY2hlZCgpKSB7CiAgICAgICAgIGVjID0gSU5WQUxJ
RF9TVEFURV9FUlI7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC05NzcsMTcgKzEwMzcsMzEg
QEAgdm9pZCBSYW5nZTo6aW5zZXJ0Tm9kZShQYXNzUmVmUHRyPE5vZGU+IAogCiAgICAgYm9vbCBj
b2xsYXBzZWQgPSBtX3N0YXJ0ID09IG1fZW5kOwogICAgIGlmIChzdGFydElzVGV4dCkgewotICAg
ICAgICBSZWZQdHI8VGV4dD4gbmV3VGV4dCA9IHN0YXRpY19jYXN0PFRleHQqPihtX3N0YXJ0LmNv
bnRhaW5lcigpKS0+c3BsaXRUZXh0KG1fc3RhcnQub2Zmc2V0KCksIGVjKTsKLSAgICAgICAgaWYg
KGVjKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBtX3N0YXJ0LmNvbnRhaW5lcigpLT5w
YXJlbnROb2RlKCktPmluc2VydEJlZm9yZShuZXdOb2RlLnJlbGVhc2UoKSwgbmV3VGV4dC5nZXQo
KSwgZWMpOworICAgICAgICBSZWZQdHI8VGV4dD4gc3RhcnRUZXh0Tm9kZSA9IHN0YXRpY19jYXN0
PFRleHQqPihtX3N0YXJ0LmNvbnRhaW5lcigpKTsKKyAgICAgICAgUmVmUHRyPE5vZGU+IG5vZGVU
b0luc2VydEJlZm9yZTsKKyAgICAgICAgdW5zaWduZWQgc3RhcnRPZmZzZXQgPSBtX3N0YXJ0Lm9m
ZnNldCgpOworICAgICAgICBpZiAoIXN0YXJ0T2Zmc2V0KQorICAgICAgICAgICAgbm9kZVRvSW5z
ZXJ0QmVmb3JlID0gc3RhcnRUZXh0Tm9kZTsKKyAgICAgICAgZWxzZSBpZiAoc3RhcnRPZmZzZXQg
Pj0gc3RhcnRUZXh0Tm9kZS0+bGVuZ3RoKCkpCisgICAgICAgICAgICBub2RlVG9JbnNlcnRCZWZv
cmUgPSBzdGFydFRleHROb2RlLT5uZXh0U2libGluZygpOworICAgICAgICBlbHNlIHsKKyAgICAg
ICAgICAgIG5vZGVUb0luc2VydEJlZm9yZSA9IHN0YXJ0VGV4dE5vZGUtPnNwbGl0VGV4dChzdGFy
dE9mZnNldCwgZWMpOworICAgICAgICAgICAgaWYgKGVjKQorICAgICAgICAgICAgICAgIHJldHVy
bjsKKyAgICAgICAgfQorICAgICAgICBSZWZQdHI8Tm9kZT4gY29udGFpbmVyID0gc3RhcnRUZXh0
Tm9kZS0+cGFyZW50Tm9kZSgpOworICAgICAgICBjb250YWluZXItPmluc2VydEJlZm9yZShuZXdO
b2RlLnJlbGVhc2UoKSwgbm9kZVRvSW5zZXJ0QmVmb3JlLmdldCgpLCBlYyk7CiAgICAgICAgIGlm
IChlYykKICAgICAgICAgICAgIHJldHVybjsKIAogICAgICAgICAvLyBUaGlzIHNwZWNpYWwgY2Fz
ZSBkb2Vzbid0IHNlZW0gdG8gbWF0Y2ggdGhlIERPTSBzcGVjaWZpY2F0aW9uLCBidXQgaXQncyBj
dXJyZW50bHkgcmVxdWlyZWQKICAgICAgICAgLy8gdG8gcGFzcyBBY2lkMy4gV2UgbWlnaHQgbGF0
ZXIgZGVjaWRlIHRvIHJlbW92ZSB0aGlzLgotICAgICAgICBpZiAoY29sbGFwc2VkKQotICAgICAg
ICAgICAgbV9lbmQuc2V0VG9CZWZvcmVDaGlsZChuZXdUZXh0LmdldCgpKTsKKyAgICAgICAgaWYg
KGNvbGxhcHNlZCkgeworICAgICAgICAgICAgaWYgKG5vZGVUb0luc2VydEJlZm9yZSkKKyAgICAg
ICAgICAgICAgICBtX2VuZC5zZXRUb0JlZm9yZUNoaWxkKG5vZGVUb0luc2VydEJlZm9yZS5nZXQo
KSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbV9lbmQuc2V0VG9FbmRPZk5v
ZGUoY29udGFpbmVyLmdldCgpKTsKKyAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIFJl
ZlB0cjxOb2RlPiBsYXN0Q2hpbGQ7CiAgICAgICAgIGlmIChjb2xsYXBzZWQpCkBAIC0xMDA3LDcg
KzEwODEsNyBAQCB2b2lkIFJhbmdlOjppbnNlcnROb2RlKFBhc3NSZWZQdHI8Tm9kZT4gCiAKIFN0
cmluZyBSYW5nZTo6dG9TdHJpbmcoRXhjZXB0aW9uQ29kZSYgZWMpIGNvbnN0CiB7Ci0gICAgaWYg
KCFtX3N0YXJ0LmNvbnRhaW5lcigpKSB7CisgICAgaWYgKGlzRGV0YWNoZWQoKSkgewogICAgICAg
ICBlYyA9IElOVkFMSURfU1RBVEVfRVJSOwogICAgICAgICByZXR1cm4gU3RyaW5nKCk7CiAgICAg
fQpAQCAtMTAzNSw3ICsxMTA5LDcgQEAgU3RyaW5nIFJhbmdlOjp0b0hUTUwoKSBjb25zdAogCiBT
dHJpbmcgUmFuZ2U6OnRleHQoKSBjb25zdAogewotICAgIGlmICghbV9zdGFydC5jb250YWluZXIo
KSkKKyAgICBpZiAoaXNEZXRhY2hlZCgpKQogICAgICAgICByZXR1cm4gU3RyaW5nKCk7CiAKICAg
ICAvLyBXZSBuZWVkIHRvIHVwZGF0ZSBsYXlvdXQsIHNpbmNlIHBsYWluVGV4dCB1c2VzIGxpbmUg
Ym94ZXMgaW4gdGhlIHJlbmRlciB0cmVlLgpAQCAtMTA0Nyw3ICsxMTIxLDcgQEAgU3RyaW5nIFJh
bmdlOjp0ZXh0KCkgY29uc3QKIAogUGFzc1JlZlB0cjxEb2N1bWVudEZyYWdtZW50PiBSYW5nZTo6
Y3JlYXRlQ29udGV4dHVhbEZyYWdtZW50KGNvbnN0IFN0cmluZyYgbWFya3VwLCBFeGNlcHRpb25D
b2RlJiBlYykgY29uc3QKIHsKLSAgICBpZiAoIW1fc3RhcnQuY29udGFpbmVyKCkpIHsKKyAgICBp
ZiAoaXNEZXRhY2hlZCgpKSB7CiAgICAgICAgIGVjID0gSU5WQUxJRF9TVEFURV9FUlI7CiAgICAg
ICAgIHJldHVybiAwOwogICAgIH0KQEAgLTEwNzAsNyArMTE0NCw3IEBAIFBhc3NSZWZQdHI8RG9j
dW1lbnRGcmFnbWVudD4gUmFuZ2U6OmNyZWEKIAogdm9pZCBSYW5nZTo6ZGV0YWNoKEV4Y2VwdGlv
bkNvZGUmIGVjKQogewotICAgIGlmICghbV9zdGFydC5jb250YWluZXIoKSkgeworICAgIGlmIChp
c0RldGFjaGVkKCkpIHsKICAgICAgICAgZWMgPSBJTlZBTElEX1NUQVRFX0VSUjsKICAgICAgICAg
cmV0dXJuOwogICAgIH0KQEAgLTExNzAsNyArMTI0NCw3IEBAIHZvaWQgUmFuZ2U6OmNoZWNrTm9k
ZUJBKE5vZGUqIG4sIEV4Y2VwdGkKIAogUGFzc1JlZlB0cjxSYW5nZT4gUmFuZ2U6OmNsb25lUmFu
Z2UoRXhjZXB0aW9uQ29kZSYgZWMpIGNvbnN0CiB7Ci0gICAgaWYgKCFtX3N0YXJ0LmNvbnRhaW5l
cigpKSB7CisgICAgaWYgKGlzRGV0YWNoZWQoKSkgewogICAgICAgICBlYyA9IElOVkFMSURfU1RB
VEVfRVJSOwogICAgICAgICByZXR1cm4gMDsKICAgICB9CkBAIC0xMTgwLDcgKzEyNTQsNyBAQCBQ
YXNzUmVmUHRyPFJhbmdlPiBSYW5nZTo6Y2xvbmVSYW5nZShFeGNlCiAKIHZvaWQgUmFuZ2U6OnNl
dFN0YXJ0QWZ0ZXIoTm9kZSogcmVmTm9kZSwgRXhjZXB0aW9uQ29kZSYgZWMpCiB7Ci0gICAgaWYg
KCFtX3N0YXJ0LmNvbnRhaW5lcigpKSB7CisgICAgaWYgKGlzRGV0YWNoZWQoKSkgewogICAgICAg
ICBlYyA9IElOVkFMSURfU1RBVEVfRVJSOwogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtMTIw
NSw3ICsxMjc5LDcgQEAgdm9pZCBSYW5nZTo6c2V0U3RhcnRBZnRlcihOb2RlKiByZWZOb2RlLAog
CiB2b2lkIFJhbmdlOjpzZXRFbmRCZWZvcmUoTm9kZSogcmVmTm9kZSwgRXhjZXB0aW9uQ29kZSYg
ZWMpCiB7Ci0gICAgaWYgKCFtX3N0YXJ0LmNvbnRhaW5lcigpKSB7CisgICAgaWYgKGlzRGV0YWNo
ZWQoKSkgewogICAgICAgICBlYyA9IElOVkFMSURfU1RBVEVfRVJSOwogICAgICAgICByZXR1cm47
CiAgICAgfQpAQCAtMTIzMCw3ICsxMzA0LDcgQEAgdm9pZCBSYW5nZTo6c2V0RW5kQmVmb3JlKE5v
ZGUqIHJlZk5vZGUsIAogCiB2b2lkIFJhbmdlOjpzZXRFbmRBZnRlcihOb2RlKiByZWZOb2RlLCBF
eGNlcHRpb25Db2RlJiBlYykKIHsKLSAgICBpZiAoIW1fc3RhcnQuY29udGFpbmVyKCkpIHsKKyAg
ICBpZiAoaXNEZXRhY2hlZCgpKSB7CiAgICAgICAgIGVjID0gSU5WQUxJRF9TVEFURV9FUlI7CiAg
ICAgICAgIHJldHVybjsKICAgICB9CkBAIC0xMjU2LDcgKzEzMzAsNyBAQCB2b2lkIFJhbmdlOjpz
ZXRFbmRBZnRlcihOb2RlKiByZWZOb2RlLCBFCiAKIHZvaWQgUmFuZ2U6OnNlbGVjdE5vZGUoTm9k
ZSogcmVmTm9kZSwgRXhjZXB0aW9uQ29kZSYgZWMpCiB7Ci0gICAgaWYgKCFtX3N0YXJ0LmNvbnRh
aW5lcigpKSB7CisgICAgaWYgKGlzRGV0YWNoZWQoKSkgewogICAgICAgICBlYyA9IElOVkFMSURf
U1RBVEVfRVJSOwogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtMTMxOCw3ICsxMzkyLDcgQEAg
dm9pZCBSYW5nZTo6c2VsZWN0Tm9kZShOb2RlKiByZWZOb2RlLCBFeAogCiB2b2lkIFJhbmdlOjpz
ZWxlY3ROb2RlQ29udGVudHMoTm9kZSogcmVmTm9kZSwgRXhjZXB0aW9uQ29kZSYgZWMpCiB7Ci0g
ICAgaWYgKCFtX3N0YXJ0LmNvbnRhaW5lcigpKSB7CisgICAgaWYgKGlzRGV0YWNoZWQoKSkgewog
ICAgICAgICBlYyA9IElOVkFMSURfU1RBVEVfRVJSOwogICAgICAgICByZXR1cm47CiAgICAgfQpA
QCAtMTM1OSw3ICsxNDMzLDcgQEAgdm9pZCBSYW5nZTo6c3Vycm91bmRDb250ZW50cyhQYXNzUmVm
UHRyPAogewogICAgIFJlZlB0cjxOb2RlPiBuZXdQYXJlbnQgPSBwYXNzTmV3UGFyZW50OwogCi0g
ICAgaWYgKCFtX3N0YXJ0LmNvbnRhaW5lcigpKSB7CisgICAgaWYgKGlzRGV0YWNoZWQoKSkgewog
ICAgICAgICBlYyA9IElOVkFMSURfU1RBVEVfRVJSOwogICAgICAgICByZXR1cm47CiAgICAgfQpA
QCAtMTQ1Nyw3ICsxNTMxLDcgQEAgdm9pZCBSYW5nZTo6c3Vycm91bmRDb250ZW50cyhQYXNzUmVm
UHRyPAogCiB2b2lkIFJhbmdlOjpzZXRTdGFydEJlZm9yZShOb2RlKiByZWZOb2RlLCBFeGNlcHRp
b25Db2RlJiBlYykKIHsKLSAgICBpZiAoIW1fc3RhcnQuY29udGFpbmVyKCkpIHsKKyAgICBpZiAo
aXNEZXRhY2hlZCgpKSB7CiAgICAgICAgIGVjID0gSU5WQUxJRF9TVEFURV9FUlI7CiAgICAgICAg
IHJldHVybjsKICAgICB9CkBAIC0xNDgyLDcgKzE1NTYsNyBAQCB2b2lkIFJhbmdlOjpzZXRTdGFy
dEJlZm9yZShOb2RlKiByZWZOb2RlCiAKIHZvaWQgUmFuZ2U6OmNoZWNrRGVsZXRlRXh0cmFjdChF
eGNlcHRpb25Db2RlJiBlYykKIHsKLSAgICBpZiAoIW1fc3RhcnQuY29udGFpbmVyKCkpIHsKKyAg
ICBpZiAoaXNEZXRhY2hlZCgpKSB7CiAgICAgICAgIGVjID0gSU5WQUxJRF9TVEFURV9FUlI7CiAg
ICAgICAgIHJldHVybjsKICAgICB9CkBAIC0xNTI0LDcgKzE1OTgsNyBAQCBib29sIFJhbmdlOjpj
b250YWluZWRCeVJlYWRPbmx5KCkgY29uc3QKIAogTm9kZSogUmFuZ2U6OmZpcnN0Tm9kZSgpIGNv
bnN0CiB7Ci0gICAgaWYgKCFtX3N0YXJ0LmNvbnRhaW5lcigpKQorICAgIGlmIChpc0RldGFjaGVk
KCkpCiAgICAgICAgIHJldHVybiAwOwogICAgIGlmIChtX3N0YXJ0LmNvbnRhaW5lcigpLT5vZmZz
ZXRJbkNoYXJhY3RlcnMoKSkKICAgICAgICAgcmV0dXJuIG1fc3RhcnQuY29udGFpbmVyKCk7CkBA
IC0xNTY4LDcgKzE2NDIsNyBAQCBOb2RlKiBSYW5nZTo6c2hhZG93VHJlZVJvb3ROb2RlKCkgY29u
c3QKIAogTm9kZSogUmFuZ2U6OnBhc3RMYXN0Tm9kZSgpIGNvbnN0CiB7Ci0gICAgaWYgKCFtX3N0
YXJ0LmNvbnRhaW5lcigpIHx8ICFtX2VuZC5jb250YWluZXIoKSkKKyAgICBpZiAoaXNEZXRhY2hl
ZCgpKQogICAgICAgICByZXR1cm4gMDsKICAgICBpZiAobV9lbmQuY29udGFpbmVyKCktPm9mZnNl
dEluQ2hhcmFjdGVycygpKQogICAgICAgICByZXR1cm4gbV9lbmQuY29udGFpbmVyKCktPnRyYXZl
cnNlTmV4dFNpYmxpbmcoKTsKQEAgLTE1OTAsNyArMTY2NCw3IEBAIEludFJlY3QgUmFuZ2U6OmJv
dW5kaW5nQm94KCkKIAogdm9pZCBSYW5nZTo6dGV4dFJlY3RzKFZlY3RvcjxJbnRSZWN0PiYgcmVj
dHMsIGJvb2wgdXNlU2VsZWN0aW9uSGVpZ2h0KQogewotICAgIGlmICghbV9zdGFydC5jb250YWlu
ZXIoKSB8fCAhbV9lbmQuY29udGFpbmVyKCkpCisgICAgaWYgKGlzRGV0YWNoZWQoKSkKICAgICAg
ICAgcmV0dXJuOwogCiAgICAgTm9kZSogc3RhcnRDb250YWluZXIgPSBtX3N0YXJ0LmNvbnRhaW5l
cigpOwpAQCAtMTYxNSw3ICsxNjg5LDcgQEAgdm9pZCBSYW5nZTo6Zm9ybWF0Rm9yRGVidWdnZXIo
Y2hhciogYnVmZgogICAgIFN0cmluZyByZXN1bHQ7CiAgICAgU3RyaW5nIHM7CiAgICAgCi0gICAg
aWYgKCFtX3N0YXJ0LmNvbnRhaW5lcigpIHx8ICFtX2VuZC5jb250YWluZXIoKSkKKyAgICBpZiAo
aXNEZXRhY2hlZCgpKQogICAgICAgICByZXN1bHQgPSAiPGVtcHR5PiI7CiAgICAgZWxzZSB7CiAg
ICAgICAgIGNoYXIgc1tGb3JtYXRCdWZmZXJTaXplXTsKQEAgLTE2NTgsNyArMTczMiw3IEBAIFBh
c3NSZWZQdHI8UmFuZ2U+IHJhbmdlT2ZDb250ZW50cyhOb2RlKiAKIAogaW50IFJhbmdlOjptYXhT
dGFydE9mZnNldCgpIGNvbnN0CiB7Ci0gICAgaWYgKCFtX3N0YXJ0LmNvbnRhaW5lcigpKQorICAg
IGlmIChpc0RldGFjaGVkKCkpCiAgICAgICAgIHJldHVybiAwOwogICAgIGlmICghbV9zdGFydC5j
b250YWluZXIoKS0+b2Zmc2V0SW5DaGFyYWN0ZXJzKCkpCiAgICAgICAgIHJldHVybiBtX3N0YXJ0
LmNvbnRhaW5lcigpLT5jaGlsZE5vZGVDb3VudCgpOwpAQCAtMTY2Nyw3ICsxNzQxLDcgQEAgaW50
IFJhbmdlOjptYXhTdGFydE9mZnNldCgpIGNvbnN0CiAKIGludCBSYW5nZTo6bWF4RW5kT2Zmc2V0
KCkgY29uc3QKIHsKLSAgICBpZiAoIW1fZW5kLmNvbnRhaW5lcigpKQorICAgIGlmIChpc0RldGFj
aGVkKCkpCiAgICAgICAgIHJldHVybiAwOwogICAgIGlmICghbV9lbmQuY29udGFpbmVyKCktPm9m
ZnNldEluQ2hhcmFjdGVycygpKQogICAgICAgICByZXR1cm4gbV9lbmQuY29udGFpbmVyKCktPmNo
aWxkTm9kZUNvdW50KCk7CkBAIC0xNzU1LDE1ICsxODI5LDI4IEBAIHZvaWQgUmFuZ2U6OnRleHRS
ZW1vdmVkKE5vZGUqIHRleHQsIHVuc2kKICAgICBib3VuZGFyeVRleHRSZW1vdmVkKG1fZW5kLCB0
ZXh0LCBvZmZzZXQsIGxlbmd0aCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBib3VuZGFyeVRl
eHROb2Rlc01lcmdlZChSYW5nZUJvdW5kYXJ5UG9pbnQmIGJvdW5kYXJ5LCBOb2RlV2l0aEluZGV4
JiBvbGROb2RlLCB1bnNpZ25lZCBvZmZzZXQpCitzdGF0aWMgaW5saW5lIHZvaWQgYm91bmRhcnlU
ZXh0Tm9kZXNXaWxsTWVyZ2UoUmFuZ2VCb3VuZGFyeVBvaW50JiBib3VuZGFyeSwgTm9kZVdpdGhJ
bmRleCYgb2xkTm9kZSwgdW5zaWduZWQgb2Zmc2V0KQogewotICAgIGlmIChib3VuZGFyeS5jb250
YWluZXIoKSA9PSBvbGROb2RlLm5vZGUoKSkKLSAgICAgICAgYm91bmRhcnkuc2V0KG9sZE5vZGUu
bm9kZSgpLT5wcmV2aW91c1NpYmxpbmcoKSwgYm91bmRhcnkub2Zmc2V0KCkgKyBvZmZzZXQsIDAp
OwotICAgIGVsc2UgaWYgKGJvdW5kYXJ5LmNvbnRhaW5lcigpID09IG9sZE5vZGUubm9kZSgpLT5w
YXJlbnROb2RlKCkgJiYgYm91bmRhcnkub2Zmc2V0KCkgPT0gb2xkTm9kZS5pbmRleCgpKQotICAg
ICAgICBib3VuZGFyeS5zZXQob2xkTm9kZS5ub2RlKCktPnByZXZpb3VzU2libGluZygpLCBvZmZz
ZXQsIDApOworICAgIC8vIEV2ZW4gdGhvdWdoIHRoZSBjYWxsZXIgYXNzZXJ0cyB0aGUgcGFyZW50
IG5vZGUgYW5kIHByZXZpb3VzIHNpYmxpbmcgYXJlIG5vdCAwLAorICAgIC8vIHdlIGRvdWJsZS1j
aGVjayB0aGF0IGhlcmUgYW5kIHJldHVybiwgYmVjYXVzZSB0aGUgcmVwZXJjdXNzaW9ucyBvZiBz
ZXR0aW5nIGEKKyAgICAvLyBjb250YWluZXIgbm9kZSBvZiBhIGJvdW5kYXJ5IHRvIDAgYXJlIHNl
cmlvdXMuCisgICAgaWYgKGJvdW5kYXJ5LmNvbnRhaW5lcigpID09IG9sZE5vZGUubm9kZSgpKSB7
CisgICAgICAgIE5vZGUqIG5ld05vZGUgPSBvbGROb2RlLm5vZGUoKS0+cHJldmlvdXNTaWJsaW5n
KCk7CisgICAgICAgIGlmICghbmV3Tm9kZSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAg
Ym91bmRhcnkuc2V0KG5ld05vZGUsIGJvdW5kYXJ5Lm9mZnNldCgpICsgb2Zmc2V0LCAwKTsKKyAg
ICAgICAgcmV0dXJuOworICAgIH0KKyAgICBOb2RlKiBjb250YWluZXIgPSBvbGROb2RlLm5vZGUo
KS0+cGFyZW50Tm9kZSgpOworICAgIGlmIChjb250YWluZXIgJiYgYm91bmRhcnkuY29udGFpbmVy
KCkgPT0gY29udGFpbmVyICYmIGJvdW5kYXJ5Lm9mZnNldCgpID09IG9sZE5vZGUuaW5kZXgoKSkg
eworICAgICAgICBOb2RlKiBuZXdOb2RlID0gb2xkTm9kZS5ub2RlKCktPnByZXZpb3VzU2libGlu
ZygpOworICAgICAgICBpZiAoIW5ld05vZGUpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAg
IGJvdW5kYXJ5LnNldChuZXdOb2RlLCBvZmZzZXQsIDApOworICAgIH0KIH0KIAotdm9pZCBSYW5n
ZTo6dGV4dE5vZGVzTWVyZ2VkKE5vZGVXaXRoSW5kZXgmIG9sZE5vZGUsIHVuc2lnbmVkIG9mZnNl
dCkKK3ZvaWQgUmFuZ2U6OnRleHROb2Rlc1dpbGxNZXJnZShOb2RlV2l0aEluZGV4JiBvbGROb2Rl
LCB1bnNpZ25lZCBvZmZzZXQpCiB7CiAgICAgQVNTRVJUKG9sZE5vZGUubm9kZSgpKTsKICAgICBB
U1NFUlQob2xkTm9kZS5ub2RlKCktPmRvY3VtZW50KCkgPT0gbV9vd25lckRvY3VtZW50KTsKQEAg
LTE3NzEsMzAgKzE4NTgsMzUgQEAgdm9pZCBSYW5nZTo6dGV4dE5vZGVzTWVyZ2VkKE5vZGVXaXRo
SW5kZQogICAgIEFTU0VSVChvbGROb2RlLm5vZGUoKS0+aXNUZXh0Tm9kZSgpKTsKICAgICBBU1NF
UlQob2xkTm9kZS5ub2RlKCktPnByZXZpb3VzU2libGluZygpKTsKICAgICBBU1NFUlQob2xkTm9k
ZS5ub2RlKCktPnByZXZpb3VzU2libGluZygpLT5pc1RleHROb2RlKCkpOwotICAgIGJvdW5kYXJ5
VGV4dE5vZGVzTWVyZ2VkKG1fc3RhcnQsIG9sZE5vZGUsIG9mZnNldCk7Ci0gICAgYm91bmRhcnlU
ZXh0Tm9kZXNNZXJnZWQobV9lbmQsIG9sZE5vZGUsIG9mZnNldCk7CisgICAgYm91bmRhcnlUZXh0
Tm9kZXNXaWxsTWVyZ2UobV9zdGFydCwgb2xkTm9kZSwgb2Zmc2V0KTsKKyAgICBib3VuZGFyeVRl
eHROb2Rlc1dpbGxNZXJnZShtX2VuZCwgb2xkTm9kZSwgb2Zmc2V0KTsKIH0KIAotc3RhdGljIGlu
bGluZSB2b2lkIGJvdW5kYXJ5VGV4dE5vZGVzU3BsaXQoUmFuZ2VCb3VuZGFyeVBvaW50JiBib3Vu
ZGFyeSwgVGV4dCogb2xkTm9kZSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBib3VuZGFyeVRleHROb2Rl
V2lsbFNwbGl0KFJhbmdlQm91bmRhcnlQb2ludCYgYm91bmRhcnksIFRleHQqIG9sZE5vZGUsIFRl
eHQqIG5ld05vZGUpCiB7CisgICAgLy8gRXZlbiB0aG91Z2ggdGhlIGNhbGxlciBhc3NlcnRzIG5l
d05vZGUgaXMgbm90IDAsIHdlIGRvdWJsZS1jaGVjayB0aGF0IGhlcmUgYW5kIHJldHVybiwKKyAg
ICAvLyBiZWNhdXNlIHRoZSByZXBlcmN1c3Npb25zIG9mIHNldHRpbmcgYSBjb250YWluZXIgbm9k
ZSBvZiBhIGJvdW5kYXJ5IHRvIDAgYXJlIHNlcmlvdXMuCiAgICAgaWYgKGJvdW5kYXJ5LmNvbnRh
aW5lcigpICE9IG9sZE5vZGUpCiAgICAgICAgIHJldHVybjsKKyAgICB1bnNpZ25lZCBvbGRUZXh0
TGVuZ3RoID0gb2xkTm9kZS0+bGVuZ3RoKCk7CiAgICAgdW5zaWduZWQgYm91bmRhcnlPZmZzZXQg
PSBib3VuZGFyeS5vZmZzZXQoKTsKLSAgICBpZiAoYm91bmRhcnlPZmZzZXQgPD0gb2xkTm9kZS0+
bGVuZ3RoKCkpCisgICAgaWYgKGJvdW5kYXJ5T2Zmc2V0IDw9IG9sZFRleHRMZW5ndGgpCisgICAg
ICAgIHJldHVybjsKKyAgICBpZiAoIW5ld05vZGUpCiAgICAgICAgIHJldHVybjsKLSAgICBib3Vu
ZGFyeS5zZXQob2xkTm9kZS0+bmV4dFNpYmxpbmcoKSwgYm91bmRhcnlPZmZzZXQgLSBvbGROb2Rl
LT5sZW5ndGgoKSwgMCk7CisgICAgYm91bmRhcnkuc2V0KG5ld05vZGUsIGJvdW5kYXJ5T2Zmc2V0
IC0gb2xkVGV4dExlbmd0aCwgMCk7CiB9CiAKLXZvaWQgUmFuZ2U6OnRleHROb2RlU3BsaXQoVGV4
dCogb2xkTm9kZSkKK3ZvaWQgUmFuZ2U6OnRleHROb2RlV2lsbFNwbGl0KFRleHQqIG9sZE5vZGUs
IFRleHQqIG5ld05vZGUpCiB7CiAgICAgQVNTRVJUKG9sZE5vZGUpOwogICAgIEFTU0VSVChvbGRO
b2RlLT5kb2N1bWVudCgpID09IG1fb3duZXJEb2N1bWVudCk7Ci0gICAgQVNTRVJUKG9sZE5vZGUt
PnBhcmVudE5vZGUoKSk7CiAgICAgQVNTRVJUKG9sZE5vZGUtPmlzVGV4dE5vZGUoKSk7Ci0gICAg
QVNTRVJUKG9sZE5vZGUtPm5leHRTaWJsaW5nKCkpOwotICAgIEFTU0VSVChvbGROb2RlLT5uZXh0
U2libGluZygpLT5pc1RleHROb2RlKCkpOwotICAgIGJvdW5kYXJ5VGV4dE5vZGVzU3BsaXQobV9z
dGFydCwgb2xkTm9kZSk7Ci0gICAgYm91bmRhcnlUZXh0Tm9kZXNTcGxpdChtX2VuZCwgb2xkTm9k
ZSk7CisgICAgQVNTRVJUKG5ld05vZGUpOworICAgIEFTU0VSVChuZXdOb2RlLT5kb2N1bWVudCgp
ID09IG1fb3duZXJEb2N1bWVudCk7CisgICAgQVNTRVJUKG5ld05vZGUtPmlzVGV4dE5vZGUoKSk7
CisgICAgYm91bmRhcnlUZXh0Tm9kZVdpbGxTcGxpdChtX3N0YXJ0LCBvbGROb2RlLCBuZXdOb2Rl
KTsKKyAgICBib3VuZGFyeVRleHROb2RlV2lsbFNwbGl0KG1fZW5kLCBvbGROb2RlLCBuZXdOb2Rl
KTsKIH0KIAogfQpJbmRleDogV2ViQ29yZS9kb20vUmFuZ2UuaAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJD
b3JlL2RvbS9SYW5nZS5oCShyZXZpc2lvbiA0NDQyNSkKKysrIFdlYkNvcmUvZG9tL1JhbmdlLmgJ
KHdvcmtpbmcgY29weSkKQEAgLTEwOSw4ICsxMDksOCBAQCBwdWJsaWM6CiAKICAgICB2b2lkIHRl
eHRJbnNlcnRlZChOb2RlKiwgdW5zaWduZWQgb2Zmc2V0LCB1bnNpZ25lZCBsZW5ndGgpOwogICAg
IHZvaWQgdGV4dFJlbW92ZWQoTm9kZSosIHVuc2lnbmVkIG9mZnNldCwgdW5zaWduZWQgbGVuZ3Ro
KTsKLSAgICB2b2lkIHRleHROb2Rlc01lcmdlZChOb2RlV2l0aEluZGV4JiBvbGROb2RlLCB1bnNp
Z25lZCBvZmZzZXQpOwotICAgIHZvaWQgdGV4dE5vZGVTcGxpdChUZXh0KiBvbGROb2RlKTsKKyAg
ICB2b2lkIHRleHROb2Rlc1dpbGxNZXJnZShOb2RlV2l0aEluZGV4JiBvbGROb2RlLCB1bnNpZ25l
ZCBvZmZzZXQpOworICAgIHZvaWQgdGV4dE5vZGVXaWxsU3BsaXQoVGV4dCogb2xkTm9kZSwgVGV4
dCogbmV3Tm9kZSk7CiAKICNpZm5kZWYgTkRFQlVHCiAgICAgdm9pZCBmb3JtYXRGb3JEZWJ1Z2dl
cihjaGFyKiBidWZmZXIsIHVuc2lnbmVkIGxlbmd0aCkgY29uc3Q7CkBAIC0xMjAsNiArMTIwLDgg
QEAgcHJpdmF0ZToKICAgICBSYW5nZShQYXNzUmVmUHRyPERvY3VtZW50Pik7CiAgICAgUmFuZ2Uo
UGFzc1JlZlB0cjxEb2N1bWVudD4sIFBhc3NSZWZQdHI8Tm9kZT4gc3RhcnRDb250YWluZXIsIGlu
dCBzdGFydE9mZnNldCwgUGFzc1JlZlB0cjxOb2RlPiBlbmRDb250YWluZXIsIGludCBlbmRPZmZz
ZXQpOwogCisgICAgYm9vbCBpc0RldGFjaGVkKCkgY29uc3Q7CisKICAgICBOb2RlKiBjaGVja05v
ZGVXT2Zmc2V0KE5vZGUqLCBpbnQgb2Zmc2V0LCBFeGNlcHRpb25Db2RlJikgY29uc3Q7CiAgICAg
dm9pZCBjaGVja05vZGVCQShOb2RlKiwgRXhjZXB0aW9uQ29kZSYpIGNvbnN0OwogICAgIHZvaWQg
Y2hlY2tEZWxldGVFeHRyYWN0KEV4Y2VwdGlvbkNvZGUmKTsKSW5kZXg6IFdlYkNvcmUvZG9tL1Rl
eHQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvZG9tL1RleHQuY3BwCShyZXZpc2lvbiA0NDQy
NSkKKysrIFdlYkNvcmUvZG9tL1RleHQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC03MCw2ICs3MCw3
IEBAIFBhc3NSZWZQdHI8VGV4dD4gVGV4dDo6c3BsaXRUZXh0KHVuc2lnbmUKICAgICBSZWZQdHI8
VGV4dD4gbmV3VGV4dCA9IGNyZWF0ZU5ldyhvbGRTdHItPnN1YnN0cmluZyhvZmZzZXQpKTsKICAg
ICBtX2RhdGEgPSBvbGRTdHItPnN1YnN0cmluZygwLCBvZmZzZXQpOwogCisgICAgZG9jdW1lbnQo
KS0+dGV4dE5vZGVXaWxsU3BsaXQodGhpcywgbmV3VGV4dC5nZXQoKSk7CiAgICAgZGlzcGF0Y2hN
b2RpZmllZEV2ZW50KG9sZFN0ci5nZXQoKSk7CiAKICAgICBpZiAocGFyZW50Tm9kZSgpKQpAQCAt
NzcsOSArNzgsNiBAQCBQYXNzUmVmUHRyPFRleHQ+IFRleHQ6OnNwbGl0VGV4dCh1bnNpZ25lCiAg
ICAgaWYgKGVjKQogICAgICAgICByZXR1cm4gMDsKIAotICAgIGlmIChwYXJlbnROb2RlKCkpCi0g
ICAgICAgIGRvY3VtZW50KCktPnRleHROb2RlU3BsaXQodGhpcyk7Ci0KICAgICBpZiAocmVuZGVy
ZXIoKSkKICAgICAgICAgdG9SZW5kZXJUZXh0KHJlbmRlcmVyKCkpLT5zZXRUZXh0KG1fZGF0YSk7
CiAK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>31022</attachid>
            <date>2009-06-05 18:06:25 -0700</date>
            <delta_ts>2009-06-05 18:06:25 -0700</delta_ts>
            <desc>more work in progress</desc>
            <filename>RangeMutationPatch.txt</filename>
            <type>text/plain</type>
            <size>42836</size>
            <attacher name="Darin Adler">darin</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA0NDQ3NCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsOTEgQEAKKzIwMDktMDYtMDQgIERhcmluIEFkbGVyICA8ZGFyaW5AYXBwbGUuY29t
PgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFdBUk5J
Tkc6IE5PIFRFU1QgQ0FTRVMgQURERUQgT1IgQ0hBTkdFRAorCisgICAgICAgIEZpeGVkIGJ1ZyB3
aGVyZSBSYW5nZS5pbnNlcnROb2RlIGNyZWF0ZXMgZXh0cmEgZW1wdHkgdGV4dCBub2Rlcy4KKwor
ICAgICAgICBCdWcgMjYwNDQ6IENyYXNoIGF0IE5vZGU6Om5vZGVJbmRleCgpCisgICAgICAgIGh0
dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yNjA0NAorCisgICAgICAgICog
ZG9tL0NoYXJhY3RlckRhdGEuY3BwOgorICAgICAgICAoV2ViQ29yZTo6Q2hhcmFjdGVyRGF0YTo6
c2V0RGF0YSk6IENhbGwgdGV4dFJlbW92ZWQgYmVmb3JlCisgICAgICAgIGRpc3BhdGNoaW5nIERP
TSBtdXRhdGlvbiBldmVudHMuIFdlIG5lZWQgdG8gZml4IHVwIHJhbmdlcyBiZWZvcmUKKyAgICAg
ICAgaW52b2tpbmcgY29kZSB0aGF0IG1pZ2h0IGxvb2sgYXQgdGhvc2UgcmFuZ2VzLgorICAgICAg
ICAoV2ViQ29yZTo6Q2hhcmFjdGVyRGF0YTo6aW5zZXJ0RGF0YSk6IERpdHRvLCBmb3IgdGV4dElu
c2VydGVkLgorICAgICAgICAoV2ViQ29yZTo6Q2hhcmFjdGVyRGF0YTo6ZGVsZXRlRGF0YSk6IERp
dHRvLCBmb3IgdGV4dFJlbW92ZWQuCisgICAgICAgIChXZWJDb3JlOjpDaGFyYWN0ZXJEYXRhOjpy
ZXBsYWNlRGF0YSk6IERpdHRvLCBmb3IgYm90aC4KKworICAgICAgICAqIGRvbS9Eb2N1bWVudC5j
cHA6CisgICAgICAgIChXZWJDb3JlOjpEb2N1bWVudDo6dGV4dE5vZGVzV2lsbE1lcmdlKTogUmVu
YW1lZCB0byBtYWtlIGl0IGNsZWFyCisgICAgICAgIHRoaXMgaXMgY2FsbGVkIGJlZm9yZSB0aGUg
bWVyZ2UgaXMgY29tcGxldGUuCisgICAgICAgIChXZWJDb3JlOjpEb2N1bWVudDo6dGV4dE5vZGVX
aWxsU3BsaXQpOiBSZW5hbWVkIHRvIG1ha2UgaXQgY2xlYXIKKyAgICAgICAgdGhpcyBpcyBjYWxs
ZWQgYmVmb3JlIHRoZSBzcGxpdCBpcyBjb21wbGV0ZS4gQWRkZWQgYW4gYXJndW1lbnQgZm9yCisg
ICAgICAgIHRoZSBuZXcgbm9kZSBiZWNhdXNlIHRoaXMgaXMgbm93IGNhbGxlZCBiZWZvcmUgdGhh
dCBub2RlIGlzIGluIHRoZQorICAgICAgICBET00gdHJlZS4KKyAgICAgICAgKiBkb20vRG9jdW1l
bnQuaDogRGl0dG8uCisKKyAgICAgICAgKiBkb20vTm9kZS5jcHA6CisgICAgICAgIChXZWJDb3Jl
OjpOb2RlOjpub3JtYWxpemUpOiBDYWxsIHRleHROb2Rlc1dpbGxNZXJnZSBiZWZvcmUgZG9pbmcK
KyAgICAgICAgdGhlIERPTSBtdXRhdGlvbiwgYmVjYXVzZSB0aGF0IHdpbGwgZGlzcGF0Y2ggRE9N
IG11dGF0aW9uIGV2ZW50cy4KKworICAgICAgICAqIGRvbS9SYW5nZS5jcHA6CisgICAgICAgIChX
ZWJDb3JlOjpSYW5nZTo6aXNEZXRhY2hlZCk6IEFkZGVkLiBFcmljJ3MgY29tbWVudHMgbWFkZSBp
dCBjbGVhcgorICAgICAgICB0aGF0IHRoZSByZWxhdGlvbnNoaXAgb2YgbV9zdGFydC5jb250YWlu
ZXIoKSB0byAiZGV0YWNoZWQtbmVzcyIKKyAgICAgICAgd2FzIHNvbWV0aGluZyB0aGF0IHNob3Vs
ZCBiZSBtYWRlIGNsZWFyZXIgYXQgY2FsbCBzaXRlcy4KKyAgICAgICAgKFdlYkNvcmU6OlJhbmdl
Ojp+UmFuZ2UpOiBVc2UgaXNEZXRhY2hlZCgpLgorICAgICAgICAoV2ViQ29yZTo6UmFuZ2U6OnN0
YXJ0Q29udGFpbmVyKTogRGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpSYW5nZTo6c3RhcnRPZmZz
ZXQpOiBEaXR0by4KKyAgICAgICAgKFdlYkNvcmU6OlJhbmdlOjplbmRDb250YWluZXIpOiBEaXR0
by4KKyAgICAgICAgKFdlYkNvcmU6OlJhbmdlOjplbmRPZmZzZXQpOiBEaXR0by4KKyAgICAgICAg
KFdlYkNvcmU6OlJhbmdlOjpjb21tb25BbmNlc3RvckNvbnRhaW5lcik6IERpdHRvLgorICAgICAg
ICAoV2ViQ29yZTo6UmFuZ2U6OmNvbGxhcHNlZCk6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6
UmFuZ2U6OnNldFN0YXJ0KTogRGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpSYW5nZTo6c2V0RW5k
KTogRGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpSYW5nZTo6Y29sbGFwc2UpOiBEaXR0by4KKyAg
ICAgICAgKFdlYkNvcmU6OlJhbmdlOjppc1BvaW50SW5SYW5nZSk6IERpdHRvLiBBbHNvIGFkZGVk
IGNvbW1lbnRzIGFib3V0CisgICAgICAgIHRoZSBpbmNvcnJlY3QgdXNlIG9mIE5vZGU6OmF0dGFj
aGVkIGhlcmUsIHNvbWV0aW1lIHdlIHNob3VsZCByZXR1cm4KKyAgICAgICAgdG8gYW5kIGZpeC4K
KyAgICAgICAgKFdlYkNvcmU6OlJhbmdlOjpjb21wYXJlUG9pbnQpOiBEaXR0by4KKyAgICAgICAg
KFdlYkNvcmU6OlJhbmdlOjpjb21wYXJlTm9kZSk6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6
UmFuZ2U6OmNvbXBhcmVCb3VuZGFyeVBvaW50cyk6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6
UmFuZ2U6OmludGVyc2VjdHNOb2RlKTogRGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpSYW5nZTo6
Y2xvbmVDb250ZW50cyk6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6UmFuZ2U6Omluc2VydE5v
ZGUpOiBGaXhlZCBidWcgd2hlcmUgaW5zZXJ0Tm9kZSB3aWxsIGNyZWF0ZQorICAgICAgICBleHRy
YSBlbXB0eSB0ZXh0IG5vZGVzLgorICAgICAgICAoV2ViQ29yZTo6UmFuZ2U6OnRvU3RyaW5nKTog
RGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpSYW5nZTo6dGV4dCk6IFVzZSBpc0RldGFjaGVkKCku
CisgICAgICAgIChXZWJDb3JlOjpSYW5nZTo6Y3JlYXRlQ29udGV4dHVhbEZyYWdtZW50KTogRGl0
dG8uCisgICAgICAgIChXZWJDb3JlOjpSYW5nZTo6ZGV0YWNoKTogRGl0dG8uCisgICAgICAgIChX
ZWJDb3JlOjpSYW5nZTo6Y2xvbmVSYW5nZSk6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6UmFu
Z2U6OnNldFN0YXJ0QWZ0ZXIpOiBEaXR0by4KKyAgICAgICAgKFdlYkNvcmU6OlJhbmdlOjpzZXRF
bmRCZWZvcmUpOiBEaXR0by4KKyAgICAgICAgKFdlYkNvcmU6OlJhbmdlOjpzZXRFbmRBZnRlcik6
IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6UmFuZ2U6OnNlbGVjdE5vZGUpOiBEaXR0by4KKyAg
ICAgICAgKFdlYkNvcmU6OlJhbmdlOjpzZWxlY3ROb2RlQ29udGVudHMpOiBEaXR0by4KKyAgICAg
ICAgKFdlYkNvcmU6OlJhbmdlOjpzdXJyb3VuZENvbnRlbnRzKTogRGl0dG8uCisgICAgICAgIChX
ZWJDb3JlOjpSYW5nZTo6c2V0U3RhcnRCZWZvcmUpOiBEaXR0by4KKyAgICAgICAgKFdlYkNvcmU6
OlJhbmdlOjpjaGVja0RlbGV0ZUV4dHJhY3QpOiBEaXR0by4KKyAgICAgICAgKFdlYkNvcmU6OlJh
bmdlOjpmaXJzdE5vZGUpOiBEaXR0by4KKyAgICAgICAgKFdlYkNvcmU6OlJhbmdlOjpwYXN0TGFz
dE5vZGUpOiBEaXR0by4KKyAgICAgICAgKFdlYkNvcmU6OlJhbmdlOjp0ZXh0UmVjdHMpOiBEaXR0
by4KKyAgICAgICAgKFdlYkNvcmU6OlJhbmdlOjpmb3JtYXRGb3JEZWJ1Z2dlcik6IERpdHRvLgor
ICAgICAgICAoV2ViQ29yZTo6UmFuZ2U6Om1heFN0YXJ0T2Zmc2V0KTogRGl0dG8uCisgICAgICAg
IChXZWJDb3JlOjpSYW5nZTo6bWF4RW5kT2Zmc2V0KTogRGl0dG8uCisgICAgICAgIChXZWJDb3Jl
Ojpib3VuZGFyeVRleHROb2Rlc1dpbGxNZXJnZSk6IFVwZGF0ZWQgZm9yIG5hbWUgY2hhbmdlLgor
ICAgICAgICBBbHNvIGFkZGVkIG51bGwgY2hlY2tzLCB0byBtYWtlIHN1cmUgdGhhdCBpZiBhIG51
bGwgbm9kZSBwb2ludGVyCisgICAgICAgIHNvbWVob3cgc25lYWtzIGluIGhlcmUsIGl0IHdvbid0
IGJlIHN0b3JlZCBpbiB0aGUgUmFuZ2UuCisgICAgICAgIChXZWJDb3JlOjpSYW5nZTo6dGV4dE5v
ZGVzV2lsbE1lcmdlKTogVXBkYXRlZCBmb3IgbmFtZSBjaGFuZ2UuCisgICAgICAgIChXZWJDb3Jl
Ojpib3VuZGFyeVRleHROb2RlV2lsbFNwbGl0KTogVXBkYXRlZCBmb3IgbmFtZSBjaGFuZ2UgYW5k
IHRoZQorICAgICAgICBuZXcgYXJndW1lbnQuIEFsc28gYWRkZWQgYSBudWxsIGNoZWNrIGFzIGFi
b3ZlLgorICAgICAgICAoV2ViQ29yZTo6UmFuZ2U6OnRleHROb2RlV2lsbFNwbGl0KTogRGl0dG8u
CisgICAgICAgICogZG9tL1JhbmdlLmg6IFJlbmFtZWQuIEFsc28gYWRkZWQgdGhlIGlzRGV0YWNo
ZWQoKSBmdW5jdGlvbi4KKworICAgICAgICAqIGRvbS9UZXh0LmNwcDoKKyAgICAgICAgKFdlYkNv
cmU6OlRleHQ6OnNwbGl0VGV4dCk6IENhbGwgdGV4dE5vZGVXaWxsU3BsaXQgYmVmb3JlCisgICAg
ICAgIGRpc3BhdGNoaW5nIERPTSBtdXRhdGlvbiBldmVudHMuCisKIDIwMDktMDYtMDUgIFRvciBB
cm5lIFZlc3Riw7ggIDx0b3IuYXJuZS52ZXN0Ym9Abm9raWEuY29tPgogCiAgICAgICAgIFJldmll
d2VkIGJ5IFNpbW9uIEhhdXNtYW5uLgpJbmRleDogV2ViQ29yZS9jc3MvQ1NTQ29tcHV0ZWRTdHls
ZURlY2xhcmF0aW9uLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2Nzcy9DU1NDb21wdXRlZFN0
eWxlRGVjbGFyYXRpb24uY3BwCShyZXZpc2lvbiA0NDQ3NCkKKysrIFdlYkNvcmUvY3NzL0NTU0Nv
bXB1dGVkU3R5bGVEZWNsYXJhdGlvbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTU3MSw3ICs1NzEs
NyBAQCBQYXNzUmVmUHRyPENTU1ZhbHVlPiBDU1NDb21wdXRlZFN0eWxlRGVjCiBzdGF0aWMgaW50
IGlkZW50aWZpZXJGb3JGYW1pbHkoY29uc3QgQXRvbWljU3RyaW5nJiBmYW1pbHkpCiB7CiAgICAg
REVGSU5FX1NUQVRJQ19MT0NBTChBdG9taWNTdHJpbmcsIGN1cnNpdmVGYW1pbHksICgiLXdlYmtp
dC1jdXJzaXZlIikpOyAKLSAgICBERUZJTkVfU1RBVElDX0xPQ0FMKEF0b21pY1N0cmluZywgZmFu
dGFzeUZhbWlseSwgKCItd2Via2l0LXNlcmlmIikpOyAKKyAgICBERUZJTkVfU1RBVElDX0xPQ0FM
KEF0b21pY1N0cmluZywgZmFudGFzeUZhbWlseSwgKCItd2Via2l0LWZhbnRhc3kiKSk7IAogICAg
IERFRklORV9TVEFUSUNfTE9DQUwoQXRvbWljU3RyaW5nLCBtb25vc3BhY2VGYW1pbHksICgiLXdl
YmtpdC1tb25vc3BhY2UiKSk7IAogICAgIERFRklORV9TVEFUSUNfTE9DQUwoQXRvbWljU3RyaW5n
LCBzYW5zU2VyaWZGYW1pbHksICgiLXdlYmtpdC1zYW5zLXNlcmlmIikpOyAKICAgICBERUZJTkVf
U1RBVElDX0xPQ0FMKEF0b21pY1N0cmluZywgc2VyaWZGYW1pbHksICgiLXdlYmtpdC1zZXJpZiIp
KTsgCkluZGV4OiBXZWJDb3JlL2RvbS9DaGFyYWN0ZXJEYXRhLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBX
ZWJDb3JlL2RvbS9DaGFyYWN0ZXJEYXRhLmNwcAkocmV2aXNpb24gNDQ0NzQpCisrKyBXZWJDb3Jl
L2RvbS9DaGFyYWN0ZXJEYXRhLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTYsNiArNTYsOCBAQCB2
b2lkIENoYXJhY3RlckRhdGE6OnNldERhdGEoY29uc3QgU3RyaW5nCiAgICAgUmVmUHRyPFN0cmlu
Z0ltcGw+IG9sZFN0ciA9IG1fZGF0YTsKICAgICBtX2RhdGEgPSBkYXRhSW1wbDsKICAgICAKKyAg
ICBkb2N1bWVudCgpLT50ZXh0UmVtb3ZlZCh0aGlzLCAwLCBvbGRMZW5ndGgpOworCiAgICAgaWYg
KCghcmVuZGVyZXIoKSB8fCAhcmVuZGVyZXJJc05lZWRlZChyZW5kZXJlcigpLT5zdHlsZSgpKSkg
JiYgYXR0YWNoZWQoKSkgewogICAgICAgICBkZXRhY2goKTsKICAgICAgICAgYXR0YWNoKCk7CkBA
IC02Myw4ICs2NSw2IEBAIHZvaWQgQ2hhcmFjdGVyRGF0YTo6c2V0RGF0YShjb25zdCBTdHJpbmcK
ICAgICAgICAgdG9SZW5kZXJUZXh0KHJlbmRlcmVyKCkpLT5zZXRUZXh0KG1fZGF0YSk7CiAgICAg
CiAgICAgZGlzcGF0Y2hNb2RpZmllZEV2ZW50KG9sZFN0ci5nZXQoKSk7Ci0gICAgCi0gICAgZG9j
dW1lbnQoKS0+dGV4dFJlbW92ZWQodGhpcywgMCwgb2xkTGVuZ3RoKTsKIH0KIAogU3RyaW5nIENo
YXJhY3RlckRhdGE6OnN1YnN0cmluZ0RhdGEodW5zaWduZWQgb2Zmc2V0LCB1bnNpZ25lZCBjb3Vu
dCwgRXhjZXB0aW9uQ29kZSYgZWMpCkBAIC0xMDUsMTUgKzEwNSwxNSBAQCB2b2lkIENoYXJhY3Rl
ckRhdGE6Omluc2VydERhdGEodW5zaWduZWQgCiAgICAgUmVmUHRyPFN0cmluZ0ltcGw+IG9sZFN0
ciA9IG1fZGF0YTsKICAgICBtX2RhdGEgPSBuZXdTdHIuaW1wbCgpOwogCisgICAgZG9jdW1lbnQo
KS0+dGV4dEluc2VydGVkKHRoaXMsIG9mZnNldCwgYXJnLmxlbmd0aCgpKTsKKwogICAgIGlmICgo
IXJlbmRlcmVyKCkgfHwgIXJlbmRlcmVySXNOZWVkZWQocmVuZGVyZXIoKS0+c3R5bGUoKSkpICYm
IGF0dGFjaGVkKCkpIHsKICAgICAgICAgZGV0YWNoKCk7CiAgICAgICAgIGF0dGFjaCgpOwogICAg
IH0gZWxzZSBpZiAocmVuZGVyZXIoKSkKICAgICAgICAgdG9SZW5kZXJUZXh0KHJlbmRlcmVyKCkp
LT5zZXRUZXh0V2l0aE9mZnNldChtX2RhdGEsIG9mZnNldCwgMCk7Ci0KLSAgICBkaXNwYXRjaE1v
ZGlmaWVkRXZlbnQob2xkU3RyLmdldCgpKTsKICAgICAKLSAgICBkb2N1bWVudCgpLT50ZXh0SW5z
ZXJ0ZWQodGhpcywgb2Zmc2V0LCBhcmcubGVuZ3RoKCkpOworICAgIGRpc3BhdGNoTW9kaWZpZWRF
dmVudChvbGRTdHIuZ2V0KCkpOwogfQogCiB2b2lkIENoYXJhY3RlckRhdGE6OmRlbGV0ZURhdGEo
dW5zaWduZWQgb2Zmc2V0LCB1bnNpZ25lZCBjb3VudCwgRXhjZXB0aW9uQ29kZSYgZWMpCkBAIC0x
MzMsNyArMTMzLDkgQEAgdm9pZCBDaGFyYWN0ZXJEYXRhOjpkZWxldGVEYXRhKHVuc2lnbmVkIAog
CiAgICAgUmVmUHRyPFN0cmluZ0ltcGw+IG9sZFN0ciA9IG1fZGF0YTsKICAgICBtX2RhdGEgPSBu
ZXdTdHIuaW1wbCgpOwotICAgIAorCisgICAgZG9jdW1lbnQoKS0+dGV4dFJlbW92ZWQodGhpcywg
b2Zmc2V0LCByZWFsQ291bnQpOworCiAgICAgaWYgKCghcmVuZGVyZXIoKSB8fCAhcmVuZGVyZXJJ
c05lZWRlZChyZW5kZXJlcigpLT5zdHlsZSgpKSkgJiYgYXR0YWNoZWQoKSkgewogICAgICAgICBk
ZXRhY2goKTsKICAgICAgICAgYXR0YWNoKCk7CkBAIC0xNDEsOCArMTQzLDYgQEAgdm9pZCBDaGFy
YWN0ZXJEYXRhOjpkZWxldGVEYXRhKHVuc2lnbmVkIAogICAgICAgICB0b1JlbmRlclRleHQocmVu
ZGVyZXIoKSktPnNldFRleHRXaXRoT2Zmc2V0KG1fZGF0YSwgb2Zmc2V0LCBjb3VudCk7CiAKICAg
ICBkaXNwYXRjaE1vZGlmaWVkRXZlbnQob2xkU3RyLmdldCgpKTsKLQotICAgIGRvY3VtZW50KCkt
PnRleHRSZW1vdmVkKHRoaXMsIG9mZnNldCwgcmVhbENvdW50KTsKIH0KIAogdm9pZCBDaGFyYWN0
ZXJEYXRhOjpyZXBsYWNlRGF0YSh1bnNpZ25lZCBvZmZzZXQsIHVuc2lnbmVkIGNvdW50LCBjb25z
dCBTdHJpbmcmIGFyZywgRXhjZXB0aW9uQ29kZSYgZWMpCkBAIC0xNjMsNiArMTYzLDkgQEAgdm9p
ZCBDaGFyYWN0ZXJEYXRhOjpyZXBsYWNlRGF0YSh1bnNpZ25lZAogCiAgICAgUmVmUHRyPFN0cmlu
Z0ltcGw+IG9sZFN0ciA9IG1fZGF0YTsKICAgICBtX2RhdGEgPSBuZXdTdHIuaW1wbCgpOworICAg
IAorICAgIGRvY3VtZW50KCktPnRleHRSZW1vdmVkKHRoaXMsIG9mZnNldCwgcmVhbENvdW50KTsK
KyAgICBkb2N1bWVudCgpLT50ZXh0SW5zZXJ0ZWQodGhpcywgb2Zmc2V0LCBhcmcubGVuZ3RoKCkp
OwogCiAgICAgaWYgKCghcmVuZGVyZXIoKSB8fCAhcmVuZGVyZXJJc05lZWRlZChyZW5kZXJlcigp
LT5zdHlsZSgpKSkgJiYgYXR0YWNoZWQoKSkgewogICAgICAgICBkZXRhY2goKTsKQEAgLTE3MSwx
MCArMTc0LDYgQEAgdm9pZCBDaGFyYWN0ZXJEYXRhOjpyZXBsYWNlRGF0YSh1bnNpZ25lZAogICAg
ICAgICB0b1JlbmRlclRleHQocmVuZGVyZXIoKSktPnNldFRleHRXaXRoT2Zmc2V0KG1fZGF0YSwg
b2Zmc2V0LCBjb3VudCk7CiAgICAgCiAgICAgZGlzcGF0Y2hNb2RpZmllZEV2ZW50KG9sZFN0ci5n
ZXQoKSk7Ci0gICAgCi0gICAgLy8gdXBkYXRlIHRoZSBtYXJrZXJzIGZvciBzcGVsbCBjaGVja2lu
ZyBhbmQgZ3JhbW1hciBjaGVja2luZwotICAgIGRvY3VtZW50KCktPnRleHRSZW1vdmVkKHRoaXMs
IG9mZnNldCwgcmVhbENvdW50KTsKLSAgICBkb2N1bWVudCgpLT50ZXh0SW5zZXJ0ZWQodGhpcywg
b2Zmc2V0LCBhcmcubGVuZ3RoKCkpOwogfQogCiBTdHJpbmcgQ2hhcmFjdGVyRGF0YTo6bm9kZVZh
bHVlKCkgY29uc3QKSW5kZXg6IFdlYkNvcmUvZG9tL0RvY3VtZW50LmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBXZWJDb3JlL2RvbS9Eb2N1bWVudC5jcHAJKHJldmlzaW9uIDQ0NDc0KQorKysgV2ViQ29yZS9k
b20vRG9jdW1lbnQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNjk0LDI0ICsyNjk0LDI0IEBAIHZv
aWQgRG9jdW1lbnQ6OnRleHRSZW1vdmVkKE5vZGUqIHRleHQsIHUKICAgICBzaGlmdE1hcmtlcnMo
dGV4dCwgb2Zmc2V0ICsgbGVuZ3RoLCAwIC0gbGVuZ3RoKTsKIH0KIAotdm9pZCBEb2N1bWVudDo6
dGV4dE5vZGVzTWVyZ2VkKFRleHQqIG9sZE5vZGUsIHVuc2lnbmVkIG9mZnNldCkKK3ZvaWQgRG9j
dW1lbnQ6OnRleHROb2Rlc1dpbGxNZXJnZShUZXh0KiBvbGROb2RlLCB1bnNpZ25lZCBvZmZzZXQp
CiB7CiAgICAgaWYgKCFkaXNhYmxlUmFuZ2VNdXRhdGlvbihwYWdlKCkpKSB7CiAgICAgICAgIE5v
ZGVXaXRoSW5kZXggb2xkTm9kZVdpdGhJbmRleChvbGROb2RlKTsKICAgICAgICAgSGFzaFNldDxS
YW5nZSo+Ojpjb25zdF9pdGVyYXRvciBlbmQgPSBtX3Jhbmdlcy5lbmQoKTsKICAgICAgICAgZm9y
IChIYXNoU2V0PFJhbmdlKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9yYW5nZXMuYmVnaW4oKTsg
aXQgIT0gZW5kOyArK2l0KQotICAgICAgICAgICAgKCppdCktPnRleHROb2Rlc01lcmdlZChvbGRO
b2RlV2l0aEluZGV4LCBvZmZzZXQpOworICAgICAgICAgICAgKCppdCktPnRleHROb2Rlc1dpbGxN
ZXJnZShvbGROb2RlV2l0aEluZGV4LCBvZmZzZXQpOwogICAgIH0KIAogICAgIC8vIEZJWE1FOiBU
aGlzIHNob3VsZCB1cGRhdGUgbWFya2VycyBmb3Igc3BlbGxpbmcgYW5kIGdyYW1tYXIgY2hlY2tp
bmcuCiB9CiAKLXZvaWQgRG9jdW1lbnQ6OnRleHROb2RlU3BsaXQoVGV4dCogb2xkTm9kZSkKK3Zv
aWQgRG9jdW1lbnQ6OnRleHROb2RlV2lsbFNwbGl0KFRleHQqIG9sZE5vZGUsIFRleHQqIG5ld05v
ZGUpCiB7CiAgICAgaWYgKCFkaXNhYmxlUmFuZ2VNdXRhdGlvbihwYWdlKCkpKSB7CiAgICAgICAg
IEhhc2hTZXQ8UmFuZ2UqPjo6Y29uc3RfaXRlcmF0b3IgZW5kID0gbV9yYW5nZXMuZW5kKCk7CiAg
ICAgICAgIGZvciAoSGFzaFNldDxSYW5nZSo+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fcmFuZ2Vz
LmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkKLSAgICAgICAgICAgICgqaXQpLT50ZXh0Tm9kZVNw
bGl0KG9sZE5vZGUpOworICAgICAgICAgICAgKCppdCktPnRleHROb2RlV2lsbFNwbGl0KG9sZE5v
ZGUsIG5ld05vZGUpOwogICAgIH0KIAogICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCB1cGRhdGUg
bWFya2VycyBmb3Igc3BlbGxpbmcgYW5kIGdyYW1tYXIgY2hlY2tpbmcuCkluZGV4OiBXZWJDb3Jl
L2RvbS9Eb2N1bWVudC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvZG9tL0RvY3VtZW50LmgJKHJl
dmlzaW9uIDQ0NDc0KQorKysgV2ViQ29yZS9kb20vRG9jdW1lbnQuaAkod29ya2luZyBjb3B5KQpA
QCAtNTU4LDggKzU1OCw4IEBAIHB1YmxpYzoKIAogICAgIHZvaWQgdGV4dEluc2VydGVkKE5vZGUq
LCB1bnNpZ25lZCBvZmZzZXQsIHVuc2lnbmVkIGxlbmd0aCk7CiAgICAgdm9pZCB0ZXh0UmVtb3Zl
ZChOb2RlKiwgdW5zaWduZWQgb2Zmc2V0LCB1bnNpZ25lZCBsZW5ndGgpOwotICAgIHZvaWQgdGV4
dE5vZGVzTWVyZ2VkKFRleHQqIG9sZE5vZGUsIHVuc2lnbmVkIG9mZnNldCk7Ci0gICAgdm9pZCB0
ZXh0Tm9kZVNwbGl0KFRleHQqIG9sZE5vZGUpOworICAgIHZvaWQgdGV4dE5vZGVzV2lsbE1lcmdl
KFRleHQqIG9sZE5vZGUsIHVuc2lnbmVkIG9mZnNldCk7CisgICAgdm9pZCB0ZXh0Tm9kZVdpbGxT
cGxpdChUZXh0KiBvbGROb2RlLCBUZXh0KiBuZXdOb2RlKTsKIAogICAgIERPTVdpbmRvdyogZGVm
YXVsdFZpZXcoKSBjb25zdCB7IHJldHVybiBkb21XaW5kb3coKTsgfSAKICAgICBET01XaW5kb3cq
IGRvbVdpbmRvdygpIGNvbnN0OwpJbmRleDogV2ViQ29yZS9kb20vTm9kZS5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gV2ViQ29yZS9kb20vTm9kZS5jcHAJKHJldmlzaW9uIDQ0NDc0KQorKysgV2ViQ29yZS9k
b20vTm9kZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTYxMSw5ICs2MTEsOSBAQCB2b2lkIE5vZGU6
Om5vcm1hbGl6ZSgpCiAKICAgICAgICAgICAgIC8vIEJvdGggbm9uLWVtcHR5IHRleHQgbm9kZXMu
IE1lcmdlIHRoZW0uCiAgICAgICAgICAgICB1bnNpZ25lZCBvZmZzZXQgPSB0ZXh0LT5sZW5ndGgo
KTsKKyAgICAgICAgICAgIGRvY3VtZW50KCktPnRleHROb2Rlc1dpbGxNZXJnZShuZXh0VGV4dC5n
ZXQoKSwgb2Zmc2V0KTsKICAgICAgICAgICAgIEV4Y2VwdGlvbkNvZGUgZWM7CiAgICAgICAgICAg
ICB0ZXh0LT5hcHBlbmREYXRhKG5leHRUZXh0LT5kYXRhKCksIGVjKTsKLSAgICAgICAgICAgIGRv
Y3VtZW50KCktPnRleHROb2Rlc01lcmdlZChuZXh0VGV4dC5nZXQoKSwgb2Zmc2V0KTsKICAgICAg
ICAgICAgIG5leHRUZXh0LT5yZW1vdmUoZWMpOwogICAgICAgICB9CiAKSW5kZXg6IFdlYkNvcmUv
ZG9tL1JhbmdlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2RvbS9SYW5nZS5jcHAJKHJldmlz
aW9uIDQ0NDc0KQorKysgV2ViQ29yZS9kb20vUmFuZ2UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00
Niw2ICs0NiwyNyBAQCB1c2luZyBuYW1lc3BhY2Ugc3RkOwogc3RhdGljIFdURjo6UmVmQ291bnRl
ZExlYWtDb3VudGVyIHJhbmdlQ291bnRlcigiUmFuZ2UiKTsKICNlbmRpZgogCitpbmxpbmUgdm9p
ZCBSYW5nZTo6Y2hlY2tDb25zaXN0ZW5jeSgpIGNvbnN0Cit7CisjaWZuZGVmIE5ERUJVRworICAg
IGlmIChtX3N0YXJ0LmNvbnRhaW5lcigpKQorICAgICAgICBBU1NFUlQobV9lbmQuY29udGFpbmVy
KCkpOworICAgIGVsc2UgeworICAgICAgICBBU1NFUlQoIW1fc3RhcnQub2Zmc2V0KCkpOworICAg
ICAgICBBU1NFUlQoIW1fc3RhcnQuY2hpbGRCZWZvcmUoKSk7CisgICAgICAgIEFTU0VSVCghbV9l
bmQuY29udGFpbmVyKCkpOworICAgICAgICBBU1NFUlQoIW1fZW5kLm9mZnNldCgpKTsKKyAgICAg
ICAgQVNTRVJUKCFtX2VuZC5jaGlsZEJlZm9yZSgpKTsKKyAgICB9CisjZW5kaWYKK30KKworaW5s
aW5lIGJvb2wgUmFuZ2U6OmlzRGV0YWNoZWQoKSBjb25zdAoreworICAgIGNoZWNrQ29uc2lzdGVu
Y3koKTsKKyAgICByZXR1cm4gIW1fc3RhcnQuY29udGFpbmVyKCk7Cit9CisKIGlubGluZSBSYW5n
ZTo6UmFuZ2UoUGFzc1JlZlB0cjxEb2N1bWVudD4gb3duZXJEb2N1bWVudCkKICAgICA6IG1fb3du
ZXJEb2N1bWVudChvd25lckRvY3VtZW50KQogICAgICwgbV9zdGFydChtX293bmVyRG9jdW1lbnQp
CkBAIC01Niw2ICs3Nyw4IEBAIGlubGluZSBSYW5nZTo6UmFuZ2UoUGFzc1JlZlB0cjxEb2N1bWVu
dD4KICNlbmRpZgogCiAgICAgbV9vd25lckRvY3VtZW50LT5hdHRhY2hSYW5nZSh0aGlzKTsKKwor
ICAgIGNoZWNrQ29uc2lzdGVuY3koKTsKIH0KIAogUGFzc1JlZlB0cjxSYW5nZT4gUmFuZ2U6OmNy
ZWF0ZShQYXNzUmVmUHRyPERvY3VtZW50PiBvd25lckRvY3VtZW50KQpAQCAtOTUsOCArMTE4LDkg
QEAgUGFzc1JlZlB0cjxSYW5nZT4gUmFuZ2U6OmNyZWF0ZShQYXNzUmVmUAogCiBSYW5nZTo6flJh
bmdlKCkKIHsKLSAgICBpZiAobV9zdGFydC5jb250YWluZXIoKSkKLSAgICAgICAgbV9vd25lckRv
Y3VtZW50LT5kZXRhY2hSYW5nZSh0aGlzKTsKKyAgICAvLyBOb3RlLCBpZiB0aGUgUmFuZ2Ugd2Fz
IHByZXZpb3VzbHkgZGV0YWNoZWQgd2l0aCBhIGNhbGwgdG8gUmFuZ2U6OmRldGFjaCwgdGhpcyB3
aWxsIGRvIHVubmVjZXNzYXJ5IHdvcmsuCisgICAgLy8gQnV0IGl0J3Mgbm90IHdvcmsgdGhlIHJp
c2sgb2YgbGVhdmluZyBhIGRlbGV0ZWQgUmFuZ2UgaW4gdGhlIGRvY3VtZW50J3MgbGlzdHMuCisg
ICAgbV9vd25lckRvY3VtZW50LT5kZXRhY2hSYW5nZSh0aGlzKTsKIAogI2lmbmRlZiBOREVCVUcK
ICAgICByYW5nZUNvdW50ZXIuZGVjcmVtZW50KCk7CkBAIC0xMDUsNyArMTI5LDcgQEAgUmFuZ2U6
On5SYW5nZSgpCiAKIE5vZGUqIFJhbmdlOjpzdGFydENvbnRhaW5lcihFeGNlcHRpb25Db2RlJiBl
YykgY29uc3QKIHsKLSAgICBpZiAoIW1fc3RhcnQuY29udGFpbmVyKCkpIHsKKyAgICBpZiAoaXNE
ZXRhY2hlZCgpKSB7CiAgICAgICAgIGVjID0gSU5WQUxJRF9TVEFURV9FUlI7CiAgICAgICAgIHJl
dHVybiAwOwogICAgIH0KQEAgLTExNSw3ICsxMzksNyBAQCBOb2RlKiBSYW5nZTo6c3RhcnRDb250
YWluZXIoRXhjZXB0aW9uQ29kCiAKIGludCBSYW5nZTo6c3RhcnRPZmZzZXQoRXhjZXB0aW9uQ29k
ZSYgZWMpIGNvbnN0CiB7Ci0gICAgaWYgKCFtX3N0YXJ0LmNvbnRhaW5lcigpKSB7CisgICAgaWYg
KGlzRGV0YWNoZWQoKSkgewogICAgICAgICBlYyA9IElOVkFMSURfU1RBVEVfRVJSOwogICAgICAg
ICByZXR1cm4gMDsKICAgICB9CkBAIC0xMjUsNyArMTQ5LDcgQEAgaW50IFJhbmdlOjpzdGFydE9m
ZnNldChFeGNlcHRpb25Db2RlJiBlYwogCiBOb2RlKiBSYW5nZTo6ZW5kQ29udGFpbmVyKEV4Y2Vw
dGlvbkNvZGUmIGVjKSBjb25zdAogewotICAgIGlmICghbV9zdGFydC5jb250YWluZXIoKSkgewor
ICAgIGlmIChpc0RldGFjaGVkKCkpIHsKICAgICAgICAgZWMgPSBJTlZBTElEX1NUQVRFX0VSUjsK
ICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQpAQCAtMTM1LDcgKzE1OSw3IEBAIE5vZGUqIFJhbmdl
OjplbmRDb250YWluZXIoRXhjZXB0aW9uQ29kZSYKIAogaW50IFJhbmdlOjplbmRPZmZzZXQoRXhj
ZXB0aW9uQ29kZSYgZWMpIGNvbnN0CiB7Ci0gICAgaWYgKCFtX3N0YXJ0LmNvbnRhaW5lcigpKSB7
CisgICAgaWYgKGlzRGV0YWNoZWQoKSkgewogICAgICAgICBlYyA9IElOVkFMSURfU1RBVEVfRVJS
OwogICAgICAgICByZXR1cm4gMDsKICAgICB9CkBAIC0xNDUsNyArMTY5LDcgQEAgaW50IFJhbmdl
OjplbmRPZmZzZXQoRXhjZXB0aW9uQ29kZSYgZWMpIAogCiBOb2RlKiBSYW5nZTo6Y29tbW9uQW5j
ZXN0b3JDb250YWluZXIoRXhjZXB0aW9uQ29kZSYgZWMpIGNvbnN0CiB7Ci0gICAgaWYgKCFtX3N0
YXJ0LmNvbnRhaW5lcigpKSB7CisgICAgaWYgKGlzRGV0YWNoZWQoKSkgewogICAgICAgICBlYyA9
IElOVkFMSURfU1RBVEVfRVJSOwogICAgICAgICByZXR1cm4gMDsKICAgICB9CkBAIC0xNjYsNyAr
MTkwLDcgQEAgTm9kZSogUmFuZ2U6OmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyKE5vZAogCiBib29s
IFJhbmdlOjpjb2xsYXBzZWQoRXhjZXB0aW9uQ29kZSYgZWMpIGNvbnN0CiB7Ci0gICAgaWYgKCFt
X3N0YXJ0LmNvbnRhaW5lcigpKSB7CisgICAgaWYgKGlzRGV0YWNoZWQoKSkgewogICAgICAgICBl
YyA9IElOVkFMSURfU1RBVEVfRVJSOwogICAgICAgICByZXR1cm4gMDsKICAgICB9CkBAIC0xNzYs
NyArMjAwLDcgQEAgYm9vbCBSYW5nZTo6Y29sbGFwc2VkKEV4Y2VwdGlvbkNvZGUmIGVjKQogCiB2
b2lkIFJhbmdlOjpzZXRTdGFydChQYXNzUmVmUHRyPE5vZGU+IHJlZk5vZGUsIGludCBvZmZzZXQs
IEV4Y2VwdGlvbkNvZGUmIGVjKQogewotICAgIGlmICghbV9zdGFydC5jb250YWluZXIoKSkgewor
ICAgIGlmIChpc0RldGFjaGVkKCkpIHsKICAgICAgICAgZWMgPSBJTlZBTElEX1NUQVRFX0VSUjsK
ICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTIwNiwxNSArMjMwLDE3IEBAIHZvaWQgUmFuZ2U6
OnNldFN0YXJ0KFBhc3NSZWZQdHI8Tm9kZT4gcmUKICAgICB3aGlsZSAoc3RhcnRSb290Q29udGFp
bmVyLT5wYXJlbnROb2RlKCkpCiAgICAgICAgIHN0YXJ0Um9vdENvbnRhaW5lciA9IHN0YXJ0Um9v
dENvbnRhaW5lci0+cGFyZW50Tm9kZSgpOwogICAgIGlmIChzdGFydFJvb3RDb250YWluZXIgIT0g
ZW5kUm9vdENvbnRhaW5lcikKLSAgICAgICAgY29sbGFwc2UodHJ1ZSwgZWMpOworICAgICAgICBt
X2VuZCA9IG1fc3RhcnQ7CiAgICAgLy8gY2hlY2sgaWYgbmV3IHN0YXJ0IGFmdGVyIGVuZAogICAg
IGVsc2UgaWYgKGNvbXBhcmVCb3VuZGFyeVBvaW50cyhtX3N0YXJ0LCBtX2VuZCkgPiAwKQotICAg
ICAgICBjb2xsYXBzZSh0cnVlLCBlYyk7CisgICAgICAgIG1fZW5kID0gbV9zdGFydDsKKworICAg
IGNoZWNrQ29uc2lzdGVuY3koKTsKIH0KIAogdm9pZCBSYW5nZTo6c2V0RW5kKFBhc3NSZWZQdHI8
Tm9kZT4gcmVmTm9kZSwgaW50IG9mZnNldCwgRXhjZXB0aW9uQ29kZSYgZWMpCiB7Ci0gICAgaWYg
KCFtX3N0YXJ0LmNvbnRhaW5lcigpKSB7CisgICAgaWYgKGlzRGV0YWNoZWQoKSkgewogICAgICAg
ICBlYyA9IElOVkFMSURfU1RBVEVfRVJSOwogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtMjQ0
LDE1ICsyNzAsMTcgQEAgdm9pZCBSYW5nZTo6c2V0RW5kKFBhc3NSZWZQdHI8Tm9kZT4gcmVmTgog
ICAgIHdoaWxlIChzdGFydFJvb3RDb250YWluZXItPnBhcmVudE5vZGUoKSkKICAgICAgICAgc3Rh
cnRSb290Q29udGFpbmVyID0gc3RhcnRSb290Q29udGFpbmVyLT5wYXJlbnROb2RlKCk7CiAgICAg
aWYgKHN0YXJ0Um9vdENvbnRhaW5lciAhPSBlbmRSb290Q29udGFpbmVyKQotICAgICAgICBjb2xs
YXBzZShmYWxzZSwgZWMpOworICAgICAgICBtX3N0YXJ0ID0gbV9lbmQ7CiAgICAgLy8gY2hlY2sg
aWYgbmV3IGVuZCBiZWZvcmUgc3RhcnQKICAgICBpZiAoY29tcGFyZUJvdW5kYXJ5UG9pbnRzKG1f
c3RhcnQsIG1fZW5kKSA+IDApCi0gICAgICAgIGNvbGxhcHNlKGZhbHNlLCBlYyk7CisgICAgICAg
IG1fc3RhcnQgPSBtX2VuZDsKKworICAgIGNoZWNrQ29uc2lzdGVuY3koKTsKIH0KIAogdm9pZCBS
YW5nZTo6Y29sbGFwc2UoYm9vbCB0b1N0YXJ0LCBFeGNlcHRpb25Db2RlJiBlYykKIHsKLSAgICBp
ZiAoIW1fc3RhcnQuY29udGFpbmVyKCkpIHsKKyAgICBpZiAoaXNEZXRhY2hlZCgpKSB7CiAgICAg
ICAgIGVjID0gSU5WQUxJRF9TVEFURV9FUlI7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC0y
NjEsMTEgKzI4OSwxMyBAQCB2b2lkIFJhbmdlOjpjb2xsYXBzZShib29sIHRvU3RhcnQsIEV4Y2Vw
CiAgICAgICAgIG1fZW5kID0gbV9zdGFydDsKICAgICBlbHNlCiAgICAgICAgIG1fc3RhcnQgPSBt
X2VuZDsKKworICAgIGNoZWNrQ29uc2lzdGVuY3koKTsKIH0KIAotYm9vbCBSYW5nZTo6aXNQb2lu
dEluUmFuZ2UoTm9kZSogcmVmTm9kZSwgaW50IG9mZnNldCwgRXhjZXB0aW9uQ29kZSYgZWMpCiti
b29sIFJhbmdlOjppc1BvaW50SW5SYW5nZShOb2RlKiByZWZOb2RlLCBpbnQgb2Zmc2V0LCBFeGNl
cHRpb25Db2RlJiBlYykgY29uc3QKIHsKLSAgICBpZiAoIW1fc3RhcnQuY29udGFpbmVyKCkpIHsK
KyAgICBpZiAoaXNEZXRhY2hlZCgpKSB7CiAgICAgICAgIGVjID0gSU5WQUxJRF9TVEFURV9FUlI7
CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CkBAIC0yNzUsNiArMzA1LDExIEBAIGJvb2wg
UmFuZ2U6OmlzUG9pbnRJblJhbmdlKE5vZGUqIHJlZk5vZGUKICAgICAgICAgcmV0dXJuIGZhbHNl
OwogICAgIH0KIAorICAgIC8vIEZJWE1FOiBhdHRhY2hlZCgpIG1lYW5zIHNvbWV0aGluZyBlbnRp
cmVseSBkaWZmZXJlbnQgZm9yIERPTSBub2RlcyB0aGFuIGZvcgorICAgIC8vIERPTSByYW5nZXMs
IGFuZCBpdCdzIG5vdCBhcHByb3ByaWF0ZSB0byBiZSBjaGVja2luZyBpdCBoZXJlLiBQcmVzdW1h
Ymx5IHRoaXMKKyAgICAvLyB3YW50cyB0byBjaGVjayBmb3Igbm9kZXMgdGhhdCBhcmUgbm90IGlu
IHRoZSBkb2N1bWVudCBoaWVyYXJjaHksIGJ1dCBpdCdzCisgICAgLy8gbm90IGNsZWFyIHdlIG5l
ZWQgYSBzcGVjaWFsIGNhc2UgZm9yIHRoaXMgaWYgd2UgbWFrZSBzdXJlIGNvbXBhcmVCb3VuZGFy
eVBvaW50cworICAgIC8vIGNhbiBoYW5kbGUgdGhpcyBjYXNlLgogICAgIGlmICghcmVmTm9kZS0+
YXR0YWNoZWQoKSkgewogICAgICAgICAvLyBGaXJlZm94IGRvZXNuJ3QgdGhyb3cgYW4gZXhjZXB0
aW9uIGZvciB0aGlzIGNhc2U7IGl0IHJldHVybnMgZmFsc2UuCiAgICAgICAgIHJldHVybiBmYWxz
ZTsKQEAgLTI5NCwxMyArMzI5LDEzIEBAIGJvb2wgUmFuZ2U6OmlzUG9pbnRJblJhbmdlKE5vZGUq
IHJlZk5vZGUKICAgICAgICAgJiYgY29tcGFyZUJvdW5kYXJ5UG9pbnRzKHJlZk5vZGUsIG9mZnNl
dCwgbV9lbmQuY29udGFpbmVyKCksIG1fZW5kLm9mZnNldCgpKSA8PSAwOwogfQogCi1zaG9ydCBS
YW5nZTo6Y29tcGFyZVBvaW50KE5vZGUqIHJlZk5vZGUsIGludCBvZmZzZXQsIEV4Y2VwdGlvbkNv
ZGUmIGVjKQorc2hvcnQgUmFuZ2U6OmNvbXBhcmVQb2ludChOb2RlKiByZWZOb2RlLCBpbnQgb2Zm
c2V0LCBFeGNlcHRpb25Db2RlJiBlYykgY29uc3QKIHsKICAgICAvLyBodHRwOi8vZGV2ZWxvcGVy
Lm1vemlsbGEub3JnL2VuL2RvY3MvRE9NOnJhbmdlLmNvbXBhcmVQb2ludAogICAgIC8vIFRoaXMg
bWV0aG9kIHJldHVybnMgLTEsIDAgb3IgMSBkZXBlbmRpbmcgb24gaWYgdGhlIHBvaW50IGRlc2Ny
aWJlZCBieSB0aGUgCiAgICAgLy8gcmVmTm9kZSBub2RlIGFuZCBhbiBvZmZzZXQgd2l0aGluIHRo
ZSBub2RlIGlzIGJlZm9yZSwgc2FtZSBhcywgb3IgYWZ0ZXIgdGhlIHJhbmdlIHJlc3BlY3RpdmVs
eS4KIAotICAgIGlmICghbV9zdGFydC5jb250YWluZXIoKSkgeworICAgIGlmIChpc0RldGFjaGVk
KCkpIHsKICAgICAgICAgZWMgPSBJTlZBTElEX1NUQVRFX0VSUjsKICAgICAgICAgcmV0dXJuIDA7
CiAgICAgfQpAQCAtMzEwLDcgKzM0NSwxNyBAQCBzaG9ydCBSYW5nZTo6Y29tcGFyZVBvaW50KE5v
ZGUqIHJlZk5vZGUsCiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIAotICAgIGlmICghcmVmTm9k
ZS0+YXR0YWNoZWQoKSB8fCByZWZOb2RlLT5kb2N1bWVudCgpICE9IG1fb3duZXJEb2N1bWVudCkg
eworICAgIGlmIChyZWZOb2RlLT5kb2N1bWVudCgpICE9IG1fb3duZXJEb2N1bWVudCkgeworICAg
ICAgICBlYyA9IFdST05HX0RPQ1VNRU5UX0VSUjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQor
CisgICAgLy8gRklYTUU6IGF0dGFjaGVkKCkgbWVhbnMgc29tZXRoaW5nIGVudGlyZWx5IGRpZmZl
cmVudCBmb3IgRE9NIG5vZGVzIHRoYW4gZm9yCisgICAgLy8gRE9NIHJhbmdlcywgYW5kIGl0J3Mg
bm90IGFwcHJvcHJpYXRlIHRvIGJlIGNoZWNraW5nIGl0IGhlcmUuIFByZXN1bWFibHkgdGhpcwor
ICAgIC8vIHdhbnRzIHRvIGNoZWNrIGZvciBub2RlcyB0aGF0IGFyZSBub3QgaW4gdGhlIGRvY3Vt
ZW50IGhpZXJhcmNoeSwgYnV0IGl0J3MKKyAgICAvLyBub3QgY2xlYXIgd2UgbmVlZCBhIHNwZWNp
YWwgY2FzZSBmb3IgdGhpcyBpZiB3ZSBtYWtlIHN1cmUgY29tcGFyZUJvdW5kYXJ5UG9pbnRzCisg
ICAgLy8gY2FuIGhhbmRsZSB0aGlzIGNhc2UuCisgICAgaWYgKCFyZWZOb2RlLT5hdHRhY2hlZCgp
KSB7CiAgICAgICAgIGVjID0gV1JPTkdfRE9DVU1FTlRfRVJSOwogICAgICAgICByZXR1cm4gMDsK
ICAgICB9CkBAIC0zMzIsNyArMzc3LDcgQEAgc2hvcnQgUmFuZ2U6OmNvbXBhcmVQb2ludChOb2Rl
KiByZWZOb2RlLAogICAgIHJldHVybiAwOwogfQogCi1SYW5nZTo6Q29tcGFyZVJlc3VsdHMgUmFu
Z2U6OmNvbXBhcmVOb2RlKE5vZGUqIHJlZk5vZGUsIEV4Y2VwdGlvbkNvZGUmIGVjKQorUmFuZ2U6
OkNvbXBhcmVSZXN1bHRzIFJhbmdlOjpjb21wYXJlTm9kZShOb2RlKiByZWZOb2RlLCBFeGNlcHRp
b25Db2RlJiBlYykgY29uc3QKIHsKICAgICAvLyBodHRwOi8vZGV2ZWxvcGVyLm1vemlsbGEub3Jn
L2VuL2RvY3MvRE9NOnJhbmdlLmNvbXBhcmVOb2RlCiAgICAgLy8gVGhpcyBtZXRob2QgcmV0dXJu
cyAwLCAxLCAyLCBvciAzIGJhc2VkIG9uIGlmIHRoZSBub2RlIGlzIGJlZm9yZSwgYWZ0ZXIsCkBA
IC0zNDIsMTUgKzM4NywyNSBAQCBSYW5nZTo6Q29tcGFyZVJlc3VsdHMgUmFuZ2U6OmNvbXBhcmVO
b2RlCiAgICAgICAgIGVjID0gTk9UX0ZPVU5EX0VSUjsKICAgICAgICAgcmV0dXJuIE5PREVfQkVG
T1JFOwogICAgIH0KLSAgICAKLSAgICBpZiAoIW1fc3RhcnQuY29udGFpbmVyKCkgJiYgcmVmTm9k
ZS0+YXR0YWNoZWQoKSkgewotICAgICAgICBlYyA9IElOVkFMSURfU1RBVEVfRVJSOwotICAgICAg
ICByZXR1cm4gTk9ERV9CRUZPUkU7Ci0gICAgfQogCi0gICAgaWYgKG1fc3RhcnQuY29udGFpbmVy
KCkgJiYgIXJlZk5vZGUtPmF0dGFjaGVkKCkpIHsKLSAgICAgICAgLy8gRmlyZWZveCBkb2Vzbid0
IHRocm93IGFuIGV4Y2VwdGlvbiBmb3IgdGhpcyBjYXNlOyBpdCByZXR1cm5zIDAuCi0gICAgICAg
IHJldHVybiBOT0RFX0JFRk9SRTsKKyAgICBpZiAoaXNEZXRhY2hlZCgpKSB7CisgICAgICAgIC8v
IEZJWE1FOiBhdHRhY2hlZCgpIG1lYW5zIHNvbWV0aGluZyBlbnRpcmVseSBkaWZmZXJlbnQgZm9y
IERPTSBub2RlcyB0aGFuIGZvcgorICAgICAgICAvLyBET00gcmFuZ2VzLCBhbmQgaXQncyBub3Qg
YXBwcm9wcmlhdGUgdG8gYmUgY2hlY2tpbmcgaXQgaGVyZS4gUHJlc3VtYWJseSB0aGlzCisgICAg
ICAgIC8vIHdhbnRzIHRvIGNoZWNrIGZvciBub2RlcyB0aGF0IGFyZSBpbiB0aGUgZG9jdW1lbnQg
aGllcmFyY2h5LCBidXQgaXQncworICAgICAgICAvLyBub3QgY2xlYXIgd2UgbmVlZCBhIHNwZWNp
YWwgY2FzZSBmb3IgdGhpcy4KKyAgICAgICAgaWYgKHJlZk5vZGUtPmF0dGFjaGVkKCkpIHsKKyAg
ICAgICAgICAgIGVjID0gSU5WQUxJRF9TVEFURV9FUlI7CisgICAgICAgICAgICByZXR1cm4gTk9E
RV9CRUZPUkU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvLyBGSVhNRTogYXR0
YWNoZWQoKSBtZWFucyBzb21ldGhpbmcgZW50aXJlbHkgZGlmZmVyZW50IGZvciBET00gbm9kZXMg
dGhhbiBmb3IKKyAgICAgICAgLy8gRE9NIHJhbmdlcywgYW5kIGl0J3Mgbm90IGFwcHJvcHJpYXRl
IHRvIGJlIGNoZWNraW5nIGl0IGhlcmUuIFByZXN1bWFibHkgdGhpcworICAgICAgICAvLyB3YW50
cyB0byBjaGVjayBmb3Igbm9kZXMgdGhhdCBhcmUgbm90IGluIHRoZSBkb2N1bWVudCBoaWVyYXJj
aHksIGJ1dCBpdCdzCisgICAgICAgIC8vIG5vdCBjbGVhciB3ZSBuZWVkIGEgc3BlY2lhbCBjYXNl
IGZvciB0aGlzLgorICAgICAgICBpZiAoIXJlZk5vZGUtPmF0dGFjaGVkKCkpIHsKKyAgICAgICAg
ICAgIC8vIEZpcmVmb3ggZG9lc24ndCB0aHJvdyBhbiBleGNlcHRpb24gZm9yIHRoaXMgY2FzZTsg
aXQgcmV0dXJucyAwLgorICAgICAgICAgICAgcmV0dXJuIE5PREVfQkVGT1JFOworICAgICAgICB9
CiAgICAgfQogCiAgICAgaWYgKHJlZk5vZGUtPmRvY3VtZW50KCkgIT0gbV9vd25lckRvY3VtZW50
KSB7CkBAIC0zNjIsOCArNDE3LDggQEAgUmFuZ2U6OkNvbXBhcmVSZXN1bHRzIFJhbmdlOjpjb21w
YXJlTm9kZQogICAgIGludCBub2RlSW5kZXggPSByZWZOb2RlLT5ub2RlSW5kZXgoKTsKICAgICAK
ICAgICBpZiAoIXBhcmVudE5vZGUpIHsKLSAgICAgICAgLy8gaWYgdGhlIG5vZGUgaXMgdGhlIHRv
cCBkb2N1bWVudCB3ZSBzaG91bGQgcmV0dXJuIE5PREVfQkVGT1JFX0FORF9BRlRFUgotICAgICAg
ICAvLyBidXQgd2UgdGhyb3cgdG8gbWF0Y2ggZmlyZWZveCBiZWhhdmlvcgorICAgICAgICAvLyBJ
ZiB0aGUgbm9kZSBpcyB0aGUgZG9jdW1lbnQgd2Ugc2hvdWxkIHJldHVybiBOT0RFX0JFRk9SRV9B
TkRfQUZURVIsCisgICAgICAgIC8vIGJ1dCB3ZSB0aHJvdyB0byBtYXRjaCBGaXJlZm94IGJlaGF2
aW9yLgogICAgICAgICBlYyA9IE5PVF9GT1VORF9FUlI7CiAgICAgICAgIHJldHVybiBOT0RFX0JF
Rk9SRTsKICAgICB9CkBAIC0zODIsNyArNDM3LDcgQEAgUmFuZ2U6OkNvbXBhcmVSZXN1bHRzIFJh
bmdlOjpjb21wYXJlTm9kZQogCiBzaG9ydCBSYW5nZTo6Y29tcGFyZUJvdW5kYXJ5UG9pbnRzKENv
bXBhcmVIb3cgaG93LCBjb25zdCBSYW5nZSogc291cmNlUmFuZ2UsIEV4Y2VwdGlvbkNvZGUmIGVj
KSBjb25zdAogewotICAgIGlmICghbV9zdGFydC5jb250YWluZXIoKSkgeworICAgIGlmIChpc0Rl
dGFjaGVkKCkpIHsKICAgICAgICAgZWMgPSBJTlZBTElEX1NUQVRFX0VSUjsKICAgICAgICAgcmV0
dXJuIDA7CiAgICAgfQpAQCAtNTI5LDcgKzU4NCw3IEBAIHNob3J0IFJhbmdlOjpjb21wYXJlQm91
bmRhcnlQb2ludHMoY29uc3QKIAogYm9vbCBSYW5nZTo6Ym91bmRhcnlQb2ludHNWYWxpZCgpIGNv
bnN0CiB7Ci0gICAgcmV0dXJuIG1fc3RhcnQuY29udGFpbmVyKCkgJiYgY29tcGFyZUJvdW5kYXJ5
UG9pbnRzKG1fc3RhcnQsIG1fZW5kKSA8PSAwOworICAgIHJldHVybiAhaXNEZXRhY2hlZCgpICYm
IGNvbXBhcmVCb3VuZGFyeVBvaW50cyhtX3N0YXJ0LCBtX2VuZCkgPD0gMDsKIH0KIAogdm9pZCBS
YW5nZTo6ZGVsZXRlQ29udGVudHMoRXhjZXB0aW9uQ29kZSYgZWMpCkBAIC01NDEsNyArNTk2LDcg
QEAgdm9pZCBSYW5nZTo6ZGVsZXRlQ29udGVudHMoRXhjZXB0aW9uQ29kZQogICAgIHByb2Nlc3ND
b250ZW50cyhERUxFVEVfQ09OVEVOVFMsIGVjKTsKIH0KIAotYm9vbCBSYW5nZTo6aW50ZXJzZWN0
c05vZGUoTm9kZSogcmVmTm9kZSwgRXhjZXB0aW9uQ29kZSYgZWMpCitib29sIFJhbmdlOjppbnRl
cnNlY3RzTm9kZShOb2RlKiByZWZOb2RlLCBFeGNlcHRpb25Db2RlJiBlYykgY29uc3QKIHsKICAg
ICAvLyBodHRwOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL2RvY3MvRE9NOnJhbmdlLmludGVy
c2VjdHNOb2RlCiAgICAgLy8gUmV0dXJucyBhIGJvb2wgaWYgdGhlIG5vZGUgaW50ZXJzZWN0cyB0
aGUgcmFuZ2UuCkBAIC01NTEsMzEgKzYwNiw1NCBAQCBib29sIFJhbmdlOjppbnRlcnNlY3RzTm9k
ZShOb2RlKiByZWZOb2RlCiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgCi0gICAg
aWYgKCghbV9zdGFydC5jb250YWluZXIoKSAmJiByZWZOb2RlLT5hdHRhY2hlZCgpKQotICAgICAg
ICAgICAgfHwgKG1fc3RhcnQuY29udGFpbmVyKCkgJiYgIXJlZk5vZGUtPmF0dGFjaGVkKCkpCi0g
ICAgICAgICAgICB8fCByZWZOb2RlLT5kb2N1bWVudCgpICE9IG1fb3duZXJEb2N1bWVudCkgewot
ICAgICAgICAvLyBGaXJlZm94IGRvZXNuJ3QgdGhyb3cgYW4gZXhjZXB0aW9uIGZvciB0aGVzZSBj
YXNlczsgaXQgcmV0dXJucyBmYWxzZS4KKyAgICBpZiAocmVmTm9kZS0+ZG9jdW1lbnQoKSAhPSBt
X293bmVyRG9jdW1lbnQpIHsKKyAgICAgICAgLy8gRmlyZWZveCBkb2Vzbid0IHRocm93IGFuIGV4
Y2VwdGlvbiBmb3IgdGhpcyBjYXNlOyBpdCByZXR1cm5zIGZhbHNlLgogICAgICAgICByZXR1cm4g
ZmFsc2U7CiAgICAgfQogCisgICAgaWYgKGlzRGV0YWNoZWQoKSkgeworICAgICAgICAvLyBGSVhN
RTogYXR0YWNoZWQoKSBtZWFucyBzb21ldGhpbmcgZW50aXJlbHkgZGlmZmVyZW50IGZvciBET00g
bm9kZXMgdGhhbiBmb3IKKyAgICAgICAgLy8gRE9NIHJhbmdlcywgYW5kIGl0J3Mgbm90IGFwcHJv
cHJpYXRlIHRvIGJlIGNoZWNraW5nIGl0IGhlcmUuIFByZXN1bWFibHkgdGhpcworICAgICAgICAv
LyB3YW50cyB0byBjaGVjayBmb3Igbm9kZXMgdGhhdCBhcmUgbm90IGluIHRoZSBkb2N1bWVudCBo
aWVyYXJjaHksIGJ1dCBpdCdzCisgICAgICAgIC8vIG5vdCBjbGVhciB3ZSBuZWVkIGEgc3BlY2lh
bCBjYXNlIGZvciB0aGlzLgorICAgICAgICBpZiAocmVmTm9kZS0+YXR0YWNoZWQoKSkgeworICAg
ICAgICAgICAgLy8gRmlyZWZveCBkb2Vzbid0IHRocm93IGFuIGV4Y2VwdGlvbiBmb3IgdGhpcyBj
YXNlOyBpdCByZXR1cm5zIGZhbHNlLgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAg
ICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gRklYTUU6IGF0dGFjaGVkKCkgbWVhbnMgc29t
ZXRoaW5nIGVudGlyZWx5IGRpZmZlcmVudCBmb3IgRE9NIG5vZGVzIHRoYW4gZm9yCisgICAgICAg
IC8vIERPTSByYW5nZXMsIGFuZCBpdCdzIG5vdCBhcHByb3ByaWF0ZSB0byBiZSBjaGVja2luZyBp
dCBoZXJlLiBQcmVzdW1hYmx5IHRoaXMKKyAgICAgICAgLy8gd2FudHMgdG8gY2hlY2sgZm9yIG5v
ZGVzIHRoYXQgYXJlIG5vdCBpbiB0aGUgZG9jdW1lbnQgaGllcmFyY2h5LCBidXQgaXQncworICAg
ICAgICAvLyBub3QgY2xlYXIgd2UgbmVlZCBhIHNwZWNpYWwgY2FzZSBmb3IgdGhpcy4KKyAgICAg
ICAgaWYgKCFyZWZOb2RlLT5hdHRhY2hlZCgpKSB7CisgICAgICAgICAgICAvLyBGaXJlZm94IGRv
ZXNuJ3QgdGhyb3cgYW4gZXhjZXB0aW9uIGZvciB0aGlzIGNhc2U7IGl0IHJldHVybnMgZmFsc2Uu
CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKICAgICBOb2Rl
KiBwYXJlbnROb2RlID0gcmVmTm9kZS0+cGFyZW50Tm9kZSgpOwogICAgIGludCBub2RlSW5kZXgg
PSByZWZOb2RlLT5ub2RlSW5kZXgoKTsKLSAgICAKKwogICAgIGlmICghcGFyZW50Tm9kZSkgewot
ICAgICAgICAvLyBpZiB0aGUgbm9kZSBpcyB0aGUgdG9wIGRvY3VtZW50IHdlIHNob3VsZCByZXR1
cm4gTk9ERV9CRUZPUkVfQU5EX0FGVEVSCi0gICAgICAgIC8vIGJ1dCB3ZSB0aHJvdyB0byBtYXRj
aCBmaXJlZm94IGJlaGF2aW9yCisgICAgICAgIC8vIElmIHRoZSBub2RlIGlzIHRoZSBkb2N1bWVu
dCB3ZSBzaG91bGQgcmV0dXJuIE5PREVfQkVGT1JFX0FORF9BRlRFUiwKKyAgICAgICAgLy8gYnV0
IHdlIHRocm93IHRvIG1hdGNoIEZpcmVmb3ggYmVoYXZpb3IuCiAgICAgICAgIGVjID0gTk9UX0ZP
VU5EX0VSUjsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIGlmIChjb21wYXJl
UG9pbnQocGFyZW50Tm9kZSwgbm9kZUluZGV4LCBlYykgPCAwICYmIC8vIHN0YXJ0cyBiZWZvcmUg
c3RhcnQKLSAgICAgICAgY29tcGFyZVBvaW50KHBhcmVudE5vZGUsIG5vZGVJbmRleCArIDEsIGVj
KSA8IDApIHsgLy8gZW5kcyBiZWZvcmUgc3RhcnQKKyAgICBlYyA9IDA7CisgICAgaW50IGZpcnN0
Q29tcGFyaXNvbiA9IGNvbXBhcmVQb2ludChwYXJlbnROb2RlLCBub2RlSW5kZXgsIGVjKTsKKyAg
ICBpZiAoZWMpCiAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9IGVsc2UgaWYgKGNvbXBhcmVQ
b2ludChwYXJlbnROb2RlLCBub2RlSW5kZXgsIGVjKSA+IDAgJiYgLy8gc3RhcnRzIGFmdGVyIGVu
ZAotICAgICAgICAgICAgICAgY29tcGFyZVBvaW50KHBhcmVudE5vZGUsIG5vZGVJbmRleCArIDEs
IGVjKSA+IDApIHsgLy8gZW5kcyBhZnRlciBlbmQKKworICAgIC8vIHN0YXJ0cyBiZWZvcmUgc3Rh
cnQgYW5kIGVuZHMgYmVmb3JlIHN0YXJ0CisgICAgaWYgKGZpcnN0Q29tcGFyaXNvbiA8IDAgJiYg
Y29tcGFyZVBvaW50KHBhcmVudE5vZGUsIG5vZGVJbmRleCArIDEsIGVjKSA8IDApCiAgICAgICAg
IHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCisKKyAgICAvLyBzdGFydHMgYWZ0ZXIgZW5kIGFu
ZCBlbmRzIGFmdGVyIGVuZAorICAgIGlmIChmaXJzdENvbXBhcmlzb24gPiAwICYmIGNvbXBhcmVQ
b2ludChwYXJlbnROb2RlLCBub2RlSW5kZXggKyAxLCBlYykgPiAwKQorICAgICAgICByZXR1cm4g
ZmFsc2U7CisKICAgICByZXR1cm4gdHJ1ZTsgLy8gYWxsIG90aGVyIGNhc2VzCiB9CiAKQEAgLTU4
OCwxMiArNjY2LDEwIEBAIFBhc3NSZWZQdHI8RG9jdW1lbnRGcmFnbWVudD4gUmFuZ2U6OnByb2MK
ICAgICBpZiAoYWN0aW9uID09IEVYVFJBQ1RfQ09OVEVOVFMgfHwgYWN0aW9uID09IENMT05FX0NP
TlRFTlRTKQogICAgICAgICBmcmFnbWVudCA9IG5ldyBEb2N1bWVudEZyYWdtZW50KG1fb3duZXJE
b2N1bWVudC5nZXQoKSk7CiAgICAgCi0gICAgZWMgPSAwOwotICAgIGlmIChjb2xsYXBzZWQoZWMp
KQorICAgIGlmIChtX3N0YXJ0ID09IG1fZW5kKQogICAgICAgICByZXR1cm4gZnJhZ21lbnQucmVs
ZWFzZSgpOwotICAgIGlmIChlYykKLSAgICAgICAgcmV0dXJuIDA7CiAKKyAgICBlYyA9IDA7CiAg
ICAgTm9kZSogY29tbW9uUm9vdCA9IGNvbW1vbkFuY2VzdG9yQ29udGFpbmVyKGVjKTsKICAgICBp
ZiAoZWMpCiAgICAgICAgIHJldHVybiAwOwpAQCAtNjU4LDYgKzczNCw5IEBAIFBhc3NSZWZQdHI8
RG9jdW1lbnRGcmFnbWVudD4gUmFuZ2U6OnByb2MKICAgICAgICAgICAgICAgICBpKys7CiAgICAg
ICAgICAgICB9CiAgICAgICAgIH0KKworICAgICAgICBjaGVja0NvbnNpc3RlbmN5KCk7CisKICAg
ICAgICAgcmV0dXJuIGZyYWdtZW50LnJlbGVhc2UoKTsKICAgICB9CiAKQEAgLTg3MSw2ICs5NTAs
OCBAQCBQYXNzUmVmUHRyPERvY3VtZW50RnJhZ21lbnQ+IFJhbmdlOjpwcm9jCiAgICAgaWYgKChh
Y3Rpb24gPT0gRVhUUkFDVF9DT05URU5UUyB8fCBhY3Rpb24gPT0gQ0xPTkVfQ09OVEVOVFMpICYm
IHJpZ2h0Q29udGVudHMpCiAgICAgICAgIGZyYWdtZW50LT5hcHBlbmRDaGlsZChyaWdodENvbnRl
bnRzLCBlYyk7CiAKKyAgICBjaGVja0NvbnNpc3RlbmN5KCk7CisKICAgICByZXR1cm4gZnJhZ21l
bnQucmVsZWFzZSgpOwogfQogCkBAIC04ODUsNyArOTY2LDcgQEAgUGFzc1JlZlB0cjxEb2N1bWVu
dEZyYWdtZW50PiBSYW5nZTo6ZXh0cgogCiBQYXNzUmVmUHRyPERvY3VtZW50RnJhZ21lbnQ+IFJh
bmdlOjpjbG9uZUNvbnRlbnRzKEV4Y2VwdGlvbkNvZGUmIGVjKQogewotICAgIGlmICghbV9zdGFy
dC5jb250YWluZXIoKSkgeworICAgIGlmIChpc0RldGFjaGVkKCkpIHsKICAgICAgICAgZWMgPSBJ
TlZBTElEX1NUQVRFX0VSUjsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQpAQCAtODk5LDcgKzk4
MCw3IEBAIHZvaWQgUmFuZ2U6Omluc2VydE5vZGUoUGFzc1JlZlB0cjxOb2RlPiAKIAogICAgIGVj
ID0gMDsKIAotICAgIGlmICghbV9zdGFydC5jb250YWluZXIoKSkgeworICAgIGlmIChpc0RldGFj
aGVkKCkpIHsKICAgICAgICAgZWMgPSBJTlZBTElEX1NUQVRFX0VSUjsKICAgICAgICAgcmV0dXJu
OwogICAgIH0KQEAgLTk3NywxNyArMTA1OCwzMSBAQCB2b2lkIFJhbmdlOjppbnNlcnROb2RlKFBh
c3NSZWZQdHI8Tm9kZT4gCiAKICAgICBib29sIGNvbGxhcHNlZCA9IG1fc3RhcnQgPT0gbV9lbmQ7
CiAgICAgaWYgKHN0YXJ0SXNUZXh0KSB7Ci0gICAgICAgIFJlZlB0cjxUZXh0PiBuZXdUZXh0ID0g
c3RhdGljX2Nhc3Q8VGV4dCo+KG1fc3RhcnQuY29udGFpbmVyKCkpLT5zcGxpdFRleHQobV9zdGFy
dC5vZmZzZXQoKSwgZWMpOwotICAgICAgICBpZiAoZWMpCi0gICAgICAgICAgICByZXR1cm47Ci0g
ICAgICAgIG1fc3RhcnQuY29udGFpbmVyKCktPnBhcmVudE5vZGUoKS0+aW5zZXJ0QmVmb3JlKG5l
d05vZGUucmVsZWFzZSgpLCBuZXdUZXh0LmdldCgpLCBlYyk7CisgICAgICAgIFJlZlB0cjxUZXh0
PiBzdGFydFRleHROb2RlID0gc3RhdGljX2Nhc3Q8VGV4dCo+KG1fc3RhcnQuY29udGFpbmVyKCkp
OworICAgICAgICBSZWZQdHI8Tm9kZT4gbm9kZVRvSW5zZXJ0QmVmb3JlOworICAgICAgICB1bnNp
Z25lZCBzdGFydE9mZnNldCA9IG1fc3RhcnQub2Zmc2V0KCk7CisgICAgICAgIGlmICghc3RhcnRP
ZmZzZXQpCisgICAgICAgICAgICBub2RlVG9JbnNlcnRCZWZvcmUgPSBzdGFydFRleHROb2RlOwor
ICAgICAgICBlbHNlIGlmIChzdGFydE9mZnNldCA+PSBzdGFydFRleHROb2RlLT5sZW5ndGgoKSkK
KyAgICAgICAgICAgIG5vZGVUb0luc2VydEJlZm9yZSA9IHN0YXJ0VGV4dE5vZGUtPm5leHRTaWJs
aW5nKCk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgbm9kZVRvSW5zZXJ0QmVmb3JlID0g
c3RhcnRUZXh0Tm9kZS0+c3BsaXRUZXh0KHN0YXJ0T2Zmc2V0LCBlYyk7CisgICAgICAgICAgICBp
ZiAoZWMpCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFJlZlB0
cjxOb2RlPiBjb250YWluZXIgPSBzdGFydFRleHROb2RlLT5wYXJlbnROb2RlKCk7CisgICAgICAg
IGNvbnRhaW5lci0+aW5zZXJ0QmVmb3JlKG5ld05vZGUucmVsZWFzZSgpLCBub2RlVG9JbnNlcnRC
ZWZvcmUuZ2V0KCksIGVjKTsKICAgICAgICAgaWYgKGVjKQogICAgICAgICAgICAgcmV0dXJuOwog
CiAgICAgICAgIC8vIFRoaXMgc3BlY2lhbCBjYXNlIGRvZXNuJ3Qgc2VlbSB0byBtYXRjaCB0aGUg
RE9NIHNwZWNpZmljYXRpb24sIGJ1dCBpdCdzIGN1cnJlbnRseSByZXF1aXJlZAogICAgICAgICAv
LyB0byBwYXNzIEFjaWQzLiBXZSBtaWdodCBsYXRlciBkZWNpZGUgdG8gcmVtb3ZlIHRoaXMuCi0g
ICAgICAgIGlmIChjb2xsYXBzZWQpCi0gICAgICAgICAgICBtX2VuZC5zZXRUb0JlZm9yZUNoaWxk
KG5ld1RleHQuZ2V0KCkpOworICAgICAgICBpZiAoY29sbGFwc2VkKSB7CisgICAgICAgICAgICBp
ZiAobm9kZVRvSW5zZXJ0QmVmb3JlKQorICAgICAgICAgICAgICAgIG1fZW5kLnNldFRvQmVmb3Jl
Q2hpbGQobm9kZVRvSW5zZXJ0QmVmb3JlLmdldCgpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAg
ICAgICAgICAgICBtX2VuZC5zZXRUb0VuZE9mTm9kZShjb250YWluZXIuZ2V0KCkpOworICAgICAg
ICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgUmVmUHRyPE5vZGU+IGxhc3RDaGlsZDsKICAgICAg
ICAgaWYgKGNvbGxhcHNlZCkKQEAgLTEwMDMsMTEgKzEwOTgsMTMgQEAgdm9pZCBSYW5nZTo6aW5z
ZXJ0Tm9kZShQYXNzUmVmUHRyPE5vZGU+IAogICAgICAgICBpZiAoY29sbGFwc2VkKQogICAgICAg
ICAgICAgbV9lbmQuc2V0KG1fc3RhcnQuY29udGFpbmVyKCksIHN0YXJ0T2Zmc2V0ICsgbnVtTmV3
Q2hpbGRyZW4sIGxhc3RDaGlsZC5nZXQoKSk7CiAgICAgfQorCisgICAgY2hlY2tDb25zaXN0ZW5j
eSgpOwogfQogCiBTdHJpbmcgUmFuZ2U6OnRvU3RyaW5nKEV4Y2VwdGlvbkNvZGUmIGVjKSBjb25z
dAogewotICAgIGlmICghbV9zdGFydC5jb250YWluZXIoKSkgeworICAgIGlmIChpc0RldGFjaGVk
KCkpIHsKICAgICAgICAgZWMgPSBJTlZBTElEX1NUQVRFX0VSUjsKICAgICAgICAgcmV0dXJuIFN0
cmluZygpOwogICAgIH0KQEAgLTEwMzUsNyArMTEzMiw3IEBAIFN0cmluZyBSYW5nZTo6dG9IVE1M
KCkgY29uc3QKIAogU3RyaW5nIFJhbmdlOjp0ZXh0KCkgY29uc3QKIHsKLSAgICBpZiAoIW1fc3Rh
cnQuY29udGFpbmVyKCkpCisgICAgaWYgKGlzRGV0YWNoZWQoKSkKICAgICAgICAgcmV0dXJuIFN0
cmluZygpOwogCiAgICAgLy8gV2UgbmVlZCB0byB1cGRhdGUgbGF5b3V0LCBzaW5jZSBwbGFpblRl
eHQgdXNlcyBsaW5lIGJveGVzIGluIHRoZSByZW5kZXIgdHJlZS4KQEAgLTEwNDcsNyArMTE0NCw3
IEBAIFN0cmluZyBSYW5nZTo6dGV4dCgpIGNvbnN0CiAKIFBhc3NSZWZQdHI8RG9jdW1lbnRGcmFn
bWVudD4gUmFuZ2U6OmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudChjb25zdCBTdHJpbmcmIG1hcmt1
cCwgRXhjZXB0aW9uQ29kZSYgZWMpIGNvbnN0CiB7Ci0gICAgaWYgKCFtX3N0YXJ0LmNvbnRhaW5l
cigpKSB7CisgICAgaWYgKGlzRGV0YWNoZWQoKSkgewogICAgICAgICBlYyA9IElOVkFMSURfU1RB
VEVfRVJSOwogICAgICAgICByZXR1cm4gMDsKICAgICB9CkBAIC0xMDcwLDcgKzExNjcsNyBAQCBQ
YXNzUmVmUHRyPERvY3VtZW50RnJhZ21lbnQ+IFJhbmdlOjpjcmVhCiAKIHZvaWQgUmFuZ2U6OmRl
dGFjaChFeGNlcHRpb25Db2RlJiBlYykKIHsKLSAgICBpZiAoIW1fc3RhcnQuY29udGFpbmVyKCkp
IHsKKyAgICBpZiAoaXNEZXRhY2hlZCgpKSB7CiAgICAgICAgIGVjID0gSU5WQUxJRF9TVEFURV9F
UlI7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC0xMDc5LDYgKzExNzYsOCBAQCB2b2lkIFJh
bmdlOjpkZXRhY2goRXhjZXB0aW9uQ29kZSYgZWMpCiAKICAgICBtX3N0YXJ0LmNsZWFyKCk7CiAg
ICAgbV9lbmQuY2xlYXIoKTsKKworICAgIGNoZWNrQ29uc2lzdGVuY3koKTsKIH0KIAogTm9kZSog
UmFuZ2U6OmNoZWNrTm9kZVdPZmZzZXQoTm9kZSogbiwgaW50IG9mZnNldCwgRXhjZXB0aW9uQ29k
ZSYgZWMpIGNvbnN0CkBAIC0xMTcwLDcgKzEyNjksNyBAQCB2b2lkIFJhbmdlOjpjaGVja05vZGVC
QShOb2RlKiBuLCBFeGNlcHRpCiAKIFBhc3NSZWZQdHI8UmFuZ2U+IFJhbmdlOjpjbG9uZVJhbmdl
KEV4Y2VwdGlvbkNvZGUmIGVjKSBjb25zdAogewotICAgIGlmICghbV9zdGFydC5jb250YWluZXIo
KSkgeworICAgIGlmIChpc0RldGFjaGVkKCkpIHsKICAgICAgICAgZWMgPSBJTlZBTElEX1NUQVRF
X0VSUjsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQpAQCAtMTE4MCw3ICsxMjc5LDcgQEAgUGFz
c1JlZlB0cjxSYW5nZT4gUmFuZ2U6OmNsb25lUmFuZ2UoRXhjZQogCiB2b2lkIFJhbmdlOjpzZXRT
dGFydEFmdGVyKE5vZGUqIHJlZk5vZGUsIEV4Y2VwdGlvbkNvZGUmIGVjKQogewotICAgIGlmICgh
bV9zdGFydC5jb250YWluZXIoKSkgeworICAgIGlmIChpc0RldGFjaGVkKCkpIHsKICAgICAgICAg
ZWMgPSBJTlZBTElEX1NUQVRFX0VSUjsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTEyMDUs
NyArMTMwNCw3IEBAIHZvaWQgUmFuZ2U6OnNldFN0YXJ0QWZ0ZXIoTm9kZSogcmVmTm9kZSwKIAog
dm9pZCBSYW5nZTo6c2V0RW5kQmVmb3JlKE5vZGUqIHJlZk5vZGUsIEV4Y2VwdGlvbkNvZGUmIGVj
KQogewotICAgIGlmICghbV9zdGFydC5jb250YWluZXIoKSkgeworICAgIGlmIChpc0RldGFjaGVk
KCkpIHsKICAgICAgICAgZWMgPSBJTlZBTElEX1NUQVRFX0VSUjsKICAgICAgICAgcmV0dXJuOwog
ICAgIH0KQEAgLTEyMzAsNyArMTMyOSw3IEBAIHZvaWQgUmFuZ2U6OnNldEVuZEJlZm9yZShOb2Rl
KiByZWZOb2RlLCAKIAogdm9pZCBSYW5nZTo6c2V0RW5kQWZ0ZXIoTm9kZSogcmVmTm9kZSwgRXhj
ZXB0aW9uQ29kZSYgZWMpCiB7Ci0gICAgaWYgKCFtX3N0YXJ0LmNvbnRhaW5lcigpKSB7CisgICAg
aWYgKGlzRGV0YWNoZWQoKSkgewogICAgICAgICBlYyA9IElOVkFMSURfU1RBVEVfRVJSOwogICAg
ICAgICByZXR1cm47CiAgICAgfQpAQCAtMTI1Niw3ICsxMzU1LDcgQEAgdm9pZCBSYW5nZTo6c2V0
RW5kQWZ0ZXIoTm9kZSogcmVmTm9kZSwgRQogCiB2b2lkIFJhbmdlOjpzZWxlY3ROb2RlKE5vZGUq
IHJlZk5vZGUsIEV4Y2VwdGlvbkNvZGUmIGVjKQogewotICAgIGlmICghbV9zdGFydC5jb250YWlu
ZXIoKSkgeworICAgIGlmIChpc0RldGFjaGVkKCkpIHsKICAgICAgICAgZWMgPSBJTlZBTElEX1NU
QVRFX0VSUjsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTEzMTgsNyArMTQxNyw3IEBAIHZv
aWQgUmFuZ2U6OnNlbGVjdE5vZGUoTm9kZSogcmVmTm9kZSwgRXgKIAogdm9pZCBSYW5nZTo6c2Vs
ZWN0Tm9kZUNvbnRlbnRzKE5vZGUqIHJlZk5vZGUsIEV4Y2VwdGlvbkNvZGUmIGVjKQogewotICAg
IGlmICghbV9zdGFydC5jb250YWluZXIoKSkgeworICAgIGlmIChpc0RldGFjaGVkKCkpIHsKICAg
ICAgICAgZWMgPSBJTlZBTElEX1NUQVRFX0VSUjsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAg
LTEzNTMsMTMgKzE0NTIsMTUgQEAgdm9pZCBSYW5nZTo6c2VsZWN0Tm9kZUNvbnRlbnRzKE5vZGUq
IHJlZgogCiAgICAgbV9zdGFydC5zZXRUb1N0YXJ0T2ZOb2RlKHJlZk5vZGUpOwogICAgIG1fZW5k
LnNldFRvRW5kT2ZOb2RlKHJlZk5vZGUpOworCisgICAgY2hlY2tDb25zaXN0ZW5jeSgpOwogfQog
CiB2b2lkIFJhbmdlOjpzdXJyb3VuZENvbnRlbnRzKFBhc3NSZWZQdHI8Tm9kZT4gcGFzc05ld1Bh
cmVudCwgRXhjZXB0aW9uQ29kZSYgZWMpCiB7CiAgICAgUmVmUHRyPE5vZGU+IG5ld1BhcmVudCA9
IHBhc3NOZXdQYXJlbnQ7CiAKLSAgICBpZiAoIW1fc3RhcnQuY29udGFpbmVyKCkpIHsKKyAgICBp
ZiAoaXNEZXRhY2hlZCgpKSB7CiAgICAgICAgIGVjID0gSU5WQUxJRF9TVEFURV9FUlI7CiAgICAg
ICAgIHJldHVybjsKICAgICB9CkBAIC0xNDU3LDcgKzE1NTgsNyBAQCB2b2lkIFJhbmdlOjpzdXJy
b3VuZENvbnRlbnRzKFBhc3NSZWZQdHI8CiAKIHZvaWQgUmFuZ2U6OnNldFN0YXJ0QmVmb3JlKE5v
ZGUqIHJlZk5vZGUsIEV4Y2VwdGlvbkNvZGUmIGVjKQogewotICAgIGlmICghbV9zdGFydC5jb250
YWluZXIoKSkgeworICAgIGlmIChpc0RldGFjaGVkKCkpIHsKICAgICAgICAgZWMgPSBJTlZBTElE
X1NUQVRFX0VSUjsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTE0ODIsNyArMTU4Myw3IEBA
IHZvaWQgUmFuZ2U6OnNldFN0YXJ0QmVmb3JlKE5vZGUqIHJlZk5vZGUKIAogdm9pZCBSYW5nZTo6
Y2hlY2tEZWxldGVFeHRyYWN0KEV4Y2VwdGlvbkNvZGUmIGVjKQogewotICAgIGlmICghbV9zdGFy
dC5jb250YWluZXIoKSkgeworICAgIGlmIChpc0RldGFjaGVkKCkpIHsKICAgICAgICAgZWMgPSBJ
TlZBTElEX1NUQVRFX0VSUjsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTE1MjQsNyArMTYy
NSw3IEBAIGJvb2wgUmFuZ2U6OmNvbnRhaW5lZEJ5UmVhZE9ubHkoKSBjb25zdAogCiBOb2RlKiBS
YW5nZTo6Zmlyc3ROb2RlKCkgY29uc3QKIHsKLSAgICBpZiAoIW1fc3RhcnQuY29udGFpbmVyKCkp
CisgICAgaWYgKGlzRGV0YWNoZWQoKSkKICAgICAgICAgcmV0dXJuIDA7CiAgICAgaWYgKG1fc3Rh
cnQuY29udGFpbmVyKCktPm9mZnNldEluQ2hhcmFjdGVycygpKQogICAgICAgICByZXR1cm4gbV9z
dGFydC5jb250YWluZXIoKTsKQEAgLTE1NDYsMTAgKzE2NDcsOSBAQCBQb3NpdGlvbiBSYW5nZTo6
ZWRpdGluZ1N0YXJ0UG9zaXRpb24oKSBjCiAgICAgaWYgKHZpc2libGVQb3NpdGlvbi5pc051bGwo
KSkKICAgICAgICAgcmV0dXJuIFBvc2l0aW9uKCk7CiAKLSAgICBFeGNlcHRpb25Db2RlIGVjID0g
MDsKICAgICAvLyBpZiB0aGUgc2VsZWN0aW9uIGlzIGEgY2FyZXQsIGp1c3QgcmV0dXJuIHRoZSBw
b3NpdGlvbiwgc2luY2UgdGhlIHN0eWxlCiAgICAgLy8gYmVoaW5kIHVzIGlzIHJlbGV2YW50Ci0g
ICAgaWYgKGNvbGxhcHNlZChlYykpCisgICAgaWYgKG1fc3RhcnQgPT0gbV9lbmQpCiAgICAgICAg
IHJldHVybiB2aXNpYmxlUG9zaXRpb24uZGVlcEVxdWl2YWxlbnQoKTsKIAogICAgIC8vIGlmIHRo
ZSBzZWxlY3Rpb24gc3RhcnRzIGp1c3QgYmVmb3JlIGEgcGFyYWdyYXBoIGJyZWFrLCBza2lwIG92
ZXIgaXQKQEAgLTE1NjgsNyArMTY2OCw3IEBAIE5vZGUqIFJhbmdlOjpzaGFkb3dUcmVlUm9vdE5v
ZGUoKSBjb25zdAogCiBOb2RlKiBSYW5nZTo6cGFzdExhc3ROb2RlKCkgY29uc3QKIHsKLSAgICBp
ZiAoIW1fc3RhcnQuY29udGFpbmVyKCkgfHwgIW1fZW5kLmNvbnRhaW5lcigpKQorICAgIGlmIChp
c0RldGFjaGVkKCkpCiAgICAgICAgIHJldHVybiAwOwogICAgIGlmIChtX2VuZC5jb250YWluZXIo
KS0+b2Zmc2V0SW5DaGFyYWN0ZXJzKCkpCiAgICAgICAgIHJldHVybiBtX2VuZC5jb250YWluZXIo
KS0+dHJhdmVyc2VOZXh0U2libGluZygpOwpAQCAtMTU5MCw3ICsxNjkwLDcgQEAgSW50UmVjdCBS
YW5nZTo6Ym91bmRpbmdCb3goKQogCiB2b2lkIFJhbmdlOjp0ZXh0UmVjdHMoVmVjdG9yPEludFJl
Y3Q+JiByZWN0cywgYm9vbCB1c2VTZWxlY3Rpb25IZWlnaHQpCiB7Ci0gICAgaWYgKCFtX3N0YXJ0
LmNvbnRhaW5lcigpIHx8ICFtX2VuZC5jb250YWluZXIoKSkKKyAgICBpZiAoaXNEZXRhY2hlZCgp
KQogICAgICAgICByZXR1cm47CiAKICAgICBOb2RlKiBzdGFydENvbnRhaW5lciA9IG1fc3RhcnQu
Y29udGFpbmVyKCk7CkBAIC0xNjE1LDcgKzE3MTUsNyBAQCB2b2lkIFJhbmdlOjpmb3JtYXRGb3JE
ZWJ1Z2dlcihjaGFyKiBidWZmCiAgICAgU3RyaW5nIHJlc3VsdDsKICAgICBTdHJpbmcgczsKICAg
ICAKLSAgICBpZiAoIW1fc3RhcnQuY29udGFpbmVyKCkgfHwgIW1fZW5kLmNvbnRhaW5lcigpKQor
ICAgIGlmIChpc0RldGFjaGVkKCkpCiAgICAgICAgIHJlc3VsdCA9ICI8ZW1wdHk+IjsKICAgICBl
bHNlIHsKICAgICAgICAgY2hhciBzW0Zvcm1hdEJ1ZmZlclNpemVdOwpAQCAtMTY0NCw3ICsxNzQ0
LDcgQEAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFJhbmdlJiBhLCBjb25zdCBSYQogICAgIC8vIGZp
bmUgd2l0aCBHQ0MgdG8gZGV0ZWN0IHN1Y2ggY2FzZXMgYW5kIHJldHVybiBmYWxzZSByYXRoZXIg
dGhhbiBjcmFzaGluZy4KICAgICBpZiAoISZhIHx8ICEmYikKICAgICAgICAgcmV0dXJuIGZhbHNl
OwotICAgIHJldHVybiBhLnN0YXJ0UG9zaXRpb24oKSA9PSBiLnN0YXJ0UG9zaXRpb24oKSAmJiBh
LmVuZFBvc2l0aW9uKCkgPT0gYi5lbmRQb3NpdGlvbigpOworICAgIHJldHVybiBhLm1fc3RhcnQg
PT0gYi5tX3N0YXJ0ICYmIGEubV9lbmQgPT0gYi5tX2VuZDsKIH0KIAogUGFzc1JlZlB0cjxSYW5n
ZT4gcmFuZ2VPZkNvbnRlbnRzKE5vZGUqIG5vZGUpCkBAIC0xNjU4LDcgKzE3NTgsNyBAQCBQYXNz
UmVmUHRyPFJhbmdlPiByYW5nZU9mQ29udGVudHMoTm9kZSogCiAKIGludCBSYW5nZTo6bWF4U3Rh
cnRPZmZzZXQoKSBjb25zdAogewotICAgIGlmICghbV9zdGFydC5jb250YWluZXIoKSkKKyAgICBp
ZiAoaXNEZXRhY2hlZCgpKQogICAgICAgICByZXR1cm4gMDsKICAgICBpZiAoIW1fc3RhcnQuY29u
dGFpbmVyKCktPm9mZnNldEluQ2hhcmFjdGVycygpKQogICAgICAgICByZXR1cm4gbV9zdGFydC5j
b250YWluZXIoKS0+Y2hpbGROb2RlQ291bnQoKTsKQEAgLTE2NjcsNyArMTc2Nyw3IEBAIGludCBS
YW5nZTo6bWF4U3RhcnRPZmZzZXQoKSBjb25zdAogCiBpbnQgUmFuZ2U6Om1heEVuZE9mZnNldCgp
IGNvbnN0CiB7Ci0gICAgaWYgKCFtX2VuZC5jb250YWluZXIoKSkKKyAgICBpZiAoaXNEZXRhY2hl
ZCgpKQogICAgICAgICByZXR1cm4gMDsKICAgICBpZiAoIW1fZW5kLmNvbnRhaW5lcigpLT5vZmZz
ZXRJbkNoYXJhY3RlcnMoKSkKICAgICAgICAgcmV0dXJuIG1fZW5kLmNvbnRhaW5lcigpLT5jaGls
ZE5vZGVDb3VudCgpOwpAQCAtMTY4NSwxMCArMTc4NSwxMiBAQCBzdGF0aWMgaW5saW5lIHZvaWQg
Ym91bmRhcnlOb2RlQ2hpbGRyZW5DCiAKIHZvaWQgUmFuZ2U6Om5vZGVDaGlsZHJlbkNoYW5nZWQo
Q29udGFpbmVyTm9kZSogY29udGFpbmVyKQogeworICAgIEFTU0VSVCghaXNEZXRhY2hlZCgpKTsK
ICAgICBBU1NFUlQoY29udGFpbmVyKTsKICAgICBBU1NFUlQoY29udGFpbmVyLT5kb2N1bWVudCgp
ID09IG1fb3duZXJEb2N1bWVudCk7CiAgICAgYm91bmRhcnlOb2RlQ2hpbGRyZW5DaGFuZ2VkKG1f
c3RhcnQsIGNvbnRhaW5lcik7CiAgICAgYm91bmRhcnlOb2RlQ2hpbGRyZW5DaGFuZ2VkKG1fZW5k
LCBjb250YWluZXIpOworICAgIGNoZWNrQ29uc2lzdGVuY3koKTsKIH0KIAogc3RhdGljIGlubGlu
ZSB2b2lkIGJvdW5kYXJ5Tm9kZVdpbGxCZVJlbW92ZWQoUmFuZ2VCb3VuZGFyeVBvaW50JiBib3Vu
ZGFyeSwgTm9kZSogbm9kZVRvQmVSZW1vdmVkKQpAQCAtMTcwOCwxMiArMTgxMCwxNCBAQCBzdGF0
aWMgaW5saW5lIHZvaWQgYm91bmRhcnlOb2RlV2lsbEJlUmVtCiAKIHZvaWQgUmFuZ2U6Om5vZGVX
aWxsQmVSZW1vdmVkKE5vZGUqIG5vZGUpCiB7CisgICAgQVNTRVJUKCFpc0RldGFjaGVkKCkpOwog
ICAgIEFTU0VSVChub2RlKTsKICAgICBBU1NFUlQobm9kZS0+ZG9jdW1lbnQoKSA9PSBtX293bmVy
RG9jdW1lbnQpOwogICAgIEFTU0VSVChub2RlICE9IG1fb3duZXJEb2N1bWVudCk7CiAgICAgQVNT
RVJUKG5vZGUtPnBhcmVudE5vZGUoKSk7CiAgICAgYm91bmRhcnlOb2RlV2lsbEJlUmVtb3ZlZCht
X3N0YXJ0LCBub2RlKTsKICAgICBib3VuZGFyeU5vZGVXaWxsQmVSZW1vdmVkKG1fZW5kLCBub2Rl
KTsKKyAgICBjaGVja0NvbnNpc3RlbmN5KCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBib3Vu
ZGFyeVRleHRJbnNlcnRlZChSYW5nZUJvdW5kYXJ5UG9pbnQmIGJvdW5kYXJ5LCBOb2RlKiB0ZXh0
LCB1bnNpZ25lZCBvZmZzZXQsIHVuc2lnbmVkIGxlbmd0aCkKQEAgLTE3MjgsMTAgKzE4MzIsMTIg
QEAgc3RhdGljIGlubGluZSB2b2lkIGJvdW5kYXJ5VGV4dEluc2VydGVkKAogCiB2b2lkIFJhbmdl
Ojp0ZXh0SW5zZXJ0ZWQoTm9kZSogdGV4dCwgdW5zaWduZWQgb2Zmc2V0LCB1bnNpZ25lZCBsZW5n
dGgpCiB7CisgICAgQVNTRVJUKCFpc0RldGFjaGVkKCkpOwogICAgIEFTU0VSVCh0ZXh0KTsKICAg
ICBBU1NFUlQodGV4dC0+ZG9jdW1lbnQoKSA9PSBtX293bmVyRG9jdW1lbnQpOwogICAgIGJvdW5k
YXJ5VGV4dEluc2VydGVkKG1fc3RhcnQsIHRleHQsIG9mZnNldCwgbGVuZ3RoKTsKICAgICBib3Vu
ZGFyeVRleHRJbnNlcnRlZChtX2VuZCwgdGV4dCwgb2Zmc2V0LCBsZW5ndGgpOworICAgIGNoZWNr
Q29uc2lzdGVuY3koKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGJvdW5kYXJ5VGV4dFJlbW92
ZWQoUmFuZ2VCb3VuZGFyeVBvaW50JiBib3VuZGFyeSwgTm9kZSogdGV4dCwgdW5zaWduZWQgb2Zm
c2V0LCB1bnNpZ25lZCBsZW5ndGgpCkBAIC0xNzQ5LDUyICsxODU1LDcxIEBAIHN0YXRpYyBpbmxp
bmUgdm9pZCBib3VuZGFyeVRleHRSZW1vdmVkKFIKIAogdm9pZCBSYW5nZTo6dGV4dFJlbW92ZWQo
Tm9kZSogdGV4dCwgdW5zaWduZWQgb2Zmc2V0LCB1bnNpZ25lZCBsZW5ndGgpCiB7CisgICAgQVNT
RVJUKCFpc0RldGFjaGVkKCkpOwogICAgIEFTU0VSVCh0ZXh0KTsKICAgICBBU1NFUlQodGV4dC0+
ZG9jdW1lbnQoKSA9PSBtX293bmVyRG9jdW1lbnQpOwogICAgIGJvdW5kYXJ5VGV4dFJlbW92ZWQo
bV9zdGFydCwgdGV4dCwgb2Zmc2V0LCBsZW5ndGgpOwogICAgIGJvdW5kYXJ5VGV4dFJlbW92ZWQo
bV9lbmQsIHRleHQsIG9mZnNldCwgbGVuZ3RoKTsKKyAgICBjaGVja0NvbnNpc3RlbmN5KCk7CiB9
CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBib3VuZGFyeVRleHROb2Rlc01lcmdlZChSYW5nZUJvdW5k
YXJ5UG9pbnQmIGJvdW5kYXJ5LCBOb2RlV2l0aEluZGV4JiBvbGROb2RlLCB1bnNpZ25lZCBvZmZz
ZXQpCitzdGF0aWMgaW5saW5lIHZvaWQgYm91bmRhcnlUZXh0Tm9kZXNXaWxsTWVyZ2UoUmFuZ2VC
b3VuZGFyeVBvaW50JiBib3VuZGFyeSwgTm9kZVdpdGhJbmRleCYgb2xkTm9kZSwgdW5zaWduZWQg
b2Zmc2V0KQogewotICAgIGlmIChib3VuZGFyeS5jb250YWluZXIoKSA9PSBvbGROb2RlLm5vZGUo
KSkKLSAgICAgICAgYm91bmRhcnkuc2V0KG9sZE5vZGUubm9kZSgpLT5wcmV2aW91c1NpYmxpbmco
KSwgYm91bmRhcnkub2Zmc2V0KCkgKyBvZmZzZXQsIDApOwotICAgIGVsc2UgaWYgKGJvdW5kYXJ5
LmNvbnRhaW5lcigpID09IG9sZE5vZGUubm9kZSgpLT5wYXJlbnROb2RlKCkgJiYgYm91bmRhcnku
b2Zmc2V0KCkgPT0gb2xkTm9kZS5pbmRleCgpKQotICAgICAgICBib3VuZGFyeS5zZXQob2xkTm9k
ZS5ub2RlKCktPnByZXZpb3VzU2libGluZygpLCBvZmZzZXQsIDApOworICAgIGlmIChib3VuZGFy
eS5jb250YWluZXIoKSA9PSBvbGROb2RlLm5vZGUoKSkgeworICAgICAgICBOb2RlKiBuZXdOb2Rl
ID0gb2xkTm9kZS5ub2RlKCktPnByZXZpb3VzU2libGluZygpOworICAgICAgICBpZiAoIW5ld05v
ZGUpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGJvdW5kYXJ5LnNldChuZXdOb2RlLCBi
b3VuZGFyeS5vZmZzZXQoKSArIG9mZnNldCwgMCk7CisgICAgICAgIHJldHVybjsKKyAgICB9Cisg
ICAgTm9kZSogY29udGFpbmVyID0gb2xkTm9kZS5ub2RlKCktPnBhcmVudE5vZGUoKTsKKyAgICBp
ZiAoY29udGFpbmVyICYmIGJvdW5kYXJ5LmNvbnRhaW5lcigpID09IGNvbnRhaW5lciAmJiBib3Vu
ZGFyeS5vZmZzZXQoKSA9PSBvbGROb2RlLmluZGV4KCkpIHsKKyAgICAgICAgTm9kZSogbmV3Tm9k
ZSA9IG9sZE5vZGUubm9kZSgpLT5wcmV2aW91c1NpYmxpbmcoKTsKKyAgICAgICAgaWYgKCFuZXdO
b2RlKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBib3VuZGFyeS5zZXQobmV3Tm9kZSwg
b2Zmc2V0LCAwKTsKKyAgICB9CiB9CiAKLXZvaWQgUmFuZ2U6OnRleHROb2Rlc01lcmdlZChOb2Rl
V2l0aEluZGV4JiBvbGROb2RlLCB1bnNpZ25lZCBvZmZzZXQpCit2b2lkIFJhbmdlOjp0ZXh0Tm9k
ZXNXaWxsTWVyZ2UoTm9kZVdpdGhJbmRleCYgb2xkTm9kZSwgdW5zaWduZWQgb2Zmc2V0KQogewor
ICAgIEFTU0VSVCghaXNEZXRhY2hlZCgpKTsKICAgICBBU1NFUlQob2xkTm9kZS5ub2RlKCkpOwog
ICAgIEFTU0VSVChvbGROb2RlLm5vZGUoKS0+ZG9jdW1lbnQoKSA9PSBtX293bmVyRG9jdW1lbnQp
OwogICAgIEFTU0VSVChvbGROb2RlLm5vZGUoKS0+cGFyZW50Tm9kZSgpKTsKICAgICBBU1NFUlQo
b2xkTm9kZS5ub2RlKCktPmlzVGV4dE5vZGUoKSk7CiAgICAgQVNTRVJUKG9sZE5vZGUubm9kZSgp
LT5wcmV2aW91c1NpYmxpbmcoKSk7CiAgICAgQVNTRVJUKG9sZE5vZGUubm9kZSgpLT5wcmV2aW91
c1NpYmxpbmcoKS0+aXNUZXh0Tm9kZSgpKTsKLSAgICBib3VuZGFyeVRleHROb2Rlc01lcmdlZCht
X3N0YXJ0LCBvbGROb2RlLCBvZmZzZXQpOwotICAgIGJvdW5kYXJ5VGV4dE5vZGVzTWVyZ2VkKG1f
ZW5kLCBvbGROb2RlLCBvZmZzZXQpOworICAgIGJvdW5kYXJ5VGV4dE5vZGVzV2lsbE1lcmdlKG1f
c3RhcnQsIG9sZE5vZGUsIG9mZnNldCk7CisgICAgYm91bmRhcnlUZXh0Tm9kZXNXaWxsTWVyZ2Uo
bV9lbmQsIG9sZE5vZGUsIG9mZnNldCk7CisgICAgY2hlY2tDb25zaXN0ZW5jeSgpOwogfQogCi1z
dGF0aWMgaW5saW5lIHZvaWQgYm91bmRhcnlUZXh0Tm9kZXNTcGxpdChSYW5nZUJvdW5kYXJ5UG9p
bnQmIGJvdW5kYXJ5LCBUZXh0KiBvbGROb2RlKQorc3RhdGljIGlubGluZSB2b2lkIGJvdW5kYXJ5
VGV4dE5vZGVXaWxsU3BsaXQoUmFuZ2VCb3VuZGFyeVBvaW50JiBib3VuZGFyeSwgVGV4dCogb2xk
Tm9kZSwgVGV4dCogbmV3Tm9kZSkKIHsKICAgICBpZiAoYm91bmRhcnkuY29udGFpbmVyKCkgIT0g
b2xkTm9kZSkKICAgICAgICAgcmV0dXJuOworICAgIHVuc2lnbmVkIG9sZFRleHRMZW5ndGggPSBv
bGROb2RlLT5sZW5ndGgoKTsKICAgICB1bnNpZ25lZCBib3VuZGFyeU9mZnNldCA9IGJvdW5kYXJ5
Lm9mZnNldCgpOwotICAgIGlmIChib3VuZGFyeU9mZnNldCA8PSBvbGROb2RlLT5sZW5ndGgoKSkK
KyAgICBpZiAoYm91bmRhcnlPZmZzZXQgPD0gb2xkVGV4dExlbmd0aCkKKyAgICAgICAgcmV0dXJu
OworICAgIGlmICghbmV3Tm9kZSkKICAgICAgICAgcmV0dXJuOwotICAgIGJvdW5kYXJ5LnNldChv
bGROb2RlLT5uZXh0U2libGluZygpLCBib3VuZGFyeU9mZnNldCAtIG9sZE5vZGUtPmxlbmd0aCgp
LCAwKTsKKyAgICBib3VuZGFyeS5zZXQobmV3Tm9kZSwgYm91bmRhcnlPZmZzZXQgLSBvbGRUZXh0
TGVuZ3RoLCAwKTsKIH0KIAotdm9pZCBSYW5nZTo6dGV4dE5vZGVTcGxpdChUZXh0KiBvbGROb2Rl
KQordm9pZCBSYW5nZTo6dGV4dE5vZGVXaWxsU3BsaXQoVGV4dCogb2xkTm9kZSwgVGV4dCogbmV3
Tm9kZSkKIHsKKyAgICBBU1NFUlQoIWlzRGV0YWNoZWQoKSk7CiAgICAgQVNTRVJUKG9sZE5vZGUp
OwogICAgIEFTU0VSVChvbGROb2RlLT5kb2N1bWVudCgpID09IG1fb3duZXJEb2N1bWVudCk7Ci0g
ICAgQVNTRVJUKG9sZE5vZGUtPnBhcmVudE5vZGUoKSk7CiAgICAgQVNTRVJUKG9sZE5vZGUtPmlz
VGV4dE5vZGUoKSk7Ci0gICAgQVNTRVJUKG9sZE5vZGUtPm5leHRTaWJsaW5nKCkpOwotICAgIEFT
U0VSVChvbGROb2RlLT5uZXh0U2libGluZygpLT5pc1RleHROb2RlKCkpOwotICAgIGJvdW5kYXJ5
VGV4dE5vZGVzU3BsaXQobV9zdGFydCwgb2xkTm9kZSk7Ci0gICAgYm91bmRhcnlUZXh0Tm9kZXNT
cGxpdChtX2VuZCwgb2xkTm9kZSk7CisgICAgQVNTRVJUKG5ld05vZGUpOworICAgIEFTU0VSVChu
ZXdOb2RlLT5kb2N1bWVudCgpID09IG1fb3duZXJEb2N1bWVudCk7CisgICAgQVNTRVJUKG5ld05v
ZGUtPmlzVGV4dE5vZGUoKSk7CisgICAgYm91bmRhcnlUZXh0Tm9kZVdpbGxTcGxpdChtX3N0YXJ0
LCBvbGROb2RlLCBuZXdOb2RlKTsKKyAgICBib3VuZGFyeVRleHROb2RlV2lsbFNwbGl0KG1fZW5k
LCBvbGROb2RlLCBuZXdOb2RlKTsKKyAgICBjaGVja0NvbnNpc3RlbmN5KCk7CiB9CiAKIH0KSW5k
ZXg6IFdlYkNvcmUvZG9tL1JhbmdlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9kb20vUmFuZ2Uu
aAkocmV2aXNpb24gNDQ0NzQpCisrKyBXZWJDb3JlL2RvbS9SYW5nZS5oCSh3b3JraW5nIGNvcHkp
CkBAIC00OCw2ICs0OCw4IEBAIHB1YmxpYzoKICAgICBOb2RlKiBlbmRDb250YWluZXIoKSBjb25z
dCB7IHJldHVybiBtX2VuZC5jb250YWluZXIoKTsgfQogICAgIGludCBlbmRPZmZzZXQoKSBjb25z
dCB7IHJldHVybiBtX2VuZC5vZmZzZXQoKTsgfQogCisgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9
PShjb25zdCBSYW5nZSYsIGNvbnN0IFJhbmdlJik7CisKICAgICBOb2RlKiBzdGFydENvbnRhaW5l
cihFeGNlcHRpb25Db2RlJikgY29uc3Q7CiAgICAgaW50IHN0YXJ0T2Zmc2V0KEV4Y2VwdGlvbkNv
ZGUmKSBjb25zdDsKICAgICBOb2RlKiBlbmRDb250YWluZXIoRXhjZXB0aW9uQ29kZSYpIGNvbnN0
OwpAQCAtNTksMTYgKzYxLDE2IEBAIHB1YmxpYzoKICAgICB2b2lkIHNldFN0YXJ0KFBhc3NSZWZQ
dHI8Tm9kZT4gY29udGFpbmVyLCBpbnQgb2Zmc2V0LCBFeGNlcHRpb25Db2RlJik7CiAgICAgdm9p
ZCBzZXRFbmQoUGFzc1JlZlB0cjxOb2RlPiBjb250YWluZXIsIGludCBvZmZzZXQsIEV4Y2VwdGlv
bkNvZGUmKTsKICAgICB2b2lkIGNvbGxhcHNlKGJvb2wgdG9TdGFydCwgRXhjZXB0aW9uQ29kZSYp
OwotICAgIGJvb2wgaXNQb2ludEluUmFuZ2UoTm9kZSogcmVmTm9kZSwgaW50IG9mZnNldCwgRXhj
ZXB0aW9uQ29kZSYgZWMpOwotICAgIHNob3J0IGNvbXBhcmVQb2ludChOb2RlKiByZWZOb2RlLCBp
bnQgb2Zmc2V0LCBFeGNlcHRpb25Db2RlJiBlYyk7CisgICAgYm9vbCBpc1BvaW50SW5SYW5nZShO
b2RlKiByZWZOb2RlLCBpbnQgb2Zmc2V0LCBFeGNlcHRpb25Db2RlJikgY29uc3Q7CisgICAgc2hv
cnQgY29tcGFyZVBvaW50KE5vZGUqIHJlZk5vZGUsIGludCBvZmZzZXQsIEV4Y2VwdGlvbkNvZGUm
KSBjb25zdDsKICAgICBlbnVtIENvbXBhcmVSZXN1bHRzIHsgTk9ERV9CRUZPUkUsIE5PREVfQUZU
RVIsIE5PREVfQkVGT1JFX0FORF9BRlRFUiwgTk9ERV9JTlNJREUgfTsKLSAgICBDb21wYXJlUmVz
dWx0cyBjb21wYXJlTm9kZShOb2RlKiByZWZOb2RlLCBFeGNlcHRpb25Db2RlJik7CisgICAgQ29t
cGFyZVJlc3VsdHMgY29tcGFyZU5vZGUoTm9kZSogcmVmTm9kZSwgRXhjZXB0aW9uQ29kZSYpIGNv
bnN0OwogICAgIGVudW0gQ29tcGFyZUhvdyB7IFNUQVJUX1RPX1NUQVJULCBTVEFSVF9UT19FTkQs
IEVORF9UT19FTkQsIEVORF9UT19TVEFSVCB9OwogICAgIHNob3J0IGNvbXBhcmVCb3VuZGFyeVBv
aW50cyhDb21wYXJlSG93LCBjb25zdCBSYW5nZSogc291cmNlUmFuZ2UsIEV4Y2VwdGlvbkNvZGUm
KSBjb25zdDsKICAgICBzdGF0aWMgc2hvcnQgY29tcGFyZUJvdW5kYXJ5UG9pbnRzKE5vZGUqIGNv
bnRhaW5lckEsIGludCBvZmZzZXRBLCBOb2RlKiBjb250YWluZXJCLCBpbnQgb2Zmc2V0Qik7CiAg
ICAgc3RhdGljIHNob3J0IGNvbXBhcmVCb3VuZGFyeVBvaW50cyhjb25zdCBSYW5nZUJvdW5kYXJ5
UG9pbnQmIGJvdW5kYXJ5QSwgY29uc3QgUmFuZ2VCb3VuZGFyeVBvaW50JiBib3VuZGFyeUIpOwog
ICAgIGJvb2wgYm91bmRhcnlQb2ludHNWYWxpZCgpIGNvbnN0OwotICAgIGJvb2wgaW50ZXJzZWN0
c05vZGUoTm9kZSogcmVmTm9kZSwgRXhjZXB0aW9uQ29kZSYpOworICAgIGJvb2wgaW50ZXJzZWN0
c05vZGUoTm9kZSogcmVmTm9kZSwgRXhjZXB0aW9uQ29kZSYpIGNvbnN0OwogICAgIHZvaWQgZGVs
ZXRlQ29udGVudHMoRXhjZXB0aW9uQ29kZSYpOwogICAgIFBhc3NSZWZQdHI8RG9jdW1lbnRGcmFn
bWVudD4gZXh0cmFjdENvbnRlbnRzKEV4Y2VwdGlvbkNvZGUmKTsKICAgICBQYXNzUmVmUHRyPERv
Y3VtZW50RnJhZ21lbnQ+IGNsb25lQ29udGVudHMoRXhjZXB0aW9uQ29kZSYpOwpAQCAtMTA5LDgg
KzExMSw4IEBAIHB1YmxpYzoKIAogICAgIHZvaWQgdGV4dEluc2VydGVkKE5vZGUqLCB1bnNpZ25l
ZCBvZmZzZXQsIHVuc2lnbmVkIGxlbmd0aCk7CiAgICAgdm9pZCB0ZXh0UmVtb3ZlZChOb2RlKiwg
dW5zaWduZWQgb2Zmc2V0LCB1bnNpZ25lZCBsZW5ndGgpOwotICAgIHZvaWQgdGV4dE5vZGVzTWVy
Z2VkKE5vZGVXaXRoSW5kZXgmIG9sZE5vZGUsIHVuc2lnbmVkIG9mZnNldCk7Ci0gICAgdm9pZCB0
ZXh0Tm9kZVNwbGl0KFRleHQqIG9sZE5vZGUpOworICAgIHZvaWQgdGV4dE5vZGVzV2lsbE1lcmdl
KE5vZGVXaXRoSW5kZXgmIG9sZE5vZGUsIHVuc2lnbmVkIG9mZnNldCk7CisgICAgdm9pZCB0ZXh0
Tm9kZVdpbGxTcGxpdChUZXh0KiBvbGROb2RlLCBUZXh0KiBuZXdOb2RlKTsKIAogI2lmbmRlZiBO
REVCVUcKICAgICB2b2lkIGZvcm1hdEZvckRlYnVnZ2VyKGNoYXIqIGJ1ZmZlciwgdW5zaWduZWQg
bGVuZ3RoKSBjb25zdDsKQEAgLTEyMCw2ICsxMjIsOSBAQCBwcml2YXRlOgogICAgIFJhbmdlKFBh
c3NSZWZQdHI8RG9jdW1lbnQ+KTsKICAgICBSYW5nZShQYXNzUmVmUHRyPERvY3VtZW50PiwgUGFz
c1JlZlB0cjxOb2RlPiBzdGFydENvbnRhaW5lciwgaW50IHN0YXJ0T2Zmc2V0LCBQYXNzUmVmUHRy
PE5vZGU+IGVuZENvbnRhaW5lciwgaW50IGVuZE9mZnNldCk7CiAKKyAgICB2b2lkIGNoZWNrQ29u
c2lzdGVuY3koKSBjb25zdDsKKyAgICBib29sIGlzRGV0YWNoZWQoKSBjb25zdDsKKwogICAgIE5v
ZGUqIGNoZWNrTm9kZVdPZmZzZXQoTm9kZSosIGludCBvZmZzZXQsIEV4Y2VwdGlvbkNvZGUmKSBj
b25zdDsKICAgICB2b2lkIGNoZWNrTm9kZUJBKE5vZGUqLCBFeGNlcHRpb25Db2RlJikgY29uc3Q7
CiAgICAgdm9pZCBjaGVja0RlbGV0ZUV4dHJhY3QoRXhjZXB0aW9uQ29kZSYpOwpAQCAtMTM3LDcg
KzE0Miw2IEBAIHByaXZhdGU6CiAKIFBhc3NSZWZQdHI8UmFuZ2U+IHJhbmdlT2ZDb250ZW50cyhO
b2RlKik7CiAKLWJvb2wgb3BlcmF0b3I9PShjb25zdCBSYW5nZSYsIGNvbnN0IFJhbmdlJik7CiBp
bmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFJhbmdlJiBhLCBjb25zdCBSYW5nZSYgYikgeyBy
ZXR1cm4gIShhID09IGIpOyB9CiAKIH0gLy8gbmFtZXNwYWNlCkluZGV4OiBXZWJDb3JlL2RvbS9U
ZXh0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2RvbS9UZXh0LmNwcAkocmV2aXNpb24gNDQ0
NzQpCisrKyBXZWJDb3JlL2RvbS9UZXh0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtNzAsNiArNzAs
NyBAQCBQYXNzUmVmUHRyPFRleHQ+IFRleHQ6OnNwbGl0VGV4dCh1bnNpZ25lCiAgICAgUmVmUHRy
PFRleHQ+IG5ld1RleHQgPSBjcmVhdGVOZXcob2xkU3RyLT5zdWJzdHJpbmcob2Zmc2V0KSk7CiAg
ICAgbV9kYXRhID0gb2xkU3RyLT5zdWJzdHJpbmcoMCwgb2Zmc2V0KTsKIAorICAgIGRvY3VtZW50
KCktPnRleHROb2RlV2lsbFNwbGl0KHRoaXMsIG5ld1RleHQuZ2V0KCkpOwogICAgIGRpc3BhdGNo
TW9kaWZpZWRFdmVudChvbGRTdHIuZ2V0KCkpOwogCiAgICAgaWYgKHBhcmVudE5vZGUoKSkKQEAg
LTc3LDkgKzc4LDYgQEAgUGFzc1JlZlB0cjxUZXh0PiBUZXh0OjpzcGxpdFRleHQodW5zaWduZQog
ICAgIGlmIChlYykKICAgICAgICAgcmV0dXJuIDA7CiAKLSAgICBpZiAocGFyZW50Tm9kZSgpKQot
ICAgICAgICBkb2N1bWVudCgpLT50ZXh0Tm9kZVNwbGl0KHRoaXMpOwotCiAgICAgaWYgKHJlbmRl
cmVyKCkpCiAgICAgICAgIHRvUmVuZGVyVGV4dChyZW5kZXJlcigpKS0+c2V0VGV4dChtX2RhdGEp
OwogCkluZGV4OiBMYXlvdXRUZXN0cy9wbGF0Zm9ybS9tYWMvZmFzdC9kb20vZGVsZXRlLWNvbnRl
bnRzLWV4cGVjdGVkLnR4dAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9wbGF0Zm9ybS9tYWMv
ZmFzdC9kb20vZGVsZXRlLWNvbnRlbnRzLWV4cGVjdGVkLnR4dAkocmV2aXNpb24gNDQ0NzQpCisr
KyBMYXlvdXRUZXN0cy9wbGF0Zm9ybS9tYWMvZmFzdC9kb20vZGVsZXRlLWNvbnRlbnRzLWV4cGVj
dGVkLnR4dAkod29ya2luZyBjb3B5KQpAQCAtNSw1ICs1LDUgQEAgbGF5ZXIgYXQgKDAsMCkgc2l6
ZSA4MDB4NjAwCiAgICAgUmVuZGVyQm9keSB7Qk9EWX0gYXQgKDgsOCkgc2l6ZSA3ODR4NTg0CiAg
ICAgICBSZW5kZXJCbG9jayB7RElWfSBhdCAoMCwwKSBzaXplIDc4NHgwCiAgICAgICAgIFJlbmRl
ckJsb2NrIHtESVZ9IGF0ICgwLDApIHNpemUgNzg0eDAKLXNlbGVjdGlvbiBzdGFydDogcG9zaXRp
b24gMCBvZiBjaGlsZCAwIHsjdGV4dH0gb2YgY2hpbGQgMCB7RElWfSBvZiBjaGlsZCAxIHtCT0RZ
fSBvZiBjaGlsZCAxIHtIVE1MfSBvZiBkb2N1bWVudAotc2VsZWN0aW9uIGVuZDogICBwb3NpdGlv
biA1IG9mIGNoaWxkIDAgeyN0ZXh0fSBvZiBjaGlsZCAwIHtESVZ9IG9mIGNoaWxkIDEge0JPRFl9
IG9mIGNoaWxkIDEge0hUTUx9IG9mIGRvY3VtZW50CitzZWxlY3Rpb24gc3RhcnQ6IHBvc2l0aW9u
IDAgb2YgY2hpbGQgMSB7I3RleHR9IG9mIGNoaWxkIDAge0RJVn0gb2YgY2hpbGQgMSB7Qk9EWX0g
b2YgY2hpbGQgMSB7SFRNTH0gb2YgZG9jdW1lbnQKK3NlbGVjdGlvbiBlbmQ6ICAgcG9zaXRpb24g
NSBvZiBjaGlsZCAxIHsjdGV4dH0gb2YgY2hpbGQgMCB7RElWfSBvZiBjaGlsZCAxIHtCT0RZfSBv
ZiBjaGlsZCAxIHtIVE1MfSBvZiBkb2N1bWVudAo=
</data>

          </attachment>
      

    </bug>

</bugzilla>