<?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>46233</bug_id>
          
          <creation_ts>2010-09-21 17:17:10 -0700</creation_ts>
          <short_desc>Add HRTFDatabase files</short_desc>
          <delta_ts>2010-09-27 20:27:47 -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>282670</commentid>
    <comment_count>0</comment_count>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-09-21 17:17:10 -0700</bug_when>
    <thetext>Add HRTFDatabase files</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>282674</commentid>
    <comment_count>1</comment_count>
      <attachid>68314</attachid>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-09-21 17:18:59 -0700</bug_when>
    <thetext>Created attachment 68314
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>284792</commentid>
    <comment_count>2</comment_count>
      <attachid>68314</attachid>
    <who name="James Robinson">jamesr</who>
    <bug_when>2010-09-24 15:52:01 -0700</bug_when>
    <thetext>Comment on attachment 68314
Patch

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

&gt; WebCore/platform/audio/HRTFDatabase.cpp:43
&gt; +const int HRTFDatabase::MinElevation = -45.0;
&gt; +const int HRTFDatabase::MaxElevation = 90.0;
&gt; +const unsigned HRTFDatabase::RawElevationAngleSpacing = 15.0;

nit: int value shouldn&apos;t have .0

&gt; WebCore/platform/audio/HRTFDatabase.cpp:69
&gt; +    for (int elevation = -45; elevation &lt;= 90; elevation += 15) {

use MinElevation/MaxElevation/RawElevationAngleSpacing here instead of using magic numbers

&gt; WebCore/platform/audio/HRTFDatabase.cpp:80
&gt; +    // Now, go back and interpolate elevations.
&gt; +    if (InterpolationFactor &gt; 1) {

This branch seems dead (InterpolationFactor is const and set to 1).  Is InterpolationFactor intended to be configurable in the future?

Remove the code for now if it really is unreachable.

&gt; WebCore/platform/audio/HRTFDatabase.h:52
&gt; +    static void cleanup();

This needs some documentation or a better name.  What does it clean up?

&gt; WebCore/platform/audio/HRTFDatabase.h:65
&gt; +    static unsigned indexFromElevationAngle(double);

I think it make more sense to let callers to getKernelsFromAzimuthElevation pass in elevation as a double and have getKernels..() map from elevation to index internally.

&gt; WebCore/platform/audio/HRTFDatabase.h:79
&gt; +    // Minimum and maximum elevation angles (inclusive) for a HRTFDatabase.
&gt; +    static const int MinElevation;
&gt; +    static const int MaxElevation;
&gt; +    static const unsigned RawElevationAngleSpacing;
&gt; +    
&gt; +    // Number of elevations loaded from resource.
&gt; +    static const unsigned NumberOfRawElevations;
&gt; +
&gt; +    // Interpolates by this factor to get the total number of elevations from every elevation loaded from resource.
&gt; +    static const unsigned InterpolationFactor;
&gt; +    
&gt; +    // Total number of elevations after interpolation.
&gt; +    static const unsigned NumberOfTotalElevations;

What&apos;s a &quot;raw&quot; elevation and how is it different from a normal elevation?

Do all of these have to be exposed publicly?  It seems that InterpolationFactor and NumberOfTotalElevations at least are implementation details of this class alone.

&gt; WebCore/platform/audio/HRTFDatabase.h:97
&gt; +    // Keeps track of HRTFDatabases for different human subjects.
&gt; +    typedef HashMap&lt;String, RefPtr&lt;HRTFDatabase&gt; &gt; HRTFSubjectMap;
&gt; +    static HRTFSubjectMap* s_subjectMapP;
&gt; +
&gt; +    static HRTFSubjectMap&amp; subjectMap()
&gt; +    {
&gt; +        // Lazily initialize subject map.
&gt; +        if (!s_subjectMapP)
&gt; +            s_subjectMapP = new HRTFSubjectMap();
&gt; +        return *s_subjectMapP;
&gt; +    }

This seems a little fragile.  Is there any reason we want to keep the HRTFDatabase objects alive for the lifetime of the process instead of having it owned by something?  The HRTFDatabase class is RefCounted so presumably the caller could hold the object alive as long as it wanted.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>284877</commentid>
    <comment_count>3</comment_count>
      <attachid>68314</attachid>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-09-24 17:53:10 -0700</bug_when>
    <thetext>Comment on attachment 68314
Patch

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

&gt;&gt; WebCore/platform/audio/HRTFDatabase.cpp:43
&gt;&gt; +const unsigned HRTFDatabase::RawElevationAngleSpacing = 15.0;
&gt; 
&gt; nit: int value shouldn&apos;t have .0

FIXED

&gt;&gt; WebCore/platform/audio/HRTFDatabase.cpp:69
&gt;&gt; +    for (int elevation = -45; elevation &lt;= 90; elevation += 15) {
&gt; 
&gt; use MinElevation/MaxElevation/RawElevationAngleSpacing here instead of using magic numbers

FIXED

&gt;&gt; WebCore/platform/audio/HRTFDatabase.cpp:80
&gt;&gt; +    if (InterpolationFactor &gt; 1) {
&gt; 
&gt; This branch seems dead (InterpolationFactor is const and set to 1).  Is InterpolationFactor intended to be configurable in the future?
&gt; 
&gt; Remove the code for now if it really is unreachable.

I believe there&apos;s a good chance I will use this path in the future.  If you feel strongly about removing this path for now, then I should replace it with:
ASSERT(InterpolationFactor == 1);

&gt;&gt; WebCore/platform/audio/HRTFDatabase.h:52
&gt;&gt; +    static void cleanup();
&gt; 
&gt; This needs some documentation or a better name.  What does it clean up?

Added comment:

    // De-references all HRTFDatabase objects held in the subject map.

&gt;&gt; WebCore/platform/audio/HRTFDatabase.h:65
&gt;&gt; +    static unsigned indexFromElevationAngle(double);
&gt; 
&gt; I think it make more sense to let callers to getKernelsFromAzimuthElevation pass in elevation as a double and have getKernels..() map from elevation to index internally.

I&apos;ve fixed this.  The reason I had it the other way was because I wanted the method getKernelsFromAzimuthElevation() to be symmetric in its handling of azimuth and elevation, and I anticipated that I might interpolate between elevation indices in HRTFPanner.  But I&apos;m not sure that this will be very likely.  In the meantime, I agree that you&apos;re way is cleaner to changed.

&gt;&gt; WebCore/platform/audio/HRTFDatabase.h:79
&gt;&gt; +    static const unsigned NumberOfTotalElevations;
&gt; 
&gt; What&apos;s a &quot;raw&quot; elevation and how is it different from a normal elevation?
&gt; 
&gt; Do all of these have to be exposed publicly?  It seems that InterpolationFactor and NumberOfTotalElevations at least are implementation details of this class alone.

I tried to document raw and normal in the comments I have there.
I&apos;ve moved all of these constants into the private section.

&gt;&gt; WebCore/platform/audio/HRTFDatabase.h:97
&gt;&gt; +    }
&gt; 
&gt; This seems a little fragile.  Is there any reason we want to keep the HRTFDatabase objects alive for the lifetime of the process instead of having it owned by something?  The HRTFDatabase class is RefCounted so presumably the caller could hold the object alive as long as it wanted.

It may be overkill to actually land this code right now with the &quot;subject map&quot; since it will only every use a single HRTFDatabase &quot;Composite&quot;.  I can remove it and have a create() method instead of createForSubject().
But, otherwise you bring up the point about the lifetime of the HRTFDatabase.  Because it takes awhile to compute, I currently have it lazily initialized when its first needed.  Then it hangs around until the process goes away so it doesn&apos;t need to be recomputed everytime a new page needs to use the audio features.  This speeds up subsequent loading of audio pages at the expense of some extra memory cost.  We should talk about the relative merits of increased speed vs. extra memory.  I should measure both the time cost and the memory cost...</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>285758</commentid>
    <comment_count>4</comment_count>
      <attachid>68959</attachid>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-09-27 14:44:59 -0700</bug_when>
    <thetext>Created attachment 68959
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>285764</commentid>
    <comment_count>5</comment_count>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-09-27 14:51:33 -0700</bug_when>
    <thetext>I&apos;ve done some performance tests to get a sense for how long it takes to re-create the HRTFDatabase each time a page is loaded.  It doesn&apos;t appear that bad, so HRTFDatabaseLoader no longer keeps the database in memory until the process dies.

Also, I&apos;ve removed the &quot;subjectMap&quot; stuff from the code since it was just making things more complicated than necessary and isn&apos;t used in normal builds.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>285904</commentid>
    <comment_count>6</comment_count>
      <attachid>68959</attachid>
    <who name="James Robinson">jamesr</who>
    <bug_when>2010-09-27 16:53:54 -0700</bug_when>
    <thetext>Comment on attachment 68959
Patch

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

Looks good.  Two nits, feel free to fix while landing or upload a new patch.

&gt; WebCore/platform/audio/HRTFDatabase.cpp:78
&gt; +                double x = double(jj) / double(InterpolationFactor);

nit: static_cast&lt;double&gt;()

&gt; WebCore/platform/audio/HRTFDatabase.h:62
&gt; +    HRTFDatabase(double sampleRate);

nit: this needs explicit</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>285952</commentid>
    <comment_count>7</comment_count>
      <attachid>68999</attachid>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-09-27 17:34:02 -0700</bug_when>
    <thetext>Created attachment 68999
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>285953</commentid>
    <comment_count>8</comment_count>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-09-27 17:35:40 -0700</bug_when>
    <thetext>Thanks James.  This is a patch for the last nits - was R+ already.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>286029</commentid>
    <comment_count>9</comment_count>
      <attachid>68999</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2010-09-27 20:27:41 -0700</bug_when>
    <thetext>Comment on attachment 68999
Patch

Clearing flags on attachment: 68999

Committed r68481: &lt;http://trac.webkit.org/changeset/68481&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>286030</commentid>
    <comment_count>10</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2010-09-27 20:27:47 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>68314</attachid>
            <date>2010-09-21 17:18:59 -0700</date>
            <delta_ts>2010-09-27 14:44:56 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-46233-20100921171858.patch</filename>
            <type>text/plain</type>
            <size>11718</size>
            <attacher name="Chris Rogers">crogers</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2Nzk5NSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMjMgQEAKKzIwMTAtMDktMjEgIENocmlzIFJvZ2VycyAgPGNyb2dlcnNAZ29vZ2xl
LmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBB
ZGQgSFJURkRhdGFiYXNlIGZpbGVzCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3No
b3dfYnVnLmNnaT9pZD00NjIzMworCisgICAgICAgIE5vIG5ldyB0ZXN0cyBzaW5jZSBhdWRpbyBB
UEkgaXMgbm90IHlldCBpbXBsZW1lbnRlZC4KKworICAgICAgICAqIHBsYXRmb3JtL2F1ZGlvL0hS
VEZEYXRhYmFzZS5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6SFJURkRhdGFiYXNlOjpj
cmVhdGVGb3JTdWJqZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OkhSVEZEYXRhYmFzZTo6SFJURkRh
dGFiYXNlKToKKyAgICAgICAgKFdlYkNvcmU6OkhSVEZEYXRhYmFzZTo6Y2xlYW51cCk6CisgICAg
ICAgIChXZWJDb3JlOjpIUlRGRGF0YWJhc2U6OmdldEtlcm5lbHNGcm9tQXppbXV0aEVsZXZhdGlv
bik6CisgICAgICAgIChXZWJDb3JlOjpIUlRGRGF0YWJhc2U6OmluZGV4RnJvbUVsZXZhdGlvbkFu
Z2xlKToKKyAgICAgICAgKiBwbGF0Zm9ybS9hdWRpby9IUlRGRGF0YWJhc2UuaDogQWRkZWQuCisg
ICAgICAgIChXZWJDb3JlOjpIUlRGRGF0YWJhc2U6Om51bWJlck9mQXppbXV0aHMpOgorICAgICAg
ICAoV2ViQ29yZTo6SFJURkRhdGFiYXNlOjpzYW1wbGVSYXRlKToKKyAgICAgICAgKFdlYkNvcmU6
OkhSVEZEYXRhYmFzZTo6c3ViamVjdE1hcCk6CisKIDIwMTAtMDktMjEgIERhbiBCZXJuc3RlaW4g
IDxtaXR6QGFwcGxlLmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBieSBEYXJpbiBBZGxlci4KSW5k
ZXg6IFdlYkNvcmUvcGxhdGZvcm0vYXVkaW8vSFJURkRhdGFiYXNlLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBXZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL0hSVEZEYXRhYmFzZS5jcHAJKHJldmlzaW9uIDApCisr
KyBXZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL0hSVEZEYXRhYmFzZS5jcHAJKHJldmlzaW9uIDApCkBA
IC0wLDAgKzEsMTQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFs
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
VURJTykKKworI2luY2x1ZGUgIkhSVEZEYXRhYmFzZS5oIgorCisjaW5jbHVkZSAiSFJURkVsZXZh
dGlvbi5oIgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCituYW1lc3BhY2UgV2ViQ29yZSB7CisK
K2NvbnN0IGludCBIUlRGRGF0YWJhc2U6Ok1pbkVsZXZhdGlvbiA9IC00NS4wOworY29uc3QgaW50
IEhSVEZEYXRhYmFzZTo6TWF4RWxldmF0aW9uID0gOTAuMDsKK2NvbnN0IHVuc2lnbmVkIEhSVEZE
YXRhYmFzZTo6UmF3RWxldmF0aW9uQW5nbGVTcGFjaW5nID0gMTUuMDsKK2NvbnN0IHVuc2lnbmVk
IEhSVEZEYXRhYmFzZTo6TnVtYmVyT2ZSYXdFbGV2YXRpb25zID0gMTA7IC8vIC00NSAtPiArOTAg
KGVhY2ggMTUgZGVncmVlcykKK2NvbnN0IHVuc2lnbmVkIEhSVEZEYXRhYmFzZTo6SW50ZXJwb2xh
dGlvbkZhY3RvciA9IDE7Citjb25zdCB1bnNpZ25lZCBIUlRGRGF0YWJhc2U6Ok51bWJlck9mVG90
YWxFbGV2YXRpb25zID0gTnVtYmVyT2ZSYXdFbGV2YXRpb25zICogSW50ZXJwb2xhdGlvbkZhY3Rv
cjsKKworSFJURkRhdGFiYXNlOjpIUlRGU3ViamVjdE1hcCogSFJURkRhdGFiYXNlOjpzX3N1Ympl
Y3RNYXBQID0gMDsKKworUGFzc1JlZlB0cjxIUlRGRGF0YWJhc2U+IEhSVEZEYXRhYmFzZTo6Y3Jl
YXRlRm9yU3ViamVjdChjb25zdCBTdHJpbmcmIHN1YmplY3ROYW1lLCBkb3VibGUgc2FtcGxlUmF0
ZSkKK3sKKyAgICBpZiAoc3ViamVjdE1hcCgpLmNvbnRhaW5zKHN1YmplY3ROYW1lKSkgeworICAg
ICAgICBSZWZQdHI8SFJURkRhdGFiYXNlPiBocnRmRGF0YWJhc2UgPSBzdWJqZWN0TWFwKCkuZ2V0
KHN1YmplY3ROYW1lKTsKKyAgICAgICAgcmV0dXJuIGhydGZEYXRhYmFzZTsKKyAgICB9CisKKyAg
ICAvLyBDcmVhdGUgYSBuZXcgZW50cnkgaW4gdGhlIG1hcCBmb3IgdGhpcyBzdWJqZWN0LgorICAg
IFJlZlB0cjxIUlRGRGF0YWJhc2U+IGhydGZEYXRhYmFzZSA9IGFkb3B0UmVmKG5ldyBIUlRGRGF0
YWJhc2Uoc3ViamVjdE5hbWUsIHNhbXBsZVJhdGUpKTsKKyAgICBzdWJqZWN0TWFwKCkuc2V0KHN1
YmplY3ROYW1lLCBocnRmRGF0YWJhc2UpOworCisgICAgcmV0dXJuIGhydGZEYXRhYmFzZTsKK30K
KworSFJURkRhdGFiYXNlOjpIUlRGRGF0YWJhc2UoY29uc3QgU3RyaW5nJiBzdWJqZWN0TmFtZSwg
ZG91YmxlIHNhbXBsZVJhdGUpCisgICAgOiBtX2VsZXZhdGlvbnMoTnVtYmVyT2ZUb3RhbEVsZXZh
dGlvbnMpCisgICAgLCBtX3NhbXBsZVJhdGUoc2FtcGxlUmF0ZSkKK3sKKyAgICB1bnNpZ25lZCBl
bGV2YXRpb25JbmRleCA9IDA7CisgICAgZm9yIChpbnQgZWxldmF0aW9uID0gLTQ1OyBlbGV2YXRp
b24gPD0gOTA7IGVsZXZhdGlvbiArPSAxNSkgeworICAgICAgICBPd25QdHI8SFJURkVsZXZhdGlv
bj4gaHJ0ZkVsZXZhdGlvbiA9IEhSVEZFbGV2YXRpb246OmNyZWF0ZUZvclN1YmplY3Qoc3ViamVj
dE5hbWUsIGVsZXZhdGlvbiwgc2FtcGxlUmF0ZSk7CisgICAgICAgIEFTU0VSVChocnRmRWxldmF0
aW9uLmdldCgpKTsKKyAgICAgICAgaWYgKCFocnRmRWxldmF0aW9uLmdldCgpKQorICAgICAgICAg
ICAgcmV0dXJuOworICAgICAgICAKKyAgICAgICAgbV9lbGV2YXRpb25zW2VsZXZhdGlvbkluZGV4
XSA9IGhydGZFbGV2YXRpb24ucmVsZWFzZSgpOworICAgICAgICBlbGV2YXRpb25JbmRleCArPSBJ
bnRlcnBvbGF0aW9uRmFjdG9yOworICAgIH0KKworICAgIC8vIE5vdywgZ28gYmFjayBhbmQgaW50
ZXJwb2xhdGUgZWxldmF0aW9ucy4KKyAgICBpZiAoSW50ZXJwb2xhdGlvbkZhY3RvciA+IDEpIHsK
KyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IE51bWJlck9mVG90YWxFbGV2YXRpb25z
OyBpICs9IEludGVycG9sYXRpb25GYWN0b3IpIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGogPSAo
aSArIEludGVycG9sYXRpb25GYWN0b3IpOworICAgICAgICAgICAgaWYgKGogPj0gTnVtYmVyT2ZU
b3RhbEVsZXZhdGlvbnMpCisgICAgICAgICAgICAgICAgaiA9IGk7IC8vIGZvciBsYXN0IGVsZXZh
dGlvbiBpbnRlcnBvbGF0ZSB3aXRoIGl0c2VsZgorCisgICAgICAgICAgICAvLyBDcmVhdGUgdGhl
IGludGVycG9sYXRlZCBjb252b2x1dGlvbiBrZXJuZWxzIGFuZCBkZWxheXMuCisgICAgICAgICAg
ICBmb3IgKHVuc2lnbmVkIGpqID0gMTsgamogPCBJbnRlcnBvbGF0aW9uRmFjdG9yOyArK2pqKSB7
CisgICAgICAgICAgICAgICAgZG91YmxlIHggPSBkb3VibGUoamopIC8gZG91YmxlKEludGVycG9s
YXRpb25GYWN0b3IpOworICAgICAgICAgICAgICAgIG1fZWxldmF0aW9uc1tpICsgampdID0gSFJU
RkVsZXZhdGlvbjo6Y3JlYXRlQnlJbnRlcnBvbGF0aW5nU2xpY2VzKG1fZWxldmF0aW9uc1tpXS5n
ZXQoKSwgbV9lbGV2YXRpb25zW2pdLmdldCgpLCB4LCBzYW1wbGVSYXRlKTsKKyAgICAgICAgICAg
ICAgICBBU1NFUlQobV9lbGV2YXRpb25zW2kgKyBqal0uZ2V0KCkpOworICAgICAgICAgICAgfQor
ICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEhSVEZEYXRhYmFzZTo6Y2xlYW51cCgpCit7Cisg
ICAgaWYgKHNfc3ViamVjdE1hcFApCisgICAgICAgIGRlbGV0ZSBzX3N1YmplY3RNYXBQOworICAg
IHNfc3ViamVjdE1hcFAgPSAwOworfQorCit2b2lkIEhSVEZEYXRhYmFzZTo6Z2V0S2VybmVsc0Zy
b21BemltdXRoRWxldmF0aW9uKGRvdWJsZSBhemltdXRoQmxlbmQsIHVuc2lnbmVkIGF6aW11dGhJ
bmRleCwgdW5zaWduZWQgZWxldmF0aW9uSW5kZXgsIEhSVEZLZXJuZWwqICZrZXJuZWxMLCBIUlRG
S2VybmVsKiAma2VybmVsUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgZG91YmxlJiBmcmFtZURlbGF5TCwgZG91YmxlJiBmcmFtZURlbGF5UikKK3sK
KyAgICAvLyBCb3VuZHMgY2hlY2tpbmcKKyAgICBBU1NFUlQoZWxldmF0aW9uSW5kZXggPCBtX2Vs
ZXZhdGlvbnMuc2l6ZSgpICYmIG1fZWxldmF0aW9ucy5zaXplKCkgPiAwKTsKKyAgICAKKyAgICBp
ZiAoIW1fZWxldmF0aW9ucy5zaXplKCkpIHsKKyAgICAgICAga2VybmVsTCA9IDA7CisgICAgICAg
IGtlcm5lbFIgPSAwOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIAorICAgIGlmIChlbGV2
YXRpb25JbmRleCA+IG1fZWxldmF0aW9ucy5zaXplKCkgLSAxKQorICAgICAgICBlbGV2YXRpb25J
bmRleCA9IG1fZWxldmF0aW9ucy5zaXplKCkgLSAxOyAgICAKKyAgICAKKyAgICBIUlRGRWxldmF0
aW9uKiBocnRmRWxldmF0aW9uID0gbV9lbGV2YXRpb25zW2VsZXZhdGlvbkluZGV4XS5nZXQoKTsK
KyAgICBBU1NFUlQoaHJ0ZkVsZXZhdGlvbik7CisgICAgaWYgKCFocnRmRWxldmF0aW9uKSB7Cisg
ICAgICAgIGtlcm5lbEwgPSAwOworICAgICAgICBrZXJuZWxSID0gMDsKKyAgICAgICAgcmV0dXJu
OworICAgIH0KKyAgICAKKyAgICBocnRmRWxldmF0aW9uLT5nZXRLZXJuZWxzRnJvbUF6aW11dGgo
YXppbXV0aEJsZW5kLCBhemltdXRoSW5kZXgsIGtlcm5lbEwsIGtlcm5lbFIsIGZyYW1lRGVsYXlM
LCBmcmFtZURlbGF5Uik7Cit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAKKwordW5zaWduZWQgSFJURkRhdGFiYXNlOjppbmRleEZyb21FbGV2YXRp
b25BbmdsZShkb3VibGUgZWxldmF0aW9uQW5nbGUpCit7CisgICAgLy8gQ2xhbXAgdG8gYWxsb3dl
ZCByYW5nZS4KKyAgICBlbGV2YXRpb25BbmdsZSA9IG1heChzdGF0aWNfY2FzdDxkb3VibGU+KE1p
bkVsZXZhdGlvbiksIGVsZXZhdGlvbkFuZ2xlKTsKKyAgICBlbGV2YXRpb25BbmdsZSA9IG1pbihz
dGF0aWNfY2FzdDxkb3VibGU+KE1heEVsZXZhdGlvbiksIGVsZXZhdGlvbkFuZ2xlKTsKKworICAg
IHVuc2lnbmVkIGVsZXZhdGlvbkluZGV4ID0gc3RhdGljX2Nhc3Q8aW50PihJbnRlcnBvbGF0aW9u
RmFjdG9yICogKGVsZXZhdGlvbkFuZ2xlIC0gTWluRWxldmF0aW9uKSAvIFJhd0VsZXZhdGlvbkFu
Z2xlU3BhY2luZyk7ICAgIAorICAgIHJldHVybiBlbGV2YXRpb25JbmRleDsKK30KKworfSAvLyBu
YW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gRU5BQkxFKFdFQl9BVURJTykKSW5kZXg6IFdl
YkNvcmUvcGxhdGZvcm0vYXVkaW8vSFJURkRhdGFiYXNlLmgKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29y
ZS9wbGF0Zm9ybS9hdWRpby9IUlRGRGF0YWJhc2UuaAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUv
cGxhdGZvcm0vYXVkaW8vSFJURkRhdGFiYXNlLmgJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMTAy
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgor
ICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiAgTmVpdGhlciB0aGUgbmFtZSBvZiBBcHBs
ZSBDb21wdXRlciwgSW5jLiAoIkFwcGxlIikgbm9yIHRoZSBuYW1lcyBvZgorICogICAgIGl0cyBj
b250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRl
cml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3
cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElN
UExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwg
T1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQK
KyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisg
Ki8KKworI2lmbmRlZiBIUlRGRGF0YWJhc2VfaAorI2RlZmluZSBIUlRGRGF0YWJhc2VfaAorCisj
aW5jbHVkZSAiSFJURkVsZXZhdGlvbi5oIgorI2luY2x1ZGUgPHd0Zi9IYXNoTWFwLmg+CisjaW5j
bHVkZSA8d3RmL093blB0ci5oPgorI2luY2x1ZGUgPHd0Zi9QYXNzUmVmUHRyLmg+CisjaW5jbHVk
ZSA8d3RmL1JlZkNvdW50ZWQuaD4KKyNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+CisjaW5jbHVkZSA8
d3RmL3RleHQvQ1N0cmluZy5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L1N0cmluZ0hhc2guaD4KKyNp
bmNsdWRlIDx3dGYvdGV4dC9XVEZTdHJpbmcuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitj
bGFzcyBIUlRGS2VybmVsOworCitjbGFzcyBIUlRGRGF0YWJhc2UgOiBwdWJsaWMgUmVmQ291bnRl
ZDxIUlRGRGF0YWJhc2U+IHsKK3B1YmxpYzoKKyAgICAvLyBzdWJqZWN0TmFtZSBzaG91bGQgbm9y
bWFsbHkgYmUgIkNvbXBvc2l0ZSIgd2hpY2ggcmVwcmVzZW50cyBhIGdvb2QgYXZlcmFnZWQgZGF0
YSBzZXQgZnJvbSBzZXZlcmFsIGRpZmZlcmVudCBodW1hbiBzdWJqZWN0cy4KKyAgICAvLyBJbiB0
aGUgZnV0dXJlLCBvdGhlciBBU0NJSSBuYW1lcyB2YWx1ZXMgbWF5IGJlIGFsbG93ZWQgaGVyZS4K
KyAgICBzdGF0aWMgUGFzc1JlZlB0cjxIUlRGRGF0YWJhc2U+IGNyZWF0ZUZvclN1YmplY3QoY29u
c3QgU3RyaW5nJiBzdWJqZWN0TmFtZSwgZG91YmxlIHNhbXBsZVJhdGUpOworCisgICAgc3RhdGlj
IHZvaWQgY2xlYW51cCgpOworICAgIAorICAgIC8vIGdldEtlcm5lbHNGcm9tQXppbXV0aEVsZXZh
dGlvbigpIHJldHVybnMgYSBsZWZ0IGFuZCByaWdodCBlYXIga2VybmVsLCBhbmQgYW4gaW50ZXJw
b2xhdGVkIGxlZnQgYW5kIHJpZ2h0IGZyYW1lIGRlbGF5IGZvciB0aGUgZ2l2ZW4gYXppbXV0aCBh
bmQgZWxldmF0aW9uLgorICAgIC8vIGF6aW11dGhCbGVuZCBtdXN0IGJlIGluIHRoZSByYW5nZSAw
IC0+IDEuCisgICAgLy8gVmFsaWQgdmFsdWVzIGZvciBhemltdXRoSW5kZXggYXJlIDAgLT4gSFJU
RkVsZXZhdGlvbjo6TnVtYmVyT2ZUb3RhbEF6aW11dGhzIC0gMSAoY29ycmVzcG9uZGluZyB0byBh
bmdsZXMgb2YgMCAtPiAzNjApCisgICAgLy8gVmFsaWQgdmFsdWVzIGZvciBlbGV2YXRpb25JbmRl
eCBhcmUgMCAtPiBOdW1iZXJPZlRvdGFsRWxldmF0aW9ucyAtIDEgKGNvcnJlc3BvbmRpbmcgdG8g
YW5nbGVzIG9mIE1pbkVsZXZhdGlvbiAtPiBNYXhFbGV2YXRpb24pCisgICAgdm9pZCBnZXRLZXJu
ZWxzRnJvbUF6aW11dGhFbGV2YXRpb24oZG91YmxlIGF6aW11dGhCbGVuZCwgdW5zaWduZWQgYXpp
bXV0aEluZGV4LCB1bnNpZ25lZCBlbGV2YXRpb25JbmRleCwgSFJURktlcm5lbCogJmtlcm5lbEws
IEhSVEZLZXJuZWwqICZrZXJuZWxSLCBkb3VibGUmIGZyYW1lRGVsYXlMLCBkb3VibGUmIGZyYW1l
RGVsYXlSKTsKKworICAgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBkaWZmZXJlbnQgYXppbXV0
aCBhbmdsZXMuCisgICAgc3RhdGljIHVuc2lnbmVkIG51bWJlck9mQXppbXV0aHMoKSB7IHJldHVy
biBIUlRGRWxldmF0aW9uOjpOdW1iZXJPZlRvdGFsQXppbXV0aHM7IH0KKworICAgIGRvdWJsZSBz
YW1wbGVSYXRlKCkgY29uc3QgeyByZXR1cm4gbV9zYW1wbGVSYXRlOyB9CisKKyAgICBzdGF0aWMg
dW5zaWduZWQgaW5kZXhGcm9tRWxldmF0aW9uQW5nbGUoZG91YmxlKTsKKyAgICAKKyAgICAvLyBN
aW5pbXVtIGFuZCBtYXhpbXVtIGVsZXZhdGlvbiBhbmdsZXMgKGluY2x1c2l2ZSkgZm9yIGEgSFJU
RkRhdGFiYXNlLgorICAgIHN0YXRpYyBjb25zdCBpbnQgTWluRWxldmF0aW9uOworICAgIHN0YXRp
YyBjb25zdCBpbnQgTWF4RWxldmF0aW9uOworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBSYXdF
bGV2YXRpb25BbmdsZVNwYWNpbmc7CisgICAgCisgICAgLy8gTnVtYmVyIG9mIGVsZXZhdGlvbnMg
bG9hZGVkIGZyb20gcmVzb3VyY2UuCisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIE51bWJlck9m
UmF3RWxldmF0aW9uczsKKworICAgIC8vIEludGVycG9sYXRlcyBieSB0aGlzIGZhY3RvciB0byBn
ZXQgdGhlIHRvdGFsIG51bWJlciBvZiBlbGV2YXRpb25zIGZyb20gZXZlcnkgZWxldmF0aW9uIGxv
YWRlZCBmcm9tIHJlc291cmNlLgorICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBJbnRlcnBvbGF0
aW9uRmFjdG9yOworICAgIAorICAgIC8vIFRvdGFsIG51bWJlciBvZiBlbGV2YXRpb25zIGFmdGVy
IGludGVycG9sYXRpb24uCisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIE51bWJlck9mVG90YWxF
bGV2YXRpb25zOworCitwcml2YXRlOgorICAgIEhSVEZEYXRhYmFzZShjb25zdCBTdHJpbmcmIHN1
YmplY3ROYW1lLCBkb3VibGUgc2FtcGxlUmF0ZSk7CisKKyAgICBWZWN0b3I8T3duUHRyPEhSVEZF
bGV2YXRpb24+ID4gbV9lbGV2YXRpb25zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgCisgICAgZG91YmxlIG1fc2FtcGxlUmF0ZTsKKworICAgIC8vIEtlZXBzIHRy
YWNrIG9mIEhSVEZEYXRhYmFzZXMgZm9yIGRpZmZlcmVudCBodW1hbiBzdWJqZWN0cy4KKyAgICB0
eXBlZGVmIEhhc2hNYXA8U3RyaW5nLCBSZWZQdHI8SFJURkRhdGFiYXNlPiA+IEhSVEZTdWJqZWN0
TWFwOworICAgIHN0YXRpYyBIUlRGU3ViamVjdE1hcCogc19zdWJqZWN0TWFwUDsKKworICAgIHN0
YXRpYyBIUlRGU3ViamVjdE1hcCYgc3ViamVjdE1hcCgpCisgICAgeworICAgICAgICAvLyBMYXpp
bHkgaW5pdGlhbGl6ZSBzdWJqZWN0IG1hcC4KKyAgICAgICAgaWYgKCFzX3N1YmplY3RNYXBQKQor
ICAgICAgICAgICAgc19zdWJqZWN0TWFwUCA9IG5ldyBIUlRGU3ViamVjdE1hcCgpOworICAgICAg
ICByZXR1cm4gKnNfc3ViamVjdE1hcFA7CisgICAgfQorfTsKKworfSAvLyBuYW1lc3BhY2UgV2Vi
Q29yZQorCisjZW5kaWYgLy8gSFJURkRhdGFiYXNlX2gK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>68959</attachid>
            <date>2010-09-27 14:44:59 -0700</date>
            <delta_ts>2010-09-27 17:33:59 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-46233-20100927144458.patch</filename>
            <type>text/plain</type>
            <size>10498</size>
            <attacher name="Chris Rogers">crogers</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2ODQyNCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMjEgQEAKKzIwMTAtMDktMjcgIENocmlzIFJvZ2VycyAgPGNyb2dlcnNAZ29vZ2xl
LmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBB
ZGQgSFJURkRhdGFiYXNlIGZpbGVzCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3No
b3dfYnVnLmNnaT9pZD00NjIzMworCisgICAgICAgIE5vIG5ldyB0ZXN0cyBzaW5jZSBhdWRpbyBB
UEkgaXMgbm90IHlldCBpbXBsZW1lbnRlZC4KKworICAgICAgICAqIHBsYXRmb3JtL2F1ZGlvL0hS
VEZEYXRhYmFzZS5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6SFJURkRhdGFiYXNlOjpj
cmVhdGUpOgorICAgICAgICAoV2ViQ29yZTo6SFJURkRhdGFiYXNlOjpIUlRGRGF0YWJhc2UpOgor
ICAgICAgICAoV2ViQ29yZTo6SFJURkRhdGFiYXNlOjpnZXRLZXJuZWxzRnJvbUF6aW11dGhFbGV2
YXRpb24pOgorICAgICAgICAoV2ViQ29yZTo6SFJURkRhdGFiYXNlOjppbmRleEZyb21FbGV2YXRp
b25BbmdsZSk6CisgICAgICAgICogcGxhdGZvcm0vYXVkaW8vSFJURkRhdGFiYXNlLmg6IEFkZGVk
LgorICAgICAgICAoV2ViQ29yZTo6SFJURkRhdGFiYXNlOjpudW1iZXJPZkF6aW11dGhzKToKKyAg
ICAgICAgKFdlYkNvcmU6OkhSVEZEYXRhYmFzZTo6c2FtcGxlUmF0ZSk6CisKIDIwMTAtMDktMTQg
IFpoZW55YW8gTW8gIDx6bW9AZ29vZ2xlLmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBieSBLZW5u
ZXRoIFJ1c3NlbGwuCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL0hSVEZEYXRhYmFzZS5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9IUlRGRGF0YWJhc2UuY3Bw
CShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9IUlRGRGF0YWJhc2UuY3Bw
CShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDEyNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAx
MCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICog
My4gIE5laXRoZXIgdGhlIG5hbWUgb2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5v
ciB0aGUgbmFtZXMgb2YKKyAqICAgICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVu
ZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3
YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFT
IElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBE
SVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKwor
I2lmIEVOQUJMRShXRUJfQVVESU8pCisKKyNpbmNsdWRlICJIUlRGRGF0YWJhc2UuaCIKKworI2lu
Y2x1ZGUgIkhSVEZFbGV2YXRpb24uaCIKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworbmFtZXNw
YWNlIFdlYkNvcmUgeworCitjb25zdCBpbnQgSFJURkRhdGFiYXNlOjpNaW5FbGV2YXRpb24gPSAt
NDU7Citjb25zdCBpbnQgSFJURkRhdGFiYXNlOjpNYXhFbGV2YXRpb24gPSA5MDsKK2NvbnN0IHVu
c2lnbmVkIEhSVEZEYXRhYmFzZTo6UmF3RWxldmF0aW9uQW5nbGVTcGFjaW5nID0gMTU7Citjb25z
dCB1bnNpZ25lZCBIUlRGRGF0YWJhc2U6Ok51bWJlck9mUmF3RWxldmF0aW9ucyA9IDEwOyAvLyAt
NDUgLT4gKzkwIChlYWNoIDE1IGRlZ3JlZXMpCitjb25zdCB1bnNpZ25lZCBIUlRGRGF0YWJhc2U6
OkludGVycG9sYXRpb25GYWN0b3IgPSAxOworY29uc3QgdW5zaWduZWQgSFJURkRhdGFiYXNlOjpO
dW1iZXJPZlRvdGFsRWxldmF0aW9ucyA9IE51bWJlck9mUmF3RWxldmF0aW9ucyAqIEludGVycG9s
YXRpb25GYWN0b3I7CisKK1Bhc3NPd25QdHI8SFJURkRhdGFiYXNlPiBIUlRGRGF0YWJhc2U6OmNy
ZWF0ZShkb3VibGUgc2FtcGxlUmF0ZSkKK3sKKyAgICBPd25QdHI8SFJURkRhdGFiYXNlPiBocnRm
RGF0YWJhc2UgPSBhZG9wdFB0cihuZXcgSFJURkRhdGFiYXNlKHNhbXBsZVJhdGUpKTsKKyAgICBy
ZXR1cm4gaHJ0ZkRhdGFiYXNlLnJlbGVhc2UoKTsKK30KKworSFJURkRhdGFiYXNlOjpIUlRGRGF0
YWJhc2UoZG91YmxlIHNhbXBsZVJhdGUpCisgICAgOiBtX2VsZXZhdGlvbnMoTnVtYmVyT2ZUb3Rh
bEVsZXZhdGlvbnMpCisgICAgLCBtX3NhbXBsZVJhdGUoc2FtcGxlUmF0ZSkKK3sKKyAgICB1bnNp
Z25lZCBlbGV2YXRpb25JbmRleCA9IDA7CisgICAgZm9yIChpbnQgZWxldmF0aW9uID0gTWluRWxl
dmF0aW9uOyBlbGV2YXRpb24gPD0gTWF4RWxldmF0aW9uOyBlbGV2YXRpb24gKz0gUmF3RWxldmF0
aW9uQW5nbGVTcGFjaW5nKSB7CisgICAgICAgIE93blB0cjxIUlRGRWxldmF0aW9uPiBocnRmRWxl
dmF0aW9uID0gSFJURkVsZXZhdGlvbjo6Y3JlYXRlRm9yU3ViamVjdCgiQ29tcG9zaXRlIiwgZWxl
dmF0aW9uLCBzYW1wbGVSYXRlKTsKKyAgICAgICAgQVNTRVJUKGhydGZFbGV2YXRpb24uZ2V0KCkp
OworICAgICAgICBpZiAoIWhydGZFbGV2YXRpb24uZ2V0KCkpCisgICAgICAgICAgICByZXR1cm47
CisgICAgICAgIAorICAgICAgICBtX2VsZXZhdGlvbnNbZWxldmF0aW9uSW5kZXhdID0gaHJ0ZkVs
ZXZhdGlvbi5yZWxlYXNlKCk7CisgICAgICAgIGVsZXZhdGlvbkluZGV4ICs9IEludGVycG9sYXRp
b25GYWN0b3I7CisgICAgfQorCisgICAgLy8gTm93LCBnbyBiYWNrIGFuZCBpbnRlcnBvbGF0ZSBl
bGV2YXRpb25zLgorICAgIGlmIChJbnRlcnBvbGF0aW9uRmFjdG9yID4gMSkgeworICAgICAgICBm
b3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgTnVtYmVyT2ZUb3RhbEVsZXZhdGlvbnM7IGkgKz0gSW50
ZXJwb2xhdGlvbkZhY3RvcikgeworICAgICAgICAgICAgdW5zaWduZWQgaiA9IChpICsgSW50ZXJw
b2xhdGlvbkZhY3Rvcik7CisgICAgICAgICAgICBpZiAoaiA+PSBOdW1iZXJPZlRvdGFsRWxldmF0
aW9ucykKKyAgICAgICAgICAgICAgICBqID0gaTsgLy8gZm9yIGxhc3QgZWxldmF0aW9uIGludGVy
cG9sYXRlIHdpdGggaXRzZWxmCisKKyAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgaW50ZXJwb2xh
dGVkIGNvbnZvbHV0aW9uIGtlcm5lbHMgYW5kIGRlbGF5cy4KKyAgICAgICAgICAgIGZvciAodW5z
aWduZWQgamogPSAxOyBqaiA8IEludGVycG9sYXRpb25GYWN0b3I7ICsramopIHsKKyAgICAgICAg
ICAgICAgICBkb3VibGUgeCA9IGRvdWJsZShqaikgLyBkb3VibGUoSW50ZXJwb2xhdGlvbkZhY3Rv
cik7CisgICAgICAgICAgICAgICAgbV9lbGV2YXRpb25zW2kgKyBqal0gPSBIUlRGRWxldmF0aW9u
OjpjcmVhdGVCeUludGVycG9sYXRpbmdTbGljZXMobV9lbGV2YXRpb25zW2ldLmdldCgpLCBtX2Vs
ZXZhdGlvbnNbal0uZ2V0KCksIHgsIHNhbXBsZVJhdGUpOworICAgICAgICAgICAgICAgIEFTU0VS
VChtX2VsZXZhdGlvbnNbaSArIGpqXS5nZXQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0K
KyAgICB9Cit9CisKK3ZvaWQgSFJURkRhdGFiYXNlOjpnZXRLZXJuZWxzRnJvbUF6aW11dGhFbGV2
YXRpb24oZG91YmxlIGF6aW11dGhCbGVuZCwgdW5zaWduZWQgYXppbXV0aEluZGV4LCBkb3VibGUg
ZWxldmF0aW9uQW5nbGUsIEhSVEZLZXJuZWwqICZrZXJuZWxMLCBIUlRGS2VybmVsKiAma2VybmVs
UiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91
YmxlJiBmcmFtZURlbGF5TCwgZG91YmxlJiBmcmFtZURlbGF5UikKK3sKKyAgICB1bnNpZ25lZCBl
bGV2YXRpb25JbmRleCA9IGluZGV4RnJvbUVsZXZhdGlvbkFuZ2xlKGVsZXZhdGlvbkFuZ2xlKTsK
KyAgICBBU1NFUlQoZWxldmF0aW9uSW5kZXggPCBtX2VsZXZhdGlvbnMuc2l6ZSgpICYmIG1fZWxl
dmF0aW9ucy5zaXplKCkgPiAwKTsKKyAgICAKKyAgICBpZiAoIW1fZWxldmF0aW9ucy5zaXplKCkp
IHsKKyAgICAgICAga2VybmVsTCA9IDA7CisgICAgICAgIGtlcm5lbFIgPSAwOworICAgICAgICBy
ZXR1cm47CisgICAgfQorICAgIAorICAgIGlmIChlbGV2YXRpb25JbmRleCA+IG1fZWxldmF0aW9u
cy5zaXplKCkgLSAxKQorICAgICAgICBlbGV2YXRpb25JbmRleCA9IG1fZWxldmF0aW9ucy5zaXpl
KCkgLSAxOyAgICAKKyAgICAKKyAgICBIUlRGRWxldmF0aW9uKiBocnRmRWxldmF0aW9uID0gbV9l
bGV2YXRpb25zW2VsZXZhdGlvbkluZGV4XS5nZXQoKTsKKyAgICBBU1NFUlQoaHJ0ZkVsZXZhdGlv
bik7CisgICAgaWYgKCFocnRmRWxldmF0aW9uKSB7CisgICAgICAgIGtlcm5lbEwgPSAwOworICAg
ICAgICBrZXJuZWxSID0gMDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAKKyAgICBocnRm
RWxldmF0aW9uLT5nZXRLZXJuZWxzRnJvbUF6aW11dGgoYXppbXV0aEJsZW5kLCBhemltdXRoSW5k
ZXgsIGtlcm5lbEwsIGtlcm5lbFIsIGZyYW1lRGVsYXlMLCBmcmFtZURlbGF5Uik7Cit9ICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwordW5zaWdu
ZWQgSFJURkRhdGFiYXNlOjppbmRleEZyb21FbGV2YXRpb25BbmdsZShkb3VibGUgZWxldmF0aW9u
QW5nbGUpCit7CisgICAgLy8gQ2xhbXAgdG8gYWxsb3dlZCByYW5nZS4KKyAgICBlbGV2YXRpb25B
bmdsZSA9IG1heChzdGF0aWNfY2FzdDxkb3VibGU+KE1pbkVsZXZhdGlvbiksIGVsZXZhdGlvbkFu
Z2xlKTsKKyAgICBlbGV2YXRpb25BbmdsZSA9IG1pbihzdGF0aWNfY2FzdDxkb3VibGU+KE1heEVs
ZXZhdGlvbiksIGVsZXZhdGlvbkFuZ2xlKTsKKworICAgIHVuc2lnbmVkIGVsZXZhdGlvbkluZGV4
ID0gc3RhdGljX2Nhc3Q8aW50PihJbnRlcnBvbGF0aW9uRmFjdG9yICogKGVsZXZhdGlvbkFuZ2xl
IC0gTWluRWxldmF0aW9uKSAvIFJhd0VsZXZhdGlvbkFuZ2xlU3BhY2luZyk7ICAgIAorICAgIHJl
dHVybiBlbGV2YXRpb25JbmRleDsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5k
aWYgLy8gRU5BQkxFKFdFQl9BVURJTykKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vYXVkaW8vSFJU
RkRhdGFiYXNlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9IUlRGRGF0
YWJhc2UuaAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vYXVkaW8vSFJURkRhdGFi
YXNlLmgJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4K
KyAqIDMuICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFwcGxlIENvbXB1dGVyLCBJbmMuICgiQXBwbGUi
KSBub3IgdGhlIG5hbWVzIG9mCisgKiAgICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0
byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBz
b2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisg
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JT
ICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQor
ICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAq
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIEhSVEZEYXRhYmFz
ZV9oCisjZGVmaW5lIEhSVEZEYXRhYmFzZV9oCisKKyNpbmNsdWRlICJIUlRGRWxldmF0aW9uLmgi
CisjaW5jbHVkZSA8d3RmL0hhc2hNYXAuaD4KKyNpbmNsdWRlIDx3dGYvTm9uY29weWFibGUuaD4K
KyNpbmNsdWRlIDx3dGYvT3duUHRyLmg+CisjaW5jbHVkZSA8d3RmL1Bhc3NSZWZQdHIuaD4KKyNp
bmNsdWRlIDx3dGYvVmVjdG9yLmg+CisjaW5jbHVkZSA8d3RmL3RleHQvQ1N0cmluZy5oPgorI2lu
Y2x1ZGUgPHd0Zi90ZXh0L1N0cmluZ0hhc2guaD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9XVEZTdHJp
bmcuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBIUlRGS2VybmVsOworCitjbGFz
cyBIUlRGRGF0YWJhc2UgOiBwdWJsaWMgTm9uY29weWFibGUgeworcHVibGljOgorICAgIHN0YXRp
YyBQYXNzT3duUHRyPEhSVEZEYXRhYmFzZT4gY3JlYXRlKGRvdWJsZSBzYW1wbGVSYXRlKTsKKwor
ICAgIC8vIGdldEtlcm5lbHNGcm9tQXppbXV0aEVsZXZhdGlvbigpIHJldHVybnMgYSBsZWZ0IGFu
ZCByaWdodCBlYXIga2VybmVsLCBhbmQgYW4gaW50ZXJwb2xhdGVkIGxlZnQgYW5kIHJpZ2h0IGZy
YW1lIGRlbGF5IGZvciB0aGUgZ2l2ZW4gYXppbXV0aCBhbmQgZWxldmF0aW9uLgorICAgIC8vIGF6
aW11dGhCbGVuZCBtdXN0IGJlIGluIHRoZSByYW5nZSAwIC0+IDEuCisgICAgLy8gVmFsaWQgdmFs
dWVzIGZvciBhemltdXRoSW5kZXggYXJlIDAgLT4gSFJURkVsZXZhdGlvbjo6TnVtYmVyT2ZUb3Rh
bEF6aW11dGhzIC0gMSAoY29ycmVzcG9uZGluZyB0byBhbmdsZXMgb2YgMCAtPiAzNjApLgorICAg
IC8vIFZhbGlkIHZhbHVlcyBmb3IgZWxldmF0aW9uQW5nbGUgYXJlIE1pbkVsZXZhdGlvbiAtPiBN
YXhFbGV2YXRpb24uCisgICAgdm9pZCBnZXRLZXJuZWxzRnJvbUF6aW11dGhFbGV2YXRpb24oZG91
YmxlIGF6aW11dGhCbGVuZCwgdW5zaWduZWQgYXppbXV0aEluZGV4LCBkb3VibGUgZWxldmF0aW9u
QW5nbGUsIEhSVEZLZXJuZWwqICZrZXJuZWxMLCBIUlRGS2VybmVsKiAma2VybmVsUiwgZG91Ymxl
JiBmcmFtZURlbGF5TCwgZG91YmxlJiBmcmFtZURlbGF5Uik7CisKKyAgICAvLyBSZXR1cm5zIHRo
ZSBudW1iZXIgb2YgZGlmZmVyZW50IGF6aW11dGggYW5nbGVzLgorICAgIHN0YXRpYyB1bnNpZ25l
ZCBudW1iZXJPZkF6aW11dGhzKCkgeyByZXR1cm4gSFJURkVsZXZhdGlvbjo6TnVtYmVyT2ZUb3Rh
bEF6aW11dGhzOyB9CisKKyAgICBkb3VibGUgc2FtcGxlUmF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1f
c2FtcGxlUmF0ZTsgfQorICAgIAorcHJpdmF0ZToKKyAgICBIUlRGRGF0YWJhc2UoZG91YmxlIHNh
bXBsZVJhdGUpOworCisgICAgLy8gTWluaW11bSBhbmQgbWF4aW11bSBlbGV2YXRpb24gYW5nbGVz
IChpbmNsdXNpdmUpIGZvciBhIEhSVEZEYXRhYmFzZS4KKyAgICBzdGF0aWMgY29uc3QgaW50IE1p
bkVsZXZhdGlvbjsKKyAgICBzdGF0aWMgY29uc3QgaW50IE1heEVsZXZhdGlvbjsKKyAgICBzdGF0
aWMgY29uc3QgdW5zaWduZWQgUmF3RWxldmF0aW9uQW5nbGVTcGFjaW5nOworICAgIAorICAgIC8v
IE51bWJlciBvZiBlbGV2YXRpb25zIGxvYWRlZCBmcm9tIHJlc291cmNlLgorICAgIHN0YXRpYyBj
b25zdCB1bnNpZ25lZCBOdW1iZXJPZlJhd0VsZXZhdGlvbnM7CisKKyAgICAvLyBJbnRlcnBvbGF0
ZXMgYnkgdGhpcyBmYWN0b3IgdG8gZ2V0IHRoZSB0b3RhbCBudW1iZXIgb2YgZWxldmF0aW9ucyBm
cm9tIGV2ZXJ5IGVsZXZhdGlvbiBsb2FkZWQgZnJvbSByZXNvdXJjZS4KKyAgICBzdGF0aWMgY29u
c3QgdW5zaWduZWQgSW50ZXJwb2xhdGlvbkZhY3RvcjsKKyAgICAKKyAgICAvLyBUb3RhbCBudW1i
ZXIgb2YgZWxldmF0aW9ucyBhZnRlciBpbnRlcnBvbGF0aW9uLgorICAgIHN0YXRpYyBjb25zdCB1
bnNpZ25lZCBOdW1iZXJPZlRvdGFsRWxldmF0aW9uczsKKworICAgIC8vIFJldHVybnMgdGhlIGlu
ZGV4IGZvciB0aGUgY29ycmVjdCBIUlRGRWxldmF0aW9uIGdpdmVuIHRoZSBlbGV2YXRpb24gYW5n
bGUuCisgICAgc3RhdGljIHVuc2lnbmVkIGluZGV4RnJvbUVsZXZhdGlvbkFuZ2xlKGRvdWJsZSk7
CisKKyAgICBWZWN0b3I8T3duUHRyPEhSVEZFbGV2YXRpb24+ID4gbV9lbGV2YXRpb25zOyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgZG91YmxlIG1fc2Ft
cGxlUmF0ZTsKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIEhSVEZE
YXRhYmFzZV9oCg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>68999</attachid>
            <date>2010-09-27 17:34:02 -0700</date>
            <delta_ts>2010-09-27 20:27:41 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-46233-20100927173401.patch</filename>
            <type>text/plain</type>
            <size>10536</size>
            <attacher name="Chris Rogers">crogers</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2ODQ1OCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMjEgQEAKKzIwMTAtMDktMjcgIENocmlzIFJvZ2VycyAgPGNyb2dlcnNAZ29vZ2xl
LmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBB
ZGQgSFJURkRhdGFiYXNlIGZpbGVzCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3No
b3dfYnVnLmNnaT9pZD00NjIzMworCisgICAgICAgIE5vIG5ldyB0ZXN0cyBzaW5jZSBhdWRpbyBB
UEkgaXMgbm90IHlldCBpbXBsZW1lbnRlZC4KKworICAgICAgICAqIHBsYXRmb3JtL2F1ZGlvL0hS
VEZEYXRhYmFzZS5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6SFJURkRhdGFiYXNlOjpj
cmVhdGUpOgorICAgICAgICAoV2ViQ29yZTo6SFJURkRhdGFiYXNlOjpIUlRGRGF0YWJhc2UpOgor
ICAgICAgICAoV2ViQ29yZTo6SFJURkRhdGFiYXNlOjpnZXRLZXJuZWxzRnJvbUF6aW11dGhFbGV2
YXRpb24pOgorICAgICAgICAoV2ViQ29yZTo6SFJURkRhdGFiYXNlOjppbmRleEZyb21FbGV2YXRp
b25BbmdsZSk6CisgICAgICAgICogcGxhdGZvcm0vYXVkaW8vSFJURkRhdGFiYXNlLmg6IEFkZGVk
LgorICAgICAgICAoV2ViQ29yZTo6SFJURkRhdGFiYXNlOjpudW1iZXJPZkF6aW11dGhzKToKKyAg
ICAgICAgKFdlYkNvcmU6OkhSVEZEYXRhYmFzZTo6c2FtcGxlUmF0ZSk6CisKIDIwMTAtMDktMjcg
IFZpY3RvcmlhIEtpcnN0ICA8dnJrQGdvb2dsZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkg
SmFtZXMgUm9iaW5zb24uCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL0hSVEZEYXRhYmFz
ZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9IUlRGRGF0YWJhc2Uu
Y3BwCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9IUlRGRGF0YWJhc2Uu
Y3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDEyNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
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
KworI2lmIEVOQUJMRShXRUJfQVVESU8pCisKKyNpbmNsdWRlICJIUlRGRGF0YWJhc2UuaCIKKwor
I2luY2x1ZGUgIkhSVEZFbGV2YXRpb24uaCIKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworbmFt
ZXNwYWNlIFdlYkNvcmUgeworCitjb25zdCBpbnQgSFJURkRhdGFiYXNlOjpNaW5FbGV2YXRpb24g
PSAtNDU7Citjb25zdCBpbnQgSFJURkRhdGFiYXNlOjpNYXhFbGV2YXRpb24gPSA5MDsKK2NvbnN0
IHVuc2lnbmVkIEhSVEZEYXRhYmFzZTo6UmF3RWxldmF0aW9uQW5nbGVTcGFjaW5nID0gMTU7Citj
b25zdCB1bnNpZ25lZCBIUlRGRGF0YWJhc2U6Ok51bWJlck9mUmF3RWxldmF0aW9ucyA9IDEwOyAv
LyAtNDUgLT4gKzkwIChlYWNoIDE1IGRlZ3JlZXMpCitjb25zdCB1bnNpZ25lZCBIUlRGRGF0YWJh
c2U6OkludGVycG9sYXRpb25GYWN0b3IgPSAxOworY29uc3QgdW5zaWduZWQgSFJURkRhdGFiYXNl
OjpOdW1iZXJPZlRvdGFsRWxldmF0aW9ucyA9IE51bWJlck9mUmF3RWxldmF0aW9ucyAqIEludGVy
cG9sYXRpb25GYWN0b3I7CisKK1Bhc3NPd25QdHI8SFJURkRhdGFiYXNlPiBIUlRGRGF0YWJhc2U6
OmNyZWF0ZShkb3VibGUgc2FtcGxlUmF0ZSkKK3sKKyAgICBPd25QdHI8SFJURkRhdGFiYXNlPiBo
cnRmRGF0YWJhc2UgPSBhZG9wdFB0cihuZXcgSFJURkRhdGFiYXNlKHNhbXBsZVJhdGUpKTsKKyAg
ICByZXR1cm4gaHJ0ZkRhdGFiYXNlLnJlbGVhc2UoKTsKK30KKworSFJURkRhdGFiYXNlOjpIUlRG
RGF0YWJhc2UoZG91YmxlIHNhbXBsZVJhdGUpCisgICAgOiBtX2VsZXZhdGlvbnMoTnVtYmVyT2ZU
b3RhbEVsZXZhdGlvbnMpCisgICAgLCBtX3NhbXBsZVJhdGUoc2FtcGxlUmF0ZSkKK3sKKyAgICB1
bnNpZ25lZCBlbGV2YXRpb25JbmRleCA9IDA7CisgICAgZm9yIChpbnQgZWxldmF0aW9uID0gTWlu
RWxldmF0aW9uOyBlbGV2YXRpb24gPD0gTWF4RWxldmF0aW9uOyBlbGV2YXRpb24gKz0gUmF3RWxl
dmF0aW9uQW5nbGVTcGFjaW5nKSB7CisgICAgICAgIE93blB0cjxIUlRGRWxldmF0aW9uPiBocnRm
RWxldmF0aW9uID0gSFJURkVsZXZhdGlvbjo6Y3JlYXRlRm9yU3ViamVjdCgiQ29tcG9zaXRlIiwg
ZWxldmF0aW9uLCBzYW1wbGVSYXRlKTsKKyAgICAgICAgQVNTRVJUKGhydGZFbGV2YXRpb24uZ2V0
KCkpOworICAgICAgICBpZiAoIWhydGZFbGV2YXRpb24uZ2V0KCkpCisgICAgICAgICAgICByZXR1
cm47CisgICAgICAgIAorICAgICAgICBtX2VsZXZhdGlvbnNbZWxldmF0aW9uSW5kZXhdID0gaHJ0
ZkVsZXZhdGlvbi5yZWxlYXNlKCk7CisgICAgICAgIGVsZXZhdGlvbkluZGV4ICs9IEludGVycG9s
YXRpb25GYWN0b3I7CisgICAgfQorCisgICAgLy8gTm93LCBnbyBiYWNrIGFuZCBpbnRlcnBvbGF0
ZSBlbGV2YXRpb25zLgorICAgIGlmIChJbnRlcnBvbGF0aW9uRmFjdG9yID4gMSkgeworICAgICAg
ICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgTnVtYmVyT2ZUb3RhbEVsZXZhdGlvbnM7IGkgKz0g
SW50ZXJwb2xhdGlvbkZhY3RvcikgeworICAgICAgICAgICAgdW5zaWduZWQgaiA9IChpICsgSW50
ZXJwb2xhdGlvbkZhY3Rvcik7CisgICAgICAgICAgICBpZiAoaiA+PSBOdW1iZXJPZlRvdGFsRWxl
dmF0aW9ucykKKyAgICAgICAgICAgICAgICBqID0gaTsgLy8gZm9yIGxhc3QgZWxldmF0aW9uIGlu
dGVycG9sYXRlIHdpdGggaXRzZWxmCisKKyAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgaW50ZXJw
b2xhdGVkIGNvbnZvbHV0aW9uIGtlcm5lbHMgYW5kIGRlbGF5cy4KKyAgICAgICAgICAgIGZvciAo
dW5zaWduZWQgamogPSAxOyBqaiA8IEludGVycG9sYXRpb25GYWN0b3I7ICsramopIHsKKyAgICAg
ICAgICAgICAgICBkb3VibGUgeCA9IHN0YXRpY19jYXN0PGRvdWJsZT4oamopIC8gc3RhdGljX2Nh
c3Q8ZG91YmxlPihJbnRlcnBvbGF0aW9uRmFjdG9yKTsKKyAgICAgICAgICAgICAgICBtX2VsZXZh
dGlvbnNbaSArIGpqXSA9IEhSVEZFbGV2YXRpb246OmNyZWF0ZUJ5SW50ZXJwb2xhdGluZ1NsaWNl
cyhtX2VsZXZhdGlvbnNbaV0uZ2V0KCksIG1fZWxldmF0aW9uc1tqXS5nZXQoKSwgeCwgc2FtcGxl
UmF0ZSk7CisgICAgICAgICAgICAgICAgQVNTRVJUKG1fZWxldmF0aW9uc1tpICsgampdLmdldCgp
KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBIUlRGRGF0YWJh
c2U6OmdldEtlcm5lbHNGcm9tQXppbXV0aEVsZXZhdGlvbihkb3VibGUgYXppbXV0aEJsZW5kLCB1
bnNpZ25lZCBhemltdXRoSW5kZXgsIGRvdWJsZSBlbGV2YXRpb25BbmdsZSwgSFJURktlcm5lbCog
Jmtlcm5lbEwsIEhSVEZLZXJuZWwqICZrZXJuZWxSLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUmIGZyYW1lRGVsYXlMLCBkb3VibGUmIGZy
YW1lRGVsYXlSKQoreworICAgIHVuc2lnbmVkIGVsZXZhdGlvbkluZGV4ID0gaW5kZXhGcm9tRWxl
dmF0aW9uQW5nbGUoZWxldmF0aW9uQW5nbGUpOworICAgIEFTU0VSVChlbGV2YXRpb25JbmRleCA8
IG1fZWxldmF0aW9ucy5zaXplKCkgJiYgbV9lbGV2YXRpb25zLnNpemUoKSA+IDApOworICAgIAor
ICAgIGlmICghbV9lbGV2YXRpb25zLnNpemUoKSkgeworICAgICAgICBrZXJuZWxMID0gMDsKKyAg
ICAgICAga2VybmVsUiA9IDA7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgCisgICAgaWYg
KGVsZXZhdGlvbkluZGV4ID4gbV9lbGV2YXRpb25zLnNpemUoKSAtIDEpCisgICAgICAgIGVsZXZh
dGlvbkluZGV4ID0gbV9lbGV2YXRpb25zLnNpemUoKSAtIDE7ICAgIAorICAgIAorICAgIEhSVEZF
bGV2YXRpb24qIGhydGZFbGV2YXRpb24gPSBtX2VsZXZhdGlvbnNbZWxldmF0aW9uSW5kZXhdLmdl
dCgpOworICAgIEFTU0VSVChocnRmRWxldmF0aW9uKTsKKyAgICBpZiAoIWhydGZFbGV2YXRpb24p
IHsKKyAgICAgICAga2VybmVsTCA9IDA7CisgICAgICAgIGtlcm5lbFIgPSAwOworICAgICAgICBy
ZXR1cm47CisgICAgfQorICAgIAorICAgIGhydGZFbGV2YXRpb24tPmdldEtlcm5lbHNGcm9tQXpp
bXV0aChhemltdXRoQmxlbmQsIGF6aW11dGhJbmRleCwga2VybmVsTCwga2VybmVsUiwgZnJhbWVE
ZWxheUwsIGZyYW1lRGVsYXlSKTsKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIAorCit1bnNpZ25lZCBIUlRGRGF0YWJhc2U6OmluZGV4RnJvbUVs
ZXZhdGlvbkFuZ2xlKGRvdWJsZSBlbGV2YXRpb25BbmdsZSkKK3sKKyAgICAvLyBDbGFtcCB0byBh
bGxvd2VkIHJhbmdlLgorICAgIGVsZXZhdGlvbkFuZ2xlID0gbWF4KHN0YXRpY19jYXN0PGRvdWJs
ZT4oTWluRWxldmF0aW9uKSwgZWxldmF0aW9uQW5nbGUpOworICAgIGVsZXZhdGlvbkFuZ2xlID0g
bWluKHN0YXRpY19jYXN0PGRvdWJsZT4oTWF4RWxldmF0aW9uKSwgZWxldmF0aW9uQW5nbGUpOwor
CisgICAgdW5zaWduZWQgZWxldmF0aW9uSW5kZXggPSBzdGF0aWNfY2FzdDxpbnQ+KEludGVycG9s
YXRpb25GYWN0b3IgKiAoZWxldmF0aW9uQW5nbGUgLSBNaW5FbGV2YXRpb24pIC8gUmF3RWxldmF0
aW9uQW5nbGVTcGFjaW5nKTsgICAgCisgICAgcmV0dXJuIGVsZXZhdGlvbkluZGV4OworfQorCit9
IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBFTkFCTEUoV0VCX0FVRElPKQpJbmRl
eDogV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9IUlRGRGF0YWJhc2UuaAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBX
ZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL0hSVEZEYXRhYmFzZS5oCShyZXZpc2lvbiAwKQorKysgV2Vi
Q29yZS9wbGF0Zm9ybS9hdWRpby9IUlRGRGF0YWJhc2UuaAkocmV2aXNpb24gMCkKQEAgLTAsMCAr
MSw4NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0Ogor
ICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJv
dmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gIE5laXRoZXIgdGhlIG5hbWUgb2Yg
QXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMgb2YKKyAqICAgICBp
dHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0
cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJp
b3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNT
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRI
RSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVF
TlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJF
TUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERB
VEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQg
QU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LgorICovCisKKyNpZm5kZWYgSFJURkRhdGFiYXNlX2gKKyNkZWZpbmUgSFJURkRhdGFiYXNlX2gK
KworI2luY2x1ZGUgIkhSVEZFbGV2YXRpb24uaCIKKyNpbmNsdWRlIDx3dGYvSGFzaE1hcC5oPgor
I2luY2x1ZGUgPHd0Zi9Ob25jb3B5YWJsZS5oPgorI2luY2x1ZGUgPHd0Zi9Pd25QdHIuaD4KKyNp
bmNsdWRlIDx3dGYvUGFzc1JlZlB0ci5oPgorI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKyNpbmNs
dWRlIDx3dGYvdGV4dC9DU3RyaW5nLmg+CisjaW5jbHVkZSA8d3RmL3RleHQvU3RyaW5nSGFzaC5o
PgorI2luY2x1ZGUgPHd0Zi90ZXh0L1dURlN0cmluZy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7
CisKK2NsYXNzIEhSVEZLZXJuZWw7CisKK2NsYXNzIEhSVEZEYXRhYmFzZSA6IHB1YmxpYyBOb25j
b3B5YWJsZSB7CitwdWJsaWM6CisgICAgc3RhdGljIFBhc3NPd25QdHI8SFJURkRhdGFiYXNlPiBj
cmVhdGUoZG91YmxlIHNhbXBsZVJhdGUpOworCisgICAgLy8gZ2V0S2VybmVsc0Zyb21BemltdXRo
RWxldmF0aW9uKCkgcmV0dXJucyBhIGxlZnQgYW5kIHJpZ2h0IGVhciBrZXJuZWwsIGFuZCBhbiBp
bnRlcnBvbGF0ZWQgbGVmdCBhbmQgcmlnaHQgZnJhbWUgZGVsYXkgZm9yIHRoZSBnaXZlbiBhemlt
dXRoIGFuZCBlbGV2YXRpb24uCisgICAgLy8gYXppbXV0aEJsZW5kIG11c3QgYmUgaW4gdGhlIHJh
bmdlIDAgLT4gMS4KKyAgICAvLyBWYWxpZCB2YWx1ZXMgZm9yIGF6aW11dGhJbmRleCBhcmUgMCAt
PiBIUlRGRWxldmF0aW9uOjpOdW1iZXJPZlRvdGFsQXppbXV0aHMgLSAxIChjb3JyZXNwb25kaW5n
IHRvIGFuZ2xlcyBvZiAwIC0+IDM2MCkuCisgICAgLy8gVmFsaWQgdmFsdWVzIGZvciBlbGV2YXRp
b25BbmdsZSBhcmUgTWluRWxldmF0aW9uIC0+IE1heEVsZXZhdGlvbi4KKyAgICB2b2lkIGdldEtl
cm5lbHNGcm9tQXppbXV0aEVsZXZhdGlvbihkb3VibGUgYXppbXV0aEJsZW5kLCB1bnNpZ25lZCBh
emltdXRoSW5kZXgsIGRvdWJsZSBlbGV2YXRpb25BbmdsZSwgSFJURktlcm5lbCogJmtlcm5lbEws
IEhSVEZLZXJuZWwqICZrZXJuZWxSLCBkb3VibGUmIGZyYW1lRGVsYXlMLCBkb3VibGUmIGZyYW1l
RGVsYXlSKTsKKworICAgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBkaWZmZXJlbnQgYXppbXV0
aCBhbmdsZXMuCisgICAgc3RhdGljIHVuc2lnbmVkIG51bWJlck9mQXppbXV0aHMoKSB7IHJldHVy
biBIUlRGRWxldmF0aW9uOjpOdW1iZXJPZlRvdGFsQXppbXV0aHM7IH0KKworICAgIGRvdWJsZSBz
YW1wbGVSYXRlKCkgY29uc3QgeyByZXR1cm4gbV9zYW1wbGVSYXRlOyB9CisgICAgCitwcml2YXRl
OgorICAgIGV4cGxpY2l0IEhSVEZEYXRhYmFzZShkb3VibGUgc2FtcGxlUmF0ZSk7CisKKyAgICAv
LyBNaW5pbXVtIGFuZCBtYXhpbXVtIGVsZXZhdGlvbiBhbmdsZXMgKGluY2x1c2l2ZSkgZm9yIGEg
SFJURkRhdGFiYXNlLgorICAgIHN0YXRpYyBjb25zdCBpbnQgTWluRWxldmF0aW9uOworICAgIHN0
YXRpYyBjb25zdCBpbnQgTWF4RWxldmF0aW9uOworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBS
YXdFbGV2YXRpb25BbmdsZVNwYWNpbmc7CisgICAgCisgICAgLy8gTnVtYmVyIG9mIGVsZXZhdGlv
bnMgbG9hZGVkIGZyb20gcmVzb3VyY2UuCisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIE51bWJl
ck9mUmF3RWxldmF0aW9uczsKKworICAgIC8vIEludGVycG9sYXRlcyBieSB0aGlzIGZhY3RvciB0
byBnZXQgdGhlIHRvdGFsIG51bWJlciBvZiBlbGV2YXRpb25zIGZyb20gZXZlcnkgZWxldmF0aW9u
IGxvYWRlZCBmcm9tIHJlc291cmNlLgorICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBJbnRlcnBv
bGF0aW9uRmFjdG9yOworICAgIAorICAgIC8vIFRvdGFsIG51bWJlciBvZiBlbGV2YXRpb25zIGFm
dGVyIGludGVycG9sYXRpb24uCisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIE51bWJlck9mVG90
YWxFbGV2YXRpb25zOworCisgICAgLy8gUmV0dXJucyB0aGUgaW5kZXggZm9yIHRoZSBjb3JyZWN0
IEhSVEZFbGV2YXRpb24gZ2l2ZW4gdGhlIGVsZXZhdGlvbiBhbmdsZS4KKyAgICBzdGF0aWMgdW5z
aWduZWQgaW5kZXhGcm9tRWxldmF0aW9uQW5nbGUoZG91YmxlKTsKKworICAgIFZlY3RvcjxPd25Q
dHI8SFJURkVsZXZhdGlvbj4gPiBtX2VsZXZhdGlvbnM7ICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAKKyAgICBkb3VibGUgbV9zYW1wbGVSYXRlOworfTsKKworfSAv
LyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gSFJURkRhdGFiYXNlX2gK
</data>

          </attachment>
      

    </bug>

</bugzilla>