<?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>97740</bug_id>
          
          <creation_ts>2012-09-26 16:44:40 -0700</creation_ts>
          <short_desc>HTMLConstructionSite::insertTextNode isn&apos;t optimized for 8 bit strings</short_desc>
          <delta_ts>2012-10-02 11:40:53 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>DOM</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="Michael Saboff">msaboff</reporter>
          <assigned_to name="Michael Saboff">msaboff</assigned_to>
          <cc>benjamin</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>729069</commentid>
    <comment_count>0</comment_count>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2012-09-26 16:44:40 -0700</bug_when>
    <thetext>HTMLConstructionSite::insertTextNode() always calls characters() on it&apos;s argument string, thus up converting an 8 bit argument.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>729126</commentid>
    <comment_count>1</comment_count>
      <attachid>165912</attachid>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2012-09-26 18:40:06 -0700</bug_when>
    <thetext>Created attachment 165912
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>729175</commentid>
    <comment_count>2</comment_count>
      <attachid>165912</attachid>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2012-09-26 20:51:02 -0700</bug_when>
    <thetext>Comment on attachment 165912
Patch

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

&gt; Source/WTF/wtf/text/WTFString.cpp:186
&gt; +        LChar* data;

This could go after the if() for clarity.

&gt; Source/WTF/wtf/text/WTFString.cpp:187
&gt; +        if (lengthToAppend &gt; numeric_limits&lt;unsigned&gt;::max() - length())

In String, length() will test if m_impl is null. At this point, you know you have m_impl. This call to length() and the following should use the StringImpl directly.

&gt; Source/WTF/wtf/text/WTFString.cpp:190
&gt; +        memcpy(data, characters8(), length() * sizeof(LChar));

characters8() also checks if m_impl is null.

I am not sure what is better here, memcpy or StringImpl::copyChars()?

&gt; Source/WebCore/dom/CharacterData.cpp:88
&gt; -    m_data.append(data, end);
&gt; +    if (string.is8Bit())
&gt; +        m_data.append(string.characters8() + offset, end);
&gt; +    else
&gt; +        m_data.append(string.characters16() + offset, end);

Can &quot;string&quot; ever be null?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>729717</commentid>
    <comment_count>3</comment_count>
      <attachid>166033</attachid>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2012-09-27 11:15:58 -0700</bug_when>
    <thetext>Created attachment 166033
Patch updated from review comments

(In reply to comment #2)
&gt; (From update of attachment 165912 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=165912&amp;action=review
&gt; 
&gt; &gt; Source/WTF/wtf/text/WTFString.cpp:186
&gt; &gt; +        LChar* data;
&gt; 
&gt; This could go after the if() for clarity.

Moved this and the similar instances of UChar* data.
 
&gt; &gt; Source/WTF/wtf/text/WTFString.cpp:187
&gt; &gt; +        if (lengthToAppend &gt; numeric_limits&lt;unsigned&gt;::max() - length())
&gt; 
&gt; In String, length() will test if m_impl is null. At this point, you know you have m_impl. This call to length() and the following should use the StringImpl directly.
 
Factored out length to a local.

&gt; &gt; Source/WTF/wtf/text/WTFString.cpp:190
&gt; &gt; +        memcpy(data, characters8(), length() * sizeof(LChar));
&gt; 
&gt; characters8() also checks if m_impl is null.

Changed occurrences of characters8() and characters16() to be via m_impl.

&gt; I am not sure what is better here, memcpy or StringImpl::copyChars()?

Since compChars() has some optimization for word at once and reverts to memcpy after one check, I used it in all cases.

&gt; &gt; Source/WebCore/dom/CharacterData.cpp:88
&gt; &gt; -    m_data.append(data, end);
&gt; &gt; +    if (string.is8Bit())
&gt; &gt; +        m_data.append(string.characters8() + offset, end);
&gt; &gt; +    else
&gt; &gt; +        m_data.append(string.characters16() + offset, end);
&gt; 
&gt; Can &quot;string&quot; ever be null?

I don&apos;t think string can be null in the current path to this method, but I added a check anyway.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>729723</commentid>
    <comment_count>4</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-09-27 11:22:39 -0700</bug_when>
    <thetext>Attachment 166033 did not pass style-queue:

Failed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;Source/WTF/ChangeLog&apos;, u&apos;Source/WTF/wtf/te...&quot; exit_code: 1
Source/WTF/wtf/text/WTFString.cpp:230:  Extra space before )  [whitespace/parens] [2]
Total errors found: 1 in 8 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>729728</commentid>
    <comment_count>5</comment_count>
      <attachid>166035</attachid>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2012-09-27 11:28:26 -0700</bug_when>
    <thetext>Created attachment 166035
Patch with extra space removed

Comments from previous patch still apply.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>732724</commentid>
    <comment_count>6</comment_count>
      <attachid>166035</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2012-10-02 09:36:21 -0700</bug_when>
    <thetext>Comment on attachment 166035
Patch with extra space removed

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

&gt; Source/WebCore/dom/CharacterData.cpp:66
&gt; -unsigned CharacterData::parserAppendData(const UChar* data, unsigned dataLength, unsigned lengthLimit)
&gt; +unsigned CharacterData::parserAppendData(const String&amp; string, unsigned dataLength, unsigned lengthLimit, unsigned offset)

None of the callers need the dataLength argument. They all just pass the string length minus the offset.

I also think the name dataLength is confusing given that the first line in this function evaluates m_data.length(), which is not the same thing as dataLength. It was defensible before when the argument passed in was named “data”, but now we’re passing a string that already has its intrinsic length so it’s not good to pass a separate length.

I suggest removing the dataLength argument and using the string length.

I also think the offset would be more logical as the first parameter, right after the string. A little strange to have it be the last one separated from the string by the length limit, even though having it last allows it to be optional.

On reflection, the arguments to this are similar the arguments to the String::substring function: An offset followed by a count. The difference here is that lengthLimit is a limit on the total size of the CharacterData object rather than a limit on the number of new characters to be added from the string.

I also think this function needs to assert that lengthLimit &gt;= oldLength, because otherwise it will malfunction. Or be re-coded to handle that case if the assert fires.

&gt; Source/WebCore/dom/CharacterData.cpp:82
&gt; +    if (!end || !string.length())

This string.length() check we are adding will never be true. That’s because dataLength == (string.length() - offset), and end &lt;= dataLength &lt;= string.length(). So if string.length() is zero, end will also be zero. Also, end is not a good name for the variable now that we have an offset. With the offset involved, end is the length of characters, not the offset of the end in the string, so it no longer makes sense to call it “end”.

&gt; Source/WebCore/dom/CharacterData.h:48
&gt; -    unsigned parserAppendData(const UChar*, unsigned dataLength, unsigned lengthLimit);
&gt; +    unsigned parserAppendData(const String&amp;, unsigned, unsigned , unsigned offset = 0);

Please don’t remove the argument names here. Callers need the names to understand what the otherwise undocumented arguments are.

Also got a stray space here before a comma.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>732878</commentid>
    <comment_count>7</comment_count>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2012-10-02 11:35:38 -0700</bug_when>
    <thetext>(In reply to comment #6)
&gt; (From update of attachment 166035 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=166035&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/dom/CharacterData.cpp:66
&gt; &gt; -unsigned CharacterData::parserAppendData(const UChar* data, unsigned dataLength, unsigned lengthLimit)
&gt; &gt; +unsigned CharacterData::parserAppendData(const String&amp; string, unsigned dataLength, unsigned lengthLimit, unsigned offset)
&gt; 
&gt; None of the callers need the dataLength argument. They all just pass the string length minus the offset.
&gt; 
&gt; I also think the name dataLength is confusing given that the first line in this function evaluates m_data.length(), which is not the same thing as dataLength. It was defensible before when the argument passed in was named “data”, but now we’re passing a string that already has its intrinsic length so it’s not good to pass a separate length.
&gt; 
&gt; I suggest removing the dataLength argument and using the string length.

Done.

&gt; I also think the offset would be more logical as the first parameter, right after the string. A little strange to have it be the last one separated from the string by the length limit, even though having it last allows it to be optional.
&gt; 
&gt; On reflection, the arguments to this are similar the arguments to the String::substring function: An offset followed by a count. The difference here is that lengthLimit is a limit on the total size of the CharacterData object rather than a limit on the number of new characters to be added from the string.

The args are now string, offset, lengthLimit.

&gt; I also think this function needs to assert that lengthLimit &gt;= oldLength, because otherwise it will malfunction. Or be re-coded to handle that case if the assert fires.

Added the ASSERT.

&gt; &gt; Source/WebCore/dom/CharacterData.cpp:82
&gt; &gt; +    if (!end || !string.length())
&gt; 
&gt; This string.length() check we are adding will never be true. That’s because dataLength == (string.length() - offset), and end &lt;= dataLength &lt;= string.length(). So if string.length() is zero, end will also be zero.

Removed the string.length() check.

&gt; Also, end is not a good name for the variable now that we have an offset. With the offset involved, end is the length of characters, not the offset of the end in the string, so it no longer makes sense to call it “end”.

Renamed end to characterLengthLimit.

&gt; &gt; Source/WebCore/dom/CharacterData.h:48
&gt; &gt; -    unsigned parserAppendData(const UChar*, unsigned dataLength, unsigned lengthLimit);
&gt; &gt; +    unsigned parserAppendData(const String&amp;, unsigned, unsigned , unsigned offset = 0);
&gt; 
&gt; Please don’t remove the argument names here. Callers need the names to understand what the otherwise undocumented arguments are.

Added the argument names back.

&gt; Also got a stray space here before a comma.

Deleted.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>732883</commentid>
    <comment_count>8</comment_count>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2012-10-02 11:40:53 -0700</bug_when>
    <thetext>Committed r130190: &lt;http://trac.webkit.org/changeset/130190&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>165912</attachid>
            <date>2012-09-26 18:40:06 -0700</date>
            <delta_ts>2012-09-27 11:15:58 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>97740.patch</filename>
            <type>text/plain</type>
            <size>8538</size>
            <attacher name="Michael Saboff">msaboff</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XVEYvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XVEYvQ2hh
bmdlTG9nCShyZXZpc2lvbiAxMjk3MjApCisrKyBTb3VyY2UvV1RGL0NoYW5nZUxvZwkod29ya2lu
ZyBjb3B5KQpAQCAtMSwzICsxLDE4IEBACisyMDEyLTA5LTI2ICBNaWNoYWVsIFNhYm9mZiAgPG1z
YWJvZmZAYXBwbGUuY29tPgorCisgICAgICAgIEhUTUxDb25zdHJ1Y3Rpb25TaXRlOjppbnNlcnRU
ZXh0Tm9kZSBkb2Vzbid0IGhhbmRsZSA4IGJpdCBzdHJpbmdzCisgICAgICAgIGh0dHBzOi8vYnVn
cy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD05Nzc0MAorCisgICAgICAgIFJldmlld2VkIGJ5
IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIEFkZGVkIGFuIGFwcGVuZCBtZXRob2QgdGhhdCB0
YWtlcyBhbiBMQ2hhciBzb3VyY2UuICBNYWRlIGJvdGggdGhlIFVDaGFyIGFuZCBMQ2hhciB2ZXJz
aW9ucyBvcHRpbWFsbHkgaGFuZGxlCisgICAgICAgIHRoZSBhcHBlbmRlZSBhbmQgYXBwZW5kZW5k
IHN0cmluZyBiaXRuZXNzLgorCisgICAgICAgICogd3RmL3RleHQvV1RGU3RyaW5nLmNwcDoKKyAg
ICAgICAgKFdURjo6U3RyaW5nOjphcHBlbmQpOgorICAgICAgICAqIHd0Zi90ZXh0L1dURlN0cmlu
Zy5oOgorICAgICAgICAoU3RyaW5nKToKKwogMjAxMi0wOS0yNiAgTWljaGFlbCBTYWJvZmYgIDxt
c2Fib2ZmQGFwcGxlLmNvbT4KIAogICAgICAgICBVcGRhdGUgQ29tcGxleFRleHRDb250cm9sbGVy
IGZvciA4IGJpdCBUZXh0UnVuIGNoYW5nZXMKSW5kZXg6IFNvdXJjZS9XVEYvd3RmL3RleHQvV1RG
U3RyaW5nLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV1RGL3d0Zi90ZXh0L1dURlN0cmluZy5j
cHAJKHJldmlzaW9uIDEyOTY3NikKKysrIFNvdXJjZS9XVEYvd3RmL3RleHQvV1RGU3RyaW5nLmNw
cAkod29ya2luZyBjb3B5KQpAQCAtMTY4LDYgKzE2OCw0MCBAQCB2b2lkIFN0cmluZzo6aW5zZXJ0
KGNvbnN0IFN0cmluZyYgc3RyLCB1CiAgICAgaW5zZXJ0KHN0ci5jaGFyYWN0ZXJzKCksIHN0ci5s
ZW5ndGgoKSwgcG9zKTsKIH0KIAordm9pZCBTdHJpbmc6OmFwcGVuZChjb25zdCBMQ2hhciogY2hh
cmFjdGVyc1RvQXBwZW5kLCB1bnNpZ25lZCBsZW5ndGhUb0FwcGVuZCkKK3sKKyAgICBpZiAoIW1f
aW1wbCkgeworICAgICAgICBpZiAoIWNoYXJhY3RlcnNUb0FwcGVuZCkKKyAgICAgICAgICAgIHJl
dHVybjsKKyAgICAgICAgbV9pbXBsID0gU3RyaW5nSW1wbDo6Y3JlYXRlKGNoYXJhY3RlcnNUb0Fw
cGVuZCwgbGVuZ3RoVG9BcHBlbmQpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYg
KCFsZW5ndGhUb0FwcGVuZCkKKyAgICAgICAgcmV0dXJuOworCisgICAgQVNTRVJUKGNoYXJhY3Rl
cnNUb0FwcGVuZCk7CisKKyAgICBpZiAobV9pbXBsLT5pczhCaXQoKSkgeworICAgICAgICBMQ2hh
ciogZGF0YTsKKyAgICAgICAgaWYgKGxlbmd0aFRvQXBwZW5kID4gbnVtZXJpY19saW1pdHM8dW5z
aWduZWQ+OjptYXgoKSAtIGxlbmd0aCgpKQorICAgICAgICAgICAgQ1JBU0goKTsKKyAgICAgICAg
UmVmUHRyPFN0cmluZ0ltcGw+IG5ld0ltcGwgPSBTdHJpbmdJbXBsOjpjcmVhdGVVbmluaXRpYWxp
emVkKGxlbmd0aCgpICsgbGVuZ3RoVG9BcHBlbmQsIGRhdGEpOworICAgICAgICBtZW1jcHkoZGF0
YSwgY2hhcmFjdGVyczgoKSwgbGVuZ3RoKCkgKiBzaXplb2YoTENoYXIpKTsKKyAgICAgICAgbWVt
Y3B5KGRhdGEgKyBsZW5ndGgoKSwgY2hhcmFjdGVyc1RvQXBwZW5kLCBsZW5ndGhUb0FwcGVuZCAq
IHNpemVvZihMQ2hhcikpOworICAgICAgICBtX2ltcGwgPSBuZXdJbXBsLnJlbGVhc2UoKTsKKyAg
ICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFVDaGFyKiBkYXRhOworICAgIGlmIChsZW5ndGhU
b0FwcGVuZCA+IG51bWVyaWNfbGltaXRzPHVuc2lnbmVkPjo6bWF4KCkgLSBsZW5ndGgoKSkKKyAg
ICAgICAgQ1JBU0goKTsKKyAgICBSZWZQdHI8U3RyaW5nSW1wbD4gbmV3SW1wbCA9IFN0cmluZ0lt
cGw6OmNyZWF0ZVVuaW5pdGlhbGl6ZWQobGVuZ3RoKCkgKyBsZW5ndGhUb0FwcGVuZCwgZGF0YSk7
CisgICAgbWVtY3B5KGRhdGEsIGNoYXJhY3RlcnMxNigpLCBsZW5ndGgoKSAqIHNpemVvZihVQ2hh
cikpOworICAgIFN0cmluZ0ltcGw6OmNvcHlDaGFycyhkYXRhICsgbGVuZ3RoKCksIGNoYXJhY3Rl
cnNUb0FwcGVuZCwgbGVuZ3RoVG9BcHBlbmQpOworICAgIG1faW1wbCA9IG5ld0ltcGwucmVsZWFz
ZSgpOworfQorCiB2b2lkIFN0cmluZzo6YXBwZW5kKGNvbnN0IFVDaGFyKiBjaGFyYWN0ZXJzVG9B
cHBlbmQsIHVuc2lnbmVkIGxlbmd0aFRvQXBwZW5kKQogewogICAgIGlmICghbV9pbXBsKSB7CkBA
IC0xODUsMTEgKzIxOSwxNSBAQCB2b2lkIFN0cmluZzo6YXBwZW5kKGNvbnN0IFVDaGFyKiBjaGFy
YWN0CiAgICAgaWYgKGxlbmd0aFRvQXBwZW5kID4gbnVtZXJpY19saW1pdHM8dW5zaWduZWQ+Ojpt
YXgoKSAtIGxlbmd0aCgpKQogICAgICAgICBDUkFTSCgpOwogICAgIFJlZlB0cjxTdHJpbmdJbXBs
PiBuZXdJbXBsID0gU3RyaW5nSW1wbDo6Y3JlYXRlVW5pbml0aWFsaXplZChsZW5ndGgoKSArIGxl
bmd0aFRvQXBwZW5kLCBkYXRhKTsKLSAgICBtZW1jcHkoZGF0YSwgY2hhcmFjdGVycygpLCBsZW5n
dGgoKSAqIHNpemVvZihVQ2hhcikpOworICAgIGlmIChtX2ltcGwtPmlzOEJpdCgpKQorICAgICAg
ICBTdHJpbmdJbXBsOjpjb3B5Q2hhcnMoZGF0YSwgY2hhcmFjdGVyczgoKSwgbGVuZ3RoKCkpOwor
ICAgIGVsc2UKKyAgICAgICAgbWVtY3B5KGRhdGEsIGNoYXJhY3RlcnMxNigpLCBsZW5ndGgoKSAq
IHNpemVvZihVQ2hhcikpOwogICAgIG1lbWNweShkYXRhICsgbGVuZ3RoKCksIGNoYXJhY3RlcnNU
b0FwcGVuZCwgbGVuZ3RoVG9BcHBlbmQgKiBzaXplb2YoVUNoYXIpKTsKICAgICBtX2ltcGwgPSBu
ZXdJbXBsLnJlbGVhc2UoKTsKIH0KIAorCiB2b2lkIFN0cmluZzo6aW5zZXJ0KGNvbnN0IFVDaGFy
KiBjaGFyYWN0ZXJzVG9JbnNlcnQsIHVuc2lnbmVkIGxlbmd0aFRvSW5zZXJ0LCB1bnNpZ25lZCBw
b3NpdGlvbikKIHsKICAgICBpZiAocG9zaXRpb24gPj0gbGVuZ3RoKCkpIHsKSW5kZXg6IFNvdXJj
ZS9XVEYvd3RmL3RleHQvV1RGU3RyaW5nLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dURi93dGYv
dGV4dC9XVEZTdHJpbmcuaAkocmV2aXNpb24gMTI5Njc2KQorKysgU291cmNlL1dURi93dGYvdGV4
dC9XVEZTdHJpbmcuaAkod29ya2luZyBjb3B5KQpAQCAtMzAyLDYgKzMwMiw3IEBAIHB1YmxpYzoK
ICAgICBXVEZfRVhQT1JUX1NUUklOR19BUEkgdm9pZCBhcHBlbmQoTENoYXIpOwogICAgIHZvaWQg
YXBwZW5kKGNoYXIgYykgeyBhcHBlbmQoc3RhdGljX2Nhc3Q8TENoYXI+KGMpKTsgfTsKICAgICBX
VEZfRVhQT1JUX1NUUklOR19BUEkgdm9pZCBhcHBlbmQoVUNoYXIpOworICAgIFdURl9FWFBPUlRf
U1RSSU5HX0FQSSB2b2lkIGFwcGVuZChjb25zdCBMQ2hhciosIHVuc2lnbmVkIGxlbmd0aCk7CiAg
ICAgV1RGX0VYUE9SVF9TVFJJTkdfQVBJIHZvaWQgYXBwZW5kKGNvbnN0IFVDaGFyKiwgdW5zaWdu
ZWQgbGVuZ3RoKTsKICAgICBXVEZfRVhQT1JUX1NUUklOR19BUEkgdm9pZCBpbnNlcnQoY29uc3Qg
U3RyaW5nJiwgdW5zaWduZWQgcG9zKTsKICAgICB2b2lkIGluc2VydChjb25zdCBVQ2hhciosIHVu
c2lnbmVkIGxlbmd0aCwgdW5zaWduZWQgcG9zKTsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDEy
OTcyMCkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwz
ICsxLDIzIEBACisyMDEyLTA5LTI2ICBNaWNoYWVsIFNhYm9mZiAgPG1zYWJvZmZAYXBwbGUuY29t
PgorCisgICAgICAgIEhUTUxDb25zdHJ1Y3Rpb25TaXRlOjppbnNlcnRUZXh0Tm9kZSBkb2Vzbid0
IGhhbmRsZSA4IGJpdCBzdHJpbmdzCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3No
b3dfYnVnLmNnaT9pZD05Nzc0MAorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEp
LgorCisgICAgICAgIENoYW5nZWQgcGFyc2VyQXBwZW5kRGF0YSB0byB0YWtlIGEgc3RyaW5nIGlu
c3RlYWQgb2YgYSBVQ2hhciouICBBbHNvIGFkZGVkIGFuIG9wdGlvbmFsIG9mZnNldAorICAgICAg
ICBhcmd1bWVudCB0byBoYW5kbGUgc3RyaW5nK29mZnNldC4gIFRoZSBhY3R1YWwgc3RyaW5nIGFw
cGVuZCBub3cgdXNlcyB0aGUgYXBwcm9wcmlhdGUgc3RyaW5nCisgICAgICAgIHNpemUuCisKKyAg
ICAgICAgKiBkb20vQ2hhcmFjdGVyRGF0YS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpDaGFyYWN0
ZXJEYXRhOjpwYXJzZXJBcHBlbmREYXRhKToKKyAgICAgICAgKiBkb20vQ2hhcmFjdGVyRGF0YS5o
OgorICAgICAgICAoQ2hhcmFjdGVyRGF0YSk6CisgICAgICAgICogZG9tL1RleHQuY3BwOgorICAg
ICAgICAoV2ViQ29yZTo6VGV4dDo6Y3JlYXRlV2l0aExlbmd0aExpbWl0KToKKyAgICAgICAgKiBo
dG1sL3BhcnNlci9IVE1MQ29uc3RydWN0aW9uU2l0ZS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpI
VE1MQ29uc3RydWN0aW9uU2l0ZTo6aW5zZXJ0VGV4dE5vZGUpOgorCiAyMDEyLTA5LTI2ICBLZW5u
ZXRoIFJvaGRlIENocmlzdGlhbnNlbiAgPGtlbm5ldGhAd2Via2l0Lm9yZz4KIAogICAgICAgICBb
VGV4bWFwXVtFRkxdIEFjY2VsZXJhdGVkIGNvbXBvc2l0aW5nIHN1cHBvcnQgdXNpbmcgVGV4dHVy
ZU1hcHBlciBvbiBFRkwgcG9ydApJbmRleDogU291cmNlL1dlYkNvcmUvZG9tL0NoYXJhY3RlckRh
dGEuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2RvbS9DaGFyYWN0ZXJEYXRhLmNw
cAkocmV2aXNpb24gMTI5Njc2KQorKysgU291cmNlL1dlYkNvcmUvZG9tL0NoYXJhY3RlckRhdGEu
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC02Myw3ICs2Myw3IEBAIFN0cmluZyBDaGFyYWN0ZXJEYXRh
OjpzdWJzdHJpbmdEYXRhKHVuc2kKICAgICByZXR1cm4gbV9kYXRhLnN1YnN0cmluZyhvZmZzZXQs
IGNvdW50KTsKIH0KIAotdW5zaWduZWQgQ2hhcmFjdGVyRGF0YTo6cGFyc2VyQXBwZW5kRGF0YShj
b25zdCBVQ2hhciogZGF0YSwgdW5zaWduZWQgZGF0YUxlbmd0aCwgdW5zaWduZWQgbGVuZ3RoTGlt
aXQpCit1bnNpZ25lZCBDaGFyYWN0ZXJEYXRhOjpwYXJzZXJBcHBlbmREYXRhKGNvbnN0IFN0cmlu
ZyYgc3RyaW5nLCB1bnNpZ25lZCBkYXRhTGVuZ3RoLCB1bnNpZ25lZCBsZW5ndGhMaW1pdCwgdW5z
aWduZWQgb2Zmc2V0KQogewogICAgIHVuc2lnbmVkIG9sZExlbmd0aCA9IG1fZGF0YS5sZW5ndGgo
KTsKIApAQCAtNzQsNyArNzQsNyBAQCB1bnNpZ25lZCBDaGFyYWN0ZXJEYXRhOjpwYXJzZXJBcHBl
bmREYXRhCiAgICAgLy8gc2VlIDxodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/
aWQ9MjkwOTI+LiAKICAgICAvLyBXZSBuZWVkIGF0IGxlYXN0IHR3byBjaGFyYWN0ZXJzIGxvb2st
YWhlYWQgdG8gYWNjb3VudCBmb3IgVVRGLTE2IHN1cnJvZ2F0ZXMuCiAgICAgaWYgKGVuZCA8IGRh
dGFMZW5ndGgpIHsKLSAgICAgICAgTm9uU2hhcmVkQ2hhcmFjdGVyQnJlYWtJdGVyYXRvciBpdChk
YXRhLCAoZW5kICsgMiA+IGRhdGFMZW5ndGgpID8gZGF0YUxlbmd0aCA6IGVuZCArIDIpOworICAg
ICAgICBOb25TaGFyZWRDaGFyYWN0ZXJCcmVha0l0ZXJhdG9yIGl0KHN0cmluZy5jaGFyYWN0ZXJz
KCkgKyBvZmZzZXQsIChlbmQgKyAyID4gZGF0YUxlbmd0aCkgPyBkYXRhTGVuZ3RoIDogZW5kICsg
Mik7CiAgICAgICAgIGlmICghaXNUZXh0QnJlYWsoaXQsIGVuZCkpCiAgICAgICAgICAgICBlbmQg
PSB0ZXh0QnJlYWtQcmVjZWRpbmcoaXQsIGVuZCk7CiAgICAgfQpAQCAtODIsNyArODIsMTAgQEAg
dW5zaWduZWQgQ2hhcmFjdGVyRGF0YTo6cGFyc2VyQXBwZW5kRGF0YQogICAgIGlmICghZW5kKQog
ICAgICAgICByZXR1cm4gMDsKIAotICAgIG1fZGF0YS5hcHBlbmQoZGF0YSwgZW5kKTsKKyAgICBp
ZiAoc3RyaW5nLmlzOEJpdCgpKQorICAgICAgICBtX2RhdGEuYXBwZW5kKHN0cmluZy5jaGFyYWN0
ZXJzOCgpICsgb2Zmc2V0LCBlbmQpOworICAgIGVsc2UKKyAgICAgICAgbV9kYXRhLmFwcGVuZChz
dHJpbmcuY2hhcmFjdGVyczE2KCkgKyBvZmZzZXQsIGVuZCk7CiAKICAgICB1cGRhdGVSZW5kZXJl
cihvbGRMZW5ndGgsIDApOwogICAgIGRvY3VtZW50KCktPmluY0RPTVRyZWVWZXJzaW9uKCk7Cklu
ZGV4OiBTb3VyY2UvV2ViQ29yZS9kb20vQ2hhcmFjdGVyRGF0YS5oCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9XZWJDb3JlL2RvbS9DaGFyYWN0ZXJEYXRhLmgJKHJldmlzaW9uIDEyOTY3NikKKysrIFNv
dXJjZS9XZWJDb3JlL2RvbS9DaGFyYWN0ZXJEYXRhLmgJKHdvcmtpbmcgY29weSkKQEAgLTQ1LDcg
KzQ1LDcgQEAgcHVibGljOgogCiAgICAgLy8gTGlrZSBhcHBlbmREYXRhLCBidXQgb3B0aW1pemVk
IGZvciB0aGUgcGFyc2VyIChlLmcuLCBubyBtdXRhdGlvbiBldmVudHMpLgogICAgIC8vIFJldHVy
bnMgaG93IG11Y2ggY291bGQgYmUgYWRkZWQgYmVmb3JlIGxlbmd0aCBsaW1pdCB3YXMgbWV0Lgot
ICAgIHVuc2lnbmVkIHBhcnNlckFwcGVuZERhdGEoY29uc3QgVUNoYXIqLCB1bnNpZ25lZCBkYXRh
TGVuZ3RoLCB1bnNpZ25lZCBsZW5ndGhMaW1pdCk7CisgICAgdW5zaWduZWQgcGFyc2VyQXBwZW5k
RGF0YShjb25zdCBTdHJpbmcmLCB1bnNpZ25lZCwgdW5zaWduZWQgLCB1bnNpZ25lZCBvZmZzZXQg
PSAwKTsKIAogICAgIHZpcnR1YWwgdm9pZCByZXBvcnRNZW1vcnlVc2FnZShNZW1vcnlPYmplY3RJ
bmZvKikgY29uc3Q7CiAKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2RvbS9UZXh0LmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9kb20vVGV4dC5jcHAJKHJldmlzaW9uIDEyOTY3NikKKysr
IFNvdXJjZS9XZWJDb3JlL2RvbS9UZXh0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjg4LDcgKzI4
OCw3IEBAIFBhc3NSZWZQdHI8VGV4dD4gVGV4dDo6Y3JlYXRlV2l0aExlbmd0aEwKICAgICAgICAg
cmV0dXJuIGNyZWF0ZShkb2N1bWVudCwgZGF0YSk7CiAKICAgICBSZWZQdHI8VGV4dD4gcmVzdWx0
ID0gVGV4dDo6Y3JlYXRlKGRvY3VtZW50LCBTdHJpbmcoKSk7Ci0gICAgcmVzdWx0LT5wYXJzZXJB
cHBlbmREYXRhKGRhdGEuY2hhcmFjdGVycygpICsgc3RhcnQsIGRhdGFMZW5ndGggLSBzdGFydCwg
bWF4Q2hhcnMpOworICAgIHJlc3VsdC0+cGFyc2VyQXBwZW5kRGF0YShkYXRhLCBkYXRhTGVuZ3Ro
IC0gc3RhcnQsIG1heENoYXJzLCBzdGFydCk7CiAKICAgICByZXR1cm4gcmVzdWx0OwogfQpJbmRl
eDogU291cmNlL1dlYkNvcmUvaHRtbC9wYXJzZXIvSFRNTENvbnN0cnVjdGlvblNpdGUuY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2h0bWwvcGFyc2VyL0hUTUxDb25zdHJ1Y3Rpb25T
aXRlLmNwcAkocmV2aXNpb24gMTI5Njc2KQorKysgU291cmNlL1dlYkNvcmUvaHRtbC9wYXJzZXIv
SFRNTENvbnN0cnVjdGlvblNpdGUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zNjgsNyArMzY4LDcg
QEAgdm9pZCBIVE1MQ29uc3RydWN0aW9uU2l0ZTo6aW5zZXJ0VGV4dE5vZAogICAgICAgICAvLyBG
SVhNRTogV2UncmUgb25seSBzdXBwb3NlZCB0byBhcHBlbmQgdG8gdGhpcyB0ZXh0IG5vZGUgaWYg
aXQKICAgICAgICAgLy8gd2FzIHRoZSBsYXN0IHRleHQgbm9kZSBpbnNlcnRlZCBieSB0aGUgcGFy
c2VyLgogICAgICAgICBDaGFyYWN0ZXJEYXRhKiB0ZXh0Tm9kZSA9IHN0YXRpY19jYXN0PENoYXJh
Y3RlckRhdGEqPihwcmV2aW91c0NoaWxkKTsKLSAgICAgICAgY3VycmVudFBvc2l0aW9uID0gdGV4
dE5vZGUtPnBhcnNlckFwcGVuZERhdGEoY2hhcmFjdGVycy5jaGFyYWN0ZXJzKCksIGNoYXJhY3Rl
cnMubGVuZ3RoKCksIFRleHQ6OmRlZmF1bHRMZW5ndGhMaW1pdCk7CisgICAgICAgIGN1cnJlbnRQ
b3NpdGlvbiA9IHRleHROb2RlLT5wYXJzZXJBcHBlbmREYXRhKGNoYXJhY3RlcnMsIGNoYXJhY3Rl
cnMubGVuZ3RoKCksIFRleHQ6OmRlZmF1bHRMZW5ndGhMaW1pdCk7CiAgICAgfQogCiAgICAgd2hp
bGUgKGN1cnJlbnRQb3NpdGlvbiA8IGNoYXJhY3RlcnMubGVuZ3RoKCkpIHsK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>166033</attachid>
            <date>2012-09-27 11:15:58 -0700</date>
            <delta_ts>2012-09-27 11:28:26 -0700</delta_ts>
            <desc>Patch updated from review comments</desc>
            <filename>97740-2.patch</filename>
            <type>text/plain</type>
            <size>9003</size>
            <attacher name="Michael Saboff">msaboff</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XVEYvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XVEYvQ2hh
bmdlTG9nCShyZXZpc2lvbiAxMjk3MjApCisrKyBTb3VyY2UvV1RGL0NoYW5nZUxvZwkod29ya2lu
ZyBjb3B5KQpAQCAtMSwzICsxLDE4IEBACisyMDEyLTA5LTI2ICBNaWNoYWVsIFNhYm9mZiAgPG1z
YWJvZmZAYXBwbGUuY29tPgorCisgICAgICAgIEhUTUxDb25zdHJ1Y3Rpb25TaXRlOjppbnNlcnRU
ZXh0Tm9kZSBpc24ndCBvcHRpbWl6ZWQgZm9yIDggYml0IHN0cmluZ3MKKyAgICAgICAgaHR0cHM6
Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTk3NzQwCisKKyAgICAgICAgUmV2aWV3
ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgQWRkZWQgYW4gYXBwZW5kIG1ldGhvZCB0
aGF0IHRha2VzIGFuIExDaGFyIHNvdXJjZS4gIE1hZGUgYm90aCB0aGUgVUNoYXIgYW5kIExDaGFy
IHZlcnNpb25zIG9wdGltYWxseSBoYW5kbGUKKyAgICAgICAgdGhlIGFwcGVuZGVlIGFuZCBhcHBl
bmRlbmQgc3RyaW5nIGJpdG5lc3MuCisKKyAgICAgICAgKiB3dGYvdGV4dC9XVEZTdHJpbmcuY3Bw
OgorICAgICAgICAoV1RGOjpTdHJpbmc6OmFwcGVuZCk6CisgICAgICAgICogd3RmL3RleHQvV1RG
U3RyaW5nLmg6CisgICAgICAgIChTdHJpbmcpOgorCiAyMDEyLTA5LTI2ICBNaWNoYWVsIFNhYm9m
ZiAgPG1zYWJvZmZAYXBwbGUuY29tPgogCiAgICAgICAgIFVwZGF0ZSBDb21wbGV4VGV4dENvbnRy
b2xsZXIgZm9yIDggYml0IFRleHRSdW4gY2hhbmdlcwpJbmRleDogU291cmNlL1dURi93dGYvdGV4
dC9XVEZTdHJpbmcuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XVEYvd3RmL3RleHQvV1RGU3Ry
aW5nLmNwcAkocmV2aXNpb24gMTI5Njc2KQorKysgU291cmNlL1dURi93dGYvdGV4dC9XVEZTdHJp
bmcuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xNjgsNyArMTY4LDcgQEAgdm9pZCBTdHJpbmc6Omlu
c2VydChjb25zdCBTdHJpbmcmIHN0ciwgdQogICAgIGluc2VydChzdHIuY2hhcmFjdGVycygpLCBz
dHIubGVuZ3RoKCksIHBvcyk7CiB9CiAKLXZvaWQgU3RyaW5nOjphcHBlbmQoY29uc3QgVUNoYXIq
IGNoYXJhY3RlcnNUb0FwcGVuZCwgdW5zaWduZWQgbGVuZ3RoVG9BcHBlbmQpCit2b2lkIFN0cmlu
Zzo6YXBwZW5kKGNvbnN0IExDaGFyKiBjaGFyYWN0ZXJzVG9BcHBlbmQsIHVuc2lnbmVkIGxlbmd0
aFRvQXBwZW5kKQogewogICAgIGlmICghbV9pbXBsKSB7CiAgICAgICAgIGlmICghY2hhcmFjdGVy
c1RvQXBwZW5kKQpAQCAtMTgxLDE1ICsxODEsNTcgQEAgdm9pZCBTdHJpbmc6OmFwcGVuZChjb25z
dCBVQ2hhciogY2hhcmFjdAogICAgICAgICByZXR1cm47CiAKICAgICBBU1NFUlQoY2hhcmFjdGVy
c1RvQXBwZW5kKTsKLSAgICBVQ2hhciogZGF0YTsKLSAgICBpZiAobGVuZ3RoVG9BcHBlbmQgPiBu
dW1lcmljX2xpbWl0czx1bnNpZ25lZD46Om1heCgpIC0gbGVuZ3RoKCkpCisKKyAgICB1bnNpZ25l
ZCBzdHJMZW5ndGggPSBtX2ltcGwtPmxlbmd0aCgpOworCisgICAgaWYgKG1faW1wbC0+aXM4Qml0
KCkpIHsKKyAgICAgICAgaWYgKGxlbmd0aFRvQXBwZW5kID4gbnVtZXJpY19saW1pdHM8dW5zaWdu
ZWQ+OjptYXgoKSAtIHN0ckxlbmd0aCkKKyAgICAgICAgICAgIENSQVNIKCk7CisgICAgICAgIExD
aGFyKiBkYXRhOworICAgICAgICBSZWZQdHI8U3RyaW5nSW1wbD4gbmV3SW1wbCA9IFN0cmluZ0lt
cGw6OmNyZWF0ZVVuaW5pdGlhbGl6ZWQoc3RyTGVuZ3RoICsgbGVuZ3RoVG9BcHBlbmQsIGRhdGEp
OworICAgICAgICBTdHJpbmdJbXBsOjpjb3B5Q2hhcnMoZGF0YSwgbV9pbXBsLT5jaGFyYWN0ZXJz
OCgpLCBzdHJMZW5ndGgpOworICAgICAgICBTdHJpbmdJbXBsOjpjb3B5Q2hhcnMoZGF0YSArIHN0
ckxlbmd0aCwgY2hhcmFjdGVyc1RvQXBwZW5kLCBsZW5ndGhUb0FwcGVuZCk7CisgICAgICAgIG1f
aW1wbCA9IG5ld0ltcGwucmVsZWFzZSgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAg
aWYgKGxlbmd0aFRvQXBwZW5kID4gbnVtZXJpY19saW1pdHM8dW5zaWduZWQ+OjptYXgoKSAtIHN0
ckxlbmd0aCkKICAgICAgICAgQ1JBU0goKTsKKyAgICBVQ2hhciogZGF0YTsKICAgICBSZWZQdHI8
U3RyaW5nSW1wbD4gbmV3SW1wbCA9IFN0cmluZ0ltcGw6OmNyZWF0ZVVuaW5pdGlhbGl6ZWQobGVu
Z3RoKCkgKyBsZW5ndGhUb0FwcGVuZCwgZGF0YSk7Ci0gICAgbWVtY3B5KGRhdGEsIGNoYXJhY3Rl
cnMoKSwgbGVuZ3RoKCkgKiBzaXplb2YoVUNoYXIpKTsKLSAgICBtZW1jcHkoZGF0YSArIGxlbmd0
aCgpLCBjaGFyYWN0ZXJzVG9BcHBlbmQsIGxlbmd0aFRvQXBwZW5kICogc2l6ZW9mKFVDaGFyKSk7
CisgICAgU3RyaW5nSW1wbDo6Y29weUNoYXJzKGRhdGEsIG1faW1wbC0+Y2hhcmFjdGVyczE2KCks
IHN0ckxlbmd0aCk7CisgICAgU3RyaW5nSW1wbDo6Y29weUNoYXJzKGRhdGEgKyBzdHJMZW5ndGgs
IGNoYXJhY3RlcnNUb0FwcGVuZCwgbGVuZ3RoVG9BcHBlbmQpOworICAgIG1faW1wbCA9IG5ld0lt
cGwucmVsZWFzZSgpOworfQorCit2b2lkIFN0cmluZzo6YXBwZW5kKGNvbnN0IFVDaGFyKiBjaGFy
YWN0ZXJzVG9BcHBlbmQsIHVuc2lnbmVkIGxlbmd0aFRvQXBwZW5kKQoreworICAgIGlmICghbV9p
bXBsKSB7CisgICAgICAgIGlmICghY2hhcmFjdGVyc1RvQXBwZW5kKQorICAgICAgICAgICAgcmV0
dXJuOworICAgICAgICBtX2ltcGwgPSBTdHJpbmdJbXBsOjpjcmVhdGUoY2hhcmFjdGVyc1RvQXBw
ZW5kLCBsZW5ndGhUb0FwcGVuZCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAo
IWxlbmd0aFRvQXBwZW5kKQorICAgICAgICByZXR1cm47CisKKyAgICB1bnNpZ25lZCBzdHJMZW5n
dGggPSBtX2ltcGwtPmxlbmd0aCgpOworICAgIAorICAgIEFTU0VSVChjaGFyYWN0ZXJzVG9BcHBl
bmQpOworICAgIGlmIChsZW5ndGhUb0FwcGVuZCA+IG51bWVyaWNfbGltaXRzPHVuc2lnbmVkPjo6
bWF4KCkgLSBzdHJMZW5ndGgpCisgICAgICAgIENSQVNIKCk7CisgICAgVUNoYXIqIGRhdGE7Cisg
ICAgUmVmUHRyPFN0cmluZ0ltcGw+IG5ld0ltcGwgPSBTdHJpbmdJbXBsOjpjcmVhdGVVbmluaXRp
YWxpemVkKHN0ckxlbmd0aCArIGxlbmd0aFRvQXBwZW5kLCBkYXRhKTsKKyAgICBpZiAobV9pbXBs
LT5pczhCaXQoKSkKKyAgICAgICAgU3RyaW5nSW1wbDo6Y29weUNoYXJzKGRhdGEsIGNoYXJhY3Rl
cnM4KCksIHN0ckxlbmd0aCk7CisgICAgZWxzZQorICAgICAgICBTdHJpbmdJbXBsOjpjb3B5Q2hh
cnMoZGF0YSwgY2hhcmFjdGVyczE2KCksIHN0ckxlbmd0aCk7CisgICAgU3RyaW5nSW1wbDo6Y29w
eUNoYXJzKGRhdGEgKyBzdHJMZW5ndGgsIGNoYXJhY3RlcnNUb0FwcGVuZCwgbGVuZ3RoVG9BcHBl
bmQgKTsKICAgICBtX2ltcGwgPSBuZXdJbXBsLnJlbGVhc2UoKTsKIH0KIAorCiB2b2lkIFN0cmlu
Zzo6aW5zZXJ0KGNvbnN0IFVDaGFyKiBjaGFyYWN0ZXJzVG9JbnNlcnQsIHVuc2lnbmVkIGxlbmd0
aFRvSW5zZXJ0LCB1bnNpZ25lZCBwb3NpdGlvbikKIHsKICAgICBpZiAocG9zaXRpb24gPj0gbGVu
Z3RoKCkpIHsKSW5kZXg6IFNvdXJjZS9XVEYvd3RmL3RleHQvV1RGU3RyaW5nLmgKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL1dURi93dGYvdGV4dC9XVEZTdHJpbmcuaAkocmV2aXNpb24gMTI5Njc2KQor
KysgU291cmNlL1dURi93dGYvdGV4dC9XVEZTdHJpbmcuaAkod29ya2luZyBjb3B5KQpAQCAtMzAy
LDYgKzMwMiw3IEBAIHB1YmxpYzoKICAgICBXVEZfRVhQT1JUX1NUUklOR19BUEkgdm9pZCBhcHBl
bmQoTENoYXIpOwogICAgIHZvaWQgYXBwZW5kKGNoYXIgYykgeyBhcHBlbmQoc3RhdGljX2Nhc3Q8
TENoYXI+KGMpKTsgfTsKICAgICBXVEZfRVhQT1JUX1NUUklOR19BUEkgdm9pZCBhcHBlbmQoVUNo
YXIpOworICAgIFdURl9FWFBPUlRfU1RSSU5HX0FQSSB2b2lkIGFwcGVuZChjb25zdCBMQ2hhcios
IHVuc2lnbmVkIGxlbmd0aCk7CiAgICAgV1RGX0VYUE9SVF9TVFJJTkdfQVBJIHZvaWQgYXBwZW5k
KGNvbnN0IFVDaGFyKiwgdW5zaWduZWQgbGVuZ3RoKTsKICAgICBXVEZfRVhQT1JUX1NUUklOR19B
UEkgdm9pZCBpbnNlcnQoY29uc3QgU3RyaW5nJiwgdW5zaWduZWQgcG9zKTsKICAgICB2b2lkIGlu
c2VydChjb25zdCBVQ2hhciosIHVuc2lnbmVkIGxlbmd0aCwgdW5zaWduZWQgcG9zKTsKSW5kZXg6
IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cJKHJldmlzaW9uIDEyOTcyMCkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwko
d29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDIzIEBACisyMDEyLTA5LTI2ICBNaWNoYWVsIFNhYm9m
ZiAgPG1zYWJvZmZAYXBwbGUuY29tPgorCisgICAgICAgIEhUTUxDb25zdHJ1Y3Rpb25TaXRlOjpp
bnNlcnRUZXh0Tm9kZSBpc24ndCBvcHRpbWl6ZWQgZm9yIDggYml0IHN0cmluZ3MKKyAgICAgICAg
aHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTk3NzQwCisKKyAgICAgICAg
UmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgQ2hhbmdlZCBwYXJzZXJBcHBl
bmREYXRhIHRvIHRha2UgYSBzdHJpbmcgaW5zdGVhZCBvZiBhIFVDaGFyKi4gIEFsc28gYWRkZWQg
YW4gb3B0aW9uYWwgb2Zmc2V0CisgICAgICAgIGFyZ3VtZW50IHRvIGhhbmRsZSBzdHJpbmcrb2Zm
c2V0LiAgVGhlIGFjdHVhbCBzdHJpbmcgYXBwZW5kIG5vdyB1c2VzIHRoZSBhcHByb3ByaWF0ZSBz
dHJpbmcKKyAgICAgICAgc2l6ZS4KKworICAgICAgICAqIGRvbS9DaGFyYWN0ZXJEYXRhLmNwcDoK
KyAgICAgICAgKFdlYkNvcmU6OkNoYXJhY3RlckRhdGE6OnBhcnNlckFwcGVuZERhdGEpOgorICAg
ICAgICAqIGRvbS9DaGFyYWN0ZXJEYXRhLmg6CisgICAgICAgIChDaGFyYWN0ZXJEYXRhKToKKyAg
ICAgICAgKiBkb20vVGV4dC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpUZXh0OjpjcmVhdGVXaXRo
TGVuZ3RoTGltaXQpOgorICAgICAgICAqIGh0bWwvcGFyc2VyL0hUTUxDb25zdHJ1Y3Rpb25TaXRl
LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkhUTUxDb25zdHJ1Y3Rpb25TaXRlOjppbnNlcnRUZXh0
Tm9kZSk6CisKIDIwMTItMDktMjYgIEtlbm5ldGggUm9oZGUgQ2hyaXN0aWFuc2VuICA8a2VubmV0
aEB3ZWJraXQub3JnPgogCiAgICAgICAgIFtUZXhtYXBdW0VGTF0gQWNjZWxlcmF0ZWQgY29tcG9z
aXRpbmcgc3VwcG9ydCB1c2luZyBUZXh0dXJlTWFwcGVyIG9uIEVGTCBwb3J0CkluZGV4OiBTb3Vy
Y2UvV2ViQ29yZS9kb20vQ2hhcmFjdGVyRGF0YS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dl
YkNvcmUvZG9tL0NoYXJhY3RlckRhdGEuY3BwCShyZXZpc2lvbiAxMjk2NzYpCisrKyBTb3VyY2Uv
V2ViQ29yZS9kb20vQ2hhcmFjdGVyRGF0YS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTYzLDcgKzYz
LDcgQEAgU3RyaW5nIENoYXJhY3RlckRhdGE6OnN1YnN0cmluZ0RhdGEodW5zaQogICAgIHJldHVy
biBtX2RhdGEuc3Vic3RyaW5nKG9mZnNldCwgY291bnQpOwogfQogCi11bnNpZ25lZCBDaGFyYWN0
ZXJEYXRhOjpwYXJzZXJBcHBlbmREYXRhKGNvbnN0IFVDaGFyKiBkYXRhLCB1bnNpZ25lZCBkYXRh
TGVuZ3RoLCB1bnNpZ25lZCBsZW5ndGhMaW1pdCkKK3Vuc2lnbmVkIENoYXJhY3RlckRhdGE6OnBh
cnNlckFwcGVuZERhdGEoY29uc3QgU3RyaW5nJiBzdHJpbmcsIHVuc2lnbmVkIGRhdGFMZW5ndGgs
IHVuc2lnbmVkIGxlbmd0aExpbWl0LCB1bnNpZ25lZCBvZmZzZXQpCiB7CiAgICAgdW5zaWduZWQg
b2xkTGVuZ3RoID0gbV9kYXRhLmxlbmd0aCgpOwogCkBAIC03NCwxNSArNzQsMTggQEAgdW5zaWdu
ZWQgQ2hhcmFjdGVyRGF0YTo6cGFyc2VyQXBwZW5kRGF0YQogICAgIC8vIHNlZSA8aHR0cHM6Ly9i
dWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI5MDkyPi4gCiAgICAgLy8gV2UgbmVlZCBh
dCBsZWFzdCB0d28gY2hhcmFjdGVycyBsb29rLWFoZWFkIHRvIGFjY291bnQgZm9yIFVURi0xNiBz
dXJyb2dhdGVzLgogICAgIGlmIChlbmQgPCBkYXRhTGVuZ3RoKSB7Ci0gICAgICAgIE5vblNoYXJl
ZENoYXJhY3RlckJyZWFrSXRlcmF0b3IgaXQoZGF0YSwgKGVuZCArIDIgPiBkYXRhTGVuZ3RoKSA/
IGRhdGFMZW5ndGggOiBlbmQgKyAyKTsKKyAgICAgICAgTm9uU2hhcmVkQ2hhcmFjdGVyQnJlYWtJ
dGVyYXRvciBpdChzdHJpbmcuY2hhcmFjdGVycygpICsgb2Zmc2V0LCAoZW5kICsgMiA+IGRhdGFM
ZW5ndGgpID8gZGF0YUxlbmd0aCA6IGVuZCArIDIpOwogICAgICAgICBpZiAoIWlzVGV4dEJyZWFr
KGl0LCBlbmQpKQogICAgICAgICAgICAgZW5kID0gdGV4dEJyZWFrUHJlY2VkaW5nKGl0LCBlbmQp
OwogICAgIH0KICAgICAKLSAgICBpZiAoIWVuZCkKKyAgICBpZiAoIWVuZCB8fCAhc3RyaW5nLmxl
bmd0aCgpKQogICAgICAgICByZXR1cm4gMDsKIAotICAgIG1fZGF0YS5hcHBlbmQoZGF0YSwgZW5k
KTsKKyAgICBpZiAoc3RyaW5nLmlzOEJpdCgpKQorICAgICAgICBtX2RhdGEuYXBwZW5kKHN0cmlu
Zy5jaGFyYWN0ZXJzOCgpICsgb2Zmc2V0LCBlbmQpOworICAgIGVsc2UKKyAgICAgICAgbV9kYXRh
LmFwcGVuZChzdHJpbmcuY2hhcmFjdGVyczE2KCkgKyBvZmZzZXQsIGVuZCk7CiAKICAgICB1cGRh
dGVSZW5kZXJlcihvbGRMZW5ndGgsIDApOwogICAgIGRvY3VtZW50KCktPmluY0RPTVRyZWVWZXJz
aW9uKCk7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9kb20vQ2hhcmFjdGVyRGF0YS5oCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2RvbS9DaGFyYWN0ZXJEYXRhLmgJKHJldmlzaW9uIDEyOTY3
NikKKysrIFNvdXJjZS9XZWJDb3JlL2RvbS9DaGFyYWN0ZXJEYXRhLmgJKHdvcmtpbmcgY29weSkK
QEAgLTQ1LDcgKzQ1LDcgQEAgcHVibGljOgogCiAgICAgLy8gTGlrZSBhcHBlbmREYXRhLCBidXQg
b3B0aW1pemVkIGZvciB0aGUgcGFyc2VyIChlLmcuLCBubyBtdXRhdGlvbiBldmVudHMpLgogICAg
IC8vIFJldHVybnMgaG93IG11Y2ggY291bGQgYmUgYWRkZWQgYmVmb3JlIGxlbmd0aCBsaW1pdCB3
YXMgbWV0LgotICAgIHVuc2lnbmVkIHBhcnNlckFwcGVuZERhdGEoY29uc3QgVUNoYXIqLCB1bnNp
Z25lZCBkYXRhTGVuZ3RoLCB1bnNpZ25lZCBsZW5ndGhMaW1pdCk7CisgICAgdW5zaWduZWQgcGFy
c2VyQXBwZW5kRGF0YShjb25zdCBTdHJpbmcmLCB1bnNpZ25lZCwgdW5zaWduZWQgLCB1bnNpZ25l
ZCBvZmZzZXQgPSAwKTsKIAogICAgIHZpcnR1YWwgdm9pZCByZXBvcnRNZW1vcnlVc2FnZShNZW1v
cnlPYmplY3RJbmZvKikgY29uc3Q7CiAKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2RvbS9UZXh0LmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9kb20vVGV4dC5jcHAJKHJldmlzaW9uIDEy
OTY3NikKKysrIFNvdXJjZS9XZWJDb3JlL2RvbS9UZXh0LmNwcAkod29ya2luZyBjb3B5KQpAQCAt
Mjg4LDcgKzI4OCw3IEBAIFBhc3NSZWZQdHI8VGV4dD4gVGV4dDo6Y3JlYXRlV2l0aExlbmd0aEwK
ICAgICAgICAgcmV0dXJuIGNyZWF0ZShkb2N1bWVudCwgZGF0YSk7CiAKICAgICBSZWZQdHI8VGV4
dD4gcmVzdWx0ID0gVGV4dDo6Y3JlYXRlKGRvY3VtZW50LCBTdHJpbmcoKSk7Ci0gICAgcmVzdWx0
LT5wYXJzZXJBcHBlbmREYXRhKGRhdGEuY2hhcmFjdGVycygpICsgc3RhcnQsIGRhdGFMZW5ndGgg
LSBzdGFydCwgbWF4Q2hhcnMpOworICAgIHJlc3VsdC0+cGFyc2VyQXBwZW5kRGF0YShkYXRhLCBk
YXRhTGVuZ3RoIC0gc3RhcnQsIG1heENoYXJzLCBzdGFydCk7CiAKICAgICByZXR1cm4gcmVzdWx0
OwogfQpJbmRleDogU291cmNlL1dlYkNvcmUvaHRtbC9wYXJzZXIvSFRNTENvbnN0cnVjdGlvblNp
dGUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2h0bWwvcGFyc2VyL0hUTUxDb25z
dHJ1Y3Rpb25TaXRlLmNwcAkocmV2aXNpb24gMTI5Njc2KQorKysgU291cmNlL1dlYkNvcmUvaHRt
bC9wYXJzZXIvSFRNTENvbnN0cnVjdGlvblNpdGUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zNjgs
NyArMzY4LDcgQEAgdm9pZCBIVE1MQ29uc3RydWN0aW9uU2l0ZTo6aW5zZXJ0VGV4dE5vZAogICAg
ICAgICAvLyBGSVhNRTogV2UncmUgb25seSBzdXBwb3NlZCB0byBhcHBlbmQgdG8gdGhpcyB0ZXh0
IG5vZGUgaWYgaXQKICAgICAgICAgLy8gd2FzIHRoZSBsYXN0IHRleHQgbm9kZSBpbnNlcnRlZCBi
eSB0aGUgcGFyc2VyLgogICAgICAgICBDaGFyYWN0ZXJEYXRhKiB0ZXh0Tm9kZSA9IHN0YXRpY19j
YXN0PENoYXJhY3RlckRhdGEqPihwcmV2aW91c0NoaWxkKTsKLSAgICAgICAgY3VycmVudFBvc2l0
aW9uID0gdGV4dE5vZGUtPnBhcnNlckFwcGVuZERhdGEoY2hhcmFjdGVycy5jaGFyYWN0ZXJzKCks
IGNoYXJhY3RlcnMubGVuZ3RoKCksIFRleHQ6OmRlZmF1bHRMZW5ndGhMaW1pdCk7CisgICAgICAg
IGN1cnJlbnRQb3NpdGlvbiA9IHRleHROb2RlLT5wYXJzZXJBcHBlbmREYXRhKGNoYXJhY3RlcnMs
IGNoYXJhY3RlcnMubGVuZ3RoKCksIFRleHQ6OmRlZmF1bHRMZW5ndGhMaW1pdCk7CiAgICAgfQog
CiAgICAgd2hpbGUgKGN1cnJlbnRQb3NpdGlvbiA8IGNoYXJhY3RlcnMubGVuZ3RoKCkpIHsK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>166035</attachid>
            <date>2012-09-27 11:28:26 -0700</date>
            <delta_ts>2012-10-02 09:36:20 -0700</delta_ts>
            <desc>Patch with extra space removed</desc>
            <filename>97740-3.patch</filename>
            <type>text/plain</type>
            <size>9002</size>
            <attacher name="Michael Saboff">msaboff</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XVEYvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XVEYvQ2hh
bmdlTG9nCShyZXZpc2lvbiAxMjk3MjApCisrKyBTb3VyY2UvV1RGL0NoYW5nZUxvZwkod29ya2lu
ZyBjb3B5KQpAQCAtMSwzICsxLDE4IEBACisyMDEyLTA5LTI2ICBNaWNoYWVsIFNhYm9mZiAgPG1z
YWJvZmZAYXBwbGUuY29tPgorCisgICAgICAgIEhUTUxDb25zdHJ1Y3Rpb25TaXRlOjppbnNlcnRU
ZXh0Tm9kZSBpc24ndCBvcHRpbWl6ZWQgZm9yIDggYml0IHN0cmluZ3MKKyAgICAgICAgaHR0cHM6
Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTk3NzQwCisKKyAgICAgICAgUmV2aWV3
ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgQWRkZWQgYW4gYXBwZW5kIG1ldGhvZCB0
aGF0IHRha2VzIGFuIExDaGFyIHNvdXJjZS4gIE1hZGUgYm90aCB0aGUgVUNoYXIgYW5kIExDaGFy
IHZlcnNpb25zIG9wdGltYWxseSBoYW5kbGUKKyAgICAgICAgdGhlIGFwcGVuZGVlIGFuZCBhcHBl
bmRlbmQgc3RyaW5nIGJpdG5lc3MuCisKKyAgICAgICAgKiB3dGYvdGV4dC9XVEZTdHJpbmcuY3Bw
OgorICAgICAgICAoV1RGOjpTdHJpbmc6OmFwcGVuZCk6CisgICAgICAgICogd3RmL3RleHQvV1RG
U3RyaW5nLmg6CisgICAgICAgIChTdHJpbmcpOgorCiAyMDEyLTA5LTI2ICBNaWNoYWVsIFNhYm9m
ZiAgPG1zYWJvZmZAYXBwbGUuY29tPgogCiAgICAgICAgIFVwZGF0ZSBDb21wbGV4VGV4dENvbnRy
b2xsZXIgZm9yIDggYml0IFRleHRSdW4gY2hhbmdlcwpJbmRleDogU291cmNlL1dURi93dGYvdGV4
dC9XVEZTdHJpbmcuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XVEYvd3RmL3RleHQvV1RGU3Ry
aW5nLmNwcAkocmV2aXNpb24gMTI5Njc2KQorKysgU291cmNlL1dURi93dGYvdGV4dC9XVEZTdHJp
bmcuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xNjgsNyArMTY4LDcgQEAgdm9pZCBTdHJpbmc6Omlu
c2VydChjb25zdCBTdHJpbmcmIHN0ciwgdQogICAgIGluc2VydChzdHIuY2hhcmFjdGVycygpLCBz
dHIubGVuZ3RoKCksIHBvcyk7CiB9CiAKLXZvaWQgU3RyaW5nOjphcHBlbmQoY29uc3QgVUNoYXIq
IGNoYXJhY3RlcnNUb0FwcGVuZCwgdW5zaWduZWQgbGVuZ3RoVG9BcHBlbmQpCit2b2lkIFN0cmlu
Zzo6YXBwZW5kKGNvbnN0IExDaGFyKiBjaGFyYWN0ZXJzVG9BcHBlbmQsIHVuc2lnbmVkIGxlbmd0
aFRvQXBwZW5kKQogewogICAgIGlmICghbV9pbXBsKSB7CiAgICAgICAgIGlmICghY2hhcmFjdGVy
c1RvQXBwZW5kKQpAQCAtMTgxLDE1ICsxODEsNTcgQEAgdm9pZCBTdHJpbmc6OmFwcGVuZChjb25z
dCBVQ2hhciogY2hhcmFjdAogICAgICAgICByZXR1cm47CiAKICAgICBBU1NFUlQoY2hhcmFjdGVy
c1RvQXBwZW5kKTsKLSAgICBVQ2hhciogZGF0YTsKLSAgICBpZiAobGVuZ3RoVG9BcHBlbmQgPiBu
dW1lcmljX2xpbWl0czx1bnNpZ25lZD46Om1heCgpIC0gbGVuZ3RoKCkpCisKKyAgICB1bnNpZ25l
ZCBzdHJMZW5ndGggPSBtX2ltcGwtPmxlbmd0aCgpOworCisgICAgaWYgKG1faW1wbC0+aXM4Qml0
KCkpIHsKKyAgICAgICAgaWYgKGxlbmd0aFRvQXBwZW5kID4gbnVtZXJpY19saW1pdHM8dW5zaWdu
ZWQ+OjptYXgoKSAtIHN0ckxlbmd0aCkKKyAgICAgICAgICAgIENSQVNIKCk7CisgICAgICAgIExD
aGFyKiBkYXRhOworICAgICAgICBSZWZQdHI8U3RyaW5nSW1wbD4gbmV3SW1wbCA9IFN0cmluZ0lt
cGw6OmNyZWF0ZVVuaW5pdGlhbGl6ZWQoc3RyTGVuZ3RoICsgbGVuZ3RoVG9BcHBlbmQsIGRhdGEp
OworICAgICAgICBTdHJpbmdJbXBsOjpjb3B5Q2hhcnMoZGF0YSwgbV9pbXBsLT5jaGFyYWN0ZXJz
OCgpLCBzdHJMZW5ndGgpOworICAgICAgICBTdHJpbmdJbXBsOjpjb3B5Q2hhcnMoZGF0YSArIHN0
ckxlbmd0aCwgY2hhcmFjdGVyc1RvQXBwZW5kLCBsZW5ndGhUb0FwcGVuZCk7CisgICAgICAgIG1f
aW1wbCA9IG5ld0ltcGwucmVsZWFzZSgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAg
aWYgKGxlbmd0aFRvQXBwZW5kID4gbnVtZXJpY19saW1pdHM8dW5zaWduZWQ+OjptYXgoKSAtIHN0
ckxlbmd0aCkKICAgICAgICAgQ1JBU0goKTsKKyAgICBVQ2hhciogZGF0YTsKICAgICBSZWZQdHI8
U3RyaW5nSW1wbD4gbmV3SW1wbCA9IFN0cmluZ0ltcGw6OmNyZWF0ZVVuaW5pdGlhbGl6ZWQobGVu
Z3RoKCkgKyBsZW5ndGhUb0FwcGVuZCwgZGF0YSk7Ci0gICAgbWVtY3B5KGRhdGEsIGNoYXJhY3Rl
cnMoKSwgbGVuZ3RoKCkgKiBzaXplb2YoVUNoYXIpKTsKLSAgICBtZW1jcHkoZGF0YSArIGxlbmd0
aCgpLCBjaGFyYWN0ZXJzVG9BcHBlbmQsIGxlbmd0aFRvQXBwZW5kICogc2l6ZW9mKFVDaGFyKSk7
CisgICAgU3RyaW5nSW1wbDo6Y29weUNoYXJzKGRhdGEsIG1faW1wbC0+Y2hhcmFjdGVyczE2KCks
IHN0ckxlbmd0aCk7CisgICAgU3RyaW5nSW1wbDo6Y29weUNoYXJzKGRhdGEgKyBzdHJMZW5ndGgs
IGNoYXJhY3RlcnNUb0FwcGVuZCwgbGVuZ3RoVG9BcHBlbmQpOworICAgIG1faW1wbCA9IG5ld0lt
cGwucmVsZWFzZSgpOworfQorCit2b2lkIFN0cmluZzo6YXBwZW5kKGNvbnN0IFVDaGFyKiBjaGFy
YWN0ZXJzVG9BcHBlbmQsIHVuc2lnbmVkIGxlbmd0aFRvQXBwZW5kKQoreworICAgIGlmICghbV9p
bXBsKSB7CisgICAgICAgIGlmICghY2hhcmFjdGVyc1RvQXBwZW5kKQorICAgICAgICAgICAgcmV0
dXJuOworICAgICAgICBtX2ltcGwgPSBTdHJpbmdJbXBsOjpjcmVhdGUoY2hhcmFjdGVyc1RvQXBw
ZW5kLCBsZW5ndGhUb0FwcGVuZCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAo
IWxlbmd0aFRvQXBwZW5kKQorICAgICAgICByZXR1cm47CisKKyAgICB1bnNpZ25lZCBzdHJMZW5n
dGggPSBtX2ltcGwtPmxlbmd0aCgpOworICAgIAorICAgIEFTU0VSVChjaGFyYWN0ZXJzVG9BcHBl
bmQpOworICAgIGlmIChsZW5ndGhUb0FwcGVuZCA+IG51bWVyaWNfbGltaXRzPHVuc2lnbmVkPjo6
bWF4KCkgLSBzdHJMZW5ndGgpCisgICAgICAgIENSQVNIKCk7CisgICAgVUNoYXIqIGRhdGE7Cisg
ICAgUmVmUHRyPFN0cmluZ0ltcGw+IG5ld0ltcGwgPSBTdHJpbmdJbXBsOjpjcmVhdGVVbmluaXRp
YWxpemVkKHN0ckxlbmd0aCArIGxlbmd0aFRvQXBwZW5kLCBkYXRhKTsKKyAgICBpZiAobV9pbXBs
LT5pczhCaXQoKSkKKyAgICAgICAgU3RyaW5nSW1wbDo6Y29weUNoYXJzKGRhdGEsIGNoYXJhY3Rl
cnM4KCksIHN0ckxlbmd0aCk7CisgICAgZWxzZQorICAgICAgICBTdHJpbmdJbXBsOjpjb3B5Q2hh
cnMoZGF0YSwgY2hhcmFjdGVyczE2KCksIHN0ckxlbmd0aCk7CisgICAgU3RyaW5nSW1wbDo6Y29w
eUNoYXJzKGRhdGEgKyBzdHJMZW5ndGgsIGNoYXJhY3RlcnNUb0FwcGVuZCwgbGVuZ3RoVG9BcHBl
bmQpOwogICAgIG1faW1wbCA9IG5ld0ltcGwucmVsZWFzZSgpOwogfQogCisKIHZvaWQgU3RyaW5n
OjppbnNlcnQoY29uc3QgVUNoYXIqIGNoYXJhY3RlcnNUb0luc2VydCwgdW5zaWduZWQgbGVuZ3Ro
VG9JbnNlcnQsIHVuc2lnbmVkIHBvc2l0aW9uKQogewogICAgIGlmIChwb3NpdGlvbiA+PSBsZW5n
dGgoKSkgewpJbmRleDogU291cmNlL1dURi93dGYvdGV4dC9XVEZTdHJpbmcuaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvV1RGL3d0Zi90ZXh0L1dURlN0cmluZy5oCShyZXZpc2lvbiAxMjk2NzYpCisr
KyBTb3VyY2UvV1RGL3d0Zi90ZXh0L1dURlN0cmluZy5oCSh3b3JraW5nIGNvcHkpCkBAIC0zMDIs
NiArMzAyLDcgQEAgcHVibGljOgogICAgIFdURl9FWFBPUlRfU1RSSU5HX0FQSSB2b2lkIGFwcGVu
ZChMQ2hhcik7CiAgICAgdm9pZCBhcHBlbmQoY2hhciBjKSB7IGFwcGVuZChzdGF0aWNfY2FzdDxM
Q2hhcj4oYykpOyB9OwogICAgIFdURl9FWFBPUlRfU1RSSU5HX0FQSSB2b2lkIGFwcGVuZChVQ2hh
cik7CisgICAgV1RGX0VYUE9SVF9TVFJJTkdfQVBJIHZvaWQgYXBwZW5kKGNvbnN0IExDaGFyKiwg
dW5zaWduZWQgbGVuZ3RoKTsKICAgICBXVEZfRVhQT1JUX1NUUklOR19BUEkgdm9pZCBhcHBlbmQo
Y29uc3QgVUNoYXIqLCB1bnNpZ25lZCBsZW5ndGgpOwogICAgIFdURl9FWFBPUlRfU1RSSU5HX0FQ
SSB2b2lkIGluc2VydChjb25zdCBTdHJpbmcmLCB1bnNpZ25lZCBwb3MpOwogICAgIHZvaWQgaW5z
ZXJ0KGNvbnN0IFVDaGFyKiwgdW5zaWduZWQgbGVuZ3RoLCB1bnNpZ25lZCBwb3MpOwpJbmRleDog
U291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZwkocmV2aXNpb24gMTI5NzIwKQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCSh3
b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMjMgQEAKKzIwMTItMDktMjYgIE1pY2hhZWwgU2Fib2Zm
ICA8bXNhYm9mZkBhcHBsZS5jb20+CisKKyAgICAgICAgSFRNTENvbnN0cnVjdGlvblNpdGU6Omlu
c2VydFRleHROb2RlIGlzbid0IG9wdGltaXplZCBmb3IgOCBiaXQgc3RyaW5ncworICAgICAgICBo
dHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9OTc3NDAKKworICAgICAgICBS
ZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBDaGFuZ2VkIHBhcnNlckFwcGVu
ZERhdGEgdG8gdGFrZSBhIHN0cmluZyBpbnN0ZWFkIG9mIGEgVUNoYXIqLiAgQWxzbyBhZGRlZCBh
biBvcHRpb25hbCBvZmZzZXQKKyAgICAgICAgYXJndW1lbnQgdG8gaGFuZGxlIHN0cmluZytvZmZz
ZXQuICBUaGUgYWN0dWFsIHN0cmluZyBhcHBlbmQgbm93IHVzZXMgdGhlIGFwcHJvcHJpYXRlIHN0
cmluZworICAgICAgICBzaXplLgorCisgICAgICAgICogZG9tL0NoYXJhY3RlckRhdGEuY3BwOgor
ICAgICAgICAoV2ViQ29yZTo6Q2hhcmFjdGVyRGF0YTo6cGFyc2VyQXBwZW5kRGF0YSk6CisgICAg
ICAgICogZG9tL0NoYXJhY3RlckRhdGEuaDoKKyAgICAgICAgKENoYXJhY3RlckRhdGEpOgorICAg
ICAgICAqIGRvbS9UZXh0LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlRleHQ6OmNyZWF0ZVdpdGhM
ZW5ndGhMaW1pdCk6CisgICAgICAgICogaHRtbC9wYXJzZXIvSFRNTENvbnN0cnVjdGlvblNpdGUu
Y3BwOgorICAgICAgICAoV2ViQ29yZTo6SFRNTENvbnN0cnVjdGlvblNpdGU6Omluc2VydFRleHRO
b2RlKToKKwogMjAxMi0wOS0yNiAgS2VubmV0aCBSb2hkZSBDaHJpc3RpYW5zZW4gIDxrZW5uZXRo
QHdlYmtpdC5vcmc+CiAKICAgICAgICAgW1RleG1hcF1bRUZMXSBBY2NlbGVyYXRlZCBjb21wb3Np
dGluZyBzdXBwb3J0IHVzaW5nIFRleHR1cmVNYXBwZXIgb24gRUZMIHBvcnQKSW5kZXg6IFNvdXJj
ZS9XZWJDb3JlL2RvbS9DaGFyYWN0ZXJEYXRhLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9kb20vQ2hhcmFjdGVyRGF0YS5jcHAJKHJldmlzaW9uIDEyOTY3NikKKysrIFNvdXJjZS9X
ZWJDb3JlL2RvbS9DaGFyYWN0ZXJEYXRhLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNjMsNyArNjMs
NyBAQCBTdHJpbmcgQ2hhcmFjdGVyRGF0YTo6c3Vic3RyaW5nRGF0YSh1bnNpCiAgICAgcmV0dXJu
IG1fZGF0YS5zdWJzdHJpbmcob2Zmc2V0LCBjb3VudCk7CiB9CiAKLXVuc2lnbmVkIENoYXJhY3Rl
ckRhdGE6OnBhcnNlckFwcGVuZERhdGEoY29uc3QgVUNoYXIqIGRhdGEsIHVuc2lnbmVkIGRhdGFM
ZW5ndGgsIHVuc2lnbmVkIGxlbmd0aExpbWl0KQordW5zaWduZWQgQ2hhcmFjdGVyRGF0YTo6cGFy
c2VyQXBwZW5kRGF0YShjb25zdCBTdHJpbmcmIHN0cmluZywgdW5zaWduZWQgZGF0YUxlbmd0aCwg
dW5zaWduZWQgbGVuZ3RoTGltaXQsIHVuc2lnbmVkIG9mZnNldCkKIHsKICAgICB1bnNpZ25lZCBv
bGRMZW5ndGggPSBtX2RhdGEubGVuZ3RoKCk7CiAKQEAgLTc0LDE1ICs3NCwxOCBAQCB1bnNpZ25l
ZCBDaGFyYWN0ZXJEYXRhOjpwYXJzZXJBcHBlbmREYXRhCiAgICAgLy8gc2VlIDxodHRwczovL2J1
Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjkwOTI+LiAKICAgICAvLyBXZSBuZWVkIGF0
IGxlYXN0IHR3byBjaGFyYWN0ZXJzIGxvb2stYWhlYWQgdG8gYWNjb3VudCBmb3IgVVRGLTE2IHN1
cnJvZ2F0ZXMuCiAgICAgaWYgKGVuZCA8IGRhdGFMZW5ndGgpIHsKLSAgICAgICAgTm9uU2hhcmVk
Q2hhcmFjdGVyQnJlYWtJdGVyYXRvciBpdChkYXRhLCAoZW5kICsgMiA+IGRhdGFMZW5ndGgpID8g
ZGF0YUxlbmd0aCA6IGVuZCArIDIpOworICAgICAgICBOb25TaGFyZWRDaGFyYWN0ZXJCcmVha0l0
ZXJhdG9yIGl0KHN0cmluZy5jaGFyYWN0ZXJzKCkgKyBvZmZzZXQsIChlbmQgKyAyID4gZGF0YUxl
bmd0aCkgPyBkYXRhTGVuZ3RoIDogZW5kICsgMik7CiAgICAgICAgIGlmICghaXNUZXh0QnJlYWso
aXQsIGVuZCkpCiAgICAgICAgICAgICBlbmQgPSB0ZXh0QnJlYWtQcmVjZWRpbmcoaXQsIGVuZCk7
CiAgICAgfQogICAgIAotICAgIGlmICghZW5kKQorICAgIGlmICghZW5kIHx8ICFzdHJpbmcubGVu
Z3RoKCkpCiAgICAgICAgIHJldHVybiAwOwogCi0gICAgbV9kYXRhLmFwcGVuZChkYXRhLCBlbmQp
OworICAgIGlmIChzdHJpbmcuaXM4Qml0KCkpCisgICAgICAgIG1fZGF0YS5hcHBlbmQoc3RyaW5n
LmNoYXJhY3RlcnM4KCkgKyBvZmZzZXQsIGVuZCk7CisgICAgZWxzZQorICAgICAgICBtX2RhdGEu
YXBwZW5kKHN0cmluZy5jaGFyYWN0ZXJzMTYoKSArIG9mZnNldCwgZW5kKTsKIAogICAgIHVwZGF0
ZVJlbmRlcmVyKG9sZExlbmd0aCwgMCk7CiAgICAgZG9jdW1lbnQoKS0+aW5jRE9NVHJlZVZlcnNp
b24oKTsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2RvbS9DaGFyYWN0ZXJEYXRhLmgKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL1dlYkNvcmUvZG9tL0NoYXJhY3RlckRhdGEuaAkocmV2aXNpb24gMTI5Njc2
KQorKysgU291cmNlL1dlYkNvcmUvZG9tL0NoYXJhY3RlckRhdGEuaAkod29ya2luZyBjb3B5KQpA
QCAtNDUsNyArNDUsNyBAQCBwdWJsaWM6CiAKICAgICAvLyBMaWtlIGFwcGVuZERhdGEsIGJ1dCBv
cHRpbWl6ZWQgZm9yIHRoZSBwYXJzZXIgKGUuZy4sIG5vIG11dGF0aW9uIGV2ZW50cykuCiAgICAg
Ly8gUmV0dXJucyBob3cgbXVjaCBjb3VsZCBiZSBhZGRlZCBiZWZvcmUgbGVuZ3RoIGxpbWl0IHdh
cyBtZXQuCi0gICAgdW5zaWduZWQgcGFyc2VyQXBwZW5kRGF0YShjb25zdCBVQ2hhciosIHVuc2ln
bmVkIGRhdGFMZW5ndGgsIHVuc2lnbmVkIGxlbmd0aExpbWl0KTsKKyAgICB1bnNpZ25lZCBwYXJz
ZXJBcHBlbmREYXRhKGNvbnN0IFN0cmluZyYsIHVuc2lnbmVkLCB1bnNpZ25lZCAsIHVuc2lnbmVk
IG9mZnNldCA9IDApOwogCiAgICAgdmlydHVhbCB2b2lkIHJlcG9ydE1lbW9yeVVzYWdlKE1lbW9y
eU9iamVjdEluZm8qKSBjb25zdDsKIApJbmRleDogU291cmNlL1dlYkNvcmUvZG9tL1RleHQuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2RvbS9UZXh0LmNwcAkocmV2aXNpb24gMTI5
Njc2KQorKysgU291cmNlL1dlYkNvcmUvZG9tL1RleHQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0y
ODgsNyArMjg4LDcgQEAgUGFzc1JlZlB0cjxUZXh0PiBUZXh0OjpjcmVhdGVXaXRoTGVuZ3RoTAog
ICAgICAgICByZXR1cm4gY3JlYXRlKGRvY3VtZW50LCBkYXRhKTsKIAogICAgIFJlZlB0cjxUZXh0
PiByZXN1bHQgPSBUZXh0OjpjcmVhdGUoZG9jdW1lbnQsIFN0cmluZygpKTsKLSAgICByZXN1bHQt
PnBhcnNlckFwcGVuZERhdGEoZGF0YS5jaGFyYWN0ZXJzKCkgKyBzdGFydCwgZGF0YUxlbmd0aCAt
IHN0YXJ0LCBtYXhDaGFycyk7CisgICAgcmVzdWx0LT5wYXJzZXJBcHBlbmREYXRhKGRhdGEsIGRh
dGFMZW5ndGggLSBzdGFydCwgbWF4Q2hhcnMsIHN0YXJ0KTsKIAogICAgIHJldHVybiByZXN1bHQ7
CiB9CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9odG1sL3BhcnNlci9IVE1MQ29uc3RydWN0aW9uU2l0
ZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvaHRtbC9wYXJzZXIvSFRNTENvbnN0
cnVjdGlvblNpdGUuY3BwCShyZXZpc2lvbiAxMjk2NzYpCisrKyBTb3VyY2UvV2ViQ29yZS9odG1s
L3BhcnNlci9IVE1MQ29uc3RydWN0aW9uU2l0ZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM2OCw3
ICszNjgsNyBAQCB2b2lkIEhUTUxDb25zdHJ1Y3Rpb25TaXRlOjppbnNlcnRUZXh0Tm9kCiAgICAg
ICAgIC8vIEZJWE1FOiBXZSdyZSBvbmx5IHN1cHBvc2VkIHRvIGFwcGVuZCB0byB0aGlzIHRleHQg
bm9kZSBpZiBpdAogICAgICAgICAvLyB3YXMgdGhlIGxhc3QgdGV4dCBub2RlIGluc2VydGVkIGJ5
IHRoZSBwYXJzZXIuCiAgICAgICAgIENoYXJhY3RlckRhdGEqIHRleHROb2RlID0gc3RhdGljX2Nh
c3Q8Q2hhcmFjdGVyRGF0YSo+KHByZXZpb3VzQ2hpbGQpOwotICAgICAgICBjdXJyZW50UG9zaXRp
b24gPSB0ZXh0Tm9kZS0+cGFyc2VyQXBwZW5kRGF0YShjaGFyYWN0ZXJzLmNoYXJhY3RlcnMoKSwg
Y2hhcmFjdGVycy5sZW5ndGgoKSwgVGV4dDo6ZGVmYXVsdExlbmd0aExpbWl0KTsKKyAgICAgICAg
Y3VycmVudFBvc2l0aW9uID0gdGV4dE5vZGUtPnBhcnNlckFwcGVuZERhdGEoY2hhcmFjdGVycywg
Y2hhcmFjdGVycy5sZW5ndGgoKSwgVGV4dDo6ZGVmYXVsdExlbmd0aExpbWl0KTsKICAgICB9CiAK
ICAgICB3aGlsZSAoY3VycmVudFBvc2l0aW9uIDwgY2hhcmFjdGVycy5sZW5ndGgoKSkgewo=
</data>
<flag name="review"
          id="178244"
          type_id="1"
          status="+"
          setter="darin"
    />
    <flag name="commit-queue"
          id="178245"
          type_id="3"
          status="-"
          setter="darin"
    />
          </attachment>
      

    </bug>

</bugzilla>