<?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>52989</bug_id>
          
          <creation_ts>2011-01-23 20:29:39 -0800</creation_ts>
          <short_desc>Web Audio API: port FFTFrame to FFTW</short_desc>
          <delta_ts>2011-11-26 02:05:14 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>New Bugs</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Kenneth Russell">kbr</reporter>
          <assigned_to name="Kenneth Russell">kbr</assigned_to>
          <cc>abarth</cc>
    
    <cc>crogers</cc>
    
    <cc>jamesr</cc>
    
    <cc>levin</cc>
    
    <cc>s.choi</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>338817</commentid>
    <comment_count>0</comment_count>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2011-01-23 20:29:39 -0800</bug_when>
    <thetext>For the Windows and Linux ports of the Web Audio API, a port of the FFTFrame class to the open source FFTW library is needed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>338821</commentid>
    <comment_count>1</comment_count>
      <attachid>79889</attachid>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2011-01-23 21:13:56 -0800</bug_when>
    <thetext>Created attachment 79889
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>338823</commentid>
    <comment_count>2</comment_count>
      <attachid>79889</attachid>
    <who name="James Robinson">jamesr</who>
    <bug_when>2011-01-23 21:26:59 -0800</bug_when>
    <thetext>Comment on attachment 79889
Patch

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

r=me. before landing i think chris rogers should give this a once-over, and please make sure the EWS bots are happy with the gyp changes

&gt; Source/WebCore/platform/audio/FFTFrame.h:123
&gt;  #endif // !OS(DARWIN) &amp;&amp; USE(WEBAUDIO_MKL)

nit: comment on this line should be // USE(WEBAUDIO_MKL)

&gt; Source/WebCore/platform/audio/FFTFrame.h:148
&gt; +#endif // !OS(DARWIN) &amp;&amp; USE(WEBAUDIO_FFTW)

nit: // USE(WEBAUDIO_FFTW)

&gt; Source/WebCore/platform/audio/fftw/FFTFrameFFTW.cpp:2
&gt; + * Copyright (C) 2010 Google Inc. All rights reserved.

nit: here (and in other files) it&apos;s 2011 now :)

&gt; Source/WebCore/platform/audio/fftw/FFTFrameFFTW.cpp:74
&gt; +    float temporaryPointer[1];
&gt; +    m_forwardPlan = fftwPlanForSize(fftSize, Forward,
&gt; +                                    &amp;temporaryPointer[0], realData(), imagData());
&gt; +    m_backwardPlan = fftwPlanForSize(fftSize, Backward,
&gt; +                                     realData(), imagData(), &amp;temporaryPointer[0]);

nit: i&apos;m not sure i fully grok this, but would &apos;float temp; fftwPlanForSize(..., &amp;temp, ...);&apos; do as well? 1-size arrays are odd

&gt; Source/WebCore/platform/audio/fftw/FFTFrameFFTW.cpp:103
&gt; +    unsigned nbytes = sizeof(float) * complexDataSize(m_FFTSize);

nit: number of bytes should be size_t</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>339370</commentid>
    <comment_count>3</comment_count>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2011-01-24 16:44:54 -0800</bug_when>
    <thetext>Hi Ken, overall this looks very good.  Thanks for running the unit tests I gave you to verify correctness as that counts the most!

Otherwise I have a few general comments:

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

&gt; Source/WebCore/platform/audio/FFTFrame.h:139
&gt; +    // overhead. For the time being, we just assume unaligned data.

For now just to get something working we can live with unaligned (no SIMD optimizations).  But, soon we&apos;ll have to think of improving this.  We can either require that the arrays passed in to doFFT() and doInverseFFT() be aligned (and check that they are with ASSERTs etc.) or do a memcpy into an aligned array.  I&apos;m pretty sure that the overhead of the memcpy() is *very* much smaller than not having SIMD optimization.

&gt; Source/WebCore/platform/audio/fftw/FFTFrameFFTW.cpp:45
&gt; +int complexDataSize(int fftSize)

I think it would be better to have a more descriptive and specific name -- maybe &quot;unpackedFFTWDataSize.

Also, fftSize should be &quot;unsigned&quot; to match the FFTFrame constructors

&gt; Source/WebCore/platform/audio/fftw/FFTFrameFFTW.cpp:125
&gt; +    // factor will need to change too.

Maybe fix this comment to be more generic instead of talking about vecLib on the Mac...

&gt; Source/WebCore/platform/audio/fftw/FFTFrameFFTW.cpp:155
&gt; +    int length = m_realData.size();

I think it would be more clear with something like:
int length = fftSize() / 2 + 1;

or maybe even better:

int length = complexDataSize();   // &lt;---- or whatever the new function name turns out to be


then maybe even ASSERT(length == m_realData.size());

&gt; Source/WebCore/platform/audio/fftw/FFTFrameFFTW.cpp:163
&gt; +    m_imagData[0] = m_realData[length - 1];

I think it would be much clearer to explicitly reference the index in terms of the fftSize:

m_imagData[0] = m_realData[fftSize() / 2];

This is where the nyquist component is normally expected to live.  The way you have it now I had to look twice to verify that it&apos;s correct (looking at what size m_realData was allocated at, etc.)

&gt; Source/WebCore/platform/audio/fftw/FFTFrameFFTW.cpp:170
&gt; +    m_realData[length - 1] = m_imagData[0];

Same comment as above.  I think the following would be clearer and more explicit:

m_realData[fftSize() / 2] = m_imagData[0];

You could even define a variable called &quot;halfSize&quot; since this value is re-used later in this function:
int halfSize = fftSize() / 2;

&gt; Source/WebCore/platform/audio/fftw/FFTFrameFFTW.cpp:186
&gt; +    m_imagData[0] = m_realData[length - 1];

Similar comment to above:

m_imagData[0] = m_realData[fftSize() / 2];

or

m_imagData[0] = m_realData[halfSize];

&gt; Source/WebCore/platform/audio/fftw/FFTFrameFFTW.cpp:243
&gt; +        unsigned flags = FFTW_ESTIMATE | FFTW_PRESERVE_INPUT | FFTW_UNALIGNED;

please add FIXME about addressing the SIMD optimization issue and FFTW_UNALIGNED</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>339428</commentid>
    <comment_count>4</comment_count>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2011-01-24 18:18:00 -0800</bug_when>
    <thetext>(In reply to comment #2)
&gt; (From update of attachment 79889 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=79889&amp;action=review
&gt; 
&gt; r=me. before landing i think chris rogers should give this a once-over, and please make sure the EWS bots are happy with the gyp changes

Done. EWS bots are happy; this source isn&apos;t being compiled in yet.

&gt; &gt; Source/WebCore/platform/audio/FFTFrame.h:123
&gt; &gt;  #endif // !OS(DARWIN) &amp;&amp; USE(WEBAUDIO_MKL)
&gt; 
&gt; nit: comment on this line should be // USE(WEBAUDIO_MKL)

Done.

&gt; &gt; Source/WebCore/platform/audio/FFTFrame.h:148
&gt; &gt; +#endif // !OS(DARWIN) &amp;&amp; USE(WEBAUDIO_FFTW)
&gt; 
&gt; nit: // USE(WEBAUDIO_FFTW)

Done.

&gt; &gt; Source/WebCore/platform/audio/fftw/FFTFrameFFTW.cpp:2
&gt; &gt; + * Copyright (C) 2010 Google Inc. All rights reserved.
&gt; 
&gt; nit: here (and in other files) it&apos;s 2011 now :)

Fixed.

&gt; &gt; Source/WebCore/platform/audio/fftw/FFTFrameFFTW.cpp:74
&gt; &gt; +    float temporaryPointer[1];
&gt; &gt; +    m_forwardPlan = fftwPlanForSize(fftSize, Forward,
&gt; &gt; +                                    &amp;temporaryPointer[0], realData(), imagData());
&gt; &gt; +    m_backwardPlan = fftwPlanForSize(fftSize, Backward,
&gt; &gt; +                                     realData(), imagData(), &amp;temporaryPointer[0]);
&gt; 
&gt; nit: i&apos;m not sure i fully grok this, but would &apos;float temp; fftwPlanForSize(..., &amp;temp, ...);&apos; do as well? 1-size arrays are odd

Yes, that works; changed.

&gt; &gt; Source/WebCore/platform/audio/fftw/FFTFrameFFTW.cpp:103
&gt; &gt; +    unsigned nbytes = sizeof(float) * complexDataSize(m_FFTSize);
&gt; 
&gt; nit: number of bytes should be size_t

Done.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>339430</commentid>
    <comment_count>5</comment_count>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2011-01-24 18:20:58 -0800</bug_when>
    <thetext>(In reply to comment #3)
&gt; Hi Ken, overall this looks very good.  Thanks for running the unit tests I gave you to verify correctness as that counts the most!
&gt; 
&gt; Otherwise I have a few general comments:
&gt; 
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=79889&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/platform/audio/FFTFrame.h:139
&gt; &gt; +    // overhead. For the time being, we just assume unaligned data.
&gt; 
&gt; For now just to get something working we can live with unaligned (no SIMD optimizations).  But, soon we&apos;ll have to think of improving this.  We can either require that the arrays passed in to doFFT() and doInverseFFT() be aligned (and check that they are with ASSERTs etc.) or do a memcpy into an aligned array.  I&apos;m pretty sure that the overhead of the memcpy() is *very* much smaller than not having SIMD optimization.

Understood. To consolidate the comments I&apos;ve removed the comment from FFTFrame.h and moved it to FFTFrameFFTW.cpp, and added a FIXME.

&gt; &gt; Source/WebCore/platform/audio/fftw/FFTFrameFFTW.cpp:45
&gt; &gt; +int complexDataSize(int fftSize)
&gt; 
&gt; I think it would be better to have a more descriptive and specific name -- maybe &quot;unpackedFFTWDataSize.

Done.

&gt; Also, fftSize should be &quot;unsigned&quot; to match the FFTFrame constructors

Done.

&gt; &gt; Source/WebCore/platform/audio/fftw/FFTFrameFFTW.cpp:125
&gt; &gt; +    // factor will need to change too.
&gt; 
&gt; Maybe fix this comment to be more generic instead of talking about vecLib on the Mac...

I&apos;m pretty sure we specifically referenced vecLib in the comments in the MKL port of the FFTFrame. I&apos;m leaving this as is for now.

&gt; &gt; Source/WebCore/platform/audio/fftw/FFTFrameFFTW.cpp:155
&gt; &gt; +    int length = m_realData.size();
&gt; 
&gt; I think it would be more clear with something like:
&gt; int length = fftSize() / 2 + 1;
&gt; 
&gt; or maybe even better:
&gt; 
&gt; int length = complexDataSize();   // &lt;---- or whatever the new function name turns out to be
&gt; 
&gt; 
&gt; then maybe even ASSERT(length == m_realData.size());

I&apos;ve changed this to use unpackedFFTWDataSize and added the ASSERT you suggested.

&gt; &gt; Source/WebCore/platform/audio/fftw/FFTFrameFFTW.cpp:163
&gt; &gt; +    m_imagData[0] = m_realData[length - 1];
&gt; 
&gt; I think it would be much clearer to explicitly reference the index in terms of the fftSize:
&gt; 
&gt; m_imagData[0] = m_realData[fftSize() / 2];
&gt; 
&gt; This is where the nyquist component is normally expected to live.  The way you have it now I had to look twice to verify that it&apos;s correct (looking at what size m_realData was allocated at, etc.)
&gt; 
&gt; &gt; Source/WebCore/platform/audio/fftw/FFTFrameFFTW.cpp:170
&gt; &gt; +    m_realData[length - 1] = m_imagData[0];
&gt; 
&gt; Same comment as above.  I think the following would be clearer and more explicit:
&gt; 
&gt; m_realData[fftSize() / 2] = m_imagData[0];
&gt; 
&gt; You could even define a variable called &quot;halfSize&quot; since this value is re-used later in this function:
&gt; int halfSize = fftSize() / 2;

I&apos;ve changed these to use unpackedFFTWDataSize(). I really don&apos;t want to replicate the math all over this file, especially because of the slightly different unpacked complex data length between the FFTW port and the MKL and vecLib ports.

&gt; &gt; Source/WebCore/platform/audio/fftw/FFTFrameFFTW.cpp:186
&gt; &gt; +    m_imagData[0] = m_realData[length - 1];
&gt; 
&gt; Similar comment to above:
&gt; 
&gt; m_imagData[0] = m_realData[fftSize() / 2];
&gt; 
&gt; or
&gt; 
&gt; m_imagData[0] = m_realData[halfSize];

See above.

&gt; &gt; Source/WebCore/platform/audio/fftw/FFTFrameFFTW.cpp:243
&gt; &gt; +        unsigned flags = FFTW_ESTIMATE | FFTW_PRESERVE_INPUT | FFTW_UNALIGNED;
&gt; 
&gt; please add FIXME about addressing the SIMD optimization issue and FFTW_UNALIGNED

Done.

All changes will be made in landed version.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>339440</commentid>
    <comment_count>6</comment_count>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2011-01-24 18:40:12 -0800</bug_when>
    <thetext>Committed r76562: &lt;http://trac.webkit.org/changeset/76562&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>509334</commentid>
    <comment_count>7</comment_count>
    <who name="Soo-Hyun Choi">s.choi</who>
    <bug_when>2011-11-25 23:40:08 -0800</bug_when>
    <thetext>I wonder how this patch (which uses FFTW library) could have been landed in the WebKit. I assume that FFTW should be compiled together with WebKit in order to use this patch (FFTFrame), which I suspect license mismatch between them. 

License violation, perhaps?

NB) WebKit is LGPL+BSD license where FFTW.org is GPL.
http://www.fftw.org/faq/section1.html#isfftwfree

Any comments?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>509337</commentid>
    <comment_count>8</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2011-11-26 00:20:42 -0800</bug_when>
    <thetext>&gt; Any comments?

Would you be willing to ask these questions on chromium-dev?  Hopefully that will make it easier to direct your question to the appropriate folks (who are better at reading email than at reading bug trackers).

Thanks.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>509342</commentid>
    <comment_count>9</comment_count>
    <who name="Soo-Hyun Choi">s.choi</who>
    <bug_when>2011-11-26 02:05:14 -0800</bug_when>
    <thetext>(In reply to comment #8)
&gt; &gt; Any comments?
&gt; 
&gt; Would you be willing to ask these questions on chromium-dev?  Hopefully that will make it easier to direct your question to the appropriate folks (who are better at reading email than at reading bug trackers).
&gt; 
&gt; Thanks.

I am not certain if it is chromium issue or WebKit issue. I thought it is not a bad idea to ask WebKit first as this patch actually became a part of WebKit source through this bug report.

Anyway, I will direct my original message to the chromium-dev as you suggested.

Thanks,</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>79889</attachid>
            <date>2011-01-23 21:13:56 -0800</date>
            <delta_ts>2011-01-23 21:26:58 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-52989-20110123211355.patch</filename>
            <type>text/plain</type>
            <size>16897</size>
            <attacher name="Kenneth Russell">kbr</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDc2NDgwKQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMzAgQEAKKzIwMTEtMDEtMjMgIEtlbm5ldGgg
UnVzc2VsbCAgPGtickBnb29nbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAo
T09QUyEpLgorCisgICAgICAgIFdlYiBBdWRpbyBBUEk6IHBvcnQgRkZURnJhbWUgdG8gRkZUVwor
ICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTI5ODkKKwor
ICAgICAgICBQb3J0ZWQgRkZURnJhbWUgY2xhc3MgdG8gdGhlIG9wZW4tc291cmNlIEZGVFcgbGli
cmFyeS4gVGVzdGVkIHdpdGgKKyAgICAgICAgdW5pdCB0ZXN0cyBmcm9tIENocmlzIFJvZ2Vycy4g
TWFkZSBwcmVsaW1pbmFyeSBjaGFuZ2VzIHRvIEdZUAorICAgICAgICBmaWxlcyBmb3IgY29uZGl0
aW9uYWwgY29tcGlsYXRpb24gb2YgdGhlc2UgZmlsZXM7IHdpbGwgbmVlZCB0byBiZQorICAgICAg
ICBhZGp1c3RlZCBvbmNlIEZGVFcgaXMgaW50ZWdyYXRlZCBhcyB0aGlyZC1wYXJ0eSBzb3VyY2Uu
CisKKyAgICAgICAgKiBXZWJDb3JlLmd5cC9XZWJDb3JlLmd5cDoKKyAgICAgICAgKiBXZWJDb3Jl
Lmd5cGk6CisgICAgICAgICogcGxhdGZvcm0vYXVkaW8vRkZURnJhbWUuaDoKKyAgICAgICAgKiBw
bGF0Zm9ybS9hdWRpby9mZnR3OiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9hdWRpby9mZnR3
L0ZGVEZyYW1lRkZUVy5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6RkZURnJhbWU6OkZG
VEZyYW1lKToKKyAgICAgICAgKFdlYkNvcmU6OkZGVEZyYW1lOjp+RkZURnJhbWUpOgorICAgICAg
ICAoV2ViQ29yZTo6RkZURnJhbWU6Om11bHRpcGx5KToKKyAgICAgICAgKFdlYkNvcmU6OkZGVEZy
YW1lOjpkb0ZGVCk6CisgICAgICAgIChXZWJDb3JlOjpGRlRGcmFtZTo6ZG9JbnZlcnNlRkZUKToK
KyAgICAgICAgKFdlYkNvcmU6OkZGVEZyYW1lOjpjbGVhbnVwKToKKyAgICAgICAgKFdlYkNvcmU6
OkZGVEZyYW1lOjpyZWFsRGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpGRlRGcmFtZTo6aW1hZ0Rh
dGEpOgorICAgICAgICAoV2ViQ29yZTo6RkZURnJhbWU6OmZmdHdQbGFuRm9yU2l6ZSk6CisKIDIw
MTEtMDEtMjMgIE1hcmsgUm93ZSAgPG1yb3dlQGFwcGxlLmNvbT4KIAogICAgICAgICBGb2xsb3ct
dXAgdG8gcjc2NDc3LgpJbmRleDogU291cmNlL1dlYkNvcmUvV2ViQ29yZS5neXBpCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9XZWJDb3JlL1dlYkNvcmUuZ3lwaQkocmV2aXNpb24gNzY0MDgpCisrKyBT
b3VyY2UvV2ViQ29yZS9XZWJDb3JlLmd5cGkJKHdvcmtpbmcgY29weSkKQEAgLTI0MzEsNiArMjQz
MSw3IEBACiAgICAgICAgICAgICAncGxhdGZvcm0vYXVkaW8vVmVjdG9yTWF0aC5oJywKICAgICAg
ICAgICAgICdwbGF0Zm9ybS9hdWRpby9WZWN0b3JNYXRoLmNwcCcsCiAgICAgICAgICAgICAncGxh
dGZvcm0vYXVkaW8vY2hyb21pdW0vQXVkaW9CdXNDaHJvbWl1bS5jcHAnLAorICAgICAgICAgICAg
J3BsYXRmb3JtL2F1ZGlvL2ZmdHcvRkZURnJhbWVGRlRXLmNwcCcsCiAgICAgICAgICAgICAncGxh
dGZvcm0vYXVkaW8vbWFjL0F1ZGlvQnVzTWFjLm1tJywKICAgICAgICAgICAgICdwbGF0Zm9ybS9h
dWRpby9tYWMvQXVkaW9EZXN0aW5hdGlvbk1hYy5oJywKICAgICAgICAgICAgICdwbGF0Zm9ybS9h
dWRpby9tYWMvQXVkaW9EZXN0aW5hdGlvbk1hYy5jcHAnLApJbmRleDogU291cmNlL1dlYkNvcmUv
V2ViQ29yZS5neXAvV2ViQ29yZS5neXAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvV2Vi
Q29yZS5neXAvV2ViQ29yZS5neXAJKHJldmlzaW9uIDc2NDA4KQorKysgU291cmNlL1dlYkNvcmUv
V2ViQ29yZS5neXAvV2ViQ29yZS5neXAJKHdvcmtpbmcgY29weSkKQEAgLTg1MiwxMiArODUyLDE3
IEBACiAgICAgICAgICAgfSwKICAgICAgICAgfV0sCiAgICAgICAgICMgRklYTUU6IChrYnIpIGlk
ZWFsbHkgdGhpcyB0YXJnZXQgc2hvdWxkIGp1c3QgZGVwZW5kIG9uIHdlYmNvcmVfcHJlcmVxdWlz
aXRlcwotICAgICAgICAjIHRvIHBpY2sgdXAgdGhpcyBpbmNsdWRlIGRpcmVjdG9yeSwgYnV0IEkn
bSBuZXJ2b3VzIGFib3V0IG1ha2luZyB0aGF0IGNoYW5nZS4KKyAgICAgICAgIyB0byBwaWNrIHVw
IHRoZXNlIGluY2x1ZGUgZGlyZWN0b3JpZXMsIGJ1dCBJJ20gbmVydm91cyBhYm91dCBtYWtpbmcg
dGhhdCBjaGFuZ2UuCiAgICAgICAgIFsnKE9TPT0ibGludXgiIG9yIE9TPT0id2luIikgYW5kICJX
VEZfVVNFX1dFQkFVRElPX01LTD0xIiBpbiBmZWF0dXJlX2RlZmluZXMnLCB7CiAgICAgICAgICAg
J2luY2x1ZGVfZGlycyc6IFsKICAgICAgICAgICAgICc8KGNocm9taXVtX3NyY19kaXIpL3RoaXJk
X3BhcnR5L21rbC9pbmNsdWRlJywKICAgICAgICAgICBdLAogICAgICAgICB9XSwKKyAgICAgICAg
WycoT1M9PSJsaW51eCIgb3IgT1M9PSJ3aW4iKSBhbmQgIldURl9VU0VfV0VCQVVESU9fRkZUVz0x
IiBpbiBmZWF0dXJlX2RlZmluZXMnLCB7CisgICAgICAgICAgJ2luY2x1ZGVfZGlycyc6IFsKKyAg
ICAgICAgICAgICc8KGNocm9taXVtX3NyY19kaXIpL3RoaXJkX3BhcnR5L2ZmdHcvYXBpJywKKyAg
ICAgICAgICBdLAorICAgICAgICB9XSwKICAgICAgIF0sCiAgICAgfSwKICAgICB7CkBAIC0xMDM0
LDYgKzEwMzksMTQgQEAKICAgICAgICAgICAgIF0sCiAgICAgICAgICAgfSwKICAgICAgICAgfV0s
CisgICAgICAgIFsnKE9TPT0ibGludXgiIG9yIE9TPT0id2luIikgYW5kICJXVEZfVVNFX1dFQkFV
RElPX0ZGVFc9MSIgaW4gZmVhdHVyZV9kZWZpbmVzJywgeworICAgICAgICAgICMgVGhpcyBkaXJl
Y3RvcnkgbmVlZHMgdG8gYmUgb24gdGhlIGluY2x1ZGUgcGF0aCBmb3IgbXVsdGlwbGUgc3ViLXRh
cmdldHMgb2Ygd2ViY29yZS4KKyAgICAgICAgICAnZGlyZWN0X2RlcGVuZGVudF9zZXR0aW5ncyc6
IHsKKyAgICAgICAgICAgICdpbmNsdWRlX2RpcnMnOiBbCisgICAgICAgICAgICAgICc8KGNocm9t
aXVtX3NyY19kaXIpL3RoaXJkX3BhcnR5L2ZmdHcvYXBpJywKKyAgICAgICAgICAgIF0sCisgICAg
ICAgICAgfSwKKyAgICAgICAgfV0sCiAgICAgICBdLAogICAgIH0sCiAgICAgewpAQCAtMTA5Niw3
ICsxMTA5LDcgQEAKICAgICAgICAgIyBFeGNsdWRlIHRoaW5ncyB0aGF0IGRvbid0IGFwcGx5IHRv
IHRoZSBDaHJvbWl1bSBwbGF0Zm9ybSBvbiB0aGUgYmFzaXMKICAgICAgICAgIyBvZiB0aGVpciBl
bmNsb3NpbmcgZGlyZWN0b3JpZXMgYW5kIHRhZ3MgYXQgdGhlIGVuZHMgb2YgdGhlaXIKICAgICAg
ICAgIyBmaWxlbmFtZXMuCi0gICAgICAgIFsnZXhjbHVkZScsICcoYW5kcm9pZHxjYWlyb3xjZnxj
Z3xjdXJsfGd0a3xoYWlrdXxsaW51eHxtYWN8bWtsfG9wZW50eXBlfHBvc2l4fHF0fHNvdXB8c3Zn
fHN5bWJpYW58d2lufHd4KS8nXSwKKyAgICAgICAgWydleGNsdWRlJywgJyhhbmRyb2lkfGNhaXJv
fGNmfGNnfGN1cmx8ZmZ0d3xndGt8aGFpa3V8bGludXh8bWFjfG1rbHxvcGVudHlwZXxwb3NpeHxx
dHxzb3VwfHN2Z3xzeW1iaWFufHdpbnx3eCkvJ10sCiAgICAgICAgIFsnZXhjbHVkZScsICcoPzwh
Q2hyb21pdW0pKEFuZHJvaWR8Q2Fpcm98Q0Z8Q0d8Q3VybHxHdGt8TGludXh8TWFjfE9wZW5UeXBl
fFBPU0lYfFBvc2l4fFF0fFNhZmFyaXxTb3VwfFN5bWJpYW58V2lufFd4KVxcLihjcHB8bW0/KSQn
XSwKIAogICAgICAgICAjIEEgZmV3IHRoaW5ncyBjYW4ndCBiZSBleGNsdWRlZCBieSBwYXR0ZXJu
cy4gIExpc3QgdGhlbSBpbmRpdmlkdWFsbHkuCkBAIC0xMjcwLDYgKzEyODMsMTEgQEAKICAgICAg
ICAgICAgIFsnaW5jbHVkZScsICdwbGF0Zm9ybS9hdWRpby9ta2wvRkZURnJhbWVNS0xcXC5jcHAk
J10sCiAgICAgICAgICAgXSwKICAgICAgICAgfV0sCisgICAgICAgIFsnKE9TPT0ibGludXgiIG9y
IE9TPT0id2luIikgYW5kICJXVEZfVVNFX1dFQkFVRElPX0ZGVFc9MSIgaW4gZmVhdHVyZV9kZWZp
bmVzJywgeworICAgICAgICAgICdzb3VyY2VzLyc6IFsKKyAgICAgICAgICAgIFsnaW5jbHVkZScs
ICdwbGF0Zm9ybS9hdWRpby9mZnR3L0ZGVEZyYW1lRkZUV1xcLmNwcCQnXSwKKyAgICAgICAgICBd
LAorICAgICAgICB9XSwKICAgICAgIF0sCiAgICAgfSwKICAgICB7CkBAIC0xNTAxLDYgKzE1MTks
MjMgQEAKICAgICAgICAgICAgIH0sCiAgICAgICAgICAgfSwKICAgICAgICAgfV0sCisgICAgICAg
IFsnT1M9PSJsaW51eCIgYW5kICJXVEZfVVNFX1dFQkFVRElPX0ZGVFc9MSIgaW4gZmVhdHVyZV9k
ZWZpbmVzJywgeworICAgICAgICAgICMgRklYTUU6IChrYnIpIGZpZ3VyZSBvdXQgaG93IHRvIG1h
a2UgdGhlc2UgZGVwZW5kZW5jaWVzCisgICAgICAgICAgIyB3b3JrIGluIGEgY3Jvc3MtcGxhdGZv
cm0gd2F5LiBBdHRlbXB0cyB0byB1c2UKKyAgICAgICAgICAjICJsaW5rX3NldHRpbmdzIiBhbmQg
ImxpYnJhcmllcyIgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUKKyAgICAgICAgICAjIG1zdnMtc3Bl
Y2lmaWMgc2V0dGluZ3MgZGlkbid0IHdvcmsgc28gZmFyLgorICAgICAgICAgICdhbGxfZGVwZW5k
ZW50X3NldHRpbmdzJzogeworICAgICAgICAgICAgJ2xkZmxhZ3MnOiBbCisgICAgICAgICAgICAg
ICMgRklYTUU6IChrYnIpIGJ1aWxkIHRoZSBGRlRXIGludG8gUFJPRFVDVF9ESVIgdXNpbmcgR1lQ
LgorICAgICAgICAgICAgICAnLUx0aGlyZF9wYXJ0eS9mZnR3Ly5saWJzJywKKyAgICAgICAgICAg
IF0sCisgICAgICAgICAgICAnbGlua19zZXR0aW5ncyc6IHsKKyAgICAgICAgICAgICAgJ2xpYnJh
cmllcyc6IFsKKyAgICAgICAgICAgICAgICAnLWxmZnR3M2YnCisgICAgICAgICAgICAgIF0sCisg
ICAgICAgICAgICB9LAorICAgICAgICAgIH0sCisgICAgICAgIH1dLAogICAgICAgICBbJ2VuYWJs
ZV9zdmchPTAnLCB7CiAgICAgICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKICAgICAgICAgICAgICd3
ZWJjb3JlX3N2ZycsCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9GRlRGcmFt
ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL0ZGVEZyYW1l
LmgJKHJldmlzaW9uIDc2NDA4KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vRkZU
RnJhbWUuaAkod29ya2luZyBjb3B5KQpAQCAtMzUsOCArMzUsMTMgQEAKICNpbmNsdWRlIDxBY2Nl
bGVyYXRlL0FjY2VsZXJhdGUuaD4KICNlbmRpZgogCi0jaWYgIU9TKERBUldJTikgJiYgVVNFKFdF
QkFVRElPX01LTCkKKyNpZiAhT1MoREFSV0lOKQorI2lmIFVTRShXRUJBVURJT19NS0wpCiAjaW5j
bHVkZSAibWtsX2RmdGkuaCIKKyNlbmRpZiAvLyBVU0UoV0VCQVVESU9fTUtMKQorI2lmIFVTRShX
RUJBVURJT19GRlRXKQorI2luY2x1ZGUgImZmdHczLmgiCisjZW5kaWYgLy8gVVNFKFdFQkFVRElP
X0ZGVFcpCiAjZW5kaWYKIAogI2luY2x1ZGUgPHd0Zi9QYXNzT3duUHRyLmg+CkBAIC05OCw4ICsx
MDMsOCBAQCBwcml2YXRlOgogICAgIERTUFNwbGl0Q29tcGxleCBtX2ZyYW1lOwogICAgIEF1ZGlv
RmxvYXRBcnJheSBtX3JlYWxEYXRhOwogICAgIEF1ZGlvRmxvYXRBcnJheSBtX2ltYWdEYXRhOwot
I2VuZGlmIC8vIE9TKERBUldJTikKLSNpZiAhT1MoREFSV0lOKSAmJiBVU0UoV0VCQVVESU9fTUtM
KQorI2Vsc2UgLy8gIU9TKERBUldJTikKKyNpZiBVU0UoV0VCQVVESU9fTUtMKQogICAgIC8vIElu
dGVybGVhdmVzIHRoZSBwbGFuYXIgcmVhbCBhbmQgaW1hZ2luYXJ5IGRhdGEgYW5kIHJldHVybnMg
YQogICAgIC8vIHBvaW50ZXIgdG8gdGhlIHJlc3VsdGluZyBzdG9yYWdlIHdoaWNoIGNhbiBiZSB1
c2VkIGZvciBpbi1wbGFjZQogICAgIC8vIG9yIG91dC1vZi1wbGFjZSBvcGVyYXRpb25zLiBGSVhN
RTogaWRlYWxseSBhbGwgb2YgdGhlIE1LTApAQCAtMTE2LDYgKzEyMSwzMiBAQCBwcml2YXRlOgog
ICAgIEF1ZGlvRmxvYXRBcnJheSBtX3JlYWxEYXRhOwogICAgIEF1ZGlvRmxvYXRBcnJheSBtX2lt
YWdEYXRhOwogI2VuZGlmIC8vICFPUyhEQVJXSU4pICYmIFVTRShXRUJBVURJT19NS0wpCisjaWYg
VVNFKFdFQkFVRElPX0ZGVFcpCisgICAgZmZ0d2ZfcGxhbiBtX2ZvcndhcmRQbGFuOworICAgIGZm
dHdmX3BsYW4gbV9iYWNrd2FyZFBsYW47CisKKyAgICBlbnVtIERpcmVjdGlvbiB7CisgICAgICAg
IEZvcndhcmQsCisgICAgICAgIEJhY2t3YXJkCisgICAgfTsKKworICAgIC8vIElkZWFsbHkgd2Ug
d291bGQgdXNlIGZmdHdfbWFsbG9jIGFuZCBmZnR3X2ZyZWUgZm9yIHRoZSBpbnB1dAorICAgIC8v
IGFuZCBvdXRwdXQgYXJyYXlzIHRvIGVuc3VyZSBwcm9wZXIgYWxpZ25tZW50IGZvciBTSU1ECisg
ICAgLy8gb3BlcmF0aW9ucywgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIHNwZWNpZnkgRkZUV19V
TkFMSUdORUQKKyAgICAvLyB3aGVuIGNyZWF0aW5nIHRoZSBwbGFuLiBIb3dldmVyLCBzaW5jZSB3
ZSBkb24ndCBoYXZlIGNvbnRyb2wKKyAgICAvLyBvdmVyIHRoZSBhbGlnbm1lbnQgb2YgdGhlIGFy
cmF5IHBhc3NlZCB0byBkb0ZGVCAvIGRvSW52ZXJzZUZGVCwKKyAgICAvLyB3ZSB3b3VsZCBuZWVk
IHRvIG1lbWNweSBpdCBpbiB0byBvciBvdXQgb2YgdGhlIEZGVEZyYW1lLCBhZGRpbmcKKyAgICAv
LyBvdmVyaGVhZC4gRm9yIHRoZSB0aW1lIGJlaW5nLCB3ZSBqdXN0IGFzc3VtZSB1bmFsaWduZWQg
ZGF0YS4KKyAgICBBdWRpb0Zsb2F0QXJyYXkgbV9yZWFsRGF0YTsKKyAgICBBdWRpb0Zsb2F0QXJy
YXkgbV9pbWFnRGF0YTsKKworICAgIHN0YXRpYyBmZnR3Zl9wbGFuKiBmZnR3Rm9yd2FyZFBsYW5z
OworICAgIHN0YXRpYyBmZnR3Zl9wbGFuKiBmZnR3QmFja3dhcmRQbGFuczsKKworICAgIHN0YXRp
YyBmZnR3Zl9wbGFuIGZmdHdQbGFuRm9yU2l6ZSh1bnNpZ25lZCBmZnRTaXplLCBEaXJlY3Rpb24s
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiwgZmxvYXQqLCBm
bG9hdCopOworI2VuZGlmIC8vICFPUyhEQVJXSU4pICYmIFVTRShXRUJBVURJT19GRlRXKQorI2Vu
ZGlmIC8vICFPUyhEQVJXSU4pCiB9OwogCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBT
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9mZnR3L0ZGVEZyYW1lRkZUVy5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vZmZ0dy9GRlRGcmFtZUZGVFcu
Y3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vZmZ0dy9G
RlRGcmFtZUZGVFcuY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDI2MyBAQAorLyoKKyAqIENv
cHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5E
IElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisg
KiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBP
UiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBB
TlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKy8v
IEZGVEZyYW1lIGltcGxlbWVudGF0aW9uIHVzaW5nIHRoZSBGRlRXIGxpYnJhcnkuCisKKyNpbmNs
dWRlICJjb25maWcuaCIKKworI2lmIEVOQUJMRShXRUJfQVVESU8pCisKKyNpbmNsdWRlICJGRlRG
cmFtZS5oIgorCisjaW5jbHVkZSA8d3RmL01hdGhFeHRyYXMuaD4KKworbmFtZXNwYWNlIFdlYkNv
cmUgeworCitjb25zdCBpbnQga01heEZGVFBvdzJTaXplID0gMjQ7CisKK2ZmdHdmX3BsYW4qIEZG
VEZyYW1lOjpmZnR3Rm9yd2FyZFBsYW5zID0gMDsKK2ZmdHdmX3BsYW4qIEZGVEZyYW1lOjpmZnR3
QmFja3dhcmRQbGFucyA9IDA7CisKK25hbWVzcGFjZSB7CisKK2ludCBjb21wbGV4RGF0YVNpemUo
aW50IGZmdFNpemUpCit7CisgICAgcmV0dXJuIGZmdFNpemUgLyAyICsgMTsKK30KKworfSAvLyBh
bm9ueW1vdXMgbmFtZXNwYWNlCisKKworLy8gTm9ybWFsIGNvbnN0cnVjdG9yOiBhbGxvY2F0ZXMg
Zm9yIGEgZ2l2ZW4gZmZ0U2l6ZS4KK0ZGVEZyYW1lOjpGRlRGcmFtZSh1bnNpZ25lZCBmZnRTaXpl
KQorICAgIDogbV9GRlRTaXplKGZmdFNpemUpCisgICAgLCBtX2xvZzJGRlRTaXplKHN0YXRpY19j
YXN0PHVuc2lnbmVkPihsb2cyKGZmdFNpemUpKSkKKyAgICAsIG1fZm9yd2FyZFBsYW4oMCkKKyAg
ICAsIG1fYmFja3dhcmRQbGFuKDApCisgICAgLCBtX3JlYWxEYXRhKGNvbXBsZXhEYXRhU2l6ZShm
ZnRTaXplKSkKKyAgICAsIG1faW1hZ0RhdGEoY29tcGxleERhdGFTaXplKGZmdFNpemUpKQorewor
ICAgIC8vIFdlIG9ubHkgYWxsb3cgcG93ZXIgb2YgdHdvLgorICAgIEFTU0VSVCgxVUwgPDwgbV9s
b2cyRkZUU2l6ZSA9PSBtX0ZGVFNpemUpOworCisgICAgLy8gRkZUVyB3b24ndCBjcmVhdGUgYSBw
bGFuIHdpdGhvdXQgYmVpbmcgYWJsZSB0byBsb29rIGF0IG5vbi1udWxsCisgICAgLy8gcG9pbnRl
cnMgZm9yIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGRhdGE7IGl0IHdhbnRzIHRvIGJlIGFibGUgdG8K
KyAgICAvLyBzZWUgd2hldGhlciB0aGVzZSBhcnJheXMgYXJlIGFsaWduZWQgcHJvcGVybHkgZm9y
IHZlY3RvcgorICAgIC8vIG9wZXJhdGlvbnMuIFdlIGNhbid0IHRha2UgYWR2YW50YWdlIG9mIHRo
aXMgc28gd2UgbmVlZCB0byBmYWtlCisgICAgLy8gdXAgYSBwb2ludGVyIGZvciB0aGUgZm9yd2Fy
ZC9iYWNrd2FyZCBkaXJlY3Rpb25zLgorICAgIGZsb2F0IHRlbXBvcmFyeVBvaW50ZXJbMV07Cisg
ICAgbV9mb3J3YXJkUGxhbiA9IGZmdHdQbGFuRm9yU2l6ZShmZnRTaXplLCBGb3J3YXJkLAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRlbXBvcmFyeVBvaW50ZXJbMF0sIHJl
YWxEYXRhKCksIGltYWdEYXRhKCkpOworICAgIG1fYmFja3dhcmRQbGFuID0gZmZ0d1BsYW5Gb3JT
aXplKGZmdFNpemUsIEJhY2t3YXJkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIHJlYWxEYXRhKCksIGltYWdEYXRhKCksICZ0ZW1wb3JhcnlQb2ludGVyWzBdKTsKK30KKwor
Ly8gQ3JlYXRlcyBhIGJsYW5rL2VtcHR5IGZyYW1lIChpbnRlcnBvbGF0ZSgpIG11c3QgbGF0ZXIg
YmUgY2FsbGVkKS4KK0ZGVEZyYW1lOjpGRlRGcmFtZSgpCisgICAgOiBtX0ZGVFNpemUoMCkKKyAg
ICAsIG1fbG9nMkZGVFNpemUoMCkKKyAgICAsIG1fZm9yd2FyZFBsYW4oMCkKKyAgICAsIG1fYmFj
a3dhcmRQbGFuKDApCit7Cit9CisKKy8vIENvcHkgY29uc3RydWN0b3IuCitGRlRGcmFtZTo6RkZU
RnJhbWUoY29uc3QgRkZURnJhbWUmIGZyYW1lKQorICAgIDogbV9GRlRTaXplKGZyYW1lLm1fRkZU
U2l6ZSkKKyAgICAsIG1fbG9nMkZGVFNpemUoZnJhbWUubV9sb2cyRkZUU2l6ZSkKKyAgICAsIG1f
Zm9yd2FyZFBsYW4oMCkKKyAgICAsIG1fYmFja3dhcmRQbGFuKDApCisgICAgLCBtX3JlYWxEYXRh
KGNvbXBsZXhEYXRhU2l6ZShmcmFtZS5tX0ZGVFNpemUpKQorICAgICwgbV9pbWFnRGF0YShjb21w
bGV4RGF0YVNpemUoZnJhbWUubV9GRlRTaXplKSkKK3sKKyAgICAvLyBTZWUgdGhlIG5vcm1hbCBj
b25zdHJ1Y3RvciBmb3IgYW4gZXhwbGFuYXRpb24gb2YgdGhlIHRlbXBvcmFyeSBwb2ludGVyLgor
ICAgIGZsb2F0IHRlbXBvcmFyeVBvaW50ZXJbMV07CisgICAgbV9mb3J3YXJkUGxhbiA9IGZmdHdQ
bGFuRm9yU2l6ZShtX0ZGVFNpemUsIEZvcndhcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAmdGVtcG9yYXJ5UG9pbnRlclswXSwgcmVhbERhdGEoKSwgaW1hZ0RhdGEoKSk7
CisgICAgbV9iYWNrd2FyZFBsYW4gPSBmZnR3UGxhbkZvclNpemUobV9GRlRTaXplLCBCYWNrd2Fy
ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFsRGF0YSgpLCBpbWFn
RGF0YSgpLCAmdGVtcG9yYXJ5UG9pbnRlclswXSk7CisKKyAgICAvLyBDb3B5L3NldHVwIGZyYW1l
IGRhdGEuCisgICAgdW5zaWduZWQgbmJ5dGVzID0gc2l6ZW9mKGZsb2F0KSAqIGNvbXBsZXhEYXRh
U2l6ZShtX0ZGVFNpemUpOworICAgIG1lbWNweShyZWFsRGF0YSgpLCBmcmFtZS5yZWFsRGF0YSgp
LCBuYnl0ZXMpOworICAgIG1lbWNweShpbWFnRGF0YSgpLCBmcmFtZS5pbWFnRGF0YSgpLCBuYnl0
ZXMpOworfQorCitGRlRGcmFtZTo6fkZGVEZyYW1lKCkKK3sKK30KKwordm9pZCBGRlRGcmFtZTo6
bXVsdGlwbHkoY29uc3QgRkZURnJhbWUmIGZyYW1lKQoreworICAgIEZGVEZyYW1lJiBmcmFtZTEg
PSAqdGhpczsKKyAgICBGRlRGcmFtZSYgZnJhbWUyID0gY29uc3RfY2FzdDxGRlRGcmFtZSY+KGZy
YW1lKTsKKworICAgIGZsb2F0KiByZWFsUDEgPSBmcmFtZTEucmVhbERhdGEoKTsKKyAgICBmbG9h
dCogaW1hZ1AxID0gZnJhbWUxLmltYWdEYXRhKCk7CisgICAgY29uc3QgZmxvYXQqIHJlYWxQMiA9
IGZyYW1lMi5yZWFsRGF0YSgpOworICAgIGNvbnN0IGZsb2F0KiBpbWFnUDIgPSBmcmFtZTIuaW1h
Z0RhdGEoKTsKKworICAgIC8vIFNjYWxlIGFjY291bnRzIHRoZSBwZWN1bGlhciBzY2FsaW5nIG9m
IHZlY0xpYiBvbiB0aGUgTWFjLgorICAgIC8vIFRoaXMgZW5zdXJlcyB0aGUgcmlnaHQgc2NhbGlu
ZyBhbGwgdGhlIHdheSBiYWNrIHRvIGludmVyc2UgRkZULgorICAgIC8vIEZJWE1FOiBpZiB3ZSBj
aGFuZ2UgdGhlIHNjYWxpbmcgb24gdGhlIE1hYyB0aGVuIHRoaXMgc2NhbGUKKyAgICAvLyBmYWN0
b3Igd2lsbCBuZWVkIHRvIGNoYW5nZSB0b28uCisgICAgZmxvYXQgc2NhbGUgPSAwLjVmOworCisg
ICAgLy8gTXVsdGlwbHkgdGhlIHBhY2tlZCBEQy9ueXF1aXN0IGNvbXBvbmVudAorICAgIHJlYWxQ
MVswXSAqPSBzY2FsZSAqIHJlYWxQMlswXTsKKyAgICBpbWFnUDFbMF0gKj0gc2NhbGUgKiBpbWFn
UDJbMF07CisKKyAgICAvLyBDb21wbGV4IG11bHRpcGxpY2F0aW9uLiBJZiB0aGlzIGxvb3AgdHVy
bnMgb3V0IHRvIGJlIGhvdCB0aGVuCisgICAgLy8gd2Ugc2hvdWxkIHVzZSBTU0Ugb3Igb3RoZXIg
aW50cmluc2ljcyB0byBhY2NlbGVyYXRlIGl0LgorICAgIGludCBoYWxmU2l6ZSA9IGZmdFNpemUo
KSAvIDI7CisKKyAgICBmb3IgKGludCBpID0gMTsgaSA8IGhhbGZTaXplOyArK2kpIHsKKyAgICAg
ICAgZmxvYXQgcmVhbFJlc3VsdCA9IHJlYWxQMVtpXSAqIHJlYWxQMltpXSAtIGltYWdQMVtpXSAq
IGltYWdQMltpXTsKKyAgICAgICAgZmxvYXQgaW1hZ1Jlc3VsdCA9IHJlYWxQMVtpXSAqIGltYWdQ
MltpXSArIGltYWdQMVtpXSAqIHJlYWxQMltpXTsKKworICAgICAgICByZWFsUDFbaV0gPSBzY2Fs
ZSAqIHJlYWxSZXN1bHQ7CisgICAgICAgIGltYWdQMVtpXSA9IHNjYWxlICogaW1hZ1Jlc3VsdDsK
KyAgICB9Cit9CisKK3ZvaWQgRkZURnJhbWU6OmRvRkZUKGZsb2F0KiBkYXRhKQoreworICAgIGZm
dHdmX2V4ZWN1dGVfc3BsaXRfZGZ0X3IyYyhtX2ZvcndhcmRQbGFuLCBkYXRhLCByZWFsRGF0YSgp
LCBpbWFnRGF0YSgpKTsKKworICAgIC8vIFNjYWxlIHRoZSBmcmVxdWVuY3kgZG9tYWluIGRhdGEg
dG8gbWF0Y2ggdmVjTGliJ3Mgc2NhbGUgZmFjdG9yCisgICAgLy8gb24gdGhlIE1hYy4gRklYTUU6
IGlmIHdlIGNoYW5nZSB0aGUgZGVmaW5pdGlvbiBvZiBGRlRGcmFtZSB0bworICAgIC8vIGVsaW1p
bmF0ZSB0aGlzIHNjYWxlIGZhY3RvciB0aGVuIHRoaXMgY29kZSB3aWxsIG5lZWQgdG8gY2hhbmdl
LgorICAgIC8vIEFsc28sIGlmIHRoaXMgbG9vcCB0dXJucyBvdXQgdG8gYmUgaG90IHRoZW4gd2Ug
c2hvdWxkIHVzZSBTU0UKKyAgICAvLyBvciBvdGhlciBpbnRyaW5zaWNzIHRvIGFjY2VsZXJhdGUg
aXQuCisgICAgZmxvYXQgc2NhbGVGYWN0b3IgPSAyOworICAgIGludCBsZW5ndGggPSBtX3JlYWxE
YXRhLnNpemUoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CisgICAg
ICAgIG1fcmVhbERhdGFbaV0gPSBtX3JlYWxEYXRhW2ldICogc2NhbGVGYWN0b3I7CisgICAgICAg
IG1faW1hZ0RhdGFbaV0gPSBtX2ltYWdEYXRhW2ldICogc2NhbGVGYWN0b3I7CisgICAgfQorCisg
ICAgLy8gTW92ZSB0aGUgTnlxdWlzdCBjb21wb25lbnQgdG8gdGhlIGxvY2F0aW9uIGV4cGVjdGVk
IGJ5IHRoZQorICAgIC8vIEZGVEZyYW1lIEFQSS4KKyAgICBtX2ltYWdEYXRhWzBdID0gbV9yZWFs
RGF0YVtsZW5ndGggLSAxXTsKK30KKwordm9pZCBGRlRGcmFtZTo6ZG9JbnZlcnNlRkZUKGZsb2F0
KiBkYXRhKQoreworICAgIC8vIE1vdmUgdGhlIE55cXVpc3QgY29tcG9uZW50IHRvIHRoZSBsb2Nh
dGlvbiBleHBlY3RlZCBieSBGRlRXLgorICAgIGludCBsZW5ndGggPSBtX3JlYWxEYXRhLnNpemUo
KTsKKyAgICBtX3JlYWxEYXRhW2xlbmd0aCAtIDFdID0gbV9pbWFnRGF0YVswXTsKKyAgICBtX2lt
YWdEYXRhWzBdID0gMDsKKworICAgIGZmdHdmX2V4ZWN1dGVfc3BsaXRfZGZ0X2MycihtX2JhY2t3
YXJkUGxhbiwgcmVhbERhdGEoKSwgaW1hZ0RhdGEoKSwgZGF0YSk7CisKKyAgICAvLyBSZXN0b3Jl
IHRoZSBvcmlnaW5hbCBzY2FsaW5nIG9mIHRoZSB0aW1lIGRvbWFpbiBkYXRhLgorICAgIC8vIEZJ
WE1FOiBpZiB3ZSBjaGFuZ2UgdGhlIGRlZmluaXRpb24gb2YgRkZURnJhbWUgdG8gZWxpbWluYXRl
IHRoZQorICAgIC8vIHNjYWxlIGZhY3RvciB0aGVuIHRoaXMgY29kZSB3aWxsIG5lZWQgdG8gY2hh
bmdlLiBBbHNvLCBpZiB0aGlzCisgICAgLy8gbG9vcCB0dXJucyBvdXQgdG8gYmUgaG90IHRoZW4g
d2Ugc2hvdWxkIHVzZSBTU0Ugb3Igb3RoZXIKKyAgICAvLyBpbnRyaW5zaWNzIHRvIGFjY2VsZXJh
dGUgaXQuCisgICAgZmxvYXQgc2NhbGVGYWN0b3IgPSAxLjAgLyAoMi4wICogZmZ0U2l6ZSgpKTsK
KyAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKQorICAgICAgICBkYXRhW2ldICo9
IHNjYWxlRmFjdG9yOworCisgICAgLy8gTW92ZSB0aGUgTnlxdWlzdCBjb21wb25lbnQgYmFjayB0
byB0aGUgbG9jYXRpb24gZXhwZWN0ZWQgYnkgdGhlCisgICAgLy8gRkZURnJhbWUgQVBJLgorICAg
IG1faW1hZ0RhdGFbMF0gPSBtX3JlYWxEYXRhW2xlbmd0aCAtIDFdOworfQorCit2b2lkIEZGVEZy
YW1lOjpjbGVhbnVwKCkKK3sKKyAgICBpZiAoIWZmdHdGb3J3YXJkUGxhbnMpCisgICAgICAgIHJl
dHVybjsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwga01heEZGVFBvdzJTaXplOyArK2kpIHsK
KyAgICAgICAgaWYgKGZmdHdGb3J3YXJkUGxhbnNbaV0pCisgICAgICAgICAgICBmZnR3Zl9kZXN0
cm95X3BsYW4oZmZ0d0ZvcndhcmRQbGFuc1tpXSk7CisgICAgICAgIGlmIChmZnR3QmFja3dhcmRQ
bGFuc1tpXSkKKyAgICAgICAgICAgIGZmdHdmX2Rlc3Ryb3lfcGxhbihmZnR3QmFja3dhcmRQbGFu
c1tpXSk7CisgICAgfQorCisgICAgZGVsZXRlW10gZmZ0d0ZvcndhcmRQbGFuczsKKyAgICBkZWxl
dGVbXSBmZnR3QmFja3dhcmRQbGFuczsKKworICAgIGZmdHdGb3J3YXJkUGxhbnMgPSAwOworICAg
IGZmdHdCYWNrd2FyZFBsYW5zID0gMDsKK30KKworZmxvYXQqIEZGVEZyYW1lOjpyZWFsRGF0YSgp
IGNvbnN0Cit7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8ZmxvYXQqPihtX3JlYWxEYXRhLmRhdGEo
KSk7Cit9CisKK2Zsb2F0KiBGRlRGcmFtZTo6aW1hZ0RhdGEoKSBjb25zdAoreworICAgIHJldHVy
biBjb25zdF9jYXN0PGZsb2F0Kj4obV9pbWFnRGF0YS5kYXRhKCkpOworfQorCitmZnR3Zl9wbGFu
IEZGVEZyYW1lOjpmZnR3UGxhbkZvclNpemUodW5zaWduZWQgZmZ0U2l6ZSwgRGlyZWN0aW9uIGRp
cmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogZGF0
YTEsIGZsb2F0KiBkYXRhMiwgZmxvYXQqIGRhdGEzKQoreworICAgIGlmICghZmZ0d0ZvcndhcmRQ
bGFucykgeworICAgICAgICBmZnR3Rm9yd2FyZFBsYW5zID0gbmV3IGZmdHdmX3BsYW5ba01heEZG
VFBvdzJTaXplXTsKKyAgICAgICAgZmZ0d0JhY2t3YXJkUGxhbnMgPSBuZXcgZmZ0d2ZfcGxhbltr
TWF4RkZUUG93MlNpemVdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGtNYXhGRlRQb3cy
U2l6ZTsgKytpKSB7CisgICAgICAgICAgICBmZnR3Rm9yd2FyZFBsYW5zW2ldID0gMDsKKyAgICAg
ICAgICAgIGZmdHdCYWNrd2FyZFBsYW5zW2ldID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAg
IEFTU0VSVChmZnRTaXplKTsKKyAgICBpbnQgcG93MnNpemUgPSBzdGF0aWNfY2FzdDxpbnQ+KGxv
ZzIoZmZ0U2l6ZSkpOworICAgIEFTU0VSVChwb3cyc2l6ZSA8IGtNYXhGRlRQb3cyU2l6ZSk7Cisg
ICAgZmZ0d2ZfcGxhbiogcGxhbnMgPSAoZGlyZWN0aW9uID09IEZvcndhcmQpID8gZmZ0d0Zvcndh
cmRQbGFucyA6IGZmdHdCYWNrd2FyZFBsYW5zOworICAgIGlmICghcGxhbnNbcG93MnNpemVdKSB7
CisgICAgICAgIGZmdHdmX2lvZGltIGRpbWVuc2lvbjsKKyAgICAgICAgZGltZW5zaW9uLm4gPSBm
ZnRTaXplOworICAgICAgICBkaW1lbnNpb24uaXMgPSAxOworICAgICAgICBkaW1lbnNpb24ub3Mg
PSAxOworCisgICAgICAgIC8vIEZvciB0aGUgdGltZSBiZWluZywgd2UgZG8gbm90IHRha2UgdGhl
IGlucHV0IGRhdGEgaW50bworICAgICAgICAvLyBhY2NvdW50IHdoZW4gY2hvb3NpbmcgYSBwbGFu
LCBzbyB0aGF0IHdlIGNhbiBtb3N0IGVhc2lseQorICAgICAgICAvLyByZXVzZSBwbGFucyB3aXRo
IGRpZmZlcmVudCBpbnB1dCBkYXRhLgorICAgICAgICB1bnNpZ25lZCBmbGFncyA9IEZGVFdfRVNU
SU1BVEUgfCBGRlRXX1BSRVNFUlZFX0lOUFVUIHwgRkZUV19VTkFMSUdORUQ7CisgICAgICAgIHN3
aXRjaCAoZGlyZWN0aW9uKSB7CisgICAgICAgIGNhc2UgRm9yd2FyZDoKKyAgICAgICAgICAgIHBs
YW5zW3BvdzJzaXplXSA9IGZmdHdmX3BsYW5fZ3VydV9zcGxpdF9kZnRfcjJjKDEsICZkaW1lbnNp
b24sIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBkYXRhMSwgZGF0YTIsIGRhdGEzLAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgIGNhc2UgQmFja3dhcmQ6CisgICAgICAgICAgICBwbGFuc1twb3cy
c2l6ZV0gPSBmZnR3Zl9wbGFuX2d1cnVfc3BsaXRfZGZ0X2MycigxLCAmZGltZW5zaW9uLCAwLCAw
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgZGF0YTEsIGRhdGEyLCBkYXRhMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICAgICAgICAgIGJyZWFr
OworICAgICAgICB9CisgICAgfQorICAgIEFTU0VSVChwbGFuc1twb3cyc2l6ZV0pOworICAgIHJl
dHVybiBwbGFuc1twb3cyc2l6ZV07Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2Vu
ZGlmIC8vIEVOQUJMRShXRUJfQVVESU8pCg==
</data>
<flag name="review"
          id="71347"
          type_id="1"
          status="+"
          setter="jamesr"
    />
    <flag name="commit-queue"
          id="71348"
          type_id="3"
          status="-"
          setter="kbr"
    />
          </attachment>
      

    </bug>

</bugzilla>