<?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>45520</bug_id>
          
          <creation_ts>2010-09-09 21:55:16 -0700</creation_ts>
          <short_desc>Add shaders for GPU accelerated path rendering</short_desc>
          <delta_ts>2011-02-07 18:02:08 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Layout and Rendering</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>
          
          <blocked>44729</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Kenneth Russell">kbr</reporter>
          <assigned_to name="Kenneth Russell">kbr</assigned_to>
          <cc>abarth</cc>
    
    <cc>cmarrin</cc>
    
    <cc>dglazkov</cc>
    
    <cc>eric</cc>
    
    <cc>fishd</cc>
    
    <cc>gman</cc>
    
    <cc>jamesr</cc>
    
    <cc>senorblanco</cc>
    
    <cc>simon.fraser</cc>
    
    <cc>vangelis</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>277009</commentid>
    <comment_count>0</comment_count>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2010-09-09 21:55:16 -0700</bug_when>
    <thetext>The shaders needed to render paths on the GPU need to be generated on the fly and cached, because there are several variables affecting their behavior and not all permutations are needed. Classes are needed to manage the shaders and cache them.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>277032</commentid>
    <comment_count>1</comment_count>
      <attachid>67157</attachid>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2010-09-09 22:37:18 -0700</bug_when>
    <thetext>Created attachment 67157
Patch

From the ChangeLog:

Adding generator and cache of the shaders for the GPU accelerated path rendering algorithm from GPU Gems 3. No tests yet; will be tested in conjunction with later code.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>277057</commentid>
    <comment_count>2</comment_count>
      <attachid>67157</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-09-10 00:34:40 -0700</bug_when>
    <thetext>Comment on attachment 67157
Patch

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

A bunch of nits.  I&apos;m not much of a graphics dude though, so I don&apos;t have much of substance to say.

&gt; WebCore/platform/graphics/gpu/LoopBlinnShader.cpp:43
&gt; +long LoopBlinnShader::getUniformLocation(const String&amp; name)
What is a long?  I think we normally use int or unsigned instead in WebCore code.

&gt; WebCore/platform/graphics/gpu/LoopBlinnShader.cpp:48
&gt; +    long location = m_context-&gt;getUniformLocation(m_program, name);
We don&apos;t use &quot;get&quot; in names in WebCore code.  I guess we do use them for active lookups (like hash lookukps) sometimes though.  Never for accessors.  So I guess this is OK.  We should really clarify our stance in the style guide. :)

&gt; WebCore/platform/graphics/gpu/LoopBlinnShader.cpp:56
&gt; +    if (iter != m_attribLocations.end())
Can this just be if (iter)?

&gt; WebCore/platform/graphics/gpu/LoopBlinnShader.h:29
&gt; +#include &quot;GraphicsContext3D.h&quot;
Not needed, right?  Or is it needed for Platform3DObject?  Should Platform3DObject be in its own header?

&gt; WebCore/platform/graphics/gpu/LoopBlinnShader.h:30
&gt; +#include &quot;PlatformString.h&quot;
Unlikely this is needed, StringHash includes it if nothing else does.

&gt; WebCore/platform/graphics/gpu/LoopBlinnShader.h:44
&gt; +    LoopBlinnShader(GraphicsContext3D* context, Platform3DObject program);
&quot;context&quot; is not needed here.  We only name arguments when they add meaning to the declaration.

&gt; WebCore/platform/graphics/gpu/LoopBlinnShader.h:46
&gt; +    void use();
What does &quot;use&quot; mean here?

&gt; WebCore/platform/graphics/gpu/LoopBlinnShaderCache.cpp:28
&gt; +#include &quot;config.h&quot;
&gt; +
&gt; +#include &quot;LoopBlinnShaderCache.h&quot;
I don&apos;t think folks normally put a new line between config.h and the first header.  Not a big deal.

&gt; WebCore/platform/graphics/gpu/LoopBlinnShaderCache.cpp:31
&gt; +#include &quot;PlatformString.h&quot;
This was included in the header, no?

&gt; WebCore/platform/graphics/gpu/LoopBlinnShaderCache.cpp:41
&gt; +    m_shaders.resize(NumShaderTypes * NumRegionTypes * NumAntialiasTypes);
Thanks for using constants!  I&apos;m not sure what the correct style is. I don&apos;t think they&apos;re capitalized though since that would be class names.

&gt; WebCore/platform/graphics/gpu/LoopBlinnShaderCache.cpp:67
&gt; +    int index = (shaderIndex * numRegions * numAntialiases +
Um, really?  That&apos;s one crazy datastructure!

&gt; WebCore/platform/graphics/gpu/LoopBlinnShaderCache.cpp:70
&gt; +    if (!m_shaders[index].get())
.get() is not needed here. There is a bool conversion for you.

&gt; WebCore/platform/graphics/gpu/LoopBlinnShaderCache.cpp:75
&gt; +PassOwnPtr&lt;LoopBlinnShader&gt; LoopBlinnShaderCache::createShader(ShaderType shaderType, RegionType regionType, AntialiasType antialiasType)
This is a really long method... can we make it shorter? Split it up into pieces?

&gt; WebCore/platform/graphics/gpu/LoopBlinnShaderCache.cpp:154
&gt; +    m_context-&gt;getProgramiv(program, GraphicsContext3D::LINK_STATUS, &amp;linkStatus);
what&apos;s &quot;Programiv&quot;?  A graphics term?

&gt; WebCore/platform/graphics/gpu/LoopBlinnShaderCache.cpp:162
&gt; +    m_context-&gt;deleteShader(vertexShader);
Should we use some sort of scoping object for this attach/delete pattern?

&gt; WebCore/platform/graphics/gpu/LoopBlinnShaderCache.cpp:173
&gt; +    m_context-&gt;getShaderiv(shader, GraphicsContext3D::COMPILE_STATUS, &amp;compileStatus);
Shaderiv?  Another graphics term?

&gt; WebCore/platform/graphics/gpu/LoopBlinnShaderCache.h:65
&gt; +    LoopBlinnShader* getShader(ShaderType shaderType, RegionType regionType, AntialiasType antialiasType);
I wonder if lookupShader would be better than getShader().  Maybe I&apos;m just sensitive to &quot;get&quot; after all these years in WebCore...

&gt; WebCore/platform/graphics/gpu/LoopBlinnShaderCache.h:68
&gt; +    PassOwnPtr&lt;LoopBlinnShader&gt; createShader(ShaderType shaderType, RegionType regionType, AntialiasType antialiasType);
None of these names are needed, the types say it all.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>277371</commentid>
    <comment_count>3</comment_count>
      <attachid>67222</attachid>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2010-09-10 12:35:36 -0700</bug_when>
    <thetext>Created attachment 67222
Revised patch

Addressed code review feedback above.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>277377</commentid>
    <comment_count>4</comment_count>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2010-09-10 12:43:15 -0700</bug_when>
    <thetext>(In reply to comment #2)
&gt; (From update of attachment 67157 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=67157&amp;action=prettypatch
&gt; 
&gt; A bunch of nits.  I&apos;m not much of a graphics dude though, so I don&apos;t have much of substance to say.
&gt; 
&gt; &gt; WebCore/platform/graphics/gpu/LoopBlinnShader.cpp:43
&gt; &gt; +long LoopBlinnShader::getUniformLocation(const String&amp; name)
&gt; What is a long?  I think we normally use int or unsigned instead in WebCore code.

This is an artifact of bogus uses of the type &quot;long&quot; in GraphicsContext3D and WebGLRenderingContext dating back to their initial integration. I&apos;ve just filed https://bugs.webkit.org/show_bug.cgi?id=45557 to fix these up. However, I&apos;d like to not block the integration of this code on that bug.

&gt; &gt; WebCore/platform/graphics/gpu/LoopBlinnShader.cpp:48
&gt; &gt; +    long location = m_context-&gt;getUniformLocation(m_program, name);
&gt; We don&apos;t use &quot;get&quot; in names in WebCore code.  I guess we do use them for active lookups (like hash lookukps) sometimes though.  Never for accessors.  So I guess this is OK.  We should really clarify our stance in the style guide. :)

This name, like all of the other names in GraphicsContext3D, maps exactly to the OpenGL API with the &quot;gl&quot; prefix removed -- in this case, glGetUniformLocation. There is no reason to use another name.

&gt; &gt; WebCore/platform/graphics/gpu/LoopBlinnShader.cpp:56
&gt; &gt; +    if (iter != m_attribLocations.end())
&gt; Can this just be if (iter)?

No. The semantics of find() are that it returns end() if not found. end() is not null.

&gt; &gt; WebCore/platform/graphics/gpu/LoopBlinnShader.h:29
&gt; &gt; +#include &quot;GraphicsContext3D.h&quot;
&gt; Not needed, right?  Or is it needed for Platform3DObject?  Should Platform3DObject be in its own header?

It was for Platform3DObject. I&apos;ve changed that to &quot;unsigned&quot; and filed https://bugs.webkit.org/show_bug.cgi?id=45558 to remove Platform3DObject completely, because it&apos;s pretty bogus.

&gt; &gt; WebCore/platform/graphics/gpu/LoopBlinnShader.h:30
&gt; &gt; +#include &quot;PlatformString.h&quot;
&gt; Unlikely this is needed, StringHash includes it if nothing else does.

OK, removed.

&gt; &gt; WebCore/platform/graphics/gpu/LoopBlinnShader.h:44
&gt; &gt; +    LoopBlinnShader(GraphicsContext3D* context, Platform3DObject program);
&gt; &quot;context&quot; is not needed here.  We only name arguments when they add meaning to the declaration.

Removed.

&gt; &gt; WebCore/platform/graphics/gpu/LoopBlinnShader.h:46
&gt; &gt; +    void use();
&gt; What does &quot;use&quot; mean here?

It&apos;s OpenGL terminology; &quot;glUseProgram&quot;. Note that the same name is already used in a couple of other shader-related classes in this directory.

&gt; &gt; WebCore/platform/graphics/gpu/LoopBlinnShaderCache.cpp:28
&gt; &gt; +#include &quot;config.h&quot;
&gt; &gt; +
&gt; &gt; +#include &quot;LoopBlinnShaderCache.h&quot;
&gt; I don&apos;t think folks normally put a new line between config.h and the first header.  Not a big deal.

I&apos;ve been using that style throughout the new code I&apos;ve been adding. Left unchanged.

&gt; &gt; WebCore/platform/graphics/gpu/LoopBlinnShaderCache.cpp:31
&gt; &gt; +#include &quot;PlatformString.h&quot;
&gt; This was included in the header, no?

Was unnecessary; removed.

&gt; &gt; WebCore/platform/graphics/gpu/LoopBlinnShaderCache.cpp:41
&gt; &gt; +    m_shaders.resize(NumShaderTypes * NumRegionTypes * NumAntialiasTypes);
&gt; Thanks for using constants!  I&apos;m not sure what the correct style is. I don&apos;t think they&apos;re capitalized though since that would be class names.

This is the correct style.

&gt; &gt; WebCore/platform/graphics/gpu/LoopBlinnShaderCache.cpp:67
&gt; &gt; +    int index = (shaderIndex * numRegions * numAntialiases +
&gt; Um, really?  That&apos;s one crazy datastructure!

It&apos;s really not that complicated. It simply maintains slots for all permutations of these variables, although not all slots will be filled.

&gt; &gt; WebCore/platform/graphics/gpu/LoopBlinnShaderCache.cpp:70
&gt; &gt; +    if (!m_shaders[index].get())
&gt; .get() is not needed here. There is a bool conversion for you.

OK, removed.

&gt; &gt; WebCore/platform/graphics/gpu/LoopBlinnShaderCache.cpp:75
&gt; &gt; +PassOwnPtr&lt;LoopBlinnShader&gt; LoopBlinnShaderCache::createShader(ShaderType shaderType, RegionType regionType, AntialiasType antialiasType)
&gt; This is a really long method... can we make it shorter? Split it up into pieces?

I thought about this but all it&apos;s doing is assembling a vertex and a fragment shader into a program. I don&apos;t think that splitting it up will add anything at this point. If it gets more complicated in the future, I will.

&gt; &gt; WebCore/platform/graphics/gpu/LoopBlinnShaderCache.cpp:154
&gt; &gt; +    m_context-&gt;getProgramiv(program, GraphicsContext3D::LINK_STATUS, &amp;linkStatus);
&gt; what&apos;s &quot;Programiv&quot;?  A graphics term?

OpenGL terminology -- integer pointer.

&gt; &gt; WebCore/platform/graphics/gpu/LoopBlinnShaderCache.cpp:162
&gt; &gt; +    m_context-&gt;deleteShader(vertexShader);
&gt; Should we use some sort of scoping object for this attach/delete pattern?

No. This is basically OpenGL code. It is definitely not worth introducing additional complexity for this roughly five lines of actual graphics code in this method.

&gt; &gt; WebCore/platform/graphics/gpu/LoopBlinnShaderCache.cpp:173
&gt; &gt; +    m_context-&gt;getShaderiv(shader, GraphicsContext3D::COMPILE_STATUS, &amp;compileStatus);
&gt; Shaderiv?  Another graphics term?

OpenGL terminology. Get integer from shader, passing integer pointer for result.

&gt; &gt; WebCore/platform/graphics/gpu/LoopBlinnShaderCache.h:65
&gt; &gt; +    LoopBlinnShader* getShader(ShaderType shaderType, RegionType regionType, AntialiasType antialiasType);
&gt; I wonder if lookupShader would be better than getShader().  Maybe I&apos;m just sensitive to &quot;get&quot; after all these years in WebCore...

OK, I renamed it to lookupShader.

&gt; &gt; WebCore/platform/graphics/gpu/LoopBlinnShaderCache.h:68
&gt; &gt; +    PassOwnPtr&lt;LoopBlinnShader&gt; createShader(ShaderType shaderType, RegionType regionType, AntialiasType antialiasType);
&gt; None of these names are needed, the types say it all.

Removed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>277402</commentid>
    <comment_count>5</comment_count>
      <attachid>67222</attachid>
    <who name="James Robinson">jamesr</who>
    <bug_when>2010-09-10 13:29:22 -0700</bug_when>
    <thetext>Comment on attachment 67222
Revised patch

Some minor comments.  I&apos;d really like this type to be merged with the existing Shader base class if possible to in order to share code.

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

&gt; WebCore/platform/graphics/gpu/LoopBlinnShader.h:45
&gt; +    LoopBlinnShader(GraphicsContext3D*, unsigned program);
How is this type different from a http://trac.webkit.org/browser/trunk/WebCore/platform/graphics/gpu/Shader.h?
please declare d&apos;tor and define in cpp

&gt; WebCore/platform/graphics/gpu/LoopBlinnShaderCache.cpp:40
&gt; +unsigned createShaderFromSource(GraphicsContext3D* context, GraphicsContext3D::WebGLEnumType shaderType, const String&amp; source)
We have almost this exact same function in http://trac.webkit.org/browser/trunk/WebCore/platform/graphics/gpu/Shader.cpp#L56.  Is there any way to unify these?

The use of a WebGL type here is unfortunate - should this just be renamed in GraphicsContext3D?

&gt; WebCore/platform/graphics/gpu/LoopBlinnShaderCache.cpp:94
&gt; +    int index = (shaderIndex * numRegions * numAntialiases +
&gt; +                 regionIndex * numAntialiases +
&gt; +                 antialiasIndex);
&gt; +    if (!m_shaders[index])
&gt; +        m_shaders[index] = createShader(shaderType, regionType, antialiasType);
it seems like m_shaders should be an N-dimensional array instead of a vector

&gt; WebCore/platform/graphics/gpu/LoopBlinnShaderCache.h:44
&gt; +    LoopBlinnShaderCache(GraphicsContext3D*);
mark the constructor explicit

please declare a destructor and define in the cpp.  Vector&apos;s destructor is large and will be inlined into the header otherwise</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>278462</commentid>
    <comment_count>6</comment_count>
      <attachid>67468</attachid>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2010-09-13 14:07:14 -0700</bug_when>
    <thetext>Created attachment 67468
Revised patch

Addressed above code review feedback.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>278464</commentid>
    <comment_count>7</comment_count>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2010-09-13 14:09:43 -0700</bug_when>
    <thetext>(In reply to comment #5)
&gt; (From update of attachment 67222 [details])
&gt; Some minor comments.  I&apos;d really like this type to be merged with the existing Shader base class if possible to in order to share code.

Agreed, and there is a FIXME in LoopBlinnShader.h to this effect, but the merge will be intricate and I want to checkpoint the code before doing it to avoid regressions.

&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=67222&amp;action=prettypatch
&gt; 
&gt; &gt; WebCore/platform/graphics/gpu/LoopBlinnShader.h:45
&gt; &gt; +    LoopBlinnShader(GraphicsContext3D*, unsigned program);
&gt; How is this type different from a http://trac.webkit.org/browser/trunk/WebCore/platform/graphics/gpu/Shader.h?
&gt; please declare d&apos;tor and define in cpp

They will be merged after the initial checkpoint. Destructor declared and added to .cpp.

&gt; &gt; WebCore/platform/graphics/gpu/LoopBlinnShaderCache.cpp:40
&gt; &gt; +unsigned createShaderFromSource(GraphicsContext3D* context, GraphicsContext3D::WebGLEnumType shaderType, const String&amp; source)
&gt; We have almost this exact same function in http://trac.webkit.org/browser/trunk/WebCore/platform/graphics/gpu/Shader.cpp#L56.  Is there any way to unify these?

I will do this after the code has been checkpointed.

&gt; The use of a WebGL type here is unfortunate - should this just be renamed in GraphicsContext3D?

Yes, filed as https://bugs.webkit.org/show_bug.cgi?id=45708 .

&gt; &gt; WebCore/platform/graphics/gpu/LoopBlinnShaderCache.cpp:94
&gt; &gt; +    int index = (shaderIndex * numRegions * numAntialiases +
&gt; &gt; +                 regionIndex * numAntialiases +
&gt; &gt; +                 antialiasIndex);
&gt; &gt; +    if (!m_shaders[index])
&gt; &gt; +        m_shaders[index] = createShader(shaderType, regionType, antialiasType);
&gt; it seems like m_shaders should be an N-dimensional array instead of a vector

Yes, this does make the code a lot simpler. Changed.

&gt; &gt; WebCore/platform/graphics/gpu/LoopBlinnShaderCache.h:44
&gt; &gt; +    LoopBlinnShaderCache(GraphicsContext3D*);
&gt; mark the constructor explicit

Done.

&gt; please declare a destructor and define in the cpp.  Vector&apos;s destructor is large and will be inlined into the header otherwise

Done.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>279717</commentid>
    <comment_count>8</comment_count>
      <attachid>67468</attachid>
    <who name="James Robinson">jamesr</who>
    <bug_when>2010-09-15 14:23:52 -0700</bug_when>
    <thetext>Comment on attachment 67468
Revised patch

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

&gt; WebCore/platform/graphics/gpu/LoopBlinnShader.h:43
&gt; +// FIXME: this class needs to be merged with the shader classes for
&gt; +// the fills for rectangles, etc.
&gt; +class LoopBlinnShader : public Noncopyable {
I would strongly prefer this be merged _before_ landing.  There&apos;s no reason to check in code that we know needs to be changed.

It looks like the {SolidFill, Interior} shader is exactly the same as our existing SolidFillShader.  Removing that permutation would make the rest of this code a lot simpler.

&gt; WebCore/platform/graphics/gpu/LoopBlinnShader.h:50
&gt; +    long getUniformLocation(const String&amp; name);
&gt; +    long getAttribLocation(const String&amp; name);
This is a different model from the other shader types.  Why do callers need to grab arbitrary uniform/attribute locations?  This looks fragile since knowing that something is a LoopBlinnShader is not enough to know what uniforms and attributes are available.


r- for the redundancy.  I think merging with the existing Shader class should be very straightforward - the only real change is that Shader::loadShader() / loadProgram() should be changed to take strings as Strings rather than const char*, but that is pretty simple and definitely an improvement anyway.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>279801</commentid>
    <comment_count>9</comment_count>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2010-09-15 16:11:07 -0700</bug_when>
    <thetext>(In reply to comment #8)
&gt; r- for the redundancy.  I think merging with the existing Shader class should be very straightforward - the only real change is that Shader::loadShader() / loadProgram() should be changed to take strings as Strings rather than const char*, but that is pretty simple and definitely an improvement anyway.

We&apos;ve discussed offline the fact that these shaders optionally require an additional vertex attribute stream, which is a fair bit different than how the existing shaders work. I don&apos;t want to risk regressing the current functionality or my shaders by doing the merge before an initial checkpoint. I&apos;m marking this patch r? again.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>280043</commentid>
    <comment_count>10</comment_count>
      <attachid>67468</attachid>
    <who name="Chris Marrin">cmarrin</who>
    <bug_when>2010-09-16 06:09:49 -0700</bug_when>
    <thetext>Comment on attachment 67468
Revised patch

But I believe the original point is still valid. Checking in a fix with the intention of &quot;fixing it&quot; in the misty future is bad practice. If the current functionality is deficient and needs to be updated to accommodate your new functionality, you should file a bug for that work, block this one on that, fix that bug and then land this patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>345999</commentid>
    <comment_count>11</comment_count>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2011-02-04 18:58:00 -0800</bug_when>
    <thetext>Changing the synopsis to reflect the code restructuring based on review feedback.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>346003</commentid>
    <comment_count>12</comment_count>
      <attachid>81335</attachid>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2011-02-04 19:08:22 -0800</bug_when>
    <thetext>Created attachment 81335
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>346004</commentid>
    <comment_count>13</comment_count>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2011-02-04 19:09:25 -0800</bug_when>
    <thetext>The code has been completely restructured to address the previous review feedback. Please re-review.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>346717</commentid>
    <comment_count>14</comment_count>
      <attachid>81335</attachid>
    <who name="James Robinson">jamesr</who>
    <bug_when>2011-02-07 12:33:01 -0800</bug_when>
    <thetext>Comment on attachment 81335
Patch

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

R=me.  Looks great, can&apos;t want to see this in action.

&gt; Source/WebCore/platform/graphics/gpu/Shader.cpp:203
&gt; +                &quot;#extension GL_OES_standard_derivatives : enable\n&quot;);

Is some higher level code responsible for making sure the appropriate extension is enabled when passing Antialiased down?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>346952</commentid>
    <comment_count>15</comment_count>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2011-02-07 16:49:38 -0800</bug_when>
    <thetext>(In reply to comment #14)
&gt; (From update of attachment 81335 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=81335&amp;action=review
&gt; 
&gt; R=me.  Looks great, can&apos;t want to see this in action.
&gt; 
&gt; &gt; Source/WebCore/platform/graphics/gpu/Shader.cpp:203
&gt; &gt; +                &quot;#extension GL_OES_standard_derivatives : enable\n&quot;);
&gt; 
&gt; Is some higher level code responsible for making sure the appropriate extension is enabled when passing Antialiased down?

Yes. A forthcoming patch to SharedGraphicsContext3D will query for, conditionally enable, and base the Antialiased flag on the availability of this extension.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>346959</commentid>
    <comment_count>16</comment_count>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2011-02-07 16:59:19 -0800</bug_when>
    <thetext>webkit-patch threw an exception while updating this bug.

Committed r77865: &lt;http://trac.webkit.org/changeset/77865&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>346987</commentid>
    <comment_count>17</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-02-07 17:51:01 -0800</bug_when>
    <thetext>http://trac.webkit.org/changeset/77865 might have broken Leopard Intel Release (Tests)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>346991</commentid>
    <comment_count>18</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-02-07 18:02:08 -0800</bug_when>
    <thetext>http://trac.webkit.org/changeset/77865 might have broken Leopard Intel Release (Tests)</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>67157</attachid>
            <date>2010-09-09 22:37:18 -0700</date>
            <delta_ts>2010-09-10 12:35:36 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>shader-cache.patch</filename>
            <type>text/plain</type>
            <size>17749</size>
            <attacher name="Kenneth Russell">kbr</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2NzE2NSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMjcgQEAKKzIwMTAtMDktMDkgIEtlbm5ldGggUnVzc2VsbCAgPGtickBnb29nbGUu
Y29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIEFk
ZCBzaGFkZXIgZ2VuZXJhdG9yIGFuZCBjYWNoZSBmb3IgR1BVIGFjY2VsZXJhdGVkIHBhdGggcmVu
ZGVyaW5nCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD00
NTUyMAorCisgICAgICAgIEFkZGluZyBnZW5lcmF0b3IgYW5kIGNhY2hlIG9mIHRoZSBzaGFkZXJz
IGZvciB0aGUgR1BVIGFjY2VsZXJhdGVkCisgICAgICAgIHBhdGggcmVuZGVyaW5nIGFsZ29yaXRo
bSBmcm9tIEdQVSBHZW1zIDMuIE5vIHRlc3RzIHlldDsgd2lsbCBiZQorICAgICAgICB0ZXN0ZWQg
aW4gY29uanVuY3Rpb24gd2l0aCBsYXRlciBjb2RlLgorCisgICAgICAgICogcGxhdGZvcm0vZ3Jh
cGhpY3MvZ3B1L0xvb3BCbGlublNoYWRlci5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6
TG9vcEJsaW5uU2hhZGVyOjpMb29wQmxpbm5TaGFkZXIpOgorICAgICAgICAoV2ViQ29yZTo6TG9v
cEJsaW5uU2hhZGVyOjp1c2UpOgorICAgICAgICAoV2ViQ29yZTo6TG9vcEJsaW5uU2hhZGVyOjpn
ZXRVbmlmb3JtTG9jYXRpb24pOgorICAgICAgICAoV2ViQ29yZTo6TG9vcEJsaW5uU2hhZGVyOjpn
ZXRBdHRyaWJMb2NhdGlvbik6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvZ3B1L0xvb3BC
bGlublNoYWRlci5oOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9ncHUvTG9v
cEJsaW5uU2hhZGVyQ2FjaGUuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6Okxvb3BCbGlu
blNoYWRlckNhY2hlOjpMb29wQmxpbm5TaGFkZXJDYWNoZSk6CisgICAgICAgIChXZWJDb3JlOjpM
b29wQmxpbm5TaGFkZXJDYWNoZTo6Z2V0U2hhZGVyKToKKyAgICAgICAgKFdlYkNvcmU6Okxvb3BC
bGlublNoYWRlckNhY2hlOjpjcmVhdGVTaGFkZXIpOgorICAgICAgICAoV2ViQ29yZTo6TG9vcEJs
aW5uU2hhZGVyQ2FjaGU6OmNyZWF0ZVNoYWRlckZyb21Tb3VyY2UpOgorICAgICAgICAqIHBsYXRm
b3JtL2dyYXBoaWNzL2dwdS9Mb29wQmxpbm5TaGFkZXJDYWNoZS5oOiBBZGRlZC4KKwogMjAxMC0w
OS0wOSAgS2VudCBUYW11cmEgIDx0a2VudEBjaHJvbWl1bS5vcmc+CiAKICAgICAgICAgUmV2aWV3
ZWQgYnkgRGltaXRyaSBHbGF6a292LgpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9n
cHUvTG9vcEJsaW5uU2hhZGVyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL2dwdS9Mb29wQmxpbm5TaGFkZXIuY3BwCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9ncHUvTG9vcEJsaW5uU2hhZGVyLmNwcAkocmV2aXNpb24gMCkKQEAg
LTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5Z
CisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9T
UyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9G
CisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgIkxv
b3BCbGlublNoYWRlci5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK0xvb3BCbGlublNoYWRl
cjo6TG9vcEJsaW5uU2hhZGVyKEdyYXBoaWNzQ29udGV4dDNEKiBjb250ZXh0LCBQbGF0Zm9ybTNE
T2JqZWN0IHByb2dyYW0pCisgICAgOiBtX2NvbnRleHQoY29udGV4dCkKKyAgICAsIG1fcHJvZ3Jh
bShwcm9ncmFtKQoreworfQorCit2b2lkIExvb3BCbGlublNoYWRlcjo6dXNlKCkKK3sKKyAgICBt
X2NvbnRleHQtPnVzZVByb2dyYW0obV9wcm9ncmFtKTsKK30KKworbG9uZyBMb29wQmxpbm5TaGFk
ZXI6OmdldFVuaWZvcm1Mb2NhdGlvbihjb25zdCBTdHJpbmcmIG5hbWUpCit7CisgICAgSGFzaE1h
cDxTdHJpbmcsIGxvbmc+OjppdGVyYXRvciBpdGVyID0gbV91bmlmb3JtTG9jYXRpb25zLmZpbmQo
bmFtZSk7CisgICAgaWYgKGl0ZXIgIT0gbV91bmlmb3JtTG9jYXRpb25zLmVuZCgpKQorICAgICAg
ICByZXR1cm4gaXRlci0+c2Vjb25kOworICAgIGxvbmcgbG9jYXRpb24gPSBtX2NvbnRleHQtPmdl
dFVuaWZvcm1Mb2NhdGlvbihtX3Byb2dyYW0sIG5hbWUpOworICAgIG1fdW5pZm9ybUxvY2F0aW9u
cy5hZGQobmFtZSwgbG9jYXRpb24pOworICAgIHJldHVybiBsb2NhdGlvbjsKK30KKworbG9uZyBM
b29wQmxpbm5TaGFkZXI6OmdldEF0dHJpYkxvY2F0aW9uKGNvbnN0IFN0cmluZyYgbmFtZSkKK3sK
KyAgICBIYXNoTWFwPFN0cmluZywgbG9uZz46Oml0ZXJhdG9yIGl0ZXIgPSBtX2F0dHJpYkxvY2F0
aW9ucy5maW5kKG5hbWUpOworICAgIGlmIChpdGVyICE9IG1fYXR0cmliTG9jYXRpb25zLmVuZCgp
KQorICAgICAgICByZXR1cm4gaXRlci0+c2Vjb25kOworICAgIGxvbmcgbG9jYXRpb24gPSBtX2Nv
bnRleHQtPmdldEF0dHJpYkxvY2F0aW9uKG1fcHJvZ3JhbSwgbmFtZSk7CisgICAgbV9hdHRyaWJM
b2NhdGlvbnMuYWRkKG5hbWUsIGxvY2F0aW9uKTsKKyAgICByZXR1cm4gbG9jYXRpb247Cit9CisK
K30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
Z3B1L0xvb3BCbGlublNoYWRlci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvZ3B1L0xvb3BCbGlublNoYWRlci5oCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9ncHUvTG9vcEJsaW5uU2hhZGVyLmgJKHJldmlzaW9uIDApCkBAIC0wLDAg
KzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK
KyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICog
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQor
ICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0Yg
VVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICog
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4KKyAqLworCisjaWZuZGVmIExvb3BCbGlublNoYWRlcl9oCisjZGVmaW5lIExvb3BC
bGlublNoYWRlcl9oCisKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQzRC5oIgorI2luY2x1ZGUg
IlBsYXRmb3JtU3RyaW5nLmgiCisjaW5jbHVkZSA8d3RmL0hhc2hNYXAuaD4KKyNpbmNsdWRlIDx3
dGYvTm9uY29weWFibGUuaD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9TdHJpbmdIYXNoLmg+CisKK25h
bWVzcGFjZSBXZWJDb3JlIHsKKworLy8gQ29udmVuaWVuY2UgY2xhc3Mgd3JhcHBpbmcgdGhlIGdl
bmVyYXRlZCBzaGFkZXJzIGZvciB0aGUKKy8vIEdQVS1hY2NlbGVyYXRlZCBwYXRoIHJlbmRlcmlu
ZyBhbGdvcml0aG0uCisvLworLy8gRklYTUU6IHRoaXMgY2xhc3MgbmVlZHMgdG8gYmUgbWVyZ2Vk
IHdpdGggdGhlIHNoYWRlciBjbGFzc2VzIGZvcgorLy8gdGhlIGZpbGxzIGZvciByZWN0YW5nbGVz
LCBldGMuCitjbGFzcyBMb29wQmxpbm5TaGFkZXIgOiBwdWJsaWMgTm9uY29weWFibGUgeworcHVi
bGljOgorICAgIExvb3BCbGlublNoYWRlcihHcmFwaGljc0NvbnRleHQzRCogY29udGV4dCwgUGxh
dGZvcm0zRE9iamVjdCBwcm9ncmFtKTsKKworICAgIHZvaWQgdXNlKCk7CisgICAgbG9uZyBnZXRV
bmlmb3JtTG9jYXRpb24oY29uc3QgU3RyaW5nJiBuYW1lKTsKKyAgICBsb25nIGdldEF0dHJpYkxv
Y2F0aW9uKGNvbnN0IFN0cmluZyYgbmFtZSk7CisKK3ByaXZhdGU6CisgICAgR3JhcGhpY3NDb250
ZXh0M0QqIG1fY29udGV4dDsKKyAgICBQbGF0Zm9ybTNET2JqZWN0IG1fcHJvZ3JhbTsKKyAgICBI
YXNoTWFwPFN0cmluZywgbG9uZz4gbV91bmlmb3JtTG9jYXRpb25zOworICAgIEhhc2hNYXA8U3Ry
aW5nLCBsb25nPiBtX2F0dHJpYkxvY2F0aW9uczsKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYkNv
cmUKKworI2VuZGlmIC8vIExvb3BCbGlublNoYWRlcl9oCkluZGV4OiBXZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL2dwdS9Mb29wQmxpbm5TaGFkZXJDYWNoZS5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9ncHUvTG9vcEJsaW5uU2hhZGVyQ2FjaGUuY3BwCShyZXZp
c2lvbiAwKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9ncHUvTG9vcEJsaW5uU2hhZGVy
Q2FjaGUuY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDE4NiBAQAorLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBD
T05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBV
UlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMg
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICog
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhF
T1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRl
ICJjb25maWcuaCIKKworI2luY2x1ZGUgIkxvb3BCbGlublNoYWRlckNhY2hlLmgiCisKKyNpbmNs
dWRlICJMb29wQmxpbm5TaGFkZXIuaCIKKyNpbmNsdWRlICJQbGF0Zm9ybVN0cmluZy5oIgorI2lu
Y2x1ZGUgIlN0cmluZ0J1aWxkZXIuaCIKKyNpbmNsdWRlIDx3dGYvQXNzZXJ0aW9ucy5oPgorI2lu
Y2x1ZGUgPHd0Zi90ZXh0L0NTdHJpbmcuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitMb29w
Qmxpbm5TaGFkZXJDYWNoZTo6TG9vcEJsaW5uU2hhZGVyQ2FjaGUoR3JhcGhpY3NDb250ZXh0M0Qq
IGNvbnRleHQpCisgICAgOiBtX2NvbnRleHQoY29udGV4dCkKK3sKKyAgICBtX3NoYWRlcnMucmVz
aXplKE51bVNoYWRlclR5cGVzICogTnVtUmVnaW9uVHlwZXMgKiBOdW1BbnRpYWxpYXNUeXBlcyk7
Cit9CisKK3N0cnVjdCBGaWxsQ29kZSB7CisgICAgY29uc3QgY2hhciogdW5pZm9ybXM7CisgICAg
Y29uc3QgY2hhciogc291cmNlOworfTsKKworLy8gU2hhZGVyIGNvZGUgZm9yIHRoZSB2YXJpb3Vz
IGZpbGxzLCBpbmRleGVkIGJ5IFNoYWRlclR5cGUuCitzdGF0aWMgY29uc3QgRmlsbENvZGUgZmls
bENvZGVbTG9vcEJsaW5uU2hhZGVyQ2FjaGU6Ok51bVNoYWRlclR5cGVzXSA9IHsKKyAgICB7Cisg
ICAgICAgIC8vIFNvbGlkIGZpbGwKKyAgICAgICAgInVuaWZvcm0gdmVjNCBjb2xvcjtcbiIsCisg
ICAgICAgICJnbF9GcmFnQ29sb3IgPSBjb2xvciAqIGFscGhhO1xuIgorICAgIH0KK307CisKK0xv
b3BCbGlublNoYWRlciogTG9vcEJsaW5uU2hhZGVyQ2FjaGU6OmdldFNoYWRlcihTaGFkZXJUeXBl
IHNoYWRlclR5cGUsIFJlZ2lvblR5cGUgcmVnaW9uVHlwZSwgQW50aWFsaWFzVHlwZSBhbnRpYWxp
YXNUeXBlKQoreworICAgIGludCBzaGFkZXJJbmRleCA9IHN0YXRpY19jYXN0PGludD4oc2hhZGVy
VHlwZSk7CisgICAgaW50IG51bVNoYWRlcnMgPSBzdGF0aWNfY2FzdDxpbnQ+KE51bVNoYWRlclR5
cGVzKTsKKyAgICBpbnQgcmVnaW9uSW5kZXggPSBzdGF0aWNfY2FzdDxpbnQ+KHJlZ2lvblR5cGUp
OworICAgIGludCBudW1SZWdpb25zID0gc3RhdGljX2Nhc3Q8aW50PihOdW1SZWdpb25UeXBlcyk7
CisgICAgaW50IGFudGlhbGlhc0luZGV4ID0gc3RhdGljX2Nhc3Q8aW50PihhbnRpYWxpYXNUeXBl
KTsKKyAgICBpbnQgbnVtQW50aWFsaWFzZXMgPSBzdGF0aWNfY2FzdDxpbnQ+KE51bUFudGlhbGlh
c1R5cGVzKTsKKworICAgIGludCBpbmRleCA9IChzaGFkZXJJbmRleCAqIG51bVJlZ2lvbnMgKiBu
dW1BbnRpYWxpYXNlcyArCisgICAgICAgICAgICAgICAgIHJlZ2lvbkluZGV4ICogbnVtQW50aWFs
aWFzZXMgKworICAgICAgICAgICAgICAgICBhbnRpYWxpYXNJbmRleCk7CisgICAgaWYgKCFtX3No
YWRlcnNbaW5kZXhdLmdldCgpKQorICAgICAgICBtX3NoYWRlcnNbaW5kZXhdID0gY3JlYXRlU2hh
ZGVyKHNoYWRlclR5cGUsIHJlZ2lvblR5cGUsIGFudGlhbGlhc1R5cGUpOworICAgIHJldHVybiBt
X3NoYWRlcnNbaW5kZXhdLmdldCgpOworfQorCitQYXNzT3duUHRyPExvb3BCbGlublNoYWRlcj4g
TG9vcEJsaW5uU2hhZGVyQ2FjaGU6OmNyZWF0ZVNoYWRlcihTaGFkZXJUeXBlIHNoYWRlclR5cGUs
IFJlZ2lvblR5cGUgcmVnaW9uVHlwZSwgQW50aWFsaWFzVHlwZSBhbnRpYWxpYXNUeXBlKQorewor
ICAgIGNvbnN0IEZpbGxDb2RlJiBmaWxsID0gZmlsbENvZGVbc2hhZGVyVHlwZV07CisKKyAgICBT
dHJpbmdCdWlsZGVyIHZlcnRleFNoYWRlclNvdXJjZTsKKyAgICB2ZXJ0ZXhTaGFkZXJTb3VyY2Uu
YXBwZW5kKAorICAgICAgICAiLy8gVmVydGV4IHNoYWRlclxuIgorICAgICAgICAidW5pZm9ybSBt
YXQ0IHdvcmxkVmlld1Byb2plY3Rpb247XG4iCisgICAgICAgICJcbiIKKyAgICAgICAgImF0dHJp
YnV0ZSB2ZWMyIHBvc2l0aW9uO1xuIik7CisgICAgaWYgKHJlZ2lvblR5cGUgPT0gRXh0ZXJpb3Ip
IHsKKyAgICAgICAgdmVydGV4U2hhZGVyU291cmNlLmFwcGVuZCgKKyAgICAgICAgICAgICJhdHRy
aWJ1dGUgdmVjMyB0ZXhDb29yZDA7XG4iCisgICAgICAgICAgICAiXG4iCisgICAgICAgICAgICAi
dmFyeWluZyB2ZWMzIGtsbTtcbiIpOworICAgIH0KKyAgICB2ZXJ0ZXhTaGFkZXJTb3VyY2UuYXBw
ZW5kKAorICAgICAgICAiXG4iCisgICAgICAgICJ2b2lkIG1haW4oKSB7XG4iCisgICAgICAgICIg
IGdsX1Bvc2l0aW9uID0gd29ybGRWaWV3UHJvamVjdGlvbiAqIHZlYzQocG9zaXRpb24sIDAuMCwg
MS4wKTtcbiIpOworICAgIGlmIChyZWdpb25UeXBlID09IEV4dGVyaW9yKQorICAgICAgICB2ZXJ0
ZXhTaGFkZXJTb3VyY2UuYXBwZW5kKCIgIGtsbSA9IHRleENvb3JkMDtcbiIpOworICAgIHZlcnRl
eFNoYWRlclNvdXJjZS5hcHBlbmQoIn1cbiIpOworCisgICAgU3RyaW5nQnVpbGRlciBmcmFnbWVu
dFNoYWRlclNvdXJjZTsKKyAgICAvLyBGSVhNRTogZ2V0IHJpZCBvZiB0aGUgI2lmZGVmcyBvbmNl
IHRoZSBzaGFkZXIgdmFsaWRhdG9yIGFuZAorICAgIC8vIEdyYXBoaWNzQ29udGV4dDNEIHN1cHBv
cnQgT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzLiBVbnRpbCB0aGVuCisgICAgLy8gd2UgbmVlZCB0
byBkaXNhYmxlIHNoYWRlciB0cmFuc2xhdGlvbiB0byB0ZXN0IHRoZSBhbnRpYWxpYXNlZAorICAg
IC8vIHBhdGguCisgICAgZnJhZ21lbnRTaGFkZXJTb3VyY2UuYXBwZW5kKAorICAgICAgICAiI2lm
ZGVmIEdMX0VTXG4iCisgICAgICAgICJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiIKKyAgICAg
ICAgIiNlbmRpZlxuIik7CisgICAgaWYgKHJlZ2lvblR5cGUgPT0gRXh0ZXJpb3IpCisgICAgICAg
IGZyYWdtZW50U2hhZGVyU291cmNlLmFwcGVuZCgidmFyeWluZyB2ZWMzIGtsbTtcbiIpOworICAg
IGZyYWdtZW50U2hhZGVyU291cmNlLmFwcGVuZChmaWxsLnVuaWZvcm1zKTsKKyAgICBmcmFnbWVu
dFNoYWRlclNvdXJjZS5hcHBlbmQoInZvaWQgbWFpbigpIHtcbiIpOworICAgIGlmIChyZWdpb25U
eXBlID09IEludGVyaW9yKQorICAgICAgICBmcmFnbWVudFNoYWRlclNvdXJjZS5hcHBlbmQoIiAg
ZmxvYXQgYWxwaGEgPSAxLjA7XG4iKTsKKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKGFudGlhbGlh
c1R5cGUgPT0gQW50aWFsaWFzZWQpIHsKKyAgICAgICAgICAgIGZyYWdtZW50U2hhZGVyU291cmNl
LmFwcGVuZCgKKyAgICAgICAgICAgICAgICAiICAvLyBHcmFkaWVudHNcbiIKKyAgICAgICAgICAg
ICAgICAiICB2ZWMzIHB4ID0gZEZkeChrbG0pO1xuIgorICAgICAgICAgICAgICAgICIgIHZlYzMg
cHkgPSBkRmR5KGtsbSk7XG4iCisgICAgICAgICAgICAgICAgIlxuIgorICAgICAgICAgICAgICAg
ICIgIC8vIENoYWluIHJ1bGVcbiIKKyAgICAgICAgICAgICAgICAiICBmbG9hdCBrMiA9IGtsbS54
ICoga2xtLng7XG4iCisgICAgICAgICAgICAgICAgIiAgZmxvYXQgYyA9IGsyICoga2xtLnggLSBr
bG0ueSAqIGtsbS56O1xuIgorICAgICAgICAgICAgICAgICIgIGZsb2F0IGsyMyA9IDMuMCAqIGsy
O1xuIgorICAgICAgICAgICAgICAgICIgIGZsb2F0IGN4ID0gazIzICogcHgueCAtIGtsbS56ICog
cHgueSAtIGtsbS55ICogcHguejtcbiIKKyAgICAgICAgICAgICAgICAiICBmbG9hdCBjeSA9IGsy
MyAqIHB5LnggLSBrbG0ueiAqIHB5LnkgLSBrbG0ueSAqIHB5Lno7XG4iCisgICAgICAgICAgICAg
ICAgIlxuIgorICAgICAgICAgICAgICAgICIgIC8vIFNpZ25lZCBkaXN0YW5jZVxuIgorICAgICAg
ICAgICAgICAgICIgIGZsb2F0IHNkID0gYyAvIHNxcnQoY3ggKiBjeCArIGN5ICogY3kpO1xuIgor
ICAgICAgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgICAgICAiICAvLyBMaW5lYXIgYWxwaGFc
biIKKyAgICAgICAgICAgICAgICAiICAvLyBGSVhNRTogZmlndXJlIG91dCB3aHkgdGhpcyBuZWVk
cyB0byBiZVxuIgorICAgICAgICAgICAgICAgICIgIC8vIG5lZ2F0ZWQgY29tcGFyZWQgdG8gdGhl
IEhMU0wgdmVyc2lvbiwgYW5kIGFsc28gd2h5XG4iCisgICAgICAgICAgICAgICAgIiAgLy8gd2Ug
bmVlZCBhbiBhZGp1c3RtZW50IGJ5ICsxLjAgZm9yIGl0IHRvIGxvb2sgZ29vZC5cbiIKKyAgICAg
ICAgICAgICAgICAiICAvLyBmbG9hdCBhbHBoYSA9IGNsYW1wKDAuNSAtIHNkLCAwLjAsIDEuMCk7
XG4iCisgICAgICAgICAgICAgICAgIiAgZmxvYXQgYWxwaGEgPSBjbGFtcChzZCArIDAuNSwgMC4w
LCAxLjApO1xuIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmcmFnbWVudFNoYWRl
clNvdXJjZS5hcHBlbmQoCisgICAgICAgICAgICAgICAgIiAgZmxvYXQgdCA9IGtsbS54ICoga2xt
LnggKiBrbG0ueCAtIGtsbS55ICoga2xtLno7XG4iCisgICAgICAgICAgICAgICAgIiAgZmxvYXQg
YWxwaGEgPSBjbGFtcChzaWduKHQpLCAwLjAsIDEuMCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0K
KyAgICBmcmFnbWVudFNoYWRlclNvdXJjZS5hcHBlbmQoZmlsbC5zb3VyY2UpOworICAgIGZyYWdt
ZW50U2hhZGVyU291cmNlLmFwcGVuZCgifVxuIik7CisgICAgdW5zaWduZWQgdmVydGV4U2hhZGVy
ID0gY3JlYXRlU2hhZGVyRnJvbVNvdXJjZShHcmFwaGljc0NvbnRleHQzRDo6VkVSVEVYX1NIQURF
UiwgdmVydGV4U2hhZGVyU291cmNlLnRvU3RyaW5nKCkpOworICAgIHVuc2lnbmVkIGZyYWdtZW50
U2hhZGVyID0gY3JlYXRlU2hhZGVyRnJvbVNvdXJjZShHcmFwaGljc0NvbnRleHQzRDo6RlJBR01F
TlRfU0hBREVSLCBmcmFnbWVudFNoYWRlclNvdXJjZS50b1N0cmluZygpKTsKKyAgICBpZiAoIXZl
cnRleFNoYWRlciB8fCAhZnJhZ21lbnRTaGFkZXIpCisgICAgICAgIHJldHVybiAwOworICAgIHVu
c2lnbmVkIHByb2dyYW0gPSBtX2NvbnRleHQtPmNyZWF0ZVByb2dyYW0oKTsKKyAgICBtX2NvbnRl
eHQtPmF0dGFjaFNoYWRlcihwcm9ncmFtLCB2ZXJ0ZXhTaGFkZXIpOworICAgIG1fY29udGV4dC0+
YXR0YWNoU2hhZGVyKHByb2dyYW0sIGZyYWdtZW50U2hhZGVyKTsKKyAgICBtX2NvbnRleHQtPmxp
bmtQcm9ncmFtKHByb2dyYW0pOworICAgIGludCBsaW5rU3RhdHVzID0gMDsKKyAgICBtX2NvbnRl
eHQtPmdldFByb2dyYW1pdihwcm9ncmFtLCBHcmFwaGljc0NvbnRleHQzRDo6TElOS19TVEFUVVMs
ICZsaW5rU3RhdHVzKTsKKyAgICBpZiAoIWxpbmtTdGF0dXMpIHsKKyNpZm5kZWYgTkRFQlVHCisg
ICAgICAgIFN0cmluZyBsb2cgPSBtX2NvbnRleHQtPmdldFByb2dyYW1JbmZvTG9nKHByb2dyYW0p
OworICAgICAgICBMT0dfRVJST1IoIkVycm9yIGxpbmtpbmcgcHJvZ3JhbTogJXMiLCBsb2cuYXNj
aWkoKS5kYXRhKCkpOworI2VuZGlmCisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBtX2Nv
bnRleHQtPmRlbGV0ZVNoYWRlcih2ZXJ0ZXhTaGFkZXIpOworICAgIG1fY29udGV4dC0+ZGVsZXRl
U2hhZGVyKGZyYWdtZW50U2hhZGVyKTsKKyAgICByZXR1cm4gYWRvcHRQdHIobmV3IExvb3BCbGlu
blNoYWRlcihtX2NvbnRleHQsIHByb2dyYW0pKTsKK30KKworUGxhdGZvcm0zRE9iamVjdCBMb29w
Qmxpbm5TaGFkZXJDYWNoZTo6Y3JlYXRlU2hhZGVyRnJvbVNvdXJjZShHcmFwaGljc0NvbnRleHQz
RDo6V2ViR0xFbnVtVHlwZSBzaGFkZXJUeXBlLCBjb25zdCBTdHJpbmcmIHNvdXJjZSkKK3sKKyAg
ICB1bnNpZ25lZCBzaGFkZXIgPSBtX2NvbnRleHQtPmNyZWF0ZVNoYWRlcihzaGFkZXJUeXBlKTsK
KyAgICBtX2NvbnRleHQtPnNoYWRlclNvdXJjZShzaGFkZXIsIHNvdXJjZSk7CisgICAgbV9jb250
ZXh0LT5jb21waWxlU2hhZGVyKHNoYWRlcik7CisgICAgaW50IGNvbXBpbGVTdGF0dXMgPSAwOwor
ICAgIG1fY29udGV4dC0+Z2V0U2hhZGVyaXYoc2hhZGVyLCBHcmFwaGljc0NvbnRleHQzRDo6Q09N
UElMRV9TVEFUVVMsICZjb21waWxlU3RhdHVzKTsKKyAgICBpZiAoIWNvbXBpbGVTdGF0dXMpIHsK
KyNpZm5kZWYgTkRFQlVHCisgICAgICAgIFN0cmluZyBsb2cgPSBtX2NvbnRleHQtPmdldFNoYWRl
ckluZm9Mb2coc2hhZGVyKTsKKyAgICAgICAgTE9HX0VSUk9SKCJFcnJvciBjb21waWxpbmcgc2hh
ZGVyOiAlcyIsIGxvZy5hc2NpaSgpLmRhdGEoKSk7CisgICAgICAgIExPR19FUlJPUigiU291cmNl
OiIpOworICAgICAgICBMT0dfRVJST1IoIiVzIiwgc291cmNlLmFzY2lpKCkuZGF0YSgpKTsKKyNl
bmRpZgorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIHNoYWRlcjsKK30KKwor
fSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9n
cHUvTG9vcEJsaW5uU2hhZGVyQ2FjaGUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL2dwdS9Mb29wQmxpbm5TaGFkZXJDYWNoZS5oCShyZXZpc2lvbiAwKQorKysgV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9ncHUvTG9vcEJsaW5uU2hhZGVyQ2FjaGUuaAkocmV2aXNp
b24gMCkKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElT
IiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVND
TEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJ
QUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBF
WEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQ
VElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgTG9vcEJsaW5uU2hhZGVyQ2Fj
aGVfaAorI2RlZmluZSBMb29wQmxpbm5TaGFkZXJDYWNoZV9oCisKKyNpbmNsdWRlICJHcmFwaGlj
c0NvbnRleHQzRC5oIgorI2luY2x1ZGUgIkxvb3BCbGlublNoYWRlci5oIgorI2luY2x1ZGUgPHd0
Zi9Ob25jb3B5YWJsZS5oPgorI2luY2x1ZGUgPHd0Zi9Pd25BcnJheVB0ci5oPgorI2luY2x1ZGUg
PHd0Zi9QYXNzT3duUHRyLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworLy8gVGhlIExvb3BC
bGlublNoYWRlckNhY2hlIGxhemlseSBnZW5lcmF0ZXMsIGxvYWRzIGFuZCBjYWNoZXMgdGhlIHNo
YWRlcnMKKy8vIG5lZWRlZCB0byBmaWxsIHRoZSB0cmlhbmdsZSBtZXNoZXMgZ2VuZXJhdGVkIGJ5
IExvb3AgYW5kIEJsaW5uJ3MKKy8vIGFsZ29yaXRobS4KKworY2xhc3MgTG9vcEJsaW5uU2hhZGVy
Q2FjaGUgOiBwdWJsaWMgTm9uY29weWFibGUgeworcHVibGljOgorICAgIExvb3BCbGlublNoYWRl
ckNhY2hlKEdyYXBoaWNzQ29udGV4dDNEKiBjb250ZXh0KTsKKworICAgIGVudW0gU2hhZGVyVHlw
ZSB7CisgICAgICAgIFNvbGlkRmlsbCwKKyAgICAgICAgLy8gRklYTUU6IGFkZCBtb3JlIHR5cGVz
IG9mIHNoYWRlcnMgKGdyYWRpZW50cywgcGF0dGVybnMsIGV0Yy4pCisgICAgICAgIE51bVNoYWRl
clR5cGVzIC8vIE11c3QgYmUgbGFzdAorICAgIH07CisKKyAgICBlbnVtIFJlZ2lvblR5cGUgewor
ICAgICAgICBFeHRlcmlvciwgLy8gTG9vcCBhbmQgQmxpbm4ncyBzaGFkZXIKKyAgICAgICAgSW50
ZXJpb3IsIC8vIFNvbGlkIGZpbGxlZCByZWdpb24KKyAgICAgICAgTnVtUmVnaW9uVHlwZXMgLy8g
TXVzdCBiZSBsYXN0CisgICAgfTsKKworICAgIC8vIFRoaXMgb25seSBhZmZlY3RzIHRoZSBleHRl
cmlvciBzaGFkZXIuCisgICAgZW51bSBBbnRpYWxpYXNUeXBlIHsKKyAgICAgICAgQW50aWFsaWFz
ZWQsCisgICAgICAgIE5vdEFudGlhbGlhc2VkLAorICAgICAgICBOdW1BbnRpYWxpYXNUeXBlcyAv
LyBNdXN0IGJlIGxhc3QKKyAgICB9OworCisgICAgLy8gVGhlIExvb3BCbGlublNoYWRlckNhY2hl
IG93bnMgdGhlIHJldHVybmVkIHBvaW50ZXIuCisgICAgTG9vcEJsaW5uU2hhZGVyKiBnZXRTaGFk
ZXIoU2hhZGVyVHlwZSBzaGFkZXJUeXBlLCBSZWdpb25UeXBlIHJlZ2lvblR5cGUsIEFudGlhbGlh
c1R5cGUgYW50aWFsaWFzVHlwZSk7CisKK3ByaXZhdGU6CisgICAgUGFzc093blB0cjxMb29wQmxp
bm5TaGFkZXI+IGNyZWF0ZVNoYWRlcihTaGFkZXJUeXBlIHNoYWRlclR5cGUsIFJlZ2lvblR5cGUg
cmVnaW9uVHlwZSwgQW50aWFsaWFzVHlwZSBhbnRpYWxpYXNUeXBlKTsKKyAgICBQbGF0Zm9ybTNE
T2JqZWN0IGNyZWF0ZVNoYWRlckZyb21Tb3VyY2UoR3JhcGhpY3NDb250ZXh0M0Q6OldlYkdMRW51
bVR5cGUgc2hhZGVyVHlwZSwgY29uc3QgU3RyaW5nJiBzb3VyY2UpOworCisgICAgR3JhcGhpY3ND
b250ZXh0M0QqIG1fY29udGV4dDsKKyAgICBWZWN0b3I8T3duUHRyPExvb3BCbGlublNoYWRlcj4g
PiBtX3NoYWRlcnM7Cit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBM
b29wQmxpbm5TaGFkZXJDYWNoZV9oCg==
</data>
<flag name="review"
          id="56386"
          type_id="1"
          status="-"
          setter="eric"
    />
    <flag name="commit-queue"
          id="56387"
          type_id="3"
          status="-"
          setter="kbr"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>67222</attachid>
            <date>2010-09-10 12:35:36 -0700</date>
            <delta_ts>2010-09-13 14:07:14 -0700</delta_ts>
            <desc>Revised patch</desc>
            <filename>shader-cache.patch</filename>
            <type>text/plain</type>
            <size>17551</size>
            <attacher name="Kenneth Russell">kbr</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2NzIyMCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMjYgQEAKKzIwMTAtMDktMTAgIEtlbm5ldGggUnVzc2VsbCAgPGtickBnb29nbGUu
Y29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIEFk
ZCBzaGFkZXIgZ2VuZXJhdG9yIGFuZCBjYWNoZSBmb3IgR1BVIGFjY2VsZXJhdGVkIHBhdGggcmVu
ZGVyaW5nCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD00
NTUyMAorCisgICAgICAgIEFkZGluZyBnZW5lcmF0b3IgYW5kIGNhY2hlIG9mIHRoZSBzaGFkZXJz
IGZvciB0aGUgR1BVIGFjY2VsZXJhdGVkCisgICAgICAgIHBhdGggcmVuZGVyaW5nIGFsZ29yaXRo
bSBmcm9tIEdQVSBHZW1zIDMuIE5vIHRlc3RzIHlldDsgd2lsbCBiZQorICAgICAgICB0ZXN0ZWQg
aW4gY29uanVuY3Rpb24gd2l0aCBsYXRlciBjb2RlLgorCisgICAgICAgICogcGxhdGZvcm0vZ3Jh
cGhpY3MvZ3B1L0xvb3BCbGlublNoYWRlci5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6
TG9vcEJsaW5uU2hhZGVyOjpMb29wQmxpbm5TaGFkZXIpOgorICAgICAgICAoV2ViQ29yZTo6TG9v
cEJsaW5uU2hhZGVyOjp1c2UpOgorICAgICAgICAoV2ViQ29yZTo6TG9vcEJsaW5uU2hhZGVyOjpn
ZXRVbmlmb3JtTG9jYXRpb24pOgorICAgICAgICAoV2ViQ29yZTo6TG9vcEJsaW5uU2hhZGVyOjpn
ZXRBdHRyaWJMb2NhdGlvbik6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvZ3B1L0xvb3BC
bGlublNoYWRlci5oOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9ncHUvTG9v
cEJsaW5uU2hhZGVyQ2FjaGUuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6Okxvb3BCbGlu
blNoYWRlckNhY2hlOjpMb29wQmxpbm5TaGFkZXJDYWNoZSk6CisgICAgICAgIChXZWJDb3JlOjpM
b29wQmxpbm5TaGFkZXJDYWNoZTo6bG9va3VwU2hhZGVyKToKKyAgICAgICAgKFdlYkNvcmU6Okxv
b3BCbGlublNoYWRlckNhY2hlOjpjcmVhdGVTaGFkZXIpOgorICAgICAgICAqIHBsYXRmb3JtL2dy
YXBoaWNzL2dwdS9Mb29wQmxpbm5TaGFkZXJDYWNoZS5oOiBBZGRlZC4KKwogMjAxMC0wOS0wOSAg
S2ludWtvIFlhc3VkYSAgPGtpbnVrb0BjaHJvbWl1bS5vcmc+CiAKICAgICAgICAgUmV2aWV3ZWQg
YnkgRHVtaXRydSBEYW5pbGl1Yy4KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZ3B1
L0xvb3BCbGlublNoYWRlci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9ncHUvTG9vcEJsaW5uU2hhZGVyLmNwcAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3MvZ3B1L0xvb3BCbGlublNoYWRlci5jcHAJKHJldmlzaW9uIDApCkBAIC0w
LDAgKzEsNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQor
ICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1Mg
T0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgor
ICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRlICJMb29w
Qmxpbm5TaGFkZXIuaCIKKworI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dDNELmgiCisKK25hbWVz
cGFjZSBXZWJDb3JlIHsKKworTG9vcEJsaW5uU2hhZGVyOjpMb29wQmxpbm5TaGFkZXIoR3JhcGhp
Y3NDb250ZXh0M0QqIGNvbnRleHQsIHVuc2lnbmVkIHByb2dyYW0pCisgICAgOiBtX2NvbnRleHQo
Y29udGV4dCkKKyAgICAsIG1fcHJvZ3JhbShwcm9ncmFtKQoreworfQorCit2b2lkIExvb3BCbGlu
blNoYWRlcjo6dXNlKCkKK3sKKyAgICBtX2NvbnRleHQtPnVzZVByb2dyYW0obV9wcm9ncmFtKTsK
K30KKworbG9uZyBMb29wQmxpbm5TaGFkZXI6OmdldFVuaWZvcm1Mb2NhdGlvbihjb25zdCBTdHJp
bmcmIG5hbWUpCit7CisgICAgSGFzaE1hcDxTdHJpbmcsIGxvbmc+OjppdGVyYXRvciBpdGVyID0g
bV91bmlmb3JtTG9jYXRpb25zLmZpbmQobmFtZSk7CisgICAgaWYgKGl0ZXIgIT0gbV91bmlmb3Jt
TG9jYXRpb25zLmVuZCgpKQorICAgICAgICByZXR1cm4gaXRlci0+c2Vjb25kOworICAgIGxvbmcg
bG9jYXRpb24gPSBtX2NvbnRleHQtPmdldFVuaWZvcm1Mb2NhdGlvbihtX3Byb2dyYW0sIG5hbWUp
OworICAgIG1fdW5pZm9ybUxvY2F0aW9ucy5hZGQobmFtZSwgbG9jYXRpb24pOworICAgIHJldHVy
biBsb2NhdGlvbjsKK30KKworbG9uZyBMb29wQmxpbm5TaGFkZXI6OmdldEF0dHJpYkxvY2F0aW9u
KGNvbnN0IFN0cmluZyYgbmFtZSkKK3sKKyAgICBIYXNoTWFwPFN0cmluZywgbG9uZz46Oml0ZXJh
dG9yIGl0ZXIgPSBtX2F0dHJpYkxvY2F0aW9ucy5maW5kKG5hbWUpOworICAgIGlmIChpdGVyICE9
IG1fYXR0cmliTG9jYXRpb25zLmVuZCgpKQorICAgICAgICByZXR1cm4gaXRlci0+c2Vjb25kOwor
ICAgIGxvbmcgbG9jYXRpb24gPSBtX2NvbnRleHQtPmdldEF0dHJpYkxvY2F0aW9uKG1fcHJvZ3Jh
bSwgbmFtZSk7CisgICAgbV9hdHRyaWJMb2NhdGlvbnMuYWRkKG5hbWUsIGxvY2F0aW9uKTsKKyAg
ICByZXR1cm4gbG9jYXRpb247Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZ3B1L0xvb3BCbGlublNoYWRlci5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZ3B1L0xvb3BCbGlublNoYWRlci5oCShyZXZp
c2lvbiAwKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9ncHUvTG9vcEJsaW5uU2hhZGVy
LmgJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisg
KiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAq
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVU
T1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFS
RQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
U1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIExvb3BCbGlu
blNoYWRlcl9oCisjZGVmaW5lIExvb3BCbGlublNoYWRlcl9oCisKKyNpbmNsdWRlIDx3dGYvSGFz
aE1hcC5oPgorI2luY2x1ZGUgPHd0Zi9Ob25jb3B5YWJsZS5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0
L1N0cmluZ0hhc2guaD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9XVEZTdHJpbmcuaD4KKworbmFtZXNw
YWNlIFdlYkNvcmUgeworCitjbGFzcyBHcmFwaGljc0NvbnRleHQzRDsKKworLy8gQ29udmVuaWVu
Y2UgY2xhc3Mgd3JhcHBpbmcgdGhlIGdlbmVyYXRlZCBzaGFkZXJzIGZvciB0aGUKKy8vIEdQVS1h
Y2NlbGVyYXRlZCBwYXRoIHJlbmRlcmluZyBhbGdvcml0aG0uCisvLworLy8gRklYTUU6IHRoaXMg
Y2xhc3MgbmVlZHMgdG8gYmUgbWVyZ2VkIHdpdGggdGhlIHNoYWRlciBjbGFzc2VzIGZvcgorLy8g
dGhlIGZpbGxzIGZvciByZWN0YW5nbGVzLCBldGMuCitjbGFzcyBMb29wQmxpbm5TaGFkZXIgOiBw
dWJsaWMgTm9uY29weWFibGUgeworcHVibGljOgorICAgIExvb3BCbGlublNoYWRlcihHcmFwaGlj
c0NvbnRleHQzRCosIHVuc2lnbmVkIHByb2dyYW0pOworCisgICAgdm9pZCB1c2UoKTsKKyAgICBs
b25nIGdldFVuaWZvcm1Mb2NhdGlvbihjb25zdCBTdHJpbmcmIG5hbWUpOworICAgIGxvbmcgZ2V0
QXR0cmliTG9jYXRpb24oY29uc3QgU3RyaW5nJiBuYW1lKTsKKworcHJpdmF0ZToKKyAgICBHcmFw
aGljc0NvbnRleHQzRCogbV9jb250ZXh0OworICAgIHVuc2lnbmVkIG1fcHJvZ3JhbTsKKyAgICBI
YXNoTWFwPFN0cmluZywgbG9uZz4gbV91bmlmb3JtTG9jYXRpb25zOworICAgIEhhc2hNYXA8U3Ry
aW5nLCBsb25nPiBtX2F0dHJpYkxvY2F0aW9uczsKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYkNv
cmUKKworI2VuZGlmIC8vIExvb3BCbGlublNoYWRlcl9oCkluZGV4OiBXZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL2dwdS9Mb29wQmxpbm5TaGFkZXJDYWNoZS5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9ncHUvTG9vcEJsaW5uU2hhZGVyQ2FjaGUuY3BwCShyZXZp
c2lvbiAwKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9ncHUvTG9vcEJsaW5uU2hhZGVy
Q2FjaGUuY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDE5MCBAQAorLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBD
T05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBV
UlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMg
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICog
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhF
T1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRl
ICJjb25maWcuaCIKKworI2luY2x1ZGUgIkxvb3BCbGlublNoYWRlckNhY2hlLmgiCisKKyNpbmNs
dWRlICJHcmFwaGljc0NvbnRleHQzRC5oIgorI2luY2x1ZGUgIkxvb3BCbGlublNoYWRlci5oIgor
I2luY2x1ZGUgIlN0cmluZ0J1aWxkZXIuaCIKKyNpbmNsdWRlIDx3dGYvQXNzZXJ0aW9ucy5oPgor
I2luY2x1ZGUgPHd0Zi90ZXh0L0NTdHJpbmcuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitu
YW1lc3BhY2UgeworCit1bnNpZ25lZCBjcmVhdGVTaGFkZXJGcm9tU291cmNlKEdyYXBoaWNzQ29u
dGV4dDNEKiBjb250ZXh0LCBHcmFwaGljc0NvbnRleHQzRDo6V2ViR0xFbnVtVHlwZSBzaGFkZXJU
eXBlLCBjb25zdCBTdHJpbmcmIHNvdXJjZSkKK3sKKyAgICB1bnNpZ25lZCBzaGFkZXIgPSBjb250
ZXh0LT5jcmVhdGVTaGFkZXIoc2hhZGVyVHlwZSk7CisgICAgY29udGV4dC0+c2hhZGVyU291cmNl
KHNoYWRlciwgc291cmNlKTsKKyAgICBjb250ZXh0LT5jb21waWxlU2hhZGVyKHNoYWRlcik7Cisg
ICAgaW50IGNvbXBpbGVTdGF0dXMgPSAwOworICAgIGNvbnRleHQtPmdldFNoYWRlcml2KHNoYWRl
ciwgR3JhcGhpY3NDb250ZXh0M0Q6OkNPTVBJTEVfU1RBVFVTLCAmY29tcGlsZVN0YXR1cyk7Cisg
ICAgaWYgKCFjb21waWxlU3RhdHVzKSB7CisjaWZuZGVmIE5ERUJVRworICAgICAgICBTdHJpbmcg
bG9nID0gY29udGV4dC0+Z2V0U2hhZGVySW5mb0xvZyhzaGFkZXIpOworICAgICAgICBMT0dfRVJS
T1IoIkVycm9yIGNvbXBpbGluZyBzaGFkZXI6ICVzIiwgbG9nLmFzY2lpKCkuZGF0YSgpKTsKKyAg
ICAgICAgTE9HX0VSUk9SKCJTb3VyY2U6Iik7CisgICAgICAgIExPR19FUlJPUigiJXMiLCBzb3Vy
Y2UuYXNjaWkoKS5kYXRhKCkpOworI2VuZGlmCisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAg
ICByZXR1cm4gc2hhZGVyOworfQorCit9IC8vIGFub255bW91cyBuYW1lc3BhY2UKKworTG9vcEJs
aW5uU2hhZGVyQ2FjaGU6Okxvb3BCbGlublNoYWRlckNhY2hlKEdyYXBoaWNzQ29udGV4dDNEKiBj
b250ZXh0KQorICAgIDogbV9jb250ZXh0KGNvbnRleHQpCit7CisgICAgbV9zaGFkZXJzLnJlc2l6
ZShOdW1TaGFkZXJUeXBlcyAqIE51bVJlZ2lvblR5cGVzICogTnVtQW50aWFsaWFzVHlwZXMpOwor
fQorCitzdHJ1Y3QgRmlsbENvZGUgeworICAgIGNvbnN0IGNoYXIqIHVuaWZvcm1zOworICAgIGNv
bnN0IGNoYXIqIHNvdXJjZTsKK307CisKKy8vIFNoYWRlciBjb2RlIGZvciB0aGUgdmFyaW91cyBm
aWxscywgaW5kZXhlZCBieSBTaGFkZXJUeXBlLgorc3RhdGljIGNvbnN0IEZpbGxDb2RlIGZpbGxD
b2RlW0xvb3BCbGlublNoYWRlckNhY2hlOjpOdW1TaGFkZXJUeXBlc10gPSB7CisgICAgeworICAg
ICAgICAvLyBTb2xpZCBmaWxsCisgICAgICAgICJ1bmlmb3JtIHZlYzQgY29sb3I7XG4iLAorICAg
ICAgICAiZ2xfRnJhZ0NvbG9yID0gY29sb3IgKiBhbHBoYTtcbiIKKyAgICB9Cit9OworCitMb29w
Qmxpbm5TaGFkZXIqIExvb3BCbGlublNoYWRlckNhY2hlOjpsb29rdXBTaGFkZXIoU2hhZGVyVHlw
ZSBzaGFkZXJUeXBlLCBSZWdpb25UeXBlIHJlZ2lvblR5cGUsIEFudGlhbGlhc1R5cGUgYW50aWFs
aWFzVHlwZSkKK3sKKyAgICBpbnQgc2hhZGVySW5kZXggPSBzdGF0aWNfY2FzdDxpbnQ+KHNoYWRl
clR5cGUpOworICAgIGludCBudW1TaGFkZXJzID0gc3RhdGljX2Nhc3Q8aW50PihOdW1TaGFkZXJU
eXBlcyk7CisgICAgaW50IHJlZ2lvbkluZGV4ID0gc3RhdGljX2Nhc3Q8aW50PihyZWdpb25UeXBl
KTsKKyAgICBpbnQgbnVtUmVnaW9ucyA9IHN0YXRpY19jYXN0PGludD4oTnVtUmVnaW9uVHlwZXMp
OworICAgIGludCBhbnRpYWxpYXNJbmRleCA9IHN0YXRpY19jYXN0PGludD4oYW50aWFsaWFzVHlw
ZSk7CisgICAgaW50IG51bUFudGlhbGlhc2VzID0gc3RhdGljX2Nhc3Q8aW50PihOdW1BbnRpYWxp
YXNUeXBlcyk7CisKKyAgICBpbnQgaW5kZXggPSAoc2hhZGVySW5kZXggKiBudW1SZWdpb25zICog
bnVtQW50aWFsaWFzZXMgKworICAgICAgICAgICAgICAgICByZWdpb25JbmRleCAqIG51bUFudGlh
bGlhc2VzICsKKyAgICAgICAgICAgICAgICAgYW50aWFsaWFzSW5kZXgpOworICAgIGlmICghbV9z
aGFkZXJzW2luZGV4XSkKKyAgICAgICAgbV9zaGFkZXJzW2luZGV4XSA9IGNyZWF0ZVNoYWRlcihz
aGFkZXJUeXBlLCByZWdpb25UeXBlLCBhbnRpYWxpYXNUeXBlKTsKKyAgICByZXR1cm4gbV9zaGFk
ZXJzW2luZGV4XS5nZXQoKTsKK30KKworUGFzc093blB0cjxMb29wQmxpbm5TaGFkZXI+IExvb3BC
bGlublNoYWRlckNhY2hlOjpjcmVhdGVTaGFkZXIoU2hhZGVyVHlwZSBzaGFkZXJUeXBlLCBSZWdp
b25UeXBlIHJlZ2lvblR5cGUsIEFudGlhbGlhc1R5cGUgYW50aWFsaWFzVHlwZSkKK3sKKyAgICBj
b25zdCBGaWxsQ29kZSYgZmlsbCA9IGZpbGxDb2RlW3NoYWRlclR5cGVdOworCisgICAgU3RyaW5n
QnVpbGRlciB2ZXJ0ZXhTaGFkZXJTb3VyY2U7CisgICAgdmVydGV4U2hhZGVyU291cmNlLmFwcGVu
ZCgKKyAgICAgICAgIi8vIFZlcnRleCBzaGFkZXJcbiIKKyAgICAgICAgInVuaWZvcm0gbWF0NCB3
b3JsZFZpZXdQcm9qZWN0aW9uO1xuIgorICAgICAgICAiXG4iCisgICAgICAgICJhdHRyaWJ1dGUg
dmVjMiBwb3NpdGlvbjtcbiIpOworICAgIGlmIChyZWdpb25UeXBlID09IEV4dGVyaW9yKSB7Cisg
ICAgICAgIHZlcnRleFNoYWRlclNvdXJjZS5hcHBlbmQoCisgICAgICAgICAgICAiYXR0cmlidXRl
IHZlYzMgdGV4Q29vcmQwO1xuIgorICAgICAgICAgICAgIlxuIgorICAgICAgICAgICAgInZhcnlp
bmcgdmVjMyBrbG07XG4iKTsKKyAgICB9CisgICAgdmVydGV4U2hhZGVyU291cmNlLmFwcGVuZCgK
KyAgICAgICAgIlxuIgorICAgICAgICAidm9pZCBtYWluKCkge1xuIgorICAgICAgICAiICBnbF9Q
b3NpdGlvbiA9IHdvcmxkVmlld1Byb2plY3Rpb24gKiB2ZWM0KHBvc2l0aW9uLCAwLjAsIDEuMCk7
XG4iKTsKKyAgICBpZiAocmVnaW9uVHlwZSA9PSBFeHRlcmlvcikKKyAgICAgICAgdmVydGV4U2hh
ZGVyU291cmNlLmFwcGVuZCgiICBrbG0gPSB0ZXhDb29yZDA7XG4iKTsKKyAgICB2ZXJ0ZXhTaGFk
ZXJTb3VyY2UuYXBwZW5kKCJ9XG4iKTsKKworICAgIFN0cmluZ0J1aWxkZXIgZnJhZ21lbnRTaGFk
ZXJTb3VyY2U7CisgICAgLy8gRklYTUU6IGdldCByaWQgb2YgdGhlICNpZmRlZnMgb25jZSB0aGUg
c2hhZGVyIHZhbGlkYXRvciBhbmQKKyAgICAvLyBHcmFwaGljc0NvbnRleHQzRCBzdXBwb3J0IE9F
U19zdGFuZGFyZF9kZXJpdmF0aXZlcy4gVW50aWwgdGhlbgorICAgIC8vIHdlIG5lZWQgdG8gZGlz
YWJsZSBzaGFkZXIgdHJhbnNsYXRpb24gdG8gdGVzdCB0aGUgYW50aWFsaWFzZWQKKyAgICAvLyBw
YXRoLgorICAgIGZyYWdtZW50U2hhZGVyU291cmNlLmFwcGVuZCgKKyAgICAgICAgIiNpZmRlZiBH
TF9FU1xuIgorICAgICAgICAicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4iCisgICAgICAgICIj
ZW5kaWZcbiIpOworICAgIGlmIChyZWdpb25UeXBlID09IEV4dGVyaW9yKQorICAgICAgICBmcmFn
bWVudFNoYWRlclNvdXJjZS5hcHBlbmQoInZhcnlpbmcgdmVjMyBrbG07XG4iKTsKKyAgICBmcmFn
bWVudFNoYWRlclNvdXJjZS5hcHBlbmQoZmlsbC51bmlmb3Jtcyk7CisgICAgZnJhZ21lbnRTaGFk
ZXJTb3VyY2UuYXBwZW5kKCJ2b2lkIG1haW4oKSB7XG4iKTsKKyAgICBpZiAocmVnaW9uVHlwZSA9
PSBJbnRlcmlvcikKKyAgICAgICAgZnJhZ21lbnRTaGFkZXJTb3VyY2UuYXBwZW5kKCIgIGZsb2F0
IGFscGhhID0gMS4wO1xuIik7CisgICAgZWxzZSB7CisgICAgICAgIGlmIChhbnRpYWxpYXNUeXBl
ID09IEFudGlhbGlhc2VkKSB7CisgICAgICAgICAgICBmcmFnbWVudFNoYWRlclNvdXJjZS5hcHBl
bmQoCisgICAgICAgICAgICAgICAgIiAgLy8gR3JhZGllbnRzXG4iCisgICAgICAgICAgICAgICAg
IiAgdmVjMyBweCA9IGRGZHgoa2xtKTtcbiIKKyAgICAgICAgICAgICAgICAiICB2ZWMzIHB5ID0g
ZEZkeShrbG0pO1xuIgorICAgICAgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgICAgICAiICAv
LyBDaGFpbiBydWxlXG4iCisgICAgICAgICAgICAgICAgIiAgZmxvYXQgazIgPSBrbG0ueCAqIGts
bS54O1xuIgorICAgICAgICAgICAgICAgICIgIGZsb2F0IGMgPSBrMiAqIGtsbS54IC0ga2xtLnkg
KiBrbG0uejtcbiIKKyAgICAgICAgICAgICAgICAiICBmbG9hdCBrMjMgPSAzLjAgKiBrMjtcbiIK
KyAgICAgICAgICAgICAgICAiICBmbG9hdCBjeCA9IGsyMyAqIHB4LnggLSBrbG0ueiAqIHB4Lnkg
LSBrbG0ueSAqIHB4Lno7XG4iCisgICAgICAgICAgICAgICAgIiAgZmxvYXQgY3kgPSBrMjMgKiBw
eS54IC0ga2xtLnogKiBweS55IC0ga2xtLnkgKiBweS56O1xuIgorICAgICAgICAgICAgICAgICJc
biIKKyAgICAgICAgICAgICAgICAiICAvLyBTaWduZWQgZGlzdGFuY2VcbiIKKyAgICAgICAgICAg
ICAgICAiICBmbG9hdCBzZCA9IGMgLyBzcXJ0KGN4ICogY3ggKyBjeSAqIGN5KTtcbiIKKyAgICAg
ICAgICAgICAgICAiXG4iCisgICAgICAgICAgICAgICAgIiAgLy8gTGluZWFyIGFscGhhXG4iCisg
ICAgICAgICAgICAgICAgIiAgLy8gRklYTUU6IGZpZ3VyZSBvdXQgd2h5IHRoaXMgbmVlZHMgdG8g
YmVcbiIKKyAgICAgICAgICAgICAgICAiICAvLyBuZWdhdGVkIGNvbXBhcmVkIHRvIHRoZSBITFNM
IHZlcnNpb24sIGFuZCBhbHNvIHdoeVxuIgorICAgICAgICAgICAgICAgICIgIC8vIHdlIG5lZWQg
YW4gYWRqdXN0bWVudCBieSArMS4wIGZvciBpdCB0byBsb29rIGdvb2QuXG4iCisgICAgICAgICAg
ICAgICAgIiAgLy8gZmxvYXQgYWxwaGEgPSBjbGFtcCgwLjUgLSBzZCwgMC4wLCAxLjApO1xuIgor
ICAgICAgICAgICAgICAgICIgIGZsb2F0IGFscGhhID0gY2xhbXAoc2QgKyAwLjUsIDAuMCwgMS4w
KTtcbiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZnJhZ21lbnRTaGFkZXJTb3Vy
Y2UuYXBwZW5kKAorICAgICAgICAgICAgICAgICIgIGZsb2F0IHQgPSBrbG0ueCAqIGtsbS54ICog
a2xtLnggLSBrbG0ueSAqIGtsbS56O1xuIgorICAgICAgICAgICAgICAgICIgIGZsb2F0IGFscGhh
ID0gY2xhbXAoc2lnbih0KSwgMC4wLCAxLjApO1xuIik7CisgICAgICAgIH0KKyAgICB9CisgICAg
ZnJhZ21lbnRTaGFkZXJTb3VyY2UuYXBwZW5kKGZpbGwuc291cmNlKTsKKyAgICBmcmFnbWVudFNo
YWRlclNvdXJjZS5hcHBlbmQoIn1cbiIpOworICAgIHVuc2lnbmVkIHZlcnRleFNoYWRlciA9IGNy
ZWF0ZVNoYWRlckZyb21Tb3VyY2UobV9jb250ZXh0LCBHcmFwaGljc0NvbnRleHQzRDo6VkVSVEVY
X1NIQURFUiwgdmVydGV4U2hhZGVyU291cmNlLnRvU3RyaW5nKCkpOworICAgIHVuc2lnbmVkIGZy
YWdtZW50U2hhZGVyID0gY3JlYXRlU2hhZGVyRnJvbVNvdXJjZShtX2NvbnRleHQsIEdyYXBoaWNz
Q29udGV4dDNEOjpGUkFHTUVOVF9TSEFERVIsIGZyYWdtZW50U2hhZGVyU291cmNlLnRvU3RyaW5n
KCkpOworICAgIGlmICghdmVydGV4U2hhZGVyIHx8ICFmcmFnbWVudFNoYWRlcikKKyAgICAgICAg
cmV0dXJuIDA7CisgICAgdW5zaWduZWQgcHJvZ3JhbSA9IG1fY29udGV4dC0+Y3JlYXRlUHJvZ3Jh
bSgpOworICAgIG1fY29udGV4dC0+YXR0YWNoU2hhZGVyKHByb2dyYW0sIHZlcnRleFNoYWRlcik7
CisgICAgbV9jb250ZXh0LT5hdHRhY2hTaGFkZXIocHJvZ3JhbSwgZnJhZ21lbnRTaGFkZXIpOwor
ICAgIG1fY29udGV4dC0+bGlua1Byb2dyYW0ocHJvZ3JhbSk7CisgICAgaW50IGxpbmtTdGF0dXMg
PSAwOworICAgIG1fY29udGV4dC0+Z2V0UHJvZ3JhbWl2KHByb2dyYW0sIEdyYXBoaWNzQ29udGV4
dDNEOjpMSU5LX1NUQVRVUywgJmxpbmtTdGF0dXMpOworICAgIGlmICghbGlua1N0YXR1cykgewor
I2lmbmRlZiBOREVCVUcKKyAgICAgICAgU3RyaW5nIGxvZyA9IG1fY29udGV4dC0+Z2V0UHJvZ3Jh
bUluZm9Mb2cocHJvZ3JhbSk7CisgICAgICAgIExPR19FUlJPUigiRXJyb3IgbGlua2luZyBwcm9n
cmFtOiAlcyIsIGxvZy5hc2NpaSgpLmRhdGEoKSk7CisjZW5kaWYKKyAgICAgICAgcmV0dXJuIDA7
CisgICAgfQorICAgIG1fY29udGV4dC0+ZGVsZXRlU2hhZGVyKHZlcnRleFNoYWRlcik7CisgICAg
bV9jb250ZXh0LT5kZWxldGVTaGFkZXIoZnJhZ21lbnRTaGFkZXIpOworICAgIHJldHVybiBhZG9w
dFB0cihuZXcgTG9vcEJsaW5uU2hhZGVyKG1fY29udGV4dCwgcHJvZ3JhbSkpOworfQorCit9IC8v
IG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2dwdS9M
b29wQmxpbm5TaGFkZXJDYWNoZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvZ3B1L0xvb3BCbGlublNoYWRlckNhY2hlLmgJKHJldmlzaW9uIDApCisrKyBXZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL2dwdS9Mb29wQmxpbm5TaGFkZXJDYWNoZS5oCShyZXZpc2lvbiAw
KQpAQCAtMCwwICsxLDc3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAq
IGFyZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZU
V0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFO
RCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlN
RUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Cisg
KiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBMb29wQmxpbm5TaGFkZXJDYWNoZV9o
CisjZGVmaW5lIExvb3BCbGlublNoYWRlckNhY2hlX2gKKworI2luY2x1ZGUgIkxvb3BCbGlublNo
YWRlci5oIgorI2luY2x1ZGUgPHd0Zi9Ob25jb3B5YWJsZS5oPgorI2luY2x1ZGUgPHd0Zi9Pd25B
cnJheVB0ci5oPgorI2luY2x1ZGUgPHd0Zi9QYXNzT3duUHRyLmg+CisKK25hbWVzcGFjZSBXZWJD
b3JlIHsKKworY2xhc3MgR3JhcGhpY3NDb250ZXh0M0Q7CisKKy8vIFRoZSBMb29wQmxpbm5TaGFk
ZXJDYWNoZSBsYXppbHkgZ2VuZXJhdGVzLCBsb2FkcyBhbmQgY2FjaGVzIHRoZSBzaGFkZXJzCisv
LyBuZWVkZWQgdG8gZmlsbCB0aGUgdHJpYW5nbGUgbWVzaGVzIGdlbmVyYXRlZCBieSBMb29wIGFu
ZCBCbGlubidzCisvLyBhbGdvcml0aG0uCisKK2NsYXNzIExvb3BCbGlublNoYWRlckNhY2hlIDog
cHVibGljIE5vbmNvcHlhYmxlIHsKK3B1YmxpYzoKKyAgICBMb29wQmxpbm5TaGFkZXJDYWNoZShH
cmFwaGljc0NvbnRleHQzRCopOworCisgICAgZW51bSBTaGFkZXJUeXBlIHsKKyAgICAgICAgU29s
aWRGaWxsLAorICAgICAgICAvLyBGSVhNRTogYWRkIG1vcmUgdHlwZXMgb2Ygc2hhZGVycyAoZ3Jh
ZGllbnRzLCBwYXR0ZXJucywgZXRjLikKKyAgICAgICAgTnVtU2hhZGVyVHlwZXMgLy8gTXVzdCBi
ZSBsYXN0CisgICAgfTsKKworICAgIGVudW0gUmVnaW9uVHlwZSB7CisgICAgICAgIEV4dGVyaW9y
LCAvLyBMb29wIGFuZCBCbGlubidzIHNoYWRlcgorICAgICAgICBJbnRlcmlvciwgLy8gU29saWQg
ZmlsbGVkIHJlZ2lvbgorICAgICAgICBOdW1SZWdpb25UeXBlcyAvLyBNdXN0IGJlIGxhc3QKKyAg
ICB9OworCisgICAgLy8gVGhpcyBvbmx5IGFmZmVjdHMgdGhlIGV4dGVyaW9yIHNoYWRlci4KKyAg
ICBlbnVtIEFudGlhbGlhc1R5cGUgeworICAgICAgICBBbnRpYWxpYXNlZCwKKyAgICAgICAgTm90
QW50aWFsaWFzZWQsCisgICAgICAgIE51bUFudGlhbGlhc1R5cGVzIC8vIE11c3QgYmUgbGFzdAor
ICAgIH07CisKKyAgICAvLyBUaGUgTG9vcEJsaW5uU2hhZGVyQ2FjaGUgb3ducyB0aGUgcmV0dXJu
ZWQgcG9pbnRlci4KKyAgICBMb29wQmxpbm5TaGFkZXIqIGxvb2t1cFNoYWRlcihTaGFkZXJUeXBl
LCBSZWdpb25UeXBlLCBBbnRpYWxpYXNUeXBlKTsKKworcHJpdmF0ZToKKyAgICBQYXNzT3duUHRy
PExvb3BCbGlublNoYWRlcj4gY3JlYXRlU2hhZGVyKFNoYWRlclR5cGUsIFJlZ2lvblR5cGUsIEFu
dGlhbGlhc1R5cGUpOworCisgICAgR3JhcGhpY3NDb250ZXh0M0QqIG1fY29udGV4dDsKKyAgICBW
ZWN0b3I8T3duUHRyPExvb3BCbGlublNoYWRlcj4gPiBtX3NoYWRlcnM7Cit9OworCit9IC8vIG5h
bWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBMb29wQmxpbm5TaGFkZXJDYWNoZV9oCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>67468</attachid>
            <date>2010-09-13 14:07:14 -0700</date>
            <delta_ts>2011-02-04 19:08:19 -0800</delta_ts>
            <desc>Revised patch</desc>
            <filename>shader-cache.patch</filename>
            <type>text/plain</type>
            <size>17363</size>
            <attacher name="Kenneth Russell">kbr</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2NzQwNykKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMjggQEAKKzIwMTAtMDktMTMgIEtlbm5ldGggUnVzc2VsbCAgPGtickBnb29nbGUu
Y29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIEFk
ZCBzaGFkZXIgZ2VuZXJhdG9yIGFuZCBjYWNoZSBmb3IgR1BVIGFjY2VsZXJhdGVkIHBhdGggcmVu
ZGVyaW5nCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD00
NTUyMAorCisgICAgICAgIEFkZGluZyBnZW5lcmF0b3IgYW5kIGNhY2hlIG9mIHRoZSBzaGFkZXJz
IGZvciB0aGUgR1BVIGFjY2VsZXJhdGVkCisgICAgICAgIHBhdGggcmVuZGVyaW5nIGFsZ29yaXRo
bSBmcm9tIEdQVSBHZW1zIDMuIE5vIHRlc3RzIHlldDsgd2lsbCBiZQorICAgICAgICB0ZXN0ZWQg
aW4gY29uanVuY3Rpb24gd2l0aCBsYXRlciBjb2RlLgorCisgICAgICAgICogcGxhdGZvcm0vZ3Jh
cGhpY3MvZ3B1L0xvb3BCbGlublNoYWRlci5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6
TG9vcEJsaW5uU2hhZGVyOjpMb29wQmxpbm5TaGFkZXIpOgorICAgICAgICAoV2ViQ29yZTo6TG9v
cEJsaW5uU2hhZGVyOjp+TG9vcEJsaW5uU2hhZGVyKToKKyAgICAgICAgKFdlYkNvcmU6Okxvb3BC
bGlublNoYWRlcjo6dXNlKToKKyAgICAgICAgKFdlYkNvcmU6Okxvb3BCbGlublNoYWRlcjo6Z2V0
VW5pZm9ybUxvY2F0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6Okxvb3BCbGlublNoYWRlcjo6Z2V0
QXR0cmliTG9jYXRpb24pOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2dwdS9Mb29wQmxp
bm5TaGFkZXIuaDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvZ3B1L0xvb3BC
bGlublNoYWRlckNhY2hlLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpMb29wQmxpbm5T
aGFkZXJDYWNoZTo6TG9vcEJsaW5uU2hhZGVyQ2FjaGUpOgorICAgICAgICAoV2ViQ29yZTo6TG9v
cEJsaW5uU2hhZGVyQ2FjaGU6On5Mb29wQmxpbm5TaGFkZXJDYWNoZSk6CisgICAgICAgIChXZWJD
b3JlOjpMb29wQmxpbm5TaGFkZXJDYWNoZTo6bG9va3VwU2hhZGVyKToKKyAgICAgICAgKFdlYkNv
cmU6Okxvb3BCbGlublNoYWRlckNhY2hlOjpjcmVhdGVTaGFkZXIpOgorICAgICAgICAqIHBsYXRm
b3JtL2dyYXBoaWNzL2dwdS9Mb29wQmxpbm5TaGFkZXJDYWNoZS5oOiBBZGRlZC4KKwogMjAxMC0w
OS0xMyAgQ2hyaXMgRmxlaXphY2ggIDxjZmxlaXphY2hAYXBwbGUuY29tPgogCiAgICAgICAgIFJl
dmlld2VkIGJ5IERhcmluIEFkbGVyLgpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9n
cHUvTG9vcEJsaW5uU2hhZGVyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL2dwdS9Mb29wQmxpbm5TaGFkZXIuY3BwCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9ncHUvTG9vcEJsaW5uU2hhZGVyLmNwcAkocmV2aXNpb24gMCkKQEAg
LTAsMCArMSw2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5Z
CisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9T
UyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9G
CisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgIkxv
b3BCbGlublNoYWRlci5oIgorCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0M0QuaCIKKworbmFt
ZXNwYWNlIFdlYkNvcmUgeworCitMb29wQmxpbm5TaGFkZXI6Okxvb3BCbGlublNoYWRlcihHcmFw
aGljc0NvbnRleHQzRCogY29udGV4dCwgdW5zaWduZWQgcHJvZ3JhbSkKKyAgICA6IG1fY29udGV4
dChjb250ZXh0KQorICAgICwgbV9wcm9ncmFtKHByb2dyYW0pCit7Cit9CisKK0xvb3BCbGlublNo
YWRlcjo6fkxvb3BCbGlublNoYWRlcigpCit7Cit9CisKK3ZvaWQgTG9vcEJsaW5uU2hhZGVyOjp1
c2UoKQoreworICAgIG1fY29udGV4dC0+dXNlUHJvZ3JhbShtX3Byb2dyYW0pOworfQorCitsb25n
IExvb3BCbGlublNoYWRlcjo6Z2V0VW5pZm9ybUxvY2F0aW9uKGNvbnN0IFN0cmluZyYgbmFtZSkK
K3sKKyAgICBIYXNoTWFwPFN0cmluZywgbG9uZz46Oml0ZXJhdG9yIGl0ZXIgPSBtX3VuaWZvcm1M
b2NhdGlvbnMuZmluZChuYW1lKTsKKyAgICBpZiAoaXRlciAhPSBtX3VuaWZvcm1Mb2NhdGlvbnMu
ZW5kKCkpCisgICAgICAgIHJldHVybiBpdGVyLT5zZWNvbmQ7CisgICAgbG9uZyBsb2NhdGlvbiA9
IG1fY29udGV4dC0+Z2V0VW5pZm9ybUxvY2F0aW9uKG1fcHJvZ3JhbSwgbmFtZSk7CisgICAgbV91
bmlmb3JtTG9jYXRpb25zLmFkZChuYW1lLCBsb2NhdGlvbik7CisgICAgcmV0dXJuIGxvY2F0aW9u
OworfQorCitsb25nIExvb3BCbGlublNoYWRlcjo6Z2V0QXR0cmliTG9jYXRpb24oY29uc3QgU3Ry
aW5nJiBuYW1lKQoreworICAgIEhhc2hNYXA8U3RyaW5nLCBsb25nPjo6aXRlcmF0b3IgaXRlciA9
IG1fYXR0cmliTG9jYXRpb25zLmZpbmQobmFtZSk7CisgICAgaWYgKGl0ZXIgIT0gbV9hdHRyaWJM
b2NhdGlvbnMuZW5kKCkpCisgICAgICAgIHJldHVybiBpdGVyLT5zZWNvbmQ7CisgICAgbG9uZyBs
b2NhdGlvbiA9IG1fY29udGV4dC0+Z2V0QXR0cmliTG9jYXRpb24obV9wcm9ncmFtLCBuYW1lKTsK
KyAgICBtX2F0dHJpYkxvY2F0aW9ucy5hZGQobmFtZSwgbG9jYXRpb24pOworICAgIHJldHVybiBs
b2NhdGlvbjsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9ncHUvTG9vcEJsaW5uU2hhZGVyLmgKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9ncHUvTG9vcEJsaW5uU2hhZGVyLmgJKHJldmlzaW9uIDApCisr
KyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2dwdS9Mb29wQmxpbm5TaGFkZXIuaAkocmV2aXNp
b24gMCkKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElT
IiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVND
TEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJ
QUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBF
WEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQ
VElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgTG9vcEJsaW5uU2hhZGVyX2gK
KyNkZWZpbmUgTG9vcEJsaW5uU2hhZGVyX2gKKworI2luY2x1ZGUgPHd0Zi9IYXNoTWFwLmg+Cisj
aW5jbHVkZSA8d3RmL05vbmNvcHlhYmxlLmg+CisjaW5jbHVkZSA8d3RmL3RleHQvU3RyaW5nSGFz
aC5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L1dURlN0cmluZy5oPgorCituYW1lc3BhY2UgV2ViQ29y
ZSB7CisKK2NsYXNzIEdyYXBoaWNzQ29udGV4dDNEOworCisvLyBDb252ZW5pZW5jZSBjbGFzcyB3
cmFwcGluZyB0aGUgZ2VuZXJhdGVkIHNoYWRlcnMgZm9yIHRoZQorLy8gR1BVLWFjY2VsZXJhdGVk
IHBhdGggcmVuZGVyaW5nIGFsZ29yaXRobS4KKy8vCisvLyBGSVhNRTogdGhpcyBjbGFzcyBuZWVk
cyB0byBiZSBtZXJnZWQgd2l0aCB0aGUgc2hhZGVyIGNsYXNzZXMgZm9yCisvLyB0aGUgZmlsbHMg
Zm9yIHJlY3RhbmdsZXMsIGV0Yy4KK2NsYXNzIExvb3BCbGlublNoYWRlciA6IHB1YmxpYyBOb25j
b3B5YWJsZSB7CitwdWJsaWM6CisgICAgTG9vcEJsaW5uU2hhZGVyKEdyYXBoaWNzQ29udGV4dDNE
KiwgdW5zaWduZWQgcHJvZ3JhbSk7CisgICAgfkxvb3BCbGlublNoYWRlcigpOworCisgICAgdm9p
ZCB1c2UoKTsKKyAgICBsb25nIGdldFVuaWZvcm1Mb2NhdGlvbihjb25zdCBTdHJpbmcmIG5hbWUp
OworICAgIGxvbmcgZ2V0QXR0cmliTG9jYXRpb24oY29uc3QgU3RyaW5nJiBuYW1lKTsKKworcHJp
dmF0ZToKKyAgICBHcmFwaGljc0NvbnRleHQzRCogbV9jb250ZXh0OworICAgIHVuc2lnbmVkIG1f
cHJvZ3JhbTsKKyAgICBIYXNoTWFwPFN0cmluZywgbG9uZz4gbV91bmlmb3JtTG9jYXRpb25zOwor
ICAgIEhhc2hNYXA8U3RyaW5nLCBsb25nPiBtX2F0dHJpYkxvY2F0aW9uczsKK307CisKK30gLy8g
bmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIExvb3BCbGlublNoYWRlcl9oCkluZGV4OiBX
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2dwdS9Mb29wQmxpbm5TaGFkZXJDYWNoZS5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9ncHUvTG9vcEJsaW5uU2hhZGVy
Q2FjaGUuY3BwCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9ncHUv
TG9vcEJsaW5uU2hhZGVyQ2FjaGUuY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDE4NCBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEu
ICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJ
TVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ
QUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEs
IE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
CisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgor
ICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgIkxvb3BCbGlublNoYWRlckNh
Y2hlLmgiCisKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQzRC5oIgorI2luY2x1ZGUgIkxvb3BC
bGlublNoYWRlci5oIgorI2luY2x1ZGUgIlN0cmluZ0J1aWxkZXIuaCIKKyNpbmNsdWRlIDx3dGYv
QXNzZXJ0aW9ucy5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L0NTdHJpbmcuaD4KKworbmFtZXNwYWNl
IFdlYkNvcmUgeworCituYW1lc3BhY2UgeworCit1bnNpZ25lZCBjcmVhdGVTaGFkZXJGcm9tU291
cmNlKEdyYXBoaWNzQ29udGV4dDNEKiBjb250ZXh0LCBHcmFwaGljc0NvbnRleHQzRDo6V2ViR0xF
bnVtVHlwZSBzaGFkZXJUeXBlLCBjb25zdCBTdHJpbmcmIHNvdXJjZSkKK3sKKyAgICB1bnNpZ25l
ZCBzaGFkZXIgPSBjb250ZXh0LT5jcmVhdGVTaGFkZXIoc2hhZGVyVHlwZSk7CisgICAgY29udGV4
dC0+c2hhZGVyU291cmNlKHNoYWRlciwgc291cmNlKTsKKyAgICBjb250ZXh0LT5jb21waWxlU2hh
ZGVyKHNoYWRlcik7CisgICAgaW50IGNvbXBpbGVTdGF0dXMgPSAwOworICAgIGNvbnRleHQtPmdl
dFNoYWRlcml2KHNoYWRlciwgR3JhcGhpY3NDb250ZXh0M0Q6OkNPTVBJTEVfU1RBVFVTLCAmY29t
cGlsZVN0YXR1cyk7CisgICAgaWYgKCFjb21waWxlU3RhdHVzKSB7CisjaWZuZGVmIE5ERUJVRwor
ICAgICAgICBTdHJpbmcgbG9nID0gY29udGV4dC0+Z2V0U2hhZGVySW5mb0xvZyhzaGFkZXIpOwor
ICAgICAgICBMT0dfRVJST1IoIkVycm9yIGNvbXBpbGluZyBzaGFkZXI6ICVzIiwgbG9nLmFzY2lp
KCkuZGF0YSgpKTsKKyAgICAgICAgTE9HX0VSUk9SKCJTb3VyY2U6Iik7CisgICAgICAgIExPR19F
UlJPUigiJXMiLCBzb3VyY2UuYXNjaWkoKS5kYXRhKCkpOworI2VuZGlmCisgICAgICAgIHJldHVy
biAwOworICAgIH0KKyAgICByZXR1cm4gc2hhZGVyOworfQorCit9IC8vIGFub255bW91cyBuYW1l
c3BhY2UKKworTG9vcEJsaW5uU2hhZGVyQ2FjaGU6Okxvb3BCbGlublNoYWRlckNhY2hlKEdyYXBo
aWNzQ29udGV4dDNEKiBjb250ZXh0KQorICAgIDogbV9jb250ZXh0KGNvbnRleHQpCit7Cit9CisK
K0xvb3BCbGlublNoYWRlckNhY2hlOjp+TG9vcEJsaW5uU2hhZGVyQ2FjaGUoKQoreworfQorCitz
dHJ1Y3QgRmlsbENvZGUgeworICAgIGNvbnN0IGNoYXIqIHVuaWZvcm1zOworICAgIGNvbnN0IGNo
YXIqIHNvdXJjZTsKK307CisKKy8vIFNoYWRlciBjb2RlIGZvciB0aGUgdmFyaW91cyBmaWxscywg
aW5kZXhlZCBieSBTaGFkZXJUeXBlLgorc3RhdGljIGNvbnN0IEZpbGxDb2RlIGZpbGxDb2RlW0xv
b3BCbGlublNoYWRlckNhY2hlOjpOdW1TaGFkZXJUeXBlc10gPSB7CisgICAgeworICAgICAgICAv
LyBTb2xpZCBmaWxsCisgICAgICAgICJ1bmlmb3JtIHZlYzQgY29sb3I7XG4iLAorICAgICAgICAi
Z2xfRnJhZ0NvbG9yID0gY29sb3IgKiBhbHBoYTtcbiIKKyAgICB9Cit9OworCitMb29wQmxpbm5T
aGFkZXIqIExvb3BCbGlublNoYWRlckNhY2hlOjpsb29rdXBTaGFkZXIoU2hhZGVyVHlwZSBzaGFk
ZXJUeXBlLCBSZWdpb25UeXBlIHJlZ2lvblR5cGUsIEFudGlhbGlhc1R5cGUgYW50aWFsaWFzVHlw
ZSkKK3sKKyAgICBPd25QdHI8TG9vcEJsaW5uU2hhZGVyPiYgc2hhZGVyID0gbV9zaGFkZXJzW3No
YWRlclR5cGVdW3JlZ2lvblR5cGVdW2FudGlhbGlhc1R5cGVdOworICAgIGlmICghc2hhZGVyKQor
ICAgICAgICBzaGFkZXIgPSBjcmVhdGVTaGFkZXIoc2hhZGVyVHlwZSwgcmVnaW9uVHlwZSwgYW50
aWFsaWFzVHlwZSk7CisgICAgcmV0dXJuIHNoYWRlci5nZXQoKTsKK30KKworUGFzc093blB0cjxM
b29wQmxpbm5TaGFkZXI+IExvb3BCbGlublNoYWRlckNhY2hlOjpjcmVhdGVTaGFkZXIoU2hhZGVy
VHlwZSBzaGFkZXJUeXBlLCBSZWdpb25UeXBlIHJlZ2lvblR5cGUsIEFudGlhbGlhc1R5cGUgYW50
aWFsaWFzVHlwZSkKK3sKKyAgICBjb25zdCBGaWxsQ29kZSYgZmlsbCA9IGZpbGxDb2RlW3NoYWRl
clR5cGVdOworCisgICAgU3RyaW5nQnVpbGRlciB2ZXJ0ZXhTaGFkZXJTb3VyY2U7CisgICAgdmVy
dGV4U2hhZGVyU291cmNlLmFwcGVuZCgKKyAgICAgICAgIi8vIFZlcnRleCBzaGFkZXJcbiIKKyAg
ICAgICAgInVuaWZvcm0gbWF0NCB3b3JsZFZpZXdQcm9qZWN0aW9uO1xuIgorICAgICAgICAiXG4i
CisgICAgICAgICJhdHRyaWJ1dGUgdmVjMiBwb3NpdGlvbjtcbiIpOworICAgIGlmIChyZWdpb25U
eXBlID09IEV4dGVyaW9yKSB7CisgICAgICAgIHZlcnRleFNoYWRlclNvdXJjZS5hcHBlbmQoCisg
ICAgICAgICAgICAiYXR0cmlidXRlIHZlYzMgdGV4Q29vcmQwO1xuIgorICAgICAgICAgICAgIlxu
IgorICAgICAgICAgICAgInZhcnlpbmcgdmVjMyBrbG07XG4iKTsKKyAgICB9CisgICAgdmVydGV4
U2hhZGVyU291cmNlLmFwcGVuZCgKKyAgICAgICAgIlxuIgorICAgICAgICAidm9pZCBtYWluKCkg
e1xuIgorICAgICAgICAiICBnbF9Qb3NpdGlvbiA9IHdvcmxkVmlld1Byb2plY3Rpb24gKiB2ZWM0
KHBvc2l0aW9uLCAwLjAsIDEuMCk7XG4iKTsKKyAgICBpZiAocmVnaW9uVHlwZSA9PSBFeHRlcmlv
cikKKyAgICAgICAgdmVydGV4U2hhZGVyU291cmNlLmFwcGVuZCgiICBrbG0gPSB0ZXhDb29yZDA7
XG4iKTsKKyAgICB2ZXJ0ZXhTaGFkZXJTb3VyY2UuYXBwZW5kKCJ9XG4iKTsKKworICAgIFN0cmlu
Z0J1aWxkZXIgZnJhZ21lbnRTaGFkZXJTb3VyY2U7CisgICAgLy8gRklYTUU6IGdldCByaWQgb2Yg
dGhlICNpZmRlZnMgb25jZSB0aGUgc2hhZGVyIHZhbGlkYXRvciBhbmQKKyAgICAvLyBHcmFwaGlj
c0NvbnRleHQzRCBzdXBwb3J0IE9FU19zdGFuZGFyZF9kZXJpdmF0aXZlcy4gVW50aWwgdGhlbgor
ICAgIC8vIHdlIG5lZWQgdG8gZGlzYWJsZSBzaGFkZXIgdHJhbnNsYXRpb24gdG8gdGVzdCB0aGUg
YW50aWFsaWFzZWQKKyAgICAvLyBwYXRoLgorICAgIGZyYWdtZW50U2hhZGVyU291cmNlLmFwcGVu
ZCgKKyAgICAgICAgIiNpZmRlZiBHTF9FU1xuIgorICAgICAgICAicHJlY2lzaW9uIG1lZGl1bXAg
ZmxvYXQ7XG4iCisgICAgICAgICIjZW5kaWZcbiIpOworICAgIGlmIChyZWdpb25UeXBlID09IEV4
dGVyaW9yKQorICAgICAgICBmcmFnbWVudFNoYWRlclNvdXJjZS5hcHBlbmQoInZhcnlpbmcgdmVj
MyBrbG07XG4iKTsKKyAgICBmcmFnbWVudFNoYWRlclNvdXJjZS5hcHBlbmQoZmlsbC51bmlmb3Jt
cyk7CisgICAgZnJhZ21lbnRTaGFkZXJTb3VyY2UuYXBwZW5kKCJ2b2lkIG1haW4oKSB7XG4iKTsK
KyAgICBpZiAocmVnaW9uVHlwZSA9PSBJbnRlcmlvcikKKyAgICAgICAgZnJhZ21lbnRTaGFkZXJT
b3VyY2UuYXBwZW5kKCIgIGZsb2F0IGFscGhhID0gMS4wO1xuIik7CisgICAgZWxzZSB7CisgICAg
ICAgIGlmIChhbnRpYWxpYXNUeXBlID09IEFudGlhbGlhc2VkKSB7CisgICAgICAgICAgICBmcmFn
bWVudFNoYWRlclNvdXJjZS5hcHBlbmQoCisgICAgICAgICAgICAgICAgIiAgLy8gR3JhZGllbnRz
XG4iCisgICAgICAgICAgICAgICAgIiAgdmVjMyBweCA9IGRGZHgoa2xtKTtcbiIKKyAgICAgICAg
ICAgICAgICAiICB2ZWMzIHB5ID0gZEZkeShrbG0pO1xuIgorICAgICAgICAgICAgICAgICJcbiIK
KyAgICAgICAgICAgICAgICAiICAvLyBDaGFpbiBydWxlXG4iCisgICAgICAgICAgICAgICAgIiAg
ZmxvYXQgazIgPSBrbG0ueCAqIGtsbS54O1xuIgorICAgICAgICAgICAgICAgICIgIGZsb2F0IGMg
PSBrMiAqIGtsbS54IC0ga2xtLnkgKiBrbG0uejtcbiIKKyAgICAgICAgICAgICAgICAiICBmbG9h
dCBrMjMgPSAzLjAgKiBrMjtcbiIKKyAgICAgICAgICAgICAgICAiICBmbG9hdCBjeCA9IGsyMyAq
IHB4LnggLSBrbG0ueiAqIHB4LnkgLSBrbG0ueSAqIHB4Lno7XG4iCisgICAgICAgICAgICAgICAg
IiAgZmxvYXQgY3kgPSBrMjMgKiBweS54IC0ga2xtLnogKiBweS55IC0ga2xtLnkgKiBweS56O1xu
IgorICAgICAgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgICAgICAiICAvLyBTaWduZWQgZGlz
dGFuY2VcbiIKKyAgICAgICAgICAgICAgICAiICBmbG9hdCBzZCA9IGMgLyBzcXJ0KGN4ICogY3gg
KyBjeSAqIGN5KTtcbiIKKyAgICAgICAgICAgICAgICAiXG4iCisgICAgICAgICAgICAgICAgIiAg
Ly8gTGluZWFyIGFscGhhXG4iCisgICAgICAgICAgICAgICAgIiAgLy8gRklYTUU6IGZpZ3VyZSBv
dXQgd2h5IHRoaXMgbmVlZHMgdG8gYmVcbiIKKyAgICAgICAgICAgICAgICAiICAvLyBuZWdhdGVk
IGNvbXBhcmVkIHRvIHRoZSBITFNMIHZlcnNpb24sIGFuZCBhbHNvIHdoeVxuIgorICAgICAgICAg
ICAgICAgICIgIC8vIHdlIG5lZWQgYW4gYWRqdXN0bWVudCBieSArMS4wIGZvciBpdCB0byBsb29r
IGdvb2QuXG4iCisgICAgICAgICAgICAgICAgIiAgLy8gZmxvYXQgYWxwaGEgPSBjbGFtcCgwLjUg
LSBzZCwgMC4wLCAxLjApO1xuIgorICAgICAgICAgICAgICAgICIgIGZsb2F0IGFscGhhID0gY2xh
bXAoc2QgKyAwLjUsIDAuMCwgMS4wKTtcbiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAg
ICAgZnJhZ21lbnRTaGFkZXJTb3VyY2UuYXBwZW5kKAorICAgICAgICAgICAgICAgICIgIGZsb2F0
IHQgPSBrbG0ueCAqIGtsbS54ICoga2xtLnggLSBrbG0ueSAqIGtsbS56O1xuIgorICAgICAgICAg
ICAgICAgICIgIGZsb2F0IGFscGhhID0gY2xhbXAoc2lnbih0KSwgMC4wLCAxLjApO1xuIik7Cisg
ICAgICAgIH0KKyAgICB9CisgICAgZnJhZ21lbnRTaGFkZXJTb3VyY2UuYXBwZW5kKGZpbGwuc291
cmNlKTsKKyAgICBmcmFnbWVudFNoYWRlclNvdXJjZS5hcHBlbmQoIn1cbiIpOworICAgIHVuc2ln
bmVkIHZlcnRleFNoYWRlciA9IGNyZWF0ZVNoYWRlckZyb21Tb3VyY2UobV9jb250ZXh0LCBHcmFw
aGljc0NvbnRleHQzRDo6VkVSVEVYX1NIQURFUiwgdmVydGV4U2hhZGVyU291cmNlLnRvU3RyaW5n
KCkpOworICAgIHVuc2lnbmVkIGZyYWdtZW50U2hhZGVyID0gY3JlYXRlU2hhZGVyRnJvbVNvdXJj
ZShtX2NvbnRleHQsIEdyYXBoaWNzQ29udGV4dDNEOjpGUkFHTUVOVF9TSEFERVIsIGZyYWdtZW50
U2hhZGVyU291cmNlLnRvU3RyaW5nKCkpOworICAgIGlmICghdmVydGV4U2hhZGVyIHx8ICFmcmFn
bWVudFNoYWRlcikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgdW5zaWduZWQgcHJvZ3JhbSA9IG1f
Y29udGV4dC0+Y3JlYXRlUHJvZ3JhbSgpOworICAgIG1fY29udGV4dC0+YXR0YWNoU2hhZGVyKHBy
b2dyYW0sIHZlcnRleFNoYWRlcik7CisgICAgbV9jb250ZXh0LT5hdHRhY2hTaGFkZXIocHJvZ3Jh
bSwgZnJhZ21lbnRTaGFkZXIpOworICAgIG1fY29udGV4dC0+bGlua1Byb2dyYW0ocHJvZ3JhbSk7
CisgICAgaW50IGxpbmtTdGF0dXMgPSAwOworICAgIG1fY29udGV4dC0+Z2V0UHJvZ3JhbWl2KHBy
b2dyYW0sIEdyYXBoaWNzQ29udGV4dDNEOjpMSU5LX1NUQVRVUywgJmxpbmtTdGF0dXMpOworICAg
IGlmICghbGlua1N0YXR1cykgeworI2lmbmRlZiBOREVCVUcKKyAgICAgICAgU3RyaW5nIGxvZyA9
IG1fY29udGV4dC0+Z2V0UHJvZ3JhbUluZm9Mb2cocHJvZ3JhbSk7CisgICAgICAgIExPR19FUlJP
UigiRXJyb3IgbGlua2luZyBwcm9ncmFtOiAlcyIsIGxvZy5hc2NpaSgpLmRhdGEoKSk7CisjZW5k
aWYKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIG1fY29udGV4dC0+ZGVsZXRlU2hhZGVy
KHZlcnRleFNoYWRlcik7CisgICAgbV9jb250ZXh0LT5kZWxldGVTaGFkZXIoZnJhZ21lbnRTaGFk
ZXIpOworICAgIHJldHVybiBhZG9wdFB0cihuZXcgTG9vcEJsaW5uU2hhZGVyKG1fY29udGV4dCwg
cHJvZ3JhbSkpOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBXZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL2dwdS9Mb29wQmxpbm5TaGFkZXJDYWNoZS5oCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZ3B1L0xvb3BCbGlublNoYWRlckNhY2hlLmgJKHJl
dmlzaW9uIDApCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2dwdS9Mb29wQmxpbm5TaGFk
ZXJDYWNoZS5oCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDc4IEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRp
b24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENP
TlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVS
UE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVP
UlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBM
b29wQmxpbm5TaGFkZXJDYWNoZV9oCisjZGVmaW5lIExvb3BCbGlublNoYWRlckNhY2hlX2gKKwor
I2luY2x1ZGUgIkxvb3BCbGlublNoYWRlci5oIgorI2luY2x1ZGUgPHd0Zi9Ob25jb3B5YWJsZS5o
PgorI2luY2x1ZGUgPHd0Zi9Pd25QdHIuaD4KKyNpbmNsdWRlIDx3dGYvUGFzc093blB0ci5oPgor
CituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIEdyYXBoaWNzQ29udGV4dDNEOworCisvLyBU
aGUgTG9vcEJsaW5uU2hhZGVyQ2FjaGUgbGF6aWx5IGdlbmVyYXRlcywgbG9hZHMgYW5kIGNhY2hl
cyB0aGUgc2hhZGVycworLy8gbmVlZGVkIHRvIGZpbGwgdGhlIHRyaWFuZ2xlIG1lc2hlcyBnZW5l
cmF0ZWQgYnkgTG9vcCBhbmQgQmxpbm4ncworLy8gYWxnb3JpdGhtLgorCitjbGFzcyBMb29wQmxp
bm5TaGFkZXJDYWNoZSA6IHB1YmxpYyBOb25jb3B5YWJsZSB7CitwdWJsaWM6CisgICAgZXhwbGlj
aXQgTG9vcEJsaW5uU2hhZGVyQ2FjaGUoR3JhcGhpY3NDb250ZXh0M0QqKTsKKyAgICB+TG9vcEJs
aW5uU2hhZGVyQ2FjaGUoKTsKKworICAgIGVudW0gU2hhZGVyVHlwZSB7CisgICAgICAgIFNvbGlk
RmlsbCwKKyAgICAgICAgLy8gRklYTUU6IGFkZCBtb3JlIHR5cGVzIG9mIHNoYWRlcnMgKGdyYWRp
ZW50cywgcGF0dGVybnMsIGV0Yy4pCisgICAgICAgIE51bVNoYWRlclR5cGVzIC8vIE11c3QgYmUg
bGFzdAorICAgIH07CisKKyAgICBlbnVtIFJlZ2lvblR5cGUgeworICAgICAgICBFeHRlcmlvciwg
Ly8gTG9vcCBhbmQgQmxpbm4ncyBzaGFkZXIKKyAgICAgICAgSW50ZXJpb3IsIC8vIFNvbGlkIGZp
bGxlZCByZWdpb24KKyAgICAgICAgTnVtUmVnaW9uVHlwZXMgLy8gTXVzdCBiZSBsYXN0CisgICAg
fTsKKworICAgIC8vIFRoaXMgb25seSBhZmZlY3RzIHRoZSBleHRlcmlvciBzaGFkZXIuCisgICAg
ZW51bSBBbnRpYWxpYXNUeXBlIHsKKyAgICAgICAgQW50aWFsaWFzZWQsCisgICAgICAgIE5vdEFu
dGlhbGlhc2VkLAorICAgICAgICBOdW1BbnRpYWxpYXNUeXBlcyAvLyBNdXN0IGJlIGxhc3QKKyAg
ICB9OworCisgICAgLy8gVGhlIExvb3BCbGlublNoYWRlckNhY2hlIG93bnMgdGhlIHJldHVybmVk
IHBvaW50ZXIuCisgICAgTG9vcEJsaW5uU2hhZGVyKiBsb29rdXBTaGFkZXIoU2hhZGVyVHlwZSwg
UmVnaW9uVHlwZSwgQW50aWFsaWFzVHlwZSk7CisKK3ByaXZhdGU6CisgICAgUGFzc093blB0cjxM
b29wQmxpbm5TaGFkZXI+IGNyZWF0ZVNoYWRlcihTaGFkZXJUeXBlLCBSZWdpb25UeXBlLCBBbnRp
YWxpYXNUeXBlKTsKKworICAgIEdyYXBoaWNzQ29udGV4dDNEKiBtX2NvbnRleHQ7CisgICAgT3du
UHRyPExvb3BCbGlublNoYWRlcj4gbV9zaGFkZXJzW051bVNoYWRlclR5cGVzXVtOdW1SZWdpb25U
eXBlc11bTnVtQW50aWFsaWFzVHlwZXNdOworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQor
CisjZW5kaWYgLy8gTG9vcEJsaW5uU2hhZGVyQ2FjaGVfaAo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>81335</attachid>
            <date>2011-02-04 19:08:22 -0800</date>
            <delta_ts>2011-02-07 12:33:00 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-45520-20110204190821.patch</filename>
            <type>text/plain</type>
            <size>24413</size>
            <attacher name="Kenneth Russell">kbr</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDc3NzIzKQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNDEgQEAKKzIwMTEtMDItMDQgIEtlbm5ldGgg
UnVzc2VsbCAgPGtickBnb29nbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAo
T09QUyEpLgorCisgICAgICAgIEFkZCBzaGFkZXJzIGZvciBHUFUgYWNjZWxlcmF0ZWQgcGF0aCBy
ZW5kZXJpbmcKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lk
PTQ1NTIwCisKKyAgICAgICAgUmVmYWN0b3JlZCBTb2xpZEZpbGxTaGFkZXIgYW5kIFRleFNoYWRl
ciB0byBjYWxsIG5ldworICAgICAgICBnZW5lcmF0ZVZlcnRleCgpIGFuZCBnZW5lcmF0ZUZyYWdt
ZW50KCkgbWV0aG9kcyBvbiBiYXNlIFNoYWRlcgorICAgICAgICBjbGFzcywgYW5kIGFkZGVkIHN1
cHBvcnQgZm9yIHRoZSBMb29wL0JsaW5uIHNoYWRlcnMuIFJlZmFjdG9yZWQKKyAgICAgICAgTG9v
cC9CbGlubiBzaGFkZXIgY2xhc3NlcyB0byBkZXJpdmUgZnJvbSBTaGFkZXIuCisKKyAgICAgICAg
VGVzdGVkIHRoZXNlIGNoYW5nZXMgd2l0aCBzZXZlcmFsIG9mIHRoZSBJRTkgVGVzdGRyaXZlIGRl
bW9zIHdpdGgKKyAgICAgICAgYWNjZWxlcmF0ZWQgMkQgY2FudmFzIGVuYWJsZWQsIGFzIHdlbGwg
YXMgYSBmdWxsIGxheW91dCB0ZXN0IHJ1bgorICAgICAgICB3aXRoIC0tcGxhdGZvcm0gY2hyb21p
dW0tZ3B1LgorCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvZ3B1L0xvb3BCbGlublNoYWRl
ci5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6TG9vcEJsaW5uU2hhZGVyOjpMb29wQmxp
bm5TaGFkZXIpOgorICAgICAgICAoV2ViQ29yZTo6TG9vcEJsaW5uU2hhZGVyOjp1c2UpOgorICAg
ICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2dwdS9Mb29wQmxpbm5TaGFkZXIuaDogQWRkZWQuCisg
ICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvZ3B1L0xvb3BCbGlublNvbGlkRmlsbFNoYWRlci5j
cHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6TG9vcEJsaW5uU29saWRGaWxsU2hhZGVyOjpj
cmVhdGUpOgorICAgICAgICAoV2ViQ29yZTo6TG9vcEJsaW5uU29saWRGaWxsU2hhZGVyOjpMb29w
Qmxpbm5Tb2xpZEZpbGxTaGFkZXIpOgorICAgICAgICAoV2ViQ29yZTo6TG9vcEJsaW5uU29saWRG
aWxsU2hhZGVyOjp1c2UpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2dwdS9Mb29wQmxp
bm5Tb2xpZEZpbGxTaGFkZXIuaDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mv
Z3B1L1NoYWRlci5jcHA6CisgICAgICAgIChXZWJDb3JlOjpTaGFkZXI6OmFmZmluZVRvNHg0KToK
KyAgICAgICAgKFdlYkNvcmU6OlNoYWRlcjo6bG9hZFNoYWRlcik6CisgICAgICAgIChXZWJDb3Jl
OjpTaGFkZXI6OmxvYWRQcm9ncmFtKToKKyAgICAgICAgKFdlYkNvcmU6OlNoYWRlcjo6Z2VuZXJh
dGVWZXJ0ZXgpOgorICAgICAgICAoV2ViQ29yZTo6U2hhZGVyOjpnZW5lcmF0ZUZyYWdtZW50KToK
KyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9ncHUvU2hhZGVyLmg6CisgICAgICAgICogcGxh
dGZvcm0vZ3JhcGhpY3MvZ3B1L1NvbGlkRmlsbFNoYWRlci5jcHA6CisgICAgICAgIChXZWJDb3Jl
OjpTb2xpZEZpbGxTaGFkZXI6OmNyZWF0ZSk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mv
Z3B1L1RleFNoYWRlci5jcHA6CisgICAgICAgIChXZWJDb3JlOjpUZXhTaGFkZXI6OlRleFNoYWRl
cik6CisgICAgICAgIChXZWJDb3JlOjpUZXhTaGFkZXI6OmNyZWF0ZSk6CisKIDIwMTEtMDItMDQg
IFhpeXVhbiBYaWEgIDx4aXl1YW5AY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5
IFRvbnkgQ2hhbmcuCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9ncHUv
TG9vcEJsaW5uU2hhZGVyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9ncHUvTG9vcEJsaW5uU2hhZGVyLmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2dwdS9Mb29wQmxpbm5TaGFkZXIuY3BwCShyZXZp
c2lvbiAwKQpAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIEdvb2ds
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMg
SVMiIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJ
U0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUws
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisj
aW5jbHVkZSAiTG9vcEJsaW5uU2hhZGVyLmgiCisKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQz
RC5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK0xvb3BCbGlublNoYWRlcjo6TG9vcEJsaW5u
U2hhZGVyKEdyYXBoaWNzQ29udGV4dDNEKiBjb250ZXh0LCB1bnNpZ25lZCBwcm9ncmFtKQorICAg
IDogU2hhZGVyKGNvbnRleHQsIHByb2dyYW0pCit7CisgICAgbV93b3JsZFZpZXdQcm9qZWN0aW9u
TG9jYXRpb24gPSBjb250ZXh0LT5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgIndvcmxkVmll
d1Byb2plY3Rpb24iKTsKKyAgICBtX3Bvc2l0aW9uTG9jYXRpb24gPSBjb250ZXh0LT5nZXRBdHRy
aWJMb2NhdGlvbihwcm9ncmFtLCAicG9zaXRpb24iKTsKKyAgICBtX2tsbUxvY2F0aW9uID0gY29u
dGV4dC0+Z2V0QXR0cmliTG9jYXRpb24ocHJvZ3JhbSwgImtsbSIpOworfQorCit2b2lkIExvb3BC
bGlublNoYWRlcjo6dXNlKHVuc2lnbmVkIHZlcnRleE9mZnNldCwgdW5zaWduZWQga2xtT2Zmc2V0
LCBjb25zdCBBZmZpbmVUcmFuc2Zvcm0mIHRyYW5zZm9ybSkKK3sKKyAgICBtX2NvbnRleHQtPnVz
ZVByb2dyYW0obV9wcm9ncmFtKTsKKworICAgIGZsb2F0IG1hdHJpeFsxNl07CisgICAgYWZmaW5l
VG80eDQodHJhbnNmb3JtLCBtYXRyaXgpOworICAgIG1fY29udGV4dC0+dW5pZm9ybU1hdHJpeDRm
dihtX3dvcmxkVmlld1Byb2plY3Rpb25Mb2NhdGlvbiwgZmFsc2UgLyp0cmFuc3Bvc2UqLywgbWF0
cml4LCAxIC8qY291bnQqLyk7CisKKyAgICBtX2NvbnRleHQtPnZlcnRleEF0dHJpYlBvaW50ZXIo
bV9wb3NpdGlvbkxvY2F0aW9uLCAyLCBHcmFwaGljc0NvbnRleHQzRDo6RkxPQVQsIGZhbHNlLCAw
LCB2ZXJ0ZXhPZmZzZXQpOworICAgIG1fY29udGV4dC0+ZW5hYmxlVmVydGV4QXR0cmliQXJyYXko
bV9wb3NpdGlvbkxvY2F0aW9uKTsKKworICAgIGlmIChtX2tsbUxvY2F0aW9uICE9IC0xKSB7Cisg
ICAgICAgIG1fY29udGV4dC0+dmVydGV4QXR0cmliUG9pbnRlcihtX2tsbUxvY2F0aW9uLCAzLCBH
cmFwaGljc0NvbnRleHQzRDo6RkxPQVQsIGZhbHNlLCAwLCBrbG1PZmZzZXQpOworICAgICAgICBt
X2NvbnRleHQtPmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KG1fa2xtTG9jYXRpb24pOworICAgIH0K
K30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvZ3B1L0xvb3BCbGlublNoYWRlci5oCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2dwdS9Mb29wQmxpbm5TaGFkZXIuaAkocmV2aXNpb24g
MCkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2dwdS9Mb29wQmxpbm5TaGFk
ZXIuaAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxMSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9u
IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgor
ICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklC
VVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0Ug
QVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJ
QlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lO
RVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgTG9vcEJs
aW5uU2hhZGVyX2gKKyNkZWZpbmUgTG9vcEJsaW5uU2hhZGVyX2gKKworI2luY2x1ZGUgIlNoYWRl
ci5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIEdyYXBoaWNzQ29udGV4dDNEOwor
CitjbGFzcyBMb29wQmxpbm5TaGFkZXIgOiBwdWJsaWMgU2hhZGVyIHsKK3B1YmxpYzoKKyAgICBl
bnVtIFJlZ2lvbiB7CisgICAgICAgIEludGVyaW9yLAorICAgICAgICBFeHRlcmlvcgorICAgIH07
CisKK3Byb3RlY3RlZDoKKyAgICBMb29wQmxpbm5TaGFkZXIoR3JhcGhpY3NDb250ZXh0M0QqLCB1
bnNpZ25lZCBwcm9ncmFtKTsKKworICAgIC8vIFRoaXMgYXNzdW1lcyB0aGUgdmVydGljZXMgYW5k
IGtsbSBjb29yZGluYXRlcyBhcmUgc3RvcmVkIGluIHRoZQorICAgIC8vIHNhbWUsIGN1cnJlbnRs
eSBib3VuZCwgYnVmZmVyIG9iamVjdCwgY29udGlndW91c2x5IGFuZCBhdCB0aGUKKyAgICAvLyBz
cGVjaWZpZWQgb2Zmc2V0cy4KKyAgICB2b2lkIHVzZSh1bnNpZ25lZCB2ZXJ0ZXhPZmZzZXQsIHVu
c2lnbmVkIGtsbU9mZnNldCwgY29uc3QgQWZmaW5lVHJhbnNmb3JtJik7CisKK3ByaXZhdGU6Cisg
ICAgaW50IG1fd29ybGRWaWV3UHJvamVjdGlvbkxvY2F0aW9uOworICAgIGludCBtX3Bvc2l0aW9u
TG9jYXRpb247CisgICAgaW50IG1fa2xtTG9jYXRpb247Cit9OworCit9IC8vIG5hbWVzcGFjZSBX
ZWJDb3JlCisKKyNlbmRpZiAvLyBMb29wQmxpbm5TaGFkZXJfaApJbmRleDogU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvZ3B1L0xvb3BCbGlublNvbGlkRmlsbFNoYWRlci5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZ3B1L0xvb3BCbGlu
blNvbGlkRmlsbFNoYWRlci5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9ncHUvTG9vcEJsaW5uU29saWRGaWxsU2hhZGVyLmNwcAkocmV2aXNpb24g
MCkKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBHb29nbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz
dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBB
TkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJ
TUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwor
ICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1
ZGUgIkxvb3BCbGlublNvbGlkRmlsbFNoYWRlci5oIgorCisjaW5jbHVkZSAiR3JhcGhpY3NDb250
ZXh0M0QuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitQYXNzT3duUHRyPExvb3BCbGlublNv
bGlkRmlsbFNoYWRlcj4gTG9vcEJsaW5uU29saWRGaWxsU2hhZGVyOjpjcmVhdGUoR3JhcGhpY3ND
b250ZXh0M0QqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9vcEJsaW5uU2hhZGVyOjpSZWdpb24g
cmVnaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIFNoYWRlcjo6QW50aWFsaWFzVHlwZSBhbnRpYWxpYXNUeXBl
KQoreworICAgIFZlcnRleFR5cGUgdHlwZSA9IChyZWdpb24gPT0gSW50ZXJpb3IpID8gTG9vcEJs
aW5uSW50ZXJpb3IgOiBMb29wQmxpbm5FeHRlcmlvcjsKKyAgICB1bnNpZ25lZCBwcm9ncmFtID0g
bG9hZFByb2dyYW0oY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
Z2VuZXJhdGVWZXJ0ZXgodHlwZSwgU29saWRGaWxsKSwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgZ2VuZXJhdGVGcmFnbWVudCh0eXBlLCBTb2xpZEZpbGwsIGFudGlhbGlhc1R5
cGUpKTsKKyAgICBpZiAoIXByb2dyYW0pCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiBu
ZXcgTG9vcEJsaW5uU29saWRGaWxsU2hhZGVyKGNvbnRleHQsIHByb2dyYW0pOworfQorCitMb29w
Qmxpbm5Tb2xpZEZpbGxTaGFkZXI6Okxvb3BCbGlublNvbGlkRmlsbFNoYWRlcihHcmFwaGljc0Nv
bnRleHQzRCogY29udGV4dCwgdW5zaWduZWQgcHJvZ3JhbSkKKyAgICA6IExvb3BCbGlublNoYWRl
cihjb250ZXh0LCBwcm9ncmFtKQoreworICAgIG1fY29sb3JMb2NhdGlvbiA9IGNvbnRleHQtPmdl
dFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAiY29sb3IiKTsKK30KKwordm9pZCBMb29wQmxpbm5T
b2xpZEZpbGxTaGFkZXI6OnVzZSh1bnNpZ25lZCB2ZXJ0ZXhPZmZzZXQsIHVuc2lnbmVkIGtsbU9m
ZnNldCwgY29uc3QgQWZmaW5lVHJhbnNmb3JtJiB0cmFuc2Zvcm0sIGNvbnN0IENvbG9yJiBjb2xv
cikKK3sKKyAgICBMb29wQmxpbm5TaGFkZXI6OnVzZSh2ZXJ0ZXhPZmZzZXQsIGtsbU9mZnNldCwg
dHJhbnNmb3JtKTsKKworICAgIGZsb2F0IHJnYmFbNF07CisgICAgY29sb3IuZ2V0UkdCQShyZ2Jh
WzBdLCByZ2JhWzFdLCByZ2JhWzJdLCByZ2JhWzNdKTsKKyAgICBtX2NvbnRleHQtPnVuaWZvcm00
ZihtX2NvbG9yTG9jYXRpb24sIHJnYmFbMF0gKiByZ2JhWzNdLCByZ2JhWzFdICogcmdiYVszXSwg
cmdiYVsyXSAqIHJnYmFbM10sIHJnYmFbM10pOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3Jl
CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9ncHUvTG9vcEJsaW5uU29s
aWRGaWxsU2hhZGVyLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvZ3B1L0xvb3BCbGlublNvbGlkRmlsbFNoYWRlci5oCShyZXZpc2lvbiAwKQorKysgU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZ3B1L0xvb3BCbGlublNvbGlkRmlsbFNoYWRl
ci5oCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDExIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
ICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisg
KgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJV
VE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBB
UkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBMb29wQmxp
bm5Tb2xpZEZpbGxTaGFkZXJfaAorI2RlZmluZSBMb29wQmxpbm5Tb2xpZEZpbGxTaGFkZXJfaAor
CisjaW5jbHVkZSAiTG9vcEJsaW5uU2hhZGVyLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKwor
Y2xhc3MgR3JhcGhpY3NDb250ZXh0M0Q7CisKK2NsYXNzIExvb3BCbGlublNvbGlkRmlsbFNoYWRl
ciA6IHB1YmxpYyBMb29wQmxpbm5TaGFkZXIgeworcHVibGljOgorICAgIHN0YXRpYyBQYXNzT3du
UHRyPExvb3BCbGlublNvbGlkRmlsbFNoYWRlcj4gY3JlYXRlKEdyYXBoaWNzQ29udGV4dDNEKiwg
UmVnaW9uLCBBbnRpYWxpYXNUeXBlKTsKKworICAgIC8vIFRoaXMgYXNzdW1lcyB0aGUgdmVydGlj
ZXMgYW5kIGtsbSBjb29yZGluYXRlcyBhcmUgc3RvcmVkIGluIHRoZQorICAgIC8vIHNhbWUsIGN1
cnJlbnRseSBib3VuZCwgYnVmZmVyIG9iamVjdCwgY29udGlndW91c2x5IGFuZCBhdCB0aGUKKyAg
ICAvLyBzcGVjaWZpZWQgb2Zmc2V0cy4KKyAgICB2b2lkIHVzZSh1bnNpZ25lZCB2ZXJ0ZXhPZmZz
ZXQsIHVuc2lnbmVkIGtsbU9mZnNldCwgY29uc3QgQWZmaW5lVHJhbnNmb3JtJiwgY29uc3QgQ29s
b3ImKTsKKworcHJpdmF0ZToKKyAgICBMb29wQmxpbm5Tb2xpZEZpbGxTaGFkZXIoR3JhcGhpY3ND
b250ZXh0M0QqLCB1bnNpZ25lZCBwcm9ncmFtKTsKKworICAgIGludCBtX2NvbG9yTG9jYXRpb247
Cit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBMb29wQmxpbm5Tb2xp
ZEZpbGxTaGFkZXJfaApJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZ3B1
L1NoYWRlci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvZ3B1L1NoYWRlci5jcHAJKHJldmlzaW9uIDc3NzExKQorKysgU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3MvZ3B1L1NoYWRlci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM4LDYgKzM4
LDcgQEAKICNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQzRC5oIgogCiAjaW5jbHVkZSA8d3RmL3Rl
eHQvQ1N0cmluZy5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L1N0cmluZ0J1aWxkZXIuaD4KIAogbmFt
ZXNwYWNlIFdlYkNvcmUgewogCkBAIC01NiwxNCArNTcsMzQgQEAgdm9pZCBTaGFkZXI6OmFmZmlu
ZVRvM3gzKGNvbnN0IEFmZmluZVRyYQogfQogCiAvLyBzdGF0aWMKLXVuc2lnbmVkIFNoYWRlcjo6
bG9hZFNoYWRlcihHcmFwaGljc0NvbnRleHQzRCogY29udGV4dCwgdW5zaWduZWQgdHlwZSwgY29u
c3QgY2hhciogc2hhZGVyU291cmNlKQordm9pZCBTaGFkZXI6OmFmZmluZVRvNHg0KGNvbnN0IEFm
ZmluZVRyYW5zZm9ybSYgdHJhbnNmb3JtLCBmbG9hdCBtYXRbMTZdKQoreworICAgIG1hdFswXSA9
IHRyYW5zZm9ybS5hKCk7CisgICAgbWF0WzFdID0gdHJhbnNmb3JtLmIoKTsKKyAgICBtYXRbMl0g
PSAwLjBmOworICAgIG1hdFszXSA9IDAuMGY7CisgICAgbWF0WzRdID0gdHJhbnNmb3JtLmMoKTsK
KyAgICBtYXRbNV0gPSB0cmFuc2Zvcm0uZCgpOworICAgIG1hdFs2XSA9IDAuMGY7CisgICAgbWF0
WzddID0gMC4wZjsKKyAgICBtYXRbOF0gPSAwLjBmOworICAgIG1hdFs5XSA9IDAuMGY7CisgICAg
bWF0WzEwXSA9IDEuMGY7CisgICAgbWF0WzExXSA9IDAuMGY7CisgICAgbWF0WzEyXSA9IHRyYW5z
Zm9ybS5lKCk7CisgICAgbWF0WzEzXSA9IHRyYW5zZm9ybS5mKCk7CisgICAgbWF0WzE0XSA9IDAu
MGY7CisgICAgbWF0WzE1XSA9IDEuMGY7Cit9CisKKy8vIHN0YXRpYwordW5zaWduZWQgU2hhZGVy
Ojpsb2FkU2hhZGVyKEdyYXBoaWNzQ29udGV4dDNEKiBjb250ZXh0LCB1bnNpZ25lZCB0eXBlLCBj
b25zdCBTdHJpbmcmIHNoYWRlclNvdXJjZSkKIHsKICAgICB1bnNpZ25lZCBzaGFkZXIgPSBjb250
ZXh0LT5jcmVhdGVTaGFkZXIodHlwZSk7CiAgICAgaWYgKCFzaGFkZXIpCiAgICAgICAgIHJldHVy
biAwOwogCi0gICAgU3RyaW5nIHNoYWRlclNvdXJjZVN0cihzaGFkZXJTb3VyY2UpOwotICAgIGNv
bnRleHQtPnNoYWRlclNvdXJjZShzaGFkZXIsIHNoYWRlclNvdXJjZVN0cik7CisgICAgY29udGV4
dC0+c2hhZGVyU291cmNlKHNoYWRlciwgc2hhZGVyU291cmNlKTsKICAgICBjb250ZXh0LT5jb21w
aWxlU2hhZGVyKHNoYWRlcik7CiAgICAgaW50IGNvbXBpbGVTdGF0dXMgPSAwOwogICAgIGNvbnRl
eHQtPmdldFNoYWRlcml2KHNoYWRlciwgR3JhcGhpY3NDb250ZXh0M0Q6OkNPTVBJTEVfU1RBVFVT
LCAmY29tcGlsZVN0YXR1cyk7CkBAIC03Nyw3ICs5OCw3IEBAIHVuc2lnbmVkIFNoYWRlcjo6bG9h
ZFNoYWRlcihHcmFwaGljc0NvbnQKIH0KIAogLy8gc3RhdGljCi11bnNpZ25lZCBTaGFkZXI6Omxv
YWRQcm9ncmFtKEdyYXBoaWNzQ29udGV4dDNEKiBjb250ZXh0LCBjb25zdCBjaGFyKiB2ZXJ0ZXhT
aGFkZXJTb3VyY2UsIGNvbnN0IGNoYXIqIGZyYWdtZW50U2hhZGVyU291cmNlKQordW5zaWduZWQg
U2hhZGVyOjpsb2FkUHJvZ3JhbShHcmFwaGljc0NvbnRleHQzRCogY29udGV4dCwgY29uc3QgU3Ry
aW5nJiB2ZXJ0ZXhTaGFkZXJTb3VyY2UsIGNvbnN0IFN0cmluZyYgZnJhZ21lbnRTaGFkZXJTb3Vy
Y2UpCiB7CiAgICAgdW5zaWduZWQgdmVydGV4U2hhZGVyID0gbG9hZFNoYWRlcihjb250ZXh0LCBH
cmFwaGljc0NvbnRleHQzRDo6VkVSVEVYX1NIQURFUiwgdmVydGV4U2hhZGVyU291cmNlKTsKICAg
ICBpZiAoIXZlcnRleFNoYWRlcikKQEAgLTExMSw2ICsxMzIsMTQ2IEBAIFNoYWRlcjo6flNoYWRl
cigpCiAgICAgbV9jb250ZXh0LT5kZWxldGVQcm9ncmFtKG1fcHJvZ3JhbSk7CiB9CiAKKy8vIHN0
YXRpYworU3RyaW5nIFNoYWRlcjo6Z2VuZXJhdGVWZXJ0ZXgoU2hhZGVyOjpWZXJ0ZXhUeXBlIHZl
cnRleFR5cGUsIFNoYWRlcjo6RmlsbFR5cGUgZmlsbFR5cGUpCit7CisgICAgU3RyaW5nQnVpbGRl
ciBidWlsZGVyOworICAgIHN3aXRjaCAodmVydGV4VHlwZSkgeworICAgIGNhc2UgVHdvRGltZW5z
aW9uYWw6CisgICAgICAgIGJ1aWxkZXIuYXBwZW5kKAorICAgICAgICAgICAgInVuaWZvcm0gbWF0
MyBtYXRyaXg7XG4iCisgICAgICAgICAgICAiYXR0cmlidXRlIHZlYzMgcG9zaXRpb247XG4iKTsK
KyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBMb29wQmxpbm5JbnRlcmlvcjoKKyAgICAgICAgYnVp
bGRlci5hcHBlbmQoCisgICAgICAgICAgICAidW5pZm9ybSBtYXQ0IHdvcmxkVmlld1Byb2plY3Rp
b247XG4iCisgICAgICAgICAgICAiYXR0cmlidXRlIHZlYzIgcG9zaXRpb247XG4iKTsKKyAgICAg
ICAgYnJlYWs7CisgICAgY2FzZSBMb29wQmxpbm5FeHRlcmlvcjoKKyAgICAgICAgYnVpbGRlci5h
cHBlbmQoCisgICAgICAgICAgICAidW5pZm9ybSBtYXQ0IHdvcmxkVmlld1Byb2plY3Rpb247XG4i
CisgICAgICAgICAgICAiYXR0cmlidXRlIHZlYzIgcG9zaXRpb247XG4iCisgICAgICAgICAgICAi
YXR0cmlidXRlIHZlYzMga2xtO1xuIgorICAgICAgICAgICAgInZhcnlpbmcgdmVjMyB2X2tsbTtc
biIpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoZmlsbFR5cGUgPT0gVGV4dHVy
ZUZpbGwpIHsKKyAgICAgICAgYnVpbGRlci5hcHBlbmQoCisgICAgICAgICAgICAidW5pZm9ybSBt
YXQzIHRleE1hdHJpeDtcbiIKKyAgICAgICAgICAgICJ2YXJ5aW5nIHZlYzMgdGV4Q29vcmQ7XG4i
KTsKKyAgICB9CisKKyAgICBidWlsZGVyLmFwcGVuZCgKKyAgICAgICAgInZvaWQgbWFpbigpIHtc
biIpOworCisgICAgaWYgKHZlcnRleFR5cGUgPT0gVHdvRGltZW5zaW9uYWwpIHsKKyAgICAgICAg
YnVpbGRlci5hcHBlbmQoCisgICAgICAgICAgICAiZ2xfUG9zaXRpb24gPSB2ZWM0KG1hdHJpeCAq
IHBvc2l0aW9uLCAxLjApO1xuIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYnVpbGRlci5hcHBl
bmQoCisgICAgICAgICAgICAiZ2xfUG9zaXRpb24gPSB3b3JsZFZpZXdQcm9qZWN0aW9uICogdmVj
NChwb3NpdGlvbiwgMC4wLCAxLjApO1xuIik7CisgICAgICAgIGlmICh2ZXJ0ZXhUeXBlID09IExv
b3BCbGlubkV4dGVyaW9yKSB7CisgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgKKyAgICAgICAg
ICAgICAgICAidl9rbG0gPSBrbG07XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChm
aWxsVHlwZSA9PSBUZXh0dXJlRmlsbCkgeworICAgICAgICBidWlsZGVyLmFwcGVuZCgKKyAgICAg
ICAgICAgICJ0ZXhDb29yZCA9IHRleE1hdHJpeCAqIHBvc2l0aW9uO1xuIik7CisgICAgfQorCisg
ICAgYnVpbGRlci5hcHBlbmQoCisgICAgICAgICJ9XG4iKTsKKworICAgIHJldHVybiBidWlsZGVy
LnRvU3RyaW5nKCk7Cit9CisKKy8vIHN0YXRpYworU3RyaW5nIFNoYWRlcjo6Z2VuZXJhdGVGcmFn
bWVudChTaGFkZXI6OlZlcnRleFR5cGUgdmVydGV4VHlwZSwgU2hhZGVyOjpGaWxsVHlwZSBmaWxs
VHlwZSwgU2hhZGVyOjpBbnRpYWxpYXNUeXBlIGFudGlhbGlhc1R5cGUpCit7CisgICAgU3RyaW5n
QnVpbGRlciBidWlsZGVyOworICAgIGJ1aWxkZXIuYXBwZW5kKAorICAgICAgICAiI2lmZGVmIEdM
X0VTXG4iCisgICAgICAgICJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiIKKyAgICAgICAgIiNl
bmRpZlxuIik7CisKKyAgICBpZiAodmVydGV4VHlwZSA9PSBMb29wQmxpbm5FeHRlcmlvcikgewor
ICAgICAgICBpZiAoYW50aWFsaWFzVHlwZSA9PSBBbnRpYWxpYXNlZCkgeworICAgICAgICAgICAg
YnVpbGRlci5hcHBlbmQoCisgICAgICAgICAgICAgICAgIiNleHRlbnNpb24gR0xfT0VTX3N0YW5k
YXJkX2Rlcml2YXRpdmVzIDogZW5hYmxlXG4iKTsKKyAgICAgICAgfQorICAgICAgICBidWlsZGVy
LmFwcGVuZCgKKyAgICAgICAgICAgICJ2YXJ5aW5nIHZlYzMgdl9rbG07XG4iKTsKKyAgICB9CisK
KyAgICBzd2l0Y2ggKGZpbGxUeXBlKSB7CisgICAgY2FzZSBTb2xpZEZpbGw6CisgICAgICAgIGJ1
aWxkZXIuYXBwZW5kKAorICAgICAgICAgICAgInVuaWZvcm0gdmVjNCBjb2xvcjtcbiIpOworICAg
ICAgICBicmVhazsKKyAgICBjYXNlIFRleHR1cmVGaWxsOgorICAgICAgICBidWlsZGVyLmFwcGVu
ZCgKKyAgICAgICAgICAgICJ1bmlmb3JtIHNhbXBsZXIyRCBzYW1wbGVyO1xuIgorICAgICAgICAg
ICAgInVuaWZvcm0gZmxvYXQgZ2xvYmFsQWxwaGE7XG4iCisgICAgICAgICAgICAidmFyeWluZyB2
ZWMzIHRleENvb3JkO1xuIik7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGJ1aWxkZXIu
YXBwZW5kKAorICAgICAgICAidm9pZCBtYWluKCkge1xuIik7CisKKyAgICBpZiAodmVydGV4VHlw
ZSAhPSBMb29wQmxpbm5FeHRlcmlvcikgeworICAgICAgICBidWlsZGVyLmFwcGVuZCgKKyAgICAg
ICAgICAgICJmbG9hdCBhbHBoYSA9IDEuMDtcbiIpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlm
IChhbnRpYWxpYXNUeXBlID09IEFudGlhbGlhc2VkKSB7CisgICAgICAgICAgICBidWlsZGVyLmFw
cGVuZCgKKyAgICAgICAgICAgICAgICAiICAvLyBHcmFkaWVudHNcbiIKKyAgICAgICAgICAgICAg
ICAiICB2ZWMzIHB4ID0gZEZkeCh2X2tsbSk7XG4iCisgICAgICAgICAgICAgICAgIiAgdmVjMyBw
eSA9IGRGZHkodl9rbG0pO1xuIgorICAgICAgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgICAg
ICAiICAvLyBDaGFpbiBydWxlXG4iCisgICAgICAgICAgICAgICAgIiAgZmxvYXQgazIgPSB2X2ts
bS54ICogdl9rbG0ueDtcbiIKKyAgICAgICAgICAgICAgICAiICBmbG9hdCBjID0gazIgKiB2X2ts
bS54IC0gdl9rbG0ueSAqIHZfa2xtLno7XG4iCisgICAgICAgICAgICAgICAgIiAgZmxvYXQgazIz
ID0gMy4wICogazI7XG4iCisgICAgICAgICAgICAgICAgIiAgZmxvYXQgY3ggPSBrMjMgKiBweC54
IC0gdl9rbG0ueiAqIHB4LnkgLSB2X2tsbS55ICogcHguejtcbiIKKyAgICAgICAgICAgICAgICAi
ICBmbG9hdCBjeSA9IGsyMyAqIHB5LnggLSB2X2tsbS56ICogcHkueSAtIHZfa2xtLnkgKiBweS56
O1xuIgorICAgICAgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgICAgICAiICAvLyBTaWduZWQg
ZGlzdGFuY2VcbiIKKyAgICAgICAgICAgICAgICAiICBmbG9hdCBzZCA9IGMgLyBzcXJ0KGN4ICog
Y3ggKyBjeSAqIGN5KTtcbiIKKyAgICAgICAgICAgICAgICAiXG4iCisgICAgICAgICAgICAgICAg
IiAgLy8gTGluZWFyIGFscGhhXG4iCisgICAgICAgICAgICAgICAgIiAgLy8gRklYTUU6IGZpZ3Vy
ZSBvdXQgd2h5IHRoaXMgbmVlZHMgdG8gYmVcbiIKKyAgICAgICAgICAgICAgICAiICAvLyBuZWdh
dGVkIGNvbXBhcmVkIHRvIHRoZSBITFNMIHZlcnNpb24sIGFuZCBhbHNvIHdoeVxuIgorICAgICAg
ICAgICAgICAgICIgIC8vIHdlIG5lZWQgYW4gYWRqdXN0bWVudCBieSArMS4wIGZvciBpdCB0byBs
b29rIGdvb2QuXG4iCisgICAgICAgICAgICAgICAgIiAgLy8gZmxvYXQgYWxwaGEgPSBjbGFtcCgw
LjUgLSBzZCwgMC4wLCAxLjApO1xuIgorICAgICAgICAgICAgICAgICIgIGZsb2F0IGFscGhhID0g
Y2xhbXAoc2QgKyAwLjUsIDAuMCwgMS4wKTtcbiIpOworICAgICAgICB9IGVsc2UgeworICAgICAg
ICAgICAgYnVpbGRlci5hcHBlbmQoCisgICAgICAgICAgICAgICAgIiAgZmxvYXQgdCA9IHZfa2xt
LnggKiB2X2tsbS54ICogdl9rbG0ueCAtIHZfa2xtLnkgKiB2X2tsbS56O1xuIgorICAgICAgICAg
ICAgICAgICIgIGZsb2F0IGFscGhhID0gY2xhbXAoc2lnbih0KSwgMC4wLCAxLjApO1xuIik7Cisg
ICAgICAgIH0KKyAgICB9CisKKyAgICBzd2l0Y2ggKGZpbGxUeXBlKSB7CisgICAgY2FzZSBTb2xp
ZEZpbGw6CisgICAgICAgIGJ1aWxkZXIuYXBwZW5kKAorICAgICAgICAgICAgImdsX0ZyYWdDb2xv
ciA9IGNvbG9yICogYWxwaGE7XG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUZXh0dXJl
RmlsbDoKKyAgICAgICAgYnVpbGRlci5hcHBlbmQoCisgICAgICAgICAgICAiZ2xfRnJhZ0NvbG9y
ID0gdGV4dHVyZTJEKHNhbXBsZXIsIHRleENvb3JkLnh5KSAqIGFscGhhICogZ2xvYmFsQWxwaGE7
XG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgYnVpbGRlci5hcHBlbmQoCisgICAg
ICAgICJ9XG4iKTsKKworICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7CiB9CiAKK30gLy8g
bmFtZXNwYWNlIFdlYkNvcmUKKwogI2VuZGlmCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9ncHUvU2hhZGVyLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3MvZ3B1L1NoYWRlci5oCShyZXZpc2lvbiA3NzcxMSkKKysrIFNvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2dwdS9TaGFkZXIuaAkod29ya2luZyBjb3B5KQpAQCAt
MzMsNiArMzMsNyBAQAogCiAjaW5jbHVkZSA8d3RmL05vbmNvcHlhYmxlLmg+CiAjaW5jbHVkZSA8
d3RmL1Bhc3NPd25QdHIuaD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9XVEZTdHJpbmcuaD4KIAogbmFt
ZXNwYWNlIFdlYkNvcmUgewogCkBAIC00MiwxMyArNDMsMzUgQEAgY2xhc3MgQ29sb3I7CiAKIGNs
YXNzIFNoYWRlciB7CiAgICAgV1RGX01BS0VfTk9OQ09QWUFCTEUoU2hhZGVyKTsKK3B1YmxpYzoK
KyAgICBlbnVtIFZlcnRleFR5cGUgeworICAgICAgICBUd29EaW1lbnNpb25hbCwKKyAgICAgICAg
TG9vcEJsaW5uSW50ZXJpb3IsCisgICAgICAgIExvb3BCbGlubkV4dGVyaW9yCisgICAgfTsKKwor
ICAgIGVudW0gRmlsbFR5cGUgeworICAgICAgICBTb2xpZEZpbGwsCisgICAgICAgIFRleHR1cmVG
aWxsCisgICAgfTsKKworICAgIC8vIEN1cnJlbnRseSBvbmx5IGFwcGxpZXMgdG8gdGhlIExvb3At
Qmxpbm4gdmVydGV4IHR5cGUuCisgICAgZW51bSBBbnRpYWxpYXNUeXBlIHsKKyAgICAgICAgTm90
QW50aWFsaWFzZWQsCisgICAgICAgIEFudGlhbGlhc2VkCisgICAgfTsKKwogcHJvdGVjdGVkOgog
ICAgIFNoYWRlcihHcmFwaGljc0NvbnRleHQzRCosIHVuc2lnbmVkIHByb2dyYW0pOwogICAgIH5T
aGFkZXIoKTsKIAorICAgIHN0YXRpYyBTdHJpbmcgZ2VuZXJhdGVWZXJ0ZXgoVmVydGV4VHlwZSwg
RmlsbFR5cGUpOworICAgIHN0YXRpYyBTdHJpbmcgZ2VuZXJhdGVGcmFnbWVudChWZXJ0ZXhUeXBl
LCBGaWxsVHlwZSwgQW50aWFsaWFzVHlwZSk7CisKICAgICBzdGF0aWMgdm9pZCBhZmZpbmVUbzN4
Myhjb25zdCBBZmZpbmVUcmFuc2Zvcm0mLCBmbG9hdCBtYXRbOV0pOwotICAgIHN0YXRpYyB1bnNp
Z25lZCBsb2FkU2hhZGVyKEdyYXBoaWNzQ29udGV4dDNEKiwgdW5zaWduZWQgdHlwZSwgY29uc3Qg
Y2hhciogc2hhZGVyU291cmNlKTsKLSAgICBzdGF0aWMgdW5zaWduZWQgbG9hZFByb2dyYW0oR3Jh
cGhpY3NDb250ZXh0M0QqLCBjb25zdCBjaGFyKiB2ZXJ0ZXhTaGFkZXJTb3VyY2UsIGNvbnN0IGNo
YXIqIGZyYWdtZW50U2hhZGVyU291cmNlKTsKKyAgICBzdGF0aWMgdm9pZCBhZmZpbmVUbzR4NChj
b25zdCBBZmZpbmVUcmFuc2Zvcm0mLCBmbG9hdCBtYXRbMTZdKTsKKyAgICBzdGF0aWMgdW5zaWdu
ZWQgbG9hZFNoYWRlcihHcmFwaGljc0NvbnRleHQzRCosIHVuc2lnbmVkIHR5cGUsIGNvbnN0IFN0
cmluZyYgc2hhZGVyU291cmNlKTsKKyAgICBzdGF0aWMgdW5zaWduZWQgbG9hZFByb2dyYW0oR3Jh
cGhpY3NDb250ZXh0M0QqLCBjb25zdCBTdHJpbmcmIHZlcnRleFNoYWRlclNvdXJjZSwgY29uc3Qg
U3RyaW5nJiBmcmFnbWVudFNoYWRlclNvdXJjZSk7CiAKICAgICBHcmFwaGljc0NvbnRleHQzRCog
bV9jb250ZXh0OwogICAgIHVuc2lnbmVkIG1fcHJvZ3JhbTsKSW5kZXg6IFNvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL2dwdS9Tb2xpZEZpbGxTaGFkZXIuY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2dwdS9Tb2xpZEZpbGxTaGFkZXIuY3Bw
CShyZXZpc2lvbiA3NzcxMSkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2dw
dS9Tb2xpZEZpbGxTaGFkZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00OSwyMyArNDksOSBAQCBT
b2xpZEZpbGxTaGFkZXI6OlNvbGlkRmlsbFNoYWRlcihHcmFwaGljCiAKIFBhc3NPd25QdHI8U29s
aWRGaWxsU2hhZGVyPiBTb2xpZEZpbGxTaGFkZXI6OmNyZWF0ZShHcmFwaGljc0NvbnRleHQzRCog
Y29udGV4dCkKIHsKLSAgICBzdGF0aWMgY29uc3QgY2hhciogdmVydGV4U2hhZGVyU291cmNlID0K
LSAgICAgICAgICAgICJ1bmlmb3JtIG1hdDMgbWF0cml4O1xuIgotICAgICAgICAgICAgInVuaWZv
cm0gdmVjNCBjb2xvcjtcbiIKLSAgICAgICAgICAgICJhdHRyaWJ1dGUgdmVjMyBwb3NpdGlvbjtc
biIKLSAgICAgICAgICAgICJ2b2lkIG1haW4oKSB7XG4iCi0gICAgICAgICAgICAiICAgIGdsX1Bv
c2l0aW9uID0gdmVjNChtYXRyaXggKiBwb3NpdGlvbiwgMS4wKTtcbiIKLSAgICAgICAgICAgICJ9
XG4iOwotICAgIHN0YXRpYyBjb25zdCBjaGFyKiBmcmFnbWVudFNoYWRlclNvdXJjZSA9Ci0gICAg
ICAgICAgICAiI2lmZGVmIEdMX0VTXG4iCi0gICAgICAgICAgICAicHJlY2lzaW9uIG1lZGl1bXAg
ZmxvYXQ7XG4iCi0gICAgICAgICAgICAiI2VuZGlmXG4iCi0gICAgICAgICAgICAidW5pZm9ybSBt
YXQzIG1hdHJpeDtcbiIKLSAgICAgICAgICAgICJ1bmlmb3JtIHZlYzQgY29sb3I7XG4iCi0gICAg
ICAgICAgICAidm9pZCBtYWluKCkge1xuIgotICAgICAgICAgICAgIiAgICBnbF9GcmFnQ29sb3Ig
PSBjb2xvcjtcbiIKLSAgICAgICAgICAgICJ9XG4iOwotICAgIHVuc2lnbmVkIHByb2dyYW0gPSBs
b2FkUHJvZ3JhbShjb250ZXh0LCB2ZXJ0ZXhTaGFkZXJTb3VyY2UsIGZyYWdtZW50U2hhZGVyU291
cmNlKTsKKyAgICB1bnNpZ25lZCBwcm9ncmFtID0gbG9hZFByb2dyYW0oY29udGV4dCwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVWZXJ0ZXgoU2hhZGVyOjpUd29E
aW1lbnNpb25hbCwgU2hhZGVyOjpTb2xpZEZpbGwpLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBnZW5lcmF0ZUZyYWdtZW50KFNoYWRlcjo6VHdvRGltZW5zaW9uYWwsIFNoYWRl
cjo6U29saWRGaWxsLCBTaGFkZXI6Ok5vdEFudGlhbGlhc2VkKSk7CiAgICAgaWYgKCFwcm9ncmFt
KQogICAgICAgICByZXR1cm4gMDsKICAgICByZXR1cm4gbmV3IFNvbGlkRmlsbFNoYWRlcihjb250
ZXh0LCBwcm9ncmFtKTsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2dw
dS9UZXhTaGFkZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL2dwdS9UZXhTaGFkZXIuY3BwCShyZXZpc2lvbiA3NzcxMSkKKysrIFNvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL2dwdS9UZXhTaGFkZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC00MywzMyArNDMsMTYgQEAgVGV4U2hhZGVyOjpUZXhTaGFkZXIoR3JhcGhpY3NDb250ZXh0M0Qq
IAogewogICAgIG1fbWF0cml4TG9jYXRpb24gPSBjb250ZXh0LT5nZXRVbmlmb3JtTG9jYXRpb24o
cHJvZ3JhbSwgIm1hdHJpeCIpOwogICAgIG1fdGV4TWF0cml4TG9jYXRpb24gPSBjb250ZXh0LT5n
ZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInRleE1hdHJpeCIpOwotICAgIG1fYWxwaGFMb2Nh
dGlvbiA9IGNvbnRleHQtPmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAiYWxwaGEiKTsKKyAg
ICBtX2FscGhhTG9jYXRpb24gPSBjb250ZXh0LT5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwg
Imdsb2JhbEFscGhhIik7CiAgICAgbV9wb3NpdGlvbkxvY2F0aW9uID0gY29udGV4dC0+Z2V0QXR0
cmliTG9jYXRpb24ocHJvZ3JhbSwgInBvc2l0aW9uIik7CiAgICAgbV9zYW1wbGVyTG9jYXRpb24g
PSBjb250ZXh0LT5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInNhbXBsZXIiKTsKIH0KIAog
UGFzc093blB0cjxUZXhTaGFkZXI+IFRleFNoYWRlcjo6Y3JlYXRlKEdyYXBoaWNzQ29udGV4dDNE
KiBjb250ZXh0KQogewotICAgIHN0YXRpYyBjb25zdCBjaGFyKiB2ZXJ0ZXhTaGFkZXJTb3VyY2Ug
PQotICAgICAgICAidW5pZm9ybSBtYXQzIG1hdHJpeDtcbiIKLSAgICAgICAgInVuaWZvcm0gbWF0
MyB0ZXhNYXRyaXg7XG4iCi0gICAgICAgICJhdHRyaWJ1dGUgdmVjMyBwb3NpdGlvbjtcbiIKLSAg
ICAgICAgInZhcnlpbmcgdmVjMyB0ZXhDb29yZDtcbiIKLSAgICAgICAgInZvaWQgbWFpbigpIHtc
biIKLSAgICAgICAgIiAgICB0ZXhDb29yZCA9IHRleE1hdHJpeCAqIHBvc2l0aW9uO1xuIgotICAg
ICAgICAiICAgIGdsX1Bvc2l0aW9uID0gdmVjNChtYXRyaXggKiBwb3NpdGlvbiwgMS4wKTtcbiIK
LSAgICAgICAgIn1cbiI7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIqIGZyYWdtZW50U2hhZGVyU291
cmNlID0KLSAgICAgICAgIiNpZmRlZiBHTF9FU1xuIgotICAgICAgICAicHJlY2lzaW9uIG1lZGl1
bXAgZmxvYXQ7XG4iCi0gICAgICAgICIjZW5kaWZcbiIKLSAgICAgICAgInVuaWZvcm0gc2FtcGxl
cjJEIHNhbXBsZXI7XG4iCi0gICAgICAgICJ1bmlmb3JtIGZsb2F0IGFscGhhO1xuIgotICAgICAg
ICAidmFyeWluZyB2ZWMzIHRleENvb3JkO1xuIgotICAgICAgICAidm9pZCBtYWluKCkge1xuIgot
ICAgICAgICAiICAgIGdsX0ZyYWdDb2xvciA9IHRleHR1cmUyRChzYW1wbGVyLCB0ZXhDb29yZC54
eSkqIHZlYzQoYWxwaGEpO1xuIgotICAgICAgICAifVxuIjsKLSAgICB1bnNpZ25lZCBwcm9ncmFt
ID0gbG9hZFByb2dyYW0oY29udGV4dCwgdmVydGV4U2hhZGVyU291cmNlLCBmcmFnbWVudFNoYWRl
clNvdXJjZSk7CisgICAgdW5zaWduZWQgcHJvZ3JhbSA9IGxvYWRQcm9ncmFtKGNvbnRleHQsCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlVmVydGV4KFNoYWRlcjo6
VHdvRGltZW5zaW9uYWwsIFNoYWRlcjo6VGV4dHVyZUZpbGwpLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBnZW5lcmF0ZUZyYWdtZW50KFNoYWRlcjo6VHdvRGltZW5zaW9uYWws
IFNoYWRlcjo6VGV4dHVyZUZpbGwsIFNoYWRlcjo6Tm90QW50aWFsaWFzZWQpKTsKICAgICBpZiAo
IXByb2dyYW0pCiAgICAgICAgIHJldHVybiAwOwogICAgIHJldHVybiBuZXcgVGV4U2hhZGVyKGNv
bnRleHQsIHByb2dyYW0pOwo=
</data>
<flag name="review"
          id="72897"
          type_id="1"
          status="+"
          setter="jamesr"
    />
    <flag name="commit-queue"
          id="72898"
          type_id="3"
          status="-"
          setter="kbr"
    />
          </attachment>
      

    </bug>

</bugzilla>