<?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>45863</bug_id>
          
          <creation_ts>2010-09-15 18:52:41 -0700</creation_ts>
          <short_desc>Add HRTFKernel files</short_desc>
          <delta_ts>2010-09-22 01:11:07 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>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>cmarrin</cc>
    
    <cc>commit-queue</cc>
    
    <cc>dglazkov</cc>
    
    <cc>eric.carlson</cc>
    
    <cc>jamesr</cc>
    
    <cc>jer.noble</cc>
    
    <cc>kbr</cc>
    
    <cc>simon.fraser</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>279896</commentid>
    <comment_count>0</comment_count>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-09-15 18:52:41 -0700</bug_when>
    <thetext>Add HRTFKernel files</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>279898</commentid>
    <comment_count>1</comment_count>
      <attachid>67758</attachid>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-09-15 18:54:32 -0700</bug_when>
    <thetext>Created attachment 67758
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>279911</commentid>
    <comment_count>2</comment_count>
      <attachid>67758</attachid>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2010-09-15 19:34:23 -0700</bug_when>
    <thetext>Comment on attachment 67758
Patch

You should say what HRTF stands for somewhere.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>280321</commentid>
    <comment_count>3</comment_count>
      <attachid>67758</attachid>
    <who name="James Robinson">jamesr</who>
    <bug_when>2010-09-16 13:40:29 -0700</bug_when>
    <thetext>Comment on attachment 67758
Patch

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

&gt; WebCore/platform/audio/HRTFKernel.cpp:73
&gt; +    size_t truncatedResponseLength = std::min(responseLength, fftSize / 2); // truncate if necessary to max impulse response length allowed by FFT

WebKit style is to add a &apos;using namespace std;&apos; declaration and then call undecorated min().

&gt; WebCore/platform/audio/HRTFKernel.cpp:76
&gt; +    float numberOfFadeOutFrames = sampleRate / 4410; // 10 sample-frames @44.1KHz sample-rate

This is truncating from double-&gt;float, do you mean to?  If so please use a static_cast&lt;&gt; to make it explicit for readers and the compiler.

&gt; WebCore/platform/audio/HRTFKernel.h:50
&gt; +    static PassRefPtr&lt;HRTFKernel&gt; create(float* impulseResponse, size_t responseLength, size_t fftSize, double sampleRate, bool bassBoost)

Can you use something other than a float*/size_t pair?  It looks like we might be able to use an AudioChannel here.  Passing raw pointer/length pairs around is error prone.

&gt; WebCore/platform/audio/HRTFKernel.h:63
&gt; +    const FFTFrame* fftFrame() const { return m_fftFrame.get(); }
&gt; +    
&gt; +    size_t fftSize() const { return fftFrame()-&gt;fftSize(); }

WebKit code typically implements functions like fftSize() as just return m_fftFrame-&gt;fftSize() instead of providing a const FFTFrame* const getter.

&gt; WebCore/platform/audio/HRTFKernel.h:71
&gt; +    // Converts back into impulse-response form.
&gt; +    // Response must point to storage of size fftSize().
&gt; +    void generateImpulseResponse(float* response);

This seems fragile as well.  What will the callers of this look like?  Is there any way way to do the logic associated with this in a way that doesn&apos;t require passing raw ptrs around?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>280391</commentid>
    <comment_count>4</comment_count>
      <attachid>67845</attachid>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-09-16 15:28:39 -0700</bug_when>
    <thetext>Created attachment 67845
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>280426</commentid>
    <comment_count>5</comment_count>
      <attachid>67854</attachid>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-09-16 16:02:59 -0700</bug_when>
    <thetext>Created attachment 67854
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>280429</commentid>
    <comment_count>6</comment_count>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-09-16 16:04:33 -0700</bug_when>
    <thetext>I addressed Simon Fraser&apos;s comment about HRTF by adding a comment in the header file.

James, I think I&apos;ve addressed your comments:

&gt; WebCore/platform/audio/HRTFKernel.cpp:73
&gt; +    size_t truncatedResponseLength = std::min(responseLength, fftSize / 2); // truncate if necessary to max impulse response length allowed by FFT

WebKit style is to add a &apos;using namespace std;&apos; declaration and then call undecorated min().

FIXED



&gt; WebCore/platform/audio/HRTFKernel.cpp:76
&gt; +    float numberOfFadeOutFrames = sampleRate / 4410; // 10 sample-frames @44.1KHz sample-rate

This is truncating from double-&gt;float, do you mean to?  If so please use a static_cast&lt;&gt; to make it explicit for readers and the compiler.

ADDED static_cast&lt;unsigned&gt; since it needs to be quantized to an integer number of sample-frames to do the fade-out.




&gt; WebCore/platform/audio/HRTFKernel.h:50
&gt; +    static PassRefPtr&lt;HRTFKernel&gt; create(float* impulseResponse, size_t responseLength, size_t fftSize, double sampleRate, bool bassBoost)

Can you use something other than a float*/size_t pair?  It looks like we might be able to use an AudioChannel here.  Passing raw pointer/length pairs around is error prone.


FIXED: changed to take AudioChannel* argument



&gt; WebCore/platform/audio/HRTFKernel.h:63
&gt; +    const FFTFrame* fftFrame() const { return m_fftFrame.get(); }
&gt; +    
&gt; +    size_t fftSize() const { return fftFrame()-&gt;fftSize(); }

WebKit code typically implements functions like fftSize() as just return m_fftFrame-&gt;fftSize() instead of providing a const FFTFrame* const getter.

FIXED




&gt; WebCore/platform/audio/HRTFKernel.h:71
&gt; +    // Converts back into impulse-response form.
&gt; +    // Response must point to storage of size fftSize().
&gt; +    void generateImpulseResponse(float* response);

This seems fragile as well.  What will the callers of this look like?  Is there any way way to do the logic associated with this in a way that doesn&apos;t require passing raw ptrs around?


Yes, you&apos;re right.  A better way is to return a PassOwnPtr&lt;AudioChannel&gt; -- changing to createImpulseResponse().
I wrote this original code a long time ago before I was as familiar with the OwnPtr and create() style and didn&apos;t notice this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>280510</commentid>
    <comment_count>7</comment_count>
      <attachid>67854</attachid>
    <who name="James Robinson">jamesr</who>
    <bug_when>2010-09-16 19:36:11 -0700</bug_when>
    <thetext>Comment on attachment 67854
Patch

Looking pretty close.  Left a few comments.

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

&gt; WebCore/platform/audio/HRTFKernel.cpp:47
&gt; +static void extractAverageGroupDelay(float* impulseP, size_t length, double* delayFrames)

It appears this always operates on an AudioChannel, could it take one of those instead of float*/size_t?  Then I believe can the comment about the length requirement and associated ASSERT

&gt; WebCore/platform/audio/HRTFKernel.cpp:58
&gt; +    *delayFrames = frameDelay;

Instead of using an out param, could this function just return the delay?

&gt; WebCore/platform/audio/HRTFKernel.cpp:77
&gt; +    if (bassBoost) {
&gt; +        // Run through some post-processing to boost the bass a little -- the HRTF&apos;s seem to be a little bass-deficient.
&gt; +        Biquad filter;
&gt; +        filter.setLowShelfParams(700.0 / nyquist(), 6.0); // boost 6dB at 700Hz
&gt; +        filter.process(impulseResponse, impulseResponse, responseLength);
&gt; +    }

Do we always want to do this?  If it&apos;s a property of the HRTF data, what about doing the processing on the source data instead of doing this at runtime?

This doesn&apos;t seem like something the caller will want to change dynamically at runtime, so it shouldn&apos;t be a parameter.  WebAudio users could set up a filter node to do this boost (or any other sort of effect) if they want.

&gt; WebCore/platform/audio/HRTFKernel.cpp:87
&gt; +            float x = 1.0f - (i - (truncatedResponseLength - numberOfFadeOutFrames)) / numberOfFadeOutFrames;

I&apos;m not positive, but I think this division will be an integer division and x will end up always being 1.0.

&gt; WebCore/platform/audio/HRTFKernel.h:53
&gt; +    // Note: this is destructive on the passed in impulseResponse array.
&gt; +    // responseLength must be a power of two.

this comment needs updating

&gt; WebCore/platform/audio/HRTFKernel.h:65
&gt; +    const FFTFrame* fftFrame() const { return m_fftFrame.get(); }

Remove this getter, I doubt it&apos;s needed

&gt; WebCore/platform/audio/HRTFKernel.h:83
&gt; +#ifndef NDEBUG
&gt; +    // For debugging
&gt; +    void print()
&gt; +    {
&gt; +        printf(&quot;frameDelay = %f\n&quot;, m_frameDelay);
&gt; +        m_fftFrame-&gt;print();
&gt; +    }
&gt; +#endif

Is this still needed?  Remove if not, otherwise at least move it out of the class definition.

&gt; WebCore/platform/audio/HRTFKernel.h:90
&gt; +    HRTFKernel()
&gt; +        : m_fftFrame(0)
&gt; +        , m_frameDelay(0.0)
&gt; +    {
&gt; +    }

This constructor looks unused, if so please remove it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>280799</commentid>
    <comment_count>8</comment_count>
      <attachid>67936</attachid>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-09-17 12:36:56 -0700</bug_when>
    <thetext>Created attachment 67936
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>280811</commentid>
    <comment_count>9</comment_count>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-09-17 12:47:33 -0700</bug_when>
    <thetext>James, thanks for the review.  I&apos;ve addressed all of your comments except for the one about the post-processing stage (see comment below).

(In reply to comment #7)
&gt; (From update of attachment 67854 [details])
&gt; Looking pretty close.  Left a few comments.
&gt; 
&gt; &gt; WebCore/platform/audio/HRTFKernel.cpp:47
&gt; &gt; +static void extractAverageGroupDelay(float* impulseP, size_t length, double* delayFrames)
&gt; 
&gt; It appears this always operates on an AudioChannel, could it take one of those instead of float*/size_t?  Then I believe can the comment about the length requirement and associated ASSERT

FIXED

&gt; 
&gt; &gt; WebCore/platform/audio/HRTFKernel.cpp:58
&gt; &gt; +    *delayFrames = frameDelay;
&gt; 
&gt; Instead of using an out param, could this function just return the delay?

FIXED


&gt; &gt; WebCore/platform/audio/HRTFKernel.cpp:77
&gt; &gt; +    if (bassBoost) {
&gt; &gt; +        // Run through some post-processing to boost the bass a little -- the HRTF&apos;s seem to be a little bass-deficient.
&gt; &gt; +        Biquad filter;
&gt; &gt; +        filter.setLowShelfParams(700.0 / nyquist(), 6.0); // boost 6dB at 700Hz
&gt; &gt; +        filter.process(impulseResponse, impulseResponse, responseLength);
&gt; &gt; +    }
&gt; 
&gt; Do we always want to do this?  If it&apos;s a property of the HRTF data, what about doing the processing on the source data instead of doing this at runtime?
&gt; 
&gt; This doesn&apos;t seem like something the caller will want to change dynamically at runtime, so it shouldn&apos;t be a parameter.  WebAudio users could set up a filter node to do this boost (or any other sort of effect) if they want.

I agree with you on this, but I&apos;ve left this as a FIXME.  It&apos;s non-trivial to re-generate the data-sets, requiring very careful verification and testing.  Later on in refining the data-sets I&apos;m planning on reducing their size from their current &gt; 1Mb to 500Kb or less.  At this stage, I plan on baking in this post-processing and this code can be removed.

In the meantime, although keeping the post-processing stage in the code at load time is not ideal, it is not very expensive at all (the Biquad processors are insanely fast).


&gt; &gt; WebCore/platform/audio/HRTFKernel.cpp:87
&gt; &gt; +            float x = 1.0f - (i - (truncatedResponseLength - numberOfFadeOutFrames)) / numberOfFadeOutFrames;
&gt; 
&gt; I&apos;m not positive, but I think this division will be an integer division and x will end up always being 1.0.

You&apos;re quite right.  I broke this when I made yesterday&apos;s change to numberOfFadeOutFrames.   FIXED


&gt; &gt; WebCore/platform/audio/HRTFKernel.h:53
&gt; &gt; +    // Note: this is destructive on the passed in impulseResponse array.
&gt; &gt; +    // responseLength must be a power of two.
&gt; 
&gt; this comment needs updating

FIXED


&gt; &gt; WebCore/platform/audio/HRTFKernel.h:65
&gt; &gt; +    const FFTFrame* fftFrame() const { return m_fftFrame.get(); }
&gt; 
&gt; Remove this getter, I doubt it&apos;s needed

FIXED


&gt; &gt; WebCore/platform/audio/HRTFKernel.h:83
&gt; &gt; +#ifndef NDEBUG
&gt; &gt; +    // For debugging
&gt; &gt; +    void print()
&gt; &gt; +    {
&gt; &gt; +        printf(&quot;frameDelay = %f\n&quot;, m_frameDelay);
&gt; &gt; +        m_fftFrame-&gt;print();
&gt; &gt; +    }
&gt; &gt; +#endif
&gt; 
&gt; Is this still needed?  Remove if not, otherwise at least move it out of the class definition.

FIXED


&gt; &gt; WebCore/platform/audio/HRTFKernel.h:90
&gt; &gt; +    HRTFKernel()
&gt; &gt; +        : m_fftFrame(0)
&gt; &gt; +        , m_frameDelay(0.0)
&gt; &gt; +    {
&gt; &gt; +    }
&gt; 
&gt; This constructor looks unused, if so please remove it.

FIXED</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>281804</commentid>
    <comment_count>10</comment_count>
      <attachid>67936</attachid>
    <who name="James Robinson">jamesr</who>
    <bug_when>2010-09-20 14:15:41 -0700</bug_when>
    <thetext>Comment on attachment 67936
Patch

Looks good! Just some nits, feel free to address while landing or post a new patch.

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

&gt; WebCore/platform/audio/HRTFKernel.cpp:124
&gt; +    bool checkX = x &gt;= 0.0 &amp;&amp; x &lt; 1.0;
&gt; +    ASSERT(checkX);

nit: better to put the predicate directly into the ASSERT()

&gt; WebCore/platform/audio/HRTFKernel.cpp:126
&gt; +    x = max(0.0, x);
&gt; +    x = min(1.0, x);

nit: could be one expression

&gt; WebCore/platform/audio/HRTFKernel.h:67
&gt; +    

nit: extra newline</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>282563</commentid>
    <comment_count>11</comment_count>
      <attachid>68293</attachid>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-09-21 14:36:56 -0700</bug_when>
    <thetext>Created attachment 68293
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>282565</commentid>
    <comment_count>12</comment_count>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-09-21 14:37:58 -0700</bug_when>
    <thetext>This was previously R+ by James Robinson.  This last patch just addresses his last few fixup comments.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>282567</commentid>
    <comment_count>13</comment_count>
      <attachid>68293</attachid>
    <who name="James Robinson">jamesr</who>
    <bug_when>2010-09-21 14:47:45 -0700</bug_when>
    <thetext>Comment on attachment 68293
Patch

Still looks good!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>282828</commentid>
    <comment_count>14</comment_count>
      <attachid>68293</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2010-09-22 01:11:01 -0700</bug_when>
    <thetext>Comment on attachment 68293
Patch

Clearing flags on attachment: 68293

Committed r68025: &lt;http://trac.webkit.org/changeset/68025&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>282829</commentid>
    <comment_count>15</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2010-09-22 01:11:07 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>67758</attachid>
            <date>2010-09-15 18:54:32 -0700</date>
            <delta_ts>2010-09-16 15:28:35 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-45863-20100915185431.patch</filename>
            <type>text/plain</type>
            <size>10271</size>
            <attacher name="Chris Rogers">crogers</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2NzU5NCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMjYgQEAKKzIwMTAtMDktMTUgIENocmlzIFJvZ2VycyAgPGNyb2dlcnNAZ29vZ2xl
LmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBB
ZGQgSFJURktlcm5lbCBmaWxlcworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93
X2J1Zy5jZ2k/aWQ9NDU4NjMKKworICAgICAgICBObyBuZXcgdGVzdHMgc2luY2UgYXVkaW8gQVBJ
IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQuCisKKyAgICAgICAgKiBwbGF0Zm9ybS9hdWRpby9IUlRG
S2VybmVsLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpleHRyYWN0QXZlcmFnZUdyb3Vw
RGVsYXkpOgorICAgICAgICAoV2ViQ29yZTo6SFJURktlcm5lbDo6SFJURktlcm5lbCk6CisgICAg
ICAgIChXZWJDb3JlOjpIUlRGS2VybmVsOjpnZW5lcmF0ZUltcHVsc2VSZXNwb25zZSk6CisgICAg
ICAgICogcGxhdGZvcm0vYXVkaW8vSFJURktlcm5lbC5oOiBBZGRlZC4KKyAgICAgICAgKFdlYkNv
cmU6OkhSVEZLZXJuZWw6OmNyZWF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpIUlRGS2VybmVsOjpm
ZnRGcmFtZSk6CisgICAgICAgIChXZWJDb3JlOjpIUlRGS2VybmVsOjpmZnRTaXplKToKKyAgICAg
ICAgKFdlYkNvcmU6OkhSVEZLZXJuZWw6OmZyYW1lRGVsYXkpOgorICAgICAgICAoV2ViQ29yZTo6
SFJURktlcm5lbDo6c2FtcGxlUmF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpIUlRGS2VybmVsOjpu
eXF1aXN0KToKKyAgICAgICAgKFdlYkNvcmU6OkhSVEZLZXJuZWw6OnByaW50KToKKyAgICAgICAg
KFdlYkNvcmU6OkhSVEZLZXJuZWw6OkhSVEZLZXJuZWwpOgorCiAyMDEwLTA5LTE1ICBTaW1vbiBG
cmFzZXIgIDxzaW1vbi5mcmFzZXJAYXBwbGUuY29tPgogCiAgICAgICAgIEZpeCBjaHJvbWl1bSBi
dWlsZC4KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vYXVkaW8vSFJURktlcm5lbC5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9IUlRGS2VybmVsLmNwcAkocmV2aXNpb24g
MCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vYXVkaW8vSFJURktlcm5lbC5jcHAJKHJldmlzaW9uIDAp
CkBAIC0wLDAgKzEsMTAwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAq
IGFyZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiAgTmVpdGhlciB0
aGUgbmFtZSBvZiBBcHBsZSBDb21wdXRlciwgSW5jLiAoIkFwcGxlIikgbm9yIHRoZSBuYW1lcyBv
ZgorICogICAgIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9t
b3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBz
cGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkK
KyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElO
IE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NT
IE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YK
KyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaWYgRU5BQkxFKFdF
Ql9BVURJTykKKworI2luY2x1ZGUgIkhSVEZLZXJuZWwuaCIKKworI2luY2x1ZGUgIkJpcXVhZC5o
IgorI2luY2x1ZGUgIkZGVEZyYW1lLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworLy8gVGFr
ZXMgaW1wdWxzZVAgYXMgYW4gaW5wdXQgaW1wdWxzZSByZXNwb25zZSBvZiB0aGUgZ2l2ZW4gbGVu
Z3RoIGFuZCBjYWxjdWxhdGVzIHRoZSBhdmVyYWdlIGdyb3VwIGRlbGF5LgorLy8gVGhpcyByZXBy
ZXNlbnRzIHRoZSBpbml0aWFsIGRlbGF5IGJlZm9yZSB0aGUgbW9zdCBlbmVyZ2V0aWMgcGFydCBv
ZiB0aGUgaW1wdWxzZSByZXNwb25zZS4KKy8vIFRoaXMgZGVsYXkgaXMgcmV0dXJuZWQgaW4gZGVs
YXlGcmFtZXMsIGFuZCB0aGUgZGVsYXkgaXMgcmVtb3ZlZCBmcm9tIHRoZSBpbXB1bHNlUCBpbXB1
bHNlIHJlc3BvbnNlLgorLy8gbGVuZ3RoIG11c3QgYmUgYSBwb3dlciBvZiAyLgorc3RhdGljIHZv
aWQgZXh0cmFjdEF2ZXJhZ2VHcm91cERlbGF5KGZsb2F0KiBpbXB1bHNlUCwgc2l6ZV90IGxlbmd0
aCwgZG91YmxlKiBkZWxheUZyYW1lcykKK3sKKyAgICAvLyBDaGVjayB0aGF0IGxlbmd0aCBpcyBw
b3dlci1vZi0yOworICAgIEFTU0VSVCgxVUwgPDwgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGxvZzIo
bGVuZ3RoKSkgPT0gbGVuZ3RoKTsKKworICAgIEZGVEZyYW1lIGVzdGltYXRpb25GcmFtZShsZW5n
dGgpOworICAgIGVzdGltYXRpb25GcmFtZS5kb0ZGVChpbXB1bHNlUCk7CisKKyAgICBkb3VibGUg
ZnJhbWVEZWxheSA9IGVzdGltYXRpb25GcmFtZS5leHRyYWN0QXZlcmFnZUdyb3VwRGVsYXkoKTsK
KyAgICBlc3RpbWF0aW9uRnJhbWUuZG9JbnZlcnNlRkZUKGltcHVsc2VQKTsKKworICAgICpkZWxh
eUZyYW1lcyA9IGZyYW1lRGVsYXk7Cit9CisKK0hSVEZLZXJuZWw6OkhSVEZLZXJuZWwoZmxvYXQq
IGltcHVsc2VSZXNwb25zZSwgc2l6ZV90IHJlc3BvbnNlTGVuZ3RoLCBzaXplX3QgZmZ0U2l6ZSwg
ZG91YmxlIHNhbXBsZVJhdGUsIGJvb2wgYmFzc0Jvb3N0KQorICAgIDogbV9mcmFtZURlbGF5KDAu
MCkKKyAgICAsIG1fc2FtcGxlUmF0ZShzYW1wbGVSYXRlKQoreworICAgIC8vIERldGVybWluZSB0
aGUgbGVhZGluZyBkZWxheSAoYXZlcmFnZSBncm91cCBkZWxheSkgZm9yIHRoZSByZXNwb25zZS4K
KyAgICBleHRyYWN0QXZlcmFnZUdyb3VwRGVsYXkoaW1wdWxzZVJlc3BvbnNlLCByZXNwb25zZUxl
bmd0aCwgJm1fZnJhbWVEZWxheSk7CisKKyAgICBpZiAoYmFzc0Jvb3N0KSB7CisgICAgICAgIC8v
IFJ1biB0aHJvdWdoIHNvbWUgcG9zdC1wcm9jZXNzaW5nIHRvIGJvb3N0IHRoZSBiYXNzIGEgbGl0
dGxlIC0tIHRoZSBIUlRGJ3Mgc2VlbSB0byBiZSBhIGxpdHRsZSBiYXNzLWRlZmljaWVudC4KKyAg
ICAgICAgQmlxdWFkIGZpbHRlcjsKKyAgICAgICAgZmlsdGVyLnNldExvd1NoZWxmUGFyYW1zKDcw
MC4wIC8gbnlxdWlzdCgpLCA2LjApOyAvLyBib29zdCA2ZEIgYXQgNzAwSHoKKyAgICAgICAgZmls
dGVyLnByb2Nlc3MoaW1wdWxzZVJlc3BvbnNlLCBpbXB1bHNlUmVzcG9uc2UsIHJlc3BvbnNlTGVu
Z3RoKTsKKyAgICB9CisKKyAgICAvLyBXZSBuZWVkIHRvIHRydW5jYXRlIHRvIGZpdCBpbnRvIDEv
MiB0aGUgRkZUIHNpemUgKHdpdGggemVybyBwYWRkaW5nKSBpbiBvcmRlciB0byBkbyBwcm9wZXIg
Y29udm9sdXRpb24uCisgICAgc2l6ZV90IHRydW5jYXRlZFJlc3BvbnNlTGVuZ3RoID0gc3RkOjpt
aW4ocmVzcG9uc2VMZW5ndGgsIGZmdFNpemUgLyAyKTsgLy8gdHJ1bmNhdGUgaWYgbmVjZXNzYXJ5
IHRvIG1heCBpbXB1bHNlIHJlc3BvbnNlIGxlbmd0aCBhbGxvd2VkIGJ5IEZGVAorCisgICAgLy8g
UXVpY2sgZmFkZS1vdXQgKGFwcGx5IHdpbmRvdykgYXQgdHJ1bmNhdGlvbiBwb2ludAorICAgIGZs
b2F0IG51bWJlck9mRmFkZU91dEZyYW1lcyA9IHNhbXBsZVJhdGUgLyA0NDEwOyAvLyAxMCBzYW1w
bGUtZnJhbWVzIEA0NC4xS0h6IHNhbXBsZS1yYXRlCisgICAgQVNTRVJUKG51bWJlck9mRmFkZU91
dEZyYW1lcyA8IHRydW5jYXRlZFJlc3BvbnNlTGVuZ3RoKTsKKyAgICBpZiAobnVtYmVyT2ZGYWRl
T3V0RnJhbWVzIDwgdHJ1bmNhdGVkUmVzcG9uc2VMZW5ndGgpIHsKKyAgICAgICAgZm9yICh1bnNp
Z25lZCBpID0gdHJ1bmNhdGVkUmVzcG9uc2VMZW5ndGggLSBudW1iZXJPZkZhZGVPdXRGcmFtZXM7
IGkgPCB0cnVuY2F0ZWRSZXNwb25zZUxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBmbG9hdCB4
ID0gMS4wZiAtIChpIC0gKHRydW5jYXRlZFJlc3BvbnNlTGVuZ3RoIC0gbnVtYmVyT2ZGYWRlT3V0
RnJhbWVzKSkgLyBudW1iZXJPZkZhZGVPdXRGcmFtZXM7CisgICAgICAgICAgICBpbXB1bHNlUmVz
cG9uc2VbaV0gKj0geDsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1fZmZ0RnJhbWUgPSBhZG9w
dFB0cihuZXcgRkZURnJhbWUoZmZ0U2l6ZSkpOworICAgIG1fZmZ0RnJhbWUtPmRvUGFkZGVkRkZU
KGltcHVsc2VSZXNwb25zZSwgdHJ1bmNhdGVkUmVzcG9uc2VMZW5ndGgpOworfQorCit2b2lkIEhS
VEZLZXJuZWw6OmdlbmVyYXRlSW1wdWxzZVJlc3BvbnNlKGZsb2F0KiByZXNwb25zZSkKK3sKKyAg
ICBGRlRGcmFtZSBmZnRGcmFtZSgqbV9mZnRGcmFtZSk7CisKKyAgICAvLyBBZGQgbGVhZGluZyBk
ZWxheSBiYWNrIGluLgorICAgIGZmdEZyYW1lLmFkZENvbnN0YW50R3JvdXBEZWxheShtX2ZyYW1l
RGVsYXkpOworICAgIGZmdEZyYW1lLmRvSW52ZXJzZUZGVChyZXNwb25zZSk7Cit9CisKK30gLy8g
bmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIEVOQUJMRShXRUJfQVVESU8pCkluZGV4OiBX
ZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL0hSVEZLZXJuZWwuaAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3Jl
L3BsYXRmb3JtL2F1ZGlvL0hSVEZLZXJuZWwuaAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvcGxh
dGZvcm0vYXVkaW8vSFJURktlcm5lbC5oCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDEwOCBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEu
ICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gIE5laXRoZXIgdGhlIG5hbWUgb2YgQXBwbGUgQ29t
cHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMgb2YKKyAqICAgICBpdHMgY29udHJp
YnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVk
CisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRl
biBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
QU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVE
CisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBP
TiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisK
KyNpZm5kZWYgSFJURktlcm5lbF9oCisjZGVmaW5lIEhSVEZLZXJuZWxfaAorCisjaW5jbHVkZSAi
RkZURnJhbWUuaCIKKyNpbmNsdWRlIDx3dGYvT3duUHRyLmg+CisjaW5jbHVkZSA8d3RmL1Bhc3NP
d25QdHIuaD4KKyNpbmNsdWRlIDx3dGYvUGFzc1JlZlB0ci5oPgorI2luY2x1ZGUgPHd0Zi9SZWZD
b3VudGVkLmg+CisjaW5jbHVkZSA8d3RmL1JlZlB0ci5oPgorI2luY2x1ZGUgPHd0Zi9WZWN0b3Iu
aD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCisvLyBIUlRGS2VybmVsIGlzIGEgZnJlcXVlbmN5
LWRvbWFpbiByZXByZXNlbnRhdGlvbiBvZiBhbiBpbXB1bHNlLXJlc3BvbnNlIHVzZWQgYXMgcGFy
dCBvZiB0aGUgc3BhdGlhbGl6ZWQgcGFubmluZyBzeXN0ZW0uCisvLyBUaGUgbGVhZGluZyBkZWxh
eSAoYXZlcmFnZSBncm91cCBkZWxheSkgZm9yIGVhY2ggaW1wdWxzZSByZXNwb25zZSBpcyBleHRy
YWN0ZWQ6CisvLyAgICAgIG1fZmZ0RnJhbWUgaXMgdGhlIGZyZXF1ZW5jeS1kb21haW4gcmVwcmVz
ZW50YXRpb24gb2YgdGhlIGltcHVsc2UgcmVzcG9uc2Ugd2l0aCB0aGUgZGVsYXkgcmVtb3ZlZAor
Ly8gICAgICBtX2ZyYW1lRGVsYXkgaXMgdGhlIGxlYWRpbmcgZGVsYXkgb2YgdGhlIG9yaWdpbmFs
IGltcHVsc2UgcmVzcG9uc2UuCitjbGFzcyBIUlRGS2VybmVsIDogcHVibGljIFJlZkNvdW50ZWQ8
SFJURktlcm5lbD4geworcHVibGljOgorICAgIC8vIE5vdGU6IHRoaXMgaXMgZGVzdHJ1Y3RpdmUg
b24gdGhlIHBhc3NlZCBpbiBpbXB1bHNlUmVzcG9uc2UgYXJyYXkuCisgICAgLy8gcmVzcG9uc2VM
ZW5ndGggbXVzdCBiZSBhIHBvd2VyIG9mIHR3by4KKyAgICBzdGF0aWMgUGFzc1JlZlB0cjxIUlRG
S2VybmVsPiBjcmVhdGUoZmxvYXQqIGltcHVsc2VSZXNwb25zZSwgc2l6ZV90IHJlc3BvbnNlTGVu
Z3RoLCBzaXplX3QgZmZ0U2l6ZSwgZG91YmxlIHNhbXBsZVJhdGUsIGJvb2wgYmFzc0Jvb3N0KQor
ICAgIHsKKyAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBIUlRGS2VybmVsKGltcHVsc2VSZXNw
b25zZSwgcmVzcG9uc2VMZW5ndGgsIGZmdFNpemUsIHNhbXBsZVJhdGUsIGJhc3NCb29zdCkpOwor
ICAgIH0KKworICAgIHN0YXRpYyBQYXNzUmVmUHRyPEhSVEZLZXJuZWw+IGNyZWF0ZShQYXNzT3du
UHRyPEZGVEZyYW1lPiBmZnRGcmFtZSwgZG91YmxlIGZyYW1lRGVsYXksIGRvdWJsZSBzYW1wbGVS
YXRlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBIUlRGS2VybmVsKGZmdEZy
YW1lLCBmcmFtZURlbGF5LCBzYW1wbGVSYXRlKSk7CisgICAgfQorICAgIAorICAgIEZGVEZyYW1l
KiBmZnRGcmFtZSgpIHsgcmV0dXJuIG1fZmZ0RnJhbWUuZ2V0KCk7IH0KKyAgICBjb25zdCBGRlRG
cmFtZSogZmZ0RnJhbWUoKSBjb25zdCB7IHJldHVybiBtX2ZmdEZyYW1lLmdldCgpOyB9CisgICAg
CisgICAgc2l6ZV90IGZmdFNpemUoKSBjb25zdCB7IHJldHVybiBmZnRGcmFtZSgpLT5mZnRTaXpl
KCk7IH0KKyAgICBkb3VibGUgZnJhbWVEZWxheSgpIGNvbnN0IHsgcmV0dXJuIG1fZnJhbWVEZWxh
eTsgfQorCisgICAgZG91YmxlIHNhbXBsZVJhdGUoKSBjb25zdCB7IHJldHVybiBtX3NhbXBsZVJh
dGU7IH0KKyAgICBkb3VibGUgbnlxdWlzdCgpIGNvbnN0IHsgcmV0dXJuIDAuNSAqIHNhbXBsZVJh
dGUoKTsgfQorCisgICAgLy8gQ29udmVydHMgYmFjayBpbnRvIGltcHVsc2UtcmVzcG9uc2UgZm9y
bS4KKyAgICAvLyBSZXNwb25zZSBtdXN0IHBvaW50IHRvIHN0b3JhZ2Ugb2Ygc2l6ZSBmZnRTaXpl
KCkuCisgICAgdm9pZCBnZW5lcmF0ZUltcHVsc2VSZXNwb25zZShmbG9hdCogcmVzcG9uc2UpOwor
CisjaWZuZGVmIE5ERUJVRworICAgIC8vIEZvciBkZWJ1Z2dpbmcKKyAgICB2b2lkIHByaW50KCkK
KyAgICB7CisgICAgICAgIHByaW50ZigiZnJhbWVEZWxheSA9ICVmXG4iLCBtX2ZyYW1lRGVsYXkp
OworICAgICAgICBtX2ZmdEZyYW1lLT5wcmludCgpOworICAgIH0KKyNlbmRpZgorICAgIAorcHJp
dmF0ZToKKyAgICBIUlRGS2VybmVsKCkKKyAgICAgICAgOiBtX2ZmdEZyYW1lKDApCisgICAgICAg
ICwgbV9mcmFtZURlbGF5KDAuMCkKKyAgICB7CisgICAgfQorCisgICAgLy8gTm90ZTogdGhpcyBp
cyBkZXN0cnVjdGl2ZSBvbiB0aGUgcGFzc2VkIGluIGltcHVsc2VSZXNwb25zZSBhcnJheS4KKyAg
ICBIUlRGS2VybmVsKGZsb2F0KiBpbXB1bHNlUmVzcG9uc2UsIHNpemVfdCByZXNwb25zZUxlbmd0
aCwgc2l6ZV90IGZmdFNpemUsIGRvdWJsZSBzYW1wbGVSYXRlLCBib29sIGJhc3NCb29zdCk7Cisg
ICAgCisgICAgSFJURktlcm5lbChQYXNzT3duUHRyPEZGVEZyYW1lPiBmZnRGcmFtZSwgZG91Ymxl
IGZyYW1lRGVsYXksIGRvdWJsZSBzYW1wbGVSYXRlKQorICAgICAgICA6IG1fZmZ0RnJhbWUoZmZ0
RnJhbWUpCisgICAgICAgICwgbV9mcmFtZURlbGF5KGZyYW1lRGVsYXkpCisgICAgICAgICwgbV9z
YW1wbGVSYXRlKHNhbXBsZVJhdGUpCisgICAgeworICAgIH0KKyAgICAKKyAgICBPd25QdHI8RkZU
RnJhbWU+IG1fZmZ0RnJhbWU7CisgICAgZG91YmxlIG1fZnJhbWVEZWxheTsKKyAgICBkb3VibGUg
bV9zYW1wbGVSYXRlOworfTsKKwordHlwZWRlZiBWZWN0b3I8UmVmUHRyPEhSVEZLZXJuZWw+ID4g
SFJURktlcm5lbExpc3Q7CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIEhS
VEZLZXJuZWxfaAo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>67845</attachid>
            <date>2010-09-16 15:28:39 -0700</date>
            <delta_ts>2010-09-16 16:02:55 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-45863-20100916152837.patch</filename>
            <type>text/plain</type>
            <size>10499</size>
            <attacher name="Chris Rogers">crogers</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2NzY3MykKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMjYgQEAKKzIwMTAtMDktMTYgIENocmlzIFJvZ2VycyAgPGNyb2dlcnNAZ29vZ2xl
LmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBB
ZGQgSFJURktlcm5lbCBmaWxlcworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93
X2J1Zy5jZ2k/aWQ9NDU4NjMKKworICAgICAgICBObyBuZXcgdGVzdHMgc2luY2UgYXVkaW8gQVBJ
IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQuCisKKyAgICAgICAgKiBwbGF0Zm9ybS9hdWRpby9IUlRG
S2VybmVsLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpleHRyYWN0QXZlcmFnZUdyb3Vw
RGVsYXkpOgorICAgICAgICAoV2ViQ29yZTo6SFJURktlcm5lbDo6SFJURktlcm5lbCk6CisgICAg
ICAgIChXZWJDb3JlOjpIUlRGS2VybmVsOjpnZW5lcmF0ZUltcHVsc2VSZXNwb25zZSk6CisgICAg
ICAgICogcGxhdGZvcm0vYXVkaW8vSFJURktlcm5lbC5oOiBBZGRlZC4KKyAgICAgICAgKFdlYkNv
cmU6OkhSVEZLZXJuZWw6OmNyZWF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpIUlRGS2VybmVsOjpm
ZnRGcmFtZSk6CisgICAgICAgIChXZWJDb3JlOjpIUlRGS2VybmVsOjpmZnRTaXplKToKKyAgICAg
ICAgKFdlYkNvcmU6OkhSVEZLZXJuZWw6OmZyYW1lRGVsYXkpOgorICAgICAgICAoV2ViQ29yZTo6
SFJURktlcm5lbDo6c2FtcGxlUmF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpIUlRGS2VybmVsOjpu
eXF1aXN0KToKKyAgICAgICAgKFdlYkNvcmU6OkhSVEZLZXJuZWw6OnByaW50KToKKyAgICAgICAg
KFdlYkNvcmU6OkhSVEZLZXJuZWw6OkhSVEZLZXJuZWwpOgorCiAyMDEwLTA5LTE2ICBEYXZpZCBI
eWF0dCAgPGh5YXR0QGFwcGxlLmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBieSBFcmljIFNlaWRl
bC4KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vYXVkaW8vSFJURktlcm5lbC5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9IUlRGS2VybmVsLmNwcAkocmV2aXNpb24gMCkK
KysrIFdlYkNvcmUvcGxhdGZvcm0vYXVkaW8vSFJURktlcm5lbC5jcHAJKHJldmlzaW9uIDApCkBA
IC0wLDAgKzEsMTAyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVy
aWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiAgTmVpdGhlciB0aGUg
bmFtZSBvZiBBcHBsZSBDb21wdXRlciwgSW5jLiAoIkFwcGxlIikgbm9yIHRoZSBuYW1lcyBvZgor
ICogICAgIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3Rl
IHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVj
aWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkK
KyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9G
IFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAq
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaWYgRU5BQkxFKFdFQl9B
VURJTykKKworI2luY2x1ZGUgIkhSVEZLZXJuZWwuaCIKKworI2luY2x1ZGUgIkJpcXVhZC5oIgor
I2luY2x1ZGUgIkZGVEZyYW1lLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK25hbWVzcGFj
ZSBXZWJDb3JlIHsKKworLy8gVGFrZXMgaW1wdWxzZVAgYXMgYW4gaW5wdXQgaW1wdWxzZSByZXNw
b25zZSBvZiB0aGUgZ2l2ZW4gbGVuZ3RoIGFuZCBjYWxjdWxhdGVzIHRoZSBhdmVyYWdlIGdyb3Vw
IGRlbGF5LgorLy8gVGhpcyByZXByZXNlbnRzIHRoZSBpbml0aWFsIGRlbGF5IGJlZm9yZSB0aGUg
bW9zdCBlbmVyZ2V0aWMgcGFydCBvZiB0aGUgaW1wdWxzZSByZXNwb25zZS4KKy8vIFRoaXMgZGVs
YXkgaXMgcmV0dXJuZWQgaW4gZGVsYXlGcmFtZXMsIGFuZCB0aGUgZGVsYXkgaXMgcmVtb3ZlZCBm
cm9tIHRoZSBpbXB1bHNlUCBpbXB1bHNlIHJlc3BvbnNlLgorLy8gbGVuZ3RoIG11c3QgYmUgYSBw
b3dlciBvZiAyLgorc3RhdGljIHZvaWQgZXh0cmFjdEF2ZXJhZ2VHcm91cERlbGF5KGZsb2F0KiBp
bXB1bHNlUCwgc2l6ZV90IGxlbmd0aCwgZG91YmxlKiBkZWxheUZyYW1lcykKK3sKKyAgICAvLyBD
aGVjayB0aGF0IGxlbmd0aCBpcyBwb3dlci1vZi0yOworICAgIEFTU0VSVCgxVUwgPDwgc3RhdGlj
X2Nhc3Q8dW5zaWduZWQ+KGxvZzIobGVuZ3RoKSkgPT0gbGVuZ3RoKTsKKworICAgIEZGVEZyYW1l
IGVzdGltYXRpb25GcmFtZShsZW5ndGgpOworICAgIGVzdGltYXRpb25GcmFtZS5kb0ZGVChpbXB1
bHNlUCk7CisKKyAgICBkb3VibGUgZnJhbWVEZWxheSA9IGVzdGltYXRpb25GcmFtZS5leHRyYWN0
QXZlcmFnZUdyb3VwRGVsYXkoKTsKKyAgICBlc3RpbWF0aW9uRnJhbWUuZG9JbnZlcnNlRkZUKGlt
cHVsc2VQKTsKKworICAgICpkZWxheUZyYW1lcyA9IGZyYW1lRGVsYXk7Cit9CisKK0hSVEZLZXJu
ZWw6OkhSVEZLZXJuZWwoZmxvYXQqIGltcHVsc2VSZXNwb25zZSwgc2l6ZV90IHJlc3BvbnNlTGVu
Z3RoLCBzaXplX3QgZmZ0U2l6ZSwgZG91YmxlIHNhbXBsZVJhdGUsIGJvb2wgYmFzc0Jvb3N0KQor
ICAgIDogbV9mcmFtZURlbGF5KDAuMCkKKyAgICAsIG1fc2FtcGxlUmF0ZShzYW1wbGVSYXRlKQor
eworICAgIC8vIERldGVybWluZSB0aGUgbGVhZGluZyBkZWxheSAoYXZlcmFnZSBncm91cCBkZWxh
eSkgZm9yIHRoZSByZXNwb25zZS4KKyAgICBleHRyYWN0QXZlcmFnZUdyb3VwRGVsYXkoaW1wdWxz
ZVJlc3BvbnNlLCByZXNwb25zZUxlbmd0aCwgJm1fZnJhbWVEZWxheSk7CisKKyAgICBpZiAoYmFz
c0Jvb3N0KSB7CisgICAgICAgIC8vIFJ1biB0aHJvdWdoIHNvbWUgcG9zdC1wcm9jZXNzaW5nIHRv
IGJvb3N0IHRoZSBiYXNzIGEgbGl0dGxlIC0tIHRoZSBIUlRGJ3Mgc2VlbSB0byBiZSBhIGxpdHRs
ZSBiYXNzLWRlZmljaWVudC4KKyAgICAgICAgQmlxdWFkIGZpbHRlcjsKKyAgICAgICAgZmlsdGVy
LnNldExvd1NoZWxmUGFyYW1zKDcwMC4wIC8gbnlxdWlzdCgpLCA2LjApOyAvLyBib29zdCA2ZEIg
YXQgNzAwSHoKKyAgICAgICAgZmlsdGVyLnByb2Nlc3MoaW1wdWxzZVJlc3BvbnNlLCBpbXB1bHNl
UmVzcG9uc2UsIHJlc3BvbnNlTGVuZ3RoKTsKKyAgICB9CisKKyAgICAvLyBXZSBuZWVkIHRvIHRy
dW5jYXRlIHRvIGZpdCBpbnRvIDEvMiB0aGUgRkZUIHNpemUgKHdpdGggemVybyBwYWRkaW5nKSBp
biBvcmRlciB0byBkbyBwcm9wZXIgY29udm9sdXRpb24uCisgICAgc2l6ZV90IHRydW5jYXRlZFJl
c3BvbnNlTGVuZ3RoID0gbWluKHJlc3BvbnNlTGVuZ3RoLCBmZnRTaXplIC8gMik7IC8vIHRydW5j
YXRlIGlmIG5lY2Vzc2FyeSB0byBtYXggaW1wdWxzZSByZXNwb25zZSBsZW5ndGggYWxsb3dlZCBi
eSBGRlQKKworICAgIC8vIFF1aWNrIGZhZGUtb3V0IChhcHBseSB3aW5kb3cpIGF0IHRydW5jYXRp
b24gcG9pbnQKKyAgICB1bnNpZ25lZCBudW1iZXJPZkZhZGVPdXRGcmFtZXMgPSBzdGF0aWNfY2Fz
dDx1bnNpZ25lZD4oc2FtcGxlUmF0ZSAvIDQ0MTApOyAvLyAxMCBzYW1wbGUtZnJhbWVzIEA0NC4x
S0h6IHNhbXBsZS1yYXRlCisgICAgQVNTRVJUKG51bWJlck9mRmFkZU91dEZyYW1lcyA8IHRydW5j
YXRlZFJlc3BvbnNlTGVuZ3RoKTsKKyAgICBpZiAobnVtYmVyT2ZGYWRlT3V0RnJhbWVzIDwgdHJ1
bmNhdGVkUmVzcG9uc2VMZW5ndGgpIHsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gdHJ1bmNh
dGVkUmVzcG9uc2VMZW5ndGggLSBudW1iZXJPZkZhZGVPdXRGcmFtZXM7IGkgPCB0cnVuY2F0ZWRS
ZXNwb25zZUxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBmbG9hdCB4ID0gMS4wZiAtIChpIC0g
KHRydW5jYXRlZFJlc3BvbnNlTGVuZ3RoIC0gbnVtYmVyT2ZGYWRlT3V0RnJhbWVzKSkgLyBudW1i
ZXJPZkZhZGVPdXRGcmFtZXM7CisgICAgICAgICAgICBpbXB1bHNlUmVzcG9uc2VbaV0gKj0geDsK
KyAgICAgICAgfQorICAgIH0KKworICAgIG1fZmZ0RnJhbWUgPSBhZG9wdFB0cihuZXcgRkZURnJh
bWUoZmZ0U2l6ZSkpOworICAgIG1fZmZ0RnJhbWUtPmRvUGFkZGVkRkZUKGltcHVsc2VSZXNwb25z
ZSwgdHJ1bmNhdGVkUmVzcG9uc2VMZW5ndGgpOworfQorCit2b2lkIEhSVEZLZXJuZWw6OmdlbmVy
YXRlSW1wdWxzZVJlc3BvbnNlKGZsb2F0KiByZXNwb25zZSkKK3sKKyAgICBGRlRGcmFtZSBmZnRG
cmFtZSgqbV9mZnRGcmFtZSk7CisKKyAgICAvLyBBZGQgbGVhZGluZyBkZWxheSBiYWNrIGluLgor
ICAgIGZmdEZyYW1lLmFkZENvbnN0YW50R3JvdXBEZWxheShtX2ZyYW1lRGVsYXkpOworICAgIGZm
dEZyYW1lLmRvSW52ZXJzZUZGVChyZXNwb25zZSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNv
cmUKKworI2VuZGlmIC8vIEVOQUJMRShXRUJfQVVESU8pCkluZGV4OiBXZWJDb3JlL3BsYXRmb3Jt
L2F1ZGlvL0hSVEZLZXJuZWwuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2F1ZGlv
L0hSVEZLZXJuZWwuaAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vYXVkaW8vSFJU
Rktlcm5lbC5oCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDExMCBAQAorLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICogMy4gIE5laXRoZXIgdGhlIG5hbWUgb2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJB
cHBsZSIpIG5vciB0aGUgbmFtZXMgb2YKKyAqICAgICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1
c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0
aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgor
ICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklC
VVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0Ug
QVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJ
QlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lO
RVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgSFJURktl
cm5lbF9oCisjZGVmaW5lIEhSVEZLZXJuZWxfaAorCisjaW5jbHVkZSAiRkZURnJhbWUuaCIKKyNp
bmNsdWRlIDx3dGYvT3duUHRyLmg+CisjaW5jbHVkZSA8d3RmL1Bhc3NPd25QdHIuaD4KKyNpbmNs
dWRlIDx3dGYvUGFzc1JlZlB0ci5oPgorI2luY2x1ZGUgPHd0Zi9SZWZDb3VudGVkLmg+CisjaW5j
bHVkZSA8d3RmL1JlZlB0ci5oPgorI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKworbmFtZXNwYWNl
IFdlYkNvcmUgeworCisvLyBIUlRGIHN0YW5kcyBmb3IgSGVhZC1SZWxhdGVkIFRyYW5zZmVyIEZ1
bmN0aW9uLgorLy8gSFJURktlcm5lbCBpcyBhIGZyZXF1ZW5jeS1kb21haW4gcmVwcmVzZW50YXRp
b24gb2YgYW4gaW1wdWxzZS1yZXNwb25zZSB1c2VkIGFzIHBhcnQgb2YgdGhlIHNwYXRpYWxpemVk
IHBhbm5pbmcgc3lzdGVtLgorLy8gRm9yIGEgZ2l2ZW4gYXppbXV0aCAvIGVsZXZhdGlvbiBhbmds
ZSB0aGVyZSB3aWxsIGJlIG9uZSBIUlRGS2VybmVsIGZvciB0aGUgbGVmdCBlYXIgdHJhbnNmZXIg
ZnVuY3Rpb24sIGFuZCBvbmUgZm9yIHRoZSByaWdodCBlYXIuCisvLyBUaGUgbGVhZGluZyBkZWxh
eSAoYXZlcmFnZSBncm91cCBkZWxheSkgZm9yIGVhY2ggaW1wdWxzZSByZXNwb25zZSBpcyBleHRy
YWN0ZWQ6CisvLyAgICAgIG1fZmZ0RnJhbWUgaXMgdGhlIGZyZXF1ZW5jeS1kb21haW4gcmVwcmVz
ZW50YXRpb24gb2YgdGhlIGltcHVsc2UgcmVzcG9uc2Ugd2l0aCB0aGUgZGVsYXkgcmVtb3ZlZAor
Ly8gICAgICBtX2ZyYW1lRGVsYXkgaXMgdGhlIGxlYWRpbmcgZGVsYXkgb2YgdGhlIG9yaWdpbmFs
IGltcHVsc2UgcmVzcG9uc2UuCitjbGFzcyBIUlRGS2VybmVsIDogcHVibGljIFJlZkNvdW50ZWQ8
SFJURktlcm5lbD4geworcHVibGljOgorICAgIC8vIE5vdGU6IHRoaXMgaXMgZGVzdHJ1Y3RpdmUg
b24gdGhlIHBhc3NlZCBpbiBpbXB1bHNlUmVzcG9uc2UgYXJyYXkuCisgICAgLy8gcmVzcG9uc2VM
ZW5ndGggbXVzdCBiZSBhIHBvd2VyIG9mIHR3by4KKyAgICBzdGF0aWMgUGFzc1JlZlB0cjxIUlRG
S2VybmVsPiBjcmVhdGUoZmxvYXQqIGltcHVsc2VSZXNwb25zZSwgc2l6ZV90IHJlc3BvbnNlTGVu
Z3RoLCBzaXplX3QgZmZ0U2l6ZSwgZG91YmxlIHNhbXBsZVJhdGUsIGJvb2wgYmFzc0Jvb3N0KQor
ICAgIHsKKyAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBIUlRGS2VybmVsKGltcHVsc2VSZXNw
b25zZSwgcmVzcG9uc2VMZW5ndGgsIGZmdFNpemUsIHNhbXBsZVJhdGUsIGJhc3NCb29zdCkpOwor
ICAgIH0KKworICAgIHN0YXRpYyBQYXNzUmVmUHRyPEhSVEZLZXJuZWw+IGNyZWF0ZShQYXNzT3du
UHRyPEZGVEZyYW1lPiBmZnRGcmFtZSwgZG91YmxlIGZyYW1lRGVsYXksIGRvdWJsZSBzYW1wbGVS
YXRlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBIUlRGS2VybmVsKGZmdEZy
YW1lLCBmcmFtZURlbGF5LCBzYW1wbGVSYXRlKSk7CisgICAgfQorICAgIAorICAgIEZGVEZyYW1l
KiBmZnRGcmFtZSgpIHsgcmV0dXJuIG1fZmZ0RnJhbWUuZ2V0KCk7IH0KKyAgICBjb25zdCBGRlRG
cmFtZSogZmZ0RnJhbWUoKSBjb25zdCB7IHJldHVybiBtX2ZmdEZyYW1lLmdldCgpOyB9CisgICAg
CisgICAgc2l6ZV90IGZmdFNpemUoKSBjb25zdCB7IHJldHVybiBtX2ZmdEZyYW1lLT5mZnRTaXpl
KCk7IH0KKyAgICBkb3VibGUgZnJhbWVEZWxheSgpIGNvbnN0IHsgcmV0dXJuIG1fZnJhbWVEZWxh
eTsgfQorCisgICAgZG91YmxlIHNhbXBsZVJhdGUoKSBjb25zdCB7IHJldHVybiBtX3NhbXBsZVJh
dGU7IH0KKyAgICBkb3VibGUgbnlxdWlzdCgpIGNvbnN0IHsgcmV0dXJuIDAuNSAqIHNhbXBsZVJh
dGUoKTsgfQorCisgICAgLy8gQ29udmVydHMgYmFjayBpbnRvIGltcHVsc2UtcmVzcG9uc2UgZm9y
bS4KKyAgICAvLyBSZXNwb25zZSBtdXN0IHBvaW50IHRvIHN0b3JhZ2Ugb2Ygc2l6ZSBmZnRTaXpl
KCkuCisgICAgdm9pZCBnZW5lcmF0ZUltcHVsc2VSZXNwb25zZShmbG9hdCogcmVzcG9uc2UpOwor
CisjaWZuZGVmIE5ERUJVRworICAgIC8vIEZvciBkZWJ1Z2dpbmcKKyAgICB2b2lkIHByaW50KCkK
KyAgICB7CisgICAgICAgIHByaW50ZigiZnJhbWVEZWxheSA9ICVmXG4iLCBtX2ZyYW1lRGVsYXkp
OworICAgICAgICBtX2ZmdEZyYW1lLT5wcmludCgpOworICAgIH0KKyNlbmRpZgorICAgIAorcHJp
dmF0ZToKKyAgICBIUlRGS2VybmVsKCkKKyAgICAgICAgOiBtX2ZmdEZyYW1lKDApCisgICAgICAg
ICwgbV9mcmFtZURlbGF5KDAuMCkKKyAgICB7CisgICAgfQorCisgICAgLy8gTm90ZTogdGhpcyBp
cyBkZXN0cnVjdGl2ZSBvbiB0aGUgcGFzc2VkIGluIGltcHVsc2VSZXNwb25zZSBhcnJheS4KKyAg
ICBIUlRGS2VybmVsKGZsb2F0KiBpbXB1bHNlUmVzcG9uc2UsIHNpemVfdCByZXNwb25zZUxlbmd0
aCwgc2l6ZV90IGZmdFNpemUsIGRvdWJsZSBzYW1wbGVSYXRlLCBib29sIGJhc3NCb29zdCk7Cisg
ICAgCisgICAgSFJURktlcm5lbChQYXNzT3duUHRyPEZGVEZyYW1lPiBmZnRGcmFtZSwgZG91Ymxl
IGZyYW1lRGVsYXksIGRvdWJsZSBzYW1wbGVSYXRlKQorICAgICAgICA6IG1fZmZ0RnJhbWUoZmZ0
RnJhbWUpCisgICAgICAgICwgbV9mcmFtZURlbGF5KGZyYW1lRGVsYXkpCisgICAgICAgICwgbV9z
YW1wbGVSYXRlKHNhbXBsZVJhdGUpCisgICAgeworICAgIH0KKyAgICAKKyAgICBPd25QdHI8RkZU
RnJhbWU+IG1fZmZ0RnJhbWU7CisgICAgZG91YmxlIG1fZnJhbWVEZWxheTsKKyAgICBkb3VibGUg
bV9zYW1wbGVSYXRlOworfTsKKwordHlwZWRlZiBWZWN0b3I8UmVmUHRyPEhSVEZLZXJuZWw+ID4g
SFJURktlcm5lbExpc3Q7CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIEhS
VEZLZXJuZWxfaAo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>67854</attachid>
            <date>2010-09-16 16:02:59 -0700</date>
            <delta_ts>2010-09-17 12:36:53 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-45863-20100916160257.patch</filename>
            <type>text/plain</type>
            <size>10640</size>
            <attacher name="Chris Rogers">crogers</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2NzY3NikKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMjYgQEAKKzIwMTAtMDktMTYgIENocmlzIFJvZ2VycyAgPGNyb2dlcnNAZ29vZ2xl
LmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBB
ZGQgSFJURktlcm5lbCBmaWxlcworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93
X2J1Zy5jZ2k/aWQ9NDU4NjMKKworICAgICAgICBObyBuZXcgdGVzdHMgc2luY2UgYXVkaW8gQVBJ
IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQuCisKKyAgICAgICAgKiBwbGF0Zm9ybS9hdWRpby9IUlRG
S2VybmVsLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpleHRyYWN0QXZlcmFnZUdyb3Vw
RGVsYXkpOgorICAgICAgICAoV2ViQ29yZTo6SFJURktlcm5lbDo6SFJURktlcm5lbCk6CisgICAg
ICAgIChXZWJDb3JlOjpIUlRGS2VybmVsOjpjcmVhdGVJbXB1bHNlUmVzcG9uc2UpOgorICAgICAg
ICAqIHBsYXRmb3JtL2F1ZGlvL0hSVEZLZXJuZWwuaDogQWRkZWQuCisgICAgICAgIChXZWJDb3Jl
OjpIUlRGS2VybmVsOjpjcmVhdGUpOgorICAgICAgICAoV2ViQ29yZTo6SFJURktlcm5lbDo6ZmZ0
RnJhbWUpOgorICAgICAgICAoV2ViQ29yZTo6SFJURktlcm5lbDo6ZmZ0U2l6ZSk6CisgICAgICAg
IChXZWJDb3JlOjpIUlRGS2VybmVsOjpmcmFtZURlbGF5KToKKyAgICAgICAgKFdlYkNvcmU6OkhS
VEZLZXJuZWw6OnNhbXBsZVJhdGUpOgorICAgICAgICAoV2ViQ29yZTo6SFJURktlcm5lbDo6bnlx
dWlzdCk6CisgICAgICAgIChXZWJDb3JlOjpIUlRGS2VybmVsOjpwcmludCk6CisgICAgICAgIChX
ZWJDb3JlOjpIUlRGS2VybmVsOjpIUlRGS2VybmVsKToKKwogMjAxMC0wOS0xNiAgQW5kcmVhcyBL
bGluZyAgPGFuZHJlYXMua2xpbmdAbm9raWEuY29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5IEFy
aXlhIEhpZGF5YXQuCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL0hSVEZLZXJuZWwuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vYXVkaW8vSFJURktlcm5lbC5jcHAJKHJl
dmlzaW9uIDApCisrKyBXZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL0hSVEZLZXJuZWwuY3BwCShyZXZp
c2lvbiAwKQpAQCAtMCwwICsxLDExMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29n
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gIE5l
aXRoZXIgdGhlIG5hbWUgb2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUg
bmFtZXMgb2YKKyAqICAgICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ug
b3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdp
dGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBB
TkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJ
TUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwor
ICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2lmIEVO
QUJMRShXRUJfQVVESU8pCisKKyNpbmNsdWRlICJIUlRGS2VybmVsLmgiCisKKyNpbmNsdWRlICJB
dWRpb0NoYW5uZWwuaCIKKyNpbmNsdWRlICJCaXF1YWQuaCIKKyNpbmNsdWRlICJGRlRGcmFtZS5o
IgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCituYW1lc3BhY2UgV2ViQ29yZSB7CisKKy8vIFRh
a2VzIGltcHVsc2VQIGFzIGFuIGlucHV0IGltcHVsc2UgcmVzcG9uc2Ugb2YgdGhlIGdpdmVuIGxl
bmd0aCBhbmQgY2FsY3VsYXRlcyB0aGUgYXZlcmFnZSBncm91cCBkZWxheS4KKy8vIFRoaXMgcmVw
cmVzZW50cyB0aGUgaW5pdGlhbCBkZWxheSBiZWZvcmUgdGhlIG1vc3QgZW5lcmdldGljIHBhcnQg
b2YgdGhlIGltcHVsc2UgcmVzcG9uc2UuCisvLyBUaGlzIGRlbGF5IGlzIHJldHVybmVkIGluIGRl
bGF5RnJhbWVzLCBhbmQgdGhlIGRlbGF5IGlzIHJlbW92ZWQgZnJvbSB0aGUgaW1wdWxzZVAgaW1w
dWxzZSByZXNwb25zZS4KKy8vIGxlbmd0aCBtdXN0IGJlIGEgcG93ZXIgb2YgMi4KK3N0YXRpYyB2
b2lkIGV4dHJhY3RBdmVyYWdlR3JvdXBEZWxheShmbG9hdCogaW1wdWxzZVAsIHNpemVfdCBsZW5n
dGgsIGRvdWJsZSogZGVsYXlGcmFtZXMpCit7CisgICAgLy8gQ2hlY2sgdGhhdCBsZW5ndGggaXMg
cG93ZXItb2YtMjsKKyAgICBBU1NFUlQoMVVMIDw8IHN0YXRpY19jYXN0PHVuc2lnbmVkPihsb2cy
KGxlbmd0aCkpID09IGxlbmd0aCk7CisKKyAgICBGRlRGcmFtZSBlc3RpbWF0aW9uRnJhbWUobGVu
Z3RoKTsKKyAgICBlc3RpbWF0aW9uRnJhbWUuZG9GRlQoaW1wdWxzZVApOworCisgICAgZG91Ymxl
IGZyYW1lRGVsYXkgPSBlc3RpbWF0aW9uRnJhbWUuZXh0cmFjdEF2ZXJhZ2VHcm91cERlbGF5KCk7
CisgICAgZXN0aW1hdGlvbkZyYW1lLmRvSW52ZXJzZUZGVChpbXB1bHNlUCk7CisKKyAgICAqZGVs
YXlGcmFtZXMgPSBmcmFtZURlbGF5OworfQorCitIUlRGS2VybmVsOjpIUlRGS2VybmVsKEF1ZGlv
Q2hhbm5lbCogY2hhbm5lbCwgc2l6ZV90IGZmdFNpemUsIGRvdWJsZSBzYW1wbGVSYXRlLCBib29s
IGJhc3NCb29zdCkKKyAgICA6IG1fZnJhbWVEZWxheSgwLjApCisgICAgLCBtX3NhbXBsZVJhdGUo
c2FtcGxlUmF0ZSkKK3sKKyAgICBBU1NFUlQoY2hhbm5lbCk7CisgICAgZmxvYXQqIGltcHVsc2VS
ZXNwb25zZSA9IGNoYW5uZWwtPmRhdGEoKTsKKyAgICBzaXplX3QgcmVzcG9uc2VMZW5ndGggPSBj
aGFubmVsLT5sZW5ndGgoKTsKKworICAgIC8vIERldGVybWluZSB0aGUgbGVhZGluZyBkZWxheSAo
YXZlcmFnZSBncm91cCBkZWxheSkgZm9yIHRoZSByZXNwb25zZS4KKyAgICBleHRyYWN0QXZlcmFn
ZUdyb3VwRGVsYXkoaW1wdWxzZVJlc3BvbnNlLCByZXNwb25zZUxlbmd0aCwgJm1fZnJhbWVEZWxh
eSk7CisKKyAgICBpZiAoYmFzc0Jvb3N0KSB7CisgICAgICAgIC8vIFJ1biB0aHJvdWdoIHNvbWUg
cG9zdC1wcm9jZXNzaW5nIHRvIGJvb3N0IHRoZSBiYXNzIGEgbGl0dGxlIC0tIHRoZSBIUlRGJ3Mg
c2VlbSB0byBiZSBhIGxpdHRsZSBiYXNzLWRlZmljaWVudC4KKyAgICAgICAgQmlxdWFkIGZpbHRl
cjsKKyAgICAgICAgZmlsdGVyLnNldExvd1NoZWxmUGFyYW1zKDcwMC4wIC8gbnlxdWlzdCgpLCA2
LjApOyAvLyBib29zdCA2ZEIgYXQgNzAwSHoKKyAgICAgICAgZmlsdGVyLnByb2Nlc3MoaW1wdWxz
ZVJlc3BvbnNlLCBpbXB1bHNlUmVzcG9uc2UsIHJlc3BvbnNlTGVuZ3RoKTsKKyAgICB9CisKKyAg
ICAvLyBXZSBuZWVkIHRvIHRydW5jYXRlIHRvIGZpdCBpbnRvIDEvMiB0aGUgRkZUIHNpemUgKHdp
dGggemVybyBwYWRkaW5nKSBpbiBvcmRlciB0byBkbyBwcm9wZXIgY29udm9sdXRpb24uCisgICAg
c2l6ZV90IHRydW5jYXRlZFJlc3BvbnNlTGVuZ3RoID0gbWluKHJlc3BvbnNlTGVuZ3RoLCBmZnRT
aXplIC8gMik7IC8vIHRydW5jYXRlIGlmIG5lY2Vzc2FyeSB0byBtYXggaW1wdWxzZSByZXNwb25z
ZSBsZW5ndGggYWxsb3dlZCBieSBGRlQKKworICAgIC8vIFF1aWNrIGZhZGUtb3V0IChhcHBseSB3
aW5kb3cpIGF0IHRydW5jYXRpb24gcG9pbnQKKyAgICB1bnNpZ25lZCBudW1iZXJPZkZhZGVPdXRG
cmFtZXMgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oc2FtcGxlUmF0ZSAvIDQ0MTApOyAvLyAxMCBz
YW1wbGUtZnJhbWVzIEA0NC4xS0h6IHNhbXBsZS1yYXRlCisgICAgQVNTRVJUKG51bWJlck9mRmFk
ZU91dEZyYW1lcyA8IHRydW5jYXRlZFJlc3BvbnNlTGVuZ3RoKTsKKyAgICBpZiAobnVtYmVyT2ZG
YWRlT3V0RnJhbWVzIDwgdHJ1bmNhdGVkUmVzcG9uc2VMZW5ndGgpIHsKKyAgICAgICAgZm9yICh1
bnNpZ25lZCBpID0gdHJ1bmNhdGVkUmVzcG9uc2VMZW5ndGggLSBudW1iZXJPZkZhZGVPdXRGcmFt
ZXM7IGkgPCB0cnVuY2F0ZWRSZXNwb25zZUxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBmbG9h
dCB4ID0gMS4wZiAtIChpIC0gKHRydW5jYXRlZFJlc3BvbnNlTGVuZ3RoIC0gbnVtYmVyT2ZGYWRl
T3V0RnJhbWVzKSkgLyBudW1iZXJPZkZhZGVPdXRGcmFtZXM7CisgICAgICAgICAgICBpbXB1bHNl
UmVzcG9uc2VbaV0gKj0geDsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1fZmZ0RnJhbWUgPSBh
ZG9wdFB0cihuZXcgRkZURnJhbWUoZmZ0U2l6ZSkpOworICAgIG1fZmZ0RnJhbWUtPmRvUGFkZGVk
RkZUKGltcHVsc2VSZXNwb25zZSwgdHJ1bmNhdGVkUmVzcG9uc2VMZW5ndGgpOworfQorCitQYXNz
T3duUHRyPEF1ZGlvQ2hhbm5lbD4gSFJURktlcm5lbDo6Y3JlYXRlSW1wdWxzZVJlc3BvbnNlKCkK
K3sKKyAgICBPd25QdHI8QXVkaW9DaGFubmVsPiBjaGFubmVsID0gYWRvcHRQdHIobmV3IEF1ZGlv
Q2hhbm5lbChmZnRTaXplKCkpKTsKKyAgICBGRlRGcmFtZSBmZnRGcmFtZSgqbV9mZnRGcmFtZSk7
CisKKyAgICAvLyBBZGQgbGVhZGluZyBkZWxheSBiYWNrIGluLgorICAgIGZmdEZyYW1lLmFkZENv
bnN0YW50R3JvdXBEZWxheShtX2ZyYW1lRGVsYXkpOworICAgIGZmdEZyYW1lLmRvSW52ZXJzZUZG
VChjaGFubmVsLT5kYXRhKCkpOworCisgICAgcmV0dXJuIGNoYW5uZWwucmVsZWFzZSgpOworfQor
Cit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBFTkFCTEUoV0VCX0FVRElPKQpJ
bmRleDogV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9IUlRGS2VybmVsLmgKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
V2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9IUlRGS2VybmVsLmgJKHJldmlzaW9uIDApCisrKyBXZWJD
b3JlL3BsYXRmb3JtL2F1ZGlvL0hSVEZLZXJuZWwuaAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwx
MTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAq
CisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFw
cGxlIENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCisgKiAgICAgaXRz
IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMg
ZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9y
IHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUg
SU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5U
SUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1F
TlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRB
LCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4K
KyAqLworCisjaWZuZGVmIEhSVEZLZXJuZWxfaAorI2RlZmluZSBIUlRGS2VybmVsX2gKKworI2lu
Y2x1ZGUgIkZGVEZyYW1lLmgiCisjaW5jbHVkZSA8d3RmL093blB0ci5oPgorI2luY2x1ZGUgPHd0
Zi9QYXNzT3duUHRyLmg+CisjaW5jbHVkZSA8d3RmL1Bhc3NSZWZQdHIuaD4KKyNpbmNsdWRlIDx3
dGYvUmVmQ291bnRlZC5oPgorI2luY2x1ZGUgPHd0Zi9SZWZQdHIuaD4KKyNpbmNsdWRlIDx3dGYv
VmVjdG9yLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgQXVkaW9DaGFubmVsOwor
ICAgIAorLy8gSFJURiBzdGFuZHMgZm9yIEhlYWQtUmVsYXRlZCBUcmFuc2ZlciBGdW5jdGlvbi4K
Ky8vIEhSVEZLZXJuZWwgaXMgYSBmcmVxdWVuY3ktZG9tYWluIHJlcHJlc2VudGF0aW9uIG9mIGFu
IGltcHVsc2UtcmVzcG9uc2UgdXNlZCBhcyBwYXJ0IG9mIHRoZSBzcGF0aWFsaXplZCBwYW5uaW5n
IHN5c3RlbS4KKy8vIEZvciBhIGdpdmVuIGF6aW11dGggLyBlbGV2YXRpb24gYW5nbGUgdGhlcmUg
d2lsbCBiZSBvbmUgSFJURktlcm5lbCBmb3IgdGhlIGxlZnQgZWFyIHRyYW5zZmVyIGZ1bmN0aW9u
LCBhbmQgb25lIGZvciB0aGUgcmlnaHQgZWFyLgorLy8gVGhlIGxlYWRpbmcgZGVsYXkgKGF2ZXJh
Z2UgZ3JvdXAgZGVsYXkpIGZvciBlYWNoIGltcHVsc2UgcmVzcG9uc2UgaXMgZXh0cmFjdGVkOgor
Ly8gICAgICBtX2ZmdEZyYW1lIGlzIHRoZSBmcmVxdWVuY3ktZG9tYWluIHJlcHJlc2VudGF0aW9u
IG9mIHRoZSBpbXB1bHNlIHJlc3BvbnNlIHdpdGggdGhlIGRlbGF5IHJlbW92ZWQKKy8vICAgICAg
bV9mcmFtZURlbGF5IGlzIHRoZSBsZWFkaW5nIGRlbGF5IG9mIHRoZSBvcmlnaW5hbCBpbXB1bHNl
IHJlc3BvbnNlLgorY2xhc3MgSFJURktlcm5lbCA6IHB1YmxpYyBSZWZDb3VudGVkPEhSVEZLZXJu
ZWw+IHsKK3B1YmxpYzoKKyAgICAvLyBOb3RlOiB0aGlzIGlzIGRlc3RydWN0aXZlIG9uIHRoZSBw
YXNzZWQgaW4gaW1wdWxzZVJlc3BvbnNlIGFycmF5LgorICAgIC8vIHJlc3BvbnNlTGVuZ3RoIG11
c3QgYmUgYSBwb3dlciBvZiB0d28uCisgICAgc3RhdGljIFBhc3NSZWZQdHI8SFJURktlcm5lbD4g
Y3JlYXRlKEF1ZGlvQ2hhbm5lbCogY2hhbm5lbCwgc2l6ZV90IGZmdFNpemUsIGRvdWJsZSBzYW1w
bGVSYXRlLCBib29sIGJhc3NCb29zdCkKKyAgICB7CisgICAgICAgIHJldHVybiBhZG9wdFJlZihu
ZXcgSFJURktlcm5lbChjaGFubmVsLCBmZnRTaXplLCBzYW1wbGVSYXRlLCBiYXNzQm9vc3QpKTsK
KyAgICB9CisKKyAgICBzdGF0aWMgUGFzc1JlZlB0cjxIUlRGS2VybmVsPiBjcmVhdGUoUGFzc093
blB0cjxGRlRGcmFtZT4gZmZ0RnJhbWUsIGRvdWJsZSBmcmFtZURlbGF5LCBkb3VibGUgc2FtcGxl
UmF0ZSkKKyAgICB7CisgICAgICAgIHJldHVybiBhZG9wdFJlZihuZXcgSFJURktlcm5lbChmZnRG
cmFtZSwgZnJhbWVEZWxheSwgc2FtcGxlUmF0ZSkpOworICAgIH0KKyAgICAKKyAgICBGRlRGcmFt
ZSogZmZ0RnJhbWUoKSB7IHJldHVybiBtX2ZmdEZyYW1lLmdldCgpOyB9CisgICAgY29uc3QgRkZU
RnJhbWUqIGZmdEZyYW1lKCkgY29uc3QgeyByZXR1cm4gbV9mZnRGcmFtZS5nZXQoKTsgfQorICAg
IAorICAgIHNpemVfdCBmZnRTaXplKCkgY29uc3QgeyByZXR1cm4gbV9mZnRGcmFtZS0+ZmZ0U2l6
ZSgpOyB9CisgICAgZG91YmxlIGZyYW1lRGVsYXkoKSBjb25zdCB7IHJldHVybiBtX2ZyYW1lRGVs
YXk7IH0KKworICAgIGRvdWJsZSBzYW1wbGVSYXRlKCkgY29uc3QgeyByZXR1cm4gbV9zYW1wbGVS
YXRlOyB9CisgICAgZG91YmxlIG55cXVpc3QoKSBjb25zdCB7IHJldHVybiAwLjUgKiBzYW1wbGVS
YXRlKCk7IH0KKworICAgIC8vIENvbnZlcnRzIGJhY2sgaW50byBpbXB1bHNlLXJlc3BvbnNlIGZv
cm0uCisgICAgUGFzc093blB0cjxBdWRpb0NoYW5uZWw+IGNyZWF0ZUltcHVsc2VSZXNwb25zZSgp
OworCisjaWZuZGVmIE5ERUJVRworICAgIC8vIEZvciBkZWJ1Z2dpbmcKKyAgICB2b2lkIHByaW50
KCkKKyAgICB7CisgICAgICAgIHByaW50ZigiZnJhbWVEZWxheSA9ICVmXG4iLCBtX2ZyYW1lRGVs
YXkpOworICAgICAgICBtX2ZmdEZyYW1lLT5wcmludCgpOworICAgIH0KKyNlbmRpZgorICAgIAor
cHJpdmF0ZToKKyAgICBIUlRGS2VybmVsKCkKKyAgICAgICAgOiBtX2ZmdEZyYW1lKDApCisgICAg
ICAgICwgbV9mcmFtZURlbGF5KDAuMCkKKyAgICB7CisgICAgfQorCisgICAgLy8gTm90ZTogdGhp
cyBpcyBkZXN0cnVjdGl2ZSBvbiB0aGUgcGFzc2VkIGluIEF1ZGlvQ2hhbm5lbC4KKyAgICBIUlRG
S2VybmVsKEF1ZGlvQ2hhbm5lbCogY2hhbm5lbCwgc2l6ZV90IGZmdFNpemUsIGRvdWJsZSBzYW1w
bGVSYXRlLCBib29sIGJhc3NCb29zdCk7CisgICAgCisgICAgSFJURktlcm5lbChQYXNzT3duUHRy
PEZGVEZyYW1lPiBmZnRGcmFtZSwgZG91YmxlIGZyYW1lRGVsYXksIGRvdWJsZSBzYW1wbGVSYXRl
KQorICAgICAgICA6IG1fZmZ0RnJhbWUoZmZ0RnJhbWUpCisgICAgICAgICwgbV9mcmFtZURlbGF5
KGZyYW1lRGVsYXkpCisgICAgICAgICwgbV9zYW1wbGVSYXRlKHNhbXBsZVJhdGUpCisgICAgewor
ICAgIH0KKyAgICAKKyAgICBPd25QdHI8RkZURnJhbWU+IG1fZmZ0RnJhbWU7CisgICAgZG91Ymxl
IG1fZnJhbWVEZWxheTsKKyAgICBkb3VibGUgbV9zYW1wbGVSYXRlOworfTsKKwordHlwZWRlZiBW
ZWN0b3I8UmVmUHRyPEhSVEZLZXJuZWw+ID4gSFJURktlcm5lbExpc3Q7CisKK30gLy8gbmFtZXNw
YWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIEhSVEZLZXJuZWxfaAo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>67936</attachid>
            <date>2010-09-17 12:36:56 -0700</date>
            <delta_ts>2010-09-21 14:36:52 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-45863-20100917123655.patch</filename>
            <type>text/plain</type>
            <size>11812</size>
            <attacher name="Chris Rogers">crogers</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2NzczNykKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMjYgQEAKKzIwMTAtMDktMTcgIENocmlzIFJvZ2VycyAgPGNyb2dlcnNAZ29vZ2xl
LmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBB
ZGQgSFJURktlcm5lbCBmaWxlcworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93
X2J1Zy5jZ2k/aWQ9NDU4NjMKKworICAgICAgICBObyBuZXcgdGVzdHMgc2luY2UgYXVkaW8gQVBJ
IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQuCisKKyAgICAgICAgKiBwbGF0Zm9ybS9hdWRpby9IUlRG
S2VybmVsLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpleHRyYWN0QXZlcmFnZUdyb3Vw
RGVsYXkpOgorICAgICAgICAoV2ViQ29yZTo6SFJURktlcm5lbDo6SFJURktlcm5lbCk6CisgICAg
ICAgIChXZWJDb3JlOjpIUlRGS2VybmVsOjpjcmVhdGVJbXB1bHNlUmVzcG9uc2UpOgorICAgICAg
ICAoV2ViQ29yZTo6SFJURktlcm5lbDo6Y3JlYXRlSW50ZXJwb2xhdGVkS2VybmVsKToKKyAgICAg
ICAgKiBwbGF0Zm9ybS9hdWRpby9IUlRGS2VybmVsLmg6IEFkZGVkLgorICAgICAgICAoV2ViQ29y
ZTo6SFJURktlcm5lbDo6Y3JlYXRlKToKKyAgICAgICAgKFdlYkNvcmU6OkhSVEZLZXJuZWw6OmZm
dEZyYW1lKToKKyAgICAgICAgKFdlYkNvcmU6OkhSVEZLZXJuZWw6OmZmdFNpemUpOgorICAgICAg
ICAoV2ViQ29yZTo6SFJURktlcm5lbDo6ZnJhbWVEZWxheSk6CisgICAgICAgIChXZWJDb3JlOjpI
UlRGS2VybmVsOjpzYW1wbGVSYXRlKToKKyAgICAgICAgKFdlYkNvcmU6OkhSVEZLZXJuZWw6Om55
cXVpc3QpOgorICAgICAgICAoV2ViQ29yZTo6SFJURktlcm5lbDo6SFJURktlcm5lbCk6CisKIDIw
MTAtMDktMTcgIEx1Y2FzIERlIE1hcmNoaSAgPGx1Y2FzLmRlbWFyY2hpQHByb2Z1c2lvbi5tb2Jp
PgogCiAgICAgICAgIFVucmV2aWV3ZWQsIGJ1aWxkIGZpeC4gQWRkIGZpbGVzIG1pc3NlZCBpbiBy
Njc3MDQuCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL0hSVEZLZXJuZWwuY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vYXVkaW8vSFJURktlcm5lbC5jcHAJKHJldmlzaW9u
IDApCisrKyBXZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL0hSVEZLZXJuZWwuY3BwCShyZXZpc2lvbiAw
KQpAQCAtMCwwICsxLDE0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz
dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gIE5laXRoZXIg
dGhlIG5hbWUgb2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMg
b2YKKyAqICAgICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJv
bW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQg
c3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5Z
CisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9T
UyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9G
CisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2lmIEVOQUJMRShX
RUJfQVVESU8pCisKKyNpbmNsdWRlICJIUlRGS2VybmVsLmgiCisKKyNpbmNsdWRlICJBdWRpb0No
YW5uZWwuaCIKKyNpbmNsdWRlICJCaXF1YWQuaCIKKyNpbmNsdWRlICJGRlRGcmFtZS5oIgorCit1
c2luZyBuYW1lc3BhY2Ugc3RkOworCituYW1lc3BhY2UgV2ViQ29yZSB7CisKKy8vIFRha2VzIHRo
ZSBpbnB1dCBBdWRpb0NoYW5uZWwgYXMgYW4gaW5wdXQgaW1wdWxzZSByZXNwb25zZSBhbmQgY2Fs
Y3VsYXRlcyB0aGUgYXZlcmFnZSBncm91cCBkZWxheS4KKy8vIFRoaXMgcmVwcmVzZW50cyB0aGUg
aW5pdGlhbCBkZWxheSBiZWZvcmUgdGhlIG1vc3QgZW5lcmdldGljIHBhcnQgb2YgdGhlIGltcHVs
c2UgcmVzcG9uc2UuCisvLyBUaGUgc2FtcGxlLWZyYW1lIGRlbGF5IGlzIHJlbW92ZWQgZnJvbSB0
aGUgaW1wdWxzZVAgaW1wdWxzZSByZXNwb25zZSwgYW5kIHRoaXMgdmFsdWUgIGlzIHJldHVybmVk
LgorLy8gdGhlIGxlbmd0aCBvZiB0aGUgcGFzc2VkIGluIEF1ZGlvQ2hhbm5lbCBtdXN0IGJlIGEg
cG93ZXIgb2YgMi4KK3N0YXRpYyBkb3VibGUgZXh0cmFjdEF2ZXJhZ2VHcm91cERlbGF5KEF1ZGlv
Q2hhbm5lbCogY2hhbm5lbCkKK3sKKyAgICBBU1NFUlQoY2hhbm5lbCk7CisgICAgICAgIAorICAg
IGZsb2F0KiBpbXB1bHNlUCA9IGNoYW5uZWwtPmRhdGEoKTsKKyAgICBzaXplX3QgbGVuZ3RoID0g
Y2hhbm5lbC0+bGVuZ3RoKCk7CisgICAgCisgICAgLy8gQ2hlY2sgdGhhdCBsZW5ndGggaXMgcG93
ZXItb2YtMjsKKyAgICBBU1NFUlQoMVVMIDw8IHN0YXRpY19jYXN0PHVuc2lnbmVkPihsb2cyKGxl
bmd0aCkpID09IGxlbmd0aCk7CisKKyAgICBGRlRGcmFtZSBlc3RpbWF0aW9uRnJhbWUobGVuZ3Ro
KTsKKyAgICBlc3RpbWF0aW9uRnJhbWUuZG9GRlQoaW1wdWxzZVApOworCisgICAgZG91YmxlIGZy
YW1lRGVsYXkgPSBlc3RpbWF0aW9uRnJhbWUuZXh0cmFjdEF2ZXJhZ2VHcm91cERlbGF5KCk7Cisg
ICAgZXN0aW1hdGlvbkZyYW1lLmRvSW52ZXJzZUZGVChpbXB1bHNlUCk7CisKKyAgICByZXR1cm4g
ZnJhbWVEZWxheTsKK30KKworSFJURktlcm5lbDo6SFJURktlcm5lbChBdWRpb0NoYW5uZWwqIGNo
YW5uZWwsIHNpemVfdCBmZnRTaXplLCBkb3VibGUgc2FtcGxlUmF0ZSwgYm9vbCBiYXNzQm9vc3Qp
CisgICAgOiBtX2ZyYW1lRGVsYXkoMC4wKQorICAgICwgbV9zYW1wbGVSYXRlKHNhbXBsZVJhdGUp
Cit7CisgICAgQVNTRVJUKGNoYW5uZWwpOworCisgICAgLy8gRGV0ZXJtaW5lIHRoZSBsZWFkaW5n
IGRlbGF5IChhdmVyYWdlIGdyb3VwIGRlbGF5KSBmb3IgdGhlIHJlc3BvbnNlLgorICAgIG1fZnJh
bWVEZWxheSA9IGV4dHJhY3RBdmVyYWdlR3JvdXBEZWxheShjaGFubmVsKTsKKworICAgIGZsb2F0
KiBpbXB1bHNlUmVzcG9uc2UgPSBjaGFubmVsLT5kYXRhKCk7CisgICAgc2l6ZV90IHJlc3BvbnNl
TGVuZ3RoID0gY2hhbm5lbC0+bGVuZ3RoKCk7CisKKyAgICBpZiAoYmFzc0Jvb3N0KSB7CisgICAg
ICAgIC8vIFJ1biB0aHJvdWdoIHNvbWUgcG9zdC1wcm9jZXNzaW5nIHRvIGJvb3N0IHRoZSBiYXNz
IGEgbGl0dGxlIC0tIHRoZSBIUlRGJ3Mgc2VlbSB0byBiZSBhIGxpdHRsZSBiYXNzLWRlZmljaWVu
dC4KKyAgICAgICAgLy8gRklYTUU6IHRoaXMgcG9zdC1wcm9jZXNzaW5nIHNob3VsZCBoYXZlIGFs
cmVhZHkgYmVlbiBhcHBsaWVkIHRvIHRoZSBIUlRGIGZpbGUgcmVzb3VyY2VzLiAgT25jZSB0aGUg
ZmlsZXMgYXJlIHB1dCBpbnRvIHRoaXMgZm9ybSwKKyAgICAgICAgLy8gdGhlbiB0aGlzIGNvZGUg
cGF0aCBjYW4gYmUgcmVtb3ZlZCBhbG9uZyB3aXRoIHRoZSBiYXNzQm9vc3QgcGFyYW1ldGVyLgor
ICAgICAgICBCaXF1YWQgZmlsdGVyOworICAgICAgICBmaWx0ZXIuc2V0TG93U2hlbGZQYXJhbXMo
NzAwLjAgLyBueXF1aXN0KCksIDYuMCk7IC8vIGJvb3N0IDZkQiBhdCA3MDBIegorICAgICAgICBm
aWx0ZXIucHJvY2VzcyhpbXB1bHNlUmVzcG9uc2UsIGltcHVsc2VSZXNwb25zZSwgcmVzcG9uc2VM
ZW5ndGgpOworICAgIH0KKworICAgIC8vIFdlIG5lZWQgdG8gdHJ1bmNhdGUgdG8gZml0IGludG8g
MS8yIHRoZSBGRlQgc2l6ZSAod2l0aCB6ZXJvIHBhZGRpbmcpIGluIG9yZGVyIHRvIGRvIHByb3Bl
ciBjb252b2x1dGlvbi4KKyAgICBzaXplX3QgdHJ1bmNhdGVkUmVzcG9uc2VMZW5ndGggPSBtaW4o
cmVzcG9uc2VMZW5ndGgsIGZmdFNpemUgLyAyKTsgLy8gdHJ1bmNhdGUgaWYgbmVjZXNzYXJ5IHRv
IG1heCBpbXB1bHNlIHJlc3BvbnNlIGxlbmd0aCBhbGxvd2VkIGJ5IEZGVAorCisgICAgLy8gUXVp
Y2sgZmFkZS1vdXQgKGFwcGx5IHdpbmRvdykgYXQgdHJ1bmNhdGlvbiBwb2ludAorICAgIHVuc2ln
bmVkIG51bWJlck9mRmFkZU91dEZyYW1lcyA9IHN0YXRpY19jYXN0PHVuc2lnbmVkPihzYW1wbGVS
YXRlIC8gNDQxMCk7IC8vIDEwIHNhbXBsZS1mcmFtZXMgQDQ0LjFLSHogc2FtcGxlLXJhdGUKKyAg
ICBBU1NFUlQobnVtYmVyT2ZGYWRlT3V0RnJhbWVzIDwgdHJ1bmNhdGVkUmVzcG9uc2VMZW5ndGgp
OworICAgIGlmIChudW1iZXJPZkZhZGVPdXRGcmFtZXMgPCB0cnVuY2F0ZWRSZXNwb25zZUxlbmd0
aCkgeworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSB0cnVuY2F0ZWRSZXNwb25zZUxlbmd0aCAt
IG51bWJlck9mRmFkZU91dEZyYW1lczsgaSA8IHRydW5jYXRlZFJlc3BvbnNlTGVuZ3RoOyArK2kp
IHsKKyAgICAgICAgICAgIGZsb2F0IHggPSAxLjBmIC0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KGkgLSAo
dHJ1bmNhdGVkUmVzcG9uc2VMZW5ndGggLSBudW1iZXJPZkZhZGVPdXRGcmFtZXMpKSAvIG51bWJl
ck9mRmFkZU91dEZyYW1lczsKKyAgICAgICAgICAgIGltcHVsc2VSZXNwb25zZVtpXSAqPSB4Owor
ICAgICAgICB9CisgICAgfQorCisgICAgbV9mZnRGcmFtZSA9IGFkb3B0UHRyKG5ldyBGRlRGcmFt
ZShmZnRTaXplKSk7CisgICAgbV9mZnRGcmFtZS0+ZG9QYWRkZWRGRlQoaW1wdWxzZVJlc3BvbnNl
LCB0cnVuY2F0ZWRSZXNwb25zZUxlbmd0aCk7Cit9CisKK1Bhc3NPd25QdHI8QXVkaW9DaGFubmVs
PiBIUlRGS2VybmVsOjpjcmVhdGVJbXB1bHNlUmVzcG9uc2UoKQoreworICAgIE93blB0cjxBdWRp
b0NoYW5uZWw+IGNoYW5uZWwgPSBhZG9wdFB0cihuZXcgQXVkaW9DaGFubmVsKGZmdFNpemUoKSkp
OworICAgIEZGVEZyYW1lIGZmdEZyYW1lKCptX2ZmdEZyYW1lKTsKKworICAgIC8vIEFkZCBsZWFk
aW5nIGRlbGF5IGJhY2sgaW4uCisgICAgZmZ0RnJhbWUuYWRkQ29uc3RhbnRHcm91cERlbGF5KG1f
ZnJhbWVEZWxheSk7CisgICAgZmZ0RnJhbWUuZG9JbnZlcnNlRkZUKGNoYW5uZWwtPmRhdGEoKSk7
CisKKyAgICByZXR1cm4gY2hhbm5lbC5yZWxlYXNlKCk7Cit9CisKKy8vIEludGVycG9sYXRlcyB0
d28ga2VybmVscyB3aXRoIHg6IDAgLT4gMSBhbmQgcmV0dXJucyB0aGUgcmVzdWx0LgorUGFzc1Jl
ZlB0cjxIUlRGS2VybmVsPiBIUlRGS2VybmVsOjpjcmVhdGVJbnRlcnBvbGF0ZWRLZXJuZWwoSFJU
Rktlcm5lbCoga2VybmVsMSwgSFJURktlcm5lbCoga2VybmVsMiwgZG91YmxlIHgpCit7CisgICAg
QVNTRVJUKGtlcm5lbDEgJiYga2VybmVsMik7CisgICAgaWYgKCFrZXJuZWwxIHx8ICFrZXJuZWwy
KQorICAgICAgICByZXR1cm4gMDsKKyAKKyAgICBib29sIGNoZWNrWCA9IHggPj0gMC4wICYmIHgg
PCAxLjA7CisgICAgQVNTRVJUKGNoZWNrWCk7CisgICAgeCA9IG1heCgwLjAsIHgpOworICAgIHgg
PSBtaW4oMS4wLCB4KTsKKyAgICAKKyAgICBkb3VibGUgc2FtcGxlUmF0ZTEgPSBrZXJuZWwxLT5z
YW1wbGVSYXRlKCk7CisgICAgZG91YmxlIHNhbXBsZVJhdGUyID0ga2VybmVsMi0+c2FtcGxlUmF0
ZSgpOworICAgIEFTU0VSVChzYW1wbGVSYXRlMSA9PSBzYW1wbGVSYXRlMik7CisgICAgaWYgKHNh
bXBsZVJhdGUxICE9IHNhbXBsZVJhdGUyKQorICAgICAgICByZXR1cm4gMDsKKyAgICAKKyAgICBk
b3VibGUgZnJhbWVEZWxheSA9ICgxLjAgLSB4KSAqIGtlcm5lbDEtPmZyYW1lRGVsYXkoKSArIHgg
KiBrZXJuZWwyLT5mcmFtZURlbGF5KCk7CisgICAgCisgICAgT3duUHRyPEZGVEZyYW1lPiBpbnRl
cnBvbGF0ZWRGcmFtZSA9IEZGVEZyYW1lOjpjcmVhdGVJbnRlcnBvbGF0ZWRGcmFtZSgqa2VybmVs
MS0+ZmZ0RnJhbWUoKSwgKmtlcm5lbDItPmZmdEZyYW1lKCksIHgpOworICAgIHJldHVybiBIUlRG
S2VybmVsOjpjcmVhdGUoaW50ZXJwb2xhdGVkRnJhbWUucmVsZWFzZSgpLCBmcmFtZURlbGF5LCBz
YW1wbGVSYXRlMSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIEVO
QUJMRShXRUJfQVVESU8pCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL0hSVEZLZXJuZWwu
aAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL0hSVEZLZXJuZWwuaAkocmV2
aXNpb24gMCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vYXVkaW8vSFJURktlcm5lbC5oCShyZXZpc2lv
biAwKQpAQCAtMCwwICsxLDk5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiAgTmVpdGhl
ciB0aGUgbmFtZSBvZiBBcHBsZSBDb21wdXRlciwgSW5jLiAoIkFwcGxlIikgbm9yIHRoZSBuYW1l
cyBvZgorICogICAgIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBw
cm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91
dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBB
TlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQu
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBM
T1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0Ug
T0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBIUlRGS2VybmVsX2gKKyNkZWZpbmUgSFJU
Rktlcm5lbF9oCisKKyNpbmNsdWRlICJGRlRGcmFtZS5oIgorI2luY2x1ZGUgPHd0Zi9Pd25QdHIu
aD4KKyNpbmNsdWRlIDx3dGYvUGFzc093blB0ci5oPgorI2luY2x1ZGUgPHd0Zi9QYXNzUmVmUHRy
Lmg+CisjaW5jbHVkZSA8d3RmL1JlZkNvdW50ZWQuaD4KKyNpbmNsdWRlIDx3dGYvUmVmUHRyLmg+
CisjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNz
IEF1ZGlvQ2hhbm5lbDsKKyAgICAKKy8vIEhSVEYgc3RhbmRzIGZvciBIZWFkLVJlbGF0ZWQgVHJh
bnNmZXIgRnVuY3Rpb24uCisvLyBIUlRGS2VybmVsIGlzIGEgZnJlcXVlbmN5LWRvbWFpbiByZXBy
ZXNlbnRhdGlvbiBvZiBhbiBpbXB1bHNlLXJlc3BvbnNlIHVzZWQgYXMgcGFydCBvZiB0aGUgc3Bh
dGlhbGl6ZWQgcGFubmluZyBzeXN0ZW0uCisvLyBGb3IgYSBnaXZlbiBhemltdXRoIC8gZWxldmF0
aW9uIGFuZ2xlIHRoZXJlIHdpbGwgYmUgb25lIEhSVEZLZXJuZWwgZm9yIHRoZSBsZWZ0IGVhciB0
cmFuc2ZlciBmdW5jdGlvbiwgYW5kIG9uZSBmb3IgdGhlIHJpZ2h0IGVhci4KKy8vIFRoZSBsZWFk
aW5nIGRlbGF5IChhdmVyYWdlIGdyb3VwIGRlbGF5KSBmb3IgZWFjaCBpbXB1bHNlIHJlc3BvbnNl
IGlzIGV4dHJhY3RlZDoKKy8vICAgICAgbV9mZnRGcmFtZSBpcyB0aGUgZnJlcXVlbmN5LWRvbWFp
biByZXByZXNlbnRhdGlvbiBvZiB0aGUgaW1wdWxzZSByZXNwb25zZSB3aXRoIHRoZSBkZWxheSBy
ZW1vdmVkCisvLyAgICAgIG1fZnJhbWVEZWxheSBpcyB0aGUgbGVhZGluZyBkZWxheSBvZiB0aGUg
b3JpZ2luYWwgaW1wdWxzZSByZXNwb25zZS4KK2NsYXNzIEhSVEZLZXJuZWwgOiBwdWJsaWMgUmVm
Q291bnRlZDxIUlRGS2VybmVsPiB7CitwdWJsaWM6CisgICAgLy8gTm90ZTogdGhpcyBpcyBkZXN0
cnVjdGl2ZSBvbiB0aGUgcGFzc2VkIGluIEF1ZGlvQ2hhbm5lbC4KKyAgICAvLyBUaGUgbGVuZ3Ro
IG9mIGNoYW5uZWwgbXVzdCBiZSBhIHBvd2VyIG9mIHR3by4KKyAgICBzdGF0aWMgUGFzc1JlZlB0
cjxIUlRGS2VybmVsPiBjcmVhdGUoQXVkaW9DaGFubmVsKiBjaGFubmVsLCBzaXplX3QgZmZ0U2l6
ZSwgZG91YmxlIHNhbXBsZVJhdGUsIGJvb2wgYmFzc0Jvb3N0KQorICAgIHsKKyAgICAgICAgcmV0
dXJuIGFkb3B0UmVmKG5ldyBIUlRGS2VybmVsKGNoYW5uZWwsIGZmdFNpemUsIHNhbXBsZVJhdGUs
IGJhc3NCb29zdCkpOworICAgIH0KKworICAgIHN0YXRpYyBQYXNzUmVmUHRyPEhSVEZLZXJuZWw+
IGNyZWF0ZShQYXNzT3duUHRyPEZGVEZyYW1lPiBmZnRGcmFtZSwgZG91YmxlIGZyYW1lRGVsYXks
IGRvdWJsZSBzYW1wbGVSYXRlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBI
UlRGS2VybmVsKGZmdEZyYW1lLCBmcmFtZURlbGF5LCBzYW1wbGVSYXRlKSk7CisgICAgfQorCisg
ICAgLy8gR2l2ZW4gdHdvIEhSVEZLZXJuZWxzLCBhbmQgYW4gaW50ZXJwb2xhdGlvbiBmYWN0b3Ig
eDogMCAtPiAxLCByZXR1cm5zIGFuIGludGVycG9sYXRlZCBIUlRGS2VybmVsLgorICAgIHN0YXRp
YyBQYXNzUmVmUHRyPEhSVEZLZXJuZWw+IGNyZWF0ZUludGVycG9sYXRlZEtlcm5lbChIUlRGS2Vy
bmVsKiBrZXJuZWwxLCBIUlRGS2VybmVsKiBrZXJuZWwyLCBkb3VibGUgeCk7CisgIAorICAgIAor
ICAgIEZGVEZyYW1lKiBmZnRGcmFtZSgpIHsgcmV0dXJuIG1fZmZ0RnJhbWUuZ2V0KCk7IH0KKyAg
ICAKKyAgICBzaXplX3QgZmZ0U2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fZmZ0RnJhbWUtPmZmdFNp
emUoKTsgfQorICAgIGRvdWJsZSBmcmFtZURlbGF5KCkgY29uc3QgeyByZXR1cm4gbV9mcmFtZURl
bGF5OyB9CisKKyAgICBkb3VibGUgc2FtcGxlUmF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1fc2FtcGxl
UmF0ZTsgfQorICAgIGRvdWJsZSBueXF1aXN0KCkgY29uc3QgeyByZXR1cm4gMC41ICogc2FtcGxl
UmF0ZSgpOyB9CisKKyAgICAvLyBDb252ZXJ0cyBiYWNrIGludG8gaW1wdWxzZS1yZXNwb25zZSBm
b3JtLgorICAgIFBhc3NPd25QdHI8QXVkaW9DaGFubmVsPiBjcmVhdGVJbXB1bHNlUmVzcG9uc2Uo
KTsKKworcHJpdmF0ZToKKyAgICAvLyBOb3RlOiB0aGlzIGlzIGRlc3RydWN0aXZlIG9uIHRoZSBw
YXNzZWQgaW4gQXVkaW9DaGFubmVsLgorICAgIEhSVEZLZXJuZWwoQXVkaW9DaGFubmVsKiBjaGFu
bmVsLCBzaXplX3QgZmZ0U2l6ZSwgZG91YmxlIHNhbXBsZVJhdGUsIGJvb2wgYmFzc0Jvb3N0KTsK
KyAgICAKKyAgICBIUlRGS2VybmVsKFBhc3NPd25QdHI8RkZURnJhbWU+IGZmdEZyYW1lLCBkb3Vi
bGUgZnJhbWVEZWxheSwgZG91YmxlIHNhbXBsZVJhdGUpCisgICAgICAgIDogbV9mZnRGcmFtZShm
ZnRGcmFtZSkKKyAgICAgICAgLCBtX2ZyYW1lRGVsYXkoZnJhbWVEZWxheSkKKyAgICAgICAgLCBt
X3NhbXBsZVJhdGUoc2FtcGxlUmF0ZSkKKyAgICB7CisgICAgfQorICAgIAorICAgIE93blB0cjxG
RlRGcmFtZT4gbV9mZnRGcmFtZTsKKyAgICBkb3VibGUgbV9mcmFtZURlbGF5OworICAgIGRvdWJs
ZSBtX3NhbXBsZVJhdGU7Cit9OworCit0eXBlZGVmIFZlY3RvcjxSZWZQdHI8SFJURktlcm5lbD4g
PiBIUlRGS2VybmVsTGlzdDsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8g
SFJURktlcm5lbF9oCg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>68293</attachid>
            <date>2010-09-21 14:36:56 -0700</date>
            <delta_ts>2010-09-22 01:11:01 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-45863-20100921143655.patch</filename>
            <type>text/plain</type>
            <size>11725</size>
            <attacher name="Chris Rogers">crogers</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2Nzk4OCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMjYgQEAKKzIwMTAtMDktMjEgIENocmlzIFJvZ2VycyAgPGNyb2dlcnNAZ29vZ2xl
LmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBB
ZGQgSFJURktlcm5lbCBmaWxlcworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93
X2J1Zy5jZ2k/aWQ9NDU4NjMKKworICAgICAgICBObyBuZXcgdGVzdHMgc2luY2UgYXVkaW8gQVBJ
IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQuCisKKyAgICAgICAgKiBwbGF0Zm9ybS9hdWRpby9IUlRG
S2VybmVsLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpleHRyYWN0QXZlcmFnZUdyb3Vw
RGVsYXkpOgorICAgICAgICAoV2ViQ29yZTo6SFJURktlcm5lbDo6SFJURktlcm5lbCk6CisgICAg
ICAgIChXZWJDb3JlOjpIUlRGS2VybmVsOjpjcmVhdGVJbXB1bHNlUmVzcG9uc2UpOgorICAgICAg
ICAoV2ViQ29yZTo6SFJURktlcm5lbDo6Y3JlYXRlSW50ZXJwb2xhdGVkS2VybmVsKToKKyAgICAg
ICAgKiBwbGF0Zm9ybS9hdWRpby9IUlRGS2VybmVsLmg6IEFkZGVkLgorICAgICAgICAoV2ViQ29y
ZTo6SFJURktlcm5lbDo6Y3JlYXRlKToKKyAgICAgICAgKFdlYkNvcmU6OkhSVEZLZXJuZWw6OmZm
dEZyYW1lKToKKyAgICAgICAgKFdlYkNvcmU6OkhSVEZLZXJuZWw6OmZmdFNpemUpOgorICAgICAg
ICAoV2ViQ29yZTo6SFJURktlcm5lbDo6ZnJhbWVEZWxheSk6CisgICAgICAgIChXZWJDb3JlOjpI
UlRGS2VybmVsOjpzYW1wbGVSYXRlKToKKyAgICAgICAgKFdlYkNvcmU6OkhSVEZLZXJuZWw6Om55
cXVpc3QpOgorICAgICAgICAoV2ViQ29yZTo6SFJURktlcm5lbDo6SFJURktlcm5lbCk6CisKIDIw
MTAtMDktMjEgIFRvbnkgQ2hhbmcgIDx0b255QGNocm9taXVtLm9yZz4KIAogICAgICAgICBVbnJl
dmlld2VkLCBRVCBidWlsZCBmaXguCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL0hSVEZL
ZXJuZWwuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vYXVkaW8vSFJURktlcm5l
bC5jcHAJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL0hSVEZLZXJuZWwu
Y3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDE0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9u
IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgor
ICogMy4gIE5laXRoZXIgdGhlIG5hbWUgb2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBsZSIp
IG5vciB0aGUgbmFtZXMgb2YKKyAqICAgICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRv
IGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNv
ZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMg
IkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisg
KiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JT
IEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICog
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIK
KworI2lmIEVOQUJMRShXRUJfQVVESU8pCisKKyNpbmNsdWRlICJIUlRGS2VybmVsLmgiCisKKyNp
bmNsdWRlICJBdWRpb0NoYW5uZWwuaCIKKyNpbmNsdWRlICJCaXF1YWQuaCIKKyNpbmNsdWRlICJG
RlRGcmFtZS5oIgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCituYW1lc3BhY2UgV2ViQ29yZSB7
CisKKy8vIFRha2VzIHRoZSBpbnB1dCBBdWRpb0NoYW5uZWwgYXMgYW4gaW5wdXQgaW1wdWxzZSBy
ZXNwb25zZSBhbmQgY2FsY3VsYXRlcyB0aGUgYXZlcmFnZSBncm91cCBkZWxheS4KKy8vIFRoaXMg
cmVwcmVzZW50cyB0aGUgaW5pdGlhbCBkZWxheSBiZWZvcmUgdGhlIG1vc3QgZW5lcmdldGljIHBh
cnQgb2YgdGhlIGltcHVsc2UgcmVzcG9uc2UuCisvLyBUaGUgc2FtcGxlLWZyYW1lIGRlbGF5IGlz
IHJlbW92ZWQgZnJvbSB0aGUgaW1wdWxzZVAgaW1wdWxzZSByZXNwb25zZSwgYW5kIHRoaXMgdmFs
dWUgIGlzIHJldHVybmVkLgorLy8gdGhlIGxlbmd0aCBvZiB0aGUgcGFzc2VkIGluIEF1ZGlvQ2hh
bm5lbCBtdXN0IGJlIGEgcG93ZXIgb2YgMi4KK3N0YXRpYyBkb3VibGUgZXh0cmFjdEF2ZXJhZ2VH
cm91cERlbGF5KEF1ZGlvQ2hhbm5lbCogY2hhbm5lbCkKK3sKKyAgICBBU1NFUlQoY2hhbm5lbCk7
CisgICAgICAgIAorICAgIGZsb2F0KiBpbXB1bHNlUCA9IGNoYW5uZWwtPmRhdGEoKTsKKyAgICBz
aXplX3QgbGVuZ3RoID0gY2hhbm5lbC0+bGVuZ3RoKCk7CisgICAgCisgICAgLy8gQ2hlY2sgdGhh
dCBsZW5ndGggaXMgcG93ZXItb2YtMjsKKyAgICBBU1NFUlQoMVVMIDw8IHN0YXRpY19jYXN0PHVu
c2lnbmVkPihsb2cyKGxlbmd0aCkpID09IGxlbmd0aCk7CisKKyAgICBGRlRGcmFtZSBlc3RpbWF0
aW9uRnJhbWUobGVuZ3RoKTsKKyAgICBlc3RpbWF0aW9uRnJhbWUuZG9GRlQoaW1wdWxzZVApOwor
CisgICAgZG91YmxlIGZyYW1lRGVsYXkgPSBlc3RpbWF0aW9uRnJhbWUuZXh0cmFjdEF2ZXJhZ2VH
cm91cERlbGF5KCk7CisgICAgZXN0aW1hdGlvbkZyYW1lLmRvSW52ZXJzZUZGVChpbXB1bHNlUCk7
CisKKyAgICByZXR1cm4gZnJhbWVEZWxheTsKK30KKworSFJURktlcm5lbDo6SFJURktlcm5lbChB
dWRpb0NoYW5uZWwqIGNoYW5uZWwsIHNpemVfdCBmZnRTaXplLCBkb3VibGUgc2FtcGxlUmF0ZSwg
Ym9vbCBiYXNzQm9vc3QpCisgICAgOiBtX2ZyYW1lRGVsYXkoMC4wKQorICAgICwgbV9zYW1wbGVS
YXRlKHNhbXBsZVJhdGUpCit7CisgICAgQVNTRVJUKGNoYW5uZWwpOworCisgICAgLy8gRGV0ZXJt
aW5lIHRoZSBsZWFkaW5nIGRlbGF5IChhdmVyYWdlIGdyb3VwIGRlbGF5KSBmb3IgdGhlIHJlc3Bv
bnNlLgorICAgIG1fZnJhbWVEZWxheSA9IGV4dHJhY3RBdmVyYWdlR3JvdXBEZWxheShjaGFubmVs
KTsKKworICAgIGZsb2F0KiBpbXB1bHNlUmVzcG9uc2UgPSBjaGFubmVsLT5kYXRhKCk7CisgICAg
c2l6ZV90IHJlc3BvbnNlTGVuZ3RoID0gY2hhbm5lbC0+bGVuZ3RoKCk7CisKKyAgICBpZiAoYmFz
c0Jvb3N0KSB7CisgICAgICAgIC8vIFJ1biB0aHJvdWdoIHNvbWUgcG9zdC1wcm9jZXNzaW5nIHRv
IGJvb3N0IHRoZSBiYXNzIGEgbGl0dGxlIC0tIHRoZSBIUlRGJ3Mgc2VlbSB0byBiZSBhIGxpdHRs
ZSBiYXNzLWRlZmljaWVudC4KKyAgICAgICAgLy8gRklYTUU6IHRoaXMgcG9zdC1wcm9jZXNzaW5n
IHNob3VsZCBoYXZlIGFscmVhZHkgYmVlbiBhcHBsaWVkIHRvIHRoZSBIUlRGIGZpbGUgcmVzb3Vy
Y2VzLiAgT25jZSB0aGUgZmlsZXMgYXJlIHB1dCBpbnRvIHRoaXMgZm9ybSwKKyAgICAgICAgLy8g
dGhlbiB0aGlzIGNvZGUgcGF0aCBjYW4gYmUgcmVtb3ZlZCBhbG9uZyB3aXRoIHRoZSBiYXNzQm9v
c3QgcGFyYW1ldGVyLgorICAgICAgICBCaXF1YWQgZmlsdGVyOworICAgICAgICBmaWx0ZXIuc2V0
TG93U2hlbGZQYXJhbXMoNzAwLjAgLyBueXF1aXN0KCksIDYuMCk7IC8vIGJvb3N0IDZkQiBhdCA3
MDBIegorICAgICAgICBmaWx0ZXIucHJvY2VzcyhpbXB1bHNlUmVzcG9uc2UsIGltcHVsc2VSZXNw
b25zZSwgcmVzcG9uc2VMZW5ndGgpOworICAgIH0KKworICAgIC8vIFdlIG5lZWQgdG8gdHJ1bmNh
dGUgdG8gZml0IGludG8gMS8yIHRoZSBGRlQgc2l6ZSAod2l0aCB6ZXJvIHBhZGRpbmcpIGluIG9y
ZGVyIHRvIGRvIHByb3BlciBjb252b2x1dGlvbi4KKyAgICBzaXplX3QgdHJ1bmNhdGVkUmVzcG9u
c2VMZW5ndGggPSBtaW4ocmVzcG9uc2VMZW5ndGgsIGZmdFNpemUgLyAyKTsgLy8gdHJ1bmNhdGUg
aWYgbmVjZXNzYXJ5IHRvIG1heCBpbXB1bHNlIHJlc3BvbnNlIGxlbmd0aCBhbGxvd2VkIGJ5IEZG
VAorCisgICAgLy8gUXVpY2sgZmFkZS1vdXQgKGFwcGx5IHdpbmRvdykgYXQgdHJ1bmNhdGlvbiBw
b2ludAorICAgIHVuc2lnbmVkIG51bWJlck9mRmFkZU91dEZyYW1lcyA9IHN0YXRpY19jYXN0PHVu
c2lnbmVkPihzYW1wbGVSYXRlIC8gNDQxMCk7IC8vIDEwIHNhbXBsZS1mcmFtZXMgQDQ0LjFLSHog
c2FtcGxlLXJhdGUKKyAgICBBU1NFUlQobnVtYmVyT2ZGYWRlT3V0RnJhbWVzIDwgdHJ1bmNhdGVk
UmVzcG9uc2VMZW5ndGgpOworICAgIGlmIChudW1iZXJPZkZhZGVPdXRGcmFtZXMgPCB0cnVuY2F0
ZWRSZXNwb25zZUxlbmd0aCkgeworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSB0cnVuY2F0ZWRS
ZXNwb25zZUxlbmd0aCAtIG51bWJlck9mRmFkZU91dEZyYW1lczsgaSA8IHRydW5jYXRlZFJlc3Bv
bnNlTGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIGZsb2F0IHggPSAxLjBmIC0gc3RhdGljX2Nh
c3Q8ZmxvYXQ+KGkgLSAodHJ1bmNhdGVkUmVzcG9uc2VMZW5ndGggLSBudW1iZXJPZkZhZGVPdXRG
cmFtZXMpKSAvIG51bWJlck9mRmFkZU91dEZyYW1lczsKKyAgICAgICAgICAgIGltcHVsc2VSZXNw
b25zZVtpXSAqPSB4OworICAgICAgICB9CisgICAgfQorCisgICAgbV9mZnRGcmFtZSA9IGFkb3B0
UHRyKG5ldyBGRlRGcmFtZShmZnRTaXplKSk7CisgICAgbV9mZnRGcmFtZS0+ZG9QYWRkZWRGRlQo
aW1wdWxzZVJlc3BvbnNlLCB0cnVuY2F0ZWRSZXNwb25zZUxlbmd0aCk7Cit9CisKK1Bhc3NPd25Q
dHI8QXVkaW9DaGFubmVsPiBIUlRGS2VybmVsOjpjcmVhdGVJbXB1bHNlUmVzcG9uc2UoKQorewor
ICAgIE93blB0cjxBdWRpb0NoYW5uZWw+IGNoYW5uZWwgPSBhZG9wdFB0cihuZXcgQXVkaW9DaGFu
bmVsKGZmdFNpemUoKSkpOworICAgIEZGVEZyYW1lIGZmdEZyYW1lKCptX2ZmdEZyYW1lKTsKKwor
ICAgIC8vIEFkZCBsZWFkaW5nIGRlbGF5IGJhY2sgaW4uCisgICAgZmZ0RnJhbWUuYWRkQ29uc3Rh
bnRHcm91cERlbGF5KG1fZnJhbWVEZWxheSk7CisgICAgZmZ0RnJhbWUuZG9JbnZlcnNlRkZUKGNo
YW5uZWwtPmRhdGEoKSk7CisKKyAgICByZXR1cm4gY2hhbm5lbC5yZWxlYXNlKCk7Cit9CisKKy8v
IEludGVycG9sYXRlcyB0d28ga2VybmVscyB3aXRoIHg6IDAgLT4gMSBhbmQgcmV0dXJucyB0aGUg
cmVzdWx0LgorUGFzc1JlZlB0cjxIUlRGS2VybmVsPiBIUlRGS2VybmVsOjpjcmVhdGVJbnRlcnBv
bGF0ZWRLZXJuZWwoSFJURktlcm5lbCoga2VybmVsMSwgSFJURktlcm5lbCoga2VybmVsMiwgZG91
YmxlIHgpCit7CisgICAgQVNTRVJUKGtlcm5lbDEgJiYga2VybmVsMik7CisgICAgaWYgKCFrZXJu
ZWwxIHx8ICFrZXJuZWwyKQorICAgICAgICByZXR1cm4gMDsKKyAKKyAgICBBU1NFUlQoeCA+PSAw
LjAgJiYgeCA8IDEuMCk7CisgICAgeCA9IG1pbigxLjAsIG1heCgwLjAsIHgpKTsKKyAgICAKKyAg
ICBkb3VibGUgc2FtcGxlUmF0ZTEgPSBrZXJuZWwxLT5zYW1wbGVSYXRlKCk7CisgICAgZG91Ymxl
IHNhbXBsZVJhdGUyID0ga2VybmVsMi0+c2FtcGxlUmF0ZSgpOworICAgIEFTU0VSVChzYW1wbGVS
YXRlMSA9PSBzYW1wbGVSYXRlMik7CisgICAgaWYgKHNhbXBsZVJhdGUxICE9IHNhbXBsZVJhdGUy
KQorICAgICAgICByZXR1cm4gMDsKKyAgICAKKyAgICBkb3VibGUgZnJhbWVEZWxheSA9ICgxLjAg
LSB4KSAqIGtlcm5lbDEtPmZyYW1lRGVsYXkoKSArIHggKiBrZXJuZWwyLT5mcmFtZURlbGF5KCk7
CisgICAgCisgICAgT3duUHRyPEZGVEZyYW1lPiBpbnRlcnBvbGF0ZWRGcmFtZSA9IEZGVEZyYW1l
OjpjcmVhdGVJbnRlcnBvbGF0ZWRGcmFtZSgqa2VybmVsMS0+ZmZ0RnJhbWUoKSwgKmtlcm5lbDIt
PmZmdEZyYW1lKCksIHgpOworICAgIHJldHVybiBIUlRGS2VybmVsOjpjcmVhdGUoaW50ZXJwb2xh
dGVkRnJhbWUucmVsZWFzZSgpLCBmcmFtZURlbGF5LCBzYW1wbGVSYXRlMSk7Cit9CisKK30gLy8g
bmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIEVOQUJMRShXRUJfQVVESU8pCkluZGV4OiBX
ZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL0hSVEZLZXJuZWwuaAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3Jl
L3BsYXRmb3JtL2F1ZGlvL0hSVEZLZXJuZWwuaAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvcGxh
dGZvcm0vYXVkaW8vSFJURktlcm5lbC5oCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDk4IEBACisv
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
I2lmbmRlZiBIUlRGS2VybmVsX2gKKyNkZWZpbmUgSFJURktlcm5lbF9oCisKKyNpbmNsdWRlICJG
RlRGcmFtZS5oIgorI2luY2x1ZGUgPHd0Zi9Pd25QdHIuaD4KKyNpbmNsdWRlIDx3dGYvUGFzc093
blB0ci5oPgorI2luY2x1ZGUgPHd0Zi9QYXNzUmVmUHRyLmg+CisjaW5jbHVkZSA8d3RmL1JlZkNv
dW50ZWQuaD4KKyNpbmNsdWRlIDx3dGYvUmVmUHRyLmg+CisjaW5jbHVkZSA8d3RmL1ZlY3Rvci5o
PgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIEF1ZGlvQ2hhbm5lbDsKKyAgICAKKy8v
IEhSVEYgc3RhbmRzIGZvciBIZWFkLVJlbGF0ZWQgVHJhbnNmZXIgRnVuY3Rpb24uCisvLyBIUlRG
S2VybmVsIGlzIGEgZnJlcXVlbmN5LWRvbWFpbiByZXByZXNlbnRhdGlvbiBvZiBhbiBpbXB1bHNl
LXJlc3BvbnNlIHVzZWQgYXMgcGFydCBvZiB0aGUgc3BhdGlhbGl6ZWQgcGFubmluZyBzeXN0ZW0u
CisvLyBGb3IgYSBnaXZlbiBhemltdXRoIC8gZWxldmF0aW9uIGFuZ2xlIHRoZXJlIHdpbGwgYmUg
b25lIEhSVEZLZXJuZWwgZm9yIHRoZSBsZWZ0IGVhciB0cmFuc2ZlciBmdW5jdGlvbiwgYW5kIG9u
ZSBmb3IgdGhlIHJpZ2h0IGVhci4KKy8vIFRoZSBsZWFkaW5nIGRlbGF5IChhdmVyYWdlIGdyb3Vw
IGRlbGF5KSBmb3IgZWFjaCBpbXB1bHNlIHJlc3BvbnNlIGlzIGV4dHJhY3RlZDoKKy8vICAgICAg
bV9mZnRGcmFtZSBpcyB0aGUgZnJlcXVlbmN5LWRvbWFpbiByZXByZXNlbnRhdGlvbiBvZiB0aGUg
aW1wdWxzZSByZXNwb25zZSB3aXRoIHRoZSBkZWxheSByZW1vdmVkCisvLyAgICAgIG1fZnJhbWVE
ZWxheSBpcyB0aGUgbGVhZGluZyBkZWxheSBvZiB0aGUgb3JpZ2luYWwgaW1wdWxzZSByZXNwb25z
ZS4KK2NsYXNzIEhSVEZLZXJuZWwgOiBwdWJsaWMgUmVmQ291bnRlZDxIUlRGS2VybmVsPiB7Citw
dWJsaWM6CisgICAgLy8gTm90ZTogdGhpcyBpcyBkZXN0cnVjdGl2ZSBvbiB0aGUgcGFzc2VkIGlu
IEF1ZGlvQ2hhbm5lbC4KKyAgICAvLyBUaGUgbGVuZ3RoIG9mIGNoYW5uZWwgbXVzdCBiZSBhIHBv
d2VyIG9mIHR3by4KKyAgICBzdGF0aWMgUGFzc1JlZlB0cjxIUlRGS2VybmVsPiBjcmVhdGUoQXVk
aW9DaGFubmVsKiBjaGFubmVsLCBzaXplX3QgZmZ0U2l6ZSwgZG91YmxlIHNhbXBsZVJhdGUsIGJv
b2wgYmFzc0Jvb3N0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBIUlRGS2Vy
bmVsKGNoYW5uZWwsIGZmdFNpemUsIHNhbXBsZVJhdGUsIGJhc3NCb29zdCkpOworICAgIH0KKwor
ICAgIHN0YXRpYyBQYXNzUmVmUHRyPEhSVEZLZXJuZWw+IGNyZWF0ZShQYXNzT3duUHRyPEZGVEZy
YW1lPiBmZnRGcmFtZSwgZG91YmxlIGZyYW1lRGVsYXksIGRvdWJsZSBzYW1wbGVSYXRlKQorICAg
IHsKKyAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBIUlRGS2VybmVsKGZmdEZyYW1lLCBmcmFt
ZURlbGF5LCBzYW1wbGVSYXRlKSk7CisgICAgfQorCisgICAgLy8gR2l2ZW4gdHdvIEhSVEZLZXJu
ZWxzLCBhbmQgYW4gaW50ZXJwb2xhdGlvbiBmYWN0b3IgeDogMCAtPiAxLCByZXR1cm5zIGFuIGlu
dGVycG9sYXRlZCBIUlRGS2VybmVsLgorICAgIHN0YXRpYyBQYXNzUmVmUHRyPEhSVEZLZXJuZWw+
IGNyZWF0ZUludGVycG9sYXRlZEtlcm5lbChIUlRGS2VybmVsKiBrZXJuZWwxLCBIUlRGS2VybmVs
KiBrZXJuZWwyLCBkb3VibGUgeCk7CisgIAorICAgIEZGVEZyYW1lKiBmZnRGcmFtZSgpIHsgcmV0
dXJuIG1fZmZ0RnJhbWUuZ2V0KCk7IH0KKyAgICAKKyAgICBzaXplX3QgZmZ0U2l6ZSgpIGNvbnN0
IHsgcmV0dXJuIG1fZmZ0RnJhbWUtPmZmdFNpemUoKTsgfQorICAgIGRvdWJsZSBmcmFtZURlbGF5
KCkgY29uc3QgeyByZXR1cm4gbV9mcmFtZURlbGF5OyB9CisKKyAgICBkb3VibGUgc2FtcGxlUmF0
ZSgpIGNvbnN0IHsgcmV0dXJuIG1fc2FtcGxlUmF0ZTsgfQorICAgIGRvdWJsZSBueXF1aXN0KCkg
Y29uc3QgeyByZXR1cm4gMC41ICogc2FtcGxlUmF0ZSgpOyB9CisKKyAgICAvLyBDb252ZXJ0cyBi
YWNrIGludG8gaW1wdWxzZS1yZXNwb25zZSBmb3JtLgorICAgIFBhc3NPd25QdHI8QXVkaW9DaGFu
bmVsPiBjcmVhdGVJbXB1bHNlUmVzcG9uc2UoKTsKKworcHJpdmF0ZToKKyAgICAvLyBOb3RlOiB0
aGlzIGlzIGRlc3RydWN0aXZlIG9uIHRoZSBwYXNzZWQgaW4gQXVkaW9DaGFubmVsLgorICAgIEhS
VEZLZXJuZWwoQXVkaW9DaGFubmVsKiBjaGFubmVsLCBzaXplX3QgZmZ0U2l6ZSwgZG91YmxlIHNh
bXBsZVJhdGUsIGJvb2wgYmFzc0Jvb3N0KTsKKyAgICAKKyAgICBIUlRGS2VybmVsKFBhc3NPd25Q
dHI8RkZURnJhbWU+IGZmdEZyYW1lLCBkb3VibGUgZnJhbWVEZWxheSwgZG91YmxlIHNhbXBsZVJh
dGUpCisgICAgICAgIDogbV9mZnRGcmFtZShmZnRGcmFtZSkKKyAgICAgICAgLCBtX2ZyYW1lRGVs
YXkoZnJhbWVEZWxheSkKKyAgICAgICAgLCBtX3NhbXBsZVJhdGUoc2FtcGxlUmF0ZSkKKyAgICB7
CisgICAgfQorICAgIAorICAgIE93blB0cjxGRlRGcmFtZT4gbV9mZnRGcmFtZTsKKyAgICBkb3Vi
bGUgbV9mcmFtZURlbGF5OworICAgIGRvdWJsZSBtX3NhbXBsZVJhdGU7Cit9OworCit0eXBlZGVm
IFZlY3RvcjxSZWZQdHI8SFJURktlcm5lbD4gPiBIUlRGS2VybmVsTGlzdDsKKworfSAvLyBuYW1l
c3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gSFJURktlcm5lbF9oCg==
</data>

          </attachment>
      

    </bug>

</bugzilla>