<?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>74048</bug_id>
          
          <creation_ts>2011-12-07 19:18:06 -0800</creation_ts>
          <short_desc>A function of vector multiply with SSE optimization is needed in VectorMath.cpp</short_desc>
          <delta_ts>2011-12-13 13:43:05 -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>Web Audio</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</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="Xingnan Wang">xingnan.wang</reporter>
          <assigned_to name="Xingnan Wang">xingnan.wang</assigned_to>
          <cc>benjamin</cc>
    
    <cc>crogers</cc>
    
    <cc>dglazkov</cc>
    
    <cc>peter</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>517114</commentid>
    <comment_count>0</comment_count>
    <who name="Xingnan Wang">xingnan.wang</who>
    <bug_when>2011-12-07 19:18:06 -0800</bug_when>
    <thetext>Here are only vadd and vsmul in vector lib, and a vmmul for two vectors multiply is widely used and it makes sense to add it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>517161</commentid>
    <comment_count>1</comment_count>
      <attachid>118323</attachid>
    <who name="Xingnan Wang">xingnan.wang</who>
    <bug_when>2011-12-07 21:08:15 -0800</bug_when>
    <thetext>Created attachment 118323
Patch

It achieves about 3.4x compared with usual way.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>518315</commentid>
    <comment_count>2</comment_count>
      <attachid>118323</attachid>
    <who name="Raymond Toy">rtoy</who>
    <bug_when>2011-12-09 10:06:28 -0800</bug_when>
    <thetext>Comment on attachment 118323
Patch

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

Please include a Changelog entry too.

&gt; Source/WebCore/platform/audio/VectorMath.cpp:231
&gt;  

Add comment saying vmmul performs an element-by-element multiply of two vectors, with user-specified strides for the sources and destination.

&gt; Source/WebCore/platform/audio/VectorMath.cpp:232
&gt; +void vmmul(const float* source1P, int sourceStride1, const float* source2P, int sourceStride2, float* destP, int destStride, size_t framesToProcess)

Why is it named vmmul instead of vmul?  What does the extra m mean?

&gt; Source/WebCore/platform/audio/VectorMath.cpp:237
&gt; +        int n = framesToProcess;

Since this is common to both SSE and non-SSE, move it to the top?  Also, why do we need the extra variable n?  Can&apos;t we use framesToProcess?

&gt; Source/WebCore/platform/audio/VectorMath.cpp:265
&gt; +                destP += 4;

As mentioned in another patch, it might be useful to add a macro to encapsulate the very similar code here and the branches below.  Something like

#define SSE2_MULT(s1Load, s2Load, dstore) \
  pSource1 = _mm_##s1Load##_ps(source1P); \
  pSource2 = _mm_##s2Load##_ps(source2P); \
  dest = __mm_mul_ps(pSource1, pSource2); \
  _mm_##dstore##_ps(destP, dest); \
  source1P += 4; \
  source2P += 4; \
  destP += 4\

Then use it:
  SSE2_MULT(load, load, store);

And SSE2_MULT(load,load, storeu); below and so on.

I think it makes it easier to see the similarity and differences between the branches.  Up to you do include this or not.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>518784</commentid>
    <comment_count>3</comment_count>
    <who name="Xingnan Wang">xingnan.wang</who>
    <bug_when>2011-12-10 05:18:08 -0800</bug_when>
    <thetext>(In reply to comment #2)
&gt; (From update of attachment 118323 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=118323&amp;action=review
&gt; 
&gt; Please include a Changelog entry too.
&gt; 
&gt; &gt; Source/WebCore/platform/audio/VectorMath.cpp:231
&gt; &gt;  
&gt; 
&gt; Add comment saying vmmul performs an element-by-element multiply of two vectors, with user-specified strides for the sources and destination.
&gt; 
&gt; &gt; Source/WebCore/platform/audio/VectorMath.cpp:232
&gt; &gt; +void vmmul(const float* source1P, int sourceStride1, const float* source2P, int sourceStride2, float* destP, int destStride, size_t framesToProcess)
&gt; 
&gt; Why is it named vmmul instead of vmul?  What does the extra m mean?
&gt; 
&gt; &gt; Source/WebCore/platform/audio/VectorMath.cpp:237
&gt; &gt; +        int n = framesToProcess;
&gt; 
&gt; Since this is common to both SSE and non-SSE, move it to the top?  Also, why do we need the extra variable n?  Can&apos;t we use framesToProcess?
&gt; 
&gt; &gt; Source/WebCore/platform/audio/VectorMath.cpp:265
&gt; &gt; +                destP += 4;
&gt; 
&gt; As mentioned in another patch, it might be useful to add a macro to encapsulate the very similar code here and the branches below.  Something like
&gt; 
&gt; #define SSE2_MULT(s1Load, s2Load, dstore) \
&gt;   pSource1 = _mm_##s1Load##_ps(source1P); \
&gt;   pSource2 = _mm_##s2Load##_ps(source2P); \
&gt;   dest = __mm_mul_ps(pSource1, pSource2); \
&gt;   _mm_##dstore##_ps(destP, dest); \
&gt;   source1P += 4; \
&gt;   source2P += 4; \
&gt;   destP += 4\
&gt; 
&gt; Then use it:
&gt;   SSE2_MULT(load, load, store);
&gt; 
&gt; And SSE2_MULT(load,load, storeu); below and so on.
&gt; 
&gt; I think it makes it easier to see the similarity and differences between the branches.  Up to you do include this or not.
Hi Raymond,
    Do you have the privilege to assign the bug to me? Because I cannot upload the patch by webkit-patch script if I am not the assignee. Thank you.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>518815</commentid>
    <comment_count>4</comment_count>
      <attachid>118323</attachid>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2011-12-10 11:43:50 -0800</bug_when>
    <thetext>Comment on attachment 118323
Patch

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

This change needs a ChangeLog.

&gt; Source/WebCore/platform/audio/VectorMath.cpp:318
&gt; +        // Non-SSE handling for left frames which are less than 4.
&gt; +        n %= 4;
&gt; +        while (n) {
&gt; +            *destP = *source1P * *source2P;
&gt; +            source1P++;
&gt; +            source2P++;
&gt; +            destP++;
&gt; +            n--;
&gt; +        }
&gt; +    } else { // If strides are not 1, rollback to normal algorithm.
&gt; +#endif
&gt; +    int n = framesToProcess;
&gt; +    while (n--) {
&gt; +        *destP = *source1P * *source2P;
&gt; +        source1P += sourceStride1;
&gt; +        source2P += sourceStride2;
&gt; +        destP += destStride;
&gt; +    }

You can unify those two path and avoid the else {} branch. Just declare &quot;int n = framesToProcess;&quot; above the block.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>519011</commentid>
    <comment_count>5</comment_count>
      <attachid>118731</attachid>
    <who name="Xingnan Wang">xingnan.wang</who>
    <bug_when>2011-12-11 21:38:18 -0800</bug_when>
    <thetext>Created attachment 118731
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>519014</commentid>
    <comment_count>6</comment_count>
      <attachid>118323</attachid>
    <who name="Xingnan Wang">xingnan.wang</who>
    <bug_when>2011-12-11 21:46:48 -0800</bug_when>
    <thetext>Comment on attachment 118323
Patch

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

&gt;&gt;&gt; Source/WebCore/platform/audio/VectorMath.cpp:231
&gt;&gt;&gt;  
&gt;&gt; 
&gt;&gt; Add comment saying vmmul performs an element-by-element multiply of two vectors, with user-specified strides for the sources and destination.
&gt; 
&gt; Hi Raymond,
&gt;     Do you have the privilege to assign the bug to me? Because I cannot upload the patch by webkit-patch script if I am not the assignee. Thank you.

Done.

&gt;&gt; Source/WebCore/platform/audio/VectorMath.cpp:232
&gt;&gt; +void vmmul(const float* source1P, int sourceStride1, const float* source2P, int sourceStride2, float* destP, int destStride, size_t framesToProcess)
&gt; 
&gt; Why is it named vmmul instead of vmul?  What does the extra m mean?

Yes, It should be vmul.

&gt;&gt; Source/WebCore/platform/audio/VectorMath.cpp:237
&gt;&gt; +        int n = framesToProcess;
&gt; 
&gt; Since this is common to both SSE and non-SSE, move it to the top?  Also, why do we need the extra variable n?  Can&apos;t we use framesToProcess?

I think it makes the code clear use a &quot;n&quot; in loop and easy to get the value of framesToProcess when n changed, also it not much different in the function, so both are OK in my opinion.

&gt;&gt; Source/WebCore/platform/audio/VectorMath.cpp:265
&gt;&gt; +                destP += 4;
&gt; 
&gt; As mentioned in another patch, it might be useful to add a macro to encapsulate the very similar code here and the branches below.  Something like
&gt; 
&gt; #define SSE2_MULT(s1Load, s2Load, dstore) \
&gt;   pSource1 = _mm_##s1Load##_ps(source1P); \
&gt;   pSource2 = _mm_##s2Load##_ps(source2P); \
&gt;   dest = __mm_mul_ps(pSource1, pSource2); \
&gt;   _mm_##dstore##_ps(destP, dest); \
&gt;   source1P += 4; \
&gt;   source2P += 4; \
&gt;   destP += 4\
&gt; 
&gt; Then use it:
&gt;   SSE2_MULT(load, load, store);
&gt; 
&gt; And SSE2_MULT(load,load, storeu); below and so on.
&gt; 
&gt; I think it makes it easier to see the similarity and differences between the branches.  Up to you do include this or not.

Used it, thanks.

&gt;&gt; Source/WebCore/platform/audio/VectorMath.cpp:318
&gt;&gt; +    }
&gt; 
&gt; You can unify those two path and avoid the else {} branch. Just declare &quot;int n = framesToProcess;&quot; above the block.

Good comments, thanks.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>519024</commentid>
    <comment_count>7</comment_count>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2011-12-11 22:45:59 -0800</bug_when>
    <thetext>Thanks for the patch.  I&apos;ve only had a quick look, but it seems like you&apos;re only adding the vmul() function to the non-OS(DARWIN) section.  I see that vecLib.framework already has a vmul(), but don&apos;t we need to do something similar to what we&apos;re doing for vsmul() and vadd() in the OS(DARWIN) section to deal with the 32bit vs. 64bit way the macros are defined?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>519036</commentid>
    <comment_count>8</comment_count>
      <attachid>118739</attachid>
    <who name="Xingnan Wang">xingnan.wang</who>
    <bug_when>2011-12-11 23:16:23 -0800</bug_when>
    <thetext>Created attachment 118739
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>519037</commentid>
    <comment_count>9</comment_count>
    <who name="Xingnan Wang">xingnan.wang</who>
    <bug_when>2011-12-11 23:19:58 -0800</bug_when>
    <thetext>(In reply to comment #7)
&gt; Thanks for the patch.  I&apos;ve only had a quick look, but it seems like you&apos;re only adding the vmul() function to the non-OS(DARWIN) section.  I see that vecLib.framework already has a vmul(), but don&apos;t we need to do something similar to what we&apos;re doing for vsmul() and vadd() in the OS(DARWIN) section to deal with the 32bit vs. 64bit way the macros are defined?

Yes, we should handle the vmul with the same way of vadd and vsmul for OS(DARWIN). Patch is updated as your comments, thank you.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>519043</commentid>
    <comment_count>10</comment_count>
      <attachid>118739</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-12-11 23:33:18 -0800</bug_when>
    <thetext>Comment on attachment 118739
Patch

Attachment 118739 did not pass chromium-ews (chromium-xvfb):
Output: http://queues.webkit.org/results/10839015</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>519049</commentid>
    <comment_count>11</comment_count>
      <attachid>118744</attachid>
    <who name="Xingnan Wang">xingnan.wang</who>
    <bug_when>2011-12-11 23:44:24 -0800</bug_when>
    <thetext>Created attachment 118744
Patch

Sorry for some noise code in the patch, update it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>519646</commentid>
    <comment_count>12</comment_count>
      <attachid>118744</attachid>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2011-12-12 16:11:06 -0800</bug_when>
    <thetext>Comment on attachment 118744
Patch

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

&gt; Source/WebCore/ChangeLog:12
&gt; +        - It`s a function for an element-by-element multiply of two float vectors and we get 
&gt; +        about 3.4x performance improvement with SSE2 optimization compared with the common 
&gt; +        multiply.
&gt; +
&gt; +        - Use the function in AudioBus::copyWithSampleAccurateGainValuesFrom().

You should not start the sentences by &quot;- &quot;. 
&quot;It`s&quot; -&gt; &quot;It&apos;s&quot; + the subject &quot;It&quot; is not clear in that sentence.

&gt; Source/WebCore/platform/audio/VectorMath.cpp:246
&gt; +    // About 3.4x performance improvement with SSE2 optimization for the very common case of all the strides are 1.

This should not be a comment. The commit message is enough information.

&gt; Source/WebCore/platform/audio/VectorMath.cpp:248
&gt; +    if ((sourceStride1 ==1) &amp;&amp; (sourceStride2 == 1) &amp;&amp; (destStride == 1)) {

Coding style: &quot;sourceStride1 ==1&quot; -&gt; &quot;sourceStride1 == 1&quot;

&gt; Source/WebCore/platform/audio/VectorMath.cpp:250
&gt; +        // If the sourceP address is not 16-byte aligned, the first several frames (at most three) should be processed seperately.

sourceP -&gt; source1P

&gt; Source/WebCore/platform/audio/VectorMath.cpp:268
&gt; +#define SSE2_MULT(l, s)                                \

please use &quot;loadInstr&quot; and &quot;storeInstr&quot; instead of l, and s. Explanatory variable names are better for readability.

&gt; Source/WebCore/platform/audio/VectorMath.cpp:293
&gt; +        // Non-SSE handling for left frames which is less than 4.

&quot; which is less than 4&quot; in the sentence is unclear without reading the code above. Maybe you should get rid of this part of the comment, and have a variable for &quot;n % 4&quot; when you compute endP.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>519853</commentid>
    <comment_count>13</comment_count>
      <attachid>118951</attachid>
    <who name="Xingnan Wang">xingnan.wang</who>
    <bug_when>2011-12-12 21:38:51 -0800</bug_when>
    <thetext>Created attachment 118951
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>519854</commentid>
    <comment_count>14</comment_count>
    <who name="Xingnan Wang">xingnan.wang</who>
    <bug_when>2011-12-12 21:40:03 -0800</bug_when>
    <thetext>(In reply to comment #12)
&gt; (From update of attachment 118744 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=118744&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/ChangeLog:12
&gt; &gt; +        - It`s a function for an element-by-element multiply of two float vectors and we get 
&gt; &gt; +        about 3.4x performance improvement with SSE2 optimization compared with the common 
&gt; &gt; +        multiply.
&gt; &gt; +
&gt; &gt; +        - Use the function in AudioBus::copyWithSampleAccurateGainValuesFrom().
&gt; 
&gt; You should not start the sentences by &quot;- &quot;. 
&gt; &quot;It`s&quot; -&gt; &quot;It&apos;s&quot; + the subject &quot;It&quot; is not clear in that sentence.
&gt; 
&gt; &gt; Source/WebCore/platform/audio/VectorMath.cpp:246
&gt; &gt; +    // About 3.4x performance improvement with SSE2 optimization for the very common case of all the strides are 1.
&gt; 
&gt; This should not be a comment. The commit message is enough information.
&gt; 
&gt; &gt; Source/WebCore/platform/audio/VectorMath.cpp:248
&gt; &gt; +    if ((sourceStride1 ==1) &amp;&amp; (sourceStride2 == 1) &amp;&amp; (destStride == 1)) {
&gt; 
&gt; Coding style: &quot;sourceStride1 ==1&quot; -&gt; &quot;sourceStride1 == 1&quot;
&gt; 
&gt; &gt; Source/WebCore/platform/audio/VectorMath.cpp:250
&gt; &gt; +        // If the sourceP address is not 16-byte aligned, the first several frames (at most three) should be processed seperately.
&gt; 
&gt; sourceP -&gt; source1P
&gt; 
&gt; &gt; Source/WebCore/platform/audio/VectorMath.cpp:268
&gt; &gt; +#define SSE2_MULT(l, s)                                \
&gt; 
&gt; please use &quot;loadInstr&quot; and &quot;storeInstr&quot; instead of l, and s. Explanatory variable names are better for readability.
&gt; 
&gt; &gt; Source/WebCore/platform/audio/VectorMath.cpp:293
&gt; &gt; +        // Non-SSE handling for left frames which is less than 4.
&gt; 
&gt; &quot; which is less than 4&quot; in the sentence is unclear without reading the code above. Maybe you should get rid of this part of the comment, and have a variable for &quot;n % 4&quot; when you compute endP.

Thanks very much and patch is updated.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>519882</commentid>
    <comment_count>15</comment_count>
      <attachid>118951</attachid>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2011-12-12 23:14:36 -0800</bug_when>
    <thetext>Comment on attachment 118951
Patch

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

&gt; Source/WebCore/platform/audio/VectorMath.cpp:278
&gt; +#define SSE2_MULT(loadInstr, storeInstr)                   \
&gt; +            {                                              \
&gt; +                pSource1 = _mm_load_ps(source1P);          \
&gt; +                pSource2 = _mm_##loadInstr##_ps(source2P); \
&gt; +                dest = _mm_mul_ps(pSource1, pSource2);     \
&gt; +                _mm_##storeInstr##_ps(destP, dest);        \
&gt; +                source1P += 4;                             \
&gt; +                source2P += 4;                             \
&gt; +                destP += 4;                                \
&gt; +            }
&gt; +

You could even put the while  (destP &lt; endP) in here.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>519884</commentid>
    <comment_count>16</comment_count>
      <attachid>118951</attachid>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2011-12-12 23:17:13 -0800</bug_when>
    <thetext>Comment on attachment 118951
Patch

If you can just update the macro, I will land the updated version.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>519936</commentid>
    <comment_count>17</comment_count>
      <attachid>118951</attachid>
    <who name="Xingnan Wang">xingnan.wang</who>
    <bug_when>2011-12-13 00:59:41 -0800</bug_when>
    <thetext>Comment on attachment 118951
Patch

diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog
index f123fbf..8cb44bb 100644
--- a/Source/WebCore/ChangeLog
+++ b/Source/WebCore/ChangeLog
@@ -1,3 +1,22 @@
+2011-12-13  Xingnan Wang  &lt;xingnan.wang@intel.com&gt;
+
+        Implement a function of vector multiply with SSE2 optimization in VectorMath.cpp.
+        https://bugs.webkit.org/show_bug.cgi?id=74048
+
+        Reviewed by NOBODY (OOPS!).
+
+        The vmul is a function for an element-by-element multiply of two float vectors and we 
+        get about 3.4x performance improvement with SSE2 optimization compared with the common 
+        multiply.
+
+        Use vmul in AudioBus::copyWithSampleAccurateGainValuesFrom().
+
+        * platform/audio/AudioBus.cpp:
+        (WebCore::AudioBus::copyWithSampleAccurateGainValuesFrom):
+        * platform/audio/VectorMath.cpp:
+        (WebCore::VectorMath::vmul):
+        * platform/audio/VectorMath.h:
+
 2011-12-13  Yosifumi Inoue  &lt;yosin@chromium.org&gt;
 
         RenderTheme should have a function for disabled text color adjustment
diff --git a/Source/WebCore/platform/audio/AudioBus.cpp b/Source/WebCore/platform/audio/AudioBus.cpp
index 6c076b7..b5ec246 100644
--- a/Source/WebCore/platform/audio/AudioBus.cpp
+++ b/Source/WebCore/platform/audio/AudioBus.cpp
@@ -382,15 +382,13 @@ void AudioBus::copyWithSampleAccurateGainValuesFrom(const AudioBus &amp;sourceBus, f
         return;
     }
 
-    // FIXME: this can potentially use SIMD optimizations with vector libraries.
     // We handle both the 1 -&gt; N and N -&gt; N case here.
     const float* source = sourceBus.channel(0)-&gt;data();
     for (unsigned channelIndex = 0; channelIndex &lt; numberOfChannels(); ++channelIndex) {
         if (sourceBus.numberOfChannels() == numberOfChannels())
             source = sourceBus.channel(channelIndex)-&gt;data();
         float* destination = channel(channelIndex)-&gt;data();
-        for (unsigned i = 0; i &lt; numberOfGainValues; ++i)
-            destination[i] = source[i] * gainValues[i];
+        vmul(source, 1, gainValues, 1, destination, 1, numberOfGainValues);
     }
 }
 
diff --git a/Source/WebCore/platform/audio/VectorMath.cpp b/Source/WebCore/platform/audio/VectorMath.cpp
index ff4406a..2e6d1e1 100644
--- a/Source/WebCore/platform/audio/VectorMath.cpp
+++ b/Source/WebCore/platform/audio/VectorMath.cpp
@@ -63,6 +63,15 @@ void vadd(const float* source1P, int sourceStride1, const float* source2P, int s
 #endif
 }
 
+void vmul(const float* source1P, int sourceStride1, const float* source2P, int sourceStride2, float* destP, int destStride, size_t framesToProcess)
+{
+#if defined(__ppc__) || defined(__i386__)
+    ::vmul(source1P, sourceStride1, source2P, sourceStride2, destP, destStride, framesToProcess);
+#else
+    vDSP_vmul(source1P, sourceStride1, source2P, sourceStride2, destP, destStride, framesToProcess);
+#endif
+}
+
 #else
 
 void vsmul(const float* sourceP, int sourceStride, const float* scale, float* destP, int destStride, size_t framesToProcess)
@@ -229,6 +238,66 @@ void vadd(const float* source1P, int sourceStride1, const float* source2P, int s
 #endif
 }
 
+void vmul(const float* source1P, int sourceStride1, const float* source2P, int sourceStride2, float* destP, int destStride, size_t framesToProcess)
+{
+
+    int n = framesToProcess;
+
+#ifdef __SSE2__
+    if ((sourceStride1 == 1) &amp;&amp; (sourceStride2 == 1) &amp;&amp; (destStride == 1)) {
+
+        // If the source1P address is not 16-byte aligned, the first several frames (at most three) should be processed seperately.
+        while ((reinterpret_cast&lt;uintptr_t&gt;(source1P) &amp; 0x0F) &amp;&amp; n) {
+            *destP = *source1P * *source2P;
+            source1P++;
+            source2P++;
+            destP++;
+            n--;
+        }
+
+        // Now the source1P address aligned and start to apply SSE.
+        int tailFrames = n % 4;
+        float* endP = destP + n - tailFrames;
+        __m128 pSource1;
+        __m128 pSource2;
+        __m128 dest;
+
+        bool source2Aligned = !(reinterpret_cast&lt;uintptr_t&gt;(source2P) &amp; 0x0F);
+        bool destAligned = !(reinterpret_cast&lt;uintptr_t&gt;(destP) &amp; 0x0F);
+
+#define SSE2_MULT(loadInstr, storeInstr)                   \
+            while (destP &lt; endP)                           \
+            {                                              \
+                pSource1 = _mm_load_ps(source1P);          \
+                pSource2 = _mm_##loadInstr##_ps(source2P); \
+                dest = _mm_mul_ps(pSource1, pSource2);     \
+                _mm_##storeInstr##_ps(destP, dest);        \
+                source1P += 4;                             \
+                source2P += 4;                             \
+                destP += 4;                                \
+            }
+
+        if (source2Aligned &amp;&amp; destAligned) // Both aligned.
+            SSE2_MULT(load, store)
+        else if (source2Aligned &amp;&amp; !destAligned) // Source2 is aligned but dest not.
+            SSE2_MULT(load, storeu)
+        else if (!source2Aligned &amp;&amp; destAligned) // Dest is aligned but source2 not.
+            SSE2_MULT(loadu, store)
+        else // Neither aligned.
+            SSE2_MULT(loadu, storeu)
+
+        n = tailFrames;
+    }
+#endif
+    while (n) {
+        *destP = *source1P * *source2P;
+        source1P += sourceStride1;
+        source2P += sourceStride2;
+        destP += destStride;
+        n--;
+    }
+}
+
 #endif // OS(DARWIN)
 
 } // namespace VectorMath
diff --git a/Source/WebCore/platform/audio/VectorMath.h b/Source/WebCore/platform/audio/VectorMath.h
index 0360bdb..a3a92e5 100644
--- a/Source/WebCore/platform/audio/VectorMath.h
+++ b/Source/WebCore/platform/audio/VectorMath.h
@@ -34,6 +34,9 @@ namespace VectorMath {
 void vsmul(const float* sourceP, int sourceStride, const float* scale, float* destP, int destStride, size_t framesToProcess);
 void vadd(const float* source1P, int sourceStride1, const float* source2P, int sourceStride2, float* destP, int destStride, size_t framesToProcess);
 
+// For an element-by-element multiply of two float vectors.
+void vmul(const float* source1P, int sourceStride1, const float* source2P, int sourceStride2, float* destP, int destStride, size_t framesToProcess);
+
 } // namespace VectorMath
 
 } // namespace WebCore</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>519939</commentid>
    <comment_count>18</comment_count>
      <attachid>118971</attachid>
    <who name="Xingnan Wang">xingnan.wang</who>
    <bug_when>2011-12-13 01:03:39 -0800</bug_when>
    <thetext>Created attachment 118971
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>519941</commentid>
    <comment_count>19</comment_count>
    <who name="Xingnan Wang">xingnan.wang</who>
    <bug_when>2011-12-13 01:04:35 -0800</bug_when>
    <thetext>(In reply to comment #16)
&gt; (From update of attachment 118951 [details])
&gt; If you can just update the macro, I will land the updated version.

Just updated the macro, thanks.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>520345</commentid>
    <comment_count>20</comment_count>
      <attachid>118971</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-12-13 13:42:56 -0800</bug_when>
    <thetext>Comment on attachment 118971
Patch

Clearing flags on attachment: 118971

Committed r102702: &lt;http://trac.webkit.org/changeset/102702&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>520347</commentid>
    <comment_count>21</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-12-13 13:43:05 -0800</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>118323</attachid>
            <date>2011-12-07 21:08:15 -0800</date>
            <delta_ts>2011-12-11 21:46:48 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>Patch</filename>
            <type>text/plain</type>
            <size>5140</size>
            <attacher name="Xingnan Wang">xingnan.wang</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL0F1ZGlvQnVzLmNwcCBi
L1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL0F1ZGlvQnVzLmNwcAppbmRleCA2YzA3NmI3
Li45YzQ4OGM3IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9BdWRp
b0J1cy5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vQXVkaW9CdXMuY3Bw
CkBAIC0zODksOCArMzg5LDcgQEAgdm9pZCBBdWRpb0J1czo6Y29weVdpdGhTYW1wbGVBY2N1cmF0
ZUdhaW5WYWx1ZXNGcm9tKGNvbnN0IEF1ZGlvQnVzICZzb3VyY2VCdXMsIGYKICAgICAgICAgaWYg
KHNvdXJjZUJ1cy5udW1iZXJPZkNoYW5uZWxzKCkgPT0gbnVtYmVyT2ZDaGFubmVscygpKQogICAg
ICAgICAgICAgc291cmNlID0gc291cmNlQnVzLmNoYW5uZWwoY2hhbm5lbEluZGV4KS0+ZGF0YSgp
OwogICAgICAgICBmbG9hdCogZGVzdGluYXRpb24gPSBjaGFubmVsKGNoYW5uZWxJbmRleCktPmRh
dGEoKTsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG51bWJlck9mR2FpblZhbHVl
czsgKytpKQotICAgICAgICAgICAgZGVzdGluYXRpb25baV0gPSBzb3VyY2VbaV0gKiBnYWluVmFs
dWVzW2ldOworICAgICAgICB2bW11bChzb3VyY2UsIDEsIGdhaW5WYWx1ZXMsIDEsIGRlc3RpbmF0
aW9uLCAxLCBudW1iZXJPZkdhaW5WYWx1ZXMpOwogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vVmVjdG9yTWF0aC5jcHAgYi9Tb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9hdWRpby9WZWN0b3JNYXRoLmNwcAppbmRleCBmZjQ0MDZhLi5kMjY5ZTIzIDEw
MDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9WZWN0b3JNYXRoLmNwcAor
KysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9WZWN0b3JNYXRoLmNwcApAQCAtMjI5
LDYgKzIyOSw5OCBAQCB2b2lkIHZhZGQoY29uc3QgZmxvYXQqIHNvdXJjZTFQLCBpbnQgc291cmNl
U3RyaWRlMSwgY29uc3QgZmxvYXQqIHNvdXJjZTJQLCBpbnQgcwogI2VuZGlmCiB9CiAKK3ZvaWQg
dm1tdWwoY29uc3QgZmxvYXQqIHNvdXJjZTFQLCBpbnQgc291cmNlU3RyaWRlMSwgY29uc3QgZmxv
YXQqIHNvdXJjZTJQLCBpbnQgc291cmNlU3RyaWRlMiwgZmxvYXQqIGRlc3RQLCBpbnQgZGVzdFN0
cmlkZSwgc2l6ZV90IGZyYW1lc1RvUHJvY2VzcykKK3sKKyNpZmRlZiBfX1NTRTJfXworICAgIGlm
ICgoc291cmNlU3RyaWRlMSA9PTEpICYmIChzb3VyY2VTdHJpZGUyID09IDEpICYmIChkZXN0U3Ry
aWRlID09IDEpKSB7CisKKyAgICAgICAgaW50IG4gPSBmcmFtZXNUb1Byb2Nlc3M7CisKKyAgICAg
ICAgLy8gSWYgdGhlIHNvdXJjZVAgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZCwgdGhlIGZpcnN0IHNl
dmVyYWwgZnJhbWVzIChhdCBtb3N0IHRocmVlKSBzaG91bGQgYmUgcHJvY2Vzc2VkIHNlcGVyYXRl
bHkuCisgICAgICAgIHdoaWxlICgocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KHNvdXJjZTFQ
KSAmIDB4MEYpICYmIG4pIHsKKyAgICAgICAgICAgICpkZXN0UCA9ICpzb3VyY2UxUCAqICpzb3Vy
Y2UyUDsKKyAgICAgICAgICAgIHNvdXJjZTFQKys7CisgICAgICAgICAgICBzb3VyY2UyUCsrOwor
ICAgICAgICAgICAgZGVzdFArKzsKKyAgICAgICAgICAgIG4tLTsKKyAgICAgICAgfQorCisgICAg
ICAgIC8vIE5vdyB0aGUgc291cmNlMVAgaXMgYWxpZ25lZCBhbmQgc3RhcnQgdG8gYXBwbHkgU1NF
LgorICAgICAgICBmbG9hdCogZW5kUCA9IGRlc3RQICsgbiAtIG4gJSA0OworICAgICAgICBfX20x
MjggcFNvdXJjZTE7CisgICAgICAgIF9fbTEyOCBwU291cmNlMjsKKyAgICAgICAgX19tMTI4IGRl
c3Q7CisKKyAgICAgICAgYm9vbCBzb3VyY2UyQWxpZ25lZCA9ICEocmVpbnRlcnByZXRfY2FzdDx1
aW50cHRyX3Q+KHNvdXJjZTJQKSAmIDB4MEYpOworICAgICAgICBib29sIGRlc3RBbGlnbmVkID0g
IShyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oZGVzdFApICYgMHgwRik7CisKKyAgICAgICAg
aWYgKHNvdXJjZTJBbGlnbmVkICYmIGRlc3RBbGlnbmVkKSB7IC8vIEJvdGggYXJlIGFsaWduZWQu
CisgICAgICAgICAgICB3aGlsZSAoZGVzdFAgPCBlbmRQKSB7CisgICAgICAgICAgICAgICAgcFNv
dXJjZTEgPSBfbW1fbG9hZF9wcyhzb3VyY2UxUCk7CisgICAgICAgICAgICAgICAgcFNvdXJjZTIg
PSBfbW1fbG9hZF9wcyhzb3VyY2UyUCk7CisgICAgICAgICAgICAgICAgZGVzdCA9IF9tbV9tdWxf
cHMocFNvdXJjZTEsIHBTb3VyY2UyKTsKKyAgICAgICAgICAgICAgICBfbW1fc3RvcmVfcHMoZGVz
dFAsIGRlc3QpOworICAgICAgICAgICAgICAgIHNvdXJjZTFQICs9IDQ7CisgICAgICAgICAgICAg
ICAgc291cmNlMlAgKz0gNDsKKyAgICAgICAgICAgICAgICBkZXN0UCArPSA0OworICAgICAgICAg
ICAgfQorCisgICAgICAgIH0gZWxzZSBpZiAoc291cmNlMkFsaWduZWQgJiYgIWRlc3RBbGlnbmVk
KSB7IC8vIFNvdXJjZTIgaXMgYWxpZ25lZCBidXQgZGVzdCBub3QuCisgICAgICAgICAgICB3aGls
ZSAoZGVzdFAgPCBlbmRQKSB7CisgICAgICAgICAgICAgICAgcFNvdXJjZTEgPSBfbW1fbG9hZF9w
cyhzb3VyY2UxUCk7CisgICAgICAgICAgICAgICAgcFNvdXJjZTIgPSBfbW1fbG9hZF9wcyhzb3Vy
Y2UyUCk7CisgICAgICAgICAgICAgICAgZGVzdCA9IF9tbV9tdWxfcHMocFNvdXJjZTEsIHBTb3Vy
Y2UyKTsKKyAgICAgICAgICAgICAgICBfbW1fc3RvcmV1X3BzKGRlc3RQLCBkZXN0KTsKKyAgICAg
ICAgICAgICAgICBzb3VyY2UxUCArPSA0OworICAgICAgICAgICAgICAgIHNvdXJjZTJQICs9IDQ7
CisgICAgICAgICAgICAgICAgZGVzdFAgKz0gNDsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9
IGVsc2UgaWYgKCFzb3VyY2UyQWxpZ25lZCAmJiBkZXN0QWxpZ25lZCkgeyAvLyBEZXN0IGlzIGFs
aWdlbmQgYnV0IHNvdXJjZTIgbm90LiAKKyAgICAgICAgICAgIHdoaWxlIChkZXN0UCA8IGVuZFAp
IHsKKyAgICAgICAgICAgICAgICBwU291cmNlMSA9IF9tbV9sb2FkX3BzKHNvdXJjZTFQKTsKKyAg
ICAgICAgICAgICAgICBwU291cmNlMiA9IF9tbV9sb2FkdV9wcyhzb3VyY2UyUCk7CisgICAgICAg
ICAgICAgICAgZGVzdCA9IF9tbV9tdWxfcHMocFNvdXJjZTEsIHBTb3VyY2UyKTsKKyAgICAgICAg
ICAgICAgICBfbW1fc3RvcmVfcHMoZGVzdFAsIGRlc3QpOworICAgICAgICAgICAgICAgIHNvdXJj
ZTFQICs9IDQ7CisgICAgICAgICAgICAgICAgc291cmNlMlAgKz0gNDsKKyAgICAgICAgICAgICAg
ICBkZXN0UCArPSA0OworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKCFzb3VyY2Uy
QWxpZ25lZCAmJiAhZGVzdEFsaWduZWQpIHsgLy8gQm90aCBzb3VyY2UyIGFuZCBkZXN0IGFyZSBu
b3QgYWxpZ25lZC4KKyAgICAgICAgICAgIHdoaWxlIChkZXN0UCA8IGVuZFApIHsKKyAgICAgICAg
ICAgICAgICBwU291cmNlMSA9IF9tbV9sb2FkX3BzKHNvdXJjZTFQKTsKKyAgICAgICAgICAgICAg
ICBwU291cmNlMiA9IF9tbV9sb2FkdV9wcyhzb3VyY2UyUCk7CisgICAgICAgICAgICAgICAgZGVz
dCA9IF9tbV9tdWxfcHMocFNvdXJjZTEsIHBTb3VyY2UyKTsKKyAgICAgICAgICAgICAgICBfbW1f
c3RvcmV1X3BzKGRlc3RQLCBkZXN0KTsKKyAgICAgICAgICAgICAgICBzb3VyY2UxUCArPSA0Owor
ICAgICAgICAgICAgICAgIHNvdXJjZTJQICs9IDQ7CisgICAgICAgICAgICAgICAgZGVzdFAgKz0g
NDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIE5vbi1TU0UgaGFuZGxp
bmcgZm9yIGxlZnQgZnJhbWVzIHdoaWNoIGFyZSBsZXNzIHRoYW4gNC4KKyAgICAgICAgbiAlPSA0
OworICAgICAgICB3aGlsZSAobikgeworICAgICAgICAgICAgKmRlc3RQID0gKnNvdXJjZTFQICog
KnNvdXJjZTJQOworICAgICAgICAgICAgc291cmNlMVArKzsKKyAgICAgICAgICAgIHNvdXJjZTJQ
Kys7CisgICAgICAgICAgICBkZXN0UCsrOworICAgICAgICAgICAgbi0tOworICAgICAgICB9Cisg
ICAgfSBlbHNlIHsgLy8gSWYgc3RyaWRlcyBhcmUgbm90IDEsIHJvbGxiYWNrIHRvIG5vcm1hbCBh
bGdvcml0aG0uCisjZW5kaWYKKyAgICBpbnQgbiA9IGZyYW1lc1RvUHJvY2VzczsKKyAgICB3aGls
ZSAobi0tKSB7CisgICAgICAgICpkZXN0UCA9ICpzb3VyY2UxUCAqICpzb3VyY2UyUDsKKyAgICAg
ICAgc291cmNlMVAgKz0gc291cmNlU3RyaWRlMTsKKyAgICAgICAgc291cmNlMlAgKz0gc291cmNl
U3RyaWRlMjsKKyAgICAgICAgZGVzdFAgKz0gZGVzdFN0cmlkZTsKKyAgICB9CisjaWZkZWYgX19T
U0UyX18KKyAgICB9CisjZW5kaWYKK30KKwogI2VuZGlmIC8vIE9TKERBUldJTikKIAogfSAvLyBu
YW1lc3BhY2UgVmVjdG9yTWF0aApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
YXVkaW8vVmVjdG9yTWF0aC5oIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vVmVjdG9y
TWF0aC5oCmluZGV4IDAzNjBiZGIuLjk2ZTg0MTEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL2F1ZGlvL1ZlY3Rvck1hdGguaAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9hdWRpby9WZWN0b3JNYXRoLmgKQEAgLTMzLDYgKzMzLDcgQEAgbmFtZXNwYWNlIFZlY3Rvck1h
dGggewogCiB2b2lkIHZzbXVsKGNvbnN0IGZsb2F0KiBzb3VyY2VQLCBpbnQgc291cmNlU3RyaWRl
LCBjb25zdCBmbG9hdCogc2NhbGUsIGZsb2F0KiBkZXN0UCwgaW50IGRlc3RTdHJpZGUsIHNpemVf
dCBmcmFtZXNUb1Byb2Nlc3MpOwogdm9pZCB2YWRkKGNvbnN0IGZsb2F0KiBzb3VyY2UxUCwgaW50
IHNvdXJjZVN0cmlkZTEsIGNvbnN0IGZsb2F0KiBzb3VyY2UyUCwgaW50IHNvdXJjZVN0cmlkZTIs
IGZsb2F0KiBkZXN0UCwgaW50IGRlc3RTdHJpZGUsIHNpemVfdCBmcmFtZXNUb1Byb2Nlc3MpOwor
dm9pZCB2bW11bChjb25zdCBmbG9hdCogc291cmNlMVAsIGludCBzb3VyY2VTdHJpZGUxLCBjb25z
dCBmbG9hdCogc291cmNlMlAsIGludCBzb3VyY2VTdHJpZGUyLCBmbG9hdCogZGVzdFAsIGludCBk
ZXN0U3RyaWRlLCBzaXplX3QgZnJhbWVzVG9Qcm9jZXNzKTsKIAogfSAvLyBuYW1lc3BhY2UgVmVj
dG9yTWF0aAogCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>118731</attachid>
            <date>2011-12-11 21:38:18 -0800</date>
            <delta_ts>2011-12-11 23:16:23 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>Patch</filename>
            <type>text/plain</type>
            <size>5865</size>
            <attacher name="Xingnan Wang">xingnan.wang</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZwppbmRleCBkY2I0ZWY3Li5hOWQ0ZTBjIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjIg
QEAKKzIwMTEtMTItMTEgIFhpbmduYW4gV2FuZyAgPHhpbmduYW4ud2FuZ0BpbnRlbC5jb20+CisK
KyAgICAgICAgSW1wbGVtZW50IGEgZnVuY3Rpb24gb2YgdmVjdG9yIG11bHRpcGx5IHdpdGggU1NF
MiBvcHRpbWl6YXRpb24gaW4gVmVjdG9yTWF0aC5jcHAuCisgICAgICAgIGh0dHBzOi8vYnVncy53
ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD03NDA0OAorCisgICAgICAgIFJldmlld2VkIGJ5IE5P
Qk9EWSAoT09QUyEpLgorCisgICAgICAgIC0gSXRgcyBhIGZ1bmN0aW9uIGZvciBhbiBlbGVtZW50
LWJ5LWVsZW1lbnQgbXVsdGlwbHkgb2YgdHdvIGZsb2F0IHZlY3RvcnMgYW5kIHdlIGdldCAKKyAg
ICAgICAgYWJvdXQgMy40eCBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudCB3aXRoIFNTRTIgb3B0aW1p
emF0aW9uIGNvbXBhcmVkIHdpdGggdGhlIGNvbW1vbiAKKyAgICAgICAgbXVsdGlwbHkuCisKKyAg
ICAgICAgLSBVc2UgdGhlIGZ1bmN0aW9uIGluIEF1ZGlvQnVzOjpjb3B5V2l0aFNhbXBsZUFjY3Vy
YXRlR2FpblZhbHVlc0Zyb20oKS4KKworICAgICAgICAqIHBsYXRmb3JtL2F1ZGlvL0F1ZGlvQnVz
LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvQnVzOjpjb3B5V2l0aFNhbXBsZUFjY3VyYXRl
R2FpblZhbHVlc0Zyb20pOgorICAgICAgICAqIHBsYXRmb3JtL2F1ZGlvL1ZlY3Rvck1hdGguY3Bw
OgorICAgICAgICAoV2ViQ29yZTo6VmVjdG9yTWF0aDo6dm11bCk6CisgICAgICAgICogcGxhdGZv
cm0vYXVkaW8vVmVjdG9yTWF0aC5oOgorCiAyMDExLTEyLTExICBMdWtlIE1hY3BoZXJzb24gICA8
bWFjcGhlcnNvbkBjaHJvbWl1bS5vcmc+CiAKICAgICAgICAgSW1wbGVtZW50IHdlYmtpdC1saW5l
LWdyaWQgYW5kIHdlYmtpdC1saW5lLWdyaWQtc25hcCBDU1MgcHJvcGVydGllcyBpbiBDU1NTdHls
ZUFwcGx5UHJvcGVydHkuCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9hdWRp
by9BdWRpb0J1cy5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9BdWRpb0J1cy5j
cHAKaW5kZXggNmMwNzZiNy4uYjVlYzI0NiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vYXVkaW8vQXVkaW9CdXMuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2F1
ZGlvL0F1ZGlvQnVzLmNwcApAQCAtMzgyLDE1ICszODIsMTMgQEAgdm9pZCBBdWRpb0J1czo6Y29w
eVdpdGhTYW1wbGVBY2N1cmF0ZUdhaW5WYWx1ZXNGcm9tKGNvbnN0IEF1ZGlvQnVzICZzb3VyY2VC
dXMsIGYKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIC8vIEZJWE1FOiB0aGlzIGNhbiBw
b3RlbnRpYWxseSB1c2UgU0lNRCBvcHRpbWl6YXRpb25zIHdpdGggdmVjdG9yIGxpYnJhcmllcy4K
ICAgICAvLyBXZSBoYW5kbGUgYm90aCB0aGUgMSAtPiBOIGFuZCBOIC0+IE4gY2FzZSBoZXJlLgog
ICAgIGNvbnN0IGZsb2F0KiBzb3VyY2UgPSBzb3VyY2VCdXMuY2hhbm5lbCgwKS0+ZGF0YSgpOwog
ICAgIGZvciAodW5zaWduZWQgY2hhbm5lbEluZGV4ID0gMDsgY2hhbm5lbEluZGV4IDwgbnVtYmVy
T2ZDaGFubmVscygpOyArK2NoYW5uZWxJbmRleCkgewogICAgICAgICBpZiAoc291cmNlQnVzLm51
bWJlck9mQ2hhbm5lbHMoKSA9PSBudW1iZXJPZkNoYW5uZWxzKCkpCiAgICAgICAgICAgICBzb3Vy
Y2UgPSBzb3VyY2VCdXMuY2hhbm5lbChjaGFubmVsSW5kZXgpLT5kYXRhKCk7CiAgICAgICAgIGZs
b2F0KiBkZXN0aW5hdGlvbiA9IGNoYW5uZWwoY2hhbm5lbEluZGV4KS0+ZGF0YSgpOwotICAgICAg
ICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbnVtYmVyT2ZHYWluVmFsdWVzOyArK2kpCi0gICAg
ICAgICAgICBkZXN0aW5hdGlvbltpXSA9IHNvdXJjZVtpXSAqIGdhaW5WYWx1ZXNbaV07CisgICAg
ICAgIHZtdWwoc291cmNlLCAxLCBnYWluVmFsdWVzLCAxLCBkZXN0aW5hdGlvbiwgMSwgbnVtYmVy
T2ZHYWluVmFsdWVzKTsKICAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL2F1ZGlvL1ZlY3Rvck1hdGguY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYXVk
aW8vVmVjdG9yTWF0aC5jcHAKaW5kZXggZmY0NDA2YS4uNTkxNDBmYiAxMDA2NDQKLS0tIGEvU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vVmVjdG9yTWF0aC5jcHAKKysrIGIvU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vYXVkaW8vVmVjdG9yTWF0aC5jcHAKQEAgLTIyOSw2ICsyMjksNzEgQEAg
dm9pZCB2YWRkKGNvbnN0IGZsb2F0KiBzb3VyY2UxUCwgaW50IHNvdXJjZVN0cmlkZTEsIGNvbnN0
IGZsb2F0KiBzb3VyY2UyUCwgaW50IHMKICNlbmRpZgogfQogCit2b2lkIHZtdWwoY29uc3QgZmxv
YXQqIHNvdXJjZTFQLCBpbnQgc291cmNlU3RyaWRlMSwgY29uc3QgZmxvYXQqIHNvdXJjZTJQLCBp
bnQgc291cmNlU3RyaWRlMiwgZmxvYXQqIGRlc3RQLCBpbnQgZGVzdFN0cmlkZSwgc2l6ZV90IGZy
YW1lc1RvUHJvY2VzcykKK3sKKworICAgIGludCBuID0gZnJhbWVzVG9Qcm9jZXNzOworCisgICAg
Ly8gQWJvdXQgMy40eCBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudCB3aXRoIFNTRTIgb3B0aW1pemF0
aW9uIGZvciB0aGUgdmVyeSBjb21tb24gY2FzZSBvZiBhbGwgdGhlIHN0cmlkZXMgYXJlIDEuCisj
aWZkZWYgX19TU0UyX18KKyAgICBpZiAoKHNvdXJjZVN0cmlkZTEgPT0xKSAmJiAoc291cmNlU3Ry
aWRlMiA9PSAxKSAmJiAoZGVzdFN0cmlkZSA9PSAxKSkgeworCisgICAgICAgIC8vIElmIHRoZSBz
b3VyY2VQIGFkZHJlc3MgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZCwgdGhlIGZpcnN0IHNldmVyYWwg
ZnJhbWVzIChhdCBtb3N0IHRocmVlKSBzaG91bGQgYmUgcHJvY2Vzc2VkIHNlcGVyYXRlbHkuCisg
ICAgICAgIHdoaWxlICgocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KHNvdXJjZTFQKSAmIDB4
MEYpICYmIG4pIHsKKyAgICAgICAgICAgICpkZXN0UCA9ICpzb3VyY2UxUCAqICpzb3VyY2UyUDsK
KyAgICAgICAgICAgIHNvdXJjZTFQKys7CisgICAgICAgICAgICBzb3VyY2UyUCsrOworICAgICAg
ICAgICAgZGVzdFArKzsKKyAgICAgICAgICAgIG4tLTsKKyAgICAgICAgfQorCisgICAgICAgIC8v
IE5vdyB0aGUgc291cmNlMVAgYWRkcmVzcyBhbGlnbmVkIGFuZCBzdGFydCB0byBhcHBseSBTU0Uu
CisgICAgICAgIGZsb2F0KiBlbmRQID0gZGVzdFAgKyBuIC0gbiAlIDQ7CisgICAgICAgIF9fbTEy
OCBwU291cmNlMTsKKyAgICAgICAgX19tMTI4IHBTb3VyY2UyOworICAgICAgICBfX20xMjggZGVz
dDsKKworICAgICAgICBib29sIHNvdXJjZTJBbGlnbmVkID0gIShyZWludGVycHJldF9jYXN0PHVp
bnRwdHJfdD4oc291cmNlMlApICYgMHgwRik7CisgICAgICAgIGJvb2wgZGVzdEFsaWduZWQgPSAh
KHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihkZXN0UCkgJiAweDBGKTsKKworI2RlZmluZSBT
U0UyX01VTFQobCwgcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAg
ICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAg
ICAgICAgICAgcFNvdXJjZTEgPSBfbW1fbG9hZF9wcyhzb3VyY2UxUCk7ICAgICAgXAorICAgICAg
ICAgICAgICAgIHBTb3VyY2UyID0gX21tXyMjbCMjX3BzKHNvdXJjZTJQKTsgICAgIFwKKyAgICAg
ICAgICAgICAgICBkZXN0ID0gX21tX211bF9wcyhwU291cmNlMSwgcFNvdXJjZTIpOyBcCisgICAg
ICAgICAgICAgICAgX21tXyMjcyMjX3BzKGRlc3RQLCBkZXN0KTsgICAgICAgICAgICAgXAorICAg
ICAgICAgICAgICAgIHNvdXJjZTFQICs9IDQ7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAg
ICAgICAgICAgICAgICBzb3VyY2UyUCArPSA0OyAgICAgICAgICAgICAgICAgICAgICAgICBcCisg
ICAgICAgICAgICAgICAgZGVzdFAgKz0gNDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAor
ICAgICAgICAgICAgfQorCisgICAgICAgIGlmIChzb3VyY2UyQWxpZ25lZCAmJiBkZXN0QWxpZ25l
ZCkgeyAvLyBCb3RoIGFsaWduZWQuCisgICAgICAgICAgICB3aGlsZSAoZGVzdFAgPCBlbmRQKQor
ICAgICAgICAgICAgICAgIFNTRTJfTVVMVChsb2FkLCBzdG9yZSkKKyAgICAgICAgfSBlbHNlIGlm
IChzb3VyY2UyQWxpZ25lZCAmJiAhZGVzdEFsaWduZWQpIHsgLy8gU291cmNlMiBpcyBhbGlnbmVk
IGJ1dCBkZXN0IG5vdC4KKyAgICAgICAgICAgIHdoaWxlIChkZXN0UCA8IGVuZFApCisgICAgICAg
ICAgICAgICAgU1NFMl9NVUxUKGxvYWQsIHN0b3JldSkKKyAgICAgICAgfSBlbHNlIGlmICghc291
cmNlMkFsaWduZWQgJiYgZGVzdEFsaWduZWQpIHsgLy8gRGVzdCBpcyBhbGlnbmVkIGJ1dCBzb3Vy
Y2UyIG5vdC4KKyAgICAgICAgICAgIHdoaWxlIChkZXN0UCA8IGVuZFApCisgICAgICAgICAgICAg
ICAgU1NFMl9NVUxUKGxvYWR1LCBzdG9yZSkKKyAgICAgICAgfSBlbHNlIHsgLy8gTmVpdGhlciBh
bGlnbmVkLgorICAgICAgICAgICAgd2hpbGUgKGRlc3RQIDwgZW5kUCkKKyAgICAgICAgICAgICAg
ICBTU0UyX01VTFQobG9hZHUsIHN0b3JldSkKKyAgICAgICAgfQorCisgICAgICAgIC8vIE5vbi1T
U0UgaGFuZGxpbmcgZm9yIGxlZnQgZnJhbWVzIHdoaWNoIGlzIGxlc3MgdGhhbiA0LgorICAgICAg
ICBuICU9IDQ7CisgICAgfQorI2VuZGlmCisgICAgd2hpbGUgKG4pIHsKKyAgICAgICAgKmRlc3RQ
ID0gKnNvdXJjZTFQICogKnNvdXJjZTJQOworICAgICAgICBzb3VyY2UxUCArPSBzb3VyY2VTdHJp
ZGUxOworICAgICAgICBzb3VyY2UyUCArPSBzb3VyY2VTdHJpZGUyOworICAgICAgICBkZXN0UCAr
PSBkZXN0U3RyaWRlOworICAgICAgICBuLS07CisgICAgfQorfQorCiAjZW5kaWYgLy8gT1MoREFS
V0lOKQogCiB9IC8vIG5hbWVzcGFjZSBWZWN0b3JNYXRoCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9hdWRpby9WZWN0b3JNYXRoLmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9hdWRpby9WZWN0b3JNYXRoLmgKaW5kZXggMDM2MGJkYi4uYTNhOTJlNSAxMDA2NDQKLS0tIGEv
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vVmVjdG9yTWF0aC5oCisrKyBiL1NvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL1ZlY3Rvck1hdGguaApAQCAtMzQsNiArMzQsOSBAQCBuYW1l
c3BhY2UgVmVjdG9yTWF0aCB7CiB2b2lkIHZzbXVsKGNvbnN0IGZsb2F0KiBzb3VyY2VQLCBpbnQg
c291cmNlU3RyaWRlLCBjb25zdCBmbG9hdCogc2NhbGUsIGZsb2F0KiBkZXN0UCwgaW50IGRlc3RT
dHJpZGUsIHNpemVfdCBmcmFtZXNUb1Byb2Nlc3MpOwogdm9pZCB2YWRkKGNvbnN0IGZsb2F0KiBz
b3VyY2UxUCwgaW50IHNvdXJjZVN0cmlkZTEsIGNvbnN0IGZsb2F0KiBzb3VyY2UyUCwgaW50IHNv
dXJjZVN0cmlkZTIsIGZsb2F0KiBkZXN0UCwgaW50IGRlc3RTdHJpZGUsIHNpemVfdCBmcmFtZXNU
b1Byb2Nlc3MpOwogCisvLyBGb3IgYW4gZWxlbWVudC1ieS1lbGVtZW50IG11bHRpcGx5IG9mIHR3
byBmbG9hdCB2ZWN0b3JzLgordm9pZCB2bXVsKGNvbnN0IGZsb2F0KiBzb3VyY2UxUCwgaW50IHNv
dXJjZVN0cmlkZTEsIGNvbnN0IGZsb2F0KiBzb3VyY2UyUCwgaW50IHNvdXJjZVN0cmlkZTIsIGZs
b2F0KiBkZXN0UCwgaW50IGRlc3RTdHJpZGUsIHNpemVfdCBmcmFtZXNUb1Byb2Nlc3MpOworCiB9
IC8vIG5hbWVzcGFjZSBWZWN0b3JNYXRoCiAKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>118739</attachid>
            <date>2011-12-11 23:16:23 -0800</date>
            <delta_ts>2011-12-11 23:44:24 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>Patch</filename>
            <type>text/plain</type>
            <size>7179</size>
            <attacher name="Xingnan Wang">xingnan.wang</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZwppbmRleCBkY2I0ZWY3Li5hOWQ0ZTBjIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjIg
QEAKKzIwMTEtMTItMTEgIFhpbmduYW4gV2FuZyAgPHhpbmduYW4ud2FuZ0BpbnRlbC5jb20+CisK
KyAgICAgICAgSW1wbGVtZW50IGEgZnVuY3Rpb24gb2YgdmVjdG9yIG11bHRpcGx5IHdpdGggU1NF
MiBvcHRpbWl6YXRpb24gaW4gVmVjdG9yTWF0aC5jcHAuCisgICAgICAgIGh0dHBzOi8vYnVncy53
ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD03NDA0OAorCisgICAgICAgIFJldmlld2VkIGJ5IE5P
Qk9EWSAoT09QUyEpLgorCisgICAgICAgIC0gSXRgcyBhIGZ1bmN0aW9uIGZvciBhbiBlbGVtZW50
LWJ5LWVsZW1lbnQgbXVsdGlwbHkgb2YgdHdvIGZsb2F0IHZlY3RvcnMgYW5kIHdlIGdldCAKKyAg
ICAgICAgYWJvdXQgMy40eCBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudCB3aXRoIFNTRTIgb3B0aW1p
emF0aW9uIGNvbXBhcmVkIHdpdGggdGhlIGNvbW1vbiAKKyAgICAgICAgbXVsdGlwbHkuCisKKyAg
ICAgICAgLSBVc2UgdGhlIGZ1bmN0aW9uIGluIEF1ZGlvQnVzOjpjb3B5V2l0aFNhbXBsZUFjY3Vy
YXRlR2FpblZhbHVlc0Zyb20oKS4KKworICAgICAgICAqIHBsYXRmb3JtL2F1ZGlvL0F1ZGlvQnVz
LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvQnVzOjpjb3B5V2l0aFNhbXBsZUFjY3VyYXRl
R2FpblZhbHVlc0Zyb20pOgorICAgICAgICAqIHBsYXRmb3JtL2F1ZGlvL1ZlY3Rvck1hdGguY3Bw
OgorICAgICAgICAoV2ViQ29yZTo6VmVjdG9yTWF0aDo6dm11bCk6CisgICAgICAgICogcGxhdGZv
cm0vYXVkaW8vVmVjdG9yTWF0aC5oOgorCiAyMDExLTEyLTExICBMdWtlIE1hY3BoZXJzb24gICA8
bWFjcGhlcnNvbkBjaHJvbWl1bS5vcmc+CiAKICAgICAgICAgSW1wbGVtZW50IHdlYmtpdC1saW5l
LWdyaWQgYW5kIHdlYmtpdC1saW5lLWdyaWQtc25hcCBDU1MgcHJvcGVydGllcyBpbiBDU1NTdHls
ZUFwcGx5UHJvcGVydHkuCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9hdWRp
by9BdWRpb0J1cy5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9BdWRpb0J1cy5j
cHAKaW5kZXggNmMwNzZiNy4uYjVlYzI0NiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vYXVkaW8vQXVkaW9CdXMuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2F1
ZGlvL0F1ZGlvQnVzLmNwcApAQCAtMzgyLDE1ICszODIsMTMgQEAgdm9pZCBBdWRpb0J1czo6Y29w
eVdpdGhTYW1wbGVBY2N1cmF0ZUdhaW5WYWx1ZXNGcm9tKGNvbnN0IEF1ZGlvQnVzICZzb3VyY2VC
dXMsIGYKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIC8vIEZJWE1FOiB0aGlzIGNhbiBw
b3RlbnRpYWxseSB1c2UgU0lNRCBvcHRpbWl6YXRpb25zIHdpdGggdmVjdG9yIGxpYnJhcmllcy4K
ICAgICAvLyBXZSBoYW5kbGUgYm90aCB0aGUgMSAtPiBOIGFuZCBOIC0+IE4gY2FzZSBoZXJlLgog
ICAgIGNvbnN0IGZsb2F0KiBzb3VyY2UgPSBzb3VyY2VCdXMuY2hhbm5lbCgwKS0+ZGF0YSgpOwog
ICAgIGZvciAodW5zaWduZWQgY2hhbm5lbEluZGV4ID0gMDsgY2hhbm5lbEluZGV4IDwgbnVtYmVy
T2ZDaGFubmVscygpOyArK2NoYW5uZWxJbmRleCkgewogICAgICAgICBpZiAoc291cmNlQnVzLm51
bWJlck9mQ2hhbm5lbHMoKSA9PSBudW1iZXJPZkNoYW5uZWxzKCkpCiAgICAgICAgICAgICBzb3Vy
Y2UgPSBzb3VyY2VCdXMuY2hhbm5lbChjaGFubmVsSW5kZXgpLT5kYXRhKCk7CiAgICAgICAgIGZs
b2F0KiBkZXN0aW5hdGlvbiA9IGNoYW5uZWwoY2hhbm5lbEluZGV4KS0+ZGF0YSgpOwotICAgICAg
ICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbnVtYmVyT2ZHYWluVmFsdWVzOyArK2kpCi0gICAg
ICAgICAgICBkZXN0aW5hdGlvbltpXSA9IHNvdXJjZVtpXSAqIGdhaW5WYWx1ZXNbaV07CisgICAg
ICAgIHZtdWwoc291cmNlLCAxLCBnYWluVmFsdWVzLCAxLCBkZXN0aW5hdGlvbiwgMSwgbnVtYmVy
T2ZHYWluVmFsdWVzKTsKICAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL2F1ZGlvL1ZlY3Rvck1hdGguY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYXVk
aW8vVmVjdG9yTWF0aC5jcHAKaW5kZXggZmY0NDA2YS4uNzM1ODE3ZSAxMDA2NDQKLS0tIGEvU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vVmVjdG9yTWF0aC5jcHAKKysrIGIvU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vYXVkaW8vVmVjdG9yTWF0aC5jcHAKQEAgLTYzLDYgKzYzLDE1IEBAIHZv
aWQgdmFkZChjb25zdCBmbG9hdCogc291cmNlMVAsIGludCBzb3VyY2VTdHJpZGUxLCBjb25zdCBm
bG9hdCogc291cmNlMlAsIGludCBzCiAjZW5kaWYKIH0KIAordm9pZCB2bXVsKGNvbnN0IGZsb2F0
KiBzb3VyY2UxUCwgaW50IHNvdXJjZVN0cmlkZTEsIGNvbnN0IGZsb2F0KiBzb3VyY2UyUCwgaW50
IHNvdXJjZVN0cmlkZTIsIGZsb2F0KiBkZXN0UCwgaW50IGRlc3RTdHJpZGUsIHNpemVfdCBmcmFt
ZXNUb1Byb2Nlc3MpCit7CisjaWYgZGVmaW5lZChfX3BwY19fKSB8fCBkZWZpbmVkKF9faTM4Nl9f
KQorICAgIDo6dm11bChzb3VyY2UxUCwgc291cmNlU3RyaWRlMSwgc291cmNlMlAsIHNvdXJjZVN0
cmlkZTIsIGRlc3RQLCBkZXN0U3RyaWRlLCBmcmFtZXNUb1Byb2Nlc3MpOworI2Vsc2UKKyAgICB2
RFNQX3ZtdWwoc291cmNlMVAsIHNvdXJjZVN0cmlkZTEsIHNvdXJjZTJQLCBzb3VyY2VTdHJpZGUy
LCBkZXN0UCwgZGVzdFN0cmlkZSwgZnJhbWVzVG9Qcm9jZXNzKTsKKyNlbmRpZgorfQorCiAjZWxz
ZQogCiB2b2lkIHZzbXVsKGNvbnN0IGZsb2F0KiBzb3VyY2VQLCBpbnQgc291cmNlU3RyaWRlLCBj
b25zdCBmbG9hdCogc2NhbGUsIGZsb2F0KiBkZXN0UCwgaW50IGRlc3RTdHJpZGUsIHNpemVfdCBm
cmFtZXNUb1Byb2Nlc3MpCkBAIC0yMjksNiArMjM4LDcxIEBAIHZvaWQgdmFkZChjb25zdCBmbG9h
dCogc291cmNlMVAsIGludCBzb3VyY2VTdHJpZGUxLCBjb25zdCBmbG9hdCogc291cmNlMlAsIGlu
dCBzCiAjZW5kaWYKIH0KIAordm9pZCB2bXVsKGNvbnN0IGZsb2F0KiBzb3VyY2UxUCwgaW50IHNv
dXJjZVN0cmlkZTEsIGNvbnN0IGZsb2F0KiBzb3VyY2UyUCwgaW50IHNvdXJjZVN0cmlkZTIsIGZs
b2F0KiBkZXN0UCwgaW50IGRlc3RTdHJpZGUsIHNpemVfdCBmcmFtZXNUb1Byb2Nlc3MpCit7CisK
KyAgICBpbnQgbiA9IGZyYW1lc1RvUHJvY2VzczsKKworICAgIC8vIEFib3V0IDMuNHggcGVyZm9y
bWFuY2UgaW1wcm92ZW1lbnQgd2l0aCBTU0UyIG9wdGltaXphdGlvbiBmb3IgdGhlIHZlcnkgY29t
bW9uIGNhc2Ugb2YgYWxsIHRoZSBzdHJpZGVzIGFyZSAxLgorI2lmZGVmIF9fU1NFMl9fCisgICAg
aWYgKChzb3VyY2VTdHJpZGUxID09MSkgJiYgKHNvdXJjZVN0cmlkZTIgPT0gMSkgJiYgKGRlc3RT
dHJpZGUgPT0gMSkpIHsKKworICAgICAgICAvLyBJZiB0aGUgc291cmNlUCBhZGRyZXNzIGlzIG5v
dCAxNi1ieXRlIGFsaWduZWQsIHRoZSBmaXJzdCBzZXZlcmFsIGZyYW1lcyAoYXQgbW9zdCB0aHJl
ZSkgc2hvdWxkIGJlIHByb2Nlc3NlZCBzZXBlcmF0ZWx5LgorICAgICAgICB3aGlsZSAoKHJlaW50
ZXJwcmV0X2Nhc3Q8dWludHB0cl90Pihzb3VyY2UxUCkgJiAweDBGKSAmJiBuKSB7CisgICAgICAg
ICAgICAqZGVzdFAgPSAqc291cmNlMVAgKiAqc291cmNlMlA7CisgICAgICAgICAgICBzb3VyY2Ux
UCsrOworICAgICAgICAgICAgc291cmNlMlArKzsKKyAgICAgICAgICAgIGRlc3RQKys7CisgICAg
ICAgICAgICBuLS07CisgICAgICAgIH0KKworICAgICAgICAvLyBOb3cgdGhlIHNvdXJjZTFQIGFk
ZHJlc3MgYWxpZ25lZCBhbmQgc3RhcnQgdG8gYXBwbHkgU1NFLgorICAgICAgICBmbG9hdCogZW5k
UCA9IGRlc3RQICsgbiAtIG4gJSA0OworICAgICAgICBfX20xMjggcFNvdXJjZTE7CisgICAgICAg
IF9fbTEyOCBwU291cmNlMjsKKyAgICAgICAgX19tMTI4IGRlc3Q7CisKKyAgICAgICAgYm9vbCBz
b3VyY2UyQWxpZ25lZCA9ICEocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KHNvdXJjZTJQKSAm
IDB4MEYpOworICAgICAgICBib29sIGRlc3RBbGlnbmVkID0gIShyZWludGVycHJldF9jYXN0PHVp
bnRwdHJfdD4oZGVzdFApICYgMHgwRik7CisKKyNkZWZpbmUgU1NFMl9NVUxUKGwsIHMpICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHBTb3VyY2UxID0g
X21tX2xvYWRfcHMoc291cmNlMVApOyAgICAgIFwKKyAgICAgICAgICAgICAgICBwU291cmNlMiA9
IF9tbV8jI2wjI19wcyhzb3VyY2UyUCk7ICAgICBcCisgICAgICAgICAgICAgICAgZGVzdCA9IF9t
bV9tdWxfcHMocFNvdXJjZTEsIHBTb3VyY2UyKTsgXAorICAgICAgICAgICAgICAgIF9tbV8jI3Mj
I19wcyhkZXN0UCwgZGVzdCk7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBzb3VyY2Ux
UCArPSA0OyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgc291cmNl
MlAgKz0gNDsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGRlc3RQ
ICs9IDQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0KKworICAg
ICAgICBpZiAoc291cmNlMkFsaWduZWQgJiYgZGVzdEFsaWduZWQpIHsgLy8gQm90aCBhbGlnbmVk
LgorICAgICAgICAgICAgd2hpbGUgKGRlc3RQIDwgZW5kUCkKKyAgICAgICAgICAgICAgICBTU0Uy
X01VTFQobG9hZCwgc3RvcmUpCisgICAgICAgIH0gZWxzZSBpZiAoc291cmNlMkFsaWduZWQgJiYg
IWRlc3RBbGlnbmVkKSB7IC8vIFNvdXJjZTIgaXMgYWxpZ25lZCBidXQgZGVzdCBub3QuCisgICAg
ICAgICAgICB3aGlsZSAoZGVzdFAgPCBlbmRQKQorICAgICAgICAgICAgICAgIFNTRTJfTVVMVChs
b2FkLCBzdG9yZXUpCisgICAgICAgIH0gZWxzZSBpZiAoIXNvdXJjZTJBbGlnbmVkICYmIGRlc3RB
bGlnbmVkKSB7IC8vIERlc3QgaXMgYWxpZ25lZCBidXQgc291cmNlMiBub3QuCisgICAgICAgICAg
ICB3aGlsZSAoZGVzdFAgPCBlbmRQKQorICAgICAgICAgICAgICAgIFNTRTJfTVVMVChsb2FkdSwg
c3RvcmUpCisgICAgICAgIH0gZWxzZSB7IC8vIE5laXRoZXIgYWxpZ25lZC4KKyAgICAgICAgICAg
IHdoaWxlIChkZXN0UCA8IGVuZFApCisgICAgICAgICAgICAgICAgU1NFMl9NVUxUKGxvYWR1LCBz
dG9yZXUpCisgICAgICAgIH0KKworICAgICAgICAvLyBOb24tU1NFIGhhbmRsaW5nIGZvciBsZWZ0
IGZyYW1lcyB3aGljaCBpcyBsZXNzIHRoYW4gNC4KKyAgICAgICAgbiAlPSA0OworICAgIH0KKyNl
bmRpZgorICAgIHdoaWxlIChuKSB7CisgICAgICAgICpkZXN0UCA9ICpzb3VyY2UxUCAqICpzb3Vy
Y2UyUDsKKyAgICAgICAgc291cmNlMVAgKz0gc291cmNlU3RyaWRlMTsKKyAgICAgICAgc291cmNl
MlAgKz0gc291cmNlU3RyaWRlMjsKKyAgICAgICAgZGVzdFAgKz0gZGVzdFN0cmlkZTsKKyAgICAg
ICAgbi0tOworICAgIH0KK30KKwogI2VuZGlmIC8vIE9TKERBUldJTikKIAogfSAvLyBuYW1lc3Bh
Y2UgVmVjdG9yTWF0aApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8v
VmVjdG9yTWF0aC5oIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vVmVjdG9yTWF0aC5o
CmluZGV4IDAzNjBiZGIuLmEzYTkyZTUgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL2F1ZGlvL1ZlY3Rvck1hdGguaAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9hdWRp
by9WZWN0b3JNYXRoLmgKQEAgLTM0LDYgKzM0LDkgQEAgbmFtZXNwYWNlIFZlY3Rvck1hdGggewog
dm9pZCB2c211bChjb25zdCBmbG9hdCogc291cmNlUCwgaW50IHNvdXJjZVN0cmlkZSwgY29uc3Qg
ZmxvYXQqIHNjYWxlLCBmbG9hdCogZGVzdFAsIGludCBkZXN0U3RyaWRlLCBzaXplX3QgZnJhbWVz
VG9Qcm9jZXNzKTsKIHZvaWQgdmFkZChjb25zdCBmbG9hdCogc291cmNlMVAsIGludCBzb3VyY2VT
dHJpZGUxLCBjb25zdCBmbG9hdCogc291cmNlMlAsIGludCBzb3VyY2VTdHJpZGUyLCBmbG9hdCog
ZGVzdFAsIGludCBkZXN0U3RyaWRlLCBzaXplX3QgZnJhbWVzVG9Qcm9jZXNzKTsKIAorLy8gRm9y
IGFuIGVsZW1lbnQtYnktZWxlbWVudCBtdWx0aXBseSBvZiB0d28gZmxvYXQgdmVjdG9ycy4KK3Zv
aWQgdm11bChjb25zdCBmbG9hdCogc291cmNlMVAsIGludCBzb3VyY2VTdHJpZGUxLCBjb25zdCBm
bG9hdCogc291cmNlMlAsIGludCBzb3VyY2VTdHJpZGUyLCBmbG9hdCogZGVzdFAsIGludCBkZXN0
U3RyaWRlLCBzaXplX3QgZnJhbWVzVG9Qcm9jZXNzKTsKKwogfSAvLyBuYW1lc3BhY2UgVmVjdG9y
TWF0aAogCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29y
ZS93ZWJhdWRpby9BdWRpb0J1ZmZlclNvdXJjZU5vZGUuY3BwIGIvU291cmNlL1dlYkNvcmUvd2Vi
YXVkaW8vQXVkaW9CdWZmZXJTb3VyY2VOb2RlLmNwcAppbmRleCAwZjBkN2IzLi45YzJjYzE2IDEw
MDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS93ZWJhdWRpby9BdWRpb0J1ZmZlclNvdXJjZU5vZGUu
Y3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3dlYmF1ZGlvL0F1ZGlvQnVmZmVyU291cmNlTm9kZS5j
cHAKQEAgLTIxMCw3ICsyMTAsNyBAQCB2b2lkIEF1ZGlvQnVmZmVyU291cmNlTm9kZTo6cmVuZGVy
RnJvbUJ1ZmZlcihBdWRpb0J1cyogYnVzLCB1bnNpZ25lZCBkZXN0aW5hdGlvbgogICAgIGlmIChk
ZXN0aW5hdGlvblIpCiAgICAgICAgIGRlc3RpbmF0aW9uUiArPSBkZXN0aW5hdGlvbkZyYW1lT2Zm
c2V0OwogCi0gICAgc2l6ZV90IGJ1ZmZlckxlbmd0aCA9IGJ1ZmZlcigpLT5sZW5ndGgoKTsKKyAg
ICBzaXplX3QgID0gYnVmZmVyKCktPmxlbmd0aCgpOwogICAgIGRvdWJsZSBidWZmZXJTYW1wbGVS
YXRlID0gYnVmZmVyKCktPnNhbXBsZVJhdGUoKTsKIAogICAgIC8vIENhbGN1bGF0ZSB0aGUgc3Rh
cnQgYW5kIGVuZCBmcmFtZXMgaW4gb3VyIGJ1ZmZlciB0aGF0IHdlIHdhbnQgdG8gcGxheS4K
</data>
<flag name="commit-queue"
          id="118574"
          type_id="3"
          status="-"
          setter="webkit.review.bot"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>118744</attachid>
            <date>2011-12-11 23:44:24 -0800</date>
            <delta_ts>2011-12-12 21:38:51 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>Patch</filename>
            <type>text/plain</type>
            <size>6529</size>
            <attacher name="Xingnan Wang">xingnan.wang</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZwppbmRleCBkY2I0ZWY3Li5hOWQ0ZTBjIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjIg
QEAKKzIwMTEtMTItMTEgIFhpbmduYW4gV2FuZyAgPHhpbmduYW4ud2FuZ0BpbnRlbC5jb20+CisK
KyAgICAgICAgSW1wbGVtZW50IGEgZnVuY3Rpb24gb2YgdmVjdG9yIG11bHRpcGx5IHdpdGggU1NF
MiBvcHRpbWl6YXRpb24gaW4gVmVjdG9yTWF0aC5jcHAuCisgICAgICAgIGh0dHBzOi8vYnVncy53
ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD03NDA0OAorCisgICAgICAgIFJldmlld2VkIGJ5IE5P
Qk9EWSAoT09QUyEpLgorCisgICAgICAgIC0gSXRgcyBhIGZ1bmN0aW9uIGZvciBhbiBlbGVtZW50
LWJ5LWVsZW1lbnQgbXVsdGlwbHkgb2YgdHdvIGZsb2F0IHZlY3RvcnMgYW5kIHdlIGdldCAKKyAg
ICAgICAgYWJvdXQgMy40eCBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudCB3aXRoIFNTRTIgb3B0aW1p
emF0aW9uIGNvbXBhcmVkIHdpdGggdGhlIGNvbW1vbiAKKyAgICAgICAgbXVsdGlwbHkuCisKKyAg
ICAgICAgLSBVc2UgdGhlIGZ1bmN0aW9uIGluIEF1ZGlvQnVzOjpjb3B5V2l0aFNhbXBsZUFjY3Vy
YXRlR2FpblZhbHVlc0Zyb20oKS4KKworICAgICAgICAqIHBsYXRmb3JtL2F1ZGlvL0F1ZGlvQnVz
LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvQnVzOjpjb3B5V2l0aFNhbXBsZUFjY3VyYXRl
R2FpblZhbHVlc0Zyb20pOgorICAgICAgICAqIHBsYXRmb3JtL2F1ZGlvL1ZlY3Rvck1hdGguY3Bw
OgorICAgICAgICAoV2ViQ29yZTo6VmVjdG9yTWF0aDo6dm11bCk6CisgICAgICAgICogcGxhdGZv
cm0vYXVkaW8vVmVjdG9yTWF0aC5oOgorCiAyMDExLTEyLTExICBMdWtlIE1hY3BoZXJzb24gICA8
bWFjcGhlcnNvbkBjaHJvbWl1bS5vcmc+CiAKICAgICAgICAgSW1wbGVtZW50IHdlYmtpdC1saW5l
LWdyaWQgYW5kIHdlYmtpdC1saW5lLWdyaWQtc25hcCBDU1MgcHJvcGVydGllcyBpbiBDU1NTdHls
ZUFwcGx5UHJvcGVydHkuCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9hdWRp
by9BdWRpb0J1cy5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9BdWRpb0J1cy5j
cHAKaW5kZXggNmMwNzZiNy4uYjVlYzI0NiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vYXVkaW8vQXVkaW9CdXMuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2F1
ZGlvL0F1ZGlvQnVzLmNwcApAQCAtMzgyLDE1ICszODIsMTMgQEAgdm9pZCBBdWRpb0J1czo6Y29w
eVdpdGhTYW1wbGVBY2N1cmF0ZUdhaW5WYWx1ZXNGcm9tKGNvbnN0IEF1ZGlvQnVzICZzb3VyY2VC
dXMsIGYKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIC8vIEZJWE1FOiB0aGlzIGNhbiBw
b3RlbnRpYWxseSB1c2UgU0lNRCBvcHRpbWl6YXRpb25zIHdpdGggdmVjdG9yIGxpYnJhcmllcy4K
ICAgICAvLyBXZSBoYW5kbGUgYm90aCB0aGUgMSAtPiBOIGFuZCBOIC0+IE4gY2FzZSBoZXJlLgog
ICAgIGNvbnN0IGZsb2F0KiBzb3VyY2UgPSBzb3VyY2VCdXMuY2hhbm5lbCgwKS0+ZGF0YSgpOwog
ICAgIGZvciAodW5zaWduZWQgY2hhbm5lbEluZGV4ID0gMDsgY2hhbm5lbEluZGV4IDwgbnVtYmVy
T2ZDaGFubmVscygpOyArK2NoYW5uZWxJbmRleCkgewogICAgICAgICBpZiAoc291cmNlQnVzLm51
bWJlck9mQ2hhbm5lbHMoKSA9PSBudW1iZXJPZkNoYW5uZWxzKCkpCiAgICAgICAgICAgICBzb3Vy
Y2UgPSBzb3VyY2VCdXMuY2hhbm5lbChjaGFubmVsSW5kZXgpLT5kYXRhKCk7CiAgICAgICAgIGZs
b2F0KiBkZXN0aW5hdGlvbiA9IGNoYW5uZWwoY2hhbm5lbEluZGV4KS0+ZGF0YSgpOwotICAgICAg
ICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbnVtYmVyT2ZHYWluVmFsdWVzOyArK2kpCi0gICAg
ICAgICAgICBkZXN0aW5hdGlvbltpXSA9IHNvdXJjZVtpXSAqIGdhaW5WYWx1ZXNbaV07CisgICAg
ICAgIHZtdWwoc291cmNlLCAxLCBnYWluVmFsdWVzLCAxLCBkZXN0aW5hdGlvbiwgMSwgbnVtYmVy
T2ZHYWluVmFsdWVzKTsKICAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL2F1ZGlvL1ZlY3Rvck1hdGguY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYXVk
aW8vVmVjdG9yTWF0aC5jcHAKaW5kZXggZmY0NDA2YS4uNzM1ODE3ZSAxMDA2NDQKLS0tIGEvU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vVmVjdG9yTWF0aC5jcHAKKysrIGIvU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vYXVkaW8vVmVjdG9yTWF0aC5jcHAKQEAgLTYzLDYgKzYzLDE1IEBAIHZv
aWQgdmFkZChjb25zdCBmbG9hdCogc291cmNlMVAsIGludCBzb3VyY2VTdHJpZGUxLCBjb25zdCBm
bG9hdCogc291cmNlMlAsIGludCBzCiAjZW5kaWYKIH0KIAordm9pZCB2bXVsKGNvbnN0IGZsb2F0
KiBzb3VyY2UxUCwgaW50IHNvdXJjZVN0cmlkZTEsIGNvbnN0IGZsb2F0KiBzb3VyY2UyUCwgaW50
IHNvdXJjZVN0cmlkZTIsIGZsb2F0KiBkZXN0UCwgaW50IGRlc3RTdHJpZGUsIHNpemVfdCBmcmFt
ZXNUb1Byb2Nlc3MpCit7CisjaWYgZGVmaW5lZChfX3BwY19fKSB8fCBkZWZpbmVkKF9faTM4Nl9f
KQorICAgIDo6dm11bChzb3VyY2UxUCwgc291cmNlU3RyaWRlMSwgc291cmNlMlAsIHNvdXJjZVN0
cmlkZTIsIGRlc3RQLCBkZXN0U3RyaWRlLCBmcmFtZXNUb1Byb2Nlc3MpOworI2Vsc2UKKyAgICB2
RFNQX3ZtdWwoc291cmNlMVAsIHNvdXJjZVN0cmlkZTEsIHNvdXJjZTJQLCBzb3VyY2VTdHJpZGUy
LCBkZXN0UCwgZGVzdFN0cmlkZSwgZnJhbWVzVG9Qcm9jZXNzKTsKKyNlbmRpZgorfQorCiAjZWxz
ZQogCiB2b2lkIHZzbXVsKGNvbnN0IGZsb2F0KiBzb3VyY2VQLCBpbnQgc291cmNlU3RyaWRlLCBj
b25zdCBmbG9hdCogc2NhbGUsIGZsb2F0KiBkZXN0UCwgaW50IGRlc3RTdHJpZGUsIHNpemVfdCBm
cmFtZXNUb1Byb2Nlc3MpCkBAIC0yMjksNiArMjM4LDcxIEBAIHZvaWQgdmFkZChjb25zdCBmbG9h
dCogc291cmNlMVAsIGludCBzb3VyY2VTdHJpZGUxLCBjb25zdCBmbG9hdCogc291cmNlMlAsIGlu
dCBzCiAjZW5kaWYKIH0KIAordm9pZCB2bXVsKGNvbnN0IGZsb2F0KiBzb3VyY2UxUCwgaW50IHNv
dXJjZVN0cmlkZTEsIGNvbnN0IGZsb2F0KiBzb3VyY2UyUCwgaW50IHNvdXJjZVN0cmlkZTIsIGZs
b2F0KiBkZXN0UCwgaW50IGRlc3RTdHJpZGUsIHNpemVfdCBmcmFtZXNUb1Byb2Nlc3MpCit7CisK
KyAgICBpbnQgbiA9IGZyYW1lc1RvUHJvY2VzczsKKworICAgIC8vIEFib3V0IDMuNHggcGVyZm9y
bWFuY2UgaW1wcm92ZW1lbnQgd2l0aCBTU0UyIG9wdGltaXphdGlvbiBmb3IgdGhlIHZlcnkgY29t
bW9uIGNhc2Ugb2YgYWxsIHRoZSBzdHJpZGVzIGFyZSAxLgorI2lmZGVmIF9fU1NFMl9fCisgICAg
aWYgKChzb3VyY2VTdHJpZGUxID09MSkgJiYgKHNvdXJjZVN0cmlkZTIgPT0gMSkgJiYgKGRlc3RT
dHJpZGUgPT0gMSkpIHsKKworICAgICAgICAvLyBJZiB0aGUgc291cmNlUCBhZGRyZXNzIGlzIG5v
dCAxNi1ieXRlIGFsaWduZWQsIHRoZSBmaXJzdCBzZXZlcmFsIGZyYW1lcyAoYXQgbW9zdCB0aHJl
ZSkgc2hvdWxkIGJlIHByb2Nlc3NlZCBzZXBlcmF0ZWx5LgorICAgICAgICB3aGlsZSAoKHJlaW50
ZXJwcmV0X2Nhc3Q8dWludHB0cl90Pihzb3VyY2UxUCkgJiAweDBGKSAmJiBuKSB7CisgICAgICAg
ICAgICAqZGVzdFAgPSAqc291cmNlMVAgKiAqc291cmNlMlA7CisgICAgICAgICAgICBzb3VyY2Ux
UCsrOworICAgICAgICAgICAgc291cmNlMlArKzsKKyAgICAgICAgICAgIGRlc3RQKys7CisgICAg
ICAgICAgICBuLS07CisgICAgICAgIH0KKworICAgICAgICAvLyBOb3cgdGhlIHNvdXJjZTFQIGFk
ZHJlc3MgYWxpZ25lZCBhbmQgc3RhcnQgdG8gYXBwbHkgU1NFLgorICAgICAgICBmbG9hdCogZW5k
UCA9IGRlc3RQICsgbiAtIG4gJSA0OworICAgICAgICBfX20xMjggcFNvdXJjZTE7CisgICAgICAg
IF9fbTEyOCBwU291cmNlMjsKKyAgICAgICAgX19tMTI4IGRlc3Q7CisKKyAgICAgICAgYm9vbCBz
b3VyY2UyQWxpZ25lZCA9ICEocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KHNvdXJjZTJQKSAm
IDB4MEYpOworICAgICAgICBib29sIGRlc3RBbGlnbmVkID0gIShyZWludGVycHJldF9jYXN0PHVp
bnRwdHJfdD4oZGVzdFApICYgMHgwRik7CisKKyNkZWZpbmUgU1NFMl9NVUxUKGwsIHMpICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHBTb3VyY2UxID0g
X21tX2xvYWRfcHMoc291cmNlMVApOyAgICAgIFwKKyAgICAgICAgICAgICAgICBwU291cmNlMiA9
IF9tbV8jI2wjI19wcyhzb3VyY2UyUCk7ICAgICBcCisgICAgICAgICAgICAgICAgZGVzdCA9IF9t
bV9tdWxfcHMocFNvdXJjZTEsIHBTb3VyY2UyKTsgXAorICAgICAgICAgICAgICAgIF9tbV8jI3Mj
I19wcyhkZXN0UCwgZGVzdCk7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBzb3VyY2Ux
UCArPSA0OyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgc291cmNl
MlAgKz0gNDsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGRlc3RQ
ICs9IDQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0KKworICAg
ICAgICBpZiAoc291cmNlMkFsaWduZWQgJiYgZGVzdEFsaWduZWQpIHsgLy8gQm90aCBhbGlnbmVk
LgorICAgICAgICAgICAgd2hpbGUgKGRlc3RQIDwgZW5kUCkKKyAgICAgICAgICAgICAgICBTU0Uy
X01VTFQobG9hZCwgc3RvcmUpCisgICAgICAgIH0gZWxzZSBpZiAoc291cmNlMkFsaWduZWQgJiYg
IWRlc3RBbGlnbmVkKSB7IC8vIFNvdXJjZTIgaXMgYWxpZ25lZCBidXQgZGVzdCBub3QuCisgICAg
ICAgICAgICB3aGlsZSAoZGVzdFAgPCBlbmRQKQorICAgICAgICAgICAgICAgIFNTRTJfTVVMVChs
b2FkLCBzdG9yZXUpCisgICAgICAgIH0gZWxzZSBpZiAoIXNvdXJjZTJBbGlnbmVkICYmIGRlc3RB
bGlnbmVkKSB7IC8vIERlc3QgaXMgYWxpZ25lZCBidXQgc291cmNlMiBub3QuCisgICAgICAgICAg
ICB3aGlsZSAoZGVzdFAgPCBlbmRQKQorICAgICAgICAgICAgICAgIFNTRTJfTVVMVChsb2FkdSwg
c3RvcmUpCisgICAgICAgIH0gZWxzZSB7IC8vIE5laXRoZXIgYWxpZ25lZC4KKyAgICAgICAgICAg
IHdoaWxlIChkZXN0UCA8IGVuZFApCisgICAgICAgICAgICAgICAgU1NFMl9NVUxUKGxvYWR1LCBz
dG9yZXUpCisgICAgICAgIH0KKworICAgICAgICAvLyBOb24tU1NFIGhhbmRsaW5nIGZvciBsZWZ0
IGZyYW1lcyB3aGljaCBpcyBsZXNzIHRoYW4gNC4KKyAgICAgICAgbiAlPSA0OworICAgIH0KKyNl
bmRpZgorICAgIHdoaWxlIChuKSB7CisgICAgICAgICpkZXN0UCA9ICpzb3VyY2UxUCAqICpzb3Vy
Y2UyUDsKKyAgICAgICAgc291cmNlMVAgKz0gc291cmNlU3RyaWRlMTsKKyAgICAgICAgc291cmNl
MlAgKz0gc291cmNlU3RyaWRlMjsKKyAgICAgICAgZGVzdFAgKz0gZGVzdFN0cmlkZTsKKyAgICAg
ICAgbi0tOworICAgIH0KK30KKwogI2VuZGlmIC8vIE9TKERBUldJTikKIAogfSAvLyBuYW1lc3Bh
Y2UgVmVjdG9yTWF0aApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8v
VmVjdG9yTWF0aC5oIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vVmVjdG9yTWF0aC5o
CmluZGV4IDAzNjBiZGIuLmEzYTkyZTUgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL2F1ZGlvL1ZlY3Rvck1hdGguaAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9hdWRp
by9WZWN0b3JNYXRoLmgKQEAgLTM0LDYgKzM0LDkgQEAgbmFtZXNwYWNlIFZlY3Rvck1hdGggewog
dm9pZCB2c211bChjb25zdCBmbG9hdCogc291cmNlUCwgaW50IHNvdXJjZVN0cmlkZSwgY29uc3Qg
ZmxvYXQqIHNjYWxlLCBmbG9hdCogZGVzdFAsIGludCBkZXN0U3RyaWRlLCBzaXplX3QgZnJhbWVz
VG9Qcm9jZXNzKTsKIHZvaWQgdmFkZChjb25zdCBmbG9hdCogc291cmNlMVAsIGludCBzb3VyY2VT
dHJpZGUxLCBjb25zdCBmbG9hdCogc291cmNlMlAsIGludCBzb3VyY2VTdHJpZGUyLCBmbG9hdCog
ZGVzdFAsIGludCBkZXN0U3RyaWRlLCBzaXplX3QgZnJhbWVzVG9Qcm9jZXNzKTsKIAorLy8gRm9y
IGFuIGVsZW1lbnQtYnktZWxlbWVudCBtdWx0aXBseSBvZiB0d28gZmxvYXQgdmVjdG9ycy4KK3Zv
aWQgdm11bChjb25zdCBmbG9hdCogc291cmNlMVAsIGludCBzb3VyY2VTdHJpZGUxLCBjb25zdCBm
bG9hdCogc291cmNlMlAsIGludCBzb3VyY2VTdHJpZGUyLCBmbG9hdCogZGVzdFAsIGludCBkZXN0
U3RyaWRlLCBzaXplX3QgZnJhbWVzVG9Qcm9jZXNzKTsKKwogfSAvLyBuYW1lc3BhY2UgVmVjdG9y
TWF0aAogCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCg==
</data>
<flag name="review"
          id="118581"
          type_id="1"
          status="-"
          setter="benjamin"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>118951</attachid>
            <date>2011-12-12 21:38:51 -0800</date>
            <delta_ts>2011-12-13 01:03:39 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>Patch</filename>
            <type>text/plain</type>
            <size>6353</size>
            <attacher name="Xingnan Wang">xingnan.wang</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZwppbmRleCA3OTE1MDZmLi40MjIwNzY0IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjIg
QEAKKzIwMTEtMTItMTMgIFhpbmduYW4gV2FuZyAgPHhpbmduYW4ud2FuZ0BpbnRlbC5jb20+CisK
KyAgICAgICAgSW1wbGVtZW50IGEgZnVuY3Rpb24gb2YgdmVjdG9yIG11bHRpcGx5IHdpdGggU1NF
MiBvcHRpbWl6YXRpb24gaW4gVmVjdG9yTWF0aC5jcHAuCisgICAgICAgIGh0dHBzOi8vYnVncy53
ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD03NDA0OAorCisgICAgICAgIFJldmlld2VkIGJ5IE5P
Qk9EWSAoT09QUyEpLgorCisgICAgICAgIFRoZSB2bXVsIGlzIGEgZnVuY3Rpb24gZm9yIGFuIGVs
ZW1lbnQtYnktZWxlbWVudCBtdWx0aXBseSBvZiB0d28gZmxvYXQgdmVjdG9ycyBhbmQgd2UgCisg
ICAgICAgIGdldCBhYm91dCAzLjR4IHBlcmZvcm1hbmNlIGltcHJvdmVtZW50IHdpdGggU1NFMiBv
cHRpbWl6YXRpb24gY29tcGFyZWQgd2l0aCB0aGUgY29tbW9uIAorICAgICAgICBtdWx0aXBseS4K
KworICAgICAgICBVc2Ugdm11bCBpbiBBdWRpb0J1czo6Y29weVdpdGhTYW1wbGVBY2N1cmF0ZUdh
aW5WYWx1ZXNGcm9tKCkuCisKKyAgICAgICAgKiBwbGF0Zm9ybS9hdWRpby9BdWRpb0J1cy5jcHA6
CisgICAgICAgIChXZWJDb3JlOjpBdWRpb0J1czo6Y29weVdpdGhTYW1wbGVBY2N1cmF0ZUdhaW5W
YWx1ZXNGcm9tKToKKyAgICAgICAgKiBwbGF0Zm9ybS9hdWRpby9WZWN0b3JNYXRoLmNwcDoKKyAg
ICAgICAgKFdlYkNvcmU6OlZlY3Rvck1hdGg6OnZtdWwpOgorICAgICAgICAqIHBsYXRmb3JtL2F1
ZGlvL1ZlY3Rvck1hdGguaDoKKwogMjAxMS0xMi0xMiAgRGFuaWVsIEJhdGVzICA8ZGJhdGVzQHdl
YmtpdC5vcmc+CiAKICAgICAgICAgVW5yZXZpZXdlZCwgcm9sbGluZyBvdXQgcjEwMjY1Ni4KZGlm
ZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL0F1ZGlvQnVzLmNwcCBiL1Nv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL0F1ZGlvQnVzLmNwcAppbmRleCA2YzA3NmI3Li5i
NWVjMjQ2IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9BdWRpb0J1
cy5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vQXVkaW9CdXMuY3BwCkBA
IC0zODIsMTUgKzM4MiwxMyBAQCB2b2lkIEF1ZGlvQnVzOjpjb3B5V2l0aFNhbXBsZUFjY3VyYXRl
R2FpblZhbHVlc0Zyb20oY29uc3QgQXVkaW9CdXMgJnNvdXJjZUJ1cywgZgogICAgICAgICByZXR1
cm47CiAgICAgfQogCi0gICAgLy8gRklYTUU6IHRoaXMgY2FuIHBvdGVudGlhbGx5IHVzZSBTSU1E
IG9wdGltaXphdGlvbnMgd2l0aCB2ZWN0b3IgbGlicmFyaWVzLgogICAgIC8vIFdlIGhhbmRsZSBi
b3RoIHRoZSAxIC0+IE4gYW5kIE4gLT4gTiBjYXNlIGhlcmUuCiAgICAgY29uc3QgZmxvYXQqIHNv
dXJjZSA9IHNvdXJjZUJ1cy5jaGFubmVsKDApLT5kYXRhKCk7CiAgICAgZm9yICh1bnNpZ25lZCBj
aGFubmVsSW5kZXggPSAwOyBjaGFubmVsSW5kZXggPCBudW1iZXJPZkNoYW5uZWxzKCk7ICsrY2hh
bm5lbEluZGV4KSB7CiAgICAgICAgIGlmIChzb3VyY2VCdXMubnVtYmVyT2ZDaGFubmVscygpID09
IG51bWJlck9mQ2hhbm5lbHMoKSkKICAgICAgICAgICAgIHNvdXJjZSA9IHNvdXJjZUJ1cy5jaGFu
bmVsKGNoYW5uZWxJbmRleCktPmRhdGEoKTsKICAgICAgICAgZmxvYXQqIGRlc3RpbmF0aW9uID0g
Y2hhbm5lbChjaGFubmVsSW5kZXgpLT5kYXRhKCk7Ci0gICAgICAgIGZvciAodW5zaWduZWQgaSA9
IDA7IGkgPCBudW1iZXJPZkdhaW5WYWx1ZXM7ICsraSkKLSAgICAgICAgICAgIGRlc3RpbmF0aW9u
W2ldID0gc291cmNlW2ldICogZ2FpblZhbHVlc1tpXTsKKyAgICAgICAgdm11bChzb3VyY2UsIDEs
IGdhaW5WYWx1ZXMsIDEsIGRlc3RpbmF0aW9uLCAxLCBudW1iZXJPZkdhaW5WYWx1ZXMpOwogICAg
IH0KIH0KIApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vVmVjdG9y
TWF0aC5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9WZWN0b3JNYXRoLmNwcApp
bmRleCBmZjQ0MDZhLi5hYTgwY2E0IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9hdWRpby9WZWN0b3JNYXRoLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9hdWRp
by9WZWN0b3JNYXRoLmNwcApAQCAtNjMsNiArNjMsMTUgQEAgdm9pZCB2YWRkKGNvbnN0IGZsb2F0
KiBzb3VyY2UxUCwgaW50IHNvdXJjZVN0cmlkZTEsIGNvbnN0IGZsb2F0KiBzb3VyY2UyUCwgaW50
IHMKICNlbmRpZgogfQogCit2b2lkIHZtdWwoY29uc3QgZmxvYXQqIHNvdXJjZTFQLCBpbnQgc291
cmNlU3RyaWRlMSwgY29uc3QgZmxvYXQqIHNvdXJjZTJQLCBpbnQgc291cmNlU3RyaWRlMiwgZmxv
YXQqIGRlc3RQLCBpbnQgZGVzdFN0cmlkZSwgc2l6ZV90IGZyYW1lc1RvUHJvY2VzcykKK3sKKyNp
ZiBkZWZpbmVkKF9fcHBjX18pIHx8IGRlZmluZWQoX19pMzg2X18pCisgICAgOjp2bXVsKHNvdXJj
ZTFQLCBzb3VyY2VTdHJpZGUxLCBzb3VyY2UyUCwgc291cmNlU3RyaWRlMiwgZGVzdFAsIGRlc3RT
dHJpZGUsIGZyYW1lc1RvUHJvY2Vzcyk7CisjZWxzZQorICAgIHZEU1Bfdm11bChzb3VyY2UxUCwg
c291cmNlU3RyaWRlMSwgc291cmNlMlAsIHNvdXJjZVN0cmlkZTIsIGRlc3RQLCBkZXN0U3RyaWRl
LCBmcmFtZXNUb1Byb2Nlc3MpOworI2VuZGlmCit9CisKICNlbHNlCiAKIHZvaWQgdnNtdWwoY29u
c3QgZmxvYXQqIHNvdXJjZVAsIGludCBzb3VyY2VTdHJpZGUsIGNvbnN0IGZsb2F0KiBzY2FsZSwg
ZmxvYXQqIGRlc3RQLCBpbnQgZGVzdFN0cmlkZSwgc2l6ZV90IGZyYW1lc1RvUHJvY2VzcykKQEAg
LTIyOSw2ICsyMzgsNzAgQEAgdm9pZCB2YWRkKGNvbnN0IGZsb2F0KiBzb3VyY2UxUCwgaW50IHNv
dXJjZVN0cmlkZTEsIGNvbnN0IGZsb2F0KiBzb3VyY2UyUCwgaW50IHMKICNlbmRpZgogfQogCit2
b2lkIHZtdWwoY29uc3QgZmxvYXQqIHNvdXJjZTFQLCBpbnQgc291cmNlU3RyaWRlMSwgY29uc3Qg
ZmxvYXQqIHNvdXJjZTJQLCBpbnQgc291cmNlU3RyaWRlMiwgZmxvYXQqIGRlc3RQLCBpbnQgZGVz
dFN0cmlkZSwgc2l6ZV90IGZyYW1lc1RvUHJvY2VzcykKK3sKKworICAgIGludCBuID0gZnJhbWVz
VG9Qcm9jZXNzOworCisjaWZkZWYgX19TU0UyX18KKyAgICBpZiAoKHNvdXJjZVN0cmlkZTEgPT0g
MSkgJiYgKHNvdXJjZVN0cmlkZTIgPT0gMSkgJiYgKGRlc3RTdHJpZGUgPT0gMSkpIHsKKworICAg
ICAgICAvLyBJZiB0aGUgc291cmNlMVAgYWRkcmVzcyBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLCB0
aGUgZmlyc3Qgc2V2ZXJhbCBmcmFtZXMgKGF0IG1vc3QgdGhyZWUpIHNob3VsZCBiZSBwcm9jZXNz
ZWQgc2VwZXJhdGVseS4KKyAgICAgICAgd2hpbGUgKChyZWludGVycHJldF9jYXN0PHVpbnRwdHJf
dD4oc291cmNlMVApICYgMHgwRikgJiYgbikgeworICAgICAgICAgICAgKmRlc3RQID0gKnNvdXJj
ZTFQICogKnNvdXJjZTJQOworICAgICAgICAgICAgc291cmNlMVArKzsKKyAgICAgICAgICAgIHNv
dXJjZTJQKys7CisgICAgICAgICAgICBkZXN0UCsrOworICAgICAgICAgICAgbi0tOworICAgICAg
ICB9CisKKyAgICAgICAgLy8gTm93IHRoZSBzb3VyY2UxUCBhZGRyZXNzIGFsaWduZWQgYW5kIHN0
YXJ0IHRvIGFwcGx5IFNTRS4KKyAgICAgICAgaW50IHRhaWxGcmFtZXMgPSBuICUgNDsKKyAgICAg
ICAgZmxvYXQqIGVuZFAgPSBkZXN0UCArIG4gLSB0YWlsRnJhbWVzOworICAgICAgICBfX20xMjgg
cFNvdXJjZTE7CisgICAgICAgIF9fbTEyOCBwU291cmNlMjsKKyAgICAgICAgX19tMTI4IGRlc3Q7
CisKKyAgICAgICAgYm9vbCBzb3VyY2UyQWxpZ25lZCA9ICEocmVpbnRlcnByZXRfY2FzdDx1aW50
cHRyX3Q+KHNvdXJjZTJQKSAmIDB4MEYpOworICAgICAgICBib29sIGRlc3RBbGlnbmVkID0gIShy
ZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oZGVzdFApICYgMHgwRik7CisKKyNkZWZpbmUgU1NF
Ml9NVUxUKGxvYWRJbnN0ciwgc3RvcmVJbnN0cikgICAgICAgICAgICAgICAgICAgXAorICAgICAg
ICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisg
ICAgICAgICAgICAgICAgcFNvdXJjZTEgPSBfbW1fbG9hZF9wcyhzb3VyY2UxUCk7ICAgICAgICAg
IFwKKyAgICAgICAgICAgICAgICBwU291cmNlMiA9IF9tbV8jI2xvYWRJbnN0ciMjX3BzKHNvdXJj
ZTJQKTsgXAorICAgICAgICAgICAgICAgIGRlc3QgPSBfbW1fbXVsX3BzKHBTb3VyY2UxLCBwU291
cmNlMik7ICAgICBcCisgICAgICAgICAgICAgICAgX21tXyMjc3RvcmVJbnN0ciMjX3BzKGRlc3RQ
LCBkZXN0KTsgICAgICAgIFwKKyAgICAgICAgICAgICAgICBzb3VyY2UxUCArPSA0OyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHNvdXJjZTJQICs9IDQ7ICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZGVzdFAgKz0gNDsg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0KKworICAgICAg
ICBpZiAoc291cmNlMkFsaWduZWQgJiYgZGVzdEFsaWduZWQpIHsgLy8gQm90aCBhbGlnbmVkLgor
ICAgICAgICAgICAgd2hpbGUgKGRlc3RQIDwgZW5kUCkKKyAgICAgICAgICAgICAgICBTU0UyX01V
TFQobG9hZCwgc3RvcmUpCisgICAgICAgIH0gZWxzZSBpZiAoc291cmNlMkFsaWduZWQgJiYgIWRl
c3RBbGlnbmVkKSB7IC8vIFNvdXJjZTIgaXMgYWxpZ25lZCBidXQgZGVzdCBub3QuCisgICAgICAg
ICAgICB3aGlsZSAoZGVzdFAgPCBlbmRQKQorICAgICAgICAgICAgICAgIFNTRTJfTVVMVChsb2Fk
LCBzdG9yZXUpCisgICAgICAgIH0gZWxzZSBpZiAoIXNvdXJjZTJBbGlnbmVkICYmIGRlc3RBbGln
bmVkKSB7IC8vIERlc3QgaXMgYWxpZ25lZCBidXQgc291cmNlMiBub3QuCisgICAgICAgICAgICB3
aGlsZSAoZGVzdFAgPCBlbmRQKQorICAgICAgICAgICAgICAgIFNTRTJfTVVMVChsb2FkdSwgc3Rv
cmUpCisgICAgICAgIH0gZWxzZSB7IC8vIE5laXRoZXIgYWxpZ25lZC4KKyAgICAgICAgICAgIHdo
aWxlIChkZXN0UCA8IGVuZFApCisgICAgICAgICAgICAgICAgU1NFMl9NVUxUKGxvYWR1LCBzdG9y
ZXUpCisgICAgICAgIH0KKworICAgICAgICBuID0gdGFpbEZyYW1lczsKKyAgICB9CisjZW5kaWYK
KyAgICB3aGlsZSAobikgeworICAgICAgICAqZGVzdFAgPSAqc291cmNlMVAgKiAqc291cmNlMlA7
CisgICAgICAgIHNvdXJjZTFQICs9IHNvdXJjZVN0cmlkZTE7CisgICAgICAgIHNvdXJjZTJQICs9
IHNvdXJjZVN0cmlkZTI7CisgICAgICAgIGRlc3RQICs9IGRlc3RTdHJpZGU7CisgICAgICAgIG4t
LTsKKyAgICB9Cit9CisKICNlbmRpZiAvLyBPUyhEQVJXSU4pCiAKIH0gLy8gbmFtZXNwYWNlIFZl
Y3Rvck1hdGgKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL1ZlY3Rv
ck1hdGguaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL1ZlY3Rvck1hdGguaAppbmRl
eCAwMzYwYmRiLi5hM2E5MmU1IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9h
dWRpby9WZWN0b3JNYXRoLmgKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vVmVj
dG9yTWF0aC5oCkBAIC0zNCw2ICszNCw5IEBAIG5hbWVzcGFjZSBWZWN0b3JNYXRoIHsKIHZvaWQg
dnNtdWwoY29uc3QgZmxvYXQqIHNvdXJjZVAsIGludCBzb3VyY2VTdHJpZGUsIGNvbnN0IGZsb2F0
KiBzY2FsZSwgZmxvYXQqIGRlc3RQLCBpbnQgZGVzdFN0cmlkZSwgc2l6ZV90IGZyYW1lc1RvUHJv
Y2Vzcyk7CiB2b2lkIHZhZGQoY29uc3QgZmxvYXQqIHNvdXJjZTFQLCBpbnQgc291cmNlU3RyaWRl
MSwgY29uc3QgZmxvYXQqIHNvdXJjZTJQLCBpbnQgc291cmNlU3RyaWRlMiwgZmxvYXQqIGRlc3RQ
LCBpbnQgZGVzdFN0cmlkZSwgc2l6ZV90IGZyYW1lc1RvUHJvY2Vzcyk7CiAKKy8vIEZvciBhbiBl
bGVtZW50LWJ5LWVsZW1lbnQgbXVsdGlwbHkgb2YgdHdvIGZsb2F0IHZlY3RvcnMuCit2b2lkIHZt
dWwoY29uc3QgZmxvYXQqIHNvdXJjZTFQLCBpbnQgc291cmNlU3RyaWRlMSwgY29uc3QgZmxvYXQq
IHNvdXJjZTJQLCBpbnQgc291cmNlU3RyaWRlMiwgZmxvYXQqIGRlc3RQLCBpbnQgZGVzdFN0cmlk
ZSwgc2l6ZV90IGZyYW1lc1RvUHJvY2Vzcyk7CisKIH0gLy8gbmFtZXNwYWNlIFZlY3Rvck1hdGgK
IAogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQo=
</data>
<flag name="review"
          id="118828"
          type_id="1"
          status="+"
          setter="benjamin"
    />
    <flag name="commit-queue"
          id="118829"
          type_id="3"
          status="-"
          setter="benjamin"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>118971</attachid>
            <date>2011-12-13 01:03:39 -0800</date>
            <delta_ts>2011-12-13 13:42:56 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>Patch</filename>
            <type>text/plain</type>
            <size>6278</size>
            <attacher name="Xingnan Wang">xingnan.wang</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZwppbmRleCBmMTIzZmJmLi44Y2I0NGJiIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjIg
QEAKKzIwMTEtMTItMTMgIFhpbmduYW4gV2FuZyAgPHhpbmduYW4ud2FuZ0BpbnRlbC5jb20+CisK
KyAgICAgICAgSW1wbGVtZW50IGEgZnVuY3Rpb24gb2YgdmVjdG9yIG11bHRpcGx5IHdpdGggU1NF
MiBvcHRpbWl6YXRpb24gaW4gVmVjdG9yTWF0aC5jcHAuCisgICAgICAgIGh0dHBzOi8vYnVncy53
ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD03NDA0OAorCisgICAgICAgIFJldmlld2VkIGJ5IE5P
Qk9EWSAoT09QUyEpLgorCisgICAgICAgIFRoZSB2bXVsIGlzIGEgZnVuY3Rpb24gZm9yIGFuIGVs
ZW1lbnQtYnktZWxlbWVudCBtdWx0aXBseSBvZiB0d28gZmxvYXQgdmVjdG9ycyBhbmQgd2UgCisg
ICAgICAgIGdldCBhYm91dCAzLjR4IHBlcmZvcm1hbmNlIGltcHJvdmVtZW50IHdpdGggU1NFMiBv
cHRpbWl6YXRpb24gY29tcGFyZWQgd2l0aCB0aGUgY29tbW9uIAorICAgICAgICBtdWx0aXBseS4K
KworICAgICAgICBVc2Ugdm11bCBpbiBBdWRpb0J1czo6Y29weVdpdGhTYW1wbGVBY2N1cmF0ZUdh
aW5WYWx1ZXNGcm9tKCkuCisKKyAgICAgICAgKiBwbGF0Zm9ybS9hdWRpby9BdWRpb0J1cy5jcHA6
CisgICAgICAgIChXZWJDb3JlOjpBdWRpb0J1czo6Y29weVdpdGhTYW1wbGVBY2N1cmF0ZUdhaW5W
YWx1ZXNGcm9tKToKKyAgICAgICAgKiBwbGF0Zm9ybS9hdWRpby9WZWN0b3JNYXRoLmNwcDoKKyAg
ICAgICAgKFdlYkNvcmU6OlZlY3Rvck1hdGg6OnZtdWwpOgorICAgICAgICAqIHBsYXRmb3JtL2F1
ZGlvL1ZlY3Rvck1hdGguaDoKKwogMjAxMS0xMi0xMyAgWW9zaWZ1bWkgSW5vdWUgIDx5b3NpbkBj
aHJvbWl1bS5vcmc+CiAKICAgICAgICAgUmVuZGVyVGhlbWUgc2hvdWxkIGhhdmUgYSBmdW5jdGlv
biBmb3IgZGlzYWJsZWQgdGV4dCBjb2xvciBhZGp1c3RtZW50CmRpZmYgLS1naXQgYS9Tb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9BdWRpb0J1cy5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9hdWRpby9BdWRpb0J1cy5jcHAKaW5kZXggNmMwNzZiNy4uYjVlYzI0NiAxMDA2NDQKLS0t
IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vQXVkaW9CdXMuY3BwCisrKyBiL1NvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL0F1ZGlvQnVzLmNwcApAQCAtMzgyLDE1ICszODIsMTMg
QEAgdm9pZCBBdWRpb0J1czo6Y29weVdpdGhTYW1wbGVBY2N1cmF0ZUdhaW5WYWx1ZXNGcm9tKGNv
bnN0IEF1ZGlvQnVzICZzb3VyY2VCdXMsIGYKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAg
IC8vIEZJWE1FOiB0aGlzIGNhbiBwb3RlbnRpYWxseSB1c2UgU0lNRCBvcHRpbWl6YXRpb25zIHdp
dGggdmVjdG9yIGxpYnJhcmllcy4KICAgICAvLyBXZSBoYW5kbGUgYm90aCB0aGUgMSAtPiBOIGFu
ZCBOIC0+IE4gY2FzZSBoZXJlLgogICAgIGNvbnN0IGZsb2F0KiBzb3VyY2UgPSBzb3VyY2VCdXMu
Y2hhbm5lbCgwKS0+ZGF0YSgpOwogICAgIGZvciAodW5zaWduZWQgY2hhbm5lbEluZGV4ID0gMDsg
Y2hhbm5lbEluZGV4IDwgbnVtYmVyT2ZDaGFubmVscygpOyArK2NoYW5uZWxJbmRleCkgewogICAg
ICAgICBpZiAoc291cmNlQnVzLm51bWJlck9mQ2hhbm5lbHMoKSA9PSBudW1iZXJPZkNoYW5uZWxz
KCkpCiAgICAgICAgICAgICBzb3VyY2UgPSBzb3VyY2VCdXMuY2hhbm5lbChjaGFubmVsSW5kZXgp
LT5kYXRhKCk7CiAgICAgICAgIGZsb2F0KiBkZXN0aW5hdGlvbiA9IGNoYW5uZWwoY2hhbm5lbElu
ZGV4KS0+ZGF0YSgpOwotICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbnVtYmVyT2ZH
YWluVmFsdWVzOyArK2kpCi0gICAgICAgICAgICBkZXN0aW5hdGlvbltpXSA9IHNvdXJjZVtpXSAq
IGdhaW5WYWx1ZXNbaV07CisgICAgICAgIHZtdWwoc291cmNlLCAxLCBnYWluVmFsdWVzLCAxLCBk
ZXN0aW5hdGlvbiwgMSwgbnVtYmVyT2ZHYWluVmFsdWVzKTsKICAgICB9CiB9CiAKZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL1ZlY3Rvck1hdGguY3BwIGIvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vVmVjdG9yTWF0aC5jcHAKaW5kZXggZmY0NDA2YS4uMmU2
ZDFlMSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vVmVjdG9yTWF0
aC5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vVmVjdG9yTWF0aC5jcHAK
QEAgLTYzLDYgKzYzLDE1IEBAIHZvaWQgdmFkZChjb25zdCBmbG9hdCogc291cmNlMVAsIGludCBz
b3VyY2VTdHJpZGUxLCBjb25zdCBmbG9hdCogc291cmNlMlAsIGludCBzCiAjZW5kaWYKIH0KIAor
dm9pZCB2bXVsKGNvbnN0IGZsb2F0KiBzb3VyY2UxUCwgaW50IHNvdXJjZVN0cmlkZTEsIGNvbnN0
IGZsb2F0KiBzb3VyY2UyUCwgaW50IHNvdXJjZVN0cmlkZTIsIGZsb2F0KiBkZXN0UCwgaW50IGRl
c3RTdHJpZGUsIHNpemVfdCBmcmFtZXNUb1Byb2Nlc3MpCit7CisjaWYgZGVmaW5lZChfX3BwY19f
KSB8fCBkZWZpbmVkKF9faTM4Nl9fKQorICAgIDo6dm11bChzb3VyY2UxUCwgc291cmNlU3RyaWRl
MSwgc291cmNlMlAsIHNvdXJjZVN0cmlkZTIsIGRlc3RQLCBkZXN0U3RyaWRlLCBmcmFtZXNUb1By
b2Nlc3MpOworI2Vsc2UKKyAgICB2RFNQX3ZtdWwoc291cmNlMVAsIHNvdXJjZVN0cmlkZTEsIHNv
dXJjZTJQLCBzb3VyY2VTdHJpZGUyLCBkZXN0UCwgZGVzdFN0cmlkZSwgZnJhbWVzVG9Qcm9jZXNz
KTsKKyNlbmRpZgorfQorCiAjZWxzZQogCiB2b2lkIHZzbXVsKGNvbnN0IGZsb2F0KiBzb3VyY2VQ
LCBpbnQgc291cmNlU3RyaWRlLCBjb25zdCBmbG9hdCogc2NhbGUsIGZsb2F0KiBkZXN0UCwgaW50
IGRlc3RTdHJpZGUsIHNpemVfdCBmcmFtZXNUb1Byb2Nlc3MpCkBAIC0yMjksNiArMjM4LDY2IEBA
IHZvaWQgdmFkZChjb25zdCBmbG9hdCogc291cmNlMVAsIGludCBzb3VyY2VTdHJpZGUxLCBjb25z
dCBmbG9hdCogc291cmNlMlAsIGludCBzCiAjZW5kaWYKIH0KIAordm9pZCB2bXVsKGNvbnN0IGZs
b2F0KiBzb3VyY2UxUCwgaW50IHNvdXJjZVN0cmlkZTEsIGNvbnN0IGZsb2F0KiBzb3VyY2UyUCwg
aW50IHNvdXJjZVN0cmlkZTIsIGZsb2F0KiBkZXN0UCwgaW50IGRlc3RTdHJpZGUsIHNpemVfdCBm
cmFtZXNUb1Byb2Nlc3MpCit7CisKKyAgICBpbnQgbiA9IGZyYW1lc1RvUHJvY2VzczsKKworI2lm
ZGVmIF9fU1NFMl9fCisgICAgaWYgKChzb3VyY2VTdHJpZGUxID09IDEpICYmIChzb3VyY2VTdHJp
ZGUyID09IDEpICYmIChkZXN0U3RyaWRlID09IDEpKSB7CisKKyAgICAgICAgLy8gSWYgdGhlIHNv
dXJjZTFQIGFkZHJlc3MgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZCwgdGhlIGZpcnN0IHNldmVyYWwg
ZnJhbWVzIChhdCBtb3N0IHRocmVlKSBzaG91bGQgYmUgcHJvY2Vzc2VkIHNlcGVyYXRlbHkuCisg
ICAgICAgIHdoaWxlICgocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KHNvdXJjZTFQKSAmIDB4
MEYpICYmIG4pIHsKKyAgICAgICAgICAgICpkZXN0UCA9ICpzb3VyY2UxUCAqICpzb3VyY2UyUDsK
KyAgICAgICAgICAgIHNvdXJjZTFQKys7CisgICAgICAgICAgICBzb3VyY2UyUCsrOworICAgICAg
ICAgICAgZGVzdFArKzsKKyAgICAgICAgICAgIG4tLTsKKyAgICAgICAgfQorCisgICAgICAgIC8v
IE5vdyB0aGUgc291cmNlMVAgYWRkcmVzcyBhbGlnbmVkIGFuZCBzdGFydCB0byBhcHBseSBTU0Uu
CisgICAgICAgIGludCB0YWlsRnJhbWVzID0gbiAlIDQ7CisgICAgICAgIGZsb2F0KiBlbmRQID0g
ZGVzdFAgKyBuIC0gdGFpbEZyYW1lczsKKyAgICAgICAgX19tMTI4IHBTb3VyY2UxOworICAgICAg
ICBfX20xMjggcFNvdXJjZTI7CisgICAgICAgIF9fbTEyOCBkZXN0OworCisgICAgICAgIGJvb2wg
c291cmNlMkFsaWduZWQgPSAhKHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90Pihzb3VyY2UyUCkg
JiAweDBGKTsKKyAgICAgICAgYm9vbCBkZXN0QWxpZ25lZCA9ICEocmVpbnRlcnByZXRfY2FzdDx1
aW50cHRyX3Q+KGRlc3RQKSAmIDB4MEYpOworCisjZGVmaW5lIFNTRTJfTVVMVChsb2FkSW5zdHIs
IHN0b3JlSW5zdHIpICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHdoaWxlIChkZXN0
UCA8IGVuZFApICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgeyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAg
ICAgcFNvdXJjZTEgPSBfbW1fbG9hZF9wcyhzb3VyY2UxUCk7ICAgICAgICAgIFwKKyAgICAgICAg
ICAgICAgICBwU291cmNlMiA9IF9tbV8jI2xvYWRJbnN0ciMjX3BzKHNvdXJjZTJQKTsgXAorICAg
ICAgICAgICAgICAgIGRlc3QgPSBfbW1fbXVsX3BzKHBTb3VyY2UxLCBwU291cmNlMik7ICAgICBc
CisgICAgICAgICAgICAgICAgX21tXyMjc3RvcmVJbnN0ciMjX3BzKGRlc3RQLCBkZXN0KTsgICAg
ICAgIFwKKyAgICAgICAgICAgICAgICBzb3VyY2UxUCArPSA0OyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgXAorICAgICAgICAgICAgICAgIHNvdXJjZTJQICs9IDQ7ICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZGVzdFAgKz0gNDsgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0KKworICAgICAgICBpZiAoc291cmNl
MkFsaWduZWQgJiYgZGVzdEFsaWduZWQpIC8vIEJvdGggYWxpZ25lZC4KKyAgICAgICAgICAgIFNT
RTJfTVVMVChsb2FkLCBzdG9yZSkKKyAgICAgICAgZWxzZSBpZiAoc291cmNlMkFsaWduZWQgJiYg
IWRlc3RBbGlnbmVkKSAvLyBTb3VyY2UyIGlzIGFsaWduZWQgYnV0IGRlc3Qgbm90LgorICAgICAg
ICAgICAgU1NFMl9NVUxUKGxvYWQsIHN0b3JldSkKKyAgICAgICAgZWxzZSBpZiAoIXNvdXJjZTJB
bGlnbmVkICYmIGRlc3RBbGlnbmVkKSAvLyBEZXN0IGlzIGFsaWduZWQgYnV0IHNvdXJjZTIgbm90
LgorICAgICAgICAgICAgU1NFMl9NVUxUKGxvYWR1LCBzdG9yZSkKKyAgICAgICAgZWxzZSAvLyBO
ZWl0aGVyIGFsaWduZWQuCisgICAgICAgICAgICBTU0UyX01VTFQobG9hZHUsIHN0b3JldSkKKwor
ICAgICAgICBuID0gdGFpbEZyYW1lczsKKyAgICB9CisjZW5kaWYKKyAgICB3aGlsZSAobikgewor
ICAgICAgICAqZGVzdFAgPSAqc291cmNlMVAgKiAqc291cmNlMlA7CisgICAgICAgIHNvdXJjZTFQ
ICs9IHNvdXJjZVN0cmlkZTE7CisgICAgICAgIHNvdXJjZTJQICs9IHNvdXJjZVN0cmlkZTI7Cisg
ICAgICAgIGRlc3RQICs9IGRlc3RTdHJpZGU7CisgICAgICAgIG4tLTsKKyAgICB9Cit9CisKICNl
bmRpZiAvLyBPUyhEQVJXSU4pCiAKIH0gLy8gbmFtZXNwYWNlIFZlY3Rvck1hdGgKZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL1ZlY3Rvck1hdGguaCBiL1NvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL1ZlY3Rvck1hdGguaAppbmRleCAwMzYwYmRiLi5hM2E5MmU1
IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9WZWN0b3JNYXRoLmgK
KysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vVmVjdG9yTWF0aC5oCkBAIC0zNCw2
ICszNCw5IEBAIG5hbWVzcGFjZSBWZWN0b3JNYXRoIHsKIHZvaWQgdnNtdWwoY29uc3QgZmxvYXQq
IHNvdXJjZVAsIGludCBzb3VyY2VTdHJpZGUsIGNvbnN0IGZsb2F0KiBzY2FsZSwgZmxvYXQqIGRl
c3RQLCBpbnQgZGVzdFN0cmlkZSwgc2l6ZV90IGZyYW1lc1RvUHJvY2Vzcyk7CiB2b2lkIHZhZGQo
Y29uc3QgZmxvYXQqIHNvdXJjZTFQLCBpbnQgc291cmNlU3RyaWRlMSwgY29uc3QgZmxvYXQqIHNv
dXJjZTJQLCBpbnQgc291cmNlU3RyaWRlMiwgZmxvYXQqIGRlc3RQLCBpbnQgZGVzdFN0cmlkZSwg
c2l6ZV90IGZyYW1lc1RvUHJvY2Vzcyk7CiAKKy8vIEZvciBhbiBlbGVtZW50LWJ5LWVsZW1lbnQg
bXVsdGlwbHkgb2YgdHdvIGZsb2F0IHZlY3RvcnMuCit2b2lkIHZtdWwoY29uc3QgZmxvYXQqIHNv
dXJjZTFQLCBpbnQgc291cmNlU3RyaWRlMSwgY29uc3QgZmxvYXQqIHNvdXJjZTJQLCBpbnQgc291
cmNlU3RyaWRlMiwgZmxvYXQqIGRlc3RQLCBpbnQgZGVzdFN0cmlkZSwgc2l6ZV90IGZyYW1lc1Rv
UHJvY2Vzcyk7CisKIH0gLy8gbmFtZXNwYWNlIFZlY3Rvck1hdGgKIAogfSAvLyBuYW1lc3BhY2Ug
V2ViQ29yZQo=
</data>

          </attachment>
      

    </bug>

</bugzilla>