<?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>50986</bug_id>
          
          <creation_ts>2010-12-13 15:16:10 -0800</creation_ts>
          <short_desc>Web Audio API: port FFTFrame to MKL</short_desc>
          <delta_ts>2010-12-15 15:12:29 -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>crogers</cc>
    
    <cc>dglazkov</cc>
    
    <cc>jamesr</cc>
    
    <cc>levin</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>321479</commentid>
    <comment_count>0</comment_count>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2010-12-13 15:16:10 -0800</bug_when>
    <thetext>For the Windows and Linux ports of the Web Audio API, a port of the FFTFrame class to Intel&apos;s Math Kernel Library is needed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>321504</commentid>
    <comment_count>1</comment_count>
      <attachid>76457</attachid>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2010-12-13 15:43:29 -0800</bug_when>
    <thetext>Created attachment 76457
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>321509</commentid>
    <comment_count>2</comment_count>
      <attachid>76457</attachid>
    <who name="James Robinson">jamesr</who>
    <bug_when>2010-12-13 15:49:44 -0800</bug_when>
    <thetext>Comment on attachment 76457
Patch

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

How can we tell if this math is right?

&gt; JavaScriptCore/wtf/MathExtras.h:149
&gt; -inline bool log2(double num)
&gt; +inline double log2(double num)

Woah

&gt; WebCore/platform/audio/FFTFrame.h:38
&gt; +#if !OS(DARWIN) &amp;&amp; USE(WEBAUDIO_MKL)

The OS(DARWIN) things seems redundant, shouldn&apos;t ports simply not define WEBAUDIO_MKL on platforms that do not have it?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>321518</commentid>
    <comment_count>3</comment_count>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2010-12-13 16:00:35 -0800</bug_when>
    <thetext>(In reply to comment #2)
&gt; (From update of attachment 76457 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=76457&amp;action=review
&gt; 
&gt; How can we tell if this math is right?

Right now it&apos;s difficult to check in any unit test for this code. I&apos;ve verified by hand with a unit test from Chris Rogers, which prints its output to stdout, that the three main routines are working correctly.

&gt; &gt; JavaScriptCore/wtf/MathExtras.h:149
&gt; &gt; -inline bool log2(double num)
&gt; &gt; +inline double log2(double num)
&gt; 
&gt; Woah

Yeah, I added that function for the Windows port of the Web Audio stuff and obviously didn&apos;t test it. This patch has verified that this fix works.

&gt; &gt; WebCore/platform/audio/FFTFrame.h:38
&gt; &gt; +#if !OS(DARWIN) &amp;&amp; USE(WEBAUDIO_MKL)
&gt; 
&gt; The OS(DARWIN) things seems redundant, shouldn&apos;t ports simply not define WEBAUDIO_MKL on platforms that do not have it?

I spent a lot of time wrestling with GYP to conditionally define WTF_USE_WEBAUDIO_MKL in features_override.gypi and test its presence in feature_defines in WebCore.gyp, but it didn&apos;t work. I&apos;ll have to ask for help from a GYP expert to figure out why not. For the time being the conditional guard works and allows us to make forward progress on the Windows port.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>321550</commentid>
    <comment_count>4</comment_count>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-12-13 16:53:03 -0800</bug_when>
    <thetext>Ken, thanks for the patch!  It looks very good except for a few comments.  It&apos;s unfortunate that we need the getUpToDateComplexData() method, but it&apos;s more important to get a reasonable working version before we spend too much time with further optimizations.  Thanks for running the unit tests I sent, they should provide a high level of confidence that the code is correct.

&gt; WebCore/platform/audio/FFTFrame.h:103
&gt; +    float* getUpToDateComplexData();

Could you please add a comment explaining what this method does.  Also, although you have FIXMEs elsewhere related to this, could you please add one here describing that we&apos;d like to eventually remove this if we can find a way in MKL to work in the planar format.

&gt; WebCore/platform/audio/mkl/FFTFrameMKL.cpp:57
&gt; +    // Set the forward scale factor to 2 to match Accelerate.framework&apos;s.

Please add a FIXME explaining that FFTFrameMac&apos;s scaling factor of 2.0 can be fixed to be 1.0 (and this implementation as well).
In the future, this will be cleaner and more correct.  But also note that this change can only occur if all clients of FFTFrame are
adjusted to account for the scaling difference.

&gt; WebCore/platform/audio/mkl/FFTFrameMKL.cpp:62
&gt; +    double scale = 1.0 / (2.0 * fftSize);

FIXME that this scaling factor also needs to be adjusted if the FIXME above is made.

&gt; WebCore/platform/audio/mkl/FFTFrameMKL.cpp:139
&gt; +    float scale = 0.5f;

FIXME: that this will be 1.0f if the FIXME about scaling factor (above) from 2.0 -&gt; 1.0 is made.

&gt; WebCore/platform/audio/mkl/FFTFrameMKL.cpp:158
&gt; +    // FIXME: find an MKL routine to do at least the scaling more efficiently.

I would not use the word &quot;unpack&quot;, but would favor &quot;de-interleave&quot;, &quot;split&quot;, or &quot;make planar&quot;, since &quot;packed&quot; format has a special meaning related to DC/nyquist components in FFT terminology.

&gt; WebCore/platform/audio/mkl/FFTFrameMKL.cpp:172
&gt; +    // Unpack to separate real and complex arrays. FIXME: figure out

Same comment about &quot;unpack&quot; as above.

&gt; WebCore/platform/audio/mkl/FFTFrameMKL.cpp:178
&gt; +        m_realData[i] = m_complexData[baseComplexIndex];

Maybe a comment here about m_realData[0] being DC component and m_imagData[0] being nyquist component since it is &quot;packed&quot;

&gt; WebCore/platform/audio/mkl/FFTFrameMKL.cpp:224
&gt; +    for (int i = 0; i &lt; len; ++i) {

Ideally, this method can be removed if we can figure out how to use MKL with planar data.  But if we must keep it, since this gets called a lot, a FIXME might be good indicating that SSE optimization can be considered if profiling shows this as a hot-spot.

&gt; WebCore/platform/audio/mkl/FFTFrameMKL.cpp:240
&gt; +    int pow2size = static_cast&lt;int&gt;(log2(fftSize));

Maybe an ASSERT(fftSize) before the call to log2()</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>321664</commentid>
    <comment_count>5</comment_count>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2010-12-13 21:19:22 -0800</bug_when>
    <thetext>(In reply to comment #4)
&gt; Ken, thanks for the patch!  It looks very good except for a few comments.  It&apos;s unfortunate that we need the getUpToDateComplexData() method, but it&apos;s more important to get a reasonable working version before we spend too much time with further optimizations.  Thanks for running the unit tests I sent, they should provide a high level of confidence that the code is correct.

Thanks for your review. Revised patch to follow.

&gt; &gt; WebCore/platform/audio/FFTFrame.h:103
&gt; &gt; +    float* getUpToDateComplexData();
&gt; 
&gt; Could you please add a comment explaining what this method does.  Also, although you have FIXMEs elsewhere related to this, could you please add one here describing that we&apos;d like to eventually remove this if we can find a way in MKL to work in the planar format.

Done.

&gt; &gt; WebCore/platform/audio/mkl/FFTFrameMKL.cpp:57
&gt; &gt; +    // Set the forward scale factor to 2 to match Accelerate.framework&apos;s.
&gt; 
&gt; Please add a FIXME explaining that FFTFrameMac&apos;s scaling factor of 2.0 can be fixed to be 1.0 (and this implementation as well).
&gt; In the future, this will be cleaner and more correct.  But also note that this change can only occur if all clients of FFTFrame are
&gt; adjusted to account for the scaling difference.

Done.

&gt; &gt; WebCore/platform/audio/mkl/FFTFrameMKL.cpp:62
&gt; &gt; +    double scale = 1.0 / (2.0 * fftSize);
&gt; 
&gt; FIXME that this scaling factor also needs to be adjusted if the FIXME above is made.

Done.

&gt; &gt; WebCore/platform/audio/mkl/FFTFrameMKL.cpp:139
&gt; &gt; +    float scale = 0.5f;
&gt; 
&gt; FIXME: that this will be 1.0f if the FIXME about scaling factor (above) from 2.0 -&gt; 1.0 is made.

Done.

&gt; &gt; WebCore/platform/audio/mkl/FFTFrameMKL.cpp:158
&gt; &gt; +    // FIXME: find an MKL routine to do at least the scaling more efficiently.
&gt; 
&gt; I would not use the word &quot;unpack&quot;, but would favor &quot;de-interleave&quot;, &quot;split&quot;, or &quot;make planar&quot;, since &quot;packed&quot; format has a special meaning related to DC/nyquist components in FFT terminology.

Done.

&gt; &gt; WebCore/platform/audio/mkl/FFTFrameMKL.cpp:172
&gt; &gt; +    // Unpack to separate real and complex arrays. FIXME: figure out
&gt; 
&gt; Same comment about &quot;unpack&quot; as above.

Done.

&gt; &gt; WebCore/platform/audio/mkl/FFTFrameMKL.cpp:178
&gt; &gt; +        m_realData[i] = m_complexData[baseComplexIndex];
&gt; 
&gt; Maybe a comment here about m_realData[0] being DC component and m_imagData[0] being nyquist component since it is &quot;packed&quot;

Done.

&gt; &gt; WebCore/platform/audio/mkl/FFTFrameMKL.cpp:224
&gt; &gt; +    for (int i = 0; i &lt; len; ++i) {
&gt; 
&gt; Ideally, this method can be removed if we can figure out how to use MKL with planar data.  But if we must keep it, since this gets called a lot, a FIXME might be good indicating that SSE optimization can be considered if profiling shows this as a hot-spot.

Done.

&gt; &gt; WebCore/platform/audio/mkl/FFTFrameMKL.cpp:240
&gt; &gt; +    int pow2size = static_cast&lt;int&gt;(log2(fftSize));
&gt; 
&gt; Maybe an ASSERT(fftSize) before the call to log2()

Done.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>321667</commentid>
    <comment_count>6</comment_count>
      <attachid>76494</attachid>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2010-12-13 21:20:51 -0800</bug_when>
    <thetext>Created attachment 76494
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>322444</commentid>
    <comment_count>7</comment_count>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-12-14 19:04:19 -0800</bug_when>
    <thetext>Ken, thanks for the changes.  LGTM</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>322741</commentid>
    <comment_count>8</comment_count>
      <attachid>76494</attachid>
    <who name="James Robinson">jamesr</who>
    <bug_when>2010-12-15 12:13:36 -0800</bug_when>
    <thetext>Comment on attachment 76494
Patch

OK</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>322838</commentid>
    <comment_count>9</comment_count>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2010-12-15 15:12:29 -0800</bug_when>
    <thetext>Committed r74147: &lt;http://trac.webkit.org/changeset/74147&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>76457</attachid>
            <date>2010-12-13 15:43:29 -0800</date>
            <delta_ts>2010-12-13 21:20:47 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-50986-20101213154328.patch</filename>
            <type>text/plain</type>
            <size>16180</size>
            <attacher name="Kenneth Russell">kbr</attacher>
            
              <data encoding="base64">SW5kZXg6IEphdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDczOTc2KQorKysgSmF2YVNjcmlwdENvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTYgQEAKKzIwMTAtMTItMTMgIEtlbm5ldGgg
UnVzc2VsbCAgPGtickBnb29nbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAo
T09QUyEpLgorCisgICAgICAgIFdlYiBBdWRpbyBBUEk6IHBvcnQgRkZURnJhbWUgdG8gTUtMCisg
ICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD01MDk4NgorCisg
ICAgICAgIEZpeGVkIGJ1ZyBpbiBsb2cyIGVtdWxhdGlvbiBmdW5jdGlvbiBwcm92aWRlZCBmb3Ig
V2luZG93cyBwb3J0IG9mCisgICAgICAgIFdlYiBBdWRpbyBBUEkuCisKKyAgICAgICAgKiB3dGYv
TWF0aEV4dHJhcy5oOgorICAgICAgICAobG9nMik6CisKIDIwMTAtMTItMTMgIFN0ZXZlIEZhbGtl
bmJ1cmcgIDxzZmFsa2VuQGFwcGxlLmNvbT4KIAogICAgICAgICBXaW5kb3dzIHByb2R1Y3Rpb24g
YnVpbGQgZml4LgpJbmRleDogSmF2YVNjcmlwdENvcmUvd3RmL01hdGhFeHRyYXMuaAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS93dGYvTWF0aEV4dHJhcy5oCShyZXZpc2lvbiA3Mzk3NikK
KysrIEphdmFTY3JpcHRDb3JlL3d0Zi9NYXRoRXh0cmFzLmgJKHdvcmtpbmcgY29weSkKQEAgLTE0
Niw3ICsxNDYsNyBAQCBpbmxpbmUgZG91YmxlIGNvcHlzaWduKGRvdWJsZSB4LCBkb3VibGUgCiBp
bmxpbmUgaW50IGlzZmluaXRlKGRvdWJsZSB4KSB7IHJldHVybiBfZmluaXRlKHgpOyB9CiAKIC8v
IE1TVkMncyBtYXRoLmggZG9lcyBub3QgY3VycmVudGx5IHN1cHBseSBsb2cyLgotaW5saW5lIGJv
b2wgbG9nMihkb3VibGUgbnVtKQoraW5saW5lIGRvdWJsZSBsb2cyKGRvdWJsZSBudW0pCiB7CiAg
ICAgLy8gVGhpcyBjb25zdGFudCBpcyByb3VnaGx5IE1fTE4yLCB3aGljaCBpcyBub3QgcHJvdmlk
ZWQgYnkgZGVmYXVsdCBvbiBXaW5kb3dzLgogICAgIHJldHVybiBsb2cobnVtKSAvIDAuNjkzMTQ3
MTgwNTU5OTQ1MzA5NDE3MjMyMTIxNDU4MTc2NTY4OwpJbmRleDogV2ViQ29yZS9DaGFuZ2VMb2cK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gV2ViQ29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDczOTc2KQorKysgV2Vi
Q29yZS9DaGFuZ2VMb2cJKHdvcmtpbmcgY29weSkKQEAgLTEsMyArMSwzMiBAQAorMjAxMC0xMi0x
MyAgS2VubmV0aCBSdXNzZWxsICA8a2JyQGdvb2dsZS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQg
YnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgV2ViIEF1ZGlvIEFQSTogcG9ydCBGRlRGcmFt
ZSB0byBNS0wKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lk
PTUwOTg2CisKKyAgICAgICAgUG9ydGVkIEZGVEZyYW1lIHRvIEludGVsJ3MgTUtMLiBUaGlzIHBh
dGNoIGNvbnRhaW5zIHRoZSBwb3J0IGFuZAorICAgICAgICBpbml0aWFsLCB0aG91Z2ggbm90IGNv
bXBsZXRlLCBidWlsZCBzeXN0ZW0gY2hhbmdlcy4gVGVzdGVkIHNvIGZhcgorICAgICAgICB3aXRo
IGEgdW5pdCB0ZXN0IGJ5IENocmlzIFJvZ2VycyAod2hpY2ggcmVxdWlyZXMgY29kZSBjaGFuZ2Vz
IHRvCisgICAgICAgIEF1ZGlvQ29udGV4dC5jcHAgYW5kIGlzIG5vdCBiZWluZyBjaGVja2VkIGlu
KS4gRnVydGhlciB0ZXN0aW5nIHRvCisgICAgICAgIGZvbGxvdyBvbmNlIGxheW91dCB0ZXN0cyBh
cmUgYXZhaWxhYmxlIGZvciB0aGUgV2ViIEF1ZGlvIEFQSS4KKworICAgICAgICAqIFdlYkNvcmUu
Z3lwL1dlYkNvcmUuZ3lwOgorICAgICAgICAqIFdlYkNvcmUuZ3lwaToKKyAgICAgICAgKiBwbGF0
Zm9ybS9hdWRpby9GRlRGcmFtZS5oOgorICAgICAgICAqIHBsYXRmb3JtL2F1ZGlvL21rbDogQWRk
ZWQuCisgICAgICAgICogcGxhdGZvcm0vYXVkaW8vbWtsL0ZGVEZyYW1lTUtMLmNwcDogQWRkZWQu
CisgICAgICAgIChXZWJDb3JlOjpGRlRGcmFtZTo6RkZURnJhbWUpOgorICAgICAgICAoV2ViQ29y
ZTo6RkZURnJhbWU6On5GRlRGcmFtZSk6CisgICAgICAgIChXZWJDb3JlOjpGRlRGcmFtZTo6bXVs
dGlwbHkpOgorICAgICAgICAoV2ViQ29yZTo6RkZURnJhbWU6OmRvRkZUKToKKyAgICAgICAgKFdl
YkNvcmU6OkZGVEZyYW1lOjpkb0ludmVyc2VGRlQpOgorICAgICAgICAoV2ViQ29yZTo6RkZURnJh
bWU6OmNsZWFudXApOgorICAgICAgICAoV2ViQ29yZTo6RkZURnJhbWU6OnJlYWxEYXRhKToKKyAg
ICAgICAgKFdlYkNvcmU6OkZGVEZyYW1lOjppbWFnRGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpG
RlRGcmFtZTo6Z2V0VXBUb0RhdGVDb21wbGV4RGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpGRlRG
cmFtZTo6ZGVzY3JpcHRvckhhbmRsZUZvclNpemUpOgorCiAyMDEwLTEyLTEzICBKb29uZSBIdXIg
IDxqb29uZUBrbGRwLm9yZz4KIAogICAgICAgICBSZXZpZXdlZCBieSBFcmljIFNlaWRlbC4KSW5k
ZXg6IFdlYkNvcmUvV2ViQ29yZS5neXBpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvV2ViQ29yZS5n
eXBpCShyZXZpc2lvbiA3Mzk3MykKKysrIFdlYkNvcmUvV2ViQ29yZS5neXBpCSh3b3JraW5nIGNv
cHkpCkBAIC0yNDM2LDYgKzI0MzYsNyBAQAogICAgICAgICAgICAgJ3BsYXRmb3JtL2F1ZGlvL21h
Yy9BdWRpb0Rlc3RpbmF0aW9uTWFjLmNwcCcsCiAgICAgICAgICAgICAncGxhdGZvcm0vYXVkaW8v
bWFjL0F1ZGlvRmlsZVJlYWRlck1hYy5jcHAnLAogICAgICAgICAgICAgJ3BsYXRmb3JtL2F1ZGlv
L21hYy9GRlRGcmFtZU1hYy5jcHAnLAorICAgICAgICAgICAgJ3BsYXRmb3JtL2F1ZGlvL21rbC9G
RlRGcmFtZU1LTC5jcHAnLAogICAgICAgICAgICAgJ3BsYXRmb3JtL2FuaW1hdGlvbi9BbmltYXRp
b24uY3BwJywKICAgICAgICAgICAgICdwbGF0Zm9ybS9hbmltYXRpb24vQW5pbWF0aW9uLmgnLAog
ICAgICAgICAgICAgJ3BsYXRmb3JtL2FuaW1hdGlvbi9BbmltYXRpb25MaXN0LmNwcCcsCkluZGV4
OiBXZWJDb3JlL1dlYkNvcmUuZ3lwL1dlYkNvcmUuZ3lwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUv
V2ViQ29yZS5neXAvV2ViQ29yZS5neXAJKHJldmlzaW9uIDczOTczKQorKysgV2ViQ29yZS9XZWJD
b3JlLmd5cC9XZWJDb3JlLmd5cAkod29ya2luZyBjb3B5KQpAQCAtODI1LDYgKzgyNSwxMyBAQAog
ICAgICAgICAgICAgJ2luY2x1ZGVfZGlycysrKyc6IFsnLi4vZG9tJ10sCiAgICAgICAgICAgfSwK
ICAgICAgICAgfV0sCisgICAgICAgICMgRklYTUU6IChrYnIpIGlkZWFsbHkgdGhpcyB0YXJnZXQg
c2hvdWxkIGp1c3QgZGVwZW5kIG9uIHdlYmNvcmVfcHJlcmVxdWlzaXRlcworICAgICAgICAjIHRv
IHBpY2sgdXAgdGhpcyBpbmNsdWRlIGRpcmVjdG9yeSwgYnV0IEknbSBuZXJ2b3VzIGFib3V0IG1h
a2luZyB0aGF0IGNoYW5nZS4KKyAgICAgICAgWycoT1M9PSJsaW51eCIgb3IgT1M9PSJ3aW4iKSBh
bmQgIldURl9VU0VfV0VCQVVESU9fTUtMPTEiIGluIGZlYXR1cmVfZGVmaW5lcycsIHsKKyAgICAg
ICAgICAnaW5jbHVkZV9kaXJzJzogWworICAgICAgICAgICAgJzwoY2hyb21pdW1fc3JjX2Rpcikv
dGhpcmRfcGFydHkvbWtsL2luY2x1ZGUnLAorICAgICAgICAgIF0sCisgICAgICAgIH1dLAogICAg
ICAgXSwKICAgICB9LAogICAgIHsKQEAgLTk5Myw2ICsxMDAwLDE0IEBACiAgICAgICAgICAgIyBi
eSBhIHN5c3RlbSBoZWFkZXIgb24gd2luZG93cy4KICAgICAgICAgICAnaW5jbHVkZV9kaXJzKysn
OiBbJy4uL2RvbSddLAogICAgICAgICB9XSwKKyAgICAgICAgWycoT1M9PSJsaW51eCIgb3IgT1M9
PSJ3aW4iKSBhbmQgIldURl9VU0VfV0VCQVVESU9fTUtMPTEiIGluIGZlYXR1cmVfZGVmaW5lcycs
IHsKKyAgICAgICAgICAjIFRoaXMgZGlyZWN0b3J5IG5lZWRzIHRvIGJlIG9uIHRoZSBpbmNsdWRl
IHBhdGggZm9yIG11bHRpcGxlIHN1Yi10YXJnZXRzIG9mIHdlYmNvcmUuCisgICAgICAgICAgJ2Rp
cmVjdF9kZXBlbmRlbnRfc2V0dGluZ3MnOiB7CisgICAgICAgICAgICAnaW5jbHVkZV9kaXJzJzog
WworICAgICAgICAgICAgICAnPChjaHJvbWl1bV9zcmNfZGlyKS90aGlyZF9wYXJ0eS9ta2wvaW5j
bHVkZScsCisgICAgICAgICAgICBdLAorICAgICAgICAgIH0sCisgICAgICAgIH1dLAogICAgICAg
XSwKICAgICB9LAogICAgIHsKQEAgLTEwNTUsNyArMTA3MCw3IEBACiAgICAgICAgICMgRXhjbHVk
ZSB0aGluZ3MgdGhhdCBkb24ndCBhcHBseSB0byB0aGUgQ2hyb21pdW0gcGxhdGZvcm0gb24gdGhl
IGJhc2lzCiAgICAgICAgICMgb2YgdGhlaXIgZW5jbG9zaW5nIGRpcmVjdG9yaWVzIGFuZCB0YWdz
IGF0IHRoZSBlbmRzIG9mIHRoZWlyCiAgICAgICAgICMgZmlsZW5hbWVzLgotICAgICAgICBbJ2V4
Y2x1ZGUnLCAnKGFuZHJvaWR8Y2Fpcm98Y2Z8Y2d8Y3VybHxndGt8aGFpa3V8bGludXh8bWFjfG9w
ZW50eXBlfHBvc2l4fHF0fHNvdXB8c3ZnfHN5bWJpYW58d2lufHd4KS8nXSwKKyAgICAgICAgWydl
eGNsdWRlJywgJyhhbmRyb2lkfGNhaXJvfGNmfGNnfGN1cmx8Z3RrfGhhaWt1fGxpbnV4fG1hY3xt
a2x8b3BlbnR5cGV8cG9zaXh8cXR8c291cHxzdmd8c3ltYmlhbnx3aW58d3gpLyddLAogICAgICAg
ICBbJ2V4Y2x1ZGUnLCAnKD88IUNocm9taXVtKShBbmRyb2lkfENhaXJvfENGfENHfEN1cmx8R3Rr
fExpbnV4fE1hY3xPcGVuVHlwZXxQT1NJWHxQb3NpeHxRdHxTYWZhcml8U291cHxTeW1iaWFufFdp
bnxXeClcXC4oY3BwfG1tPykkJ10sCiAKICAgICAgICAgIyBBIGZldyB0aGluZ3MgY2FuJ3QgYmUg
ZXhjbHVkZWQgYnkgcGF0dGVybnMuICBMaXN0IHRoZW0gaW5kaXZpZHVhbGx5LgpAQCAtMTIyMyw2
ICsxMjM4LDExIEBACiAgICAgICAgICAgICBbJ2V4Y2x1ZGUnLCAnL0dlb2xvY2F0aW9uU2Vydmlj
ZS4qJCddLAogICAgICAgICAgIF0sCiAgICAgICAgIH1dLAorICAgICAgICBbJyhPUz09ImxpbnV4
IiBvciBPUz09IndpbiIpIGFuZCAiV1RGX1VTRV9XRUJBVURJT19NS0w9MSIgaW4gZmVhdHVyZV9k
ZWZpbmVzJywgeworICAgICAgICAgICdzb3VyY2VzLyc6IFsKKyAgICAgICAgICAgIFsnaW5jbHVk
ZScsICdwbGF0Zm9ybS9hdWRpby9ta2wvRkZURnJhbWVNS0xcXC5jcHAkJ10sCisgICAgICAgICAg
XSwKKyAgICAgICAgfV0sCiAgICAgICBdLAogICAgIH0sCiAgICAgewpAQCAtMTQzNCw2ICsxNDU0
LDI5IEBACiAgICAgICAgICAgICAnaW5jbHVkZV9kaXJzKysrJzogWycuLi9kb20nXSwKICAgICAg
ICAgICB9LAogICAgICAgICB9XSwKKyAgICAgICAgWydPUz09IndpbiIgYW5kICJXVEZfVVNFX1dF
QkFVRElPX01LTD0xIiBpbiBmZWF0dXJlX2RlZmluZXMnLCB7CisgICAgICAgICAgIyBGSVhNRTog
KGticikgZmlndXJlIG91dCBob3cgdG8gbWFrZSB0aGVzZSBkZXBlbmRlbmNpZXMKKyAgICAgICAg
ICAjIHdvcmsgaW4gYSBjcm9zcy1wbGF0Zm9ybSB3YXkuIEF0dGVtcHRzIHRvIHVzZQorICAgICAg
ICAgICMgImxpbmtfc2V0dGluZ3MiIGFuZCAibGlicmFyaWVzIiBpbiBjb25qdW5jdGlvbiB3aXRo
IHRoZQorICAgICAgICAgICMgbXN2cy1zcGVjaWZpYyBzZXR0aW5ncyBkaWRuJ3Qgd29yayBzbyBm
YXIuCisgICAgICAgICAgJ2FsbF9kZXBlbmRlbnRfc2V0dGluZ3MnOiB7CisgICAgICAgICAgICAn
bXN2c19zZXR0aW5ncyc6IHsKKyAgICAgICAgICAgICAgJ1ZDTGlua2VyVG9vbCc6IHsKKyAgICAg
ICAgICAgICAgICAnQWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcyc6IFsKKyAgICAgICAgICAg
ICAgICAgICMgVGhpcyBpcyBhIGhhY2sgdG8gbWFrZSB0aGlzIGRpcmVjdG9yeSBjb3JyZWN0Cisg
ICAgICAgICAgICAgICAgICAjIHJlbGF0aXZlIHRvIHRhcmdldHMgbGlrZSBjaHJvbWVfZGxsLiBT
aG91bGQgdXNlCisgICAgICAgICAgICAgICAgICAjIDwoY2hyb21pdW1fc3JjX2RpcikuCisgICAg
ICAgICAgICAgICAgICAnLi4vdGhpcmRfcGFydHkvbWtsL2xpYi93aW4vaWEzMicsCisgICAgICAg
ICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICAnQWRkaXRpb25hbERlcGVuZGVuY2llcyc6IFsK
KyAgICAgICAgICAgICAgICAgICdta2xfaW50ZWxfYy5saWInLAorICAgICAgICAgICAgICAgICAg
J21rbF9zZXF1ZW50aWFsLmxpYicsCisgICAgICAgICAgICAgICAgICAnbWtsX2NvcmUubGliJywK
KyAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgfSwKKyAg
ICAgICAgICB9LAorICAgICAgICB9XSwKICAgICAgICAgWydlbmFibGVfc3ZnIT0wJywgewogICAg
ICAgICAgICdkZXBlbmRlbmNpZXMnOiBbCiAgICAgICAgICAgICAnd2ViY29yZV9zdmcnLApJbmRl
eDogV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9GRlRGcmFtZS5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNv
cmUvcGxhdGZvcm0vYXVkaW8vRkZURnJhbWUuaAkocmV2aXNpb24gNzM5NzMpCisrKyBXZWJDb3Jl
L3BsYXRmb3JtL2F1ZGlvL0ZGVEZyYW1lLmgJKHdvcmtpbmcgY29weSkKQEAgLTM1LDYgKzM1LDEw
IEBACiAjaW5jbHVkZSA8QWNjZWxlcmF0ZS9BY2NlbGVyYXRlLmg+CiAjZW5kaWYKIAorI2lmICFP
UyhEQVJXSU4pICYmIFVTRShXRUJBVURJT19NS0wpCisjaW5jbHVkZSAibWtsX2RmdGkuaCIKKyNl
bmRpZgorCiAjaW5jbHVkZSA8d3RmL1Bhc3NPd25QdHIuaD4KICNpbmNsdWRlIDx3dGYvUGxhdGZv
cm0uaD4KIApAQCAtOTUsNiArOTksMTggQEAgcHJpdmF0ZToKICAgICBBdWRpb0Zsb2F0QXJyYXkg
bV9yZWFsRGF0YTsKICAgICBBdWRpb0Zsb2F0QXJyYXkgbV9pbWFnRGF0YTsKICNlbmRpZiAvLyBP
UyhEQVJXSU4pCisjaWYgIU9TKERBUldJTikgJiYgVVNFKFdFQkFVRElPX01LTCkKKyAgICBmbG9h
dCogZ2V0VXBUb0RhdGVDb21wbGV4RGF0YSgpOworCisgICAgc3RhdGljIERGVElfREVTQ1JJUFRP
Ul9IQU5ETEUgZGVzY3JpcHRvckhhbmRsZUZvclNpemUodW5zaWduZWQgZmZ0U2l6ZSk7CisKKyAg
ICBzdGF0aWMgREZUSV9ERVNDUklQVE9SX0hBTkRMRSogZGVzY3JpcHRvckhhbmRsZXM7CisKKyAg
ICBERlRJX0RFU0NSSVBUT1JfSEFORExFIG1faGFuZGxlOworICAgIEF1ZGlvRmxvYXRBcnJheSBt
X2NvbXBsZXhEYXRhOworICAgIEF1ZGlvRmxvYXRBcnJheSBtX3JlYWxEYXRhOworICAgIEF1ZGlv
RmxvYXRBcnJheSBtX2ltYWdEYXRhOworI2VuZGlmIC8vICFPUyhEQVJXSU4pICYmIFVTRShXRUJB
VURJT19NS0wpCiB9OwogCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBXZWJDb3JlL3Bs
YXRmb3JtL2F1ZGlvL21rbC9GRlRGcmFtZU1LTC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9w
bGF0Zm9ybS9hdWRpby9ta2wvRkZURnJhbWVNS0wuY3BwCShyZXZpc2lvbiAwKQorKysgV2ViQ29y
ZS9wbGF0Zm9ybS9hdWRpby9ta2wvRkZURnJhbWVNS0wuY3BwCShyZXZpc2lvbiAwKQpAQCAtMCww
ICsxLDI0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisg
KiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5Z
CisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBP
RiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisg
KiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLgorICovCisKKy8vIEZGVEZyYW1lIGltcGxlbWVudGF0aW9uIHVzaW5nIEludGVs
J3MgTWF0aCBLZXJuZWwgTGlicmFyeSAoTUtMKSwKKy8vIHN1aXRhYmxlIGZvciB1c2Ugb24gV2lu
ZG93cyBhbmQgTGludXguCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2lmIEVOQUJMRShXRUJf
QVVESU8pCisKKyNpbmNsdWRlICJGRlRGcmFtZS5oIgorCisjaW5jbHVkZSAibWtsX3ZtbC5oIgor
I2luY2x1ZGUgPHd0Zi9NYXRoRXh0cmFzLmg+CisKK25hbWVzcGFjZSB7CisKK0RGVElfREVTQ1JJ
UFRPUl9IQU5ETEUgY3JlYXRlRGVzY3JpcHRvckhhbmRsZShpbnQgZmZ0U2l6ZSkKK3sKKyAgICBE
RlRJX0RFU0NSSVBUT1JfSEFORExFIGhhbmRsZSA9IDA7CisKKyAgICAvLyBDcmVhdGUgREZUSSBk
ZXNjcmlwdG9yIGZvciAxRCBzaW5nbGUgcHJlY2lzaW9uIHRyYW5zZm9ybS4KKyAgICBNS0xfTE9O
RyBzdGF0dXMgPSBEZnRpQ3JlYXRlRGVzY3JpcHRvcigmaGFuZGxlLCBERlRJX1NJTkdMRSwgREZU
SV9SRUFMLCAxLCBmZnRTaXplKTsKKyAgICBBU1NFUlQoRGZ0aUVycm9yQ2xhc3Moc3RhdHVzLCBE
RlRJX05PX0VSUk9SKSk7CisKKyAgICAvLyBTZXQgcGxhY2VtZW50IG9mIHJlc3VsdCB0byBERlRJ
X05PVF9JTlBMQUNFLgorICAgIHN0YXR1cyA9IERmdGlTZXRWYWx1ZShoYW5kbGUsIERGVElfUExB
Q0VNRU5ULCBERlRJX05PVF9JTlBMQUNFKTsKKyAgICBBU1NFUlQoRGZ0aUVycm9yQ2xhc3Moc3Rh
dHVzLCBERlRJX05PX0VSUk9SKSk7CisKKyAgICAvLyBTZXQgcGFja2luZyBmb3JtYXQgdG8gUEVS
TTsgdGhpcyBwcm9kdWNlcyB0aGUgbGF5b3V0IHdoaWNoCisgICAgLy8gbWF0Y2hlcyBBY2NlbGVy
YXRlLmZyYW1ld29yaydzIG9uIHRoZSBNYWMsIHRob3VnaCBpbnRlcmxlYXZlZC4KKyAgICBzdGF0
dXMgPSBEZnRpU2V0VmFsdWUoaGFuZGxlLCBERlRJX1BBQ0tFRF9GT1JNQVQsIERGVElfUEVSTV9G
T1JNQVQpOworICAgIEFTU0VSVChEZnRpRXJyb3JDbGFzcyhzdGF0dXMsIERGVElfTk9fRVJST1Ip
KTsKKworICAgIC8vIFNldCB0aGUgZm9yd2FyZCBzY2FsZSBmYWN0b3IgdG8gMiB0byBtYXRjaCBB
Y2NlbGVyYXRlLmZyYW1ld29yaydzLgorICAgIHN0YXR1cyA9IERmdGlTZXRWYWx1ZShoYW5kbGUs
IERGVElfRk9SV0FSRF9TQ0FMRSwgMi4wKTsKKyAgICBBU1NFUlQoRGZ0aUVycm9yQ2xhc3Moc3Rh
dHVzLCBERlRJX05PX0VSUk9SKSk7CisKKyAgICAvLyBTZXQgdGhlIGJhY2t3YXJkIHNjYWxlIGZh
Y3RvciB0byAxIC8gMm4gdG8gbWF0Y2ggQWNjZWxlcmF0ZS5mcmFtZXdvcmsncy4KKyAgICBkb3Vi
bGUgc2NhbGUgPSAxLjAgLyAoMi4wICogZmZ0U2l6ZSk7CisgICAgc3RhdHVzID0gRGZ0aVNldFZh
bHVlKGhhbmRsZSwgREZUSV9CQUNLV0FSRF9TQ0FMRSwgc2NhbGUpOworICAgIEFTU0VSVChEZnRp
RXJyb3JDbGFzcyhzdGF0dXMsIERGVElfTk9fRVJST1IpKTsKKworICAgIC8vIFVzZSB0aGUgZGVm
YXVsdCBERlRJX0NPTkpVR0FURV9FVkVOX1NUT1JBR0UgPSBERlRJX0NPTVBMRVhfUkVBTC4KKwor
ICAgIC8vIENvbW1pdCBERlRJIGRlc2NyaXB0b3IuCisgICAgc3RhdHVzID0gRGZ0aUNvbW1pdERl
c2NyaXB0b3IoaGFuZGxlKTsKKyAgICBBU1NFUlQoRGZ0aUVycm9yQ2xhc3Moc3RhdHVzLCBERlRJ
X05PX0VSUk9SKSk7CisKKyAgICByZXR1cm4gaGFuZGxlOworfQorCit9IC8vIGFub255bW91cyBu
YW1lc3BhY2UKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjb25zdCBpbnQga01heEZGVFBvdzJT
aXplID0gMjQ7CisKK0RGVElfREVTQ1JJUFRPUl9IQU5ETEUqIEZGVEZyYW1lOjpkZXNjcmlwdG9y
SGFuZGxlcyA9IDA7CisKKy8vIE5vcm1hbCBjb25zdHJ1Y3RvcjogYWxsb2NhdGVzIGZvciBhIGdp
dmVuIGZmdFNpemUuCitGRlRGcmFtZTo6RkZURnJhbWUodW5zaWduZWQgZmZ0U2l6ZSkKKyAgICA6
IG1fRkZUU2l6ZShmZnRTaXplKQorICAgICwgbV9sb2cyRkZUU2l6ZShzdGF0aWNfY2FzdDx1bnNp
Z25lZD4obG9nMihmZnRTaXplKSkpCisgICAgLCBtX2hhbmRsZSgwKQorICAgICwgbV9jb21wbGV4
RGF0YShmZnRTaXplKQorICAgICwgbV9yZWFsRGF0YShmZnRTaXplIC8gMikKKyAgICAsIG1faW1h
Z0RhdGEoZmZ0U2l6ZSAvIDIpCit7CisgICAgLy8gV2Ugb25seSBhbGxvdyBwb3dlciBvZiB0d28u
CisgICAgQVNTRVJUKDFVTCA8PCBtX2xvZzJGRlRTaXplID09IG1fRkZUU2l6ZSk7CisKKyAgICBt
X2hhbmRsZSA9IGRlc2NyaXB0b3JIYW5kbGVGb3JTaXplKGZmdFNpemUpOworfQorCisvLyBDcmVh
dGVzIGEgYmxhbmsvZW1wdHkgZnJhbWUgKGludGVycG9sYXRlKCkgbXVzdCBsYXRlciBiZSBjYWxs
ZWQpLgorRkZURnJhbWU6OkZGVEZyYW1lKCkKKyAgICA6IG1fRkZUU2l6ZSgwKQorICAgICwgbV9s
b2cyRkZUU2l6ZSgwKQorICAgICwgbV9oYW5kbGUoMCkKK3sKK30KKworLy8gQ29weSBjb25zdHJ1
Y3Rvci4KK0ZGVEZyYW1lOjpGRlRGcmFtZShjb25zdCBGRlRGcmFtZSYgZnJhbWUpCisgICAgOiBt
X0ZGVFNpemUoZnJhbWUubV9GRlRTaXplKQorICAgICwgbV9sb2cyRkZUU2l6ZShmcmFtZS5tX2xv
ZzJGRlRTaXplKQorICAgICwgbV9oYW5kbGUoMCkKKyAgICAsIG1fY29tcGxleERhdGEoZnJhbWUu
bV9GRlRTaXplKQorICAgICwgbV9yZWFsRGF0YShmcmFtZS5tX0ZGVFNpemUgLyAyKQorICAgICwg
bV9pbWFnRGF0YShmcmFtZS5tX0ZGVFNpemUgLyAyKQoreworICAgIG1faGFuZGxlID0gZGVzY3Jp
cHRvckhhbmRsZUZvclNpemUobV9GRlRTaXplKTsKKworICAgIC8vIENvcHkvc2V0dXAgZnJhbWUg
ZGF0YS4KKyAgICB1bnNpZ25lZCBuYnl0ZXMgPSBzaXplb2YoZmxvYXQpICogKG1fRkZUU2l6ZSAv
IDIpOworICAgIG1lbWNweShyZWFsRGF0YSgpLCBmcmFtZS5yZWFsRGF0YSgpLCBuYnl0ZXMpOwor
ICAgIG1lbWNweShpbWFnRGF0YSgpLCBmcmFtZS5pbWFnRGF0YSgpLCBuYnl0ZXMpOworfQorCitG
RlRGcmFtZTo6fkZGVEZyYW1lKCkKK3sKK30KKwordm9pZCBGRlRGcmFtZTo6bXVsdGlwbHkoY29u
c3QgRkZURnJhbWUmIGZyYW1lKQoreworICAgIEZGVEZyYW1lJiBmcmFtZTEgPSAqdGhpczsKKyAg
ICBGRlRGcmFtZSYgZnJhbWUyID0gY29uc3RfY2FzdDxGRlRGcmFtZSY+KGZyYW1lKTsKKworICAg
IGZsb2F0KiByZWFsUDEgPSBmcmFtZTEucmVhbERhdGEoKTsKKyAgICBmbG9hdCogaW1hZ1AxID0g
ZnJhbWUxLmltYWdEYXRhKCk7CisgICAgY29uc3QgZmxvYXQqIHJlYWxQMiA9IGZyYW1lMi5yZWFs
RGF0YSgpOworICAgIGNvbnN0IGZsb2F0KiBpbWFnUDIgPSBmcmFtZTIuaW1hZ0RhdGEoKTsKKwor
ICAgIC8vIFNjYWxlIGFjY291bnRzIGZvciB2ZWNMaWIncyBwZWN1bGlhciBzY2FsaW5nLgorICAg
IC8vIFRoaXMgZW5zdXJlcyB0aGUgcmlnaHQgc2NhbGluZyBhbGwgdGhlIHdheSBiYWNrIHRvIGlu
dmVyc2UgRkZULgorICAgIGZsb2F0IHNjYWxlID0gMC41ZjsKKworICAgIC8vIE11bHRpcGx5IHBh
Y2tlZCBEQy9ueXF1aXN0IGNvbXBvbmVudC4KKyAgICByZWFsUDFbMF0gKj0gc2NhbGUgKiByZWFs
UDJbMF07CisgICAgaW1hZ1AxWzBdICo9IHNjYWxlICogaW1hZ1AyWzBdOworCisgICAgLy8gTXVs
dGlwbHkgdGhlIHJlc3QsIHNraXBwaW5nIHBhY2tlZCBEQy9OeXF1aXN0IGNvbXBvbmVudHMuCisg
ICAgZmxvYXQqIGludGVybGVhdmVkRGF0YTEgPSBmcmFtZTEuZ2V0VXBUb0RhdGVDb21wbGV4RGF0
YSgpOworICAgIGZsb2F0KiBpbnRlcmxlYXZlZERhdGEyID0gZnJhbWUyLmdldFVwVG9EYXRlQ29t
cGxleERhdGEoKTsKKworICAgIHVuc2lnbmVkIGhhbGZTaXplID0gbV9GRlRTaXplIC8gMjsKKwor
ICAgIC8vIENvbXBsZXggbXVsdGlwbHkuCisgICAgdmNNdWwoaGFsZlNpemUgLSAxLAorICAgICAg
ICAgIHJlaW50ZXJwcmV0X2Nhc3Q8TUtMX0NvbXBsZXg4Kj4oaW50ZXJsZWF2ZWREYXRhMSkgKyAx
LAorICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8TUtMX0NvbXBsZXg4Kj4oaW50ZXJsZWF2ZWRE
YXRhMikgKyAxLAorICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8TUtMX0NvbXBsZXg4Kj4oaW50
ZXJsZWF2ZWREYXRhMSkgKyAxKTsKKworICAgIC8vIFVucGFjayBhbmQgc2NhbGUgdGhlIHJlc3Qg
b2YgdGhlIGRhdGEuCisgICAgLy8gRklYTUU6IGZpbmQgYW4gTUtMIHJvdXRpbmUgdG8gZG8gYXQg
bGVhc3QgdGhlIHNjYWxpbmcgbW9yZSBlZmZpY2llbnRseS4KKyAgICBmb3IgKHVuc2lnbmVkIGkg
PSAxOyBpIDwgaGFsZlNpemU7ICsraSkgeworICAgICAgICBpbnQgYmFzZUNvbXBsZXhJbmRleCA9
IDIgKiBpOworICAgICAgICByZWFsUDFbaV0gPSBzY2FsZSAqIGludGVybGVhdmVkRGF0YTFbYmFz
ZUNvbXBsZXhJbmRleF07CisgICAgICAgIGltYWdQMVtpXSA9IHNjYWxlICogaW50ZXJsZWF2ZWRE
YXRhMVtiYXNlQ29tcGxleEluZGV4ICsgMV07CisgICAgfQorfQorCit2b2lkIEZGVEZyYW1lOjpk
b0ZGVChmbG9hdCogZGF0YSkKK3sKKyAgICAvLyBDb21wdXRlIEZvcndhcmQgdHJhbnNmb3JtLgor
ICAgIE1LTF9MT05HIHN0YXR1cyA9IERmdGlDb21wdXRlRm9yd2FyZChtX2hhbmRsZSwgZGF0YSwg
bV9jb21wbGV4RGF0YS5kYXRhKCkpOworICAgIEFTU0VSVChEZnRpRXJyb3JDbGFzcyhzdGF0dXMs
IERGVElfTk9fRVJST1IpKTsKKworICAgIC8vIFVucGFjayB0byBzZXBhcmF0ZSByZWFsIGFuZCBj
b21wbGV4IGFycmF5cy4gRklYTUU6IGZpZ3VyZSBvdXQKKyAgICAvLyBpZiBpdCdzIHBvc3NpYmxl
IHRvIGdldCBNS0wgdG8gdXNlIHNwbGl0LWNvbXBsZXggZm9ybSBmb3IgMUQKKyAgICAvLyByZWFs
LXRvLWNvbXBsZXggb3V0LW9mLXBsYWNlIEZGVHMuCisgICAgaW50IGxlbiA9IG1fRkZUU2l6ZSAv
IDI7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47ICsraSkgeworICAgICAgICBpbnQgYmFz
ZUNvbXBsZXhJbmRleCA9IDIgKiBpOworICAgICAgICBtX3JlYWxEYXRhW2ldID0gbV9jb21wbGV4
RGF0YVtiYXNlQ29tcGxleEluZGV4XTsKKyAgICAgICAgbV9pbWFnRGF0YVtpXSA9IG1fY29tcGxl
eERhdGFbYmFzZUNvbXBsZXhJbmRleCArIDFdOworICAgIH0KK30KKwordm9pZCBGRlRGcmFtZTo6
ZG9JbnZlcnNlRkZUKGZsb2F0KiBkYXRhKQoreworICAgIC8vIFByZXBhcmUgaW50ZXJsZWF2ZWQg
ZGF0YS4gRklYTUU6IGZpZ3VyZSBvdXQgaWYgaXQncyBwb3NzaWJsZSB0bworICAgIC8vIGdldCBN
S0wgdG8gdXNlIHNwbGl0LWNvbXBsZXggZm9ybSBmb3IgMUQgYmFja3dhcmQKKyAgICAvLyAoY29t
cGxleC10by1yZWFsKSBvdXQtb2YtcGxhY2UgRkZUcy4KKyAgICBmbG9hdCogaW50ZXJsZWF2ZWRE
YXRhID0gZ2V0VXBUb0RhdGVDb21wbGV4RGF0YSgpOworCisgICAgLy8gQ29tcHV0ZSBiYWNrd2Fy
ZCB0cmFuc2Zvcm0uCisgICAgTUtMX0xPTkcgc3RhdHVzID0gRGZ0aUNvbXB1dGVCYWNrd2FyZCht
X2hhbmRsZSwgaW50ZXJsZWF2ZWREYXRhLCBkYXRhKTsKKyAgICBBU1NFUlQoRGZ0aUVycm9yQ2xh
c3Moc3RhdHVzLCBERlRJX05PX0VSUk9SKSk7Cit9CisKK3ZvaWQgRkZURnJhbWU6OmNsZWFudXAo
KQoreworICAgIGlmICghZGVzY3JpcHRvckhhbmRsZXMpCisgICAgICAgIHJldHVybjsKKworICAg
IGZvciAoaW50IGkgPSAwOyBpIDwga01heEZGVFBvdzJTaXplOyArK2kpIHsKKyAgICAgICAgaWYg
KGRlc2NyaXB0b3JIYW5kbGVzW2ldKSB7CisgICAgICAgICAgICBNS0xfTE9ORyBzdGF0dXMgPSBE
ZnRpRnJlZURlc2NyaXB0b3IoJmRlc2NyaXB0b3JIYW5kbGVzW2ldKTsKKyAgICAgICAgICAgIEFT
U0VSVChEZnRpRXJyb3JDbGFzcyhzdGF0dXMsIERGVElfTk9fRVJST1IpKTsKKyAgICAgICAgfQor
ICAgIH0KKworICAgIGRlbGV0ZVtdIGRlc2NyaXB0b3JIYW5kbGVzOworICAgIGRlc2NyaXB0b3JI
YW5kbGVzID0gMDsKK30KKworZmxvYXQqIEZGVEZyYW1lOjpyZWFsRGF0YSgpIGNvbnN0Cit7Cisg
ICAgcmV0dXJuIGNvbnN0X2Nhc3Q8ZmxvYXQqPihtX3JlYWxEYXRhLmRhdGEoKSk7Cit9CisKK2Zs
b2F0KiBGRlRGcmFtZTo6aW1hZ0RhdGEoKSBjb25zdAoreworICAgIHJldHVybiBjb25zdF9jYXN0
PGZsb2F0Kj4obV9pbWFnRGF0YS5kYXRhKCkpOworfQorCitmbG9hdCogRkZURnJhbWU6OmdldFVw
VG9EYXRlQ29tcGxleERhdGEoKQoreworICAgIGludCBsZW4gPSBtX0ZGVFNpemUgLyAyOworICAg
IGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKKyAgICAgICAgaW50IGJhc2VDb21wbGV4
SW5kZXggPSAyICogaTsKKyAgICAgICAgbV9jb21wbGV4RGF0YVtiYXNlQ29tcGxleEluZGV4XSA9
IG1fcmVhbERhdGFbaV07CisgICAgICAgIG1fY29tcGxleERhdGFbYmFzZUNvbXBsZXhJbmRleCAr
IDFdID0gbV9pbWFnRGF0YVtpXTsKKyAgICB9CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8ZmxvYXQq
PihtX2NvbXBsZXhEYXRhLmRhdGEoKSk7Cit9CisKK0RGVElfREVTQ1JJUFRPUl9IQU5ETEUgRkZU
RnJhbWU6OmRlc2NyaXB0b3JIYW5kbGVGb3JTaXplKHVuc2lnbmVkIGZmdFNpemUpCit7CisgICAg
aWYgKCFkZXNjcmlwdG9ySGFuZGxlcykgeworICAgICAgICBkZXNjcmlwdG9ySGFuZGxlcyA9IG5l
dyBERlRJX0RFU0NSSVBUT1JfSEFORExFW2tNYXhGRlRQb3cyU2l6ZV07CisgICAgICAgIGZvciAo
aW50IGkgPSAwOyBpIDwga01heEZGVFBvdzJTaXplOyArK2kpCisgICAgICAgICAgICBkZXNjcmlw
dG9ySGFuZGxlc1tpXSA9IDA7CisgICAgfQorCisgICAgaW50IHBvdzJzaXplID0gc3RhdGljX2Nh
c3Q8aW50Pihsb2cyKGZmdFNpemUpKTsKKyAgICBBU1NFUlQocG93MnNpemUgPCBrTWF4RkZUUG93
MlNpemUpOworICAgIGlmICghZGVzY3JpcHRvckhhbmRsZXNbcG93MnNpemVdKQorICAgICAgICBk
ZXNjcmlwdG9ySGFuZGxlc1twb3cyc2l6ZV0gPSBjcmVhdGVEZXNjcmlwdG9ySGFuZGxlKGZmdFNp
emUpOworICAgIHJldHVybiBkZXNjcmlwdG9ySGFuZGxlc1twb3cyc2l6ZV07Cit9CisKK30gLy8g
bmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIEVOQUJMRShXRUJfQVVESU8pCg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>76494</attachid>
            <date>2010-12-13 21:20:51 -0800</date>
            <delta_ts>2010-12-15 12:13:36 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-50986-20101213212050.patch</filename>
            <type>text/plain</type>
            <size>17139</size>
            <attacher name="Kenneth Russell">kbr</attacher>
            
              <data encoding="base64">SW5kZXg6IEphdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDczOTk4KQorKysgSmF2YVNjcmlwdENvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTYgQEAKKzIwMTAtMTItMTMgIEtlbm5ldGgg
UnVzc2VsbCAgPGtickBnb29nbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAo
T09QUyEpLgorCisgICAgICAgIFdlYiBBdWRpbyBBUEk6IHBvcnQgRkZURnJhbWUgdG8gTUtMCisg
ICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD01MDk4NgorCisg
ICAgICAgIEZpeGVkIGJ1ZyBpbiBsb2cyIGVtdWxhdGlvbiBmdW5jdGlvbiBwcm92aWRlZCBmb3Ig
V2luZG93cyBwb3J0IG9mCisgICAgICAgIFdlYiBBdWRpbyBBUEkuCisKKyAgICAgICAgKiB3dGYv
TWF0aEV4dHJhcy5oOgorICAgICAgICAobG9nMik6CisKIDIwMTAtMTItMTMgIENhbWVyb24gWndh
cmljaCAgPHp3YXJpY2hAYXBwbGUuY29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5IEdhdmluIEJh
cnJhY2xvdWdoLgpJbmRleDogSmF2YVNjcmlwdENvcmUvd3RmL01hdGhFeHRyYXMuaAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS93dGYvTWF0aEV4dHJhcy5oCShyZXZpc2lvbiA3Mzk5OCkK
KysrIEphdmFTY3JpcHRDb3JlL3d0Zi9NYXRoRXh0cmFzLmgJKHdvcmtpbmcgY29weSkKQEAgLTE0
Niw3ICsxNDYsNyBAQCBpbmxpbmUgZG91YmxlIGNvcHlzaWduKGRvdWJsZSB4LCBkb3VibGUgCiBp
bmxpbmUgaW50IGlzZmluaXRlKGRvdWJsZSB4KSB7IHJldHVybiBfZmluaXRlKHgpOyB9CiAKIC8v
IE1TVkMncyBtYXRoLmggZG9lcyBub3QgY3VycmVudGx5IHN1cHBseSBsb2cyLgotaW5saW5lIGJv
b2wgbG9nMihkb3VibGUgbnVtKQoraW5saW5lIGRvdWJsZSBsb2cyKGRvdWJsZSBudW0pCiB7CiAg
ICAgLy8gVGhpcyBjb25zdGFudCBpcyByb3VnaGx5IE1fTE4yLCB3aGljaCBpcyBub3QgcHJvdmlk
ZWQgYnkgZGVmYXVsdCBvbiBXaW5kb3dzLgogICAgIHJldHVybiBsb2cobnVtKSAvIDAuNjkzMTQ3
MTgwNTU5OTQ1MzA5NDE3MjMyMTIxNDU4MTc2NTY4OwpJbmRleDogV2ViQ29yZS9DaGFuZ2VMb2cK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gV2ViQ29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDczOTk4KQorKysgV2Vi
Q29yZS9DaGFuZ2VMb2cJKHdvcmtpbmcgY29weSkKQEAgLTEsMyArMSwzMiBAQAorMjAxMC0xMi0x
MyAgS2VubmV0aCBSdXNzZWxsICA8a2JyQGdvb2dsZS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQg
YnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgV2ViIEF1ZGlvIEFQSTogcG9ydCBGRlRGcmFt
ZSB0byBNS0wKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lk
PTUwOTg2CisKKyAgICAgICAgUG9ydGVkIEZGVEZyYW1lIHRvIEludGVsJ3MgTUtMLiBUaGlzIHBh
dGNoIGNvbnRhaW5zIHRoZSBwb3J0IGFuZAorICAgICAgICBpbml0aWFsLCB0aG91Z2ggbm90IGNv
bXBsZXRlLCBidWlsZCBzeXN0ZW0gY2hhbmdlcy4gVGVzdGVkIHNvIGZhcgorICAgICAgICB3aXRo
IGEgdW5pdCB0ZXN0IGJ5IENocmlzIFJvZ2VycyAod2hpY2ggcmVxdWlyZXMgY29kZSBjaGFuZ2Vz
IHRvCisgICAgICAgIEF1ZGlvQ29udGV4dC5jcHAgYW5kIGlzIG5vdCBiZWluZyBjaGVja2VkIGlu
KS4gRnVydGhlciB0ZXN0aW5nIHRvCisgICAgICAgIGZvbGxvdyBvbmNlIGxheW91dCB0ZXN0cyBh
cmUgYXZhaWxhYmxlIGZvciB0aGUgV2ViIEF1ZGlvIEFQSS4KKworICAgICAgICAqIFdlYkNvcmUu
Z3lwL1dlYkNvcmUuZ3lwOgorICAgICAgICAqIFdlYkNvcmUuZ3lwaToKKyAgICAgICAgKiBwbGF0
Zm9ybS9hdWRpby9GRlRGcmFtZS5oOgorICAgICAgICAqIHBsYXRmb3JtL2F1ZGlvL21rbDogQWRk
ZWQuCisgICAgICAgICogcGxhdGZvcm0vYXVkaW8vbWtsL0ZGVEZyYW1lTUtMLmNwcDogQWRkZWQu
CisgICAgICAgIChXZWJDb3JlOjpGRlRGcmFtZTo6RkZURnJhbWUpOgorICAgICAgICAoV2ViQ29y
ZTo6RkZURnJhbWU6On5GRlRGcmFtZSk6CisgICAgICAgIChXZWJDb3JlOjpGRlRGcmFtZTo6bXVs
dGlwbHkpOgorICAgICAgICAoV2ViQ29yZTo6RkZURnJhbWU6OmRvRkZUKToKKyAgICAgICAgKFdl
YkNvcmU6OkZGVEZyYW1lOjpkb0ludmVyc2VGRlQpOgorICAgICAgICAoV2ViQ29yZTo6RkZURnJh
bWU6OmNsZWFudXApOgorICAgICAgICAoV2ViQ29yZTo6RkZURnJhbWU6OnJlYWxEYXRhKToKKyAg
ICAgICAgKFdlYkNvcmU6OkZGVEZyYW1lOjppbWFnRGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpG
RlRGcmFtZTo6Z2V0VXBUb0RhdGVDb21wbGV4RGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpGRlRG
cmFtZTo6ZGVzY3JpcHRvckhhbmRsZUZvclNpemUpOgorCiAyMDEwLTEyLTEzICBOb2VsIEdvcmRv
biAgPG5vZWwuZ29yZG9uQGdtYWlsLmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBieSBEYXZpZCBM
ZXZpbi4KSW5kZXg6IFdlYkNvcmUvV2ViQ29yZS5neXBpCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUv
V2ViQ29yZS5neXBpCShyZXZpc2lvbiA3Mzk5OCkKKysrIFdlYkNvcmUvV2ViQ29yZS5neXBpCSh3
b3JraW5nIGNvcHkpCkBAIC0yNDM2LDYgKzI0MzYsNyBAQAogICAgICAgICAgICAgJ3BsYXRmb3Jt
L2F1ZGlvL21hYy9BdWRpb0Rlc3RpbmF0aW9uTWFjLmNwcCcsCiAgICAgICAgICAgICAncGxhdGZv
cm0vYXVkaW8vbWFjL0F1ZGlvRmlsZVJlYWRlck1hYy5jcHAnLAogICAgICAgICAgICAgJ3BsYXRm
b3JtL2F1ZGlvL21hYy9GRlRGcmFtZU1hYy5jcHAnLAorICAgICAgICAgICAgJ3BsYXRmb3JtL2F1
ZGlvL21rbC9GRlRGcmFtZU1LTC5jcHAnLAogICAgICAgICAgICAgJ3BsYXRmb3JtL2FuaW1hdGlv
bi9BbmltYXRpb24uY3BwJywKICAgICAgICAgICAgICdwbGF0Zm9ybS9hbmltYXRpb24vQW5pbWF0
aW9uLmgnLAogICAgICAgICAgICAgJ3BsYXRmb3JtL2FuaW1hdGlvbi9BbmltYXRpb25MaXN0LmNw
cCcsCkluZGV4OiBXZWJDb3JlL1dlYkNvcmUuZ3lwL1dlYkNvcmUuZ3lwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFdlYkNvcmUvV2ViQ29yZS5neXAvV2ViQ29yZS5neXAJKHJldmlzaW9uIDczOTk4KQorKysgV2Vi
Q29yZS9XZWJDb3JlLmd5cC9XZWJDb3JlLmd5cAkod29ya2luZyBjb3B5KQpAQCAtODI1LDYgKzgy
NSwxMyBAQAogICAgICAgICAgICAgJ2luY2x1ZGVfZGlycysrKyc6IFsnLi4vZG9tJ10sCiAgICAg
ICAgICAgfSwKICAgICAgICAgfV0sCisgICAgICAgICMgRklYTUU6IChrYnIpIGlkZWFsbHkgdGhp
cyB0YXJnZXQgc2hvdWxkIGp1c3QgZGVwZW5kIG9uIHdlYmNvcmVfcHJlcmVxdWlzaXRlcworICAg
ICAgICAjIHRvIHBpY2sgdXAgdGhpcyBpbmNsdWRlIGRpcmVjdG9yeSwgYnV0IEknbSBuZXJ2b3Vz
IGFib3V0IG1ha2luZyB0aGF0IGNoYW5nZS4KKyAgICAgICAgWycoT1M9PSJsaW51eCIgb3IgT1M9
PSJ3aW4iKSBhbmQgIldURl9VU0VfV0VCQVVESU9fTUtMPTEiIGluIGZlYXR1cmVfZGVmaW5lcycs
IHsKKyAgICAgICAgICAnaW5jbHVkZV9kaXJzJzogWworICAgICAgICAgICAgJzwoY2hyb21pdW1f
c3JjX2RpcikvdGhpcmRfcGFydHkvbWtsL2luY2x1ZGUnLAorICAgICAgICAgIF0sCisgICAgICAg
IH1dLAogICAgICAgXSwKICAgICB9LAogICAgIHsKQEAgLTk5Myw2ICsxMDAwLDE0IEBACiAgICAg
ICAgICAgIyBieSBhIHN5c3RlbSBoZWFkZXIgb24gd2luZG93cy4KICAgICAgICAgICAnaW5jbHVk
ZV9kaXJzKysnOiBbJy4uL2RvbSddLAogICAgICAgICB9XSwKKyAgICAgICAgWycoT1M9PSJsaW51
eCIgb3IgT1M9PSJ3aW4iKSBhbmQgIldURl9VU0VfV0VCQVVESU9fTUtMPTEiIGluIGZlYXR1cmVf
ZGVmaW5lcycsIHsKKyAgICAgICAgICAjIFRoaXMgZGlyZWN0b3J5IG5lZWRzIHRvIGJlIG9uIHRo
ZSBpbmNsdWRlIHBhdGggZm9yIG11bHRpcGxlIHN1Yi10YXJnZXRzIG9mIHdlYmNvcmUuCisgICAg
ICAgICAgJ2RpcmVjdF9kZXBlbmRlbnRfc2V0dGluZ3MnOiB7CisgICAgICAgICAgICAnaW5jbHVk
ZV9kaXJzJzogWworICAgICAgICAgICAgICAnPChjaHJvbWl1bV9zcmNfZGlyKS90aGlyZF9wYXJ0
eS9ta2wvaW5jbHVkZScsCisgICAgICAgICAgICBdLAorICAgICAgICAgIH0sCisgICAgICAgIH1d
LAogICAgICAgXSwKICAgICB9LAogICAgIHsKQEAgLTEwNTUsNyArMTA3MCw3IEBACiAgICAgICAg
ICMgRXhjbHVkZSB0aGluZ3MgdGhhdCBkb24ndCBhcHBseSB0byB0aGUgQ2hyb21pdW0gcGxhdGZv
cm0gb24gdGhlIGJhc2lzCiAgICAgICAgICMgb2YgdGhlaXIgZW5jbG9zaW5nIGRpcmVjdG9yaWVz
IGFuZCB0YWdzIGF0IHRoZSBlbmRzIG9mIHRoZWlyCiAgICAgICAgICMgZmlsZW5hbWVzLgotICAg
ICAgICBbJ2V4Y2x1ZGUnLCAnKGFuZHJvaWR8Y2Fpcm98Y2Z8Y2d8Y3VybHxndGt8aGFpa3V8bGlu
dXh8bWFjfG9wZW50eXBlfHBvc2l4fHF0fHNvdXB8c3ZnfHN5bWJpYW58d2lufHd4KS8nXSwKKyAg
ICAgICAgWydleGNsdWRlJywgJyhhbmRyb2lkfGNhaXJvfGNmfGNnfGN1cmx8Z3RrfGhhaWt1fGxp
bnV4fG1hY3xta2x8b3BlbnR5cGV8cG9zaXh8cXR8c291cHxzdmd8c3ltYmlhbnx3aW58d3gpLydd
LAogICAgICAgICBbJ2V4Y2x1ZGUnLCAnKD88IUNocm9taXVtKShBbmRyb2lkfENhaXJvfENGfENH
fEN1cmx8R3RrfExpbnV4fE1hY3xPcGVuVHlwZXxQT1NJWHxQb3NpeHxRdHxTYWZhcml8U291cHxT
eW1iaWFufFdpbnxXeClcXC4oY3BwfG1tPykkJ10sCiAKICAgICAgICAgIyBBIGZldyB0aGluZ3Mg
Y2FuJ3QgYmUgZXhjbHVkZWQgYnkgcGF0dGVybnMuICBMaXN0IHRoZW0gaW5kaXZpZHVhbGx5LgpA
QCAtMTIyMyw2ICsxMjM4LDExIEBACiAgICAgICAgICAgICBbJ2V4Y2x1ZGUnLCAnL0dlb2xvY2F0
aW9uU2VydmljZS4qJCddLAogICAgICAgICAgIF0sCiAgICAgICAgIH1dLAorICAgICAgICBbJyhP
Uz09ImxpbnV4IiBvciBPUz09IndpbiIpIGFuZCAiV1RGX1VTRV9XRUJBVURJT19NS0w9MSIgaW4g
ZmVhdHVyZV9kZWZpbmVzJywgeworICAgICAgICAgICdzb3VyY2VzLyc6IFsKKyAgICAgICAgICAg
IFsnaW5jbHVkZScsICdwbGF0Zm9ybS9hdWRpby9ta2wvRkZURnJhbWVNS0xcXC5jcHAkJ10sCisg
ICAgICAgICAgXSwKKyAgICAgICAgfV0sCiAgICAgICBdLAogICAgIH0sCiAgICAgewpAQCAtMTQz
NCw2ICsxNDU0LDI5IEBACiAgICAgICAgICAgICAnaW5jbHVkZV9kaXJzKysrJzogWycuLi9kb20n
XSwKICAgICAgICAgICB9LAogICAgICAgICB9XSwKKyAgICAgICAgWydPUz09IndpbiIgYW5kICJX
VEZfVVNFX1dFQkFVRElPX01LTD0xIiBpbiBmZWF0dXJlX2RlZmluZXMnLCB7CisgICAgICAgICAg
IyBGSVhNRTogKGticikgZmlndXJlIG91dCBob3cgdG8gbWFrZSB0aGVzZSBkZXBlbmRlbmNpZXMK
KyAgICAgICAgICAjIHdvcmsgaW4gYSBjcm9zcy1wbGF0Zm9ybSB3YXkuIEF0dGVtcHRzIHRvIHVz
ZQorICAgICAgICAgICMgImxpbmtfc2V0dGluZ3MiIGFuZCAibGlicmFyaWVzIiBpbiBjb25qdW5j
dGlvbiB3aXRoIHRoZQorICAgICAgICAgICMgbXN2cy1zcGVjaWZpYyBzZXR0aW5ncyBkaWRuJ3Qg
d29yayBzbyBmYXIuCisgICAgICAgICAgJ2FsbF9kZXBlbmRlbnRfc2V0dGluZ3MnOiB7CisgICAg
ICAgICAgICAnbXN2c19zZXR0aW5ncyc6IHsKKyAgICAgICAgICAgICAgJ1ZDTGlua2VyVG9vbCc6
IHsKKyAgICAgICAgICAgICAgICAnQWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcyc6IFsKKyAg
ICAgICAgICAgICAgICAgICMgVGhpcyBpcyBhIGhhY2sgdG8gbWFrZSB0aGlzIGRpcmVjdG9yeSBj
b3JyZWN0CisgICAgICAgICAgICAgICAgICAjIHJlbGF0aXZlIHRvIHRhcmdldHMgbGlrZSBjaHJv
bWVfZGxsLiBTaG91bGQgdXNlCisgICAgICAgICAgICAgICAgICAjIDwoY2hyb21pdW1fc3JjX2Rp
cikuCisgICAgICAgICAgICAgICAgICAnLi4vdGhpcmRfcGFydHkvbWtsL2xpYi93aW4vaWEzMics
CisgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICAnQWRkaXRpb25hbERlcGVuZGVu
Y2llcyc6IFsKKyAgICAgICAgICAgICAgICAgICdta2xfaW50ZWxfYy5saWInLAorICAgICAgICAg
ICAgICAgICAgJ21rbF9zZXF1ZW50aWFsLmxpYicsCisgICAgICAgICAgICAgICAgICAnbWtsX2Nv
cmUubGliJywKKyAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICB9LAorICAgICAgICAg
ICAgfSwKKyAgICAgICAgICB9LAorICAgICAgICB9XSwKICAgICAgICAgWydlbmFibGVfc3ZnIT0w
JywgewogICAgICAgICAgICdkZXBlbmRlbmNpZXMnOiBbCiAgICAgICAgICAgICAnd2ViY29yZV9z
dmcnLApJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9GRlRGcmFtZS5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFdlYkNvcmUvcGxhdGZvcm0vYXVkaW8vRkZURnJhbWUuaAkocmV2aXNpb24gNzM5OTgpCisr
KyBXZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL0ZGVEZyYW1lLmgJKHdvcmtpbmcgY29weSkKQEAgLTM1
LDYgKzM1LDEwIEBACiAjaW5jbHVkZSA8QWNjZWxlcmF0ZS9BY2NlbGVyYXRlLmg+CiAjZW5kaWYK
IAorI2lmICFPUyhEQVJXSU4pICYmIFVTRShXRUJBVURJT19NS0wpCisjaW5jbHVkZSAibWtsX2Rm
dGkuaCIKKyNlbmRpZgorCiAjaW5jbHVkZSA8d3RmL1Bhc3NPd25QdHIuaD4KICNpbmNsdWRlIDx3
dGYvUGxhdGZvcm0uaD4KIApAQCAtOTUsNiArOTksMjMgQEAgcHJpdmF0ZToKICAgICBBdWRpb0Zs
b2F0QXJyYXkgbV9yZWFsRGF0YTsKICAgICBBdWRpb0Zsb2F0QXJyYXkgbV9pbWFnRGF0YTsKICNl
bmRpZiAvLyBPUyhEQVJXSU4pCisjaWYgIU9TKERBUldJTikgJiYgVVNFKFdFQkFVRElPX01LTCkK
KyAgICAvLyBJbnRlcmxlYXZlcyB0aGUgcGxhbmFyIHJlYWwgYW5kIGltYWdpbmFyeSBkYXRhIGFu
ZCByZXR1cm5zIGEKKyAgICAvLyBwb2ludGVyIHRvIHRoZSByZXN1bHRpbmcgc3RvcmFnZSB3aGlj
aCBjYW4gYmUgdXNlZCBmb3IgaW4tcGxhY2UKKyAgICAvLyBvciBvdXQtb2YtcGxhY2Ugb3BlcmF0
aW9ucy4gRklYTUU6IGlkZWFsbHkgYWxsIG9mIHRoZSBNS0wKKyAgICAvLyByb3V0aW5lcyB3b3Vs
ZCBvcGVyYXRlIG9uIHBsYW5hciBkYXRhIGFuZCB0aGlzIG1ldGhvZCB3b3VsZCBiZQorICAgIC8v
IHJlbW92ZWQuCisgICAgZmxvYXQqIGdldFVwVG9EYXRlQ29tcGxleERhdGEoKTsKKworICAgIHN0
YXRpYyBERlRJX0RFU0NSSVBUT1JfSEFORExFIGRlc2NyaXB0b3JIYW5kbGVGb3JTaXplKHVuc2ln
bmVkIGZmdFNpemUpOworCisgICAgc3RhdGljIERGVElfREVTQ1JJUFRPUl9IQU5ETEUqIGRlc2Ny
aXB0b3JIYW5kbGVzOworCisgICAgREZUSV9ERVNDUklQVE9SX0hBTkRMRSBtX2hhbmRsZTsKKyAg
ICBBdWRpb0Zsb2F0QXJyYXkgbV9jb21wbGV4RGF0YTsKKyAgICBBdWRpb0Zsb2F0QXJyYXkgbV9y
ZWFsRGF0YTsKKyAgICBBdWRpb0Zsb2F0QXJyYXkgbV9pbWFnRGF0YTsKKyNlbmRpZiAvLyAhT1Mo
REFSV0lOKSAmJiBVU0UoV0VCQVVESU9fTUtMKQogfTsKIAogfSAvLyBuYW1lc3BhY2UgV2ViQ29y
ZQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9ta2wvRkZURnJhbWVNS0wuY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vYXVkaW8vbWtsL0ZGVEZyYW1lTUtMLmNwcAkocmV2
aXNpb24gMCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vYXVkaW8vbWtsL0ZGVEZyYW1lTUtMLmNwcAko
cmV2aXNpb24gMCkKQEAgLTAsMCArMSwyNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAg
R29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAy
LiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisg
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JT
ICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQor
ICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAq
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisvLyBGRlRGcmFtZSBpbXBsZW1l
bnRhdGlvbiB1c2luZyBJbnRlbCdzIE1hdGggS2VybmVsIExpYnJhcnkgKE1LTCksCisvLyBzdWl0
YWJsZSBmb3IgdXNlIG9uIFdpbmRvd3MgYW5kIExpbnV4LgorCisjaW5jbHVkZSAiY29uZmlnLmgi
CisKKyNpZiBFTkFCTEUoV0VCX0FVRElPKQorCisjaW5jbHVkZSAiRkZURnJhbWUuaCIKKworI2lu
Y2x1ZGUgIm1rbF92bWwuaCIKKyNpbmNsdWRlIDx3dGYvTWF0aEV4dHJhcy5oPgorCituYW1lc3Bh
Y2UgeworCitERlRJX0RFU0NSSVBUT1JfSEFORExFIGNyZWF0ZURlc2NyaXB0b3JIYW5kbGUoaW50
IGZmdFNpemUpCit7CisgICAgREZUSV9ERVNDUklQVE9SX0hBTkRMRSBoYW5kbGUgPSAwOworCisg
ICAgLy8gQ3JlYXRlIERGVEkgZGVzY3JpcHRvciBmb3IgMUQgc2luZ2xlIHByZWNpc2lvbiB0cmFu
c2Zvcm0uCisgICAgTUtMX0xPTkcgc3RhdHVzID0gRGZ0aUNyZWF0ZURlc2NyaXB0b3IoJmhhbmRs
ZSwgREZUSV9TSU5HTEUsIERGVElfUkVBTCwgMSwgZmZ0U2l6ZSk7CisgICAgQVNTRVJUKERmdGlF
cnJvckNsYXNzKHN0YXR1cywgREZUSV9OT19FUlJPUikpOworCisgICAgLy8gU2V0IHBsYWNlbWVu
dCBvZiByZXN1bHQgdG8gREZUSV9OT1RfSU5QTEFDRS4KKyAgICBzdGF0dXMgPSBEZnRpU2V0VmFs
dWUoaGFuZGxlLCBERlRJX1BMQUNFTUVOVCwgREZUSV9OT1RfSU5QTEFDRSk7CisgICAgQVNTRVJU
KERmdGlFcnJvckNsYXNzKHN0YXR1cywgREZUSV9OT19FUlJPUikpOworCisgICAgLy8gU2V0IHBh
Y2tpbmcgZm9ybWF0IHRvIFBFUk07IHRoaXMgcHJvZHVjZXMgdGhlIGxheW91dCB3aGljaAorICAg
IC8vIG1hdGNoZXMgQWNjZWxlcmF0ZS5mcmFtZXdvcmsncyBvbiB0aGUgTWFjLCB0aG91Z2ggaW50
ZXJsZWF2ZWQuCisgICAgc3RhdHVzID0gRGZ0aVNldFZhbHVlKGhhbmRsZSwgREZUSV9QQUNLRURf
Rk9STUFULCBERlRJX1BFUk1fRk9STUFUKTsKKyAgICBBU1NFUlQoRGZ0aUVycm9yQ2xhc3Moc3Rh
dHVzLCBERlRJX05PX0VSUk9SKSk7CisKKyAgICAvLyBTZXQgdGhlIGZvcndhcmQgc2NhbGUgZmFj
dG9yIHRvIDIgdG8gbWF0Y2ggQWNjZWxlcmF0ZS5mcmFtZXdvcmsncy4KKyAgICAvLyBGSVhNRTog
RkZURnJhbWVNYWMncyBzY2FsaW5nIGZhY3RvciBjb3VsZCBiZSBmaXhlZCB0byBiZSAxLjAsCisg
ICAgLy8gaW4gd2hpY2ggY2FzZSB0aGlzIGNvZGUgd291bGQgbmVlZCB0byBiZSBjaGFuZ2VkIGFz
IHdlbGwuCisgICAgc3RhdHVzID0gRGZ0aVNldFZhbHVlKGhhbmRsZSwgREZUSV9GT1JXQVJEX1ND
QUxFLCAyLjApOworICAgIEFTU0VSVChEZnRpRXJyb3JDbGFzcyhzdGF0dXMsIERGVElfTk9fRVJS
T1IpKTsKKworICAgIC8vIFNldCB0aGUgYmFja3dhcmQgc2NhbGUgZmFjdG9yIHRvIDEgLyAybiB0
byBtYXRjaCBBY2NlbGVyYXRlLmZyYW1ld29yaydzLgorICAgIC8vIEZJWE1FOiBpZiB0aGUgYWJv
dmUgc2NhbGluZyBmYWN0b3IgaXMgZml4ZWQgdGhlbiB0aGlzIG5lZWRzIHRvIGJlIGFzIHdlbGwu
CisgICAgZG91YmxlIHNjYWxlID0gMS4wIC8gKDIuMCAqIGZmdFNpemUpOworICAgIHN0YXR1cyA9
IERmdGlTZXRWYWx1ZShoYW5kbGUsIERGVElfQkFDS1dBUkRfU0NBTEUsIHNjYWxlKTsKKyAgICBB
U1NFUlQoRGZ0aUVycm9yQ2xhc3Moc3RhdHVzLCBERlRJX05PX0VSUk9SKSk7CisKKyAgICAvLyBV
c2UgdGhlIGRlZmF1bHQgREZUSV9DT05KVUdBVEVfRVZFTl9TVE9SQUdFID0gREZUSV9DT01QTEVY
X1JFQUwuCisKKyAgICAvLyBDb21taXQgREZUSSBkZXNjcmlwdG9yLgorICAgIHN0YXR1cyA9IERm
dGlDb21taXREZXNjcmlwdG9yKGhhbmRsZSk7CisgICAgQVNTRVJUKERmdGlFcnJvckNsYXNzKHN0
YXR1cywgREZUSV9OT19FUlJPUikpOworCisgICAgcmV0dXJuIGhhbmRsZTsKK30KKworfSAvLyBh
bm9ueW1vdXMgbmFtZXNwYWNlCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY29uc3QgaW50IGtN
YXhGRlRQb3cyU2l6ZSA9IDI0OworCitERlRJX0RFU0NSSVBUT1JfSEFORExFKiBGRlRGcmFtZTo6
ZGVzY3JpcHRvckhhbmRsZXMgPSAwOworCisvLyBOb3JtYWwgY29uc3RydWN0b3I6IGFsbG9jYXRl
cyBmb3IgYSBnaXZlbiBmZnRTaXplLgorRkZURnJhbWU6OkZGVEZyYW1lKHVuc2lnbmVkIGZmdFNp
emUpCisgICAgOiBtX0ZGVFNpemUoZmZ0U2l6ZSkKKyAgICAsIG1fbG9nMkZGVFNpemUoc3RhdGlj
X2Nhc3Q8dW5zaWduZWQ+KGxvZzIoZmZ0U2l6ZSkpKQorICAgICwgbV9oYW5kbGUoMCkKKyAgICAs
IG1fY29tcGxleERhdGEoZmZ0U2l6ZSkKKyAgICAsIG1fcmVhbERhdGEoZmZ0U2l6ZSAvIDIpCisg
ICAgLCBtX2ltYWdEYXRhKGZmdFNpemUgLyAyKQoreworICAgIC8vIFdlIG9ubHkgYWxsb3cgcG93
ZXIgb2YgdHdvLgorICAgIEFTU0VSVCgxVUwgPDwgbV9sb2cyRkZUU2l6ZSA9PSBtX0ZGVFNpemUp
OworCisgICAgbV9oYW5kbGUgPSBkZXNjcmlwdG9ySGFuZGxlRm9yU2l6ZShmZnRTaXplKTsKK30K
KworLy8gQ3JlYXRlcyBhIGJsYW5rL2VtcHR5IGZyYW1lIChpbnRlcnBvbGF0ZSgpIG11c3QgbGF0
ZXIgYmUgY2FsbGVkKS4KK0ZGVEZyYW1lOjpGRlRGcmFtZSgpCisgICAgOiBtX0ZGVFNpemUoMCkK
KyAgICAsIG1fbG9nMkZGVFNpemUoMCkKKyAgICAsIG1faGFuZGxlKDApCit7Cit9CisKKy8vIENv
cHkgY29uc3RydWN0b3IuCitGRlRGcmFtZTo6RkZURnJhbWUoY29uc3QgRkZURnJhbWUmIGZyYW1l
KQorICAgIDogbV9GRlRTaXplKGZyYW1lLm1fRkZUU2l6ZSkKKyAgICAsIG1fbG9nMkZGVFNpemUo
ZnJhbWUubV9sb2cyRkZUU2l6ZSkKKyAgICAsIG1faGFuZGxlKDApCisgICAgLCBtX2NvbXBsZXhE
YXRhKGZyYW1lLm1fRkZUU2l6ZSkKKyAgICAsIG1fcmVhbERhdGEoZnJhbWUubV9GRlRTaXplIC8g
MikKKyAgICAsIG1faW1hZ0RhdGEoZnJhbWUubV9GRlRTaXplIC8gMikKK3sKKyAgICBtX2hhbmRs
ZSA9IGRlc2NyaXB0b3JIYW5kbGVGb3JTaXplKG1fRkZUU2l6ZSk7CisKKyAgICAvLyBDb3B5L3Nl
dHVwIGZyYW1lIGRhdGEuCisgICAgdW5zaWduZWQgbmJ5dGVzID0gc2l6ZW9mKGZsb2F0KSAqICht
X0ZGVFNpemUgLyAyKTsKKyAgICBtZW1jcHkocmVhbERhdGEoKSwgZnJhbWUucmVhbERhdGEoKSwg
bmJ5dGVzKTsKKyAgICBtZW1jcHkoaW1hZ0RhdGEoKSwgZnJhbWUuaW1hZ0RhdGEoKSwgbmJ5dGVz
KTsKK30KKworRkZURnJhbWU6On5GRlRGcmFtZSgpCit7Cit9CisKK3ZvaWQgRkZURnJhbWU6Om11
bHRpcGx5KGNvbnN0IEZGVEZyYW1lJiBmcmFtZSkKK3sKKyAgICBGRlRGcmFtZSYgZnJhbWUxID0g
KnRoaXM7CisgICAgRkZURnJhbWUmIGZyYW1lMiA9IGNvbnN0X2Nhc3Q8RkZURnJhbWUmPihmcmFt
ZSk7CisKKyAgICBmbG9hdCogcmVhbFAxID0gZnJhbWUxLnJlYWxEYXRhKCk7CisgICAgZmxvYXQq
IGltYWdQMSA9IGZyYW1lMS5pbWFnRGF0YSgpOworICAgIGNvbnN0IGZsb2F0KiByZWFsUDIgPSBm
cmFtZTIucmVhbERhdGEoKTsKKyAgICBjb25zdCBmbG9hdCogaW1hZ1AyID0gZnJhbWUyLmltYWdE
YXRhKCk7CisKKyAgICAvLyBTY2FsZSBhY2NvdW50cyBmb3IgdmVjTGliJ3MgcGVjdWxpYXIgc2Nh
bGluZy4KKyAgICAvLyBUaGlzIGVuc3VyZXMgdGhlIHJpZ2h0IHNjYWxpbmcgYWxsIHRoZSB3YXkg
YmFjayB0byBpbnZlcnNlIEZGVC4KKyAgICAvLyBGSVhNRTogdGhpcyBzY2FsaW5nIGZhY3RvciB3
aWxsIGJlIDEuMGYgaWYgdGhlIGFib3ZlIDIuMCAtPiAxLjAKKyAgICAvLyBzY2FsaW5nIGZhY3Rv
ciBpcyBmaXhlZC4KKyAgICBmbG9hdCBzY2FsZSA9IDAuNWY7CisKKyAgICAvLyBNdWx0aXBseSBw
YWNrZWQgREMvbnlxdWlzdCBjb21wb25lbnQuCisgICAgcmVhbFAxWzBdICo9IHNjYWxlICogcmVh
bFAyWzBdOworICAgIGltYWdQMVswXSAqPSBzY2FsZSAqIGltYWdQMlswXTsKKworICAgIC8vIE11
bHRpcGx5IHRoZSByZXN0LCBza2lwcGluZyBwYWNrZWQgREMvTnlxdWlzdCBjb21wb25lbnRzLgor
ICAgIGZsb2F0KiBpbnRlcmxlYXZlZERhdGExID0gZnJhbWUxLmdldFVwVG9EYXRlQ29tcGxleERh
dGEoKTsKKyAgICBmbG9hdCogaW50ZXJsZWF2ZWREYXRhMiA9IGZyYW1lMi5nZXRVcFRvRGF0ZUNv
bXBsZXhEYXRhKCk7CisKKyAgICB1bnNpZ25lZCBoYWxmU2l6ZSA9IG1fRkZUU2l6ZSAvIDI7CisK
KyAgICAvLyBDb21wbGV4IG11bHRpcGx5LgorICAgIHZjTXVsKGhhbGZTaXplIC0gMSwKKyAgICAg
ICAgICByZWludGVycHJldF9jYXN0PE1LTF9Db21wbGV4OCo+KGludGVybGVhdmVkRGF0YTEpICsg
MSwKKyAgICAgICAgICByZWludGVycHJldF9jYXN0PE1LTF9Db21wbGV4OCo+KGludGVybGVhdmVk
RGF0YTIpICsgMSwKKyAgICAgICAgICByZWludGVycHJldF9jYXN0PE1LTF9Db21wbGV4OCo+KGlu
dGVybGVhdmVkRGF0YTEpICsgMSk7CisKKyAgICAvLyBEZS1pbnRlcmxlYXZlIGFuZCBzY2FsZSB0
aGUgcmVzdCBvZiB0aGUgZGF0YS4KKyAgICAvLyBGSVhNRTogZmluZCBhbiBNS0wgcm91dGluZSB0
byBkbyBhdCBsZWFzdCB0aGUgc2NhbGluZyBtb3JlIGVmZmljaWVudGx5LgorICAgIGZvciAodW5z
aWduZWQgaSA9IDE7IGkgPCBoYWxmU2l6ZTsgKytpKSB7CisgICAgICAgIGludCBiYXNlQ29tcGxl
eEluZGV4ID0gMiAqIGk7CisgICAgICAgIHJlYWxQMVtpXSA9IHNjYWxlICogaW50ZXJsZWF2ZWRE
YXRhMVtiYXNlQ29tcGxleEluZGV4XTsKKyAgICAgICAgaW1hZ1AxW2ldID0gc2NhbGUgKiBpbnRl
cmxlYXZlZERhdGExW2Jhc2VDb21wbGV4SW5kZXggKyAxXTsKKyAgICB9Cit9CisKK3ZvaWQgRkZU
RnJhbWU6OmRvRkZUKGZsb2F0KiBkYXRhKQoreworICAgIC8vIENvbXB1dGUgRm9yd2FyZCB0cmFu
c2Zvcm0uCisgICAgTUtMX0xPTkcgc3RhdHVzID0gRGZ0aUNvbXB1dGVGb3J3YXJkKG1faGFuZGxl
LCBkYXRhLCBtX2NvbXBsZXhEYXRhLmRhdGEoKSk7CisgICAgQVNTRVJUKERmdGlFcnJvckNsYXNz
KHN0YXR1cywgREZUSV9OT19FUlJPUikpOworCisgICAgLy8gRGUtaW50ZXJsZWF2ZSB0byBzZXBh
cmF0ZSByZWFsIGFuZCBjb21wbGV4IGFycmF5cy4gRklYTUU6CisgICAgLy8gZmlndXJlIG91dCBp
ZiBpdCdzIHBvc3NpYmxlIHRvIGdldCBNS0wgdG8gdXNlIHNwbGl0LWNvbXBsZXgKKyAgICAvLyBm
b3JtIGZvciAxRCByZWFsLXRvLWNvbXBsZXggb3V0LW9mLXBsYWNlIEZGVHMuCisgICAgaW50IGxl
biA9IG1fRkZUU2l6ZSAvIDI7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47ICsraSkgewor
ICAgICAgICBpbnQgYmFzZUNvbXBsZXhJbmRleCA9IDIgKiBpOworICAgICAgICAvLyBtX3JlYWxE
YXRhWzBdIGlzIHRoZSBEQyBjb21wb25lbnQgYW5kIG1faW1hZ0RhdGFbMF0gdGhlCisgICAgICAg
IC8vIE55cXVpc3QgY29tcG9uZW50IHNpbmNlIHRoZSBpbnRlcmxlYXZlZCBjb21wbGV4IGRhdGEg
aXMKKyAgICAgICAgLy8gcGFja2VkLgorICAgICAgICBtX3JlYWxEYXRhW2ldID0gbV9jb21wbGV4
RGF0YVtiYXNlQ29tcGxleEluZGV4XTsKKyAgICAgICAgbV9pbWFnRGF0YVtpXSA9IG1fY29tcGxl
eERhdGFbYmFzZUNvbXBsZXhJbmRleCArIDFdOworICAgIH0KK30KKwordm9pZCBGRlRGcmFtZTo6
ZG9JbnZlcnNlRkZUKGZsb2F0KiBkYXRhKQoreworICAgIC8vIFByZXBhcmUgaW50ZXJsZWF2ZWQg
ZGF0YS4gRklYTUU6IGZpZ3VyZSBvdXQgaWYgaXQncyBwb3NzaWJsZSB0bworICAgIC8vIGdldCBN
S0wgdG8gdXNlIHNwbGl0LWNvbXBsZXggZm9ybSBmb3IgMUQgYmFja3dhcmQKKyAgICAvLyAoY29t
cGxleC10by1yZWFsKSBvdXQtb2YtcGxhY2UgRkZUcy4KKyAgICBmbG9hdCogaW50ZXJsZWF2ZWRE
YXRhID0gZ2V0VXBUb0RhdGVDb21wbGV4RGF0YSgpOworCisgICAgLy8gQ29tcHV0ZSBiYWNrd2Fy
ZCB0cmFuc2Zvcm0uCisgICAgTUtMX0xPTkcgc3RhdHVzID0gRGZ0aUNvbXB1dGVCYWNrd2FyZCht
X2hhbmRsZSwgaW50ZXJsZWF2ZWREYXRhLCBkYXRhKTsKKyAgICBBU1NFUlQoRGZ0aUVycm9yQ2xh
c3Moc3RhdHVzLCBERlRJX05PX0VSUk9SKSk7Cit9CisKK3ZvaWQgRkZURnJhbWU6OmNsZWFudXAo
KQoreworICAgIGlmICghZGVzY3JpcHRvckhhbmRsZXMpCisgICAgICAgIHJldHVybjsKKworICAg
IGZvciAoaW50IGkgPSAwOyBpIDwga01heEZGVFBvdzJTaXplOyArK2kpIHsKKyAgICAgICAgaWYg
KGRlc2NyaXB0b3JIYW5kbGVzW2ldKSB7CisgICAgICAgICAgICBNS0xfTE9ORyBzdGF0dXMgPSBE
ZnRpRnJlZURlc2NyaXB0b3IoJmRlc2NyaXB0b3JIYW5kbGVzW2ldKTsKKyAgICAgICAgICAgIEFT
U0VSVChEZnRpRXJyb3JDbGFzcyhzdGF0dXMsIERGVElfTk9fRVJST1IpKTsKKyAgICAgICAgfQor
ICAgIH0KKworICAgIGRlbGV0ZVtdIGRlc2NyaXB0b3JIYW5kbGVzOworICAgIGRlc2NyaXB0b3JI
YW5kbGVzID0gMDsKK30KKworZmxvYXQqIEZGVEZyYW1lOjpyZWFsRGF0YSgpIGNvbnN0Cit7Cisg
ICAgcmV0dXJuIGNvbnN0X2Nhc3Q8ZmxvYXQqPihtX3JlYWxEYXRhLmRhdGEoKSk7Cit9CisKK2Zs
b2F0KiBGRlRGcmFtZTo6aW1hZ0RhdGEoKSBjb25zdAoreworICAgIHJldHVybiBjb25zdF9jYXN0
PGZsb2F0Kj4obV9pbWFnRGF0YS5kYXRhKCkpOworfQorCitmbG9hdCogRkZURnJhbWU6OmdldFVw
VG9EYXRlQ29tcGxleERhdGEoKQoreworICAgIC8vIEZJWE1FOiBpZiB3ZSBjYW4ndCBjb21wbGV0
ZWx5IGdldCByaWQgb2YgdGhpcyBtZXRob2QsIFNTRQorICAgIC8vIG9wdGltaXphdGlvbiBjb3Vs
ZCBiZSBjb25zaWRlcmVkIGlmIGl0IHNob3dzIHVwIGhvdCBvbiBwcm9maWxlcy4KKyAgICBpbnQg
bGVuID0gbV9GRlRTaXplIC8gMjsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgKytpKSB7
CisgICAgICAgIGludCBiYXNlQ29tcGxleEluZGV4ID0gMiAqIGk7CisgICAgICAgIG1fY29tcGxl
eERhdGFbYmFzZUNvbXBsZXhJbmRleF0gPSBtX3JlYWxEYXRhW2ldOworICAgICAgICBtX2NvbXBs
ZXhEYXRhW2Jhc2VDb21wbGV4SW5kZXggKyAxXSA9IG1faW1hZ0RhdGFbaV07CisgICAgfQorICAg
IHJldHVybiBjb25zdF9jYXN0PGZsb2F0Kj4obV9jb21wbGV4RGF0YS5kYXRhKCkpOworfQorCitE
RlRJX0RFU0NSSVBUT1JfSEFORExFIEZGVEZyYW1lOjpkZXNjcmlwdG9ySGFuZGxlRm9yU2l6ZSh1
bnNpZ25lZCBmZnRTaXplKQoreworICAgIGlmICghZGVzY3JpcHRvckhhbmRsZXMpIHsKKyAgICAg
ICAgZGVzY3JpcHRvckhhbmRsZXMgPSBuZXcgREZUSV9ERVNDUklQVE9SX0hBTkRMRVtrTWF4RkZU
UG93MlNpemVdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGtNYXhGRlRQb3cyU2l6ZTsg
KytpKQorICAgICAgICAgICAgZGVzY3JpcHRvckhhbmRsZXNbaV0gPSAwOworICAgIH0KKworICAg
IEFTU0VSVChmZnRTaXplKTsKKyAgICBpbnQgcG93MnNpemUgPSBzdGF0aWNfY2FzdDxpbnQ+KGxv
ZzIoZmZ0U2l6ZSkpOworICAgIEFTU0VSVChwb3cyc2l6ZSA8IGtNYXhGRlRQb3cyU2l6ZSk7Cisg
ICAgaWYgKCFkZXNjcmlwdG9ySGFuZGxlc1twb3cyc2l6ZV0pCisgICAgICAgIGRlc2NyaXB0b3JI
YW5kbGVzW3BvdzJzaXplXSA9IGNyZWF0ZURlc2NyaXB0b3JIYW5kbGUoZmZ0U2l6ZSk7CisgICAg
cmV0dXJuIGRlc2NyaXB0b3JIYW5kbGVzW3BvdzJzaXplXTsKK30KKworfSAvLyBuYW1lc3BhY2Ug
V2ViQ29yZQorCisjZW5kaWYgLy8gRU5BQkxFKFdFQl9BVURJTykK
</data>
<flag name="review"
          id="67446"
          type_id="1"
          status="+"
          setter="jamesr"
    />
    <flag name="commit-queue"
          id="67447"
          type_id="3"
          status="-"
          setter="kbr"
    />
          </attachment>
      

    </bug>

</bugzilla>