<?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>44890</bug_id>
          
          <creation_ts>2010-08-30 12:56:55 -0700</creation_ts>
          <short_desc>Add AudioContext files</short_desc>
          <delta_ts>2010-11-17 15:43:23 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>New Bugs</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Other</rep_platform>
          <op_sys>OS X 10.5</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>0</everconfirmed>
          <reporter name="Chris Rogers">crogers</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>abarth</cc>
    
    <cc>bugs</cc>
    
    <cc>cmarrin</cc>
    
    <cc>commit-queue</cc>
    
    <cc>dglazkov</cc>
    
    <cc>eric.carlson</cc>
    
    <cc>eric</cc>
    
    <cc>jamesr</cc>
    
    <cc>japhet</cc>
    
    <cc>jer.noble</cc>
    
    <cc>simon.fraser</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>271586</commentid>
    <comment_count>0</comment_count>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-08-30 12:56:55 -0700</bug_when>
    <thetext>Add AudioContext files</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>271596</commentid>
    <comment_count>1</comment_count>
      <attachid>65948</attachid>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-08-30 13:04:04 -0700</bug_when>
    <thetext>Created attachment 65948
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>271599</commentid>
    <comment_count>2</comment_count>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-08-30 13:06:16 -0700</bug_when>
    <thetext>I just realized I need to add the vendor prefix &quot;webkit&quot; to the IDL.  But anybody interested please go ahead and review the patch (minus this one detail :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>271605</commentid>
    <comment_count>3</comment_count>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-08-30 13:16:35 -0700</bug_when>
    <thetext>Sorry nevermind, Dimitri Glazkov just told me that it&apos;s DOMWindow.idl which will handle the &quot;webkit&quot; prefix, so that&apos;s not an issue with this patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>272482</commentid>
    <comment_count>4</comment_count>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-08-31 16:29:20 -0700</bug_when>
    <thetext>Implements AudioContext as described in the web audio specification:
http://chromium.googlecode.com/svn/trunk/samples/audio/specification/specification.html#AudioContext-section</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>275550</commentid>
    <comment_count>5</comment_count>
      <attachid>65948</attachid>
    <who name="James Robinson">jamesr</who>
    <bug_when>2010-09-07 19:34:57 -0700</bug_when>
    <thetext>Comment on attachment 65948
Patch

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

&gt; WebCore/webaudio/AudioContext.h:31
&gt; +
I think you want #if ENABLE(WEB_AUDIO) here as well, no?

&gt; WebCore/webaudio/AudioContext.h:62
&gt; +    static PassRefPtr&lt;AudioContext&gt; create(Document* document);
nit: no need to name this parameter

&gt; WebCore/webaudio/AudioContext.h:75
&gt; +    float currentTime() { return (float)m_destinationNode-&gt;currentTime(); }
&gt; +    float sampleRate() { return (float)m_destinationNode-&gt;sampleRate(); }
I&apos;m not sure why these have to cast, but please use C++ style static_cast&lt;float&gt;() instead of C-style casts.

&gt; WebCore/webaudio/AudioContext.h:101
&gt; +    void notifyNodeFinishedProcessing(AudioNode* node);
nit: no need to name this parameter in the header

&gt; WebCore/webaudio/AudioContext.h:105
&gt; +    void markForDeletion(AudioNode* node);
nit: no need to name this parameter in the header

&gt; WebCore/webaudio/AudioContext.h:109
&gt; +    // Gets called everytime an AudioNode is connected.
&gt; +    void nodeConnected(AudioNode* /*source*/, AudioNode* /*destination*/, unsigned /*outputIndex*/, unsigned /*inputIndex*/)
This is a little odd.  Does this function need a FIXME?  It doesn&apos;t really seem to do what the signature suggests it might.

&gt; WebCore/webaudio/AudioContext.h:125
&gt; +    AudioContext(Document* document);
&gt; +    void lazyInitialize();
&gt; +    void uninitialize();
&gt; +
&gt; +    // The context itself keeps a reference to all source nodes.  The source nodes, then reference all nodes they&apos;re connected to, and so on...
&gt; +    void refNode(AudioNode* node);
&gt; +    void derefNode(AudioNode* node);
&gt; +    void derefUnfinishedSourceNodes();
nit: no need to name these parameters in the header</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>276198</commentid>
    <comment_count>6</comment_count>
      <attachid>66969</attachid>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-09-08 17:18:58 -0700</bug_when>
    <thetext>Created attachment 66969
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>276200</commentid>
    <comment_count>7</comment_count>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-09-08 17:22:32 -0700</bug_when>
    <thetext>James, thanks for the initial review.  I&apos;ve addressed all of your comments.  I didn&apos;t put a feature enable:


#if ENABLE(WEB_AUDIO)

in the header file because I was told to only put them in the .cpp files.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>276216</commentid>
    <comment_count>8</comment_count>
      <attachid>66969</attachid>
    <who name="James Robinson">jamesr</who>
    <bug_when>2010-09-08 17:44:02 -0700</bug_when>
    <thetext>Comment on attachment 66969
Patch

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

Looking good overall.  You&apos;re right about #if ENABLE()s in a header file, not sure why I thought otherwise.

r- because of the RefPtr&lt;Document&gt; issue - I want to be sure we are handling that correctly since if it&apos;s subtly wrong it could be very hard to debug and fix down the road.

&gt; WebCore/webaudio/AudioContext.cpp:51
&gt; +#include &quot;PlatformString.h&quot;
Include &lt;wtf/text/WTFString.h&gt; to get the string class (it moved fairly recently).

&gt; WebCore/webaudio/AudioContext.cpp:60
&gt; +PassRefPtr&lt;CachedAudio&gt; AudioContext::createAudioRequest(const String &amp;url, bool mixToMono)
Do we have to use strings for URLs?  I think this will make the security folks sad pandas.

As a general note, prefer enums to bools for parameters.  It&apos;s very difficult to tell what the &apos;false&apos; in createAudioContext(..., false) means.  Something like createAudioContext(..., MixToMono/MixToStereo) or whatever the appropriate two values would be is easier to understand.

&gt; WebCore/webaudio/AudioContext.h:119
&gt; +    AudioContext(Document* document);
nit: don&apos;t name this parameter

&gt; WebCore/webaudio/AudioContext.h:123
&gt; +    // The context itself keeps a reference to all source nodes.  The source nodes, then reference all nodes they&apos;re connected to, and so on...
This comment sort of trails off.  I&apos;m not sure what it&apos;s trying to say.

&gt; WebCore/webaudio/AudioContext.h:149
&gt; +    // FIXME: check if we really need to hold on to document - we may need to, so be careful!
&gt; +    RefPtr&lt;Document&gt; m_document;
This makes me a little bit nervous.  What&apos;s the plan to resolve this FIXME?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>277589</commentid>
    <comment_count>9</comment_count>
      <attachid>67279</attachid>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-09-10 18:28:31 -0700</bug_when>
    <thetext>Created attachment 67279
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>277592</commentid>
    <comment_count>10</comment_count>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-09-10 18:32:53 -0700</bug_when>
    <thetext>James, I&apos;ve removed the createAudioRequest() method since this is just a temporary hack to access audio file binary data in an XHR-like way.  I&apos;ll be looking to replace it with XHR with binary data capabilities.

I think I&apos;ve addressed all your other comments.  I got rid of the RefPtr on Document, since I was able to locate why this was necessary and check that the document is still there by adding a hasDocument() method (I clear m_document when stop() is called).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>279781</commentid>
    <comment_count>11</comment_count>
      <attachid>67734</attachid>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-09-15 15:44:08 -0700</bug_when>
    <thetext>Created attachment 67734
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>279782</commentid>
    <comment_count>12</comment_count>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-09-15 15:46:11 -0700</bug_when>
    <thetext>I&apos;ve added a locking mechanism with lock(), tryLock(), and unlock() methods.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>282502</commentid>
    <comment_count>13</comment_count>
      <attachid>68279</attachid>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-09-21 13:08:05 -0700</bug_when>
    <thetext>Created attachment 68279
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>282508</commentid>
    <comment_count>14</comment_count>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-09-21 13:11:44 -0700</bug_when>
    <thetext>This patch addresses some more work which was done in AudioNode.  I&apos;ve added extensive asserts about threads and locks being held the important methods.  I&apos;ve tested this in both multicore and simulated single-core modes (by turning off all but one thread using hwprefs) under stress tests, repeatedly re-loading the page etc. and it works well.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>283405</commentid>
    <comment_count>15</comment_count>
      <attachid>68279</attachid>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2010-09-22 17:51:06 -0700</bug_when>
    <thetext>Comment on attachment 68279
Patch

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

We&apos;ve gone through the locking semantics of this class as well as AudioNode at length offline, and at this point I think this looks great. Marking r+; a couple of minor issues that aren&apos;t really necessary before commit, so leave them up to you.

&gt; WebCore/webaudio/AudioContext.cpp:60
&gt; +const int UndefinedThreadIdentifier = 0xffffffff;

From looking at ThreadingPthreads.cpp and ThreadingWin.cpp, I think that 0 is the correct value to use here. Regardless it would be good to define that explicitly in WTF.

&gt; WebCore/webaudio/AudioContext.cpp:114
&gt; +    printf(&quot;%p: AudioContext::~AudioContext()\n&quot;, this);

Should use LOG_ERROR or similar.

&gt; WebCore/webaudio/AudioContext.cpp:352
&gt; +    m_graphOwnerThread = thisThread;

This could be placed in the &quot;else&quot; clause to avoid mutating this member over and over; not a big deal.

&gt; WebCore/webaudio/AudioContext.cpp:437
&gt; +    ASSERT(isAudioThread());

Could use an ASSERT(isGraphOwner()) too.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>283411</commentid>
    <comment_count>16</comment_count>
      <attachid>68279</attachid>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2010-09-22 17:53:39 -0700</bug_when>
    <thetext>Comment on attachment 68279
Patch

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

&gt; WebCore/webaudio/AudioContext.idl:60
&gt; +        RealtimeAnalyserNode createAnalyser();

One more minor comment: I don&apos;t see this method in the Web Audio spec.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>283775</commentid>
    <comment_count>17</comment_count>
      <attachid>68279</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2010-09-23 10:50:12 -0700</bug_when>
    <thetext>Comment on attachment 68279
Patch

Clearing flags on attachment: 68279

Committed r68163: &lt;http://trac.webkit.org/changeset/68163&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>283777</commentid>
    <comment_count>18</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2010-09-23 10:50:20 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>283887</commentid>
    <comment_count>19</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-09-23 13:16:41 -0700</bug_when>
    <thetext>http://trac.webkit.org/changeset/68163 might have broken GTK Linux 32-bit Debug
The following changes are on the blame list:
http://trac.webkit.org/changeset/68163
http://trac.webkit.org/changeset/68164
http://trac.webkit.org/changeset/68165
http://trac.webkit.org/changeset/68166
http://trac.webkit.org/changeset/68167
http://trac.webkit.org/changeset/68168
http://trac.webkit.org/changeset/68169</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>310398</commentid>
    <comment_count>20</comment_count>
    <who name="Olli Pettay (:smaug)">bugs</who>
    <bug_when>2010-11-17 11:23:09 -0800</bug_when>
    <thetext>So the main interface is non-prefixed?
It certainly should be prefixed with webkit, because there
is no specification for Audio yet, just proposals.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>310419</commentid>
    <comment_count>21</comment_count>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-11-17 11:52:01 -0800</bug_when>
    <thetext>The webkit prefix will be in the patch for adding the AudioContext constructor in DOMWindow.idl.  So an AudioContext will be constructed as follows:

var context = new webkitAudioContext();</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>310570</commentid>
    <comment_count>22</comment_count>
    <who name="Olli Pettay (:smaug)">bugs</who>
    <bug_when>2010-11-17 15:43:23 -0800</bug_when>
    <thetext>Ok, great.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>65948</attachid>
            <date>2010-08-30 13:04:04 -0700</date>
            <delta_ts>2010-09-08 17:18:54 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-44890-20100830130402.patch</filename>
            <type>text/plain</type>
            <size>20100</size>
            <attacher name="Chris Rogers">crogers</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2NjQwMikKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNTMgQEAKKzIwMTAtMDgtMzAgIENocmlzIFJvZ2VycyAgPGNyb2dlcnNAZ29vZ2xl
LmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBB
ZGQgQXVkaW9Db250ZXh0IGZpbGVzCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3No
b3dfYnVnLmNnaT9pZD00NDg5MAorCisgICAgICAgIE5vIG5ldyB0ZXN0cyBzaW5jZSBhdWRpbyBB
UEkgaXMgbm90IHlldCBpbXBsZW1lbnRlZC4KKworICAgICAgICAqIHdlYmF1ZGlvOiBBZGRlZC4K
KyAgICAgICAgKiB3ZWJhdWRpby9BdWRpb0NvbnRleHQuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdl
YkNvcmU6OkF1ZGlvQ29udGV4dDo6Y3JlYXRlKToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvQ29u
dGV4dDo6QXVkaW9Db250ZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvQ29udGV4dDo6fkF1
ZGlvQ29udGV4dCk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb0NvbnRleHQ6OmxhenlJbml0aWFs
aXplKToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvQ29udGV4dDo6dW5pbml0aWFsaXplKToKKyAg
ICAgICAgKFdlYkNvcmU6OkF1ZGlvQ29udGV4dDo6c3RvcCk6CisgICAgICAgIChXZWJDb3JlOjpB
dWRpb0NvbnRleHQ6OmlzSW5pdGlhbGl6ZWQpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9Db250
ZXh0OjpyZWZCdWZmZXIpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9Db250ZXh0OjpjcmVhdGVC
dWZmZXIpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9Db250ZXh0OjpjcmVhdGVCdWZmZXJTb3Vy
Y2UpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9Db250ZXh0OjpjcmVhdGVKYXZhU2NyaXB0Tm9k
ZSk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb0NvbnRleHQ6OmNyZWF0ZUxvd1Bhc3MyRmlsdGVy
KToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvQ29udGV4dDo6Y3JlYXRlSGlnaFBhc3MyRmlsdGVy
KToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvQ29udGV4dDo6Y3JlYXRlUGFubmVyKToKKyAgICAg
ICAgKFdlYkNvcmU6OkF1ZGlvQ29udGV4dDo6Y3JlYXRlQ29udm9sdmVyKToKKyAgICAgICAgKFdl
YkNvcmU6OkF1ZGlvQ29udGV4dDo6Y3JlYXRlQW5hbHlzZXIpOgorICAgICAgICAoV2ViQ29yZTo6
QXVkaW9Db250ZXh0OjpjcmVhdGVHYWluTm9kZSk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb0Nv
bnRleHQ6OmNyZWF0ZURlbGF5Tm9kZSk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb0NvbnRleHQ6
OmNyZWF0ZUNoYW5uZWxTcGxpdHRlcik6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb0NvbnRleHQ6
OmNyZWF0ZUNoYW5uZWxNZXJnZXIpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9Db250ZXh0Ojpu
b3RpZnlOb2RlRmluaXNoZWRQcm9jZXNzaW5nKToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvQ29u
dGV4dDo6aGFuZGxlRmluaXNoZWROb2Rlcyk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb0NvbnRl
eHQ6OnJlZk5vZGUpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9Db250ZXh0OjpkZXJlZk5vZGUp
OgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9Db250ZXh0OjpkZXJlZlVuZmluaXNoZWRTb3VyY2VO
b2Rlcyk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb0NvbnRleHQ6Om1hcmtGb3JEZWxldGlvbik6
CisgICAgICAgIChXZWJDb3JlOjpBdWRpb0NvbnRleHQ6OmRlbGV0ZU1hcmtlZE5vZGVzKToKKyAg
ICAgICAgKiB3ZWJhdWRpby9BdWRpb0NvbnRleHQuaDogQWRkZWQuCisgICAgICAgIChXZWJDb3Jl
OjpBdWRpb0NvbnRleHQ6OmRvY3VtZW50KToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvQ29udGV4
dDo6ZGVzdGluYXRpb24pOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9Db250ZXh0OjpjdXJyZW50
VGltZSk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb0NvbnRleHQ6OnNhbXBsZVJhdGUpOgorICAg
ICAgICAoV2ViQ29yZTo6QXVkaW9Db250ZXh0OjpsaXN0ZW5lcik6CisgICAgICAgIChXZWJDb3Jl
OjpBdWRpb0NvbnRleHQ6OnRlbXBvcmFyeU1vbm9CdXMpOgorICAgICAgICAoV2ViQ29yZTo6QXVk
aW9Db250ZXh0Ojp0ZW1wb3JhcnlTdGVyZW9CdXMpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9D
b250ZXh0Ojpub2RlQ29ubmVjdGVkKToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvQ29udGV4dDo6
Y29ubmVjdGlvbkNvdW50KToKKyAgICAgICAgKiB3ZWJhdWRpby9BdWRpb0NvbnRleHQuaWRsOiBB
ZGRlZC4KKwogMjAxMC0wOC0zMCAgQmV0aCBEYWtpbiAgPGJkYWtpbkBhcHBsZS5jb20+CiAKICAg
ICAgICAgUmV2aWV3ZWQgYnkgRGFyaW4gQWRsZXIuCkluZGV4OiBXZWJDb3JlL3dlYmF1ZGlvL0F1
ZGlvQ29udGV4dC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS93ZWJhdWRpby9BdWRpb0NvbnRl
eHQuY3BwCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS93ZWJhdWRpby9BdWRpb0NvbnRleHQuY3Bw
CShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDI1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAx
MCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICog
My4gIE5laXRoZXIgdGhlIG5hbWUgb2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5v
ciB0aGUgbmFtZXMgb2YKKyAqICAgICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVu
ZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3
YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFT
IElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBE
SVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKwor
I2lmIEVOQUJMRShXRUJfQVVESU8pCisKKyNpbmNsdWRlICJBdWRpb0NvbnRleHQuaCIKKworI2lu
Y2x1ZGUgIkF1ZGlvQnVmZmVyLmgiCisjaW5jbHVkZSAiQXVkaW9CdWZmZXJTb3VyY2VOb2RlLmgi
CisjaW5jbHVkZSAiQXVkaW9DaGFubmVsTWVyZ2VyLmgiCisjaW5jbHVkZSAiQXVkaW9DaGFubmVs
U3BsaXR0ZXIuaCIKKyNpbmNsdWRlICJBdWRpb0dhaW5Ob2RlLmgiCisjaW5jbHVkZSAiQXVkaW9M
aXN0ZW5lci5oIgorI2luY2x1ZGUgIkF1ZGlvUGFubmVyTm9kZS5oIgorI2luY2x1ZGUgIkNhY2hl
ZEF1ZGlvLmgiCisjaW5jbHVkZSAiQ29udm9sdmVyTm9kZS5oIgorI2luY2x1ZGUgIkRlbGF5Tm9k
ZS5oIgorI2luY2x1ZGUgIkRvY3VtZW50LmgiCisjaW5jbHVkZSAiSFJURlBhbm5lci5oIgorI2lu
Y2x1ZGUgIkhUTUxOYW1lcy5oIgorI2luY2x1ZGUgIkhpZ2hQYXNzMkZpbHRlck5vZGUuaCIKKyNp
bmNsdWRlICJKYXZhU2NyaXB0QXVkaW9Ob2RlLmgiCisjaW5jbHVkZSAiTG93UGFzczJGaWx0ZXJO
b2RlLmgiCisjaW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIKKyNpbmNsdWRlICJSZWFsdGltZUFu
YWx5c2VyTm9kZS5oIgorCisjaW5jbHVkZSA8d3RmL093blB0ci5oPgorI2luY2x1ZGUgPHd0Zi9Q
YXNzT3duUHRyLmg+CisjaW5jbHVkZSA8d3RmL1JlZkNvdW50ZWQuaD4KKworbmFtZXNwYWNlIFdl
YkNvcmUgeworCitQYXNzUmVmUHRyPEF1ZGlvQ29udGV4dD4gQXVkaW9Db250ZXh0OjpjcmVhdGUo
RG9jdW1lbnQqIGRvY3VtZW50KQoreworICAgIHJldHVybiBhZG9wdFJlZihuZXcgQXVkaW9Db250
ZXh0KGRvY3VtZW50KSk7Cit9CisKK0F1ZGlvQ29udGV4dDo6QXVkaW9Db250ZXh0KERvY3VtZW50
KiBkb2N1bWVudCkKKyAgICA6IEFjdGl2ZURPTU9iamVjdChkb2N1bWVudCwgdGhpcykKKyAgICAs
IG1fZGVzdGluYXRpb25Ob2RlKDApCisgICAgLCBtX2Nvbm5lY3Rpb25Db3VudCgwKQorICAgICwg
bV9kb2N1bWVudChkb2N1bWVudCkKK3sKKyAgICBtX2Rlc3RpbmF0aW9uTm9kZSA9IEF1ZGlvRGVz
dGluYXRpb25Ob2RlOjpjcmVhdGUodGhpcyk7CisgICAgbV9saXN0ZW5lciA9IEF1ZGlvTGlzdGVu
ZXI6OmNyZWF0ZSgpOworICAgIG1fdGVtcG9yYXJ5TW9ub0J1cyA9IG5ldyBBdWRpb0J1cygxLCBB
dWRpb05vZGU6OkZyYW1lU2l6ZSk7CisgICAgbV90ZW1wb3JhcnlTdGVyZW9CdXMgPSBuZXcgQXVk
aW9CdXMoMiwgQXVkaW9Ob2RlOjpGcmFtZVNpemUpOworCisgICAgSFJURlBhbm5lcjo6aW5pdGlh
bGl6ZUtlcm5lbHMoc2FtcGxlUmF0ZSgpKTsKK30KKworQXVkaW9Db250ZXh0Ojp+QXVkaW9Db250
ZXh0KCkKK3sKKyAgICBtX2Rlc3RpbmF0aW9uTm9kZS0+dW5pbml0aWFsaXplKCk7CisKKyAgICAv
LyBXaGVuIHRoZSBwYWdlIGlzIHVubG9hZGVkLCBzb21lIHNvdXJjZXMgbWF5IG5vdCBoYXZlIGZp
bmlzaGVkIHBsYXlpbmcgeWV0LiAgU2h1dCB0aGVtIGRvd24uCisgICAgZGVyZWZVbmZpbmlzaGVk
U291cmNlTm9kZXMoKTsKK30KKwordm9pZCBBdWRpb0NvbnRleHQ6OmxhenlJbml0aWFsaXplKCkK
K3sKKyAgICBpZiAoIW1fZGVzdGluYXRpb25Ob2RlLT5pc0luaXRpYWxpemVkKCkpCisgICAgICAg
IG1fZGVzdGluYXRpb25Ob2RlLT5pbml0aWFsaXplKCk7Cit9CisKK3ZvaWQgQXVkaW9Db250ZXh0
Ojp1bmluaXRpYWxpemUoKQoreworICAgIGlmIChtX2Rlc3RpbmF0aW9uTm9kZS0+aXNJbml0aWFs
aXplZCgpKQorICAgICAgICBtX2Rlc3RpbmF0aW9uTm9kZS0+dW5pbml0aWFsaXplKCk7CisKKyAg
ICAvLyBCZWNhdXNlIHRoZSBBdWRpb0J1ZmZlcnMgYXJlIGdhcmJhZ2UgY29sbGVjdGVkLCB3ZSBj
YW4ndCBkZWxldGUgdGhlbSBoZXJlLgorICAgIC8vIEluc3RlYWQsIGF0IGxlYXN0IHJlbGVhc2Ug
dGhlIHBvdGVudGlhbGx5IGxhcmdlIGFtb3VudCBvZiBhbGxvY2F0ZWQgbWVtb3J5IGZvciB0aGUg
YXVkaW8gZGF0YS4KKyAgICAvLyBOb3RlIHRoYXQgd2UgZG8gdGhpcyAqYWZ0ZXIqIHRoZSBjb250
ZXh0IGlzIHVuaW5pdGlhbGl6ZWQgYW5kIHN0b3BzIHByb2Nlc3NpbmcgYXVkaW8uCisgICAgZm9y
ICh1bnNpZ25lZCBpID0gMDsgaSA8IG1fYWxsb2NhdGVkQnVmZmVycy5zaXplKCk7ICsraSkKKyAg
ICAgICAgbV9hbGxvY2F0ZWRCdWZmZXJzW2ldLT5yZWxlYXNlTWVtb3J5KCk7CisKKyAgICBtX2Fs
bG9jYXRlZEJ1ZmZlcnMuY2xlYXIoKTsKK30KKwordm9pZCBBdWRpb0NvbnRleHQ6OnN0b3AoKQor
eworICAgIHVuaW5pdGlhbGl6ZSgpOworfQorCitib29sIEF1ZGlvQ29udGV4dDo6aXNJbml0aWFs
aXplZCgpCit7CisgICAgcmV0dXJuIG1fZGVzdGluYXRpb25Ob2RlLT5pc0luaXRpYWxpemVkKCk7
Cit9CisKK3ZvaWQgQXVkaW9Db250ZXh0OjpyZWZCdWZmZXIoUGFzc1JlZlB0cjxBdWRpb0J1ZmZl
cj4gYnVmZmVyKQoreworICAgIG1fYWxsb2NhdGVkQnVmZmVycy5hcHBlbmQoYnVmZmVyKTsKK30K
KworUGFzc1JlZlB0cjxBdWRpb0J1ZmZlcj4gQXVkaW9Db250ZXh0OjpjcmVhdGVCdWZmZXIodW5z
aWduZWQgbnVtYmVyT2ZDaGFubmVscywgc2l6ZV90IG51bWJlck9mRnJhbWVzLCBkb3VibGUgc2Ft
cGxlUmF0ZSkKK3sKKyAgICByZXR1cm4gQXVkaW9CdWZmZXI6OmNyZWF0ZShudW1iZXJPZkNoYW5u
ZWxzLCBudW1iZXJPZkZyYW1lcywgc2FtcGxlUmF0ZSk7Cit9CisKK1Bhc3NSZWZQdHI8QXVkaW9C
dWZmZXJTb3VyY2VOb2RlPiBBdWRpb0NvbnRleHQ6OmNyZWF0ZUJ1ZmZlclNvdXJjZSgpCit7Cisg
ICAgbGF6eUluaXRpYWxpemUoKTsKKyAgICBSZWZQdHI8QXVkaW9CdWZmZXJTb3VyY2VOb2RlPiBu
b2RlID0gQXVkaW9CdWZmZXJTb3VyY2VOb2RlOjpjcmVhdGUodGhpcywgbV9kZXN0aW5hdGlvbk5v
ZGUtPnNhbXBsZVJhdGUoKSk7CisKKyAgICByZWZOb2RlKG5vZGUuZ2V0KCkpOyAvLyBjb250ZXh0
IGtlZXBzIHJlZmVyZW5jZSB1bnRpbCAibm90ZSIgaGFzIGZpbmlzaGVkIHBsYXlpbmcKKyAgICBy
ZXR1cm4gbm9kZTsKK30KKworUGFzc1JlZlB0cjxKYXZhU2NyaXB0QXVkaW9Ob2RlPiBBdWRpb0Nv
bnRleHQ6OmNyZWF0ZUphdmFTY3JpcHROb2RlKHNpemVfdCBidWZmZXJTaXplKQoreworICAgIGxh
enlJbml0aWFsaXplKCk7CisgICAgUmVmUHRyPEphdmFTY3JpcHRBdWRpb05vZGU+IG5vZGUgPSBK
YXZhU2NyaXB0QXVkaW9Ob2RlOjpjcmVhdGUodGhpcywgbV9kZXN0aW5hdGlvbk5vZGUtPnNhbXBs
ZVJhdGUoKSwgYnVmZmVyU2l6ZSk7CisKKyAgICByZWZOb2RlKG5vZGUuZ2V0KCkpOyAvLyBjb250
ZXh0IGtlZXBzIHJlZmVyZW5jZSB1bnRpbCB3ZSBzdG9wIG1ha2luZyBqYXZhc2NyaXB0IHJlbmRl
cmluZyBjYWxsYmFja3MKKyAgICByZXR1cm4gbm9kZTsKK30KKworUGFzc1JlZlB0cjxMb3dQYXNz
MkZpbHRlck5vZGU+IEF1ZGlvQ29udGV4dDo6Y3JlYXRlTG93UGFzczJGaWx0ZXIoKQoreworICAg
IGxhenlJbml0aWFsaXplKCk7CisgICAgcmV0dXJuIExvd1Bhc3MyRmlsdGVyTm9kZTo6Y3JlYXRl
KHRoaXMsIG1fZGVzdGluYXRpb25Ob2RlLT5zYW1wbGVSYXRlKCkpOworfQorCitQYXNzUmVmUHRy
PEhpZ2hQYXNzMkZpbHRlck5vZGU+IEF1ZGlvQ29udGV4dDo6Y3JlYXRlSGlnaFBhc3MyRmlsdGVy
KCkKK3sKKyAgICBsYXp5SW5pdGlhbGl6ZSgpOworICAgIHJldHVybiBIaWdoUGFzczJGaWx0ZXJO
b2RlOjpjcmVhdGUodGhpcywgbV9kZXN0aW5hdGlvbk5vZGUtPnNhbXBsZVJhdGUoKSk7Cit9CisK
K1Bhc3NSZWZQdHI8QXVkaW9QYW5uZXJOb2RlPiBBdWRpb0NvbnRleHQ6OmNyZWF0ZVBhbm5lcigp
Cit7CisgICAgbGF6eUluaXRpYWxpemUoKTsKKyAgICByZXR1cm4gQXVkaW9QYW5uZXJOb2RlOjpj
cmVhdGUodGhpcywgbV9kZXN0aW5hdGlvbk5vZGUtPnNhbXBsZVJhdGUoKSk7Cit9CisKK1Bhc3NS
ZWZQdHI8Q29udm9sdmVyTm9kZT4gQXVkaW9Db250ZXh0OjpjcmVhdGVDb252b2x2ZXIoKQorewor
ICAgIGxhenlJbml0aWFsaXplKCk7CisgICAgcmV0dXJuIENvbnZvbHZlck5vZGU6OmNyZWF0ZSh0
aGlzLCBtX2Rlc3RpbmF0aW9uTm9kZS0+c2FtcGxlUmF0ZSgpKTsKK30KKworUGFzc1JlZlB0cjxS
ZWFsdGltZUFuYWx5c2VyTm9kZT4gQXVkaW9Db250ZXh0OjpjcmVhdGVBbmFseXNlcigpCit7Cisg
ICAgbGF6eUluaXRpYWxpemUoKTsKKyAgICByZXR1cm4gUmVhbHRpbWVBbmFseXNlck5vZGU6OmNy
ZWF0ZSh0aGlzLCBtX2Rlc3RpbmF0aW9uTm9kZS0+c2FtcGxlUmF0ZSgpKTsKK30KKworUGFzc1Jl
ZlB0cjxBdWRpb0dhaW5Ob2RlPiBBdWRpb0NvbnRleHQ6OmNyZWF0ZUdhaW5Ob2RlKCkKK3sKKyAg
ICBsYXp5SW5pdGlhbGl6ZSgpOworICAgIHJldHVybiBBdWRpb0dhaW5Ob2RlOjpjcmVhdGUodGhp
cywgbV9kZXN0aW5hdGlvbk5vZGUtPnNhbXBsZVJhdGUoKSk7Cit9CisKK1Bhc3NSZWZQdHI8RGVs
YXlOb2RlPiBBdWRpb0NvbnRleHQ6OmNyZWF0ZURlbGF5Tm9kZSgpCit7CisgICAgbGF6eUluaXRp
YWxpemUoKTsKKyAgICByZXR1cm4gRGVsYXlOb2RlOjpjcmVhdGUodGhpcywgbV9kZXN0aW5hdGlv
bk5vZGUtPnNhbXBsZVJhdGUoKSk7Cit9CisKK1Bhc3NSZWZQdHI8QXVkaW9DaGFubmVsU3BsaXR0
ZXI+IEF1ZGlvQ29udGV4dDo6Y3JlYXRlQ2hhbm5lbFNwbGl0dGVyKCkKK3sKKyAgICBsYXp5SW5p
dGlhbGl6ZSgpOworICAgIHJldHVybiBBdWRpb0NoYW5uZWxTcGxpdHRlcjo6Y3JlYXRlKHRoaXMs
IG1fZGVzdGluYXRpb25Ob2RlLT5zYW1wbGVSYXRlKCkpOworfQorCitQYXNzUmVmUHRyPEF1ZGlv
Q2hhbm5lbE1lcmdlcj4gQXVkaW9Db250ZXh0OjpjcmVhdGVDaGFubmVsTWVyZ2VyKCkKK3sKKyAg
ICBsYXp5SW5pdGlhbGl6ZSgpOworICAgIHJldHVybiBBdWRpb0NoYW5uZWxNZXJnZXI6OmNyZWF0
ZSh0aGlzLCBtX2Rlc3RpbmF0aW9uTm9kZS0+c2FtcGxlUmF0ZSgpKTsKK30KKwordm9pZCBBdWRp
b0NvbnRleHQ6Om5vdGlmeU5vZGVGaW5pc2hlZFByb2Nlc3NpbmcoQXVkaW9Ob2RlKiBub2RlKQor
eworICAgIG1fZmluaXNoZWROb2Rlcy5hcHBlbmQobm9kZSk7Cit9CisKK3ZvaWQgQXVkaW9Db250
ZXh0OjpoYW5kbGVGaW5pc2hlZE5vZGVzKCkKK3sKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBp
IDwgbV9maW5pc2hlZE5vZGVzLnNpemUoKTsgaSsrKQorICAgICAgICBkZXJlZk5vZGUobV9maW5p
c2hlZE5vZGVzW2ldKTsKKworICAgIG1fZmluaXNoZWROb2Rlcy5jbGVhcigpOworfQorCit2b2lk
IEF1ZGlvQ29udGV4dDo6cmVmTm9kZShBdWRpb05vZGUqIG5vZGUpCit7CisgICAgbm9kZS0+cmVm
KEF1ZGlvTm9kZTo6UmVmVHlwZUNvbm5lY3Rpb24pOworICAgIG1fcmVmZXJlbmNlZE5vZGVzLmFw
cGVuZChub2RlKTsKK30KKwordm9pZCBBdWRpb0NvbnRleHQ6OmRlcmVmTm9kZShBdWRpb05vZGUq
IG5vZGUpCit7CisgICAgbm9kZS0+ZGVyZWYoQXVkaW9Ob2RlOjpSZWZUeXBlQ29ubmVjdGlvbik7
CisKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbV9yZWZlcmVuY2VkTm9kZXMuc2l6ZSgp
OyArK2kpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbV9yZWZlcmVuY2VkTm9kZXNbaV0pIHsKKyAg
ICAgICAgICAgIG1fcmVmZXJlbmNlZE5vZGVzLnJlbW92ZShpKTsKKyAgICAgICAgICAgIGJyZWFr
OworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEF1ZGlvQ29udGV4dDo6ZGVyZWZVbmZpbmlz
aGVkU291cmNlTm9kZXMoKQoreworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBtX3JlZmVy
ZW5jZWROb2Rlcy5zaXplKCk7ICsraSkKKyAgICAgICAgbV9yZWZlcmVuY2VkTm9kZXNbaV0tPmRl
cmVmKEF1ZGlvTm9kZTo6UmVmVHlwZUNvbm5lY3Rpb24pOworCisgICAgbV9yZWZlcmVuY2VkTm9k
ZXMuY2xlYXIoKTsKK30KKwordm9pZCBBdWRpb0NvbnRleHQ6Om1hcmtGb3JEZWxldGlvbihBdWRp
b05vZGUqIG5vZGUpCit7CisgICAgbV9ub2Rlc1RvRGVsZXRlLmFwcGVuZChub2RlKTsKK30KKwor
dm9pZCBBdWRpb0NvbnRleHQ6OmRlbGV0ZU1hcmtlZE5vZGVzKCkKK3sKKyAgICBmb3IgKHVuc2ln
bmVkIGkgPSAwOyBpIDwgbV9ub2Rlc1RvRGVsZXRlLnNpemUoKTsgKytpKQorICAgICAgICBkZWxl
dGUgbV9ub2Rlc1RvRGVsZXRlW2ldOworCisgICAgbV9ub2Rlc1RvRGVsZXRlLmNsZWFyKCk7Cit9
CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIEVOQUJMRShXRUJfQVVESU8p
CkluZGV4OiBXZWJDb3JlL3dlYmF1ZGlvL0F1ZGlvQ29udGV4dC5oCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdl
YkNvcmUvd2ViYXVkaW8vQXVkaW9Db250ZXh0LmgJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL3dl
YmF1ZGlvL0F1ZGlvQ29udGV4dC5oCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDE1NCBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAq
ICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICogMy4gIE5laXRoZXIgdGhlIG5hbWUgb2YgQXBwbGUgQ29tcHV0
ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMgb2YKKyAqICAgICBpdHMgY29udHJpYnV0
b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisg
KiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBw
ZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5E
IElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisg
KiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBP
UiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBB
TlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNp
Zm5kZWYgQXVkaW9Db250ZXh0X2gKKyNkZWZpbmUgQXVkaW9Db250ZXh0X2gKKworI2luY2x1ZGUg
IkFjdGl2ZURPTU9iamVjdC5oIgorI2luY2x1ZGUgIkF1ZGlvQnVzLmgiCisjaW5jbHVkZSAiQXVk
aW9EZXN0aW5hdGlvbk5vZGUuaCIKKyNpbmNsdWRlIDx3dGYvT3duUHRyLmg+CisjaW5jbHVkZSA8
d3RmL1Bhc3NSZWZQdHIuaD4KKyNpbmNsdWRlIDx3dGYvUmVmQ291bnRlZC5oPgorI2luY2x1ZGUg
PHd0Zi9SZWZQdHIuaD4KKyNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+CisjaW5jbHVkZSA8d3RmL3Rl
eHQvQXRvbWljU3RyaW5nSGFzaC5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIEF1
ZGlvQnVmZmVyOworY2xhc3MgQXVkaW9CdWZmZXJTb3VyY2VOb2RlOworY2xhc3MgQXVkaW9DaGFu
bmVsTWVyZ2VyOworY2xhc3MgQXVkaW9DaGFubmVsU3BsaXR0ZXI7CitjbGFzcyBBdWRpb0dhaW5O
b2RlOworY2xhc3MgQXVkaW9QYW5uZXJOb2RlOworY2xhc3MgQXVkaW9MaXN0ZW5lcjsKK2NsYXNz
IENhY2hlZEF1ZGlvOworY2xhc3MgRGVsYXlOb2RlOworY2xhc3MgRG9jdW1lbnQ7CitjbGFzcyBM
b3dQYXNzMkZpbHRlck5vZGU7CitjbGFzcyBIaWdoUGFzczJGaWx0ZXJOb2RlOworY2xhc3MgQ29u
dm9sdmVyTm9kZTsKK2NsYXNzIFJlYWx0aW1lQW5hbHlzZXJOb2RlOworY2xhc3MgSmF2YVNjcmlw
dEF1ZGlvTm9kZTsKKworY2xhc3MgQXVkaW9Db250ZXh0IDogcHVibGljIEFjdGl2ZURPTU9iamVj
dCwgcHVibGljIFJlZkNvdW50ZWQ8QXVkaW9Db250ZXh0PiB7CitwdWJsaWM6CisgICAgc3RhdGlj
IFBhc3NSZWZQdHI8QXVkaW9Db250ZXh0PiBjcmVhdGUoRG9jdW1lbnQqIGRvY3VtZW50KTsKKwor
ICAgIHZpcnR1YWwgfkF1ZGlvQ29udGV4dCgpOworCisgICAgYm9vbCBpc0luaXRpYWxpemVkKCk7
CisKKyAgICAvLyBEb2N1bWVudCBub3RpZmljYXRpb24KKyAgICB2aXJ0dWFsIHZvaWQgc3RvcCgp
OworCisgICAgRG9jdW1lbnQqIGRvY3VtZW50KCkgeyByZXR1cm4gbV9kb2N1bWVudC5nZXQoKTsg
fQorCisgICAgQXVkaW9EZXN0aW5hdGlvbk5vZGUqIGRlc3RpbmF0aW9uKCkgeyByZXR1cm4gbV9k
ZXN0aW5hdGlvbk5vZGUuZ2V0KCk7IH0KKyAgICBmbG9hdCBjdXJyZW50VGltZSgpIHsgcmV0dXJu
IChmbG9hdCltX2Rlc3RpbmF0aW9uTm9kZS0+Y3VycmVudFRpbWUoKTsgfQorICAgIGZsb2F0IHNh
bXBsZVJhdGUoKSB7IHJldHVybiAoZmxvYXQpbV9kZXN0aW5hdGlvbk5vZGUtPnNhbXBsZVJhdGUo
KTsgfQorCisgICAgUGFzc1JlZlB0cjxBdWRpb0J1ZmZlcj4gY3JlYXRlQnVmZmVyKHVuc2lnbmVk
IG51bWJlck9mQ2hhbm5lbHMsIHNpemVfdCBudW1iZXJPZkZyYW1lcywgZG91YmxlIHNhbXBsZVJh
dGUpOworCisgICAgLy8gS2VlcCB0cmFjayBvZiB0aGlzIGJ1ZmZlciBzbyB3ZSBjYW4gcmVsZWFz
ZSBtZW1vcnkgYWZ0ZXIgdGhlIGNvbnRleHQgaXMgc2h1dCBkb3duLi4uCisgICAgdm9pZCByZWZC
dWZmZXIoUGFzc1JlZlB0cjxBdWRpb0J1ZmZlcj4gYnVmZmVyKTsKKworICAgIEF1ZGlvTGlzdGVu
ZXIqIGxpc3RlbmVyKCkgeyByZXR1cm4gbV9saXN0ZW5lci5nZXQoKTsgfQorCisgICAgUGFzc1Jl
ZlB0cjxBdWRpb0J1ZmZlclNvdXJjZU5vZGU+IGNyZWF0ZUJ1ZmZlclNvdXJjZSgpOworICAgIFBh
c3NSZWZQdHI8QXVkaW9HYWluTm9kZT4gY3JlYXRlR2Fpbk5vZGUoKTsKKyAgICBQYXNzUmVmUHRy
PERlbGF5Tm9kZT4gY3JlYXRlRGVsYXlOb2RlKCk7CisgICAgUGFzc1JlZlB0cjxMb3dQYXNzMkZp
bHRlck5vZGU+IGNyZWF0ZUxvd1Bhc3MyRmlsdGVyKCk7CisgICAgUGFzc1JlZlB0cjxIaWdoUGFz
czJGaWx0ZXJOb2RlPiBjcmVhdGVIaWdoUGFzczJGaWx0ZXIoKTsKKyAgICBQYXNzUmVmUHRyPEF1
ZGlvUGFubmVyTm9kZT4gY3JlYXRlUGFubmVyKCk7CisgICAgUGFzc1JlZlB0cjxDb252b2x2ZXJO
b2RlPiBjcmVhdGVDb252b2x2ZXIoKTsKKyAgICBQYXNzUmVmUHRyPFJlYWx0aW1lQW5hbHlzZXJO
b2RlPiBjcmVhdGVBbmFseXNlcigpOworICAgIFBhc3NSZWZQdHI8SmF2YVNjcmlwdEF1ZGlvTm9k
ZT4gY3JlYXRlSmF2YVNjcmlwdE5vZGUoc2l6ZV90IGJ1ZmZlclNpemUpOworCisgICAgUGFzc1Jl
ZlB0cjxBdWRpb0NoYW5uZWxTcGxpdHRlcj4gY3JlYXRlQ2hhbm5lbFNwbGl0dGVyKCk7CisgICAg
UGFzc1JlZlB0cjxBdWRpb0NoYW5uZWxNZXJnZXI+IGNyZWF0ZUNoYW5uZWxNZXJnZXIoKTsKKwor
ICAgIEF1ZGlvQnVzKiB0ZW1wb3JhcnlNb25vQnVzKCkgeyByZXR1cm4gbV90ZW1wb3JhcnlNb25v
QnVzLmdldCgpOyB9CisgICAgQXVkaW9CdXMqIHRlbXBvcmFyeVN0ZXJlb0J1cygpIHsgcmV0dXJu
IG1fdGVtcG9yYXJ5U3RlcmVvQnVzLmdldCgpOyB9CisKKyAgICAvLyBXaGVuIGEgc291cmNlIG5v
ZGUgaGFzIG5vIG1vcmUgcHJvY2Vzc2luZyB0byBkbyAoaGFzIGZpbmlzaGVkIHBsYXlpbmcpLCB0
aGVuIGl0IHRlbGxzIHRoZSBjb250ZXh0IHRvIGRlcmVmZXJlbmNlIGl0LgorICAgIHZvaWQgbm90
aWZ5Tm9kZUZpbmlzaGVkUHJvY2Vzc2luZyhBdWRpb05vZGUqIG5vZGUpOworICAgIHZvaWQgaGFu
ZGxlRmluaXNoZWROb2RlcygpOworCisgICAgLy8gV2UgcmVhcCBhbGwgbWFya2VkIG5vZGVzIGF0
IHRoZSBlbmQgb2YgZWFjaCByZWFsdGltZSByZW5kZXIgY3ljbGUgaW4gZGVsZXRlTWFya2VkTm9k
ZXMoKS4KKyAgICB2b2lkIG1hcmtGb3JEZWxldGlvbihBdWRpb05vZGUqIG5vZGUpOworICAgIHZv
aWQgZGVsZXRlTWFya2VkTm9kZXMoKTsKKworICAgIC8vIEdldHMgY2FsbGVkIGV2ZXJ5dGltZSBh
biBBdWRpb05vZGUgaXMgY29ubmVjdGVkLgorICAgIHZvaWQgbm9kZUNvbm5lY3RlZChBdWRpb05v
ZGUqIC8qc291cmNlKi8sIEF1ZGlvTm9kZSogLypkZXN0aW5hdGlvbiovLCB1bnNpZ25lZCAvKm91
dHB1dEluZGV4Ki8sIHVuc2lnbmVkIC8qaW5wdXRJbmRleCovKQorICAgIHsKKyAgICAgICAgLy8g
Rm9yIG5vdywgd2UganVzdCBjb3VudCB0aGUgY29ubmVjdGlvbnMgYXMgdGhleSdyZSBtYWRlLgor
ICAgICAgICBtX2Nvbm5lY3Rpb25Db3VudCsrOworICAgIH0KKworICAgIHVuc2lnbmVkIGNvbm5l
Y3Rpb25Db3VudCgpIGNvbnN0IHsgcmV0dXJuIG1fY29ubmVjdGlvbkNvdW50OyB9CisKK3ByaXZh
dGU6CisgICAgQXVkaW9Db250ZXh0KERvY3VtZW50KiBkb2N1bWVudCk7CisgICAgdm9pZCBsYXp5
SW5pdGlhbGl6ZSgpOworICAgIHZvaWQgdW5pbml0aWFsaXplKCk7CisKKyAgICAvLyBUaGUgY29u
dGV4dCBpdHNlbGYga2VlcHMgYSByZWZlcmVuY2UgdG8gYWxsIHNvdXJjZSBub2Rlcy4gIFRoZSBz
b3VyY2Ugbm9kZXMsIHRoZW4gcmVmZXJlbmNlIGFsbCBub2RlcyB0aGV5J3JlIGNvbm5lY3RlZCB0
bywgYW5kIHNvIG9uLi4uCisgICAgdm9pZCByZWZOb2RlKEF1ZGlvTm9kZSogbm9kZSk7CisgICAg
dm9pZCBkZXJlZk5vZGUoQXVkaW9Ob2RlKiBub2RlKTsKKyAgICB2b2lkIGRlcmVmVW5maW5pc2hl
ZFNvdXJjZU5vZGVzKCk7CisKKworICAgIFJlZlB0cjxBdWRpb0Rlc3RpbmF0aW9uTm9kZT4gbV9k
ZXN0aW5hdGlvbk5vZGU7CisgICAgUmVmUHRyPEF1ZGlvTGlzdGVuZXI+IG1fbGlzdGVuZXI7CisK
KyAgICBWZWN0b3I8UmVmUHRyPEF1ZGlvQnVmZmVyPiA+IG1fYWxsb2NhdGVkQnVmZmVyczsKKyAg
ICBWZWN0b3I8QXVkaW9Ob2RlKj4gbV9maW5pc2hlZE5vZGVzOworCisgICAgLy8gV2UgZG9uJ3Qg
dXNlIFJlZlB0cjxBdWRpb05vZGU+IGhlcmUgYmVjYXVzZSBBdWRpb05vZGUgaGFzIGEgbW9yZSBj
b21wbGV4IHJlZigpIC8gZGVyZWYoKSBpbXBsZW1lbnRhdGlvbgorICAgIC8vIHdpdGggYW4gb3B0
aW9uYWwgYXJndW1lbnQgZm9yIHJlZlR5cGUuICBXZSBuZWVkIHRvIHVzZSB0aGUgc3BlY2lhbCBy
ZWZUeXBlOiBSZWZUeXBlQ29ubmVjdGlvbgorICAgIFZlY3RvcjxBdWRpb05vZGUqPiBtX3JlZmVy
ZW5jZWROb2RlczsKKworICAgIC8vIEFjY3VtdWxhdGUgbm9kZXMgd2hpY2ggbmVlZCB0byBiZSBk
ZWxldGVkIGF0IHRoZSBlbmQgb2YgYSByZW5kZXIgY3ljbGUgKGluIHJlYWx0aW1lIHRocmVhZCkg
aGVyZS4KKyAgICBWZWN0b3I8QXVkaW9Ob2RlKj4gbV9ub2Rlc1RvRGVsZXRlOworCisgICAgVmVj
dG9yPFJlZlB0cjxDYWNoZWRBdWRpbz4gPiBtX2NhY2hlZEF1ZGlvUmVmZXJlbmNlczsKKworICAg
IE93blB0cjxBdWRpb0J1cz4gbV90ZW1wb3JhcnlNb25vQnVzOworICAgIE93blB0cjxBdWRpb0J1
cz4gbV90ZW1wb3JhcnlTdGVyZW9CdXM7CisKKyAgICB1bnNpZ25lZCBtX2Nvbm5lY3Rpb25Db3Vu
dDsKKworICAgIC8vIEZJWE1FOiBjaGVjayBpZiB3ZSByZWFsbHkgbmVlZCB0byBob2xkIG9uIHRv
IGRvY3VtZW50IC0gd2UgbWF5IG5lZWQgdG8sIHNvIGJlIGNhcmVmdWwhCisgICAgUmVmUHRyPERv
Y3VtZW50PiBtX2RvY3VtZW50OworfTsKKworfSAvLyBXZWJDb3JlCisKKyNlbmRpZiAvLyBBdWRp
b0NvbnRleHRfaApJbmRleDogV2ViQ29yZS93ZWJhdWRpby9BdWRpb0NvbnRleHQuaWRsCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFdlYkNvcmUvd2ViYXVkaW8vQXVkaW9Db250ZXh0LmlkbAkocmV2aXNpb24gMCkK
KysrIFdlYkNvcmUvd2ViYXVkaW8vQXVkaW9Db250ZXh0LmlkbAkocmV2aXNpb24gMCkKQEAgLTAs
MCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gIE5laXRoZXIgdGhlIG5hbWUg
b2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMgb2YKKyAqICAg
ICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9k
dWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMg
cHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0Us
IERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLgorICovCisKK21vZHVsZSB3ZWJhdWRpbyB7CisgICAgaW50ZXJmYWNlIFsKKyAgICAgICAg
Q29uZGl0aW9uYWw9V0VCX0FVRElPLAorICAgICAgICBDYW5CZUNvbnN0cnVjdGVkLAorICAgICAg
ICBDdXN0b21Db25zdHJ1Y3RGdW5jdGlvbiwKKyAgICAgICAgVjhDdXN0b21Db25zdHJ1Y3Rvcgor
ICAgIF0gQXVkaW9Db250ZXh0IHsKKyAgICAgICAgLy8gQWxsIHJlbmRlcmVkIGF1ZGlvIHVsdGlt
YXRlbHkgY29ubmVjdHMgdG8gZGVzdGluYXRpb24sIHdoaWNoIHJlcHJlc2VudHMgdGhlIGF1ZGlv
IGhhcmR3YXJlLgorICAgICAgICByZWFkb25seSBhdHRyaWJ1dGUgQXVkaW9EZXN0aW5hdGlvbk5v
ZGUgZGVzdGluYXRpb247CisKKyAgICAgICAgLy8gQWxsIHNjaGVkdWxlZCB0aW1lcyBhcmUgcmVs
YXRpdmUgdG8gdGhpcyB0aW1lIGluIHNlY29uZHMuCisgICAgICAgIHJlYWRvbmx5IGF0dHJpYnV0
ZSBmbG9hdCBjdXJyZW50VGltZTsKKworICAgICAgICAvLyBBbGwgQXVkaW9Ob2RlcyBpbiB0aGUg
Y29udGV4dCBydW4gYXQgdGhpcyBzYW1wbGUtcmF0ZSAoaW4gc2FtcGxlLWZyYW1lcyBwZXIgc2Vj
b25kKS4KKyAgICAgICAgcmVhZG9ubHkgYXR0cmlidXRlIGZsb2F0IHNhbXBsZVJhdGU7CisKKyAg
ICAgICAgLy8gQWxsIHBhbm5pbmcgaXMgcmVsYXRpdmUgdG8gdGhpcyBsaXN0ZW5lci4KKyAgICAg
ICAgcmVhZG9ubHkgYXR0cmlidXRlIEF1ZGlvTGlzdGVuZXIgbGlzdGVuZXI7CisKKyAgICAgICAg
QXVkaW9CdWZmZXIgY3JlYXRlQnVmZmVyKGluIHVuc2lnbmVkIGxvbmcgbnVtYmVyT2ZDaGFubmVs
cywgaW4gdW5zaWduZWQgbG9uZyBudW1iZXJPZkZyYW1lcywgaW4gZmxvYXQgc2FtcGxlUmF0ZSk7
CisKKyAgICAgICAgLy8gU291cmNlCisgICAgICAgIEF1ZGlvQnVmZmVyU291cmNlTm9kZSBjcmVh
dGVCdWZmZXJTb3VyY2UoKTsKKworICAgICAgICAvLyBQcm9jZXNzaW5nIG5vZGVzCisgICAgICAg
IEF1ZGlvR2Fpbk5vZGUgY3JlYXRlR2Fpbk5vZGUoKTsKKyAgICAgICAgRGVsYXlOb2RlIGNyZWF0
ZURlbGF5Tm9kZSgpOworICAgICAgICBMb3dQYXNzMkZpbHRlck5vZGUgY3JlYXRlTG93UGFzczJG
aWx0ZXIoKTsKKyAgICAgICAgSGlnaFBhc3MyRmlsdGVyTm9kZSBjcmVhdGVIaWdoUGFzczJGaWx0
ZXIoKTsKKyAgICAgICAgQXVkaW9QYW5uZXJOb2RlIGNyZWF0ZVBhbm5lcigpOworICAgICAgICBD
b252b2x2ZXJOb2RlIGNyZWF0ZUNvbnZvbHZlcigpOworICAgICAgICBSZWFsdGltZUFuYWx5c2Vy
Tm9kZSBjcmVhdGVBbmFseXNlcigpOworICAgICAgICBKYXZhU2NyaXB0QXVkaW9Ob2RlIGNyZWF0
ZUphdmFTY3JpcHROb2RlKGluIHVuc2lnbmVkIGxvbmcgYnVmZmVyU2l6ZSk7CisKKyAgICAgICAg
Ly8gQ2hhbm5lbCBzcGxpdHRpbmcgYW5kIG1lcmdpbmcKKyAgICAgICAgQXVkaW9DaGFubmVsU3Bs
aXR0ZXIgY3JlYXRlQ2hhbm5lbFNwbGl0dGVyKCk7CisgICAgICAgIEF1ZGlvQ2hhbm5lbE1lcmdl
ciBjcmVhdGVDaGFubmVsTWVyZ2VyKCk7CisgICAgfTsKK30K
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>66969</attachid>
            <date>2010-09-08 17:18:58 -0700</date>
            <delta_ts>2010-09-10 18:28:27 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-44890-20100908171856.patch</filename>
            <type>text/plain</type>
            <size>20742</size>
            <attacher name="Chris Rogers">crogers</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2NzA0MCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNTMgQEAKKzIwMTAtMDktMDggIENocmlzIFJvZ2VycyAgPGNyb2dlcnNAZ29vZ2xl
LmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBB
ZGQgQXVkaW9Db250ZXh0IGZpbGVzCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3No
b3dfYnVnLmNnaT9pZD00NDg5MAorCisgICAgICAgIE5vIG5ldyB0ZXN0cyBzaW5jZSBhdWRpbyBB
UEkgaXMgbm90IHlldCBpbXBsZW1lbnRlZC4KKworICAgICAgICAqIHdlYmF1ZGlvL0F1ZGlvQ29u
dGV4dC5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9Db250ZXh0OjpjcmVhdGVB
dWRpb1JlcXVlc3QpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9Db250ZXh0OjpjcmVhdGUpOgor
ICAgICAgICAoV2ViQ29yZTo6QXVkaW9Db250ZXh0OjpBdWRpb0NvbnRleHQpOgorICAgICAgICAo
V2ViQ29yZTo6QXVkaW9Db250ZXh0Ojp+QXVkaW9Db250ZXh0KToKKyAgICAgICAgKFdlYkNvcmU6
OkF1ZGlvQ29udGV4dDo6bGF6eUluaXRpYWxpemUpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9D
b250ZXh0Ojp1bmluaXRpYWxpemUpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9Db250ZXh0Ojpz
dG9wKToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvQ29udGV4dDo6aXNJbml0aWFsaXplZCk6Cisg
ICAgICAgIChXZWJDb3JlOjpBdWRpb0NvbnRleHQ6OnJlZkJ1ZmZlcik6CisgICAgICAgIChXZWJD
b3JlOjpBdWRpb0NvbnRleHQ6OmNyZWF0ZUJ1ZmZlcik6CisgICAgICAgIChXZWJDb3JlOjpBdWRp
b0NvbnRleHQ6OmNyZWF0ZUJ1ZmZlclNvdXJjZSk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb0Nv
bnRleHQ6OmNyZWF0ZUphdmFTY3JpcHROb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvQ29u
dGV4dDo6Y3JlYXRlTG93UGFzczJGaWx0ZXIpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9Db250
ZXh0OjpjcmVhdGVIaWdoUGFzczJGaWx0ZXIpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9Db250
ZXh0OjpjcmVhdGVQYW5uZXIpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9Db250ZXh0OjpjcmVh
dGVDb252b2x2ZXIpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9Db250ZXh0OjpjcmVhdGVBbmFs
eXNlcik6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb0NvbnRleHQ6OmNyZWF0ZUdhaW5Ob2RlKToK
KyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvQ29udGV4dDo6Y3JlYXRlRGVsYXlOb2RlKToKKyAgICAg
ICAgKFdlYkNvcmU6OkF1ZGlvQ29udGV4dDo6Y3JlYXRlQ2hhbm5lbFNwbGl0dGVyKToKKyAgICAg
ICAgKFdlYkNvcmU6OkF1ZGlvQ29udGV4dDo6Y3JlYXRlQ2hhbm5lbE1lcmdlcik6CisgICAgICAg
IChXZWJDb3JlOjpBdWRpb0NvbnRleHQ6Om5vdGlmeU5vZGVGaW5pc2hlZFByb2Nlc3NpbmcpOgor
ICAgICAgICAoV2ViQ29yZTo6QXVkaW9Db250ZXh0OjpoYW5kbGVGaW5pc2hlZE5vZGVzKToKKyAg
ICAgICAgKFdlYkNvcmU6OkF1ZGlvQ29udGV4dDo6cmVmTm9kZSk6CisgICAgICAgIChXZWJDb3Jl
OjpBdWRpb0NvbnRleHQ6OmRlcmVmTm9kZSk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb0NvbnRl
eHQ6OmRlcmVmVW5maW5pc2hlZFNvdXJjZU5vZGVzKToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlv
Q29udGV4dDo6bWFya0ZvckRlbGV0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvQ29udGV4
dDo6ZGVsZXRlTWFya2VkTm9kZXMpOgorICAgICAgICAqIHdlYmF1ZGlvL0F1ZGlvQ29udGV4dC5o
OiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvQ29udGV4dDo6ZG9jdW1lbnQpOgorICAg
ICAgICAoV2ViQ29yZTo6QXVkaW9Db250ZXh0OjpkZXN0aW5hdGlvbik6CisgICAgICAgIChXZWJD
b3JlOjpBdWRpb0NvbnRleHQ6OmN1cnJlbnRUaW1lKToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlv
Q29udGV4dDo6c2FtcGxlUmF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb0NvbnRleHQ6Omxp
c3RlbmVyKToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvQ29udGV4dDo6dGVtcG9yYXJ5TW9ub0J1
cyk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb0NvbnRleHQ6OnRlbXBvcmFyeVN0ZXJlb0J1cyk6
CisgICAgICAgIChXZWJDb3JlOjpBdWRpb0NvbnRleHQ6OmluY3JlbWVudENvbm5lY3Rpb25Db3Vu
dCk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb0NvbnRleHQ6OmNvbm5lY3Rpb25Db3VudCk6Cisg
ICAgICAgICogd2ViYXVkaW8vQXVkaW9Db250ZXh0LmlkbDogQWRkZWQuCisKIDIwMTAtMDktMDgg
IEphbWVzIFJvYmluc29uICA8amFtZXNyQGNocm9taXVtLm9yZz4KIAogICAgICAgICBSZXZpZXdl
ZCBieSBLZW5uZXRoIFJ1c3NlbGwuCkluZGV4OiBXZWJDb3JlL3dlYmF1ZGlvL0F1ZGlvQ29udGV4
dC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS93ZWJhdWRpby9BdWRpb0NvbnRleHQuY3BwCShy
ZXZpc2lvbiAwKQorKysgV2ViQ29yZS93ZWJhdWRpby9BdWRpb0NvbnRleHQuY3BwCShyZXZpc2lv
biAwKQpAQCAtMCwwICsxLDI2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gIE5laXRo
ZXIgdGhlIG5hbWUgb2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFt
ZXMgb2YKKyAqICAgICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3Ig
cHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhv
dXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQg
QU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVE
LiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICog
TE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
IE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2lmIEVOQUJM
RShXRUJfQVVESU8pCisKKyNpbmNsdWRlICJBdWRpb0NvbnRleHQuaCIKKworI2luY2x1ZGUgIkF1
ZGlvQnVmZmVyLmgiCisjaW5jbHVkZSAiQXVkaW9CdWZmZXJTb3VyY2VOb2RlLmgiCisjaW5jbHVk
ZSAiQXVkaW9DaGFubmVsTWVyZ2VyLmgiCisjaW5jbHVkZSAiQXVkaW9DaGFubmVsU3BsaXR0ZXIu
aCIKKyNpbmNsdWRlICJBdWRpb0dhaW5Ob2RlLmgiCisjaW5jbHVkZSAiQXVkaW9MaXN0ZW5lci5o
IgorI2luY2x1ZGUgIkF1ZGlvUGFubmVyTm9kZS5oIgorI2luY2x1ZGUgIkNhY2hlZEF1ZGlvLmgi
CisjaW5jbHVkZSAiQ29udm9sdmVyTm9kZS5oIgorI2luY2x1ZGUgIkRlbGF5Tm9kZS5oIgorI2lu
Y2x1ZGUgIkRvY3VtZW50LmgiCisjaW5jbHVkZSAiSFJURlBhbm5lci5oIgorI2luY2x1ZGUgIkhU
TUxOYW1lcy5oIgorI2luY2x1ZGUgIkhpZ2hQYXNzMkZpbHRlck5vZGUuaCIKKyNpbmNsdWRlICJK
YXZhU2NyaXB0QXVkaW9Ob2RlLmgiCisjaW5jbHVkZSAiTG93UGFzczJGaWx0ZXJOb2RlLmgiCisj
aW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIKKyNpbmNsdWRlICJSZWFsdGltZUFuYWx5c2VyTm9k
ZS5oIgorCisjaW5jbHVkZSA8d3RmL093blB0ci5oPgorI2luY2x1ZGUgPHd0Zi9QYXNzT3duUHRy
Lmg+CisjaW5jbHVkZSA8d3RmL1JlZkNvdW50ZWQuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgewor
CitQYXNzUmVmUHRyPENhY2hlZEF1ZGlvPiBBdWRpb0NvbnRleHQ6OmNyZWF0ZUF1ZGlvUmVxdWVz
dChjb25zdCBTdHJpbmcgJnVybCwgYm9vbCBtaXhUb01vbm8pCit7CisgICAgbGF6eUluaXRpYWxp
emUoKTsKKworICAgIC8vIENvbnZlcnQgcmVsYXRpdmUgVVJMIHRvIGFic29sdXRlCisgICAgS1VS
TCBjb21wbGV0ZWRVUkwgPSBkb2N1bWVudCgpLT5jb21wbGV0ZVVSTCh1cmwpOworICAgIFN0cmlu
ZyBjb21wbGV0ZWRVUkxTdHJpbmcgPSBjb21wbGV0ZWRVUkwuc3RyaW5nKCk7CisKKyAgICBSZWZQ
dHI8Q2FjaGVkQXVkaW8+IGNhY2hlZEF1ZGlvID0gQ2FjaGVkQXVkaW86OmNyZWF0ZShjb21wbGV0
ZWRVUkxTdHJpbmcsIHRoaXMsIGRvY3VtZW50KCksIHNhbXBsZVJhdGUoKSwgbWl4VG9Nb25vKTsK
KyAgICBDYWNoZWRBdWRpbyogYyA9IGNhY2hlZEF1ZGlvLmdldCgpOworCisgICAgbV9jYWNoZWRB
dWRpb1JlZmVyZW5jZXMuYXBwZW5kKGMpOworCisgICAgcmV0dXJuIGNhY2hlZEF1ZGlvOworfQor
CitQYXNzUmVmUHRyPEF1ZGlvQ29udGV4dD4gQXVkaW9Db250ZXh0OjpjcmVhdGUoRG9jdW1lbnQq
IGRvY3VtZW50KQoreworICAgIHJldHVybiBhZG9wdFJlZihuZXcgQXVkaW9Db250ZXh0KGRvY3Vt
ZW50KSk7Cit9CisKK0F1ZGlvQ29udGV4dDo6QXVkaW9Db250ZXh0KERvY3VtZW50KiBkb2N1bWVu
dCkKKyAgICA6IEFjdGl2ZURPTU9iamVjdChkb2N1bWVudCwgdGhpcykKKyAgICAsIG1fZGVzdGlu
YXRpb25Ob2RlKDApCisgICAgLCBtX2Nvbm5lY3Rpb25Db3VudCgwKQorICAgICwgbV9kb2N1bWVu
dChkb2N1bWVudCkKK3sKKyAgICBtX2Rlc3RpbmF0aW9uTm9kZSA9IEF1ZGlvRGVzdGluYXRpb25O
b2RlOjpjcmVhdGUodGhpcyk7CisgICAgbV9saXN0ZW5lciA9IEF1ZGlvTGlzdGVuZXI6OmNyZWF0
ZSgpOworICAgIG1fdGVtcG9yYXJ5TW9ub0J1cyA9IGFkb3B0UHRyKG5ldyBBdWRpb0J1cygxLCBB
dWRpb05vZGU6OlByb2Nlc3NpbmdTaXplSW5GcmFtZXMpKTsKKyAgICBtX3RlbXBvcmFyeVN0ZXJl
b0J1cyA9IGFkb3B0UHRyKG5ldyBBdWRpb0J1cygyLCBBdWRpb05vZGU6OlByb2Nlc3NpbmdTaXpl
SW5GcmFtZXMpKTsKKworICAgIEhSVEZQYW5uZXI6OmluaXRpYWxpemVLZXJuZWxzKHNhbXBsZVJh
dGUoKSk7Cit9CisKK0F1ZGlvQ29udGV4dDo6fkF1ZGlvQ29udGV4dCgpCit7CisgICAgbV9kZXN0
aW5hdGlvbk5vZGUtPnVuaW5pdGlhbGl6ZSgpOworCisgICAgLy8gV2hlbiB0aGUgcGFnZSBpcyB1
bmxvYWRlZCwgc29tZSBzb3VyY2VzIG1heSBub3QgaGF2ZSBmaW5pc2hlZCBwbGF5aW5nIHlldC4g
IFNodXQgdGhlbSBkb3duLgorICAgIGRlcmVmVW5maW5pc2hlZFNvdXJjZU5vZGVzKCk7Cit9CisK
K3ZvaWQgQXVkaW9Db250ZXh0OjpsYXp5SW5pdGlhbGl6ZSgpCit7CisgICAgaWYgKCFtX2Rlc3Rp
bmF0aW9uTm9kZS0+aXNJbml0aWFsaXplZCgpKQorICAgICAgICBtX2Rlc3RpbmF0aW9uTm9kZS0+
aW5pdGlhbGl6ZSgpOworfQorCit2b2lkIEF1ZGlvQ29udGV4dDo6dW5pbml0aWFsaXplKCkKK3sK
KyAgICBpZiAobV9kZXN0aW5hdGlvbk5vZGUtPmlzSW5pdGlhbGl6ZWQoKSkKKyAgICAgICAgbV9k
ZXN0aW5hdGlvbk5vZGUtPnVuaW5pdGlhbGl6ZSgpOworCisgICAgLy8gQmVjYXVzZSB0aGUgQXVk
aW9CdWZmZXJzIGFyZSBnYXJiYWdlIGNvbGxlY3RlZCwgd2UgY2FuJ3QgZGVsZXRlIHRoZW0gaGVy
ZS4KKyAgICAvLyBJbnN0ZWFkLCBhdCBsZWFzdCByZWxlYXNlIHRoZSBwb3RlbnRpYWxseSBsYXJn
ZSBhbW91bnQgb2YgYWxsb2NhdGVkIG1lbW9yeSBmb3IgdGhlIGF1ZGlvIGRhdGEuCisgICAgLy8g
Tm90ZSB0aGF0IHdlIGRvIHRoaXMgKmFmdGVyKiB0aGUgY29udGV4dCBpcyB1bmluaXRpYWxpemVk
IGFuZCBzdG9wcyBwcm9jZXNzaW5nIGF1ZGlvLgorICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkg
PCBtX2FsbG9jYXRlZEJ1ZmZlcnMuc2l6ZSgpOyArK2kpCisgICAgICAgIG1fYWxsb2NhdGVkQnVm
ZmVyc1tpXS0+cmVsZWFzZU1lbW9yeSgpOworCisgICAgbV9hbGxvY2F0ZWRCdWZmZXJzLmNsZWFy
KCk7Cit9CisKK3ZvaWQgQXVkaW9Db250ZXh0OjpzdG9wKCkKK3sKKyAgICB1bmluaXRpYWxpemUo
KTsKK30KKworYm9vbCBBdWRpb0NvbnRleHQ6OmlzSW5pdGlhbGl6ZWQoKSBjb25zdAoreworICAg
IHJldHVybiBtX2Rlc3RpbmF0aW9uTm9kZS0+aXNJbml0aWFsaXplZCgpOworfQorCit2b2lkIEF1
ZGlvQ29udGV4dDo6cmVmQnVmZmVyKFBhc3NSZWZQdHI8QXVkaW9CdWZmZXI+IGJ1ZmZlcikKK3sK
KyAgICBtX2FsbG9jYXRlZEJ1ZmZlcnMuYXBwZW5kKGJ1ZmZlcik7Cit9CisKK1Bhc3NSZWZQdHI8
QXVkaW9CdWZmZXI+IEF1ZGlvQ29udGV4dDo6Y3JlYXRlQnVmZmVyKHVuc2lnbmVkIG51bWJlck9m
Q2hhbm5lbHMsIHNpemVfdCBudW1iZXJPZkZyYW1lcywgZG91YmxlIHNhbXBsZVJhdGUpCit7Cisg
ICAgcmV0dXJuIEF1ZGlvQnVmZmVyOjpjcmVhdGUobnVtYmVyT2ZDaGFubmVscywgbnVtYmVyT2ZG
cmFtZXMsIHNhbXBsZVJhdGUpOworfQorCitQYXNzUmVmUHRyPEF1ZGlvQnVmZmVyU291cmNlTm9k
ZT4gQXVkaW9Db250ZXh0OjpjcmVhdGVCdWZmZXJTb3VyY2UoKQoreworICAgIGxhenlJbml0aWFs
aXplKCk7CisgICAgUmVmUHRyPEF1ZGlvQnVmZmVyU291cmNlTm9kZT4gbm9kZSA9IEF1ZGlvQnVm
ZmVyU291cmNlTm9kZTo6Y3JlYXRlKHRoaXMsIG1fZGVzdGluYXRpb25Ob2RlLT5zYW1wbGVSYXRl
KCkpOworCisgICAgcmVmTm9kZShub2RlLmdldCgpKTsgLy8gY29udGV4dCBrZWVwcyByZWZlcmVu
Y2UgdW50aWwgIm5vdGUiIGhhcyBmaW5pc2hlZCBwbGF5aW5nCisgICAgcmV0dXJuIG5vZGU7Cit9
CisKK1Bhc3NSZWZQdHI8SmF2YVNjcmlwdEF1ZGlvTm9kZT4gQXVkaW9Db250ZXh0OjpjcmVhdGVK
YXZhU2NyaXB0Tm9kZShzaXplX3QgYnVmZmVyU2l6ZSkKK3sKKyAgICBsYXp5SW5pdGlhbGl6ZSgp
OworICAgIFJlZlB0cjxKYXZhU2NyaXB0QXVkaW9Ob2RlPiBub2RlID0gSmF2YVNjcmlwdEF1ZGlv
Tm9kZTo6Y3JlYXRlKHRoaXMsIG1fZGVzdGluYXRpb25Ob2RlLT5zYW1wbGVSYXRlKCksIGJ1ZmZl
clNpemUpOworCisgICAgcmVmTm9kZShub2RlLmdldCgpKTsgLy8gY29udGV4dCBrZWVwcyByZWZl
cmVuY2UgdW50aWwgd2Ugc3RvcCBtYWtpbmcgamF2YXNjcmlwdCByZW5kZXJpbmcgY2FsbGJhY2tz
CisgICAgcmV0dXJuIG5vZGU7Cit9CisKK1Bhc3NSZWZQdHI8TG93UGFzczJGaWx0ZXJOb2RlPiBB
dWRpb0NvbnRleHQ6OmNyZWF0ZUxvd1Bhc3MyRmlsdGVyKCkKK3sKKyAgICBsYXp5SW5pdGlhbGl6
ZSgpOworICAgIHJldHVybiBMb3dQYXNzMkZpbHRlck5vZGU6OmNyZWF0ZSh0aGlzLCBtX2Rlc3Rp
bmF0aW9uTm9kZS0+c2FtcGxlUmF0ZSgpKTsKK30KKworUGFzc1JlZlB0cjxIaWdoUGFzczJGaWx0
ZXJOb2RlPiBBdWRpb0NvbnRleHQ6OmNyZWF0ZUhpZ2hQYXNzMkZpbHRlcigpCit7CisgICAgbGF6
eUluaXRpYWxpemUoKTsKKyAgICByZXR1cm4gSGlnaFBhc3MyRmlsdGVyTm9kZTo6Y3JlYXRlKHRo
aXMsIG1fZGVzdGluYXRpb25Ob2RlLT5zYW1wbGVSYXRlKCkpOworfQorCitQYXNzUmVmUHRyPEF1
ZGlvUGFubmVyTm9kZT4gQXVkaW9Db250ZXh0OjpjcmVhdGVQYW5uZXIoKQoreworICAgIGxhenlJ
bml0aWFsaXplKCk7CisgICAgcmV0dXJuIEF1ZGlvUGFubmVyTm9kZTo6Y3JlYXRlKHRoaXMsIG1f
ZGVzdGluYXRpb25Ob2RlLT5zYW1wbGVSYXRlKCkpOworfQorCitQYXNzUmVmUHRyPENvbnZvbHZl
ck5vZGU+IEF1ZGlvQ29udGV4dDo6Y3JlYXRlQ29udm9sdmVyKCkKK3sKKyAgICBsYXp5SW5pdGlh
bGl6ZSgpOworICAgIHJldHVybiBDb252b2x2ZXJOb2RlOjpjcmVhdGUodGhpcywgbV9kZXN0aW5h
dGlvbk5vZGUtPnNhbXBsZVJhdGUoKSk7Cit9CisKK1Bhc3NSZWZQdHI8UmVhbHRpbWVBbmFseXNl
ck5vZGU+IEF1ZGlvQ29udGV4dDo6Y3JlYXRlQW5hbHlzZXIoKQoreworICAgIGxhenlJbml0aWFs
aXplKCk7CisgICAgcmV0dXJuIFJlYWx0aW1lQW5hbHlzZXJOb2RlOjpjcmVhdGUodGhpcywgbV9k
ZXN0aW5hdGlvbk5vZGUtPnNhbXBsZVJhdGUoKSk7Cit9CisKK1Bhc3NSZWZQdHI8QXVkaW9HYWlu
Tm9kZT4gQXVkaW9Db250ZXh0OjpjcmVhdGVHYWluTm9kZSgpCit7CisgICAgbGF6eUluaXRpYWxp
emUoKTsKKyAgICByZXR1cm4gQXVkaW9HYWluTm9kZTo6Y3JlYXRlKHRoaXMsIG1fZGVzdGluYXRp
b25Ob2RlLT5zYW1wbGVSYXRlKCkpOworfQorCitQYXNzUmVmUHRyPERlbGF5Tm9kZT4gQXVkaW9D
b250ZXh0OjpjcmVhdGVEZWxheU5vZGUoKQoreworICAgIGxhenlJbml0aWFsaXplKCk7CisgICAg
cmV0dXJuIERlbGF5Tm9kZTo6Y3JlYXRlKHRoaXMsIG1fZGVzdGluYXRpb25Ob2RlLT5zYW1wbGVS
YXRlKCkpOworfQorCitQYXNzUmVmUHRyPEF1ZGlvQ2hhbm5lbFNwbGl0dGVyPiBBdWRpb0NvbnRl
eHQ6OmNyZWF0ZUNoYW5uZWxTcGxpdHRlcigpCit7CisgICAgbGF6eUluaXRpYWxpemUoKTsKKyAg
ICByZXR1cm4gQXVkaW9DaGFubmVsU3BsaXR0ZXI6OmNyZWF0ZSh0aGlzLCBtX2Rlc3RpbmF0aW9u
Tm9kZS0+c2FtcGxlUmF0ZSgpKTsKK30KKworUGFzc1JlZlB0cjxBdWRpb0NoYW5uZWxNZXJnZXI+
IEF1ZGlvQ29udGV4dDo6Y3JlYXRlQ2hhbm5lbE1lcmdlcigpCit7CisgICAgbGF6eUluaXRpYWxp
emUoKTsKKyAgICByZXR1cm4gQXVkaW9DaGFubmVsTWVyZ2VyOjpjcmVhdGUodGhpcywgbV9kZXN0
aW5hdGlvbk5vZGUtPnNhbXBsZVJhdGUoKSk7Cit9CisKK3ZvaWQgQXVkaW9Db250ZXh0Ojpub3Rp
ZnlOb2RlRmluaXNoZWRQcm9jZXNzaW5nKEF1ZGlvTm9kZSogbm9kZSkKK3sKKyAgICBtX2Zpbmlz
aGVkTm9kZXMuYXBwZW5kKG5vZGUpOworfQorCit2b2lkIEF1ZGlvQ29udGV4dDo6aGFuZGxlRmlu
aXNoZWROb2RlcygpCit7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG1fZmluaXNoZWRO
b2Rlcy5zaXplKCk7IGkrKykKKyAgICAgICAgZGVyZWZOb2RlKG1fZmluaXNoZWROb2Rlc1tpXSk7
CisKKyAgICBtX2ZpbmlzaGVkTm9kZXMuY2xlYXIoKTsKK30KKwordm9pZCBBdWRpb0NvbnRleHQ6
OnJlZk5vZGUoQXVkaW9Ob2RlKiBub2RlKQoreworICAgIG5vZGUtPnJlZihBdWRpb05vZGU6OlJl
ZlR5cGVDb25uZWN0aW9uKTsKKyAgICBtX3JlZmVyZW5jZWROb2Rlcy5hcHBlbmQobm9kZSk7Cit9
CisKK3ZvaWQgQXVkaW9Db250ZXh0OjpkZXJlZk5vZGUoQXVkaW9Ob2RlKiBub2RlKQoreworICAg
IG5vZGUtPmRlcmVmKEF1ZGlvTm9kZTo6UmVmVHlwZUNvbm5lY3Rpb24pOworCisgICAgZm9yICh1
bnNpZ25lZCBpID0gMDsgaSA8IG1fcmVmZXJlbmNlZE5vZGVzLnNpemUoKTsgKytpKSB7CisgICAg
ICAgIGlmIChub2RlID09IG1fcmVmZXJlbmNlZE5vZGVzW2ldKSB7CisgICAgICAgICAgICBtX3Jl
ZmVyZW5jZWROb2Rlcy5yZW1vdmUoaSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQor
ICAgIH0KK30KKwordm9pZCBBdWRpb0NvbnRleHQ6OmRlcmVmVW5maW5pc2hlZFNvdXJjZU5vZGVz
KCkKK3sKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbV9yZWZlcmVuY2VkTm9kZXMuc2l6
ZSgpOyArK2kpCisgICAgICAgIG1fcmVmZXJlbmNlZE5vZGVzW2ldLT5kZXJlZihBdWRpb05vZGU6
OlJlZlR5cGVDb25uZWN0aW9uKTsKKworICAgIG1fcmVmZXJlbmNlZE5vZGVzLmNsZWFyKCk7Cit9
CisKK3ZvaWQgQXVkaW9Db250ZXh0OjptYXJrRm9yRGVsZXRpb24oQXVkaW9Ob2RlKiBub2RlKQor
eworICAgIG1fbm9kZXNUb0RlbGV0ZS5hcHBlbmQobm9kZSk7Cit9CisKK3ZvaWQgQXVkaW9Db250
ZXh0OjpkZWxldGVNYXJrZWROb2RlcygpCit7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8
IG1fbm9kZXNUb0RlbGV0ZS5zaXplKCk7ICsraSkKKyAgICAgICAgZGVsZXRlIG1fbm9kZXNUb0Rl
bGV0ZVtpXTsKKworICAgIG1fbm9kZXNUb0RlbGV0ZS5jbGVhcigpOworfQorCit9IC8vIG5hbWVz
cGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBFTkFCTEUoV0VCX0FVRElPKQpJbmRleDogV2ViQ29y
ZS93ZWJhdWRpby9BdWRpb0NvbnRleHQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3dlYmF1ZGlv
L0F1ZGlvQ29udGV4dC5oCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS93ZWJhdWRpby9BdWRpb0Nv
bnRleHQuaAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwxNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25z
IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KKyAqIDMuICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFwcGxlIENvbXB1dGVyLCBJbmMuICgiQXBw
bGUiKSBub3IgdGhlIG5hbWVzIG9mCisgKiAgICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNl
ZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhp
cyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAq
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVU
T1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFS
RQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
U1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIEF1ZGlvQ29u
dGV4dF9oCisjZGVmaW5lIEF1ZGlvQ29udGV4dF9oCisKKyNpbmNsdWRlICJBY3RpdmVET01PYmpl
Y3QuaCIKKyNpbmNsdWRlICJBdWRpb0J1cy5oIgorI2luY2x1ZGUgIkF1ZGlvRGVzdGluYXRpb25O
b2RlLmgiCisjaW5jbHVkZSA8d3RmL093blB0ci5oPgorI2luY2x1ZGUgPHd0Zi9QYXNzUmVmUHRy
Lmg+CisjaW5jbHVkZSA8d3RmL1JlZkNvdW50ZWQuaD4KKyNpbmNsdWRlIDx3dGYvUmVmUHRyLmg+
CisjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L0F0b21pY1N0cmlu
Z0hhc2guaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBBdWRpb0J1ZmZlcjsKK2Ns
YXNzIEF1ZGlvQnVmZmVyU291cmNlTm9kZTsKK2NsYXNzIEF1ZGlvQ2hhbm5lbE1lcmdlcjsKK2Ns
YXNzIEF1ZGlvQ2hhbm5lbFNwbGl0dGVyOworY2xhc3MgQXVkaW9HYWluTm9kZTsKK2NsYXNzIEF1
ZGlvUGFubmVyTm9kZTsKK2NsYXNzIEF1ZGlvTGlzdGVuZXI7CitjbGFzcyBDYWNoZWRBdWRpbzsK
K2NsYXNzIERlbGF5Tm9kZTsKK2NsYXNzIERvY3VtZW50OworY2xhc3MgTG93UGFzczJGaWx0ZXJO
b2RlOworY2xhc3MgSGlnaFBhc3MyRmlsdGVyTm9kZTsKK2NsYXNzIENvbnZvbHZlck5vZGU7Citj
bGFzcyBSZWFsdGltZUFuYWx5c2VyTm9kZTsKK2NsYXNzIEphdmFTY3JpcHRBdWRpb05vZGU7CisK
K2NsYXNzIEF1ZGlvQ29udGV4dCA6IHB1YmxpYyBBY3RpdmVET01PYmplY3QsIHB1YmxpYyBSZWZD
b3VudGVkPEF1ZGlvQ29udGV4dD4geworcHVibGljOgorICAgIHN0YXRpYyBQYXNzUmVmUHRyPEF1
ZGlvQ29udGV4dD4gY3JlYXRlKERvY3VtZW50Kik7CisKKyAgICB2aXJ0dWFsIH5BdWRpb0NvbnRl
eHQoKTsKKworICAgIGJvb2wgaXNJbml0aWFsaXplZCgpIGNvbnN0OworCisgICAgLy8gRG9jdW1l
bnQgbm90aWZpY2F0aW9uCisgICAgdmlydHVhbCB2b2lkIHN0b3AoKTsKKworICAgIERvY3VtZW50
KiBkb2N1bWVudCgpIHsgcmV0dXJuIG1fZG9jdW1lbnQuZ2V0KCk7IH0KKworICAgIEF1ZGlvRGVz
dGluYXRpb25Ob2RlKiBkZXN0aW5hdGlvbigpIHsgcmV0dXJuIG1fZGVzdGluYXRpb25Ob2RlLmdl
dCgpOyB9CisgICAgZG91YmxlIGN1cnJlbnRUaW1lKCkgeyByZXR1cm4gbV9kZXN0aW5hdGlvbk5v
ZGUtPmN1cnJlbnRUaW1lKCk7IH0KKyAgICBkb3VibGUgc2FtcGxlUmF0ZSgpIHsgcmV0dXJuIG1f
ZGVzdGluYXRpb25Ob2RlLT5zYW1wbGVSYXRlKCk7IH0KKworICAgIFBhc3NSZWZQdHI8QXVkaW9C
dWZmZXI+IGNyZWF0ZUJ1ZmZlcih1bnNpZ25lZCBudW1iZXJPZkNoYW5uZWxzLCBzaXplX3QgbnVt
YmVyT2ZGcmFtZXMsIGRvdWJsZSBzYW1wbGVSYXRlKTsKKworICAgIFBhc3NSZWZQdHI8Q2FjaGVk
QXVkaW8+IGNyZWF0ZUF1ZGlvUmVxdWVzdChjb25zdCBTdHJpbmcgJnVybCwgYm9vbCBtaXhUb01v
bm8pOworCisgICAgLy8gS2VlcCB0cmFjayBvZiB0aGlzIGJ1ZmZlciBzbyB3ZSBjYW4gcmVsZWFz
ZSBtZW1vcnkgYWZ0ZXIgdGhlIGNvbnRleHQgaXMgc2h1dCBkb3duLi4uCisgICAgdm9pZCByZWZC
dWZmZXIoUGFzc1JlZlB0cjxBdWRpb0J1ZmZlcj4gYnVmZmVyKTsKKworICAgIEF1ZGlvTGlzdGVu
ZXIqIGxpc3RlbmVyKCkgeyByZXR1cm4gbV9saXN0ZW5lci5nZXQoKTsgfQorCisgICAgUGFzc1Jl
ZlB0cjxBdWRpb0J1ZmZlclNvdXJjZU5vZGU+IGNyZWF0ZUJ1ZmZlclNvdXJjZSgpOworICAgIFBh
c3NSZWZQdHI8QXVkaW9HYWluTm9kZT4gY3JlYXRlR2Fpbk5vZGUoKTsKKyAgICBQYXNzUmVmUHRy
PERlbGF5Tm9kZT4gY3JlYXRlRGVsYXlOb2RlKCk7CisgICAgUGFzc1JlZlB0cjxMb3dQYXNzMkZp
bHRlck5vZGU+IGNyZWF0ZUxvd1Bhc3MyRmlsdGVyKCk7CisgICAgUGFzc1JlZlB0cjxIaWdoUGFz
czJGaWx0ZXJOb2RlPiBjcmVhdGVIaWdoUGFzczJGaWx0ZXIoKTsKKyAgICBQYXNzUmVmUHRyPEF1
ZGlvUGFubmVyTm9kZT4gY3JlYXRlUGFubmVyKCk7CisgICAgUGFzc1JlZlB0cjxDb252b2x2ZXJO
b2RlPiBjcmVhdGVDb252b2x2ZXIoKTsKKyAgICBQYXNzUmVmUHRyPFJlYWx0aW1lQW5hbHlzZXJO
b2RlPiBjcmVhdGVBbmFseXNlcigpOworICAgIFBhc3NSZWZQdHI8SmF2YVNjcmlwdEF1ZGlvTm9k
ZT4gY3JlYXRlSmF2YVNjcmlwdE5vZGUoc2l6ZV90IGJ1ZmZlclNpemUpOworCisgICAgUGFzc1Jl
ZlB0cjxBdWRpb0NoYW5uZWxTcGxpdHRlcj4gY3JlYXRlQ2hhbm5lbFNwbGl0dGVyKCk7CisgICAg
UGFzc1JlZlB0cjxBdWRpb0NoYW5uZWxNZXJnZXI+IGNyZWF0ZUNoYW5uZWxNZXJnZXIoKTsKKwor
ICAgIEF1ZGlvQnVzKiB0ZW1wb3JhcnlNb25vQnVzKCkgeyByZXR1cm4gbV90ZW1wb3JhcnlNb25v
QnVzLmdldCgpOyB9CisgICAgQXVkaW9CdXMqIHRlbXBvcmFyeVN0ZXJlb0J1cygpIHsgcmV0dXJu
IG1fdGVtcG9yYXJ5U3RlcmVvQnVzLmdldCgpOyB9CisKKyAgICAvLyBXaGVuIGEgc291cmNlIG5v
ZGUgaGFzIG5vIG1vcmUgcHJvY2Vzc2luZyB0byBkbyAoaGFzIGZpbmlzaGVkIHBsYXlpbmcpLCB0
aGVuIGl0IHRlbGxzIHRoZSBjb250ZXh0IHRvIGRlcmVmZXJlbmNlIGl0LgorICAgIHZvaWQgbm90
aWZ5Tm9kZUZpbmlzaGVkUHJvY2Vzc2luZyhBdWRpb05vZGUqKTsKKyAgICB2b2lkIGhhbmRsZUZp
bmlzaGVkTm9kZXMoKTsKKworICAgIC8vIFdlIHJlYXAgYWxsIG1hcmtlZCBub2RlcyBhdCB0aGUg
ZW5kIG9mIGVhY2ggcmVhbHRpbWUgcmVuZGVyIGN5Y2xlIGluIGRlbGV0ZU1hcmtlZE5vZGVzKCku
CisgICAgdm9pZCBtYXJrRm9yRGVsZXRpb24oQXVkaW9Ob2RlKik7CisgICAgdm9pZCBkZWxldGVN
YXJrZWROb2RlcygpOworCisgICAgLy8gS2VlcHMgdHJhY2sgb2YgdGhlIG51bWJlciBvZiBjb25u
ZWN0aW9ucyBtYWRlLgorICAgIHZvaWQgaW5jcmVtZW50Q29ubmVjdGlvbkNvdW50KCkKKyAgICB7
CisgICAgICAgIG1fY29ubmVjdGlvbkNvdW50Kys7CisgICAgfQorCisgICAgdW5zaWduZWQgY29u
bmVjdGlvbkNvdW50KCkgY29uc3QgeyByZXR1cm4gbV9jb25uZWN0aW9uQ291bnQ7IH0KKworcHJp
dmF0ZToKKyAgICBBdWRpb0NvbnRleHQoRG9jdW1lbnQqIGRvY3VtZW50KTsKKyAgICB2b2lkIGxh
enlJbml0aWFsaXplKCk7CisgICAgdm9pZCB1bmluaXRpYWxpemUoKTsKKworICAgIC8vIFRoZSBj
b250ZXh0IGl0c2VsZiBrZWVwcyBhIHJlZmVyZW5jZSB0byBhbGwgc291cmNlIG5vZGVzLiAgVGhl
IHNvdXJjZSBub2RlcywgdGhlbiByZWZlcmVuY2UgYWxsIG5vZGVzIHRoZXkncmUgY29ubmVjdGVk
IHRvLCBhbmQgc28gb24uLi4KKyAgICB2b2lkIHJlZk5vZGUoQXVkaW9Ob2RlKik7CisgICAgdm9p
ZCBkZXJlZk5vZGUoQXVkaW9Ob2RlKik7CisgICAgdm9pZCBkZXJlZlVuZmluaXNoZWRTb3VyY2VO
b2RlcygpOworCisgICAgUmVmUHRyPEF1ZGlvRGVzdGluYXRpb25Ob2RlPiBtX2Rlc3RpbmF0aW9u
Tm9kZTsKKyAgICBSZWZQdHI8QXVkaW9MaXN0ZW5lcj4gbV9saXN0ZW5lcjsKKworICAgIFZlY3Rv
cjxSZWZQdHI8QXVkaW9CdWZmZXI+ID4gbV9hbGxvY2F0ZWRCdWZmZXJzOworICAgIFZlY3RvcjxB
dWRpb05vZGUqPiBtX2ZpbmlzaGVkTm9kZXM7CisKKyAgICAvLyBXZSBkb24ndCB1c2UgUmVmUHRy
PEF1ZGlvTm9kZT4gaGVyZSBiZWNhdXNlIEF1ZGlvTm9kZSBoYXMgYSBtb3JlIGNvbXBsZXggcmVm
KCkgLyBkZXJlZigpIGltcGxlbWVudGF0aW9uCisgICAgLy8gd2l0aCBhbiBvcHRpb25hbCBhcmd1
bWVudCBmb3IgcmVmVHlwZS4gIFdlIG5lZWQgdG8gdXNlIHRoZSBzcGVjaWFsIHJlZlR5cGU6IFJl
ZlR5cGVDb25uZWN0aW9uCisgICAgVmVjdG9yPEF1ZGlvTm9kZSo+IG1fcmVmZXJlbmNlZE5vZGVz
OworCisgICAgLy8gQWNjdW11bGF0ZSBub2RlcyB3aGljaCBuZWVkIHRvIGJlIGRlbGV0ZWQgYXQg
dGhlIGVuZCBvZiBhIHJlbmRlciBjeWNsZSAoaW4gcmVhbHRpbWUgdGhyZWFkKSBoZXJlLgorICAg
IFZlY3RvcjxBdWRpb05vZGUqPiBtX25vZGVzVG9EZWxldGU7CisKKyAgICBWZWN0b3I8UmVmUHRy
PENhY2hlZEF1ZGlvPiA+IG1fY2FjaGVkQXVkaW9SZWZlcmVuY2VzOworCisgICAgT3duUHRyPEF1
ZGlvQnVzPiBtX3RlbXBvcmFyeU1vbm9CdXM7CisgICAgT3duUHRyPEF1ZGlvQnVzPiBtX3RlbXBv
cmFyeVN0ZXJlb0J1czsKKworICAgIHVuc2lnbmVkIG1fY29ubmVjdGlvbkNvdW50OworCisgICAg
Ly8gRklYTUU6IGNoZWNrIGlmIHdlIHJlYWxseSBuZWVkIHRvIGhvbGQgb24gdG8gZG9jdW1lbnQg
LSB3ZSBtYXkgbmVlZCB0bywgc28gYmUgY2FyZWZ1bCEKKyAgICBSZWZQdHI8RG9jdW1lbnQ+IG1f
ZG9jdW1lbnQ7Cit9OworCit9IC8vIFdlYkNvcmUKKworI2VuZGlmIC8vIEF1ZGlvQ29udGV4dF9o
CkluZGV4OiBXZWJDb3JlL3dlYmF1ZGlvL0F1ZGlvQ29udGV4dC5pZGwKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
V2ViQ29yZS93ZWJhdWRpby9BdWRpb0NvbnRleHQuaWRsCShyZXZpc2lvbiAwKQorKysgV2ViQ29y
ZS93ZWJhdWRpby9BdWRpb0NvbnRleHQuaWRsCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDcwIEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICog
MS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiAgTmVpdGhlciB0aGUgbmFtZSBvZiBBcHBsZSBD
b21wdXRlciwgSW5jLiAoIkFwcGxlIikgbm9yIHRoZSBuYW1lcyBvZgorICogICAgIGl0cyBjb250
cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2
ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0
dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBM
RSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJ
RUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQ
UExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1Ig
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAq
IE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8K
KworbW9kdWxlIHdlYmF1ZGlvIHsKKyAgICBpbnRlcmZhY2UgWworICAgICAgICBDb25kaXRpb25h
bD1XRUJfQVVESU8sCisgICAgICAgIENhbkJlQ29uc3RydWN0ZWQsCisgICAgICAgIEN1c3RvbUNv
bnN0cnVjdEZ1bmN0aW9uLAorICAgICAgICBWOEN1c3RvbUNvbnN0cnVjdG9yCisgICAgXSBBdWRp
b0NvbnRleHQgeworICAgICAgICAvLyBBbGwgcmVuZGVyZWQgYXVkaW8gdWx0aW1hdGVseSBjb25u
ZWN0cyB0byBkZXN0aW5hdGlvbiwgd2hpY2ggcmVwcmVzZW50cyB0aGUgYXVkaW8gaGFyZHdhcmUu
CisgICAgICAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBBdWRpb0Rlc3RpbmF0aW9uTm9kZSBkZXN0aW5h
dGlvbjsKKworICAgICAgICAvLyBBbGwgc2NoZWR1bGVkIHRpbWVzIGFyZSByZWxhdGl2ZSB0byB0
aGlzIHRpbWUgaW4gc2Vjb25kcy4KKyAgICAgICAgcmVhZG9ubHkgYXR0cmlidXRlIGZsb2F0IGN1
cnJlbnRUaW1lOworCisgICAgICAgIC8vIEFsbCBBdWRpb05vZGVzIGluIHRoZSBjb250ZXh0IHJ1
biBhdCB0aGlzIHNhbXBsZS1yYXRlIChpbiBzYW1wbGUtZnJhbWVzIHBlciBzZWNvbmQpLgorICAg
ICAgICByZWFkb25seSBhdHRyaWJ1dGUgZmxvYXQgc2FtcGxlUmF0ZTsKKworICAgICAgICAvLyBB
bGwgcGFubmluZyBpcyByZWxhdGl2ZSB0byB0aGlzIGxpc3RlbmVyLgorICAgICAgICByZWFkb25s
eSBhdHRyaWJ1dGUgQXVkaW9MaXN0ZW5lciBsaXN0ZW5lcjsKKworICAgICAgICBBdWRpb0J1ZmZl
ciBjcmVhdGVCdWZmZXIoaW4gdW5zaWduZWQgbG9uZyBudW1iZXJPZkNoYW5uZWxzLCBpbiB1bnNp
Z25lZCBsb25nIG51bWJlck9mRnJhbWVzLCBpbiBmbG9hdCBzYW1wbGVSYXRlKTsKKworICAgICAg
ICAvLyBTb3VyY2UKKyAgICAgICAgQXVkaW9CdWZmZXJTb3VyY2VOb2RlIGNyZWF0ZUJ1ZmZlclNv
dXJjZSgpOworCisgICAgICAgIC8vIFByb2Nlc3Npbmcgbm9kZXMKKyAgICAgICAgQXVkaW9HYWlu
Tm9kZSBjcmVhdGVHYWluTm9kZSgpOworICAgICAgICBEZWxheU5vZGUgY3JlYXRlRGVsYXlOb2Rl
KCk7CisgICAgICAgIExvd1Bhc3MyRmlsdGVyTm9kZSBjcmVhdGVMb3dQYXNzMkZpbHRlcigpOwor
ICAgICAgICBIaWdoUGFzczJGaWx0ZXJOb2RlIGNyZWF0ZUhpZ2hQYXNzMkZpbHRlcigpOworICAg
ICAgICBBdWRpb1Bhbm5lck5vZGUgY3JlYXRlUGFubmVyKCk7CisgICAgICAgIENvbnZvbHZlck5v
ZGUgY3JlYXRlQ29udm9sdmVyKCk7CisgICAgICAgIFJlYWx0aW1lQW5hbHlzZXJOb2RlIGNyZWF0
ZUFuYWx5c2VyKCk7CisgICAgICAgIEphdmFTY3JpcHRBdWRpb05vZGUgY3JlYXRlSmF2YVNjcmlw
dE5vZGUoaW4gdW5zaWduZWQgbG9uZyBidWZmZXJTaXplKTsKKworICAgICAgICAvLyBDaGFubmVs
IHNwbGl0dGluZyBhbmQgbWVyZ2luZworICAgICAgICBBdWRpb0NoYW5uZWxTcGxpdHRlciBjcmVh
dGVDaGFubmVsU3BsaXR0ZXIoKTsKKyAgICAgICAgQXVkaW9DaGFubmVsTWVyZ2VyIGNyZWF0ZUNo
YW5uZWxNZXJnZXIoKTsKKworICAgICAgICAvLyBGSVhNRTogVGVtcG9yYXJ5IC0gdG8gYmUgcmVw
bGFjZWQgd2l0aCBYSFIuCisgICAgICAgIENhY2hlZEF1ZGlvIGNyZWF0ZUF1ZGlvUmVxdWVzdChp
biBET01TdHJpbmcgdXJsLCBpbiBib29sZWFuIG1peFRvTW9ubyk7CisgICAgfTsKK30K
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>67279</attachid>
            <date>2010-09-10 18:28:31 -0700</date>
            <delta_ts>2010-09-15 15:44:04 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-44890-20100910182830.patch</filename>
            <type>text/plain</type>
            <size>20459</size>
            <attacher name="Chris Rogers">crogers</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2NzI2MykKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNTMgQEAKKzIwMTAtMDktMTAgIENocmlzIFJvZ2VycyAgPGNyb2dlcnNAZ29vZ2xl
LmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBB
ZGQgQXVkaW9Db250ZXh0IGZpbGVzCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3No
b3dfYnVnLmNnaT9pZD00NDg5MAorCisgICAgICAgIE5vIG5ldyB0ZXN0cyBzaW5jZSBhdWRpbyBB
UEkgaXMgbm90IHlldCBpbXBsZW1lbnRlZC4KKworICAgICAgICAqIHdlYmF1ZGlvL0F1ZGlvQ29u
dGV4dC5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9Db250ZXh0OjpjcmVhdGUp
OgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9Db250ZXh0OjpBdWRpb0NvbnRleHQpOgorICAgICAg
ICAoV2ViQ29yZTo6QXVkaW9Db250ZXh0Ojp+QXVkaW9Db250ZXh0KToKKyAgICAgICAgKFdlYkNv
cmU6OkF1ZGlvQ29udGV4dDo6bGF6eUluaXRpYWxpemUpOgorICAgICAgICAoV2ViQ29yZTo6QXVk
aW9Db250ZXh0Ojp1bmluaXRpYWxpemUpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9Db250ZXh0
Ojppc0luaXRpYWxpemVkKToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvQ29udGV4dDo6c3RvcCk6
CisgICAgICAgIChXZWJDb3JlOjpBdWRpb0NvbnRleHQ6OmRvY3VtZW50KToKKyAgICAgICAgKFdl
YkNvcmU6OkF1ZGlvQ29udGV4dDo6aGFzRG9jdW1lbnQpOgorICAgICAgICAoV2ViQ29yZTo6QXVk
aW9Db250ZXh0OjpyZWZCdWZmZXIpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9Db250ZXh0Ojpj
cmVhdGVCdWZmZXIpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9Db250ZXh0OjpjcmVhdGVCdWZm
ZXJTb3VyY2UpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9Db250ZXh0OjpjcmVhdGVKYXZhU2Ny
aXB0Tm9kZSk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb0NvbnRleHQ6OmNyZWF0ZUxvd1Bhc3My
RmlsdGVyKToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvQ29udGV4dDo6Y3JlYXRlSGlnaFBhc3My
RmlsdGVyKToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvQ29udGV4dDo6Y3JlYXRlUGFubmVyKToK
KyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvQ29udGV4dDo6Y3JlYXRlQ29udm9sdmVyKToKKyAgICAg
ICAgKFdlYkNvcmU6OkF1ZGlvQ29udGV4dDo6Y3JlYXRlQW5hbHlzZXIpOgorICAgICAgICAoV2Vi
Q29yZTo6QXVkaW9Db250ZXh0OjpjcmVhdGVHYWluTm9kZSk6CisgICAgICAgIChXZWJDb3JlOjpB
dWRpb0NvbnRleHQ6OmNyZWF0ZURlbGF5Tm9kZSk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb0Nv
bnRleHQ6OmNyZWF0ZUNoYW5uZWxTcGxpdHRlcik6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb0Nv
bnRleHQ6OmNyZWF0ZUNoYW5uZWxNZXJnZXIpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9Db250
ZXh0Ojpub3RpZnlOb2RlRmluaXNoZWRQcm9jZXNzaW5nKToKKyAgICAgICAgKFdlYkNvcmU6OkF1
ZGlvQ29udGV4dDo6aGFuZGxlRmluaXNoZWROb2Rlcyk6CisgICAgICAgIChXZWJDb3JlOjpBdWRp
b0NvbnRleHQ6OnJlZk5vZGUpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9Db250ZXh0OjpkZXJl
Zk5vZGUpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9Db250ZXh0OjpkZXJlZlVuZmluaXNoZWRT
b3VyY2VOb2Rlcyk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb0NvbnRleHQ6Om1hcmtGb3JEZWxl
dGlvbik6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb0NvbnRleHQ6OmRlbGV0ZU1hcmtlZE5vZGVz
KToKKyAgICAgICAgKiB3ZWJhdWRpby9BdWRpb0NvbnRleHQuaDogQWRkZWQuCisgICAgICAgIChX
ZWJDb3JlOjpBdWRpb0NvbnRleHQ6OmRlc3RpbmF0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OkF1
ZGlvQ29udGV4dDo6Y3VycmVudFRpbWUpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9Db250ZXh0
OjpzYW1wbGVSYXRlKToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvQ29udGV4dDo6bGlzdGVuZXIp
OgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9Db250ZXh0Ojp0ZW1wb3JhcnlNb25vQnVzKToKKyAg
ICAgICAgKFdlYkNvcmU6OkF1ZGlvQ29udGV4dDo6dGVtcG9yYXJ5U3RlcmVvQnVzKToKKyAgICAg
ICAgKFdlYkNvcmU6OkF1ZGlvQ29udGV4dDo6aW5jcmVtZW50Q29ubmVjdGlvbkNvdW50KToKKyAg
ICAgICAgKFdlYkNvcmU6OkF1ZGlvQ29udGV4dDo6Y29ubmVjdGlvbkNvdW50KToKKyAgICAgICAg
KiB3ZWJhdWRpby9BdWRpb0NvbnRleHQuaWRsOiBBZGRlZC4KKwogMjAxMC0wOS0xMCAgUGV0ZXIg
S2FzdGluZyAgPHBrYXN0aW5nQGdvb2dsZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgRGFy
aW4gQWRsZXIuCkluZGV4OiBXZWJDb3JlL3dlYmF1ZGlvL0F1ZGlvQ29udGV4dC5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViQ29yZS93ZWJhdWRpby9BdWRpb0NvbnRleHQuY3BwCShyZXZpc2lvbiAwKQor
KysgV2ViQ29yZS93ZWJhdWRpby9BdWRpb0NvbnRleHQuY3BwCShyZXZpc2lvbiAwKQpAQCAtMCww
ICsxLDI2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gIE5laXRoZXIgdGhlIG5hbWUg
b2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMgb2YKKyAqICAg
ICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9k
dWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMg
cHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0Us
IERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2lmIEVOQUJMRShXRUJfQVVESU8p
CisKKyNpbmNsdWRlICJBdWRpb0NvbnRleHQuaCIKKworI2luY2x1ZGUgIkF1ZGlvQnVmZmVyLmgi
CisjaW5jbHVkZSAiQXVkaW9CdWZmZXJTb3VyY2VOb2RlLmgiCisjaW5jbHVkZSAiQXVkaW9DaGFu
bmVsTWVyZ2VyLmgiCisjaW5jbHVkZSAiQXVkaW9DaGFubmVsU3BsaXR0ZXIuaCIKKyNpbmNsdWRl
ICJBdWRpb0dhaW5Ob2RlLmgiCisjaW5jbHVkZSAiQXVkaW9MaXN0ZW5lci5oIgorI2luY2x1ZGUg
IkF1ZGlvUGFubmVyTm9kZS5oIgorI2luY2x1ZGUgIkNhY2hlZEF1ZGlvLmgiCisjaW5jbHVkZSAi
Q29udm9sdmVyTm9kZS5oIgorI2luY2x1ZGUgIkRlbGF5Tm9kZS5oIgorI2luY2x1ZGUgIkRvY3Vt
ZW50LmgiCisjaW5jbHVkZSAiSFJURlBhbm5lci5oIgorI2luY2x1ZGUgIkhUTUxOYW1lcy5oIgor
I2luY2x1ZGUgIkhpZ2hQYXNzMkZpbHRlck5vZGUuaCIKKyNpbmNsdWRlICJKYXZhU2NyaXB0QXVk
aW9Ob2RlLmgiCisjaW5jbHVkZSAiTG93UGFzczJGaWx0ZXJOb2RlLmgiCisjaW5jbHVkZSAiUmVh
bHRpbWVBbmFseXNlck5vZGUuaCIKKworI2luY2x1ZGUgPHd0Zi9Pd25QdHIuaD4KKyNpbmNsdWRl
IDx3dGYvUGFzc093blB0ci5oPgorI2luY2x1ZGUgPHd0Zi9SZWZDb3VudGVkLmg+CisKK25hbWVz
cGFjZSBXZWJDb3JlIHsKKworUGFzc1JlZlB0cjxBdWRpb0NvbnRleHQ+IEF1ZGlvQ29udGV4dDo6
Y3JlYXRlKERvY3VtZW50KiBkb2N1bWVudCkKK3sKKyAgICByZXR1cm4gYWRvcHRSZWYobmV3IEF1
ZGlvQ29udGV4dChkb2N1bWVudCkpOworfQorCitBdWRpb0NvbnRleHQ6OkF1ZGlvQ29udGV4dChE
b2N1bWVudCogZG9jdW1lbnQpCisgICAgOiBBY3RpdmVET01PYmplY3QoZG9jdW1lbnQsIHRoaXMp
CisgICAgLCBtX2Rlc3RpbmF0aW9uTm9kZSgwKQorICAgICwgbV9jb25uZWN0aW9uQ291bnQoMCkK
KyAgICAsIG1fZG9jdW1lbnQoZG9jdW1lbnQpCit7CisgICAgbV9kZXN0aW5hdGlvbk5vZGUgPSBB
dWRpb0Rlc3RpbmF0aW9uTm9kZTo6Y3JlYXRlKHRoaXMpOworICAgIG1fbGlzdGVuZXIgPSBBdWRp
b0xpc3RlbmVyOjpjcmVhdGUoKTsKKyAgICBtX3RlbXBvcmFyeU1vbm9CdXMgPSBhZG9wdFB0cihu
ZXcgQXVkaW9CdXMoMSwgQXVkaW9Ob2RlOjpQcm9jZXNzaW5nU2l6ZUluRnJhbWVzKSk7CisgICAg
bV90ZW1wb3JhcnlTdGVyZW9CdXMgPSBhZG9wdFB0cihuZXcgQXVkaW9CdXMoMiwgQXVkaW9Ob2Rl
OjpQcm9jZXNzaW5nU2l6ZUluRnJhbWVzKSk7CisKKyAgICBIUlRGUGFubmVyOjppbml0aWFsaXpl
S2VybmVscyhzYW1wbGVSYXRlKCkpOworfQorCitBdWRpb0NvbnRleHQ6On5BdWRpb0NvbnRleHQo
KQoreworICAgIG1fZGVzdGluYXRpb25Ob2RlLT51bmluaXRpYWxpemUoKTsKKworICAgIC8vIFdo
ZW4gdGhlIHBhZ2UgaXMgdW5sb2FkZWQsIHNvbWUgc291cmNlcyBtYXkgbm90IGhhdmUgZmluaXNo
ZWQgcGxheWluZyB5ZXQuICBTaHV0IHRoZW0gZG93bi4KKyAgICBkZXJlZlVuZmluaXNoZWRTb3Vy
Y2VOb2RlcygpOworfQorCit2b2lkIEF1ZGlvQ29udGV4dDo6bGF6eUluaXRpYWxpemUoKQorewor
ICAgIGlmICghbV9kZXN0aW5hdGlvbk5vZGUtPmlzSW5pdGlhbGl6ZWQoKSkKKyAgICAgICAgbV9k
ZXN0aW5hdGlvbk5vZGUtPmluaXRpYWxpemUoKTsKK30KKwordm9pZCBBdWRpb0NvbnRleHQ6OnVu
aW5pdGlhbGl6ZSgpCit7CisgICAgaWYgKG1fZGVzdGluYXRpb25Ob2RlLT5pc0luaXRpYWxpemVk
KCkpCisgICAgICAgIG1fZGVzdGluYXRpb25Ob2RlLT51bmluaXRpYWxpemUoKTsKKworICAgIC8v
IEJlY2F1c2UgdGhlIEF1ZGlvQnVmZmVycyBhcmUgZ2FyYmFnZSBjb2xsZWN0ZWQsIHdlIGNhbid0
IGRlbGV0ZSB0aGVtIGhlcmUuCisgICAgLy8gSW5zdGVhZCwgYXQgbGVhc3QgcmVsZWFzZSB0aGUg
cG90ZW50aWFsbHkgbGFyZ2UgYW1vdW50IG9mIGFsbG9jYXRlZCBtZW1vcnkgZm9yIHRoZSBhdWRp
byBkYXRhLgorICAgIC8vIE5vdGUgdGhhdCB3ZSBkbyB0aGlzICphZnRlciogdGhlIGNvbnRleHQg
aXMgdW5pbml0aWFsaXplZCBhbmQgc3RvcHMgcHJvY2Vzc2luZyBhdWRpby4KKyAgICBmb3IgKHVu
c2lnbmVkIGkgPSAwOyBpIDwgbV9hbGxvY2F0ZWRCdWZmZXJzLnNpemUoKTsgKytpKQorICAgICAg
ICBtX2FsbG9jYXRlZEJ1ZmZlcnNbaV0tPnJlbGVhc2VNZW1vcnkoKTsKKworICAgIG1fYWxsb2Nh
dGVkQnVmZmVycy5jbGVhcigpOworfQorCitib29sIEF1ZGlvQ29udGV4dDo6aXNJbml0aWFsaXpl
ZCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fZGVzdGluYXRpb25Ob2RlLT5pc0luaXRpYWxpemVk
KCk7Cit9CisKK3ZvaWQgQXVkaW9Db250ZXh0OjpzdG9wKCkKK3sKKyAgICBtX2RvY3VtZW50ID0g
MDsgLy8gZG9jdW1lbnQgaXMgZ29pbmcgYXdheQorICAgIHVuaW5pdGlhbGl6ZSgpOworfQorCitE
b2N1bWVudCogQXVkaW9Db250ZXh0Ojpkb2N1bWVudCgpCit7CisgICAgQVNTRVJUKG1fZG9jdW1l
bnQpOworICAgIHJldHVybiBtX2RvY3VtZW50OworfQorCitib29sIEF1ZGlvQ29udGV4dDo6aGFz
RG9jdW1lbnQoKQoreworICAgIHJldHVybiBtX2RvY3VtZW50OworfQorCit2b2lkIEF1ZGlvQ29u
dGV4dDo6cmVmQnVmZmVyKFBhc3NSZWZQdHI8QXVkaW9CdWZmZXI+IGJ1ZmZlcikKK3sKKyAgICBt
X2FsbG9jYXRlZEJ1ZmZlcnMuYXBwZW5kKGJ1ZmZlcik7Cit9CisKK1Bhc3NSZWZQdHI8QXVkaW9C
dWZmZXI+IEF1ZGlvQ29udGV4dDo6Y3JlYXRlQnVmZmVyKHVuc2lnbmVkIG51bWJlck9mQ2hhbm5l
bHMsIHNpemVfdCBudW1iZXJPZkZyYW1lcywgZG91YmxlIHNhbXBsZVJhdGUpCit7CisgICAgcmV0
dXJuIEF1ZGlvQnVmZmVyOjpjcmVhdGUobnVtYmVyT2ZDaGFubmVscywgbnVtYmVyT2ZGcmFtZXMs
IHNhbXBsZVJhdGUpOworfQorCitQYXNzUmVmUHRyPEF1ZGlvQnVmZmVyU291cmNlTm9kZT4gQXVk
aW9Db250ZXh0OjpjcmVhdGVCdWZmZXJTb3VyY2UoKQoreworICAgIGxhenlJbml0aWFsaXplKCk7
CisgICAgUmVmUHRyPEF1ZGlvQnVmZmVyU291cmNlTm9kZT4gbm9kZSA9IEF1ZGlvQnVmZmVyU291
cmNlTm9kZTo6Y3JlYXRlKHRoaXMsIG1fZGVzdGluYXRpb25Ob2RlLT5zYW1wbGVSYXRlKCkpOwor
CisgICAgcmVmTm9kZShub2RlLmdldCgpKTsgLy8gY29udGV4dCBrZWVwcyByZWZlcmVuY2UgdW50
aWwgIm5vdGUiIGhhcyBmaW5pc2hlZCBwbGF5aW5nCisgICAgcmV0dXJuIG5vZGU7Cit9CisKK1Bh
c3NSZWZQdHI8SmF2YVNjcmlwdEF1ZGlvTm9kZT4gQXVkaW9Db250ZXh0OjpjcmVhdGVKYXZhU2Ny
aXB0Tm9kZShzaXplX3QgYnVmZmVyU2l6ZSkKK3sKKyAgICBsYXp5SW5pdGlhbGl6ZSgpOworICAg
IFJlZlB0cjxKYXZhU2NyaXB0QXVkaW9Ob2RlPiBub2RlID0gSmF2YVNjcmlwdEF1ZGlvTm9kZTo6
Y3JlYXRlKHRoaXMsIG1fZGVzdGluYXRpb25Ob2RlLT5zYW1wbGVSYXRlKCksIGJ1ZmZlclNpemUp
OworCisgICAgcmVmTm9kZShub2RlLmdldCgpKTsgLy8gY29udGV4dCBrZWVwcyByZWZlcmVuY2Ug
dW50aWwgd2Ugc3RvcCBtYWtpbmcgamF2YXNjcmlwdCByZW5kZXJpbmcgY2FsbGJhY2tzCisgICAg
cmV0dXJuIG5vZGU7Cit9CisKK1Bhc3NSZWZQdHI8TG93UGFzczJGaWx0ZXJOb2RlPiBBdWRpb0Nv
bnRleHQ6OmNyZWF0ZUxvd1Bhc3MyRmlsdGVyKCkKK3sKKyAgICBsYXp5SW5pdGlhbGl6ZSgpOwor
ICAgIHJldHVybiBMb3dQYXNzMkZpbHRlck5vZGU6OmNyZWF0ZSh0aGlzLCBtX2Rlc3RpbmF0aW9u
Tm9kZS0+c2FtcGxlUmF0ZSgpKTsKK30KKworUGFzc1JlZlB0cjxIaWdoUGFzczJGaWx0ZXJOb2Rl
PiBBdWRpb0NvbnRleHQ6OmNyZWF0ZUhpZ2hQYXNzMkZpbHRlcigpCit7CisgICAgbGF6eUluaXRp
YWxpemUoKTsKKyAgICByZXR1cm4gSGlnaFBhc3MyRmlsdGVyTm9kZTo6Y3JlYXRlKHRoaXMsIG1f
ZGVzdGluYXRpb25Ob2RlLT5zYW1wbGVSYXRlKCkpOworfQorCitQYXNzUmVmUHRyPEF1ZGlvUGFu
bmVyTm9kZT4gQXVkaW9Db250ZXh0OjpjcmVhdGVQYW5uZXIoKQoreworICAgIGxhenlJbml0aWFs
aXplKCk7CisgICAgcmV0dXJuIEF1ZGlvUGFubmVyTm9kZTo6Y3JlYXRlKHRoaXMsIG1fZGVzdGlu
YXRpb25Ob2RlLT5zYW1wbGVSYXRlKCkpOworfQorCitQYXNzUmVmUHRyPENvbnZvbHZlck5vZGU+
IEF1ZGlvQ29udGV4dDo6Y3JlYXRlQ29udm9sdmVyKCkKK3sKKyAgICBsYXp5SW5pdGlhbGl6ZSgp
OworICAgIHJldHVybiBDb252b2x2ZXJOb2RlOjpjcmVhdGUodGhpcywgbV9kZXN0aW5hdGlvbk5v
ZGUtPnNhbXBsZVJhdGUoKSk7Cit9CisKK1Bhc3NSZWZQdHI8UmVhbHRpbWVBbmFseXNlck5vZGU+
IEF1ZGlvQ29udGV4dDo6Y3JlYXRlQW5hbHlzZXIoKQoreworICAgIGxhenlJbml0aWFsaXplKCk7
CisgICAgcmV0dXJuIFJlYWx0aW1lQW5hbHlzZXJOb2RlOjpjcmVhdGUodGhpcywgbV9kZXN0aW5h
dGlvbk5vZGUtPnNhbXBsZVJhdGUoKSk7Cit9CisKK1Bhc3NSZWZQdHI8QXVkaW9HYWluTm9kZT4g
QXVkaW9Db250ZXh0OjpjcmVhdGVHYWluTm9kZSgpCit7CisgICAgbGF6eUluaXRpYWxpemUoKTsK
KyAgICByZXR1cm4gQXVkaW9HYWluTm9kZTo6Y3JlYXRlKHRoaXMsIG1fZGVzdGluYXRpb25Ob2Rl
LT5zYW1wbGVSYXRlKCkpOworfQorCitQYXNzUmVmUHRyPERlbGF5Tm9kZT4gQXVkaW9Db250ZXh0
OjpjcmVhdGVEZWxheU5vZGUoKQoreworICAgIGxhenlJbml0aWFsaXplKCk7CisgICAgcmV0dXJu
IERlbGF5Tm9kZTo6Y3JlYXRlKHRoaXMsIG1fZGVzdGluYXRpb25Ob2RlLT5zYW1wbGVSYXRlKCkp
OworfQorCitQYXNzUmVmUHRyPEF1ZGlvQ2hhbm5lbFNwbGl0dGVyPiBBdWRpb0NvbnRleHQ6OmNy
ZWF0ZUNoYW5uZWxTcGxpdHRlcigpCit7CisgICAgbGF6eUluaXRpYWxpemUoKTsKKyAgICByZXR1
cm4gQXVkaW9DaGFubmVsU3BsaXR0ZXI6OmNyZWF0ZSh0aGlzLCBtX2Rlc3RpbmF0aW9uTm9kZS0+
c2FtcGxlUmF0ZSgpKTsKK30KKworUGFzc1JlZlB0cjxBdWRpb0NoYW5uZWxNZXJnZXI+IEF1ZGlv
Q29udGV4dDo6Y3JlYXRlQ2hhbm5lbE1lcmdlcigpCit7CisgICAgbGF6eUluaXRpYWxpemUoKTsK
KyAgICByZXR1cm4gQXVkaW9DaGFubmVsTWVyZ2VyOjpjcmVhdGUodGhpcywgbV9kZXN0aW5hdGlv
bk5vZGUtPnNhbXBsZVJhdGUoKSk7Cit9CisKK3ZvaWQgQXVkaW9Db250ZXh0Ojpub3RpZnlOb2Rl
RmluaXNoZWRQcm9jZXNzaW5nKEF1ZGlvTm9kZSogbm9kZSkKK3sKKyAgICBtX2ZpbmlzaGVkTm9k
ZXMuYXBwZW5kKG5vZGUpOworfQorCit2b2lkIEF1ZGlvQ29udGV4dDo6aGFuZGxlRmluaXNoZWRO
b2RlcygpCit7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG1fZmluaXNoZWROb2Rlcy5z
aXplKCk7IGkrKykKKyAgICAgICAgZGVyZWZOb2RlKG1fZmluaXNoZWROb2Rlc1tpXSk7CisKKyAg
ICBtX2ZpbmlzaGVkTm9kZXMuY2xlYXIoKTsKK30KKwordm9pZCBBdWRpb0NvbnRleHQ6OnJlZk5v
ZGUoQXVkaW9Ob2RlKiBub2RlKQoreworICAgIG5vZGUtPnJlZihBdWRpb05vZGU6OlJlZlR5cGVD
b25uZWN0aW9uKTsKKyAgICBtX3JlZmVyZW5jZWROb2Rlcy5hcHBlbmQobm9kZSk7Cit9CisKK3Zv
aWQgQXVkaW9Db250ZXh0OjpkZXJlZk5vZGUoQXVkaW9Ob2RlKiBub2RlKQoreworICAgIG5vZGUt
PmRlcmVmKEF1ZGlvTm9kZTo6UmVmVHlwZUNvbm5lY3Rpb24pOworCisgICAgZm9yICh1bnNpZ25l
ZCBpID0gMDsgaSA8IG1fcmVmZXJlbmNlZE5vZGVzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGlm
IChub2RlID09IG1fcmVmZXJlbmNlZE5vZGVzW2ldKSB7CisgICAgICAgICAgICBtX3JlZmVyZW5j
ZWROb2Rlcy5yZW1vdmUoaSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0K
K30KKwordm9pZCBBdWRpb0NvbnRleHQ6OmRlcmVmVW5maW5pc2hlZFNvdXJjZU5vZGVzKCkKK3sK
KyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbV9yZWZlcmVuY2VkTm9kZXMuc2l6ZSgpOyAr
K2kpCisgICAgICAgIG1fcmVmZXJlbmNlZE5vZGVzW2ldLT5kZXJlZihBdWRpb05vZGU6OlJlZlR5
cGVDb25uZWN0aW9uKTsKKworICAgIG1fcmVmZXJlbmNlZE5vZGVzLmNsZWFyKCk7Cit9CisKK3Zv
aWQgQXVkaW9Db250ZXh0OjptYXJrRm9yRGVsZXRpb24oQXVkaW9Ob2RlKiBub2RlKQoreworICAg
IG1fbm9kZXNUb0RlbGV0ZS5hcHBlbmQobm9kZSk7Cit9CisKK3ZvaWQgQXVkaW9Db250ZXh0Ojpk
ZWxldGVNYXJrZWROb2RlcygpCit7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG1fbm9k
ZXNUb0RlbGV0ZS5zaXplKCk7ICsraSkKKyAgICAgICAgZGVsZXRlIG1fbm9kZXNUb0RlbGV0ZVtp
XTsKKworICAgIG1fbm9kZXNUb0RlbGV0ZS5jbGVhcigpOworfQorCit9IC8vIG5hbWVzcGFjZSBX
ZWJDb3JlCisKKyNlbmRpZiAvLyBFTkFCTEUoV0VCX0FVRElPKQpJbmRleDogV2ViQ29yZS93ZWJh
dWRpby9BdWRpb0NvbnRleHQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3dlYmF1ZGlvL0F1ZGlv
Q29udGV4dC5oCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS93ZWJhdWRpby9BdWRpb0NvbnRleHQu
aAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwxNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisg
KiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAq
IDMuICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFwcGxlIENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBu
b3IgdGhlIG5hbWVzIG9mCisgKiAgICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBl
bmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0
d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJB
UyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICog
RElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBC
RSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lB
TCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJ
VFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIEF1ZGlvQ29udGV4dF9o
CisjZGVmaW5lIEF1ZGlvQ29udGV4dF9oCisKKyNpbmNsdWRlICJBY3RpdmVET01PYmplY3QuaCIK
KyNpbmNsdWRlICJBdWRpb0J1cy5oIgorI2luY2x1ZGUgIkF1ZGlvRGVzdGluYXRpb25Ob2RlLmgi
CisjaW5jbHVkZSA8d3RmL093blB0ci5oPgorI2luY2x1ZGUgPHd0Zi9QYXNzUmVmUHRyLmg+Cisj
aW5jbHVkZSA8d3RmL1JlZkNvdW50ZWQuaD4KKyNpbmNsdWRlIDx3dGYvUmVmUHRyLmg+CisjaW5j
bHVkZSA8d3RmL1ZlY3Rvci5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L0F0b21pY1N0cmluZ0hhc2gu
aD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBBdWRpb0J1ZmZlcjsKK2NsYXNzIEF1
ZGlvQnVmZmVyU291cmNlTm9kZTsKK2NsYXNzIEF1ZGlvQ2hhbm5lbE1lcmdlcjsKK2NsYXNzIEF1
ZGlvQ2hhbm5lbFNwbGl0dGVyOworY2xhc3MgQXVkaW9HYWluTm9kZTsKK2NsYXNzIEF1ZGlvUGFu
bmVyTm9kZTsKK2NsYXNzIEF1ZGlvTGlzdGVuZXI7CitjbGFzcyBDYWNoZWRBdWRpbzsKK2NsYXNz
IERlbGF5Tm9kZTsKK2NsYXNzIERvY3VtZW50OworY2xhc3MgTG93UGFzczJGaWx0ZXJOb2RlOwor
Y2xhc3MgSGlnaFBhc3MyRmlsdGVyTm9kZTsKK2NsYXNzIENvbnZvbHZlck5vZGU7CitjbGFzcyBS
ZWFsdGltZUFuYWx5c2VyTm9kZTsKK2NsYXNzIEphdmFTY3JpcHRBdWRpb05vZGU7CisKK2NsYXNz
IEF1ZGlvQ29udGV4dCA6IHB1YmxpYyBBY3RpdmVET01PYmplY3QsIHB1YmxpYyBSZWZDb3VudGVk
PEF1ZGlvQ29udGV4dD4geworcHVibGljOgorICAgIHN0YXRpYyBQYXNzUmVmUHRyPEF1ZGlvQ29u
dGV4dD4gY3JlYXRlKERvY3VtZW50Kik7CisKKyAgICB2aXJ0dWFsIH5BdWRpb0NvbnRleHQoKTsK
KworICAgIGJvb2wgaXNJbml0aWFsaXplZCgpIGNvbnN0OworCisgICAgLy8gRG9jdW1lbnQgbm90
aWZpY2F0aW9uCisgICAgdmlydHVhbCB2b2lkIHN0b3AoKTsKKworICAgIERvY3VtZW50KiBkb2N1
bWVudCgpOyAvLyBBU1NFUlRzIGlmIGRvY3VtZW50IG5vIGxvbmdlciBleGlzdHMuCisgICAgYm9v
bCBoYXNEb2N1bWVudCgpOworCisgICAgQXVkaW9EZXN0aW5hdGlvbk5vZGUqIGRlc3RpbmF0aW9u
KCkgeyByZXR1cm4gbV9kZXN0aW5hdGlvbk5vZGUuZ2V0KCk7IH0KKyAgICBkb3VibGUgY3VycmVu
dFRpbWUoKSB7IHJldHVybiBtX2Rlc3RpbmF0aW9uTm9kZS0+Y3VycmVudFRpbWUoKTsgfQorICAg
IGRvdWJsZSBzYW1wbGVSYXRlKCkgeyByZXR1cm4gbV9kZXN0aW5hdGlvbk5vZGUtPnNhbXBsZVJh
dGUoKTsgfQorCisgICAgUGFzc1JlZlB0cjxBdWRpb0J1ZmZlcj4gY3JlYXRlQnVmZmVyKHVuc2ln
bmVkIG51bWJlck9mQ2hhbm5lbHMsIHNpemVfdCBudW1iZXJPZkZyYW1lcywgZG91YmxlIHNhbXBs
ZVJhdGUpOworCisgICAgLy8gS2VlcCB0cmFjayBvZiB0aGlzIGJ1ZmZlciBzbyB3ZSBjYW4gcmVs
ZWFzZSBtZW1vcnkgYWZ0ZXIgdGhlIGNvbnRleHQgaXMgc2h1dCBkb3duLi4uCisgICAgdm9pZCBy
ZWZCdWZmZXIoUGFzc1JlZlB0cjxBdWRpb0J1ZmZlcj4gYnVmZmVyKTsKKworICAgIEF1ZGlvTGlz
dGVuZXIqIGxpc3RlbmVyKCkgeyByZXR1cm4gbV9saXN0ZW5lci5nZXQoKTsgfQorCisgICAgUGFz
c1JlZlB0cjxBdWRpb0J1ZmZlclNvdXJjZU5vZGU+IGNyZWF0ZUJ1ZmZlclNvdXJjZSgpOworICAg
IFBhc3NSZWZQdHI8QXVkaW9HYWluTm9kZT4gY3JlYXRlR2Fpbk5vZGUoKTsKKyAgICBQYXNzUmVm
UHRyPERlbGF5Tm9kZT4gY3JlYXRlRGVsYXlOb2RlKCk7CisgICAgUGFzc1JlZlB0cjxMb3dQYXNz
MkZpbHRlck5vZGU+IGNyZWF0ZUxvd1Bhc3MyRmlsdGVyKCk7CisgICAgUGFzc1JlZlB0cjxIaWdo
UGFzczJGaWx0ZXJOb2RlPiBjcmVhdGVIaWdoUGFzczJGaWx0ZXIoKTsKKyAgICBQYXNzUmVmUHRy
PEF1ZGlvUGFubmVyTm9kZT4gY3JlYXRlUGFubmVyKCk7CisgICAgUGFzc1JlZlB0cjxDb252b2x2
ZXJOb2RlPiBjcmVhdGVDb252b2x2ZXIoKTsKKyAgICBQYXNzUmVmUHRyPFJlYWx0aW1lQW5hbHlz
ZXJOb2RlPiBjcmVhdGVBbmFseXNlcigpOworICAgIFBhc3NSZWZQdHI8SmF2YVNjcmlwdEF1ZGlv
Tm9kZT4gY3JlYXRlSmF2YVNjcmlwdE5vZGUoc2l6ZV90IGJ1ZmZlclNpemUpOworCisgICAgUGFz
c1JlZlB0cjxBdWRpb0NoYW5uZWxTcGxpdHRlcj4gY3JlYXRlQ2hhbm5lbFNwbGl0dGVyKCk7Cisg
ICAgUGFzc1JlZlB0cjxBdWRpb0NoYW5uZWxNZXJnZXI+IGNyZWF0ZUNoYW5uZWxNZXJnZXIoKTsK
KworICAgIEF1ZGlvQnVzKiB0ZW1wb3JhcnlNb25vQnVzKCkgeyByZXR1cm4gbV90ZW1wb3JhcnlN
b25vQnVzLmdldCgpOyB9CisgICAgQXVkaW9CdXMqIHRlbXBvcmFyeVN0ZXJlb0J1cygpIHsgcmV0
dXJuIG1fdGVtcG9yYXJ5U3RlcmVvQnVzLmdldCgpOyB9CisKKyAgICAvLyBXaGVuIGEgc291cmNl
IG5vZGUgaGFzIG5vIG1vcmUgcHJvY2Vzc2luZyB0byBkbyAoaGFzIGZpbmlzaGVkIHBsYXlpbmcp
LCB0aGVuIGl0IHRlbGxzIHRoZSBjb250ZXh0IHRvIGRlcmVmZXJlbmNlIGl0LgorICAgIHZvaWQg
bm90aWZ5Tm9kZUZpbmlzaGVkUHJvY2Vzc2luZyhBdWRpb05vZGUqKTsKKyAgICB2b2lkIGhhbmRs
ZUZpbmlzaGVkTm9kZXMoKTsKKworICAgIC8vIFdlIHJlYXAgYWxsIG1hcmtlZCBub2RlcyBhdCB0
aGUgZW5kIG9mIGVhY2ggcmVhbHRpbWUgcmVuZGVyIGN5Y2xlIGluIGRlbGV0ZU1hcmtlZE5vZGVz
KCkuCisgICAgdm9pZCBtYXJrRm9yRGVsZXRpb24oQXVkaW9Ob2RlKik7CisgICAgdm9pZCBkZWxl
dGVNYXJrZWROb2RlcygpOworCisgICAgLy8gS2VlcHMgdHJhY2sgb2YgdGhlIG51bWJlciBvZiBj
b25uZWN0aW9ucyBtYWRlLgorICAgIHZvaWQgaW5jcmVtZW50Q29ubmVjdGlvbkNvdW50KCkKKyAg
ICB7CisgICAgICAgIG1fY29ubmVjdGlvbkNvdW50Kys7CisgICAgfQorCisgICAgdW5zaWduZWQg
Y29ubmVjdGlvbkNvdW50KCkgY29uc3QgeyByZXR1cm4gbV9jb25uZWN0aW9uQ291bnQ7IH0KKwor
cHJpdmF0ZToKKyAgICBBdWRpb0NvbnRleHQoRG9jdW1lbnQqKTsKKyAgICB2b2lkIGxhenlJbml0
aWFsaXplKCk7CisgICAgdm9pZCB1bmluaXRpYWxpemUoKTsKKworICAgIC8vIFRoZSBjb250ZXh0
IGl0c2VsZiBrZWVwcyBhIHJlZmVyZW5jZSB0byBhbGwgc291cmNlIG5vZGVzLiAgVGhlIHNvdXJj
ZSBub2RlcywgdGhlbiByZWZlcmVuY2UgYWxsIG5vZGVzIHRoZXkncmUgY29ubmVjdGVkIHRvLgor
ICAgIC8vIEluIHR1cm4sIHRoZXNlIG5vZGVzIHJlZmVyZW5jZSBhbGwgbm9kZXMgdGhleSdyZSBj
b25uZWN0ZWQgdG8uICBBbGwgbm9kZXMgYXJlIHVsdGltYXRlbHkgY29ubmVjdGVkIHRvIHRoZSBB
dWRpb0Rlc3RpbmF0aW9uTm9kZS4KKyAgICAvLyBXaGVuIHRoZSBjb250ZXh0IGRlcmVmZXJlbmNl
cyBhIHNvdXJjZSBub2RlLCBpdCB3aWxsIGJlIGRlYWN0aXZhdGVkIGZyb20gdGhlIHJlbmRlcmlu
ZyBncmFwaCBhbG9uZyB3aXRoIGFsbCBvdGhlciBub2RlcyBpdCBpcworICAgIC8vIHVuaXF1ZWx5
IGNvbm5lY3RlZCB0by4gIFNlZSB0aGUgQXVkaW9Ob2RlOjpyZWYoKSBhbmQgQXVkaW9Ob2RlOjpk
ZXJlZigpIG1ldGhvZHMgZm9yIG1vcmUgZGV0YWlscy4KKyAgICB2b2lkIHJlZk5vZGUoQXVkaW9O
b2RlKik7CisgICAgdm9pZCBkZXJlZk5vZGUoQXVkaW9Ob2RlKik7CisgICAgdm9pZCBkZXJlZlVu
ZmluaXNoZWRTb3VyY2VOb2RlcygpOworCisgICAgUmVmUHRyPEF1ZGlvRGVzdGluYXRpb25Ob2Rl
PiBtX2Rlc3RpbmF0aW9uTm9kZTsKKyAgICBSZWZQdHI8QXVkaW9MaXN0ZW5lcj4gbV9saXN0ZW5l
cjsKKworICAgIFZlY3RvcjxSZWZQdHI8QXVkaW9CdWZmZXI+ID4gbV9hbGxvY2F0ZWRCdWZmZXJz
OworICAgIFZlY3RvcjxBdWRpb05vZGUqPiBtX2ZpbmlzaGVkTm9kZXM7CisKKyAgICAvLyBXZSBk
b24ndCB1c2UgUmVmUHRyPEF1ZGlvTm9kZT4gaGVyZSBiZWNhdXNlIEF1ZGlvTm9kZSBoYXMgYSBt
b3JlIGNvbXBsZXggcmVmKCkgLyBkZXJlZigpIGltcGxlbWVudGF0aW9uCisgICAgLy8gd2l0aCBh
biBvcHRpb25hbCBhcmd1bWVudCBmb3IgcmVmVHlwZS4gIFdlIG5lZWQgdG8gdXNlIHRoZSBzcGVj
aWFsIHJlZlR5cGU6IFJlZlR5cGVDb25uZWN0aW9uCisgICAgVmVjdG9yPEF1ZGlvTm9kZSo+IG1f
cmVmZXJlbmNlZE5vZGVzOworCisgICAgLy8gQWNjdW11bGF0ZSBub2RlcyB3aGljaCBuZWVkIHRv
IGJlIGRlbGV0ZWQgYXQgdGhlIGVuZCBvZiBhIHJlbmRlciBjeWNsZSAoaW4gcmVhbHRpbWUgdGhy
ZWFkKSBoZXJlLgorICAgIFZlY3RvcjxBdWRpb05vZGUqPiBtX25vZGVzVG9EZWxldGU7CisKKyAg
ICBWZWN0b3I8UmVmUHRyPENhY2hlZEF1ZGlvPiA+IG1fY2FjaGVkQXVkaW9SZWZlcmVuY2VzOwor
CisgICAgT3duUHRyPEF1ZGlvQnVzPiBtX3RlbXBvcmFyeU1vbm9CdXM7CisgICAgT3duUHRyPEF1
ZGlvQnVzPiBtX3RlbXBvcmFyeVN0ZXJlb0J1czsKKworICAgIHVuc2lnbmVkIG1fY29ubmVjdGlv
bkNvdW50OworCisgICAgRG9jdW1lbnQqIG1fZG9jdW1lbnQ7Cit9OworCit9IC8vIFdlYkNvcmUK
KworI2VuZGlmIC8vIEF1ZGlvQ29udGV4dF9oCkluZGV4OiBXZWJDb3JlL3dlYmF1ZGlvL0F1ZGlv
Q29udGV4dC5pZGwKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS93ZWJhdWRpby9BdWRpb0NvbnRleHQu
aWRsCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS93ZWJhdWRpby9BdWRpb0NvbnRleHQuaWRsCShy
ZXZpc2lvbiAwKQpAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdv
b2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiAg
TmVpdGhlciB0aGUgbmFtZSBvZiBBcHBsZSBDb21wdXRlciwgSW5jLiAoIkFwcGxlIikgbm9yIHRo
ZSBuYW1lcyBvZgorICogICAgIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3Jz
ZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUg
d2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMi
IEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NM
QUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElB
QkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVY
RU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworbW9kdWxlIHdlYmF1ZGlvIHsKKyAgICBpbnRl
cmZhY2UgWworICAgICAgICBDb25kaXRpb25hbD1XRUJfQVVESU8sCisgICAgICAgIENhbkJlQ29u
c3RydWN0ZWQsCisgICAgICAgIEN1c3RvbUNvbnN0cnVjdEZ1bmN0aW9uLAorICAgICAgICBWOEN1
c3RvbUNvbnN0cnVjdG9yCisgICAgXSBBdWRpb0NvbnRleHQgeworICAgICAgICAvLyBBbGwgcmVu
ZGVyZWQgYXVkaW8gdWx0aW1hdGVseSBjb25uZWN0cyB0byBkZXN0aW5hdGlvbiwgd2hpY2ggcmVw
cmVzZW50cyB0aGUgYXVkaW8gaGFyZHdhcmUuCisgICAgICAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBB
dWRpb0Rlc3RpbmF0aW9uTm9kZSBkZXN0aW5hdGlvbjsKKworICAgICAgICAvLyBBbGwgc2NoZWR1
bGVkIHRpbWVzIGFyZSByZWxhdGl2ZSB0byB0aGlzIHRpbWUgaW4gc2Vjb25kcy4KKyAgICAgICAg
cmVhZG9ubHkgYXR0cmlidXRlIGZsb2F0IGN1cnJlbnRUaW1lOworCisgICAgICAgIC8vIEFsbCBB
dWRpb05vZGVzIGluIHRoZSBjb250ZXh0IHJ1biBhdCB0aGlzIHNhbXBsZS1yYXRlIChpbiBzYW1w
bGUtZnJhbWVzIHBlciBzZWNvbmQpLgorICAgICAgICByZWFkb25seSBhdHRyaWJ1dGUgZmxvYXQg
c2FtcGxlUmF0ZTsKKworICAgICAgICAvLyBBbGwgcGFubmluZyBpcyByZWxhdGl2ZSB0byB0aGlz
IGxpc3RlbmVyLgorICAgICAgICByZWFkb25seSBhdHRyaWJ1dGUgQXVkaW9MaXN0ZW5lciBsaXN0
ZW5lcjsKKworICAgICAgICBBdWRpb0J1ZmZlciBjcmVhdGVCdWZmZXIoaW4gdW5zaWduZWQgbG9u
ZyBudW1iZXJPZkNoYW5uZWxzLCBpbiB1bnNpZ25lZCBsb25nIG51bWJlck9mRnJhbWVzLCBpbiBm
bG9hdCBzYW1wbGVSYXRlKTsKKworICAgICAgICAvLyBTb3VyY2UKKyAgICAgICAgQXVkaW9CdWZm
ZXJTb3VyY2VOb2RlIGNyZWF0ZUJ1ZmZlclNvdXJjZSgpOworCisgICAgICAgIC8vIFByb2Nlc3Np
bmcgbm9kZXMKKyAgICAgICAgQXVkaW9HYWluTm9kZSBjcmVhdGVHYWluTm9kZSgpOworICAgICAg
ICBEZWxheU5vZGUgY3JlYXRlRGVsYXlOb2RlKCk7CisgICAgICAgIExvd1Bhc3MyRmlsdGVyTm9k
ZSBjcmVhdGVMb3dQYXNzMkZpbHRlcigpOworICAgICAgICBIaWdoUGFzczJGaWx0ZXJOb2RlIGNy
ZWF0ZUhpZ2hQYXNzMkZpbHRlcigpOworICAgICAgICBBdWRpb1Bhbm5lck5vZGUgY3JlYXRlUGFu
bmVyKCk7CisgICAgICAgIENvbnZvbHZlck5vZGUgY3JlYXRlQ29udm9sdmVyKCk7CisgICAgICAg
IFJlYWx0aW1lQW5hbHlzZXJOb2RlIGNyZWF0ZUFuYWx5c2VyKCk7CisgICAgICAgIEphdmFTY3Jp
cHRBdWRpb05vZGUgY3JlYXRlSmF2YVNjcmlwdE5vZGUoaW4gdW5zaWduZWQgbG9uZyBidWZmZXJT
aXplKTsKKworICAgICAgICAvLyBDaGFubmVsIHNwbGl0dGluZyBhbmQgbWVyZ2luZworICAgICAg
ICBBdWRpb0NoYW5uZWxTcGxpdHRlciBjcmVhdGVDaGFubmVsU3BsaXR0ZXIoKTsKKyAgICAgICAg
QXVkaW9DaGFubmVsTWVyZ2VyIGNyZWF0ZUNoYW5uZWxNZXJnZXIoKTsKKyAgICB9OworfQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>67734</attachid>
            <date>2010-09-15 15:44:08 -0700</date>
            <delta_ts>2010-09-21 13:08:01 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-44890-20100915154406.patch</filename>
            <type>text/plain</type>
            <size>27906</size>
            <attacher name="Chris Rogers">crogers</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2NzU3MCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNjQgQEAKKzIwMTAtMDktMTUgIENocmlzIFJvZ2VycyAgPGNyb2dlcnNAZ29vZ2xl
LmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBB
ZGQgQXVkaW9Db250ZXh0IGZpbGVzCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3No
b3dfYnVnLmNnaT9pZD00NDg5MAorCisgICAgICAgIE5vIG5ldyB0ZXN0cyBzaW5jZSBhdWRpbyBB
UEkgaXMgbm90IHlldCBpbXBsZW1lbnRlZC4KKworICAgICAgICAqIHdlYmF1ZGlvL0F1ZGlvQ29u
dGV4dC5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9Db250ZXh0OjpjcmVhdGUp
OgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9Db250ZXh0OjpBdWRpb0NvbnRleHQpOgorICAgICAg
ICAoV2ViQ29yZTo6QXVkaW9Db250ZXh0Ojp+QXVkaW9Db250ZXh0KToKKyAgICAgICAgKFdlYkNv
cmU6OkF1ZGlvQ29udGV4dDo6bGF6eUluaXRpYWxpemUpOgorICAgICAgICAoV2ViQ29yZTo6QXVk
aW9Db250ZXh0Ojp1bmluaXRpYWxpemUpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9Db250ZXh0
Ojppc0luaXRpYWxpemVkKToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvQ29udGV4dDo6c3RvcCk6
CisgICAgICAgIChXZWJDb3JlOjpBdWRpb0NvbnRleHQ6OmRvY3VtZW50KToKKyAgICAgICAgKFdl
YkNvcmU6OkF1ZGlvQ29udGV4dDo6aGFzRG9jdW1lbnQpOgorICAgICAgICAoV2ViQ29yZTo6QXVk
aW9Db250ZXh0OjpyZWZCdWZmZXIpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9Db250ZXh0Ojpj
cmVhdGVCdWZmZXIpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9Db250ZXh0OjpjcmVhdGVCdWZm
ZXJTb3VyY2UpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9Db250ZXh0OjpjcmVhdGVKYXZhU2Ny
aXB0Tm9kZSk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb0NvbnRleHQ6OmNyZWF0ZUxvd1Bhc3My
RmlsdGVyKToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvQ29udGV4dDo6Y3JlYXRlSGlnaFBhc3My
RmlsdGVyKToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvQ29udGV4dDo6Y3JlYXRlUGFubmVyKToK
KyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvQ29udGV4dDo6Y3JlYXRlQ29udm9sdmVyKToKKyAgICAg
ICAgKFdlYkNvcmU6OkF1ZGlvQ29udGV4dDo6Y3JlYXRlQW5hbHlzZXIpOgorICAgICAgICAoV2Vi
Q29yZTo6QXVkaW9Db250ZXh0OjpjcmVhdGVHYWluTm9kZSk6CisgICAgICAgIChXZWJDb3JlOjpB
dWRpb0NvbnRleHQ6OmNyZWF0ZURlbGF5Tm9kZSk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb0Nv
bnRleHQ6OmNyZWF0ZUNoYW5uZWxTcGxpdHRlcik6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb0Nv
bnRleHQ6OmNyZWF0ZUNoYW5uZWxNZXJnZXIpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9Db250
ZXh0Ojpub3RpZnlOb2RlRmluaXNoZWRQcm9jZXNzaW5nKToKKyAgICAgICAgKFdlYkNvcmU6OkF1
ZGlvQ29udGV4dDo6ZGVyZWZGaW5pc2hlZFNvdXJjZU5vZGVzKToKKyAgICAgICAgKFdlYkNvcmU6
OkF1ZGlvQ29udGV4dDo6cmVmTm9kZSk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb0NvbnRleHQ6
OmRlcmVmTm9kZSk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb0NvbnRleHQ6OmRlcmVmVW5maW5p
c2hlZFNvdXJjZU5vZGVzKToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvQ29udGV4dDo6bWFya0Zv
ckRlbGV0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvQ29udGV4dDo6ZGVsZXRlTWFya2Vk
Tm9kZXMpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9Db250ZXh0Ojppc0F1ZGlvVGhyZWFkKToK
KyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvQ29udGV4dDo6bG9jayk6CisgICAgICAgIChXZWJDb3Jl
OjpBdWRpb0NvbnRleHQ6OnRyeUxvY2spOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9Db250ZXh0
Ojp1bmxvY2spOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9Db250ZXh0OjphZGREZWZlcnJlZEZp
bmlzaERlcmVmKToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvQ29udGV4dDo6aGFuZGxlRGVmZXJy
ZWRGaW5pc2hEZXJlZnMpOgorICAgICAgICAqIHdlYmF1ZGlvL0F1ZGlvQ29udGV4dC5oOiBBZGRl
ZC4KKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvQ29udGV4dDo6ZGVzdGluYXRpb24pOgorICAgICAg
ICAoV2ViQ29yZTo6QXVkaW9Db250ZXh0OjpjdXJyZW50VGltZSk6CisgICAgICAgIChXZWJDb3Jl
OjpBdWRpb0NvbnRleHQ6OnNhbXBsZVJhdGUpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9Db250
ZXh0OjpsaXN0ZW5lcik6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb0NvbnRleHQ6OnRlbXBvcmFy
eU1vbm9CdXMpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9Db250ZXh0Ojp0ZW1wb3JhcnlTdGVy
ZW9CdXMpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9Db250ZXh0OjppbmNyZW1lbnRDb25uZWN0
aW9uQ291bnQpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9Db250ZXh0Ojpjb25uZWN0aW9uQ291
bnQpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9Db250ZXh0OjpzZXRBdWRpb1RocmVhZCk6Cisg
ICAgICAgIChXZWJDb3JlOjpBdWRpb0NvbnRleHQ6OmF1ZGlvVGhyZWFkKToKKyAgICAgICAgKFdl
YkNvcmU6OkF1ZGlvQ29udGV4dDo6QXV0b0xvY2tlcjo6QXV0b0xvY2tlcik6CisgICAgICAgIChX
ZWJDb3JlOjpBdWRpb0NvbnRleHQ6OkF1dG9Mb2NrZXI6On5BdXRvTG9ja2VyKToKKyAgICAgICAg
KFdlYkNvcmU6OkF1ZGlvQ29udGV4dDo6UmVmSW5mbzo6UmVmSW5mbyk6CisgICAgICAgICogd2Vi
YXVkaW8vQXVkaW9Db250ZXh0LmlkbDogQWRkZWQuCisKIDIwMTAtMDktMTUgIEp1bGllbiBDaGFm
ZnJhaXggIDxqY2hhZmZyYWl4QGNvZGVhdXJvcmEub3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5
IEFuZHJlYXMgS2xpbmcuCkluZGV4OiBXZWJDb3JlL3dlYmF1ZGlvL0F1ZGlvQ29udGV4dC5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gV2ViQ29yZS93ZWJhdWRpby9BdWRpb0NvbnRleHQuY3BwCShyZXZpc2lv
biAwKQorKysgV2ViQ29yZS93ZWJhdWRpby9BdWRpb0NvbnRleHQuY3BwCShyZXZpc2lvbiAwKQpA
QCAtMCwwICsxLDM5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBh
cmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gIE5laXRoZXIgdGhl
IG5hbWUgb2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMgb2YK
KyAqICAgICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90
ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3Bl
Y2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisg
KiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5Z
CisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBP
RiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisg
KiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2lmIEVOQUJMRShXRUJf
QVVESU8pCisKKyNpbmNsdWRlICJBdWRpb0NvbnRleHQuaCIKKworI2luY2x1ZGUgIkF1ZGlvQnVm
ZmVyLmgiCisjaW5jbHVkZSAiQXVkaW9CdWZmZXJTb3VyY2VOb2RlLmgiCisjaW5jbHVkZSAiQXVk
aW9DaGFubmVsTWVyZ2VyLmgiCisjaW5jbHVkZSAiQXVkaW9DaGFubmVsU3BsaXR0ZXIuaCIKKyNp
bmNsdWRlICJBdWRpb0dhaW5Ob2RlLmgiCisjaW5jbHVkZSAiQXVkaW9MaXN0ZW5lci5oIgorI2lu
Y2x1ZGUgIkF1ZGlvUGFubmVyTm9kZS5oIgorI2luY2x1ZGUgIkNhY2hlZEF1ZGlvLmgiCisjaW5j
bHVkZSAiQ29udm9sdmVyTm9kZS5oIgorI2luY2x1ZGUgIkRlbGF5Tm9kZS5oIgorI2luY2x1ZGUg
IkRvY3VtZW50LmgiCisjaW5jbHVkZSAiSFJURlBhbm5lci5oIgorI2luY2x1ZGUgIkhUTUxOYW1l
cy5oIgorI2luY2x1ZGUgIkhpZ2hQYXNzMkZpbHRlck5vZGUuaCIKKyNpbmNsdWRlICJKYXZhU2Ny
aXB0QXVkaW9Ob2RlLmgiCisjaW5jbHVkZSAiTG93UGFzczJGaWx0ZXJOb2RlLmgiCisjaW5jbHVk
ZSAiUGxhdGZvcm1TdHJpbmcuaCIKKyNpbmNsdWRlICJSZWFsdGltZUFuYWx5c2VyTm9kZS5oIgor
CisjaW5jbHVkZSA8d3RmL093blB0ci5oPgorI2luY2x1ZGUgPHd0Zi9QYXNzT3duUHRyLmg+Cisj
aW5jbHVkZSA8d3RmL1JlZkNvdW50ZWQuaD4KKworLy8gRklYTUU6IGNoZWNrIHRoZSBwcm9wZXIg
d2F5IHRvIHJlZmVyZW5jZSBhbiB1bmRlZmluZWQgdGhyZWFkIElECitjb25zdCBpbnQgVW5kZWZp
bmVkVGhyZWFkSWRlbnRpZmllciA9IDB4ZmZmZmZmZmY7CisgCituYW1lc3BhY2UgV2ViQ29yZSB7
CisKK1Bhc3NSZWZQdHI8QXVkaW9Db250ZXh0PiBBdWRpb0NvbnRleHQ6OmNyZWF0ZShEb2N1bWVu
dCogZG9jdW1lbnQpCit7CisgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBBdWRpb0NvbnRleHQoZG9j
dW1lbnQpKTsKK30KKworQXVkaW9Db250ZXh0OjpBdWRpb0NvbnRleHQoRG9jdW1lbnQqIGRvY3Vt
ZW50KQorICAgIDogQWN0aXZlRE9NT2JqZWN0KGRvY3VtZW50LCB0aGlzKQorICAgICwgbV9pc0lu
aXRpYWxpemVkKGZhbHNlKQorICAgICwgbV9pc0ZpbmlzaGVkKGZhbHNlKQorICAgICwgbV9kb2N1
bWVudChkb2N1bWVudCkKKyAgICAsIG1fZGVzdGluYXRpb25Ob2RlKDApCisgICAgLCBtX2Nvbm5l
Y3Rpb25Db3VudCgwKQorICAgICwgbV9hdWRpb1RocmVhZCgwKQorICAgICwgbV9ncmFwaE93bmVy
VGhyZWFkKFVuZGVmaW5lZFRocmVhZElkZW50aWZpZXIpCit7CisgICAgLy8gTm90ZTogYmVjYXVz
ZSBhZG9wdFJlZigpIHdvbid0IGJlIGNhbGxlZCB1bnRpbCB3ZSBsZWF2ZSB0aGlzIGNvbnN0cnVj
dG9yLCBidXQgY29kZSBpbiB0aGlzIGNvbnN0cnVjdG9yIG5lZWRzIHRvIHJlZmVyZW5jZSB0aGlz
IGNvbnRleHQsCisgICAgLy8gcmVsYXggdGhlIGNoZWNrLgorICAgIHJlbGF4QWRvcHRpb25SZXF1
aXJlbWVudCgpOworICAgIAorICAgIG1fZGVzdGluYXRpb25Ob2RlID0gQXVkaW9EZXN0aW5hdGlv
bk5vZGU6OmNyZWF0ZSh0aGlzKTsKKyAgICBtX2xpc3RlbmVyID0gQXVkaW9MaXN0ZW5lcjo6Y3Jl
YXRlKCk7CisgICAgbV90ZW1wb3JhcnlNb25vQnVzID0gYWRvcHRQdHIobmV3IEF1ZGlvQnVzKDEs
IEF1ZGlvTm9kZTo6UHJvY2Vzc2luZ1NpemVJbkZyYW1lcykpOworICAgIG1fdGVtcG9yYXJ5U3Rl
cmVvQnVzID0gYWRvcHRQdHIobmV3IEF1ZGlvQnVzKDIsIEF1ZGlvTm9kZTo6UHJvY2Vzc2luZ1Np
emVJbkZyYW1lcykpOworCisgICAgSFJURlBhbm5lcjo6aW5pdGlhbGl6ZUtlcm5lbHMoc2FtcGxl
UmF0ZSgpKTsKK30KKworQXVkaW9Db250ZXh0Ojp+QXVkaW9Db250ZXh0KCkKK3sKKyAgICAvLyBX
aGVuIHRoZSBwYWdlIGlzIHVubG9hZGVkLCBzb21lIHNvdXJjZXMgbWF5IG5vdCBoYXZlIGZpbmlz
aGVkIHBsYXlpbmcgeWV0LiAgU2h1dCB0aGVtIGRvd24uCisgICAgZGVyZWZVbmZpbmlzaGVkU291
cmNlTm9kZXMoKTsKK30KKwordm9pZCBBdWRpb0NvbnRleHQ6OmxhenlJbml0aWFsaXplKCkKK3sK
KyAgICBpZiAoIW1faXNJbml0aWFsaXplZCkgeworICAgICAgICAvLyBEb24ndCBhbGxvdyB0aGUg
Y29udGV4dCB0byBpbml0aWFsaXplIGEgc2Vjb25kIHRpbWUgYWZ0ZXIgaXQncyBhbHJlYWR5IGJl
ZW4gZXhwbGljaXRseSB1bmluaXRpYWxpemVkLgorICAgICAgICBBU1NFUlQoIW1faXNGaW5pc2hl
ZCk7CisgICAgICAgIGlmICghbV9pc0ZpbmlzaGVkKSB7CisgICAgICAgICAgICBpZiAobV9kZXN0
aW5hdGlvbk5vZGUuZ2V0KCkpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIHN0YXJ0cyB0aGUg
YXVkaW8gdGhyZWFkLiAgVGhlIGRlc3RpbmF0aW9uIG5vZGUncyBwcm92aWRlSW5wdXQoKSBtZXRo
b2Qgd2lsbCBub3cgYmUgY2FsbGVkIHJlcGVhdGVkbHkgdG8gcmVuZGVyIGF1ZGlvLgorICAgICAg
ICAgICAgICAgIC8vIEVhY2ggdGltZSBwcm92aWRlSW5wdXQoKSBpcyBjYWxsZWQsIGEgcG9ydGlv
biBvZiB0aGUgYXVkaW8gc3RyZWFtIGlzIHJlbmRlcmVkLiAgTGV0J3MgY2FsbCB0aGlzIHRpbWUg
cGVyaW9kIGEgInJlbmRlciBxdWFudHVtIi4KKyAgICAgICAgICAgICAgICBtX2Rlc3RpbmF0aW9u
Tm9kZS0+aW5pdGlhbGl6ZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbV9pc0luaXRp
YWxpemVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBBdWRpb0NvbnRleHQ6
OnVuaW5pdGlhbGl6ZSgpCit7CisgICAgaWYgKG1faXNJbml0aWFsaXplZCkgeyAgICAKKyAgICAg
ICAgLy8gVGhpcyBzdG9wcyB0aGUgYXVkaW8gdGhyZWFkIGFuZCBhbGwgYXVkaW8gcmVuZGVyaW5n
LgorICAgICAgICBtX2Rlc3RpbmF0aW9uTm9kZS0+dW5pbml0aWFsaXplKCk7CisKKyAgICAgICAg
Ly8gV2UgaGF2ZSB0byByZWxlYXNlIG91ciByZWZlcmVuY2UgdG8gdGhlIGRlc3RpbmF0aW9uIG5v
ZGUgYmVmb3JlIHRoZSBjb250ZXh0IHdpbGwgZXZlciBiZSBkZWxldGVkIHNpbmNlIHRoZSBkZXN0
aW5hdGlvbiBub2RlIGhvbGRzIGEgcmVmZXJlbmNlIHRvIHRoZSBjb250ZXh0LgorICAgICAgICBt
X2Rlc3RpbmF0aW9uTm9kZS5jbGVhcigpOworICAgICAgICAKKyAgICAgICAgLy8gR2V0IHJpZCBv
ZiB0aGUgc291cmNlcyB3aGljaCBtYXkgc3RpbGwgYmUgcGxheWluZy4KKyAgICAgICAgZGVyZWZV
bmZpbmlzaGVkU291cmNlTm9kZXMoKTsKKworICAgICAgICAvLyBCZWNhdXNlIHRoZSBBdWRpb0J1
ZmZlcnMgYXJlIGdhcmJhZ2UgY29sbGVjdGVkLCB3ZSBjYW4ndCBkZWxldGUgdGhlbSBoZXJlLgor
ICAgICAgICAvLyBJbnN0ZWFkLCBhdCBsZWFzdCByZWxlYXNlIHRoZSBwb3RlbnRpYWxseSBsYXJn
ZSBhbW91bnQgb2YgYWxsb2NhdGVkIG1lbW9yeSBmb3IgdGhlIGF1ZGlvIGRhdGEuCisgICAgICAg
IC8vIE5vdGUgdGhhdCB3ZSBkbyB0aGlzICphZnRlciogdGhlIGNvbnRleHQgaXMgdW5pbml0aWFs
aXplZCBhbmQgc3RvcHMgcHJvY2Vzc2luZyBhdWRpby4KKyAgICAgICAgZm9yICh1bnNpZ25lZCBp
ID0gMDsgaSA8IG1fYWxsb2NhdGVkQnVmZmVycy5zaXplKCk7ICsraSkKKyAgICAgICAgICAgIG1f
YWxsb2NhdGVkQnVmZmVyc1tpXS0+cmVsZWFzZU1lbW9yeSgpOworICAgICAgICBtX2FsbG9jYXRl
ZEJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAKKyAgICAgICAgLy8gRG9uJ3QgYWxsb3cgdGhlIGNvbnRl
eHQgdG8gaW5pdGlhbGl6ZSBhIHNlY29uZCB0aW1lIGFmdGVyIGl0J3MgYWxyZWFkeSBiZWVuIGV4
cGxpY2l0bHkgdW5pbml0aWFsaXplZC4KKyAgICAgICAgbV9pc0ZpbmlzaGVkID0gdHJ1ZTsKKwor
ICAgICAgICBtX2lzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICB9Cit9CisKK2Jvb2wgQXVkaW9D
b250ZXh0Ojppc0luaXRpYWxpemVkKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9pc0luaXRpYWxp
emVkOworfQorCit2b2lkIEF1ZGlvQ29udGV4dDo6c3RvcCgpCit7CisgICAgbV9kb2N1bWVudCA9
IDA7IC8vIGRvY3VtZW50IGlzIGdvaW5nIGF3YXkKKyAgICB1bmluaXRpYWxpemUoKTsKK30KKwor
RG9jdW1lbnQqIEF1ZGlvQ29udGV4dDo6ZG9jdW1lbnQoKQoreworICAgIEFTU0VSVChtX2RvY3Vt
ZW50KTsKKyAgICByZXR1cm4gbV9kb2N1bWVudDsKK30KKworYm9vbCBBdWRpb0NvbnRleHQ6Omhh
c0RvY3VtZW50KCkKK3sKKyAgICByZXR1cm4gbV9kb2N1bWVudDsKK30KKwordm9pZCBBdWRpb0Nv
bnRleHQ6OnJlZkJ1ZmZlcihQYXNzUmVmUHRyPEF1ZGlvQnVmZmVyPiBidWZmZXIpCit7CisgICAg
bV9hbGxvY2F0ZWRCdWZmZXJzLmFwcGVuZChidWZmZXIpOworfQorCitQYXNzUmVmUHRyPEF1ZGlv
QnVmZmVyPiBBdWRpb0NvbnRleHQ6OmNyZWF0ZUJ1ZmZlcih1bnNpZ25lZCBudW1iZXJPZkNoYW5u
ZWxzLCBzaXplX3QgbnVtYmVyT2ZGcmFtZXMsIGRvdWJsZSBzYW1wbGVSYXRlKQoreworICAgIHJl
dHVybiBBdWRpb0J1ZmZlcjo6Y3JlYXRlKG51bWJlck9mQ2hhbm5lbHMsIG51bWJlck9mRnJhbWVz
LCBzYW1wbGVSYXRlKTsKK30KKworUGFzc1JlZlB0cjxBdWRpb0J1ZmZlclNvdXJjZU5vZGU+IEF1
ZGlvQ29udGV4dDo6Y3JlYXRlQnVmZmVyU291cmNlKCkKK3sKKyAgICBsYXp5SW5pdGlhbGl6ZSgp
OworICAgIFJlZlB0cjxBdWRpb0J1ZmZlclNvdXJjZU5vZGU+IG5vZGUgPSBBdWRpb0J1ZmZlclNv
dXJjZU5vZGU6OmNyZWF0ZSh0aGlzLCBtX2Rlc3RpbmF0aW9uTm9kZS0+c2FtcGxlUmF0ZSgpKTsK
KworICAgIHJlZk5vZGUobm9kZS5nZXQoKSk7IC8vIGNvbnRleHQga2VlcHMgcmVmZXJlbmNlIHVu
dGlsIHNvdXJjZSBoYXMgZmluaXNoZWQgcGxheWluZworICAgIHJldHVybiBub2RlOworfQorCitQ
YXNzUmVmUHRyPEphdmFTY3JpcHRBdWRpb05vZGU+IEF1ZGlvQ29udGV4dDo6Y3JlYXRlSmF2YVNj
cmlwdE5vZGUoc2l6ZV90IGJ1ZmZlclNpemUpCit7CisgICAgbGF6eUluaXRpYWxpemUoKTsKKyAg
ICBSZWZQdHI8SmF2YVNjcmlwdEF1ZGlvTm9kZT4gbm9kZSA9IEphdmFTY3JpcHRBdWRpb05vZGU6
OmNyZWF0ZSh0aGlzLCBtX2Rlc3RpbmF0aW9uTm9kZS0+c2FtcGxlUmF0ZSgpLCBidWZmZXJTaXpl
KTsKKworICAgIHJlZk5vZGUobm9kZS5nZXQoKSk7IC8vIGNvbnRleHQga2VlcHMgcmVmZXJlbmNl
IHVudGlsIHdlIHN0b3AgbWFraW5nIGphdmFzY3JpcHQgcmVuZGVyaW5nIGNhbGxiYWNrcworICAg
IHJldHVybiBub2RlOworfQorCitQYXNzUmVmUHRyPExvd1Bhc3MyRmlsdGVyTm9kZT4gQXVkaW9D
b250ZXh0OjpjcmVhdGVMb3dQYXNzMkZpbHRlcigpCit7CisgICAgbGF6eUluaXRpYWxpemUoKTsK
KyAgICByZXR1cm4gTG93UGFzczJGaWx0ZXJOb2RlOjpjcmVhdGUodGhpcywgbV9kZXN0aW5hdGlv
bk5vZGUtPnNhbXBsZVJhdGUoKSk7Cit9CisKK1Bhc3NSZWZQdHI8SGlnaFBhc3MyRmlsdGVyTm9k
ZT4gQXVkaW9Db250ZXh0OjpjcmVhdGVIaWdoUGFzczJGaWx0ZXIoKQoreworICAgIGxhenlJbml0
aWFsaXplKCk7CisgICAgcmV0dXJuIEhpZ2hQYXNzMkZpbHRlck5vZGU6OmNyZWF0ZSh0aGlzLCBt
X2Rlc3RpbmF0aW9uTm9kZS0+c2FtcGxlUmF0ZSgpKTsKK30KKworUGFzc1JlZlB0cjxBdWRpb1Bh
bm5lck5vZGU+IEF1ZGlvQ29udGV4dDo6Y3JlYXRlUGFubmVyKCkKK3sKKyAgICBsYXp5SW5pdGlh
bGl6ZSgpOworICAgIHJldHVybiBBdWRpb1Bhbm5lck5vZGU6OmNyZWF0ZSh0aGlzLCBtX2Rlc3Rp
bmF0aW9uTm9kZS0+c2FtcGxlUmF0ZSgpKTsKK30KKworUGFzc1JlZlB0cjxDb252b2x2ZXJOb2Rl
PiBBdWRpb0NvbnRleHQ6OmNyZWF0ZUNvbnZvbHZlcigpCit7CisgICAgbGF6eUluaXRpYWxpemUo
KTsKKyAgICByZXR1cm4gQ29udm9sdmVyTm9kZTo6Y3JlYXRlKHRoaXMsIG1fZGVzdGluYXRpb25O
b2RlLT5zYW1wbGVSYXRlKCkpOworfQorCitQYXNzUmVmUHRyPFJlYWx0aW1lQW5hbHlzZXJOb2Rl
PiBBdWRpb0NvbnRleHQ6OmNyZWF0ZUFuYWx5c2VyKCkKK3sKKyAgICBsYXp5SW5pdGlhbGl6ZSgp
OworICAgIHJldHVybiBSZWFsdGltZUFuYWx5c2VyTm9kZTo6Y3JlYXRlKHRoaXMsIG1fZGVzdGlu
YXRpb25Ob2RlLT5zYW1wbGVSYXRlKCkpOworfQorCitQYXNzUmVmUHRyPEF1ZGlvR2Fpbk5vZGU+
IEF1ZGlvQ29udGV4dDo6Y3JlYXRlR2Fpbk5vZGUoKQoreworICAgIGxhenlJbml0aWFsaXplKCk7
CisgICAgcmV0dXJuIEF1ZGlvR2Fpbk5vZGU6OmNyZWF0ZSh0aGlzLCBtX2Rlc3RpbmF0aW9uTm9k
ZS0+c2FtcGxlUmF0ZSgpKTsKK30KKworUGFzc1JlZlB0cjxEZWxheU5vZGU+IEF1ZGlvQ29udGV4
dDo6Y3JlYXRlRGVsYXlOb2RlKCkKK3sKKyAgICBsYXp5SW5pdGlhbGl6ZSgpOworICAgIHJldHVy
biBEZWxheU5vZGU6OmNyZWF0ZSh0aGlzLCBtX2Rlc3RpbmF0aW9uTm9kZS0+c2FtcGxlUmF0ZSgp
KTsKK30KKworUGFzc1JlZlB0cjxBdWRpb0NoYW5uZWxTcGxpdHRlcj4gQXVkaW9Db250ZXh0Ojpj
cmVhdGVDaGFubmVsU3BsaXR0ZXIoKQoreworICAgIGxhenlJbml0aWFsaXplKCk7CisgICAgcmV0
dXJuIEF1ZGlvQ2hhbm5lbFNwbGl0dGVyOjpjcmVhdGUodGhpcywgbV9kZXN0aW5hdGlvbk5vZGUt
PnNhbXBsZVJhdGUoKSk7Cit9CisKK1Bhc3NSZWZQdHI8QXVkaW9DaGFubmVsTWVyZ2VyPiBBdWRp
b0NvbnRleHQ6OmNyZWF0ZUNoYW5uZWxNZXJnZXIoKQoreworICAgIGxhenlJbml0aWFsaXplKCk7
CisgICAgcmV0dXJuIEF1ZGlvQ2hhbm5lbE1lcmdlcjo6Y3JlYXRlKHRoaXMsIG1fZGVzdGluYXRp
b25Ob2RlLT5zYW1wbGVSYXRlKCkpOworfQorCit2b2lkIEF1ZGlvQ29udGV4dDo6bm90aWZ5Tm9k
ZUZpbmlzaGVkUHJvY2Vzc2luZyhBdWRpb05vZGUqIG5vZGUpCit7CisgICAgbV9maW5pc2hlZE5v
ZGVzLmFwcGVuZChub2RlKTsKK30KKwordm9pZCBBdWRpb0NvbnRleHQ6OmRlcmVmRmluaXNoZWRT
b3VyY2VOb2RlcygpCit7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG1fZmluaXNoZWRO
b2Rlcy5zaXplKCk7IGkrKykKKyAgICAgICAgZGVyZWZOb2RlKG1fZmluaXNoZWROb2Rlc1tpXSk7
CisKKyAgICBtX2ZpbmlzaGVkTm9kZXMuY2xlYXIoKTsKK30KKwordm9pZCBBdWRpb0NvbnRleHQ6
OnJlZk5vZGUoQXVkaW9Ob2RlKiBub2RlKQoreworICAgIG5vZGUtPnJlZihBdWRpb05vZGU6OlJl
ZlR5cGVDb25uZWN0aW9uKTsKKyAgICBtX3JlZmVyZW5jZWROb2Rlcy5hcHBlbmQobm9kZSk7Cit9
CisKK3ZvaWQgQXVkaW9Db250ZXh0OjpkZXJlZk5vZGUoQXVkaW9Ob2RlKiBub2RlKQoreworICAg
IG5vZGUtPmRlcmVmKEF1ZGlvTm9kZTo6UmVmVHlwZUNvbm5lY3Rpb24pOworCisgICAgZm9yICh1
bnNpZ25lZCBpID0gMDsgaSA8IG1fcmVmZXJlbmNlZE5vZGVzLnNpemUoKTsgKytpKSB7CisgICAg
ICAgIGlmIChub2RlID09IG1fcmVmZXJlbmNlZE5vZGVzW2ldKSB7CisgICAgICAgICAgICBtX3Jl
ZmVyZW5jZWROb2Rlcy5yZW1vdmUoaSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQor
ICAgIH0KK30KKwordm9pZCBBdWRpb0NvbnRleHQ6OmRlcmVmVW5maW5pc2hlZFNvdXJjZU5vZGVz
KCkKK3sKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbV9yZWZlcmVuY2VkTm9kZXMuc2l6
ZSgpOyArK2kpCisgICAgICAgIG1fcmVmZXJlbmNlZE5vZGVzW2ldLT5kZXJlZihBdWRpb05vZGU6
OlJlZlR5cGVDb25uZWN0aW9uKTsKKworICAgIG1fcmVmZXJlbmNlZE5vZGVzLmNsZWFyKCk7Cit9
CisKK3ZvaWQgQXVkaW9Db250ZXh0OjptYXJrRm9yRGVsZXRpb24oQXVkaW9Ob2RlKiBub2RlKQor
eworICAgIEFTU0VSVChpc0F1ZGlvVGhyZWFkKCkpOyAgICAKKyAgICBtX25vZGVzVG9EZWxldGUu
YXBwZW5kKG5vZGUpOworfQorCit2b2lkIEF1ZGlvQ29udGV4dDo6ZGVsZXRlTWFya2VkTm9kZXMo
KQoreworICAgIEFTU0VSVChpc0F1ZGlvVGhyZWFkKCkpOworICAgIAorICAgIGZvciAodW5zaWdu
ZWQgaSA9IDA7IGkgPCBtX25vZGVzVG9EZWxldGUuc2l6ZSgpOyArK2kpCisgICAgICAgIGRlbGV0
ZSBtX25vZGVzVG9EZWxldGVbaV07CisKKyAgICBtX25vZGVzVG9EZWxldGUuY2xlYXIoKTsKK30K
KworYm9vbCBBdWRpb0NvbnRleHQ6OmlzQXVkaW9UaHJlYWQoKQoreworICAgIHJldHVybiBjdXJy
ZW50VGhyZWFkKCkgPT0gbV9hdWRpb1RocmVhZDsKK30KKworCit2b2lkIEF1ZGlvQ29udGV4dDo6
bG9jayhib29sJiBtdXN0UmVsZWFzZUxvY2spCit7CisgICAgLy8gRG9uJ3QgYWxsb3cgcmVndWxh
ciBsb2NrIGluIHJlYWwtdGltZSBhdWRpbyB0aHJlYWQuCisgICAgQVNTRVJUKGlzTWFpblRocmVh
ZCgpKTsKKworICAgIFRocmVhZElkZW50aWZpZXIgdGhpc1RocmVhZCA9IGN1cnJlbnRUaHJlYWQo
KTsKKworICAgIGlmICh0aGlzVGhyZWFkID09IG1fZ3JhcGhPd25lclRocmVhZCkgeworICAgICAg
ICAvLyBXZSBhbHJlYWR5IGhhdmUgdGhlIGxvY2suCisgICAgICAgIG11c3RSZWxlYXNlTG9jayA9
IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEFjcXVpcmUgdGhlIGxvY2suCisgICAg
ICAgIG1fY29udGV4dEdyYXBoTXV0ZXgubG9jaygpOworICAgICAgICBtdXN0UmVsZWFzZUxvY2sg
PSB0cnVlOworICAgIH0KKworICAgIG1fZ3JhcGhPd25lclRocmVhZCA9IHRoaXNUaHJlYWQ7Cit9
CisKK2Jvb2wgQXVkaW9Db250ZXh0Ojp0cnlMb2NrKGJvb2wmIG11c3RSZWxlYXNlTG9jaykKK3sK
KyAgICBUaHJlYWRJZGVudGlmaWVyIHRoaXNUaHJlYWQgPSBjdXJyZW50VGhyZWFkKCk7CisgICAg
Ym9vbCBpc0F1ZGlvVGhyZWFkID0gdGhpc1RocmVhZCA9PSBhdWRpb1RocmVhZCgpOworCisgICAg
Ly8gVHJ5IHRvIGNhdGNoIGNhc2VzIG9mIHVzaW5nIHRyeSBsb2NrIG9uIG1haW4gdGhyZWFkIC0g
aXQgc2hvdWxkIHVzZSByZWd1bGFyIGxvY2suCisgICAgQVNTRVJUKGlzQXVkaW9UaHJlYWQpOwor
ICAgIAorICAgIGlmICghaXNBdWRpb1RocmVhZCkgeworICAgICAgICAvLyBJbiByZWxlYXNlIGJ1
aWxkIHRyZWF0IHRyeUxvY2soKSBhcyBsb2NrKCkgKHNpbmNlIGFib3ZlIEFTU0VSVChpc0F1ZGlv
VGhyZWFkKSBuZXZlciBmaXJlcykgLSB0aGlzIGlzIHRoZSBiZXN0IHdlIGNhbiBkby4KKyAgICAg
ICAgbG9jayhtdXN0UmVsZWFzZUxvY2spOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9Cisg
ICAgCisgICAgYm9vbCBoYXNMb2NrOworICAgIAorICAgIGlmICh0aGlzVGhyZWFkID09IG1fZ3Jh
cGhPd25lclRocmVhZCkgeworICAgICAgICAvLyBUaHJlYWQgYWxyZWFkeSBoYXMgdGhlIGxvY2su
CisgICAgICAgIGhhc0xvY2sgPSB0cnVlOworICAgICAgICBtdXN0UmVsZWFzZUxvY2sgPSBmYWxz
ZTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBEb24ndCBhbHJlYWR5IGhhdmUgdGhlIGxvY2sg
LSB0cnkgdG8gYWNxdWlyZSBpdC4KKyAgICAgICAgaGFzTG9jayA9IG1fY29udGV4dEdyYXBoTXV0
ZXgudHJ5TG9jaygpOworICAgICAgICBpZiAoaGFzTG9jaykKKyAgICAgICAgICAgIG1fZ3JhcGhP
d25lclRocmVhZCA9IHRoaXNUaHJlYWQ7ICAgICAgICAgICAgCisKKyAgICAgICAgbXVzdFJlbGVh
c2VMb2NrID0gaGFzTG9jazsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIGhhc0xvY2s7Cit9CisK
K3ZvaWQgQXVkaW9Db250ZXh0Ojp1bmxvY2soKQoreworICAgIEFTU0VSVChjdXJyZW50VGhyZWFk
KCkgPT0gbV9ncmFwaE93bmVyVGhyZWFkKTsKKworICAgIG1fY29udGV4dEdyYXBoTXV0ZXgudW5s
b2NrKCk7CisgICAgbV9ncmFwaE93bmVyVGhyZWFkID0gVW5kZWZpbmVkVGhyZWFkSWRlbnRpZmll
cjsKK30KKwordm9pZCBBdWRpb0NvbnRleHQ6OmFkZERlZmVycmVkRmluaXNoRGVyZWYoQXVkaW9O
b2RlKiBub2RlLCBBdWRpb05vZGU6OlJlZlR5cGUgcmVmVHlwZSkKK3sKKyAgICBtX2RlZmVycmVk
RmluaXNoRGVyZWZMaXN0LmFwcGVuZChBdWRpb0NvbnRleHQ6OlJlZkluZm8obm9kZSwgcmVmVHlw
ZSkpOworfQorCit2b2lkIEF1ZGlvQ29udGV4dDo6aGFuZGxlRGVmZXJyZWRGaW5pc2hEZXJlZnMo
KQoreworICAgIC8vIERvbid0IGJvdGhlciB0YWtpbmcgdGhlIGxvY2sgaWYgd2UgZG9uJ3QgbmVl
ZCBpdC4KKyAgICBpZiAoIW1fZGVmZXJyZWRGaW5pc2hEZXJlZkxpc3Quc2l6ZSgpKQorICAgICAg
ICByZXR1cm47CisgICAgICAgIAorICAgIC8vIE11c3QgdXNlIGEgdHJ5TG9jaygpIGhlcmUgdG9v
LiAgRG9uJ3Qgd29ycnksIHRoZSBsb2NrIHdpbGwgdmVyeSByYXJlbHkgYmUgY29udGVuZGVkIGFu
ZCB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgZnJlcXVlbnRseS4KKyAgICAvLyBUaGUgd29yc3QgdGhh
dCBjYW4gaGFwcGVuIGlzIHRoYXQgdGhlcmUgd2lsbCBiZSBzb21lIG5vZGVzIHdoaWNoIHdpbGwg
dGFrZSBzbGlnaHRseSBsb25nZXIgdGhhbiB1c3VhbCB0byBiZSByZW1vdmVkCisgICAgLy8gZnJv
bSB0aGUgcmVuZGVyIGdyYXBoLgorICAgIGJvb2wgbXVzdFJlbGVhc2VMb2NrOworICAgIGlmICh0
cnlMb2NrKG11c3RSZWxlYXNlTG9jaykpIHsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsg
aSA8IG1fZGVmZXJyZWRGaW5pc2hEZXJlZkxpc3Quc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAg
IEF1ZGlvTm9kZSogbm9kZSA9IG1fZGVmZXJyZWRGaW5pc2hEZXJlZkxpc3RbaV0ubV9ub2RlOwor
ICAgICAgICAgICAgQXVkaW9Ob2RlOjpSZWZUeXBlIHJlZlR5cGUgPSBtX2RlZmVycmVkRmluaXNo
RGVyZWZMaXN0W2ldLm1fcmVmVHlwZTsKKyAgICAgICAgICAgIG5vZGUtPmZpbmlzaERlcmVmKHJl
ZlR5cGUpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBtX2RlZmVycmVkRmluaXNoRGVy
ZWZMaXN0LmNsZWFyKCk7CisgICAgICAgIAorICAgICAgICBpZiAobXVzdFJlbGVhc2VMb2NrKQor
ICAgICAgICAgICAgdW5sb2NrKCk7CisgICAgfQorfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3Jl
CisKKyNlbmRpZiAvLyBFTkFCTEUoV0VCX0FVRElPKQpJbmRleDogV2ViQ29yZS93ZWJhdWRpby9B
dWRpb0NvbnRleHQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3dlYmF1ZGlvL0F1ZGlvQ29udGV4
dC5oCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS93ZWJhdWRpby9BdWRpb0NvbnRleHQuaAkocmV2
aXNpb24gMCkKQEAgLTAsMCArMSwyMjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29v
Z2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAg
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuICBO
ZWl0aGVyIHRoZSBuYW1lIG9mIEFwcGxlIENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBub3IgdGhl
IG5hbWVzIG9mCisgKiAgICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNl
IG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3
aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIg
QU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xB
SU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsK
KyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIEF1ZGlvQ29udGV4dF9oCisjZGVm
aW5lIEF1ZGlvQ29udGV4dF9oCisKKyNpbmNsdWRlICJBY3RpdmVET01PYmplY3QuaCIKKyNpbmNs
dWRlICJBdWRpb0J1cy5oIgorI2luY2x1ZGUgIkF1ZGlvRGVzdGluYXRpb25Ob2RlLmgiCisjaW5j
bHVkZSA8d3RmL093blB0ci5oPgorI2luY2x1ZGUgPHd0Zi9QYXNzUmVmUHRyLmg+CisjaW5jbHVk
ZSA8d3RmL1JlZkNvdW50ZWQuaD4KKyNpbmNsdWRlIDx3dGYvUmVmUHRyLmg+CisjaW5jbHVkZSA8
d3RmL1RocmVhZGluZy5oPgorI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKyNpbmNsdWRlIDx3dGYv
dGV4dC9BdG9taWNTdHJpbmdIYXNoLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3Mg
QXVkaW9CdWZmZXI7CitjbGFzcyBBdWRpb0J1ZmZlclNvdXJjZU5vZGU7CitjbGFzcyBBdWRpb0No
YW5uZWxNZXJnZXI7CitjbGFzcyBBdWRpb0NoYW5uZWxTcGxpdHRlcjsKK2NsYXNzIEF1ZGlvR2Fp
bk5vZGU7CitjbGFzcyBBdWRpb1Bhbm5lck5vZGU7CitjbGFzcyBBdWRpb0xpc3RlbmVyOworY2xh
c3MgQ2FjaGVkQXVkaW87CitjbGFzcyBEZWxheU5vZGU7CitjbGFzcyBEb2N1bWVudDsKK2NsYXNz
IExvd1Bhc3MyRmlsdGVyTm9kZTsKK2NsYXNzIEhpZ2hQYXNzMkZpbHRlck5vZGU7CitjbGFzcyBD
b252b2x2ZXJOb2RlOworY2xhc3MgUmVhbHRpbWVBbmFseXNlck5vZGU7CitjbGFzcyBKYXZhU2Ny
aXB0QXVkaW9Ob2RlOworCitjbGFzcyBBdWRpb0NvbnRleHQgOiBwdWJsaWMgQWN0aXZlRE9NT2Jq
ZWN0LCBwdWJsaWMgUmVmQ291bnRlZDxBdWRpb0NvbnRleHQ+IHsKK3B1YmxpYzoKKyAgICBzdGF0
aWMgUGFzc1JlZlB0cjxBdWRpb0NvbnRleHQ+IGNyZWF0ZShEb2N1bWVudCopOworCisgICAgdmly
dHVhbCB+QXVkaW9Db250ZXh0KCk7CisKKyAgICBib29sIGlzSW5pdGlhbGl6ZWQoKSBjb25zdDsK
KworICAgIC8vIERvY3VtZW50IG5vdGlmaWNhdGlvbgorICAgIHZpcnR1YWwgdm9pZCBzdG9wKCk7
CisKKyAgICBEb2N1bWVudCogZG9jdW1lbnQoKTsgLy8gQVNTRVJUcyBpZiBkb2N1bWVudCBubyBs
b25nZXIgZXhpc3RzLgorICAgIGJvb2wgaGFzRG9jdW1lbnQoKTsKKworICAgIEF1ZGlvRGVzdGlu
YXRpb25Ob2RlKiBkZXN0aW5hdGlvbigpIHsgcmV0dXJuIG1fZGVzdGluYXRpb25Ob2RlLmdldCgp
OyB9CisgICAgZG91YmxlIGN1cnJlbnRUaW1lKCkgeyByZXR1cm4gbV9kZXN0aW5hdGlvbk5vZGUt
PmN1cnJlbnRUaW1lKCk7IH0KKyAgICBkb3VibGUgc2FtcGxlUmF0ZSgpIHsgcmV0dXJuIG1fZGVz
dGluYXRpb25Ob2RlLT5zYW1wbGVSYXRlKCk7IH0KKworICAgIFBhc3NSZWZQdHI8QXVkaW9CdWZm
ZXI+IGNyZWF0ZUJ1ZmZlcih1bnNpZ25lZCBudW1iZXJPZkNoYW5uZWxzLCBzaXplX3QgbnVtYmVy
T2ZGcmFtZXMsIGRvdWJsZSBzYW1wbGVSYXRlKTsKKworICAgIC8vIEtlZXAgdHJhY2sgb2YgdGhp
cyBidWZmZXIgc28gd2UgY2FuIHJlbGVhc2UgbWVtb3J5IGFmdGVyIHRoZSBjb250ZXh0IGlzIHNo
dXQgZG93bi4uLgorICAgIHZvaWQgcmVmQnVmZmVyKFBhc3NSZWZQdHI8QXVkaW9CdWZmZXI+IGJ1
ZmZlcik7CisKKyAgICBBdWRpb0xpc3RlbmVyKiBsaXN0ZW5lcigpIHsgcmV0dXJuIG1fbGlzdGVu
ZXIuZ2V0KCk7IH0KKworICAgIFBhc3NSZWZQdHI8QXVkaW9CdWZmZXJTb3VyY2VOb2RlPiBjcmVh
dGVCdWZmZXJTb3VyY2UoKTsKKyAgICBQYXNzUmVmUHRyPEF1ZGlvR2Fpbk5vZGU+IGNyZWF0ZUdh
aW5Ob2RlKCk7CisgICAgUGFzc1JlZlB0cjxEZWxheU5vZGU+IGNyZWF0ZURlbGF5Tm9kZSgpOwor
ICAgIFBhc3NSZWZQdHI8TG93UGFzczJGaWx0ZXJOb2RlPiBjcmVhdGVMb3dQYXNzMkZpbHRlcigp
OworICAgIFBhc3NSZWZQdHI8SGlnaFBhc3MyRmlsdGVyTm9kZT4gY3JlYXRlSGlnaFBhc3MyRmls
dGVyKCk7CisgICAgUGFzc1JlZlB0cjxBdWRpb1Bhbm5lck5vZGU+IGNyZWF0ZVBhbm5lcigpOwor
ICAgIFBhc3NSZWZQdHI8Q29udm9sdmVyTm9kZT4gY3JlYXRlQ29udm9sdmVyKCk7CisgICAgUGFz
c1JlZlB0cjxSZWFsdGltZUFuYWx5c2VyTm9kZT4gY3JlYXRlQW5hbHlzZXIoKTsKKyAgICBQYXNz
UmVmUHRyPEphdmFTY3JpcHRBdWRpb05vZGU+IGNyZWF0ZUphdmFTY3JpcHROb2RlKHNpemVfdCBi
dWZmZXJTaXplKTsKKworICAgIFBhc3NSZWZQdHI8QXVkaW9DaGFubmVsU3BsaXR0ZXI+IGNyZWF0
ZUNoYW5uZWxTcGxpdHRlcigpOworICAgIFBhc3NSZWZQdHI8QXVkaW9DaGFubmVsTWVyZ2VyPiBj
cmVhdGVDaGFubmVsTWVyZ2VyKCk7CisKKyAgICBBdWRpb0J1cyogdGVtcG9yYXJ5TW9ub0J1cygp
IHsgcmV0dXJuIG1fdGVtcG9yYXJ5TW9ub0J1cy5nZXQoKTsgfQorICAgIEF1ZGlvQnVzKiB0ZW1w
b3JhcnlTdGVyZW9CdXMoKSB7IHJldHVybiBtX3RlbXBvcmFyeVN0ZXJlb0J1cy5nZXQoKTsgfQor
CisgICAgLy8gV2hlbiBhIHNvdXJjZSBub2RlIGhhcyBubyBtb3JlIHByb2Nlc3NpbmcgdG8gZG8g
KGhhcyBmaW5pc2hlZCBwbGF5aW5nKSwgdGhlbiBpdCB0ZWxscyB0aGUgY29udGV4dCB0byBkZXJl
ZmVyZW5jZSBpdC4KKyAgICB2b2lkIG5vdGlmeU5vZGVGaW5pc2hlZFByb2Nlc3NpbmcoQXVkaW9O
b2RlKik7CisKKyAgICAvLyBDYWxsZWQgcGVyaW9kaWNhbGx5IGF0IHRoZSBlbmQgb2YgZWFjaCBy
ZW5kZXIgcXVhbnR1bSB0byBkZXJlZmVyZW5jZSBmaW5pc2hlZCBzb3VyY2Ugbm9kZXMuCisgICAg
dm9pZCBkZXJlZkZpbmlzaGVkU291cmNlTm9kZXMoKTsKKworICAgIC8vIFdlIHJlYXAgYWxsIG1h
cmtlZCBub2RlcyBhdCB0aGUgZW5kIG9mIGVhY2ggcmVhbHRpbWUgcmVuZGVyIHF1YW50dW0gaW4g
ZGVsZXRlTWFya2VkTm9kZXMoKS4KKyAgICB2b2lkIG1hcmtGb3JEZWxldGlvbihBdWRpb05vZGUq
KTsKKyAgICB2b2lkIGRlbGV0ZU1hcmtlZE5vZGVzKCk7CisKKyAgICAvLyBLZWVwcyB0cmFjayBv
ZiB0aGUgbnVtYmVyIG9mIGNvbm5lY3Rpb25zIG1hZGUuCisgICAgdm9pZCBpbmNyZW1lbnRDb25u
ZWN0aW9uQ291bnQoKQorICAgIHsKKyAgICAgICAgbV9jb25uZWN0aW9uQ291bnQrKzsKKyAgICB9
CisKKyAgICB1bnNpZ25lZCBjb25uZWN0aW9uQ291bnQoKSBjb25zdCB7IHJldHVybiBtX2Nvbm5l
Y3Rpb25Db3VudDsgfQorCisgICAgLy8KKyAgICAvLyBUaHJlYWQgU2FmZXR5IGFuZCBHcmFwaCBM
b2NraW5nOgorICAgIC8vCisgICAgCisgICAgdm9pZCBzZXRBdWRpb1RocmVhZChUaHJlYWRJZGVu
dGlmaWVyIHRocmVhZCkgeyBtX2F1ZGlvVGhyZWFkID0gdGhyZWFkOyB9CisgICAgVGhyZWFkSWRl
bnRpZmllciBhdWRpb1RocmVhZCgpIGNvbnN0IHsgcmV0dXJuIG1fYXVkaW9UaHJlYWQ7IH0KKyAg
ICBib29sIGlzQXVkaW9UaHJlYWQoKTsKKyAgICAKKyAgICAvLyBtdXN0UmVsZWFzZUxvY2sgaXMg
c2V0IHRvIHRydWUgaWYgd2UgYWNxdWlyZWQgdGhlIGxvY2sgaW4gdGhpcyBtZXRob2QgY2FsbCBh
bmQgY2FsbGVyIG11c3QgdW5sb2NrKCksIGZhbHNlIGlmIGl0IHdhcyBwcmV2aW91c2x5IGFjcXVp
cmVkLgorICAgIHZvaWQgbG9jayhib29sJiBtdXN0UmVsZWFzZUxvY2spOworCisgICAgLy8gUmV0
dXJucyB0cnVlIGlmIHdlIG93biB0aGUgbG9jay4KKyAgICAvLyBtdXN0UmVsZWFzZUxvY2sgaXMg
c2V0IHRvIHRydWUgaWYgd2UgYWNxdWlyZWQgdGhlIGxvY2sgaW4gdGhpcyBtZXRob2QgY2FsbCBh
bmQgY2FsbGVyIG11c3QgdW5sb2NrKCksIGZhbHNlIGlmIGl0IHdhcyBwcmV2aW91c2x5IGFjcXVp
cmVkLgorICAgIGJvb2wgdHJ5TG9jayhib29sJiBtdXN0UmVsZWFzZUxvY2spOworCisgICAgdm9p
ZCB1bmxvY2soKTsKKworICAgIGNsYXNzIEF1dG9Mb2NrZXIgeworICAgIHB1YmxpYzoKKyAgICAg
ICAgQXV0b0xvY2tlcihBdWRpb0NvbnRleHQqIGNvbnRleHQpCisgICAgICAgICAgICA6IG1fY29u
dGV4dChjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBBU1NFUlQoY29udGV4dCk7Cisg
ICAgICAgICAgICBjb250ZXh0LT5sb2NrKG1fbXVzdFJlbGVhc2VMb2NrKTsKKyAgICAgICAgfQor
ICAgICAgICAKKyAgICAgICAgfkF1dG9Mb2NrZXIoKQorICAgICAgICB7CisgICAgICAgICAgICBp
ZiAobV9tdXN0UmVsZWFzZUxvY2spCisgICAgICAgICAgICAgICAgbV9jb250ZXh0LT51bmxvY2so
KTsKKyAgICAgICAgfQorICAgIHByaXZhdGU6CisgICAgICAgIEF1ZGlvQ29udGV4dCogbV9jb250
ZXh0OworICAgICAgICBib29sIG1fbXVzdFJlbGVhc2VMb2NrOworICAgIH07CisgICAgCisgICAg
Ly8gSW4gQXVkaW9Ob2RlOjpkZXJlZigpIGEgdHJ5TG9jaygpIGlzIHVzZWQgZm9yIGNhbGxpbmcg
ZmluaXNoRGVyZWYoKSwgYnV0IGlmIGl0IGZhaWxzIGtlZXAgdHJhY2sgaGVyZS4KKyAgICB2b2lk
IGFkZERlZmVycmVkRmluaXNoRGVyZWYoQXVkaW9Ob2RlKiwgQXVkaW9Ob2RlOjpSZWZUeXBlKTsK
KworICAgIC8vIEluIHRoZSBhdWRpbyB0aHJlYWQgYXQgdGhlIHN0YXJ0IG9mIGVhY2ggcmVuZGVy
IGN5Y2xlLCB3ZSdsbCBjYWxsIGhhbmRsZURlZmVycmVkRmluaXNoRGVyZWZzKCkuCisgICAgdm9p
ZCBoYW5kbGVEZWZlcnJlZEZpbmlzaERlcmVmcygpOworICAgIAorcHJpdmF0ZToKKyAgICBBdWRp
b0NvbnRleHQoRG9jdW1lbnQqKTsKKyAgICB2b2lkIGxhenlJbml0aWFsaXplKCk7CisgICAgdm9p
ZCB1bmluaXRpYWxpemUoKTsKKyAgICAKKyAgICBib29sIG1faXNJbml0aWFsaXplZDsKKyAgICBi
b29sIG1faXNGaW5pc2hlZDsKKworICAgIERvY3VtZW50KiBtX2RvY3VtZW50OworCisgICAgLy8g
VGhlIGNvbnRleHQgaXRzZWxmIGtlZXBzIGEgcmVmZXJlbmNlIHRvIGFsbCBzb3VyY2Ugbm9kZXMu
ICBUaGUgc291cmNlIG5vZGVzLCB0aGVuIHJlZmVyZW5jZSBhbGwgbm9kZXMgdGhleSdyZSBjb25u
ZWN0ZWQgdG8uCisgICAgLy8gSW4gdHVybiwgdGhlc2Ugbm9kZXMgcmVmZXJlbmNlIGFsbCBub2Rl
cyB0aGV5J3JlIGNvbm5lY3RlZCB0by4gIEFsbCBub2RlcyBhcmUgdWx0aW1hdGVseSBjb25uZWN0
ZWQgdG8gdGhlIEF1ZGlvRGVzdGluYXRpb25Ob2RlLgorICAgIC8vIFdoZW4gdGhlIGNvbnRleHQg
ZGVyZWZlcmVuY2VzIGEgc291cmNlIG5vZGUsIGl0IHdpbGwgYmUgZGVhY3RpdmF0ZWQgZnJvbSB0
aGUgcmVuZGVyaW5nIGdyYXBoIGFsb25nIHdpdGggYWxsIG90aGVyIG5vZGVzIGl0IGlzCisgICAg
Ly8gdW5pcXVlbHkgY29ubmVjdGVkIHRvLiAgU2VlIHRoZSBBdWRpb05vZGU6OnJlZigpIGFuZCBB
dWRpb05vZGU6OmRlcmVmKCkgbWV0aG9kcyBmb3IgbW9yZSBkZXRhaWxzLgorICAgIHZvaWQgcmVm
Tm9kZShBdWRpb05vZGUqKTsKKyAgICB2b2lkIGRlcmVmTm9kZShBdWRpb05vZGUqKTsKKworICAg
IC8vIFdoZW4gdGhlIGNvbnRleHQgZ29lcyBhd2F5LCB0aGVyZSBtaWdodCBzdGlsbCBiZSBzb21l
IHNvdXJjZXMgd2hpY2ggaGF2ZW4ndCBmaW5pc2hlZCBwbGF5aW5nLgorICAgIC8vIE1ha2Ugc3Vy
ZSB0byBkZXJlZmVyZW5jZSB0aGVtIGhlcmUuCisgICAgdm9pZCBkZXJlZlVuZmluaXNoZWRTb3Vy
Y2VOb2RlcygpOworCisgICAgUmVmUHRyPEF1ZGlvRGVzdGluYXRpb25Ob2RlPiBtX2Rlc3RpbmF0
aW9uTm9kZTsKKyAgICBSZWZQdHI8QXVkaW9MaXN0ZW5lcj4gbV9saXN0ZW5lcjsKKworICAgIFZl
Y3RvcjxSZWZQdHI8QXVkaW9CdWZmZXI+ID4gbV9hbGxvY2F0ZWRCdWZmZXJzOworICAgIFZlY3Rv
cjxBdWRpb05vZGUqPiBtX2ZpbmlzaGVkTm9kZXM7CisKKyAgICAvLyBXZSBkb24ndCB1c2UgUmVm
UHRyPEF1ZGlvTm9kZT4gaGVyZSBiZWNhdXNlIEF1ZGlvTm9kZSBoYXMgYSBtb3JlIGNvbXBsZXgg
cmVmKCkgLyBkZXJlZigpIGltcGxlbWVudGF0aW9uCisgICAgLy8gd2l0aCBhbiBvcHRpb25hbCBh
cmd1bWVudCBmb3IgcmVmVHlwZS4gIFdlIG5lZWQgdG8gdXNlIHRoZSBzcGVjaWFsIHJlZlR5cGU6
IFJlZlR5cGVDb25uZWN0aW9uCisgICAgVmVjdG9yPEF1ZGlvTm9kZSo+IG1fcmVmZXJlbmNlZE5v
ZGVzOworCisgICAgLy8gQWNjdW11bGF0ZSBub2RlcyB3aGljaCBuZWVkIHRvIGJlIGRlbGV0ZWQg
YXQgdGhlIGVuZCBvZiBhIHJlbmRlciBjeWNsZSAoaW4gcmVhbHRpbWUgdGhyZWFkKSBoZXJlLgor
ICAgIFZlY3RvcjxBdWRpb05vZGUqPiBtX25vZGVzVG9EZWxldGU7CisKKyAgICBWZWN0b3I8UmVm
UHRyPENhY2hlZEF1ZGlvPiA+IG1fY2FjaGVkQXVkaW9SZWZlcmVuY2VzOworCisgICAgT3duUHRy
PEF1ZGlvQnVzPiBtX3RlbXBvcmFyeU1vbm9CdXM7CisgICAgT3duUHRyPEF1ZGlvQnVzPiBtX3Rl
bXBvcmFyeVN0ZXJlb0J1czsKKworICAgIHVuc2lnbmVkIG1fY29ubmVjdGlvbkNvdW50OworCisg
ICAgLy8gR3JhcGggbG9ja2luZy4KKyAgICBNdXRleCBtX2NvbnRleHRHcmFwaE11dGV4OworICAg
IHZvbGF0aWxlIFRocmVhZElkZW50aWZpZXIgbV9hdWRpb1RocmVhZDsKKyAgICB2b2xhdGlsZSBU
aHJlYWRJZGVudGlmaWVyIG1fZ3JhcGhPd25lclRocmVhZDsgLy8gaWYgdGhlIGxvY2sgaXMgaGVs
ZCB0aGVuIHRoaXMgaXMgdGhlIHRocmVhZCB3aGljaCBvd25zIGl0LCBvdGhlcndpc2UgPT0gVW5k
ZWZpbmVkVGhyZWFkSWRlbnRpZmllcgorICAgIAorICAgIC8vIERlZmVycmVkIGRlLXJlZmVyZW5j
aW5nLgorICAgIHN0cnVjdCBSZWZJbmZvIHsKKyAgICAgICAgUmVmSW5mbyhBdWRpb05vZGUqIG5v
ZGUsIEF1ZGlvTm9kZTo6UmVmVHlwZSByZWZUeXBlKQorICAgICAgICAgICAgOiBtX25vZGUobm9k
ZSkKKyAgICAgICAgICAgICwgbV9yZWZUeXBlKHJlZlR5cGUpCisgICAgICAgIHsKKyAgICAgICAg
fQorICAgICAgICBBdWRpb05vZGUqIG1fbm9kZTsKKyAgICAgICAgQXVkaW9Ob2RlOjpSZWZUeXBl
IG1fcmVmVHlwZTsKKyAgICB9OworICAgIAorICAgIFZlY3RvcjxSZWZJbmZvPiBtX2RlZmVycmVk
RmluaXNoRGVyZWZMaXN0OworfTsKKworfSAvLyBXZWJDb3JlCisKKyNlbmRpZiAvLyBBdWRpb0Nv
bnRleHRfaApJbmRleDogV2ViQ29yZS93ZWJhdWRpby9BdWRpb0NvbnRleHQuaWRsCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFdlYkNvcmUvd2ViYXVkaW8vQXVkaW9Db250ZXh0LmlkbAkocmV2aXNpb24gMCkKKysr
IFdlYkNvcmUvd2ViYXVkaW8vQXVkaW9Db250ZXh0LmlkbAkocmV2aXNpb24gMCkKQEAgLTAsMCAr
MSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0Ogor
ICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJv
dmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gIE5laXRoZXIgdGhlIG5hbWUgb2Yg
QXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMgb2YKKyAqICAgICBp
dHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0
cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJp
b3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNT
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRI
RSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVF
TlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJF
TUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERB
VEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQg
QU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LgorICovCisKK21vZHVsZSB3ZWJhdWRpbyB7CisgICAgaW50ZXJmYWNlIFsKKyAgICAgICAgQ29u
ZGl0aW9uYWw9V0VCX0FVRElPLAorICAgICAgICBDYW5CZUNvbnN0cnVjdGVkLAorICAgICAgICBD
dXN0b21Db25zdHJ1Y3RGdW5jdGlvbiwKKyAgICAgICAgVjhDdXN0b21Db25zdHJ1Y3RvcgorICAg
IF0gQXVkaW9Db250ZXh0IHsKKyAgICAgICAgLy8gQWxsIHJlbmRlcmVkIGF1ZGlvIHVsdGltYXRl
bHkgY29ubmVjdHMgdG8gZGVzdGluYXRpb24sIHdoaWNoIHJlcHJlc2VudHMgdGhlIGF1ZGlvIGhh
cmR3YXJlLgorICAgICAgICByZWFkb25seSBhdHRyaWJ1dGUgQXVkaW9EZXN0aW5hdGlvbk5vZGUg
ZGVzdGluYXRpb247CisKKyAgICAgICAgLy8gQWxsIHNjaGVkdWxlZCB0aW1lcyBhcmUgcmVsYXRp
dmUgdG8gdGhpcyB0aW1lIGluIHNlY29uZHMuCisgICAgICAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBm
bG9hdCBjdXJyZW50VGltZTsKKworICAgICAgICAvLyBBbGwgQXVkaW9Ob2RlcyBpbiB0aGUgY29u
dGV4dCBydW4gYXQgdGhpcyBzYW1wbGUtcmF0ZSAoaW4gc2FtcGxlLWZyYW1lcyBwZXIgc2Vjb25k
KS4KKyAgICAgICAgcmVhZG9ubHkgYXR0cmlidXRlIGZsb2F0IHNhbXBsZVJhdGU7CisKKyAgICAg
ICAgLy8gQWxsIHBhbm5pbmcgaXMgcmVsYXRpdmUgdG8gdGhpcyBsaXN0ZW5lci4KKyAgICAgICAg
cmVhZG9ubHkgYXR0cmlidXRlIEF1ZGlvTGlzdGVuZXIgbGlzdGVuZXI7CisKKyAgICAgICAgQXVk
aW9CdWZmZXIgY3JlYXRlQnVmZmVyKGluIHVuc2lnbmVkIGxvbmcgbnVtYmVyT2ZDaGFubmVscywg
aW4gdW5zaWduZWQgbG9uZyBudW1iZXJPZkZyYW1lcywgaW4gZmxvYXQgc2FtcGxlUmF0ZSk7CisK
KyAgICAgICAgLy8gU291cmNlCisgICAgICAgIEF1ZGlvQnVmZmVyU291cmNlTm9kZSBjcmVhdGVC
dWZmZXJTb3VyY2UoKTsKKworICAgICAgICAvLyBQcm9jZXNzaW5nIG5vZGVzCisgICAgICAgIEF1
ZGlvR2Fpbk5vZGUgY3JlYXRlR2Fpbk5vZGUoKTsKKyAgICAgICAgRGVsYXlOb2RlIGNyZWF0ZURl
bGF5Tm9kZSgpOworICAgICAgICBMb3dQYXNzMkZpbHRlck5vZGUgY3JlYXRlTG93UGFzczJGaWx0
ZXIoKTsKKyAgICAgICAgSGlnaFBhc3MyRmlsdGVyTm9kZSBjcmVhdGVIaWdoUGFzczJGaWx0ZXIo
KTsKKyAgICAgICAgQXVkaW9QYW5uZXJOb2RlIGNyZWF0ZVBhbm5lcigpOworICAgICAgICBDb252
b2x2ZXJOb2RlIGNyZWF0ZUNvbnZvbHZlcigpOworICAgICAgICBSZWFsdGltZUFuYWx5c2VyTm9k
ZSBjcmVhdGVBbmFseXNlcigpOworICAgICAgICBKYXZhU2NyaXB0QXVkaW9Ob2RlIGNyZWF0ZUph
dmFTY3JpcHROb2RlKGluIHVuc2lnbmVkIGxvbmcgYnVmZmVyU2l6ZSk7CisKKyAgICAgICAgLy8g
Q2hhbm5lbCBzcGxpdHRpbmcgYW5kIG1lcmdpbmcKKyAgICAgICAgQXVkaW9DaGFubmVsU3BsaXR0
ZXIgY3JlYXRlQ2hhbm5lbFNwbGl0dGVyKCk7CisgICAgICAgIEF1ZGlvQ2hhbm5lbE1lcmdlciBj
cmVhdGVDaGFubmVsTWVyZ2VyKCk7CisgICAgfTsKK30K
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>68279</attachid>
            <date>2010-09-21 13:08:05 -0700</date>
            <delta_ts>2010-09-23 10:50:12 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-44890-20100921130804.patch</filename>
            <type>text/plain</type>
            <size>32139</size>
            <attacher name="Chris Rogers">crogers</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2Nzk3OCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNjkgQEAKKzIwMTAtMDktMjEgIENocmlzIFJvZ2VycyAgPGNyb2dlcnNAZ29vZ2xl
LmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBB
ZGQgQXVkaW9Db250ZXh0IGZpbGVzCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3No
b3dfYnVnLmNnaT9pZD00NDg5MAorCisgICAgICAgIE5vIG5ldyB0ZXN0cyBzaW5jZSBhdWRpbyBB
UEkgaXMgbm90IHlldCBpbXBsZW1lbnRlZC4KKworICAgICAgICAqIHdlYmF1ZGlvL0F1ZGlvQ29u
dGV4dC5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9Db250ZXh0OjpjcmVhdGVB
dWRpb1JlcXVlc3QpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9Db250ZXh0OjpjcmVhdGUpOgor
ICAgICAgICAoV2ViQ29yZTo6QXVkaW9Db250ZXh0OjpBdWRpb0NvbnRleHQpOgorICAgICAgICAo
V2ViQ29yZTo6QXVkaW9Db250ZXh0Ojp+QXVkaW9Db250ZXh0KToKKyAgICAgICAgKFdlYkNvcmU6
OkF1ZGlvQ29udGV4dDo6bGF6eUluaXRpYWxpemUpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9D
b250ZXh0Ojp1bmluaXRpYWxpemUpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9Db250ZXh0Ojpp
c0luaXRpYWxpemVkKToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvQ29udGV4dDo6aXNSdW5uYWJs
ZSk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb0NvbnRleHQ6OnN0b3ApOgorICAgICAgICAoV2Vi
Q29yZTo6QXVkaW9Db250ZXh0Ojpkb2N1bWVudCk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb0Nv
bnRleHQ6Omhhc0RvY3VtZW50KToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvQ29udGV4dDo6cmVm
QnVmZmVyKToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvQ29udGV4dDo6Y3JlYXRlQnVmZmVyKToK
KyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvQ29udGV4dDo6Y3JlYXRlQnVmZmVyU291cmNlKToKKyAg
ICAgICAgKFdlYkNvcmU6OkF1ZGlvQ29udGV4dDo6Y3JlYXRlSmF2YVNjcmlwdE5vZGUpOgorICAg
ICAgICAoV2ViQ29yZTo6QXVkaW9Db250ZXh0OjpjcmVhdGVMb3dQYXNzMkZpbHRlcik6CisgICAg
ICAgIChXZWJDb3JlOjpBdWRpb0NvbnRleHQ6OmNyZWF0ZUhpZ2hQYXNzMkZpbHRlcik6CisgICAg
ICAgIChXZWJDb3JlOjpBdWRpb0NvbnRleHQ6OmNyZWF0ZVBhbm5lcik6CisgICAgICAgIChXZWJD
b3JlOjpBdWRpb0NvbnRleHQ6OmNyZWF0ZUNvbnZvbHZlcik6CisgICAgICAgIChXZWJDb3JlOjpB
dWRpb0NvbnRleHQ6OmNyZWF0ZUFuYWx5c2VyKToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvQ29u
dGV4dDo6Y3JlYXRlR2Fpbk5vZGUpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9Db250ZXh0Ojpj
cmVhdGVEZWxheU5vZGUpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9Db250ZXh0OjpjcmVhdGVD
aGFubmVsU3BsaXR0ZXIpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9Db250ZXh0OjpjcmVhdGVD
aGFubmVsTWVyZ2VyKToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvQ29udGV4dDo6bm90aWZ5Tm9k
ZUZpbmlzaGVkUHJvY2Vzc2luZyk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb0NvbnRleHQ6OmRl
cmVmRmluaXNoZWRTb3VyY2VOb2Rlcyk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb0NvbnRleHQ6
OnJlZk5vZGUpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9Db250ZXh0OjpkZXJlZk5vZGUpOgor
ICAgICAgICAoV2ViQ29yZTo6QXVkaW9Db250ZXh0OjpkZXJlZlVuZmluaXNoZWRTb3VyY2VOb2Rl
cyk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb0NvbnRleHQ6OmxvY2spOgorICAgICAgICAoV2Vi
Q29yZTo6QXVkaW9Db250ZXh0Ojp0cnlMb2NrKToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvQ29u
dGV4dDo6dW5sb2NrKToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvQ29udGV4dDo6aXNBdWRpb1Ro
cmVhZCk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb0NvbnRleHQ6OmlzR3JhcGhPd25lcik6Cisg
ICAgICAgIChXZWJDb3JlOjpBdWRpb0NvbnRleHQ6OmFkZERlZmVycmVkRmluaXNoRGVyZWYpOgor
ICAgICAgICAoV2ViQ29yZTo6QXVkaW9Db250ZXh0OjpoYW5kbGVQb3N0UmVuZGVyVGFza3MpOgor
ICAgICAgICAoV2ViQ29yZTo6QXVkaW9Db250ZXh0OjpoYW5kbGVEZWZlcnJlZEZpbmlzaERlcmVm
cyk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb0NvbnRleHQ6Om1hcmtGb3JEZWxldGlvbik6Cisg
ICAgICAgIChXZWJDb3JlOjpBdWRpb0NvbnRleHQ6OmRlbGV0ZU1hcmtlZE5vZGVzKToKKyAgICAg
ICAgKiB3ZWJhdWRpby9BdWRpb0NvbnRleHQuaDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpB
dWRpb0NvbnRleHQ6OmRlc3RpbmF0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvQ29udGV4
dDo6Y3VycmVudFRpbWUpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9Db250ZXh0OjpzYW1wbGVS
YXRlKToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvQ29udGV4dDo6bGlzdGVuZXIpOgorICAgICAg
ICAoV2ViQ29yZTo6QXVkaW9Db250ZXh0Ojp0ZW1wb3JhcnlNb25vQnVzKToKKyAgICAgICAgKFdl
YkNvcmU6OkF1ZGlvQ29udGV4dDo6dGVtcG9yYXJ5U3RlcmVvQnVzKToKKyAgICAgICAgKFdlYkNv
cmU6OkF1ZGlvQ29udGV4dDo6aW5jcmVtZW50Q29ubmVjdGlvbkNvdW50KToKKyAgICAgICAgKFdl
YkNvcmU6OkF1ZGlvQ29udGV4dDo6Y29ubmVjdGlvbkNvdW50KToKKyAgICAgICAgKFdlYkNvcmU6
OkF1ZGlvQ29udGV4dDo6c2V0QXVkaW9UaHJlYWQpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9D
b250ZXh0OjphdWRpb1RocmVhZCk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb0NvbnRleHQ6Omlz
QXVkaW9UaHJlYWRGaW5pc2hlZCk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb0NvbnRleHQ6OkF1
dG9Mb2NrZXI6OkF1dG9Mb2NrZXIpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9Db250ZXh0OjpB
dXRvTG9ja2VyOjp+QXV0b0xvY2tlcik6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb0NvbnRleHQ6
OlJlZkluZm86OlJlZkluZm8pOgorICAgICAgICAqIHdlYmF1ZGlvL0F1ZGlvQ29udGV4dC5pZGw6
IEFkZGVkLgorCiAyMDEwLTA5LTIxICBWYW5nZWxpcyBLb2trZXZpcyAgPHZhbmdlbGlzQGNocm9t
aXVtLm9yZz4KIAogICAgICAgICBSZXZpZXdlZCBieSBKYW1lcyBSb2JpbnNvbi4KSW5kZXg6IFdl
YkNvcmUvd2ViYXVkaW8vQXVkaW9Db250ZXh0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3dl
YmF1ZGlvL0F1ZGlvQ29udGV4dC5jcHAJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL3dlYmF1ZGlv
L0F1ZGlvQ29udGV4dC5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsNDY3IEBACisvKgorICog
Q29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgor
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKiAzLiAgTmVpdGhlciB0aGUgbmFtZSBvZiBBcHBsZSBDb21wdXRlciwg
SW5jLiAoIkFwcGxlIikgbm9yIHRoZSBuYW1lcyBvZgorICogICAgIGl0cyBjb250cmlidXRvcnMg
bWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAg
ICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1p
c3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRT
IENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIg
UFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElU
UyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisg
KiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBU
SEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1
ZGUgImNvbmZpZy5oIgorCisjaWYgRU5BQkxFKFdFQl9BVURJTykKKworI2luY2x1ZGUgIkF1ZGlv
Q29udGV4dC5oIgorCisjaW5jbHVkZSAiQXVkaW9CdWZmZXIuaCIKKyNpbmNsdWRlICJBdWRpb0J1
ZmZlclNvdXJjZU5vZGUuaCIKKyNpbmNsdWRlICJBdWRpb0NoYW5uZWxNZXJnZXIuaCIKKyNpbmNs
dWRlICJBdWRpb0NoYW5uZWxTcGxpdHRlci5oIgorI2luY2x1ZGUgIkF1ZGlvR2Fpbk5vZGUuaCIK
KyNpbmNsdWRlICJBdWRpb0xpc3RlbmVyLmgiCisjaW5jbHVkZSAiQXVkaW9QYW5uZXJOb2RlLmgi
CisjaW5jbHVkZSAiQ2FjaGVkQXVkaW8uaCIKKyNpbmNsdWRlICJDb252b2x2ZXJOb2RlLmgiCisj
aW5jbHVkZSAiRGVsYXlOb2RlLmgiCisjaW5jbHVkZSAiRG9jdW1lbnQuaCIKKyNpbmNsdWRlICJI
UlRGRGF0YWJhc2VMb2FkZXIuaCIKKyNpbmNsdWRlICJIUlRGUGFubmVyLmgiCisjaW5jbHVkZSAi
SFRNTE5hbWVzLmgiCisjaW5jbHVkZSAiSGlnaFBhc3MyRmlsdGVyTm9kZS5oIgorI2luY2x1ZGUg
IkphdmFTY3JpcHRBdWRpb05vZGUuaCIKKyNpbmNsdWRlICJMb3dQYXNzMkZpbHRlck5vZGUuaCIK
KyNpbmNsdWRlICJQbGF0Zm9ybVN0cmluZy5oIgorI2luY2x1ZGUgIlJlYWx0aW1lQW5hbHlzZXJO
b2RlLmgiCisKKyNpbmNsdWRlIDx3dGYvT3duUHRyLmg+CisjaW5jbHVkZSA8d3RmL1Bhc3NPd25Q
dHIuaD4KKyNpbmNsdWRlIDx3dGYvUmVmQ291bnRlZC5oPgorCisvLyBGSVhNRTogY2hlY2sgdGhl
IHByb3BlciB3YXkgdG8gcmVmZXJlbmNlIGFuIHVuZGVmaW5lZCB0aHJlYWQgSUQKK2NvbnN0IGlu
dCBVbmRlZmluZWRUaHJlYWRJZGVudGlmaWVyID0gMHhmZmZmZmZmZjsKKyAKK25hbWVzcGFjZSBX
ZWJDb3JlIHsKKworUGFzc1JlZlB0cjxDYWNoZWRBdWRpbz4gQXVkaW9Db250ZXh0OjpjcmVhdGVB
dWRpb1JlcXVlc3QoY29uc3QgU3RyaW5nICZ1cmwsIGJvb2wgbWl4VG9Nb25vKQoreworICAgIGxh
enlJbml0aWFsaXplKCk7CisKKyAgICAvLyBDb252ZXJ0IHJlbGF0aXZlIFVSTCB0byBhYnNvbHV0
ZQorICAgIEtVUkwgY29tcGxldGVkVVJMID0gZG9jdW1lbnQoKS0+Y29tcGxldGVVUkwodXJsKTsK
KyAgICBTdHJpbmcgY29tcGxldGVkVVJMU3RyaW5nID0gY29tcGxldGVkVVJMLnN0cmluZygpOwor
CisgICAgUmVmUHRyPENhY2hlZEF1ZGlvPiBjYWNoZWRBdWRpbyA9IENhY2hlZEF1ZGlvOjpjcmVh
dGUoY29tcGxldGVkVVJMU3RyaW5nLCB0aGlzLCBkb2N1bWVudCgpLCBzYW1wbGVSYXRlKCksIG1p
eFRvTW9ubyk7CisgICAgQ2FjaGVkQXVkaW8qIGMgPSBjYWNoZWRBdWRpby5nZXQoKTsKKworICAg
IG1fY2FjaGVkQXVkaW9SZWZlcmVuY2VzLmFwcGVuZChjKTsKKworICAgIHJldHVybiBjYWNoZWRB
dWRpbzsKK30KKworUGFzc1JlZlB0cjxBdWRpb0NvbnRleHQ+IEF1ZGlvQ29udGV4dDo6Y3JlYXRl
KERvY3VtZW50KiBkb2N1bWVudCkKK3sKKyAgICByZXR1cm4gYWRvcHRSZWYobmV3IEF1ZGlvQ29u
dGV4dChkb2N1bWVudCkpOworfQorCitBdWRpb0NvbnRleHQ6OkF1ZGlvQ29udGV4dChEb2N1bWVu
dCogZG9jdW1lbnQpCisgICAgOiBBY3RpdmVET01PYmplY3QoZG9jdW1lbnQsIHRoaXMpCisgICAg
LCBtX2lzSW5pdGlhbGl6ZWQoZmFsc2UpCisgICAgLCBtX2lzQXVkaW9UaHJlYWRGaW5pc2hlZChm
YWxzZSkKKyAgICAsIG1fZG9jdW1lbnQoZG9jdW1lbnQpCisgICAgLCBtX2Rlc3RpbmF0aW9uTm9k
ZSgwKQorICAgICwgbV9jb25uZWN0aW9uQ291bnQoMCkKKyAgICAsIG1fYXVkaW9UaHJlYWQoMCkK
KyAgICAsIG1fZ3JhcGhPd25lclRocmVhZChVbmRlZmluZWRUaHJlYWRJZGVudGlmaWVyKQorewor
ICAgIC8vIE5vdGU6IGJlY2F1c2UgYWRvcHRSZWYoKSB3b24ndCBiZSBjYWxsZWQgdW50aWwgd2Ug
bGVhdmUgdGhpcyBjb25zdHJ1Y3RvciwgYnV0IGNvZGUgaW4gdGhpcyBjb25zdHJ1Y3RvciBuZWVk
cyB0byByZWZlcmVuY2UgdGhpcyBjb250ZXh0LAorICAgIC8vIHJlbGF4IHRoZSBjaGVjay4KKyAg
ICByZWxheEFkb3B0aW9uUmVxdWlyZW1lbnQoKTsKKyAgICAKKyAgICBtX2Rlc3RpbmF0aW9uTm9k
ZSA9IEF1ZGlvRGVzdGluYXRpb25Ob2RlOjpjcmVhdGUodGhpcyk7CisgICAgbV9saXN0ZW5lciA9
IEF1ZGlvTGlzdGVuZXI6OmNyZWF0ZSgpOworICAgIG1fdGVtcG9yYXJ5TW9ub0J1cyA9IGFkb3B0
UHRyKG5ldyBBdWRpb0J1cygxLCBBdWRpb05vZGU6OlByb2Nlc3NpbmdTaXplSW5GcmFtZXMpKTsK
KyAgICBtX3RlbXBvcmFyeVN0ZXJlb0J1cyA9IGFkb3B0UHRyKG5ldyBBdWRpb0J1cygyLCBBdWRp
b05vZGU6OlByb2Nlc3NpbmdTaXplSW5GcmFtZXMpKTsKKworICAgIC8vIFRoaXMgc2V0cyBpbiBt
b3Rpb24gYW4gYXN5bmNocm9ub3VzIGxvYWRpbmcgbWVjaGFuaXNtIG9uIGFub3RoZXIgdGhyZWFk
LgorICAgIC8vIFdlIGNhbiBjaGVjayBocnRmRGF0YWJhc2VMb2FkZXIoKS0+aXNMb2FkZWQoKSB0
byBmaW5kIG91dCB3aGV0aGVyIG9yIG5vdCBpdCBoYXMgYmVlbiBmdWxseSBsb2FkZWQuCisgICAg
Ly8gSXQncyBub3QgdGhhdCB1c2VmdWwgdG8gaGF2ZSBhIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciB0
aGlzIHNpbmNlIHRoZSBhdWRpbyB0aHJlYWQgYXV0b21hdGljYWxseSBzdGFydHMgcmVuZGVyaW5n
IG9uIHRoZSBncmFwaAorICAgIC8vIHdoZW4gdGhpcyBoYXMgZmluaXNoZWQgKHNlZSBBdWRpb0Rl
c3RpbmF0aW9uTm9kZSkuCisgICAgaHJ0ZkRhdGFiYXNlTG9hZGVyKCktPmxvYWRBc3luY2hyb25v
dXNseShzYW1wbGVSYXRlKCkpOworfQorCitBdWRpb0NvbnRleHQ6On5BdWRpb0NvbnRleHQoKQor
eworI2lmIERFQlVHX0FVRElPTk9ERV9SRUZFUkVOQ0VTCisgICAgcHJpbnRmKCIlcDogQXVkaW9D
b250ZXh0Ojp+QXVkaW9Db250ZXh0KClcbiIsIHRoaXMpOworI2VuZGlmICAgIAorICAgIC8vIEF1
ZGlvTm9kZXMga2VlcCBhIHJlZmVyZW5jZSB0byB0aGVpciBjb250ZXh0LCBzbyB0aGVyZSBzaG91
bGQgYmUgbm8gd2F5IHRvIGJlIGluIHRoZSBkZXN0cnVjdG9yIGlmIHRoZXJlIGFyZSBzdGlsbCBB
dWRpb05vZGVzIGFyb3VuZC4KKyAgICBBU1NFUlQoIW1fbm9kZXNUb0RlbGV0ZS5zaXplKCkpOwor
ICAgIEFTU0VSVCghbV9yZWZlcmVuY2VkTm9kZXMuc2l6ZSgpKTsKKyAgICBBU1NFUlQoIW1fZmlu
aXNoZWROb2Rlcy5zaXplKCkpOworfQorCit2b2lkIEF1ZGlvQ29udGV4dDo6bGF6eUluaXRpYWxp
emUoKQoreworICAgIGlmICghbV9pc0luaXRpYWxpemVkKSB7CisgICAgICAgIC8vIERvbid0IGFs
bG93IHRoZSBjb250ZXh0IHRvIGluaXRpYWxpemUgYSBzZWNvbmQgdGltZSBhZnRlciBpdCdzIGFs
cmVhZHkgYmVlbiBleHBsaWNpdGx5IHVuaW5pdGlhbGl6ZWQuCisgICAgICAgIEFTU0VSVCghbV9p
c0F1ZGlvVGhyZWFkRmluaXNoZWQpOworICAgICAgICBpZiAoIW1faXNBdWRpb1RocmVhZEZpbmlz
aGVkKSB7CisgICAgICAgICAgICBpZiAobV9kZXN0aW5hdGlvbk5vZGUuZ2V0KCkpIHsKKyAgICAg
ICAgICAgICAgICAvLyBUaGlzIHN0YXJ0cyB0aGUgYXVkaW8gdGhyZWFkLiAgVGhlIGRlc3RpbmF0
aW9uIG5vZGUncyBwcm92aWRlSW5wdXQoKSBtZXRob2Qgd2lsbCBub3cgYmUgY2FsbGVkIHJlcGVh
dGVkbHkgdG8gcmVuZGVyIGF1ZGlvLgorICAgICAgICAgICAgICAgIC8vIEVhY2ggdGltZSBwcm92
aWRlSW5wdXQoKSBpcyBjYWxsZWQsIGEgcG9ydGlvbiBvZiB0aGUgYXVkaW8gc3RyZWFtIGlzIHJl
bmRlcmVkLiAgTGV0J3MgY2FsbCB0aGlzIHRpbWUgcGVyaW9kIGEgInJlbmRlciBxdWFudHVtIi4K
KyAgICAgICAgICAgICAgICBtX2Rlc3RpbmF0aW9uTm9kZS0+aW5pdGlhbGl6ZSgpOworICAgICAg
ICAgICAgfQorICAgICAgICAgICAgbV9pc0luaXRpYWxpemVkID0gdHJ1ZTsKKyAgICAgICAgfQor
ICAgIH0KK30KKwordm9pZCBBdWRpb0NvbnRleHQ6OnVuaW5pdGlhbGl6ZSgpCit7CisgICAgaWYg
KG1faXNJbml0aWFsaXplZCkgeyAgICAKKyAgICAgICAgLy8gVGhpcyBzdG9wcyB0aGUgYXVkaW8g
dGhyZWFkIGFuZCBhbGwgYXVkaW8gcmVuZGVyaW5nLgorICAgICAgICBtX2Rlc3RpbmF0aW9uTm9k
ZS0+dW5pbml0aWFsaXplKCk7CisKKyAgICAgICAgLy8gRG9uJ3QgYWxsb3cgdGhlIGNvbnRleHQg
dG8gaW5pdGlhbGl6ZSBhIHNlY29uZCB0aW1lIGFmdGVyIGl0J3MgYWxyZWFkeSBiZWVuIGV4cGxp
Y2l0bHkgdW5pbml0aWFsaXplZC4KKyAgICAgICAgbV9pc0F1ZGlvVGhyZWFkRmluaXNoZWQgPSB0
cnVlOworCisgICAgICAgIC8vIFdlIGhhdmUgdG8gcmVsZWFzZSBvdXIgcmVmZXJlbmNlIHRvIHRo
ZSBkZXN0aW5hdGlvbiBub2RlIGJlZm9yZSB0aGUgY29udGV4dCB3aWxsIGV2ZXIgYmUgZGVsZXRl
ZCBzaW5jZSB0aGUgZGVzdGluYXRpb24gbm9kZSBob2xkcyBhIHJlZmVyZW5jZSB0byB0aGUgY29u
dGV4dC4KKyAgICAgICAgbV9kZXN0aW5hdGlvbk5vZGUuY2xlYXIoKTsKKyAgICAgICAgCisgICAg
ICAgIC8vIEdldCByaWQgb2YgdGhlIHNvdXJjZXMgd2hpY2ggbWF5IHN0aWxsIGJlIHBsYXlpbmcu
CisgICAgICAgIGRlcmVmVW5maW5pc2hlZFNvdXJjZU5vZGVzKCk7CisgICAgICAgIAorICAgICAg
ICAvLyBCZWNhdXNlIHRoZSBBdWRpb0J1ZmZlcnMgYXJlIGdhcmJhZ2UgY29sbGVjdGVkLCB3ZSBj
YW4ndCBkZWxldGUgdGhlbSBoZXJlLgorICAgICAgICAvLyBJbnN0ZWFkLCBhdCBsZWFzdCByZWxl
YXNlIHRoZSBwb3RlbnRpYWxseSBsYXJnZSBhbW91bnQgb2YgYWxsb2NhdGVkIG1lbW9yeSBmb3Ig
dGhlIGF1ZGlvIGRhdGEuCisgICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBkbyB0aGlzICphZnRlciog
dGhlIGNvbnRleHQgaXMgdW5pbml0aWFsaXplZCBhbmQgc3RvcHMgcHJvY2Vzc2luZyBhdWRpby4K
KyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG1fYWxsb2NhdGVkQnVmZmVycy5zaXpl
KCk7ICsraSkKKyAgICAgICAgICAgIG1fYWxsb2NhdGVkQnVmZmVyc1tpXS0+cmVsZWFzZU1lbW9y
eSgpOworICAgICAgICBtX2FsbG9jYXRlZEJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAKKyAgICAgICAg
bV9pc0luaXRpYWxpemVkID0gZmFsc2U7CisgICAgfQorfQorCitib29sIEF1ZGlvQ29udGV4dDo6
aXNJbml0aWFsaXplZCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1faXNJbml0aWFsaXplZDsKK30K
KworYm9vbCBBdWRpb0NvbnRleHQ6OmlzUnVubmFibGUoKSBjb25zdAoreworICAgIGlmICghaXNJ
bml0aWFsaXplZCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgCisgICAgLy8gQ2hlY2sg
d2l0aCB0aGUgSFJURiBzcGF0aWFsaXphdGlvbiBzeXN0ZW0gdG8gc2VlIGlmIGl0J3MgZmluaXNo
ZWQgbG9hZGluZy4KKyAgICByZXR1cm4gaHJ0ZkRhdGFiYXNlTG9hZGVyKCktPmlzTG9hZGVkKCk7
Cit9CisKK3ZvaWQgQXVkaW9Db250ZXh0OjpzdG9wKCkKK3sKKyAgICBtX2RvY3VtZW50ID0gMDsg
Ly8gZG9jdW1lbnQgaXMgZ29pbmcgYXdheQorICAgIHVuaW5pdGlhbGl6ZSgpOworfQorCitEb2N1
bWVudCogQXVkaW9Db250ZXh0Ojpkb2N1bWVudCgpCit7CisgICAgQVNTRVJUKG1fZG9jdW1lbnQp
OworICAgIHJldHVybiBtX2RvY3VtZW50OworfQorCitib29sIEF1ZGlvQ29udGV4dDo6aGFzRG9j
dW1lbnQoKQoreworICAgIHJldHVybiBtX2RvY3VtZW50OworfQorCit2b2lkIEF1ZGlvQ29udGV4
dDo6cmVmQnVmZmVyKFBhc3NSZWZQdHI8QXVkaW9CdWZmZXI+IGJ1ZmZlcikKK3sKKyAgICBtX2Fs
bG9jYXRlZEJ1ZmZlcnMuYXBwZW5kKGJ1ZmZlcik7Cit9CisKK1Bhc3NSZWZQdHI8QXVkaW9CdWZm
ZXI+IEF1ZGlvQ29udGV4dDo6Y3JlYXRlQnVmZmVyKHVuc2lnbmVkIG51bWJlck9mQ2hhbm5lbHMs
IHNpemVfdCBudW1iZXJPZkZyYW1lcywgZG91YmxlIHNhbXBsZVJhdGUpCit7CisgICAgcmV0dXJu
IEF1ZGlvQnVmZmVyOjpjcmVhdGUobnVtYmVyT2ZDaGFubmVscywgbnVtYmVyT2ZGcmFtZXMsIHNh
bXBsZVJhdGUpOworfQorCitQYXNzUmVmUHRyPEF1ZGlvQnVmZmVyU291cmNlTm9kZT4gQXVkaW9D
b250ZXh0OjpjcmVhdGVCdWZmZXJTb3VyY2UoKQoreworICAgIEFTU0VSVChpc01haW5UaHJlYWQo
KSk7CisgICAgbGF6eUluaXRpYWxpemUoKTsKKyAgICBSZWZQdHI8QXVkaW9CdWZmZXJTb3VyY2VO
b2RlPiBub2RlID0gQXVkaW9CdWZmZXJTb3VyY2VOb2RlOjpjcmVhdGUodGhpcywgbV9kZXN0aW5h
dGlvbk5vZGUtPnNhbXBsZVJhdGUoKSk7CisKKyAgICByZWZOb2RlKG5vZGUuZ2V0KCkpOyAvLyBj
b250ZXh0IGtlZXBzIHJlZmVyZW5jZSB1bnRpbCBzb3VyY2UgaGFzIGZpbmlzaGVkIHBsYXlpbmcK
KyAgICByZXR1cm4gbm9kZTsKK30KKworUGFzc1JlZlB0cjxKYXZhU2NyaXB0QXVkaW9Ob2RlPiBB
dWRpb0NvbnRleHQ6OmNyZWF0ZUphdmFTY3JpcHROb2RlKHNpemVfdCBidWZmZXJTaXplKQorewor
ICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7CisgICAgbGF6eUluaXRpYWxpemUoKTsKKyAgICBS
ZWZQdHI8SmF2YVNjcmlwdEF1ZGlvTm9kZT4gbm9kZSA9IEphdmFTY3JpcHRBdWRpb05vZGU6OmNy
ZWF0ZSh0aGlzLCBtX2Rlc3RpbmF0aW9uTm9kZS0+c2FtcGxlUmF0ZSgpLCBidWZmZXJTaXplKTsK
KworICAgIHJlZk5vZGUobm9kZS5nZXQoKSk7IC8vIGNvbnRleHQga2VlcHMgcmVmZXJlbmNlIHVu
dGlsIHdlIHN0b3AgbWFraW5nIGphdmFzY3JpcHQgcmVuZGVyaW5nIGNhbGxiYWNrcworICAgIHJl
dHVybiBub2RlOworfQorCitQYXNzUmVmUHRyPExvd1Bhc3MyRmlsdGVyTm9kZT4gQXVkaW9Db250
ZXh0OjpjcmVhdGVMb3dQYXNzMkZpbHRlcigpCit7CisgICAgQVNTRVJUKGlzTWFpblRocmVhZCgp
KTsKKyAgICBsYXp5SW5pdGlhbGl6ZSgpOworICAgIHJldHVybiBMb3dQYXNzMkZpbHRlck5vZGU6
OmNyZWF0ZSh0aGlzLCBtX2Rlc3RpbmF0aW9uTm9kZS0+c2FtcGxlUmF0ZSgpKTsKK30KKworUGFz
c1JlZlB0cjxIaWdoUGFzczJGaWx0ZXJOb2RlPiBBdWRpb0NvbnRleHQ6OmNyZWF0ZUhpZ2hQYXNz
MkZpbHRlcigpCit7CisgICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKKyAgICBsYXp5SW5pdGlh
bGl6ZSgpOworICAgIHJldHVybiBIaWdoUGFzczJGaWx0ZXJOb2RlOjpjcmVhdGUodGhpcywgbV9k
ZXN0aW5hdGlvbk5vZGUtPnNhbXBsZVJhdGUoKSk7Cit9CisKK1Bhc3NSZWZQdHI8QXVkaW9QYW5u
ZXJOb2RlPiBBdWRpb0NvbnRleHQ6OmNyZWF0ZVBhbm5lcigpCit7CisgICAgQVNTRVJUKGlzTWFp
blRocmVhZCgpKTsKKyAgICBsYXp5SW5pdGlhbGl6ZSgpOworICAgIHJldHVybiBBdWRpb1Bhbm5l
ck5vZGU6OmNyZWF0ZSh0aGlzLCBtX2Rlc3RpbmF0aW9uTm9kZS0+c2FtcGxlUmF0ZSgpKTsKK30K
KworUGFzc1JlZlB0cjxDb252b2x2ZXJOb2RlPiBBdWRpb0NvbnRleHQ6OmNyZWF0ZUNvbnZvbHZl
cigpCit7CisgICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKKyAgICBsYXp5SW5pdGlhbGl6ZSgp
OworICAgIHJldHVybiBDb252b2x2ZXJOb2RlOjpjcmVhdGUodGhpcywgbV9kZXN0aW5hdGlvbk5v
ZGUtPnNhbXBsZVJhdGUoKSk7Cit9CisKK1Bhc3NSZWZQdHI8UmVhbHRpbWVBbmFseXNlck5vZGU+
IEF1ZGlvQ29udGV4dDo6Y3JlYXRlQW5hbHlzZXIoKQoreworICAgIEFTU0VSVChpc01haW5UaHJl
YWQoKSk7CisgICAgbGF6eUluaXRpYWxpemUoKTsKKyAgICByZXR1cm4gUmVhbHRpbWVBbmFseXNl
ck5vZGU6OmNyZWF0ZSh0aGlzLCBtX2Rlc3RpbmF0aW9uTm9kZS0+c2FtcGxlUmF0ZSgpKTsKK30K
KworUGFzc1JlZlB0cjxBdWRpb0dhaW5Ob2RlPiBBdWRpb0NvbnRleHQ6OmNyZWF0ZUdhaW5Ob2Rl
KCkKK3sKKyAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOworICAgIGxhenlJbml0aWFsaXplKCk7
CisgICAgcmV0dXJuIEF1ZGlvR2Fpbk5vZGU6OmNyZWF0ZSh0aGlzLCBtX2Rlc3RpbmF0aW9uTm9k
ZS0+c2FtcGxlUmF0ZSgpKTsKK30KKworUGFzc1JlZlB0cjxEZWxheU5vZGU+IEF1ZGlvQ29udGV4
dDo6Y3JlYXRlRGVsYXlOb2RlKCkKK3sKKyAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOworICAg
IGxhenlJbml0aWFsaXplKCk7CisgICAgcmV0dXJuIERlbGF5Tm9kZTo6Y3JlYXRlKHRoaXMsIG1f
ZGVzdGluYXRpb25Ob2RlLT5zYW1wbGVSYXRlKCkpOworfQorCitQYXNzUmVmUHRyPEF1ZGlvQ2hh
bm5lbFNwbGl0dGVyPiBBdWRpb0NvbnRleHQ6OmNyZWF0ZUNoYW5uZWxTcGxpdHRlcigpCit7Cisg
ICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKKyAgICBsYXp5SW5pdGlhbGl6ZSgpOworICAgIHJl
dHVybiBBdWRpb0NoYW5uZWxTcGxpdHRlcjo6Y3JlYXRlKHRoaXMsIG1fZGVzdGluYXRpb25Ob2Rl
LT5zYW1wbGVSYXRlKCkpOworfQorCitQYXNzUmVmUHRyPEF1ZGlvQ2hhbm5lbE1lcmdlcj4gQXVk
aW9Db250ZXh0OjpjcmVhdGVDaGFubmVsTWVyZ2VyKCkKK3sKKyAgICBBU1NFUlQoaXNNYWluVGhy
ZWFkKCkpOworICAgIGxhenlJbml0aWFsaXplKCk7CisgICAgcmV0dXJuIEF1ZGlvQ2hhbm5lbE1l
cmdlcjo6Y3JlYXRlKHRoaXMsIG1fZGVzdGluYXRpb25Ob2RlLT5zYW1wbGVSYXRlKCkpOworfQor
Cit2b2lkIEF1ZGlvQ29udGV4dDo6bm90aWZ5Tm9kZUZpbmlzaGVkUHJvY2Vzc2luZyhBdWRpb05v
ZGUqIG5vZGUpCit7CisgICAgQVNTRVJUKGlzQXVkaW9UaHJlYWQoKSk7CisgICAgbV9maW5pc2hl
ZE5vZGVzLmFwcGVuZChub2RlKTsKK30KKwordm9pZCBBdWRpb0NvbnRleHQ6OmRlcmVmRmluaXNo
ZWRTb3VyY2VOb2RlcygpCit7CisgICAgQVNTRVJUKGlzR3JhcGhPd25lcigpKTsKKyAgICBBU1NF
UlQoaXNBdWRpb1RocmVhZCgpIHx8IGlzQXVkaW9UaHJlYWRGaW5pc2hlZCgpKTsKKyAgICBmb3Ig
KHVuc2lnbmVkIGkgPSAwOyBpIDwgbV9maW5pc2hlZE5vZGVzLnNpemUoKTsgaSsrKQorICAgICAg
ICBkZXJlZk5vZGUobV9maW5pc2hlZE5vZGVzW2ldKTsKKworICAgIG1fZmluaXNoZWROb2Rlcy5j
bGVhcigpOworfQorCit2b2lkIEF1ZGlvQ29udGV4dDo6cmVmTm9kZShBdWRpb05vZGUqIG5vZGUp
Cit7CisgICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKKyAgICBBdXRvTG9ja2VyIGxvY2tlcih0
aGlzKTsKKyAgICAKKyAgICBub2RlLT5yZWYoQXVkaW9Ob2RlOjpSZWZUeXBlQ29ubmVjdGlvbik7
CisgICAgbV9yZWZlcmVuY2VkTm9kZXMuYXBwZW5kKG5vZGUpOworfQorCit2b2lkIEF1ZGlvQ29u
dGV4dDo6ZGVyZWZOb2RlKEF1ZGlvTm9kZSogbm9kZSkKK3sKKyAgICBBU1NFUlQoaXNHcmFwaE93
bmVyKCkpOworICAgIAorICAgIG5vZGUtPmRlcmVmKEF1ZGlvTm9kZTo6UmVmVHlwZUNvbm5lY3Rp
b24pOworCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG1fcmVmZXJlbmNlZE5vZGVzLnNp
emUoKTsgKytpKSB7CisgICAgICAgIGlmIChub2RlID09IG1fcmVmZXJlbmNlZE5vZGVzW2ldKSB7
CisgICAgICAgICAgICBtX3JlZmVyZW5jZWROb2Rlcy5yZW1vdmUoaSk7CisgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBBdWRpb0NvbnRleHQ6OmRlcmVmVW5m
aW5pc2hlZFNvdXJjZU5vZGVzKCkKK3sKKyAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkgJiYgaXNB
dWRpb1RocmVhZEZpbmlzaGVkKCkpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBtX3Jl
ZmVyZW5jZWROb2Rlcy5zaXplKCk7ICsraSkKKyAgICAgICAgbV9yZWZlcmVuY2VkTm9kZXNbaV0t
PmRlcmVmKEF1ZGlvTm9kZTo6UmVmVHlwZUNvbm5lY3Rpb24pOworCisgICAgbV9yZWZlcmVuY2Vk
Tm9kZXMuY2xlYXIoKTsKK30KKwordm9pZCBBdWRpb0NvbnRleHQ6OmxvY2soYm9vbCYgbXVzdFJl
bGVhc2VMb2NrKQoreworICAgIC8vIERvbid0IGFsbG93IHJlZ3VsYXIgbG9jayBpbiByZWFsLXRp
bWUgYXVkaW8gdGhyZWFkLgorICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7CisKKyAgICBUaHJl
YWRJZGVudGlmaWVyIHRoaXNUaHJlYWQgPSBjdXJyZW50VGhyZWFkKCk7CisKKyAgICBpZiAodGhp
c1RocmVhZCA9PSBtX2dyYXBoT3duZXJUaHJlYWQpIHsKKyAgICAgICAgLy8gV2UgYWxyZWFkeSBo
YXZlIHRoZSBsb2NrLgorICAgICAgICBtdXN0UmVsZWFzZUxvY2sgPSBmYWxzZTsKKyAgICB9IGVs
c2UgeworICAgICAgICAvLyBBY3F1aXJlIHRoZSBsb2NrLgorICAgICAgICBtX2NvbnRleHRHcmFw
aE11dGV4LmxvY2soKTsKKyAgICAgICAgbXVzdFJlbGVhc2VMb2NrID0gdHJ1ZTsKKyAgICB9CisK
KyAgICBtX2dyYXBoT3duZXJUaHJlYWQgPSB0aGlzVGhyZWFkOworfQorCitib29sIEF1ZGlvQ29u
dGV4dDo6dHJ5TG9jayhib29sJiBtdXN0UmVsZWFzZUxvY2spCit7CisgICAgVGhyZWFkSWRlbnRp
ZmllciB0aGlzVGhyZWFkID0gY3VycmVudFRocmVhZCgpOworICAgIGJvb2wgaXNBdWRpb1RocmVh
ZCA9IHRoaXNUaHJlYWQgPT0gYXVkaW9UaHJlYWQoKTsKKworICAgIC8vIFRyeSB0byBjYXRjaCBj
YXNlcyBvZiB1c2luZyB0cnkgbG9jayBvbiBtYWluIHRocmVhZCAtIGl0IHNob3VsZCB1c2UgcmVn
dWxhciBsb2NrLgorICAgIEFTU0VSVChpc0F1ZGlvVGhyZWFkIHx8IGlzQXVkaW9UaHJlYWRGaW5p
c2hlZCgpKTsKKyAgICAKKyAgICBpZiAoIWlzQXVkaW9UaHJlYWQpIHsKKyAgICAgICAgLy8gSW4g
cmVsZWFzZSBidWlsZCB0cmVhdCB0cnlMb2NrKCkgYXMgbG9jaygpIChzaW5jZSBhYm92ZSBBU1NF
UlQoaXNBdWRpb1RocmVhZCkgbmV2ZXIgZmlyZXMpIC0gdGhpcyBpcyB0aGUgYmVzdCB3ZSBjYW4g
ZG8uCisgICAgICAgIGxvY2sobXVzdFJlbGVhc2VMb2NrKTsKKyAgICAgICAgcmV0dXJuIHRydWU7
CisgICAgfQorICAgIAorICAgIGJvb2wgaGFzTG9jazsKKyAgICAKKyAgICBpZiAodGhpc1RocmVh
ZCA9PSBtX2dyYXBoT3duZXJUaHJlYWQpIHsKKyAgICAgICAgLy8gVGhyZWFkIGFscmVhZHkgaGFz
IHRoZSBsb2NrLgorICAgICAgICBoYXNMb2NrID0gdHJ1ZTsKKyAgICAgICAgbXVzdFJlbGVhc2VM
b2NrID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gRG9uJ3QgYWxyZWFkeSBoYXZl
IHRoZSBsb2NrIC0gdHJ5IHRvIGFjcXVpcmUgaXQuCisgICAgICAgIGhhc0xvY2sgPSBtX2NvbnRl
eHRHcmFwaE11dGV4LnRyeUxvY2soKTsKKyAgICAgICAgCisgICAgICAgIGlmIChoYXNMb2NrKQor
ICAgICAgICAgICAgbV9ncmFwaE93bmVyVGhyZWFkID0gdGhpc1RocmVhZDsKKworICAgICAgICBt
dXN0UmVsZWFzZUxvY2sgPSBoYXNMb2NrOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gaGFzTG9j
azsKK30KKwordm9pZCBBdWRpb0NvbnRleHQ6OnVubG9jaygpCit7CisgICAgQVNTRVJUKGN1cnJl
bnRUaHJlYWQoKSA9PSBtX2dyYXBoT3duZXJUaHJlYWQpOworCisgICAgbV9ncmFwaE93bmVyVGhy
ZWFkID0gVW5kZWZpbmVkVGhyZWFkSWRlbnRpZmllcjsKKyAgICBtX2NvbnRleHRHcmFwaE11dGV4
LnVubG9jaygpOworfQorCitib29sIEF1ZGlvQ29udGV4dDo6aXNBdWRpb1RocmVhZCgpCit7Cisg
ICAgcmV0dXJuIGN1cnJlbnRUaHJlYWQoKSA9PSBtX2F1ZGlvVGhyZWFkOworfQorCitib29sIEF1
ZGlvQ29udGV4dDo6aXNHcmFwaE93bmVyKCkKK3sKKyAgICByZXR1cm4gY3VycmVudFRocmVhZCgp
ID09IG1fZ3JhcGhPd25lclRocmVhZDsKK30KKwordm9pZCBBdWRpb0NvbnRleHQ6OmFkZERlZmVy
cmVkRmluaXNoRGVyZWYoQXVkaW9Ob2RlKiBub2RlLCBBdWRpb05vZGU6OlJlZlR5cGUgcmVmVHlw
ZSkKK3sKKyAgICBBU1NFUlQoaXNBdWRpb1RocmVhZCgpKTsKKyAgICBtX2RlZmVycmVkRmluaXNo
RGVyZWZMaXN0LmFwcGVuZChBdWRpb0NvbnRleHQ6OlJlZkluZm8obm9kZSwgcmVmVHlwZSkpOwor
fQorCit2b2lkIEF1ZGlvQ29udGV4dDo6aGFuZGxlUG9zdFJlbmRlclRhc2tzKCkKK3sKKyAgICBB
U1NFUlQoaXNBdWRpb1RocmVhZCgpKTsKKyAgICAKKyAgICAvLyBNdXN0IHVzZSBhIHRyeUxvY2so
KSBoZXJlIHRvby4gIERvbid0IHdvcnJ5LCB0aGUgbG9jayB3aWxsIHZlcnkgcmFyZWx5IGJlIGNv
bnRlbmRlZCBhbmQgdGhpcyBtZXRob2QgaXMgY2FsbGVkIGZyZXF1ZW50bHkuCisgICAgLy8gVGhl
IHdvcnN0IHRoYXQgY2FuIGhhcHBlbiBpcyB0aGF0IHRoZXJlIHdpbGwgYmUgc29tZSBub2RlcyB3
aGljaCB3aWxsIHRha2Ugc2xpZ2h0bHkgbG9uZ2VyIHRoYW4gdXN1YWwgdG8gYmUgZGVsZXRlZCBv
ciByZW1vdmVkCisgICAgLy8gZnJvbSB0aGUgcmVuZGVyIGdyYXBoIChpbiB3aGljaCBjYXNlIHRo
ZXknbGwgcmVuZGVyIHNpbGVuY2UpLgorICAgIGJvb2wgbXVzdFJlbGVhc2VMb2NrOworICAgIGlm
ICh0cnlMb2NrKG11c3RSZWxlYXNlTG9jaykpIHsKKyAgICAgICAgLy8gVGFrZSBjYXJlIG9mIGZp
bmlzaGluZyBhbnkgZGVyZWZzIHdoZXJlIHRoZSB0cnlMb2NrKCkgZmFpbGVkIHByZXZpb3VzbHku
CisgICAgICAgIGhhbmRsZURlZmVycmVkRmluaXNoRGVyZWZzKCk7CisKKyAgICAgICAgLy8gRHlu
YW1pY2FsbHkgY2xlYW4gdXAgbm9kZXMgd2hpY2ggYXJlIG5vIGxvbmdlciBuZWVkZWQuCisgICAg
ICAgIGRlcmVmRmluaXNoZWRTb3VyY2VOb2RlcygpOworCisgICAgICAgIC8vIEZpbmFsbHkgYWN0
dWFsbHkgZGVsZXRlLgorICAgICAgICBkZWxldGVNYXJrZWROb2RlcygpOworCisgICAgICAgIGlm
IChtdXN0UmVsZWFzZUxvY2spCisgICAgICAgICAgICB1bmxvY2soKTsKKyAgICB9Cit9CisKK3Zv
aWQgQXVkaW9Db250ZXh0OjpoYW5kbGVEZWZlcnJlZEZpbmlzaERlcmVmcygpCit7CisgICAgQVNT
RVJUKGlzQXVkaW9UaHJlYWQoKSk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG1fZGVm
ZXJyZWRGaW5pc2hEZXJlZkxpc3Quc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgQXVkaW9Ob2RlKiBu
b2RlID0gbV9kZWZlcnJlZEZpbmlzaERlcmVmTGlzdFtpXS5tX25vZGU7CisgICAgICAgIEF1ZGlv
Tm9kZTo6UmVmVHlwZSByZWZUeXBlID0gbV9kZWZlcnJlZEZpbmlzaERlcmVmTGlzdFtpXS5tX3Jl
ZlR5cGU7CisgICAgICAgIG5vZGUtPmZpbmlzaERlcmVmKHJlZlR5cGUpOworICAgIH0KKyAgICAK
KyAgICBtX2RlZmVycmVkRmluaXNoRGVyZWZMaXN0LmNsZWFyKCk7Cit9CisKK3ZvaWQgQXVkaW9D
b250ZXh0OjptYXJrRm9yRGVsZXRpb24oQXVkaW9Ob2RlKiBub2RlKQoreworICAgIEFTU0VSVChp
c0dyYXBoT3duZXIoKSk7CisgICAgbV9ub2Rlc1RvRGVsZXRlLmFwcGVuZChub2RlKTsKK30KKwor
dm9pZCBBdWRpb0NvbnRleHQ6OmRlbGV0ZU1hcmtlZE5vZGVzKCkKK3sKKyAgICBBU1NFUlQoaXNH
cmFwaE93bmVyKCkgfHwgaXNBdWRpb1RocmVhZEZpbmlzaGVkKCkpOworCisgICAgLy8gTm90ZTog
ZGVsZXRpbmcgYW4gQXVkaW9Ob2RlIGNhbiBjYXVzZSBtX25vZGVzVG9EZWxldGUgdG8gZ3Jvdy4K
KyAgICB3aGlsZSAoc2l6ZV90IG4gPSBtX25vZGVzVG9EZWxldGUuc2l6ZSgpKSB7CisgICAgICAg
IEF1ZGlvTm9kZSogbm9kZSA9IG1fbm9kZXNUb0RlbGV0ZVtuIC0gMV07CisgICAgICAgIG1fbm9k
ZXNUb0RlbGV0ZS5yZW1vdmVMYXN0KCk7CisgICAgICAgIGRlbGV0ZSBub2RlOworICAgIH0KK30K
KworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gRU5BQkxFKFdFQl9BVURJTykK
SW5kZXg6IFdlYkNvcmUvd2ViYXVkaW8vQXVkaW9Db250ZXh0LmgKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2Vi
Q29yZS93ZWJhdWRpby9BdWRpb0NvbnRleHQuaAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvd2Vi
YXVkaW8vQXVkaW9Db250ZXh0LmgJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMjQ4IEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZSBkaXN0cmlidXRpb24uCisgKiAzLiAgTmVpdGhlciB0aGUgbmFtZSBvZiBBcHBsZSBDb21wdXRl
ciwgSW5jLiAoIkFwcGxlIikgbm9yIHRoZSBuYW1lcyBvZgorICogICAgIGl0cyBjb250cmlidXRv
cnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAq
ICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBl
cm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQg
SVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAq
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9S
IElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
CisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFO
WSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lm
bmRlZiBBdWRpb0NvbnRleHRfaAorI2RlZmluZSBBdWRpb0NvbnRleHRfaAorCisjaW5jbHVkZSAi
QWN0aXZlRE9NT2JqZWN0LmgiCisjaW5jbHVkZSAiQXVkaW9CdXMuaCIKKyNpbmNsdWRlICJBdWRp
b0Rlc3RpbmF0aW9uTm9kZS5oIgorI2luY2x1ZGUgPHd0Zi9Pd25QdHIuaD4KKyNpbmNsdWRlIDx3
dGYvUGFzc1JlZlB0ci5oPgorI2luY2x1ZGUgPHd0Zi9SZWZDb3VudGVkLmg+CisjaW5jbHVkZSA8
d3RmL1JlZlB0ci5oPgorI2luY2x1ZGUgPHd0Zi9UaHJlYWRpbmcuaD4KKyNpbmNsdWRlIDx3dGYv
VmVjdG9yLmg+CisjaW5jbHVkZSA8d3RmL3RleHQvQXRvbWljU3RyaW5nSGFzaC5oPgorCituYW1l
c3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIEF1ZGlvQnVmZmVyOworY2xhc3MgQXVkaW9CdWZmZXJT
b3VyY2VOb2RlOworY2xhc3MgQXVkaW9DaGFubmVsTWVyZ2VyOworY2xhc3MgQXVkaW9DaGFubmVs
U3BsaXR0ZXI7CitjbGFzcyBBdWRpb0dhaW5Ob2RlOworY2xhc3MgQXVkaW9QYW5uZXJOb2RlOwor
Y2xhc3MgQXVkaW9MaXN0ZW5lcjsKK2NsYXNzIENhY2hlZEF1ZGlvOworY2xhc3MgRGVsYXlOb2Rl
OworY2xhc3MgRG9jdW1lbnQ7CitjbGFzcyBMb3dQYXNzMkZpbHRlck5vZGU7CitjbGFzcyBIaWdo
UGFzczJGaWx0ZXJOb2RlOworY2xhc3MgQ29udm9sdmVyTm9kZTsKK2NsYXNzIFJlYWx0aW1lQW5h
bHlzZXJOb2RlOworY2xhc3MgSmF2YVNjcmlwdEF1ZGlvTm9kZTsKKworLy8gQXVkaW9Db250ZXh0
IGlzIHRoZSBjb3JuZXJzdG9uZSBvZiB0aGUgd2ViIGF1ZGlvIEFQSSBhbmQgYWxsIEF1ZGlvTm9k
ZXMgYXJlIGNyZWF0ZWQgZnJvbSBpdC4KKy8vIEZvciB0aHJlYWQgc2FmZXR5IGJldHdlZW4gdGhl
IGF1ZGlvIHRocmVhZCBhbmQgdGhlIG1haW4gdGhyZWFkLCBpdCBoYXMgYSByZW5kZXJpbmcgZ3Jh
cGggbG9ja2luZyBtZWNoYW5pc20uIAorCitjbGFzcyBBdWRpb0NvbnRleHQgOiBwdWJsaWMgQWN0
aXZlRE9NT2JqZWN0LCBwdWJsaWMgUmVmQ291bnRlZDxBdWRpb0NvbnRleHQ+IHsKK3B1YmxpYzoK
KyAgICBzdGF0aWMgUGFzc1JlZlB0cjxBdWRpb0NvbnRleHQ+IGNyZWF0ZShEb2N1bWVudCopOwor
CisgICAgdmlydHVhbCB+QXVkaW9Db250ZXh0KCk7CisKKyAgICBib29sIGlzSW5pdGlhbGl6ZWQo
KSBjb25zdDsKKworICAgIC8vIFJldHVybnMgdHJ1ZSB3aGVuIGluaXRpYWxpemUoKSB3YXMgY2Fs
bGVkIEFORCBhbGwgYXN5bmNocm9ub3VzIGluaXRpYWxpemF0aW9uIGhhcyBjb21wbGV0ZWQuCisg
ICAgYm9vbCBpc1J1bm5hYmxlKCkgY29uc3Q7CisKKyAgICAvLyBEb2N1bWVudCBub3RpZmljYXRp
b24KKyAgICB2aXJ0dWFsIHZvaWQgc3RvcCgpOworCisgICAgRG9jdW1lbnQqIGRvY3VtZW50KCk7
IC8vIEFTU0VSVHMgaWYgZG9jdW1lbnQgbm8gbG9uZ2VyIGV4aXN0cy4KKyAgICBib29sIGhhc0Rv
Y3VtZW50KCk7CisKKyAgICBBdWRpb0Rlc3RpbmF0aW9uTm9kZSogZGVzdGluYXRpb24oKSB7IHJl
dHVybiBtX2Rlc3RpbmF0aW9uTm9kZS5nZXQoKTsgfQorICAgIGRvdWJsZSBjdXJyZW50VGltZSgp
IHsgcmV0dXJuIG1fZGVzdGluYXRpb25Ob2RlLT5jdXJyZW50VGltZSgpOyB9CisgICAgZG91Ymxl
IHNhbXBsZVJhdGUoKSB7IHJldHVybiBtX2Rlc3RpbmF0aW9uTm9kZS0+c2FtcGxlUmF0ZSgpOyB9
CisKKyAgICBQYXNzUmVmUHRyPEF1ZGlvQnVmZmVyPiBjcmVhdGVCdWZmZXIodW5zaWduZWQgbnVt
YmVyT2ZDaGFubmVscywgc2l6ZV90IG51bWJlck9mRnJhbWVzLCBkb3VibGUgc2FtcGxlUmF0ZSk7
CisKKyAgICBQYXNzUmVmUHRyPENhY2hlZEF1ZGlvPiBjcmVhdGVBdWRpb1JlcXVlc3QoY29uc3Qg
U3RyaW5nICZ1cmwsIGJvb2wgbWl4VG9Nb25vKTsKKworICAgIC8vIEtlZXAgdHJhY2sgb2YgdGhp
cyBidWZmZXIgc28gd2UgY2FuIHJlbGVhc2UgbWVtb3J5IGFmdGVyIHRoZSBjb250ZXh0IGlzIHNo
dXQgZG93bi4uLgorICAgIHZvaWQgcmVmQnVmZmVyKFBhc3NSZWZQdHI8QXVkaW9CdWZmZXI+IGJ1
ZmZlcik7CisKKyAgICBBdWRpb0xpc3RlbmVyKiBsaXN0ZW5lcigpIHsgcmV0dXJuIG1fbGlzdGVu
ZXIuZ2V0KCk7IH0KKworICAgIC8vIFRoZSBBdWRpb05vZGUgY3JlYXRlIG1ldGhvZHMgYXJlIGNh
bGxlZCBvbiB0aGUgbWFpbiB0aHJlYWQgKGZyb20gSmF2YVNjcmlwdCkuCisgICAgUGFzc1JlZlB0
cjxBdWRpb0J1ZmZlclNvdXJjZU5vZGU+IGNyZWF0ZUJ1ZmZlclNvdXJjZSgpOworICAgIFBhc3NS
ZWZQdHI8QXVkaW9HYWluTm9kZT4gY3JlYXRlR2Fpbk5vZGUoKTsKKyAgICBQYXNzUmVmUHRyPERl
bGF5Tm9kZT4gY3JlYXRlRGVsYXlOb2RlKCk7CisgICAgUGFzc1JlZlB0cjxMb3dQYXNzMkZpbHRl
ck5vZGU+IGNyZWF0ZUxvd1Bhc3MyRmlsdGVyKCk7CisgICAgUGFzc1JlZlB0cjxIaWdoUGFzczJG
aWx0ZXJOb2RlPiBjcmVhdGVIaWdoUGFzczJGaWx0ZXIoKTsKKyAgICBQYXNzUmVmUHRyPEF1ZGlv
UGFubmVyTm9kZT4gY3JlYXRlUGFubmVyKCk7CisgICAgUGFzc1JlZlB0cjxDb252b2x2ZXJOb2Rl
PiBjcmVhdGVDb252b2x2ZXIoKTsKKyAgICBQYXNzUmVmUHRyPFJlYWx0aW1lQW5hbHlzZXJOb2Rl
PiBjcmVhdGVBbmFseXNlcigpOworICAgIFBhc3NSZWZQdHI8SmF2YVNjcmlwdEF1ZGlvTm9kZT4g
Y3JlYXRlSmF2YVNjcmlwdE5vZGUoc2l6ZV90IGJ1ZmZlclNpemUpOworICAgIFBhc3NSZWZQdHI8
QXVkaW9DaGFubmVsU3BsaXR0ZXI+IGNyZWF0ZUNoYW5uZWxTcGxpdHRlcigpOworICAgIFBhc3NS
ZWZQdHI8QXVkaW9DaGFubmVsTWVyZ2VyPiBjcmVhdGVDaGFubmVsTWVyZ2VyKCk7CisKKyAgICBB
dWRpb0J1cyogdGVtcG9yYXJ5TW9ub0J1cygpIHsgcmV0dXJuIG1fdGVtcG9yYXJ5TW9ub0J1cy5n
ZXQoKTsgfQorICAgIEF1ZGlvQnVzKiB0ZW1wb3JhcnlTdGVyZW9CdXMoKSB7IHJldHVybiBtX3Rl
bXBvcmFyeVN0ZXJlb0J1cy5nZXQoKTsgfQorCisgICAgLy8gV2hlbiBhIHNvdXJjZSBub2RlIGhh
cyBubyBtb3JlIHByb2Nlc3NpbmcgdG8gZG8gKGhhcyBmaW5pc2hlZCBwbGF5aW5nKSwgdGhlbiBp
dCB0ZWxscyB0aGUgY29udGV4dCB0byBkZXJlZmVyZW5jZSBpdC4KKyAgICB2b2lkIG5vdGlmeU5v
ZGVGaW5pc2hlZFByb2Nlc3NpbmcoQXVkaW9Ob2RlKik7CisKKyAgICAvLyBDYWxsZWQgYXQgdGhl
IGVuZCBvZiBlYWNoIHJlbmRlciBxdWFudHVtLgorICAgIHZvaWQgaGFuZGxlUG9zdFJlbmRlclRh
c2tzKCk7CisKKyAgICAvLyBDYWxsZWQgcGVyaW9kaWNhbGx5IGF0IHRoZSBlbmQgb2YgZWFjaCBy
ZW5kZXIgcXVhbnR1bSB0byBkZXJlZmVyZW5jZSBmaW5pc2hlZCBzb3VyY2Ugbm9kZXMuCisgICAg
dm9pZCBkZXJlZkZpbmlzaGVkU291cmNlTm9kZXMoKTsKKworICAgIC8vIFdlIHJlYXAgYWxsIG1h
cmtlZCBub2RlcyBhdCB0aGUgZW5kIG9mIGVhY2ggcmVhbHRpbWUgcmVuZGVyIHF1YW50dW0gaW4g
ZGVsZXRlTWFya2VkTm9kZXMoKS4KKyAgICB2b2lkIG1hcmtGb3JEZWxldGlvbihBdWRpb05vZGUq
KTsKKyAgICB2b2lkIGRlbGV0ZU1hcmtlZE5vZGVzKCk7CisKKyAgICAvLyBLZWVwcyB0cmFjayBv
ZiB0aGUgbnVtYmVyIG9mIGNvbm5lY3Rpb25zIG1hZGUuCisgICAgdm9pZCBpbmNyZW1lbnRDb25u
ZWN0aW9uQ291bnQoKQorICAgIHsKKyAgICAgICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKKyAg
ICAgICAgbV9jb25uZWN0aW9uQ291bnQrKzsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBjb25uZWN0
aW9uQ291bnQoKSBjb25zdCB7IHJldHVybiBtX2Nvbm5lY3Rpb25Db3VudDsgfQorCisgICAgLy8K
KyAgICAvLyBUaHJlYWQgU2FmZXR5IGFuZCBHcmFwaCBMb2NraW5nOgorICAgIC8vCisgICAgCisg
ICAgdm9pZCBzZXRBdWRpb1RocmVhZChUaHJlYWRJZGVudGlmaWVyIHRocmVhZCkgeyBtX2F1ZGlv
VGhyZWFkID0gdGhyZWFkOyB9IC8vIEZJWE1FOiBjaGVjayBlaXRoZXIgbm90IGluaXRpYWxpemVk
IG9yIHRoZSBzYW1lCisgICAgVGhyZWFkSWRlbnRpZmllciBhdWRpb1RocmVhZCgpIGNvbnN0IHsg
cmV0dXJuIG1fYXVkaW9UaHJlYWQ7IH0KKyAgICBib29sIGlzQXVkaW9UaHJlYWQoKTsKKworICAg
IC8vIFJldHVybnMgdHJ1ZSBvbmx5IGFmdGVyIHRoZSBhdWRpbyB0aHJlYWQgaGFzIGJlZW4gc3Rh
cnRlZCBhbmQgdGhlbiBzaHV0ZG93bi4KKyAgICBib29sIGlzQXVkaW9UaHJlYWRGaW5pc2hlZCgp
IHsgcmV0dXJuIG1faXNBdWRpb1RocmVhZEZpbmlzaGVkOyB9CisgICAgCisgICAgLy8gbXVzdFJl
bGVhc2VMb2NrIGlzIHNldCB0byB0cnVlIGlmIHdlIGFjcXVpcmVkIHRoZSBsb2NrIGluIHRoaXMg
bWV0aG9kIGNhbGwgYW5kIGNhbGxlciBtdXN0IHVubG9jaygpLCBmYWxzZSBpZiBpdCB3YXMgcHJl
dmlvdXNseSBhY3F1aXJlZC4KKyAgICB2b2lkIGxvY2soYm9vbCYgbXVzdFJlbGVhc2VMb2NrKTsK
KworICAgIC8vIFJldHVybnMgdHJ1ZSBpZiB3ZSBvd24gdGhlIGxvY2suCisgICAgLy8gbXVzdFJl
bGVhc2VMb2NrIGlzIHNldCB0byB0cnVlIGlmIHdlIGFjcXVpcmVkIHRoZSBsb2NrIGluIHRoaXMg
bWV0aG9kIGNhbGwgYW5kIGNhbGxlciBtdXN0IHVubG9jaygpLCBmYWxzZSBpZiBpdCB3YXMgcHJl
dmlvdXNseSBhY3F1aXJlZC4KKyAgICBib29sIHRyeUxvY2soYm9vbCYgbXVzdFJlbGVhc2VMb2Nr
KTsKKworICAgIHZvaWQgdW5sb2NrKCk7CisKKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgdGhpcyB0
aHJlYWQgb3ducyB0aGUgY29udGV4dCdzIGxvY2suCisgICAgYm9vbCBpc0dyYXBoT3duZXIoKTsK
KworICAgIGNsYXNzIEF1dG9Mb2NrZXIgeworICAgIHB1YmxpYzoKKyAgICAgICAgQXV0b0xvY2tl
cihBdWRpb0NvbnRleHQqIGNvbnRleHQpCisgICAgICAgICAgICA6IG1fY29udGV4dChjb250ZXh0
KQorICAgICAgICB7CisgICAgICAgICAgICBBU1NFUlQoY29udGV4dCk7CisgICAgICAgICAgICBj
b250ZXh0LT5sb2NrKG1fbXVzdFJlbGVhc2VMb2NrKTsKKyAgICAgICAgfQorICAgICAgICAKKyAg
ICAgICAgfkF1dG9Mb2NrZXIoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAobV9tdXN0UmVs
ZWFzZUxvY2spCisgICAgICAgICAgICAgICAgbV9jb250ZXh0LT51bmxvY2soKTsKKyAgICAgICAg
fQorICAgIHByaXZhdGU6CisgICAgICAgIEF1ZGlvQ29udGV4dCogbV9jb250ZXh0OworICAgICAg
ICBib29sIG1fbXVzdFJlbGVhc2VMb2NrOworICAgIH07CisgICAgCisgICAgLy8gSW4gQXVkaW9O
b2RlOjpkZXJlZigpIGEgdHJ5TG9jaygpIGlzIHVzZWQgZm9yIGNhbGxpbmcgZmluaXNoRGVyZWYo
KSwgYnV0IGlmIGl0IGZhaWxzIGtlZXAgdHJhY2sgaGVyZS4KKyAgICB2b2lkIGFkZERlZmVycmVk
RmluaXNoRGVyZWYoQXVkaW9Ob2RlKiwgQXVkaW9Ob2RlOjpSZWZUeXBlKTsKKworICAgIC8vIElu
IHRoZSBhdWRpbyB0aHJlYWQgYXQgdGhlIHN0YXJ0IG9mIGVhY2ggcmVuZGVyIGN5Y2xlLCB3ZSds
bCBjYWxsIGhhbmRsZURlZmVycmVkRmluaXNoRGVyZWZzKCkuCisgICAgdm9pZCBoYW5kbGVEZWZl
cnJlZEZpbmlzaERlcmVmcygpOworICAgIAorcHJpdmF0ZToKKyAgICBBdWRpb0NvbnRleHQoRG9j
dW1lbnQqKTsKKyAgICB2b2lkIGxhenlJbml0aWFsaXplKCk7CisgICAgdm9pZCB1bmluaXRpYWxp
emUoKTsKKyAgICAKKyAgICBib29sIG1faXNJbml0aWFsaXplZDsKKyAgICBib29sIG1faXNBdWRp
b1RocmVhZEZpbmlzaGVkOworICAgIGJvb2wgbV9pc0F1ZGlvVGhyZWFkU2h1dGRvd247CisKKyAg
ICBEb2N1bWVudCogbV9kb2N1bWVudDsKKworICAgIC8vIFRoZSBjb250ZXh0IGl0c2VsZiBrZWVw
cyBhIHJlZmVyZW5jZSB0byBhbGwgc291cmNlIG5vZGVzLiAgVGhlIHNvdXJjZSBub2RlcywgdGhl
biByZWZlcmVuY2UgYWxsIG5vZGVzIHRoZXkncmUgY29ubmVjdGVkIHRvLgorICAgIC8vIEluIHR1
cm4sIHRoZXNlIG5vZGVzIHJlZmVyZW5jZSBhbGwgbm9kZXMgdGhleSdyZSBjb25uZWN0ZWQgdG8u
ICBBbGwgbm9kZXMgYXJlIHVsdGltYXRlbHkgY29ubmVjdGVkIHRvIHRoZSBBdWRpb0Rlc3RpbmF0
aW9uTm9kZS4KKyAgICAvLyBXaGVuIHRoZSBjb250ZXh0IGRlcmVmZXJlbmNlcyBhIHNvdXJjZSBu
b2RlLCBpdCB3aWxsIGJlIGRlYWN0aXZhdGVkIGZyb20gdGhlIHJlbmRlcmluZyBncmFwaCBhbG9u
ZyB3aXRoIGFsbCBvdGhlciBub2RlcyBpdCBpcworICAgIC8vIHVuaXF1ZWx5IGNvbm5lY3RlZCB0
by4gIFNlZSB0aGUgQXVkaW9Ob2RlOjpyZWYoKSBhbmQgQXVkaW9Ob2RlOjpkZXJlZigpIG1ldGhv
ZHMgZm9yIG1vcmUgZGV0YWlscy4KKyAgICB2b2lkIHJlZk5vZGUoQXVkaW9Ob2RlKik7CisgICAg
dm9pZCBkZXJlZk5vZGUoQXVkaW9Ob2RlKik7CisKKyAgICAvLyBXaGVuIHRoZSBjb250ZXh0IGdv
ZXMgYXdheSwgdGhlcmUgbWlnaHQgc3RpbGwgYmUgc29tZSBzb3VyY2VzIHdoaWNoIGhhdmVuJ3Qg
ZmluaXNoZWQgcGxheWluZy4KKyAgICAvLyBNYWtlIHN1cmUgdG8gZGVyZWZlcmVuY2UgdGhlbSBo
ZXJlLgorICAgIHZvaWQgZGVyZWZVbmZpbmlzaGVkU291cmNlTm9kZXMoKTsKKworICAgIFJlZlB0
cjxBdWRpb0Rlc3RpbmF0aW9uTm9kZT4gbV9kZXN0aW5hdGlvbk5vZGU7CisgICAgUmVmUHRyPEF1
ZGlvTGlzdGVuZXI+IG1fbGlzdGVuZXI7CisKKyAgICAvLyBPbmx5IGFjY2Vzc2VkIGluIHRoZSBt
YWluIHRocmVhZC4KKyAgICBWZWN0b3I8UmVmUHRyPEF1ZGlvQnVmZmVyPiA+IG1fYWxsb2NhdGVk
QnVmZmVyczsKKworICAgIC8vIE9ubHkgYWNjZXNzZWQgaW4gdGhlIGF1ZGlvIHRocmVhZC4KKyAg
ICBWZWN0b3I8QXVkaW9Ob2RlKj4gbV9maW5pc2hlZE5vZGVzOworCisgICAgLy8gV2UgZG9uJ3Qg
dXNlIFJlZlB0cjxBdWRpb05vZGU+IGhlcmUgYmVjYXVzZSBBdWRpb05vZGUgaGFzIGEgbW9yZSBj
b21wbGV4IHJlZigpIC8gZGVyZWYoKSBpbXBsZW1lbnRhdGlvbgorICAgIC8vIHdpdGggYW4gb3B0
aW9uYWwgYXJndW1lbnQgZm9yIHJlZlR5cGUuICBXZSBuZWVkIHRvIHVzZSB0aGUgc3BlY2lhbCBy
ZWZUeXBlOiBSZWZUeXBlQ29ubmVjdGlvbgorICAgIC8vIEVpdGhlciBhY2Nlc3NlZCB3aGVuIHRo
ZSBncmFwaCBsb2NrIGlzIGhlbGQsIG9yIG9uIHRoZSBtYWluIHRocmVhZCB3aGVuIHRoZSBhdWRp
byB0aHJlYWQgaGFzIGZpbmlzaGVkLgorICAgIFZlY3RvcjxBdWRpb05vZGUqPiBtX3JlZmVyZW5j
ZWROb2RlczsKKworICAgIC8vIEFjY3VtdWxhdGUgbm9kZXMgd2hpY2ggbmVlZCB0byBiZSBkZWxl
dGVkIGF0IHRoZSBlbmQgb2YgYSByZW5kZXIgY3ljbGUgKGluIHJlYWx0aW1lIHRocmVhZCkgaGVy
ZS4KKyAgICBWZWN0b3I8QXVkaW9Ob2RlKj4gbV9ub2Rlc1RvRGVsZXRlOworCisgICAgVmVjdG9y
PFJlZlB0cjxDYWNoZWRBdWRpbz4gPiBtX2NhY2hlZEF1ZGlvUmVmZXJlbmNlczsKKworICAgIE93
blB0cjxBdWRpb0J1cz4gbV90ZW1wb3JhcnlNb25vQnVzOworICAgIE93blB0cjxBdWRpb0J1cz4g
bV90ZW1wb3JhcnlTdGVyZW9CdXM7CisKKyAgICB1bnNpZ25lZCBtX2Nvbm5lY3Rpb25Db3VudDsK
KworICAgIC8vIEdyYXBoIGxvY2tpbmcuCisgICAgTXV0ZXggbV9jb250ZXh0R3JhcGhNdXRleDsK
KyAgICB2b2xhdGlsZSBUaHJlYWRJZGVudGlmaWVyIG1fYXVkaW9UaHJlYWQ7CisgICAgdm9sYXRp
bGUgVGhyZWFkSWRlbnRpZmllciBtX2dyYXBoT3duZXJUaHJlYWQ7IC8vIGlmIHRoZSBsb2NrIGlz
IGhlbGQgdGhlbiB0aGlzIGlzIHRoZSB0aHJlYWQgd2hpY2ggb3ducyBpdCwgb3RoZXJ3aXNlID09
IFVuZGVmaW5lZFRocmVhZElkZW50aWZpZXIKKyAgICAKKyAgICAvLyBEZWZlcnJlZCBkZS1yZWZl
cmVuY2luZy4KKyAgICBzdHJ1Y3QgUmVmSW5mbyB7CisgICAgICAgIFJlZkluZm8oQXVkaW9Ob2Rl
KiBub2RlLCBBdWRpb05vZGU6OlJlZlR5cGUgcmVmVHlwZSkKKyAgICAgICAgICAgIDogbV9ub2Rl
KG5vZGUpCisgICAgICAgICAgICAsIG1fcmVmVHlwZShyZWZUeXBlKQorICAgICAgICB7CisgICAg
ICAgIH0KKyAgICAgICAgQXVkaW9Ob2RlKiBtX25vZGU7CisgICAgICAgIEF1ZGlvTm9kZTo6UmVm
VHlwZSBtX3JlZlR5cGU7CisgICAgfTsgICAgCisKKyAgICAvLyBPbmx5IGFjY2Vzc2VkIGluIHRo
ZSBhdWRpbyB0aHJlYWQuCisgICAgVmVjdG9yPFJlZkluZm8+IG1fZGVmZXJyZWRGaW5pc2hEZXJl
Zkxpc3Q7Cit9OworCit9IC8vIFdlYkNvcmUKKworI2VuZGlmIC8vIEF1ZGlvQ29udGV4dF9oCklu
ZGV4OiBXZWJDb3JlL3dlYmF1ZGlvL0F1ZGlvQ29udGV4dC5pZGwKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2Vi
Q29yZS93ZWJhdWRpby9BdWRpb0NvbnRleHQuaWRsCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS93
ZWJhdWRpby9BdWRpb0NvbnRleHQuaWRsCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDcwIEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4g
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQor
ICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiAgTmVpdGhlciB0aGUgbmFtZSBvZiBBcHBsZSBDb21w
dXRlciwgSW5jLiAoIkFwcGxlIikgbm9yIHRoZSBuYW1lcyBvZgorICogICAgIGl0cyBjb250cmli
dXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQK
KyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVu
IHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBB
TkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQK
KyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9O
IEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKwor
bW9kdWxlIHdlYmF1ZGlvIHsKKyAgICBpbnRlcmZhY2UgWworICAgICAgICBDb25kaXRpb25hbD1X
RUJfQVVESU8sCisgICAgICAgIENhbkJlQ29uc3RydWN0ZWQsCisgICAgICAgIEN1c3RvbUNvbnN0
cnVjdEZ1bmN0aW9uLAorICAgICAgICBWOEN1c3RvbUNvbnN0cnVjdG9yCisgICAgXSBBdWRpb0Nv
bnRleHQgeworICAgICAgICAvLyBBbGwgcmVuZGVyZWQgYXVkaW8gdWx0aW1hdGVseSBjb25uZWN0
cyB0byBkZXN0aW5hdGlvbiwgd2hpY2ggcmVwcmVzZW50cyB0aGUgYXVkaW8gaGFyZHdhcmUuCisg
ICAgICAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBBdWRpb0Rlc3RpbmF0aW9uTm9kZSBkZXN0aW5hdGlv
bjsKKworICAgICAgICAvLyBBbGwgc2NoZWR1bGVkIHRpbWVzIGFyZSByZWxhdGl2ZSB0byB0aGlz
IHRpbWUgaW4gc2Vjb25kcy4KKyAgICAgICAgcmVhZG9ubHkgYXR0cmlidXRlIGZsb2F0IGN1cnJl
bnRUaW1lOworCisgICAgICAgIC8vIEFsbCBBdWRpb05vZGVzIGluIHRoZSBjb250ZXh0IHJ1biBh
dCB0aGlzIHNhbXBsZS1yYXRlIChpbiBzYW1wbGUtZnJhbWVzIHBlciBzZWNvbmQpLgorICAgICAg
ICByZWFkb25seSBhdHRyaWJ1dGUgZmxvYXQgc2FtcGxlUmF0ZTsKKworICAgICAgICAvLyBBbGwg
cGFubmluZyBpcyByZWxhdGl2ZSB0byB0aGlzIGxpc3RlbmVyLgorICAgICAgICByZWFkb25seSBh
dHRyaWJ1dGUgQXVkaW9MaXN0ZW5lciBsaXN0ZW5lcjsKKworICAgICAgICBBdWRpb0J1ZmZlciBj
cmVhdGVCdWZmZXIoaW4gdW5zaWduZWQgbG9uZyBudW1iZXJPZkNoYW5uZWxzLCBpbiB1bnNpZ25l
ZCBsb25nIG51bWJlck9mRnJhbWVzLCBpbiBmbG9hdCBzYW1wbGVSYXRlKTsKKworICAgICAgICAv
LyBTb3VyY2UKKyAgICAgICAgQXVkaW9CdWZmZXJTb3VyY2VOb2RlIGNyZWF0ZUJ1ZmZlclNvdXJj
ZSgpOworCisgICAgICAgIC8vIFByb2Nlc3Npbmcgbm9kZXMKKyAgICAgICAgQXVkaW9HYWluTm9k
ZSBjcmVhdGVHYWluTm9kZSgpOworICAgICAgICBEZWxheU5vZGUgY3JlYXRlRGVsYXlOb2RlKCk7
CisgICAgICAgIExvd1Bhc3MyRmlsdGVyTm9kZSBjcmVhdGVMb3dQYXNzMkZpbHRlcigpOworICAg
ICAgICBIaWdoUGFzczJGaWx0ZXJOb2RlIGNyZWF0ZUhpZ2hQYXNzMkZpbHRlcigpOworICAgICAg
ICBBdWRpb1Bhbm5lck5vZGUgY3JlYXRlUGFubmVyKCk7CisgICAgICAgIENvbnZvbHZlck5vZGUg
Y3JlYXRlQ29udm9sdmVyKCk7CisgICAgICAgIFJlYWx0aW1lQW5hbHlzZXJOb2RlIGNyZWF0ZUFu
YWx5c2VyKCk7CisgICAgICAgIEphdmFTY3JpcHRBdWRpb05vZGUgY3JlYXRlSmF2YVNjcmlwdE5v
ZGUoaW4gdW5zaWduZWQgbG9uZyBidWZmZXJTaXplKTsKKworICAgICAgICAvLyBDaGFubmVsIHNw
bGl0dGluZyBhbmQgbWVyZ2luZworICAgICAgICBBdWRpb0NoYW5uZWxTcGxpdHRlciBjcmVhdGVD
aGFubmVsU3BsaXR0ZXIoKTsKKyAgICAgICAgQXVkaW9DaGFubmVsTWVyZ2VyIGNyZWF0ZUNoYW5u
ZWxNZXJnZXIoKTsKKworICAgICAgICAvLyBGSVhNRTogVGVtcG9yYXJ5IC0gdG8gYmUgcmVwbGFj
ZWQgd2l0aCBYSFIuCisgICAgICAgIENhY2hlZEF1ZGlvIGNyZWF0ZUF1ZGlvUmVxdWVzdChpbiBE
T01TdHJpbmcgdXJsLCBpbiBib29sZWFuIG1peFRvTW9ubyk7CisgICAgfTsKK30K
</data>

          </attachment>
      

    </bug>

</bugzilla>