<?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>67418</bug_id>
          
          <creation_ts>2011-09-01 10:24:42 -0700</creation_ts>
          <short_desc>[chromium] Fix CCLayerTreeHostTest</short_desc>
          <delta_ts>2011-09-16 13:39:40 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebCore Misc.</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          <dependson>68271</dependson>
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Nat Duca">nduca</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>husky</cc>
    
    <cc>jamesr</cc>
    
    <cc>levin</cc>
    
    <cc>shawnsingh</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>460571</commentid>
    <comment_count>0</comment_count>
    <who name="Nat Duca">nduca</who>
    <bug_when>2011-09-01 10:24:42 -0700</bug_when>
    <thetext>CCLayerTreeHosttest exists but doesn&apos;t run</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>460915</commentid>
    <comment_count>1</comment_count>
    <who name="Nat Duca">nduca</who>
    <bug_when>2011-09-01 16:42:28 -0700</bug_when>
    <thetext>In retrospect, maybe we should fix the test first, then make any overhaul changes. :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>464137</commentid>
    <comment_count>2</comment_count>
      <attachid>106759</attachid>
    <who name="Iain Merrick">husky</who>
    <bug_when>2011-09-08 10:31:59 -0700</bug_when>
    <thetext>Created attachment 106759
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>464139</commentid>
    <comment_count>3</comment_count>
    <who name="Iain Merrick">husky</who>
    <bug_when>2011-09-08 10:32:42 -0700</bug_when>
    <thetext>Hacky patch that gets the test passing. I&apos;ll upload a tidier version ASAP.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>464166</commentid>
    <comment_count>4</comment_count>
      <attachid>106759</attachid>
    <who name="Iain Merrick">husky</who>
    <bug_when>2011-09-08 10:55:59 -0700</bug_when>
    <thetext>Comment on attachment 106759
Patch

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

&gt; Source/WebCore/platform/graphics/chromium/ContentLayerChromium.cpp:123
&gt; +#if !USE(THREADED_COMPOSITING)

This was needed because LayerTextureUpdaterSkPicture isn&apos;t compiled in -- similar #ifndef in LayerTextureUpdaterCanvas.cpp.

&gt; Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHost.cpp:43
&gt; +PassOwnPtr&lt;CCLayerTreeHostImpl&gt; CCLayerTreeHostClient::createLayerTreeHostImpl(const CCSettings&amp; settings)

Needed for the test to make its own HostImpl subclass.

&gt; Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHost.cpp:102
&gt; +void CCLayerTreeHost::stop()

Needed this for a clean shutdown in the test:

- layerTreeHost-&gt;stop()
- RunAllPendingMessages()
- delete layerTreeHost

&gt; Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHost.cpp:124
&gt; +    TextureManager* textureManager = contentsTextureManager();

Needed because we don&apos;t currently create a TextureManager (should be fixable)

&gt; Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHost.cpp:206
&gt; +        m_proxy-&gt;setNeedsCommitAndRedraw();

Again, needed for clean test shutdown. If stop() was called, m_proxy is null.

&gt; Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHost.h:67
&gt; +class CCLayerTreeHostClient {

Moved down because it now depends on CCSettings.

&gt; Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostImpl.h:52
&gt; +    virtual void drawLayers();

Made this virtual so I can detect calls in the test.

&gt; Source/WebCore/platform/graphics/chromium/cc/CCThreadProxy.cpp:184
&gt; +    postBeginFrameToMainThread();

Cheesy implementation of the FIXME. Should use CCMainThread.

&gt; Source/WebKit/chromium/src/GraphicsContext3DChromium.cpp:189
&gt; +    if (!m_compositingLayer)

Lazy init so that  WebGLLayerChromium is created on the correct thread.

&gt; Source/WebKit/chromium/src/GraphicsContext3DPrivate.h:317
&gt; +    mutable RefPtr&lt;WebGLLayerChromium&gt; m_compositingLayer;

Blah, lazy initialization method is const!

&gt; Source/WebKit/chromium/tests/CCLayerTreeHostTest.cpp:32
&gt; +#include &lt;wtf/HashTraits.h&gt;

Had to #include these directly as there&apos;s some weird problem with the header order in GraphicsContext3DPrivate.h. It ends up including StringHash.h first, which breaks the HashTraits&lt;String&gt; template.

&gt; Source/WebKit/chromium/tests/CCLayerTreeHostTest.cpp:83
&gt; +    virtual void drawLayersOnCCThread(MockLayerTreeHostImpl* layerTreeHostImpl) { }

drawLayers() and present() now seem to be separate methods, let&apos;s ignore present() for now.

&gt; Source/WebKit/chromium/tests/CCLayerTreeHostTest.cpp:90
&gt; +        callOnMainThread(CCLayerTreeHostTest::dispatchSetNeedsCommit, this);

Should use CCMainThread

&gt; Source/WebKit/chromium/tests/CCLayerTreeHostTest.cpp:180
&gt; +    virtual bool makeContextCurrent() { return true; }

These are the methods that the CC tree checks when setting up.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>464216</commentid>
    <comment_count>5</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-09-08 11:48:28 -0700</bug_when>
    <thetext>Attachment 106759 did not pass style-queue:

Failed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;Source/WebCore/ChangeLog&apos;, u&apos;Source/WebCor...&quot; exit_code: 1

Source/WebKit/chromium/tests/CCLayerTreeHostTest.cpp:34:  Alphabetical sorting problem.  [build/include_order] [4]
Source/WebKit/chromium/tests/CCLayerTreeHostTest.cpp:36:  Alphabetical sorting problem.  [build/include_order] [4]
Total errors found: 2 in 11 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>464268</commentid>
    <comment_count>6</comment_count>
      <attachid>106759</attachid>
    <who name="Nat Duca">nduca</who>
    <bug_when>2011-09-08 12:49:28 -0700</bug_when>
    <thetext>Comment on attachment 106759
Patch

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

Let me prefix the following comments with a big sign saying &quot;I suck, this is all my fault, not yours.&quot; Moreover, my comments below might be better treated as a series of followon patches to this patch, but one that we should probably do above any other efforts to expand the test coverage.

One big problem with this test is that the actual TEST_ cases only test the proxy, but it instantiates the entire CClayerTreeHost and CCLayerTreeHostImpl universe in order to do so. Moreover, what call mocks aren&apos;t really that --- for example, we mock CCLayerTreeHost not really because we need its implementation, but rather because we need to hook CCProxy&apos;s calls to the host. So, our mock classes are more like wrappers or shims.

I propose we fix this, first by renaming this file to CCProxyTest. And then, by doing proper mock testing by making pure-virtual base classes for LTH and LTHI, e.g. CCLayerTreeHostBase, CCLayerTreeHostImplBase. Then, modify all the appropriate CCProxy subclasses to use only these base classes.

With that, we can actually make MockLayerTreeHost and MockLayerTreeHostImpl classes true mocks (rather than being wrappers now. This allows us to test the proxy in isolation of the rest of the system. I think this is a good thing...

A lot of the MockLayerTreeHostClient is still useful --- we need a real test of the CCLayerTreeHost and for that we will need a MockLayerTreeHostClient. So, lets take that code and put it in the CCLayerTreeHostTest.cpp file [after moving the existing file to CCProxyTest].

Similarly, we need a CCLayerTreeHostImplTest. The MockGraphicsContext stuff you have done to get the CCLayerTreeImpl going is key for that test, so lets move that to a CCLayerTreeHostImplTest.cpp.

Thoughts?

&gt; Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHost.cpp:103
&gt; +{

Didn&apos;t CCLayerTreeHost already have a stop method? I might be getting my patches confused at this point...

&gt;&gt; Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHost.cpp:124
&gt;&gt; +    TextureManager* textureManager = contentsTextureManager();
&gt; 
&gt; Needed because we don&apos;t currently create a TextureManager (should be fixable)

This is getting cleaned up by jamesr, https://bugs.webkit.org/show_bug.cgi?id=67440

&gt;&gt; Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHost.cpp:206
&gt;&gt; +        m_proxy-&gt;setNeedsCommitAndRedraw();
&gt; 
&gt; Again, needed for clean test shutdown. If stop() was called, m_proxy is null.

I actually think this should be a ASSERT(m_proxy) and whoever was calling setNeedsCommit should be more careful.

&gt; Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHost.cpp:216
&gt; +    if (m_proxy)

Same comment as above.

&gt;&gt; Source/WebCore/platform/graphics/chromium/cc/CCThreadProxy.cpp:184
&gt;&gt; +    postBeginFrameToMainThread();
&gt; 
&gt; Cheesy implementation of the FIXME. Should use CCMainThread.

I think I can land my CCThreadProxy changes. That way you don&apos;t have to change this file, I hope.

&gt; Source/WebKit/chromium/src/GraphicsContext3DChromium.cpp:188
&gt; +#if USE(ACCELERATED_COMPOSITING)

Oh, ahha, this is actually safe you probably dont need to do this.

WebGL contexs get their own GraphicsContext3D --- totally separate from the context from the compositor&apos;s graphicscontext. A compositor context will never call this method... (though you could put an ASSERT(isMainThread()) if you want to be safe.

&gt;&gt; Source/WebKit/chromium/src/GraphicsContext3DPrivate.h:317

&gt; 
&gt; Blah, lazy initialization method is const!

Probably dont need this once you get rid of the lazy init guard.

&gt;&gt; Source/WebKit/chromium/tests/CCLayerTreeHostTest.cpp:32
&gt;&gt; +#include &lt;wtf/HashTraits.h&gt;
&gt; 
&gt; Had to #include these directly as there&apos;s some weird problem with the header order in GraphicsContext3DPrivate.h. It ends up including StringHash.h first, which breaks the HashTraits&lt;String&gt; template.

Can we fix that GraphicsContext3DPrivate header? I dont think we can commit this.

&gt; Source/WebKit/chromium/tests/CCLayerTreeHostTest.cpp:123
&gt; +      CCLayerTreeHostTest* test = static_cast&lt;CCLayerTreeHostTest*&gt;(self);

Guard against stop() here so you dont have to make m_layerTreeHost-&gt;setNeedsCommitAndRedraw to be safely callable after stop()?

&gt; Source/WebKit/chromium/tests/CCLayerTreeHostTest.cpp:132
&gt; +      CCLayerTreeHostTest* test = static_cast&lt;CCLayerTreeHostTest*&gt;(self);

Guard against stop() here...

&gt;&gt; Source/WebKit/chromium/tests/CCLayerTreeHostTest.cpp:180
&gt;&gt; +    virtual bool makeContextCurrent() { return true; }
&gt; 
&gt; These are the methods that the CC tree checks when setting up.

We&apos;re going to use this class a LOT of future tests.

MyMockContext-&gt;MockGraphicsContextForLayerRenderer or something inane like that and pull it out to a standalone .h?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>467158</commentid>
    <comment_count>7</comment_count>
    <who name="Iain Merrick">husky</who>
    <bug_when>2011-09-14 11:12:45 -0700</bug_when>
    <thetext>Sorry, I let this slide while working on other stuff. https://bugs.webkit.org/show_bug.cgi?id=67440 has landed so I&apos;ll refresh this patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>467786</commentid>
    <comment_count>8</comment_count>
      <attachid>107493</attachid>
    <who name="Iain Merrick">husky</who>
    <bug_when>2011-09-15 07:26:27 -0700</bug_when>
    <thetext>Created attachment 107493
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>468023</commentid>
    <comment_count>9</comment_count>
      <attachid>107493</attachid>
    <who name="James Robinson">jamesr</who>
    <bug_when>2011-09-15 13:05:21 -0700</bug_when>
    <thetext>Comment on attachment 107493
Patch

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

Some issues, but I think we&apos;re getting there.

&gt; Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHost.cpp:45
&gt; +PassOwnPtr&lt;CCLayerTreeHostImpl&gt; CCLayerTreeHostClient::createLayerTreeHostImpl(const CCSettings&amp; settings)
&gt; +{
&gt; +    return CCLayerTreeHostImpl::create(settings);
&gt; +}

instead of going through the client to create the impl, I think you should just make createLayerTreeHostImpl() virtual and override it in the test

&gt; Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHost.h:70
&gt; +    virtual PassOwnPtr&lt;CCLayerTreeHostImpl&gt; createLayerTreeHostImpl(const CCSettings&amp;);

this is wrong.  The client (person who&apos;s using CCLayerTreeHost) should have no knowledge of *Impl stuff

&gt; Source/WebCore/platform/graphics/chromium/cc/CCThreadProxy.cpp:189
&gt; +    // TEMP HACK so we can exercise this code in unit tests.
&gt; +    CCMainThread::postTask(createMainThreadTask(this, &amp;CCThreadProxy::beginFrameAndCommit, 0.0));

I don&apos;t think you want to land these

&gt; Source/WebCore/platform/graphics/chromium/cc/CCThreadProxy.cpp:250
&gt; +    // TEMP HACK so we can exercise this code in unit tests.
&gt; +    CCMainThread::postTask(createMainThreadTask(this, &amp;CCThreadProxy::beginFrameAndCommit, 0.0));

Same here, don&apos;t think you want to land

&gt; Source/WebCore/platform/graphics/chromium/cc/CCThreadProxy.cpp:257
&gt; +    // TEMP HACK so we can exercise this code in unit tests.
&gt; +    drawLayersOnCCThread();

Don&apos;t land

&gt; Source/WebKit/chromium/ChangeLog:21
&gt; +        (WTF::CCLayerTreeHostTest::beginCommitOnMainThread):
&gt; +        (WTF::CCLayerTreeHostTest::drawLayersOnCCThread):

is the script confused?  These aren&apos;t really in the WTF namespace, are they? They probably should be in the WebCore namespace.

&gt; Source/WebKit/chromium/src/GraphicsContext3DChromium.cpp:-104
&gt; -#if USE(ACCELERATED_COMPOSITING)
&gt; -    m_compositingLayer = WebGLLayerChromium::create(0);
&gt; -#endif

Why are you moving this? (I don&apos;t think it&apos;s necessarily a bad thing to do, but I don&apos;t understand how it relates to the rest of this patch)

&gt; Source/WebKit/chromium/src/GraphicsContext3DPrivate.h:328
&gt; +    mutable RefPtr&lt;WebGLLayerChromium&gt; m_compositingLayer;

instead of making this mutable, can you make ::platformLayer() be non-const?

&gt; Source/WebKit/chromium/tests/CCLayerTreeHostTest.cpp:29
&gt;  #include &quot;cc/CCLayerTreeHost.h&quot;

i think this #include should be sorted in the normal order with everything else

&gt; Source/WebKit/chromium/tests/CCLayerTreeHostTest.cpp:79
&gt;      virtual void animateAndLayout(MockLayerTreeHostClient* layerTreeHost, double frameBeginTime) { }
&gt;      virtual void beginCommitOnCCThread(MockLayerTreeHostImpl* layerTreeHostImpl) { }
&gt;      virtual void beginCommitOnMainThread(MockLayerTreeHost* layerTreeHost) { }

looks like we don&apos;t have any implementations of this that do anything. Do we plan to grow some?

For now, since the impl doesn&apos;t use the params don&apos;t name them.

This class has a protected RefPtr&lt;MockLayerTreeHost&gt; member, so I don&apos;t understand why we would want to pass a MockLayerTreeHost* to member functions. Passing the impl* seems like it could make sense sometimes.

&gt; Source/WebKit/chromium/tests/CCLayerTreeHostTest.cpp:80
&gt;      virtual void commitCompleteOnCCThread(MockLayerTreeHostImpl* layerTreeHostImpl) { }

why does this function take a layerTreeHostImpl* ? I don&apos;t think any implementations actually use the parameter

&gt; Source/WebKit/chromium/tests/CCLayerTreeHostTest.cpp:81
&gt;      virtual void commitCompleteOnMainThread(MockLayerTreeHost* layerTreeHost) { }

passing the MockLayerTreeHost* makes no sense

&gt; Source/WebKit/chromium/tests/CCLayerTreeHostTest.cpp:83
&gt;      virtual void updateLayers(MockLayerTreeHost* layerTreeHost) { }

passing the MockLayerTreeHost* makes no sense

&gt; Source/WebKit/chromium/tests/CCLayerTreeHostTest.cpp:176
&gt; +class MyMockContext : public MockWebGraphicsContext3D {

This isn&apos;t a good class name. it looks like this is a MockWebGraphicsContext3D that&apos;s used for compositor tests, so maybe something like CompositorMockWebGraphicsContext3D?

&gt; Source/WebKit/chromium/tests/CCLayerTreeHostTest.cpp:181
&gt; +    virtual void getShaderiv(WebGLId shader, WGC3Denum pname, WGC3Dint* value)

don&apos;t provide names for the parameters that are not used in the function or you will run in to unused variable warnings. IOW write this definition as:

virtual void getShaderiv(WebGLId, WGC3Denum, WGC3Dint* value)

&gt; Source/WebKit/chromium/tests/CCLayerTreeHostTest.cpp:185
&gt; +    virtual void getProgramiv(WebGLId program, WGC3Denum pname, WGC3Dint* value)

same here

&gt; Source/WebKit/chromium/tests/CCLayerTreeHostTest.cpp:228
&gt; +    MockLayerTreeHostClient(CCLayerTreeHostTest* test) : m_test(test) { }

explicit. Why doesn&apos;t this class have a static public PassOwnPtr&lt;&gt; create() function and a private c&apos;tor, like we normally do?

&gt; Source/WebKit/chromium/tests/CCLayerTreeHostTest.cpp:258
&gt; +    virtual void didRecreateGraphicsContext(bool success)

don&apos;t name the param if you aren&apos;t using it in the body (you can name it in a comment if you like)

&gt; Source/WebKit/chromium/tests/CCLayerTreeHostTest.cpp:426
&gt; +    virtual void commitCompleteOnCCThread(MockLayerTreeHostImpl* impl)

don&apos;t name param

&gt; Source/WebKit/chromium/tests/CCLayerTreeHostTest.cpp:469
&gt; +    virtual void commitCompleteOnCCThread(MockLayerTreeHostImpl* impl)

don&apos;t name this param

&gt; Source/WebKit/chromium/tests/CCLayerTreeHostTest.cpp:508
&gt; +            postSetNeedsRedrawToMainThread(); // redraw again to verify that the second redraw doesnt commit.

please capitalize the start of this sentence

doesnt -&gt; doesn&apos;t

&gt; Source/WebKit/chromium/tests/CCLayerTreeHostTest.cpp:514
&gt; +    virtual void commitCompleteOnCCThread(MockLayerTreeHostImpl* impl)

don&apos;t name param</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>468412</commentid>
    <comment_count>10</comment_count>
      <attachid>107493</attachid>
    <who name="Iain Merrick">husky</who>
    <bug_when>2011-09-16 04:07:48 -0700</bug_when>
    <thetext>Comment on attachment 107493
Patch

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

&gt;&gt; Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHost.cpp:45
&gt;&gt; +}
&gt; 
&gt; instead of going through the client to create the impl, I think you should just make createLayerTreeHostImpl() virtual and override it in the test

Good call, that makes much more sense. Done. (That involved moving some classes around in CCLayerTreeHostTest.cpp, because the forward declarations were getting out of hand, but I think it&apos;s an improvement.)

I hadn&apos;t realised that CCProxy calls this method. This ties pretty nicely into extracting a pure virtual interface for the CCProxy -&gt; CCLayerTreeHost calls.

&gt;&gt; Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHost.h:70
&gt;&gt; +    virtual PassOwnPtr&lt;CCLayerTreeHostImpl&gt; createLayerTreeHostImpl(const CCSettings&amp;);
&gt; 
&gt; this is wrong.  The client (person who&apos;s using CCLayerTreeHost) should have no knowledge of *Impl stuff

Removed.

&gt;&gt; Source/WebCore/platform/graphics/chromium/cc/CCThreadProxy.cpp:189
&gt;&gt; +    CCMainThread::postTask(createMainThreadTask(this, &amp;CCThreadProxy::beginFrameAndCommit, 0.0));
&gt; 
&gt; I don&apos;t think you want to land these

Well, I need something other than ASSERT_NOT_REACHED! I guess there&apos;s another patch I&apos;m waiting on?

&gt;&gt; Source/WebKit/chromium/ChangeLog:21
&gt;&gt; +        (WTF::CCLayerTreeHostTest::drawLayersOnCCThread):
&gt; 
&gt; is the script confused?  These aren&apos;t really in the WTF namespace, are they? They probably should be in the WebCore namespace.

Good question. The test code is actually in an anonymous namespace, which seems right. Do all these methods really need to be listed in the ChangeLog? They aren&apos;t public APIs.

The test source is in WebKit/chromium/tests. Should it be in WebCore instead? That would be a much bigger change as there isn&apos;t any existing unit test stuff in WebCore. I&apos;d definitely be in favour of that, but maybe not in this patch. :)

&gt;&gt; Source/WebKit/chromium/src/GraphicsContext3DChromium.cpp:-104
&gt;&gt; -#endif
&gt; 
&gt; Why are you moving this? (I don&apos;t think it&apos;s necessarily a bad thing to do, but I don&apos;t understand how it relates to the rest of this patch)

This is only needed when the graphics context is being created for use on another thread.

Without this, WebGLLayerChromium is created on the main thread and destroyed on the CC thread. It contains a Timer member variable, and Timer has asserts against multithreaded usage.

I did it this way to limit that unusual create-on-one-thread, destroy-on-another behaviour to GraphicsContext3D.

Alternative ways to fix it:
- Lazy initialize the Timer instead
- Make the asserts in Timer less strict (risky, affects other code)

But both of those mean running more constructors/destructors with those unusual semantics.

What do you think?

&gt;&gt; Source/WebKit/chromium/src/GraphicsContext3DPrivate.h:328
&gt;&gt; +    mutable RefPtr&lt;WebGLLayerChromium&gt; m_compositingLayer;
&gt; 
&gt; instead of making this mutable, can you make ::platformLayer() be non-const?

Yep, done.

&gt; Source/WebKit/chromium/tests/CCLayerTreeHostTest.cpp:31
&gt; +#include &quot;CCThreadImpl.h&quot;

Huh, code review tool is somehow confused by those comments and won&apos;t let me reply directly.

#include ordering fixed, unused virtual methods and parameters deleted.

&gt;&gt; Source/WebKit/chromium/tests/CCLayerTreeHostTest.cpp:176
&gt;&gt; +class MyMockContext : public MockWebGraphicsContext3D {
&gt; 
&gt; This isn&apos;t a good class name. it looks like this is a MockWebGraphicsContext3D that&apos;s used for compositor tests, so maybe something like CompositorMockWebGraphicsContext3D?

As Nat says elsewhere, &quot;mock&quot; is actually not a great name for the base class. But I&apos;ll stick with that for the purposes of this patch.

CompositorMock is good, I&apos;ll use that (and maybe rename to CompositorStub later).

&gt;&gt; Source/WebKit/chromium/tests/CCLayerTreeHostTest.cpp:181

&gt; 
&gt; don&apos;t provide names for the parameters that are not used in the function or you will run in to unused variable warnings. IOW write this definition as:
&gt; 
&gt; virtual void getShaderiv(WebGLId, WGC3Denum, WGC3Dint* value)

Done

&gt;&gt; Source/WebKit/chromium/tests/CCLayerTreeHostTest.cpp:185
&gt;&gt; +    virtual void getProgramiv(WebGLId program, WGC3Denum pname, WGC3Dint* value)
&gt; 
&gt; same here

Done

&gt;&gt; Source/WebKit/chromium/tests/CCLayerTreeHostTest.cpp:228
&gt;&gt; +    MockLayerTreeHostClient(CCLayerTreeHostTest* test) : m_test(test) { }
&gt; 
&gt; explicit. Why doesn&apos;t this class have a static public PassOwnPtr&lt;&gt; create() function and a private c&apos;tor, like we normally do?

Explicit added.

For the create() function, I&apos;m not sure what our guidelines are, but I think it probably isn&apos;t beneficial here. This is a private class used only in this test; and if we were to move it into its own header for reuse in other tests, we&apos;d probably want to write subclasses rather than calling create().

&gt;&gt; Source/WebKit/chromium/tests/CCLayerTreeHostTest.cpp:258
&gt;&gt; +    virtual void didRecreateGraphicsContext(bool success)
&gt; 
&gt; don&apos;t name the param if you aren&apos;t using it in the body (you can name it in a comment if you like)

Fixed

&gt;&gt; Source/WebKit/chromium/tests/CCLayerTreeHostTest.cpp:426
&gt;&gt; +    virtual void commitCompleteOnCCThread(MockLayerTreeHostImpl* impl)
&gt; 
&gt; don&apos;t name param

Fixed

&gt;&gt; Source/WebKit/chromium/tests/CCLayerTreeHostTest.cpp:469
&gt;&gt; +    virtual void commitCompleteOnCCThread(MockLayerTreeHostImpl* impl)
&gt; 
&gt; don&apos;t name this param

Fixed

&gt;&gt; Source/WebKit/chromium/tests/CCLayerTreeHostTest.cpp:508
&gt;&gt; +            postSetNeedsRedrawToMainThread(); // redraw again to verify that the second redraw doesnt commit.
&gt; 
&gt; please capitalize the start of this sentence
&gt; 
&gt; doesnt -&gt; doesn&apos;t

Fixed</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>468414</commentid>
    <comment_count>11</comment_count>
      <attachid>107632</attachid>
    <who name="Iain Merrick">husky</who>
    <bug_when>2011-09-16 04:16:42 -0700</bug_when>
    <thetext>Created attachment 107632
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>468415</commentid>
    <comment_count>12</comment_count>
      <attachid>107632</attachid>
    <who name="Iain Merrick">husky</who>
    <bug_when>2011-09-16 04:21:19 -0700</bug_when>
    <thetext>Comment on attachment 107632
Patch

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

&gt; Source/WebKit/chromium/ChangeLog:16
&gt; +        (WTF::TestHooks::beginCommitOnCCThread):

Re-ran the changelog generator but these are still broken.

Should I just delete lines 16-56? They&apos;re in an anonymous namespace, not WTF.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>468514</commentid>
    <comment_count>13</comment_count>
    <who name="Nat Duca">nduca</who>
    <bug_when>2011-09-16 08:53:56 -0700</bug_when>
    <thetext>Recapping from a conversation offline:
- Lets remove the GraphicsContext3DChromium change, thats another CL, I can do it if it prevents the CCThreadProxy code from running, otherwise you can do it next week sometime
- Fix up the changelogs manually
- Use the create() design pattern
- Wrt the &quot;I dont think you want to land these&quot; changes to CCThreadProxy, lets leave those changes in and get this landed. I can rebase my CCThreadProxy changes onto this since its AM here and PM for Iain</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>468537</commentid>
    <comment_count>14</comment_count>
      <attachid>107664</attachid>
    <who name="Iain Merrick">husky</who>
    <bug_when>2011-09-16 09:30:38 -0700</bug_when>
    <thetext>Created attachment 107664
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>468538</commentid>
    <comment_count>15</comment_count>
    <who name="Iain Merrick">husky</who>
    <bug_when>2011-09-16 09:31:24 -0700</bug_when>
    <thetext>New patch with Nat&apos;s requested changes.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>468666</commentid>
    <comment_count>16</comment_count>
      <attachid>107664</attachid>
    <who name="James Robinson">jamesr</who>
    <bug_when>2011-09-16 11:37:56 -0700</bug_when>
    <thetext>Comment on attachment 107664
Patch

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

Good start.  I have some nits, but I can fix those on landing.

&gt; Source/WebKit/chromium/tests/CCLayerTreeHostTest.cpp:220
&gt; +    void doEndTest()

This function seems unreachable

&gt; Source/WebKit/chromium/tests/CCLayerTreeHostTest.cpp:263
&gt; +            printf(&quot;Test timed out&quot;);
&gt; +            FAIL() &lt;&lt; &quot;Test timed out&quot;;

Very weird to printf() and FAIL().  The latter should produce valid output, no?

&gt; Source/WebKit/chromium/tests/CCLayerTreeHostTest.cpp:279
&gt; +    Mutex m_tracesLock;
&gt; +    Vector&lt;std::string&gt; m_traces;

We don&apos;t use std::string in WebKit code - we use WTF::String.  These seem completely unused, however.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>468669</commentid>
    <comment_count>17</comment_count>
    <who name="James Robinson">jamesr</who>
    <bug_when>2011-09-16 11:42:51 -0700</bug_when>
    <thetext>Committed r95309: &lt;http://trac.webkit.org/changeset/95309&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>468741</commentid>
    <comment_count>18</comment_count>
    <who name="David Levin">levin</who>
    <bug_when>2011-09-16 13:02:30 -0700</bug_when>
    <thetext>Had to roll this out.  Sorry.
This seemed to break 80+ gpu tests.

Here&apos;s a *small* sampling:  http://test-results.appspot.com/dashboards/flakiness_dashboard.html#tests=fast%2Fcanvas%2Fwebgl%2Fcanvas-test.html%2Cfast%2Fcanvas%2Fwebgl%2Fgl-pixelstorei.html%2Cfast%2Fcanvas%2Fwebgl%2Fgl-teximage.html&amp;group=%40ToT%20GPU%20Mesa%20-%20chromium.org</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>468749</commentid>
    <comment_count>19</comment_count>
    <who name="David Levin">levin</who>
    <bug_when>2011-09-16 13:10:40 -0700</bug_when>
    <thetext>Note that the failures didn&apos;t happen 100% of the time. But there were a lot of them across several bots when this landed.

And then in another run many passed. It was very odd. But the coincidence was too great to call it unrelated.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>468756</commentid>
    <comment_count>20</comment_count>
    <who name="James Robinson">jamesr</who>
    <bug_when>2011-09-16 13:19:57 -0700</bug_when>
    <thetext>Looking more closely we&apos;re pretty sure that http://src.chromium.org/viewvc/chrome?view=rev&amp;revision=101545 caused the test failures.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>468784</commentid>
    <comment_count>21</comment_count>
    <who name="James Robinson">jamesr</who>
    <bug_when>2011-09-16 13:39:40 -0700</bug_when>
    <thetext>Relanded http://trac.webkit.org/changeset/95320</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>106759</attachid>
            <date>2011-09-08 10:31:59 -0700</date>
            <delta_ts>2011-09-15 07:26:19 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-67418-20110908183157.patch</filename>
            <type>text/plain</type>
            <size>29274</size>
            <attacher name="Iain Merrick">husky</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDk0NzY1KQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMzQgQEAKKzIwMTEtMDktMDggIElhaW4gTWVy
cmljayAgPGh1c2t5QGdvb2dsZS5jb20+CisKKyAgICAgICAgW2Nocm9taXVtXSBGaXggQ0NMYXll
clRyZWVIb3N0VGVzdAorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5j
Z2k/aWQ9Njc0MTgKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAg
ICAgICBObyBuZXcgdGVzdHMuIChPT1BTISkKKworICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNz
L2Nocm9taXVtL0NvbnRlbnRMYXllckNocm9taXVtLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkNv
bnRlbnRMYXllckNocm9taXVtOjpjcmVhdGVUZXh0dXJlVXBkYXRlcik6CisgICAgICAgICogcGxh
dGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NMYXllclRyZWVIb3N0LmNwcDoKKyAgICAgICAg
KFdlYkNvcmU6OkNDTGF5ZXJUcmVlSG9zdENsaWVudDo6Y3JlYXRlTGF5ZXJUcmVlSG9zdEltcGwp
OgorICAgICAgICAoV2ViQ29yZTo6Q0NMYXllclRyZWVIb3N0Ojp+Q0NMYXllclRyZWVIb3N0KToK
KyAgICAgICAgKFdlYkNvcmU6OkNDTGF5ZXJUcmVlSG9zdDo6c3RvcCk6CisgICAgICAgIChXZWJD
b3JlOjpDQ0xheWVyVHJlZUhvc3Q6OmNvbW1pdFRvKToKKyAgICAgICAgKFdlYkNvcmU6OkNDTGF5
ZXJUcmVlSG9zdDo6Y3JlYXRlTGF5ZXJUcmVlSG9zdEltcGwpOgorICAgICAgICAoV2ViQ29yZTo6
Q0NMYXllclRyZWVIb3N0OjpzZXROZWVkc0NvbW1pdEFuZFJlZHJhdyk6CisgICAgICAgIChXZWJD
b3JlOjpDQ0xheWVyVHJlZUhvc3Q6OnNldE5lZWRzUmVkcmF3KToKKyAgICAgICAgKiBwbGF0Zm9y
bS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ0xheWVyVHJlZUhvc3QuaDoKKyAgICAgICAgKFdlYkNv
cmU6OkNDTGF5ZXJUcmVlSG9zdENsaWVudDo6fkNDTGF5ZXJUcmVlSG9zdENsaWVudCk6CisgICAg
ICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NMYXllclRyZWVIb3N0SW1wbC5o
OgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDVGhyZWFkUHJveHku
Y3BwOgorICAgICAgICAoV2ViQ29yZTo6Q0NUaHJlYWRQcm94eTo6Y29udGVudHNUZXh0dXJlTWFu
YWdlcik6CisgICAgICAgIChXZWJDb3JlOjpDQ1RocmVhZFByb3h5OjpiZWdpbkZyYW1lQW5kQ29t
bWl0T25DQ1RocmVhZCk6CisgICAgICAgIChXZWJDb3JlOjpDQ1RocmVhZFByb3h5OjpzZXROZWVk
c0NvbW1pdEFuZFJlZHJhd09uQ0NUaHJlYWQpOgorICAgICAgICAoV2ViQ29yZTo6Q0NUaHJlYWRQ
cm94eTo6c2V0TmVlZHNSZWRyYXdPbkNDVGhyZWFkKToKKyAgICAgICAgKFdlYkNvcmU6OkNDVGhy
ZWFkUHJveHk6OnBvc3RCZWdpbkZyYW1lVG9NYWluVGhyZWFkKToKKyAgICAgICAgKFdlYkNvcmU6
OkNDVGhyZWFkUHJveHk6OmRpc3BhdGNoQmVnaW5GcmFtZSk6CisgICAgICAgICogcGxhdGZvcm0v
Z3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NUaHJlYWRQcm94eS5oOgorCiAyMDExLTA5LTA3ICBQYXZl
bCBQb2Rpdmlsb3YgIDxwb2Rpdmlsb3ZAY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFdlYiBJbnNw
ZWN0b3I6IGdldCByaWQgb2YgUmF3U291cmNlQ29kZS5jcmVhdGVTb3VyY2VNYXBwaW5nSWZOZWVk
ZWQuCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9Db250
ZW50TGF5ZXJDaHJvbWl1bS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvY2hyb21pdW0vQ29udGVudExheWVyQ2hyb21pdW0uY3BwCShyZXZpc2lvbiA5
NDc2MikKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0NvbnRl
bnRMYXllckNocm9taXVtLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTIwLDYgKzEyMCw3IEBAIGJv
b2wgQ29udGVudExheWVyQ2hyb21pdW06OmRyYXdzQ29udGVudCgKIAogdm9pZCBDb250ZW50TGF5
ZXJDaHJvbWl1bTo6Y3JlYXRlVGV4dHVyZVVwZGF0ZXIoY29uc3QgQ0NMYXllclRyZWVIb3N0KiBo
b3N0KQogeworI2lmICFVU0UoVEhSRUFERURfQ09NUE9TSVRJTkcpCiAjaWYgVVNFKFNLSUEpCiAg
ICAgLy8gTm90ZSB0aGF0IGhvc3QtPnNraWFDb250ZXh0KCkgd2lsbCBjcmFzaCBpZiBjYWxsZWQg
d2hpbGUgaW4gdGhyZWFkZWQKICAgICAvLyBtb2RlLiBUaGlzIHRodXMgZGVwZW5kcyBvbiBDQ0xh
eWVyVHJlZUhvc3Q6OmluaXRpYWxpemUgdHVybmluZyBvZmYKQEAgLTEyOSw2ICsxMzAsNyBAQCB2
b2lkIENvbnRlbnRMYXllckNocm9taXVtOjpjcmVhdGVUZXh0dXJlCiAgICAgICAgIHJldHVybjsK
ICAgICB9CiAjZW5kaWYgLy8gU0tJQQorI2VuZGlmIC8vICFUSFJFQURFRF9DT01QT1NJVElORwog
CiAgICAgbV90ZXh0dXJlVXBkYXRlciA9IExheWVyVGV4dHVyZVVwZGF0ZXJCaXRtYXA6OmNyZWF0
ZShDb250ZW50TGF5ZXJQYWludGVyOjpjcmVhdGUobV9vd25lciksIGhvc3QtPmxheWVyUmVuZGVy
ZXJDYXBhYmlsaXRpZXMoKS51c2luZ01hcFN1Yik7CiB9CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ0xheWVyVHJlZUhvc3QuY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDTGF5
ZXJUcmVlSG9zdC5jcHAJKHJldmlzaW9uIDk0NzYyKQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NMYXllclRyZWVIb3N0LmNwcAkod29ya2luZyBjb3B5
KQpAQCAtNDAsNiArNDAsMTEgQEAKIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCitQYXNzT3duUHRy
PENDTGF5ZXJUcmVlSG9zdEltcGw+IENDTGF5ZXJUcmVlSG9zdENsaWVudDo6Y3JlYXRlTGF5ZXJU
cmVlSG9zdEltcGwoY29uc3QgQ0NTZXR0aW5ncyYgc2V0dGluZ3MpCit7CisgICAgcmV0dXJuIEND
TGF5ZXJUcmVlSG9zdEltcGw6OmNyZWF0ZShzZXR0aW5ncyk7Cit9CisKIFBhc3NSZWZQdHI8Q0NM
YXllclRyZWVIb3N0PiBDQ0xheWVyVHJlZUhvc3Q6OmNyZWF0ZShDQ0xheWVyVHJlZUhvc3RDbGll
bnQqIGNsaWVudCwgY29uc3QgQ0NTZXR0aW5ncyYgc2V0dGluZ3MpCiB7CiAgICAgUmVmUHRyPEND
TGF5ZXJUcmVlSG9zdD4gbGF5ZXJUcmVlSG9zdCA9IGFkb3B0UmVmKG5ldyBDQ0xheWVyVHJlZUhv
c3QoY2xpZW50LCBzZXR0aW5ncykpOwpAQCAtOTEsOCArOTYsMTYgQEAgYm9vbCBDQ0xheWVyVHJl
ZUhvc3Q6OmluaXRpYWxpemUoKQogQ0NMYXllclRyZWVIb3N0Ojp+Q0NMYXllclRyZWVIb3N0KCkK
IHsKICAgICBUUkFDRV9FVkVOVCgiQ0NMYXllclRyZWVIb3N0Ojp+Q0NMYXllclRyZWVIb3N0Iiwg
dGhpcywgMCk7Ci0gICAgbV9wcm94eS0+c3RvcCgpOwotICAgIG1fcHJveHkuY2xlYXIoKTsKKyAg
ICBzdG9wKCk7Cit9CisKK3ZvaWQgQ0NMYXllclRyZWVIb3N0OjpzdG9wKCkKK3sKKyAgICBpZiAo
bV9wcm94eSkgeworICAgICAgICBUUkFDRV9FVkVOVCgiQ0NMYXllclRyZWVIb3N0OjpzdG9wIiwg
dGhpcywgMCk7CisgICAgICAgIG1fcHJveHktPnN0b3AoKTsKKyAgICAgICAgbV9wcm94eS5jbGVh
cigpOworICAgIH0KIH0KIAogdm9pZCBDQ0xheWVyVHJlZUhvc3Q6OmFuaW1hdGVBbmRMYXlvdXQo
ZG91YmxlIGZyYW1lQmVnaW5UaW1lKQpAQCAtMTA4LDggKzEyMSwxMSBAQCB2b2lkIENDTGF5ZXJU
cmVlSG9zdDo6Y29tbWl0VG8oQ0NMYXllclRyCiAgICAgVFJBQ0VfRVZFTlQoIkNDTGF5ZXJUcmVl
SG9zdDo6Y29tbWl0VG8iLCB0aGlzLCAwKTsKICAgICBob3N0SW1wbC0+c2V0U291cmNlRnJhbWVO
dW1iZXIoZnJhbWVOdW1iZXIoKSk7CiAKLSAgICBjb250ZW50c1RleHR1cmVNYW5hZ2VyKCktPnJl
ZHVjZU1lbW9yeVRvTGltaXQoaG9zdEltcGwtPmxheWVyUmVuZGVyZXIoKS0+dGV4dHVyZU1lbW9y
eVJlY2xhaW1MaW1pdCgpKTsKLSAgICBjb250ZW50c1RleHR1cmVNYW5hZ2VyKCktPmRlbGV0ZUV2
aWN0ZWRUZXh0dXJlcyhob3N0SW1wbC0+Y29udGV4dCgpKTsKKyAgICBUZXh0dXJlTWFuYWdlciog
dGV4dHVyZU1hbmFnZXIgPSBjb250ZW50c1RleHR1cmVNYW5hZ2VyKCk7CisgICAgaWYgKHRleHR1
cmVNYW5hZ2VyKSB7CisgICAgICAgIHRleHR1cmVNYW5hZ2VyLT5yZWR1Y2VNZW1vcnlUb0xpbWl0
KGhvc3RJbXBsLT5sYXllclJlbmRlcmVyKCktPnRleHR1cmVNZW1vcnlSZWNsYWltTGltaXQoKSk7
CisgICAgICAgIHRleHR1cmVNYW5hZ2VyLT5kZWxldGVFdmljdGVkVGV4dHVyZXMoaG9zdEltcGwt
PmNvbnRleHQoKSk7CisgICAgfQogCiAgICAgdXBkYXRlQ29tcG9zaXRvclJlc291cmNlcyhtX3Vw
ZGF0ZUxpc3QsIGhvc3RJbXBsLT5jb250ZXh0KCkpOwogICAgIG1fdXBkYXRlTGlzdC5jbGVhcigp
OwpAQCAtMTM4LDcgKzE1NCw3IEBAIFBhc3NSZWZQdHI8R3JhcGhpY3NDb250ZXh0M0Q+IENDTGF5
ZXJUcmUKIAogUGFzc093blB0cjxDQ0xheWVyVHJlZUhvc3RJbXBsPiBDQ0xheWVyVHJlZUhvc3Q6
OmNyZWF0ZUxheWVyVHJlZUhvc3RJbXBsKCkKIHsKLSAgICByZXR1cm4gQ0NMYXllclRyZWVIb3N0
SW1wbDo6Y3JlYXRlKG1fc2V0dGluZ3MpOworICAgIHJldHVybiBtX2NsaWVudC0+Y3JlYXRlTGF5
ZXJUcmVlSG9zdEltcGwobV9zZXR0aW5ncyk7CiB9CiAKIHZvaWQgQ0NMYXllclRyZWVIb3N0Ojpk
aWRSZWNyZWF0ZUdyYXBoaWNzQ29udGV4dChib29sIHN1Y2Nlc3MpCkBAIC0xODYsNyArMjAyLDgg
QEAgdm9pZCBDQ0xheWVyVHJlZUhvc3Q6OnNldE5lZWRzQ29tbWl0QW5kUgogewogI2lmIFVTRShU
SFJFQURFRF9DT01QT1NJVElORykKICAgICBUUkFDRV9FVkVOVCgiQ0NMYXllclRyZWVIb3N0Ojpz
ZXROZWVkc1JlZHJhdyIsIHRoaXMsIDApOwotICAgIG1fcHJveHktPnNldE5lZWRzQ29tbWl0QW5k
UmVkcmF3KCk7CisgICAgaWYgKG1fcHJveHkpCisgICAgICAgIG1fcHJveHktPnNldE5lZWRzQ29t
bWl0QW5kUmVkcmF3KCk7CiAjZWxzZQogICAgIG1fY2xpZW50LT5zY2hlZHVsZUNvbXBvc2l0ZSgp
OwogI2VuZGlmCkBAIC0xOTYsNyArMjEzLDggQEAgdm9pZCBDQ0xheWVyVHJlZUhvc3Q6OnNldE5l
ZWRzUmVkcmF3KCkKIHsKICNpZiBVU0UoVEhSRUFERURfQ09NUE9TSVRJTkcpCiAgICAgVFJBQ0Vf
RVZFTlQoIkNDTGF5ZXJUcmVlSG9zdDo6c2V0TmVlZHNSZWRyYXciLCB0aGlzLCAwKTsKLSAgICBt
X3Byb3h5LT5zZXROZWVkc1JlZHJhdygpOworICAgIGlmIChtX3Byb3h5KQorICAgICAgICBtX3By
b3h5LT5zZXROZWVkc1JlZHJhdygpOwogI2Vsc2UKICAgICBtX2NsaWVudC0+c2NoZWR1bGVDb21w
b3NpdGUoKTsKICNlbmRpZgpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
Y2hyb21pdW0vY2MvQ0NMYXllclRyZWVIb3N0LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NMYXllclRyZWVIb3N0LmgJKHJldmlz
aW9uIDk0NzYyKQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0v
Y2MvQ0NMYXllclRyZWVIb3N0LmgJKHdvcmtpbmcgY29weSkKQEAgLTQ5LDIwICs0OSw2IEBAIGNs
YXNzIEdyYXBoaWNzTGF5ZXI7CiBjbGFzcyBOb25Db21wb3NpdGVkQ29udGVudEhvc3Q7CiBjbGFz
cyBUZXh0dXJlTWFuYWdlcjsKIAotY2xhc3MgQ0NMYXllclRyZWVIb3N0Q2xpZW50IHsKLXB1Ymxp
YzoKLSAgICB2aXJ0dWFsIHZvaWQgYW5pbWF0ZUFuZExheW91dChkb3VibGUgZnJhbWVCZWdpblRp
bWUpID0gMDsKLSAgICB2aXJ0dWFsIFBhc3NPd25QdHI8Q0NUaHJlYWQ+IGNyZWF0ZUNvbXBvc2l0
b3JUaHJlYWQoKSA9IDA7Ci0gICAgdmlydHVhbCBQYXNzUmVmUHRyPEdyYXBoaWNzQ29udGV4dDNE
PiBjcmVhdGVMYXllclRyZWVIb3N0Q29udGV4dDNEKCkgPSAwOwotICAgIHZpcnR1YWwgUGFzc093
blB0cjxMYXllclBhaW50ZXJDaHJvbWl1bT4gY3JlYXRlUm9vdExheWVyUGFpbnRlcigpID0gMDsK
LSAgICB2aXJ0dWFsIHZvaWQgZGlkUmVjcmVhdGVHcmFwaGljc0NvbnRleHQoYm9vbCBzdWNjZXNz
KSA9IDA7Ci0jaWYgIVVTRShUSFJFQURFRF9DT01QT1NJVElORykKLSAgICB2aXJ0dWFsIHZvaWQg
c2NoZWR1bGVDb21wb3NpdGUoKSA9IDA7Ci0jZW5kaWYKLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFs
IH5DQ0xheWVyVHJlZUhvc3RDbGllbnQoKSB7IH0KLX07Ci0KIHN0cnVjdCBDQ1NldHRpbmdzIHsK
ICAgICBDQ1NldHRpbmdzKCkKICAgICAgICAgICAgIDogYWNjZWxlcmF0ZVBhaW50aW5nKGZhbHNl
KQpAQCAtNzgsNiArNjQsMjEgQEAgc3RydWN0IENDU2V0dGluZ3MgewogICAgIGJvb2wgc2hvd1Bs
YXRmb3JtTGF5ZXJUcmVlOwogfTsKIAorY2xhc3MgQ0NMYXllclRyZWVIb3N0Q2xpZW50IHsKK3B1
YmxpYzoKKyAgICB2aXJ0dWFsIHZvaWQgYW5pbWF0ZUFuZExheW91dChkb3VibGUgZnJhbWVCZWdp
blRpbWUpID0gMDsKKyAgICB2aXJ0dWFsIFBhc3NPd25QdHI8Q0NUaHJlYWQ+IGNyZWF0ZUNvbXBv
c2l0b3JUaHJlYWQoKSA9IDA7CisgICAgdmlydHVhbCBQYXNzUmVmUHRyPEdyYXBoaWNzQ29udGV4
dDNEPiBjcmVhdGVMYXllclRyZWVIb3N0Q29udGV4dDNEKCkgPSAwOworICAgIHZpcnR1YWwgUGFz
c093blB0cjxMYXllclBhaW50ZXJDaHJvbWl1bT4gY3JlYXRlUm9vdExheWVyUGFpbnRlcigpID0g
MDsKKyAgICB2aXJ0dWFsIFBhc3NPd25QdHI8Q0NMYXllclRyZWVIb3N0SW1wbD4gY3JlYXRlTGF5
ZXJUcmVlSG9zdEltcGwoY29uc3QgQ0NTZXR0aW5ncyYpOworICAgIHZpcnR1YWwgdm9pZCBkaWRS
ZWNyZWF0ZUdyYXBoaWNzQ29udGV4dChib29sIHN1Y2Nlc3MpID0gMDsKKyNpZiAhVVNFKFRIUkVB
REVEX0NPTVBPU0lUSU5HKQorICAgIHZpcnR1YWwgdm9pZCBzY2hlZHVsZUNvbXBvc2l0ZSgpID0g
MDsKKyNlbmRpZgorcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkNDTGF5ZXJUcmVlSG9zdENsaWVu
dCgpIHsgfQorfTsKKwogLy8gUHJvdmlkZXMgaW5mb3JtYXRpb24gb24gYW4gSW1wbCdzIHJlbmRl
cmluZyBjYXBhYmlsaXRpZXMgYmFjayB0byB0aGUgQ0NMYXllclRyZWVIb3N0CiBzdHJ1Y3QgTGF5
ZXJSZW5kZXJlckNhcGFiaWxpdGllcyB7CiAgICAgTGF5ZXJSZW5kZXJlckNhcGFiaWxpdGllcygp
CkBAIC05Niw2ICs5Nyw3IEBAIGNsYXNzIENDTGF5ZXJUcmVlSG9zdCA6IHB1YmxpYyBSZWZDb3Vu
dGUKIHB1YmxpYzoKICAgICBzdGF0aWMgUGFzc1JlZlB0cjxDQ0xheWVyVHJlZUhvc3Q+IGNyZWF0
ZShDQ0xheWVyVHJlZUhvc3RDbGllbnQqLCBjb25zdCBDQ1NldHRpbmdzJik7CiAgICAgdmlydHVh
bCB+Q0NMYXllclRyZWVIb3N0KCk7CisgICAgdm9pZCBzdG9wKCk7CiAKICAgICAvLyBDQ0xheWVy
VHJlZUhvc3QgaW50ZXJmYWNlIHRvIENDUHJveHkuCiAgICAgdm9pZCBhbmltYXRlQW5kTGF5b3V0
KGRvdWJsZSBmcmFtZUJlZ2luVGltZSk7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9jaHJvbWl1bS9jYy9DQ0xheWVyVHJlZUhvc3RJbXBsLmgKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NMYXllclRyZWVI
b3N0SW1wbC5oCShyZXZpc2lvbiA5NDc2MikKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL2Nocm9taXVtL2NjL0NDTGF5ZXJUcmVlSG9zdEltcGwuaAkod29ya2luZyBjb3B5KQpA
QCAtNDYsMTMgKzQ2LDEzIEBAIHB1YmxpYzoKICAgICBzdGF0aWMgUGFzc093blB0cjxDQ0xheWVy
VHJlZUhvc3RJbXBsPiBjcmVhdGUoY29uc3QgQ0NTZXR0aW5ncyYpOwogICAgIHZpcnR1YWwgfkND
TGF5ZXJUcmVlSG9zdEltcGwoKTsKIAorICAgIC8vIFZpcnR1YWwgZm9yIHRlc3RpbmcKICAgICB2
aXJ0dWFsIHZvaWQgYmVnaW5Db21taXQoKTsKICAgICB2aXJ0dWFsIHZvaWQgY29tbWl0Q29tcGxl
dGUoKTsKKyAgICB2aXJ0dWFsIHZvaWQgZHJhd0xheWVycygpOwogCiAgICAgR3JhcGhpY3NDb250
ZXh0M0QqIGNvbnRleHQoKTsKIAotICAgIHZvaWQgZHJhd0xheWVycygpOwotCiAgICAgdm9pZCBm
aW5pc2hBbGxSZW5kZXJpbmcoKTsKICAgICBpbnQgZnJhbWVOdW1iZXIoKSBjb25zdCB7IHJldHVy
biBtX2ZyYW1lTnVtYmVyOyB9CiAKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL2Nocm9taXVtL2NjL0NDVGhyZWFkUHJveHkuY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDVGhyZWFkUHJveHkuY3BwCShy
ZXZpc2lvbiA5NDc2MikKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9t
aXVtL2NjL0NDVGhyZWFkUHJveHkuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xNzQsNyArMTc0LDYg
QEAgdm9pZCBDQ1RocmVhZFByb3h5OjpzdG9wKCkKIAogVGV4dHVyZU1hbmFnZXIqIENDVGhyZWFk
UHJveHk6OmNvbnRlbnRzVGV4dHVyZU1hbmFnZXIoKQogewotICAgIEFTU0VSVF9OT1RfUkVBQ0hF
RCgpOwogICAgIHJldHVybiAwOwogfQogCkBAIC0xODIsOCArMTgxLDcgQEAgdm9pZCBDQ1RocmVh
ZFByb3h5OjpiZWdpbkZyYW1lQW5kQ29tbWl0TwogewogICAgIFRSQUNFX0VWRU5UKCJDQ1RocmVh
ZFByb3h5OjpiZWdpbkZyYW1lQW5kQ29tbWl0T25DQ1RocmVhZCIsIHRoaXMsIDApOwogICAgIEFT
U0VSVChpc0ltcGxUaHJlYWQoKSk7Ci0gICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgLy8g
RklYTUU6IGNhbGwgYmVnaW5GcmFtZUFuZENvbW1pdCBvbiBtYWluIHRocmVhZAorICAgIHBvc3RC
ZWdpbkZyYW1lVG9NYWluVGhyZWFkKCk7CiB9CiAKIHZvaWQgQ0NUaHJlYWRQcm94eTo6YmVnaW5G
cmFtZUFuZENvbW1pdChkb3VibGUgZnJhbWVCZWdpblRpbWUpCkBAIC0yMzQsMTMgKzIzMiwxNCBA
QCB2b2lkIENDVGhyZWFkUHJveHk6OnNldE5lZWRzQ29tbWl0QW5kUmVkCiAgICAgVFJBQ0VfRVZF
TlQoIkNDVGhyZWFkUHJveHk6OnNldE5lZWRzQ29tbWl0QW5kUmVkcmF3T25DQ1RocmVhZCIsIHRo
aXMsIDApOwogICAgIEFTU0VSVChpc0ltcGxUaHJlYWQoKSk7CiAgICAgQVNTRVJUKG1fbGF5ZXJU
cmVlSG9zdEltcGwpOwotICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIHBvc3RCZWdpbkZy
YW1lVG9NYWluVGhyZWFkKCk7CiB9CiAKIHZvaWQgQ0NUaHJlYWRQcm94eTo6c2V0TmVlZHNSZWRy
YXdPbkNDVGhyZWFkKCkKIHsKICAgICBUUkFDRV9FVkVOVCgiQ0NUaHJlYWRQcm94eTo6c2V0TmVl
ZHNSZWRyYXdPbkNDVGhyZWFkIiwgdGhpcywgMCk7Ci0gICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7
CisgICAgLy8gVE9ETyhodXNreSk6IFRoaXMgaXMgYSBoYWNrIGZvciB0ZXN0aW5nLCBwcm9iYWJs
eSBub3Qgd2hhdCB3ZSB3YW50IHRvIHVzZSBpbiBwcmFjdGljZS4KKyAgICBkcmF3TGF5ZXJzT25D
Q1RocmVhZCgpOwogfQogCiB2b2lkIENDVGhyZWFkUHJveHk6OmluaXRpYWxpemVJbXBsT25DQ1Ro
cmVhZChDQ0NvbXBsZXRpb25FdmVudCogY29tcGxldGlvbikKQEAgLTI3MCw0ICsyNjksMTcgQEAg
dm9pZCBDQ1RocmVhZFByb3h5OjpsYXllclRyZWVIb3N0Q2xvc2VkTwogICAgIGNvbXBsZXRpb24t
PnNpZ25hbCgpOwogfQogCit2b2lkIENDVGhyZWFkUHJveHk6OnBvc3RCZWdpbkZyYW1lVG9NYWlu
VGhyZWFkKCkKK3sKKyAgICAvLyBUT0RPKGh1c2t5KTogVGhpcyBpcyBhIGhhY2sgZm9yIHRlc3Rp
bmcsIHByb2JhYmx5IG5vdCB3aGF0IHdlIHdhbnQgdG8gdXNlIGluIHByYWN0aWNlLgorICAgIGNh
bGxPbk1haW5UaHJlYWQoJkNDVGhyZWFkUHJveHk6OmRpc3BhdGNoQmVnaW5GcmFtZSwgdGhpcyk7
CiB9CisKK3ZvaWQgQ0NUaHJlYWRQcm94eTo6ZGlzcGF0Y2hCZWdpbkZyYW1lKHZvaWQqIGRhdGEp
Cit7CisgICAgLy8gVE9ETyhodXNreSk6IFRoaXMgaXMgYSBoYWNrIGZvciB0ZXN0aW5nLCBwcm9i
YWJseSBub3Qgd2hhdCB3ZSB3YW50IHRvIHVzZSBpbiBwcmFjdGljZS4KKyAgICBDQ1RocmVhZFBy
b3h5KiBwcm94eSA9IHN0YXRpY19jYXN0PENDVGhyZWFkUHJveHkqPihkYXRhKTsKKyAgICBwcm94
eS0+YmVnaW5GcmFtZUFuZENvbW1pdCgwLjApOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3Jl
CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ1Ro
cmVhZFByb3h5LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvY2hyb21pdW0vY2MvQ0NUaHJlYWRQcm94eS5oCShyZXZpc2lvbiA5NDc2MikKKysrIFNvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDVGhyZWFkUHJveHkuaAko
d29ya2luZyBjb3B5KQpAQCAtNjIsNiArNjIsOCBAQCBwcml2YXRlOgogICAgIC8vIENhbGxlZCBv
biBDQ01haW5UaHJlYWQKICAgICB2b2lkIGJlZ2luRnJhbWVBbmRDb21taXQoZG91YmxlIGZyYW1l
QmVnaW5UaW1lKTsKIAorICAgIHN0YXRpYyB2b2lkIGRpc3BhdGNoQmVnaW5GcmFtZSh2b2lkKik7
CisKICAgICAvLyBDYWxsZWQgb24gQ0NUaHJlYWQKICAgICB2b2lkIGJlZ2luRnJhbWVBbmRDb21t
aXRPbkNDVGhyZWFkKCk7CiAgICAgdm9pZCBjb21taXRPbkNDVGhyZWFkKENDQ29tcGxldGlvbkV2
ZW50Kik7CkBAIC03Miw2ICs3NCw4IEBAIHByaXZhdGU6CiAgICAgdm9pZCBzZXROZWVkc1JlZHJh
d09uQ0NUaHJlYWQoKTsKICAgICB2b2lkIGxheWVyVHJlZUhvc3RDbG9zZWRPbkNDVGhyZWFkKEND
Q29tcGxldGlvbkV2ZW50Kik7CiAKKyAgICB2b2lkIHBvc3RCZWdpbkZyYW1lVG9NYWluVGhyZWFk
KCk7CisKICAgICAvLyBVc2VkIG9uIG1haW4tdGhyZWFkIG9ubHkuCiAgICAgYm9vbCBtX2NvbW1p
dFBlbmRpbmc7CiAKSW5kZXg6IFNvdXJjZS9XZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9nCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9nCShyZXZpc2lvbiA5NDc2
NSkKKysrIFNvdXJjZS9XZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNTMgQEAKKzIwMTEtMDktMDggIElhaW4gTWVycmljayAgPGh1c2t5QGdvb2dsZS5j
b20+CisKKyAgICAgICAgW2Nocm9taXVtXSBGaXggQ0NMYXllclRyZWVIb3N0VGVzdAorICAgICAg
ICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njc0MTgKKworICAgICAg
ICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICAqIHNyYy9HcmFwaGljc0Nv
bnRleHQzRENocm9taXVtLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNE
UHJpdmF0ZTo6R3JhcGhpY3NDb250ZXh0M0RQcml2YXRlKToKKyAgICAgICAgKFdlYkNvcmU6Okdy
YXBoaWNzQ29udGV4dDNEUHJpdmF0ZTo6cGxhdGZvcm1MYXllcik6CisgICAgICAgICogc3JjL0dy
YXBoaWNzQ29udGV4dDNEUHJpdmF0ZS5oOgorICAgICAgICAqIHRlc3RzL0NDTGF5ZXJUcmVlSG9z
dFRlc3QuY3BwOgorICAgICAgICAoV1RGOjpDQ0xheWVyVHJlZUhvc3RUZXN0OjpiZWdpbkNvbW1p
dE9uTWFpblRocmVhZCk6CisgICAgICAgIChXVEY6OkNDTGF5ZXJUcmVlSG9zdFRlc3Q6OmRyYXdM
YXllcnNPbkNDVGhyZWFkKToKKyAgICAgICAgKFdURjo6Q0NMYXllclRyZWVIb3N0VGVzdDo6cG9z
dFNldE5lZWRzQ29tbWl0VG9NYWluVGhyZWFkKToKKyAgICAgICAgKFdURjo6Q0NMYXllclRyZWVI
b3N0VGVzdDo6cG9zdFNldE5lZWRzUmVkcmF3VG9NYWluVGhyZWFkKToKKyAgICAgICAgKFdURjo6
Q0NMYXllclRyZWVIb3N0VGVzdDo6b25FbmRUZXN0KToKKyAgICAgICAgKFdURjo6Q0NMYXllclRy
ZWVIb3N0VGVzdDo6ZGlzcGF0Y2hTZXROZWVkc0NvbW1pdCk6CisgICAgICAgIChXVEY6OkNDTGF5
ZXJUcmVlSG9zdFRlc3Q6OmRpc3BhdGNoU2V0TmVlZHNSZWRyYXcpOgorICAgICAgICAoV1RGOjpD
Q0xheWVyVHJlZUhvc3RUZXN0OjpydW5UZXN0KToKKyAgICAgICAgKFdURjo6TXlNb2NrQ29udGV4
dDo6bWFrZUNvbnRleHRDdXJyZW50KToKKyAgICAgICAgKFdURjo6TXlNb2NrQ29udGV4dDo6Y3Jl
YXRlUHJvZ3JhbSk6CisgICAgICAgIChXVEY6Ok15TW9ja0NvbnRleHQ6OmNyZWF0ZVNoYWRlcik6
CisgICAgICAgIChXVEY6Ok15TW9ja0NvbnRleHQ6OmdldFNoYWRlcml2KToKKyAgICAgICAgKFdU
Rjo6TXlNb2NrQ29udGV4dDo6Z2V0UHJvZ3JhbWl2KToKKyAgICAgICAgKFdURjo6TW9ja0xheWVy
VHJlZUhvc3RJbXBsOjpjcmVhdGUpOgorICAgICAgICAoV1RGOjpNb2NrTGF5ZXJUcmVlSG9zdElt
cGw6OmRyYXdMYXllcnMpOgorICAgICAgICAoV1RGOjpNb2NrTGF5ZXJUcmVlSG9zdEltcGw6Ok1v
Y2tMYXllclRyZWVIb3N0SW1wbCk6CisgICAgICAgIChXVEY6Ok1vY2tMYXllclRyZWVIb3N0Q2xp
ZW50OjpNb2NrTGF5ZXJUcmVlSG9zdENsaWVudCk6CisgICAgICAgIChXVEY6Ok1vY2tMYXllclRy
ZWVIb3N0Q2xpZW50OjphbmltYXRlQW5kTGF5b3V0KToKKyAgICAgICAgKFdURjo6TW9ja0xheWVy
VHJlZUhvc3RDbGllbnQ6OmNyZWF0ZUNvbXBvc2l0b3JUaHJlYWQpOgorICAgICAgICAoV1RGOjpN
b2NrTGF5ZXJUcmVlSG9zdENsaWVudDo6Y3JlYXRlTGF5ZXJUcmVlSG9zdENvbnRleHQzRCk6Cisg
ICAgICAgIChXVEY6Ok1vY2tMYXllclRyZWVIb3N0Q2xpZW50OjpjcmVhdGVSb290TGF5ZXJQYWlu
dGVyKToKKyAgICAgICAgKFdURjo6TW9ja0xheWVyVHJlZUhvc3RDbGllbnQ6OmNyZWF0ZUxheWVy
VHJlZUhvc3RJbXBsKToKKyAgICAgICAgKFdURjo6TW9ja0xheWVyVHJlZUhvc3RDbGllbnQ6OmRp
ZFJlY3JlYXRlR3JhcGhpY3NDb250ZXh0KToKKyAgICAgICAgKFdURjo6Q0NMYXllclRyZWVIb3N0
VGVzdDo6ZG9CZWdpblRlc3QpOgorICAgICAgICAoV1RGOjpDQ0xheWVyVHJlZUhvc3RUZXN0U2hv
cnRsaXZlZDI6OmJlZ2luVGVzdCk6CisgICAgICAgIChXVEY6OkNDTGF5ZXJUcmVlSG9zdFRlc3RT
aG9ydGxpdmVkMzo6YmVnaW5UZXN0KToKKyAgICAgICAgKFdURjo6Q0NMYXllclRyZWVIb3N0VGVz
dENvbW1pdGluZ1dpdGhDb250aW51b3VzUmVkcmF3OjpiZWdpblRlc3QpOgorICAgICAgICAoV1RG
OjpDQ0xheWVyVHJlZUhvc3RUZXN0Q29tbWl0aW5nV2l0aENvbnRpbnVvdXNSZWRyYXc6OmRyYXdM
YXllcnNPbkNDVGhyZWFkKToKKyAgICAgICAgKFdURjo6Q0NMYXllclRyZWVIb3N0VGVzdFNldE5l
ZWRzQ29tbWl0MTo6YmVnaW5UZXN0KToKKyAgICAgICAgKFdURjo6Q0NMYXllclRyZWVIb3N0VGVz
dFNldE5lZWRzQ29tbWl0MTo6ZHJhd0xheWVyc09uQ0NUaHJlYWQpOgorICAgICAgICAoV1RGOjpD
Q0xheWVyVHJlZUhvc3RUZXN0U2V0TmVlZHNDb21taXQxOjpjb21taXRDb21wbGV0ZU9uQ0NUaHJl
YWQpOgorICAgICAgICAoV1RGOjpDQ0xheWVyVHJlZUhvc3RUZXN0U2V0TmVlZHNDb21taXQyOjpi
ZWdpblRlc3QpOgorICAgICAgICAoV1RGOjpDQ0xheWVyVHJlZUhvc3RUZXN0U2V0TmVlZHNDb21t
aXQyOjpkcmF3TGF5ZXJzT25DQ1RocmVhZCk6CisgICAgICAgIChXVEY6OkNDTGF5ZXJUcmVlSG9z
dFRlc3RTZXROZWVkc0NvbW1pdDI6OmNvbW1pdENvbXBsZXRlT25DQ1RocmVhZCk6CisgICAgICAg
IChXVEY6OkNDTGF5ZXJUcmVlSG9zdFRlc3RTZXROZWVkc1JlZHJhdzo6YmVnaW5UZXN0KToKKyAg
ICAgICAgKFdURjo6Q0NMYXllclRyZWVIb3N0VGVzdFNldE5lZWRzUmVkcmF3OjpkcmF3TGF5ZXJz
T25DQ1RocmVhZCk6CisgICAgICAgIChXVEY6OkNDTGF5ZXJUcmVlSG9zdFRlc3RTZXROZWVkc1Jl
ZHJhdzo6Y29tbWl0Q29tcGxldGVPbkNDVGhyZWFkKToKKwogMjAxMS0wOS0wNyAgQWRhbSBCYXJ0
aCAgPGFiYXJ0aEB3ZWJraXQub3JnPgogCiAgICAgICAgIEZyYW1lTG9hZGVyOjphZGRFeHRyYUZp
ZWxkc1RvUmVxdWVzdCBjYW4gY3Jhc2ggd2hlbiBjYWxsZWQgZnJvbSBvciBhZnRlciBGcmFtZUxv
YWRlcjo6ZGV0YWNoRnJvbVBhcmVudApJbmRleDogU291cmNlL1dlYktpdC9jaHJvbWl1bS9zcmMv
R3JhcGhpY3NDb250ZXh0M0RDaHJvbWl1bS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktp
dC9jaHJvbWl1bS9zcmMvR3JhcGhpY3NDb250ZXh0M0RDaHJvbWl1bS5jcHAJKHJldmlzaW9uIDk0
NzYyKQorKysgU291cmNlL1dlYktpdC9jaHJvbWl1bS9zcmMvR3JhcGhpY3NDb250ZXh0M0RDaHJv
bWl1bS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTk4LDkgKzk4LDYgQEAgR3JhcGhpY3NDb250ZXh0
M0RQcml2YXRlOjpHcmFwaGljc0NvbnRleAogI2Vycm9yIE11c3QgcG9ydCB0byB5b3VyIHBsYXRm
b3JtCiAjZW5kaWYKIHsKLSNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCi0gICAgbV9j
b21wb3NpdGluZ0xheWVyID0gV2ViR0xMYXllckNocm9taXVtOjpjcmVhdGUoMCk7Ci0jZW5kaWYK
IH0KIAogR3JhcGhpY3NDb250ZXh0M0RQcml2YXRlOjp+R3JhcGhpY3NDb250ZXh0M0RQcml2YXRl
KCkKQEAgLTE4OCw2ICsxODUsMTAgQEAgdm9pZCBHcmFwaGljc0NvbnRleHQzRFByaXZhdGU6OnBy
ZXBhcmVUZQogI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKIFdlYkdMTGF5ZXJDaHJv
bWl1bSogR3JhcGhpY3NDb250ZXh0M0RQcml2YXRlOjpwbGF0Zm9ybUxheWVyKCkgY29uc3QKIHsK
KyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisgICAgaWYgKCFtX2NvbXBvc2l0aW5n
TGF5ZXIpCisgICAgICAgIG1fY29tcG9zaXRpbmdMYXllciA9IFdlYkdMTGF5ZXJDaHJvbWl1bTo6
Y3JlYXRlKDApOworI2VuZGlmCiAgICAgcmV0dXJuIG1fY29tcG9zaXRpbmdMYXllci5nZXQoKTsK
IH0KICNlbmRpZgpJbmRleDogU291cmNlL1dlYktpdC9jaHJvbWl1bS9zcmMvR3JhcGhpY3NDb250
ZXh0M0RQcml2YXRlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdC9jaHJvbWl1bS9zcmMv
R3JhcGhpY3NDb250ZXh0M0RQcml2YXRlLmgJKHJldmlzaW9uIDk0NzYyKQorKysgU291cmNlL1dl
YktpdC9jaHJvbWl1bS9zcmMvR3JhcGhpY3NDb250ZXh0M0RQcml2YXRlLmgJKHdvcmtpbmcgY29w
eSkKQEAgLTMxNCw3ICszMTQsNyBAQCBwcml2YXRlOgogICAgIFJlc291cmNlU2FmZXR5IG1fcmVz
b3VyY2VTYWZldHk7CiAKICNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCi0gICAgUmVm
UHRyPFdlYkdMTGF5ZXJDaHJvbWl1bT4gbV9jb21wb3NpdGluZ0xheWVyOworICAgIG11dGFibGUg
UmVmUHRyPFdlYkdMTGF5ZXJDaHJvbWl1bT4gbV9jb21wb3NpdGluZ0xheWVyOwogI2VuZGlmCiAj
aWYgVVNFKFNLSUEpCiAgICAgLy8gSWYgdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIENhbnZh
cydzIGJhY2tpbmcgc3RvcmUgZG9uJ3QKSW5kZXg6IFNvdXJjZS9XZWJLaXQvY2hyb21pdW0vdGVz
dHMvQ0NMYXllclRyZWVIb3N0VGVzdC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdC9j
aHJvbWl1bS90ZXN0cy9DQ0xheWVyVHJlZUhvc3RUZXN0LmNwcAkocmV2aXNpb24gOTQ3NjIpCisr
KyBTb3VyY2UvV2ViS2l0L2Nocm9taXVtL3Rlc3RzL0NDTGF5ZXJUcmVlSG9zdFRlc3QuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC0yOCw3ICsyOCwxMiBAQAogCiAjaW5jbHVkZSAiY2MvQ0NMYXllclRy
ZWVIb3N0LmgiCiAKLSNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQzRC5oIgorI2luY2x1ZGUgIkND
VGhyZWFkSW1wbC5oIgorI2luY2x1ZGUgPHd0Zi9IYXNoVHJhaXRzLmg+CisjaW5jbHVkZSA8d3Rm
L3RleHQvU3RyaW5nSGFzaC5oPgorI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dDNEUHJpdmF0ZS5o
IgorI2luY2x1ZGUgIk1vY2tXZWJHcmFwaGljc0NvbnRleHQzRC5oIgorI2luY2x1ZGUgIkxheWVy
UGFpbnRlckNocm9taXVtLmgiCiAjaW5jbHVkZSAiY2MvQ0NMYXllclRyZWVIb3N0SW1wbC5oIgog
I2luY2x1ZGUgImNjL0NDTWFpblRocmVhZFRhc2suaCIKICNpbmNsdWRlICJjYy9DQ1RocmVhZFRh
c2suaCIKQEAgLTQwLDYgKzQ1LDcgQEAKIAogCiB1c2luZyBuYW1lc3BhY2UgV2ViQ29yZTsKK3Vz
aW5nIG5hbWVzcGFjZSBXZWJLaXQ7CiB1c2luZyBuYW1lc3BhY2UgV1RGOwogCiBuYW1lc3BhY2Ug
ewpAQCAtNzIsMTQgKzc4LDIzIEBAIHB1YmxpYzoKICAgICB2aXJ0dWFsIHZvaWQgYW5pbWF0ZUFu
ZExheW91dChNb2NrTGF5ZXJUcmVlSG9zdENsaWVudCogbGF5ZXJUcmVlSG9zdCwgZG91YmxlIGZy
YW1lQmVnaW5UaW1lKSB7IH0KICAgICB2aXJ0dWFsIHZvaWQgYmVnaW5Db21taXRPbkNDVGhyZWFk
KE1vY2tMYXllclRyZWVIb3N0SW1wbCogbGF5ZXJUcmVlSG9zdEltcGwpIHsgfQogICAgIHZpcnR1
YWwgdm9pZCBiZWdpbkNvbW1pdE9uTWFpblRocmVhZChNb2NrTGF5ZXJUcmVlSG9zdCogbGF5ZXJU
cmVlSG9zdCkgeyB9Ci0gICAgdmlydHVhbCB2b2lkIGNvbW1pdE9uQ0NUaHJlYWQoTW9ja0xheWVy
VHJlZUhvc3QqIGxheWVyVHJlZUhvc3QsIE1vY2tMYXllclRyZWVIb3N0SW1wbCogbGF5ZXJUcmVl
SG9zdEltcGwpIHsgfQogICAgIHZpcnR1YWwgdm9pZCBjb21taXRDb21wbGV0ZU9uQ0NUaHJlYWQo
TW9ja0xheWVyVHJlZUhvc3RJbXBsKiBsYXllclRyZWVIb3N0SW1wbCkgeyB9CiAgICAgdmlydHVh
bCB2b2lkIGNvbW1pdENvbXBsZXRlT25NYWluVGhyZWFkKE1vY2tMYXllclRyZWVIb3N0KiBsYXll
clRyZWVIb3N0KSB7IH0KLSAgICB2aXJ0dWFsIHZvaWQgZHJhd0xheWVyc0FuZFByZXNlbnRPbkND
VGhyZWFkKE1vY2tMYXllclRyZWVIb3N0SW1wbCogbGF5ZXJUcmVlSG9zdEltcGwpIHsgfQorICAg
IHZpcnR1YWwgdm9pZCBkcmF3TGF5ZXJzT25DQ1RocmVhZChNb2NrTGF5ZXJUcmVlSG9zdEltcGwq
IGxheWVyVHJlZUhvc3RJbXBsKSB7IH0KICAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlTGF5ZXJzKE1v
Y2tMYXllclRyZWVIb3N0KiBsYXllclRyZWVIb3N0KSB7IH0KIAogICAgIHZvaWQgZW5kVGVzdCgp
OwogCisgICAgdm9pZCBwb3N0U2V0TmVlZHNDb21taXRUb01haW5UaHJlYWQoKQorICAgIHsKKyAg
ICAgICAgY2FsbE9uTWFpblRocmVhZChDQ0xheWVyVHJlZUhvc3RUZXN0OjpkaXNwYXRjaFNldE5l
ZWRzQ29tbWl0LCB0aGlzKTsKKyAgICB9CisKKyAgICB2b2lkIHBvc3RTZXROZWVkc1JlZHJhd1Rv
TWFpblRocmVhZCgpCisgICAgeworICAgICAgICBjYWxsT25NYWluVGhyZWFkKENDTGF5ZXJUcmVl
SG9zdFRlc3Q6OmRpc3BhdGNoU2V0TmVlZHNSZWRyYXcsIHRoaXMpOworICAgIH0KKwogcHJvdGVj
dGVkOgogICAgIHZvaWQgZG9CZWdpblRlc3QoKTsKIApAQCAtOTUsMTAgKzExMCwyOSBAQCBwcm90
ZWN0ZWQ6CiAgICAgc3RhdGljIHZvaWQgb25FbmRUZXN0KHZvaWQqIHNlbGYpCiAgICAgewogICAg
ICAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOwotICAgICAgICBDQ0xheWVyVHJlZUhvc3RUZXN0
KiB0ZXN0ID0gc3RhdGljX2Nhc3Q8Q0NMYXllclRyZWVIb3N0VGVzdCo+KHNlbGYpOwotICAgICAg
ICB0ZXN0LT5tX2xheWVyVHJlZUhvc3QuY2xlYXIoKTsKLSAgICAgICAgdGVzdC0+bV9jbGllbnQu
Y2xlYXIoKTsKICAgICAgICAgd2Via2l0X3N1cHBvcnQ6OlF1aXRNZXNzYWdlTG9vcCgpOworICAg
ICAgICBDQ0xheWVyVHJlZUhvc3RUZXN0KiB0ZXN0ID0gc3RhdGljX2Nhc3Q8Q0NMYXllclRyZWVI
b3N0VGVzdCo+KHNlbGYpOworICAgICAgICBBU1NFUlQodGVzdCk7CisgICAgICAgIEFTU0VSVCh0
ZXN0LT5tX2xheWVyVHJlZUhvc3QpOworICAgICAgICB0ZXN0LT5tX2xheWVyVHJlZUhvc3QtPnN0
b3AoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBkaXNwYXRjaFNldE5lZWRzQ29tbWl0KHZv
aWQqIHNlbGYpCisgICAgeworICAgICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKKyAgICAgIEND
TGF5ZXJUcmVlSG9zdFRlc3QqIHRlc3QgPSBzdGF0aWNfY2FzdDxDQ0xheWVyVHJlZUhvc3RUZXN0
Kj4oc2VsZik7CisgICAgICBBU1NFUlQodGVzdCk7CisgICAgICBBU1NFUlQodGVzdC0+bV9sYXll
clRyZWVIb3N0KTsKKyAgICAgIHRlc3QtPm1fbGF5ZXJUcmVlSG9zdC0+c2V0TmVlZHNDb21taXRB
bmRSZWRyYXcoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBkaXNwYXRjaFNldE5lZWRzUmVk
cmF3KHZvaWQqIHNlbGYpCisgICAgeworICAgICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKKyAg
ICAgIENDTGF5ZXJUcmVlSG9zdFRlc3QqIHRlc3QgPSBzdGF0aWNfY2FzdDxDQ0xheWVyVHJlZUhv
c3RUZXN0Kj4oc2VsZik7CisgICAgICBBU1NFUlQodGVzdCk7CisgICAgICBBU1NFUlQodGVzdC0+
bV9sYXllclRyZWVIb3N0KTsKKyAgICAgIHRlc3QtPm1fbGF5ZXJUcmVlSG9zdC0+c2V0TmVlZHNS
ZWRyYXcoKTsKICAgICB9CiAKICAgICB2b2lkIHJ1blRlc3QoKQpAQCAtMTA5LDYgKzE0Myw4IEBA
IHByb3RlY3RlZDoKICAgICAgICAgbV9ydW5uaW5nID0gZmFsc2U7CiAgICAgICAgIGJvb2wgdGlt
ZWRPdXQgPSBtX3RpbWVkT3V0OyAvLyBTYXZlIHdoZXRoZXIgd2UncmUgdGltZWQgb3V0IGluIGNh
c2UgUnVuQWxsUGVuZGluZ01lc3NhZ2VzIGhhcyB0aGUgdGltZW91dC4KICAgICAgICAgd2Via2l0
X3N1cHBvcnQ6OlJ1bkFsbFBlbmRpbmdNZXNzYWdlcygpOworICAgICAgICBtX2xheWVyVHJlZUhv
c3QuY2xlYXIoKTsKKyAgICAgICAgbV9jbGllbnQuY2xlYXIoKTsKICAgICAgICAgaWYgKHRpbWVk
T3V0KSB7CiAgICAgICAgICAgICBwcmludGYoIlRlc3QgdGltZWQgb3V0Iik7CiAgICAgICAgICAg
ICBGQUlMKCkgPDwgIlRlc3QgdGltZWQgb3V0IjsKQEAgLTEzMCw3ICsxNjYsNyBAQCBwcm90ZWN0
ZWQ6CiAgICAgVmVjdG9yPHN0ZDo6c3RyaW5nPiBtX3RyYWNlczsKIAogICAgIE93blB0cjxNb2Nr
TGF5ZXJUcmVlSG9zdENsaWVudD4gbV9jbGllbnQ7Ci0gICAgUmVmUHRyPE1vY2tMYXllclRyZWVI
b3N0PiBtX2xheWVyVHJlZUhvc3Q7CisgICAgUmVmUHRyPENDTGF5ZXJUcmVlSG9zdD4gbV9sYXll
clRyZWVIb3N0OwogCiBwcml2YXRlOgogICAgIGJvb2wgbV9iZWdpbm5pbmc7CkBAIC0xMzksNTEg
KzE3NSwyNiBAQCBwcml2YXRlOgogICAgIGJvb2wgbV90aW1lZE91dDsKIH07CiAKLWNsYXNzIE1v
Y2tMYXllclRyZWVIb3N0Q2xpZW50IDogcHVibGljIENDTGF5ZXJUcmVlSG9zdENsaWVudCB7Ci1w
dWJsaWM6Ci0gICAgTW9ja0xheWVyVHJlZUhvc3RDbGllbnQoQ0NMYXllclRyZWVIb3N0VGVzdCog
dGVzdCkgOiBtX3Rlc3QodGVzdCkgeyB9Ci0KLSAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8R3JhcGhp
Y3NDb250ZXh0M0Q+IGNyZWF0ZUxheWVyVHJlZUhvc3RDb250ZXh0M0QoKQotICAgIHsKLSAgICAg
ICAgcmV0dXJuIGFkb3B0UmVmPEdyYXBoaWNzQ29udGV4dDNEPigwKTsKLSAgICB9Ci0KLSAgICB2
aXJ0dWFsIHZvaWQgYW5pbWF0ZUFuZExheW91dChkb3VibGUgZnJhbWVCZWdpblRpbWUpCi0gICAg
ewotICAgICAgICBtX3Rlc3QtPmFuaW1hdGVBbmRMYXlvdXQodGhpcywgZnJhbWVCZWdpblRpbWUp
OwotICAgIH0KLQotICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVMYXllcnMoKQotICAgIHsKLSAgICB9
Ci0KLXByaXZhdGU6Ci0gICAgQ0NMYXllclRyZWVIb3N0VGVzdCogbV90ZXN0OwotfTsKLQotY2xh
c3MgTW9ja0xheWVyVHJlZUhvc3RDb21taXR0ZXIgOiBwdWJsaWMgQ0NMYXllclRyZWVIb3N0Q29t
bWl0dGVyIHsKK2NsYXNzIE15TW9ja0NvbnRleHQgOiBwdWJsaWMgTW9ja1dlYkdyYXBoaWNzQ29u
dGV4dDNEIHsKIHB1YmxpYzoKLSAgICBzdGF0aWMgUGFzc093blB0cjxNb2NrTGF5ZXJUcmVlSG9z
dENvbW1pdHRlcj4gY3JlYXRlKENDTGF5ZXJUcmVlSG9zdFRlc3QqIHRlc3QpCisgICAgdmlydHVh
bCBib29sIG1ha2VDb250ZXh0Q3VycmVudCgpIHsgcmV0dXJuIHRydWU7IH0KKyAgICB2aXJ0dWFs
IFdlYkdMSWQgY3JlYXRlUHJvZ3JhbSgpIHsgcmV0dXJuIDE7IH0KKyAgICB2aXJ0dWFsIFdlYkdM
SWQgY3JlYXRlU2hhZGVyKFdHQzNEZW51bSkgeyByZXR1cm4gMTsgfQorICAgIHZpcnR1YWwgdm9p
ZCBnZXRTaGFkZXJpdihXZWJHTElkIHNoYWRlciwgV0dDM0RlbnVtIHBuYW1lLCBXR0MzRGludCog
dmFsdWUpCiAgICAgewotICAgICAgICByZXR1cm4gYWRvcHRQdHIobmV3IE1vY2tMYXllclRyZWVI
b3N0Q29tbWl0dGVyKHRlc3QpKTsKKyAgICAgICAgKnZhbHVlID0gMTsKICAgICB9Ci0KLSAgICB2
aXJ0dWFsIHZvaWQgY29tbWl0KENDTGF5ZXJUcmVlSG9zdCogaG9zdCwgQ0NMYXllclRyZWVIb3N0
SW1wbCogaG9zdEltcGwpCisgICAgdmlydHVhbCB2b2lkIGdldFByb2dyYW1pdihXZWJHTElkIHBy
b2dyYW0sIFdHQzNEZW51bSBwbmFtZSwgV0dDM0RpbnQqIHZhbHVlKQogICAgIHsKLSAgICAgICAg
Q0NMYXllclRyZWVIb3N0Q29tbWl0dGVyOjpjb21taXQoaG9zdCwgaG9zdEltcGwpOwotICAgICAg
ICBtX3Rlc3QtPmNvbW1pdE9uQ0NUaHJlYWQocmVpbnRlcnByZXRfY2FzdDxNb2NrTGF5ZXJUcmVl
SG9zdCo+KGhvc3QpLCByZWludGVycHJldF9jYXN0PE1vY2tMYXllclRyZWVIb3N0SW1wbCo+KGhv
c3RJbXBsKSk7CisgICAgICAgICp2YWx1ZSA9IDE7CiAgICAgfQotCi1wcml2YXRlOgotICAgIE1v
Y2tMYXllclRyZWVIb3N0Q29tbWl0dGVyKENDTGF5ZXJUcmVlSG9zdFRlc3QqIHRlc3QpIDogbV90
ZXN0KHRlc3QpIHsgfQotICAgIENDTGF5ZXJUcmVlSG9zdFRlc3QqIG1fdGVzdDsKIH07CiAKIGNs
YXNzIE1vY2tMYXllclRyZWVIb3N0SW1wbCA6IHB1YmxpYyBDQ0xheWVyVHJlZUhvc3RJbXBsIHsK
IHB1YmxpYzoKLSAgICBzdGF0aWMgUGFzc093blB0cjxNb2NrTGF5ZXJUcmVlSG9zdEltcGw+IGNy
ZWF0ZShDQ0xheWVyVHJlZUhvc3RJbXBsQ2xpZW50KiBjbGllbnQsIENDTGF5ZXJUcmVlSG9zdFRl
c3QqIHRlc3QpCisgICAgc3RhdGljIFBhc3NPd25QdHI8TW9ja0xheWVyVHJlZUhvc3RJbXBsPiBj
cmVhdGUoY29uc3QgQ0NTZXR0aW5ncyYgc2V0dGluZ3MsIENDTGF5ZXJUcmVlSG9zdFRlc3QqIHRl
c3QpCiAgICAgewotICAgICAgICByZXR1cm4gYWRvcHRQdHIobmV3IE1vY2tMYXllclRyZWVIb3N0
SW1wbChjbGllbnQsIHRlc3QpKTsKKyAgICAgICAgcmV0dXJuIGFkb3B0UHRyKG5ldyBNb2NrTGF5
ZXJUcmVlSG9zdEltcGwoc2V0dGluZ3MsIHRlc3QpKTsKICAgICB9CiAKICAgICB2aXJ0dWFsIHZv
aWQgYmVnaW5Db21taXQoKQpAQCAtMTk4LDE0ICsyMDksMTUgQEAgcHVibGljOgogICAgICAgICBt
X3Rlc3QtPmNvbW1pdENvbXBsZXRlT25DQ1RocmVhZCh0aGlzKTsKICAgICB9CiAKLSAgICB2aXJ0
dWFsIHZvaWQgZHJhd0xheWVyc0FuZFByZXNlbnQoKQorICAgIHZpcnR1YWwgdm9pZCBkcmF3TGF5
ZXJzKCkKICAgICB7Ci0gICAgICAgIG1fdGVzdC0+ZHJhd0xheWVyc0FuZFByZXNlbnRPbkNDVGhy
ZWFkKHRoaXMpOworICAgICAgICBDQ0xheWVyVHJlZUhvc3RJbXBsOjpkcmF3TGF5ZXJzKCk7Cisg
ICAgICAgIG1fdGVzdC0+ZHJhd0xheWVyc09uQ0NUaHJlYWQodGhpcyk7CiAgICAgfQogCiBwcml2
YXRlOgotICAgIE1vY2tMYXllclRyZWVIb3N0SW1wbChDQ0xheWVyVHJlZUhvc3RJbXBsQ2xpZW50
KiBjbGllbnQsIENDTGF5ZXJUcmVlSG9zdFRlc3QqIHRlc3QpCi0gICAgICAgICAgICA6IENDTGF5
ZXJUcmVlSG9zdEltcGwoY2xpZW50KQorICAgIE1vY2tMYXllclRyZWVIb3N0SW1wbChjb25zdCBD
Q1NldHRpbmdzJiBzZXR0aW5ncywgQ0NMYXllclRyZWVIb3N0VGVzdCogdGVzdCkKKyAgICAgICAg
ICAgIDogQ0NMYXllclRyZWVIb3N0SW1wbChzZXR0aW5ncykKICAgICAgICAgICAgICwgbV90ZXN0
KHRlc3QpCiAgICAgewogICAgIH0KQEAgLTIxMyw1OSArMjI1LDQwIEBAIHByaXZhdGU6CiAgICAg
Q0NMYXllclRyZWVIb3N0VGVzdCogbV90ZXN0OwogfTsKIAotY2xhc3MgTW9ja0xheWVyVHJlZUhv
c3RJbXBsUHJveHkgOiBwdWJsaWMgQ0NMYXllclRyZWVIb3N0SW1wbFByb3h5IHsKK2NsYXNzIE1v
Y2tMYXllclRyZWVIb3N0Q2xpZW50IDogcHVibGljIENDTGF5ZXJUcmVlSG9zdENsaWVudCB7CiBw
dWJsaWM6Ci0gICAgc3RhdGljIFBhc3NPd25QdHI8TW9ja0xheWVyVHJlZUhvc3RJbXBsUHJveHk+
IGNyZWF0ZShDQ0xheWVyVHJlZUhvc3QqIGhvc3QsIENDTGF5ZXJUcmVlSG9zdFRlc3QqIHRlc3Qp
Ci0gICAgewotICAgICAgICByZXR1cm4gYWRvcHRQdHIobmV3IE1vY2tMYXllclRyZWVIb3N0SW1w
bFByb3h5KGhvc3QsIHRlc3QpKTsKLSAgICB9CisgICAgTW9ja0xheWVyVHJlZUhvc3RDbGllbnQo
Q0NMYXllclRyZWVIb3N0VGVzdCogdGVzdCkgOiBtX3Rlc3QodGVzdCkgeyB9CiAKLSAgICBQYXNz
T3duUHRyPENDTGF5ZXJUcmVlSG9zdEltcGw+IGNyZWF0ZUxheWVyVHJlZUhvc3RJbXBsKCkKKyAg
ICB2aXJ0dWFsIHZvaWQgYW5pbWF0ZUFuZExheW91dChkb3VibGUgZnJhbWVCZWdpblRpbWUpCiAg
ICAgewotICAgICAgICByZXR1cm4gTW9ja0xheWVyVHJlZUhvc3RJbXBsOjpjcmVhdGUodGhpcywg
bV90ZXN0KTsKKyAgICAgICAgbV90ZXN0LT5hbmltYXRlQW5kTGF5b3V0KHRoaXMsIGZyYW1lQmVn
aW5UaW1lKTsKICAgICB9CiAKLXByaXZhdGU6Ci0gICAgTW9ja0xheWVyVHJlZUhvc3RJbXBsUHJv
eHkoQ0NMYXllclRyZWVIb3N0KiBob3N0LCBDQ0xheWVyVHJlZUhvc3RUZXN0KiB0ZXN0KQotICAg
ICAgICA6IENDTGF5ZXJUcmVlSG9zdEltcGxQcm94eShob3N0KQotICAgICAgICAsIG1fdGVzdCh0
ZXN0KSB7IH0KLQotICAgIENDTGF5ZXJUcmVlSG9zdFRlc3QqIG1fdGVzdDsKLX07Ci0KLWNsYXNz
IE1vY2tMYXllclRyZWVIb3N0IDogcHVibGljIENDTGF5ZXJUcmVlSG9zdCB7Ci1wdWJsaWM6Ci0g
ICAgTW9ja0xheWVyVHJlZUhvc3QoQ0NMYXllclRyZWVIb3N0Q2xpZW50KiBjbGllbnQsIENDTGF5
ZXJUcmVlSG9zdFRlc3QqIHRlc3QpCi0gICAgICAgIDogQ0NMYXllclRyZWVIb3N0KGNsaWVudCkK
LSAgICAgICAgLCBtX3Rlc3QodGVzdCkgeyB9Ci0KLSAgICB2aXJ0dWFsIFBhc3NPd25QdHI8Q0NM
YXllclRyZWVIb3N0SW1wbFByb3h5PiBjcmVhdGVMYXllclRyZWVIb3N0SW1wbFByb3h5KCkKKyAg
ICB2aXJ0dWFsIFBhc3NPd25QdHI8Q0NUaHJlYWQ+IGNyZWF0ZUNvbXBvc2l0b3JUaHJlYWQoKQog
ICAgIHsKLSAgICAgICAgT3duUHRyPENDTGF5ZXJUcmVlSG9zdEltcGxQcm94eT4gcHJveHkgPSBN
b2NrTGF5ZXJUcmVlSG9zdEltcGxQcm94eTo6Y3JlYXRlKHRoaXMsIG1fdGVzdCk7Ci0gICAgICAg
IHByb3h5LT5zdGFydCgpOwotICAgICAgICByZXR1cm4gcHJveHkucmVsZWFzZSgpOworICAgICAg
ICByZXR1cm4gQ0NUaHJlYWRJbXBsOjpjcmVhdGUoKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHZv
aWQgdXBkYXRlTGF5ZXJzKCkKKyAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8R3JhcGhpY3NDb250ZXh0
M0Q+IGNyZWF0ZUxheWVyVHJlZUhvc3RDb250ZXh0M0QoKQogICAgIHsKLSAgICAgICAgbV90ZXN0
LT51cGRhdGVMYXllcnModGhpcyk7CisgICAgICAgIE93blB0cjxXZWJHcmFwaGljc0NvbnRleHQz
RD4gbW9jayA9IGFkb3B0UHRyKG5ldyBNeU1vY2tDb250ZXh0KCkpOworICAgICAgICBHcmFwaGlj
c0NvbnRleHQzRDo6QXR0cmlidXRlcyBhdHRyczsKKyAgICAgICAgUmVmUHRyPEdyYXBoaWNzQ29u
dGV4dDNEPiBjb250ZXh0ID0gR3JhcGhpY3NDb250ZXh0M0RQcml2YXRlOjpjcmVhdGVHcmFwaGlj
c0NvbnRleHRGcm9tV2ViQ29udGV4dChtb2NrLnJlbGVhc2UoKSwgYXR0cnMsIDAsIEdyYXBoaWNz
Q29udGV4dDNEOjpSZW5kZXJEaXJlY3RseVRvSG9zdFdpbmRvdyk7CisgICAgICAgIHJldHVybiBj
b250ZXh0OwogICAgIH0KIAotICAgIHZpcnR1YWwgUGFzc093blB0cjxDQ0xheWVyVHJlZUhvc3RD
b21taXR0ZXI+IGNyZWF0ZUxheWVyVHJlZUhvc3RDb21taXR0ZXIoKQorICAgIHZpcnR1YWwgUGFz
c093blB0cjxMYXllclBhaW50ZXJDaHJvbWl1bT4gY3JlYXRlUm9vdExheWVyUGFpbnRlcigpCiAg
ICAgewotICAgICAgICByZXR1cm4gTW9ja0xheWVyVHJlZUhvc3RDb21taXR0ZXI6OmNyZWF0ZSht
X3Rlc3QpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHZv
aWQgYmVnaW5Db21taXQoKQorICAgIHZpcnR1YWwgUGFzc093blB0cjxDQ0xheWVyVHJlZUhvc3RJ
bXBsPiBjcmVhdGVMYXllclRyZWVIb3N0SW1wbChjb25zdCBDQ1NldHRpbmdzJiBzZXR0aW5ncykK
ICAgICB7Ci0gICAgICAgIENDTGF5ZXJUcmVlSG9zdDo6YmVnaW5Db21taXQoKTsKLSAgICAgICAg
bV90ZXN0LT5iZWdpbkNvbW1pdE9uTWFpblRocmVhZCh0aGlzKTsKKyAgICAgICAgcmV0dXJuIE1v
Y2tMYXllclRyZWVIb3N0SW1wbDo6Y3JlYXRlKHNldHRpbmdzLCBtX3Rlc3QpOwogICAgIH0KIAot
ICAgIHZpcnR1YWwgdm9pZCBjb21taXRDb21wbGV0ZSgpCisgICAgdmlydHVhbCB2b2lkIGRpZFJl
Y3JlYXRlR3JhcGhpY3NDb250ZXh0KGJvb2wgc3VjY2VzcykKICAgICB7Ci0gICAgICAgIG1fdGVz
dC0+Y29tbWl0Q29tcGxldGVPbk1haW5UaHJlYWQodGhpcyk7Ci0gICAgICAgIENDTGF5ZXJUcmVl
SG9zdDo6Y29tbWl0Q29tcGxldGUoKTsKICAgICB9CiAKIHByaXZhdGU6CkBAIC0yNzQsMTEgKzI2
NywxNiBAQCBwcml2YXRlOgogCiB2b2lkIENDTGF5ZXJUcmVlSG9zdFRlc3Q6OmRvQmVnaW5UZXN0
KCkKIHsKKyAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOwogICAgIEFTU0VSVCghbV9ydW5uaW5n
KTsKICAgICBtX3J1bm5pbmcgPSB0cnVlOwogICAgIG1fY2xpZW50ID0gYWRvcHRQdHIobmV3IE1v
Y2tMYXllclRyZWVIb3N0Q2xpZW50KHRoaXMpKTsKLSAgICBtX2xheWVyVHJlZUhvc3QgPSBhZG9w
dFJlZihuZXcgTW9ja0xheWVyVHJlZUhvc3QobV9jbGllbnQuZ2V0KCksIHRoaXMpKTsKLSAgICBt
X2xheWVyVHJlZUhvc3QtPmluaXQoKTsKKworICAgIENDU2V0dGluZ3Mgc2V0dGluZ3M7CisgICAg
c2V0dGluZ3MuZW5hYmxlQ29tcG9zaXRvclRocmVhZCA9IHRydWU7CisgICAgbV9sYXllclRyZWVI
b3N0ID0gQ0NMYXllclRyZWVIb3N0OjpjcmVhdGUobV9jbGllbnQuZ2V0KCksIHNldHRpbmdzKTsK
KyAgICBBU1NFUlQobV9sYXllclRyZWVIb3N0KTsKKwogICAgIG1fYmVnaW5uaW5nID0gdHJ1ZTsK
ICAgICBiZWdpblRlc3QoKTsKICAgICBtX2JlZ2lubmluZyA9IGZhbHNlOwpAQCAtMzI3LDcgKzMy
NSw3IEBAIHB1YmxpYzoKIAogICAgIHZpcnR1YWwgdm9pZCBiZWdpblRlc3QoKQogICAgIHsKLSAg
ICAgICAgbV9sYXllclRyZWVIb3N0LT5zZXROZWVkc0NvbW1pdEFuZFJlZHJhdygpOworICAgICAg
ICBwb3N0U2V0TmVlZHNDb21taXRUb01haW5UaHJlYWQoKTsKICAgICAgICAgZW5kVGVzdCgpOwog
ICAgIH0KIApAQCAtMzQ3LDcgKzM0NSw3IEBAIHB1YmxpYzoKIAogICAgIHZpcnR1YWwgdm9pZCBi
ZWdpblRlc3QoKQogICAgIHsKLSAgICAgICAgbV9sYXllclRyZWVIb3N0LT5zZXROZWVkc1JlZHJh
dygpOworICAgICAgICBwb3N0U2V0TmVlZHNSZWRyYXdUb01haW5UaHJlYWQoKTsKICAgICAgICAg
ZW5kVGVzdCgpOwogICAgIH0KIApAQCAtMzcxLDcgKzM2OSw3IEBAIHB1YmxpYzoKIAogICAgIHZp
cnR1YWwgdm9pZCBiZWdpblRlc3QoKQogICAgIHsKLSAgICAgICAgbV9sYXllclRyZWVIb3N0LT5z
ZXROZWVkc0NvbW1pdEFuZFJlZHJhdygpOworICAgICAgICBwb3N0U2V0TmVlZHNDb21taXRUb01h
aW5UaHJlYWQoKTsKICAgICAgICAgZW5kVGVzdCgpOwogICAgIH0KIApAQCAtMzgyLDEyICszODAs
MTIgQEAgcHVibGljOgogICAgICAgICAgICAgZW5kVGVzdCgpOwogICAgIH0KIAotICAgIHZpcnR1
YWwgdm9pZCBkcmF3TGF5ZXJzQW5kUHJlc2VudE9uQ0NUaHJlYWQoTW9ja0xheWVyVHJlZUhvc3RJ
bXBsKiBsYXllclRyZWVIb3N0SW1wbCkKKyAgICB2aXJ0dWFsIHZvaWQgZHJhd0xheWVyc09uQ0NU
aHJlYWQoTW9ja0xheWVyVHJlZUhvc3RJbXBsKiBsYXllclRyZWVIb3N0SW1wbCkKICAgICB7CiAg
ICAgICAgIGlmIChtX251bURyYXdzID09IDEpCi0gICAgICAgICAgICBsYXllclRyZWVIb3N0SW1w
bC0+c2V0TmVlZHNDb21taXRBbmRSZWRyYXcoKTsKKyAgICAgICAgICBwb3N0U2V0TmVlZHNDb21t
aXRUb01haW5UaHJlYWQoKTsKICAgICAgICAgbV9udW1EcmF3cysrOwotICAgICAgICBsYXllclRy
ZWVIb3N0SW1wbC0+c2V0TmVlZHNSZWRyYXcoKTsKKyAgICAgICAgcG9zdFNldE5lZWRzUmVkcmF3
VG9NYWluVGhyZWFkKCk7CiAgICAgfQogCiAgICAgdmlydHVhbCB2b2lkIGFmdGVyVGVzdCgpCkBA
IC00MTUsMTggKzQxMywxOCBAQCBwdWJsaWM6CiAKICAgICB2aXJ0dWFsIHZvaWQgYmVnaW5UZXN0
KCkKICAgICB7Ci0gICAgICAgIG1fbGF5ZXJUcmVlSG9zdC0+c2V0TmVlZHNDb21taXRBbmRSZWRy
YXcoKTsKLSAgICAgICAgbV9sYXllclRyZWVIb3N0LT5zZXROZWVkc0NvbW1pdEFuZFJlZHJhdygp
OworICAgICAgICBwb3N0U2V0TmVlZHNDb21taXRUb01haW5UaHJlYWQoKTsKKyAgICAgICAgcG9z
dFNldE5lZWRzQ29tbWl0VG9NYWluVGhyZWFkKCk7CiAgICAgfQogCi0gICAgdmlydHVhbCB2b2lk
IGRyYXdMYXllcnNBbmRQcmVzZW50T25DQ1RocmVhZChNb2NrTGF5ZXJUcmVlSG9zdEltcGwqIGxh
eWVyVHJlZUhvc3RJbXBsKQorICAgIHZpcnR1YWwgdm9pZCBkcmF3TGF5ZXJzT25DQ1RocmVhZChN
b2NrTGF5ZXJUcmVlSG9zdEltcGwqIGxheWVyVHJlZUhvc3RJbXBsKQogICAgIHsKICAgICAgICAg
bV9udW1EcmF3cysrOwogICAgICAgICBpZiAoIWxheWVyVHJlZUhvc3RJbXBsLT5zb3VyY2VGcmFt
ZU51bWJlcigpKQogICAgICAgICAgICAgZW5kVGVzdCgpOwogICAgIH0KIAotICAgIHZpcnR1YWwg
dm9pZCBjb21taXRPbkNDVGhyZWFkKE1vY2tMYXllclRyZWVIb3N0KiBsYXllclRyZWVIb3N0LCBN
b2NrTGF5ZXJUcmVlSG9zdEltcGwqIGltcGwpCisgICAgdmlydHVhbCB2b2lkIGNvbW1pdENvbXBs
ZXRlT25DQ1RocmVhZChNb2NrTGF5ZXJUcmVlSG9zdEltcGwqIGltcGwpCiAgICAgewogICAgICAg
ICBtX251bUNvbW1pdHMrKzsKICAgICB9CkBAIC00NTgsMTggKzQ1NiwxOCBAQCBwdWJsaWM6CiAK
ICAgICB2aXJ0dWFsIHZvaWQgYmVnaW5UZXN0KCkKICAgICB7Ci0gICAgICAgIG1fbGF5ZXJUcmVl
SG9zdC0+c2V0TmVlZHNDb21taXRBbmRSZWRyYXcoKTsKKyAgICAgICAgcG9zdFNldE5lZWRzQ29t
bWl0VG9NYWluVGhyZWFkKCk7CiAgICAgfQogCi0gICAgdmlydHVhbCB2b2lkIGRyYXdMYXllcnNB
bmRQcmVzZW50T25DQ1RocmVhZChNb2NrTGF5ZXJUcmVlSG9zdEltcGwqIGxheWVyVHJlZUhvc3RJ
bXBsKQorICAgIHZpcnR1YWwgdm9pZCBkcmF3TGF5ZXJzT25DQ1RocmVhZChNb2NrTGF5ZXJUcmVl
SG9zdEltcGwqIGxheWVyVHJlZUhvc3RJbXBsKQogICAgIHsKICAgICAgICAgaWYgKCFsYXllclRy
ZWVIb3N0SW1wbC0+c291cmNlRnJhbWVOdW1iZXIoKSkKLSAgICAgICAgICAgIGxheWVyVHJlZUhv
c3RJbXBsLT5zZXROZWVkc0NvbW1pdEFuZFJlZHJhdygpOworICAgICAgICAgICAgcG9zdFNldE5l
ZWRzQ29tbWl0VG9NYWluVGhyZWFkKCk7CiAgICAgICAgIGVsc2UgaWYgKGxheWVyVHJlZUhvc3RJ
bXBsLT5zb3VyY2VGcmFtZU51bWJlcigpID09IDEpCiAgICAgICAgICAgICBlbmRUZXN0KCk7CiAg
ICAgfQogCi0gICAgdmlydHVhbCB2b2lkIGNvbW1pdE9uQ0NUaHJlYWQoTW9ja0xheWVyVHJlZUhv
c3QqIGxheWVyVHJlZUhvc3QsIE1vY2tMYXllclRyZWVIb3N0SW1wbCogaW1wbCkKKyAgICB2aXJ0
dWFsIHZvaWQgY29tbWl0Q29tcGxldGVPbkNDVGhyZWFkKE1vY2tMYXllclRyZWVIb3N0SW1wbCog
aW1wbCkKICAgICB7CiAgICAgICAgIG1fbnVtQ29tbWl0cysrOwogICAgIH0KQEAgLTUwMSwxOSAr
NDk5LDIwIEBAIHB1YmxpYzoKIAogICAgIHZpcnR1YWwgdm9pZCBiZWdpblRlc3QoKQogICAgIHsK
Ky8vICAgICAgICBwb3N0U2V0TmVlZHNDb21taXRUb01haW5UaHJlYWQoKTsKICAgICB9CiAKLSAg
ICB2aXJ0dWFsIHZvaWQgZHJhd0xheWVyc0FuZFByZXNlbnRPbkNDVGhyZWFkKE1vY2tMYXllclRy
ZWVIb3N0SW1wbCogaW1wbCkKKyAgICB2aXJ0dWFsIHZvaWQgZHJhd0xheWVyc09uQ0NUaHJlYWQo
TW9ja0xheWVyVHJlZUhvc3RJbXBsKiBpbXBsKQogICAgIHsKICAgICAgICAgRVhQRUNUX0VRKDAs
IGltcGwtPnNvdXJjZUZyYW1lTnVtYmVyKCkpOwogICAgICAgICBpZiAoIW1fbnVtRHJhd3MpCi0g
ICAgICAgICAgICBpbXBsLT5zZXROZWVkc1JlZHJhdygpOyAvLyByZWRyYXcgYWdhaW4gdG8gdmVy
aWZ5IHRoYXQgdGhlIHNlY29uZCByZWRyYXcgZG9lc250IGNvbW1pdC4KKyAgICAgICAgICAgIHBv
c3RTZXROZWVkc1JlZHJhd1RvTWFpblRocmVhZCgpOyAvLyByZWRyYXcgYWdhaW4gdG8gdmVyaWZ5
IHRoYXQgdGhlIHNlY29uZCByZWRyYXcgZG9lc250IGNvbW1pdC4KICAgICAgICAgZWxzZQogICAg
ICAgICAgICAgZW5kVGVzdCgpOwogICAgICAgICBtX251bURyYXdzKys7CiAgICAgfQogCi0gICAg
dmlydHVhbCB2b2lkIGNvbW1pdE9uQ0NUaHJlYWQoTW9ja0xheWVyVHJlZUhvc3QqIGxheWVyVHJl
ZUhvc3QsIE1vY2tMYXllclRyZWVIb3N0SW1wbCogaW1wbCkKKyAgICB2aXJ0dWFsIHZvaWQgY29t
bWl0Q29tcGxldGVPbkNDVGhyZWFkKE1vY2tMYXllclRyZWVIb3N0SW1wbCogaW1wbCkKICAgICB7
CiAgICAgICAgIG1fbnVtQ29tbWl0cysrOwogICAgIH0K
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>107493</attachid>
            <date>2011-09-15 07:26:27 -0700</date>
            <delta_ts>2011-09-16 04:16:33 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-67418-20110915152625.patch</filename>
            <type>text/plain</type>
            <size>26868</size>
            <attacher name="Iain Merrick">husky</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDk1MTg4KQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMzEgQEAKKzIwMTEtMDktMTUgIElhaW4gTWVy
cmljayAgPGh1c2t5QGdvb2dsZS5jb20+CisKKyAgICAgICAgW2Nocm9taXVtXSBGaXggQ0NMYXll
clRyZWVIb3N0VGVzdAorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5j
Z2k/aWQ9Njc0MTgKKworICAgICAgICBGaXhlcyBuZWVkZWQgdG8gY29tcGlsZSBhbmQgbGluayB3
aXRoIFVTRV9USFJFQURFRF9DT01QT1NJVElORworICAgICAgICBlbmFibGVkLCBhbmQgdG8gcGFz
cyB0aGUgYmFzaWMgdW5pdCB0ZXN0LgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09Q
UyEpLgorCisgICAgICAgIFRlc3Q6IFdlYktpdC9jaHJvbWl1bS90ZXN0cy9DQ0xheWVyVHJlZUhv
c3RUZXN0CisKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9Db250ZW50TGF5
ZXJDaHJvbWl1bS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpDb250ZW50TGF5ZXJDaHJvbWl1bTo6
Y3JlYXRlVGV4dHVyZVVwZGF0ZXIpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Nocm9t
aXVtL0xheWVyUmVuZGVyZXJDaHJvbWl1bS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpMYXllclJl
bmRlcmVyQ2hyb21pdW06OkxheWVyUmVuZGVyZXJDaHJvbWl1bSk6CisgICAgICAgICogcGxhdGZv
cm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NMYXllclRyZWVIb3N0LmNwcDoKKyAgICAgICAgKFdl
YkNvcmU6OkNDTGF5ZXJUcmVlSG9zdENsaWVudDo6Y3JlYXRlTGF5ZXJUcmVlSG9zdEltcGwpOgor
ICAgICAgICAoV2ViQ29yZTo6Q0NMYXllclRyZWVIb3N0OjpjcmVhdGVMYXllclRyZWVIb3N0SW1w
bCk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NMYXllclRyZWVI
b3N0Lmg6CisgICAgICAgIChXZWJDb3JlOjpDQ0xheWVyVHJlZUhvc3RDbGllbnQ6On5DQ0xheWVy
VHJlZUhvc3RDbGllbnQpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2Nj
L0NDTGF5ZXJUcmVlSG9zdEltcGwuaDoKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jaHJv
bWl1bS9jYy9DQ1RocmVhZFByb3h5LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkNDVGhyZWFkUHJv
eHk6OmNvbnRleHQpOgorICAgICAgICAoV2ViQ29yZTo6Q0NUaHJlYWRQcm94eTo6YmVnaW5GcmFt
ZUFuZENvbW1pdE9uQ0NUaHJlYWQpOgorICAgICAgICAoV2ViQ29yZTo6Q0NUaHJlYWRQcm94eTo6
c2V0TmVlZHNDb21taXRBbmRSZWRyYXdPbkNDVGhyZWFkKToKKyAgICAgICAgKFdlYkNvcmU6OkND
VGhyZWFkUHJveHk6OnNldE5lZWRzUmVkcmF3T25DQ1RocmVhZCk6CisKIDIwMTEtMDktMTUgIFBl
dGVyIEJldmVybG9vICA8cGV0ZXJAY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFtDaHJvbWl1bV0g
TWFrZSBzdXJlIHRoYXQgdGhlIEFSTSBORU9OIGZpbGVzIGJ1aWxkIHdpdGggLW1hcm0KSW5kZXg6
IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0NvbnRlbnRMYXllckNo
cm9taXVtLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9jaHJvbWl1bS9Db250ZW50TGF5ZXJDaHJvbWl1bS5jcHAJKHJldmlzaW9uIDk1MTg1KQorKysg
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vQ29udGVudExheWVyQ2hy
b21pdW0uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xMjAsNiArMTIwLDcgQEAgYm9vbCBDb250ZW50
TGF5ZXJDaHJvbWl1bTo6ZHJhd3NDb250ZW50KAogCiB2b2lkIENvbnRlbnRMYXllckNocm9taXVt
OjpjcmVhdGVUZXh0dXJlVXBkYXRlcihjb25zdCBDQ0xheWVyVHJlZUhvc3QqIGhvc3QpCiB7Cisj
aWYgIVVTRShUSFJFQURFRF9DT01QT1NJVElORykKICNpZiBVU0UoU0tJQSkKICAgICAvLyBOb3Rl
IHRoYXQgaG9zdC0+c2tpYUNvbnRleHQoKSB3aWxsIGNyYXNoIGlmIGNhbGxlZCB3aGlsZSBpbiB0
aHJlYWRlZAogICAgIC8vIG1vZGUuIFRoaXMgdGh1cyBkZXBlbmRzIG9uIENDTGF5ZXJUcmVlSG9z
dDo6aW5pdGlhbGl6ZSB0dXJuaW5nIG9mZgpAQCAtMTI5LDYgKzEzMCw3IEBAIHZvaWQgQ29udGVu
dExheWVyQ2hyb21pdW06OmNyZWF0ZVRleHR1cmUKICAgICAgICAgcmV0dXJuOwogICAgIH0KICNl
bmRpZiAvLyBTS0lBCisjZW5kaWYgLy8gIVRIUkVBREVEX0NPTVBPU0lUSU5HCiAKICAgICBtX3Rl
eHR1cmVVcGRhdGVyID0gTGF5ZXJUZXh0dXJlVXBkYXRlckJpdG1hcDo6Y3JlYXRlKENvbnRlbnRM
YXllclBhaW50ZXI6OmNyZWF0ZShtX2RlbGVnYXRlKSwgaG9zdC0+bGF5ZXJSZW5kZXJlckNhcGFi
aWxpdGllcygpLnVzaW5nTWFwU3ViKTsKIH0KSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL2Nocm9taXVtL0xheWVyUmVuZGVyZXJDaHJvbWl1bS5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vTGF5ZXJSZW5kZXJl
ckNocm9taXVtLmNwcAkocmV2aXNpb24gOTUxODUpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9jaHJvbWl1bS9MYXllclJlbmRlcmVyQ2hyb21pdW0uY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC0xNDgsNiArMTQ4LDcgQEAgTGF5ZXJSZW5kZXJlckNocm9taXVtOjpMYXllclJlbmRl
cmVyQ2hybwogICAgICwgbV9jdXJyZW50UmVuZGVyU3VyZmFjZSgwKQogICAgICwgbV9vZmZzY3Jl
ZW5GcmFtZWJ1ZmZlcklkKDApCiAgICAgLCBtX3pvb21BbmltYXRvclNjYWxlKDEpCisgICAgLCBt
X2NvbnRlbnRzVGV4dHVyZU1lbW9yeVVzZUJ5dGVzKDApCiAgICAgLCBtX2NvbnRleHQoY29udGV4
dCkKICAgICAsIG1fZGVmYXVsdFJlbmRlclN1cmZhY2UoMCkKICAgICAsIG1fc2hhcmVkR2VvbWV0
cnlRdWFkKEZsb2F0UmVjdCgtMC41ZiwgLTAuNWYsIDEuMGYsIDEuMGYpKQpJbmRleDogU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NMYXllclRyZWVIb3N0LmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1
bS9jYy9DQ0xheWVyVHJlZUhvc3QuY3BwCShyZXZpc2lvbiA5NTE4NSkKKysrIFNvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDTGF5ZXJUcmVlSG9zdC5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTM5LDYgKzM5LDExIEBACiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAor
UGFzc093blB0cjxDQ0xheWVyVHJlZUhvc3RJbXBsPiBDQ0xheWVyVHJlZUhvc3RDbGllbnQ6OmNy
ZWF0ZUxheWVyVHJlZUhvc3RJbXBsKGNvbnN0IENDU2V0dGluZ3MmIHNldHRpbmdzKQoreworICAg
IHJldHVybiBDQ0xheWVyVHJlZUhvc3RJbXBsOjpjcmVhdGUoc2V0dGluZ3MpOworfQorCiBQYXNz
UmVmUHRyPENDTGF5ZXJUcmVlSG9zdD4gQ0NMYXllclRyZWVIb3N0OjpjcmVhdGUoQ0NMYXllclRy
ZWVIb3N0Q2xpZW50KiBjbGllbnQsIFBhc3NSZWZQdHI8TGF5ZXJDaHJvbWl1bT4gcm9vdExheWVy
LCBjb25zdCBDQ1NldHRpbmdzJiBzZXR0aW5ncykKIHsKICAgICBSZWZQdHI8Q0NMYXllclRyZWVI
b3N0PiBsYXllclRyZWVIb3N0ID0gYWRvcHRSZWYobmV3IENDTGF5ZXJUcmVlSG9zdChjbGllbnQs
IHJvb3RMYXllciwgc2V0dGluZ3MpKTsKQEAgLTE0Niw3ICsxNTEsNyBAQCBQYXNzUmVmUHRyPEdy
YXBoaWNzQ29udGV4dDNEPiBDQ0xheWVyVHJlCiAKIFBhc3NPd25QdHI8Q0NMYXllclRyZWVIb3N0
SW1wbD4gQ0NMYXllclRyZWVIb3N0OjpjcmVhdGVMYXllclRyZWVIb3N0SW1wbCgpCiB7Ci0gICAg
cmV0dXJuIENDTGF5ZXJUcmVlSG9zdEltcGw6OmNyZWF0ZShtX3NldHRpbmdzKTsKKyAgICByZXR1
cm4gbV9jbGllbnQtPmNyZWF0ZUxheWVyVHJlZUhvc3RJbXBsKG1fc2V0dGluZ3MpOwogfQogCiB2
b2lkIENDTGF5ZXJUcmVlSG9zdDo6ZGlkUmVjcmVhdGVHcmFwaGljc0NvbnRleHQoYm9vbCBzdWNj
ZXNzKQpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2Mv
Q0NMYXllclRyZWVIb3N0LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NMYXllclRyZWVIb3N0LmgJKHJldmlzaW9uIDk1MTg1KQor
KysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NMYXllclRy
ZWVIb3N0LmgJKHdvcmtpbmcgY29weSkKQEAgLTQ2LDIwICs0Niw2IEBAIGNsYXNzIExheWVyQ2hy
b21pdW07CiBjbGFzcyBMYXllclBhaW50ZXJDaHJvbWl1bTsKIGNsYXNzIFRleHR1cmVNYW5hZ2Vy
OwogCi1jbGFzcyBDQ0xheWVyVHJlZUhvc3RDbGllbnQgewotcHVibGljOgotICAgIHZpcnR1YWwg
dm9pZCBhbmltYXRlQW5kTGF5b3V0KGRvdWJsZSBmcmFtZUJlZ2luVGltZSkgPSAwOwotICAgIHZp
cnR1YWwgUGFzc093blB0cjxDQ1RocmVhZD4gY3JlYXRlQ29tcG9zaXRvclRocmVhZCgpID0gMDsK
LSAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8R3JhcGhpY3NDb250ZXh0M0Q+IGNyZWF0ZUxheWVyVHJl
ZUhvc3RDb250ZXh0M0QoKSA9IDA7Ci0gICAgdmlydHVhbCBQYXNzT3duUHRyPExheWVyUGFpbnRl
ckNocm9taXVtPiBjcmVhdGVSb290TGF5ZXJQYWludGVyKCkgPSAwOwotICAgIHZpcnR1YWwgdm9p
ZCBkaWRSZWNyZWF0ZUdyYXBoaWNzQ29udGV4dChib29sIHN1Y2Nlc3MpID0gMDsKLSNpZiAhVVNF
KFRIUkVBREVEX0NPTVBPU0lUSU5HKQotICAgIHZpcnR1YWwgdm9pZCBzY2hlZHVsZUNvbXBvc2l0
ZSgpID0gMDsKLSNlbmRpZgotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfkNDTGF5ZXJUcmVlSG9z
dENsaWVudCgpIHsgfQotfTsKLQogc3RydWN0IENDU2V0dGluZ3MgewogICAgIENDU2V0dGluZ3Mo
KQogICAgICAgICAgICAgOiBhY2NlbGVyYXRlUGFpbnRpbmcoZmFsc2UpCkBAIC03NSw2ICs2MSwy
MSBAQCBzdHJ1Y3QgQ0NTZXR0aW5ncyB7CiAgICAgYm9vbCBzaG93UGxhdGZvcm1MYXllclRyZWU7
CiB9OwogCitjbGFzcyBDQ0xheWVyVHJlZUhvc3RDbGllbnQgeworcHVibGljOgorICAgIHZpcnR1
YWwgdm9pZCBhbmltYXRlQW5kTGF5b3V0KGRvdWJsZSBmcmFtZUJlZ2luVGltZSkgPSAwOworICAg
IHZpcnR1YWwgUGFzc093blB0cjxDQ1RocmVhZD4gY3JlYXRlQ29tcG9zaXRvclRocmVhZCgpID0g
MDsKKyAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8R3JhcGhpY3NDb250ZXh0M0Q+IGNyZWF0ZUxheWVy
VHJlZUhvc3RDb250ZXh0M0QoKSA9IDA7CisgICAgdmlydHVhbCBQYXNzT3duUHRyPExheWVyUGFp
bnRlckNocm9taXVtPiBjcmVhdGVSb290TGF5ZXJQYWludGVyKCkgPSAwOworICAgIHZpcnR1YWwg
UGFzc093blB0cjxDQ0xheWVyVHJlZUhvc3RJbXBsPiBjcmVhdGVMYXllclRyZWVIb3N0SW1wbChj
b25zdCBDQ1NldHRpbmdzJik7CisgICAgdmlydHVhbCB2b2lkIGRpZFJlY3JlYXRlR3JhcGhpY3ND
b250ZXh0KGJvb2wgc3VjY2VzcykgPSAwOworI2lmICFVU0UoVEhSRUFERURfQ09NUE9TSVRJTkcp
CisgICAgdmlydHVhbCB2b2lkIHNjaGVkdWxlQ29tcG9zaXRlKCkgPSAwOworI2VuZGlmCitwcm90
ZWN0ZWQ6CisgICAgdmlydHVhbCB+Q0NMYXllclRyZWVIb3N0Q2xpZW50KCkgeyB9Cit9OworCiAv
LyBQcm92aWRlcyBpbmZvcm1hdGlvbiBvbiBhbiBJbXBsJ3MgcmVuZGVyaW5nIGNhcGFiaWxpdGll
cyBiYWNrIHRvIHRoZSBDQ0xheWVyVHJlZUhvc3QKIHN0cnVjdCBMYXllclJlbmRlcmVyQ2FwYWJp
bGl0aWVzIHsKICAgICBMYXllclJlbmRlcmVyQ2FwYWJpbGl0aWVzKCkKSW5kZXg6IFNvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDTGF5ZXJUcmVlSG9zdEltcGwu
aAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1
bS9jYy9DQ0xheWVyVHJlZUhvc3RJbXBsLmgJKHJldmlzaW9uIDk1MTg1KQorKysgU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NMYXllclRyZWVIb3N0SW1wbC5o
CSh3b3JraW5nIGNvcHkpCkBAIC00NiwxMyArNDYsMTMgQEAgcHVibGljOgogICAgIHN0YXRpYyBQ
YXNzT3duUHRyPENDTGF5ZXJUcmVlSG9zdEltcGw+IGNyZWF0ZShjb25zdCBDQ1NldHRpbmdzJik7
CiAgICAgdmlydHVhbCB+Q0NMYXllclRyZWVIb3N0SW1wbCgpOwogCisgICAgLy8gVmlydHVhbCBm
b3IgdGVzdGluZwogICAgIHZpcnR1YWwgdm9pZCBiZWdpbkNvbW1pdCgpOwogICAgIHZpcnR1YWwg
dm9pZCBjb21taXRDb21wbGV0ZSgpOworICAgIHZpcnR1YWwgdm9pZCBkcmF3TGF5ZXJzKCk7CiAK
ICAgICBHcmFwaGljc0NvbnRleHQzRCogY29udGV4dCgpOwogCi0gICAgdm9pZCBkcmF3TGF5ZXJz
KCk7Ci0KICAgICB2b2lkIGZpbmlzaEFsbFJlbmRlcmluZygpOwogICAgIGludCBmcmFtZU51bWJl
cigpIGNvbnN0IHsgcmV0dXJuIG1fZnJhbWVOdW1iZXI7IH0KIApJbmRleDogU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NUaHJlYWRQcm94eS5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NU
aHJlYWRQcm94eS5jcHAJKHJldmlzaW9uIDk1MTg1KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NUaHJlYWRQcm94eS5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTg0LDcgKzg0LDYgQEAgYm9vbCBDQ1RocmVhZFByb3h5Ojpjb21wb3NpdGVBbmRSZWFkYmFj
awogCiBHcmFwaGljc0NvbnRleHQzRCogQ0NUaHJlYWRQcm94eTo6Y29udGV4dCgpCiB7Ci0gICAg
QVNTRVJUX05PVF9SRUFDSEVEKCk7CiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTE4Niw4ICsxODUs
OCBAQCB2b2lkIENDVGhyZWFkUHJveHk6OmJlZ2luRnJhbWVBbmRDb21taXRPCiB7CiAgICAgVFJB
Q0VfRVZFTlQoIkNDVGhyZWFkUHJveHk6OmJlZ2luRnJhbWVBbmRDb21taXRPbkNDVGhyZWFkIiwg
dGhpcywgMCk7CiAgICAgQVNTRVJUKGlzSW1wbFRocmVhZCgpKTsKLSAgICBBU1NFUlRfTk9UX1JF
QUNIRUQoKTsKLSAgICAvLyBGSVhNRTogY2FsbCBiZWdpbkZyYW1lQW5kQ29tbWl0IG9uIG1haW4g
dGhyZWFkCisgICAgLy8gVEVNUCBIQUNLIHNvIHdlIGNhbiBleGVyY2lzZSB0aGlzIGNvZGUgaW4g
dW5pdCB0ZXN0cy4KKyAgICBDQ01haW5UaHJlYWQ6OnBvc3RUYXNrKGNyZWF0ZU1haW5UaHJlYWRU
YXNrKHRoaXMsICZDQ1RocmVhZFByb3h5OjpiZWdpbkZyYW1lQW5kQ29tbWl0LCAwLjApKTsKIH0K
IAogdm9pZCBDQ1RocmVhZFByb3h5OjpiZWdpbkZyYW1lQW5kQ29tbWl0KGRvdWJsZSBmcmFtZUJl
Z2luVGltZSkKQEAgLTI0NywxMyArMjQ2LDE1IEBAIHZvaWQgQ0NUaHJlYWRQcm94eTo6c2V0TmVl
ZHNDb21taXRBbmRSZWQKICAgICBUUkFDRV9FVkVOVCgiQ0NUaHJlYWRQcm94eTo6c2V0TmVlZHND
b21taXRBbmRSZWRyYXdPbkNDVGhyZWFkIiwgdGhpcywgMCk7CiAgICAgQVNTRVJUKGlzSW1wbFRo
cmVhZCgpKTsKICAgICBBU1NFUlQobV9sYXllclRyZWVIb3N0SW1wbCk7Ci0gICAgQVNTRVJUX05P
VF9SRUFDSEVEKCk7CisgICAgLy8gVEVNUCBIQUNLIHNvIHdlIGNhbiBleGVyY2lzZSB0aGlzIGNv
ZGUgaW4gdW5pdCB0ZXN0cy4KKyAgICBDQ01haW5UaHJlYWQ6OnBvc3RUYXNrKGNyZWF0ZU1haW5U
aHJlYWRUYXNrKHRoaXMsICZDQ1RocmVhZFByb3h5OjpiZWdpbkZyYW1lQW5kQ29tbWl0LCAwLjAp
KTsKIH0KIAogdm9pZCBDQ1RocmVhZFByb3h5OjpzZXROZWVkc1JlZHJhd09uQ0NUaHJlYWQoKQog
ewogICAgIFRSQUNFX0VWRU5UKCJDQ1RocmVhZFByb3h5OjpzZXROZWVkc1JlZHJhd09uQ0NUaHJl
YWQiLCB0aGlzLCAwKTsKLSAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAvLyBURU1QIEhB
Q0sgc28gd2UgY2FuIGV4ZXJjaXNlIHRoaXMgY29kZSBpbiB1bml0IHRlc3RzLgorICAgIGRyYXdM
YXllcnNPbkNDVGhyZWFkKCk7CiB9CiAKIHZvaWQgQ0NUaHJlYWRQcm94eTo6aW5pdGlhbGl6ZUlt
cGxPbkNDVGhyZWFkKENDQ29tcGxldGlvbkV2ZW50KiBjb21wbGV0aW9uKQpAQCAtMjg0LDQgKzI4
NSw0IEBAIHZvaWQgQ0NUaHJlYWRQcm94eTo6bGF5ZXJUcmVlSG9zdENsb3NlZE8KICAgICBjb21w
bGV0aW9uLT5zaWduYWwoKTsKIH0KIAotfQorfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDog
U291cmNlL1dlYktpdC9jaHJvbWl1bS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dl
YktpdC9jaHJvbWl1bS9DaGFuZ2VMb2cJKHJldmlzaW9uIDk1MTg4KQorKysgU291cmNlL1dlYktp
dC9jaHJvbWl1bS9DaGFuZ2VMb2cJKHdvcmtpbmcgY29weSkKQEAgLTEsMyArMSw2MCBAQAorMjAx
MS0wOS0xNSAgSWFpbiBNZXJyaWNrICA8aHVza3lAZ29vZ2xlLmNvbT4KKworICAgICAgICBbY2hy
b21pdW1dIEZpeCBDQ0xheWVyVHJlZUhvc3RUZXN0CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD02NzQxOAorCisgICAgICAgIFRoaXMgaXMgYSBtaW5pbWFs
IHNldCBvZiBjaGFuZ2VzIHRvIGdldCBDQ0xheWVyVHJlZUhvc3RUZXN0CisgICAgICAgIGNvbXBp
bGluZywgcnVubmluZyBhbmQgcGFzc2luZyB3aXRoIFVTRV9USFJFQURFRF9DT01QT1NJVElORwor
ICAgICAgICBlbmFibGVkLgorCisgICAgICAgIFRPRE8gaW4gYSBmdXR1cmUgcGF0Y2g6IHRpZHkg
dXAgbmFtaW5nIHNjaGVtZSBvZiB0ZXN0IGNsYXNzZXMsCisgICAgICAgIHNwbGl0IG91dCBpbnRv
IHNlcGFyYXRlIHJldXNhYmxlIG1vZHVsZXMgd2hlcmUgcG9zc2libGUuCisKKyAgICAgICAgUmV2
aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgKiBzcmMvR3JhcGhpY3NDb250ZXh0
M0RDaHJvbWl1bS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRFByaXZh
dGU6OkdyYXBoaWNzQ29udGV4dDNEUHJpdmF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGlj
c0NvbnRleHQzRFByaXZhdGU6OnBsYXRmb3JtTGF5ZXIpOgorICAgICAgICAqIHNyYy9HcmFwaGlj
c0NvbnRleHQzRFByaXZhdGUuaDoKKyAgICAgICAgKiB0ZXN0cy9DQ0xheWVyVHJlZUhvc3RUZXN0
LmNwcDoKKyAgICAgICAgKFdURjo6Q0NMYXllclRyZWVIb3N0VGVzdDo6YmVnaW5Db21taXRPbk1h
aW5UaHJlYWQpOgorICAgICAgICAoV1RGOjpDQ0xheWVyVHJlZUhvc3RUZXN0OjpkcmF3TGF5ZXJz
T25DQ1RocmVhZCk6CisgICAgICAgIChXVEY6OkNDTGF5ZXJUcmVlSG9zdFRlc3Q6OnBvc3RTZXRO
ZWVkc0NvbW1pdFRvTWFpblRocmVhZCk6CisgICAgICAgIChXVEY6OkNDTGF5ZXJUcmVlSG9zdFRl
c3Q6OnBvc3RTZXROZWVkc1JlZHJhd1RvTWFpblRocmVhZCk6CisgICAgICAgIChXVEY6OkNDTGF5
ZXJUcmVlSG9zdFRlc3Q6Om9uRW5kVGVzdCk6CisgICAgICAgIChXVEY6OkNDTGF5ZXJUcmVlSG9z
dFRlc3Q6OmRpc3BhdGNoU2V0TmVlZHNDb21taXQpOgorICAgICAgICAoV1RGOjpDQ0xheWVyVHJl
ZUhvc3RUZXN0OjpkaXNwYXRjaFNldE5lZWRzUmVkcmF3KToKKyAgICAgICAgKFdURjo6Q0NMYXll
clRyZWVIb3N0VGVzdDo6cnVuVGVzdCk6CisgICAgICAgIChXVEY6Ok15TW9ja0NvbnRleHQ6Om1h
a2VDb250ZXh0Q3VycmVudCk6CisgICAgICAgIChXVEY6Ok15TW9ja0NvbnRleHQ6OmNyZWF0ZVBy
b2dyYW0pOgorICAgICAgICAoV1RGOjpNeU1vY2tDb250ZXh0OjpjcmVhdGVTaGFkZXIpOgorICAg
ICAgICAoV1RGOjpNeU1vY2tDb250ZXh0OjpnZXRTaGFkZXJpdik6CisgICAgICAgIChXVEY6Ok15
TW9ja0NvbnRleHQ6OmdldFByb2dyYW1pdik6CisgICAgICAgIChXVEY6Ok1vY2tMYXllclRyZWVI
b3N0SW1wbDo6Y3JlYXRlKToKKyAgICAgICAgKFdURjo6TW9ja0xheWVyVHJlZUhvc3RJbXBsOjpk
cmF3TGF5ZXJzKToKKyAgICAgICAgKFdURjo6TW9ja0xheWVyVHJlZUhvc3RJbXBsOjpNb2NrTGF5
ZXJUcmVlSG9zdEltcGwpOgorICAgICAgICAoV1RGOjpNb2NrTGF5ZXJUcmVlSG9zdENsaWVudDo6
TW9ja0xheWVyVHJlZUhvc3RDbGllbnQpOgorICAgICAgICAoV1RGOjpNb2NrTGF5ZXJUcmVlSG9z
dENsaWVudDo6YW5pbWF0ZUFuZExheW91dCk6CisgICAgICAgIChXVEY6Ok1vY2tMYXllclRyZWVI
b3N0Q2xpZW50OjpjcmVhdGVDb21wb3NpdG9yVGhyZWFkKToKKyAgICAgICAgKFdURjo6TW9ja0xh
eWVyVHJlZUhvc3RDbGllbnQ6OmNyZWF0ZUxheWVyVHJlZUhvc3RDb250ZXh0M0QpOgorICAgICAg
ICAoV1RGOjpNb2NrTGF5ZXJUcmVlSG9zdENsaWVudDo6Y3JlYXRlUm9vdExheWVyUGFpbnRlcik6
CisgICAgICAgIChXVEY6Ok1vY2tMYXllclRyZWVIb3N0Q2xpZW50OjpjcmVhdGVMYXllclRyZWVI
b3N0SW1wbCk6CisgICAgICAgIChXVEY6Ok1vY2tMYXllclRyZWVIb3N0Q2xpZW50OjpkaWRSZWNy
ZWF0ZUdyYXBoaWNzQ29udGV4dCk6CisgICAgICAgIChXVEY6OkNDTGF5ZXJUcmVlSG9zdFRlc3Q6
OmRvQmVnaW5UZXN0KToKKyAgICAgICAgKFdURjo6Q0NMYXllclRyZWVIb3N0VGVzdFNob3J0bGl2
ZWQyOjpiZWdpblRlc3QpOgorICAgICAgICAoV1RGOjpDQ0xheWVyVHJlZUhvc3RUZXN0U2hvcnRs
aXZlZDM6OmJlZ2luVGVzdCk6CisgICAgICAgIChXVEY6OkNDTGF5ZXJUcmVlSG9zdFRlc3RDb21t
aXRpbmdXaXRoQ29udGludW91c1JlZHJhdzo6YmVnaW5UZXN0KToKKyAgICAgICAgKFdURjo6Q0NM
YXllclRyZWVIb3N0VGVzdENvbW1pdGluZ1dpdGhDb250aW51b3VzUmVkcmF3OjpkcmF3TGF5ZXJz
T25DQ1RocmVhZCk6CisgICAgICAgIChXVEY6OkNDTGF5ZXJUcmVlSG9zdFRlc3RTZXROZWVkc0Nv
bW1pdDE6OmJlZ2luVGVzdCk6CisgICAgICAgIChXVEY6OkNDTGF5ZXJUcmVlSG9zdFRlc3RTZXRO
ZWVkc0NvbW1pdDE6OmRyYXdMYXllcnNPbkNDVGhyZWFkKToKKyAgICAgICAgKFdURjo6Q0NMYXll
clRyZWVIb3N0VGVzdFNldE5lZWRzQ29tbWl0MTo6Y29tbWl0Q29tcGxldGVPbkNDVGhyZWFkKToK
KyAgICAgICAgKFdURjo6Q0NMYXllclRyZWVIb3N0VGVzdFNldE5lZWRzQ29tbWl0Mjo6YmVnaW5U
ZXN0KToKKyAgICAgICAgKFdURjo6Q0NMYXllclRyZWVIb3N0VGVzdFNldE5lZWRzQ29tbWl0Mjo6
ZHJhd0xheWVyc09uQ0NUaHJlYWQpOgorICAgICAgICAoV1RGOjpDQ0xheWVyVHJlZUhvc3RUZXN0
U2V0TmVlZHNDb21taXQyOjpjb21taXRDb21wbGV0ZU9uQ0NUaHJlYWQpOgorICAgICAgICAoV1RG
OjpDQ0xheWVyVHJlZUhvc3RUZXN0U2V0TmVlZHNSZWRyYXc6OmJlZ2luVGVzdCk6CisgICAgICAg
IChXVEY6OkNDTGF5ZXJUcmVlSG9zdFRlc3RTZXROZWVkc1JlZHJhdzo6ZHJhd0xheWVyc09uQ0NU
aHJlYWQpOgorICAgICAgICAoV1RGOjpDQ0xheWVyVHJlZUhvc3RUZXN0U2V0TmVlZHNSZWRyYXc6
OmNvbW1pdENvbXBsZXRlT25DQ1RocmVhZCk6CisKIDIwMTEtMDktMTUgIFhpYW56aHUgV2FuZyAg
PHdhbmd4aWFuemh1QGNocm9taXVtLm9yZz4KIAogICAgICAgICBMZXQgVGVzdFdlYktpdEFQSSB3
b3JrIGZvciBjaHJvbWl1bQpJbmRleDogU291cmNlL1dlYktpdC9jaHJvbWl1bS9zcmMvR3JhcGhp
Y3NDb250ZXh0M0RDaHJvbWl1bS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdC9jaHJv
bWl1bS9zcmMvR3JhcGhpY3NDb250ZXh0M0RDaHJvbWl1bS5jcHAJKHJldmlzaW9uIDk1MTg1KQor
KysgU291cmNlL1dlYktpdC9jaHJvbWl1bS9zcmMvR3JhcGhpY3NDb250ZXh0M0RDaHJvbWl1bS5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTk5LDkgKzk5LDYgQEAgR3JhcGhpY3NDb250ZXh0M0RQcml2
YXRlOjpHcmFwaGljc0NvbnRleAogI2Vycm9yIE11c3QgcG9ydCB0byB5b3VyIHBsYXRmb3JtCiAj
ZW5kaWYKIHsKLSNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCi0gICAgbV9jb21wb3Np
dGluZ0xheWVyID0gV2ViR0xMYXllckNocm9taXVtOjpjcmVhdGUoMCk7Ci0jZW5kaWYKIH0KIAog
R3JhcGhpY3NDb250ZXh0M0RQcml2YXRlOjp+R3JhcGhpY3NDb250ZXh0M0RQcml2YXRlKCkKQEAg
LTIyNyw2ICsyMjQsOCBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDNEUHJpdmF0ZTo6cHJlcGFyZVRl
CiAjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQogV2ViR0xMYXllckNocm9taXVtKiBH
cmFwaGljc0NvbnRleHQzRFByaXZhdGU6OnBsYXRmb3JtTGF5ZXIoKSBjb25zdAogeworICAgIGlm
ICghbV9jb21wb3NpdGluZ0xheWVyKQorICAgICAgICBtX2NvbXBvc2l0aW5nTGF5ZXIgPSBXZWJH
TExheWVyQ2hyb21pdW06OmNyZWF0ZSgwKTsKICAgICByZXR1cm4gbV9jb21wb3NpdGluZ0xheWVy
LmdldCgpOwogfQogI2VuZGlmCkluZGV4OiBTb3VyY2UvV2ViS2l0L2Nocm9taXVtL3NyYy9HcmFw
aGljc0NvbnRleHQzRFByaXZhdGUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0L2Nocm9t
aXVtL3NyYy9HcmFwaGljc0NvbnRleHQzRFByaXZhdGUuaAkocmV2aXNpb24gOTUxODUpCisrKyBT
b3VyY2UvV2ViS2l0L2Nocm9taXVtL3NyYy9HcmFwaGljc0NvbnRleHQzRFByaXZhdGUuaAkod29y
a2luZyBjb3B5KQpAQCAtMzI1LDcgKzMyNSw3IEBAIHByaXZhdGU6CiAgICAgUmVzb3VyY2VTYWZl
dHkgbV9yZXNvdXJjZVNhZmV0eTsKIAogI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykK
LSAgICBSZWZQdHI8V2ViR0xMYXllckNocm9taXVtPiBtX2NvbXBvc2l0aW5nTGF5ZXI7CisgICAg
bXV0YWJsZSBSZWZQdHI8V2ViR0xMYXllckNocm9taXVtPiBtX2NvbXBvc2l0aW5nTGF5ZXI7CiAj
ZW5kaWYKICNpZiBVU0UoU0tJQSkKICAgICAvLyBJZiB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0
aGUgQ2FudmFzJ3MgYmFja2luZyBzdG9yZSBkb24ndApJbmRleDogU291cmNlL1dlYktpdC9jaHJv
bWl1bS90ZXN0cy9DQ0xheWVyVHJlZUhvc3RUZXN0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
V2ViS2l0L2Nocm9taXVtL3Rlc3RzL0NDTGF5ZXJUcmVlSG9zdFRlc3QuY3BwCShyZXZpc2lvbiA5
NTE4NSkKKysrIFNvdXJjZS9XZWJLaXQvY2hyb21pdW0vdGVzdHMvQ0NMYXllclRyZWVIb3N0VGVz
dC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI4LDcgKzI4LDEyIEBACiAKICNpbmNsdWRlICJjYy9D
Q0xheWVyVHJlZUhvc3QuaCIKIAotI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dDNELmgiCisjaW5j
bHVkZSAiQ0NUaHJlYWRJbXBsLmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0M0RQcml2YXRl
LmgiCisjaW5jbHVkZSAiTGF5ZXJDaHJvbWl1bS5oIgorI2luY2x1ZGUgIkxheWVyUGFpbnRlckNo
cm9taXVtLmgiCisjaW5jbHVkZSAiTW9ja1dlYkdyYXBoaWNzQ29udGV4dDNELmgiCisjaW5jbHVk
ZSAiVGV4dHVyZU1hbmFnZXIuaCIKICNpbmNsdWRlICJjYy9DQ0xheWVyVHJlZUhvc3RJbXBsLmgi
CiAjaW5jbHVkZSAiY2MvQ0NNYWluVGhyZWFkVGFzay5oIgogI2luY2x1ZGUgImNjL0NDVGhyZWFk
VGFzay5oIgpAQCAtMzgsOCArNDMsOCBAQAogI2luY2x1ZGUgPHd0Zi9QYXNzUmVmUHRyLmg+CiAj
aW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgogCi0KIHVzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOwordXNp
bmcgbmFtZXNwYWNlIFdlYktpdDsKIHVzaW5nIG5hbWVzcGFjZSBXVEY7CiAKIG5hbWVzcGFjZSB7
CkBAIC03MiwxNCArNzcsMjMgQEAgcHVibGljOgogICAgIHZpcnR1YWwgdm9pZCBhbmltYXRlQW5k
TGF5b3V0KE1vY2tMYXllclRyZWVIb3N0Q2xpZW50KiBsYXllclRyZWVIb3N0LCBkb3VibGUgZnJh
bWVCZWdpblRpbWUpIHsgfQogICAgIHZpcnR1YWwgdm9pZCBiZWdpbkNvbW1pdE9uQ0NUaHJlYWQo
TW9ja0xheWVyVHJlZUhvc3RJbXBsKiBsYXllclRyZWVIb3N0SW1wbCkgeyB9CiAgICAgdmlydHVh
bCB2b2lkIGJlZ2luQ29tbWl0T25NYWluVGhyZWFkKE1vY2tMYXllclRyZWVIb3N0KiBsYXllclRy
ZWVIb3N0KSB7IH0KLSAgICB2aXJ0dWFsIHZvaWQgY29tbWl0T25DQ1RocmVhZChNb2NrTGF5ZXJU
cmVlSG9zdCogbGF5ZXJUcmVlSG9zdCwgTW9ja0xheWVyVHJlZUhvc3RJbXBsKiBsYXllclRyZWVI
b3N0SW1wbCkgeyB9CiAgICAgdmlydHVhbCB2b2lkIGNvbW1pdENvbXBsZXRlT25DQ1RocmVhZChN
b2NrTGF5ZXJUcmVlSG9zdEltcGwqIGxheWVyVHJlZUhvc3RJbXBsKSB7IH0KICAgICB2aXJ0dWFs
IHZvaWQgY29tbWl0Q29tcGxldGVPbk1haW5UaHJlYWQoTW9ja0xheWVyVHJlZUhvc3QqIGxheWVy
VHJlZUhvc3QpIHsgfQotICAgIHZpcnR1YWwgdm9pZCBkcmF3TGF5ZXJzQW5kUHJlc2VudE9uQ0NU
aHJlYWQoTW9ja0xheWVyVHJlZUhvc3RJbXBsKiBsYXllclRyZWVIb3N0SW1wbCkgeyB9CisgICAg
dmlydHVhbCB2b2lkIGRyYXdMYXllcnNPbkNDVGhyZWFkKE1vY2tMYXllclRyZWVIb3N0SW1wbCog
bGF5ZXJUcmVlSG9zdEltcGwpIHsgfQogICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVMYXllcnMoTW9j
a0xheWVyVHJlZUhvc3QqIGxheWVyVHJlZUhvc3QpIHsgfQogCiAgICAgdm9pZCBlbmRUZXN0KCk7
CiAKKyAgICB2b2lkIHBvc3RTZXROZWVkc0NvbW1pdFRvTWFpblRocmVhZCgpCisgICAgeworICAg
ICAgICBjYWxsT25NYWluVGhyZWFkKENDTGF5ZXJUcmVlSG9zdFRlc3Q6OmRpc3BhdGNoU2V0TmVl
ZHNDb21taXQsIHRoaXMpOworICAgIH0KKworICAgIHZvaWQgcG9zdFNldE5lZWRzUmVkcmF3VG9N
YWluVGhyZWFkKCkKKyAgICB7CisgICAgICAgIGNhbGxPbk1haW5UaHJlYWQoQ0NMYXllclRyZWVI
b3N0VGVzdDo6ZGlzcGF0Y2hTZXROZWVkc1JlZHJhdywgdGhpcyk7CisgICAgfQorCiBwcm90ZWN0
ZWQ6CiAgICAgdm9pZCBkb0JlZ2luVGVzdCgpOwogCkBAIC05NSwxMCArMTA5LDI4IEBAIHByb3Rl
Y3RlZDoKICAgICBzdGF0aWMgdm9pZCBvbkVuZFRlc3Qodm9pZCogc2VsZikKICAgICB7CiAgICAg
ICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7CisgICAgICAgIHdlYmtpdF9zdXBwb3J0OjpRdWl0
TWVzc2FnZUxvb3AoKTsKICAgICAgICAgQ0NMYXllclRyZWVIb3N0VGVzdCogdGVzdCA9IHN0YXRp
Y19jYXN0PENDTGF5ZXJUcmVlSG9zdFRlc3QqPihzZWxmKTsKKyAgICAgICAgQVNTRVJUKHRlc3Qp
OwogICAgICAgICB0ZXN0LT5tX2xheWVyVHJlZUhvc3QuY2xlYXIoKTsKLSAgICAgICAgdGVzdC0+
bV9jbGllbnQuY2xlYXIoKTsKLSAgICAgICAgd2Via2l0X3N1cHBvcnQ6OlF1aXRNZXNzYWdlTG9v
cCgpOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIGRpc3BhdGNoU2V0TmVlZHNDb21taXQodm9p
ZCogc2VsZikKKyAgICB7CisgICAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOworICAgICAgQ0NM
YXllclRyZWVIb3N0VGVzdCogdGVzdCA9IHN0YXRpY19jYXN0PENDTGF5ZXJUcmVlSG9zdFRlc3Qq
PihzZWxmKTsKKyAgICAgIEFTU0VSVCh0ZXN0KTsKKyAgICAgIGlmICh0ZXN0LT5tX2xheWVyVHJl
ZUhvc3QpCisgICAgICAgICAgdGVzdC0+bV9sYXllclRyZWVIb3N0LT5zZXROZWVkc0NvbW1pdEFu
ZFJlZHJhdygpOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIGRpc3BhdGNoU2V0TmVlZHNSZWRy
YXcodm9pZCogc2VsZikKKyAgICB7CisgICAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOworICAg
ICAgQ0NMYXllclRyZWVIb3N0VGVzdCogdGVzdCA9IHN0YXRpY19jYXN0PENDTGF5ZXJUcmVlSG9z
dFRlc3QqPihzZWxmKTsKKyAgICAgIEFTU0VSVCh0ZXN0KTsKKyAgICAgIGlmICh0ZXN0LT5tX2xh
eWVyVHJlZUhvc3QpCisgICAgICAgICAgdGVzdC0+bV9sYXllclRyZWVIb3N0LT5zZXROZWVkc1Jl
ZHJhdygpOwogICAgIH0KIAogICAgIHZvaWQgcnVuVGVzdCgpCkBAIC0xMDksNiArMTQxLDggQEAg
cHJvdGVjdGVkOgogICAgICAgICBtX3J1bm5pbmcgPSBmYWxzZTsKICAgICAgICAgYm9vbCB0aW1l
ZE91dCA9IG1fdGltZWRPdXQ7IC8vIFNhdmUgd2hldGhlciB3ZSdyZSB0aW1lZCBvdXQgaW4gY2Fz
ZSBSdW5BbGxQZW5kaW5nTWVzc2FnZXMgaGFzIHRoZSB0aW1lb3V0LgogICAgICAgICB3ZWJraXRf
c3VwcG9ydDo6UnVuQWxsUGVuZGluZ01lc3NhZ2VzKCk7CisgICAgICAgIEFTU0VSVCghbV9sYXll
clRyZWVIb3N0LmdldCgpKTsKKyAgICAgICAgbV9jbGllbnQuY2xlYXIoKTsKICAgICAgICAgaWYg
KHRpbWVkT3V0KSB7CiAgICAgICAgICAgICBwcmludGYoIlRlc3QgdGltZWQgb3V0Iik7CiAgICAg
ICAgICAgICBGQUlMKCkgPDwgIlRlc3QgdGltZWQgb3V0IjsKQEAgLTEzMCw3ICsxNjQsNyBAQCBw
cm90ZWN0ZWQ6CiAgICAgVmVjdG9yPHN0ZDo6c3RyaW5nPiBtX3RyYWNlczsKIAogICAgIE93blB0
cjxNb2NrTGF5ZXJUcmVlSG9zdENsaWVudD4gbV9jbGllbnQ7Ci0gICAgUmVmUHRyPE1vY2tMYXll
clRyZWVIb3N0PiBtX2xheWVyVHJlZUhvc3Q7CisgICAgUmVmUHRyPENDTGF5ZXJUcmVlSG9zdD4g
bV9sYXllclRyZWVIb3N0OwogCiBwcml2YXRlOgogICAgIGJvb2wgbV9iZWdpbm5pbmc7CkBAIC0x
MzksNTEgKzE3MywyNiBAQCBwcml2YXRlOgogICAgIGJvb2wgbV90aW1lZE91dDsKIH07CiAKLWNs
YXNzIE1vY2tMYXllclRyZWVIb3N0Q2xpZW50IDogcHVibGljIENDTGF5ZXJUcmVlSG9zdENsaWVu
dCB7Ci1wdWJsaWM6Ci0gICAgTW9ja0xheWVyVHJlZUhvc3RDbGllbnQoQ0NMYXllclRyZWVIb3N0
VGVzdCogdGVzdCkgOiBtX3Rlc3QodGVzdCkgeyB9Ci0KLSAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8
R3JhcGhpY3NDb250ZXh0M0Q+IGNyZWF0ZUxheWVyVHJlZUhvc3RDb250ZXh0M0QoKQotICAgIHsK
LSAgICAgICAgcmV0dXJuIGFkb3B0UmVmPEdyYXBoaWNzQ29udGV4dDNEPigwKTsKLSAgICB9Ci0K
LSAgICB2aXJ0dWFsIHZvaWQgYW5pbWF0ZUFuZExheW91dChkb3VibGUgZnJhbWVCZWdpblRpbWUp
Ci0gICAgewotICAgICAgICBtX3Rlc3QtPmFuaW1hdGVBbmRMYXlvdXQodGhpcywgZnJhbWVCZWdp
blRpbWUpOwotICAgIH0KLQotICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVMYXllcnMoKQotICAgIHsK
LSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgQ0NMYXllclRyZWVIb3N0VGVzdCogbV90ZXN0OwotfTsK
LQotY2xhc3MgTW9ja0xheWVyVHJlZUhvc3RDb21taXR0ZXIgOiBwdWJsaWMgQ0NMYXllclRyZWVI
b3N0Q29tbWl0dGVyIHsKK2NsYXNzIE15TW9ja0NvbnRleHQgOiBwdWJsaWMgTW9ja1dlYkdyYXBo
aWNzQ29udGV4dDNEIHsKIHB1YmxpYzoKLSAgICBzdGF0aWMgUGFzc093blB0cjxNb2NrTGF5ZXJU
cmVlSG9zdENvbW1pdHRlcj4gY3JlYXRlKENDTGF5ZXJUcmVlSG9zdFRlc3QqIHRlc3QpCisgICAg
dmlydHVhbCBib29sIG1ha2VDb250ZXh0Q3VycmVudCgpIHsgcmV0dXJuIHRydWU7IH0KKyAgICB2
aXJ0dWFsIFdlYkdMSWQgY3JlYXRlUHJvZ3JhbSgpIHsgcmV0dXJuIDE7IH0KKyAgICB2aXJ0dWFs
IFdlYkdMSWQgY3JlYXRlU2hhZGVyKFdHQzNEZW51bSkgeyByZXR1cm4gMTsgfQorICAgIHZpcnR1
YWwgdm9pZCBnZXRTaGFkZXJpdihXZWJHTElkIHNoYWRlciwgV0dDM0RlbnVtIHBuYW1lLCBXR0Mz
RGludCogdmFsdWUpCiAgICAgewotICAgICAgICByZXR1cm4gYWRvcHRQdHIobmV3IE1vY2tMYXll
clRyZWVIb3N0Q29tbWl0dGVyKHRlc3QpKTsKKyAgICAgICAgKnZhbHVlID0gMTsKICAgICB9Ci0K
LSAgICB2aXJ0dWFsIHZvaWQgY29tbWl0KENDTGF5ZXJUcmVlSG9zdCogaG9zdCwgQ0NMYXllclRy
ZWVIb3N0SW1wbCogaG9zdEltcGwpCisgICAgdmlydHVhbCB2b2lkIGdldFByb2dyYW1pdihXZWJH
TElkIHByb2dyYW0sIFdHQzNEZW51bSBwbmFtZSwgV0dDM0RpbnQqIHZhbHVlKQogICAgIHsKLSAg
ICAgICAgQ0NMYXllclRyZWVIb3N0Q29tbWl0dGVyOjpjb21taXQoaG9zdCwgaG9zdEltcGwpOwot
ICAgICAgICBtX3Rlc3QtPmNvbW1pdE9uQ0NUaHJlYWQocmVpbnRlcnByZXRfY2FzdDxNb2NrTGF5
ZXJUcmVlSG9zdCo+KGhvc3QpLCByZWludGVycHJldF9jYXN0PE1vY2tMYXllclRyZWVIb3N0SW1w
bCo+KGhvc3RJbXBsKSk7CisgICAgICAgICp2YWx1ZSA9IDE7CiAgICAgfQotCi1wcml2YXRlOgot
ICAgIE1vY2tMYXllclRyZWVIb3N0Q29tbWl0dGVyKENDTGF5ZXJUcmVlSG9zdFRlc3QqIHRlc3Qp
IDogbV90ZXN0KHRlc3QpIHsgfQotICAgIENDTGF5ZXJUcmVlSG9zdFRlc3QqIG1fdGVzdDsKIH07
CiAKIGNsYXNzIE1vY2tMYXllclRyZWVIb3N0SW1wbCA6IHB1YmxpYyBDQ0xheWVyVHJlZUhvc3RJ
bXBsIHsKIHB1YmxpYzoKLSAgICBzdGF0aWMgUGFzc093blB0cjxNb2NrTGF5ZXJUcmVlSG9zdElt
cGw+IGNyZWF0ZShDQ0xheWVyVHJlZUhvc3RJbXBsQ2xpZW50KiBjbGllbnQsIENDTGF5ZXJUcmVl
SG9zdFRlc3QqIHRlc3QpCisgICAgc3RhdGljIFBhc3NPd25QdHI8TW9ja0xheWVyVHJlZUhvc3RJ
bXBsPiBjcmVhdGUoY29uc3QgQ0NTZXR0aW5ncyYgc2V0dGluZ3MsIENDTGF5ZXJUcmVlSG9zdFRl
c3QqIHRlc3QpCiAgICAgewotICAgICAgICByZXR1cm4gYWRvcHRQdHIobmV3IE1vY2tMYXllclRy
ZWVIb3N0SW1wbChjbGllbnQsIHRlc3QpKTsKKyAgICAgICAgcmV0dXJuIGFkb3B0UHRyKG5ldyBN
b2NrTGF5ZXJUcmVlSG9zdEltcGwoc2V0dGluZ3MsIHRlc3QpKTsKICAgICB9CiAKICAgICB2aXJ0
dWFsIHZvaWQgYmVnaW5Db21taXQoKQpAQCAtMTk4LDE0ICsyMDcsMTUgQEAgcHVibGljOgogICAg
ICAgICBtX3Rlc3QtPmNvbW1pdENvbXBsZXRlT25DQ1RocmVhZCh0aGlzKTsKICAgICB9CiAKLSAg
ICB2aXJ0dWFsIHZvaWQgZHJhd0xheWVyc0FuZFByZXNlbnQoKQorICAgIHZpcnR1YWwgdm9pZCBk
cmF3TGF5ZXJzKCkKICAgICB7Ci0gICAgICAgIG1fdGVzdC0+ZHJhd0xheWVyc0FuZFByZXNlbnRP
bkNDVGhyZWFkKHRoaXMpOworICAgICAgICBDQ0xheWVyVHJlZUhvc3RJbXBsOjpkcmF3TGF5ZXJz
KCk7CisgICAgICAgIG1fdGVzdC0+ZHJhd0xheWVyc09uQ0NUaHJlYWQodGhpcyk7CiAgICAgfQog
CiBwcml2YXRlOgotICAgIE1vY2tMYXllclRyZWVIb3N0SW1wbChDQ0xheWVyVHJlZUhvc3RJbXBs
Q2xpZW50KiBjbGllbnQsIENDTGF5ZXJUcmVlSG9zdFRlc3QqIHRlc3QpCi0gICAgICAgICAgICA6
IENDTGF5ZXJUcmVlSG9zdEltcGwoY2xpZW50KQorICAgIE1vY2tMYXllclRyZWVIb3N0SW1wbChj
b25zdCBDQ1NldHRpbmdzJiBzZXR0aW5ncywgQ0NMYXllclRyZWVIb3N0VGVzdCogdGVzdCkKKyAg
ICAgICAgICAgIDogQ0NMYXllclRyZWVIb3N0SW1wbChzZXR0aW5ncykKICAgICAgICAgICAgICwg
bV90ZXN0KHRlc3QpCiAgICAgewogICAgIH0KQEAgLTIxMyw1OSArMjIzLDQwIEBAIHByaXZhdGU6
CiAgICAgQ0NMYXllclRyZWVIb3N0VGVzdCogbV90ZXN0OwogfTsKIAotY2xhc3MgTW9ja0xheWVy
VHJlZUhvc3RJbXBsUHJveHkgOiBwdWJsaWMgQ0NMYXllclRyZWVIb3N0SW1wbFByb3h5IHsKK2Ns
YXNzIE1vY2tMYXllclRyZWVIb3N0Q2xpZW50IDogcHVibGljIENDTGF5ZXJUcmVlSG9zdENsaWVu
dCB7CiBwdWJsaWM6Ci0gICAgc3RhdGljIFBhc3NPd25QdHI8TW9ja0xheWVyVHJlZUhvc3RJbXBs
UHJveHk+IGNyZWF0ZShDQ0xheWVyVHJlZUhvc3QqIGhvc3QsIENDTGF5ZXJUcmVlSG9zdFRlc3Qq
IHRlc3QpCi0gICAgewotICAgICAgICByZXR1cm4gYWRvcHRQdHIobmV3IE1vY2tMYXllclRyZWVI
b3N0SW1wbFByb3h5KGhvc3QsIHRlc3QpKTsKLSAgICB9CisgICAgTW9ja0xheWVyVHJlZUhvc3RD
bGllbnQoQ0NMYXllclRyZWVIb3N0VGVzdCogdGVzdCkgOiBtX3Rlc3QodGVzdCkgeyB9CiAKLSAg
ICBQYXNzT3duUHRyPENDTGF5ZXJUcmVlSG9zdEltcGw+IGNyZWF0ZUxheWVyVHJlZUhvc3RJbXBs
KCkKKyAgICB2aXJ0dWFsIHZvaWQgYW5pbWF0ZUFuZExheW91dChkb3VibGUgZnJhbWVCZWdpblRp
bWUpCiAgICAgewotICAgICAgICByZXR1cm4gTW9ja0xheWVyVHJlZUhvc3RJbXBsOjpjcmVhdGUo
dGhpcywgbV90ZXN0KTsKKyAgICAgICAgbV90ZXN0LT5hbmltYXRlQW5kTGF5b3V0KHRoaXMsIGZy
YW1lQmVnaW5UaW1lKTsKICAgICB9CiAKLXByaXZhdGU6Ci0gICAgTW9ja0xheWVyVHJlZUhvc3RJ
bXBsUHJveHkoQ0NMYXllclRyZWVIb3N0KiBob3N0LCBDQ0xheWVyVHJlZUhvc3RUZXN0KiB0ZXN0
KQotICAgICAgICA6IENDTGF5ZXJUcmVlSG9zdEltcGxQcm94eShob3N0KQotICAgICAgICAsIG1f
dGVzdCh0ZXN0KSB7IH0KLQotICAgIENDTGF5ZXJUcmVlSG9zdFRlc3QqIG1fdGVzdDsKLX07Ci0K
LWNsYXNzIE1vY2tMYXllclRyZWVIb3N0IDogcHVibGljIENDTGF5ZXJUcmVlSG9zdCB7Ci1wdWJs
aWM6Ci0gICAgTW9ja0xheWVyVHJlZUhvc3QoQ0NMYXllclRyZWVIb3N0Q2xpZW50KiBjbGllbnQs
IENDTGF5ZXJUcmVlSG9zdFRlc3QqIHRlc3QpCi0gICAgICAgIDogQ0NMYXllclRyZWVIb3N0KGNs
aWVudCkKLSAgICAgICAgLCBtX3Rlc3QodGVzdCkgeyB9Ci0KLSAgICB2aXJ0dWFsIFBhc3NPd25Q
dHI8Q0NMYXllclRyZWVIb3N0SW1wbFByb3h5PiBjcmVhdGVMYXllclRyZWVIb3N0SW1wbFByb3h5
KCkKKyAgICB2aXJ0dWFsIFBhc3NPd25QdHI8Q0NUaHJlYWQ+IGNyZWF0ZUNvbXBvc2l0b3JUaHJl
YWQoKQogICAgIHsKLSAgICAgICAgT3duUHRyPENDTGF5ZXJUcmVlSG9zdEltcGxQcm94eT4gcHJv
eHkgPSBNb2NrTGF5ZXJUcmVlSG9zdEltcGxQcm94eTo6Y3JlYXRlKHRoaXMsIG1fdGVzdCk7Ci0g
ICAgICAgIHByb3h5LT5zdGFydCgpOwotICAgICAgICByZXR1cm4gcHJveHkucmVsZWFzZSgpOwor
ICAgICAgICByZXR1cm4gQ0NUaHJlYWRJbXBsOjpjcmVhdGUoKTsKICAgICB9CiAKLSAgICB2aXJ0
dWFsIHZvaWQgdXBkYXRlTGF5ZXJzKCkKKyAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8R3JhcGhpY3ND
b250ZXh0M0Q+IGNyZWF0ZUxheWVyVHJlZUhvc3RDb250ZXh0M0QoKQogICAgIHsKLSAgICAgICAg
bV90ZXN0LT51cGRhdGVMYXllcnModGhpcyk7CisgICAgICAgIE93blB0cjxXZWJHcmFwaGljc0Nv
bnRleHQzRD4gbW9jayA9IGFkb3B0UHRyKG5ldyBNeU1vY2tDb250ZXh0KCkpOworICAgICAgICBH
cmFwaGljc0NvbnRleHQzRDo6QXR0cmlidXRlcyBhdHRyczsKKyAgICAgICAgUmVmUHRyPEdyYXBo
aWNzQ29udGV4dDNEPiBjb250ZXh0ID0gR3JhcGhpY3NDb250ZXh0M0RQcml2YXRlOjpjcmVhdGVH
cmFwaGljc0NvbnRleHRGcm9tV2ViQ29udGV4dChtb2NrLnJlbGVhc2UoKSwgYXR0cnMsIDAsIEdy
YXBoaWNzQ29udGV4dDNEOjpSZW5kZXJEaXJlY3RseVRvSG9zdFdpbmRvdywgR3JhcGhpY3NDb250
ZXh0M0RQcml2YXRlOjpGb3JVc2VPbkFub3RoZXJUaHJlYWQpOworICAgICAgICByZXR1cm4gY29u
dGV4dDsKICAgICB9CiAKLSAgICB2aXJ0dWFsIFBhc3NPd25QdHI8Q0NMYXllclRyZWVIb3N0Q29t
bWl0dGVyPiBjcmVhdGVMYXllclRyZWVIb3N0Q29tbWl0dGVyKCkKKyAgICB2aXJ0dWFsIFBhc3NP
d25QdHI8TGF5ZXJQYWludGVyQ2hyb21pdW0+IGNyZWF0ZVJvb3RMYXllclBhaW50ZXIoKQogICAg
IHsKLSAgICAgICAgcmV0dXJuIE1vY2tMYXllclRyZWVIb3N0Q29tbWl0dGVyOjpjcmVhdGUobV90
ZXN0KTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CiAgICAgfQogCi0gICAgdmlydHVhbCB2b2lk
IGJlZ2luQ29tbWl0KCkKKyAgICB2aXJ0dWFsIFBhc3NPd25QdHI8Q0NMYXllclRyZWVIb3N0SW1w
bD4gY3JlYXRlTGF5ZXJUcmVlSG9zdEltcGwoY29uc3QgQ0NTZXR0aW5ncyYgc2V0dGluZ3MpCiAg
ICAgewotICAgICAgICBDQ0xheWVyVHJlZUhvc3Q6OmJlZ2luQ29tbWl0KCk7Ci0gICAgICAgIG1f
dGVzdC0+YmVnaW5Db21taXRPbk1haW5UaHJlYWQodGhpcyk7CisgICAgICAgIHJldHVybiBNb2Nr
TGF5ZXJUcmVlSG9zdEltcGw6OmNyZWF0ZShzZXR0aW5ncywgbV90ZXN0KTsKICAgICB9CiAKLSAg
ICB2aXJ0dWFsIHZvaWQgY29tbWl0Q29tcGxldGUoKQorICAgIHZpcnR1YWwgdm9pZCBkaWRSZWNy
ZWF0ZUdyYXBoaWNzQ29udGV4dChib29sIHN1Y2Nlc3MpCiAgICAgewotICAgICAgICBtX3Rlc3Qt
PmNvbW1pdENvbXBsZXRlT25NYWluVGhyZWFkKHRoaXMpOwotICAgICAgICBDQ0xheWVyVHJlZUhv
c3Q6OmNvbW1pdENvbXBsZXRlKCk7CiAgICAgfQogCiBwcml2YXRlOgpAQCAtMjc0LDExICsyNjUs
MTcgQEAgcHJpdmF0ZToKIAogdm9pZCBDQ0xheWVyVHJlZUhvc3RUZXN0Ojpkb0JlZ2luVGVzdCgp
CiB7CisgICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKICAgICBBU1NFUlQoIW1fcnVubmluZyk7
CiAgICAgbV9ydW5uaW5nID0gdHJ1ZTsKICAgICBtX2NsaWVudCA9IGFkb3B0UHRyKG5ldyBNb2Nr
TGF5ZXJUcmVlSG9zdENsaWVudCh0aGlzKSk7Ci0gICAgbV9sYXllclRyZWVIb3N0ID0gYWRvcHRS
ZWYobmV3IE1vY2tMYXllclRyZWVIb3N0KG1fY2xpZW50LmdldCgpLCB0aGlzKSk7Ci0gICAgbV9s
YXllclRyZWVIb3N0LT5pbml0KCk7CisKKyAgICBDQ1NldHRpbmdzIHNldHRpbmdzOworICAgIHNl
dHRpbmdzLmVuYWJsZUNvbXBvc2l0b3JUaHJlYWQgPSB0cnVlOworICAgIFJlZlB0cjxMYXllckNo
cm9taXVtPiByb290TGF5ZXI7CisgICAgbV9sYXllclRyZWVIb3N0ID0gQ0NMYXllclRyZWVIb3N0
OjpjcmVhdGUobV9jbGllbnQuZ2V0KCksIHJvb3RMYXllciwgc2V0dGluZ3MpOworICAgIEFTU0VS
VChtX2xheWVyVHJlZUhvc3QpOworCiAgICAgbV9iZWdpbm5pbmcgPSB0cnVlOwogICAgIGJlZ2lu
VGVzdCgpOwogICAgIG1fYmVnaW5uaW5nID0gZmFsc2U7CkBAIC0zMjcsNyArMzI0LDcgQEAgcHVi
bGljOgogCiAgICAgdmlydHVhbCB2b2lkIGJlZ2luVGVzdCgpCiAgICAgewotICAgICAgICBtX2xh
eWVyVHJlZUhvc3QtPnNldE5lZWRzQ29tbWl0QW5kUmVkcmF3KCk7CisgICAgICAgIHBvc3RTZXRO
ZWVkc0NvbW1pdFRvTWFpblRocmVhZCgpOwogICAgICAgICBlbmRUZXN0KCk7CiAgICAgfQogCkBA
IC0zNDcsNyArMzQ0LDcgQEAgcHVibGljOgogCiAgICAgdmlydHVhbCB2b2lkIGJlZ2luVGVzdCgp
CiAgICAgewotICAgICAgICBtX2xheWVyVHJlZUhvc3QtPnNldE5lZWRzUmVkcmF3KCk7CisgICAg
ICAgIHBvc3RTZXROZWVkc1JlZHJhd1RvTWFpblRocmVhZCgpOwogICAgICAgICBlbmRUZXN0KCk7
CiAgICAgfQogCkBAIC0zNzEsNyArMzY4LDcgQEAgcHVibGljOgogCiAgICAgdmlydHVhbCB2b2lk
IGJlZ2luVGVzdCgpCiAgICAgewotICAgICAgICBtX2xheWVyVHJlZUhvc3QtPnNldE5lZWRzQ29t
bWl0QW5kUmVkcmF3KCk7CisgICAgICAgIHBvc3RTZXROZWVkc0NvbW1pdFRvTWFpblRocmVhZCgp
OwogICAgICAgICBlbmRUZXN0KCk7CiAgICAgfQogCkBAIC0zODIsMTIgKzM3OSwxMiBAQCBwdWJs
aWM6CiAgICAgICAgICAgICBlbmRUZXN0KCk7CiAgICAgfQogCi0gICAgdmlydHVhbCB2b2lkIGRy
YXdMYXllcnNBbmRQcmVzZW50T25DQ1RocmVhZChNb2NrTGF5ZXJUcmVlSG9zdEltcGwqIGxheWVy
VHJlZUhvc3RJbXBsKQorICAgIHZpcnR1YWwgdm9pZCBkcmF3TGF5ZXJzT25DQ1RocmVhZChNb2Nr
TGF5ZXJUcmVlSG9zdEltcGwqIGxheWVyVHJlZUhvc3RJbXBsKQogICAgIHsKICAgICAgICAgaWYg
KG1fbnVtRHJhd3MgPT0gMSkKLSAgICAgICAgICAgIGxheWVyVHJlZUhvc3RJbXBsLT5zZXROZWVk
c0NvbW1pdEFuZFJlZHJhdygpOworICAgICAgICAgIHBvc3RTZXROZWVkc0NvbW1pdFRvTWFpblRo
cmVhZCgpOwogICAgICAgICBtX251bURyYXdzKys7Ci0gICAgICAgIGxheWVyVHJlZUhvc3RJbXBs
LT5zZXROZWVkc1JlZHJhdygpOworICAgICAgICBwb3N0U2V0TmVlZHNSZWRyYXdUb01haW5UaHJl
YWQoKTsKICAgICB9CiAKICAgICB2aXJ0dWFsIHZvaWQgYWZ0ZXJUZXN0KCkKQEAgLTQxNSwxOCAr
NDEyLDE4IEBAIHB1YmxpYzoKIAogICAgIHZpcnR1YWwgdm9pZCBiZWdpblRlc3QoKQogICAgIHsK
LSAgICAgICAgbV9sYXllclRyZWVIb3N0LT5zZXROZWVkc0NvbW1pdEFuZFJlZHJhdygpOwotICAg
ICAgICBtX2xheWVyVHJlZUhvc3QtPnNldE5lZWRzQ29tbWl0QW5kUmVkcmF3KCk7CisgICAgICAg
IHBvc3RTZXROZWVkc0NvbW1pdFRvTWFpblRocmVhZCgpOworICAgICAgICBwb3N0U2V0TmVlZHND
b21taXRUb01haW5UaHJlYWQoKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHZvaWQgZHJhd0xheWVy
c0FuZFByZXNlbnRPbkNDVGhyZWFkKE1vY2tMYXllclRyZWVIb3N0SW1wbCogbGF5ZXJUcmVlSG9z
dEltcGwpCisgICAgdmlydHVhbCB2b2lkIGRyYXdMYXllcnNPbkNDVGhyZWFkKE1vY2tMYXllclRy
ZWVIb3N0SW1wbCogbGF5ZXJUcmVlSG9zdEltcGwpCiAgICAgewogICAgICAgICBtX251bURyYXdz
Kys7CiAgICAgICAgIGlmICghbGF5ZXJUcmVlSG9zdEltcGwtPnNvdXJjZUZyYW1lTnVtYmVyKCkp
CiAgICAgICAgICAgICBlbmRUZXN0KCk7CiAgICAgfQogCi0gICAgdmlydHVhbCB2b2lkIGNvbW1p
dE9uQ0NUaHJlYWQoTW9ja0xheWVyVHJlZUhvc3QqIGxheWVyVHJlZUhvc3QsIE1vY2tMYXllclRy
ZWVIb3N0SW1wbCogaW1wbCkKKyAgICB2aXJ0dWFsIHZvaWQgY29tbWl0Q29tcGxldGVPbkNDVGhy
ZWFkKE1vY2tMYXllclRyZWVIb3N0SW1wbCogaW1wbCkKICAgICB7CiAgICAgICAgIG1fbnVtQ29t
bWl0cysrOwogICAgIH0KQEAgLTQ1OCwxOCArNDU1LDE4IEBAIHB1YmxpYzoKIAogICAgIHZpcnR1
YWwgdm9pZCBiZWdpblRlc3QoKQogICAgIHsKLSAgICAgICAgbV9sYXllclRyZWVIb3N0LT5zZXRO
ZWVkc0NvbW1pdEFuZFJlZHJhdygpOworICAgICAgICBwb3N0U2V0TmVlZHNDb21taXRUb01haW5U
aHJlYWQoKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHZvaWQgZHJhd0xheWVyc0FuZFByZXNlbnRP
bkNDVGhyZWFkKE1vY2tMYXllclRyZWVIb3N0SW1wbCogbGF5ZXJUcmVlSG9zdEltcGwpCisgICAg
dmlydHVhbCB2b2lkIGRyYXdMYXllcnNPbkNDVGhyZWFkKE1vY2tMYXllclRyZWVIb3N0SW1wbCog
bGF5ZXJUcmVlSG9zdEltcGwpCiAgICAgewogICAgICAgICBpZiAoIWxheWVyVHJlZUhvc3RJbXBs
LT5zb3VyY2VGcmFtZU51bWJlcigpKQotICAgICAgICAgICAgbGF5ZXJUcmVlSG9zdEltcGwtPnNl
dE5lZWRzQ29tbWl0QW5kUmVkcmF3KCk7CisgICAgICAgICAgICBwb3N0U2V0TmVlZHNDb21taXRU
b01haW5UaHJlYWQoKTsKICAgICAgICAgZWxzZSBpZiAobGF5ZXJUcmVlSG9zdEltcGwtPnNvdXJj
ZUZyYW1lTnVtYmVyKCkgPT0gMSkKICAgICAgICAgICAgIGVuZFRlc3QoKTsKICAgICB9CiAKLSAg
ICB2aXJ0dWFsIHZvaWQgY29tbWl0T25DQ1RocmVhZChNb2NrTGF5ZXJUcmVlSG9zdCogbGF5ZXJU
cmVlSG9zdCwgTW9ja0xheWVyVHJlZUhvc3RJbXBsKiBpbXBsKQorICAgIHZpcnR1YWwgdm9pZCBj
b21taXRDb21wbGV0ZU9uQ0NUaHJlYWQoTW9ja0xheWVyVHJlZUhvc3RJbXBsKiBpbXBsKQogICAg
IHsKICAgICAgICAgbV9udW1Db21taXRzKys7CiAgICAgfQpAQCAtNTAxLDE5ICs0OTgsMjAgQEAg
cHVibGljOgogCiAgICAgdmlydHVhbCB2b2lkIGJlZ2luVGVzdCgpCiAgICAgeworICAgICAgICBw
b3N0U2V0TmVlZHNDb21taXRUb01haW5UaHJlYWQoKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHZv
aWQgZHJhd0xheWVyc0FuZFByZXNlbnRPbkNDVGhyZWFkKE1vY2tMYXllclRyZWVIb3N0SW1wbCog
aW1wbCkKKyAgICB2aXJ0dWFsIHZvaWQgZHJhd0xheWVyc09uQ0NUaHJlYWQoTW9ja0xheWVyVHJl
ZUhvc3RJbXBsKiBpbXBsKQogICAgIHsKICAgICAgICAgRVhQRUNUX0VRKDAsIGltcGwtPnNvdXJj
ZUZyYW1lTnVtYmVyKCkpOwogICAgICAgICBpZiAoIW1fbnVtRHJhd3MpCi0gICAgICAgICAgICBp
bXBsLT5zZXROZWVkc1JlZHJhdygpOyAvLyByZWRyYXcgYWdhaW4gdG8gdmVyaWZ5IHRoYXQgdGhl
IHNlY29uZCByZWRyYXcgZG9lc250IGNvbW1pdC4KKyAgICAgICAgICAgIHBvc3RTZXROZWVkc1Jl
ZHJhd1RvTWFpblRocmVhZCgpOyAvLyByZWRyYXcgYWdhaW4gdG8gdmVyaWZ5IHRoYXQgdGhlIHNl
Y29uZCByZWRyYXcgZG9lc250IGNvbW1pdC4KICAgICAgICAgZWxzZQogICAgICAgICAgICAgZW5k
VGVzdCgpOwogICAgICAgICBtX251bURyYXdzKys7CiAgICAgfQogCi0gICAgdmlydHVhbCB2b2lk
IGNvbW1pdE9uQ0NUaHJlYWQoTW9ja0xheWVyVHJlZUhvc3QqIGxheWVyVHJlZUhvc3QsIE1vY2tM
YXllclRyZWVIb3N0SW1wbCogaW1wbCkKKyAgICB2aXJ0dWFsIHZvaWQgY29tbWl0Q29tcGxldGVP
bkNDVGhyZWFkKE1vY2tMYXllclRyZWVIb3N0SW1wbCogaW1wbCkKICAgICB7CiAgICAgICAgIG1f
bnVtQ29tbWl0cysrOwogICAgIH0K
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>107632</attachid>
            <date>2011-09-16 04:16:42 -0700</date>
            <delta_ts>2011-09-16 09:30:29 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-67418-20110916121640.patch</filename>
            <type>text/plain</type>
            <size>27661</size>
            <attacher name="Iain Merrick">husky</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDk1MjgyKQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMjggQEAKKzIwMTEtMDktMTYgIElhaW4gTWVy
cmljayAgPGh1c2t5QGdvb2dsZS5jb20+CisKKyAgICAgICAgW2Nocm9taXVtXSBGaXggQ0NMYXll
clRyZWVIb3N0VGVzdAorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5j
Z2k/aWQ9Njc0MTgKKworICAgICAgICBUaGlzIGlzIGEgbWluaW1hbCBzZXQgb2YgY2hhbmdlcyB0
byBnZXQgQ0NMYXllclRyZWVIb3N0VGVzdAorICAgICAgICBjb21waWxpbmcsIHJ1bm5pbmcgYW5k
IHBhc3Npbmcgd2l0aCBVU0VfVEhSRUFERURfQ09NUE9TSVRJTkcKKyAgICAgICAgZW5hYmxlZC4K
KworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICAqIHBsYXRm
b3JtL2dyYXBoaWNzL2Nocm9taXVtL0NvbnRlbnRMYXllckNocm9taXVtLmNwcDoKKyAgICAgICAg
KFdlYkNvcmU6OkNvbnRlbnRMYXllckNocm9taXVtOjpjcmVhdGVUZXh0dXJlVXBkYXRlcik6Cisg
ICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vTGF5ZXJSZW5kZXJlckNocm9taXVt
LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyUmVuZGVyZXJDaHJvbWl1bTo6TGF5ZXJSZW5k
ZXJlckNocm9taXVtKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9D
Q0xheWVyVHJlZUhvc3QuY3BwOgorICAgICAgICAoV2ViQ29yZTo6Q0NMYXllclRyZWVIb3N0Ojpj
cmVhdGVMYXllclRyZWVIb3N0SW1wbCk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2hy
b21pdW0vY2MvQ0NMYXllclRyZWVIb3N0Lmg6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mv
Y2hyb21pdW0vY2MvQ0NMYXllclRyZWVIb3N0SW1wbC5oOgorICAgICAgICAqIHBsYXRmb3JtL2dy
YXBoaWNzL2Nocm9taXVtL2NjL0NDVGhyZWFkUHJveHkuY3BwOgorICAgICAgICAoV2ViQ29yZTo6
Q0NUaHJlYWRQcm94eTo6Y29udGV4dCk6CisgICAgICAgIChXZWJDb3JlOjpDQ1RocmVhZFByb3h5
OjpiZWdpbkZyYW1lQW5kQ29tbWl0T25DQ1RocmVhZCk6CisgICAgICAgIChXZWJDb3JlOjpDQ1Ro
cmVhZFByb3h5OjpzZXROZWVkc0NvbW1pdEFuZFJlZHJhd09uQ0NUaHJlYWQpOgorICAgICAgICAo
V2ViQ29yZTo6Q0NUaHJlYWRQcm94eTo6c2V0TmVlZHNSZWRyYXdPbkNDVGhyZWFkKToKKwogMjAx
MS0wOS0xNSAgUGF2ZWwgRmVsZG1hbiAgPHBmZWxkbWFuQGdvb2dsZS5jb20+CiAKICAgICAgICAg
V2ViIEluc3BlY3RvcjogcmVuYW1lIENvbnNvbGUuY2xlYXJDb25zb2xlTWVzc2FnZXMgdG8gQ29u
c29sZS5jbGVhck1lc3NhZ2VzLCBicnVzaCB1cCBjb25zb2xlIGRvbWFpbiBkb2MuCkluZGV4OiBT
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9Db250ZW50TGF5ZXJDaHJv
bWl1bS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
Y2hyb21pdW0vQ29udGVudExheWVyQ2hyb21pdW0uY3BwCShyZXZpc2lvbiA5NTE4NSkKKysrIFNv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0NvbnRlbnRMYXllckNocm9t
aXVtLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTIwLDYgKzEyMCw3IEBAIGJvb2wgQ29udGVudExh
eWVyQ2hyb21pdW06OmRyYXdzQ29udGVudCgKIAogdm9pZCBDb250ZW50TGF5ZXJDaHJvbWl1bTo6
Y3JlYXRlVGV4dHVyZVVwZGF0ZXIoY29uc3QgQ0NMYXllclRyZWVIb3N0KiBob3N0KQogeworI2lm
ICFVU0UoVEhSRUFERURfQ09NUE9TSVRJTkcpCiAjaWYgVVNFKFNLSUEpCiAgICAgLy8gTm90ZSB0
aGF0IGhvc3QtPnNraWFDb250ZXh0KCkgd2lsbCBjcmFzaCBpZiBjYWxsZWQgd2hpbGUgaW4gdGhy
ZWFkZWQKICAgICAvLyBtb2RlLiBUaGlzIHRodXMgZGVwZW5kcyBvbiBDQ0xheWVyVHJlZUhvc3Q6
OmluaXRpYWxpemUgdHVybmluZyBvZmYKQEAgLTEyOSw2ICsxMzAsNyBAQCB2b2lkIENvbnRlbnRM
YXllckNocm9taXVtOjpjcmVhdGVUZXh0dXJlCiAgICAgICAgIHJldHVybjsKICAgICB9CiAjZW5k
aWYgLy8gU0tJQQorI2VuZGlmIC8vICFUSFJFQURFRF9DT01QT1NJVElORwogCiAgICAgbV90ZXh0
dXJlVXBkYXRlciA9IExheWVyVGV4dHVyZVVwZGF0ZXJCaXRtYXA6OmNyZWF0ZShDb250ZW50TGF5
ZXJQYWludGVyOjpjcmVhdGUobV9kZWxlZ2F0ZSksIGhvc3QtPmxheWVyUmVuZGVyZXJDYXBhYmls
aXRpZXMoKS51c2luZ01hcFN1Yik7CiB9CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9jaHJvbWl1bS9MYXllclJlbmRlcmVyQ2hyb21pdW0uY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0xheWVyUmVuZGVyZXJD
aHJvbWl1bS5jcHAJKHJldmlzaW9uIDk1MTg1KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvY2hyb21pdW0vTGF5ZXJSZW5kZXJlckNocm9taXVtLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtMTQ4LDYgKzE0OCw3IEBAIExheWVyUmVuZGVyZXJDaHJvbWl1bTo6TGF5ZXJSZW5kZXJl
ckNocm8KICAgICAsIG1fY3VycmVudFJlbmRlclN1cmZhY2UoMCkKICAgICAsIG1fb2Zmc2NyZWVu
RnJhbWVidWZmZXJJZCgwKQogICAgICwgbV96b29tQW5pbWF0b3JTY2FsZSgxKQorICAgICwgbV9j
b250ZW50c1RleHR1cmVNZW1vcnlVc2VCeXRlcygwKQogICAgICwgbV9jb250ZXh0KGNvbnRleHQp
CiAgICAgLCBtX2RlZmF1bHRSZW5kZXJTdXJmYWNlKDApCiAgICAgLCBtX3NoYXJlZEdlb21ldHJ5
UXVhZChGbG9hdFJlY3QoLTAuNWYsIC0wLjVmLCAxLjBmLCAxLjBmKSkKSW5kZXg6IFNvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDTGF5ZXJUcmVlSG9zdC5oCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2Nj
L0NDTGF5ZXJUcmVlSG9zdC5oCShyZXZpc2lvbiA5NTE4NSkKKysrIFNvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDTGF5ZXJUcmVlSG9zdC5oCSh3b3JraW5nIGNv
cHkpCkBAIC05OSw3ICs5OSw3IEBAIHB1YmxpYzoKICAgICB2b2lkIGNvbW1pdFRvKENDTGF5ZXJU
cmVlSG9zdEltcGwqKTsKICAgICBQYXNzT3duUHRyPENDVGhyZWFkPiBjcmVhdGVDb21wb3NpdG9y
VGhyZWFkKCk7CiAgICAgUGFzc1JlZlB0cjxHcmFwaGljc0NvbnRleHQzRD4gY3JlYXRlTGF5ZXJU
cmVlSG9zdENvbnRleHQzRCgpOwotICAgIFBhc3NPd25QdHI8Q0NMYXllclRyZWVIb3N0SW1wbD4g
Y3JlYXRlTGF5ZXJUcmVlSG9zdEltcGwoKTsKKyAgICB2aXJ0dWFsIFBhc3NPd25QdHI8Q0NMYXll
clRyZWVIb3N0SW1wbD4gY3JlYXRlTGF5ZXJUcmVlSG9zdEltcGwoKTsKICAgICB2b2lkIGRpZFJl
Y3JlYXRlR3JhcGhpY3NDb250ZXh0KGJvb2wgc3VjY2Vzcyk7CiAjaWYgIVVTRShUSFJFQURFRF9D
T01QT1NJVElORykKICAgICB2b2lkIHNjaGVkdWxlQ29tcG9zaXRlKCk7CkBAIC0xNTQsNiArMTU0
LDcgQEAgcHVibGljOgogCiBwcm90ZWN0ZWQ6CiAgICAgQ0NMYXllclRyZWVIb3N0KENDTGF5ZXJU
cmVlSG9zdENsaWVudCosIFBhc3NSZWZQdHI8TGF5ZXJDaHJvbWl1bT4gcm9vdExheWVyLCBjb25z
dCBDQ1NldHRpbmdzJik7CisgICAgYm9vbCBpbml0aWFsaXplKCk7CiAKIHByaXZhdGU6CiAgICAg
dHlwZWRlZiBWZWN0b3I8UmVmUHRyPExheWVyQ2hyb21pdW0+ID4gTGF5ZXJMaXN0OwpAQCAtMTY0
LDggKzE2NSw2IEBAIHByaXZhdGU6CiAgICAgdm9pZCB1cGRhdGVDb21wb3NpdG9yUmVzb3VyY2Vz
KExheWVyQ2hyb21pdW0qLCBHcmFwaGljc0NvbnRleHQzRCopOwogICAgIHZvaWQgY2xlYXJQZW5k
aW5nVXBkYXRlKCk7CiAKLSAgICBib29sIGluaXRpYWxpemUoKTsKLQogICAgIGJvb2wgbV9hbmlt
YXRpbmc7CiAKICAgICBDQ0xheWVyVHJlZUhvc3RDbGllbnQqIG1fY2xpZW50OwpJbmRleDogU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NMYXllclRyZWVIb3N0
SW1wbC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2No
cm9taXVtL2NjL0NDTGF5ZXJUcmVlSG9zdEltcGwuaAkocmV2aXNpb24gOTUxODUpCisrKyBTb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ0xheWVyVHJlZUhvc3RJ
bXBsLmgJKHdvcmtpbmcgY29weSkKQEAgLTQ2LDEzICs0NiwxMyBAQCBwdWJsaWM6CiAgICAgc3Rh
dGljIFBhc3NPd25QdHI8Q0NMYXllclRyZWVIb3N0SW1wbD4gY3JlYXRlKGNvbnN0IENDU2V0dGlu
Z3MmKTsKICAgICB2aXJ0dWFsIH5DQ0xheWVyVHJlZUhvc3RJbXBsKCk7CiAKKyAgICAvLyBWaXJ0
dWFsIGZvciB0ZXN0aW5nCiAgICAgdmlydHVhbCB2b2lkIGJlZ2luQ29tbWl0KCk7CiAgICAgdmly
dHVhbCB2b2lkIGNvbW1pdENvbXBsZXRlKCk7CisgICAgdmlydHVhbCB2b2lkIGRyYXdMYXllcnMo
KTsKIAogICAgIEdyYXBoaWNzQ29udGV4dDNEKiBjb250ZXh0KCk7CiAKLSAgICB2b2lkIGRyYXdM
YXllcnMoKTsKLQogICAgIHZvaWQgZmluaXNoQWxsUmVuZGVyaW5nKCk7CiAgICAgaW50IGZyYW1l
TnVtYmVyKCkgY29uc3QgeyByZXR1cm4gbV9mcmFtZU51bWJlcjsgfQogCkluZGV4OiBTb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ1RocmVhZFByb3h5LmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9j
Yy9DQ1RocmVhZFByb3h5LmNwcAkocmV2aXNpb24gOTUxODUpCisrKyBTb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ1RocmVhZFByb3h5LmNwcAkod29ya2luZyBj
b3B5KQpAQCAtODQsNyArODQsNiBAQCBib29sIENDVGhyZWFkUHJveHk6OmNvbXBvc2l0ZUFuZFJl
YWRiYWNrCiAKIEdyYXBoaWNzQ29udGV4dDNEKiBDQ1RocmVhZFByb3h5Ojpjb250ZXh0KCkKIHsK
LSAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtMTg2LDgg
KzE4NSw4IEBAIHZvaWQgQ0NUaHJlYWRQcm94eTo6YmVnaW5GcmFtZUFuZENvbW1pdE8KIHsKICAg
ICBUUkFDRV9FVkVOVCgiQ0NUaHJlYWRQcm94eTo6YmVnaW5GcmFtZUFuZENvbW1pdE9uQ0NUaHJl
YWQiLCB0aGlzLCAwKTsKICAgICBBU1NFUlQoaXNJbXBsVGhyZWFkKCkpOwotICAgIEFTU0VSVF9O
T1RfUkVBQ0hFRCgpOwotICAgIC8vIEZJWE1FOiBjYWxsIGJlZ2luRnJhbWVBbmRDb21taXQgb24g
bWFpbiB0aHJlYWQKKyAgICAvLyBURU1QIEhBQ0sgc28gd2UgY2FuIGV4ZXJjaXNlIHRoaXMgY29k
ZSBpbiB1bml0IHRlc3RzLgorICAgIENDTWFpblRocmVhZDo6cG9zdFRhc2soY3JlYXRlTWFpblRo
cmVhZFRhc2sodGhpcywgJkNDVGhyZWFkUHJveHk6OmJlZ2luRnJhbWVBbmRDb21taXQsIDAuMCkp
OwogfQogCiB2b2lkIENDVGhyZWFkUHJveHk6OmJlZ2luRnJhbWVBbmRDb21taXQoZG91YmxlIGZy
YW1lQmVnaW5UaW1lKQpAQCAtMjQ3LDEzICsyNDYsMTUgQEAgdm9pZCBDQ1RocmVhZFByb3h5Ojpz
ZXROZWVkc0NvbW1pdEFuZFJlZAogICAgIFRSQUNFX0VWRU5UKCJDQ1RocmVhZFByb3h5OjpzZXRO
ZWVkc0NvbW1pdEFuZFJlZHJhd09uQ0NUaHJlYWQiLCB0aGlzLCAwKTsKICAgICBBU1NFUlQoaXNJ
bXBsVGhyZWFkKCkpOwogICAgIEFTU0VSVChtX2xheWVyVHJlZUhvc3RJbXBsKTsKLSAgICBBU1NF
UlRfTk9UX1JFQUNIRUQoKTsKKyAgICAvLyBURU1QIEhBQ0sgc28gd2UgY2FuIGV4ZXJjaXNlIHRo
aXMgY29kZSBpbiB1bml0IHRlc3RzLgorICAgIENDTWFpblRocmVhZDo6cG9zdFRhc2soY3JlYXRl
TWFpblRocmVhZFRhc2sodGhpcywgJkNDVGhyZWFkUHJveHk6OmJlZ2luRnJhbWVBbmRDb21taXQs
IDAuMCkpOwogfQogCiB2b2lkIENDVGhyZWFkUHJveHk6OnNldE5lZWRzUmVkcmF3T25DQ1RocmVh
ZCgpCiB7CiAgICAgVFJBQ0VfRVZFTlQoIkNDVGhyZWFkUHJveHk6OnNldE5lZWRzUmVkcmF3T25D
Q1RocmVhZCIsIHRoaXMsIDApOwotICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIC8vIFRF
TVAgSEFDSyBzbyB3ZSBjYW4gZXhlcmNpc2UgdGhpcyBjb2RlIGluIHVuaXQgdGVzdHMuCisgICAg
ZHJhd0xheWVyc09uQ0NUaHJlYWQoKTsKIH0KIAogdm9pZCBDQ1RocmVhZFByb3h5Ojppbml0aWFs
aXplSW1wbE9uQ0NUaHJlYWQoQ0NDb21wbGV0aW9uRXZlbnQqIGNvbXBsZXRpb24pCkBAIC0yODQs
NCArMjg1LDQgQEAgdm9pZCBDQ1RocmVhZFByb3h5OjpsYXllclRyZWVIb3N0Q2xvc2VkTwogICAg
IGNvbXBsZXRpb24tPnNpZ25hbCgpOwogfQogCi19Cit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCklu
ZGV4OiBTb3VyY2UvV2ViS2l0L2Nocm9taXVtL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3Vy
Y2UvV2ViS2l0L2Nocm9taXVtL0NoYW5nZUxvZwkocmV2aXNpb24gOTUyODIpCisrKyBTb3VyY2Uv
V2ViS2l0L2Nocm9taXVtL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDYwIEBA
CisyMDExLTA5LTE2ICBJYWluIE1lcnJpY2sgIDxodXNreUBnb29nbGUuY29tPgorCisgICAgICAg
IFtjaHJvbWl1bV0gRml4IENDTGF5ZXJUcmVlSG9zdFRlc3QKKyAgICAgICAgaHR0cHM6Ly9idWdz
LndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTY3NDE4CisKKyAgICAgICAgRml4ZXMgbmVlZGVk
IHRvIGNvbXBpbGUgYW5kIGxpbmsgd2l0aCBVU0VfVEhSRUFERURfQ09NUE9TSVRJTkcKKyAgICAg
ICAgZW5hYmxlZCwgYW5kIHRvIHBhc3MgdGhlIGJhc2ljIHVuaXQgdGVzdC4KKworICAgICAgICBS
ZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICAqIHNyYy9HcmFwaGljc0NvbnRl
eHQzRENocm9taXVtLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEUHJp
dmF0ZTo6R3JhcGhpY3NDb250ZXh0M0RQcml2YXRlKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBo
aWNzQ29udGV4dDNEUHJpdmF0ZTo6cGxhdGZvcm1MYXllcik6CisgICAgICAgICogc3JjL0dyYXBo
aWNzQ29udGV4dDNEUHJpdmF0ZS5oOgorICAgICAgICAqIHRlc3RzL0NDTGF5ZXJUcmVlSG9zdFRl
c3QuY3BwOgorICAgICAgICAoV1RGOjpUZXN0SG9va3M6OmJlZ2luQ29tbWl0T25DQ1RocmVhZCk6
CisgICAgICAgIChXVEY6OlRlc3RIb29rczo6Y29tbWl0Q29tcGxldGVPbkNDVGhyZWFkKToKKyAg
ICAgICAgKFdURjo6VGVzdEhvb2tzOjpkcmF3TGF5ZXJzT25DQ1RocmVhZCk6CisgICAgICAgIChX
VEY6Ok1vY2tMYXllclRyZWVIb3N0SW1wbDo6TW9ja0xheWVyVHJlZUhvc3RJbXBsKToKKyAgICAg
ICAgKFdURjo6TW9ja0xheWVyVHJlZUhvc3RJbXBsOjpiZWdpbkNvbW1pdCk6CisgICAgICAgIChX
VEY6Ok1vY2tMYXllclRyZWVIb3N0SW1wbDo6Y29tbWl0Q29tcGxldGUpOgorICAgICAgICAoV1RG
OjpNb2NrTGF5ZXJUcmVlSG9zdEltcGw6OmRyYXdMYXllcnMpOgorICAgICAgICAoV1RGOjpNb2Nr
TGF5ZXJUcmVlSG9zdDo6TW9ja0xheWVyVHJlZUhvc3QpOgorICAgICAgICAoV1RGOjpNb2NrTGF5
ZXJUcmVlSG9zdDo6Y3JlYXRlTGF5ZXJUcmVlSG9zdEltcGwpOgorICAgICAgICAoV1RGOjpDb21w
b3NpdG9yTW9ja1dlYkdyYXBoaWNzQ29udGV4dDNEOjptYWtlQ29udGV4dEN1cnJlbnQpOgorICAg
ICAgICAoV1RGOjpDb21wb3NpdG9yTW9ja1dlYkdyYXBoaWNzQ29udGV4dDNEOjpjcmVhdGVQcm9n
cmFtKToKKyAgICAgICAgKFdURjo6Q29tcG9zaXRvck1vY2tXZWJHcmFwaGljc0NvbnRleHQzRDo6
Y3JlYXRlU2hhZGVyKToKKyAgICAgICAgKFdURjo6Q29tcG9zaXRvck1vY2tXZWJHcmFwaGljc0Nv
bnRleHQzRDo6Z2V0U2hhZGVyaXYpOgorICAgICAgICAoV1RGOjpDb21wb3NpdG9yTW9ja1dlYkdy
YXBoaWNzQ29udGV4dDNEOjpnZXRQcm9ncmFtaXYpOgorICAgICAgICAoV1RGOjpNb2NrTGF5ZXJU
cmVlSG9zdENsaWVudDo6TW9ja0xheWVyVHJlZUhvc3RDbGllbnQpOgorICAgICAgICAoV1RGOjpN
b2NrTGF5ZXJUcmVlSG9zdENsaWVudDo6YW5pbWF0ZUFuZExheW91dCk6CisgICAgICAgIChXVEY6
Ok1vY2tMYXllclRyZWVIb3N0Q2xpZW50OjpjcmVhdGVDb21wb3NpdG9yVGhyZWFkKToKKyAgICAg
ICAgKFdURjo6TW9ja0xheWVyVHJlZUhvc3RDbGllbnQ6OmNyZWF0ZUxheWVyVHJlZUhvc3RDb250
ZXh0M0QpOgorICAgICAgICAoV1RGOjpNb2NrTGF5ZXJUcmVlSG9zdENsaWVudDo6Y3JlYXRlUm9v
dExheWVyUGFpbnRlcik6CisgICAgICAgIChXVEY6Ok1vY2tMYXllclRyZWVIb3N0Q2xpZW50Ojpk
aWRSZWNyZWF0ZUdyYXBoaWNzQ29udGV4dCk6CisgICAgICAgIChXVEY6OkNDTGF5ZXJUcmVlSG9z
dFRlc3Q6OnBvc3RTZXROZWVkc0NvbW1pdFRvTWFpblRocmVhZCk6CisgICAgICAgIChXVEY6OkND
TGF5ZXJUcmVlSG9zdFRlc3Q6OnBvc3RTZXROZWVkc1JlZHJhd1RvTWFpblRocmVhZCk6CisgICAg
ICAgIChXVEY6OkNDTGF5ZXJUcmVlSG9zdFRlc3Q6Om9uRW5kVGVzdCk6CisgICAgICAgIChXVEY6
OkNDTGF5ZXJUcmVlSG9zdFRlc3Q6OmRpc3BhdGNoU2V0TmVlZHNDb21taXQpOgorICAgICAgICAo
V1RGOjpDQ0xheWVyVHJlZUhvc3RUZXN0OjpkaXNwYXRjaFNldE5lZWRzUmVkcmF3KToKKyAgICAg
ICAgKFdURjo6Q0NMYXllclRyZWVIb3N0VGVzdDo6cnVuVGVzdCk6CisgICAgICAgIChXVEY6OkND
TGF5ZXJUcmVlSG9zdFRlc3Q6OmRvQmVnaW5UZXN0KToKKyAgICAgICAgKFdURjo6Q0NMYXllclRy
ZWVIb3N0VGVzdFNob3J0bGl2ZWQyOjpiZWdpblRlc3QpOgorICAgICAgICAoV1RGOjpDQ0xheWVy
VHJlZUhvc3RUZXN0U2hvcnRsaXZlZDM6OmJlZ2luVGVzdCk6CisgICAgICAgIChXVEY6OkNDTGF5
ZXJUcmVlSG9zdFRlc3RDb21taXRpbmdXaXRoQ29udGludW91c1JlZHJhdzo6YmVnaW5UZXN0KToK
KyAgICAgICAgKFdURjo6Q0NMYXllclRyZWVIb3N0VGVzdENvbW1pdGluZ1dpdGhDb250aW51b3Vz
UmVkcmF3Ojpjb21taXRDb21wbGV0ZU9uQ0NUaHJlYWQpOgorICAgICAgICAoV1RGOjpDQ0xheWVy
VHJlZUhvc3RUZXN0Q29tbWl0aW5nV2l0aENvbnRpbnVvdXNSZWRyYXc6OmRyYXdMYXllcnNPbkND
VGhyZWFkKToKKyAgICAgICAgKFdURjo6Q0NMYXllclRyZWVIb3N0VGVzdFNldE5lZWRzQ29tbWl0
MTo6YmVnaW5UZXN0KToKKyAgICAgICAgKFdURjo6Q0NMYXllclRyZWVIb3N0VGVzdFNldE5lZWRz
Q29tbWl0MTo6ZHJhd0xheWVyc09uQ0NUaHJlYWQpOgorICAgICAgICAoV1RGOjpDQ0xheWVyVHJl
ZUhvc3RUZXN0U2V0TmVlZHNDb21taXQxOjpjb21taXRDb21wbGV0ZU9uQ0NUaHJlYWQpOgorICAg
ICAgICAoV1RGOjpDQ0xheWVyVHJlZUhvc3RUZXN0U2V0TmVlZHNDb21taXQyOjpiZWdpblRlc3Qp
OgorICAgICAgICAoV1RGOjpDQ0xheWVyVHJlZUhvc3RUZXN0U2V0TmVlZHNDb21taXQyOjpkcmF3
TGF5ZXJzT25DQ1RocmVhZCk6CisgICAgICAgIChXVEY6OkNDTGF5ZXJUcmVlSG9zdFRlc3RTZXRO
ZWVkc0NvbW1pdDI6OmNvbW1pdENvbXBsZXRlT25DQ1RocmVhZCk6CisgICAgICAgIChXVEY6OkND
TGF5ZXJUcmVlSG9zdFRlc3RTZXROZWVkc1JlZHJhdzo6YmVnaW5UZXN0KToKKyAgICAgICAgKFdU
Rjo6Q0NMYXllclRyZWVIb3N0VGVzdFNldE5lZWRzUmVkcmF3OjpkcmF3TGF5ZXJzT25DQ1RocmVh
ZCk6CisgICAgICAgIChXVEY6OkNDTGF5ZXJUcmVlSG9zdFRlc3RTZXROZWVkc1JlZHJhdzo6Y29t
bWl0Q29tcGxldGVPbkNDVGhyZWFkKToKKwogMjAxMS0wOS0xNSAgQWRhbSBCYXJ0aCAgPGFiYXJ0
aEB3ZWJraXQub3JnPgogCiAgICAgICAgIFNpZ2guICBNaXNzZWQgdGhpcyBvbmUuCkluZGV4OiBT
b3VyY2UvV2ViS2l0L2Nocm9taXVtL3NyYy9HcmFwaGljc0NvbnRleHQzRENocm9taXVtLmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0L2Nocm9taXVtL3NyYy9HcmFwaGljc0NvbnRleHQz
RENocm9taXVtLmNwcAkocmV2aXNpb24gOTUxODUpCisrKyBTb3VyY2UvV2ViS2l0L2Nocm9taXVt
L3NyYy9HcmFwaGljc0NvbnRleHQzRENocm9taXVtLmNwcAkod29ya2luZyBjb3B5KQpAQCAtOTks
OSArOTksNiBAQCBHcmFwaGljc0NvbnRleHQzRFByaXZhdGU6OkdyYXBoaWNzQ29udGV4CiAjZXJy
b3IgTXVzdCBwb3J0IHRvIHlvdXIgcGxhdGZvcm0KICNlbmRpZgogewotI2lmIFVTRShBQ0NFTEVS
QVRFRF9DT01QT1NJVElORykKLSAgICBtX2NvbXBvc2l0aW5nTGF5ZXIgPSBXZWJHTExheWVyQ2hy
b21pdW06OmNyZWF0ZSgwKTsKLSNlbmRpZgogfQogCiBHcmFwaGljc0NvbnRleHQzRFByaXZhdGU6
On5HcmFwaGljc0NvbnRleHQzRFByaXZhdGUoKQpAQCAtMjI1LDggKzIyMiwxMCBAQCB2b2lkIEdy
YXBoaWNzQ29udGV4dDNEUHJpdmF0ZTo6cHJlcGFyZVRlCiB9CiAKICNpZiBVU0UoQUNDRUxFUkFU
RURfQ09NUE9TSVRJTkcpCi1XZWJHTExheWVyQ2hyb21pdW0qIEdyYXBoaWNzQ29udGV4dDNEUHJp
dmF0ZTo6cGxhdGZvcm1MYXllcigpIGNvbnN0CitXZWJHTExheWVyQ2hyb21pdW0qIEdyYXBoaWNz
Q29udGV4dDNEUHJpdmF0ZTo6cGxhdGZvcm1MYXllcigpCiB7CisgICAgaWYgKCFtX2NvbXBvc2l0
aW5nTGF5ZXIpCisgICAgICAgIG1fY29tcG9zaXRpbmdMYXllciA9IFdlYkdMTGF5ZXJDaHJvbWl1
bTo6Y3JlYXRlKDApOwogICAgIHJldHVybiBtX2NvbXBvc2l0aW5nTGF5ZXIuZ2V0KCk7CiB9CiAj
ZW5kaWYKSW5kZXg6IFNvdXJjZS9XZWJLaXQvY2hyb21pdW0vc3JjL0dyYXBoaWNzQ29udGV4dDNE
UHJpdmF0ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQvY2hyb21pdW0vc3JjL0dyYXBo
aWNzQ29udGV4dDNEUHJpdmF0ZS5oCShyZXZpc2lvbiA5NTE4NSkKKysrIFNvdXJjZS9XZWJLaXQv
Y2hyb21pdW0vc3JjL0dyYXBoaWNzQ29udGV4dDNEUHJpdmF0ZS5oCSh3b3JraW5nIGNvcHkpCkBA
IC0xMDQsNyArMTA0LDcgQEAgcHVibGljOgogICAgIHZvaWQgcHJlcGFyZVRleHR1cmUoKTsKIAog
I2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKLSAgICBXZWJHTExheWVyQ2hyb21pdW0q
IHBsYXRmb3JtTGF5ZXIoKSBjb25zdDsKKyAgICBXZWJHTExheWVyQ2hyb21pdW0qIHBsYXRmb3Jt
TGF5ZXIoKTsKICNlbmRpZgogICAgIGJvb2wgaXNHTEVTMkNvbXBsaWFudCgpIGNvbnN0OwogCklu
ZGV4OiBTb3VyY2UvV2ViS2l0L2Nocm9taXVtL3Rlc3RzL0NDTGF5ZXJUcmVlSG9zdFRlc3QuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQvY2hyb21pdW0vdGVzdHMvQ0NMYXllclRyZWVI
b3N0VGVzdC5jcHAJKHJldmlzaW9uIDk1MTg1KQorKysgU291cmNlL1dlYktpdC9jaHJvbWl1bS90
ZXN0cy9DQ0xheWVyVHJlZUhvc3RUZXN0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjgsNyArMjgs
MTIgQEAKIAogI2luY2x1ZGUgImNjL0NDTGF5ZXJUcmVlSG9zdC5oIgogCi0jaW5jbHVkZSAiR3Jh
cGhpY3NDb250ZXh0M0QuaCIKKyNpbmNsdWRlICJDQ1RocmVhZEltcGwuaCIKKyNpbmNsdWRlICJH
cmFwaGljc0NvbnRleHQzRFByaXZhdGUuaCIKKyNpbmNsdWRlICJMYXllckNocm9taXVtLmgiCisj
aW5jbHVkZSAiTGF5ZXJQYWludGVyQ2hyb21pdW0uaCIKKyNpbmNsdWRlICJNb2NrV2ViR3JhcGhp
Y3NDb250ZXh0M0QuaCIKKyNpbmNsdWRlICJUZXh0dXJlTWFuYWdlci5oIgogI2luY2x1ZGUgImNj
L0NDTGF5ZXJUcmVlSG9zdEltcGwuaCIKICNpbmNsdWRlICJjYy9DQ01haW5UaHJlYWRUYXNrLmgi
CiAjaW5jbHVkZSAiY2MvQ0NUaHJlYWRUYXNrLmgiCkBAIC0zOCwxNSArNDMsMTE1IEBACiAjaW5j
bHVkZSA8d3RmL1Bhc3NSZWZQdHIuaD4KICNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+CiAKLQogdXNp
bmcgbmFtZXNwYWNlIFdlYkNvcmU7Cit1c2luZyBuYW1lc3BhY2UgV2ViS2l0OwogdXNpbmcgbmFt
ZXNwYWNlIFdURjsKIAogbmFtZXNwYWNlIHsKIAotY2xhc3MgTW9ja0xheWVyVHJlZUhvc3Q7Ci1j
bGFzcyBNb2NrTGF5ZXJUcmVlSG9zdENsaWVudDsKLWNsYXNzIE1vY2tMYXllclRyZWVIb3N0SW1w
bDsKKy8vIFVzZWQgYnkgdGVzdCBzdHVicyB0byBub3RpZnkgdGhlIHRlc3Qgd2hlbiBzb21ldGhp
bmcgaW50ZXJlc3RpbmcgaGFwcGVucy4KK2NsYXNzIFRlc3RIb29rcyB7CitwdWJsaWM6CisgICAg
dmlydHVhbCB2b2lkIGJlZ2luQ29tbWl0T25DQ1RocmVhZChDQ0xheWVyVHJlZUhvc3RJbXBsKikg
eyB9CisgICAgdmlydHVhbCB2b2lkIGNvbW1pdENvbXBsZXRlT25DQ1RocmVhZChDQ0xheWVyVHJl
ZUhvc3RJbXBsKikgeyB9CisgICAgdmlydHVhbCB2b2lkIGRyYXdMYXllcnNPbkNDVGhyZWFkKEND
TGF5ZXJUcmVlSG9zdEltcGwqKSB7IH0KK307CisKKy8vIEFkYXB0cyBDQ0xheWVyVHJlZUhvc3RJ
bXBsIGZvciB0ZXN0LiBSdW5zIHJlYWwgY29kZSwgdGhlbiBpbnZva2VzIHRlc3QgaG9va3MuCitj
bGFzcyBNb2NrTGF5ZXJUcmVlSG9zdEltcGwgOiBwdWJsaWMgQ0NMYXllclRyZWVIb3N0SW1wbCB7
CitwdWJsaWM6CisgICAgTW9ja0xheWVyVHJlZUhvc3RJbXBsKFRlc3RIb29rcyogdGVzdEhvb2tz
LCBjb25zdCBDQ1NldHRpbmdzJiBzZXR0aW5ncykKKyAgICAgICAgOiBDQ0xheWVyVHJlZUhvc3RJ
bXBsKHNldHRpbmdzKQorICAgICAgICAsIG1fdGVzdEhvb2tzKHRlc3RIb29rcykKKyAgICB7Cisg
ICAgfQorCisgICAgdmlydHVhbCB2b2lkIGJlZ2luQ29tbWl0KCkKKyAgICB7CisgICAgICAgIEND
TGF5ZXJUcmVlSG9zdEltcGw6OmJlZ2luQ29tbWl0KCk7CisgICAgICAgIG1fdGVzdEhvb2tzLT5i
ZWdpbkNvbW1pdE9uQ0NUaHJlYWQodGhpcyk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIGNv
bW1pdENvbXBsZXRlKCkKKyAgICB7CisgICAgICAgIENDTGF5ZXJUcmVlSG9zdEltcGw6OmNvbW1p
dENvbXBsZXRlKCk7CisgICAgICAgIG1fdGVzdEhvb2tzLT5jb21taXRDb21wbGV0ZU9uQ0NUaHJl
YWQodGhpcyk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIGRyYXdMYXllcnMoKQorICAgIHsK
KyAgICAgICAgQ0NMYXllclRyZWVIb3N0SW1wbDo6ZHJhd0xheWVycygpOworICAgICAgICBtX3Rl
c3RIb29rcy0+ZHJhd0xheWVyc09uQ0NUaHJlYWQodGhpcyk7CisgICAgfQorCitwcml2YXRlOgor
ICAgIFRlc3RIb29rcyogbV90ZXN0SG9va3M7Cit9OworCisvLyBBZGFwdHMgQ0NMYXllclRyZWVI
b3N0IGZvciB0ZXN0LiBJbmplY3RzIE1vY2tMYXllclRyZWVIb3N0SW1wbC4KK2NsYXNzIE1vY2tM
YXllclRyZWVIb3N0IDogcHVibGljIENDTGF5ZXJUcmVlSG9zdCB7CitwdWJsaWM6CisgICAgTW9j
a0xheWVyVHJlZUhvc3QoVGVzdEhvb2tzKiB0ZXN0SG9va3MsIENDTGF5ZXJUcmVlSG9zdENsaWVu
dCogY2xpZW50LCBQYXNzUmVmUHRyPExheWVyQ2hyb21pdW0+IHJvb3RMYXllciwgY29uc3QgQ0NT
ZXR0aW5ncyYgc2V0dGluZ3MpCisgICAgICAgIDogQ0NMYXllclRyZWVIb3N0KGNsaWVudCwgcm9v
dExheWVyLCBzZXR0aW5ncykKKyAgICAgICAgLCBtX3Rlc3RIb29rcyh0ZXN0SG9va3MpCisgICAg
eworICAgICAgICBib29sIHN1Y2Nlc3MgPSBpbml0aWFsaXplKCk7CisgICAgICAgIEFTU0VSVChz
dWNjZXNzKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIFBhc3NPd25QdHI8Q0NMYXllclRyZWVIb3N0
SW1wbD4gY3JlYXRlTGF5ZXJUcmVlSG9zdEltcGwoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGFk
b3B0UHRyKG5ldyBNb2NrTGF5ZXJUcmVlSG9zdEltcGwobV90ZXN0SG9va3MsIHNldHRpbmdzKCkp
KTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgVGVzdEhvb2tzKiBtX3Rlc3RIb29rczsKK307CisK
Ky8vIFRlc3Qgc3R1YiBmb3IgV2ViR3JhcGhpY3NDb250ZXh0M0QuIFJldHVybnMgY2FubmVkIHZh
bHVlcyBuZWVkZWQgZm9yIGNvbXBvc2l0b3IgaW5pdGlhbGl6YXRpb24uCitjbGFzcyBDb21wb3Np
dG9yTW9ja1dlYkdyYXBoaWNzQ29udGV4dDNEIDogcHVibGljIE1vY2tXZWJHcmFwaGljc0NvbnRl
eHQzRCB7CitwdWJsaWM6CisgICAgdmlydHVhbCBib29sIG1ha2VDb250ZXh0Q3VycmVudCgpIHsg
cmV0dXJuIHRydWU7IH0KKyAgICB2aXJ0dWFsIFdlYkdMSWQgY3JlYXRlUHJvZ3JhbSgpIHsgcmV0
dXJuIDE7IH0KKyAgICB2aXJ0dWFsIFdlYkdMSWQgY3JlYXRlU2hhZGVyKFdHQzNEZW51bSkgeyBy
ZXR1cm4gMTsgfQorICAgIHZpcnR1YWwgdm9pZCBnZXRTaGFkZXJpdihXZWJHTElkLCBXR0MzRGVu
dW0sIFdHQzNEaW50KiB2YWx1ZSkgeyAqdmFsdWUgPSAxOyB9CisgICAgdmlydHVhbCB2b2lkIGdl
dFByb2dyYW1pdihXZWJHTElkLCBXR0MzRGVudW0sIFdHQzNEaW50KiB2YWx1ZSkgeyAqdmFsdWUg
PSAxOyB9Cit9OworCisvLyBJbXBsZW1lbnRhdGlvbiBvZiBDQ0xheWVyVHJlZUhvc3QgY2FsbGJh
Y2sgaW50ZXJmYWNlLgorY2xhc3MgTW9ja0xheWVyVHJlZUhvc3RDbGllbnQgOiBwdWJsaWMgQ0NM
YXllclRyZWVIb3N0Q2xpZW50IHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBNb2NrTGF5ZXJUcmVl
SG9zdENsaWVudChUZXN0SG9va3MqIHRlc3RIb29rcykgOiBtX3Rlc3RIb29rcyh0ZXN0SG9va3Mp
IHsgfQorCisgICAgdmlydHVhbCB2b2lkIGFuaW1hdGVBbmRMYXlvdXQoZG91YmxlIGZyYW1lQmVn
aW5UaW1lKQorICAgIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIFBhc3NPd25QdHI8Q0NUaHJlYWQ+
IGNyZWF0ZUNvbXBvc2l0b3JUaHJlYWQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIENDVGhyZWFk
SW1wbDo6Y3JlYXRlKCk7CisgICAgfQorCisgICAgdmlydHVhbCBQYXNzUmVmUHRyPEdyYXBoaWNz
Q29udGV4dDNEPiBjcmVhdGVMYXllclRyZWVIb3N0Q29udGV4dDNEKCkKKyAgICB7CisgICAgICAg
IE93blB0cjxXZWJHcmFwaGljc0NvbnRleHQzRD4gbW9jayA9IGFkb3B0UHRyKG5ldyBDb21wb3Np
dG9yTW9ja1dlYkdyYXBoaWNzQ29udGV4dDNEKCkpOworICAgICAgICBHcmFwaGljc0NvbnRleHQz
RDo6QXR0cmlidXRlcyBhdHRyczsKKyAgICAgICAgUmVmUHRyPEdyYXBoaWNzQ29udGV4dDNEPiBj
b250ZXh0ID0gR3JhcGhpY3NDb250ZXh0M0RQcml2YXRlOjpjcmVhdGVHcmFwaGljc0NvbnRleHRG
cm9tV2ViQ29udGV4dChtb2NrLnJlbGVhc2UoKSwgYXR0cnMsIDAsIEdyYXBoaWNzQ29udGV4dDNE
OjpSZW5kZXJEaXJlY3RseVRvSG9zdFdpbmRvdywgR3JhcGhpY3NDb250ZXh0M0RQcml2YXRlOjpG
b3JVc2VPbkFub3RoZXJUaHJlYWQpOworICAgICAgICByZXR1cm4gY29udGV4dDsKKyAgICB9CisK
KyAgICB2aXJ0dWFsIFBhc3NPd25QdHI8TGF5ZXJQYWludGVyQ2hyb21pdW0+IGNyZWF0ZVJvb3RM
YXllclBhaW50ZXIoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisg
ICAgdmlydHVhbCB2b2lkIGRpZFJlY3JlYXRlR3JhcGhpY3NDb250ZXh0KGJvb2wpCisgICAgewor
ICAgIH0KKworcHJpdmF0ZToKKyAgICBUZXN0SG9va3MqIG1fdGVzdEhvb2tzOworfTsKIAogLy8g
VGhlIENDTGF5ZXJUcmVlSG9zdFRlc3QgcnVucyB3aXRoIHRoZSBtYWluIGxvb3AgcnVubmluZy4g
SXQgaW5zdGFudGlhdGVzIGEgc2luZ2xlIE1vY2tMYXllclRyZWVIb3N0IGFuZCBhc3NvY2lhdGVk
CiAvLyBNb2NrTGF5ZXJUcmVlSG9zdEltcGwvTW9ja0xheWVyVHJlZUhvc3RDbGllbnQuCkBAIC01
OCw3ICsxNjMsNyBAQCBjbGFzcyBNb2NrTGF5ZXJUcmVlSG9zdEltcGw7CiAvLwogLy8gVGhlIHRl
c3QgY29udGludWVzIHVudGlsIHNvbWVvbmUgY2FsbHMgZW5kVGVzdC4gZW5kVGVzdCBjYW4gYmUg
Y2FsbGVkIG9uIGFueSB0aHJlYWQsIGJ1dCBiZSBhd2FyZSB0aGF0CiAvLyBlbmRpbmcgdGhlIHRl
c3QgaXMgYW4gYXN5bmNocm9ub3VzIHByb2Nlc3MuCi1jbGFzcyBDQ0xheWVyVHJlZUhvc3RUZXN0
IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworY2xhc3MgQ0NMYXllclRyZWVIb3N0VGVzdCA6IHB1
YmxpYyB0ZXN0aW5nOjpUZXN0LCBUZXN0SG9va3MgewogcHVibGljOgogICAgIENDTGF5ZXJUcmVl
SG9zdFRlc3QoKQogICAgICAgICA6IG1fYmVnaW5uaW5nKGZhbHNlKQpAQCAtNjcsMTkgKzE3Miwy
MCBAQCBwdWJsaWM6CiAgICAgICAgICwgbV90aW1lZE91dChmYWxzZSkgeyB9CiAKICAgICB2aXJ0
dWFsIHZvaWQgYWZ0ZXJUZXN0KCkgPSAwOwotCiAgICAgdmlydHVhbCB2b2lkIGJlZ2luVGVzdCgp
ID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQgYW5pbWF0ZUFuZExheW91dChNb2NrTGF5ZXJUcmVlSG9z
dENsaWVudCogbGF5ZXJUcmVlSG9zdCwgZG91YmxlIGZyYW1lQmVnaW5UaW1lKSB7IH0KLSAgICB2
aXJ0dWFsIHZvaWQgYmVnaW5Db21taXRPbkNDVGhyZWFkKE1vY2tMYXllclRyZWVIb3N0SW1wbCog
bGF5ZXJUcmVlSG9zdEltcGwpIHsgfQotICAgIHZpcnR1YWwgdm9pZCBiZWdpbkNvbW1pdE9uTWFp
blRocmVhZChNb2NrTGF5ZXJUcmVlSG9zdCogbGF5ZXJUcmVlSG9zdCkgeyB9Ci0gICAgdmlydHVh
bCB2b2lkIGNvbW1pdE9uQ0NUaHJlYWQoTW9ja0xheWVyVHJlZUhvc3QqIGxheWVyVHJlZUhvc3Qs
IE1vY2tMYXllclRyZWVIb3N0SW1wbCogbGF5ZXJUcmVlSG9zdEltcGwpIHsgfQotICAgIHZpcnR1
YWwgdm9pZCBjb21taXRDb21wbGV0ZU9uQ0NUaHJlYWQoTW9ja0xheWVyVHJlZUhvc3RJbXBsKiBs
YXllclRyZWVIb3N0SW1wbCkgeyB9Ci0gICAgdmlydHVhbCB2b2lkIGNvbW1pdENvbXBsZXRlT25N
YWluVGhyZWFkKE1vY2tMYXllclRyZWVIb3N0KiBsYXllclRyZWVIb3N0KSB7IH0KLSAgICB2aXJ0
dWFsIHZvaWQgZHJhd0xheWVyc0FuZFByZXNlbnRPbkNDVGhyZWFkKE1vY2tMYXllclRyZWVIb3N0
SW1wbCogbGF5ZXJUcmVlSG9zdEltcGwpIHsgfQotICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVMYXll
cnMoTW9ja0xheWVyVHJlZUhvc3QqIGxheWVyVHJlZUhvc3QpIHsgfQogCiAgICAgdm9pZCBlbmRU
ZXN0KCk7CiAKKyAgICB2b2lkIHBvc3RTZXROZWVkc0NvbW1pdFRvTWFpblRocmVhZCgpCisgICAg
eworICAgICAgICBjYWxsT25NYWluVGhyZWFkKENDTGF5ZXJUcmVlSG9zdFRlc3Q6OmRpc3BhdGNo
U2V0TmVlZHNDb21taXQsIHRoaXMpOworICAgIH0KKworICAgIHZvaWQgcG9zdFNldE5lZWRzUmVk
cmF3VG9NYWluVGhyZWFkKCkKKyAgICB7CisgICAgICAgIGNhbGxPbk1haW5UaHJlYWQoQ0NMYXll
clRyZWVIb3N0VGVzdDo6ZGlzcGF0Y2hTZXROZWVkc1JlZHJhdywgdGhpcyk7CisgICAgfQorCiBw
cm90ZWN0ZWQ6CiAgICAgdm9pZCBkb0JlZ2luVGVzdCgpOwogCkBAIC05NSwxMCArMjAxLDI4IEBA
IHByb3RlY3RlZDoKICAgICBzdGF0aWMgdm9pZCBvbkVuZFRlc3Qodm9pZCogc2VsZikKICAgICB7
CiAgICAgICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7CisgICAgICAgIHdlYmtpdF9zdXBwb3J0
OjpRdWl0TWVzc2FnZUxvb3AoKTsKICAgICAgICAgQ0NMYXllclRyZWVIb3N0VGVzdCogdGVzdCA9
IHN0YXRpY19jYXN0PENDTGF5ZXJUcmVlSG9zdFRlc3QqPihzZWxmKTsKKyAgICAgICAgQVNTRVJU
KHRlc3QpOwogICAgICAgICB0ZXN0LT5tX2xheWVyVHJlZUhvc3QuY2xlYXIoKTsKLSAgICAgICAg
dGVzdC0+bV9jbGllbnQuY2xlYXIoKTsKLSAgICAgICAgd2Via2l0X3N1cHBvcnQ6OlF1aXRNZXNz
YWdlTG9vcCgpOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIGRpc3BhdGNoU2V0TmVlZHNDb21t
aXQodm9pZCogc2VsZikKKyAgICB7CisgICAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOworICAg
ICAgQ0NMYXllclRyZWVIb3N0VGVzdCogdGVzdCA9IHN0YXRpY19jYXN0PENDTGF5ZXJUcmVlSG9z
dFRlc3QqPihzZWxmKTsKKyAgICAgIEFTU0VSVCh0ZXN0KTsKKyAgICAgIGlmICh0ZXN0LT5tX2xh
eWVyVHJlZUhvc3QpCisgICAgICAgICAgdGVzdC0+bV9sYXllclRyZWVIb3N0LT5zZXROZWVkc0Nv
bW1pdEFuZFJlZHJhdygpOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIGRpc3BhdGNoU2V0TmVl
ZHNSZWRyYXcodm9pZCogc2VsZikKKyAgICB7CisgICAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkp
OworICAgICAgQ0NMYXllclRyZWVIb3N0VGVzdCogdGVzdCA9IHN0YXRpY19jYXN0PENDTGF5ZXJU
cmVlSG9zdFRlc3QqPihzZWxmKTsKKyAgICAgIEFTU0VSVCh0ZXN0KTsKKyAgICAgIGlmICh0ZXN0
LT5tX2xheWVyVHJlZUhvc3QpCisgICAgICAgICAgdGVzdC0+bV9sYXllclRyZWVIb3N0LT5zZXRO
ZWVkc1JlZHJhdygpOwogICAgIH0KIAogICAgIHZvaWQgcnVuVGVzdCgpCkBAIC0xMDksNiArMjMz
LDggQEAgcHJvdGVjdGVkOgogICAgICAgICBtX3J1bm5pbmcgPSBmYWxzZTsKICAgICAgICAgYm9v
bCB0aW1lZE91dCA9IG1fdGltZWRPdXQ7IC8vIFNhdmUgd2hldGhlciB3ZSdyZSB0aW1lZCBvdXQg
aW4gY2FzZSBSdW5BbGxQZW5kaW5nTWVzc2FnZXMgaGFzIHRoZSB0aW1lb3V0LgogICAgICAgICB3
ZWJraXRfc3VwcG9ydDo6UnVuQWxsUGVuZGluZ01lc3NhZ2VzKCk7CisgICAgICAgIEFTU0VSVCgh
bV9sYXllclRyZWVIb3N0LmdldCgpKTsKKyAgICAgICAgbV9jbGllbnQuY2xlYXIoKTsKICAgICAg
ICAgaWYgKHRpbWVkT3V0KSB7CiAgICAgICAgICAgICBwcmludGYoIlRlc3QgdGltZWQgb3V0Iik7
CiAgICAgICAgICAgICBGQUlMKCkgPDwgIlRlc3QgdGltZWQgb3V0IjsKQEAgLTEzMCw3ICsyNTYs
NyBAQCBwcm90ZWN0ZWQ6CiAgICAgVmVjdG9yPHN0ZDo6c3RyaW5nPiBtX3RyYWNlczsKIAogICAg
IE93blB0cjxNb2NrTGF5ZXJUcmVlSG9zdENsaWVudD4gbV9jbGllbnQ7Ci0gICAgUmVmUHRyPE1v
Y2tMYXllclRyZWVIb3N0PiBtX2xheWVyVHJlZUhvc3Q7CisgICAgUmVmUHRyPENDTGF5ZXJUcmVl
SG9zdD4gbV9sYXllclRyZWVIb3N0OwogCiBwcml2YXRlOgogICAgIGJvb2wgbV9iZWdpbm5pbmc7
CkBAIC0xMzksMTQ2ICsyNjUsMTkgQEAgcHJpdmF0ZToKICAgICBib29sIG1fdGltZWRPdXQ7CiB9
OwogCi1jbGFzcyBNb2NrTGF5ZXJUcmVlSG9zdENsaWVudCA6IHB1YmxpYyBDQ0xheWVyVHJlZUhv
c3RDbGllbnQgewotcHVibGljOgotICAgIE1vY2tMYXllclRyZWVIb3N0Q2xpZW50KENDTGF5ZXJU
cmVlSG9zdFRlc3QqIHRlc3QpIDogbV90ZXN0KHRlc3QpIHsgfQotCi0gICAgdmlydHVhbCBQYXNz
UmVmUHRyPEdyYXBoaWNzQ29udGV4dDNEPiBjcmVhdGVMYXllclRyZWVIb3N0Q29udGV4dDNEKCkK
LSAgICB7Ci0gICAgICAgIHJldHVybiBhZG9wdFJlZjxHcmFwaGljc0NvbnRleHQzRD4oMCk7Ci0g
ICAgfQotCi0gICAgdmlydHVhbCB2b2lkIGFuaW1hdGVBbmRMYXlvdXQoZG91YmxlIGZyYW1lQmVn
aW5UaW1lKQotICAgIHsKLSAgICAgICAgbV90ZXN0LT5hbmltYXRlQW5kTGF5b3V0KHRoaXMsIGZy
YW1lQmVnaW5UaW1lKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlTGF5ZXJzKCkK
LSAgICB7Ci0gICAgfQotCi1wcml2YXRlOgotICAgIENDTGF5ZXJUcmVlSG9zdFRlc3QqIG1fdGVz
dDsKLX07Ci0KLWNsYXNzIE1vY2tMYXllclRyZWVIb3N0Q29tbWl0dGVyIDogcHVibGljIENDTGF5
ZXJUcmVlSG9zdENvbW1pdHRlciB7Ci1wdWJsaWM6Ci0gICAgc3RhdGljIFBhc3NPd25QdHI8TW9j
a0xheWVyVHJlZUhvc3RDb21taXR0ZXI+IGNyZWF0ZShDQ0xheWVyVHJlZUhvc3RUZXN0KiB0ZXN0
KQotICAgIHsKLSAgICAgICAgcmV0dXJuIGFkb3B0UHRyKG5ldyBNb2NrTGF5ZXJUcmVlSG9zdENv
bW1pdHRlcih0ZXN0KSk7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIGNvbW1pdChDQ0xheWVy
VHJlZUhvc3QqIGhvc3QsIENDTGF5ZXJUcmVlSG9zdEltcGwqIGhvc3RJbXBsKQotICAgIHsKLSAg
ICAgICAgQ0NMYXllclRyZWVIb3N0Q29tbWl0dGVyOjpjb21taXQoaG9zdCwgaG9zdEltcGwpOwot
ICAgICAgICBtX3Rlc3QtPmNvbW1pdE9uQ0NUaHJlYWQocmVpbnRlcnByZXRfY2FzdDxNb2NrTGF5
ZXJUcmVlSG9zdCo+KGhvc3QpLCByZWludGVycHJldF9jYXN0PE1vY2tMYXllclRyZWVIb3N0SW1w
bCo+KGhvc3RJbXBsKSk7Ci0gICAgfQotCi1wcml2YXRlOgotICAgIE1vY2tMYXllclRyZWVIb3N0
Q29tbWl0dGVyKENDTGF5ZXJUcmVlSG9zdFRlc3QqIHRlc3QpIDogbV90ZXN0KHRlc3QpIHsgfQot
ICAgIENDTGF5ZXJUcmVlSG9zdFRlc3QqIG1fdGVzdDsKLX07Ci0KLWNsYXNzIE1vY2tMYXllclRy
ZWVIb3N0SW1wbCA6IHB1YmxpYyBDQ0xheWVyVHJlZUhvc3RJbXBsIHsKLXB1YmxpYzoKLSAgICBz
dGF0aWMgUGFzc093blB0cjxNb2NrTGF5ZXJUcmVlSG9zdEltcGw+IGNyZWF0ZShDQ0xheWVyVHJl
ZUhvc3RJbXBsQ2xpZW50KiBjbGllbnQsIENDTGF5ZXJUcmVlSG9zdFRlc3QqIHRlc3QpCi0gICAg
ewotICAgICAgICByZXR1cm4gYWRvcHRQdHIobmV3IE1vY2tMYXllclRyZWVIb3N0SW1wbChjbGll
bnQsIHRlc3QpKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgYmVnaW5Db21taXQoKQotICAg
IHsKLSAgICAgICAgQ0NMYXllclRyZWVIb3N0SW1wbDo6YmVnaW5Db21taXQoKTsKLSAgICAgICAg
bV90ZXN0LT5iZWdpbkNvbW1pdE9uQ0NUaHJlYWQodGhpcyk7Ci0gICAgfQotCi0gICAgdmlydHVh
bCB2b2lkIGNvbW1pdENvbXBsZXRlKCkKLSAgICB7Ci0gICAgICAgIENDTGF5ZXJUcmVlSG9zdElt
cGw6OmNvbW1pdENvbXBsZXRlKCk7Ci0gICAgICAgIG1fdGVzdC0+Y29tbWl0Q29tcGxldGVPbkND
VGhyZWFkKHRoaXMpOwotICAgIH0KLQotICAgIHZpcnR1YWwgdm9pZCBkcmF3TGF5ZXJzQW5kUHJl
c2VudCgpCi0gICAgewotICAgICAgICBtX3Rlc3QtPmRyYXdMYXllcnNBbmRQcmVzZW50T25DQ1Ro
cmVhZCh0aGlzKTsKLSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgTW9ja0xheWVyVHJlZUhvc3RJbXBs
KENDTGF5ZXJUcmVlSG9zdEltcGxDbGllbnQqIGNsaWVudCwgQ0NMYXllclRyZWVIb3N0VGVzdCog
dGVzdCkKLSAgICAgICAgICAgIDogQ0NMYXllclRyZWVIb3N0SW1wbChjbGllbnQpCi0gICAgICAg
ICAgICAsIG1fdGVzdCh0ZXN0KQotICAgIHsKLSAgICB9Ci0KLSAgICBDQ0xheWVyVHJlZUhvc3RU
ZXN0KiBtX3Rlc3Q7Ci19OwotCi1jbGFzcyBNb2NrTGF5ZXJUcmVlSG9zdEltcGxQcm94eSA6IHB1
YmxpYyBDQ0xheWVyVHJlZUhvc3RJbXBsUHJveHkgewotcHVibGljOgotICAgIHN0YXRpYyBQYXNz
T3duUHRyPE1vY2tMYXllclRyZWVIb3N0SW1wbFByb3h5PiBjcmVhdGUoQ0NMYXllclRyZWVIb3N0
KiBob3N0LCBDQ0xheWVyVHJlZUhvc3RUZXN0KiB0ZXN0KQotICAgIHsKLSAgICAgICAgcmV0dXJu
IGFkb3B0UHRyKG5ldyBNb2NrTGF5ZXJUcmVlSG9zdEltcGxQcm94eShob3N0LCB0ZXN0KSk7Ci0g
ICAgfQotCi0gICAgUGFzc093blB0cjxDQ0xheWVyVHJlZUhvc3RJbXBsPiBjcmVhdGVMYXllclRy
ZWVIb3N0SW1wbCgpCi0gICAgewotICAgICAgICByZXR1cm4gTW9ja0xheWVyVHJlZUhvc3RJbXBs
OjpjcmVhdGUodGhpcywgbV90ZXN0KTsKLSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgTW9ja0xheWVy
VHJlZUhvc3RJbXBsUHJveHkoQ0NMYXllclRyZWVIb3N0KiBob3N0LCBDQ0xheWVyVHJlZUhvc3RU
ZXN0KiB0ZXN0KQotICAgICAgICA6IENDTGF5ZXJUcmVlSG9zdEltcGxQcm94eShob3N0KQotICAg
ICAgICAsIG1fdGVzdCh0ZXN0KSB7IH0KLQotICAgIENDTGF5ZXJUcmVlSG9zdFRlc3QqIG1fdGVz
dDsKLX07Ci0KLWNsYXNzIE1vY2tMYXllclRyZWVIb3N0IDogcHVibGljIENDTGF5ZXJUcmVlSG9z
dCB7Ci1wdWJsaWM6Ci0gICAgTW9ja0xheWVyVHJlZUhvc3QoQ0NMYXllclRyZWVIb3N0Q2xpZW50
KiBjbGllbnQsIENDTGF5ZXJUcmVlSG9zdFRlc3QqIHRlc3QpCi0gICAgICAgIDogQ0NMYXllclRy
ZWVIb3N0KGNsaWVudCkKLSAgICAgICAgLCBtX3Rlc3QodGVzdCkgeyB9Ci0KLSAgICB2aXJ0dWFs
IFBhc3NPd25QdHI8Q0NMYXllclRyZWVIb3N0SW1wbFByb3h5PiBjcmVhdGVMYXllclRyZWVIb3N0
SW1wbFByb3h5KCkKLSAgICB7Ci0gICAgICAgIE93blB0cjxDQ0xheWVyVHJlZUhvc3RJbXBsUHJv
eHk+IHByb3h5ID0gTW9ja0xheWVyVHJlZUhvc3RJbXBsUHJveHk6OmNyZWF0ZSh0aGlzLCBtX3Rl
c3QpOwotICAgICAgICBwcm94eS0+c3RhcnQoKTsKLSAgICAgICAgcmV0dXJuIHByb3h5LnJlbGVh
c2UoKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlTGF5ZXJzKCkKLSAgICB7Ci0g
ICAgICAgIG1fdGVzdC0+dXBkYXRlTGF5ZXJzKHRoaXMpOwotICAgIH0KLQotICAgIHZpcnR1YWwg
UGFzc093blB0cjxDQ0xheWVyVHJlZUhvc3RDb21taXR0ZXI+IGNyZWF0ZUxheWVyVHJlZUhvc3RD
b21taXR0ZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE1vY2tMYXllclRyZWVIb3N0Q29tbWl0
dGVyOjpjcmVhdGUobV90ZXN0KTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgYmVnaW5Db21t
aXQoKQotICAgIHsKLSAgICAgICAgQ0NMYXllclRyZWVIb3N0OjpiZWdpbkNvbW1pdCgpOwotICAg
ICAgICBtX3Rlc3QtPmJlZ2luQ29tbWl0T25NYWluVGhyZWFkKHRoaXMpOwotICAgIH0KLQotICAg
IHZpcnR1YWwgdm9pZCBjb21taXRDb21wbGV0ZSgpCi0gICAgewotICAgICAgICBtX3Rlc3QtPmNv
bW1pdENvbXBsZXRlT25NYWluVGhyZWFkKHRoaXMpOwotICAgICAgICBDQ0xheWVyVHJlZUhvc3Q6
OmNvbW1pdENvbXBsZXRlKCk7Ci0gICAgfQotCi1wcml2YXRlOgotICAgIENDTGF5ZXJUcmVlSG9z
dFRlc3QqIG1fdGVzdDsKLX07Ci0KIHZvaWQgQ0NMYXllclRyZWVIb3N0VGVzdDo6ZG9CZWdpblRl
c3QoKQogeworICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7CiAgICAgQVNTRVJUKCFtX3J1bm5p
bmcpOwogICAgIG1fcnVubmluZyA9IHRydWU7CiAgICAgbV9jbGllbnQgPSBhZG9wdFB0cihuZXcg
TW9ja0xheWVyVHJlZUhvc3RDbGllbnQodGhpcykpOwotICAgIG1fbGF5ZXJUcmVlSG9zdCA9IGFk
b3B0UmVmKG5ldyBNb2NrTGF5ZXJUcmVlSG9zdChtX2NsaWVudC5nZXQoKSwgdGhpcykpOwotICAg
IG1fbGF5ZXJUcmVlSG9zdC0+aW5pdCgpOworCisgICAgQ0NTZXR0aW5ncyBzZXR0aW5nczsKKyAg
ICBzZXR0aW5ncy5lbmFibGVDb21wb3NpdG9yVGhyZWFkID0gdHJ1ZTsKKyAgICBSZWZQdHI8TGF5
ZXJDaHJvbWl1bT4gcm9vdExheWVyOworICAgIG1fbGF5ZXJUcmVlSG9zdCA9IGFkb3B0UmVmKG5l
dyBNb2NrTGF5ZXJUcmVlSG9zdCh0aGlzLCBtX2NsaWVudC5nZXQoKSwgcm9vdExheWVyLCBzZXR0
aW5ncykpOworICAgIEFTU0VSVChtX2xheWVyVHJlZUhvc3QpOworCiAgICAgbV9iZWdpbm5pbmcg
PSB0cnVlOwogICAgIGJlZ2luVGVzdCgpOwogICAgIG1fYmVnaW5uaW5nID0gZmFsc2U7CkBAIC0z
MjcsNyArMzI2LDcgQEAgcHVibGljOgogCiAgICAgdmlydHVhbCB2b2lkIGJlZ2luVGVzdCgpCiAg
ICAgewotICAgICAgICBtX2xheWVyVHJlZUhvc3QtPnNldE5lZWRzQ29tbWl0QW5kUmVkcmF3KCk7
CisgICAgICAgIHBvc3RTZXROZWVkc0NvbW1pdFRvTWFpblRocmVhZCgpOwogICAgICAgICBlbmRU
ZXN0KCk7CiAgICAgfQogCkBAIC0zNDcsNyArMzQ2LDcgQEAgcHVibGljOgogCiAgICAgdmlydHVh
bCB2b2lkIGJlZ2luVGVzdCgpCiAgICAgewotICAgICAgICBtX2xheWVyVHJlZUhvc3QtPnNldE5l
ZWRzUmVkcmF3KCk7CisgICAgICAgIHBvc3RTZXROZWVkc1JlZHJhd1RvTWFpblRocmVhZCgpOwog
ICAgICAgICBlbmRUZXN0KCk7CiAgICAgfQogCkBAIC0zNzEsMjMgKzM3MCwyMyBAQCBwdWJsaWM6
CiAKICAgICB2aXJ0dWFsIHZvaWQgYmVnaW5UZXN0KCkKICAgICB7Ci0gICAgICAgIG1fbGF5ZXJU
cmVlSG9zdC0+c2V0TmVlZHNDb21taXRBbmRSZWRyYXcoKTsKKyAgICAgICAgcG9zdFNldE5lZWRz
Q29tbWl0VG9NYWluVGhyZWFkKCk7CiAgICAgICAgIGVuZFRlc3QoKTsKICAgICB9CiAKLSAgICB2
aXJ0dWFsIHZvaWQgY29tbWl0Q29tcGxldGVPbkNDVGhyZWFkKE1vY2tMYXllclRyZWVIb3N0SW1w
bCogbGF5ZXJUcmVlSG9zdEltcGwpCisgICAgdmlydHVhbCB2b2lkIGNvbW1pdENvbXBsZXRlT25D
Q1RocmVhZChDQ0xheWVyVHJlZUhvc3RJbXBsKikKICAgICB7CiAgICAgICAgIG1fbnVtQ29tcGxl
dGVDb21taXRzKys7CiAgICAgICAgIGlmIChtX251bUNvbXBsZXRlQ29tbWl0cyA9PSAyKQogICAg
ICAgICAgICAgZW5kVGVzdCgpOwogICAgIH0KIAotICAgIHZpcnR1YWwgdm9pZCBkcmF3TGF5ZXJz
QW5kUHJlc2VudE9uQ0NUaHJlYWQoTW9ja0xheWVyVHJlZUhvc3RJbXBsKiBsYXllclRyZWVIb3N0
SW1wbCkKKyAgICB2aXJ0dWFsIHZvaWQgZHJhd0xheWVyc09uQ0NUaHJlYWQoQ0NMYXllclRyZWVI
b3N0SW1wbCopCiAgICAgewogICAgICAgICBpZiAobV9udW1EcmF3cyA9PSAxKQotICAgICAgICAg
ICAgbGF5ZXJUcmVlSG9zdEltcGwtPnNldE5lZWRzQ29tbWl0QW5kUmVkcmF3KCk7CisgICAgICAg
ICAgcG9zdFNldE5lZWRzQ29tbWl0VG9NYWluVGhyZWFkKCk7CiAgICAgICAgIG1fbnVtRHJhd3Mr
KzsKLSAgICAgICAgbGF5ZXJUcmVlSG9zdEltcGwtPnNldE5lZWRzUmVkcmF3KCk7CisgICAgICAg
IHBvc3RTZXROZWVkc1JlZHJhd1RvTWFpblRocmVhZCgpOwogICAgIH0KIAogICAgIHZpcnR1YWwg
dm9pZCBhZnRlclRlc3QoKQpAQCAtNDE1LDE4ICs0MTQsMTggQEAgcHVibGljOgogCiAgICAgdmly
dHVhbCB2b2lkIGJlZ2luVGVzdCgpCiAgICAgewotICAgICAgICBtX2xheWVyVHJlZUhvc3QtPnNl
dE5lZWRzQ29tbWl0QW5kUmVkcmF3KCk7Ci0gICAgICAgIG1fbGF5ZXJUcmVlSG9zdC0+c2V0TmVl
ZHNDb21taXRBbmRSZWRyYXcoKTsKKyAgICAgICAgcG9zdFNldE5lZWRzQ29tbWl0VG9NYWluVGhy
ZWFkKCk7CisgICAgICAgIHBvc3RTZXROZWVkc0NvbW1pdFRvTWFpblRocmVhZCgpOwogICAgIH0K
IAotICAgIHZpcnR1YWwgdm9pZCBkcmF3TGF5ZXJzQW5kUHJlc2VudE9uQ0NUaHJlYWQoTW9ja0xh
eWVyVHJlZUhvc3RJbXBsKiBsYXllclRyZWVIb3N0SW1wbCkKKyAgICB2aXJ0dWFsIHZvaWQgZHJh
d0xheWVyc09uQ0NUaHJlYWQoQ0NMYXllclRyZWVIb3N0SW1wbCogaW1wbCkKICAgICB7CiAgICAg
ICAgIG1fbnVtRHJhd3MrKzsKLSAgICAgICAgaWYgKCFsYXllclRyZWVIb3N0SW1wbC0+c291cmNl
RnJhbWVOdW1iZXIoKSkKKyAgICAgICAgaWYgKCFpbXBsLT5zb3VyY2VGcmFtZU51bWJlcigpKQog
ICAgICAgICAgICAgZW5kVGVzdCgpOwogICAgIH0KIAotICAgIHZpcnR1YWwgdm9pZCBjb21taXRP
bkNDVGhyZWFkKE1vY2tMYXllclRyZWVIb3N0KiBsYXllclRyZWVIb3N0LCBNb2NrTGF5ZXJUcmVl
SG9zdEltcGwqIGltcGwpCisgICAgdmlydHVhbCB2b2lkIGNvbW1pdENvbXBsZXRlT25DQ1RocmVh
ZChDQ0xheWVyVHJlZUhvc3RJbXBsKikKICAgICB7CiAgICAgICAgIG1fbnVtQ29tbWl0cysrOwog
ICAgIH0KQEAgLTQ1OCwxOCArNDU3LDE4IEBAIHB1YmxpYzoKIAogICAgIHZpcnR1YWwgdm9pZCBi
ZWdpblRlc3QoKQogICAgIHsKLSAgICAgICAgbV9sYXllclRyZWVIb3N0LT5zZXROZWVkc0NvbW1p
dEFuZFJlZHJhdygpOworICAgICAgICBwb3N0U2V0TmVlZHNDb21taXRUb01haW5UaHJlYWQoKTsK
ICAgICB9CiAKLSAgICB2aXJ0dWFsIHZvaWQgZHJhd0xheWVyc0FuZFByZXNlbnRPbkNDVGhyZWFk
KE1vY2tMYXllclRyZWVIb3N0SW1wbCogbGF5ZXJUcmVlSG9zdEltcGwpCisgICAgdmlydHVhbCB2
b2lkIGRyYXdMYXllcnNPbkNDVGhyZWFkKENDTGF5ZXJUcmVlSG9zdEltcGwqIGltcGwpCiAgICAg
ewotICAgICAgICBpZiAoIWxheWVyVHJlZUhvc3RJbXBsLT5zb3VyY2VGcmFtZU51bWJlcigpKQot
ICAgICAgICAgICAgbGF5ZXJUcmVlSG9zdEltcGwtPnNldE5lZWRzQ29tbWl0QW5kUmVkcmF3KCk7
Ci0gICAgICAgIGVsc2UgaWYgKGxheWVyVHJlZUhvc3RJbXBsLT5zb3VyY2VGcmFtZU51bWJlcigp
ID09IDEpCisgICAgICAgIGlmICghaW1wbC0+c291cmNlRnJhbWVOdW1iZXIoKSkKKyAgICAgICAg
ICAgIHBvc3RTZXROZWVkc0NvbW1pdFRvTWFpblRocmVhZCgpOworICAgICAgICBlbHNlIGlmIChp
bXBsLT5zb3VyY2VGcmFtZU51bWJlcigpID09IDEpCiAgICAgICAgICAgICBlbmRUZXN0KCk7CiAg
ICAgfQogCi0gICAgdmlydHVhbCB2b2lkIGNvbW1pdE9uQ0NUaHJlYWQoTW9ja0xheWVyVHJlZUhv
c3QqIGxheWVyVHJlZUhvc3QsIE1vY2tMYXllclRyZWVIb3N0SW1wbCogaW1wbCkKKyAgICB2aXJ0
dWFsIHZvaWQgY29tbWl0Q29tcGxldGVPbkNDVGhyZWFkKENDTGF5ZXJUcmVlSG9zdEltcGwqKQog
ICAgIHsKICAgICAgICAgbV9udW1Db21taXRzKys7CiAgICAgfQpAQCAtNTAxLDE5ICs1MDAsMjAg
QEAgcHVibGljOgogCiAgICAgdmlydHVhbCB2b2lkIGJlZ2luVGVzdCgpCiAgICAgeworICAgICAg
ICBwb3N0U2V0TmVlZHNDb21taXRUb01haW5UaHJlYWQoKTsKICAgICB9CiAKLSAgICB2aXJ0dWFs
IHZvaWQgZHJhd0xheWVyc0FuZFByZXNlbnRPbkNDVGhyZWFkKE1vY2tMYXllclRyZWVIb3N0SW1w
bCogaW1wbCkKKyAgICB2aXJ0dWFsIHZvaWQgZHJhd0xheWVyc09uQ0NUaHJlYWQoQ0NMYXllclRy
ZWVIb3N0SW1wbCogaW1wbCkKICAgICB7CiAgICAgICAgIEVYUEVDVF9FUSgwLCBpbXBsLT5zb3Vy
Y2VGcmFtZU51bWJlcigpKTsKICAgICAgICAgaWYgKCFtX251bURyYXdzKQotICAgICAgICAgICAg
aW1wbC0+c2V0TmVlZHNSZWRyYXcoKTsgLy8gcmVkcmF3IGFnYWluIHRvIHZlcmlmeSB0aGF0IHRo
ZSBzZWNvbmQgcmVkcmF3IGRvZXNudCBjb21taXQuCisgICAgICAgICAgICBwb3N0U2V0TmVlZHNS
ZWRyYXdUb01haW5UaHJlYWQoKTsgLy8gUmVkcmF3IGFnYWluIHRvIHZlcmlmeSB0aGF0IHRoZSBz
ZWNvbmQgcmVkcmF3IGRvZXNuJ3QgY29tbWl0LgogICAgICAgICBlbHNlCiAgICAgICAgICAgICBl
bmRUZXN0KCk7CiAgICAgICAgIG1fbnVtRHJhd3MrKzsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHZv
aWQgY29tbWl0T25DQ1RocmVhZChNb2NrTGF5ZXJUcmVlSG9zdCogbGF5ZXJUcmVlSG9zdCwgTW9j
a0xheWVyVHJlZUhvc3RJbXBsKiBpbXBsKQorICAgIHZpcnR1YWwgdm9pZCBjb21taXRDb21wbGV0
ZU9uQ0NUaHJlYWQoQ0NMYXllclRyZWVIb3N0SW1wbCopCiAgICAgewogICAgICAgICBtX251bUNv
bW1pdHMrKzsKICAgICB9Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>107664</attachid>
            <date>2011-09-16 09:30:38 -0700</date>
            <delta_ts>2011-09-16 13:01:29 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-67418-20110916173037.patch</filename>
            <type>text/plain</type>
            <size>29828</size>
            <attacher name="Iain Merrick">husky</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDk1Mjk0KQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMjggQEAKKzIwMTEtMDktMTYgIElhaW4gTWVy
cmljayAgPGh1c2t5QGdvb2dsZS5jb20+CisKKyAgICAgICAgW2Nocm9taXVtXSBGaXggQ0NMYXll
clRyZWVIb3N0VGVzdAorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5j
Z2k/aWQ9Njc0MTgKKworICAgICAgICBUaGlzIGlzIGEgbWluaW1hbCBzZXQgb2YgY2hhbmdlcyB0
byBnZXQgQ0NMYXllclRyZWVIb3N0VGVzdAorICAgICAgICBjb21waWxpbmcsIHJ1bm5pbmcgYW5k
IHBhc3Npbmcgd2l0aCBVU0VfVEhSRUFERURfQ09NUE9TSVRJTkcKKyAgICAgICAgZW5hYmxlZC4K
KworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICAqIHBsYXRm
b3JtL2dyYXBoaWNzL2Nocm9taXVtL0NvbnRlbnRMYXllckNocm9taXVtLmNwcDoKKyAgICAgICAg
KFdlYkNvcmU6OkNvbnRlbnRMYXllckNocm9taXVtOjpjcmVhdGVUZXh0dXJlVXBkYXRlcik6Cisg
ICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vTGF5ZXJSZW5kZXJlckNocm9taXVt
LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyUmVuZGVyZXJDaHJvbWl1bTo6TGF5ZXJSZW5k
ZXJlckNocm9taXVtKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9D
Q0xheWVyVHJlZUhvc3QuY3BwOgorICAgICAgICAoV2ViQ29yZTo6Q0NMYXllclRyZWVIb3N0Ojpj
cmVhdGVMYXllclRyZWVIb3N0SW1wbCk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2hy
b21pdW0vY2MvQ0NMYXllclRyZWVIb3N0Lmg6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mv
Y2hyb21pdW0vY2MvQ0NMYXllclRyZWVIb3N0SW1wbC5oOgorICAgICAgICAqIHBsYXRmb3JtL2dy
YXBoaWNzL2Nocm9taXVtL2NjL0NDVGhyZWFkUHJveHkuY3BwOgorICAgICAgICAoV2ViQ29yZTo6
Q0NUaHJlYWRQcm94eTo6Y29udGV4dCk6CisgICAgICAgIChXZWJDb3JlOjpDQ1RocmVhZFByb3h5
OjpiZWdpbkZyYW1lQW5kQ29tbWl0T25DQ1RocmVhZCk6CisgICAgICAgIChXZWJDb3JlOjpDQ1Ro
cmVhZFByb3h5OjpzZXROZWVkc0NvbW1pdEFuZFJlZHJhd09uQ0NUaHJlYWQpOgorICAgICAgICAo
V2ViQ29yZTo6Q0NUaHJlYWRQcm94eTo6c2V0TmVlZHNSZWRyYXdPbkNDVGhyZWFkKToKKwogMjAx
MS0wOS0xNiAgQ3NhYmEgT3N6dHJvZ29uw6FjICA8b3NzeUB3ZWJraXQub3JnPgogCiAgICAgICAg
IFVucmV2aWV3ZWQgdHlwbyBmaXggYWZ0ZXIgcjk1MjcxLgpJbmRleDogU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vQ29udGVudExheWVyQ2hyb21pdW0uY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0NvbnRl
bnRMYXllckNocm9taXVtLmNwcAkocmV2aXNpb24gOTUyOTQpCisrKyBTb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9Db250ZW50TGF5ZXJDaHJvbWl1bS5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTEyMCw2ICsxMjAsNyBAQCBib29sIENvbnRlbnRMYXllckNocm9taXVtOjpk
cmF3c0NvbnRlbnQoCiAKIHZvaWQgQ29udGVudExheWVyQ2hyb21pdW06OmNyZWF0ZVRleHR1cmVV
cGRhdGVyKGNvbnN0IENDTGF5ZXJUcmVlSG9zdCogaG9zdCkKIHsKKyNpZiAhVVNFKFRIUkVBREVE
X0NPTVBPU0lUSU5HKQogI2lmIFVTRShTS0lBKQogICAgIC8vIE5vdGUgdGhhdCBob3N0LT5za2lh
Q29udGV4dCgpIHdpbGwgY3Jhc2ggaWYgY2FsbGVkIHdoaWxlIGluIHRocmVhZGVkCiAgICAgLy8g
bW9kZS4gVGhpcyB0aHVzIGRlcGVuZHMgb24gQ0NMYXllclRyZWVIb3N0Ojppbml0aWFsaXplIHR1
cm5pbmcgb2ZmCkBAIC0xMjksNiArMTMwLDcgQEAgdm9pZCBDb250ZW50TGF5ZXJDaHJvbWl1bTo6
Y3JlYXRlVGV4dHVyZQogICAgICAgICByZXR1cm47CiAgICAgfQogI2VuZGlmIC8vIFNLSUEKKyNl
bmRpZiAvLyAhVEhSRUFERURfQ09NUE9TSVRJTkcKIAogICAgIG1fdGV4dHVyZVVwZGF0ZXIgPSBM
YXllclRleHR1cmVVcGRhdGVyQml0bWFwOjpjcmVhdGUoQ29udGVudExheWVyUGFpbnRlcjo6Y3Jl
YXRlKG1fZGVsZWdhdGUpLCBob3N0LT5sYXllclJlbmRlcmVyQ2FwYWJpbGl0aWVzKCkudXNpbmdN
YXBTdWIpOwogfQpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21p
dW0vTGF5ZXJSZW5kZXJlckNocm9taXVtLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9MYXllclJlbmRlcmVyQ2hyb21pdW0uY3BwCShy
ZXZpc2lvbiA5NTI5NCkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9t
aXVtL0xheWVyUmVuZGVyZXJDaHJvbWl1bS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTE0OCw2ICsx
NDgsNyBAQCBMYXllclJlbmRlcmVyQ2hyb21pdW06OkxheWVyUmVuZGVyZXJDaHJvCiAgICAgLCBt
X2N1cnJlbnRSZW5kZXJTdXJmYWNlKDApCiAgICAgLCBtX29mZnNjcmVlbkZyYW1lYnVmZmVySWQo
MCkKICAgICAsIG1fem9vbUFuaW1hdG9yU2NhbGUoMSkKKyAgICAsIG1fY29udGVudHNUZXh0dXJl
TWVtb3J5VXNlQnl0ZXMoMCkKICAgICAsIG1fY29udGV4dChjb250ZXh0KQogICAgICwgbV9kZWZh
dWx0UmVuZGVyU3VyZmFjZSgwKQogICAgICwgbV9zaGFyZWRHZW9tZXRyeVF1YWQoRmxvYXRSZWN0
KC0wLjVmLCAtMC41ZiwgMS4wZiwgMS4wZikpCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ0xheWVyVHJlZUhvc3QuaAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ0xheWVyVHJlZUhv
c3QuaAkocmV2aXNpb24gOTUyOTQpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9jaHJvbWl1bS9jYy9DQ0xheWVyVHJlZUhvc3QuaAkod29ya2luZyBjb3B5KQpAQCAtOTksNyAr
OTksNyBAQCBwdWJsaWM6CiAgICAgdm9pZCBjb21taXRUbyhDQ0xheWVyVHJlZUhvc3RJbXBsKik7
CiAgICAgUGFzc093blB0cjxDQ1RocmVhZD4gY3JlYXRlQ29tcG9zaXRvclRocmVhZCgpOwogICAg
IFBhc3NSZWZQdHI8R3JhcGhpY3NDb250ZXh0M0Q+IGNyZWF0ZUxheWVyVHJlZUhvc3RDb250ZXh0
M0QoKTsKLSAgICBQYXNzT3duUHRyPENDTGF5ZXJUcmVlSG9zdEltcGw+IGNyZWF0ZUxheWVyVHJl
ZUhvc3RJbXBsKCk7CisgICAgdmlydHVhbCBQYXNzT3duUHRyPENDTGF5ZXJUcmVlSG9zdEltcGw+
IGNyZWF0ZUxheWVyVHJlZUhvc3RJbXBsKCk7CiAgICAgdm9pZCBkaWRSZWNyZWF0ZUdyYXBoaWNz
Q29udGV4dChib29sIHN1Y2Nlc3MpOwogI2lmICFVU0UoVEhSRUFERURfQ09NUE9TSVRJTkcpCiAg
ICAgdm9pZCBzY2hlZHVsZUNvbXBvc2l0ZSgpOwpAQCAtMTU0LDYgKzE1NCw3IEBAIHB1YmxpYzoK
IAogcHJvdGVjdGVkOgogICAgIENDTGF5ZXJUcmVlSG9zdChDQ0xheWVyVHJlZUhvc3RDbGllbnQq
LCBQYXNzUmVmUHRyPExheWVyQ2hyb21pdW0+IHJvb3RMYXllciwgY29uc3QgQ0NTZXR0aW5ncyYp
OworICAgIGJvb2wgaW5pdGlhbGl6ZSgpOwogCiBwcml2YXRlOgogICAgIHR5cGVkZWYgVmVjdG9y
PFJlZlB0cjxMYXllckNocm9taXVtPiA+IExheWVyTGlzdDsKQEAgLTE2NCw4ICsxNjUsNiBAQCBw
cml2YXRlOgogICAgIHZvaWQgdXBkYXRlQ29tcG9zaXRvclJlc291cmNlcyhMYXllckNocm9taXVt
KiwgR3JhcGhpY3NDb250ZXh0M0QqKTsKICAgICB2b2lkIGNsZWFyUGVuZGluZ1VwZGF0ZSgpOwog
Ci0gICAgYm9vbCBpbml0aWFsaXplKCk7Ci0KICAgICBib29sIG1fYW5pbWF0aW5nOwogCiAgICAg
Q0NMYXllclRyZWVIb3N0Q2xpZW50KiBtX2NsaWVudDsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDTGF5ZXJUcmVlSG9zdEltcGwuaAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ0xh
eWVyVHJlZUhvc3RJbXBsLmgJKHJldmlzaW9uIDk1Mjk0KQorKysgU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NMYXllclRyZWVIb3N0SW1wbC5oCSh3b3JraW5n
IGNvcHkpCkBAIC00NiwxMyArNDYsMTMgQEAgcHVibGljOgogICAgIHN0YXRpYyBQYXNzT3duUHRy
PENDTGF5ZXJUcmVlSG9zdEltcGw+IGNyZWF0ZShjb25zdCBDQ1NldHRpbmdzJik7CiAgICAgdmly
dHVhbCB+Q0NMYXllclRyZWVIb3N0SW1wbCgpOwogCisgICAgLy8gVmlydHVhbCBmb3IgdGVzdGlu
ZwogICAgIHZpcnR1YWwgdm9pZCBiZWdpbkNvbW1pdCgpOwogICAgIHZpcnR1YWwgdm9pZCBjb21t
aXRDb21wbGV0ZSgpOworICAgIHZpcnR1YWwgdm9pZCBkcmF3TGF5ZXJzKCk7CiAKICAgICBHcmFw
aGljc0NvbnRleHQzRCogY29udGV4dCgpOwogCi0gICAgdm9pZCBkcmF3TGF5ZXJzKCk7Ci0KICAg
ICB2b2lkIGZpbmlzaEFsbFJlbmRlcmluZygpOwogICAgIGludCBmcmFtZU51bWJlcigpIGNvbnN0
IHsgcmV0dXJuIG1fZnJhbWVOdW1iZXI7IH0KIApJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NUaHJlYWRQcm94eS5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NUaHJlYWRQcm94
eS5jcHAJKHJldmlzaW9uIDk1Mjk0KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvY2hyb21pdW0vY2MvQ0NUaHJlYWRQcm94eS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTg0LDcg
Kzg0LDYgQEAgYm9vbCBDQ1RocmVhZFByb3h5Ojpjb21wb3NpdGVBbmRSZWFkYmFjawogCiBHcmFw
aGljc0NvbnRleHQzRCogQ0NUaHJlYWRQcm94eTo6Y29udGV4dCgpCiB7Ci0gICAgQVNTRVJUX05P
VF9SRUFDSEVEKCk7CiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTE4Niw4ICsxODUsOCBAQCB2b2lk
IENDVGhyZWFkUHJveHk6OmJlZ2luRnJhbWVBbmRDb21taXRPCiB7CiAgICAgVFJBQ0VfRVZFTlQo
IkNDVGhyZWFkUHJveHk6OmJlZ2luRnJhbWVBbmRDb21taXRPbkNDVGhyZWFkIiwgdGhpcywgMCk7
CiAgICAgQVNTRVJUKGlzSW1wbFRocmVhZCgpKTsKLSAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsK
LSAgICAvLyBGSVhNRTogY2FsbCBiZWdpbkZyYW1lQW5kQ29tbWl0IG9uIG1haW4gdGhyZWFkCisg
ICAgLy8gVEVNUCBIQUNLIHNvIHdlIGNhbiBleGVyY2lzZSB0aGlzIGNvZGUgaW4gdW5pdCB0ZXN0
cy4KKyAgICBDQ01haW5UaHJlYWQ6OnBvc3RUYXNrKGNyZWF0ZU1haW5UaHJlYWRUYXNrKHRoaXMs
ICZDQ1RocmVhZFByb3h5OjpiZWdpbkZyYW1lQW5kQ29tbWl0LCAwLjApKTsKIH0KIAogdm9pZCBD
Q1RocmVhZFByb3h5OjpiZWdpbkZyYW1lQW5kQ29tbWl0KGRvdWJsZSBmcmFtZUJlZ2luVGltZSkK
QEAgLTI0NywxMyArMjQ2LDE1IEBAIHZvaWQgQ0NUaHJlYWRQcm94eTo6c2V0TmVlZHNDb21taXRB
bmRSZWQKICAgICBUUkFDRV9FVkVOVCgiQ0NUaHJlYWRQcm94eTo6c2V0TmVlZHNDb21taXRBbmRS
ZWRyYXdPbkNDVGhyZWFkIiwgdGhpcywgMCk7CiAgICAgQVNTRVJUKGlzSW1wbFRocmVhZCgpKTsK
ICAgICBBU1NFUlQobV9sYXllclRyZWVIb3N0SW1wbCk7Ci0gICAgQVNTRVJUX05PVF9SRUFDSEVE
KCk7CisgICAgLy8gVEVNUCBIQUNLIHNvIHdlIGNhbiBleGVyY2lzZSB0aGlzIGNvZGUgaW4gdW5p
dCB0ZXN0cy4KKyAgICBDQ01haW5UaHJlYWQ6OnBvc3RUYXNrKGNyZWF0ZU1haW5UaHJlYWRUYXNr
KHRoaXMsICZDQ1RocmVhZFByb3h5OjpiZWdpbkZyYW1lQW5kQ29tbWl0LCAwLjApKTsKIH0KIAog
dm9pZCBDQ1RocmVhZFByb3h5OjpzZXROZWVkc1JlZHJhd09uQ0NUaHJlYWQoKQogewogICAgIFRS
QUNFX0VWRU5UKCJDQ1RocmVhZFByb3h5OjpzZXROZWVkc1JlZHJhd09uQ0NUaHJlYWQiLCB0aGlz
LCAwKTsKLSAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAvLyBURU1QIEhBQ0sgc28gd2Ug
Y2FuIGV4ZXJjaXNlIHRoaXMgY29kZSBpbiB1bml0IHRlc3RzLgorICAgIGRyYXdMYXllcnNPbkND
VGhyZWFkKCk7CiB9CiAKIHZvaWQgQ0NUaHJlYWRQcm94eTo6aW5pdGlhbGl6ZUltcGxPbkNDVGhy
ZWFkKENDQ29tcGxldGlvbkV2ZW50KiBjb21wbGV0aW9uKQpAQCAtMjg0LDQgKzI4NSw0IEBAIHZv
aWQgQ0NUaHJlYWRQcm94eTo6bGF5ZXJUcmVlSG9zdENsb3NlZE8KICAgICBjb21wbGV0aW9uLT5z
aWduYWwoKTsKIH0KIAotfQorfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogU291cmNlL1dl
YktpdC9jaHJvbWl1bS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdC9jaHJv
bWl1bS9DaGFuZ2VMb2cJKHJldmlzaW9uIDk1Mjk0KQorKysgU291cmNlL1dlYktpdC9jaHJvbWl1
bS9DaGFuZ2VMb2cJKHdvcmtpbmcgY29weSkKQEAgLTEsMyArMSw2MCBAQAorMjAxMS0wOS0xNiAg
SWFpbiBNZXJyaWNrICA8aHVza3lAZ29vZ2xlLmNvbT4KKworICAgICAgICBbY2hyb21pdW1dIEZp
eCBDQ0xheWVyVHJlZUhvc3RUZXN0CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3No
b3dfYnVnLmNnaT9pZD02NzQxOAorCisgICAgICAgIEZpeGVzIG5lZWRlZCB0byBjb21waWxlIGFu
ZCBsaW5rIHdpdGggVVNFX1RIUkVBREVEX0NPTVBPU0lUSU5HCisgICAgICAgIGVuYWJsZWQsIGFu
ZCB0byBwYXNzIHRoZSBiYXNpYyB1bml0IHRlc3QuCisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9C
T0RZIChPT1BTISkuCisKKyAgICAgICAgKiBzcmMvR3JhcGhpY3NDb250ZXh0M0RDaHJvbWl1bS5j
cHA6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRFByaXZhdGU6OkdyYXBoaWNz
Q29udGV4dDNEUHJpdmF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRFBy
aXZhdGU6OnBsYXRmb3JtTGF5ZXIpOgorICAgICAgICAqIHNyYy9HcmFwaGljc0NvbnRleHQzRFBy
aXZhdGUuaDoKKyAgICAgICAgKiB0ZXN0cy9DQ0xheWVyVHJlZUhvc3RUZXN0LmNwcDoKKyAgICAg
ICAgKFRlc3RIb29rczo6YmVnaW5Db21taXRPbkNDVGhyZWFkKToKKyAgICAgICAgKFRlc3RIb29r
czo6Y29tbWl0Q29tcGxldGVPbkNDVGhyZWFkKToKKyAgICAgICAgKFRlc3RIb29rczo6ZHJhd0xh
eWVyc09uQ0NUaHJlYWQpOgorICAgICAgICAoTW9ja0xheWVyVHJlZUhvc3RJbXBsOjpNb2NrTGF5
ZXJUcmVlSG9zdEltcGwpOgorICAgICAgICAoTW9ja0xheWVyVHJlZUhvc3RJbXBsOjpiZWdpbkNv
bW1pdCk6CisgICAgICAgIChNb2NrTGF5ZXJUcmVlSG9zdEltcGw6OmNvbW1pdENvbXBsZXRlKToK
KyAgICAgICAgKE1vY2tMYXllclRyZWVIb3N0SW1wbDo6ZHJhd0xheWVycyk6CisgICAgICAgIChN
b2NrTGF5ZXJUcmVlSG9zdDo6TW9ja0xheWVyVHJlZUhvc3QpOgorICAgICAgICAoTW9ja0xheWVy
VHJlZUhvc3Q6OmNyZWF0ZUxheWVyVHJlZUhvc3RJbXBsKToKKyAgICAgICAgKENvbXBvc2l0b3JN
b2NrV2ViR3JhcGhpY3NDb250ZXh0M0Q6Om1ha2VDb250ZXh0Q3VycmVudCk6CisgICAgICAgIChD
b21wb3NpdG9yTW9ja1dlYkdyYXBoaWNzQ29udGV4dDNEOjpjcmVhdGVQcm9ncmFtKToKKyAgICAg
ICAgKENvbXBvc2l0b3JNb2NrV2ViR3JhcGhpY3NDb250ZXh0M0Q6OmNyZWF0ZVNoYWRlcik6Cisg
ICAgICAgIChDb21wb3NpdG9yTW9ja1dlYkdyYXBoaWNzQ29udGV4dDNEOjpnZXRTaGFkZXJpdik6
CisgICAgICAgIChDb21wb3NpdG9yTW9ja1dlYkdyYXBoaWNzQ29udGV4dDNEOjpnZXRQcm9ncmFt
aXYpOgorICAgICAgICAoTW9ja0xheWVyVHJlZUhvc3RDbGllbnQ6Ok1vY2tMYXllclRyZWVIb3N0
Q2xpZW50KToKKyAgICAgICAgKE1vY2tMYXllclRyZWVIb3N0Q2xpZW50OjphbmltYXRlQW5kTGF5
b3V0KToKKyAgICAgICAgKE1vY2tMYXllclRyZWVIb3N0Q2xpZW50OjpjcmVhdGVDb21wb3NpdG9y
VGhyZWFkKToKKyAgICAgICAgKE1vY2tMYXllclRyZWVIb3N0Q2xpZW50OjpjcmVhdGVMYXllclRy
ZWVIb3N0Q29udGV4dDNEKToKKyAgICAgICAgKE1vY2tMYXllclRyZWVIb3N0Q2xpZW50OjpjcmVh
dGVSb290TGF5ZXJQYWludGVyKToKKyAgICAgICAgKE1vY2tMYXllclRyZWVIb3N0Q2xpZW50Ojpk
aWRSZWNyZWF0ZUdyYXBoaWNzQ29udGV4dCk6CisgICAgICAgIChDQ0xheWVyVHJlZUhvc3RUZXN0
Ojpwb3N0U2V0TmVlZHNDb21taXRUb01haW5UaHJlYWQpOgorICAgICAgICAoQ0NMYXllclRyZWVI
b3N0VGVzdDo6cG9zdFNldE5lZWRzUmVkcmF3VG9NYWluVGhyZWFkKToKKyAgICAgICAgKENDTGF5
ZXJUcmVlSG9zdFRlc3Q6Om9uRW5kVGVzdCk6CisgICAgICAgIChDQ0xheWVyVHJlZUhvc3RUZXN0
OjpkaXNwYXRjaFNldE5lZWRzQ29tbWl0KToKKyAgICAgICAgKENDTGF5ZXJUcmVlSG9zdFRlc3Q6
OmRpc3BhdGNoU2V0TmVlZHNSZWRyYXcpOgorICAgICAgICAoQ0NMYXllclRyZWVIb3N0VGVzdDo6
cnVuVGVzdCk6CisgICAgICAgIChDQ0xheWVyVHJlZUhvc3RUZXN0Ojpkb0JlZ2luVGVzdCk6Cisg
ICAgICAgIChDQ0xheWVyVHJlZUhvc3RUZXN0U2hvcnRsaXZlZDI6OmJlZ2luVGVzdCk6CisgICAg
ICAgIChDQ0xheWVyVHJlZUhvc3RUZXN0U2hvcnRsaXZlZDM6OmJlZ2luVGVzdCk6CisgICAgICAg
IChDQ0xheWVyVHJlZUhvc3RUZXN0Q29tbWl0aW5nV2l0aENvbnRpbnVvdXNSZWRyYXc6OmJlZ2lu
VGVzdCk6CisgICAgICAgIChDQ0xheWVyVHJlZUhvc3RUZXN0Q29tbWl0aW5nV2l0aENvbnRpbnVv
dXNSZWRyYXc6OmNvbW1pdENvbXBsZXRlT25DQ1RocmVhZCk6CisgICAgICAgIChDQ0xheWVyVHJl
ZUhvc3RUZXN0Q29tbWl0aW5nV2l0aENvbnRpbnVvdXNSZWRyYXc6OmRyYXdMYXllcnNPbkNDVGhy
ZWFkKToKKyAgICAgICAgKENDTGF5ZXJUcmVlSG9zdFRlc3RTZXROZWVkc0NvbW1pdDE6OmJlZ2lu
VGVzdCk6CisgICAgICAgIChDQ0xheWVyVHJlZUhvc3RUZXN0U2V0TmVlZHNDb21taXQxOjpkcmF3
TGF5ZXJzT25DQ1RocmVhZCk6CisgICAgICAgIChDQ0xheWVyVHJlZUhvc3RUZXN0U2V0TmVlZHND
b21taXQxOjpjb21taXRDb21wbGV0ZU9uQ0NUaHJlYWQpOgorICAgICAgICAoQ0NMYXllclRyZWVI
b3N0VGVzdFNldE5lZWRzQ29tbWl0Mjo6YmVnaW5UZXN0KToKKyAgICAgICAgKENDTGF5ZXJUcmVl
SG9zdFRlc3RTZXROZWVkc0NvbW1pdDI6OmRyYXdMYXllcnNPbkNDVGhyZWFkKToKKyAgICAgICAg
KENDTGF5ZXJUcmVlSG9zdFRlc3RTZXROZWVkc0NvbW1pdDI6OmNvbW1pdENvbXBsZXRlT25DQ1Ro
cmVhZCk6CisgICAgICAgIChDQ0xheWVyVHJlZUhvc3RUZXN0U2V0TmVlZHNSZWRyYXc6OmJlZ2lu
VGVzdCk6CisgICAgICAgIChDQ0xheWVyVHJlZUhvc3RUZXN0U2V0TmVlZHNSZWRyYXc6OmRyYXdM
YXllcnNPbkNDVGhyZWFkKToKKyAgICAgICAgKENDTGF5ZXJUcmVlSG9zdFRlc3RTZXROZWVkc1Jl
ZHJhdzo6Y29tbWl0Q29tcGxldGVPbkNDVGhyZWFkKToKKwogMjAxMS0wOS0xNiAgQW5kcmV5IEtv
c3lha292ICA8Y2FzZXFAY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFdlYiBJbnNwZWN0b3I6IFtF
eHRlbnNpb25zIEFQSV0gc3VwcG9ydCBleHRlbnNpb25zIGZvciByZW1vdGUgaW5zcGVjdG9yIGZy
b250LWVuZApJbmRleDogU291cmNlL1dlYktpdC9jaHJvbWl1bS90ZXN0cy9DQ0xheWVyVHJlZUhv
c3RUZXN0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0L2Nocm9taXVtL3Rlc3RzL0ND
TGF5ZXJUcmVlSG9zdFRlc3QuY3BwCShyZXZpc2lvbiA5NTI5NCkKKysrIFNvdXJjZS9XZWJLaXQv
Y2hyb21pdW0vdGVzdHMvQ0NMYXllclRyZWVIb3N0VGVzdC5jcHAJKHdvcmtpbmcgY29weSkKQEAg
LTI4LDcgKzI4LDEyIEBACiAKICNpbmNsdWRlICJjYy9DQ0xheWVyVHJlZUhvc3QuaCIKIAotI2lu
Y2x1ZGUgIkdyYXBoaWNzQ29udGV4dDNELmgiCisjaW5jbHVkZSAiQ0NUaHJlYWRJbXBsLmgiCisj
aW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0M0RQcml2YXRlLmgiCisjaW5jbHVkZSAiTGF5ZXJDaHJv
bWl1bS5oIgorI2luY2x1ZGUgIkxheWVyUGFpbnRlckNocm9taXVtLmgiCisjaW5jbHVkZSAiTW9j
a1dlYkdyYXBoaWNzQ29udGV4dDNELmgiCisjaW5jbHVkZSAiVGV4dHVyZU1hbmFnZXIuaCIKICNp
bmNsdWRlICJjYy9DQ0xheWVyVHJlZUhvc3RJbXBsLmgiCiAjaW5jbHVkZSAiY2MvQ0NNYWluVGhy
ZWFkVGFzay5oIgogI2luY2x1ZGUgImNjL0NDVGhyZWFkVGFzay5oIgpAQCAtMzgsMjQ3ICs0Mywy
NjQgQEAKICNpbmNsdWRlIDx3dGYvUGFzc1JlZlB0ci5oPgogI2luY2x1ZGUgPHd0Zi9WZWN0b3Iu
aD4KIAotCiB1c2luZyBuYW1lc3BhY2UgV2ViQ29yZTsKK3VzaW5nIG5hbWVzcGFjZSBXZWJLaXQ7
CiB1c2luZyBuYW1lc3BhY2UgV1RGOwogCiBuYW1lc3BhY2UgewogCi1jbGFzcyBNb2NrTGF5ZXJU
cmVlSG9zdDsKLWNsYXNzIE1vY2tMYXllclRyZWVIb3N0Q2xpZW50OwotY2xhc3MgTW9ja0xheWVy
VHJlZUhvc3RJbXBsOwotCi0vLyBUaGUgQ0NMYXllclRyZWVIb3N0VGVzdCBydW5zIHdpdGggdGhl
IG1haW4gbG9vcCBydW5uaW5nLiBJdCBpbnN0YW50aWF0ZXMgYSBzaW5nbGUgTW9ja0xheWVyVHJl
ZUhvc3QgYW5kIGFzc29jaWF0ZWQKLS8vIE1vY2tMYXllclRyZWVIb3N0SW1wbC9Nb2NrTGF5ZXJU
cmVlSG9zdENsaWVudC4KLS8vCi0vLyBiZWdpblRlc3QoKSBpcyBjYWxsZWQgb25jZSB0aGUgbWFp
biBtZXNzYWdlIGxvb3AgaXMgcnVubmluZyBhbmQgdGhlIGxheWVyIHRyZWUgaG9zdCBpcyBpbml0
aWFsaXplZC4KLS8vCi0vLyBLZXkgc3RhZ2VzIG9mIHRoZSBkcmF3aW5nIGxvb3AsIGUuZy4gZHJh
d2luZyBvciBjb21taXRpbmcsIHJlZGlyZWN0IHRvIENDTGF5ZXJUcmVlSG9zdFRlc3QgbWV0aG9k
cyBvZiBzaW1pbGFyIG5hbWVzLgotLy8gVG8gdHJhY2sgdGhlIGNvbW1pdCBwcm9jZXNzLCBvdmVy
cmlkZSB0aGVzZSBmdW5jdGlvbnMuCi0vLwotLy8gVGhlIHRlc3QgY29udGludWVzIHVudGlsIHNv
bWVvbmUgY2FsbHMgZW5kVGVzdC4gZW5kVGVzdCBjYW4gYmUgY2FsbGVkIG9uIGFueSB0aHJlYWQs
IGJ1dCBiZSBhd2FyZSB0aGF0Ci0vLyBlbmRpbmcgdGhlIHRlc3QgaXMgYW4gYXN5bmNocm9ub3Vz
IHByb2Nlc3MuCi1jbGFzcyBDQ0xheWVyVHJlZUhvc3RUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRl
c3QgeworLy8gVXNlZCBieSB0ZXN0IHN0dWJzIHRvIG5vdGlmeSB0aGUgdGVzdCB3aGVuIHNvbWV0
aGluZyBpbnRlcmVzdGluZyBoYXBwZW5zLgorY2xhc3MgVGVzdEhvb2tzIHsKIHB1YmxpYzoKLSAg
ICBDQ0xheWVyVHJlZUhvc3RUZXN0KCkKLSAgICAgICAgOiBtX2JlZ2lubmluZyhmYWxzZSkKLSAg
ICAgICAgLCBtX2VuZFdoZW5CZWdpblJldHVybnMoZmFsc2UpCi0gICAgICAgICwgbV9ydW5uaW5n
KGZhbHNlKQotICAgICAgICAsIG1fdGltZWRPdXQoZmFsc2UpIHsgfQotCi0gICAgdmlydHVhbCB2
b2lkIGFmdGVyVGVzdCgpID0gMDsKLQotICAgIHZpcnR1YWwgdm9pZCBiZWdpblRlc3QoKSA9IDA7
Ci0gICAgdmlydHVhbCB2b2lkIGFuaW1hdGVBbmRMYXlvdXQoTW9ja0xheWVyVHJlZUhvc3RDbGll
bnQqIGxheWVyVHJlZUhvc3QsIGRvdWJsZSBmcmFtZUJlZ2luVGltZSkgeyB9Ci0gICAgdmlydHVh
bCB2b2lkIGJlZ2luQ29tbWl0T25DQ1RocmVhZChNb2NrTGF5ZXJUcmVlSG9zdEltcGwqIGxheWVy
VHJlZUhvc3RJbXBsKSB7IH0KLSAgICB2aXJ0dWFsIHZvaWQgYmVnaW5Db21taXRPbk1haW5UaHJl
YWQoTW9ja0xheWVyVHJlZUhvc3QqIGxheWVyVHJlZUhvc3QpIHsgfQotICAgIHZpcnR1YWwgdm9p
ZCBjb21taXRPbkNDVGhyZWFkKE1vY2tMYXllclRyZWVIb3N0KiBsYXllclRyZWVIb3N0LCBNb2Nr
TGF5ZXJUcmVlSG9zdEltcGwqIGxheWVyVHJlZUhvc3RJbXBsKSB7IH0KLSAgICB2aXJ0dWFsIHZv
aWQgY29tbWl0Q29tcGxldGVPbkNDVGhyZWFkKE1vY2tMYXllclRyZWVIb3N0SW1wbCogbGF5ZXJU
cmVlSG9zdEltcGwpIHsgfQotICAgIHZpcnR1YWwgdm9pZCBjb21taXRDb21wbGV0ZU9uTWFpblRo
cmVhZChNb2NrTGF5ZXJUcmVlSG9zdCogbGF5ZXJUcmVlSG9zdCkgeyB9Ci0gICAgdmlydHVhbCB2
b2lkIGRyYXdMYXllcnNBbmRQcmVzZW50T25DQ1RocmVhZChNb2NrTGF5ZXJUcmVlSG9zdEltcGwq
IGxheWVyVHJlZUhvc3RJbXBsKSB7IH0KLSAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlTGF5ZXJzKE1v
Y2tMYXllclRyZWVIb3N0KiBsYXllclRyZWVIb3N0KSB7IH0KLQotICAgIHZvaWQgZW5kVGVzdCgp
OwotCi1wcm90ZWN0ZWQ6Ci0gICAgdm9pZCBkb0JlZ2luVGVzdCgpOworICAgIHZpcnR1YWwgdm9p
ZCBiZWdpbkNvbW1pdE9uQ0NUaHJlYWQoQ0NMYXllclRyZWVIb3N0SW1wbCopIHsgfQorICAgIHZp
cnR1YWwgdm9pZCBjb21taXRDb21wbGV0ZU9uQ0NUaHJlYWQoQ0NMYXllclRyZWVIb3N0SW1wbCop
IHsgfQorICAgIHZpcnR1YWwgdm9pZCBkcmF3TGF5ZXJzT25DQ1RocmVhZChDQ0xheWVyVHJlZUhv
c3RJbXBsKikgeyB9Cit9OwogCi0gICAgc3RhdGljIHZvaWQgb25CZWdpblRlc3Qodm9pZCogc2Vs
ZikKKy8vIEFkYXB0cyBDQ0xheWVyVHJlZUhvc3RJbXBsIGZvciB0ZXN0LiBSdW5zIHJlYWwgY29k
ZSwgdGhlbiBpbnZva2VzIHRlc3QgaG9va3MuCitjbGFzcyBNb2NrTGF5ZXJUcmVlSG9zdEltcGwg
OiBwdWJsaWMgQ0NMYXllclRyZWVIb3N0SW1wbCB7CitwdWJsaWM6CisgICAgc3RhdGljIFBhc3NP
d25QdHI8TW9ja0xheWVyVHJlZUhvc3RJbXBsPiBjcmVhdGUoVGVzdEhvb2tzKiB0ZXN0SG9va3Ms
IGNvbnN0IENDU2V0dGluZ3MmIHNldHRpbmdzKQogICAgIHsKLSAgICAgICAgc3RhdGljX2Nhc3Q8
Q0NMYXllclRyZWVIb3N0VGVzdCo+KHNlbGYpLT5kb0JlZ2luVGVzdCgpOworICAgICAgICByZXR1
cm4gYWRvcHRQdHIobmV3IE1vY2tMYXllclRyZWVIb3N0SW1wbCh0ZXN0SG9va3MsIHNldHRpbmdz
KSk7CiAgICAgfQogCi0gICAgdm9pZCBkb0VuZFRlc3QoKQorICAgIHZpcnR1YWwgdm9pZCBiZWdp
bkNvbW1pdCgpCiAgICAgeworICAgICAgICBDQ0xheWVyVHJlZUhvc3RJbXBsOjpiZWdpbkNvbW1p
dCgpOworICAgICAgICBtX3Rlc3RIb29rcy0+YmVnaW5Db21taXRPbkNDVGhyZWFkKHRoaXMpOwog
ICAgIH0KIAotICAgIHN0YXRpYyB2b2lkIG9uRW5kVGVzdCh2b2lkKiBzZWxmKQorICAgIHZpcnR1
YWwgdm9pZCBjb21taXRDb21wbGV0ZSgpCiAgICAgewotICAgICAgICBBU1NFUlQoaXNNYWluVGhy
ZWFkKCkpOwotICAgICAgICBDQ0xheWVyVHJlZUhvc3RUZXN0KiB0ZXN0ID0gc3RhdGljX2Nhc3Q8
Q0NMYXllclRyZWVIb3N0VGVzdCo+KHNlbGYpOwotICAgICAgICB0ZXN0LT5tX2xheWVyVHJlZUhv
c3QuY2xlYXIoKTsKLSAgICAgICAgdGVzdC0+bV9jbGllbnQuY2xlYXIoKTsKLSAgICAgICAgd2Vi
a2l0X3N1cHBvcnQ6OlF1aXRNZXNzYWdlTG9vcCgpOworICAgICAgICBDQ0xheWVyVHJlZUhvc3RJ
bXBsOjpjb21taXRDb21wbGV0ZSgpOworICAgICAgICBtX3Rlc3RIb29rcy0+Y29tbWl0Q29tcGxl
dGVPbkNDVGhyZWFkKHRoaXMpOwogICAgIH0KIAotICAgIHZvaWQgcnVuVGVzdCgpCisgICAgdmly
dHVhbCB2b2lkIGRyYXdMYXllcnMoKQogICAgIHsKLSAgICAgICAgd2Via2l0X3N1cHBvcnQ6OlBv
c3REZWxheWVkVGFzayhDQ0xheWVyVHJlZUhvc3RUZXN0OjpvbkJlZ2luVGVzdCwgc3RhdGljX2Nh
c3Q8dm9pZCo+KHRoaXMpLCAwKTsKLSAgICAgICAgd2Via2l0X3N1cHBvcnQ6OlBvc3REZWxheWVk
VGFzayhDQ0xheWVyVHJlZUhvc3RUZXN0Ojp0ZXN0VGltZW91dCwgc3RhdGljX2Nhc3Q8dm9pZCo+
KHRoaXMpLCA1MDAwKTsKLSAgICAgICAgd2Via2l0X3N1cHBvcnQ6OlJ1bk1lc3NhZ2VMb29wKCk7
Ci0gICAgICAgIG1fcnVubmluZyA9IGZhbHNlOwotICAgICAgICBib29sIHRpbWVkT3V0ID0gbV90
aW1lZE91dDsgLy8gU2F2ZSB3aGV0aGVyIHdlJ3JlIHRpbWVkIG91dCBpbiBjYXNlIFJ1bkFsbFBl
bmRpbmdNZXNzYWdlcyBoYXMgdGhlIHRpbWVvdXQuCi0gICAgICAgIHdlYmtpdF9zdXBwb3J0OjpS
dW5BbGxQZW5kaW5nTWVzc2FnZXMoKTsKLSAgICAgICAgaWYgKHRpbWVkT3V0KSB7Ci0gICAgICAg
ICAgICBwcmludGYoIlRlc3QgdGltZWQgb3V0Iik7Ci0gICAgICAgICAgICBGQUlMKCkgPDwgIlRl
c3QgdGltZWQgb3V0IjsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBh
ZnRlclRlc3QoKTsKKyAgICAgICAgQ0NMYXllclRyZWVIb3N0SW1wbDo6ZHJhd0xheWVycygpOwor
ICAgICAgICBtX3Rlc3RIb29rcy0+ZHJhd0xheWVyc09uQ0NUaHJlYWQodGhpcyk7CiAgICAgfQog
Ci0gICAgc3RhdGljIHZvaWQgdGVzdFRpbWVvdXQodm9pZCogc2VsZikKK3ByaXZhdGU6CisgICAg
TW9ja0xheWVyVHJlZUhvc3RJbXBsKFRlc3RIb29rcyogdGVzdEhvb2tzLCBjb25zdCBDQ1NldHRp
bmdzJiBzZXR0aW5ncykKKyAgICAgICAgOiBDQ0xheWVyVHJlZUhvc3RJbXBsKHNldHRpbmdzKQor
ICAgICAgICAsIG1fdGVzdEhvb2tzKHRlc3RIb29rcykKICAgICB7Ci0gICAgICAgIENDTGF5ZXJU
cmVlSG9zdFRlc3QqIHRlc3QgPSBzdGF0aWNfY2FzdDxDQ0xheWVyVHJlZUhvc3RUZXN0Kj4oc2Vs
Zik7Ci0gICAgICAgIGlmICghdGVzdC0+bV9ydW5uaW5nKQotICAgICAgICAgICAgcmV0dXJuOwot
ICAgICAgICB0ZXN0LT5tX3RpbWVkT3V0ID0gdHJ1ZTsKLSAgICAgICAgdGVzdC0+ZW5kVGVzdCgp
OwogICAgIH0KIAotICAgIE11dGV4IG1fdHJhY2VzTG9jazsKLSAgICBWZWN0b3I8c3RkOjpzdHJp
bmc+IG1fdHJhY2VzOwotCi0gICAgT3duUHRyPE1vY2tMYXllclRyZWVIb3N0Q2xpZW50PiBtX2Ns
aWVudDsKLSAgICBSZWZQdHI8TW9ja0xheWVyVHJlZUhvc3Q+IG1fbGF5ZXJUcmVlSG9zdDsKLQot
cHJpdmF0ZToKLSAgICBib29sIG1fYmVnaW5uaW5nOwotICAgIGJvb2wgbV9lbmRXaGVuQmVnaW5S
ZXR1cm5zOwotICAgIGJvb2wgbV9ydW5uaW5nOwotICAgIGJvb2wgbV90aW1lZE91dDsKKyAgICBU
ZXN0SG9va3MqIG1fdGVzdEhvb2tzOwogfTsKIAotY2xhc3MgTW9ja0xheWVyVHJlZUhvc3RDbGll
bnQgOiBwdWJsaWMgQ0NMYXllclRyZWVIb3N0Q2xpZW50IHsKKy8vIEFkYXB0cyBDQ0xheWVyVHJl
ZUhvc3QgZm9yIHRlc3QuIEluamVjdHMgTW9ja0xheWVyVHJlZUhvc3RJbXBsLgorY2xhc3MgTW9j
a0xheWVyVHJlZUhvc3QgOiBwdWJsaWMgQ0NMYXllclRyZWVIb3N0IHsKIHB1YmxpYzoKLSAgICBN
b2NrTGF5ZXJUcmVlSG9zdENsaWVudChDQ0xheWVyVHJlZUhvc3RUZXN0KiB0ZXN0KSA6IG1fdGVz
dCh0ZXN0KSB7IH0KLQotICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxHcmFwaGljc0NvbnRleHQzRD4g
Y3JlYXRlTGF5ZXJUcmVlSG9zdENvbnRleHQzRCgpCisgICAgc3RhdGljIFBhc3NSZWZQdHI8TW9j
a0xheWVyVHJlZUhvc3Q+IGNyZWF0ZShUZXN0SG9va3MqIHRlc3RIb29rcywgQ0NMYXllclRyZWVI
b3N0Q2xpZW50KiBjbGllbnQsIFBhc3NSZWZQdHI8TGF5ZXJDaHJvbWl1bT4gcm9vdExheWVyLCBj
b25zdCBDQ1NldHRpbmdzJiBzZXR0aW5ncykKICAgICB7Ci0gICAgICAgIHJldHVybiBhZG9wdFJl
ZjxHcmFwaGljc0NvbnRleHQzRD4oMCk7CisgICAgICAgIHJldHVybiBhZG9wdFJlZihuZXcgTW9j
a0xheWVyVHJlZUhvc3QodGVzdEhvb2tzLCBjbGllbnQsIHJvb3RMYXllciwgc2V0dGluZ3MpKTsK
ICAgICB9CiAKLSAgICB2aXJ0dWFsIHZvaWQgYW5pbWF0ZUFuZExheW91dChkb3VibGUgZnJhbWVC
ZWdpblRpbWUpCisgICAgdmlydHVhbCBQYXNzT3duUHRyPENDTGF5ZXJUcmVlSG9zdEltcGw+IGNy
ZWF0ZUxheWVyVHJlZUhvc3RJbXBsKCkKICAgICB7Ci0gICAgICAgIG1fdGVzdC0+YW5pbWF0ZUFu
ZExheW91dCh0aGlzLCBmcmFtZUJlZ2luVGltZSk7CisgICAgICAgIHJldHVybiBNb2NrTGF5ZXJU
cmVlSG9zdEltcGw6OmNyZWF0ZShtX3Rlc3RIb29rcywgc2V0dGluZ3MoKSk7CiAgICAgfQogCi0g
ICAgdmlydHVhbCB2b2lkIHVwZGF0ZUxheWVycygpCitwcml2YXRlOgorICAgIE1vY2tMYXllclRy
ZWVIb3N0KFRlc3RIb29rcyogdGVzdEhvb2tzLCBDQ0xheWVyVHJlZUhvc3RDbGllbnQqIGNsaWVu
dCwgUGFzc1JlZlB0cjxMYXllckNocm9taXVtPiByb290TGF5ZXIsIGNvbnN0IENDU2V0dGluZ3Mm
IHNldHRpbmdzKQorICAgICAgICA6IENDTGF5ZXJUcmVlSG9zdChjbGllbnQsIHJvb3RMYXllciwg
c2V0dGluZ3MpCisgICAgICAgICwgbV90ZXN0SG9va3ModGVzdEhvb2tzKQogICAgIHsKKyAgICAg
ICAgYm9vbCBzdWNjZXNzID0gaW5pdGlhbGl6ZSgpOworICAgICAgICBBU1NFUlQoc3VjY2Vzcyk7
CiAgICAgfQogCi1wcml2YXRlOgotICAgIENDTGF5ZXJUcmVlSG9zdFRlc3QqIG1fdGVzdDsKKyAg
ICBUZXN0SG9va3MqIG1fdGVzdEhvb2tzOwogfTsKIAotY2xhc3MgTW9ja0xheWVyVHJlZUhvc3RD
b21taXR0ZXIgOiBwdWJsaWMgQ0NMYXllclRyZWVIb3N0Q29tbWl0dGVyIHsKKy8vIFRlc3Qgc3R1
YiBmb3IgV2ViR3JhcGhpY3NDb250ZXh0M0QuIFJldHVybnMgY2FubmVkIHZhbHVlcyBuZWVkZWQg
Zm9yIGNvbXBvc2l0b3IgaW5pdGlhbGl6YXRpb24uCitjbGFzcyBDb21wb3NpdG9yTW9ja1dlYkdy
YXBoaWNzQ29udGV4dDNEIDogcHVibGljIE1vY2tXZWJHcmFwaGljc0NvbnRleHQzRCB7CiBwdWJs
aWM6Ci0gICAgc3RhdGljIFBhc3NPd25QdHI8TW9ja0xheWVyVHJlZUhvc3RDb21taXR0ZXI+IGNy
ZWF0ZShDQ0xheWVyVHJlZUhvc3RUZXN0KiB0ZXN0KQorICAgIHN0YXRpYyBQYXNzT3duUHRyPENv
bXBvc2l0b3JNb2NrV2ViR3JhcGhpY3NDb250ZXh0M0Q+IGNyZWF0ZSgpCiAgICAgewotICAgICAg
ICByZXR1cm4gYWRvcHRQdHIobmV3IE1vY2tMYXllclRyZWVIb3N0Q29tbWl0dGVyKHRlc3QpKTsK
KyAgICAgICAgcmV0dXJuIGFkb3B0UHRyKG5ldyBDb21wb3NpdG9yTW9ja1dlYkdyYXBoaWNzQ29u
dGV4dDNEKCkpOwogICAgIH0KIAotICAgIHZpcnR1YWwgdm9pZCBjb21taXQoQ0NMYXllclRyZWVI
b3N0KiBob3N0LCBDQ0xheWVyVHJlZUhvc3RJbXBsKiBob3N0SW1wbCkKLSAgICB7Ci0gICAgICAg
IENDTGF5ZXJUcmVlSG9zdENvbW1pdHRlcjo6Y29tbWl0KGhvc3QsIGhvc3RJbXBsKTsKLSAgICAg
ICAgbV90ZXN0LT5jb21taXRPbkNDVGhyZWFkKHJlaW50ZXJwcmV0X2Nhc3Q8TW9ja0xheWVyVHJl
ZUhvc3QqPihob3N0KSwgcmVpbnRlcnByZXRfY2FzdDxNb2NrTGF5ZXJUcmVlSG9zdEltcGwqPiho
b3N0SW1wbCkpOwotICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgbWFrZUNvbnRleHRDdXJyZW50KCkg
eyByZXR1cm4gdHJ1ZTsgfQorICAgIHZpcnR1YWwgV2ViR0xJZCBjcmVhdGVQcm9ncmFtKCkgeyBy
ZXR1cm4gMTsgfQorICAgIHZpcnR1YWwgV2ViR0xJZCBjcmVhdGVTaGFkZXIoV0dDM0RlbnVtKSB7
IHJldHVybiAxOyB9CisgICAgdmlydHVhbCB2b2lkIGdldFNoYWRlcml2KFdlYkdMSWQsIFdHQzNE
ZW51bSwgV0dDM0RpbnQqIHZhbHVlKSB7ICp2YWx1ZSA9IDE7IH0KKyAgICB2aXJ0dWFsIHZvaWQg
Z2V0UHJvZ3JhbWl2KFdlYkdMSWQsIFdHQzNEZW51bSwgV0dDM0RpbnQqIHZhbHVlKSB7ICp2YWx1
ZSA9IDE7IH0KIAogcHJpdmF0ZToKLSAgICBNb2NrTGF5ZXJUcmVlSG9zdENvbW1pdHRlcihDQ0xh
eWVyVHJlZUhvc3RUZXN0KiB0ZXN0KSA6IG1fdGVzdCh0ZXN0KSB7IH0KLSAgICBDQ0xheWVyVHJl
ZUhvc3RUZXN0KiBtX3Rlc3Q7CisgICAgQ29tcG9zaXRvck1vY2tXZWJHcmFwaGljc0NvbnRleHQz
RCgpIHsgfQogfTsKIAotY2xhc3MgTW9ja0xheWVyVHJlZUhvc3RJbXBsIDogcHVibGljIENDTGF5
ZXJUcmVlSG9zdEltcGwgeworLy8gSW1wbGVtZW50YXRpb24gb2YgQ0NMYXllclRyZWVIb3N0IGNh
bGxiYWNrIGludGVyZmFjZS4KK2NsYXNzIE1vY2tMYXllclRyZWVIb3N0Q2xpZW50IDogcHVibGlj
IENDTGF5ZXJUcmVlSG9zdENsaWVudCB7CiBwdWJsaWM6Ci0gICAgc3RhdGljIFBhc3NPd25QdHI8
TW9ja0xheWVyVHJlZUhvc3RJbXBsPiBjcmVhdGUoQ0NMYXllclRyZWVIb3N0SW1wbENsaWVudCog
Y2xpZW50LCBDQ0xheWVyVHJlZUhvc3RUZXN0KiB0ZXN0KQorICAgIHN0YXRpYyBQYXNzT3duUHRy
PE1vY2tMYXllclRyZWVIb3N0Q2xpZW50PiBjcmVhdGUoVGVzdEhvb2tzKiB0ZXN0SG9va3MpCiAg
ICAgewotICAgICAgICByZXR1cm4gYWRvcHRQdHIobmV3IE1vY2tMYXllclRyZWVIb3N0SW1wbChj
bGllbnQsIHRlc3QpKTsKKyAgICAgICAgcmV0dXJuIGFkb3B0UHRyKG5ldyBNb2NrTGF5ZXJUcmVl
SG9zdENsaWVudCh0ZXN0SG9va3MpKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHZvaWQgYmVnaW5D
b21taXQoKQorICAgIHZpcnR1YWwgdm9pZCBhbmltYXRlQW5kTGF5b3V0KGRvdWJsZSBmcmFtZUJl
Z2luVGltZSkKICAgICB7Ci0gICAgICAgIENDTGF5ZXJUcmVlSG9zdEltcGw6OmJlZ2luQ29tbWl0
KCk7Ci0gICAgICAgIG1fdGVzdC0+YmVnaW5Db21taXRPbkNDVGhyZWFkKHRoaXMpOwogICAgIH0K
IAotICAgIHZpcnR1YWwgdm9pZCBjb21taXRDb21wbGV0ZSgpCisgICAgdmlydHVhbCBQYXNzT3du
UHRyPENDVGhyZWFkPiBjcmVhdGVDb21wb3NpdG9yVGhyZWFkKCkKICAgICB7Ci0gICAgICAgIEND
TGF5ZXJUcmVlSG9zdEltcGw6OmNvbW1pdENvbXBsZXRlKCk7Ci0gICAgICAgIG1fdGVzdC0+Y29t
bWl0Q29tcGxldGVPbkNDVGhyZWFkKHRoaXMpOworICAgICAgICByZXR1cm4gQ0NUaHJlYWRJbXBs
OjpjcmVhdGUoKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHZvaWQgZHJhd0xheWVyc0FuZFByZXNl
bnQoKQorICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxHcmFwaGljc0NvbnRleHQzRD4gY3JlYXRlTGF5
ZXJUcmVlSG9zdENvbnRleHQzRCgpCiAgICAgewotICAgICAgICBtX3Rlc3QtPmRyYXdMYXllcnNB
bmRQcmVzZW50T25DQ1RocmVhZCh0aGlzKTsKKyAgICAgICAgT3duUHRyPFdlYkdyYXBoaWNzQ29u
dGV4dDNEPiBtb2NrID0gQ29tcG9zaXRvck1vY2tXZWJHcmFwaGljc0NvbnRleHQzRDo6Y3JlYXRl
KCk7CisgICAgICAgIEdyYXBoaWNzQ29udGV4dDNEOjpBdHRyaWJ1dGVzIGF0dHJzOworICAgICAg
ICBSZWZQdHI8R3JhcGhpY3NDb250ZXh0M0Q+IGNvbnRleHQgPSBHcmFwaGljc0NvbnRleHQzRFBy
aXZhdGU6OmNyZWF0ZUdyYXBoaWNzQ29udGV4dEZyb21XZWJDb250ZXh0KG1vY2sucmVsZWFzZSgp
LCBhdHRycywgMCwgR3JhcGhpY3NDb250ZXh0M0Q6OlJlbmRlckRpcmVjdGx5VG9Ib3N0V2luZG93
LCBHcmFwaGljc0NvbnRleHQzRFByaXZhdGU6OkZvclVzZU9uQW5vdGhlclRocmVhZCk7CisgICAg
ICAgIHJldHVybiBjb250ZXh0OwogICAgIH0KIAotcHJpdmF0ZToKLSAgICBNb2NrTGF5ZXJUcmVl
SG9zdEltcGwoQ0NMYXllclRyZWVIb3N0SW1wbENsaWVudCogY2xpZW50LCBDQ0xheWVyVHJlZUhv
c3RUZXN0KiB0ZXN0KQotICAgICAgICAgICAgOiBDQ0xheWVyVHJlZUhvc3RJbXBsKGNsaWVudCkK
LSAgICAgICAgICAgICwgbV90ZXN0KHRlc3QpCisgICAgdmlydHVhbCBQYXNzT3duUHRyPExheWVy
UGFpbnRlckNocm9taXVtPiBjcmVhdGVSb290TGF5ZXJQYWludGVyKCkKKyAgICB7CisgICAgICAg
IHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBkaWRSZWNyZWF0ZUdy
YXBoaWNzQ29udGV4dChib29sKQogICAgIHsKICAgICB9CiAKLSAgICBDQ0xheWVyVHJlZUhvc3RU
ZXN0KiBtX3Rlc3Q7Citwcml2YXRlOgorICAgIGV4cGxpY2l0IE1vY2tMYXllclRyZWVIb3N0Q2xp
ZW50KFRlc3RIb29rcyogdGVzdEhvb2tzKSA6IG1fdGVzdEhvb2tzKHRlc3RIb29rcykgeyB9CisK
KyAgICBUZXN0SG9va3MqIG1fdGVzdEhvb2tzOwogfTsKIAotY2xhc3MgTW9ja0xheWVyVHJlZUhv
c3RJbXBsUHJveHkgOiBwdWJsaWMgQ0NMYXllclRyZWVIb3N0SW1wbFByb3h5IHsKKy8vIFRoZSBD
Q0xheWVyVHJlZUhvc3RUZXN0IHJ1bnMgd2l0aCB0aGUgbWFpbiBsb29wIHJ1bm5pbmcuIEl0IGlu
c3RhbnRpYXRlcyBhIHNpbmdsZSBNb2NrTGF5ZXJUcmVlSG9zdCBhbmQgYXNzb2NpYXRlZAorLy8g
TW9ja0xheWVyVHJlZUhvc3RJbXBsL01vY2tMYXllclRyZWVIb3N0Q2xpZW50LgorLy8KKy8vIGJl
Z2luVGVzdCgpIGlzIGNhbGxlZCBvbmNlIHRoZSBtYWluIG1lc3NhZ2UgbG9vcCBpcyBydW5uaW5n
IGFuZCB0aGUgbGF5ZXIgdHJlZSBob3N0IGlzIGluaXRpYWxpemVkLgorLy8KKy8vIEtleSBzdGFn
ZXMgb2YgdGhlIGRyYXdpbmcgbG9vcCwgZS5nLiBkcmF3aW5nIG9yIGNvbW1pdGluZywgcmVkaXJl
Y3QgdG8gQ0NMYXllclRyZWVIb3N0VGVzdCBtZXRob2RzIG9mIHNpbWlsYXIgbmFtZXMuCisvLyBU
byB0cmFjayB0aGUgY29tbWl0IHByb2Nlc3MsIG92ZXJyaWRlIHRoZXNlIGZ1bmN0aW9ucy4KKy8v
CisvLyBUaGUgdGVzdCBjb250aW51ZXMgdW50aWwgc29tZW9uZSBjYWxscyBlbmRUZXN0LiBlbmRU
ZXN0IGNhbiBiZSBjYWxsZWQgb24gYW55IHRocmVhZCwgYnV0IGJlIGF3YXJlIHRoYXQKKy8vIGVu
ZGluZyB0aGUgdGVzdCBpcyBhbiBhc3luY2hyb25vdXMgcHJvY2Vzcy4KK2NsYXNzIENDTGF5ZXJU
cmVlSG9zdFRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCwgVGVzdEhvb2tzIHsKIHB1YmxpYzoK
LSAgICBzdGF0aWMgUGFzc093blB0cjxNb2NrTGF5ZXJUcmVlSG9zdEltcGxQcm94eT4gY3JlYXRl
KENDTGF5ZXJUcmVlSG9zdCogaG9zdCwgQ0NMYXllclRyZWVIb3N0VGVzdCogdGVzdCkKKyAgICB2
aXJ0dWFsIHZvaWQgYWZ0ZXJUZXN0KCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBiZWdpblRlc3Qo
KSA9IDA7CisKKyAgICB2b2lkIGVuZFRlc3QoKTsKKworICAgIHZvaWQgcG9zdFNldE5lZWRzQ29t
bWl0VG9NYWluVGhyZWFkKCkKICAgICB7Ci0gICAgICAgIHJldHVybiBhZG9wdFB0cihuZXcgTW9j
a0xheWVyVHJlZUhvc3RJbXBsUHJveHkoaG9zdCwgdGVzdCkpOworICAgICAgICBjYWxsT25NYWlu
VGhyZWFkKENDTGF5ZXJUcmVlSG9zdFRlc3Q6OmRpc3BhdGNoU2V0TmVlZHNDb21taXQsIHRoaXMp
OwogICAgIH0KIAotICAgIFBhc3NPd25QdHI8Q0NMYXllclRyZWVIb3N0SW1wbD4gY3JlYXRlTGF5
ZXJUcmVlSG9zdEltcGwoKQorICAgIHZvaWQgcG9zdFNldE5lZWRzUmVkcmF3VG9NYWluVGhyZWFk
KCkKICAgICB7Ci0gICAgICAgIHJldHVybiBNb2NrTGF5ZXJUcmVlSG9zdEltcGw6OmNyZWF0ZSh0
aGlzLCBtX3Rlc3QpOworICAgICAgICBjYWxsT25NYWluVGhyZWFkKENDTGF5ZXJUcmVlSG9zdFRl
c3Q6OmRpc3BhdGNoU2V0TmVlZHNSZWRyYXcsIHRoaXMpOwogICAgIH0KIAotcHJpdmF0ZToKLSAg
ICBNb2NrTGF5ZXJUcmVlSG9zdEltcGxQcm94eShDQ0xheWVyVHJlZUhvc3QqIGhvc3QsIENDTGF5
ZXJUcmVlSG9zdFRlc3QqIHRlc3QpCi0gICAgICAgIDogQ0NMYXllclRyZWVIb3N0SW1wbFByb3h5
KGhvc3QpCi0gICAgICAgICwgbV90ZXN0KHRlc3QpIHsgfQorcHJvdGVjdGVkOgorICAgIENDTGF5
ZXJUcmVlSG9zdFRlc3QoKQorICAgICAgICA6IG1fYmVnaW5uaW5nKGZhbHNlKQorICAgICAgICAs
IG1fZW5kV2hlbkJlZ2luUmV0dXJucyhmYWxzZSkKKyAgICAgICAgLCBtX3J1bm5pbmcoZmFsc2Up
CisgICAgICAgICwgbV90aW1lZE91dChmYWxzZSkgeyB9CiAKLSAgICBDQ0xheWVyVHJlZUhvc3RU
ZXN0KiBtX3Rlc3Q7Ci19OworICAgIHZvaWQgZG9CZWdpblRlc3QoKTsKIAotY2xhc3MgTW9ja0xh
eWVyVHJlZUhvc3QgOiBwdWJsaWMgQ0NMYXllclRyZWVIb3N0IHsKLXB1YmxpYzoKLSAgICBNb2Nr
TGF5ZXJUcmVlSG9zdChDQ0xheWVyVHJlZUhvc3RDbGllbnQqIGNsaWVudCwgQ0NMYXllclRyZWVI
b3N0VGVzdCogdGVzdCkKLSAgICAgICAgOiBDQ0xheWVyVHJlZUhvc3QoY2xpZW50KQotICAgICAg
ICAsIG1fdGVzdCh0ZXN0KSB7IH0KKyAgICBzdGF0aWMgdm9pZCBvbkJlZ2luVGVzdCh2b2lkKiBz
ZWxmKQorICAgIHsKKyAgICAgICAgc3RhdGljX2Nhc3Q8Q0NMYXllclRyZWVIb3N0VGVzdCo+KHNl
bGYpLT5kb0JlZ2luVGVzdCgpOworICAgIH0KIAotICAgIHZpcnR1YWwgUGFzc093blB0cjxDQ0xh
eWVyVHJlZUhvc3RJbXBsUHJveHk+IGNyZWF0ZUxheWVyVHJlZUhvc3RJbXBsUHJveHkoKQorICAg
IHZvaWQgZG9FbmRUZXN0KCkKICAgICB7Ci0gICAgICAgIE93blB0cjxDQ0xheWVyVHJlZUhvc3RJ
bXBsUHJveHk+IHByb3h5ID0gTW9ja0xheWVyVHJlZUhvc3RJbXBsUHJveHk6OmNyZWF0ZSh0aGlz
LCBtX3Rlc3QpOwotICAgICAgICBwcm94eS0+c3RhcnQoKTsKLSAgICAgICAgcmV0dXJuIHByb3h5
LnJlbGVhc2UoKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlTGF5ZXJzKCkKKyAg
ICBzdGF0aWMgdm9pZCBvbkVuZFRlc3Qodm9pZCogc2VsZikKICAgICB7Ci0gICAgICAgIG1fdGVz
dC0+dXBkYXRlTGF5ZXJzKHRoaXMpOworICAgICAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOwor
ICAgICAgICB3ZWJraXRfc3VwcG9ydDo6UXVpdE1lc3NhZ2VMb29wKCk7CisgICAgICAgIENDTGF5
ZXJUcmVlSG9zdFRlc3QqIHRlc3QgPSBzdGF0aWNfY2FzdDxDQ0xheWVyVHJlZUhvc3RUZXN0Kj4o
c2VsZik7CisgICAgICAgIEFTU0VSVCh0ZXN0KTsKKyAgICAgICAgdGVzdC0+bV9sYXllclRyZWVI
b3N0LmNsZWFyKCk7CiAgICAgfQogCi0gICAgdmlydHVhbCBQYXNzT3duUHRyPENDTGF5ZXJUcmVl
SG9zdENvbW1pdHRlcj4gY3JlYXRlTGF5ZXJUcmVlSG9zdENvbW1pdHRlcigpCisgICAgc3RhdGlj
IHZvaWQgZGlzcGF0Y2hTZXROZWVkc0NvbW1pdCh2b2lkKiBzZWxmKQogICAgIHsKLSAgICAgICAg
cmV0dXJuIE1vY2tMYXllclRyZWVIb3N0Q29tbWl0dGVyOjpjcmVhdGUobV90ZXN0KTsKKyAgICAg
IEFTU0VSVChpc01haW5UaHJlYWQoKSk7CisgICAgICBDQ0xheWVyVHJlZUhvc3RUZXN0KiB0ZXN0
ID0gc3RhdGljX2Nhc3Q8Q0NMYXllclRyZWVIb3N0VGVzdCo+KHNlbGYpOworICAgICAgQVNTRVJU
KHRlc3QpOworICAgICAgaWYgKHRlc3QtPm1fbGF5ZXJUcmVlSG9zdCkKKyAgICAgICAgICB0ZXN0
LT5tX2xheWVyVHJlZUhvc3QtPnNldE5lZWRzQ29tbWl0QW5kUmVkcmF3KCk7CisgICAgfQorCisg
ICAgc3RhdGljIHZvaWQgZGlzcGF0Y2hTZXROZWVkc1JlZHJhdyh2b2lkKiBzZWxmKQorICAgIHsK
KyAgICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7CisgICAgICBDQ0xheWVyVHJlZUhvc3RUZXN0
KiB0ZXN0ID0gc3RhdGljX2Nhc3Q8Q0NMYXllclRyZWVIb3N0VGVzdCo+KHNlbGYpOworICAgICAg
QVNTRVJUKHRlc3QpOworICAgICAgaWYgKHRlc3QtPm1fbGF5ZXJUcmVlSG9zdCkKKyAgICAgICAg
ICB0ZXN0LT5tX2xheWVyVHJlZUhvc3QtPnNldE5lZWRzUmVkcmF3KCk7CiAgICAgfQogCi0gICAg
dmlydHVhbCB2b2lkIGJlZ2luQ29tbWl0KCkKKyAgICB2b2lkIHJ1blRlc3QoKQogICAgIHsKLSAg
ICAgICAgQ0NMYXllclRyZWVIb3N0OjpiZWdpbkNvbW1pdCgpOwotICAgICAgICBtX3Rlc3QtPmJl
Z2luQ29tbWl0T25NYWluVGhyZWFkKHRoaXMpOworICAgICAgICB3ZWJraXRfc3VwcG9ydDo6UG9z
dERlbGF5ZWRUYXNrKENDTGF5ZXJUcmVlSG9zdFRlc3Q6Om9uQmVnaW5UZXN0LCBzdGF0aWNfY2Fz
dDx2b2lkKj4odGhpcyksIDApOworICAgICAgICB3ZWJraXRfc3VwcG9ydDo6UG9zdERlbGF5ZWRU
YXNrKENDTGF5ZXJUcmVlSG9zdFRlc3Q6OnRlc3RUaW1lb3V0LCBzdGF0aWNfY2FzdDx2b2lkKj4o
dGhpcyksIDUwMDApOworICAgICAgICB3ZWJraXRfc3VwcG9ydDo6UnVuTWVzc2FnZUxvb3AoKTsK
KyAgICAgICAgbV9ydW5uaW5nID0gZmFsc2U7CisgICAgICAgIGJvb2wgdGltZWRPdXQgPSBtX3Rp
bWVkT3V0OyAvLyBTYXZlIHdoZXRoZXIgd2UncmUgdGltZWQgb3V0IGluIGNhc2UgUnVuQWxsUGVu
ZGluZ01lc3NhZ2VzIGhhcyB0aGUgdGltZW91dC4KKyAgICAgICAgd2Via2l0X3N1cHBvcnQ6OlJ1
bkFsbFBlbmRpbmdNZXNzYWdlcygpOworICAgICAgICBBU1NFUlQoIW1fbGF5ZXJUcmVlSG9zdC5n
ZXQoKSk7CisgICAgICAgIG1fY2xpZW50LmNsZWFyKCk7CisgICAgICAgIGlmICh0aW1lZE91dCkg
eworICAgICAgICAgICAgcHJpbnRmKCJUZXN0IHRpbWVkIG91dCIpOworICAgICAgICAgICAgRkFJ
TCgpIDw8ICJUZXN0IHRpbWVkIG91dCI7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0K
KyAgICAgICAgYWZ0ZXJUZXN0KCk7CiAgICAgfQogCi0gICAgdmlydHVhbCB2b2lkIGNvbW1pdENv
bXBsZXRlKCkKKyAgICBzdGF0aWMgdm9pZCB0ZXN0VGltZW91dCh2b2lkKiBzZWxmKQogICAgIHsK
LSAgICAgICAgbV90ZXN0LT5jb21taXRDb21wbGV0ZU9uTWFpblRocmVhZCh0aGlzKTsKLSAgICAg
ICAgQ0NMYXllclRyZWVIb3N0Ojpjb21taXRDb21wbGV0ZSgpOworICAgICAgICBDQ0xheWVyVHJl
ZUhvc3RUZXN0KiB0ZXN0ID0gc3RhdGljX2Nhc3Q8Q0NMYXllclRyZWVIb3N0VGVzdCo+KHNlbGYp
OworICAgICAgICBpZiAoIXRlc3QtPm1fcnVubmluZykKKyAgICAgICAgICAgIHJldHVybjsKKyAg
ICAgICAgdGVzdC0+bV90aW1lZE91dCA9IHRydWU7CisgICAgICAgIHRlc3QtPmVuZFRlc3QoKTsK
ICAgICB9CiAKKyAgICBNdXRleCBtX3RyYWNlc0xvY2s7CisgICAgVmVjdG9yPHN0ZDo6c3RyaW5n
PiBtX3RyYWNlczsKKworICAgIE93blB0cjxNb2NrTGF5ZXJUcmVlSG9zdENsaWVudD4gbV9jbGll
bnQ7CisgICAgUmVmUHRyPENDTGF5ZXJUcmVlSG9zdD4gbV9sYXllclRyZWVIb3N0OworCiBwcml2
YXRlOgotICAgIENDTGF5ZXJUcmVlSG9zdFRlc3QqIG1fdGVzdDsKKyAgICBib29sIG1fYmVnaW5u
aW5nOworICAgIGJvb2wgbV9lbmRXaGVuQmVnaW5SZXR1cm5zOworICAgIGJvb2wgbV9ydW5uaW5n
OworICAgIGJvb2wgbV90aW1lZE91dDsKIH07CiAKIHZvaWQgQ0NMYXllclRyZWVIb3N0VGVzdDo6
ZG9CZWdpblRlc3QoKQogeworICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7CiAgICAgQVNTRVJU
KCFtX3J1bm5pbmcpOwogICAgIG1fcnVubmluZyA9IHRydWU7Ci0gICAgbV9jbGllbnQgPSBhZG9w
dFB0cihuZXcgTW9ja0xheWVyVHJlZUhvc3RDbGllbnQodGhpcykpOwotICAgIG1fbGF5ZXJUcmVl
SG9zdCA9IGFkb3B0UmVmKG5ldyBNb2NrTGF5ZXJUcmVlSG9zdChtX2NsaWVudC5nZXQoKSwgdGhp
cykpOwotICAgIG1fbGF5ZXJUcmVlSG9zdC0+aW5pdCgpOworICAgIG1fY2xpZW50ID0gTW9ja0xh
eWVyVHJlZUhvc3RDbGllbnQ6OmNyZWF0ZSh0aGlzKTsKKworICAgIENDU2V0dGluZ3Mgc2V0dGlu
Z3M7CisgICAgc2V0dGluZ3MuZW5hYmxlQ29tcG9zaXRvclRocmVhZCA9IHRydWU7CisgICAgUmVm
UHRyPExheWVyQ2hyb21pdW0+IHJvb3RMYXllcjsKKyAgICBtX2xheWVyVHJlZUhvc3QgPSBNb2Nr
TGF5ZXJUcmVlSG9zdDo6Y3JlYXRlKHRoaXMsIG1fY2xpZW50LmdldCgpLCByb290TGF5ZXIsIHNl
dHRpbmdzKTsKKyAgICBBU1NFUlQobV9sYXllclRyZWVIb3N0KTsKKwogICAgIG1fYmVnaW5uaW5n
ID0gdHJ1ZTsKICAgICBiZWdpblRlc3QoKTsKICAgICBtX2JlZ2lubmluZyA9IGZhbHNlOwpAQCAt
MzI3LDcgKzM0OSw3IEBAIHB1YmxpYzoKIAogICAgIHZpcnR1YWwgdm9pZCBiZWdpblRlc3QoKQog
ICAgIHsKLSAgICAgICAgbV9sYXllclRyZWVIb3N0LT5zZXROZWVkc0NvbW1pdEFuZFJlZHJhdygp
OworICAgICAgICBwb3N0U2V0TmVlZHNDb21taXRUb01haW5UaHJlYWQoKTsKICAgICAgICAgZW5k
VGVzdCgpOwogICAgIH0KIApAQCAtMzQ3LDcgKzM2OSw3IEBAIHB1YmxpYzoKIAogICAgIHZpcnR1
YWwgdm9pZCBiZWdpblRlc3QoKQogICAgIHsKLSAgICAgICAgbV9sYXllclRyZWVIb3N0LT5zZXRO
ZWVkc1JlZHJhdygpOworICAgICAgICBwb3N0U2V0TmVlZHNSZWRyYXdUb01haW5UaHJlYWQoKTsK
ICAgICAgICAgZW5kVGVzdCgpOwogICAgIH0KIApAQCAtMzcxLDIzICszOTMsMjMgQEAgcHVibGlj
OgogCiAgICAgdmlydHVhbCB2b2lkIGJlZ2luVGVzdCgpCiAgICAgewotICAgICAgICBtX2xheWVy
VHJlZUhvc3QtPnNldE5lZWRzQ29tbWl0QW5kUmVkcmF3KCk7CisgICAgICAgIHBvc3RTZXROZWVk
c0NvbW1pdFRvTWFpblRocmVhZCgpOwogICAgICAgICBlbmRUZXN0KCk7CiAgICAgfQogCi0gICAg
dmlydHVhbCB2b2lkIGNvbW1pdENvbXBsZXRlT25DQ1RocmVhZChNb2NrTGF5ZXJUcmVlSG9zdElt
cGwqIGxheWVyVHJlZUhvc3RJbXBsKQorICAgIHZpcnR1YWwgdm9pZCBjb21taXRDb21wbGV0ZU9u
Q0NUaHJlYWQoQ0NMYXllclRyZWVIb3N0SW1wbCopCiAgICAgewogICAgICAgICBtX251bUNvbXBs
ZXRlQ29tbWl0cysrOwogICAgICAgICBpZiAobV9udW1Db21wbGV0ZUNvbW1pdHMgPT0gMikKICAg
ICAgICAgICAgIGVuZFRlc3QoKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHZvaWQgZHJhd0xheWVy
c0FuZFByZXNlbnRPbkNDVGhyZWFkKE1vY2tMYXllclRyZWVIb3N0SW1wbCogbGF5ZXJUcmVlSG9z
dEltcGwpCisgICAgdmlydHVhbCB2b2lkIGRyYXdMYXllcnNPbkNDVGhyZWFkKENDTGF5ZXJUcmVl
SG9zdEltcGwqKQogICAgIHsKICAgICAgICAgaWYgKG1fbnVtRHJhd3MgPT0gMSkKLSAgICAgICAg
ICAgIGxheWVyVHJlZUhvc3RJbXBsLT5zZXROZWVkc0NvbW1pdEFuZFJlZHJhdygpOworICAgICAg
ICAgIHBvc3RTZXROZWVkc0NvbW1pdFRvTWFpblRocmVhZCgpOwogICAgICAgICBtX251bURyYXdz
Kys7Ci0gICAgICAgIGxheWVyVHJlZUhvc3RJbXBsLT5zZXROZWVkc1JlZHJhdygpOworICAgICAg
ICBwb3N0U2V0TmVlZHNSZWRyYXdUb01haW5UaHJlYWQoKTsKICAgICB9CiAKICAgICB2aXJ0dWFs
IHZvaWQgYWZ0ZXJUZXN0KCkKQEAgLTQxNSwxOCArNDM3LDE4IEBAIHB1YmxpYzoKIAogICAgIHZp
cnR1YWwgdm9pZCBiZWdpblRlc3QoKQogICAgIHsKLSAgICAgICAgbV9sYXllclRyZWVIb3N0LT5z
ZXROZWVkc0NvbW1pdEFuZFJlZHJhdygpOwotICAgICAgICBtX2xheWVyVHJlZUhvc3QtPnNldE5l
ZWRzQ29tbWl0QW5kUmVkcmF3KCk7CisgICAgICAgIHBvc3RTZXROZWVkc0NvbW1pdFRvTWFpblRo
cmVhZCgpOworICAgICAgICBwb3N0U2V0TmVlZHNDb21taXRUb01haW5UaHJlYWQoKTsKICAgICB9
CiAKLSAgICB2aXJ0dWFsIHZvaWQgZHJhd0xheWVyc0FuZFByZXNlbnRPbkNDVGhyZWFkKE1vY2tM
YXllclRyZWVIb3N0SW1wbCogbGF5ZXJUcmVlSG9zdEltcGwpCisgICAgdmlydHVhbCB2b2lkIGRy
YXdMYXllcnNPbkNDVGhyZWFkKENDTGF5ZXJUcmVlSG9zdEltcGwqIGltcGwpCiAgICAgewogICAg
ICAgICBtX251bURyYXdzKys7Ci0gICAgICAgIGlmICghbGF5ZXJUcmVlSG9zdEltcGwtPnNvdXJj
ZUZyYW1lTnVtYmVyKCkpCisgICAgICAgIGlmICghaW1wbC0+c291cmNlRnJhbWVOdW1iZXIoKSkK
ICAgICAgICAgICAgIGVuZFRlc3QoKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHZvaWQgY29tbWl0
T25DQ1RocmVhZChNb2NrTGF5ZXJUcmVlSG9zdCogbGF5ZXJUcmVlSG9zdCwgTW9ja0xheWVyVHJl
ZUhvc3RJbXBsKiBpbXBsKQorICAgIHZpcnR1YWwgdm9pZCBjb21taXRDb21wbGV0ZU9uQ0NUaHJl
YWQoQ0NMYXllclRyZWVIb3N0SW1wbCopCiAgICAgewogICAgICAgICBtX251bUNvbW1pdHMrKzsK
ICAgICB9CkBAIC00NTgsMTggKzQ4MCwxOCBAQCBwdWJsaWM6CiAKICAgICB2aXJ0dWFsIHZvaWQg
YmVnaW5UZXN0KCkKICAgICB7Ci0gICAgICAgIG1fbGF5ZXJUcmVlSG9zdC0+c2V0TmVlZHNDb21t
aXRBbmRSZWRyYXcoKTsKKyAgICAgICAgcG9zdFNldE5lZWRzQ29tbWl0VG9NYWluVGhyZWFkKCk7
CiAgICAgfQogCi0gICAgdmlydHVhbCB2b2lkIGRyYXdMYXllcnNBbmRQcmVzZW50T25DQ1RocmVh
ZChNb2NrTGF5ZXJUcmVlSG9zdEltcGwqIGxheWVyVHJlZUhvc3RJbXBsKQorICAgIHZpcnR1YWwg
dm9pZCBkcmF3TGF5ZXJzT25DQ1RocmVhZChDQ0xheWVyVHJlZUhvc3RJbXBsKiBpbXBsKQogICAg
IHsKLSAgICAgICAgaWYgKCFsYXllclRyZWVIb3N0SW1wbC0+c291cmNlRnJhbWVOdW1iZXIoKSkK
LSAgICAgICAgICAgIGxheWVyVHJlZUhvc3RJbXBsLT5zZXROZWVkc0NvbW1pdEFuZFJlZHJhdygp
OwotICAgICAgICBlbHNlIGlmIChsYXllclRyZWVIb3N0SW1wbC0+c291cmNlRnJhbWVOdW1iZXIo
KSA9PSAxKQorICAgICAgICBpZiAoIWltcGwtPnNvdXJjZUZyYW1lTnVtYmVyKCkpCisgICAgICAg
ICAgICBwb3N0U2V0TmVlZHNDb21taXRUb01haW5UaHJlYWQoKTsKKyAgICAgICAgZWxzZSBpZiAo
aW1wbC0+c291cmNlRnJhbWVOdW1iZXIoKSA9PSAxKQogICAgICAgICAgICAgZW5kVGVzdCgpOwog
ICAgIH0KIAotICAgIHZpcnR1YWwgdm9pZCBjb21taXRPbkNDVGhyZWFkKE1vY2tMYXllclRyZWVI
b3N0KiBsYXllclRyZWVIb3N0LCBNb2NrTGF5ZXJUcmVlSG9zdEltcGwqIGltcGwpCisgICAgdmly
dHVhbCB2b2lkIGNvbW1pdENvbXBsZXRlT25DQ1RocmVhZChDQ0xheWVyVHJlZUhvc3RJbXBsKikK
ICAgICB7CiAgICAgICAgIG1fbnVtQ29tbWl0cysrOwogICAgIH0KQEAgLTUwMSwxOSArNTIzLDIw
IEBAIHB1YmxpYzoKIAogICAgIHZpcnR1YWwgdm9pZCBiZWdpblRlc3QoKQogICAgIHsKKyAgICAg
ICAgcG9zdFNldE5lZWRzQ29tbWl0VG9NYWluVGhyZWFkKCk7CiAgICAgfQogCi0gICAgdmlydHVh
bCB2b2lkIGRyYXdMYXllcnNBbmRQcmVzZW50T25DQ1RocmVhZChNb2NrTGF5ZXJUcmVlSG9zdElt
cGwqIGltcGwpCisgICAgdmlydHVhbCB2b2lkIGRyYXdMYXllcnNPbkNDVGhyZWFkKENDTGF5ZXJU
cmVlSG9zdEltcGwqIGltcGwpCiAgICAgewogICAgICAgICBFWFBFQ1RfRVEoMCwgaW1wbC0+c291
cmNlRnJhbWVOdW1iZXIoKSk7CiAgICAgICAgIGlmICghbV9udW1EcmF3cykKLSAgICAgICAgICAg
IGltcGwtPnNldE5lZWRzUmVkcmF3KCk7IC8vIHJlZHJhdyBhZ2FpbiB0byB2ZXJpZnkgdGhhdCB0
aGUgc2Vjb25kIHJlZHJhdyBkb2VzbnQgY29tbWl0LgorICAgICAgICAgICAgcG9zdFNldE5lZWRz
UmVkcmF3VG9NYWluVGhyZWFkKCk7IC8vIFJlZHJhdyBhZ2FpbiB0byB2ZXJpZnkgdGhhdCB0aGUg
c2Vjb25kIHJlZHJhdyBkb2Vzbid0IGNvbW1pdC4KICAgICAgICAgZWxzZQogICAgICAgICAgICAg
ZW5kVGVzdCgpOwogICAgICAgICBtX251bURyYXdzKys7CiAgICAgfQogCi0gICAgdmlydHVhbCB2
b2lkIGNvbW1pdE9uQ0NUaHJlYWQoTW9ja0xheWVyVHJlZUhvc3QqIGxheWVyVHJlZUhvc3QsIE1v
Y2tMYXllclRyZWVIb3N0SW1wbCogaW1wbCkKKyAgICB2aXJ0dWFsIHZvaWQgY29tbWl0Q29tcGxl
dGVPbkNDVGhyZWFkKENDTGF5ZXJUcmVlSG9zdEltcGwqKQogICAgIHsKICAgICAgICAgbV9udW1D
b21taXRzKys7CiAgICAgfQo=
</data>

          </attachment>
      

    </bug>

</bugzilla>