<?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>27762</bug_id>
          
          <creation_ts>2009-07-28 05:50:43 -0700</creation_ts>
          <short_desc>[v8] Cache atomic strings in externalized v8 strings</short_desc>
          <delta_ts>2009-08-03 22:42:15 -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>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Christian Plesner Hansen">christian.plesner.hansen</reporter>
          <assigned_to name="David Levin">levin</assigned_to>
          <cc>antonm</cc>
    
    <cc>eric</cc>
    
    <cc>levin</cc>
    
    <cc>sam</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>135169</commentid>
    <comment_count>0</comment_count>
    <who name="Christian Plesner Hansen">christian.plesner.hansen</who>
    <bug_when>2009-07-28 05:50:43 -0700</bug_when>
    <thetext>We currently only cache plain webkit strings in externalized v8 strings and then convert them on demand to atomic strings.  With this change we also cache the atomic strings the first time they are created.

Also, cleaned up some code in the v8 code generator and added a hint that the parameter to getElementById is actually an atomic string.  We may want to do that in more places but I&apos;m leaving that for another changelist.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>135170</commentid>
    <comment_count>1</comment_count>
      <attachid>33618</attachid>
    <who name="Christian Plesner Hansen">christian.plesner.hansen</who>
    <bug_when>2009-07-28 05:52:57 -0700</bug_when>
    <thetext>Created attachment 33618
Initial version</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>135177</commentid>
    <comment_count>2</comment_count>
      <attachid>33620</attachid>
    <who name="Christian Plesner Hansen">christian.plesner.hansen</who>
    <bug_when>2009-07-28 06:34:34 -0700</bug_when>
    <thetext>Created attachment 33620
Updated ChangeLog</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>135187</commentid>
    <comment_count>3</comment_count>
    <who name="anton muhin">antonm</who>
    <bug_when>2009-07-28 06:56:12 -0700</bug_when>
    <thetext>Just a minor comments/questions.

1) Looks like you don&apos;t use HintAtomic and there is no support for it in codegen.  Maybe this change should be just postponed?

2) do we need to store String now?  String(StringImpl*) ctor seems very cheap.  Maybe only store AtomicString even for String (it might though perform a find on creation, but it might benefit us later as most of DOM api uses AtomicStrings anyway)?

3) Safari has a nice optimization that if we don&apos;t find AtmoicString, we&apos;re guaranteed not to get node by the given idea for example.  Is it possible to incorporate it into Chrome as well?  Of course, not for this CL.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>135189</commentid>
    <comment_count>4</comment_count>
    <who name="Christian Plesner Hansen">christian.plesner.hansen</who>
    <bug_when>2009-07-28 07:06:08 -0700</bug_when>
    <thetext>&gt; 1) Looks like you don&apos;t use HintAtomic and there is no support for it in
&gt; codegen.  Maybe this change should be just postponed?

I don&apos;t use HintAtomic value but I do use the presence/absence of a V8Custom annotation in line 1574.

&gt; 2) do we need to store String now?  String(StringImpl*) ctor seems very cheap. 
&gt; Maybe only store AtomicString even for String (it might though perform a find
&gt; on creation, but it might benefit us later as most of DOM api uses
&gt; AtomicStrings anyway)?

The reason for the m_impl field is to make sure the String value is kept alive even after it has been converted to an AtomicString.  V8 may use the buffer underlying m_impl even after m_atomic_impl has been set so both have to be kept alive.

&gt; 3) Safari has a nice optimization that if we don&apos;t find AtmoicString, we&apos;re
&gt; guaranteed not to get node by the given idea for example.  Is it possible to
&gt; incorporate it into Chrome as well?  Of course, not for this CL.

Good point, we should definitely do that.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>135193</commentid>
    <comment_count>5</comment_count>
    <who name="anton muhin">antonm</who>
    <bug_when>2009-07-28 07:13:25 -0700</bug_when>
    <thetext>(In reply to comment #4)
&gt; &gt; 1) Looks like you don&apos;t use HintAtomic and there is no support for it in
&gt; &gt; codegen.  Maybe this change should be just postponed?
&gt; 
&gt; I don&apos;t use HintAtomic value but I do use the presence/absence of a V8Custom
&gt; annotation in line 1574.
&gt; 
&gt; &gt; 2) do we need to store String now?  String(StringImpl*) ctor seems very cheap. 
&gt; &gt; Maybe only store AtomicString even for String (it might though perform a find
&gt; &gt; on creation, but it might benefit us later as most of DOM api uses
&gt; &gt; AtomicStrings anyway)?
&gt; 
&gt; The reason for the m_impl field is to make sure the String value is kept alive
&gt; even after it has been converted to an AtomicString.  V8 may use the buffer
&gt; underlying m_impl even after m_atomic_impl has been set so both have to be kept
&gt; alive.

AtomicString has String m_string field, cannot we reuse that instead?

&gt; 
&gt; &gt; 3) Safari has a nice optimization that if we don&apos;t find AtmoicString, we&apos;re
&gt; &gt; guaranteed not to get node by the given idea for example.  Is it possible to
&gt; &gt; incorporate it into Chrome as well?  Of course, not for this CL.
&gt; 
&gt; Good point, we should definitely do that.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>135194</commentid>
    <comment_count>6</comment_count>
      <attachid>33628</attachid>
    <who name="Christian Plesner Hansen">christian.plesner.hansen</who>
    <bug_when>2009-07-28 07:20:14 -0700</bug_when>
    <thetext>Created attachment 33628
Check that cached atomic string stay on the main thread</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>135196</commentid>
    <comment_count>7</comment_count>
    <who name="Christian Plesner Hansen">christian.plesner.hansen</who>
    <bug_when>2009-07-28 07:24:18 -0700</bug_when>
    <thetext>The issue was raised in another review that atomic string are not safe to use across threads.  I&apos;ve added an assertion that only the main thread accesses the cached atomic string which, as far as I can tell, is a safe assumption to make.  It is still possible to use the atomic string on other threads as if it were a plain string; I assume that is safe.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>135197</commentid>
    <comment_count>8</comment_count>
    <who name="Christian Plesner Hansen">christian.plesner.hansen</who>
    <bug_when>2009-07-28 07:26:17 -0700</bug_when>
    <thetext>&gt; AtomicString has String m_string field, cannot we reuse that instead?

That field is already being used to hold the string value shared between all AtomicString values with the same contents.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>135259</commentid>
    <comment_count>9</comment_count>
      <attachid>33628</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-07-28 10:27:12 -0700</bug_when>
    <thetext>Comment on attachment 33628
Check that cached atomic string stay on the main thread

There are tabs in your ChangeLog.

m_atomic_impl is not WebKit style.  m_atomicString would be, or m_atomicImpl (although we&apos;ve historically tried to kill Impl, excepting a few places)

+        if (m_atomic_impl.isNull()) {
+            m_atomic_impl = AtomicString(m_impl);
+        }

is not WK style.

WK uses 4 space indent:
+    if (!v8String-&gt;MakeExternal(resource)) {
+      // In case of a failure delete the external resource as it was not used.
+      delete resource;
+    }

I think you should consider running WebKit&apos;s copy of cpplint, it&apos;s found in WebKitTools/Scripts/


JSC does this by passing UStrings directly to an AtomicString constructor (they&apos;re implicitly constructed when getElementById is called).

PassRefPtr&lt;StringImpl&gt; AtomicString::add(const JSC::UString&amp; ustring)

is where the real magic is.  (Just hashes the string and makes a StringImpl wrapper if necessary.)

Does V8 not want to just do the same thing?  Add a new constructor for AtomicString for a Handle&lt;String&gt; (or whatever the appropriate v8 string base type is).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>135260</commentid>
    <comment_count>10</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-07-28 10:27:45 -0700</bug_when>
    <thetext>The r- was for the style stuff mostly.  But I&apos;m wondering if you really need to/want to add a custom attribute for this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>135268</commentid>
    <comment_count>11</comment_count>
    <who name="Christian Plesner Hansen">christian.plesner.hansen</who>
    <bug_when>2009-07-28 10:49:44 -0700</bug_when>
    <thetext>&gt; There are tabs in your ChangeLog.
&gt; 
&gt; m_atomic_impl is not WebKit style.  m_atomicString would be, or m_atomicImpl
&gt; (although we&apos;ve historically tried to kill Impl, excepting a few places)
&gt; 
&gt; +        if (m_atomic_impl.isNull()) {
&gt; +            m_atomic_impl = AtomicString(m_impl);
&gt; +        }
&gt; 
&gt; is not WK style.
&gt; 
&gt; WK uses 4 space indent:
&gt; +    if (!v8String-&gt;MakeExternal(resource)) {
&gt; +      // In case of a failure delete the external resource as it was not used.
&gt; +      delete resource;
&gt; +    }
&gt; 
&gt; I think you should consider running WebKit&apos;s copy of cpplint, it&apos;s found in
&gt; WebKitTools/Scripts/

Sorry, it&apos;s been like two years since I last worked on WK code.  I&apos;ll lint and clean up the code.

&gt; JSC does this by passing UStrings directly to an AtomicString constructor
&gt; (they&apos;re implicitly constructed when getElementById is called).
&gt; 
&gt; PassRefPtr&lt;StringImpl&gt; AtomicString::add(const JSC::UString&amp; ustring)
&gt; 
&gt; is where the real magic is.  (Just hashes the string and makes a StringImpl
&gt; wrapper if necessary.)

It&apos;s the &apos;add&apos; call I&apos;m trying to get rid of; currently around 10% of getElementById is spent just looking up atomic strings and that seems to hold for most operations that use them.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>135271</commentid>
    <comment_count>12</comment_count>
    <who name="Christian Plesner Hansen">christian.plesner.hansen</who>
    <bug_when>2009-07-28 10:51:51 -0700</bug_when>
    <thetext>&gt; The r- was for the style stuff mostly.  But I&apos;m wondering if you really need
&gt; to/want to add a custom attribute for this.

Just so I understand what you&apos;re asking: are you suggesting getting rid of the annotation altogether or replacing [V8Custom=...] with a special-purpose [Atomic] annotation?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>135273</commentid>
    <comment_count>13</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-07-28 10:55:50 -0700</bug_when>
    <thetext>So do you believe JSC to be slow for the same reasons?  Or is add() somehow faster for JSC?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>135288</commentid>
    <comment_count>14</comment_count>
    <who name="Christian Plesner Hansen">christian.plesner.hansen</who>
    <bug_when>2009-07-28 11:20:04 -0700</bug_when>
    <thetext>&gt; So do you believe JSC to be slow for the same reasons?  Or is add() somehow
&gt; faster for JSC?

I haven&apos;t looked at JSC&apos;s code but unless they&apos;re doing something clever to avoid it I would expect they&apos;re doing at least one call to add() that could be saved if there was somewhere to cache the atomic string.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>135294</commentid>
    <comment_count>15</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-07-28 11:31:59 -0700</bug_when>
    <thetext>I believe both UString and StringImpl know how to cache their hash values.  So add() is just a single lookup in the AtomicString hash table, you don&apos;t have to re-hash the string.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>135296</commentid>
    <comment_count>16</comment_count>
    <who name="Christian Plesner Hansen">christian.plesner.hansen</who>
    <bug_when>2009-07-28 11:34:58 -0700</bug_when>
    <thetext>(In reply to comment #15)
&gt; I believe both UString and StringImpl know how to cache their hash values.  So
&gt; add() is just a single lookup in the AtomicString hash table, you don&apos;t have to
&gt; re-hash the string.

We currently cache a StringImpl so if they do hash caching we already get the benefits of that.  The lookup itself still shows up high on our profiles.

Also, to answer your question from before: I think add() is as fast for us as for JSC.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>135298</commentid>
    <comment_count>17</comment_count>
      <attachid>33628</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-07-28 11:39:14 -0700</bug_when>
    <thetext>Comment on attachment 33628
Check that cached atomic string stay on the main thread

If what you say is true, and that add() would show up just as much for JSC, it seems we should fix this in a different way which fixes it for all JS engines. :)  Hard to know without seeing the profile in question.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>135498</commentid>
    <comment_count>18</comment_count>
      <attachid>33695</attachid>
    <who name="Christian Plesner Hansen">christian.plesner.hansen</who>
    <bug_when>2009-07-28 23:23:31 -0700</bug_when>
    <thetext>Created attachment 33695
Fixed style issues; added main thread assert</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>135519</commentid>
    <comment_count>19</comment_count>
    <who name="Christian Plesner Hansen">christian.plesner.hansen</who>
    <bug_when>2009-07-29 01:04:00 -0700</bug_when>
    <thetext>(In reply to comment #17)
&gt; (From update of attachment 33628 [details])
&gt; If what you say is true, and that add() would show up just as much for JSC, it
&gt; seems we should fix this in a different way which fixes it for all JS engines.
&gt; :)  Hard to know without seeing the profile in question.

I agree, a solution that covers both JSC and v8 would be better.  Just as an experiment I tried replacing my changes with a naive atomic string cache in StringImpls and it makes my getElementById microbenchmark ~8% faster.  So that might be worth doing if the cost of an extra word per StringImpl is acceptable.

I&apos;ve only tried it in webkit/v8 though because webkit/jsc doesn&apos;t run on linux (as far as I know).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>135604</commentid>
    <comment_count>20</comment_count>
      <attachid>33695</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-07-29 09:23:17 -0700</bug_when>
    <thetext>Comment on attachment 33695
Fixed style issues; added main thread assert

Of course JSC runs on linux. :)  I still think v8-specific hacks are a bad thing.

Spacing:
+    if (!v8String-&gt;MakeExternal(resource)) {
+        // In case of a failure delete the external resource as it was not used.
+       delete resource;
+    }</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>135613</commentid>
    <comment_count>21</comment_count>
    <who name="Sam Weinig">sam</who>
    <bug_when>2009-07-29 09:56:35 -0700</bug_when>
    <thetext>What test are you profiling against?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>135618</commentid>
    <comment_count>22</comment_count>
    <who name="Christian Plesner Hansen">christian.plesner.hansen</who>
    <bug_when>2009-07-29 10:13:09 -0700</bug_when>
    <thetext>&gt; Of course JSC runs on linux. :)  I still think v8-specific hacks are a bad
&gt; thing.

I know jsc runs on linux but I assumed that chrome-jsc doesn&apos;t.  I may be wrong
about that and it would be very useful if it does run.

I agree that a solution that improves both vms would be better but I don&apos;t know
enough about webkit to decide how best to implement it or decide if it should
be implemented at all.  V8&apos;s string representation happens to be particularly
well suited for this kind of caching because we allow transparent
representation changes; I don&apos;t consider this a hack but just taking advantage
of the hooks that are available in v8 and not, as far as I know, in jsc.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>135620</commentid>
    <comment_count>23</comment_count>
    <who name="Christian Plesner Hansen">christian.plesner.hansen</who>
    <bug_when>2009-07-29 10:17:13 -0700</bug_when>
    <thetext>&gt; What test are you profiling against?

Right now I&apos;m working specifically on document.getElementById because it performed abysmally in chromium so the benchmark I&apos;m running is a tight loop that just calls document.getElementById over and over again.  But I expect the atom conversion part of getElementById is representative of all operations that use atomic strings.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>135622</commentid>
    <comment_count>24</comment_count>
      <attachid>33721</attachid>
    <who name="Christian Plesner Hansen">christian.plesner.hansen</who>
    <bug_when>2009-07-29 10:23:02 -0700</bug_when>
    <thetext>Created attachment 33721
Fixed whitespace issue</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>136096</commentid>
    <comment_count>25</comment_count>
      <attachid>33721</attachid>
    <who name="David Levin">levin</who>
    <bug_when>2009-07-30 20:58:12 -0700</bug_when>
    <thetext>Comment on attachment 33721
Fixed whitespace issue

Just a few things to address and this can be done.

Please get the patch to be based from WebKit or else it will be harder to commit this for you (i.e. in this case, all path for files below should be prefixed with WebCore/).

&gt; Index: ChangeLog
&gt; ===================================================================
&gt; --- ChangeLog	(revision 46477)
&gt; +++ ChangeLog	(working copy)
&gt; @@ -1,3 +1,21 @@
&gt; +2009-07-28  Christian Plesner Hansen  &lt;christian.plesner.hansen@gmail.com&gt;
&gt; +
&gt; +    Reviewed by NOBODY (OOPS!).
&gt; +
Add title and bug link like this:

[v8] Cache atomic strings in externalized v8 strings
https://bugs.webkit.org/show_bug.cgi?id=27762


&gt; +    Cache atomic strings in externalized strings the first time
&gt; +    the string is converted.  Added V8Custom IDL annotation for
&gt; +    hinting that converting a string directly to an atomic string is a
&gt; +    good idea.

Get rid of TABs in the changelog.



&gt; Index: bindings/v8/V8Binding.cpp
&gt; +    explicit WebCoreStringResource(const AtomicString&amp; string)
&gt; +        : m_impl(string.impl()), m_atomicImpl(string.impl())
Please format like this:
    explicit WebCoreStringResource(const AtomicString&amp; string)
        : m_impl(string.impl())
        , m_atomicImpl(string.impl())




&gt; +    AtomicString atomicString()
&gt; +    {
&gt; +        ASSERT(WTF::isMainThread());
&gt; +        if (m_atomicImpl.isNull())
&gt; +            m_atomicImpl = AtomicString(m_impl);

It seems that you should adjust the external memory here:
        if (m_atomicImpl.isNull()) {
            m_atomicImpl = AtomicString(m_impl);
            if (!m_impl.inTable())
                v8::V8::AdjustAmountOfExternalAllocatedMemory(2 * length());
        }

And change the destructor like this:

    virtual ~WebCoreStringResource()
    {
        ASSERT(WTF::isMainThread());
        int reducedExternalMemory = -2 * length();
        if (!m_impl.inTable())
            reducedExternalMemory *= 2;
        v8::V8::AdjustAmountOfExternalAllocatedMemory(reducedExternalMemory);
    }

&gt;  private:
&gt;      // A shallow copy of the string. Keeps the string buffer alive until the V8 engine garbage collects it.
&gt;      String m_impl;
&gt; +    // If this string is atomic or has been made atomic earlier the
&gt; +    // atomic string is held here.  In the case where the string starts

Please only put one space after periods.

&gt; +    // off non-atomic and becomes atomic later it is necessary to keep
&gt; +    // the original string alive because v8 may keep derived pointers
&gt; +    // into that string.
&gt; +    AtomicString m_atomicImpl;

Why is it m_atomicImpl instead of just m_atomicString?


&gt; @@ -130,13 +151,34 @@ String v8ValueToWebCoreString(v8::Handle
&gt;  
&gt;  AtomicString v8StringToAtomicWebCoreString(v8::Handle&lt;v8::String&gt; v8String)
&gt;  {
&gt; +    WebCoreStringResource* stringResource = static_cast&lt;WebCoreStringResource*&gt;(v8String-&gt;GetExternalStringResource());
&gt; +    if (stringResource)
&gt; +        return stringResource-&gt;atomicString();
&gt; +
&gt; +    int length = v8String-&gt;Length();
&gt; +    if (!length) {
&gt; +        // Avoid trying to morph empty strings, as they do not have enough room to contain the external reference.
&gt; +        return StringImpl::empty();
&gt; +    }
&gt; +
&gt; +    UChar* buffer;
&gt; +    String plainResult = String::createUninitialized(length, buffer);
&gt; +    v8String-&gt;Write(reinterpret_cast&lt;uint16_t*&gt;(buffer), 0, length);
&gt; +    AtomicString result(plainResult);
&gt; +
&gt; +    WebCoreStringResource* resource = new WebCoreStringResource(result);
&gt; +    if (!v8String-&gt;MakeExternal(resource)) {
&gt; +        // In case of a failure delete the external resource as it was not used.
&gt; +        delete resource;
&gt; +    }
&gt; +    return result;

This duplicates a fair amount of code from v8StringToWebCoreString. Can you factor the code to avoid this?

btw, if you create a new function (or add to an existing function) and want a &quot;bool&quot; parameter, please make it an enum instead.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>136127</commentid>
    <comment_count>26</comment_count>
      <attachid>33865</attachid>
    <who name="Christian Plesner Hansen">christian.plesner.hansen</who>
    <bug_when>2009-07-31 03:02:52 -0700</bug_when>
    <thetext>Created attachment 33865
Next iteration</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>136134</commentid>
    <comment_count>27</comment_count>
    <who name="Christian Plesner Hansen">christian.plesner.hansen</who>
    <bug_when>2009-07-31 03:35:23 -0700</bug_when>
    <thetext>Fixed all issues except one.  I don&apos;t see any tabs in the ChangeLog but I had to create a new one anyway so if there were any they should be gone now.

There is one potential issue left though.  Is is correct that an atomic thread created on one thread cannot safely be used on another?  Or is it just that the operation of making a string atomic is not thread safe?  If it is the first case then as far as I can see plain String objects can&apos;t be shared either, which my changes assume they can.

&gt; Please get the patch to be based from WebKit or else it will be harder to
&gt; commit this for you (i.e. in this case, all path for files below should be
&gt; prefixed with WebCore/).

On linux, using svn-create-patch from third_party/WebKit gave me an empty patch so I had to be a little creative.  Let me know if the patch gives you any problems.

&gt; Why is it m_atomicImpl instead of just m_atomicString?

Renamed one to m_plainString and the other to m_atomicString to make it clear what the difference is.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>136167</commentid>
    <comment_count>28</comment_count>
      <attachid>33865</attachid>
    <who name="David Levin">levin</who>
    <bug_when>2009-07-31 09:01:29 -0700</bug_when>
    <thetext>Comment on attachment 33865
Next iteration

Just a few more thigns.

&gt; Index: WebCore/ChangeLog
&gt; +2009-07-31  Christian Plesner Hansen  &lt;christian.plesner.hansen@gmail.com&gt;
&gt; +
&gt; +        Reviewed by NOBODY (OOPS!).
&gt; +
&gt; +        [V8] Cache atomic strings in externalized v8 strings
&gt; +        https://bugs.webkit.org/show_bug.cgi?id=27762
&gt; +
&gt; +        * bindings/scripts/CodeGeneratorV8.pm:
&gt; +        * bindings/v8/V8Binding.cpp:
&gt; +        (WebCore::WebCoreStringResource::WebCoreStringResource):
&gt; +        (WebCore::WebCoreStringResource::~WebCoreStringResource):
&gt; +        (WebCore::WebCoreStringResource::data):
&gt; +        (WebCore::WebCoreStringResource::length):
&gt; +        (WebCore::WebCoreStringResource::webcoreString):
&gt; +        (WebCore::WebCoreStringResource::atomicString):
&gt; +        (WebCore::WebCoreStringResource::forString):
&gt; +        (WebCore::v8StringToWebCoreString):
&gt; +        (WebCore::v8StringToAtomicWebCoreString):
&gt; +        (WebCore::v8ValueToWebCoreString):
&gt; +        (WebCore::v8ValueToAtomicWebCoreString):

I think this is ok for this change, but in general (brief) per function comments are encouraged to explain what happened in the function.  See other entries in the change log.

&gt; Index: WebCore/bindings/v8/V8Binding.cpp

&gt; @@ -49,33 +49,66 @@ namespace WebCore {
&gt;  class WebCoreStringResource : public v8::String::ExternalStringResource {
&gt;  public:
&gt;      explicit WebCoreStringResource(const String&amp; string)
&gt; -        : m_impl(string.impl())
&gt; +        : m_plainString(string)
&gt;      {
Nice to add assert here:
        ASSERT(WTF::isMainThread());

&gt;          v8::V8::AdjustAmountOfExternalAllocatedMemory(2 * length());
&gt;      }
&gt;  
&gt; +    explicit WebCoreStringResource(const AtomicString&amp; string)
&gt; +        : m_plainString(string)
&gt; +        , m_atomicString(string)
&gt; +    {
&gt; +        ASSERT(WTF::isMainThread());
&gt; +        v8::V8::AdjustAmountOfExternalAllocatedMemory(2 * length());
&gt; +    }
&gt; +
&gt;      virtual ~WebCoreStringResource()
&gt;      {
&gt; -        v8::V8::AdjustAmountOfExternalAllocatedMemory(-2 * length());

Nice to add assert here:
        ASSERT(WTF::isMainThread());

(Really all we care about is that everything is on the same thread and for now this will do.)


&gt; +        int reducedExternalMemory = -2 * length();
&gt; +        if (!m_plainString.impl()-&gt;inTable())
&gt; +            reducedExternalMemory *= 2;
&gt; +        v8::V8::AdjustAmountOfExternalAllocatedMemory(reducedExternalMemory);
&gt;      }



&gt; +    AtomicString atomicString()
&gt; +    {
&gt; +        ASSERT(WTF::isMainThread());
&gt; +        if (m_atomicString.isNull()) {
&gt; +            m_atomicString = AtomicString(m_plainString);
&gt; +            if (m_plainString.impl()-&gt;inTable())

This should be
   if (!m_plainString.impl()-&gt;inTable())

&gt; +                v8::V8::AdjustAmountOfExternalAllocatedMemory(2 * length());
&gt; +        }
&gt; +        return m_atomicString;
&gt; +    }
&gt; +
&gt; +    static WebCoreStringResource *forString(v8::Handle&lt;v8::String&gt; v8String)

Move the &quot;*&quot;
   static WebCoreStringResource*

Also the name &quot;forString&quot; doesn&apos;t read that well to me. How about toStringResource?  (toString may have worked but there are so many *String* in here, that I thought it would be nice to distinguish.)


&gt; +AtomicString v8StringToAtomicWebCoreString(v8::Handle&lt;v8::String&gt; v8String)
&gt; +{
&gt; +    WebCoreStringResource* stringResource = WebCoreStringResource::forString(v8String);
&gt; +    if (!stringResource) {
&gt; +        // If this string hasn&apos;t been externalized we force it now.

Nice to add a comma after the if clause.
   If this string hasn&apos;t been externalized, we force it now.



And as discussed, this solution removed the duplicate code but increased memory usage unnecessarily.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>136171</commentid>
    <comment_count>29</comment_count>
      <attachid>33879</attachid>
    <who name="Christian Plesner Hansen">christian.plesner.hansen</who>
    <bug_when>2009-07-31 09:12:12 -0700</bug_when>
    <thetext>Created attachment 33879
Fixed memory waste etc.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>136172</commentid>
    <comment_count>30</comment_count>
    <who name="Christian Plesner Hansen">christian.plesner.hansen</who>
    <bug_when>2009-07-31 09:15:03 -0700</bug_when>
    <thetext>&gt; This should be
&gt;    if (!m_plainString.impl()-&gt;inTable())

Eek, how did I get this wrong?!?

&gt; Also the name &quot;forString&quot; doesn&apos;t read that well to me. How about
&gt; toStringResource?  (toString may have worked but there are so many *String* in
&gt; here, that I thought it would be nice to distinguish.)

That&apos;s a v8-ism inherited, I believe, from SmallTalk.  I&apos;ve changed it.

&gt; And as discussed, this solution removed the duplicate code but increased memory
&gt; usage unnecessarily.

I&apos;ve changed it to avoid that.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>136174</commentid>
    <comment_count>31</comment_count>
      <attachid>33879</attachid>
    <who name="David Levin">levin</who>
    <bug_when>2009-07-31 09:20:13 -0700</bug_when>
    <thetext>Comment on attachment 33879
Fixed memory waste etc.

If you want a review, it is good to set the r? (or no one will see this).  I&apos;m adding it for you.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>136175</commentid>
    <comment_count>32</comment_count>
    <who name="Christian Plesner Hansen">christian.plesner.hansen</who>
    <bug_when>2009-07-31 09:21:56 -0700</bug_when>
    <thetext>Thanks!  I thought that was just the first time.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>136183</commentid>
    <comment_count>33</comment_count>
      <attachid>33879</attachid>
    <who name="David Levin">levin</who>
    <bug_when>2009-07-31 09:40:06 -0700</bug_when>
    <thetext>Comment on attachment 33879
Fixed memory waste etc.

Just a few things that can be fixed on landing..


&gt; Index: WebCore/ChangeLog
&gt; ===================================================================
&gt; +2009-07-31  Christian Plesner Hansen  &lt;christian.plesner.hansen@gmail.com&gt;
&gt; +
&gt; +        Reviewed by NOBODY (OOPS!).
&gt; +
&gt; +        [V8] Cache atomic strings in externalized v8 strings
&gt; +        https://bugs.webkit.org/show_bug.cgi?id=27762
&gt; +

I should have said this before, but typically there is a comment here about why no layout tests were added if none were.

In this case, there is no change in functionality, so you could say:

        No change in behavior, so no tests.


&gt; Index: WebCore/bindings/v8/V8Binding.cpp
&gt; ===================================================================

&gt; +String v8StringToWebCoreString(v8::Handle&lt;v8::String&gt; v8String, ExternalMode external,
&gt; +        StringType type)

This is typically indented to align with the (.



&gt; Index: WebCore/bindings/v8/V8Binding.h

Enum members should user InterCaps with an initial capital letter.

&gt; +    enum ExternalMode { EXTERNALIZE, DONT_EXTERNALIZE };

Externalize, DoNotExternalize

&gt; +    enum StringType { PLAIN, ATOMIC };

Since these enum are in the WebCore namespace (and cased like classes), it feels like the names for StringType should be a little more verbose.

Here&apos;s some simple alternatives:
PlainStringType
AtomicStringType</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>136188</commentid>
    <comment_count>34</comment_count>
      <attachid>33879</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-07-31 10:03:22 -0700</bug_when>
    <thetext>Comment on attachment 33879
Fixed memory waste etc.

I still disagree with this approach.  1.  it seems silly to hold two StringImpl pointers, one in a String and one in an AtomicString.  2.  I think this is wrong to &quot;fix&quot; this issue just for V8.  If AtomicString::add is really such an issue, it should be fixed using StringImpl changes instead of in the individual JS engines.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>136191</commentid>
    <comment_count>35</comment_count>
      <attachid>33879</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-07-31 10:08:10 -0700</bug_when>
    <thetext>Comment on attachment 33879
Fixed memory waste etc.

You still haven&apos;t convinced me that this need to be fixed in V8 and not in WebCore.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>136192</commentid>
    <comment_count>36</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-07-31 10:10:42 -0700</bug_when>
    <thetext>Do you have a copy of your test so that one of us can run it in a regular WebKit (non-chomium) build and see if this is really just a V8 problem?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>136205</commentid>
    <comment_count>37</comment_count>
      <attachid>33890</attachid>
    <who name="David Levin">levin</who>
    <bug_when>2009-07-31 11:41:00 -0700</bug_when>
    <thetext>Created attachment 33890
GetElementById benchmark

Responding to the several comments asking for the benchmark:

Christian told me where to get the benchmark.  I did a few minor changes (added the explanation text that he told me and made it one file instead of having a separate one for the js so that it was more self contained), so I take credit for any ugliness, mistakes, etc.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>136298</commentid>
    <comment_count>38</comment_count>
    <who name="David Levin">levin</who>
    <bug_when>2009-07-31 16:32:23 -0700</bug_when>
    <thetext>I tried to be brief as possible in this, but it still was long. Sorry.

My overall conclusion:
  If devs want to increase the perf of code using v8 bindings by taking advantage of a v8 feature and there doesn&apos;t seem a clear path to do something more generic, that seems like a really reasonable thing to do and not require an equivalent change in JSC. (The reverse goes without saying.)

Details:
1. The big issue seems to be &quot;Why is this needed in V8 and not in something done for both JSC and V8?&quot;

  For V8, this patch solution uses v8::string::MakeExternal (which stores the WebCore String and uses that buffer pointer inside of V8).

  JSC uses features of UString to speed up this code (-- for example, keeping the precomputed hash).  In addition, I believe that JSC could do even by taking advantage of the fact that it can share the UChar* buffer from the UString.

  After debugging both JSC and V8 on the benchmar, I saw no significant difference in way that AtomicStrings are formed from UStrings vs String, but the code path for UString was obviously invested in to make sure it preformed well.

  I&apos;m not sure why this seemed to be a good optimization for Chromium (and has not been for Safari), but if there isn&apos;t something apparent in AtomicString that can be fixed, then it seems reasonable to use a feature of v8::String to handle it.

2. The second issue was &quot;It seems silly to hold two StringImpl pointers, one in a String and one in an AtomicString.&quot;

  A. The WebCoreStringResource may be created with a WebCore::String to begin with.  (It doesn&apos;t make sense to incur the cost of an AtomicString if it isn&apos;t need.)

  B. When WebCoreStringResource is created, it calls MakeExternal with that WebCore::String.
  At this point the buffer in that WebCore::String must stay around for as long as the v8::String is alive.  

  C. Later, that same string value may come from v8 and want to be AtomicString.  In that case, the AtomicString is cached as well due to performance reasons.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>136696</commentid>
    <comment_count>39</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-08-03 10:32:19 -0700</bug_when>
    <thetext>Ok.  Talking with Dave Levin over IM:

1.  JSC has this same hot-spot.
2.  JSC based WebKit is 4x as fast as V8 WebKit on this same benchmark.
3.  It&apos;s unclear what other things v8 is doing to make it so slow on this benchmark.
4.  We could add this optimization to JSC in a similar way by converting UString&apos;s hash into a hash/stringimpl* union and keeping around a bit to know which it was.  Or we could add a StringImpl* to UString.  Neither seems necessary at this point.

I no-longer object to this change.  I&apos;m still confused as to if this is what accounts for the 4x slowdown in v8 vs. JSC on this benchmark.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>136705</commentid>
    <comment_count>40</comment_count>
    <who name="David Levin">levin</who>
    <bug_when>2009-08-03 10:44:02 -0700</bug_when>
    <thetext>I&apos;ll do a profile of chromium to compare to the one I did for webkit using nightlies and try to see why there is a huge difference here.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>136706</commentid>
    <comment_count>41</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-08-03 10:44:57 -0700</bug_when>
    <thetext>Your free to move forward with this change, btw.  I no longer mean to stand in your way.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>136741</commentid>
    <comment_count>42</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-08-03 12:29:31 -0700</bug_when>
    <thetext>DEBUG r46722 WebKit (JSC) with Safari Version 4.0 (5530.17, 532+) on my machine:
Runs:      10
Average:   0.5603
Deviation: 0.1520%
Values:	   0.5602 0.5605 0.5605 0.5587 0.5596 0.5599 0.5596 0.5612 0.5618 0.5609

RELEASE r46722 WebKit (JSC) with Safari Version 4.0 (5530.17, 532+) on my machine:
Runs:      10
Average:   6.580
Deviation: 0.2311%
Values:    6.591 6.585 6.585 6.579 6.542 6.591 6.585 6.585 6.560 6.591

RELEASE Chrome 3.0.196.0 for Mac:
Runs:      10
Average:   1.610
Deviation: 0.5771%
Values:    1.599 1.594 1.610 1.608 1.609 1.618 1.623 1.623 1.610 1.604

Larger numbers are better.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>136742</commentid>
    <comment_count>43</comment_count>
      <attachid>33998</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-08-03 12:32:58 -0700</bug_when>
    <thetext>Created attachment 33998
Shark sample of benchmark in WebKit r46722 built RELEASE for Mac with JSC

AtomicString::add is 4th on the list for JSC.  Most of the time seems to be spent ref-counting and looking up nodes via toJS(Node*)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>136743</commentid>
    <comment_count>44</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-08-03 12:37:13 -0700</bug_when>
    <thetext>I don&apos;t have a version of Chrome with symbols, so although I made a Shark sample for that too, it&apos;s useless.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>136754</commentid>
    <comment_count>45</comment_count>
      <attachid>33879</attachid>
    <who name="David Levin">levin</who>
    <bug_when>2009-08-03 13:24:22 -0700</bug_when>
    <thetext>Comment on attachment 33879
Fixed memory waste etc.

Per conversation with Eric and the comments in this bug, I&apos;m adding my r+ back to this patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>136873</commentid>
    <comment_count>46</comment_count>
    <who name="David Levin">levin</who>
    <bug_when>2009-08-03 17:44:57 -0700</bug_when>
    <thetext>Assigning to levin to fix style issue on landing.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>136898</commentid>
    <comment_count>47</comment_count>
    <who name="David Levin">levin</who>
    <bug_when>2009-08-03 22:42:15 -0700</bug_when>
    <thetext>http://trac.webkit.org/changeset/46745</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>33618</attachid>
            <date>2009-07-28 05:52:57 -0700</date>
            <delta_ts>2009-07-28 06:34:34 -0700</delta_ts>
            <desc>Initial version</desc>
            <filename>patch</filename>
            <type>text/plain</type>
            <size>8444</size>
            <attacher name="Christian Plesner Hansen">christian.plesner.hansen</attacher>
            
              <data encoding="base64">SW5kZXg6IGRvbS9Eb2N1bWVudC5pZGwKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gZG9tL0RvY3VtZW50LmlkbAko
cmV2aXNpb24gNDY0MjYpCisrKyBkb20vRG9jdW1lbnQuaWRsCSh3b3JraW5nIGNvcHkpCkBAIC02
NCw3ICs2NCw3IEBACiAgICAgICAgICAgICByYWlzZXMgKERPTUV4Y2VwdGlvbik7CiAgICAgICAg
IFtPbGRTdHlsZU9iakNdIE5vZGVMaXN0IGdldEVsZW1lbnRzQnlUYWdOYW1lTlMoaW4gW0NvbnZl
cnROdWxsVG9OdWxsU3RyaW5nXSBET01TdHJpbmcgbmFtZXNwYWNlVVJJLAogICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIERPTVN0cmluZyBs
b2NhbE5hbWUpOwotICAgICAgICBFbGVtZW50ICAgICAgICAgICAgZ2V0RWxlbWVudEJ5SWQoaW4g
RE9NU3RyaW5nIGVsZW1lbnRJZCk7CisgICAgICAgIEVsZW1lbnQgICAgICAgICAgICBnZXRFbGVt
ZW50QnlJZChpbiBbVjhDdXN0b209SGludEF0b21pY10gRE9NU3RyaW5nIGVsZW1lbnRJZCk7CiAK
ICAgICAgICAgLy8gRE9NIExldmVsIDMgQ29yZQogCkluZGV4OiBiaW5kaW5ncy9zY3JpcHRzL0Nv
ZGVHZW5lcmF0b3JWOC5wbQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBiaW5kaW5ncy9zY3JpcHRzL0NvZGVHZW5l
cmF0b3JWOC5wbQkocmV2aXNpb24gNDY0MjYpCisrKyBiaW5kaW5ncy9zY3JpcHRzL0NvZGVHZW5l
cmF0b3JWOC5wbQkod29ya2luZyBjb3B5KQpAQCAtNDYxLDcgKzQ2MSw3IEBACiAgICAgbXkgJGF0
dHJOYW1lID0gJGF0dHJpYnV0ZS0+c2lnbmF0dXJlLT5uYW1lOwogICAgICRpbXBsSW5jbHVkZXN7
IlY4UHJveHkuaCJ9ID0gMTsKIAotICAgIG15ICRhdHRyVHlwZSA9ICRjb2RlR2VuZXJhdG9yLT5T
dHJpcE1vZHVsZSgkYXR0cmlidXRlLT5zaWduYXR1cmUtPnR5cGUpOworICAgIG15ICRhdHRyVHlw
ZSA9IEdldFR5cGVGcm9tU2lnbmF0dXJlKCRhdHRyaWJ1dGUtPnNpZ25hdHVyZSk7CiAgICAgbXkg
JGF0dHJJc1BvZFR5cGUgPSBJc1BvZFR5cGUoJGF0dHJUeXBlKTsKIAogICAgIG15ICRuYXRpdmVU
eXBlID0gR2V0TmF0aXZlVHlwZUZyb21TaWduYXR1cmUoJGF0dHJpYnV0ZS0+c2lnbmF0dXJlLCAw
KTsKQEAgLTU0NCw3ICs1NDQsNyBAQAogICAgIG15ICRnZXR0ZXJGdW5jID0gV0tfbGNmaXJzdCgk
YXR0ck5hbWUpOwogICAgICRnZXR0ZXJGdW5jIC49ICJBbmltYXRlZCIgaWYgJGNvZGVHZW5lcmF0
b3ItPklzU1ZHQW5pbWF0ZWRUeXBlKCRhdHRyaWJ1dGUtPnNpZ25hdHVyZS0+dHlwZSk7CiAKLSAg
ICBteSAkcmV0dXJuVHlwZSA9ICRjb2RlR2VuZXJhdG9yLT5TdHJpcE1vZHVsZSgkYXR0cmlidXRl
LT5zaWduYXR1cmUtPnR5cGUpOworICAgIG15ICRyZXR1cm5UeXBlID0gR2V0VHlwZUZyb21TaWdu
YXR1cmUoJGF0dHJpYnV0ZS0+c2lnbmF0dXJlKTsKIAogICAgIG15ICRnZXR0ZXJTdHJpbmc7CiAg
ICAgaWYgKCRnZXR0ZXJTdHJpbmdVc2VzSW1wKSB7CkBAIC03MDQsNyArNzA0LDcgQEAKICAgICBp
ZiAoJG5hdGl2ZVR5cGUgZXEgImludCIgYW5kICRhdHRyaWJ1dGUtPnNpZ25hdHVyZS0+ZXh0ZW5k
ZWRBdHRyaWJ1dGVzLT57IkNvbnZlcnRGcm9tU3RyaW5nIn0pIHsKICAgICAgICAgJHJlc3VsdCAu
PSAiKSI7CiAgICAgfQotICAgIG15ICRyZXR1cm5UeXBlID0gJGNvZGVHZW5lcmF0b3ItPlN0cmlw
TW9kdWxlKCRhdHRyaWJ1dGUtPnNpZ25hdHVyZS0+dHlwZSk7CisgICAgbXkgJHJldHVyblR5cGUg
PSBHZXRUeXBlRnJvbVNpZ25hdHVyZSgkYXR0cmlidXRlLT5zaWduYXR1cmUpOwogICAgIGlmIChJ
c1JlZlB0clR5cGUoJHJldHVyblR5cGUpKSB7CiAgICAgICAgICRyZXN1bHQgPSAiV1RGOjpnZXRQ
dHIoIiAuICRyZXN1bHQgLiAiKSI7CiAgICAgfQpAQCAtMTQwMCw3ICsxNDAwLDcgQEAKIAogICAg
IG15ICRuYW1lID0gJGZ1bmN0aW9uLT5zaWduYXR1cmUtPm5hbWU7CiAgICAgbXkgJGlzUG9kVHlw
ZSA9IElzUG9kVHlwZSgkaW1wbENsYXNzTmFtZSk7Ci0gICAgbXkgJHJldHVyblR5cGUgPSAkY29k
ZUdlbmVyYXRvci0+U3RyaXBNb2R1bGUoJGZ1bmN0aW9uLT5zaWduYXR1cmUtPnR5cGUpOworICAg
IG15ICRyZXR1cm5UeXBlID0gR2V0VHlwZUZyb21TaWduYXR1cmUoJGZ1bmN0aW9uLT5zaWduYXR1
cmUpOwogICAgIG15ICRyZXR1cm5zUG9kVHlwZSA9IElzUG9kVHlwZSgkcmV0dXJuVHlwZSk7CiAg
ICAgbXkgJG5hdGl2ZVJldHVyblR5cGUgPSBHZXROYXRpdmVUeXBlKCRyZXR1cm5UeXBlLCAwKTsK
ICAgICBteSAkcmVzdWx0ID0gIiI7CkBAIC0xNTY2LDEyICsxNTY2LDI1IEBACiB9CiAKIAorc3Vi
IEdldFR5cGVGcm9tU2lnbmF0dXJlCit7CisgICAgbXkgJHNpZ25hdHVyZSA9IHNoaWZ0OworCisg
ICAgbXkgJHR5cGUgPSAkY29kZUdlbmVyYXRvci0+U3RyaXBNb2R1bGUoJHNpZ25hdHVyZS0+dHlw
ZSk7CisgICAgaWYgKCgkdHlwZSBlcSAiRE9NU3RyaW5nIikgJiYgJHNpZ25hdHVyZS0+ZXh0ZW5k
ZWRBdHRyaWJ1dGVzLT57IlY4Q3VzdG9tIn0pIHsKKyAgICAgICAgJHR5cGUgPSAiQXRvbWljU3Ry
aW5nIjsKKyAgICB9CisgICAgCisgICAgcmV0dXJuICR0eXBlOworfQorCisKIHN1YiBHZXROYXRp
dmVUeXBlRnJvbVNpZ25hdHVyZQogewogICAgIG15ICRzaWduYXR1cmUgPSBzaGlmdDsKICAgICBt
eSAkaXNQYXJhbWV0ZXIgPSBzaGlmdDsKIAotICAgIG15ICR0eXBlID0gJGNvZGVHZW5lcmF0b3It
PlN0cmlwTW9kdWxlKCRzaWduYXR1cmUtPnR5cGUpOworICAgIG15ICR0eXBlID0gR2V0VHlwZUZy
b21TaWduYXR1cmUoJHNpZ25hdHVyZSk7CiAKICAgICByZXR1cm4gR2V0TmF0aXZlVHlwZSgkdHlw
ZSwgJGlzUGFyYW1ldGVyKTsKIH0KQEAgLTE3NjIsNyArMTc3NSw3IEBACiBzdWIgQmFzaWNUeXBl
Q2FuRmFpbENvbnZlcnNpb24KIHsKICAgICBteSAkc2lnbmF0dXJlID0gc2hpZnQ7Ci0gICAgbXkg
JHR5cGUgPSAkY29kZUdlbmVyYXRvci0+U3RyaXBNb2R1bGUoJHNpZ25hdHVyZS0+dHlwZSk7Cisg
ICAgbXkgJHR5cGUgPSBHZXRUeXBlRnJvbVNpZ25hdHVyZSgkc2lnbmF0dXJlKTsKIAogICAgIHJl
dHVybiAxIGlmICR0eXBlIGVxICJTVkdMZW5ndGgiOwogICAgIHJldHVybiAxIGlmICR0eXBlIGVx
ICJTVkdNYXRyaXgiOwpAQCAtMTc3Niw3ICsxNzg5LDcgQEAKIHsKICAgICBteSAkc2lnbmF0dXJl
ID0gc2hpZnQ7CiAKLSAgICBteSAkdHlwZSA9ICRjb2RlR2VuZXJhdG9yLT5TdHJpcE1vZHVsZSgk
c2lnbmF0dXJlLT50eXBlKTsKKyAgICBteSAkdHlwZSA9IEdldFR5cGVGcm9tU2lnbmF0dXJlKCRz
aWduYXR1cmUpOwogCiAgICAgJGltcGxJbmNsdWRlc3siRXhjZXB0aW9uQ29kZS5oIn0gPSAxIGlm
ICR0eXBlIGVxICJBdHRyIjsKIApAQCAtMTc5Miw3ICsxODA1LDcgQEAKICAgICBteSAkb2tQYXJh
bSA9IHNoaWZ0OwogICAgIG15ICRtYXliZU9rUGFyYW0gPSAkb2tQYXJhbSA/ICIsICR7b2tQYXJh
bX0iIDogIiI7CiAKLSAgICBteSAkdHlwZSA9ICRjb2RlR2VuZXJhdG9yLT5TdHJpcE1vZHVsZSgk
c2lnbmF0dXJlLT50eXBlKTsKKyAgICBteSAkdHlwZSA9IEdldFR5cGVGcm9tU2lnbmF0dXJlKCRz
aWduYXR1cmUpOwogCiAgICAgcmV0dXJuICIkdmFsdWUiIGlmICR0eXBlIGVxICJKU09iamVjdCI7
CiAgICAgcmV0dXJuICIkdmFsdWUtPkJvb2xlYW5WYWx1ZSgpIiBpZiAkdHlwZSBlcSAiYm9vbGVh
biI7CkBAIC0xODAzLDcgKzE4MTYsOCBAQAogICAgIHJldHVybiAic3RhdGljX2Nhc3Q8UmFuZ2U6
OkNvbXBhcmVIb3c+KCR2YWx1ZS0+SW50MzJWYWx1ZSgpKSIgaWYgJHR5cGUgZXEgIkNvbXBhcmVI
b3ciOwogICAgIHJldHVybiAic3RhdGljX2Nhc3Q8U1ZHUGFpbnQ6OlNWR1BhaW50VHlwZT4oJHZh
bHVlLT5Ub0ludDMyKCktPkludDMyVmFsdWUoKSkiIGlmICR0eXBlIGVxICJTVkdQYWludFR5cGUi
OwogCi0gICAgcmV0dXJuICJ0b1dlYkNvcmVTdHJpbmcoJHZhbHVlKSIgaWYgJHR5cGUgZXEgIkF0
b21pY1N0cmluZyIgb3IgJHR5cGUgZXEgIkRPTVVzZXJEYXRhIjsKKyAgICByZXR1cm4gInY4VmFs
dWVUb0F0b21pY1dlYkNvcmVTdHJpbmcoJHZhbHVlKSIgaWYgJHR5cGUgZXEgIkF0b21pY1N0cmlu
ZyI7CisgICAgcmV0dXJuICJ0b1dlYkNvcmVTdHJpbmcoJHZhbHVlKSIgaWYgJHR5cGUgZXEgIkRP
TVVzZXJEYXRhIjsKICAgICBpZiAoJHR5cGUgZXEgIkRPTVN0cmluZyIpIHsKICAgICAgICAgcmV0
dXJuICJ0b1dlYkNvcmVTdHJpbmdXaXRoTnVsbENoZWNrKCR2YWx1ZSkiIGlmICRzaWduYXR1cmUt
PmV4dGVuZGVkQXR0cmlidXRlcy0+eyJDb252ZXJ0TnVsbFRvTnVsbFN0cmluZyJ9OwogICAgICAg
ICByZXR1cm4gInRvV2ViQ29yZVN0cmluZ1dpdGhOdWxsT3JVbmRlZmluZWRDaGVjaygkdmFsdWUp
IiBpZiAkc2lnbmF0dXJlLT5leHRlbmRlZEF0dHJpYnV0ZXMtPnsiQ29udmVydFVuZGVmaW5lZE9y
TnVsbFRvTnVsbFN0cmluZyJ9OwpAQCAtMTk4MSw3ICsxOTk1LDcgQEAKICAgICBteSAkc2lnbmF0
dXJlID0gc2hpZnQ7CiAgICAgbXkgJHZhbHVlID0gc2hpZnQ7CiAgICAgbXkgJGluZGVudCA9IHNo
aWZ0OwotICAgIG15ICR0eXBlID0gJGNvZGVHZW5lcmF0b3ItPlN0cmlwTW9kdWxlKCRzaWduYXR1
cmUtPnR5cGUpOworICAgIG15ICR0eXBlID0gR2V0VHlwZUZyb21TaWduYXR1cmUoJHNpZ25hdHVy
ZSk7CiAgICAgbXkgJGNsYXNzTmFtZT0gIlY4JHR5cGUiOwogCiAgICAgcmV0dXJuICJyZXR1cm4g
djg6OkRhdGU6Ok5ldyhzdGF0aWNfY2FzdDxkb3VibGU+KCR2YWx1ZSkpIiBpZiAkdHlwZSBlcSAi
RE9NVGltZVN0YW1wIjsKSW5kZXg6IGJpbmRpbmdzL3Y4L1Y4QmluZGluZy5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gYmluZGluZ3MvdjgvVjhCaW5kaW5nLmNwcAkocmV2aXNpb24gNDY0MjYpCisrKyBiaW5k
aW5ncy92OC9WOEJpbmRpbmcuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01MSw2ICs1MSwxMiBAQAog
ICAgICAgICB2ODo6Vjg6OkFkanVzdEFtb3VudE9mRXh0ZXJuYWxBbGxvY2F0ZWRNZW1vcnkoMiAq
IGxlbmd0aCgpKTsKICAgICB9CiAKKyAgICBleHBsaWNpdCBXZWJDb3JlU3RyaW5nUmVzb3VyY2Uo
Y29uc3QgQXRvbWljU3RyaW5nJiBzdHJpbmcpCisgICAgICAgIDogbV9pbXBsKHN0cmluZy5pbXBs
KCkpLCBtX2F0b21pY19pbXBsKHN0cmluZy5pbXBsKCkpCisgICAgeworICAgICAgICB2ODo6Vjg6
OkFkanVzdEFtb3VudE9mRXh0ZXJuYWxBbGxvY2F0ZWRNZW1vcnkoMiAqIGxlbmd0aCgpKTsKKyAg
ICB9CisKICAgICB2aXJ0dWFsIH5XZWJDb3JlU3RyaW5nUmVzb3VyY2UoKQogICAgIHsKICAgICAg
ICAgdjg6OlY4OjpBZGp1c3RBbW91bnRPZkV4dGVybmFsQWxsb2NhdGVkTWVtb3J5KC0yICogbGVu
Z3RoKCkpOwpAQCAtNjUsOSArNzEsMjMgQEAKIAogICAgIFN0cmluZyB3ZWJjb3JlU3RyaW5nKCkg
eyByZXR1cm4gbV9pbXBsOyB9CiAKKyAgICBBdG9taWNTdHJpbmcgYXRvbWljU3RyaW5nKCkKKyAg
ICB7CisgICAgICAgIGlmIChtX2F0b21pY19pbXBsLmlzTnVsbCgpKSB7CisgICAgICAgICAgICBt
X2F0b21pY19pbXBsID0gQXRvbWljU3RyaW5nKG1faW1wbCk7CisgICAgICAgIH0KKyAgICAgICAg
cmV0dXJuIG1fYXRvbWljX2ltcGw7CisgICAgfQorCiBwcml2YXRlOgogICAgIC8vIEEgc2hhbGxv
dyBjb3B5IG9mIHRoZSBzdHJpbmcuIEtlZXBzIHRoZSBzdHJpbmcgYnVmZmVyIGFsaXZlIHVudGls
IHRoZSBWOCBlbmdpbmUgZ2FyYmFnZSBjb2xsZWN0cyBpdC4KICAgICBTdHJpbmcgbV9pbXBsOwor
ICAgIC8vIElmIHRoaXMgc3RyaW5nIGlzIGF0b21pYyBvciBoYXMgYmVlbiBtYWRlIGF0b21pYyBl
YXJsaWVyIHRoZQorICAgIC8vIGF0b21pYyBzdHJpbmcgaXMgaGVsZCBoZXJlLiAgSW4gdGhlIGNh
c2Ugd2hlcmUgdGhlIHN0cmluZyBzdGFydHMKKyAgICAvLyBvZmYgbm9uLWF0b21pYyBhbmQgYmVj
b21lcyBhdG9taWMgbGF0ZXIgaXQgaXMgbmVjZXNzYXJ5IHRvIGtlZXAKKyAgICAvLyB0aGUgb3Jp
Z2luYWwgc3RyaW5nIGFsaXZlIGJlY2F1c2UgdjggbWF5IGtlZXAgZGVyaXZlZCBwb2ludGVycwor
ICAgIC8vIGludG8gdGhhdCBzdHJpbmcuCisgICAgQXRvbWljU3RyaW5nIG1fYXRvbWljX2ltcGw7
CiB9OwogCiBTdHJpbmcgdjhTdHJpbmdUb1dlYkNvcmVTdHJpbmcodjg6OkhhbmRsZTx2ODo6U3Ry
aW5nPiB2OFN0cmluZywgYm9vbCBleHRlcm5hbGl6ZSkKQEAgLTk4LDcgKzExOCw3IEBACiAKIFN0
cmluZyB2OFZhbHVlVG9XZWJDb3JlU3RyaW5nKHY4OjpIYW5kbGU8djg6OlZhbHVlPiBvYmplY3Qp
CiB7Ci0gICAgaWYgKG9iamVjdC0+SXNTdHJpbmcoKSkgCisgICAgaWYgKG9iamVjdC0+SXNTdHJp
bmcoKSkKICAgICAgICAgcmV0dXJuIHY4U3RyaW5nVG9XZWJDb3JlU3RyaW5nKHY4OjpIYW5kbGU8
djg6OlN0cmluZz46OkNhc3Qob2JqZWN0KSwgdHJ1ZSk7CiAKICAgICBpZiAob2JqZWN0LT5Jc0lu
dDMyKCkpIHsKQEAgLTExNCw3ICsxMzQsNyBAQAogICAgICAgICAgICAgICAgIGxvd051bWJlcnNb
dmFsdWVdID0gdmFsdWVTdHJpbmc7CiAgICAgICAgICAgICAgICAgd2ViQ29yZVN0cmluZyA9IHZh
bHVlU3RyaW5nOwogICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgCisgICAgICAgIH0gZWxz
ZQogICAgICAgICAgICAgd2ViQ29yZVN0cmluZyA9IFN0cmluZzo6bnVtYmVyKHZhbHVlKTsKICAg
ICAgICAgcmV0dXJuIHdlYkNvcmVTdHJpbmc7CiAgICAgfQpAQCAtMTI4LDE1ICsxNDgsMzUgQEAK
ICAgICByZXR1cm4gdjhTdHJpbmdUb1dlYkNvcmVTdHJpbmcodjhTdHJpbmcsIGZhbHNlKTsKIH0K
IAotQXRvbWljU3RyaW5nIHY4U3RyaW5nVG9BdG9taWNXZWJDb3JlU3RyaW5nKHY4OjpIYW5kbGU8
djg6OlN0cmluZz4gdjhTdHJpbmcpCi17Ci0gICAgU3RyaW5nIHN0cmluZyA9IHY4U3RyaW5nVG9X
ZWJDb3JlU3RyaW5nKHY4U3RyaW5nLCB0cnVlKTsKLSAgICByZXR1cm4gQXRvbWljU3RyaW5nKHN0
cmluZyk7CitBdG9taWNTdHJpbmcgdjhTdHJpbmdUb0F0b21pY1dlYkNvcmVTdHJpbmcodjg6Okhh
bmRsZTx2ODo6U3RyaW5nPiB2OFN0cmluZykgeworICAgIFdlYkNvcmVTdHJpbmdSZXNvdXJjZSog
c3RyaW5nUmVzb3VyY2UgPSBzdGF0aWNfY2FzdDxXZWJDb3JlU3RyaW5nUmVzb3VyY2UqPih2OFN0
cmluZy0+R2V0RXh0ZXJuYWxTdHJpbmdSZXNvdXJjZSgpKTsKKyAgICBpZiAoc3RyaW5nUmVzb3Vy
Y2UpCisgICAgICAgIHJldHVybiBzdHJpbmdSZXNvdXJjZS0+YXRvbWljU3RyaW5nKCk7CisKKyAg
ICBpbnQgbGVuZ3RoID0gdjhTdHJpbmctPkxlbmd0aCgpOworICAgIGlmICghbGVuZ3RoKSB7Cisg
ICAgICAgIC8vIEF2b2lkIHRyeWluZyB0byBtb3JwaCBlbXB0eSBzdHJpbmdzLCBhcyB0aGV5IGRv
IG5vdCBoYXZlIGVub3VnaCByb29tIHRvIGNvbnRhaW4gdGhlIGV4dGVybmFsIHJlZmVyZW5jZS4K
KyAgICAgICAgcmV0dXJuIFN0cmluZ0ltcGw6OmVtcHR5KCk7CisgICAgfQorCisgICAgVUNoYXIq
IGJ1ZmZlcjsKKyAgICBTdHJpbmcgcGxhaW5SZXN1bHQgPSBTdHJpbmc6OmNyZWF0ZVVuaW5pdGlh
bGl6ZWQobGVuZ3RoLCBidWZmZXIpOworICAgIHY4U3RyaW5nLT5Xcml0ZShyZWludGVycHJldF9j
YXN0PHVpbnQxNl90Kj4oYnVmZmVyKSwgMCwgbGVuZ3RoKTsKKyAgICBBdG9taWNTdHJpbmcgcmVz
dWx0KHBsYWluUmVzdWx0KTsKKworICAgIFdlYkNvcmVTdHJpbmdSZXNvdXJjZSogcmVzb3VyY2Ug
PSBuZXcgV2ViQ29yZVN0cmluZ1Jlc291cmNlKHJlc3VsdCk7CisgICAgaWYgKCF2OFN0cmluZy0+
TWFrZUV4dGVybmFsKHJlc291cmNlKSkgeworICAgICAgLy8gSW4gY2FzZSBvZiBhIGZhaWx1cmUg
ZGVsZXRlIHRoZSBleHRlcm5hbCByZXNvdXJjZSBhcyBpdCB3YXMgbm90IHVzZWQuCisgICAgICBk
ZWxldGUgcmVzb3VyY2U7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLUF0b21pY1N0
cmluZyB2OFZhbHVlVG9BdG9taWNXZWJDb3JlU3RyaW5nKHY4OjpIYW5kbGU8djg6OlZhbHVlPiB2
OFN0cmluZykKK0F0b21pY1N0cmluZyB2OFZhbHVlVG9BdG9taWNXZWJDb3JlU3RyaW5nKHY4OjpI
YW5kbGU8djg6OlZhbHVlPiB2OFZhbHVlKQogewotICAgIFN0cmluZyBzdHJpbmcgPSB2OFZhbHVl
VG9XZWJDb3JlU3RyaW5nKHY4U3RyaW5nKTsKKyAgICBpZiAodjhWYWx1ZS0+SXNTdHJpbmcoKSkK
KyAgICAgICAgcmV0dXJuIHY4U3RyaW5nVG9BdG9taWNXZWJDb3JlU3RyaW5nKHY4OjpIYW5kbGU8
djg6OlN0cmluZz46OkNhc3QodjhWYWx1ZSkpOworICAgIFN0cmluZyBzdHJpbmcgPSB2OFZhbHVl
VG9XZWJDb3JlU3RyaW5nKHY4VmFsdWUpOwogICAgIHJldHVybiBBdG9taWNTdHJpbmcoc3RyaW5n
KTsKIH0KIAo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>33620</attachid>
            <date>2009-07-28 06:34:34 -0700</date>
            <delta_ts>2009-07-28 07:20:14 -0700</delta_ts>
            <desc>Updated ChangeLog</desc>
            <filename>patch</filename>
            <type>text/plain</type>
            <size>9792</size>
            <attacher name="Christian Plesner Hansen">christian.plesner.hansen</attacher>
            
              <data encoding="base64">SW5kZXg6IENoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBDaGFuZ2VMb2cJKHJldmlzaW9uIDQ2NDc3
KQorKysgQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMjEgQEAKKzIwMDktMDct
MjggIENocmlzdGlhbiBQbGVzbmVyIEhhbnNlbiAgPGNocmlzdGlhbi5wbGVzbmVyLmhhbnNlbkBn
bWFpbC5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAg
ICAgW1Y4XSBDYWNoZSBhdG9taWMgc3RyaW5ncyBpbiBleHRlcm5hbGl6ZWQgc3RyaW5ncyB0aGUg
Zmlyc3QgdGltZQorCXRoZSBzdHJpbmcgaXMgY29udmVydGVkLiAgQWRkZWQgVjhDdXN0b20gSURM
IGFubm90YXRpb24gZm9yCisJaGludGluZyB0aGF0IGNvbnZlcnRpbmcgYSBzdHJpbmcgZGlyZWN0
bHkgdG8gYW4gYXRvbWljIHN0cmluZyBpcyBhCisJZ29vZCBpZGVhLgorCisgICAgICAgICogYmlu
ZGluZ3Mvc2NyaXB0cy9Db2RlR2VuZXJhdG9yVjgucG06CisgICAgICAgICogYmluZGluZ3Mvdjgv
VjhCaW5kaW5nLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OldlYkNvcmVTdHJpbmdSZXNvdXJjZTo6
V2ViQ29yZVN0cmluZ1Jlc291cmNlKToKKyAgICAgICAgKFdlYkNvcmU6OldlYkNvcmVTdHJpbmdS
ZXNvdXJjZTo6YXRvbWljU3RyaW5nKToKKyAgICAgICAgKFdlYkNvcmU6OnY4VmFsdWVUb1dlYkNv
cmVTdHJpbmcpOgorICAgICAgICAoV2ViQ29yZTo6djhTdHJpbmdUb0F0b21pY1dlYkNvcmVTdHJp
bmcpOgorICAgICAgICAoV2ViQ29yZTo6djhWYWx1ZVRvQXRvbWljV2ViQ29yZVN0cmluZyk6Cisg
ICAgICAgICogZG9tL0RvY3VtZW50LmlkbDoKKwogMjAwOS0wNy0yOCAgTmlrb2xhcyBaaW1tZXJt
YW5uICA8bmlrb2xhcy56aW1tZXJtYW5uQHRvcmNobW9iaWxlLmNvbT4KIAogICAgICAgICBSZXZp
ZXdlZCBieSBHZW9yZ2UgU3RhaWtvcy4KSW5kZXg6IGJpbmRpbmdzL3NjcmlwdHMvQ29kZUdlbmVy
YXRvclY4LnBtCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIGJpbmRpbmdzL3NjcmlwdHMvQ29kZUdlbmVyYXRvclY4
LnBtCShyZXZpc2lvbiA0NjQyNikKKysrIGJpbmRpbmdzL3NjcmlwdHMvQ29kZUdlbmVyYXRvclY4
LnBtCSh3b3JraW5nIGNvcHkpCkBAIC00NjEsNyArNDYxLDcgQEAgc3ViIEdlbmVyYXRlTm9ybWFs
QXR0ckdldHRlcgogICAgIG15ICRhdHRyTmFtZSA9ICRhdHRyaWJ1dGUtPnNpZ25hdHVyZS0+bmFt
ZTsKICAgICAkaW1wbEluY2x1ZGVzeyJWOFByb3h5LmgifSA9IDE7CiAKLSAgICBteSAkYXR0clR5
cGUgPSAkY29kZUdlbmVyYXRvci0+U3RyaXBNb2R1bGUoJGF0dHJpYnV0ZS0+c2lnbmF0dXJlLT50
eXBlKTsKKyAgICBteSAkYXR0clR5cGUgPSBHZXRUeXBlRnJvbVNpZ25hdHVyZSgkYXR0cmlidXRl
LT5zaWduYXR1cmUpOwogICAgIG15ICRhdHRySXNQb2RUeXBlID0gSXNQb2RUeXBlKCRhdHRyVHlw
ZSk7CiAKICAgICBteSAkbmF0aXZlVHlwZSA9IEdldE5hdGl2ZVR5cGVGcm9tU2lnbmF0dXJlKCRh
dHRyaWJ1dGUtPnNpZ25hdHVyZSwgMCk7CkBAIC01NDQsNyArNTQ0LDcgQEAgRU5ECiAgICAgbXkg
JGdldHRlckZ1bmMgPSBXS19sY2ZpcnN0KCRhdHRyTmFtZSk7CiAgICAgJGdldHRlckZ1bmMgLj0g
IkFuaW1hdGVkIiBpZiAkY29kZUdlbmVyYXRvci0+SXNTVkdBbmltYXRlZFR5cGUoJGF0dHJpYnV0
ZS0+c2lnbmF0dXJlLT50eXBlKTsKIAotICAgIG15ICRyZXR1cm5UeXBlID0gJGNvZGVHZW5lcmF0
b3ItPlN0cmlwTW9kdWxlKCRhdHRyaWJ1dGUtPnNpZ25hdHVyZS0+dHlwZSk7CisgICAgbXkgJHJl
dHVyblR5cGUgPSBHZXRUeXBlRnJvbVNpZ25hdHVyZSgkYXR0cmlidXRlLT5zaWduYXR1cmUpOwog
CiAgICAgbXkgJGdldHRlclN0cmluZzsKICAgICBpZiAoJGdldHRlclN0cmluZ1VzZXNJbXApIHsK
QEAgLTcwNCw3ICs3MDQsNyBAQCBFTkQKICAgICBpZiAoJG5hdGl2ZVR5cGUgZXEgImludCIgYW5k
ICRhdHRyaWJ1dGUtPnNpZ25hdHVyZS0+ZXh0ZW5kZWRBdHRyaWJ1dGVzLT57IkNvbnZlcnRGcm9t
U3RyaW5nIn0pIHsKICAgICAgICAgJHJlc3VsdCAuPSAiKSI7CiAgICAgfQotICAgIG15ICRyZXR1
cm5UeXBlID0gJGNvZGVHZW5lcmF0b3ItPlN0cmlwTW9kdWxlKCRhdHRyaWJ1dGUtPnNpZ25hdHVy
ZS0+dHlwZSk7CisgICAgbXkgJHJldHVyblR5cGUgPSBHZXRUeXBlRnJvbVNpZ25hdHVyZSgkYXR0
cmlidXRlLT5zaWduYXR1cmUpOwogICAgIGlmIChJc1JlZlB0clR5cGUoJHJldHVyblR5cGUpKSB7
CiAgICAgICAgICRyZXN1bHQgPSAiV1RGOjpnZXRQdHIoIiAuICRyZXN1bHQgLiAiKSI7CiAgICAg
fQpAQCAtMTQwMCw3ICsxNDAwLDcgQEAgc3ViIEdlbmVyYXRlRnVuY3Rpb25DYWxsU3RyaW5nKCkK
IAogICAgIG15ICRuYW1lID0gJGZ1bmN0aW9uLT5zaWduYXR1cmUtPm5hbWU7CiAgICAgbXkgJGlz
UG9kVHlwZSA9IElzUG9kVHlwZSgkaW1wbENsYXNzTmFtZSk7Ci0gICAgbXkgJHJldHVyblR5cGUg
PSAkY29kZUdlbmVyYXRvci0+U3RyaXBNb2R1bGUoJGZ1bmN0aW9uLT5zaWduYXR1cmUtPnR5cGUp
OworICAgIG15ICRyZXR1cm5UeXBlID0gR2V0VHlwZUZyb21TaWduYXR1cmUoJGZ1bmN0aW9uLT5z
aWduYXR1cmUpOwogICAgIG15ICRyZXR1cm5zUG9kVHlwZSA9IElzUG9kVHlwZSgkcmV0dXJuVHlw
ZSk7CiAgICAgbXkgJG5hdGl2ZVJldHVyblR5cGUgPSBHZXROYXRpdmVUeXBlKCRyZXR1cm5UeXBl
LCAwKTsKICAgICBteSAkcmVzdWx0ID0gIiI7CkBAIC0xNTY2LDEyICsxNTY2LDI1IEBAIHN1YiBH
ZXRDbGFzc05hbWUKIH0KIAogCitzdWIgR2V0VHlwZUZyb21TaWduYXR1cmUKK3sKKyAgICBteSAk
c2lnbmF0dXJlID0gc2hpZnQ7CisKKyAgICBteSAkdHlwZSA9ICRjb2RlR2VuZXJhdG9yLT5TdHJp
cE1vZHVsZSgkc2lnbmF0dXJlLT50eXBlKTsKKyAgICBpZiAoKCR0eXBlIGVxICJET01TdHJpbmci
KSAmJiAkc2lnbmF0dXJlLT5leHRlbmRlZEF0dHJpYnV0ZXMtPnsiVjhDdXN0b20ifSkgeworICAg
ICAgICAkdHlwZSA9ICJBdG9taWNTdHJpbmciOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gJHR5
cGU7Cit9CisKKwogc3ViIEdldE5hdGl2ZVR5cGVGcm9tU2lnbmF0dXJlCiB7CiAgICAgbXkgJHNp
Z25hdHVyZSA9IHNoaWZ0OwogICAgIG15ICRpc1BhcmFtZXRlciA9IHNoaWZ0OwogCi0gICAgbXkg
JHR5cGUgPSAkY29kZUdlbmVyYXRvci0+U3RyaXBNb2R1bGUoJHNpZ25hdHVyZS0+dHlwZSk7Cisg
ICAgbXkgJHR5cGUgPSBHZXRUeXBlRnJvbVNpZ25hdHVyZSgkc2lnbmF0dXJlKTsKIAogICAgIHJl
dHVybiBHZXROYXRpdmVUeXBlKCR0eXBlLCAkaXNQYXJhbWV0ZXIpOwogfQpAQCAtMTc2Miw3ICsx
Nzc1LDcgQEAgc3ViIFRyYW5zbGF0ZVBhcmFtZXRlcgogc3ViIEJhc2ljVHlwZUNhbkZhaWxDb252
ZXJzaW9uCiB7CiAgICAgbXkgJHNpZ25hdHVyZSA9IHNoaWZ0OwotICAgIG15ICR0eXBlID0gJGNv
ZGVHZW5lcmF0b3ItPlN0cmlwTW9kdWxlKCRzaWduYXR1cmUtPnR5cGUpOworICAgIG15ICR0eXBl
ID0gR2V0VHlwZUZyb21TaWduYXR1cmUoJHNpZ25hdHVyZSk7CiAKICAgICByZXR1cm4gMSBpZiAk
dHlwZSBlcSAiU1ZHTGVuZ3RoIjsKICAgICByZXR1cm4gMSBpZiAkdHlwZSBlcSAiU1ZHTWF0cml4
IjsKQEAgLTE3NzYsNyArMTc4OSw3IEBAIHN1YiBUeXBlQ2FuRmFpbENvbnZlcnNpb24KIHsKICAg
ICBteSAkc2lnbmF0dXJlID0gc2hpZnQ7CiAKLSAgICBteSAkdHlwZSA9ICRjb2RlR2VuZXJhdG9y
LT5TdHJpcE1vZHVsZSgkc2lnbmF0dXJlLT50eXBlKTsKKyAgICBteSAkdHlwZSA9IEdldFR5cGVG
cm9tU2lnbmF0dXJlKCRzaWduYXR1cmUpOwogCiAgICAgJGltcGxJbmNsdWRlc3siRXhjZXB0aW9u
Q29kZS5oIn0gPSAxIGlmICR0eXBlIGVxICJBdHRyIjsKIApAQCAtMTc5Miw3ICsxODA1LDcgQEAg
c3ViIEpTVmFsdWVUb05hdGl2ZQogICAgIG15ICRva1BhcmFtID0gc2hpZnQ7CiAgICAgbXkgJG1h
eWJlT2tQYXJhbSA9ICRva1BhcmFtID8gIiwgJHtva1BhcmFtfSIgOiAiIjsKIAotICAgIG15ICR0
eXBlID0gJGNvZGVHZW5lcmF0b3ItPlN0cmlwTW9kdWxlKCRzaWduYXR1cmUtPnR5cGUpOworICAg
IG15ICR0eXBlID0gR2V0VHlwZUZyb21TaWduYXR1cmUoJHNpZ25hdHVyZSk7CiAKICAgICByZXR1
cm4gIiR2YWx1ZSIgaWYgJHR5cGUgZXEgIkpTT2JqZWN0IjsKICAgICByZXR1cm4gIiR2YWx1ZS0+
Qm9vbGVhblZhbHVlKCkiIGlmICR0eXBlIGVxICJib29sZWFuIjsKQEAgLTE4MDMsNyArMTgxNiw4
IEBAIHN1YiBKU1ZhbHVlVG9OYXRpdmUKICAgICByZXR1cm4gInN0YXRpY19jYXN0PFJhbmdlOjpD
b21wYXJlSG93PigkdmFsdWUtPkludDMyVmFsdWUoKSkiIGlmICR0eXBlIGVxICJDb21wYXJlSG93
IjsKICAgICByZXR1cm4gInN0YXRpY19jYXN0PFNWR1BhaW50OjpTVkdQYWludFR5cGU+KCR2YWx1
ZS0+VG9JbnQzMigpLT5JbnQzMlZhbHVlKCkpIiBpZiAkdHlwZSBlcSAiU1ZHUGFpbnRUeXBlIjsK
IAotICAgIHJldHVybiAidG9XZWJDb3JlU3RyaW5nKCR2YWx1ZSkiIGlmICR0eXBlIGVxICJBdG9t
aWNTdHJpbmciIG9yICR0eXBlIGVxICJET01Vc2VyRGF0YSI7CisgICAgcmV0dXJuICJ2OFZhbHVl
VG9BdG9taWNXZWJDb3JlU3RyaW5nKCR2YWx1ZSkiIGlmICR0eXBlIGVxICJBdG9taWNTdHJpbmci
OworICAgIHJldHVybiAidG9XZWJDb3JlU3RyaW5nKCR2YWx1ZSkiIGlmICR0eXBlIGVxICJET01V
c2VyRGF0YSI7CiAgICAgaWYgKCR0eXBlIGVxICJET01TdHJpbmciKSB7CiAgICAgICAgIHJldHVy
biAidG9XZWJDb3JlU3RyaW5nV2l0aE51bGxDaGVjaygkdmFsdWUpIiBpZiAkc2lnbmF0dXJlLT5l
eHRlbmRlZEF0dHJpYnV0ZXMtPnsiQ29udmVydE51bGxUb051bGxTdHJpbmcifTsKICAgICAgICAg
cmV0dXJuICJ0b1dlYkNvcmVTdHJpbmdXaXRoTnVsbE9yVW5kZWZpbmVkQ2hlY2soJHZhbHVlKSIg
aWYgJHNpZ25hdHVyZS0+ZXh0ZW5kZWRBdHRyaWJ1dGVzLT57IkNvbnZlcnRVbmRlZmluZWRPck51
bGxUb051bGxTdHJpbmcifTsKQEAgLTE5ODEsNyArMTk5NSw3IEBAIHN1YiBSZXR1cm5OYXRpdmVU
b0pTVmFsdWUKICAgICBteSAkc2lnbmF0dXJlID0gc2hpZnQ7CiAgICAgbXkgJHZhbHVlID0gc2hp
ZnQ7CiAgICAgbXkgJGluZGVudCA9IHNoaWZ0OwotICAgIG15ICR0eXBlID0gJGNvZGVHZW5lcmF0
b3ItPlN0cmlwTW9kdWxlKCRzaWduYXR1cmUtPnR5cGUpOworICAgIG15ICR0eXBlID0gR2V0VHlw
ZUZyb21TaWduYXR1cmUoJHNpZ25hdHVyZSk7CiAgICAgbXkgJGNsYXNzTmFtZT0gIlY4JHR5cGUi
OwogCiAgICAgcmV0dXJuICJyZXR1cm4gdjg6OkRhdGU6Ok5ldyhzdGF0aWNfY2FzdDxkb3VibGU+
KCR2YWx1ZSkpIiBpZiAkdHlwZSBlcSAiRE9NVGltZVN0YW1wIjsKSW5kZXg6IGJpbmRpbmdzL3Y4
L1Y4QmluZGluZy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gYmluZGluZ3MvdjgvVjhCaW5kaW5nLmNwcAko
cmV2aXNpb24gNDY0MjYpCisrKyBiaW5kaW5ncy92OC9WOEJpbmRpbmcuY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC01MSw2ICs1MSwxMiBAQCBwdWJsaWM6CiAgICAgICAgIHY4OjpWODo6QWRqdXN0QW1v
dW50T2ZFeHRlcm5hbEFsbG9jYXRlZE1lbW9yeSgyICogbGVuZ3RoKCkpOwogICAgIH0KIAorICAg
IGV4cGxpY2l0IFdlYkNvcmVTdHJpbmdSZXNvdXJjZShjb25zdCBBdG9taWNTdHJpbmcmIHN0cmlu
ZykKKyAgICAgICAgOiBtX2ltcGwoc3RyaW5nLmltcGwoKSksIG1fYXRvbWljX2ltcGwoc3RyaW5n
LmltcGwoKSkKKyAgICB7CisgICAgICAgIHY4OjpWODo6QWRqdXN0QW1vdW50T2ZFeHRlcm5hbEFs
bG9jYXRlZE1lbW9yeSgyICogbGVuZ3RoKCkpOworICAgIH0KKwogICAgIHZpcnR1YWwgfldlYkNv
cmVTdHJpbmdSZXNvdXJjZSgpCiAgICAgewogICAgICAgICB2ODo6Vjg6OkFkanVzdEFtb3VudE9m
RXh0ZXJuYWxBbGxvY2F0ZWRNZW1vcnkoLTIgKiBsZW5ndGgoKSk7CkBAIC02NSw5ICs3MSwyMyBA
QCBwdWJsaWM6CiAKICAgICBTdHJpbmcgd2ViY29yZVN0cmluZygpIHsgcmV0dXJuIG1faW1wbDsg
fQogCisgICAgQXRvbWljU3RyaW5nIGF0b21pY1N0cmluZygpCisgICAgeworICAgICAgICBpZiAo
bV9hdG9taWNfaW1wbC5pc051bGwoKSkgeworICAgICAgICAgICAgbV9hdG9taWNfaW1wbCA9IEF0
b21pY1N0cmluZyhtX2ltcGwpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtX2F0b21pY19p
bXBsOworICAgIH0KKwogcHJpdmF0ZToKICAgICAvLyBBIHNoYWxsb3cgY29weSBvZiB0aGUgc3Ry
aW5nLiBLZWVwcyB0aGUgc3RyaW5nIGJ1ZmZlciBhbGl2ZSB1bnRpbCB0aGUgVjggZW5naW5lIGdh
cmJhZ2UgY29sbGVjdHMgaXQuCiAgICAgU3RyaW5nIG1faW1wbDsKKyAgICAvLyBJZiB0aGlzIHN0
cmluZyBpcyBhdG9taWMgb3IgaGFzIGJlZW4gbWFkZSBhdG9taWMgZWFybGllciB0aGUKKyAgICAv
LyBhdG9taWMgc3RyaW5nIGlzIGhlbGQgaGVyZS4gIEluIHRoZSBjYXNlIHdoZXJlIHRoZSBzdHJp
bmcgc3RhcnRzCisgICAgLy8gb2ZmIG5vbi1hdG9taWMgYW5kIGJlY29tZXMgYXRvbWljIGxhdGVy
IGl0IGlzIG5lY2Vzc2FyeSB0byBrZWVwCisgICAgLy8gdGhlIG9yaWdpbmFsIHN0cmluZyBhbGl2
ZSBiZWNhdXNlIHY4IG1heSBrZWVwIGRlcml2ZWQgcG9pbnRlcnMKKyAgICAvLyBpbnRvIHRoYXQg
c3RyaW5nLgorICAgIEF0b21pY1N0cmluZyBtX2F0b21pY19pbXBsOwogfTsKIAogU3RyaW5nIHY4
U3RyaW5nVG9XZWJDb3JlU3RyaW5nKHY4OjpIYW5kbGU8djg6OlN0cmluZz4gdjhTdHJpbmcsIGJv
b2wgZXh0ZXJuYWxpemUpCkBAIC05OCw3ICsxMTgsNyBAQCBTdHJpbmcgdjhTdHJpbmdUb1dlYkNv
cmVTdHJpbmcodjg6OkhhbmRsCiAKIFN0cmluZyB2OFZhbHVlVG9XZWJDb3JlU3RyaW5nKHY4OjpI
YW5kbGU8djg6OlZhbHVlPiBvYmplY3QpCiB7Ci0gICAgaWYgKG9iamVjdC0+SXNTdHJpbmcoKSkg
CisgICAgaWYgKG9iamVjdC0+SXNTdHJpbmcoKSkKICAgICAgICAgcmV0dXJuIHY4U3RyaW5nVG9X
ZWJDb3JlU3RyaW5nKHY4OjpIYW5kbGU8djg6OlN0cmluZz46OkNhc3Qob2JqZWN0KSwgdHJ1ZSk7
CiAKICAgICBpZiAob2JqZWN0LT5Jc0ludDMyKCkpIHsKQEAgLTExNCw3ICsxMzQsNyBAQCBTdHJp
bmcgdjhWYWx1ZVRvV2ViQ29yZVN0cmluZyh2ODo6SGFuZGxlCiAgICAgICAgICAgICAgICAgbG93
TnVtYmVyc1t2YWx1ZV0gPSB2YWx1ZVN0cmluZzsKICAgICAgICAgICAgICAgICB3ZWJDb3JlU3Ry
aW5nID0gdmFsdWVTdHJpbmc7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSAKKyAgICAg
ICAgfSBlbHNlCiAgICAgICAgICAgICB3ZWJDb3JlU3RyaW5nID0gU3RyaW5nOjpudW1iZXIodmFs
dWUpOwogICAgICAgICByZXR1cm4gd2ViQ29yZVN0cmluZzsKICAgICB9CkBAIC0xMjgsMTUgKzE0
OCwzNSBAQCBTdHJpbmcgdjhWYWx1ZVRvV2ViQ29yZVN0cmluZyh2ODo6SGFuZGxlCiAgICAgcmV0
dXJuIHY4U3RyaW5nVG9XZWJDb3JlU3RyaW5nKHY4U3RyaW5nLCBmYWxzZSk7CiB9CiAKLUF0b21p
Y1N0cmluZyB2OFN0cmluZ1RvQXRvbWljV2ViQ29yZVN0cmluZyh2ODo6SGFuZGxlPHY4OjpTdHJp
bmc+IHY4U3RyaW5nKQotewotICAgIFN0cmluZyBzdHJpbmcgPSB2OFN0cmluZ1RvV2ViQ29yZVN0
cmluZyh2OFN0cmluZywgdHJ1ZSk7Ci0gICAgcmV0dXJuIEF0b21pY1N0cmluZyhzdHJpbmcpOwor
QXRvbWljU3RyaW5nIHY4U3RyaW5nVG9BdG9taWNXZWJDb3JlU3RyaW5nKHY4OjpIYW5kbGU8djg6
OlN0cmluZz4gdjhTdHJpbmcpIHsKKyAgICBXZWJDb3JlU3RyaW5nUmVzb3VyY2UqIHN0cmluZ1Jl
c291cmNlID0gc3RhdGljX2Nhc3Q8V2ViQ29yZVN0cmluZ1Jlc291cmNlKj4odjhTdHJpbmctPkdl
dEV4dGVybmFsU3RyaW5nUmVzb3VyY2UoKSk7CisgICAgaWYgKHN0cmluZ1Jlc291cmNlKQorICAg
ICAgICByZXR1cm4gc3RyaW5nUmVzb3VyY2UtPmF0b21pY1N0cmluZygpOworCisgICAgaW50IGxl
bmd0aCA9IHY4U3RyaW5nLT5MZW5ndGgoKTsKKyAgICBpZiAoIWxlbmd0aCkgeworICAgICAgICAv
LyBBdm9pZCB0cnlpbmcgdG8gbW9ycGggZW1wdHkgc3RyaW5ncywgYXMgdGhleSBkbyBub3QgaGF2
ZSBlbm91Z2ggcm9vbSB0byBjb250YWluIHRoZSBleHRlcm5hbCByZWZlcmVuY2UuCisgICAgICAg
IHJldHVybiBTdHJpbmdJbXBsOjplbXB0eSgpOworICAgIH0KKworICAgIFVDaGFyKiBidWZmZXI7
CisgICAgU3RyaW5nIHBsYWluUmVzdWx0ID0gU3RyaW5nOjpjcmVhdGVVbmluaXRpYWxpemVkKGxl
bmd0aCwgYnVmZmVyKTsKKyAgICB2OFN0cmluZy0+V3JpdGUocmVpbnRlcnByZXRfY2FzdDx1aW50
MTZfdCo+KGJ1ZmZlciksIDAsIGxlbmd0aCk7CisgICAgQXRvbWljU3RyaW5nIHJlc3VsdChwbGFp
blJlc3VsdCk7CisKKyAgICBXZWJDb3JlU3RyaW5nUmVzb3VyY2UqIHJlc291cmNlID0gbmV3IFdl
YkNvcmVTdHJpbmdSZXNvdXJjZShyZXN1bHQpOworICAgIGlmICghdjhTdHJpbmctPk1ha2VFeHRl
cm5hbChyZXNvdXJjZSkpIHsKKyAgICAgIC8vIEluIGNhc2Ugb2YgYSBmYWlsdXJlIGRlbGV0ZSB0
aGUgZXh0ZXJuYWwgcmVzb3VyY2UgYXMgaXQgd2FzIG5vdCB1c2VkLgorICAgICAgZGVsZXRlIHJl
c291cmNlOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCi1BdG9taWNTdHJpbmcgdjhW
YWx1ZVRvQXRvbWljV2ViQ29yZVN0cmluZyh2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gdjhTdHJpbmcp
CitBdG9taWNTdHJpbmcgdjhWYWx1ZVRvQXRvbWljV2ViQ29yZVN0cmluZyh2ODo6SGFuZGxlPHY4
OjpWYWx1ZT4gdjhWYWx1ZSkKIHsKLSAgICBTdHJpbmcgc3RyaW5nID0gdjhWYWx1ZVRvV2ViQ29y
ZVN0cmluZyh2OFN0cmluZyk7CisgICAgaWYgKHY4VmFsdWUtPklzU3RyaW5nKCkpCisgICAgICAg
IHJldHVybiB2OFN0cmluZ1RvQXRvbWljV2ViQ29yZVN0cmluZyh2ODo6SGFuZGxlPHY4OjpTdHJp
bmc+OjpDYXN0KHY4VmFsdWUpKTsKKyAgICBTdHJpbmcgc3RyaW5nID0gdjhWYWx1ZVRvV2ViQ29y
ZVN0cmluZyh2OFZhbHVlKTsKICAgICByZXR1cm4gQXRvbWljU3RyaW5nKHN0cmluZyk7CiB9CiAK
SW5kZXg6IGRvbS9Eb2N1bWVudC5pZGwKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gZG9tL0RvY3VtZW50LmlkbAko
cmV2aXNpb24gNDY0MjYpCisrKyBkb20vRG9jdW1lbnQuaWRsCSh3b3JraW5nIGNvcHkpCkBAIC02
NCw3ICs2NCw3IEBAIG1vZHVsZSBjb3JlIHsKICAgICAgICAgICAgIHJhaXNlcyAoRE9NRXhjZXB0
aW9uKTsKICAgICAgICAgW09sZFN0eWxlT2JqQ10gTm9kZUxpc3QgZ2V0RWxlbWVudHNCeVRhZ05h
bWVOUyhpbiBbQ29udmVydE51bGxUb051bGxTdHJpbmddIERPTVN0cmluZyBuYW1lc3BhY2VVUkks
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
aW4gRE9NU3RyaW5nIGxvY2FsTmFtZSk7Ci0gICAgICAgIEVsZW1lbnQgICAgICAgICAgICBnZXRF
bGVtZW50QnlJZChpbiBET01TdHJpbmcgZWxlbWVudElkKTsKKyAgICAgICAgRWxlbWVudCAgICAg
ICAgICAgIGdldEVsZW1lbnRCeUlkKGluIFtWOEN1c3RvbT1IaW50QXRvbWljXSBET01TdHJpbmcg
ZWxlbWVudElkKTsKIAogICAgICAgICAvLyBET00gTGV2ZWwgMyBDb3JlCiAK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>33628</attachid>
            <date>2009-07-28 07:20:14 -0700</date>
            <delta_ts>2009-07-28 23:23:31 -0700</delta_ts>
            <desc>Check that cached atomic string stay on the main thread</desc>
            <filename>patch</filename>
            <type>text/plain</type>
            <size>9830</size>
            <attacher name="Christian Plesner Hansen">christian.plesner.hansen</attacher>
            
              <data encoding="base64">SW5kZXg6IENoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBDaGFuZ2VMb2cJKHJldmlzaW9uIDQ2NDc3
KQorKysgQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMjEgQEAKKzIwMDktMDct
MjggIENocmlzdGlhbiBQbGVzbmVyIEhhbnNlbiAgPGNocmlzdGlhbi5wbGVzbmVyLmhhbnNlbkBn
bWFpbC5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAg
ICAgW1Y4XSBDYWNoZSBhdG9taWMgc3RyaW5ncyBpbiBleHRlcm5hbGl6ZWQgc3RyaW5ncyB0aGUg
Zmlyc3QgdGltZQorCXRoZSBzdHJpbmcgaXMgY29udmVydGVkLiAgQWRkZWQgVjhDdXN0b20gSURM
IGFubm90YXRpb24gZm9yCisJaGludGluZyB0aGF0IGNvbnZlcnRpbmcgYSBzdHJpbmcgZGlyZWN0
bHkgdG8gYW4gYXRvbWljIHN0cmluZyBpcyBhCisJZ29vZCBpZGVhLgorCisgICAgICAgICogYmlu
ZGluZ3Mvc2NyaXB0cy9Db2RlR2VuZXJhdG9yVjgucG06CisgICAgICAgICogYmluZGluZ3Mvdjgv
VjhCaW5kaW5nLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OldlYkNvcmVTdHJpbmdSZXNvdXJjZTo6
V2ViQ29yZVN0cmluZ1Jlc291cmNlKToKKyAgICAgICAgKFdlYkNvcmU6OldlYkNvcmVTdHJpbmdS
ZXNvdXJjZTo6YXRvbWljU3RyaW5nKToKKyAgICAgICAgKFdlYkNvcmU6OnY4VmFsdWVUb1dlYkNv
cmVTdHJpbmcpOgorICAgICAgICAoV2ViQ29yZTo6djhTdHJpbmdUb0F0b21pY1dlYkNvcmVTdHJp
bmcpOgorICAgICAgICAoV2ViQ29yZTo6djhWYWx1ZVRvQXRvbWljV2ViQ29yZVN0cmluZyk6Cisg
ICAgICAgICogZG9tL0RvY3VtZW50LmlkbDoKKwogMjAwOS0wNy0yOCAgTmlrb2xhcyBaaW1tZXJt
YW5uICA8bmlrb2xhcy56aW1tZXJtYW5uQHRvcmNobW9iaWxlLmNvbT4KIAogICAgICAgICBSZXZp
ZXdlZCBieSBHZW9yZ2UgU3RhaWtvcy4KSW5kZXg6IGJpbmRpbmdzL3NjcmlwdHMvQ29kZUdlbmVy
YXRvclY4LnBtCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIGJpbmRpbmdzL3NjcmlwdHMvQ29kZUdlbmVyYXRvclY4
LnBtCShyZXZpc2lvbiA0NjQyNikKKysrIGJpbmRpbmdzL3NjcmlwdHMvQ29kZUdlbmVyYXRvclY4
LnBtCSh3b3JraW5nIGNvcHkpCkBAIC00NjEsNyArNDYxLDcgQEAgc3ViIEdlbmVyYXRlTm9ybWFs
QXR0ckdldHRlcgogICAgIG15ICRhdHRyTmFtZSA9ICRhdHRyaWJ1dGUtPnNpZ25hdHVyZS0+bmFt
ZTsKICAgICAkaW1wbEluY2x1ZGVzeyJWOFByb3h5LmgifSA9IDE7CiAKLSAgICBteSAkYXR0clR5
cGUgPSAkY29kZUdlbmVyYXRvci0+U3RyaXBNb2R1bGUoJGF0dHJpYnV0ZS0+c2lnbmF0dXJlLT50
eXBlKTsKKyAgICBteSAkYXR0clR5cGUgPSBHZXRUeXBlRnJvbVNpZ25hdHVyZSgkYXR0cmlidXRl
LT5zaWduYXR1cmUpOwogICAgIG15ICRhdHRySXNQb2RUeXBlID0gSXNQb2RUeXBlKCRhdHRyVHlw
ZSk7CiAKICAgICBteSAkbmF0aXZlVHlwZSA9IEdldE5hdGl2ZVR5cGVGcm9tU2lnbmF0dXJlKCRh
dHRyaWJ1dGUtPnNpZ25hdHVyZSwgMCk7CkBAIC01NDQsNyArNTQ0LDcgQEAgRU5ECiAgICAgbXkg
JGdldHRlckZ1bmMgPSBXS19sY2ZpcnN0KCRhdHRyTmFtZSk7CiAgICAgJGdldHRlckZ1bmMgLj0g
IkFuaW1hdGVkIiBpZiAkY29kZUdlbmVyYXRvci0+SXNTVkdBbmltYXRlZFR5cGUoJGF0dHJpYnV0
ZS0+c2lnbmF0dXJlLT50eXBlKTsKIAotICAgIG15ICRyZXR1cm5UeXBlID0gJGNvZGVHZW5lcmF0
b3ItPlN0cmlwTW9kdWxlKCRhdHRyaWJ1dGUtPnNpZ25hdHVyZS0+dHlwZSk7CisgICAgbXkgJHJl
dHVyblR5cGUgPSBHZXRUeXBlRnJvbVNpZ25hdHVyZSgkYXR0cmlidXRlLT5zaWduYXR1cmUpOwog
CiAgICAgbXkgJGdldHRlclN0cmluZzsKICAgICBpZiAoJGdldHRlclN0cmluZ1VzZXNJbXApIHsK
QEAgLTcwNCw3ICs3MDQsNyBAQCBFTkQKICAgICBpZiAoJG5hdGl2ZVR5cGUgZXEgImludCIgYW5k
ICRhdHRyaWJ1dGUtPnNpZ25hdHVyZS0+ZXh0ZW5kZWRBdHRyaWJ1dGVzLT57IkNvbnZlcnRGcm9t
U3RyaW5nIn0pIHsKICAgICAgICAgJHJlc3VsdCAuPSAiKSI7CiAgICAgfQotICAgIG15ICRyZXR1
cm5UeXBlID0gJGNvZGVHZW5lcmF0b3ItPlN0cmlwTW9kdWxlKCRhdHRyaWJ1dGUtPnNpZ25hdHVy
ZS0+dHlwZSk7CisgICAgbXkgJHJldHVyblR5cGUgPSBHZXRUeXBlRnJvbVNpZ25hdHVyZSgkYXR0
cmlidXRlLT5zaWduYXR1cmUpOwogICAgIGlmIChJc1JlZlB0clR5cGUoJHJldHVyblR5cGUpKSB7
CiAgICAgICAgICRyZXN1bHQgPSAiV1RGOjpnZXRQdHIoIiAuICRyZXN1bHQgLiAiKSI7CiAgICAg
fQpAQCAtMTQwMCw3ICsxNDAwLDcgQEAgc3ViIEdlbmVyYXRlRnVuY3Rpb25DYWxsU3RyaW5nKCkK
IAogICAgIG15ICRuYW1lID0gJGZ1bmN0aW9uLT5zaWduYXR1cmUtPm5hbWU7CiAgICAgbXkgJGlz
UG9kVHlwZSA9IElzUG9kVHlwZSgkaW1wbENsYXNzTmFtZSk7Ci0gICAgbXkgJHJldHVyblR5cGUg
PSAkY29kZUdlbmVyYXRvci0+U3RyaXBNb2R1bGUoJGZ1bmN0aW9uLT5zaWduYXR1cmUtPnR5cGUp
OworICAgIG15ICRyZXR1cm5UeXBlID0gR2V0VHlwZUZyb21TaWduYXR1cmUoJGZ1bmN0aW9uLT5z
aWduYXR1cmUpOwogICAgIG15ICRyZXR1cm5zUG9kVHlwZSA9IElzUG9kVHlwZSgkcmV0dXJuVHlw
ZSk7CiAgICAgbXkgJG5hdGl2ZVJldHVyblR5cGUgPSBHZXROYXRpdmVUeXBlKCRyZXR1cm5UeXBl
LCAwKTsKICAgICBteSAkcmVzdWx0ID0gIiI7CkBAIC0xNTY2LDEyICsxNTY2LDI1IEBAIHN1YiBH
ZXRDbGFzc05hbWUKIH0KIAogCitzdWIgR2V0VHlwZUZyb21TaWduYXR1cmUKK3sKKyAgICBteSAk
c2lnbmF0dXJlID0gc2hpZnQ7CisKKyAgICBteSAkdHlwZSA9ICRjb2RlR2VuZXJhdG9yLT5TdHJp
cE1vZHVsZSgkc2lnbmF0dXJlLT50eXBlKTsKKyAgICBpZiAoKCR0eXBlIGVxICJET01TdHJpbmci
KSAmJiAkc2lnbmF0dXJlLT5leHRlbmRlZEF0dHJpYnV0ZXMtPnsiVjhDdXN0b20ifSkgeworICAg
ICAgICAkdHlwZSA9ICJBdG9taWNTdHJpbmciOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gJHR5
cGU7Cit9CisKKwogc3ViIEdldE5hdGl2ZVR5cGVGcm9tU2lnbmF0dXJlCiB7CiAgICAgbXkgJHNp
Z25hdHVyZSA9IHNoaWZ0OwogICAgIG15ICRpc1BhcmFtZXRlciA9IHNoaWZ0OwogCi0gICAgbXkg
JHR5cGUgPSAkY29kZUdlbmVyYXRvci0+U3RyaXBNb2R1bGUoJHNpZ25hdHVyZS0+dHlwZSk7Cisg
ICAgbXkgJHR5cGUgPSBHZXRUeXBlRnJvbVNpZ25hdHVyZSgkc2lnbmF0dXJlKTsKIAogICAgIHJl
dHVybiBHZXROYXRpdmVUeXBlKCR0eXBlLCAkaXNQYXJhbWV0ZXIpOwogfQpAQCAtMTc2Miw3ICsx
Nzc1LDcgQEAgc3ViIFRyYW5zbGF0ZVBhcmFtZXRlcgogc3ViIEJhc2ljVHlwZUNhbkZhaWxDb252
ZXJzaW9uCiB7CiAgICAgbXkgJHNpZ25hdHVyZSA9IHNoaWZ0OwotICAgIG15ICR0eXBlID0gJGNv
ZGVHZW5lcmF0b3ItPlN0cmlwTW9kdWxlKCRzaWduYXR1cmUtPnR5cGUpOworICAgIG15ICR0eXBl
ID0gR2V0VHlwZUZyb21TaWduYXR1cmUoJHNpZ25hdHVyZSk7CiAKICAgICByZXR1cm4gMSBpZiAk
dHlwZSBlcSAiU1ZHTGVuZ3RoIjsKICAgICByZXR1cm4gMSBpZiAkdHlwZSBlcSAiU1ZHTWF0cml4
IjsKQEAgLTE3NzYsNyArMTc4OSw3IEBAIHN1YiBUeXBlQ2FuRmFpbENvbnZlcnNpb24KIHsKICAg
ICBteSAkc2lnbmF0dXJlID0gc2hpZnQ7CiAKLSAgICBteSAkdHlwZSA9ICRjb2RlR2VuZXJhdG9y
LT5TdHJpcE1vZHVsZSgkc2lnbmF0dXJlLT50eXBlKTsKKyAgICBteSAkdHlwZSA9IEdldFR5cGVG
cm9tU2lnbmF0dXJlKCRzaWduYXR1cmUpOwogCiAgICAgJGltcGxJbmNsdWRlc3siRXhjZXB0aW9u
Q29kZS5oIn0gPSAxIGlmICR0eXBlIGVxICJBdHRyIjsKIApAQCAtMTc5Miw3ICsxODA1LDcgQEAg
c3ViIEpTVmFsdWVUb05hdGl2ZQogICAgIG15ICRva1BhcmFtID0gc2hpZnQ7CiAgICAgbXkgJG1h
eWJlT2tQYXJhbSA9ICRva1BhcmFtID8gIiwgJHtva1BhcmFtfSIgOiAiIjsKIAotICAgIG15ICR0
eXBlID0gJGNvZGVHZW5lcmF0b3ItPlN0cmlwTW9kdWxlKCRzaWduYXR1cmUtPnR5cGUpOworICAg
IG15ICR0eXBlID0gR2V0VHlwZUZyb21TaWduYXR1cmUoJHNpZ25hdHVyZSk7CiAKICAgICByZXR1
cm4gIiR2YWx1ZSIgaWYgJHR5cGUgZXEgIkpTT2JqZWN0IjsKICAgICByZXR1cm4gIiR2YWx1ZS0+
Qm9vbGVhblZhbHVlKCkiIGlmICR0eXBlIGVxICJib29sZWFuIjsKQEAgLTE4MDMsNyArMTgxNiw4
IEBAIHN1YiBKU1ZhbHVlVG9OYXRpdmUKICAgICByZXR1cm4gInN0YXRpY19jYXN0PFJhbmdlOjpD
b21wYXJlSG93PigkdmFsdWUtPkludDMyVmFsdWUoKSkiIGlmICR0eXBlIGVxICJDb21wYXJlSG93
IjsKICAgICByZXR1cm4gInN0YXRpY19jYXN0PFNWR1BhaW50OjpTVkdQYWludFR5cGU+KCR2YWx1
ZS0+VG9JbnQzMigpLT5JbnQzMlZhbHVlKCkpIiBpZiAkdHlwZSBlcSAiU1ZHUGFpbnRUeXBlIjsK
IAotICAgIHJldHVybiAidG9XZWJDb3JlU3RyaW5nKCR2YWx1ZSkiIGlmICR0eXBlIGVxICJBdG9t
aWNTdHJpbmciIG9yICR0eXBlIGVxICJET01Vc2VyRGF0YSI7CisgICAgcmV0dXJuICJ2OFZhbHVl
VG9BdG9taWNXZWJDb3JlU3RyaW5nKCR2YWx1ZSkiIGlmICR0eXBlIGVxICJBdG9taWNTdHJpbmci
OworICAgIHJldHVybiAidG9XZWJDb3JlU3RyaW5nKCR2YWx1ZSkiIGlmICR0eXBlIGVxICJET01V
c2VyRGF0YSI7CiAgICAgaWYgKCR0eXBlIGVxICJET01TdHJpbmciKSB7CiAgICAgICAgIHJldHVy
biAidG9XZWJDb3JlU3RyaW5nV2l0aE51bGxDaGVjaygkdmFsdWUpIiBpZiAkc2lnbmF0dXJlLT5l
eHRlbmRlZEF0dHJpYnV0ZXMtPnsiQ29udmVydE51bGxUb051bGxTdHJpbmcifTsKICAgICAgICAg
cmV0dXJuICJ0b1dlYkNvcmVTdHJpbmdXaXRoTnVsbE9yVW5kZWZpbmVkQ2hlY2soJHZhbHVlKSIg
aWYgJHNpZ25hdHVyZS0+ZXh0ZW5kZWRBdHRyaWJ1dGVzLT57IkNvbnZlcnRVbmRlZmluZWRPck51
bGxUb051bGxTdHJpbmcifTsKQEAgLTE5ODEsNyArMTk5NSw3IEBAIHN1YiBSZXR1cm5OYXRpdmVU
b0pTVmFsdWUKICAgICBteSAkc2lnbmF0dXJlID0gc2hpZnQ7CiAgICAgbXkgJHZhbHVlID0gc2hp
ZnQ7CiAgICAgbXkgJGluZGVudCA9IHNoaWZ0OwotICAgIG15ICR0eXBlID0gJGNvZGVHZW5lcmF0
b3ItPlN0cmlwTW9kdWxlKCRzaWduYXR1cmUtPnR5cGUpOworICAgIG15ICR0eXBlID0gR2V0VHlw
ZUZyb21TaWduYXR1cmUoJHNpZ25hdHVyZSk7CiAgICAgbXkgJGNsYXNzTmFtZT0gIlY4JHR5cGUi
OwogCiAgICAgcmV0dXJuICJyZXR1cm4gdjg6OkRhdGU6Ok5ldyhzdGF0aWNfY2FzdDxkb3VibGU+
KCR2YWx1ZSkpIiBpZiAkdHlwZSBlcSAiRE9NVGltZVN0YW1wIjsKSW5kZXg6IGJpbmRpbmdzL3Y4
L1Y4QmluZGluZy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gYmluZGluZ3MvdjgvVjhCaW5kaW5nLmNwcAko
cmV2aXNpb24gNDY0MjYpCisrKyBiaW5kaW5ncy92OC9WOEJpbmRpbmcuY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC01MSw2ICs1MSwxMiBAQCBwdWJsaWM6CiAgICAgICAgIHY4OjpWODo6QWRqdXN0QW1v
dW50T2ZFeHRlcm5hbEFsbG9jYXRlZE1lbW9yeSgyICogbGVuZ3RoKCkpOwogICAgIH0KIAorICAg
IGV4cGxpY2l0IFdlYkNvcmVTdHJpbmdSZXNvdXJjZShjb25zdCBBdG9taWNTdHJpbmcmIHN0cmlu
ZykKKyAgICAgICAgOiBtX2ltcGwoc3RyaW5nLmltcGwoKSksIG1fYXRvbWljX2ltcGwoc3RyaW5n
LmltcGwoKSkKKyAgICB7CisgICAgICAgIHY4OjpWODo6QWRqdXN0QW1vdW50T2ZFeHRlcm5hbEFs
bG9jYXRlZE1lbW9yeSgyICogbGVuZ3RoKCkpOworICAgIH0KKwogICAgIHZpcnR1YWwgfldlYkNv
cmVTdHJpbmdSZXNvdXJjZSgpCiAgICAgewogICAgICAgICB2ODo6Vjg6OkFkanVzdEFtb3VudE9m
RXh0ZXJuYWxBbGxvY2F0ZWRNZW1vcnkoLTIgKiBsZW5ndGgoKSk7CkBAIC02NSw5ICs3MSwyNCBA
QCBwdWJsaWM6CiAKICAgICBTdHJpbmcgd2ViY29yZVN0cmluZygpIHsgcmV0dXJuIG1faW1wbDsg
fQogCisgICAgQXRvbWljU3RyaW5nIGF0b21pY1N0cmluZygpCisgICAgeworICAgICAgICBBU1NF
UlQoV1RGOjppc01haW5UaHJlYWQoKSk7CisgICAgICAgIGlmIChtX2F0b21pY19pbXBsLmlzTnVs
bCgpKSB7CisgICAgICAgICAgICBtX2F0b21pY19pbXBsID0gQXRvbWljU3RyaW5nKG1faW1wbCk7
CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1fYXRvbWljX2ltcGw7CisgICAgfQorCiBwcml2
YXRlOgogICAgIC8vIEEgc2hhbGxvdyBjb3B5IG9mIHRoZSBzdHJpbmcuIEtlZXBzIHRoZSBzdHJp
bmcgYnVmZmVyIGFsaXZlIHVudGlsIHRoZSBWOCBlbmdpbmUgZ2FyYmFnZSBjb2xsZWN0cyBpdC4K
ICAgICBTdHJpbmcgbV9pbXBsOworICAgIC8vIElmIHRoaXMgc3RyaW5nIGlzIGF0b21pYyBvciBo
YXMgYmVlbiBtYWRlIGF0b21pYyBlYXJsaWVyIHRoZQorICAgIC8vIGF0b21pYyBzdHJpbmcgaXMg
aGVsZCBoZXJlLiAgSW4gdGhlIGNhc2Ugd2hlcmUgdGhlIHN0cmluZyBzdGFydHMKKyAgICAvLyBv
ZmYgbm9uLWF0b21pYyBhbmQgYmVjb21lcyBhdG9taWMgbGF0ZXIgaXQgaXMgbmVjZXNzYXJ5IHRv
IGtlZXAKKyAgICAvLyB0aGUgb3JpZ2luYWwgc3RyaW5nIGFsaXZlIGJlY2F1c2UgdjggbWF5IGtl
ZXAgZGVyaXZlZCBwb2ludGVycworICAgIC8vIGludG8gdGhhdCBzdHJpbmcuCisgICAgQXRvbWlj
U3RyaW5nIG1fYXRvbWljX2ltcGw7CiB9OwogCiBTdHJpbmcgdjhTdHJpbmdUb1dlYkNvcmVTdHJp
bmcodjg6OkhhbmRsZTx2ODo6U3RyaW5nPiB2OFN0cmluZywgYm9vbCBleHRlcm5hbGl6ZSkKQEAg
LTk4LDcgKzExOSw3IEBAIFN0cmluZyB2OFN0cmluZ1RvV2ViQ29yZVN0cmluZyh2ODo6SGFuZGwK
IAogU3RyaW5nIHY4VmFsdWVUb1dlYkNvcmVTdHJpbmcodjg6OkhhbmRsZTx2ODo6VmFsdWU+IG9i
amVjdCkKIHsKLSAgICBpZiAob2JqZWN0LT5Jc1N0cmluZygpKSAKKyAgICBpZiAob2JqZWN0LT5J
c1N0cmluZygpKQogICAgICAgICByZXR1cm4gdjhTdHJpbmdUb1dlYkNvcmVTdHJpbmcodjg6Okhh
bmRsZTx2ODo6U3RyaW5nPjo6Q2FzdChvYmplY3QpLCB0cnVlKTsKIAogICAgIGlmIChvYmplY3Qt
PklzSW50MzIoKSkgewpAQCAtMTE0LDcgKzEzNSw3IEBAIFN0cmluZyB2OFZhbHVlVG9XZWJDb3Jl
U3RyaW5nKHY4OjpIYW5kbGUKICAgICAgICAgICAgICAgICBsb3dOdW1iZXJzW3ZhbHVlXSA9IHZh
bHVlU3RyaW5nOwogICAgICAgICAgICAgICAgIHdlYkNvcmVTdHJpbmcgPSB2YWx1ZVN0cmluZzsK
ICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIAorICAgICAgICB9IGVsc2UKICAgICAgICAg
ICAgIHdlYkNvcmVTdHJpbmcgPSBTdHJpbmc6Om51bWJlcih2YWx1ZSk7CiAgICAgICAgIHJldHVy
biB3ZWJDb3JlU3RyaW5nOwogICAgIH0KQEAgLTEyOCwxNSArMTQ5LDM1IEBAIFN0cmluZyB2OFZh
bHVlVG9XZWJDb3JlU3RyaW5nKHY4OjpIYW5kbGUKICAgICByZXR1cm4gdjhTdHJpbmdUb1dlYkNv
cmVTdHJpbmcodjhTdHJpbmcsIGZhbHNlKTsKIH0KIAotQXRvbWljU3RyaW5nIHY4U3RyaW5nVG9B
dG9taWNXZWJDb3JlU3RyaW5nKHY4OjpIYW5kbGU8djg6OlN0cmluZz4gdjhTdHJpbmcpCi17Ci0g
ICAgU3RyaW5nIHN0cmluZyA9IHY4U3RyaW5nVG9XZWJDb3JlU3RyaW5nKHY4U3RyaW5nLCB0cnVl
KTsKLSAgICByZXR1cm4gQXRvbWljU3RyaW5nKHN0cmluZyk7CitBdG9taWNTdHJpbmcgdjhTdHJp
bmdUb0F0b21pY1dlYkNvcmVTdHJpbmcodjg6OkhhbmRsZTx2ODo6U3RyaW5nPiB2OFN0cmluZykg
eworICAgIFdlYkNvcmVTdHJpbmdSZXNvdXJjZSogc3RyaW5nUmVzb3VyY2UgPSBzdGF0aWNfY2Fz
dDxXZWJDb3JlU3RyaW5nUmVzb3VyY2UqPih2OFN0cmluZy0+R2V0RXh0ZXJuYWxTdHJpbmdSZXNv
dXJjZSgpKTsKKyAgICBpZiAoc3RyaW5nUmVzb3VyY2UpCisgICAgICAgIHJldHVybiBzdHJpbmdS
ZXNvdXJjZS0+YXRvbWljU3RyaW5nKCk7CisKKyAgICBpbnQgbGVuZ3RoID0gdjhTdHJpbmctPkxl
bmd0aCgpOworICAgIGlmICghbGVuZ3RoKSB7CisgICAgICAgIC8vIEF2b2lkIHRyeWluZyB0byBt
b3JwaCBlbXB0eSBzdHJpbmdzLCBhcyB0aGV5IGRvIG5vdCBoYXZlIGVub3VnaCByb29tIHRvIGNv
bnRhaW4gdGhlIGV4dGVybmFsIHJlZmVyZW5jZS4KKyAgICAgICAgcmV0dXJuIFN0cmluZ0ltcGw6
OmVtcHR5KCk7CisgICAgfQorCisgICAgVUNoYXIqIGJ1ZmZlcjsKKyAgICBTdHJpbmcgcGxhaW5S
ZXN1bHQgPSBTdHJpbmc6OmNyZWF0ZVVuaW5pdGlhbGl6ZWQobGVuZ3RoLCBidWZmZXIpOworICAg
IHY4U3RyaW5nLT5Xcml0ZShyZWludGVycHJldF9jYXN0PHVpbnQxNl90Kj4oYnVmZmVyKSwgMCwg
bGVuZ3RoKTsKKyAgICBBdG9taWNTdHJpbmcgcmVzdWx0KHBsYWluUmVzdWx0KTsKKworICAgIFdl
YkNvcmVTdHJpbmdSZXNvdXJjZSogcmVzb3VyY2UgPSBuZXcgV2ViQ29yZVN0cmluZ1Jlc291cmNl
KHJlc3VsdCk7CisgICAgaWYgKCF2OFN0cmluZy0+TWFrZUV4dGVybmFsKHJlc291cmNlKSkgewor
ICAgICAgLy8gSW4gY2FzZSBvZiBhIGZhaWx1cmUgZGVsZXRlIHRoZSBleHRlcm5hbCByZXNvdXJj
ZSBhcyBpdCB3YXMgbm90IHVzZWQuCisgICAgICBkZWxldGUgcmVzb3VyY2U7CisgICAgfQorICAg
IHJldHVybiByZXN1bHQ7CiB9CiAKLUF0b21pY1N0cmluZyB2OFZhbHVlVG9BdG9taWNXZWJDb3Jl
U3RyaW5nKHY4OjpIYW5kbGU8djg6OlZhbHVlPiB2OFN0cmluZykKK0F0b21pY1N0cmluZyB2OFZh
bHVlVG9BdG9taWNXZWJDb3JlU3RyaW5nKHY4OjpIYW5kbGU8djg6OlZhbHVlPiB2OFZhbHVlKQog
ewotICAgIFN0cmluZyBzdHJpbmcgPSB2OFZhbHVlVG9XZWJDb3JlU3RyaW5nKHY4U3RyaW5nKTsK
KyAgICBpZiAodjhWYWx1ZS0+SXNTdHJpbmcoKSkKKyAgICAgICAgcmV0dXJuIHY4U3RyaW5nVG9B
dG9taWNXZWJDb3JlU3RyaW5nKHY4OjpIYW5kbGU8djg6OlN0cmluZz46OkNhc3QodjhWYWx1ZSkp
OworICAgIFN0cmluZyBzdHJpbmcgPSB2OFZhbHVlVG9XZWJDb3JlU3RyaW5nKHY4VmFsdWUpOwog
ICAgIHJldHVybiBBdG9taWNTdHJpbmcoc3RyaW5nKTsKIH0KIApJbmRleDogZG9tL0RvY3VtZW50
LmlkbAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBkb20vRG9jdW1lbnQuaWRsCShyZXZpc2lvbiA0NjQyNikKKysr
IGRvbS9Eb2N1bWVudC5pZGwJKHdvcmtpbmcgY29weSkKQEAgLTY0LDcgKzY0LDcgQEAgbW9kdWxl
IGNvcmUgewogICAgICAgICAgICAgcmFpc2VzIChET01FeGNlcHRpb24pOwogICAgICAgICBbT2xk
U3R5bGVPYmpDXSBOb2RlTGlzdCBnZXRFbGVtZW50c0J5VGFnTmFtZU5TKGluIFtDb252ZXJ0TnVs
bFRvTnVsbFN0cmluZ10gRE9NU3RyaW5nIG5hbWVzcGFjZVVSSSwKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBET01TdHJpbmcgbG9jYWxO
YW1lKTsKLSAgICAgICAgRWxlbWVudCAgICAgICAgICAgIGdldEVsZW1lbnRCeUlkKGluIERPTVN0
cmluZyBlbGVtZW50SWQpOworICAgICAgICBFbGVtZW50ICAgICAgICAgICAgZ2V0RWxlbWVudEJ5
SWQoaW4gW1Y4Q3VzdG9tPUhpbnRBdG9taWNdIERPTVN0cmluZyBlbGVtZW50SWQpOwogCiAgICAg
ICAgIC8vIERPTSBMZXZlbCAzIENvcmUKIAo=
</data>
<flag name="review"
          id="17873"
          type_id="1"
          status="-"
          setter="eric"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>33695</attachid>
            <date>2009-07-28 23:23:31 -0700</date>
            <delta_ts>2009-07-29 10:23:02 -0700</delta_ts>
            <desc>Fixed style issues; added main thread assert</desc>
            <filename>patch</filename>
            <type>text/plain</type>
            <size>9718</size>
            <attacher name="Christian Plesner Hansen">christian.plesner.hansen</attacher>
            
              <data encoding="base64">SW5kZXg6IENoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBDaGFuZ2VMb2cJKHJldmlzaW9uIDQ2NDc3
KQorKysgQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMjEgQEAKKzIwMDktMDct
MjggIENocmlzdGlhbiBQbGVzbmVyIEhhbnNlbiAgPGNocmlzdGlhbi5wbGVzbmVyLmhhbnNlbkBn
bWFpbC5jb20+CisKKyAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgIFtWOF0g
Q2FjaGUgYXRvbWljIHN0cmluZ3MgaW4gZXh0ZXJuYWxpemVkIHN0cmluZ3MgdGhlIGZpcnN0IHRp
bWUKKyAgICB0aGUgc3RyaW5nIGlzIGNvbnZlcnRlZC4gIEFkZGVkIFY4Q3VzdG9tIElETCBhbm5v
dGF0aW9uIGZvcgorICAgIGhpbnRpbmcgdGhhdCBjb252ZXJ0aW5nIGEgc3RyaW5nIGRpcmVjdGx5
IHRvIGFuIGF0b21pYyBzdHJpbmcgaXMgYQorICAgIGdvb2QgaWRlYS4KKworICAgICAgICAqIGJp
bmRpbmdzL3NjcmlwdHMvQ29kZUdlbmVyYXRvclY4LnBtOgorICAgICAgICAqIGJpbmRpbmdzL3Y4
L1Y4QmluZGluZy5jcHA6CisgICAgICAgIChXZWJDb3JlOjpXZWJDb3JlU3RyaW5nUmVzb3VyY2U6
OldlYkNvcmVTdHJpbmdSZXNvdXJjZSk6CisgICAgICAgIChXZWJDb3JlOjpXZWJDb3JlU3RyaW5n
UmVzb3VyY2U6OmF0b21pY1N0cmluZyk6CisgICAgICAgIChXZWJDb3JlOjp2OFZhbHVlVG9XZWJD
b3JlU3RyaW5nKToKKyAgICAgICAgKFdlYkNvcmU6OnY4U3RyaW5nVG9BdG9taWNXZWJDb3JlU3Ry
aW5nKToKKyAgICAgICAgKFdlYkNvcmU6OnY4VmFsdWVUb0F0b21pY1dlYkNvcmVTdHJpbmcpOgor
ICAgICAgICAqIGRvbS9Eb2N1bWVudC5pZGw6CisKIDIwMDktMDctMjggIE5pa29sYXMgWmltbWVy
bWFubiAgPG5pa29sYXMuemltbWVybWFubkB0b3JjaG1vYmlsZS5jb20+CiAKICAgICAgICAgUmV2
aWV3ZWQgYnkgR2VvcmdlIFN0YWlrb3MuCkluZGV4OiBiaW5kaW5ncy9zY3JpcHRzL0NvZGVHZW5l
cmF0b3JWOC5wbQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBiaW5kaW5ncy9zY3JpcHRzL0NvZGVHZW5lcmF0b3JW
OC5wbQkocmV2aXNpb24gNDY0MjYpCisrKyBiaW5kaW5ncy9zY3JpcHRzL0NvZGVHZW5lcmF0b3JW
OC5wbQkod29ya2luZyBjb3B5KQpAQCAtNDYxLDcgKzQ2MSw3IEBAIHN1YiBHZW5lcmF0ZU5vcm1h
bEF0dHJHZXR0ZXIKICAgICBteSAkYXR0ck5hbWUgPSAkYXR0cmlidXRlLT5zaWduYXR1cmUtPm5h
bWU7CiAgICAgJGltcGxJbmNsdWRlc3siVjhQcm94eS5oIn0gPSAxOwogCi0gICAgbXkgJGF0dHJU
eXBlID0gJGNvZGVHZW5lcmF0b3ItPlN0cmlwTW9kdWxlKCRhdHRyaWJ1dGUtPnNpZ25hdHVyZS0+
dHlwZSk7CisgICAgbXkgJGF0dHJUeXBlID0gR2V0VHlwZUZyb21TaWduYXR1cmUoJGF0dHJpYnV0
ZS0+c2lnbmF0dXJlKTsKICAgICBteSAkYXR0cklzUG9kVHlwZSA9IElzUG9kVHlwZSgkYXR0clR5
cGUpOwogCiAgICAgbXkgJG5hdGl2ZVR5cGUgPSBHZXROYXRpdmVUeXBlRnJvbVNpZ25hdHVyZSgk
YXR0cmlidXRlLT5zaWduYXR1cmUsIDApOwpAQCAtNTQ0LDcgKzU0NCw3IEBAIEVORAogICAgIG15
ICRnZXR0ZXJGdW5jID0gV0tfbGNmaXJzdCgkYXR0ck5hbWUpOwogICAgICRnZXR0ZXJGdW5jIC49
ICJBbmltYXRlZCIgaWYgJGNvZGVHZW5lcmF0b3ItPklzU1ZHQW5pbWF0ZWRUeXBlKCRhdHRyaWJ1
dGUtPnNpZ25hdHVyZS0+dHlwZSk7CiAKLSAgICBteSAkcmV0dXJuVHlwZSA9ICRjb2RlR2VuZXJh
dG9yLT5TdHJpcE1vZHVsZSgkYXR0cmlidXRlLT5zaWduYXR1cmUtPnR5cGUpOworICAgIG15ICRy
ZXR1cm5UeXBlID0gR2V0VHlwZUZyb21TaWduYXR1cmUoJGF0dHJpYnV0ZS0+c2lnbmF0dXJlKTsK
IAogICAgIG15ICRnZXR0ZXJTdHJpbmc7CiAgICAgaWYgKCRnZXR0ZXJTdHJpbmdVc2VzSW1wKSB7
CkBAIC03MDQsNyArNzA0LDcgQEAgRU5ECiAgICAgaWYgKCRuYXRpdmVUeXBlIGVxICJpbnQiIGFu
ZCAkYXR0cmlidXRlLT5zaWduYXR1cmUtPmV4dGVuZGVkQXR0cmlidXRlcy0+eyJDb252ZXJ0RnJv
bVN0cmluZyJ9KSB7CiAgICAgICAgICRyZXN1bHQgLj0gIikiOwogICAgIH0KLSAgICBteSAkcmV0
dXJuVHlwZSA9ICRjb2RlR2VuZXJhdG9yLT5TdHJpcE1vZHVsZSgkYXR0cmlidXRlLT5zaWduYXR1
cmUtPnR5cGUpOworICAgIG15ICRyZXR1cm5UeXBlID0gR2V0VHlwZUZyb21TaWduYXR1cmUoJGF0
dHJpYnV0ZS0+c2lnbmF0dXJlKTsKICAgICBpZiAoSXNSZWZQdHJUeXBlKCRyZXR1cm5UeXBlKSkg
ewogICAgICAgICAkcmVzdWx0ID0gIldURjo6Z2V0UHRyKCIgLiAkcmVzdWx0IC4gIikiOwogICAg
IH0KQEAgLTE0MDAsNyArMTQwMCw3IEBAIHN1YiBHZW5lcmF0ZUZ1bmN0aW9uQ2FsbFN0cmluZygp
CiAKICAgICBteSAkbmFtZSA9ICRmdW5jdGlvbi0+c2lnbmF0dXJlLT5uYW1lOwogICAgIG15ICRp
c1BvZFR5cGUgPSBJc1BvZFR5cGUoJGltcGxDbGFzc05hbWUpOwotICAgIG15ICRyZXR1cm5UeXBl
ID0gJGNvZGVHZW5lcmF0b3ItPlN0cmlwTW9kdWxlKCRmdW5jdGlvbi0+c2lnbmF0dXJlLT50eXBl
KTsKKyAgICBteSAkcmV0dXJuVHlwZSA9IEdldFR5cGVGcm9tU2lnbmF0dXJlKCRmdW5jdGlvbi0+
c2lnbmF0dXJlKTsKICAgICBteSAkcmV0dXJuc1BvZFR5cGUgPSBJc1BvZFR5cGUoJHJldHVyblR5
cGUpOwogICAgIG15ICRuYXRpdmVSZXR1cm5UeXBlID0gR2V0TmF0aXZlVHlwZSgkcmV0dXJuVHlw
ZSwgMCk7CiAgICAgbXkgJHJlc3VsdCA9ICIiOwpAQCAtMTU2NiwxMiArMTU2NiwyNSBAQCBzdWIg
R2V0Q2xhc3NOYW1lCiB9CiAKIAorc3ViIEdldFR5cGVGcm9tU2lnbmF0dXJlCit7CisgICAgbXkg
JHNpZ25hdHVyZSA9IHNoaWZ0OworCisgICAgbXkgJHR5cGUgPSAkY29kZUdlbmVyYXRvci0+U3Ry
aXBNb2R1bGUoJHNpZ25hdHVyZS0+dHlwZSk7CisgICAgaWYgKCgkdHlwZSBlcSAiRE9NU3RyaW5n
IikgJiYgJHNpZ25hdHVyZS0+ZXh0ZW5kZWRBdHRyaWJ1dGVzLT57IlY4Q3VzdG9tIn0pIHsKKyAg
ICAgICAgJHR5cGUgPSAiQXRvbWljU3RyaW5nIjsKKyAgICB9CisgICAgCisgICAgcmV0dXJuICR0
eXBlOworfQorCisKIHN1YiBHZXROYXRpdmVUeXBlRnJvbVNpZ25hdHVyZQogewogICAgIG15ICRz
aWduYXR1cmUgPSBzaGlmdDsKICAgICBteSAkaXNQYXJhbWV0ZXIgPSBzaGlmdDsKIAotICAgIG15
ICR0eXBlID0gJGNvZGVHZW5lcmF0b3ItPlN0cmlwTW9kdWxlKCRzaWduYXR1cmUtPnR5cGUpOwor
ICAgIG15ICR0eXBlID0gR2V0VHlwZUZyb21TaWduYXR1cmUoJHNpZ25hdHVyZSk7CiAKICAgICBy
ZXR1cm4gR2V0TmF0aXZlVHlwZSgkdHlwZSwgJGlzUGFyYW1ldGVyKTsKIH0KQEAgLTE3NjIsNyAr
MTc3NSw3IEBAIHN1YiBUcmFuc2xhdGVQYXJhbWV0ZXIKIHN1YiBCYXNpY1R5cGVDYW5GYWlsQ29u
dmVyc2lvbgogewogICAgIG15ICRzaWduYXR1cmUgPSBzaGlmdDsKLSAgICBteSAkdHlwZSA9ICRj
b2RlR2VuZXJhdG9yLT5TdHJpcE1vZHVsZSgkc2lnbmF0dXJlLT50eXBlKTsKKyAgICBteSAkdHlw
ZSA9IEdldFR5cGVGcm9tU2lnbmF0dXJlKCRzaWduYXR1cmUpOwogCiAgICAgcmV0dXJuIDEgaWYg
JHR5cGUgZXEgIlNWR0xlbmd0aCI7CiAgICAgcmV0dXJuIDEgaWYgJHR5cGUgZXEgIlNWR01hdHJp
eCI7CkBAIC0xNzc2LDcgKzE3ODksNyBAQCBzdWIgVHlwZUNhbkZhaWxDb252ZXJzaW9uCiB7CiAg
ICAgbXkgJHNpZ25hdHVyZSA9IHNoaWZ0OwogCi0gICAgbXkgJHR5cGUgPSAkY29kZUdlbmVyYXRv
ci0+U3RyaXBNb2R1bGUoJHNpZ25hdHVyZS0+dHlwZSk7CisgICAgbXkgJHR5cGUgPSBHZXRUeXBl
RnJvbVNpZ25hdHVyZSgkc2lnbmF0dXJlKTsKIAogICAgICRpbXBsSW5jbHVkZXN7IkV4Y2VwdGlv
bkNvZGUuaCJ9ID0gMSBpZiAkdHlwZSBlcSAiQXR0ciI7CiAKQEAgLTE3OTIsNyArMTgwNSw3IEBA
IHN1YiBKU1ZhbHVlVG9OYXRpdmUKICAgICBteSAkb2tQYXJhbSA9IHNoaWZ0OwogICAgIG15ICRt
YXliZU9rUGFyYW0gPSAkb2tQYXJhbSA/ICIsICR7b2tQYXJhbX0iIDogIiI7CiAKLSAgICBteSAk
dHlwZSA9ICRjb2RlR2VuZXJhdG9yLT5TdHJpcE1vZHVsZSgkc2lnbmF0dXJlLT50eXBlKTsKKyAg
ICBteSAkdHlwZSA9IEdldFR5cGVGcm9tU2lnbmF0dXJlKCRzaWduYXR1cmUpOwogCiAgICAgcmV0
dXJuICIkdmFsdWUiIGlmICR0eXBlIGVxICJKU09iamVjdCI7CiAgICAgcmV0dXJuICIkdmFsdWUt
PkJvb2xlYW5WYWx1ZSgpIiBpZiAkdHlwZSBlcSAiYm9vbGVhbiI7CkBAIC0xODAzLDcgKzE4MTYs
OCBAQCBzdWIgSlNWYWx1ZVRvTmF0aXZlCiAgICAgcmV0dXJuICJzdGF0aWNfY2FzdDxSYW5nZTo6
Q29tcGFyZUhvdz4oJHZhbHVlLT5JbnQzMlZhbHVlKCkpIiBpZiAkdHlwZSBlcSAiQ29tcGFyZUhv
dyI7CiAgICAgcmV0dXJuICJzdGF0aWNfY2FzdDxTVkdQYWludDo6U1ZHUGFpbnRUeXBlPigkdmFs
dWUtPlRvSW50MzIoKS0+SW50MzJWYWx1ZSgpKSIgaWYgJHR5cGUgZXEgIlNWR1BhaW50VHlwZSI7
CiAKLSAgICByZXR1cm4gInRvV2ViQ29yZVN0cmluZygkdmFsdWUpIiBpZiAkdHlwZSBlcSAiQXRv
bWljU3RyaW5nIiBvciAkdHlwZSBlcSAiRE9NVXNlckRhdGEiOworICAgIHJldHVybiAidjhWYWx1
ZVRvQXRvbWljV2ViQ29yZVN0cmluZygkdmFsdWUpIiBpZiAkdHlwZSBlcSAiQXRvbWljU3RyaW5n
IjsKKyAgICByZXR1cm4gInRvV2ViQ29yZVN0cmluZygkdmFsdWUpIiBpZiAkdHlwZSBlcSAiRE9N
VXNlckRhdGEiOwogICAgIGlmICgkdHlwZSBlcSAiRE9NU3RyaW5nIikgewogICAgICAgICByZXR1
cm4gInRvV2ViQ29yZVN0cmluZ1dpdGhOdWxsQ2hlY2soJHZhbHVlKSIgaWYgJHNpZ25hdHVyZS0+
ZXh0ZW5kZWRBdHRyaWJ1dGVzLT57IkNvbnZlcnROdWxsVG9OdWxsU3RyaW5nIn07CiAgICAgICAg
IHJldHVybiAidG9XZWJDb3JlU3RyaW5nV2l0aE51bGxPclVuZGVmaW5lZENoZWNrKCR2YWx1ZSki
IGlmICRzaWduYXR1cmUtPmV4dGVuZGVkQXR0cmlidXRlcy0+eyJDb252ZXJ0VW5kZWZpbmVkT3JO
dWxsVG9OdWxsU3RyaW5nIn07CkBAIC0xOTgxLDcgKzE5OTUsNyBAQCBzdWIgUmV0dXJuTmF0aXZl
VG9KU1ZhbHVlCiAgICAgbXkgJHNpZ25hdHVyZSA9IHNoaWZ0OwogICAgIG15ICR2YWx1ZSA9IHNo
aWZ0OwogICAgIG15ICRpbmRlbnQgPSBzaGlmdDsKLSAgICBteSAkdHlwZSA9ICRjb2RlR2VuZXJh
dG9yLT5TdHJpcE1vZHVsZSgkc2lnbmF0dXJlLT50eXBlKTsKKyAgICBteSAkdHlwZSA9IEdldFR5
cGVGcm9tU2lnbmF0dXJlKCRzaWduYXR1cmUpOwogICAgIG15ICRjbGFzc05hbWU9ICJWOCR0eXBl
IjsKIAogICAgIHJldHVybiAicmV0dXJuIHY4OjpEYXRlOjpOZXcoc3RhdGljX2Nhc3Q8ZG91Ymxl
PigkdmFsdWUpKSIgaWYgJHR5cGUgZXEgIkRPTVRpbWVTdGFtcCI7CkluZGV4OiBiaW5kaW5ncy92
OC9WOEJpbmRpbmcuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGJpbmRpbmdzL3Y4L1Y4QmluZGluZy5jcHAJ
KHJldmlzaW9uIDQ2NDI2KQorKysgYmluZGluZ3MvdjgvVjhCaW5kaW5nLmNwcAkod29ya2luZyBj
b3B5KQpAQCAtNTEsNiArNTEsMTMgQEAgcHVibGljOgogICAgICAgICB2ODo6Vjg6OkFkanVzdEFt
b3VudE9mRXh0ZXJuYWxBbGxvY2F0ZWRNZW1vcnkoMiAqIGxlbmd0aCgpKTsKICAgICB9CiAKKyAg
ICBleHBsaWNpdCBXZWJDb3JlU3RyaW5nUmVzb3VyY2UoY29uc3QgQXRvbWljU3RyaW5nJiBzdHJp
bmcpCisgICAgICAgIDogbV9pbXBsKHN0cmluZy5pbXBsKCkpLCBtX2F0b21pY0ltcGwoc3RyaW5n
LmltcGwoKSkKKyAgICB7CisgICAgICAgIEFTU0VSVChXVEY6OmlzTWFpblRocmVhZCgpKTsKKyAg
ICAgICAgdjg6OlY4OjpBZGp1c3RBbW91bnRPZkV4dGVybmFsQWxsb2NhdGVkTWVtb3J5KDIgKiBs
ZW5ndGgoKSk7CisgICAgfQorCiAgICAgdmlydHVhbCB+V2ViQ29yZVN0cmluZ1Jlc291cmNlKCkK
ICAgICB7CiAgICAgICAgIHY4OjpWODo6QWRqdXN0QW1vdW50T2ZFeHRlcm5hbEFsbG9jYXRlZE1l
bW9yeSgtMiAqIGxlbmd0aCgpKTsKQEAgLTY1LDkgKzcyLDIzIEBAIHB1YmxpYzoKIAogICAgIFN0
cmluZyB3ZWJjb3JlU3RyaW5nKCkgeyByZXR1cm4gbV9pbXBsOyB9CiAKKyAgICBBdG9taWNTdHJp
bmcgYXRvbWljU3RyaW5nKCkKKyAgICB7CisgICAgICAgIEFTU0VSVChXVEY6OmlzTWFpblRocmVh
ZCgpKTsKKyAgICAgICAgaWYgKG1fYXRvbWljSW1wbC5pc051bGwoKSkKKyAgICAgICAgICAgIG1f
YXRvbWljSW1wbCA9IEF0b21pY1N0cmluZyhtX2ltcGwpOworICAgICAgICByZXR1cm4gbV9hdG9t
aWNJbXBsOworICAgIH0KKwogcHJpdmF0ZToKICAgICAvLyBBIHNoYWxsb3cgY29weSBvZiB0aGUg
c3RyaW5nLiBLZWVwcyB0aGUgc3RyaW5nIGJ1ZmZlciBhbGl2ZSB1bnRpbCB0aGUgVjggZW5naW5l
IGdhcmJhZ2UgY29sbGVjdHMgaXQuCiAgICAgU3RyaW5nIG1faW1wbDsKKyAgICAvLyBJZiB0aGlz
IHN0cmluZyBpcyBhdG9taWMgb3IgaGFzIGJlZW4gbWFkZSBhdG9taWMgZWFybGllciB0aGUKKyAg
ICAvLyBhdG9taWMgc3RyaW5nIGlzIGhlbGQgaGVyZS4gIEluIHRoZSBjYXNlIHdoZXJlIHRoZSBz
dHJpbmcgc3RhcnRzCisgICAgLy8gb2ZmIG5vbi1hdG9taWMgYW5kIGJlY29tZXMgYXRvbWljIGxh
dGVyIGl0IGlzIG5lY2Vzc2FyeSB0byBrZWVwCisgICAgLy8gdGhlIG9yaWdpbmFsIHN0cmluZyBh
bGl2ZSBiZWNhdXNlIHY4IG1heSBrZWVwIGRlcml2ZWQgcG9pbnRlcnMKKyAgICAvLyBpbnRvIHRo
YXQgc3RyaW5nLgorICAgIEF0b21pY1N0cmluZyBtX2F0b21pY0ltcGw7CiB9OwogCiBTdHJpbmcg
djhTdHJpbmdUb1dlYkNvcmVTdHJpbmcodjg6OkhhbmRsZTx2ODo6U3RyaW5nPiB2OFN0cmluZywg
Ym9vbCBleHRlcm5hbGl6ZSkKQEAgLTk4LDcgKzExOSw3IEBAIFN0cmluZyB2OFN0cmluZ1RvV2Vi
Q29yZVN0cmluZyh2ODo6SGFuZGwKIAogU3RyaW5nIHY4VmFsdWVUb1dlYkNvcmVTdHJpbmcodjg6
OkhhbmRsZTx2ODo6VmFsdWU+IG9iamVjdCkKIHsKLSAgICBpZiAob2JqZWN0LT5Jc1N0cmluZygp
KSAKKyAgICBpZiAob2JqZWN0LT5Jc1N0cmluZygpKQogICAgICAgICByZXR1cm4gdjhTdHJpbmdU
b1dlYkNvcmVTdHJpbmcodjg6OkhhbmRsZTx2ODo6U3RyaW5nPjo6Q2FzdChvYmplY3QpLCB0cnVl
KTsKIAogICAgIGlmIChvYmplY3QtPklzSW50MzIoKSkgewpAQCAtMTE0LDcgKzEzNSw3IEBAIFN0
cmluZyB2OFZhbHVlVG9XZWJDb3JlU3RyaW5nKHY4OjpIYW5kbGUKICAgICAgICAgICAgICAgICBs
b3dOdW1iZXJzW3ZhbHVlXSA9IHZhbHVlU3RyaW5nOwogICAgICAgICAgICAgICAgIHdlYkNvcmVT
dHJpbmcgPSB2YWx1ZVN0cmluZzsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIAorICAg
ICAgICB9IGVsc2UKICAgICAgICAgICAgIHdlYkNvcmVTdHJpbmcgPSBTdHJpbmc6Om51bWJlcih2
YWx1ZSk7CiAgICAgICAgIHJldHVybiB3ZWJDb3JlU3RyaW5nOwogICAgIH0KQEAgLTEzMCwxMyAr
MTUxLDM0IEBAIFN0cmluZyB2OFZhbHVlVG9XZWJDb3JlU3RyaW5nKHY4OjpIYW5kbGUKIAogQXRv
bWljU3RyaW5nIHY4U3RyaW5nVG9BdG9taWNXZWJDb3JlU3RyaW5nKHY4OjpIYW5kbGU8djg6OlN0
cmluZz4gdjhTdHJpbmcpCiB7Ci0gICAgU3RyaW5nIHN0cmluZyA9IHY4U3RyaW5nVG9XZWJDb3Jl
U3RyaW5nKHY4U3RyaW5nLCB0cnVlKTsKLSAgICByZXR1cm4gQXRvbWljU3RyaW5nKHN0cmluZyk7
CisgICAgV2ViQ29yZVN0cmluZ1Jlc291cmNlKiBzdHJpbmdSZXNvdXJjZSA9IHN0YXRpY19jYXN0
PFdlYkNvcmVTdHJpbmdSZXNvdXJjZSo+KHY4U3RyaW5nLT5HZXRFeHRlcm5hbFN0cmluZ1Jlc291
cmNlKCkpOworICAgIGlmIChzdHJpbmdSZXNvdXJjZSkKKyAgICAgICAgcmV0dXJuIHN0cmluZ1Jl
c291cmNlLT5hdG9taWNTdHJpbmcoKTsKKworICAgIGludCBsZW5ndGggPSB2OFN0cmluZy0+TGVu
Z3RoKCk7CisgICAgaWYgKCFsZW5ndGgpIHsKKyAgICAgICAgLy8gQXZvaWQgdHJ5aW5nIHRvIG1v
cnBoIGVtcHR5IHN0cmluZ3MsIGFzIHRoZXkgZG8gbm90IGhhdmUgZW5vdWdoIHJvb20gdG8gY29u
dGFpbiB0aGUgZXh0ZXJuYWwgcmVmZXJlbmNlLgorICAgICAgICByZXR1cm4gU3RyaW5nSW1wbDo6
ZW1wdHkoKTsKKyAgICB9CisKKyAgICBVQ2hhciogYnVmZmVyOworICAgIFN0cmluZyBwbGFpblJl
c3VsdCA9IFN0cmluZzo6Y3JlYXRlVW5pbml0aWFsaXplZChsZW5ndGgsIGJ1ZmZlcik7CisgICAg
djhTdHJpbmctPldyaXRlKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDE2X3QqPihidWZmZXIpLCAwLCBs
ZW5ndGgpOworICAgIEF0b21pY1N0cmluZyByZXN1bHQocGxhaW5SZXN1bHQpOworCisgICAgV2Vi
Q29yZVN0cmluZ1Jlc291cmNlKiByZXNvdXJjZSA9IG5ldyBXZWJDb3JlU3RyaW5nUmVzb3VyY2Uo
cmVzdWx0KTsKKyAgICBpZiAoIXY4U3RyaW5nLT5NYWtlRXh0ZXJuYWwocmVzb3VyY2UpKSB7Cisg
ICAgICAgIC8vIEluIGNhc2Ugb2YgYSBmYWlsdXJlIGRlbGV0ZSB0aGUgZXh0ZXJuYWwgcmVzb3Vy
Y2UgYXMgaXQgd2FzIG5vdCB1c2VkLgorICAgICAgIGRlbGV0ZSByZXNvdXJjZTsKKyAgICB9Cisg
ICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotQXRvbWljU3RyaW5nIHY4VmFsdWVUb0F0b21pY1dlYkNv
cmVTdHJpbmcodjg6OkhhbmRsZTx2ODo6VmFsdWU+IHY4U3RyaW5nKQorQXRvbWljU3RyaW5nIHY4
VmFsdWVUb0F0b21pY1dlYkNvcmVTdHJpbmcodjg6OkhhbmRsZTx2ODo6VmFsdWU+IHY4VmFsdWUp
CiB7Ci0gICAgU3RyaW5nIHN0cmluZyA9IHY4VmFsdWVUb1dlYkNvcmVTdHJpbmcodjhTdHJpbmcp
OworICAgIGlmICh2OFZhbHVlLT5Jc1N0cmluZygpKQorICAgICAgICByZXR1cm4gdjhTdHJpbmdU
b0F0b21pY1dlYkNvcmVTdHJpbmcodjg6OkhhbmRsZTx2ODo6U3RyaW5nPjo6Q2FzdCh2OFZhbHVl
KSk7CisgICAgU3RyaW5nIHN0cmluZyA9IHY4VmFsdWVUb1dlYkNvcmVTdHJpbmcodjhWYWx1ZSk7
CiAgICAgcmV0dXJuIEF0b21pY1N0cmluZyhzdHJpbmcpOwogfQogCkluZGV4OiBkb20vRG9jdW1l
bnQuaWRsCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIGRvbS9Eb2N1bWVudC5pZGwJKHJldmlzaW9uIDQ2NDI2KQor
KysgZG9tL0RvY3VtZW50LmlkbAkod29ya2luZyBjb3B5KQpAQCAtNjQsNyArNjQsNyBAQCBtb2R1
bGUgY29yZSB7CiAgICAgICAgICAgICByYWlzZXMgKERPTUV4Y2VwdGlvbik7CiAgICAgICAgIFtP
bGRTdHlsZU9iakNdIE5vZGVMaXN0IGdldEVsZW1lbnRzQnlUYWdOYW1lTlMoaW4gW0NvbnZlcnRO
dWxsVG9OdWxsU3RyaW5nXSBET01TdHJpbmcgbmFtZXNwYWNlVVJJLAogICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIERPTVN0cmluZyBsb2Nh
bE5hbWUpOwotICAgICAgICBFbGVtZW50ICAgICAgICAgICAgZ2V0RWxlbWVudEJ5SWQoaW4gRE9N
U3RyaW5nIGVsZW1lbnRJZCk7CisgICAgICAgIEVsZW1lbnQgICAgICAgICAgICBnZXRFbGVtZW50
QnlJZChpbiBbVjhDdXN0b209SGludEF0b21pY10gRE9NU3RyaW5nIGVsZW1lbnRJZCk7CiAKICAg
ICAgICAgLy8gRE9NIExldmVsIDMgQ29yZQogCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>33721</attachid>
            <date>2009-07-29 10:23:02 -0700</date>
            <delta_ts>2009-07-31 03:02:52 -0700</delta_ts>
            <desc>Fixed whitespace issue</desc>
            <filename>patch</filename>
            <type>text/plain</type>
            <size>9719</size>
            <attacher name="Christian Plesner Hansen">christian.plesner.hansen</attacher>
            
              <data encoding="base64">SW5kZXg6IENoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBDaGFuZ2VMb2cJKHJldmlzaW9uIDQ2NDc3
KQorKysgQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMjEgQEAKKzIwMDktMDct
MjggIENocmlzdGlhbiBQbGVzbmVyIEhhbnNlbiAgPGNocmlzdGlhbi5wbGVzbmVyLmhhbnNlbkBn
bWFpbC5jb20+CisKKyAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgIFtWOF0g
Q2FjaGUgYXRvbWljIHN0cmluZ3MgaW4gZXh0ZXJuYWxpemVkIHN0cmluZ3MgdGhlIGZpcnN0IHRp
bWUKKyAgICB0aGUgc3RyaW5nIGlzIGNvbnZlcnRlZC4gIEFkZGVkIFY4Q3VzdG9tIElETCBhbm5v
dGF0aW9uIGZvcgorICAgIGhpbnRpbmcgdGhhdCBjb252ZXJ0aW5nIGEgc3RyaW5nIGRpcmVjdGx5
IHRvIGFuIGF0b21pYyBzdHJpbmcgaXMgYQorICAgIGdvb2QgaWRlYS4KKworICAgICAgICAqIGJp
bmRpbmdzL3NjcmlwdHMvQ29kZUdlbmVyYXRvclY4LnBtOgorICAgICAgICAqIGJpbmRpbmdzL3Y4
L1Y4QmluZGluZy5jcHA6CisgICAgICAgIChXZWJDb3JlOjpXZWJDb3JlU3RyaW5nUmVzb3VyY2U6
OldlYkNvcmVTdHJpbmdSZXNvdXJjZSk6CisgICAgICAgIChXZWJDb3JlOjpXZWJDb3JlU3RyaW5n
UmVzb3VyY2U6OmF0b21pY1N0cmluZyk6CisgICAgICAgIChXZWJDb3JlOjp2OFZhbHVlVG9XZWJD
b3JlU3RyaW5nKToKKyAgICAgICAgKFdlYkNvcmU6OnY4U3RyaW5nVG9BdG9taWNXZWJDb3JlU3Ry
aW5nKToKKyAgICAgICAgKFdlYkNvcmU6OnY4VmFsdWVUb0F0b21pY1dlYkNvcmVTdHJpbmcpOgor
ICAgICAgICAqIGRvbS9Eb2N1bWVudC5pZGw6CisKIDIwMDktMDctMjggIE5pa29sYXMgWmltbWVy
bWFubiAgPG5pa29sYXMuemltbWVybWFubkB0b3JjaG1vYmlsZS5jb20+CiAKICAgICAgICAgUmV2
aWV3ZWQgYnkgR2VvcmdlIFN0YWlrb3MuCkluZGV4OiBiaW5kaW5ncy9zY3JpcHRzL0NvZGVHZW5l
cmF0b3JWOC5wbQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBiaW5kaW5ncy9zY3JpcHRzL0NvZGVHZW5lcmF0b3JW
OC5wbQkocmV2aXNpb24gNDY0MjYpCisrKyBiaW5kaW5ncy9zY3JpcHRzL0NvZGVHZW5lcmF0b3JW
OC5wbQkod29ya2luZyBjb3B5KQpAQCAtNDYxLDcgKzQ2MSw3IEBAIHN1YiBHZW5lcmF0ZU5vcm1h
bEF0dHJHZXR0ZXIKICAgICBteSAkYXR0ck5hbWUgPSAkYXR0cmlidXRlLT5zaWduYXR1cmUtPm5h
bWU7CiAgICAgJGltcGxJbmNsdWRlc3siVjhQcm94eS5oIn0gPSAxOwogCi0gICAgbXkgJGF0dHJU
eXBlID0gJGNvZGVHZW5lcmF0b3ItPlN0cmlwTW9kdWxlKCRhdHRyaWJ1dGUtPnNpZ25hdHVyZS0+
dHlwZSk7CisgICAgbXkgJGF0dHJUeXBlID0gR2V0VHlwZUZyb21TaWduYXR1cmUoJGF0dHJpYnV0
ZS0+c2lnbmF0dXJlKTsKICAgICBteSAkYXR0cklzUG9kVHlwZSA9IElzUG9kVHlwZSgkYXR0clR5
cGUpOwogCiAgICAgbXkgJG5hdGl2ZVR5cGUgPSBHZXROYXRpdmVUeXBlRnJvbVNpZ25hdHVyZSgk
YXR0cmlidXRlLT5zaWduYXR1cmUsIDApOwpAQCAtNTQ0LDcgKzU0NCw3IEBAIEVORAogICAgIG15
ICRnZXR0ZXJGdW5jID0gV0tfbGNmaXJzdCgkYXR0ck5hbWUpOwogICAgICRnZXR0ZXJGdW5jIC49
ICJBbmltYXRlZCIgaWYgJGNvZGVHZW5lcmF0b3ItPklzU1ZHQW5pbWF0ZWRUeXBlKCRhdHRyaWJ1
dGUtPnNpZ25hdHVyZS0+dHlwZSk7CiAKLSAgICBteSAkcmV0dXJuVHlwZSA9ICRjb2RlR2VuZXJh
dG9yLT5TdHJpcE1vZHVsZSgkYXR0cmlidXRlLT5zaWduYXR1cmUtPnR5cGUpOworICAgIG15ICRy
ZXR1cm5UeXBlID0gR2V0VHlwZUZyb21TaWduYXR1cmUoJGF0dHJpYnV0ZS0+c2lnbmF0dXJlKTsK
IAogICAgIG15ICRnZXR0ZXJTdHJpbmc7CiAgICAgaWYgKCRnZXR0ZXJTdHJpbmdVc2VzSW1wKSB7
CkBAIC03MDQsNyArNzA0LDcgQEAgRU5ECiAgICAgaWYgKCRuYXRpdmVUeXBlIGVxICJpbnQiIGFu
ZCAkYXR0cmlidXRlLT5zaWduYXR1cmUtPmV4dGVuZGVkQXR0cmlidXRlcy0+eyJDb252ZXJ0RnJv
bVN0cmluZyJ9KSB7CiAgICAgICAgICRyZXN1bHQgLj0gIikiOwogICAgIH0KLSAgICBteSAkcmV0
dXJuVHlwZSA9ICRjb2RlR2VuZXJhdG9yLT5TdHJpcE1vZHVsZSgkYXR0cmlidXRlLT5zaWduYXR1
cmUtPnR5cGUpOworICAgIG15ICRyZXR1cm5UeXBlID0gR2V0VHlwZUZyb21TaWduYXR1cmUoJGF0
dHJpYnV0ZS0+c2lnbmF0dXJlKTsKICAgICBpZiAoSXNSZWZQdHJUeXBlKCRyZXR1cm5UeXBlKSkg
ewogICAgICAgICAkcmVzdWx0ID0gIldURjo6Z2V0UHRyKCIgLiAkcmVzdWx0IC4gIikiOwogICAg
IH0KQEAgLTE0MDAsNyArMTQwMCw3IEBAIHN1YiBHZW5lcmF0ZUZ1bmN0aW9uQ2FsbFN0cmluZygp
CiAKICAgICBteSAkbmFtZSA9ICRmdW5jdGlvbi0+c2lnbmF0dXJlLT5uYW1lOwogICAgIG15ICRp
c1BvZFR5cGUgPSBJc1BvZFR5cGUoJGltcGxDbGFzc05hbWUpOwotICAgIG15ICRyZXR1cm5UeXBl
ID0gJGNvZGVHZW5lcmF0b3ItPlN0cmlwTW9kdWxlKCRmdW5jdGlvbi0+c2lnbmF0dXJlLT50eXBl
KTsKKyAgICBteSAkcmV0dXJuVHlwZSA9IEdldFR5cGVGcm9tU2lnbmF0dXJlKCRmdW5jdGlvbi0+
c2lnbmF0dXJlKTsKICAgICBteSAkcmV0dXJuc1BvZFR5cGUgPSBJc1BvZFR5cGUoJHJldHVyblR5
cGUpOwogICAgIG15ICRuYXRpdmVSZXR1cm5UeXBlID0gR2V0TmF0aXZlVHlwZSgkcmV0dXJuVHlw
ZSwgMCk7CiAgICAgbXkgJHJlc3VsdCA9ICIiOwpAQCAtMTU2NiwxMiArMTU2NiwyNSBAQCBzdWIg
R2V0Q2xhc3NOYW1lCiB9CiAKIAorc3ViIEdldFR5cGVGcm9tU2lnbmF0dXJlCit7CisgICAgbXkg
JHNpZ25hdHVyZSA9IHNoaWZ0OworCisgICAgbXkgJHR5cGUgPSAkY29kZUdlbmVyYXRvci0+U3Ry
aXBNb2R1bGUoJHNpZ25hdHVyZS0+dHlwZSk7CisgICAgaWYgKCgkdHlwZSBlcSAiRE9NU3RyaW5n
IikgJiYgJHNpZ25hdHVyZS0+ZXh0ZW5kZWRBdHRyaWJ1dGVzLT57IlY4Q3VzdG9tIn0pIHsKKyAg
ICAgICAgJHR5cGUgPSAiQXRvbWljU3RyaW5nIjsKKyAgICB9CisgICAgCisgICAgcmV0dXJuICR0
eXBlOworfQorCisKIHN1YiBHZXROYXRpdmVUeXBlRnJvbVNpZ25hdHVyZQogewogICAgIG15ICRz
aWduYXR1cmUgPSBzaGlmdDsKICAgICBteSAkaXNQYXJhbWV0ZXIgPSBzaGlmdDsKIAotICAgIG15
ICR0eXBlID0gJGNvZGVHZW5lcmF0b3ItPlN0cmlwTW9kdWxlKCRzaWduYXR1cmUtPnR5cGUpOwor
ICAgIG15ICR0eXBlID0gR2V0VHlwZUZyb21TaWduYXR1cmUoJHNpZ25hdHVyZSk7CiAKICAgICBy
ZXR1cm4gR2V0TmF0aXZlVHlwZSgkdHlwZSwgJGlzUGFyYW1ldGVyKTsKIH0KQEAgLTE3NjIsNyAr
MTc3NSw3IEBAIHN1YiBUcmFuc2xhdGVQYXJhbWV0ZXIKIHN1YiBCYXNpY1R5cGVDYW5GYWlsQ29u
dmVyc2lvbgogewogICAgIG15ICRzaWduYXR1cmUgPSBzaGlmdDsKLSAgICBteSAkdHlwZSA9ICRj
b2RlR2VuZXJhdG9yLT5TdHJpcE1vZHVsZSgkc2lnbmF0dXJlLT50eXBlKTsKKyAgICBteSAkdHlw
ZSA9IEdldFR5cGVGcm9tU2lnbmF0dXJlKCRzaWduYXR1cmUpOwogCiAgICAgcmV0dXJuIDEgaWYg
JHR5cGUgZXEgIlNWR0xlbmd0aCI7CiAgICAgcmV0dXJuIDEgaWYgJHR5cGUgZXEgIlNWR01hdHJp
eCI7CkBAIC0xNzc2LDcgKzE3ODksNyBAQCBzdWIgVHlwZUNhbkZhaWxDb252ZXJzaW9uCiB7CiAg
ICAgbXkgJHNpZ25hdHVyZSA9IHNoaWZ0OwogCi0gICAgbXkgJHR5cGUgPSAkY29kZUdlbmVyYXRv
ci0+U3RyaXBNb2R1bGUoJHNpZ25hdHVyZS0+dHlwZSk7CisgICAgbXkgJHR5cGUgPSBHZXRUeXBl
RnJvbVNpZ25hdHVyZSgkc2lnbmF0dXJlKTsKIAogICAgICRpbXBsSW5jbHVkZXN7IkV4Y2VwdGlv
bkNvZGUuaCJ9ID0gMSBpZiAkdHlwZSBlcSAiQXR0ciI7CiAKQEAgLTE3OTIsNyArMTgwNSw3IEBA
IHN1YiBKU1ZhbHVlVG9OYXRpdmUKICAgICBteSAkb2tQYXJhbSA9IHNoaWZ0OwogICAgIG15ICRt
YXliZU9rUGFyYW0gPSAkb2tQYXJhbSA/ICIsICR7b2tQYXJhbX0iIDogIiI7CiAKLSAgICBteSAk
dHlwZSA9ICRjb2RlR2VuZXJhdG9yLT5TdHJpcE1vZHVsZSgkc2lnbmF0dXJlLT50eXBlKTsKKyAg
ICBteSAkdHlwZSA9IEdldFR5cGVGcm9tU2lnbmF0dXJlKCRzaWduYXR1cmUpOwogCiAgICAgcmV0
dXJuICIkdmFsdWUiIGlmICR0eXBlIGVxICJKU09iamVjdCI7CiAgICAgcmV0dXJuICIkdmFsdWUt
PkJvb2xlYW5WYWx1ZSgpIiBpZiAkdHlwZSBlcSAiYm9vbGVhbiI7CkBAIC0xODAzLDcgKzE4MTYs
OCBAQCBzdWIgSlNWYWx1ZVRvTmF0aXZlCiAgICAgcmV0dXJuICJzdGF0aWNfY2FzdDxSYW5nZTo6
Q29tcGFyZUhvdz4oJHZhbHVlLT5JbnQzMlZhbHVlKCkpIiBpZiAkdHlwZSBlcSAiQ29tcGFyZUhv
dyI7CiAgICAgcmV0dXJuICJzdGF0aWNfY2FzdDxTVkdQYWludDo6U1ZHUGFpbnRUeXBlPigkdmFs
dWUtPlRvSW50MzIoKS0+SW50MzJWYWx1ZSgpKSIgaWYgJHR5cGUgZXEgIlNWR1BhaW50VHlwZSI7
CiAKLSAgICByZXR1cm4gInRvV2ViQ29yZVN0cmluZygkdmFsdWUpIiBpZiAkdHlwZSBlcSAiQXRv
bWljU3RyaW5nIiBvciAkdHlwZSBlcSAiRE9NVXNlckRhdGEiOworICAgIHJldHVybiAidjhWYWx1
ZVRvQXRvbWljV2ViQ29yZVN0cmluZygkdmFsdWUpIiBpZiAkdHlwZSBlcSAiQXRvbWljU3RyaW5n
IjsKKyAgICByZXR1cm4gInRvV2ViQ29yZVN0cmluZygkdmFsdWUpIiBpZiAkdHlwZSBlcSAiRE9N
VXNlckRhdGEiOwogICAgIGlmICgkdHlwZSBlcSAiRE9NU3RyaW5nIikgewogICAgICAgICByZXR1
cm4gInRvV2ViQ29yZVN0cmluZ1dpdGhOdWxsQ2hlY2soJHZhbHVlKSIgaWYgJHNpZ25hdHVyZS0+
ZXh0ZW5kZWRBdHRyaWJ1dGVzLT57IkNvbnZlcnROdWxsVG9OdWxsU3RyaW5nIn07CiAgICAgICAg
IHJldHVybiAidG9XZWJDb3JlU3RyaW5nV2l0aE51bGxPclVuZGVmaW5lZENoZWNrKCR2YWx1ZSki
IGlmICRzaWduYXR1cmUtPmV4dGVuZGVkQXR0cmlidXRlcy0+eyJDb252ZXJ0VW5kZWZpbmVkT3JO
dWxsVG9OdWxsU3RyaW5nIn07CkBAIC0xOTgxLDcgKzE5OTUsNyBAQCBzdWIgUmV0dXJuTmF0aXZl
VG9KU1ZhbHVlCiAgICAgbXkgJHNpZ25hdHVyZSA9IHNoaWZ0OwogICAgIG15ICR2YWx1ZSA9IHNo
aWZ0OwogICAgIG15ICRpbmRlbnQgPSBzaGlmdDsKLSAgICBteSAkdHlwZSA9ICRjb2RlR2VuZXJh
dG9yLT5TdHJpcE1vZHVsZSgkc2lnbmF0dXJlLT50eXBlKTsKKyAgICBteSAkdHlwZSA9IEdldFR5
cGVGcm9tU2lnbmF0dXJlKCRzaWduYXR1cmUpOwogICAgIG15ICRjbGFzc05hbWU9ICJWOCR0eXBl
IjsKIAogICAgIHJldHVybiAicmV0dXJuIHY4OjpEYXRlOjpOZXcoc3RhdGljX2Nhc3Q8ZG91Ymxl
PigkdmFsdWUpKSIgaWYgJHR5cGUgZXEgIkRPTVRpbWVTdGFtcCI7CkluZGV4OiBiaW5kaW5ncy92
OC9WOEJpbmRpbmcuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGJpbmRpbmdzL3Y4L1Y4QmluZGluZy5jcHAJ
KHJldmlzaW9uIDQ2NDI2KQorKysgYmluZGluZ3MvdjgvVjhCaW5kaW5nLmNwcAkod29ya2luZyBj
b3B5KQpAQCAtNTEsNiArNTEsMTMgQEAgcHVibGljOgogICAgICAgICB2ODo6Vjg6OkFkanVzdEFt
b3VudE9mRXh0ZXJuYWxBbGxvY2F0ZWRNZW1vcnkoMiAqIGxlbmd0aCgpKTsKICAgICB9CiAKKyAg
ICBleHBsaWNpdCBXZWJDb3JlU3RyaW5nUmVzb3VyY2UoY29uc3QgQXRvbWljU3RyaW5nJiBzdHJp
bmcpCisgICAgICAgIDogbV9pbXBsKHN0cmluZy5pbXBsKCkpLCBtX2F0b21pY0ltcGwoc3RyaW5n
LmltcGwoKSkKKyAgICB7CisgICAgICAgIEFTU0VSVChXVEY6OmlzTWFpblRocmVhZCgpKTsKKyAg
ICAgICAgdjg6OlY4OjpBZGp1c3RBbW91bnRPZkV4dGVybmFsQWxsb2NhdGVkTWVtb3J5KDIgKiBs
ZW5ndGgoKSk7CisgICAgfQorCiAgICAgdmlydHVhbCB+V2ViQ29yZVN0cmluZ1Jlc291cmNlKCkK
ICAgICB7CiAgICAgICAgIHY4OjpWODo6QWRqdXN0QW1vdW50T2ZFeHRlcm5hbEFsbG9jYXRlZE1l
bW9yeSgtMiAqIGxlbmd0aCgpKTsKQEAgLTY1LDkgKzcyLDIzIEBAIHB1YmxpYzoKIAogICAgIFN0
cmluZyB3ZWJjb3JlU3RyaW5nKCkgeyByZXR1cm4gbV9pbXBsOyB9CiAKKyAgICBBdG9taWNTdHJp
bmcgYXRvbWljU3RyaW5nKCkKKyAgICB7CisgICAgICAgIEFTU0VSVChXVEY6OmlzTWFpblRocmVh
ZCgpKTsKKyAgICAgICAgaWYgKG1fYXRvbWljSW1wbC5pc051bGwoKSkKKyAgICAgICAgICAgIG1f
YXRvbWljSW1wbCA9IEF0b21pY1N0cmluZyhtX2ltcGwpOworICAgICAgICByZXR1cm4gbV9hdG9t
aWNJbXBsOworICAgIH0KKwogcHJpdmF0ZToKICAgICAvLyBBIHNoYWxsb3cgY29weSBvZiB0aGUg
c3RyaW5nLiBLZWVwcyB0aGUgc3RyaW5nIGJ1ZmZlciBhbGl2ZSB1bnRpbCB0aGUgVjggZW5naW5l
IGdhcmJhZ2UgY29sbGVjdHMgaXQuCiAgICAgU3RyaW5nIG1faW1wbDsKKyAgICAvLyBJZiB0aGlz
IHN0cmluZyBpcyBhdG9taWMgb3IgaGFzIGJlZW4gbWFkZSBhdG9taWMgZWFybGllciB0aGUKKyAg
ICAvLyBhdG9taWMgc3RyaW5nIGlzIGhlbGQgaGVyZS4gIEluIHRoZSBjYXNlIHdoZXJlIHRoZSBz
dHJpbmcgc3RhcnRzCisgICAgLy8gb2ZmIG5vbi1hdG9taWMgYW5kIGJlY29tZXMgYXRvbWljIGxh
dGVyIGl0IGlzIG5lY2Vzc2FyeSB0byBrZWVwCisgICAgLy8gdGhlIG9yaWdpbmFsIHN0cmluZyBh
bGl2ZSBiZWNhdXNlIHY4IG1heSBrZWVwIGRlcml2ZWQgcG9pbnRlcnMKKyAgICAvLyBpbnRvIHRo
YXQgc3RyaW5nLgorICAgIEF0b21pY1N0cmluZyBtX2F0b21pY0ltcGw7CiB9OwogCiBTdHJpbmcg
djhTdHJpbmdUb1dlYkNvcmVTdHJpbmcodjg6OkhhbmRsZTx2ODo6U3RyaW5nPiB2OFN0cmluZywg
Ym9vbCBleHRlcm5hbGl6ZSkKQEAgLTk4LDcgKzExOSw3IEBAIFN0cmluZyB2OFN0cmluZ1RvV2Vi
Q29yZVN0cmluZyh2ODo6SGFuZGwKIAogU3RyaW5nIHY4VmFsdWVUb1dlYkNvcmVTdHJpbmcodjg6
OkhhbmRsZTx2ODo6VmFsdWU+IG9iamVjdCkKIHsKLSAgICBpZiAob2JqZWN0LT5Jc1N0cmluZygp
KSAKKyAgICBpZiAob2JqZWN0LT5Jc1N0cmluZygpKQogICAgICAgICByZXR1cm4gdjhTdHJpbmdU
b1dlYkNvcmVTdHJpbmcodjg6OkhhbmRsZTx2ODo6U3RyaW5nPjo6Q2FzdChvYmplY3QpLCB0cnVl
KTsKIAogICAgIGlmIChvYmplY3QtPklzSW50MzIoKSkgewpAQCAtMTE0LDcgKzEzNSw3IEBAIFN0
cmluZyB2OFZhbHVlVG9XZWJDb3JlU3RyaW5nKHY4OjpIYW5kbGUKICAgICAgICAgICAgICAgICBs
b3dOdW1iZXJzW3ZhbHVlXSA9IHZhbHVlU3RyaW5nOwogICAgICAgICAgICAgICAgIHdlYkNvcmVT
dHJpbmcgPSB2YWx1ZVN0cmluZzsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIAorICAg
ICAgICB9IGVsc2UKICAgICAgICAgICAgIHdlYkNvcmVTdHJpbmcgPSBTdHJpbmc6Om51bWJlcih2
YWx1ZSk7CiAgICAgICAgIHJldHVybiB3ZWJDb3JlU3RyaW5nOwogICAgIH0KQEAgLTEzMCwxMyAr
MTUxLDM0IEBAIFN0cmluZyB2OFZhbHVlVG9XZWJDb3JlU3RyaW5nKHY4OjpIYW5kbGUKIAogQXRv
bWljU3RyaW5nIHY4U3RyaW5nVG9BdG9taWNXZWJDb3JlU3RyaW5nKHY4OjpIYW5kbGU8djg6OlN0
cmluZz4gdjhTdHJpbmcpCiB7Ci0gICAgU3RyaW5nIHN0cmluZyA9IHY4U3RyaW5nVG9XZWJDb3Jl
U3RyaW5nKHY4U3RyaW5nLCB0cnVlKTsKLSAgICByZXR1cm4gQXRvbWljU3RyaW5nKHN0cmluZyk7
CisgICAgV2ViQ29yZVN0cmluZ1Jlc291cmNlKiBzdHJpbmdSZXNvdXJjZSA9IHN0YXRpY19jYXN0
PFdlYkNvcmVTdHJpbmdSZXNvdXJjZSo+KHY4U3RyaW5nLT5HZXRFeHRlcm5hbFN0cmluZ1Jlc291
cmNlKCkpOworICAgIGlmIChzdHJpbmdSZXNvdXJjZSkKKyAgICAgICAgcmV0dXJuIHN0cmluZ1Jl
c291cmNlLT5hdG9taWNTdHJpbmcoKTsKKworICAgIGludCBsZW5ndGggPSB2OFN0cmluZy0+TGVu
Z3RoKCk7CisgICAgaWYgKCFsZW5ndGgpIHsKKyAgICAgICAgLy8gQXZvaWQgdHJ5aW5nIHRvIG1v
cnBoIGVtcHR5IHN0cmluZ3MsIGFzIHRoZXkgZG8gbm90IGhhdmUgZW5vdWdoIHJvb20gdG8gY29u
dGFpbiB0aGUgZXh0ZXJuYWwgcmVmZXJlbmNlLgorICAgICAgICByZXR1cm4gU3RyaW5nSW1wbDo6
ZW1wdHkoKTsKKyAgICB9CisKKyAgICBVQ2hhciogYnVmZmVyOworICAgIFN0cmluZyBwbGFpblJl
c3VsdCA9IFN0cmluZzo6Y3JlYXRlVW5pbml0aWFsaXplZChsZW5ndGgsIGJ1ZmZlcik7CisgICAg
djhTdHJpbmctPldyaXRlKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDE2X3QqPihidWZmZXIpLCAwLCBs
ZW5ndGgpOworICAgIEF0b21pY1N0cmluZyByZXN1bHQocGxhaW5SZXN1bHQpOworCisgICAgV2Vi
Q29yZVN0cmluZ1Jlc291cmNlKiByZXNvdXJjZSA9IG5ldyBXZWJDb3JlU3RyaW5nUmVzb3VyY2Uo
cmVzdWx0KTsKKyAgICBpZiAoIXY4U3RyaW5nLT5NYWtlRXh0ZXJuYWwocmVzb3VyY2UpKSB7Cisg
ICAgICAgIC8vIEluIGNhc2Ugb2YgYSBmYWlsdXJlIGRlbGV0ZSB0aGUgZXh0ZXJuYWwgcmVzb3Vy
Y2UgYXMgaXQgd2FzIG5vdCB1c2VkLgorICAgICAgICBkZWxldGUgcmVzb3VyY2U7CisgICAgfQor
ICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLUF0b21pY1N0cmluZyB2OFZhbHVlVG9BdG9taWNXZWJD
b3JlU3RyaW5nKHY4OjpIYW5kbGU8djg6OlZhbHVlPiB2OFN0cmluZykKK0F0b21pY1N0cmluZyB2
OFZhbHVlVG9BdG9taWNXZWJDb3JlU3RyaW5nKHY4OjpIYW5kbGU8djg6OlZhbHVlPiB2OFZhbHVl
KQogewotICAgIFN0cmluZyBzdHJpbmcgPSB2OFZhbHVlVG9XZWJDb3JlU3RyaW5nKHY4U3RyaW5n
KTsKKyAgICBpZiAodjhWYWx1ZS0+SXNTdHJpbmcoKSkKKyAgICAgICAgcmV0dXJuIHY4U3RyaW5n
VG9BdG9taWNXZWJDb3JlU3RyaW5nKHY4OjpIYW5kbGU8djg6OlN0cmluZz46OkNhc3QodjhWYWx1
ZSkpOworICAgIFN0cmluZyBzdHJpbmcgPSB2OFZhbHVlVG9XZWJDb3JlU3RyaW5nKHY4VmFsdWUp
OwogICAgIHJldHVybiBBdG9taWNTdHJpbmcoc3RyaW5nKTsKIH0KIApJbmRleDogZG9tL0RvY3Vt
ZW50LmlkbAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBkb20vRG9jdW1lbnQuaWRsCShyZXZpc2lvbiA0NjQyNikK
KysrIGRvbS9Eb2N1bWVudC5pZGwJKHdvcmtpbmcgY29weSkKQEAgLTY0LDcgKzY0LDcgQEAgbW9k
dWxlIGNvcmUgewogICAgICAgICAgICAgcmFpc2VzIChET01FeGNlcHRpb24pOwogICAgICAgICBb
T2xkU3R5bGVPYmpDXSBOb2RlTGlzdCBnZXRFbGVtZW50c0J5VGFnTmFtZU5TKGluIFtDb252ZXJ0
TnVsbFRvTnVsbFN0cmluZ10gRE9NU3RyaW5nIG5hbWVzcGFjZVVSSSwKICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBET01TdHJpbmcgbG9j
YWxOYW1lKTsKLSAgICAgICAgRWxlbWVudCAgICAgICAgICAgIGdldEVsZW1lbnRCeUlkKGluIERP
TVN0cmluZyBlbGVtZW50SWQpOworICAgICAgICBFbGVtZW50ICAgICAgICAgICAgZ2V0RWxlbWVu
dEJ5SWQoaW4gW1Y4Q3VzdG9tPUhpbnRBdG9taWNdIERPTVN0cmluZyBlbGVtZW50SWQpOwogCiAg
ICAgICAgIC8vIERPTSBMZXZlbCAzIENvcmUKIAo=
</data>
<flag name="review"
          id="17931"
          type_id="1"
          status="-"
          setter="levin"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>33865</attachid>
            <date>2009-07-31 03:02:52 -0700</date>
            <delta_ts>2009-07-31 09:12:12 -0700</delta_ts>
            <desc>Next iteration</desc>
            <filename>patch</filename>
            <type>text/plain</type>
            <size>11186</size>
            <attacher name="Christian Plesner Hansen">christian.plesner.hansen</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA0NjYyNSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMjUgQEAKKzIwMDktMDctMzEgIENocmlzdGlhbiBQbGVzbmVyIEhhbnNlbiAgPGNo
cmlzdGlhbi5wbGVzbmVyLmhhbnNlbkBnbWFpbC5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkg
Tk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgW1Y4XSBDYWNoZSBhdG9taWMgc3RyaW5ncyBpbiBl
eHRlcm5hbGl6ZWQgdjggc3RyaW5ncworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9z
aG93X2J1Zy5jZ2k/aWQ9Mjc3NjIKKworICAgICAgICAqIGJpbmRpbmdzL3NjcmlwdHMvQ29kZUdl
bmVyYXRvclY4LnBtOgorICAgICAgICAqIGJpbmRpbmdzL3Y4L1Y4QmluZGluZy5jcHA6CisgICAg
ICAgIChXZWJDb3JlOjpXZWJDb3JlU3RyaW5nUmVzb3VyY2U6OldlYkNvcmVTdHJpbmdSZXNvdXJj
ZSk6CisgICAgICAgIChXZWJDb3JlOjpXZWJDb3JlU3RyaW5nUmVzb3VyY2U6On5XZWJDb3JlU3Ry
aW5nUmVzb3VyY2UpOgorICAgICAgICAoV2ViQ29yZTo6V2ViQ29yZVN0cmluZ1Jlc291cmNlOjpk
YXRhKToKKyAgICAgICAgKFdlYkNvcmU6OldlYkNvcmVTdHJpbmdSZXNvdXJjZTo6bGVuZ3RoKToK
KyAgICAgICAgKFdlYkNvcmU6OldlYkNvcmVTdHJpbmdSZXNvdXJjZTo6d2ViY29yZVN0cmluZyk6
CisgICAgICAgIChXZWJDb3JlOjpXZWJDb3JlU3RyaW5nUmVzb3VyY2U6OmF0b21pY1N0cmluZyk6
CisgICAgICAgIChXZWJDb3JlOjpXZWJDb3JlU3RyaW5nUmVzb3VyY2U6OmZvclN0cmluZyk6Cisg
ICAgICAgIChXZWJDb3JlOjp2OFN0cmluZ1RvV2ViQ29yZVN0cmluZyk6CisgICAgICAgIChXZWJD
b3JlOjp2OFN0cmluZ1RvQXRvbWljV2ViQ29yZVN0cmluZyk6CisgICAgICAgIChXZWJDb3JlOjp2
OFZhbHVlVG9XZWJDb3JlU3RyaW5nKToKKyAgICAgICAgKFdlYkNvcmU6OnY4VmFsdWVUb0F0b21p
Y1dlYkNvcmVTdHJpbmcpOgorICAgICAgICAqIGRvbS9Eb2N1bWVudC5pZGw6CisKIDIwMDktMDct
MzAgIEJyYWR5IEVpZHNvbiAgPGJlaWRzb25AYXBwbGUuY29tPgogCiAgICAgICAgIFJldmlld2Vk
IGJ5IE1hcmsgUm93ZSwgYnV0IERhbiBCZXJuc3RlaW4gYWxzbyByZXZpZXdlZCBhbmQgYXNrZWQg
dGhvdWdodGZ1bCBxdWVzdGlvbnMuCkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3NjcmlwdHMvQ29k
ZUdlbmVyYXRvclY4LnBtCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3Mvc2NyaXB0cy9D
b2RlR2VuZXJhdG9yVjgucG0JKHJldmlzaW9uIDQ2NTk0KQorKysgV2ViQ29yZS9iaW5kaW5ncy9z
Y3JpcHRzL0NvZGVHZW5lcmF0b3JWOC5wbQkod29ya2luZyBjb3B5KQpAQCAtNDYxLDcgKzQ2MSw3
IEBAIHN1YiBHZW5lcmF0ZU5vcm1hbEF0dHJHZXR0ZXIKICAgICBteSAkYXR0ck5hbWUgPSAkYXR0
cmlidXRlLT5zaWduYXR1cmUtPm5hbWU7CiAgICAgJGltcGxJbmNsdWRlc3siVjhQcm94eS5oIn0g
PSAxOwogCi0gICAgbXkgJGF0dHJUeXBlID0gJGNvZGVHZW5lcmF0b3ItPlN0cmlwTW9kdWxlKCRh
dHRyaWJ1dGUtPnNpZ25hdHVyZS0+dHlwZSk7CisgICAgbXkgJGF0dHJUeXBlID0gR2V0VHlwZUZy
b21TaWduYXR1cmUoJGF0dHJpYnV0ZS0+c2lnbmF0dXJlKTsKICAgICBteSAkYXR0cklzUG9kVHlw
ZSA9IElzUG9kVHlwZSgkYXR0clR5cGUpOwogCiAgICAgbXkgJG5hdGl2ZVR5cGUgPSBHZXROYXRp
dmVUeXBlRnJvbVNpZ25hdHVyZSgkYXR0cmlidXRlLT5zaWduYXR1cmUsIDApOwpAQCAtNTQ0LDcg
KzU0NCw3IEBAIEVORAogICAgIG15ICRnZXR0ZXJGdW5jID0gV0tfbGNmaXJzdCgkYXR0ck5hbWUp
OwogICAgICRnZXR0ZXJGdW5jIC49ICJBbmltYXRlZCIgaWYgJGNvZGVHZW5lcmF0b3ItPklzU1ZH
QW5pbWF0ZWRUeXBlKCRhdHRyaWJ1dGUtPnNpZ25hdHVyZS0+dHlwZSk7CiAKLSAgICBteSAkcmV0
dXJuVHlwZSA9ICRjb2RlR2VuZXJhdG9yLT5TdHJpcE1vZHVsZSgkYXR0cmlidXRlLT5zaWduYXR1
cmUtPnR5cGUpOworICAgIG15ICRyZXR1cm5UeXBlID0gR2V0VHlwZUZyb21TaWduYXR1cmUoJGF0
dHJpYnV0ZS0+c2lnbmF0dXJlKTsKIAogICAgIG15ICRnZXR0ZXJTdHJpbmc7CiAgICAgaWYgKCRn
ZXR0ZXJTdHJpbmdVc2VzSW1wKSB7CkBAIC03MDQsNyArNzA0LDcgQEAgRU5ECiAgICAgaWYgKCRu
YXRpdmVUeXBlIGVxICJpbnQiIGFuZCAkYXR0cmlidXRlLT5zaWduYXR1cmUtPmV4dGVuZGVkQXR0
cmlidXRlcy0+eyJDb252ZXJ0RnJvbVN0cmluZyJ9KSB7CiAgICAgICAgICRyZXN1bHQgLj0gIiki
OwogICAgIH0KLSAgICBteSAkcmV0dXJuVHlwZSA9ICRjb2RlR2VuZXJhdG9yLT5TdHJpcE1vZHVs
ZSgkYXR0cmlidXRlLT5zaWduYXR1cmUtPnR5cGUpOworICAgIG15ICRyZXR1cm5UeXBlID0gR2V0
VHlwZUZyb21TaWduYXR1cmUoJGF0dHJpYnV0ZS0+c2lnbmF0dXJlKTsKICAgICBpZiAoSXNSZWZQ
dHJUeXBlKCRyZXR1cm5UeXBlKSkgewogICAgICAgICAkcmVzdWx0ID0gIldURjo6Z2V0UHRyKCIg
LiAkcmVzdWx0IC4gIikiOwogICAgIH0KQEAgLTE0MDAsNyArMTQwMCw3IEBAIHN1YiBHZW5lcmF0
ZUZ1bmN0aW9uQ2FsbFN0cmluZygpCiAKICAgICBteSAkbmFtZSA9ICRmdW5jdGlvbi0+c2lnbmF0
dXJlLT5uYW1lOwogICAgIG15ICRpc1BvZFR5cGUgPSBJc1BvZFR5cGUoJGltcGxDbGFzc05hbWUp
OwotICAgIG15ICRyZXR1cm5UeXBlID0gJGNvZGVHZW5lcmF0b3ItPlN0cmlwTW9kdWxlKCRmdW5j
dGlvbi0+c2lnbmF0dXJlLT50eXBlKTsKKyAgICBteSAkcmV0dXJuVHlwZSA9IEdldFR5cGVGcm9t
U2lnbmF0dXJlKCRmdW5jdGlvbi0+c2lnbmF0dXJlKTsKICAgICBteSAkcmV0dXJuc1BvZFR5cGUg
PSBJc1BvZFR5cGUoJHJldHVyblR5cGUpOwogICAgIG15ICRuYXRpdmVSZXR1cm5UeXBlID0gR2V0
TmF0aXZlVHlwZSgkcmV0dXJuVHlwZSwgMCk7CiAgICAgbXkgJHJlc3VsdCA9ICIiOwpAQCAtMTU2
NiwxMiArMTU2NiwyNSBAQCBzdWIgR2V0Q2xhc3NOYW1lCiB9CiAKIAorc3ViIEdldFR5cGVGcm9t
U2lnbmF0dXJlCit7CisgICAgbXkgJHNpZ25hdHVyZSA9IHNoaWZ0OworCisgICAgbXkgJHR5cGUg
PSAkY29kZUdlbmVyYXRvci0+U3RyaXBNb2R1bGUoJHNpZ25hdHVyZS0+dHlwZSk7CisgICAgaWYg
KCgkdHlwZSBlcSAiRE9NU3RyaW5nIikgJiYgJHNpZ25hdHVyZS0+ZXh0ZW5kZWRBdHRyaWJ1dGVz
LT57IlY4Q3VzdG9tIn0pIHsKKyAgICAgICAgJHR5cGUgPSAiQXRvbWljU3RyaW5nIjsKKyAgICB9
CisgICAgCisgICAgcmV0dXJuICR0eXBlOworfQorCisKIHN1YiBHZXROYXRpdmVUeXBlRnJvbVNp
Z25hdHVyZQogewogICAgIG15ICRzaWduYXR1cmUgPSBzaGlmdDsKICAgICBteSAkaXNQYXJhbWV0
ZXIgPSBzaGlmdDsKIAotICAgIG15ICR0eXBlID0gJGNvZGVHZW5lcmF0b3ItPlN0cmlwTW9kdWxl
KCRzaWduYXR1cmUtPnR5cGUpOworICAgIG15ICR0eXBlID0gR2V0VHlwZUZyb21TaWduYXR1cmUo
JHNpZ25hdHVyZSk7CiAKICAgICByZXR1cm4gR2V0TmF0aXZlVHlwZSgkdHlwZSwgJGlzUGFyYW1l
dGVyKTsKIH0KQEAgLTE3NjIsNyArMTc3NSw3IEBAIHN1YiBUcmFuc2xhdGVQYXJhbWV0ZXIKIHN1
YiBCYXNpY1R5cGVDYW5GYWlsQ29udmVyc2lvbgogewogICAgIG15ICRzaWduYXR1cmUgPSBzaGlm
dDsKLSAgICBteSAkdHlwZSA9ICRjb2RlR2VuZXJhdG9yLT5TdHJpcE1vZHVsZSgkc2lnbmF0dXJl
LT50eXBlKTsKKyAgICBteSAkdHlwZSA9IEdldFR5cGVGcm9tU2lnbmF0dXJlKCRzaWduYXR1cmUp
OwogCiAgICAgcmV0dXJuIDEgaWYgJHR5cGUgZXEgIlNWR0xlbmd0aCI7CiAgICAgcmV0dXJuIDEg
aWYgJHR5cGUgZXEgIlNWR01hdHJpeCI7CkBAIC0xNzc2LDcgKzE3ODksNyBAQCBzdWIgVHlwZUNh
bkZhaWxDb252ZXJzaW9uCiB7CiAgICAgbXkgJHNpZ25hdHVyZSA9IHNoaWZ0OwogCi0gICAgbXkg
JHR5cGUgPSAkY29kZUdlbmVyYXRvci0+U3RyaXBNb2R1bGUoJHNpZ25hdHVyZS0+dHlwZSk7Cisg
ICAgbXkgJHR5cGUgPSBHZXRUeXBlRnJvbVNpZ25hdHVyZSgkc2lnbmF0dXJlKTsKIAogICAgICRp
bXBsSW5jbHVkZXN7IkV4Y2VwdGlvbkNvZGUuaCJ9ID0gMSBpZiAkdHlwZSBlcSAiQXR0ciI7CiAK
QEAgLTE3OTIsNyArMTgwNSw3IEBAIHN1YiBKU1ZhbHVlVG9OYXRpdmUKICAgICBteSAkb2tQYXJh
bSA9IHNoaWZ0OwogICAgIG15ICRtYXliZU9rUGFyYW0gPSAkb2tQYXJhbSA/ICIsICR7b2tQYXJh
bX0iIDogIiI7CiAKLSAgICBteSAkdHlwZSA9ICRjb2RlR2VuZXJhdG9yLT5TdHJpcE1vZHVsZSgk
c2lnbmF0dXJlLT50eXBlKTsKKyAgICBteSAkdHlwZSA9IEdldFR5cGVGcm9tU2lnbmF0dXJlKCRz
aWduYXR1cmUpOwogCiAgICAgcmV0dXJuICIkdmFsdWUiIGlmICR0eXBlIGVxICJKU09iamVjdCI7
CiAgICAgcmV0dXJuICIkdmFsdWUtPkJvb2xlYW5WYWx1ZSgpIiBpZiAkdHlwZSBlcSAiYm9vbGVh
biI7CkBAIC0xODAzLDcgKzE4MTYsOCBAQCBzdWIgSlNWYWx1ZVRvTmF0aXZlCiAgICAgcmV0dXJu
ICJzdGF0aWNfY2FzdDxSYW5nZTo6Q29tcGFyZUhvdz4oJHZhbHVlLT5JbnQzMlZhbHVlKCkpIiBp
ZiAkdHlwZSBlcSAiQ29tcGFyZUhvdyI7CiAgICAgcmV0dXJuICJzdGF0aWNfY2FzdDxTVkdQYWlu
dDo6U1ZHUGFpbnRUeXBlPigkdmFsdWUtPlRvSW50MzIoKS0+SW50MzJWYWx1ZSgpKSIgaWYgJHR5
cGUgZXEgIlNWR1BhaW50VHlwZSI7CiAKLSAgICByZXR1cm4gInRvV2ViQ29yZVN0cmluZygkdmFs
dWUpIiBpZiAkdHlwZSBlcSAiQXRvbWljU3RyaW5nIiBvciAkdHlwZSBlcSAiRE9NVXNlckRhdGEi
OworICAgIHJldHVybiAidjhWYWx1ZVRvQXRvbWljV2ViQ29yZVN0cmluZygkdmFsdWUpIiBpZiAk
dHlwZSBlcSAiQXRvbWljU3RyaW5nIjsKKyAgICByZXR1cm4gInRvV2ViQ29yZVN0cmluZygkdmFs
dWUpIiBpZiAkdHlwZSBlcSAiRE9NVXNlckRhdGEiOwogICAgIGlmICgkdHlwZSBlcSAiRE9NU3Ry
aW5nIikgewogICAgICAgICByZXR1cm4gInRvV2ViQ29yZVN0cmluZ1dpdGhOdWxsQ2hlY2soJHZh
bHVlKSIgaWYgJHNpZ25hdHVyZS0+ZXh0ZW5kZWRBdHRyaWJ1dGVzLT57IkNvbnZlcnROdWxsVG9O
dWxsU3RyaW5nIn07CiAgICAgICAgIHJldHVybiAidG9XZWJDb3JlU3RyaW5nV2l0aE51bGxPclVu
ZGVmaW5lZENoZWNrKCR2YWx1ZSkiIGlmICRzaWduYXR1cmUtPmV4dGVuZGVkQXR0cmlidXRlcy0+
eyJDb252ZXJ0VW5kZWZpbmVkT3JOdWxsVG9OdWxsU3RyaW5nIn07CkBAIC0xOTgxLDcgKzE5OTUs
NyBAQCBzdWIgUmV0dXJuTmF0aXZlVG9KU1ZhbHVlCiAgICAgbXkgJHNpZ25hdHVyZSA9IHNoaWZ0
OwogICAgIG15ICR2YWx1ZSA9IHNoaWZ0OwogICAgIG15ICRpbmRlbnQgPSBzaGlmdDsKLSAgICBt
eSAkdHlwZSA9ICRjb2RlR2VuZXJhdG9yLT5TdHJpcE1vZHVsZSgkc2lnbmF0dXJlLT50eXBlKTsK
KyAgICBteSAkdHlwZSA9IEdldFR5cGVGcm9tU2lnbmF0dXJlKCRzaWduYXR1cmUpOwogICAgIG15
ICRjbGFzc05hbWU9ICJWOCR0eXBlIjsKIAogICAgIHJldHVybiAicmV0dXJuIHY4OjpEYXRlOjpO
ZXcoc3RhdGljX2Nhc3Q8ZG91YmxlPigkdmFsdWUpKSIgaWYgJHR5cGUgZXEgIkRPTVRpbWVTdGFt
cCI7CkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L1Y4QmluZGluZy5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gV2ViQ29yZS9iaW5kaW5ncy92OC9WOEJpbmRpbmcuY3BwCShyZXZpc2lvbiA0NjU5NCkKKysr
IFdlYkNvcmUvYmluZGluZ3MvdjgvVjhCaW5kaW5nLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDks
MzMgKzQ5LDY2IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKIGNsYXNzIFdlYkNvcmVTdHJpbmdSZXNv
dXJjZSA6IHB1YmxpYyB2ODo6U3RyaW5nOjpFeHRlcm5hbFN0cmluZ1Jlc291cmNlIHsKIHB1Ymxp
YzoKICAgICBleHBsaWNpdCBXZWJDb3JlU3RyaW5nUmVzb3VyY2UoY29uc3QgU3RyaW5nJiBzdHJp
bmcpCi0gICAgICAgIDogbV9pbXBsKHN0cmluZy5pbXBsKCkpCisgICAgICAgIDogbV9wbGFpblN0
cmluZyhzdHJpbmcpCiAgICAgewogICAgICAgICB2ODo6Vjg6OkFkanVzdEFtb3VudE9mRXh0ZXJu
YWxBbGxvY2F0ZWRNZW1vcnkoMiAqIGxlbmd0aCgpKTsKICAgICB9CiAKKyAgICBleHBsaWNpdCBX
ZWJDb3JlU3RyaW5nUmVzb3VyY2UoY29uc3QgQXRvbWljU3RyaW5nJiBzdHJpbmcpCisgICAgICAg
IDogbV9wbGFpblN0cmluZyhzdHJpbmcpCisgICAgICAgICwgbV9hdG9taWNTdHJpbmcoc3RyaW5n
KQorICAgIHsKKyAgICAgICAgQVNTRVJUKFdURjo6aXNNYWluVGhyZWFkKCkpOworICAgICAgICB2
ODo6Vjg6OkFkanVzdEFtb3VudE9mRXh0ZXJuYWxBbGxvY2F0ZWRNZW1vcnkoMiAqIGxlbmd0aCgp
KTsKKyAgICB9CisKICAgICB2aXJ0dWFsIH5XZWJDb3JlU3RyaW5nUmVzb3VyY2UoKQogICAgIHsK
LSAgICAgICAgdjg6OlY4OjpBZGp1c3RBbW91bnRPZkV4dGVybmFsQWxsb2NhdGVkTWVtb3J5KC0y
ICogbGVuZ3RoKCkpOworICAgICAgICBpbnQgcmVkdWNlZEV4dGVybmFsTWVtb3J5ID0gLTIgKiBs
ZW5ndGgoKTsKKyAgICAgICAgaWYgKCFtX3BsYWluU3RyaW5nLmltcGwoKS0+aW5UYWJsZSgpKQor
ICAgICAgICAgICAgcmVkdWNlZEV4dGVybmFsTWVtb3J5ICo9IDI7CisgICAgICAgIHY4OjpWODo6
QWRqdXN0QW1vdW50T2ZFeHRlcm5hbEFsbG9jYXRlZE1lbW9yeShyZWR1Y2VkRXh0ZXJuYWxNZW1v
cnkpOwogICAgIH0KIAogICAgIGNvbnN0IHVpbnQxNl90KiBkYXRhKCkgY29uc3QKICAgICB7Ci0g
ICAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQxNl90Kj4obV9pbXBsLmNo
YXJhY3RlcnMoKSk7CisgICAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQx
Nl90Kj4obV9wbGFpblN0cmluZy5jaGFyYWN0ZXJzKCkpOwogICAgIH0KIAotICAgIHNpemVfdCBs
ZW5ndGgoKSBjb25zdCB7IHJldHVybiBtX2ltcGwubGVuZ3RoKCk7IH0KKyAgICBzaXplX3QgbGVu
Z3RoKCkgY29uc3QgeyByZXR1cm4gbV9wbGFpblN0cmluZy5sZW5ndGgoKTsgfQorCisgICAgU3Ry
aW5nIHdlYmNvcmVTdHJpbmcoKSB7IHJldHVybiBtX3BsYWluU3RyaW5nOyB9CiAKLSAgICBTdHJp
bmcgd2ViY29yZVN0cmluZygpIHsgcmV0dXJuIG1faW1wbDsgfQorICAgIEF0b21pY1N0cmluZyBh
dG9taWNTdHJpbmcoKQorICAgIHsKKyAgICAgICAgQVNTRVJUKFdURjo6aXNNYWluVGhyZWFkKCkp
OworICAgICAgICBpZiAobV9hdG9taWNTdHJpbmcuaXNOdWxsKCkpIHsKKyAgICAgICAgICAgIG1f
YXRvbWljU3RyaW5nID0gQXRvbWljU3RyaW5nKG1fcGxhaW5TdHJpbmcpOworICAgICAgICAgICAg
aWYgKG1fcGxhaW5TdHJpbmcuaW1wbCgpLT5pblRhYmxlKCkpCisgICAgICAgICAgICAgICAgdjg6
OlY4OjpBZGp1c3RBbW91bnRPZkV4dGVybmFsQWxsb2NhdGVkTWVtb3J5KDIgKiBsZW5ndGgoKSk7
CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1fYXRvbWljU3RyaW5nOworICAgIH0KKworICAg
IHN0YXRpYyBXZWJDb3JlU3RyaW5nUmVzb3VyY2UgKmZvclN0cmluZyh2ODo6SGFuZGxlPHY4OjpT
dHJpbmc+IHY4U3RyaW5nKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFdlYkNv
cmVTdHJpbmdSZXNvdXJjZSo+KHY4U3RyaW5nLT5HZXRFeHRlcm5hbFN0cmluZ1Jlc291cmNlKCkp
OworICAgIH0KIAogcHJpdmF0ZToKICAgICAvLyBBIHNoYWxsb3cgY29weSBvZiB0aGUgc3RyaW5n
LiBLZWVwcyB0aGUgc3RyaW5nIGJ1ZmZlciBhbGl2ZSB1bnRpbCB0aGUgVjggZW5naW5lIGdhcmJh
Z2UgY29sbGVjdHMgaXQuCi0gICAgU3RyaW5nIG1faW1wbDsKKyAgICBTdHJpbmcgbV9wbGFpblN0
cmluZzsKKyAgICAvLyBJZiB0aGlzIHN0cmluZyBpcyBhdG9taWMgb3IgaGFzIGJlZW4gbWFkZSBh
dG9taWMgZWFybGllciB0aGUKKyAgICAvLyBhdG9taWMgc3RyaW5nIGlzIGhlbGQgaGVyZS4gSW4g
dGhlIGNhc2Ugd2hlcmUgdGhlIHN0cmluZyBzdGFydHMKKyAgICAvLyBvZmYgbm9uLWF0b21pYyBh
bmQgYmVjb21lcyBhdG9taWMgbGF0ZXIgaXQgaXMgbmVjZXNzYXJ5IHRvIGtlZXAKKyAgICAvLyB0
aGUgb3JpZ2luYWwgc3RyaW5nIGFsaXZlIGJlY2F1c2UgdjggbWF5IGtlZXAgZGVyaXZlZCBwb2lu
dGVycworICAgIC8vIGludG8gdGhhdCBzdHJpbmcuCisgICAgQXRvbWljU3RyaW5nIG1fYXRvbWlj
U3RyaW5nOwogfTsKIAogU3RyaW5nIHY4U3RyaW5nVG9XZWJDb3JlU3RyaW5nKHY4OjpIYW5kbGU8
djg6OlN0cmluZz4gdjhTdHJpbmcsIGJvb2wgZXh0ZXJuYWxpemUpCiB7Ci0gICAgV2ViQ29yZVN0
cmluZ1Jlc291cmNlKiBzdHJpbmdSZXNvdXJjZSA9IHN0YXRpY19jYXN0PFdlYkNvcmVTdHJpbmdS
ZXNvdXJjZSo+KHY4U3RyaW5nLT5HZXRFeHRlcm5hbFN0cmluZ1Jlc291cmNlKCkpOworICAgIFdl
YkNvcmVTdHJpbmdSZXNvdXJjZSogc3RyaW5nUmVzb3VyY2UgPSBXZWJDb3JlU3RyaW5nUmVzb3Vy
Y2U6OmZvclN0cmluZyh2OFN0cmluZyk7CiAgICAgaWYgKHN0cmluZ1Jlc291cmNlKQogICAgICAg
ICByZXR1cm4gc3RyaW5nUmVzb3VyY2UtPndlYmNvcmVTdHJpbmcoKTsKIApAQCAtOTksOSArMTMy
LDIwIEBAIFN0cmluZyB2OFN0cmluZ1RvV2ViQ29yZVN0cmluZyh2ODo6SGFuZGwKICAgICByZXR1
cm4gcmVzdWx0OwogfQogCitBdG9taWNTdHJpbmcgdjhTdHJpbmdUb0F0b21pY1dlYkNvcmVTdHJp
bmcodjg6OkhhbmRsZTx2ODo6U3RyaW5nPiB2OFN0cmluZykKK3sKKyAgICBXZWJDb3JlU3RyaW5n
UmVzb3VyY2UqIHN0cmluZ1Jlc291cmNlID0gV2ViQ29yZVN0cmluZ1Jlc291cmNlOjpmb3JTdHJp
bmcodjhTdHJpbmcpOworICAgIGlmICghc3RyaW5nUmVzb3VyY2UpIHsKKyAgICAgICAgLy8gSWYg
dGhpcyBzdHJpbmcgaGFzbid0IGJlZW4gZXh0ZXJuYWxpemVkIHdlIGZvcmNlIGl0IG5vdy4KKyAg
ICAgICAgdjhTdHJpbmdUb1dlYkNvcmVTdHJpbmcodjhTdHJpbmcsIHRydWUpOworICAgICAgICBz
dHJpbmdSZXNvdXJjZSA9IFdlYkNvcmVTdHJpbmdSZXNvdXJjZTo6Zm9yU3RyaW5nKHY4U3RyaW5n
KTsKKyAgICB9CisgICAgcmV0dXJuIHN0cmluZ1Jlc291cmNlLT5hdG9taWNTdHJpbmcoKTsKK30K
KwogU3RyaW5nIHY4VmFsdWVUb1dlYkNvcmVTdHJpbmcodjg6OkhhbmRsZTx2ODo6VmFsdWU+IG9i
amVjdCkKIHsKLSAgICBpZiAob2JqZWN0LT5Jc1N0cmluZygpKSAKKyAgICBpZiAob2JqZWN0LT5J
c1N0cmluZygpKQogICAgICAgICByZXR1cm4gdjhTdHJpbmdUb1dlYkNvcmVTdHJpbmcodjg6Okhh
bmRsZTx2ODo6U3RyaW5nPjo6Q2FzdChvYmplY3QpLCB0cnVlKTsKIAogICAgIGlmIChvYmplY3Qt
PklzSW50MzIoKSkgewpAQCAtMTE3LDcgKzE2MSw3IEBAIFN0cmluZyB2OFZhbHVlVG9XZWJDb3Jl
U3RyaW5nKHY4OjpIYW5kbGUKICAgICAgICAgICAgICAgICBsb3dOdW1iZXJzW3ZhbHVlXSA9IHZh
bHVlU3RyaW5nOwogICAgICAgICAgICAgICAgIHdlYkNvcmVTdHJpbmcgPSB2YWx1ZVN0cmluZzsK
ICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIAorICAgICAgICB9IGVsc2UKICAgICAgICAg
ICAgIHdlYkNvcmVTdHJpbmcgPSBTdHJpbmc6Om51bWJlcih2YWx1ZSk7CiAgICAgICAgIHJldHVy
biB3ZWJDb3JlU3RyaW5nOwogICAgIH0KQEAgLTEzMSwxNSArMTc1LDExIEBAIFN0cmluZyB2OFZh
bHVlVG9XZWJDb3JlU3RyaW5nKHY4OjpIYW5kbGUKICAgICByZXR1cm4gdjhTdHJpbmdUb1dlYkNv
cmVTdHJpbmcodjhTdHJpbmcsIGZhbHNlKTsKIH0KIAotQXRvbWljU3RyaW5nIHY4U3RyaW5nVG9B
dG9taWNXZWJDb3JlU3RyaW5nKHY4OjpIYW5kbGU8djg6OlN0cmluZz4gdjhTdHJpbmcpCi17Ci0g
ICAgU3RyaW5nIHN0cmluZyA9IHY4U3RyaW5nVG9XZWJDb3JlU3RyaW5nKHY4U3RyaW5nLCB0cnVl
KTsKLSAgICByZXR1cm4gQXRvbWljU3RyaW5nKHN0cmluZyk7Ci19Ci0KLUF0b21pY1N0cmluZyB2
OFZhbHVlVG9BdG9taWNXZWJDb3JlU3RyaW5nKHY4OjpIYW5kbGU8djg6OlZhbHVlPiB2OFN0cmlu
ZykKK0F0b21pY1N0cmluZyB2OFZhbHVlVG9BdG9taWNXZWJDb3JlU3RyaW5nKHY4OjpIYW5kbGU8
djg6OlZhbHVlPiB2OFZhbHVlKQogewotICAgIFN0cmluZyBzdHJpbmcgPSB2OFZhbHVlVG9XZWJD
b3JlU3RyaW5nKHY4U3RyaW5nKTsKKyAgICBpZiAodjhWYWx1ZS0+SXNTdHJpbmcoKSkKKyAgICAg
ICAgcmV0dXJuIHY4U3RyaW5nVG9BdG9taWNXZWJDb3JlU3RyaW5nKHY4OjpIYW5kbGU8djg6OlN0
cmluZz46OkNhc3QodjhWYWx1ZSkpOworICAgIFN0cmluZyBzdHJpbmcgPSB2OFZhbHVlVG9XZWJD
b3JlU3RyaW5nKHY4VmFsdWUpOwogICAgIHJldHVybiBBdG9taWNTdHJpbmcoc3RyaW5nKTsKIH0K
IApJbmRleDogV2ViQ29yZS9kb20vRG9jdW1lbnQuaWRsCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUv
ZG9tL0RvY3VtZW50LmlkbAkocmV2aXNpb24gNDY1OTQpCisrKyBXZWJDb3JlL2RvbS9Eb2N1bWVu
dC5pZGwJKHdvcmtpbmcgY29weSkKQEAgLTY0LDcgKzY0LDcgQEAgbW9kdWxlIGNvcmUgewogICAg
ICAgICAgICAgcmFpc2VzIChET01FeGNlcHRpb24pOwogICAgICAgICBbT2xkU3R5bGVPYmpDXSBO
b2RlTGlzdCBnZXRFbGVtZW50c0J5VGFnTmFtZU5TKGluIFtDb252ZXJ0TnVsbFRvTnVsbFN0cmlu
Z10gRE9NU3RyaW5nIG5hbWVzcGFjZVVSSSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBET01TdHJpbmcgbG9jYWxOYW1lKTsKLSAgICAg
ICAgRWxlbWVudCAgICAgICAgICAgIGdldEVsZW1lbnRCeUlkKGluIERPTVN0cmluZyBlbGVtZW50
SWQpOworICAgICAgICBFbGVtZW50ICAgICAgICAgICAgZ2V0RWxlbWVudEJ5SWQoaW4gW1Y4Q3Vz
dG9tPUhpbnRBdG9taWNdIERPTVN0cmluZyBlbGVtZW50SWQpOwogCiAgICAgICAgIC8vIERPTSBM
ZXZlbCAzIENvcmUKIAo=
</data>
<flag name="review"
          id="18065"
          type_id="1"
          status="-"
          setter="levin"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>33879</attachid>
            <date>2009-07-31 09:12:12 -0700</date>
            <delta_ts>2009-08-03 13:24:21 -0700</delta_ts>
            <desc>Fixed memory waste etc.</desc>
            <filename>patch</filename>
            <type>text/plain</type>
            <size>13224</size>
            <attacher name="Christian Plesner Hansen">christian.plesner.hansen</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA0NjYzMSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMjcgQEAKKzIwMDktMDctMzEgIENocmlzdGlhbiBQbGVzbmVyIEhhbnNlbiAgPGNo
cmlzdGlhbi5wbGVzbmVyLmhhbnNlbkBnbWFpbC5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkg
Tk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgW1Y4XSBDYWNoZSBhdG9taWMgc3RyaW5ncyBpbiBl
eHRlcm5hbGl6ZWQgdjggc3RyaW5ncworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9z
aG93X2J1Zy5jZ2k/aWQ9Mjc3NjIKKworICAgICAgICAqIGJpbmRpbmdzL3NjcmlwdHMvQ29kZUdl
bmVyYXRvclY4LnBtOgorICAgICAgICAqIGJpbmRpbmdzL3Y4L1Y4QmluZGluZy5jcHA6CisgICAg
ICAgIChXZWJDb3JlOjpXZWJDb3JlU3RyaW5nUmVzb3VyY2U6OldlYkNvcmVTdHJpbmdSZXNvdXJj
ZSk6CisgICAgICAgIChXZWJDb3JlOjpXZWJDb3JlU3RyaW5nUmVzb3VyY2U6On5XZWJDb3JlU3Ry
aW5nUmVzb3VyY2UpOgorICAgICAgICAoV2ViQ29yZTo6V2ViQ29yZVN0cmluZ1Jlc291cmNlOjpk
YXRhKToKKyAgICAgICAgKFdlYkNvcmU6OldlYkNvcmVTdHJpbmdSZXNvdXJjZTo6bGVuZ3RoKToK
KyAgICAgICAgKFdlYkNvcmU6OldlYkNvcmVTdHJpbmdSZXNvdXJjZTo6d2ViY29yZVN0cmluZyk6
CisgICAgICAgIChXZWJDb3JlOjpXZWJDb3JlU3RyaW5nUmVzb3VyY2U6OmF0b21pY1N0cmluZyk6
CisgICAgICAgIChXZWJDb3JlOjpXZWJDb3JlU3RyaW5nUmVzb3VyY2U6OnRvU3RyaW5nUmVzb3Vy
Y2UpOgorICAgICAgICAoV2ViQ29yZTo6djhTdHJpbmdUb1dlYkNvcmVTdHJpbmcpOgorICAgICAg
ICAoV2ViQ29yZTo6djhTdHJpbmdUb0F0b21pY1dlYkNvcmVTdHJpbmcpOgorICAgICAgICAoV2Vi
Q29yZTo6djhWYWx1ZVRvV2ViQ29yZVN0cmluZyk6CisgICAgICAgIChXZWJDb3JlOjp2OFZhbHVl
VG9BdG9taWNXZWJDb3JlU3RyaW5nKToKKyAgICAgICAgKiBiaW5kaW5ncy92OC9WOEJpbmRpbmcu
aDoKKyAgICAgICAgKFdlYkNvcmU6Oik6CisgICAgICAgICogZG9tL0RvY3VtZW50LmlkbDoKKwog
MjAwOS0wNy0zMSAgWGFuIExvcGV6ICA8eGxvcGV6QGlnYWxpYS5jb20+CiAKICAgICAgICAgUm9s
bCBvdXQgcHJldmlvdXMgY2hhbmdlIGFzIGl0IG1pZ2h0IGJlIGNhdXNpbmcgc29tZSB3ZWlyZG5l
c3MgaW4KSW5kZXg6IFdlYkNvcmUvYmluZGluZ3Mvc2NyaXB0cy9Db2RlR2VuZXJhdG9yVjgucG0K
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy9zY3JpcHRzL0NvZGVHZW5lcmF0b3JWOC5w
bQkocmV2aXNpb24gNDY1OTQpCisrKyBXZWJDb3JlL2JpbmRpbmdzL3NjcmlwdHMvQ29kZUdlbmVy
YXRvclY4LnBtCSh3b3JraW5nIGNvcHkpCkBAIC00NjEsNyArNDYxLDcgQEAgc3ViIEdlbmVyYXRl
Tm9ybWFsQXR0ckdldHRlcgogICAgIG15ICRhdHRyTmFtZSA9ICRhdHRyaWJ1dGUtPnNpZ25hdHVy
ZS0+bmFtZTsKICAgICAkaW1wbEluY2x1ZGVzeyJWOFByb3h5LmgifSA9IDE7CiAKLSAgICBteSAk
YXR0clR5cGUgPSAkY29kZUdlbmVyYXRvci0+U3RyaXBNb2R1bGUoJGF0dHJpYnV0ZS0+c2lnbmF0
dXJlLT50eXBlKTsKKyAgICBteSAkYXR0clR5cGUgPSBHZXRUeXBlRnJvbVNpZ25hdHVyZSgkYXR0
cmlidXRlLT5zaWduYXR1cmUpOwogICAgIG15ICRhdHRySXNQb2RUeXBlID0gSXNQb2RUeXBlKCRh
dHRyVHlwZSk7CiAKICAgICBteSAkbmF0aXZlVHlwZSA9IEdldE5hdGl2ZVR5cGVGcm9tU2lnbmF0
dXJlKCRhdHRyaWJ1dGUtPnNpZ25hdHVyZSwgMCk7CkBAIC01NDQsNyArNTQ0LDcgQEAgRU5ECiAg
ICAgbXkgJGdldHRlckZ1bmMgPSBXS19sY2ZpcnN0KCRhdHRyTmFtZSk7CiAgICAgJGdldHRlckZ1
bmMgLj0gIkFuaW1hdGVkIiBpZiAkY29kZUdlbmVyYXRvci0+SXNTVkdBbmltYXRlZFR5cGUoJGF0
dHJpYnV0ZS0+c2lnbmF0dXJlLT50eXBlKTsKIAotICAgIG15ICRyZXR1cm5UeXBlID0gJGNvZGVH
ZW5lcmF0b3ItPlN0cmlwTW9kdWxlKCRhdHRyaWJ1dGUtPnNpZ25hdHVyZS0+dHlwZSk7CisgICAg
bXkgJHJldHVyblR5cGUgPSBHZXRUeXBlRnJvbVNpZ25hdHVyZSgkYXR0cmlidXRlLT5zaWduYXR1
cmUpOwogCiAgICAgbXkgJGdldHRlclN0cmluZzsKICAgICBpZiAoJGdldHRlclN0cmluZ1VzZXNJ
bXApIHsKQEAgLTcwNCw3ICs3MDQsNyBAQCBFTkQKICAgICBpZiAoJG5hdGl2ZVR5cGUgZXEgImlu
dCIgYW5kICRhdHRyaWJ1dGUtPnNpZ25hdHVyZS0+ZXh0ZW5kZWRBdHRyaWJ1dGVzLT57IkNvbnZl
cnRGcm9tU3RyaW5nIn0pIHsKICAgICAgICAgJHJlc3VsdCAuPSAiKSI7CiAgICAgfQotICAgIG15
ICRyZXR1cm5UeXBlID0gJGNvZGVHZW5lcmF0b3ItPlN0cmlwTW9kdWxlKCRhdHRyaWJ1dGUtPnNp
Z25hdHVyZS0+dHlwZSk7CisgICAgbXkgJHJldHVyblR5cGUgPSBHZXRUeXBlRnJvbVNpZ25hdHVy
ZSgkYXR0cmlidXRlLT5zaWduYXR1cmUpOwogICAgIGlmIChJc1JlZlB0clR5cGUoJHJldHVyblR5
cGUpKSB7CiAgICAgICAgICRyZXN1bHQgPSAiV1RGOjpnZXRQdHIoIiAuICRyZXN1bHQgLiAiKSI7
CiAgICAgfQpAQCAtMTQwMCw3ICsxNDAwLDcgQEAgc3ViIEdlbmVyYXRlRnVuY3Rpb25DYWxsU3Ry
aW5nKCkKIAogICAgIG15ICRuYW1lID0gJGZ1bmN0aW9uLT5zaWduYXR1cmUtPm5hbWU7CiAgICAg
bXkgJGlzUG9kVHlwZSA9IElzUG9kVHlwZSgkaW1wbENsYXNzTmFtZSk7Ci0gICAgbXkgJHJldHVy
blR5cGUgPSAkY29kZUdlbmVyYXRvci0+U3RyaXBNb2R1bGUoJGZ1bmN0aW9uLT5zaWduYXR1cmUt
PnR5cGUpOworICAgIG15ICRyZXR1cm5UeXBlID0gR2V0VHlwZUZyb21TaWduYXR1cmUoJGZ1bmN0
aW9uLT5zaWduYXR1cmUpOwogICAgIG15ICRyZXR1cm5zUG9kVHlwZSA9IElzUG9kVHlwZSgkcmV0
dXJuVHlwZSk7CiAgICAgbXkgJG5hdGl2ZVJldHVyblR5cGUgPSBHZXROYXRpdmVUeXBlKCRyZXR1
cm5UeXBlLCAwKTsKICAgICBteSAkcmVzdWx0ID0gIiI7CkBAIC0xNTY2LDEyICsxNTY2LDI1IEBA
IHN1YiBHZXRDbGFzc05hbWUKIH0KIAogCitzdWIgR2V0VHlwZUZyb21TaWduYXR1cmUKK3sKKyAg
ICBteSAkc2lnbmF0dXJlID0gc2hpZnQ7CisKKyAgICBteSAkdHlwZSA9ICRjb2RlR2VuZXJhdG9y
LT5TdHJpcE1vZHVsZSgkc2lnbmF0dXJlLT50eXBlKTsKKyAgICBpZiAoKCR0eXBlIGVxICJET01T
dHJpbmciKSAmJiAkc2lnbmF0dXJlLT5leHRlbmRlZEF0dHJpYnV0ZXMtPnsiVjhDdXN0b20ifSkg
eworICAgICAgICAkdHlwZSA9ICJBdG9taWNTdHJpbmciOworICAgIH0KKyAgICAKKyAgICByZXR1
cm4gJHR5cGU7Cit9CisKKwogc3ViIEdldE5hdGl2ZVR5cGVGcm9tU2lnbmF0dXJlCiB7CiAgICAg
bXkgJHNpZ25hdHVyZSA9IHNoaWZ0OwogICAgIG15ICRpc1BhcmFtZXRlciA9IHNoaWZ0OwogCi0g
ICAgbXkgJHR5cGUgPSAkY29kZUdlbmVyYXRvci0+U3RyaXBNb2R1bGUoJHNpZ25hdHVyZS0+dHlw
ZSk7CisgICAgbXkgJHR5cGUgPSBHZXRUeXBlRnJvbVNpZ25hdHVyZSgkc2lnbmF0dXJlKTsKIAog
ICAgIHJldHVybiBHZXROYXRpdmVUeXBlKCR0eXBlLCAkaXNQYXJhbWV0ZXIpOwogfQpAQCAtMTc2
Miw3ICsxNzc1LDcgQEAgc3ViIFRyYW5zbGF0ZVBhcmFtZXRlcgogc3ViIEJhc2ljVHlwZUNhbkZh
aWxDb252ZXJzaW9uCiB7CiAgICAgbXkgJHNpZ25hdHVyZSA9IHNoaWZ0OwotICAgIG15ICR0eXBl
ID0gJGNvZGVHZW5lcmF0b3ItPlN0cmlwTW9kdWxlKCRzaWduYXR1cmUtPnR5cGUpOworICAgIG15
ICR0eXBlID0gR2V0VHlwZUZyb21TaWduYXR1cmUoJHNpZ25hdHVyZSk7CiAKICAgICByZXR1cm4g
MSBpZiAkdHlwZSBlcSAiU1ZHTGVuZ3RoIjsKICAgICByZXR1cm4gMSBpZiAkdHlwZSBlcSAiU1ZH
TWF0cml4IjsKQEAgLTE3NzYsNyArMTc4OSw3IEBAIHN1YiBUeXBlQ2FuRmFpbENvbnZlcnNpb24K
IHsKICAgICBteSAkc2lnbmF0dXJlID0gc2hpZnQ7CiAKLSAgICBteSAkdHlwZSA9ICRjb2RlR2Vu
ZXJhdG9yLT5TdHJpcE1vZHVsZSgkc2lnbmF0dXJlLT50eXBlKTsKKyAgICBteSAkdHlwZSA9IEdl
dFR5cGVGcm9tU2lnbmF0dXJlKCRzaWduYXR1cmUpOwogCiAgICAgJGltcGxJbmNsdWRlc3siRXhj
ZXB0aW9uQ29kZS5oIn0gPSAxIGlmICR0eXBlIGVxICJBdHRyIjsKIApAQCAtMTc5Miw3ICsxODA1
LDcgQEAgc3ViIEpTVmFsdWVUb05hdGl2ZQogICAgIG15ICRva1BhcmFtID0gc2hpZnQ7CiAgICAg
bXkgJG1heWJlT2tQYXJhbSA9ICRva1BhcmFtID8gIiwgJHtva1BhcmFtfSIgOiAiIjsKIAotICAg
IG15ICR0eXBlID0gJGNvZGVHZW5lcmF0b3ItPlN0cmlwTW9kdWxlKCRzaWduYXR1cmUtPnR5cGUp
OworICAgIG15ICR0eXBlID0gR2V0VHlwZUZyb21TaWduYXR1cmUoJHNpZ25hdHVyZSk7CiAKICAg
ICByZXR1cm4gIiR2YWx1ZSIgaWYgJHR5cGUgZXEgIkpTT2JqZWN0IjsKICAgICByZXR1cm4gIiR2
YWx1ZS0+Qm9vbGVhblZhbHVlKCkiIGlmICR0eXBlIGVxICJib29sZWFuIjsKQEAgLTE4MDMsNyAr
MTgxNiw4IEBAIHN1YiBKU1ZhbHVlVG9OYXRpdmUKICAgICByZXR1cm4gInN0YXRpY19jYXN0PFJh
bmdlOjpDb21wYXJlSG93PigkdmFsdWUtPkludDMyVmFsdWUoKSkiIGlmICR0eXBlIGVxICJDb21w
YXJlSG93IjsKICAgICByZXR1cm4gInN0YXRpY19jYXN0PFNWR1BhaW50OjpTVkdQYWludFR5cGU+
KCR2YWx1ZS0+VG9JbnQzMigpLT5JbnQzMlZhbHVlKCkpIiBpZiAkdHlwZSBlcSAiU1ZHUGFpbnRU
eXBlIjsKIAotICAgIHJldHVybiAidG9XZWJDb3JlU3RyaW5nKCR2YWx1ZSkiIGlmICR0eXBlIGVx
ICJBdG9taWNTdHJpbmciIG9yICR0eXBlIGVxICJET01Vc2VyRGF0YSI7CisgICAgcmV0dXJuICJ2
OFZhbHVlVG9BdG9taWNXZWJDb3JlU3RyaW5nKCR2YWx1ZSkiIGlmICR0eXBlIGVxICJBdG9taWNT
dHJpbmciOworICAgIHJldHVybiAidG9XZWJDb3JlU3RyaW5nKCR2YWx1ZSkiIGlmICR0eXBlIGVx
ICJET01Vc2VyRGF0YSI7CiAgICAgaWYgKCR0eXBlIGVxICJET01TdHJpbmciKSB7CiAgICAgICAg
IHJldHVybiAidG9XZWJDb3JlU3RyaW5nV2l0aE51bGxDaGVjaygkdmFsdWUpIiBpZiAkc2lnbmF0
dXJlLT5leHRlbmRlZEF0dHJpYnV0ZXMtPnsiQ29udmVydE51bGxUb051bGxTdHJpbmcifTsKICAg
ICAgICAgcmV0dXJuICJ0b1dlYkNvcmVTdHJpbmdXaXRoTnVsbE9yVW5kZWZpbmVkQ2hlY2soJHZh
bHVlKSIgaWYgJHNpZ25hdHVyZS0+ZXh0ZW5kZWRBdHRyaWJ1dGVzLT57IkNvbnZlcnRVbmRlZmlu
ZWRPck51bGxUb051bGxTdHJpbmcifTsKQEAgLTE5ODEsNyArMTk5NSw3IEBAIHN1YiBSZXR1cm5O
YXRpdmVUb0pTVmFsdWUKICAgICBteSAkc2lnbmF0dXJlID0gc2hpZnQ7CiAgICAgbXkgJHZhbHVl
ID0gc2hpZnQ7CiAgICAgbXkgJGluZGVudCA9IHNoaWZ0OwotICAgIG15ICR0eXBlID0gJGNvZGVH
ZW5lcmF0b3ItPlN0cmlwTW9kdWxlKCRzaWduYXR1cmUtPnR5cGUpOworICAgIG15ICR0eXBlID0g
R2V0VHlwZUZyb21TaWduYXR1cmUoJHNpZ25hdHVyZSk7CiAgICAgbXkgJGNsYXNzTmFtZT0gIlY4
JHR5cGUiOwogCiAgICAgcmV0dXJuICJyZXR1cm4gdjg6OkRhdGU6Ok5ldyhzdGF0aWNfY2FzdDxk
b3VibGU+KCR2YWx1ZSkpIiBpZiAkdHlwZSBlcSAiRE9NVGltZVN0YW1wIjsKSW5kZXg6IFdlYkNv
cmUvYmluZGluZ3MvdjgvVjhCaW5kaW5nLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRp
bmdzL3Y4L1Y4QmluZGluZy5jcHAJKHJldmlzaW9uIDQ2NTk0KQorKysgV2ViQ29yZS9iaW5kaW5n
cy92OC9WOEJpbmRpbmcuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00OSwzMyArNDksNjkgQEAgbmFt
ZXNwYWNlIFdlYkNvcmUgewogY2xhc3MgV2ViQ29yZVN0cmluZ1Jlc291cmNlIDogcHVibGljIHY4
OjpTdHJpbmc6OkV4dGVybmFsU3RyaW5nUmVzb3VyY2UgewogcHVibGljOgogICAgIGV4cGxpY2l0
IFdlYkNvcmVTdHJpbmdSZXNvdXJjZShjb25zdCBTdHJpbmcmIHN0cmluZykKLSAgICAgICAgOiBt
X2ltcGwoc3RyaW5nLmltcGwoKSkKKyAgICAgICAgOiBtX3BsYWluU3RyaW5nKHN0cmluZykKICAg
ICB7CisgICAgICAgIEFTU0VSVChXVEY6OmlzTWFpblRocmVhZCgpKTsKKyAgICAgICAgdjg6OlY4
OjpBZGp1c3RBbW91bnRPZkV4dGVybmFsQWxsb2NhdGVkTWVtb3J5KDIgKiBsZW5ndGgoKSk7Cisg
ICAgfQorCisgICAgZXhwbGljaXQgV2ViQ29yZVN0cmluZ1Jlc291cmNlKGNvbnN0IEF0b21pY1N0
cmluZyYgc3RyaW5nKQorICAgICAgICA6IG1fcGxhaW5TdHJpbmcoc3RyaW5nKQorICAgICAgICAs
IG1fYXRvbWljU3RyaW5nKHN0cmluZykKKyAgICB7CisgICAgICAgIEFTU0VSVChXVEY6OmlzTWFp
blRocmVhZCgpKTsKICAgICAgICAgdjg6OlY4OjpBZGp1c3RBbW91bnRPZkV4dGVybmFsQWxsb2Nh
dGVkTWVtb3J5KDIgKiBsZW5ndGgoKSk7CiAgICAgfQogCiAgICAgdmlydHVhbCB+V2ViQ29yZVN0
cmluZ1Jlc291cmNlKCkKICAgICB7Ci0gICAgICAgIHY4OjpWODo6QWRqdXN0QW1vdW50T2ZFeHRl
cm5hbEFsbG9jYXRlZE1lbW9yeSgtMiAqIGxlbmd0aCgpKTsKKyAgICAgICAgQVNTRVJUKFdURjo6
aXNNYWluVGhyZWFkKCkpOworICAgICAgICBpbnQgcmVkdWNlZEV4dGVybmFsTWVtb3J5ID0gLTIg
KiBsZW5ndGgoKTsKKyAgICAgICAgaWYgKCFtX3BsYWluU3RyaW5nLmltcGwoKS0+aW5UYWJsZSgp
KQorICAgICAgICAgICAgcmVkdWNlZEV4dGVybmFsTWVtb3J5ICo9IDI7CisgICAgICAgIHY4OjpW
ODo6QWRqdXN0QW1vdW50T2ZFeHRlcm5hbEFsbG9jYXRlZE1lbW9yeShyZWR1Y2VkRXh0ZXJuYWxN
ZW1vcnkpOwogICAgIH0KIAogICAgIGNvbnN0IHVpbnQxNl90KiBkYXRhKCkgY29uc3QKICAgICB7
Ci0gICAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQxNl90Kj4obV9pbXBs
LmNoYXJhY3RlcnMoKSk7CisgICAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IHVp
bnQxNl90Kj4obV9wbGFpblN0cmluZy5jaGFyYWN0ZXJzKCkpOwogICAgIH0KIAotICAgIHNpemVf
dCBsZW5ndGgoKSBjb25zdCB7IHJldHVybiBtX2ltcGwubGVuZ3RoKCk7IH0KKyAgICBzaXplX3Qg
bGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gbV9wbGFpblN0cmluZy5sZW5ndGgoKTsgfQorCisgICAg
U3RyaW5nIHdlYmNvcmVTdHJpbmcoKSB7IHJldHVybiBtX3BsYWluU3RyaW5nOyB9CiAKLSAgICBT
dHJpbmcgd2ViY29yZVN0cmluZygpIHsgcmV0dXJuIG1faW1wbDsgfQorICAgIEF0b21pY1N0cmlu
ZyBhdG9taWNTdHJpbmcoKQorICAgIHsKKyAgICAgICAgQVNTRVJUKFdURjo6aXNNYWluVGhyZWFk
KCkpOworICAgICAgICBpZiAobV9hdG9taWNTdHJpbmcuaXNOdWxsKCkpIHsKKyAgICAgICAgICAg
IG1fYXRvbWljU3RyaW5nID0gQXRvbWljU3RyaW5nKG1fcGxhaW5TdHJpbmcpOworICAgICAgICAg
ICAgaWYgKCFtX3BsYWluU3RyaW5nLmltcGwoKS0+aW5UYWJsZSgpKQorICAgICAgICAgICAgICAg
IHY4OjpWODo6QWRqdXN0QW1vdW50T2ZFeHRlcm5hbEFsbG9jYXRlZE1lbW9yeSgyICogbGVuZ3Ro
KCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtX2F0b21pY1N0cmluZzsKKyAgICB9CisK
KyAgICBzdGF0aWMgV2ViQ29yZVN0cmluZ1Jlc291cmNlKiB0b1N0cmluZ1Jlc291cmNlKHY4OjpI
YW5kbGU8djg6OlN0cmluZz4gdjhTdHJpbmcpCisgICAgeworICAgICAgICByZXR1cm4gc3RhdGlj
X2Nhc3Q8V2ViQ29yZVN0cmluZ1Jlc291cmNlKj4odjhTdHJpbmctPkdldEV4dGVybmFsU3RyaW5n
UmVzb3VyY2UoKSk7CisgICAgfQogCiBwcml2YXRlOgogICAgIC8vIEEgc2hhbGxvdyBjb3B5IG9m
IHRoZSBzdHJpbmcuIEtlZXBzIHRoZSBzdHJpbmcgYnVmZmVyIGFsaXZlIHVudGlsIHRoZSBWOCBl
bmdpbmUgZ2FyYmFnZSBjb2xsZWN0cyBpdC4KLSAgICBTdHJpbmcgbV9pbXBsOworICAgIFN0cmlu
ZyBtX3BsYWluU3RyaW5nOworICAgIC8vIElmIHRoaXMgc3RyaW5nIGlzIGF0b21pYyBvciBoYXMg
YmVlbiBtYWRlIGF0b21pYyBlYXJsaWVyIHRoZQorICAgIC8vIGF0b21pYyBzdHJpbmcgaXMgaGVs
ZCBoZXJlLiBJbiB0aGUgY2FzZSB3aGVyZSB0aGUgc3RyaW5nIHN0YXJ0cworICAgIC8vIG9mZiBu
b24tYXRvbWljIGFuZCBiZWNvbWVzIGF0b21pYyBsYXRlciBpdCBpcyBuZWNlc3NhcnkgdG8ga2Vl
cAorICAgIC8vIHRoZSBvcmlnaW5hbCBzdHJpbmcgYWxpdmUgYmVjYXVzZSB2OCBtYXkga2VlcCBk
ZXJpdmVkIHBvaW50ZXJzCisgICAgLy8gaW50byB0aGF0IHN0cmluZy4KKyAgICBBdG9taWNTdHJp
bmcgbV9hdG9taWNTdHJpbmc7CiB9OwogCi1TdHJpbmcgdjhTdHJpbmdUb1dlYkNvcmVTdHJpbmco
djg6OkhhbmRsZTx2ODo6U3RyaW5nPiB2OFN0cmluZywgYm9vbCBleHRlcm5hbGl6ZSkKK1N0cmlu
ZyB2OFN0cmluZ1RvV2ViQ29yZVN0cmluZyh2ODo6SGFuZGxlPHY4OjpTdHJpbmc+IHY4U3RyaW5n
LCBFeHRlcm5hbE1vZGUgZXh0ZXJuYWwsCisgICAgICAgIFN0cmluZ1R5cGUgdHlwZSkKIHsKLSAg
ICBXZWJDb3JlU3RyaW5nUmVzb3VyY2UqIHN0cmluZ1Jlc291cmNlID0gc3RhdGljX2Nhc3Q8V2Vi
Q29yZVN0cmluZ1Jlc291cmNlKj4odjhTdHJpbmctPkdldEV4dGVybmFsU3RyaW5nUmVzb3VyY2Uo
KSk7CisgICAgV2ViQ29yZVN0cmluZ1Jlc291cmNlKiBzdHJpbmdSZXNvdXJjZSA9IFdlYkNvcmVT
dHJpbmdSZXNvdXJjZTo6dG9TdHJpbmdSZXNvdXJjZSh2OFN0cmluZyk7CiAgICAgaWYgKHN0cmlu
Z1Jlc291cmNlKQogICAgICAgICByZXR1cm4gc3RyaW5nUmVzb3VyY2UtPndlYmNvcmVTdHJpbmco
KTsKIApAQCAtODgsOCArMTI0LDExIEBAIFN0cmluZyB2OFN0cmluZ1RvV2ViQ29yZVN0cmluZyh2
ODo6SGFuZGwKICAgICBVQ2hhciogYnVmZmVyOwogICAgIFN0cmluZyByZXN1bHQgPSBTdHJpbmc6
OmNyZWF0ZVVuaW5pdGlhbGl6ZWQobGVuZ3RoLCBidWZmZXIpOwogICAgIHY4U3RyaW5nLT5Xcml0
ZShyZWludGVycHJldF9jYXN0PHVpbnQxNl90Kj4oYnVmZmVyKSwgMCwgbGVuZ3RoKTsKKyAgICAK
KyAgICBpZiAodHlwZSA9PSBBVE9NSUMpCisgICAgICAgIHJlc3VsdCA9IEF0b21pY1N0cmluZyhy
ZXN1bHQpOwogCi0gICAgaWYgKGV4dGVybmFsaXplKSB7CisgICAgaWYgKGV4dGVybmFsID09IEVY
VEVSTkFMSVpFKSB7CiAgICAgICAgIFdlYkNvcmVTdHJpbmdSZXNvdXJjZSogcmVzb3VyY2UgPSBu
ZXcgV2ViQ29yZVN0cmluZ1Jlc291cmNlKHJlc3VsdCk7CiAgICAgICAgIGlmICghdjhTdHJpbmct
Pk1ha2VFeHRlcm5hbChyZXNvdXJjZSkpIHsKICAgICAgICAgICAgIC8vIEluIGNhc2Ugb2YgYSBm
YWlsdXJlIGRlbGV0ZSB0aGUgZXh0ZXJuYWwgcmVzb3VyY2UgYXMgaXQgd2FzIG5vdCB1c2VkLgpA
QCAtOTksMTAgKzEzOCwyMSBAQCBTdHJpbmcgdjhTdHJpbmdUb1dlYkNvcmVTdHJpbmcodjg6Okhh
bmRsCiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAorQXRvbWljU3RyaW5nIHY4U3RyaW5nVG9BdG9t
aWNXZWJDb3JlU3RyaW5nKHY4OjpIYW5kbGU8djg6OlN0cmluZz4gdjhTdHJpbmcpCit7CisgICAg
V2ViQ29yZVN0cmluZ1Jlc291cmNlKiBzdHJpbmdSZXNvdXJjZSA9IFdlYkNvcmVTdHJpbmdSZXNv
dXJjZTo6dG9TdHJpbmdSZXNvdXJjZSh2OFN0cmluZyk7CisgICAgaWYgKCFzdHJpbmdSZXNvdXJj
ZSkgeworICAgICAgICAvLyBJZiB0aGlzIHN0cmluZyBoYXNuJ3QgYmVlbiBleHRlcm5hbGl6ZWQs
IHdlIGZvcmNlIGl0IG5vdy4KKyAgICAgICAgdjhTdHJpbmdUb1dlYkNvcmVTdHJpbmcodjhTdHJp
bmcsIEVYVEVSTkFMSVpFLCBBVE9NSUMpOworICAgICAgICBzdHJpbmdSZXNvdXJjZSA9IFdlYkNv
cmVTdHJpbmdSZXNvdXJjZTo6dG9TdHJpbmdSZXNvdXJjZSh2OFN0cmluZyk7CisgICAgfQorICAg
IHJldHVybiBzdHJpbmdSZXNvdXJjZS0+YXRvbWljU3RyaW5nKCk7Cit9CisKIFN0cmluZyB2OFZh
bHVlVG9XZWJDb3JlU3RyaW5nKHY4OjpIYW5kbGU8djg6OlZhbHVlPiBvYmplY3QpCiB7Ci0gICAg
aWYgKG9iamVjdC0+SXNTdHJpbmcoKSkgCi0gICAgICAgIHJldHVybiB2OFN0cmluZ1RvV2ViQ29y
ZVN0cmluZyh2ODo6SGFuZGxlPHY4OjpTdHJpbmc+OjpDYXN0KG9iamVjdCksIHRydWUpOworICAg
IGlmIChvYmplY3QtPklzU3RyaW5nKCkpCisgICAgICAgIHJldHVybiB2OFN0cmluZ1RvV2ViQ29y
ZVN0cmluZyh2ODo6SGFuZGxlPHY4OjpTdHJpbmc+OjpDYXN0KG9iamVjdCksIEVYVEVSTkFMSVpF
LCBQTEFJTik7CiAKICAgICBpZiAob2JqZWN0LT5Jc0ludDMyKCkpIHsKICAgICAgICAgaW50IHZh
bHVlID0gb2JqZWN0LT5JbnQzMlZhbHVlKCk7CkBAIC0xMTcsNyArMTY3LDcgQEAgU3RyaW5nIHY4
VmFsdWVUb1dlYkNvcmVTdHJpbmcodjg6OkhhbmRsZQogICAgICAgICAgICAgICAgIGxvd051bWJl
cnNbdmFsdWVdID0gdmFsdWVTdHJpbmc7CiAgICAgICAgICAgICAgICAgd2ViQ29yZVN0cmluZyA9
IHZhbHVlU3RyaW5nOwogICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgCisgICAgICAgIH0g
ZWxzZQogICAgICAgICAgICAgd2ViQ29yZVN0cmluZyA9IFN0cmluZzo6bnVtYmVyKHZhbHVlKTsK
ICAgICAgICAgcmV0dXJuIHdlYkNvcmVTdHJpbmc7CiAgICAgfQpAQCAtMTI4LDE4ICsxNzgsMTQg
QEAgU3RyaW5nIHY4VmFsdWVUb1dlYkNvcmVTdHJpbmcodjg6OkhhbmRsZQogICAgIC8vIGlzIHRo
cm93biBhcyBwYXJ0IG9mIGludm9raW5nIHRvU3RyaW5nIG9uIHRoZSBvYmplY3RlY3QuCiAgICAg
aWYgKHY4U3RyaW5nLklzRW1wdHkoKSkKICAgICAgICAgcmV0dXJuIFN0cmluZ0ltcGw6OmVtcHR5
KCk7Ci0gICAgcmV0dXJuIHY4U3RyaW5nVG9XZWJDb3JlU3RyaW5nKHY4U3RyaW5nLCBmYWxzZSk7
Ci19Ci0KLUF0b21pY1N0cmluZyB2OFN0cmluZ1RvQXRvbWljV2ViQ29yZVN0cmluZyh2ODo6SGFu
ZGxlPHY4OjpTdHJpbmc+IHY4U3RyaW5nKQotewotICAgIFN0cmluZyBzdHJpbmcgPSB2OFN0cmlu
Z1RvV2ViQ29yZVN0cmluZyh2OFN0cmluZywgdHJ1ZSk7Ci0gICAgcmV0dXJuIEF0b21pY1N0cmlu
ZyhzdHJpbmcpOworICAgIHJldHVybiB2OFN0cmluZ1RvV2ViQ29yZVN0cmluZyh2OFN0cmluZywg
RE9OVF9FWFRFUk5BTElaRSwgUExBSU4pOwogfQogCi1BdG9taWNTdHJpbmcgdjhWYWx1ZVRvQXRv
bWljV2ViQ29yZVN0cmluZyh2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gdjhTdHJpbmcpCitBdG9taWNT
dHJpbmcgdjhWYWx1ZVRvQXRvbWljV2ViQ29yZVN0cmluZyh2ODo6SGFuZGxlPHY4OjpWYWx1ZT4g
djhWYWx1ZSkKIHsKLSAgICBTdHJpbmcgc3RyaW5nID0gdjhWYWx1ZVRvV2ViQ29yZVN0cmluZyh2
OFN0cmluZyk7CisgICAgaWYgKHY4VmFsdWUtPklzU3RyaW5nKCkpCisgICAgICAgIHJldHVybiB2
OFN0cmluZ1RvQXRvbWljV2ViQ29yZVN0cmluZyh2ODo6SGFuZGxlPHY4OjpTdHJpbmc+OjpDYXN0
KHY4VmFsdWUpKTsKKyAgICBTdHJpbmcgc3RyaW5nID0gdjhWYWx1ZVRvV2ViQ29yZVN0cmluZyh2
OFZhbHVlKTsKICAgICByZXR1cm4gQXRvbWljU3RyaW5nKHN0cmluZyk7CiB9CiAKSW5kZXg6IFdl
YkNvcmUvYmluZGluZ3MvdjgvVjhCaW5kaW5nLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5k
aW5ncy92OC9WOEJpbmRpbmcuaAkocmV2aXNpb24gNDY1OTQpCisrKyBXZWJDb3JlL2JpbmRpbmdz
L3Y4L1Y4QmluZGluZy5oCSh3b3JraW5nIGNvcHkpCkBAIC0zOCwxMCArMzgsMTMgQEAKIAogbmFt
ZXNwYWNlIFdlYkNvcmUgewogCisgICAgZW51bSBFeHRlcm5hbE1vZGUgeyBFWFRFUk5BTElaRSwg
RE9OVF9FWFRFUk5BTElaRSB9OworICAgIGVudW0gU3RyaW5nVHlwZSB7IFBMQUlOLCBBVE9NSUMg
fTsKKwogICAgIC8vIENvbnZlcnQgdjggdHlwZXMgdG8gYSBXZWJDb3JlOjpTdHJpbmcuIElmIHRo
ZSBWOCBzdHJpbmcgaXMgbm90IGFscmVhZHkKICAgICAvLyBhbiBleHRlcm5hbCBzdHJpbmcgdGhl
biBpdCBpcyB0cmFuc2Zvcm1lZCBpbnRvIGFuIGV4dGVybmFsIHN0cmluZyBhdCB0aGlzCiAgICAg
Ly8gcG9pbnQgdG8gYXZvaWQgcmVwZWF0ZWQgY29udmVyc2lvbnMuCi0gICAgU3RyaW5nIHY4U3Ry
aW5nVG9XZWJDb3JlU3RyaW5nKHY4OjpIYW5kbGU8djg6OlN0cmluZz4sIGJvb2wgZXh0ZXJuYWxp
emUpOworICAgIFN0cmluZyB2OFN0cmluZ1RvV2ViQ29yZVN0cmluZyh2ODo6SGFuZGxlPHY4OjpT
dHJpbmc+LCBFeHRlcm5hbE1vZGUgbW9kZSwgU3RyaW5nVHlwZSB0eXBlKTsKICAgICBTdHJpbmcg
djhWYWx1ZVRvV2ViQ29yZVN0cmluZyh2ODo6SGFuZGxlPHY4OjpWYWx1ZT4pOwogCiAgICAgLy8g
Q29udmVydCB2OCB0eXBlcyB0byBhIFdlYkNvcmU6OkF0b21pY1N0cmluZy4KSW5kZXg6IFdlYkNv
cmUvZG9tL0RvY3VtZW50LmlkbAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2RvbS9Eb2N1bWVudC5p
ZGwJKHJldmlzaW9uIDQ2NTk0KQorKysgV2ViQ29yZS9kb20vRG9jdW1lbnQuaWRsCSh3b3JraW5n
IGNvcHkpCkBAIC02NCw3ICs2NCw3IEBAIG1vZHVsZSBjb3JlIHsKICAgICAgICAgICAgIHJhaXNl
cyAoRE9NRXhjZXB0aW9uKTsKICAgICAgICAgW09sZFN0eWxlT2JqQ10gTm9kZUxpc3QgZ2V0RWxl
bWVudHNCeVRhZ05hbWVOUyhpbiBbQ29udmVydE51bGxUb051bGxTdHJpbmddIERPTVN0cmluZyBu
YW1lc3BhY2VVUkksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgaW4gRE9NU3RyaW5nIGxvY2FsTmFtZSk7Ci0gICAgICAgIEVsZW1lbnQgICAg
ICAgICAgICBnZXRFbGVtZW50QnlJZChpbiBET01TdHJpbmcgZWxlbWVudElkKTsKKyAgICAgICAg
RWxlbWVudCAgICAgICAgICAgIGdldEVsZW1lbnRCeUlkKGluIFtWOEN1c3RvbT1IaW50QXRvbWlj
XSBET01TdHJpbmcgZWxlbWVudElkKTsKIAogICAgICAgICAvLyBET00gTGV2ZWwgMyBDb3JlCiAK
</data>
<flag name="review"
          id="18069"
          type_id="1"
          status="+"
          setter="levin"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>33890</attachid>
            <date>2009-07-31 11:41:00 -0700</date>
            <delta_ts>2009-07-31 11:41:00 -0700</delta_ts>
            <desc>GetElementById benchmark</desc>
            <filename>GetElementByIdPerf.html</filename>
            <type>text/html</type>
            <size>3505</size>
            <attacher name="David Levin">levin</attacher>
            
              <data encoding="base64">PGh0bWw+CiAgPGhlYWQ+CiAgICA8c2NyaXB0PgogICAgdmFyIGtRdWFudCA9IDEwMDA7CiAgICB2
YXIga01pblJ1bnMgPSAxMDsKICAgIHZhciBrTWF4RXJyb3JQZXJjZW50ID0gMTsKICAgIHZhciBr
UHJlY2lzaW9uID0gNDsKCiAgICBmdW5jdGlvbiBTaW5nbGVSdW4oY291bnQsIHRpbWUpIHsKICAg
ICAgdGhpcy5jb3VudCA9IGNvdW50OwogICAgICB0aGlzLnRpbWUgPSB0aW1lOwogICAgfQoKICAg
IFNpbmdsZVJ1bi5wcm90b3R5cGUuZ2V0VmFsdWUgPSBmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVy
biAodGhpcy5jb3VudCAvIHRoaXMudGltZSkgKiAxMDAwOwogICAgfTsKCiAgICBTaW5nbGVSdW4u
cHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkgewogICAgICByZXR1cm4gdGhpcy5nZXRW
YWx1ZSgpLnRvUHJlY2lzaW9uKGtQcmVjaXNpb24pOwogICAgfTsKCiAgICBmdW5jdGlvbiBCZW5j
aG1hcmtSdW5uZXIoYmVuY2htYXJrKSB7CiAgICAgIHRoaXMuYmVuY2htYXJrID0gYmVuY2htYXJr
OwogICAgICB0aGlzLnJ1bnMgPSBbIF07CiAgICB9CgogICAgQmVuY2htYXJrUnVubmVyLnByb3Rv
dHlwZS5nZXRBdmVyYWdlID0gZnVuY3Rpb24gKCkgewogICAgICB2YXIgc3VtID0gMDsKICAgICAg
Zm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnJ1bnMubGVuZ3RoOyBpKyspCiAgICAgICAgc3VtICs9
IHRoaXMucnVuc1tpXS5nZXRWYWx1ZSgpOwogICAgICByZXR1cm4gc3VtIC8gdGhpcy5ydW5zLmxl
bmd0aDsKICAgIH07CgogICAgQmVuY2htYXJrUnVubmVyLnByb3RvdHlwZS5nZXRTdGFuZGFyZERl
dmlhdGlvbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgdmFyIGF2ZXJhZ2UgPSB0aGlzLmdldEF2ZXJh
Z2UoKTsKICAgICAgdmFyIG5TaWdtYVNxdWFyZSA9IDA7CiAgICAgIGZvciAodmFyIGkgPSAwOyBp
IDwgdGhpcy5ydW5zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgblNpZ21hU3F1YXJlICs9IE1hdGgu
cG93KHRoaXMucnVuc1tpXS5nZXRWYWx1ZSgpIC0gYXZlcmFnZSwgMik7CiAgICAgIH0KICAgICAg
cmV0dXJuIE1hdGguc3FydChuU2lnbWFTcXVhcmUgLyB0aGlzLnJ1bnMubGVuZ3RoKTsKICAgIH07
CgogICAgQmVuY2htYXJrUnVubmVyLnByb3RvdHlwZS5nZXREZXZpYXRpb24gPSBmdW5jdGlvbiAo
KSB7CiAgICAgIHJldHVybiAxMDAgKiB0aGlzLmdldFN0YW5kYXJkRGV2aWF0aW9uKCkgLyB0aGlz
LmdldEF2ZXJhZ2UoKTsKICAgIH07CgogICAgQmVuY2htYXJrUnVubmVyLnByb3RvdHlwZS5zdGFy
dCA9IGZ1bmN0aW9uICgpIHsKICAgICAgc2luZ2xlUnVuKHRoaXMuYmVuY2htYXJrKTsKICAgICAg
dGhpcy5zY2hlZHVsZSgpOwogICAgfQoKICAgIEJlbmNobWFya1J1bm5lci5wcm90b3R5cGUuc2No
ZWR1bGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgIHZhciBtZSA9IHRoaXM7CiAgICAgIHdpbmRvdy5z
ZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgbWUuc3RlcCgpOyB9LCAwKTsKICAgIH07CgogICAgQmVu
Y2htYXJrUnVubmVyLnByb3RvdHlwZS5pc0FjY3VyYXRlRW5vdWdoID0gZnVuY3Rpb24gKCkgewog
ICAgICBpZiAodGhpcy5ydW5zLmxlbmd0aCA8IGtNaW5SdW5zKSByZXR1cm4gZmFsc2U7CiAgICAg
IHJldHVybiB0aGlzLmdldERldmlhdGlvbigpIDwga01heEVycm9yUGVyY2VudDsKICAgIH07Cgog
ICAgQmVuY2htYXJrUnVubmVyLnByb3RvdHlwZS5zdGVwID0gZnVuY3Rpb24gKCkgewogICAgICB2
YXIgY291bnQgPSBzaW5nbGVSdW4odGhpcy5iZW5jaG1hcmspOwogICAgICB0aGlzLnJ1bnMucHVz
aChjb3VudCk7CiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJydW5zIikuaW5uZXJIVE1M
ID0gdGhpcy5ydW5zLmxlbmd0aDsKICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImF2ZXJh
Z2UiKS5pbm5lckhUTUwgPSB0aGlzLmdldEF2ZXJhZ2UoKS50b1ByZWNpc2lvbihrUHJlY2lzaW9u
KTsKICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImVycm9yIikuaW5uZXJIVE1MID0gdGhp
cy5nZXREZXZpYXRpb24oKS50b1ByZWNpc2lvbihrUHJlY2lzaW9uKSArICIlIjsKICAgICAgZG9j
dW1lbnQuZ2V0RWxlbWVudEJ5SWQoInZhbHVlcyIpLmlubmVySFRNTCA9IHRoaXMucnVucy5qb2lu
KCIgIik7CiAgICAgIGlmICghdGhpcy5pc0FjY3VyYXRlRW5vdWdoKCkpIHsKICAgICAgICB0aGlz
LnNjaGVkdWxlKCk7CiAgICAgIH0KICAgIH07CgogICAgZnVuY3Rpb24gcnVuKCkgewogICAgICBu
ZXcgQmVuY2htYXJrUnVubmVyKHRlc3QpLnN0YXJ0KCk7CiAgICB9CgogICAgZnVuY3Rpb24gc2lu
Z2xlUnVuKGJlbmNobWFyaykgewogICAgICB2YXIgc3RhcnQgPSBuZXcgRGF0ZSgpOwogICAgICB2
YXIgY291bnQgPSAwOwogICAgICB2YXIgZHVyYXRpb24gPSAwOwogICAgICB3aGlsZSAoZHVyYXRp
b24gPCBrUXVhbnQpIHsKICAgICAgICBiZW5jaG1hcmsoKTsKICAgICAgICBjb3VudCsrOwogICAg
ICAgIGR1cmF0aW9uID0gbmV3IERhdGUoKSAtIHN0YXJ0OwogICAgICB9CiAgICAgIHJldHVybiBu
ZXcgU2luZ2xlUnVuKGNvdW50LCBkdXJhdGlvbik7CiAgICB9CgogICAgZnVuY3Rpb24gdGVzdCgp
IHsKICAgICAgbG9vcDEoMTAwMDAwMCk7CiAgICB9CgogICAgZnVuY3Rpb24gbG9vcDEoY291bnQp
IHsKICAgICAgdmFyIGQgPSBkb2N1bWVudDsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3Vu
dDsgaSsrKSB7CiAgICAgICAgZC5nZXRFbGVtZW50QnlJZCgiZDAiKTsKICAgICAgfQogICAgfQog
ICAgPC9zY3JpcHQ+CiAgPC9oZWFkPgogIDxib2R5PgogICAgQ2xpY2sgc3RhcnQgdG8gcnVuIHRo
ZSB0ZXN0LiBJdCB3aWxsIHJ1biBhdCBsZWFzdCB0ZW4gdGltZXMgYW5kIHRoZW4gdW50aWwgdGhl
IHZhcmlhbmNlIGlzIGxlc3MgdGhhbiAxJSAtLSB3aGlsZSBtYXkgdGFrZSBhIGxvbmcgdGltZS4K
ICAgIFRoZSByZXN1bHQgc2hvdWxkIGJlIGRpcmVjdGx5IGNvcm9sbGF0ZWQgd2l0aCB0aGUgcGVy
Zm9ybWFuY2Ugb2YgZ2V0RWxlbWVudEJ5SWQsIHNvIGEgNTAlIGluY3JlYXNlIGluIHZhbHVlIG1l
YW5zIGdldEVsZW1lbnRCeUlkIGdvdCA1MCUgZmFzdGVyLjxwPgogICAgPGEgaHJlZj0iIyIgb25j
bGljaz0icnVuKCkiPnN0YXJ0PC9hPgogICAgPGRpdiBpZD0iZDAiPjwvZGl2PgogICAgPHRhYmxl
PgogICAgICA8dHI+PHRkPlJ1bnM6PC90ZD48dGQ+PGRpdiBpZD0icnVucyI+PC9kaXY+PC90ZD48
L3RyPgogICAgICA8dHI+PHRkPkF2ZXJhZ2U6PC90ZD48dGQ+PGRpdiBpZD0iYXZlcmFnZSI+PC9k
aXY+PC90ZD48L3RyPgogICAgICA8dHI+PHRkPkRldmlhdGlvbjo8L3RkPjx0ZD48ZGl2IGlkPSJl
cnJvciI+PC9kaXY+PC90ZD48L3RyPgogICAgICA8dHI+PHRkIHN0eWxlPSJ2ZXJ0aWNhbC1hbGln
bjogdG9wIj5WYWx1ZXM6PC90ZD48dGQ+PGRpdiBzdHlsZT0ib3ZlcmZsb3c6IGF1dG87IGhlaWdo
dDogNDAwcHg7IHdpZHRoOiA0MDBweDsiIGlkPSJ2YWx1ZXMiPjwvZGl2PjwvdGQ+PC90cj4KICAg
IDwvdGFibGU+CiAgPC9ib2R5Pgo8L2h0bWw+Cg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>33998</attachid>
            <date>2009-08-03 12:32:58 -0700</date>
            <delta_ts>2009-08-03 12:37:32 -0700</delta_ts>
            <desc>Shark sample of benchmark in WebKit r46722 built RELEASE for Mac with JSC</desc>
            <filename>getElementById.mshark</filename>
            <type>application/octet-stream</type>
            <size>0</size>
            <attacher name="Eric Seidel (no email)">eric</attacher>
            
              <data encoding="base64"></data>

          </attachment>
      

    </bug>

</bugzilla>