<?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>30261</bug_id>
          
          <creation_ts>2009-10-09 14:38:17 -0700</creation_ts>
          <short_desc>Optimization: Reduce calls to StringImpl&apos;s upper / lower / isLower</short_desc>
          <delta_ts>2010-11-01 16:06:40 -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>WebCore Misc.</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>P3</priority>
          <bug_severity>Enhancement</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>48789</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Jens Alfke">jens</reporter>
          <assigned_to name="Jens Alfke">jens</assigned_to>
          <cc>commit-queue</cc>
    
    <cc>darin</cc>
    
    <cc>eric</cc>
    
    <cc>ojan</cc>
    
    <cc>simon.fraser</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>153763</commentid>
    <comment_count>0</comment_count>
    <who name="Jens Alfke">jens</who>
    <bug_when>2009-10-09 14:38:17 -0700</bug_when>
    <thetext>* Darin pointed out that my recent optimization to StringImpl::lower() obviates the need for the isLower() check, which now just wastes time. It was only being used in a handful of places, so that was easy to do.
* I added lower() and upper() methods to AtomicString, which check whether the underlying StringImpl call was a no-op, and if so just return the receiver instead of doing the hash lookup again.
* By far the major usage of StringImpl::upper (hundreds of times loading yahoo.com, 1600 loading pitchfork.com) was in HTMLElement::nodeName(), to uppercase the tag name. There was already a FIXME comment suggesting that this conversion could be cached. I did so by adding a cache field to QualifiedName&apos;s impl, and an accessor localNameUpper(). This reduced the number of uppercase conversions to about 30 for a typical page, and since QualifiedNameImpls are themselves cached, the number of conversions stays low; I saw only 69 after surfing through a number of pages.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>153836</commentid>
    <comment_count>1</comment_count>
      <attachid>40980</attachid>
    <who name="Jens Alfke">jens</who>
    <bug_when>2009-10-09 19:52:02 -0700</bug_when>
    <thetext>Created attachment 40980
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>153893</commentid>
    <comment_count>2</comment_count>
      <attachid>40980</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-10-10 19:40:45 -0700</bug_when>
    <thetext>Comment on attachment 40980
patch

Makes sense to me.  Do we have any numbers from PLT runs to confirm this makes things faster?  I&apos;m happy to r+ this, but I think that Darin should at least get a chance to see it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>153906</commentid>
    <comment_count>3</comment_count>
    <who name="Jens Alfke">jens</who>
    <bug_when>2009-10-10 21:43:15 -0700</bug_when>
    <thetext>My concerns were more about memory usage — even small temporary strings can lead to memory fragmentation and increased high-water-marks — but it should have some nonzero effect on pure speed too.

Is there documentation on running the PLT? I could give it a shot.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>153907</commentid>
    <comment_count>4</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-10-10 21:47:39 -0700</bug_when>
    <thetext>Running the PLT in safari is non-trivial.  First you have to actually have a copy of the PLT.  Quieting your machine (so that the results are stable) is the most difficult part.  Apple has some scripts for this sort of thing, some of which are in svn.webkit.org:
http://trac.webkit.org/browser/trunk/WebKitTools/Scripts/run-pageloadtest

Probably easier to use Google&apos;s page cycler bots, but you&apos;d have to find out of the try-bots run the performance tests.  If they do, then you could easily get numbers that way.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>153925</commentid>
    <comment_count>5</comment_count>
    <who name="Jens Alfke">jens</who>
    <bug_when>2009-10-11 10:07:03 -0700</bug_when>
    <thetext>Thanks, Eric. I&apos;ll give that a try on Monday.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>153969</commentid>
    <comment_count>6</comment_count>
      <attachid>40980</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-10-11 20:18:30 -0700</bug_when>
    <thetext>Comment on attachment 40980
patch

&gt;      const AtomicString&amp; prefix() const { return m_impl-&gt;m_prefix; }
&gt;      const AtomicString&amp; localName() const { return m_impl-&gt;m_localName; }
&gt; +    const AtomicString&amp; localNameUpper() const;
&gt;      const AtomicString&amp; namespaceURI() const { return m_impl-&gt;m_namespace; }

I think localNameUpper should get its own paragraph in the class definition. The other three pieces are the fundamental building blocks that make up a QualifiedName, whereas localNameUpper is just a convenience function. Having it int he same paragraph gives it inappropriately high status ;-)

Are you sure the space/speed tradeoff is right on QualifiedName::localNameUpper? How did you gauge that?

I&apos;ll say r=me on this but I do look forward to hearing how the performance testing comes out.

I could imagine a different implementation that actually knows how to search the atomic string hash table without allocating a new string. There could be a fixed size stack buffer where we lowercase. Then we&apos;d avoid the allocation in the case that the AtomicString already exists but be slower for the case where it does not. It&apos;s not clear this is important. It all depends on how hot the AtomicString::lower and upper functions are and how often they are called on a string that happens to already be in the atomic string table.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>154418</commentid>
    <comment_count>7</comment_count>
    <who name="Jens Alfke">jens</who>
    <bug_when>2009-10-13 13:42:58 -0700</bug_when>
    <thetext>Darin, thanks for nudging me to do some performance testing. I&apos;ve been running Dromaeo, since there was a scare about my lower() optimization possibly affecting it.

Turns out that taking out isLower did affect Dromaeo because the initial test for no-op in my optimized lower() was slower than the existing isLower code, and also the AtomicString::lower method was doing more refcount fu than necessary. I spent some time tweaking the code and running both Dromaeo and micro-benchmarks, and got the performance to be equal to what it is without this patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>154419</commentid>
    <comment_count>8</comment_count>
      <attachid>41124</attachid>
    <who name="Jens Alfke">jens</who>
    <bug_when>2009-10-13 13:43:08 -0700</bug_when>
    <thetext>Created attachment 41124
patch 2</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>154470</commentid>
    <comment_count>9</comment_count>
      <attachid>41124</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-10-13 15:46:31 -0700</bug_when>
    <thetext>Comment on attachment 41124
patch 2

&gt; +    // Note: This is a hot function in the Dromaeo benchmark.
&gt; +    StringImpl *myImpl = impl();

The * here needs to be next to StringImpl, not next to myImpl.

Informally, the style in WebKit code is to do it like this:

    StringImpl* impl = this-&gt;impl();

Rather than using a prefix like &quot;my&quot;.

&gt; -    for (int i = 0; i &lt; length; i++) {
&gt; -        UChar c = m_data[i];
&gt; -        ored |= c;
&gt; -        noUpper = noUpper &amp;&amp; !isASCIIUpper(c);
&gt; +    for (const UChar* chp = m_data, *end = m_data + m_length; chp != end; chp++) {
&gt; +        if (UNLIKELY(isASCIIUpper(*chp)))
&gt; +            noUpper = false;
&gt; +        ored |= *chp;
&gt;      }

I suggest declaring the end pointer outside the loop to avoid the multiple initialization in the for, which is something we almost never do.

We&apos;ve found in the past that indexing is as efficient as pointer chasing, so I&apos;m surprised that this change was needed to speed things up.

r=me but you should consider both comments above. Some reviewers might review- just based on the StringImpl* part ;-)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>154481</commentid>
    <comment_count>10</comment_count>
      <attachid>41136</attachid>
    <who name="Jens Alfke">jens</who>
    <bug_when>2009-10-13 16:18:58 -0700</bug_when>
    <thetext>Created attachment 41136
patch 3

OK, this fixes those issues. I&apos;m usually reluctant to shadow a member name with a local, but if that&apos;s the convention I&apos;ll change it.

I wrote a micro-benchmark that just runs that one method and the pointer-chasing was faster. Most of the added speed comes from the change to the way noUpper is set, though; you&apos;d think the two forms would optimize the same, but they don&apos;t.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>155692</commentid>
    <comment_count>11</comment_count>
      <attachid>41136</attachid>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-10-19 08:44:49 -0700</bug_when>
    <thetext>Comment on attachment 41136
patch 3

Let commit-bot commit it</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>155817</commentid>
    <comment_count>12</comment_count>
      <attachid>41136</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2009-10-19 12:11:45 -0700</bug_when>
    <thetext>Comment on attachment 41136
patch 3

Clearing flags on attachment: 41136

Committed r49798: &lt;http://trac.webkit.org/changeset/49798&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>155818</commentid>
    <comment_count>13</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2009-10-19 12:11:48 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>226582</commentid>
    <comment_count>14</comment_count>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2010-05-16 18:16:10 -0700</bug_when>
    <thetext>This change added a new pointer to QualifiedName, which in turn affects Attribute, MappedAttribute etc. We make thousands of these, so there&apos;s significant memory impact. I&apos;m not sure adding m_localNameUpper was the best solution here.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>226601</commentid>
    <comment_count>15</comment_count>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2010-05-16 20:22:26 -0700</bug_when>
    <thetext>Running the first 29 membuster tests, I see around 800 QualifiedNameImpls live. That&apos;s about 6Kb more memory in 64-bit with this change.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>303025</commentid>
    <comment_count>16</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-11-01 16:06:40 -0700</bug_when>
    <thetext>Turns out this optimization caused a crash regression.  We just only discovered it a year later. :)  See bug 48789.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>40980</attachid>
            <date>2009-10-09 19:52:02 -0700</date>
            <delta_ts>2009-10-13 13:43:08 -0700</delta_ts>
            <desc>patch</desc>
            <filename>upperLowerOpt.patch</filename>
            <type>text/plain</type>
            <size>8978</size>
            <attacher name="Jens Alfke">jens</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA0OTQxMykKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMzMgQEAKKzIwMDktMTAtMDkgIEplbnMgQWxma2UgIDxqZW5zQG1vb3NleWFyZC5j
b20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgT3B0
aW1pemUgc3RyaW5nIHVwcGVyL2xvd2VyY2FzaW5nCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zMDI2MQorICAgICAgICAKKyAgICAgICAgLSBBZGRlZCBB
dG9taWNTdHJpbmc6OnVwcGVyKCkgYW5kIGxvd2VyKCkKKyAgICAgICAgLSBSZW1vdmVkIFN0cmlu
Z0ltcGw6OmlzTG93ZXIoKQorICAgICAgICAtIEFkZGVkIFF1YWxpZmllZE5hbWU6OmxvY2FsTmFt
ZVVwcGVyKCksIHdoaWNoIGlzIGNhY2hlZCwgdGhlcmVieSBzYXZpbmcKKyAgICAgICAgICB0aG91
c2FuZHMgb2YgdXBwZXIoKSBjYWxscyBhbmQgc3RyaW5nIGFsbG9jYXRpb25zLgorCisgICAgICAg
ICogZG9tL0VsZW1lbnQuY3BwOgorICAgICAgICAoV2ViQ29yZTo6RWxlbWVudDo6c2V0QXR0cmli
dXRlKTogQ2FsbCBBdG9taWNTdHJpbmc6Omxvd2VyKCkKKyAgICAgICAgKiBkb20vUXVhbGlmaWVk
TmFtZS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpRdWFsaWZpZWROYW1lOjpsb2NhbE5hbWVVcHBl
cik6IE5ldyBtZXRob2QKKyAgICAgICAgKiBkb20vUXVhbGlmaWVkTmFtZS5oOiBBZGRlZCBsb2Nh
bE5hbWVVcHBlcigpIG1ldGhvZAorICAgICAgICAqIGRvbS9TdHlsZWRFbGVtZW50LmNwcDoKKyAg
ICAgICAgKFdlYkNvcmU6OlN0eWxlZEVsZW1lbnQ6OnBhcnNlTWFwcGVkQXR0cmlidXRlKTogIENh
bGwgQXRvbWljU3RyaW5nOjpsb3dlcigpCisgICAgICAgICogaHRtbC9IVE1MRG9jdW1lbnQuY3Bw
OgorICAgICAgICAoV2ViQ29yZTo6SFRNTERvY3VtZW50OjpjcmVhdGVFbGVtZW50KTogQ2FsbCBB
dG9taWNTdHJpbmc6Omxvd2VyKCkKKyAgICAgICAgKiBodG1sL0hUTUxFbGVtZW50LmNwcDoKKyAg
ICAgICAgKFdlYkNvcmU6OkhUTUxFbGVtZW50Ojpub2RlTmFtZSk6IENhbGwgbG9jYWxOYW1lVXBw
ZXIoKQorICAgICAgICAqIHBsYXRmb3JtL3RleHQvQXRvbWljU3RyaW5nLmNwcDoKKyAgICAgICAg
KFdlYkNvcmU6OkF0b21pY1N0cmluZzo6bG93ZXIpOiBOZXcgbWV0aG9kCisgICAgICAgIChXZWJD
b3JlOjpBdG9taWNTdHJpbmc6OnVwcGVyKTogTmV3IG1ldGhvZAorICAgICAgICAqIHBsYXRmb3Jt
L3RleHQvQXRvbWljU3RyaW5nLmg6IEFkZGVkIGxvd2VyKCkgYW5kIHVwcGVyKCkKKyAgICAgICAg
KiBwbGF0Zm9ybS90ZXh0L1N0cmluZ0ltcGwuY3BwOiBSZW1vdmVkIGlzTG93ZXIoKQorICAgICAg
ICAqIHBsYXRmb3JtL3RleHQvU3RyaW5nSW1wbC5oOiBSZW1vdmVkIGlzTG93ZXIoKQorCiAyMDA5
LTEwLTA5ICBBZGFtIEJhcnRoICA8YWJhcnRoQHdlYmtpdC5vcmc+CiAKICAgICAgICAgUmV2aWV3
ZWQgYnkgRGFyaW4gQWRsZXIuCkluZGV4OiBXZWJDb3JlL2RvbS9FbGVtZW50LmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBXZWJDb3JlL2RvbS9FbGVtZW50LmNwcAkocmV2aXNpb24gNDk0MTMpCisrKyBXZWJD
b3JlL2RvbS9FbGVtZW50LmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTE1LDcgKzUxNSw3IEBAIHZv
aWQgRWxlbWVudDo6c2V0QXR0cmlidXRlKGNvbnN0IEF0b21pY1MKICAgICAgICAgcmV0dXJuOwog
ICAgIH0KIAotICAgIGNvbnN0IEF0b21pY1N0cmluZyYgbG9jYWxOYW1lID0gKHNob3VsZElnbm9y
ZUF0dHJpYnV0ZUNhc2UodGhpcykgJiYgIW5hbWUuc3RyaW5nKCkuaW1wbCgpLT5pc0xvd2VyKCkp
ID8gQXRvbWljU3RyaW5nKG5hbWUuc3RyaW5nKCkubG93ZXIoKSkgOiBuYW1lOworICAgIGNvbnN0
IEF0b21pY1N0cmluZyYgbG9jYWxOYW1lID0gc2hvdWxkSWdub3JlQXR0cmlidXRlQ2FzZSh0aGlz
KSA/IG5hbWUubG93ZXIoKSA6IG5hbWU7CiAKICAgICAvLyBhbGxvY2F0ZSBhdHRyaWJ1dGVtYXAg
aWYgbmVjZXNzYXJ5CiAgICAgQXR0cmlidXRlKiBvbGQgPSBhdHRyaWJ1dGVzKGZhbHNlKS0+Z2V0
QXR0cmlidXRlSXRlbShsb2NhbE5hbWUsIGZhbHNlKTsKSW5kZXg6IFdlYkNvcmUvZG9tL1F1YWxp
ZmllZE5hbWUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvZG9tL1F1YWxpZmllZE5hbWUuY3Bw
CShyZXZpc2lvbiA0OTQxMykKKysrIFdlYkNvcmUvZG9tL1F1YWxpZmllZE5hbWUuY3BwCSh3b3Jr
aW5nIGNvcHkpCkBAIC05Nyw0ICs5NywxMSBAQCB2b2lkIFF1YWxpZmllZE5hbWU6OmluaXQoKQog
ICAgIH0KIH0KIAorY29uc3QgQXRvbWljU3RyaW5nJiBRdWFsaWZpZWROYW1lOjpsb2NhbE5hbWVV
cHBlcigpIGNvbnN0Cit7CisgICAgaWYgKCFtX2ltcGwtPm1fbG9jYWxOYW1lVXBwZXIpCisgICAg
ICAgIG1faW1wbC0+bV9sb2NhbE5hbWVVcHBlciA9IG1faW1wbC0+bV9sb2NhbE5hbWUudXBwZXIo
KTsKKyAgICByZXR1cm4gbV9pbXBsLT5tX2xvY2FsTmFtZVVwcGVyOworfQorCiB9CkluZGV4OiBX
ZWJDb3JlL2RvbS9RdWFsaWZpZWROYW1lLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9kb20vUXVh
bGlmaWVkTmFtZS5oCShyZXZpc2lvbiA0OTQxMykKKysrIFdlYkNvcmUvZG9tL1F1YWxpZmllZE5h
bWUuaAkod29ya2luZyBjb3B5KQpAQCAtNDEsOSArNDEsMTAgQEAgcHVibGljOgogICAgICAgICAg
ICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBRdWFsaWZpZWROYW1lSW1wbChwcmVmaXgsIGxvY2FsTmFt
ZSwgbmFtZXNwYWNlVVJJKSk7CiAgICAgICAgIH0KIAotICAgICAgICBBdG9taWNTdHJpbmcgbV9w
cmVmaXg7Ci0gICAgICAgIEF0b21pY1N0cmluZyBtX2xvY2FsTmFtZTsKLSAgICAgICAgQXRvbWlj
U3RyaW5nIG1fbmFtZXNwYWNlOworICAgICAgICBjb25zdCBBdG9taWNTdHJpbmcgbV9wcmVmaXg7
CisgICAgICAgIGNvbnN0IEF0b21pY1N0cmluZyBtX2xvY2FsTmFtZTsKKyAgICAgICAgY29uc3Qg
QXRvbWljU3RyaW5nIG1fbmFtZXNwYWNlOworICAgICAgICBtdXRhYmxlIEF0b21pY1N0cmluZyBt
X2xvY2FsTmFtZVVwcGVyOwogCiAgICAgcHJpdmF0ZToKICAgICAgICAgUXVhbGlmaWVkTmFtZUlt
cGwoY29uc3QgQXRvbWljU3RyaW5nJiBwcmVmaXgsIGNvbnN0IEF0b21pY1N0cmluZyYgbG9jYWxO
YW1lLCBjb25zdCBBdG9taWNTdHJpbmcmIG5hbWVzcGFjZVVSSSkKQEAgLTc0LDYgKzc1LDcgQEAg
cHVibGljOgogCiAgICAgY29uc3QgQXRvbWljU3RyaW5nJiBwcmVmaXgoKSBjb25zdCB7IHJldHVy
biBtX2ltcGwtPm1fcHJlZml4OyB9CiAgICAgY29uc3QgQXRvbWljU3RyaW5nJiBsb2NhbE5hbWUo
KSBjb25zdCB7IHJldHVybiBtX2ltcGwtPm1fbG9jYWxOYW1lOyB9CisgICAgY29uc3QgQXRvbWlj
U3RyaW5nJiBsb2NhbE5hbWVVcHBlcigpIGNvbnN0OwogICAgIGNvbnN0IEF0b21pY1N0cmluZyYg
bmFtZXNwYWNlVVJJKCkgY29uc3QgeyByZXR1cm4gbV9pbXBsLT5tX25hbWVzcGFjZTsgfQogCiAg
ICAgU3RyaW5nIHRvU3RyaW5nKCkgY29uc3Q7CkluZGV4OiBXZWJDb3JlL2RvbS9TdHlsZWRFbGVt
ZW50LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2RvbS9TdHlsZWRFbGVtZW50LmNwcAkocmV2
aXNpb24gNDk0MTMpCisrKyBXZWJDb3JlL2RvbS9TdHlsZWRFbGVtZW50LmNwcAkod29ya2luZyBj
b3B5KQpAQCAtMjQwLDggKzI0MCw4IEBAIHZvaWQgU3R5bGVkRWxlbWVudDo6cGFyc2VNYXBwZWRB
dHRyaWJ1dGUKICAgICAgICAgaWYgKG5hbWVkQXR0ck1hcCkgewogICAgICAgICAgICAgaWYgKGF0
dHItPmlzTnVsbCgpKQogICAgICAgICAgICAgICAgIG5hbWVkQXR0ck1hcC0+c2V0SUQobnVsbEF0
b20pOwotICAgICAgICAgICAgZWxzZSBpZiAoZG9jdW1lbnQoKS0+aW5Db21wYXRNb2RlKCkgJiYg
IWF0dHItPnZhbHVlKCkuaW1wbCgpLT5pc0xvd2VyKCkpCi0gICAgICAgICAgICAgICAgbmFtZWRB
dHRyTWFwLT5zZXRJRChBdG9taWNTdHJpbmcoYXR0ci0+dmFsdWUoKS5zdHJpbmcoKS5sb3dlcigp
KSk7CisgICAgICAgICAgICBlbHNlIGlmIChkb2N1bWVudCgpLT5pbkNvbXBhdE1vZGUoKSkKKyAg
ICAgICAgICAgICAgICBuYW1lZEF0dHJNYXAtPnNldElEKGF0dHItPnZhbHVlKCkubG93ZXIoKSk7
CiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgbmFtZWRBdHRyTWFwLT5zZXRJRChh
dHRyLT52YWx1ZSgpKTsKICAgICAgICAgfQpJbmRleDogV2ViQ29yZS9odG1sL0hUTUxEb2N1bWVu
dC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9odG1sL0hUTUxEb2N1bWVudC5jcHAJKHJldmlz
aW9uIDQ5NDEzKQorKysgV2ViQ29yZS9odG1sL0hUTUxEb2N1bWVudC5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTMwNyw4ICszMDcsNyBAQCBQYXNzUmVmUHRyPEVsZW1lbnQ+IEhUTUxEb2N1bWVudDo6
Y3JlYXRlCiAgICAgICAgIGVjID0gSU5WQUxJRF9DSEFSQUNURVJfRVJSOwogICAgICAgICByZXR1
cm4gMDsKICAgICB9Ci0gICAgQXRvbWljU3RyaW5nIGxvd2VyTmFtZSA9IG5hbWUuc3RyaW5nKCku
aW1wbCgpLT5pc0xvd2VyKCkgPyBuYW1lIDogQXRvbWljU3RyaW5nKG5hbWUuc3RyaW5nKCkubG93
ZXIoKSk7Ci0gICAgcmV0dXJuIEhUTUxFbGVtZW50RmFjdG9yeTo6Y3JlYXRlSFRNTEVsZW1lbnQo
UXVhbGlmaWVkTmFtZShudWxsQXRvbSwgbG93ZXJOYW1lLCB4aHRtbE5hbWVzcGFjZVVSSSksIHRo
aXMsIDAsIGZhbHNlKTsKKyAgICByZXR1cm4gSFRNTEVsZW1lbnRGYWN0b3J5OjpjcmVhdGVIVE1M
RWxlbWVudChRdWFsaWZpZWROYW1lKG51bGxBdG9tLCBuYW1lLmxvd2VyKCksIHhodG1sTmFtZXNw
YWNlVVJJKSwgdGhpcywgMCwgZmFsc2UpOwogfQogCiBzdGF0aWMgdm9pZCBhZGRJdGVtVG9NYXAo
SGFzaENvdW50ZWRTZXQ8QXRvbWljU3RyaW5nSW1wbCo+JiBtYXAsIGNvbnN0IEF0b21pY1N0cmlu
ZyYgbmFtZSkKSW5kZXg6IFdlYkNvcmUvaHRtbC9IVE1MRWxlbWVudC5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gV2ViQ29yZS9odG1sL0hUTUxFbGVtZW50LmNwcAkocmV2aXNpb24gNDk0MTMpCisrKyBXZWJD
b3JlL2h0bWwvSFRNTEVsZW1lbnQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC02Nyw3ICs2Nyw3IEBA
IFN0cmluZyBIVE1MRWxlbWVudDo6bm9kZU5hbWUoKSBjb25zdAogICAgIC8vIHRoZSBzdHJpbmcg
b24gYSBoaXQgaW4gdGhlIGhhc2guCiAgICAgLy8gRklYTUU6IFdlIHNob3VsZCBoYXZlIGEgd2F5
IHRvIGRldGVjdCBYSFRNTCBlbGVtZW50cyBhbmQgcmVwbGFjZSB0aGUgaGFzUHJlZml4KCkgY2hl
Y2sgd2l0aCBpdC4KICAgICBpZiAoZG9jdW1lbnQoKS0+aXNIVE1MRG9jdW1lbnQoKSAmJiAhdGFn
UU5hbWUoKS5oYXNQcmVmaXgoKSkKLSAgICAgICAgcmV0dXJuIHRhZ1FOYW1lKCkubG9jYWxOYW1l
KCkuc3RyaW5nKCkudXBwZXIoKTsKKyAgICAgICAgcmV0dXJuIHRhZ1FOYW1lKCkubG9jYWxOYW1l
VXBwZXIoKTsKICAgICByZXR1cm4gRWxlbWVudDo6bm9kZU5hbWUoKTsKIH0KICAgICAKSW5kZXg6
IFdlYkNvcmUvcGxhdGZvcm0vdGV4dC9BdG9taWNTdHJpbmcuY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdl
YkNvcmUvcGxhdGZvcm0vdGV4dC9BdG9taWNTdHJpbmcuY3BwCShyZXZpc2lvbiA0OTQxMykKKysr
IFdlYkNvcmUvcGxhdGZvcm0vdGV4dC9BdG9taWNTdHJpbmcuY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC0yMjgsNiArMjI4LDIyIEBAIHZvaWQgQXRvbWljU3RyaW5nOjpyZW1vdmUoU3RyaW5nSW1wbCog
cikKIHsKICAgICBzdHJpbmdUYWJsZSgpLnJlbW92ZShyKTsKIH0KKyAgICAKK0F0b21pY1N0cmlu
ZyBBdG9taWNTdHJpbmc6Omxvd2VyKCkgY29uc3QKK3sKKyAgICBTdHJpbmcgbmV3U3RyaW5nID0g
bV9zdHJpbmcubG93ZXIoKTsKKyAgICBpZiAobmV3U3RyaW5nLmltcGwoKSA9PSBtX3N0cmluZy5p
bXBsKCkpCisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICByZXR1cm4gQXRvbWljU3RyaW5nKG5l
d1N0cmluZyk7Cit9CisKK0F0b21pY1N0cmluZyBBdG9taWNTdHJpbmc6OnVwcGVyKCkgY29uc3QK
K3sKKyAgICBTdHJpbmcgbmV3U3RyaW5nID0gbV9zdHJpbmcudXBwZXIoKTsKKyAgICBpZiAobmV3
U3RyaW5nLmltcGwoKSA9PSBtX3N0cmluZy5pbXBsKCkpCisgICAgICAgIHJldHVybiAqdGhpczsK
KyAgICByZXR1cm4gQXRvbWljU3RyaW5nKG5ld1N0cmluZyk7Cit9CiAKICNpZiBVU0UoSlNDKQog
UGFzc1JlZlB0cjxTdHJpbmdJbXBsPiBBdG9taWNTdHJpbmc6OmFkZChjb25zdCBKU0M6OklkZW50
aWZpZXImIGlkZW50aWZpZXIpCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL3RleHQvQXRvbWljU3Ry
aW5nLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS90ZXh0L0F0b21pY1N0cmluZy5o
CShyZXZpc2lvbiA0OTQxMykKKysrIFdlYkNvcmUvcGxhdGZvcm0vdGV4dC9BdG9taWNTdHJpbmcu
aAkod29ya2luZyBjb3B5KQpAQCAtODMsNiArODMsOSBAQCBwdWJsaWM6CiAgICAgYm9vbCBlbmRz
V2l0aChjb25zdCBTdHJpbmcmIHMsIGJvb2wgY2FzZVNlbnNpdGl2ZSA9IHRydWUpIGNvbnN0CiAg
ICAgICAgIHsgcmV0dXJuIG1fc3RyaW5nLmVuZHNXaXRoKHMsIGNhc2VTZW5zaXRpdmUpOyB9CiAg
ICAgCisgICAgQXRvbWljU3RyaW5nIGxvd2VyKCkgY29uc3Q7CisgICAgQXRvbWljU3RyaW5nIHVw
cGVyKCkgY29uc3Q7CisgICAgCiAgICAgaW50IHRvSW50KGJvb2wqIG9rID0gMCkgY29uc3QgeyBy
ZXR1cm4gbV9zdHJpbmcudG9JbnQob2spOyB9CiAgICAgZG91YmxlIHRvRG91YmxlKGJvb2wqIG9r
ID0gMCkgY29uc3QgeyByZXR1cm4gbV9zdHJpbmcudG9Eb3VibGUob2spOyB9CiAgICAgZmxvYXQg
dG9GbG9hdChib29sKiBvayA9IDApIGNvbnN0IHsgcmV0dXJuIG1fc3RyaW5nLnRvRmxvYXQob2sp
OyB9CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL3RleHQvU3RyaW5nSW1wbC5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS90ZXh0L1N0cmluZ0ltcGwuY3BwCShyZXZpc2lvbiA0OTQx
MykKKysrIFdlYkNvcmUvcGxhdGZvcm0vdGV4dC9TdHJpbmdJbXBsLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtMTQ5LDMwICsxNDksNiBAQCBVQ2hhcjMyIFN0cmluZ0ltcGw6OmNoYXJhY3RlclN0YXJ0
aW5nQXQoCiAgICAgcmV0dXJuIDA7CiB9CiAKLWJvb2wgU3RyaW5nSW1wbDo6aXNMb3dlcigpCi17
Ci0gICAgLy8gRG8gYSBmYXN0ZXIgbG9vcCBmb3IgdGhlIGNhc2Ugd2hlcmUgYWxsIHRoZSBjaGFy
YWN0ZXJzIGFyZSBBU0NJSS4KLSAgICBib29sIGFsbExvd2VyID0gdHJ1ZTsKLSAgICBVQ2hhciBv
cmVkID0gMDsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbV9sZW5ndGg7IGkrKykgewot
ICAgICAgICBVQ2hhciBjID0gbV9kYXRhW2ldOwotICAgICAgICBhbGxMb3dlciA9IGFsbExvd2Vy
ICYmIGlzQVNDSUlMb3dlcihjKTsKLSAgICAgICAgb3JlZCB8PSBjOwotICAgIH0KLSAgICBpZiAo
IShvcmVkICYgfjB4N0YpKQotICAgICAgICByZXR1cm4gYWxsTG93ZXI7Ci0KLSAgICAvLyBEbyBh
IHNsb3dlciBjaGVjayBmb3IgY2FzZXMgdGhhdCBpbmNsdWRlIG5vbi1BU0NJSSBjaGFyYWN0ZXJz
LgotICAgIGFsbExvd2VyID0gdHJ1ZTsKLSAgICB1bnNpZ25lZCBpID0gMDsKLSAgICB3aGlsZSAo
aSA8IG1fbGVuZ3RoKSB7Ci0gICAgICAgIFVDaGFyMzIgY2hhcmFjdGVyOwotICAgICAgICBVMTZf
TkVYVChtX2RhdGEsIGksIG1fbGVuZ3RoLCBjaGFyYWN0ZXIpCi0gICAgICAgIGFsbExvd2VyID0g
YWxsTG93ZXIgJiYgVW5pY29kZTo6aXNMb3dlcihjaGFyYWN0ZXIpOwotICAgIH0KLSAgICByZXR1
cm4gYWxsTG93ZXI7Ci19Ci0KIFBhc3NSZWZQdHI8U3RyaW5nSW1wbD4gU3RyaW5nSW1wbDo6bG93
ZXIoKQogewogICAgIC8vIEZpcnN0IHNjYW4gdGhlIHN0cmluZyBmb3IgdXBwZXJjYXNlIGFuZCBu
b24tQVNDSUkgY2hhcmFjdGVyczoKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vdGV4dC9TdHJpbmdJ
bXBsLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS90ZXh0L1N0cmluZ0ltcGwuaAko
cmV2aXNpb24gNDk0MTMpCisrKyBXZWJDb3JlL3BsYXRmb3JtL3RleHQvU3RyaW5nSW1wbC5oCSh3
b3JraW5nIGNvcHkpCkBAIC0xMzUsNyArMTM1LDYgQEAgcHVibGljOgogICAgIGRvdWJsZSB0b0Rv
dWJsZShib29sKiBvayA9IDApOwogICAgIGZsb2F0IHRvRmxvYXQoYm9vbCogb2sgPSAwKTsKIAot
ICAgIGJvb2wgaXNMb3dlcigpOwogICAgIFBhc3NSZWZQdHI8U3RyaW5nSW1wbD4gbG93ZXIoKTsK
ICAgICBQYXNzUmVmUHRyPFN0cmluZ0ltcGw+IHVwcGVyKCk7CiAgICAgUGFzc1JlZlB0cjxTdHJp
bmdJbXBsPiBzZWN1cmUoVUNoYXIgYUNoYXIpOwo=
</data>
<flag name="review"
          id="22281"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>41124</attachid>
            <date>2009-10-13 13:43:08 -0700</date>
            <delta_ts>2009-10-13 16:18:58 -0700</delta_ts>
            <desc>patch 2</desc>
            <filename>upperLowerOpt.patch</filename>
            <type>text/plain</type>
            <size>9925</size>
            <attacher name="Jens Alfke">jens</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA0OTUwNikKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMzUgQEAKKzIwMDktMTAtMDkgIEplbnMgQWxma2UgIDxqZW5zQG1vb3NleWFyZC5j
b20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgT3B0
aW1pemUgc3RyaW5nIHVwcGVyL2xvd2VyY2FzaW5nCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zMDI2MQorICAgICAgICAKKyAgICAgICAgLSBBZGRlZCBB
dG9taWNTdHJpbmc6OnVwcGVyKCkgYW5kIGxvd2VyKCkKKyAgICAgICAgLSBGdXJ0aGVyIG9wdGlt
aXplZCBTdHJpbmdJbXBsOjpsb3dlcigpCisgICAgICAgIC0gUmVtb3ZlZCBTdHJpbmdJbXBsOjpp
c0xvd2VyKCkKKyAgICAgICAgLSBBZGRlZCBRdWFsaWZpZWROYW1lOjpsb2NhbE5hbWVVcHBlcigp
LCB3aGljaCBpcyBjYWNoZWQsIHRoZXJlYnkgc2F2aW5nCisgICAgICAgICAgdGhvdXNhbmRzIG9m
IHVwcGVyKCkgY2FsbHMgYW5kIHN0cmluZyBhbGxvY2F0aW9ucy4KKyAKKyAgICAgICAgICogZG9t
L0VsZW1lbnQuY3BwOgorICAgICAgICAgKFdlYkNvcmU6OkVsZW1lbnQ6OnNldEF0dHJpYnV0ZSk6
IENhbGwgQXRvbWljU3RyaW5nOjpsb3dlcigpCisgICAgICAgICAqIGRvbS9RdWFsaWZpZWROYW1l
LmNwcDoKKyAgICAgICAgIChXZWJDb3JlOjpRdWFsaWZpZWROYW1lOjpsb2NhbE5hbWVVcHBlcik6
IE5ldyBtZXRob2QKKyAgICAgICAgICogZG9tL1F1YWxpZmllZE5hbWUuaDogQWRkZWQgbG9jYWxO
YW1lVXBwZXIoKSBtZXRob2QKKyAgICAgICAgICogZG9tL1N0eWxlZEVsZW1lbnQuY3BwOgorICAg
ICAgICAgKFdlYkNvcmU6OlN0eWxlZEVsZW1lbnQ6OnBhcnNlTWFwcGVkQXR0cmlidXRlKTogIENh
bGwgQXRvbWljU3RyaW5nOjpsb3dlcigpCisgICAgICAgICAqIGh0bWwvSFRNTERvY3VtZW50LmNw
cDoKKyAgICAgICAgIChXZWJDb3JlOjpIVE1MRG9jdW1lbnQ6OmNyZWF0ZUVsZW1lbnQpOiBDYWxs
IEF0b21pY1N0cmluZzo6bG93ZXIoKQorICAgICAgICAgKiBodG1sL0hUTUxFbGVtZW50LmNwcDoK
KyAgICAgICAgIChXZWJDb3JlOjpIVE1MRWxlbWVudDo6bm9kZU5hbWUpOiBDYWxsIGxvY2FsTmFt
ZVVwcGVyKCkKKyAgICAgICAgICogcGxhdGZvcm0vdGV4dC9BdG9taWNTdHJpbmcuY3BwOgorICAg
ICAgICAgKFdlYkNvcmU6OkF0b21pY1N0cmluZzo6bG93ZXIpOiBOZXcgbWV0aG9kCisgICAgICAg
ICAoV2ViQ29yZTo6QXRvbWljU3RyaW5nOjp1cHBlcik6IE5ldyBtZXRob2QKKyAgICAgICAgICog
cGxhdGZvcm0vdGV4dC9BdG9taWNTdHJpbmcuaDogQWRkZWQgbG93ZXIoKSBhbmQgdXBwZXIoKQor
ICAgICAgICAgKiBwbGF0Zm9ybS90ZXh0L1N0cmluZ0ltcGwuY3BwOiBSZW1vdmVkIGlzTG93ZXIo
KQorICAgICAgICAgKFdlYkNvcmU6OlN0cmluZ0ltcGw6Omxvd2VyKTogRnVydGhlciBvcHRpbWl6
YXRpb24gb2YgaW5pdGlhbCBsb29wCisgICAgICAgICAqIHBsYXRmb3JtL3RleHQvU3RyaW5nSW1w
bC5oOiBSZW1vdmVkIGlzTG93ZXIoKQorIAogMjAwOS0xMC0xMyAgQnJpYW4gV2VpbnN0ZWluICA8
YndlaW5zdGVpbkBhcHBsZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgUGF2ZWwgRmVsZG1h
bi4KSW5kZXg6IFdlYkNvcmUvZG9tL0VsZW1lbnQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUv
ZG9tL0VsZW1lbnQuY3BwCShyZXZpc2lvbiA0OTUwNikKKysrIFdlYkNvcmUvZG9tL0VsZW1lbnQu
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC01MTUsNyArNTE1LDcgQEAgdm9pZCBFbGVtZW50OjpzZXRB
dHRyaWJ1dGUoY29uc3QgQXRvbWljUwogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgY29u
c3QgQXRvbWljU3RyaW5nJiBsb2NhbE5hbWUgPSAoc2hvdWxkSWdub3JlQXR0cmlidXRlQ2FzZSh0
aGlzKSAmJiAhbmFtZS5zdHJpbmcoKS5pbXBsKCktPmlzTG93ZXIoKSkgPyBBdG9taWNTdHJpbmco
bmFtZS5zdHJpbmcoKS5sb3dlcigpKSA6IG5hbWU7CisgICAgY29uc3QgQXRvbWljU3RyaW5nJiBs
b2NhbE5hbWUgPSBzaG91bGRJZ25vcmVBdHRyaWJ1dGVDYXNlKHRoaXMpID8gbmFtZS5sb3dlcigp
IDogbmFtZTsKIAogICAgIC8vIGFsbG9jYXRlIGF0dHJpYnV0ZW1hcCBpZiBuZWNlc3NhcnkKICAg
ICBBdHRyaWJ1dGUqIG9sZCA9IGF0dHJpYnV0ZXMoZmFsc2UpLT5nZXRBdHRyaWJ1dGVJdGVtKGxv
Y2FsTmFtZSwgZmFsc2UpOwpJbmRleDogV2ViQ29yZS9kb20vUXVhbGlmaWVkTmFtZS5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViQ29yZS9kb20vUXVhbGlmaWVkTmFtZS5jcHAJKHJldmlzaW9uIDQ5NTA2
KQorKysgV2ViQ29yZS9kb20vUXVhbGlmaWVkTmFtZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTk3
LDQgKzk3LDExIEBAIHZvaWQgUXVhbGlmaWVkTmFtZTo6aW5pdCgpCiAgICAgfQogfQogCitjb25z
dCBBdG9taWNTdHJpbmcmIFF1YWxpZmllZE5hbWU6OmxvY2FsTmFtZVVwcGVyKCkgY29uc3QKK3sK
KyAgICBpZiAoIW1faW1wbC0+bV9sb2NhbE5hbWVVcHBlcikKKyAgICAgICAgbV9pbXBsLT5tX2xv
Y2FsTmFtZVVwcGVyID0gbV9pbXBsLT5tX2xvY2FsTmFtZS51cHBlcigpOworICAgIHJldHVybiBt
X2ltcGwtPm1fbG9jYWxOYW1lVXBwZXI7Cit9CisKIH0KSW5kZXg6IFdlYkNvcmUvZG9tL1F1YWxp
ZmllZE5hbWUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2RvbS9RdWFsaWZpZWROYW1lLmgJKHJl
dmlzaW9uIDQ5NTA2KQorKysgV2ViQ29yZS9kb20vUXVhbGlmaWVkTmFtZS5oCSh3b3JraW5nIGNv
cHkpCkBAIC00MSw5ICs0MSwxMCBAQCBwdWJsaWM6CiAgICAgICAgICAgICByZXR1cm4gYWRvcHRS
ZWYobmV3IFF1YWxpZmllZE5hbWVJbXBsKHByZWZpeCwgbG9jYWxOYW1lLCBuYW1lc3BhY2VVUkkp
KTsKICAgICAgICAgfQogCi0gICAgICAgIEF0b21pY1N0cmluZyBtX3ByZWZpeDsKLSAgICAgICAg
QXRvbWljU3RyaW5nIG1fbG9jYWxOYW1lOwotICAgICAgICBBdG9taWNTdHJpbmcgbV9uYW1lc3Bh
Y2U7CisgICAgICAgIGNvbnN0IEF0b21pY1N0cmluZyBtX3ByZWZpeDsKKyAgICAgICAgY29uc3Qg
QXRvbWljU3RyaW5nIG1fbG9jYWxOYW1lOworICAgICAgICBjb25zdCBBdG9taWNTdHJpbmcgbV9u
YW1lc3BhY2U7CisgICAgICAgIG11dGFibGUgQXRvbWljU3RyaW5nIG1fbG9jYWxOYW1lVXBwZXI7
CiAKICAgICBwcml2YXRlOgogICAgICAgICBRdWFsaWZpZWROYW1lSW1wbChjb25zdCBBdG9taWNT
dHJpbmcmIHByZWZpeCwgY29uc3QgQXRvbWljU3RyaW5nJiBsb2NhbE5hbWUsIGNvbnN0IEF0b21p
Y1N0cmluZyYgbmFtZXNwYWNlVVJJKQpAQCAtNzYsNiArNzcsOSBAQCBwdWJsaWM6CiAgICAgY29u
c3QgQXRvbWljU3RyaW5nJiBsb2NhbE5hbWUoKSBjb25zdCB7IHJldHVybiBtX2ltcGwtPm1fbG9j
YWxOYW1lOyB9CiAgICAgY29uc3QgQXRvbWljU3RyaW5nJiBuYW1lc3BhY2VVUkkoKSBjb25zdCB7
IHJldHVybiBtX2ltcGwtPm1fbmFtZXNwYWNlOyB9CiAKKyAgICAvLyBVcHBlcmNhc2VkIGxvY2Fs
TmFtZSwgY2FjaGVkIGZvciBlZmZpY2llbmN5CisgICAgY29uc3QgQXRvbWljU3RyaW5nJiBsb2Nh
bE5hbWVVcHBlcigpIGNvbnN0OworCiAgICAgU3RyaW5nIHRvU3RyaW5nKCkgY29uc3Q7CiAKICAg
ICBRdWFsaWZpZWROYW1lSW1wbCogaW1wbCgpIGNvbnN0IHsgcmV0dXJuIG1faW1wbDsgfQpJbmRl
eDogV2ViQ29yZS9kb20vU3R5bGVkRWxlbWVudC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9k
b20vU3R5bGVkRWxlbWVudC5jcHAJKHJldmlzaW9uIDQ5NTA2KQorKysgV2ViQ29yZS9kb20vU3R5
bGVkRWxlbWVudC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI0MCw4ICsyNDAsOCBAQCB2b2lkIFN0
eWxlZEVsZW1lbnQ6OnBhcnNlTWFwcGVkQXR0cmlidXRlCiAgICAgICAgIGlmIChuYW1lZEF0dHJN
YXApIHsKICAgICAgICAgICAgIGlmIChhdHRyLT5pc051bGwoKSkKICAgICAgICAgICAgICAgICBu
YW1lZEF0dHJNYXAtPnNldElEKG51bGxBdG9tKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKGRvY3Vt
ZW50KCktPmluQ29tcGF0TW9kZSgpICYmICFhdHRyLT52YWx1ZSgpLmltcGwoKS0+aXNMb3dlcigp
KQotICAgICAgICAgICAgICAgIG5hbWVkQXR0ck1hcC0+c2V0SUQoQXRvbWljU3RyaW5nKGF0dHIt
PnZhbHVlKCkuc3RyaW5nKCkubG93ZXIoKSkpOworICAgICAgICAgICAgZWxzZSBpZiAoZG9jdW1l
bnQoKS0+aW5Db21wYXRNb2RlKCkpCisgICAgICAgICAgICAgICAgbmFtZWRBdHRyTWFwLT5zZXRJ
RChhdHRyLT52YWx1ZSgpLmxvd2VyKCkpOwogICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAg
ICAgIG5hbWVkQXR0ck1hcC0+c2V0SUQoYXR0ci0+dmFsdWUoKSk7CiAgICAgICAgIH0KSW5kZXg6
IFdlYkNvcmUvaHRtbC9IVE1MRG9jdW1lbnQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvaHRt
bC9IVE1MRG9jdW1lbnQuY3BwCShyZXZpc2lvbiA0OTUwNikKKysrIFdlYkNvcmUvaHRtbC9IVE1M
RG9jdW1lbnQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMDcsOCArMzA3LDcgQEAgUGFzc1JlZlB0
cjxFbGVtZW50PiBIVE1MRG9jdW1lbnQ6OmNyZWF0ZQogICAgICAgICBlYyA9IElOVkFMSURfQ0hB
UkFDVEVSX0VSUjsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQotICAgIEF0b21pY1N0cmluZyBs
b3dlck5hbWUgPSBuYW1lLnN0cmluZygpLmltcGwoKS0+aXNMb3dlcigpID8gbmFtZSA6IEF0b21p
Y1N0cmluZyhuYW1lLnN0cmluZygpLmxvd2VyKCkpOwotICAgIHJldHVybiBIVE1MRWxlbWVudEZh
Y3Rvcnk6OmNyZWF0ZUhUTUxFbGVtZW50KFF1YWxpZmllZE5hbWUobnVsbEF0b20sIGxvd2VyTmFt
ZSwgeGh0bWxOYW1lc3BhY2VVUkkpLCB0aGlzLCAwLCBmYWxzZSk7CisgICAgcmV0dXJuIEhUTUxF
bGVtZW50RmFjdG9yeTo6Y3JlYXRlSFRNTEVsZW1lbnQoUXVhbGlmaWVkTmFtZShudWxsQXRvbSwg
bmFtZS5sb3dlcigpLCB4aHRtbE5hbWVzcGFjZVVSSSksIHRoaXMsIDAsIGZhbHNlKTsKIH0KIAog
c3RhdGljIHZvaWQgYWRkSXRlbVRvTWFwKEhhc2hDb3VudGVkU2V0PEF0b21pY1N0cmluZ0ltcGwq
PiYgbWFwLCBjb25zdCBBdG9taWNTdHJpbmcmIG5hbWUpCkluZGV4OiBXZWJDb3JlL2h0bWwvSFRN
TEVsZW1lbnQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvaHRtbC9IVE1MRWxlbWVudC5jcHAJ
KHJldmlzaW9uIDQ5NTA2KQorKysgV2ViQ29yZS9odG1sL0hUTUxFbGVtZW50LmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtNjcsNyArNjcsNyBAQCBTdHJpbmcgSFRNTEVsZW1lbnQ6Om5vZGVOYW1lKCkg
Y29uc3QKICAgICAvLyB0aGUgc3RyaW5nIG9uIGEgaGl0IGluIHRoZSBoYXNoLgogICAgIC8vIEZJ
WE1FOiBXZSBzaG91bGQgaGF2ZSBhIHdheSB0byBkZXRlY3QgWEhUTUwgZWxlbWVudHMgYW5kIHJl
cGxhY2UgdGhlIGhhc1ByZWZpeCgpIGNoZWNrIHdpdGggaXQuCiAgICAgaWYgKGRvY3VtZW50KCkt
PmlzSFRNTERvY3VtZW50KCkgJiYgIXRhZ1FOYW1lKCkuaGFzUHJlZml4KCkpCi0gICAgICAgIHJl
dHVybiB0YWdRTmFtZSgpLmxvY2FsTmFtZSgpLnN0cmluZygpLnVwcGVyKCk7CisgICAgICAgIHJl
dHVybiB0YWdRTmFtZSgpLmxvY2FsTmFtZVVwcGVyKCk7CiAgICAgcmV0dXJuIEVsZW1lbnQ6Om5v
ZGVOYW1lKCk7CiB9CiAgICAgCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL3RleHQvQXRvbWljU3Ry
aW5nLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL3RleHQvQXRvbWljU3RyaW5n
LmNwcAkocmV2aXNpb24gNDk1MDYpCisrKyBXZWJDb3JlL3BsYXRmb3JtL3RleHQvQXRvbWljU3Ry
aW5nLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjI4LDYgKzIyOCwxNiBAQCB2b2lkIEF0b21pY1N0
cmluZzo6cmVtb3ZlKFN0cmluZ0ltcGwqIHIpCiB7CiAgICAgc3RyaW5nVGFibGUoKS5yZW1vdmUo
cik7CiB9CisgICAgCitBdG9taWNTdHJpbmcgQXRvbWljU3RyaW5nOjpsb3dlcigpIGNvbnN0Cit7
CisgICAgLy8gTm90ZTogVGhpcyBpcyBhIGhvdCBmdW5jdGlvbiBpbiB0aGUgRHJvbWFlbyBiZW5j
aG1hcmsuCisgICAgU3RyaW5nSW1wbCAqbXlJbXBsID0gaW1wbCgpOworICAgIFJlZlB0cjxTdHJp
bmdJbXBsPiBuZXdJbXBsID0gbXlJbXBsLT5sb3dlcigpOworICAgIGlmIChMSUtFTFkobmV3SW1w
bCA9PSBteUltcGwpKQorICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgcmV0dXJuIEF0b21pY1N0
cmluZyhuZXdJbXBsKTsKK30KIAogI2lmIFVTRShKU0MpCiBQYXNzUmVmUHRyPFN0cmluZ0ltcGw+
IEF0b21pY1N0cmluZzo6YWRkKGNvbnN0IEpTQzo6SWRlbnRpZmllciYgaWRlbnRpZmllcikKSW5k
ZXg6IFdlYkNvcmUvcGxhdGZvcm0vdGV4dC9BdG9taWNTdHJpbmcuaAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBX
ZWJDb3JlL3BsYXRmb3JtL3RleHQvQXRvbWljU3RyaW5nLmgJKHJldmlzaW9uIDQ5NTA2KQorKysg
V2ViQ29yZS9wbGF0Zm9ybS90ZXh0L0F0b21pY1N0cmluZy5oCSh3b3JraW5nIGNvcHkpCkBAIC04
Myw2ICs4Myw5IEBAIHB1YmxpYzoKICAgICBib29sIGVuZHNXaXRoKGNvbnN0IFN0cmluZyYgcywg
Ym9vbCBjYXNlU2Vuc2l0aXZlID0gdHJ1ZSkgY29uc3QKICAgICAgICAgeyByZXR1cm4gbV9zdHJp
bmcuZW5kc1dpdGgocywgY2FzZVNlbnNpdGl2ZSk7IH0KICAgICAKKyAgICBBdG9taWNTdHJpbmcg
bG93ZXIoKSBjb25zdDsKKyAgICBBdG9taWNTdHJpbmcgdXBwZXIoKSBjb25zdCB7IHJldHVybiBB
dG9taWNTdHJpbmcoaW1wbCgpLT51cHBlcigpKTsgfQorICAgIAogICAgIGludCB0b0ludChib29s
KiBvayA9IDApIGNvbnN0IHsgcmV0dXJuIG1fc3RyaW5nLnRvSW50KG9rKTsgfQogICAgIGRvdWJs
ZSB0b0RvdWJsZShib29sKiBvayA9IDApIGNvbnN0IHsgcmV0dXJuIG1fc3RyaW5nLnRvRG91Ymxl
KG9rKTsgfQogICAgIGZsb2F0IHRvRmxvYXQoYm9vbCogb2sgPSAwKSBjb25zdCB7IHJldHVybiBt
X3N0cmluZy50b0Zsb2F0KG9rKTsgfQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS90ZXh0L1N0cmlu
Z0ltcGwuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vdGV4dC9TdHJpbmdJbXBs
LmNwcAkocmV2aXNpb24gNDk1MDYpCisrKyBXZWJDb3JlL3BsYXRmb3JtL3RleHQvU3RyaW5nSW1w
bC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTE0OSw0NiArMTQ5LDI1IEBAIFVDaGFyMzIgU3RyaW5n
SW1wbDo6Y2hhcmFjdGVyU3RhcnRpbmdBdCgKICAgICByZXR1cm4gMDsKIH0KIAotYm9vbCBTdHJp
bmdJbXBsOjppc0xvd2VyKCkKLXsKLSAgICAvLyBEbyBhIGZhc3RlciBsb29wIGZvciB0aGUgY2Fz
ZSB3aGVyZSBhbGwgdGhlIGNoYXJhY3RlcnMgYXJlIEFTQ0lJLgotICAgIGJvb2wgYWxsTG93ZXIg
PSB0cnVlOwotICAgIFVDaGFyIG9yZWQgPSAwOwotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkg
PCBtX2xlbmd0aDsgaSsrKSB7Ci0gICAgICAgIFVDaGFyIGMgPSBtX2RhdGFbaV07Ci0gICAgICAg
IGFsbExvd2VyID0gYWxsTG93ZXIgJiYgaXNBU0NJSUxvd2VyKGMpOwotICAgICAgICBvcmVkIHw9
IGM7Ci0gICAgfQotICAgIGlmICghKG9yZWQgJiB+MHg3RikpCi0gICAgICAgIHJldHVybiBhbGxM
b3dlcjsKLQotICAgIC8vIERvIGEgc2xvd2VyIGNoZWNrIGZvciBjYXNlcyB0aGF0IGluY2x1ZGUg
bm9uLUFTQ0lJIGNoYXJhY3RlcnMuCi0gICAgYWxsTG93ZXIgPSB0cnVlOwotICAgIHVuc2lnbmVk
IGkgPSAwOwotICAgIHdoaWxlIChpIDwgbV9sZW5ndGgpIHsKLSAgICAgICAgVUNoYXIzMiBjaGFy
YWN0ZXI7Ci0gICAgICAgIFUxNl9ORVhUKG1fZGF0YSwgaSwgbV9sZW5ndGgsIGNoYXJhY3RlcikK
LSAgICAgICAgYWxsTG93ZXIgPSBhbGxMb3dlciAmJiBVbmljb2RlOjppc0xvd2VyKGNoYXJhY3Rl
cik7Ci0gICAgfQotICAgIHJldHVybiBhbGxMb3dlcjsKLX0KLQogUGFzc1JlZlB0cjxTdHJpbmdJ
bXBsPiBTdHJpbmdJbXBsOjpsb3dlcigpCiB7CisgICAgLy8gTm90ZTogVGhpcyBpcyBhIGhvdCBm
dW5jdGlvbiBpbiB0aGUgRHJvbWFlbyBiZW5jaG1hcmssIHNwZWNpZmljYWxseSB0aGUKKyAgICAv
LyBuby1vcCBjb2RlIHBhdGggdXAgdGhyb3VnaCB0aGUgZmlyc3QgJ3JldHVybicgc3RhdGVtZW50
LgorICAgIAogICAgIC8vIEZpcnN0IHNjYW4gdGhlIHN0cmluZyBmb3IgdXBwZXJjYXNlIGFuZCBu
b24tQVNDSUkgY2hhcmFjdGVyczoKLSAgICBpbnQzMl90IGxlbmd0aCA9IG1fbGVuZ3RoOwogICAg
IFVDaGFyIG9yZWQgPSAwOwogICAgIGJvb2wgbm9VcHBlciA9IHRydWU7Ci0gICAgZm9yIChpbnQg
aSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotICAgICAgICBVQ2hhciBjID0gbV9kYXRhW2ldOwot
ICAgICAgICBvcmVkIHw9IGM7Ci0gICAgICAgIG5vVXBwZXIgPSBub1VwcGVyICYmICFpc0FTQ0lJ
VXBwZXIoYyk7CisgICAgZm9yIChjb25zdCBVQ2hhciogY2hwID0gbV9kYXRhLCAqZW5kID0gbV9k
YXRhICsgbV9sZW5ndGg7IGNocCAhPSBlbmQ7IGNocCsrKSB7CisgICAgICAgIGlmIChVTkxJS0VM
WShpc0FTQ0lJVXBwZXIoKmNocCkpKQorICAgICAgICAgICAgbm9VcHBlciA9IGZhbHNlOworICAg
ICAgICBvcmVkIHw9ICpjaHA7CiAgICAgfQogICAgIAogICAgIC8vIE5vdGhpbmcgdG8gZG8gaWYg
dGhlIHN0cmluZyBpcyBhbGwgQVNDSUkgd2l0aCBubyB1cHBlcmNhc2UuCiAgICAgaWYgKG5vVXBw
ZXIgJiYgIShvcmVkICYgfjB4N0YpKQogICAgICAgICByZXR1cm4gdGhpczsKIAorICAgIGludDMy
X3QgbGVuZ3RoID0gbV9sZW5ndGg7CiAgICAgVUNoYXIqIGRhdGE7CiAgICAgUmVmUHRyPFN0cmlu
Z0ltcGw+IG5ld0ltcGwgPSBjcmVhdGVVbmluaXRpYWxpemVkKG1fbGVuZ3RoLCBkYXRhKTsKIApJ
bmRleDogV2ViQ29yZS9wbGF0Zm9ybS90ZXh0L1N0cmluZ0ltcGwuaAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBX
ZWJDb3JlL3BsYXRmb3JtL3RleHQvU3RyaW5nSW1wbC5oCShyZXZpc2lvbiA0OTUwNikKKysrIFdl
YkNvcmUvcGxhdGZvcm0vdGV4dC9TdHJpbmdJbXBsLmgJKHdvcmtpbmcgY29weSkKQEAgLTEzNSw3
ICsxMzUsNiBAQCBwdWJsaWM6CiAgICAgZG91YmxlIHRvRG91YmxlKGJvb2wqIG9rID0gMCk7CiAg
ICAgZmxvYXQgdG9GbG9hdChib29sKiBvayA9IDApOwogCi0gICAgYm9vbCBpc0xvd2VyKCk7CiAg
ICAgUGFzc1JlZlB0cjxTdHJpbmdJbXBsPiBsb3dlcigpOwogICAgIFBhc3NSZWZQdHI8U3RyaW5n
SW1wbD4gdXBwZXIoKTsKICAgICBQYXNzUmVmUHRyPFN0cmluZ0ltcGw+IHNlY3VyZShVQ2hhciBh
Q2hhcik7Cg==
</data>
<flag name="review"
          id="22452"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>41136</attachid>
            <date>2009-10-13 16:18:58 -0700</date>
            <delta_ts>2009-10-19 12:11:44 -0700</delta_ts>
            <desc>patch 3</desc>
            <filename>upperLowerOpt.patch</filename>
            <type>text/plain</type>
            <size>9941</size>
            <attacher name="Jens Alfke">jens</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA0OTUyMSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMzUgQEAKKzIwMDktMTAtMTIgIEplbnMgQWxma2UgIDxqZW5zQG1vb3NleWFyZC5j
b20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgT3B0
aW1pemUgc3RyaW5nIHVwcGVyL2xvd2VyY2FzaW5nCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zMDI2MQorICAgICAgICAKKyAgICAgICAgLSBBZGRlZCBB
dG9taWNTdHJpbmc6OnVwcGVyKCkgYW5kIGxvd2VyKCkKKyAgICAgICAgLSBGdXJ0aGVyIG9wdGlt
aXplZCBTdHJpbmdJbXBsOjpsb3dlcigpCisgICAgICAgIC0gUmVtb3ZlZCBTdHJpbmdJbXBsOjpp
c0xvd2VyKCkKKyAgICAgICAgLSBBZGRlZCBRdWFsaWZpZWROYW1lOjpsb2NhbE5hbWVVcHBlcigp
LCB3aGljaCBpcyBjYWNoZWQsIHRoZXJlYnkgc2F2aW5nCisgICAgICAgICAgdGhvdXNhbmRzIG9m
IHVwcGVyKCkgY2FsbHMgYW5kIHN0cmluZyBhbGxvY2F0aW9ucy4KKyAKKyAgICAgICAgICogZG9t
L0VsZW1lbnQuY3BwOgorICAgICAgICAgKFdlYkNvcmU6OkVsZW1lbnQ6OnNldEF0dHJpYnV0ZSk6
IENhbGwgQXRvbWljU3RyaW5nOjpsb3dlcigpCisgICAgICAgICAqIGRvbS9RdWFsaWZpZWROYW1l
LmNwcDoKKyAgICAgICAgIChXZWJDb3JlOjpRdWFsaWZpZWROYW1lOjpsb2NhbE5hbWVVcHBlcik6
IE5ldyBtZXRob2QKKyAgICAgICAgICogZG9tL1F1YWxpZmllZE5hbWUuaDogQWRkZWQgbG9jYWxO
YW1lVXBwZXIoKSBtZXRob2QKKyAgICAgICAgICogZG9tL1N0eWxlZEVsZW1lbnQuY3BwOgorICAg
ICAgICAgKFdlYkNvcmU6OlN0eWxlZEVsZW1lbnQ6OnBhcnNlTWFwcGVkQXR0cmlidXRlKTogIENh
bGwgQXRvbWljU3RyaW5nOjpsb3dlcigpCisgICAgICAgICAqIGh0bWwvSFRNTERvY3VtZW50LmNw
cDoKKyAgICAgICAgIChXZWJDb3JlOjpIVE1MRG9jdW1lbnQ6OmNyZWF0ZUVsZW1lbnQpOiBDYWxs
IEF0b21pY1N0cmluZzo6bG93ZXIoKQorICAgICAgICAgKiBodG1sL0hUTUxFbGVtZW50LmNwcDoK
KyAgICAgICAgIChXZWJDb3JlOjpIVE1MRWxlbWVudDo6bm9kZU5hbWUpOiBDYWxsIGxvY2FsTmFt
ZVVwcGVyKCkKKyAgICAgICAgICogcGxhdGZvcm0vdGV4dC9BdG9taWNTdHJpbmcuY3BwOgorICAg
ICAgICAgKFdlYkNvcmU6OkF0b21pY1N0cmluZzo6bG93ZXIpOiBOZXcgbWV0aG9kCisgICAgICAg
ICAoV2ViQ29yZTo6QXRvbWljU3RyaW5nOjp1cHBlcik6IE5ldyBtZXRob2QKKyAgICAgICAgICog
cGxhdGZvcm0vdGV4dC9BdG9taWNTdHJpbmcuaDogQWRkZWQgbG93ZXIoKSBhbmQgdXBwZXIoKQor
ICAgICAgICAgKiBwbGF0Zm9ybS90ZXh0L1N0cmluZ0ltcGwuY3BwOiBSZW1vdmVkIGlzTG93ZXIo
KQorICAgICAgICAgKFdlYkNvcmU6OlN0cmluZ0ltcGw6Omxvd2VyKTogRnVydGhlciBvcHRpbWl6
YXRpb24gb2YgaW5pdGlhbCBsb29wCisgICAgICAgICAqIHBsYXRmb3JtL3RleHQvU3RyaW5nSW1w
bC5oOiBSZW1vdmVkIGlzTG93ZXIoKQorIAogMjAwOS0xMC0xMyAgU2ltb24gRnJhc2VyICA8c2lt
b24uZnJhc2VyQGFwcGxlLmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBieSBEYW4gQmVybnN0ZWlu
LgpJbmRleDogV2ViQ29yZS9kb20vRWxlbWVudC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9k
b20vRWxlbWVudC5jcHAJKHJldmlzaW9uIDQ5NTIxKQorKysgV2ViQ29yZS9kb20vRWxlbWVudC5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTUxNSw3ICs1MTUsNyBAQCB2b2lkIEVsZW1lbnQ6OnNldEF0
dHJpYnV0ZShjb25zdCBBdG9taWNTCiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBjb25z
dCBBdG9taWNTdHJpbmcmIGxvY2FsTmFtZSA9IChzaG91bGRJZ25vcmVBdHRyaWJ1dGVDYXNlKHRo
aXMpICYmICFuYW1lLnN0cmluZygpLmltcGwoKS0+aXNMb3dlcigpKSA/IEF0b21pY1N0cmluZyhu
YW1lLnN0cmluZygpLmxvd2VyKCkpIDogbmFtZTsKKyAgICBjb25zdCBBdG9taWNTdHJpbmcmIGxv
Y2FsTmFtZSA9IHNob3VsZElnbm9yZUF0dHJpYnV0ZUNhc2UodGhpcykgPyBuYW1lLmxvd2VyKCkg
OiBuYW1lOwogCiAgICAgLy8gYWxsb2NhdGUgYXR0cmlidXRlbWFwIGlmIG5lY2Vzc2FyeQogICAg
IEF0dHJpYnV0ZSogb2xkID0gYXR0cmlidXRlcyhmYWxzZSktPmdldEF0dHJpYnV0ZUl0ZW0obG9j
YWxOYW1lLCBmYWxzZSk7CkluZGV4OiBXZWJDb3JlL2RvbS9RdWFsaWZpZWROYW1lLmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBXZWJDb3JlL2RvbS9RdWFsaWZpZWROYW1lLmNwcAkocmV2aXNpb24gNDk1MjEp
CisrKyBXZWJDb3JlL2RvbS9RdWFsaWZpZWROYW1lLmNwcAkod29ya2luZyBjb3B5KQpAQCAtOTcs
NCArOTcsMTEgQEAgdm9pZCBRdWFsaWZpZWROYW1lOjppbml0KCkKICAgICB9CiB9CiAKK2NvbnN0
IEF0b21pY1N0cmluZyYgUXVhbGlmaWVkTmFtZTo6bG9jYWxOYW1lVXBwZXIoKSBjb25zdAorewor
ICAgIGlmICghbV9pbXBsLT5tX2xvY2FsTmFtZVVwcGVyKQorICAgICAgICBtX2ltcGwtPm1fbG9j
YWxOYW1lVXBwZXIgPSBtX2ltcGwtPm1fbG9jYWxOYW1lLnVwcGVyKCk7CisgICAgcmV0dXJuIG1f
aW1wbC0+bV9sb2NhbE5hbWVVcHBlcjsKK30KKwogfQpJbmRleDogV2ViQ29yZS9kb20vUXVhbGlm
aWVkTmFtZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvZG9tL1F1YWxpZmllZE5hbWUuaAkocmV2
aXNpb24gNDk1MjEpCisrKyBXZWJDb3JlL2RvbS9RdWFsaWZpZWROYW1lLmgJKHdvcmtpbmcgY29w
eSkKQEAgLTQxLDkgKzQxLDEwIEBAIHB1YmxpYzoKICAgICAgICAgICAgIHJldHVybiBhZG9wdFJl
ZihuZXcgUXVhbGlmaWVkTmFtZUltcGwocHJlZml4LCBsb2NhbE5hbWUsIG5hbWVzcGFjZVVSSSkp
OwogICAgICAgICB9CiAKLSAgICAgICAgQXRvbWljU3RyaW5nIG1fcHJlZml4OwotICAgICAgICBB
dG9taWNTdHJpbmcgbV9sb2NhbE5hbWU7Ci0gICAgICAgIEF0b21pY1N0cmluZyBtX25hbWVzcGFj
ZTsKKyAgICAgICAgY29uc3QgQXRvbWljU3RyaW5nIG1fcHJlZml4OworICAgICAgICBjb25zdCBB
dG9taWNTdHJpbmcgbV9sb2NhbE5hbWU7CisgICAgICAgIGNvbnN0IEF0b21pY1N0cmluZyBtX25h
bWVzcGFjZTsKKyAgICAgICAgbXV0YWJsZSBBdG9taWNTdHJpbmcgbV9sb2NhbE5hbWVVcHBlcjsK
IAogICAgIHByaXZhdGU6CiAgICAgICAgIFF1YWxpZmllZE5hbWVJbXBsKGNvbnN0IEF0b21pY1N0
cmluZyYgcHJlZml4LCBjb25zdCBBdG9taWNTdHJpbmcmIGxvY2FsTmFtZSwgY29uc3QgQXRvbWlj
U3RyaW5nJiBuYW1lc3BhY2VVUkkpCkBAIC03Niw2ICs3Nyw5IEBAIHB1YmxpYzoKICAgICBjb25z
dCBBdG9taWNTdHJpbmcmIGxvY2FsTmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1faW1wbC0+bV9sb2Nh
bE5hbWU7IH0KICAgICBjb25zdCBBdG9taWNTdHJpbmcmIG5hbWVzcGFjZVVSSSgpIGNvbnN0IHsg
cmV0dXJuIG1faW1wbC0+bV9uYW1lc3BhY2U7IH0KIAorICAgIC8vIFVwcGVyY2FzZWQgbG9jYWxO
YW1lLCBjYWNoZWQgZm9yIGVmZmljaWVuY3kKKyAgICBjb25zdCBBdG9taWNTdHJpbmcmIGxvY2Fs
TmFtZVVwcGVyKCkgY29uc3Q7CisKICAgICBTdHJpbmcgdG9TdHJpbmcoKSBjb25zdDsKIAogICAg
IFF1YWxpZmllZE5hbWVJbXBsKiBpbXBsKCkgY29uc3QgeyByZXR1cm4gbV9pbXBsOyB9CkluZGV4
OiBXZWJDb3JlL2RvbS9TdHlsZWRFbGVtZW50LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2Rv
bS9TdHlsZWRFbGVtZW50LmNwcAkocmV2aXNpb24gNDk1MjEpCisrKyBXZWJDb3JlL2RvbS9TdHls
ZWRFbGVtZW50LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjQwLDggKzI0MCw4IEBAIHZvaWQgU3R5
bGVkRWxlbWVudDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUKICAgICAgICAgaWYgKG5hbWVkQXR0ck1h
cCkgewogICAgICAgICAgICAgaWYgKGF0dHItPmlzTnVsbCgpKQogICAgICAgICAgICAgICAgIG5h
bWVkQXR0ck1hcC0+c2V0SUQobnVsbEF0b20pOwotICAgICAgICAgICAgZWxzZSBpZiAoZG9jdW1l
bnQoKS0+aW5Db21wYXRNb2RlKCkgJiYgIWF0dHItPnZhbHVlKCkuaW1wbCgpLT5pc0xvd2VyKCkp
Ci0gICAgICAgICAgICAgICAgbmFtZWRBdHRyTWFwLT5zZXRJRChBdG9taWNTdHJpbmcoYXR0ci0+
dmFsdWUoKS5zdHJpbmcoKS5sb3dlcigpKSk7CisgICAgICAgICAgICBlbHNlIGlmIChkb2N1bWVu
dCgpLT5pbkNvbXBhdE1vZGUoKSkKKyAgICAgICAgICAgICAgICBuYW1lZEF0dHJNYXAtPnNldElE
KGF0dHItPnZhbHVlKCkubG93ZXIoKSk7CiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAg
ICAgbmFtZWRBdHRyTWFwLT5zZXRJRChhdHRyLT52YWx1ZSgpKTsKICAgICAgICAgfQpJbmRleDog
V2ViQ29yZS9odG1sL0hUTUxEb2N1bWVudC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9odG1s
L0hUTUxEb2N1bWVudC5jcHAJKHJldmlzaW9uIDQ5NTIxKQorKysgV2ViQ29yZS9odG1sL0hUTUxE
b2N1bWVudC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMwNyw4ICszMDcsNyBAQCBQYXNzUmVmUHRy
PEVsZW1lbnQ+IEhUTUxEb2N1bWVudDo6Y3JlYXRlCiAgICAgICAgIGVjID0gSU5WQUxJRF9DSEFS
QUNURVJfRVJSOwogICAgICAgICByZXR1cm4gMDsKICAgICB9Ci0gICAgQXRvbWljU3RyaW5nIGxv
d2VyTmFtZSA9IG5hbWUuc3RyaW5nKCkuaW1wbCgpLT5pc0xvd2VyKCkgPyBuYW1lIDogQXRvbWlj
U3RyaW5nKG5hbWUuc3RyaW5nKCkubG93ZXIoKSk7Ci0gICAgcmV0dXJuIEhUTUxFbGVtZW50RmFj
dG9yeTo6Y3JlYXRlSFRNTEVsZW1lbnQoUXVhbGlmaWVkTmFtZShudWxsQXRvbSwgbG93ZXJOYW1l
LCB4aHRtbE5hbWVzcGFjZVVSSSksIHRoaXMsIDAsIGZhbHNlKTsKKyAgICByZXR1cm4gSFRNTEVs
ZW1lbnRGYWN0b3J5OjpjcmVhdGVIVE1MRWxlbWVudChRdWFsaWZpZWROYW1lKG51bGxBdG9tLCBu
YW1lLmxvd2VyKCksIHhodG1sTmFtZXNwYWNlVVJJKSwgdGhpcywgMCwgZmFsc2UpOwogfQogCiBz
dGF0aWMgdm9pZCBhZGRJdGVtVG9NYXAoSGFzaENvdW50ZWRTZXQ8QXRvbWljU3RyaW5nSW1wbCo+
JiBtYXAsIGNvbnN0IEF0b21pY1N0cmluZyYgbmFtZSkKSW5kZXg6IFdlYkNvcmUvaHRtbC9IVE1M
RWxlbWVudC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9odG1sL0hUTUxFbGVtZW50LmNwcAko
cmV2aXNpb24gNDk1MjEpCisrKyBXZWJDb3JlL2h0bWwvSFRNTEVsZW1lbnQuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC02Nyw3ICs2Nyw3IEBAIFN0cmluZyBIVE1MRWxlbWVudDo6bm9kZU5hbWUoKSBj
b25zdAogICAgIC8vIHRoZSBzdHJpbmcgb24gYSBoaXQgaW4gdGhlIGhhc2guCiAgICAgLy8gRklY
TUU6IFdlIHNob3VsZCBoYXZlIGEgd2F5IHRvIGRldGVjdCBYSFRNTCBlbGVtZW50cyBhbmQgcmVw
bGFjZSB0aGUgaGFzUHJlZml4KCkgY2hlY2sgd2l0aCBpdC4KICAgICBpZiAoZG9jdW1lbnQoKS0+
aXNIVE1MRG9jdW1lbnQoKSAmJiAhdGFnUU5hbWUoKS5oYXNQcmVmaXgoKSkKLSAgICAgICAgcmV0
dXJuIHRhZ1FOYW1lKCkubG9jYWxOYW1lKCkuc3RyaW5nKCkudXBwZXIoKTsKKyAgICAgICAgcmV0
dXJuIHRhZ1FOYW1lKCkubG9jYWxOYW1lVXBwZXIoKTsKICAgICByZXR1cm4gRWxlbWVudDo6bm9k
ZU5hbWUoKTsKIH0KICAgICAKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vdGV4dC9BdG9taWNTdHJp
bmcuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vdGV4dC9BdG9taWNTdHJpbmcu
Y3BwCShyZXZpc2lvbiA0OTUyMSkKKysrIFdlYkNvcmUvcGxhdGZvcm0vdGV4dC9BdG9taWNTdHJp
bmcuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yMjgsNiArMjI4LDE2IEBAIHZvaWQgQXRvbWljU3Ry
aW5nOjpyZW1vdmUoU3RyaW5nSW1wbCogcikKIHsKICAgICBzdHJpbmdUYWJsZSgpLnJlbW92ZShy
KTsKIH0KKyAgICAKK0F0b21pY1N0cmluZyBBdG9taWNTdHJpbmc6Omxvd2VyKCkgY29uc3QKK3sK
KyAgICAvLyBOb3RlOiBUaGlzIGlzIGEgaG90IGZ1bmN0aW9uIGluIHRoZSBEcm9tYWVvIGJlbmNo
bWFyay4KKyAgICBTdHJpbmdJbXBsKiBpbXBsID0gdGhpcy0+aW1wbCgpOworICAgIFJlZlB0cjxT
dHJpbmdJbXBsPiBuZXdJbXBsID0gaW1wbC0+bG93ZXIoKTsKKyAgICBpZiAoTElLRUxZKG5ld0lt
cGwgPT0gaW1wbCkpCisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICByZXR1cm4gQXRvbWljU3Ry
aW5nKG5ld0ltcGwpOworfQogCiAjaWYgVVNFKEpTQykKIFBhc3NSZWZQdHI8U3RyaW5nSW1wbD4g
QXRvbWljU3RyaW5nOjphZGQoY29uc3QgSlNDOjpJZGVudGlmaWVyJiBpZGVudGlmaWVyKQpJbmRl
eDogV2ViQ29yZS9wbGF0Zm9ybS90ZXh0L0F0b21pY1N0cmluZy5oCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdl
YkNvcmUvcGxhdGZvcm0vdGV4dC9BdG9taWNTdHJpbmcuaAkocmV2aXNpb24gNDk1MjEpCisrKyBX
ZWJDb3JlL3BsYXRmb3JtL3RleHQvQXRvbWljU3RyaW5nLmgJKHdvcmtpbmcgY29weSkKQEAgLTgz
LDYgKzgzLDkgQEAgcHVibGljOgogICAgIGJvb2wgZW5kc1dpdGgoY29uc3QgU3RyaW5nJiBzLCBi
b29sIGNhc2VTZW5zaXRpdmUgPSB0cnVlKSBjb25zdAogICAgICAgICB7IHJldHVybiBtX3N0cmlu
Zy5lbmRzV2l0aChzLCBjYXNlU2Vuc2l0aXZlKTsgfQogICAgIAorICAgIEF0b21pY1N0cmluZyBs
b3dlcigpIGNvbnN0OworICAgIEF0b21pY1N0cmluZyB1cHBlcigpIGNvbnN0IHsgcmV0dXJuIEF0
b21pY1N0cmluZyhpbXBsKCktPnVwcGVyKCkpOyB9CisgICAgCiAgICAgaW50IHRvSW50KGJvb2wq
IG9rID0gMCkgY29uc3QgeyByZXR1cm4gbV9zdHJpbmcudG9JbnQob2spOyB9CiAgICAgZG91Ymxl
IHRvRG91YmxlKGJvb2wqIG9rID0gMCkgY29uc3QgeyByZXR1cm4gbV9zdHJpbmcudG9Eb3VibGUo
b2spOyB9CiAgICAgZmxvYXQgdG9GbG9hdChib29sKiBvayA9IDApIGNvbnN0IHsgcmV0dXJuIG1f
c3RyaW5nLnRvRmxvYXQob2spOyB9CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL3RleHQvU3RyaW5n
SW1wbC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS90ZXh0L1N0cmluZ0ltcGwu
Y3BwCShyZXZpc2lvbiA0OTUyMSkKKysrIFdlYkNvcmUvcGxhdGZvcm0vdGV4dC9TdHJpbmdJbXBs
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTQ5LDQ2ICsxNDksMjYgQEAgVUNoYXIzMiBTdHJpbmdJ
bXBsOjpjaGFyYWN0ZXJTdGFydGluZ0F0KAogICAgIHJldHVybiAwOwogfQogCi1ib29sIFN0cmlu
Z0ltcGw6OmlzTG93ZXIoKQotewotICAgIC8vIERvIGEgZmFzdGVyIGxvb3AgZm9yIHRoZSBjYXNl
IHdoZXJlIGFsbCB0aGUgY2hhcmFjdGVycyBhcmUgQVNDSUkuCi0gICAgYm9vbCBhbGxMb3dlciA9
IHRydWU7Ci0gICAgVUNoYXIgb3JlZCA9IDA7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8
IG1fbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgVUNoYXIgYyA9IG1fZGF0YVtpXTsKLSAgICAgICAg
YWxsTG93ZXIgPSBhbGxMb3dlciAmJiBpc0FTQ0lJTG93ZXIoYyk7Ci0gICAgICAgIG9yZWQgfD0g
YzsKLSAgICB9Ci0gICAgaWYgKCEob3JlZCAmIH4weDdGKSkKLSAgICAgICAgcmV0dXJuIGFsbExv
d2VyOwotCi0gICAgLy8gRG8gYSBzbG93ZXIgY2hlY2sgZm9yIGNhc2VzIHRoYXQgaW5jbHVkZSBu
b24tQVNDSUkgY2hhcmFjdGVycy4KLSAgICBhbGxMb3dlciA9IHRydWU7Ci0gICAgdW5zaWduZWQg
aSA9IDA7Ci0gICAgd2hpbGUgKGkgPCBtX2xlbmd0aCkgewotICAgICAgICBVQ2hhcjMyIGNoYXJh
Y3RlcjsKLSAgICAgICAgVTE2X05FWFQobV9kYXRhLCBpLCBtX2xlbmd0aCwgY2hhcmFjdGVyKQot
ICAgICAgICBhbGxMb3dlciA9IGFsbExvd2VyICYmIFVuaWNvZGU6OmlzTG93ZXIoY2hhcmFjdGVy
KTsKLSAgICB9Ci0gICAgcmV0dXJuIGFsbExvd2VyOwotfQotCiBQYXNzUmVmUHRyPFN0cmluZ0lt
cGw+IFN0cmluZ0ltcGw6Omxvd2VyKCkKIHsKKyAgICAvLyBOb3RlOiBUaGlzIGlzIGEgaG90IGZ1
bmN0aW9uIGluIHRoZSBEcm9tYWVvIGJlbmNobWFyaywgc3BlY2lmaWNhbGx5IHRoZQorICAgIC8v
IG5vLW9wIGNvZGUgcGF0aCB1cCB0aHJvdWdoIHRoZSBmaXJzdCAncmV0dXJuJyBzdGF0ZW1lbnQu
CisgICAgCiAgICAgLy8gRmlyc3Qgc2NhbiB0aGUgc3RyaW5nIGZvciB1cHBlcmNhc2UgYW5kIG5v
bi1BU0NJSSBjaGFyYWN0ZXJzOgotICAgIGludDMyX3QgbGVuZ3RoID0gbV9sZW5ndGg7CiAgICAg
VUNoYXIgb3JlZCA9IDA7CiAgICAgYm9vbCBub1VwcGVyID0gdHJ1ZTsKLSAgICBmb3IgKGludCBp
ID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgIFVDaGFyIGMgPSBtX2RhdGFbaV07Ci0g
ICAgICAgIG9yZWQgfD0gYzsKLSAgICAgICAgbm9VcHBlciA9IG5vVXBwZXIgJiYgIWlzQVNDSUlV
cHBlcihjKTsKKyAgICBjb25zdCBVQ2hhciAqZW5kID0gbV9kYXRhICsgbV9sZW5ndGg7CisgICAg
Zm9yIChjb25zdCBVQ2hhciogY2hwID0gbV9kYXRhOyBjaHAgIT0gZW5kOyBjaHArKykgeworICAg
ICAgICBpZiAoVU5MSUtFTFkoaXNBU0NJSVVwcGVyKCpjaHApKSkKKyAgICAgICAgICAgIG5vVXBw
ZXIgPSBmYWxzZTsKKyAgICAgICAgb3JlZCB8PSAqY2hwOwogICAgIH0KICAgICAKICAgICAvLyBO
b3RoaW5nIHRvIGRvIGlmIHRoZSBzdHJpbmcgaXMgYWxsIEFTQ0lJIHdpdGggbm8gdXBwZXJjYXNl
LgogICAgIGlmIChub1VwcGVyICYmICEob3JlZCAmIH4weDdGKSkKICAgICAgICAgcmV0dXJuIHRo
aXM7CiAKKyAgICBpbnQzMl90IGxlbmd0aCA9IG1fbGVuZ3RoOwogICAgIFVDaGFyKiBkYXRhOwog
ICAgIFJlZlB0cjxTdHJpbmdJbXBsPiBuZXdJbXBsID0gY3JlYXRlVW5pbml0aWFsaXplZChtX2xl
bmd0aCwgZGF0YSk7CiAKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vdGV4dC9TdHJpbmdJbXBsLmgK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS90ZXh0L1N0cmluZ0ltcGwuaAkocmV2aXNp
b24gNDk1MjEpCisrKyBXZWJDb3JlL3BsYXRmb3JtL3RleHQvU3RyaW5nSW1wbC5oCSh3b3JraW5n
IGNvcHkpCkBAIC0xMzUsNyArMTM1LDYgQEAgcHVibGljOgogICAgIGRvdWJsZSB0b0RvdWJsZShi
b29sKiBvayA9IDApOwogICAgIGZsb2F0IHRvRmxvYXQoYm9vbCogb2sgPSAwKTsKIAotICAgIGJv
b2wgaXNMb3dlcigpOwogICAgIFBhc3NSZWZQdHI8U3RyaW5nSW1wbD4gbG93ZXIoKTsKICAgICBQ
YXNzUmVmUHRyPFN0cmluZ0ltcGw+IHVwcGVyKCk7CiAgICAgUGFzc1JlZlB0cjxTdHJpbmdJbXBs
PiBzZWN1cmUoVUNoYXIgYUNoYXIpOwo=
</data>

          </attachment>
      

    </bug>

</bugzilla>