<?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>27314</bug_id>
          
          <creation_ts>2009-07-15 13:41:44 -0700</creation_ts>
          <short_desc>Implement Accelerated Compositing on Windows (3D CSS Transforms)</short_desc>
          <delta_ts>2009-11-24 20:31:25 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>CSS</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>PC</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Enhancement</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Chris Foresman">chris</reporter>
          <assigned_to name="Chris Marrin">cmarrin</assigned_to>
          <cc>aroben</cc>
    
    <cc>bfulgham</cc>
    
    <cc>cmarrin</cc>
    
    <cc>jmuizelaar</cc>
    
    <cc>mario.bensi</cc>
    
    <cc>michael.davey</cc>
    
    <cc>simon.fraser</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>132014</commentid>
    <comment_count>0</comment_count>
    <who name="Chris Foresman">chris</who>
    <bug_when>2009-07-15 13:41:44 -0700</bug_when>
    <thetext>3D CSS Transforms, currently a draft specification with the W3C ( ), are enabled in builds of WebKit on iPhone OS, Safari 4 on Mac OS X 10.6, and nightly builds of WebKit for Mac OS X 10.5.x. Request that support be enabled for the Windows port of WebKit/Safari 4.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>132312</commentid>
    <comment_count>1</comment_count>
    <who name="Mark Rowe (bdash)">mrowe</who>
    <bug_when>2009-07-16 12:07:52 -0700</bug_when>
    <thetext>*** Bug 27350 has been marked as a duplicate of this bug. ***</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>133225</commentid>
    <comment_count>2</comment_count>
    <who name="Chris Foresman">chris</who>
    <bug_when>2009-07-20 14:14:29 -0700</bug_when>
    <thetext>Adding comments from Michael Davy from duplicate bug 27350, as I feel they offer a succinct justification for enabling support on Windows:

*  The features were demonstrated at WWDC as being features of Safari 4, yet
the Windows version of Safari is shipped without the feature.
*  Providing the feature only on some platforms causes a disparity which,
subject to the provision of detailed technical information to the contrary,
would seem to be arbitrary
*  As I understand it, Apple intend for these feature to become part of the
CSS3 specification.  Demonstrating the ability to implement the features cross
platform would seem to be an important step to achieving this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>154213</commentid>
    <comment_count>3</comment_count>
      <attachid>41071</attachid>
    <who name="Chris Marrin">cmarrin</who>
    <bug_when>2009-10-12 17:37:43 -0700</bug_when>
    <thetext>Created attachment 41071
First patch (new files)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>154214</commentid>
    <comment_count>4</comment_count>
      <attachid>41072</attachid>
    <who name="Chris Marrin">cmarrin</who>
    <bug_when>2009-10-12 17:46:42 -0700</bug_when>
    <thetext>Created attachment 41072
Second patch (hooking up accelerated compositing, but not building)

This second patch contains all the changes to existing logic, all behind the USE_ACCELERATED_COMPOSITING flag</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>154216</commentid>
    <comment_count>5</comment_count>
      <attachid>41073</attachid>
    <who name="Chris Marrin">cmarrin</who>
    <bug_when>2009-10-12 17:52:01 -0700</bug_when>
    <thetext>Created attachment 41073
Third patch (adding files to build - off by default)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>154249</commentid>
    <comment_count>6</comment_count>
      <attachid>41071</attachid>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2009-10-12 21:30:58 -0700</bug_when>
    <thetext>Comment on attachment 41071
First patch (new files)

In general, I wonder if we should try to share more code between the Mac and Windows implementations.
I feel like we&apos;re going to be fixing all the bugs twice if the code is in both.

&gt; Index: WebCore/platform/graphics/win/GraphicsLayerCACF.cpp
&gt; ===================================================================

&gt; +namespace WebCore {
&gt; +
&gt; +// The threshold width or height above which a tiled layer will be used. This should be
&gt; +// large enough to avoid tiled layers for most GraphicsLayers, but less than the OpenGL
&gt; +// texture size limit on all supported hardware.
&gt; +static const int cMaxPixelDimension = 2000;
&gt; +
&gt; +// The width and height of a single tile in a tiled layer. Should be large enough to
&gt; +// avoid lots of small tiles (and therefore lots of drawing callbacks), but small enough
&gt; +// to keep the overall tile cost low.
&gt; +static const int cTiledLayerTileSize = 512;

I think you should just remove all the tiled layer-related code.

&gt; +} // namespace WebCore
&gt; +
&gt; +namespace WebCore {

Why close and re-open the namespace?

&gt; +#ifndef NDEBUG
&gt; +bool GraphicsLayer::showDebugBorders()
&gt; +{
&gt; +    static bool showDebugBorders = false; //[[NSUserDefaults standardUserDefaults] boolForKey:@&quot;WebCoreLayerBorders&quot;];
&gt; +    return showDebugBorders;
&gt; +}
&gt; +
&gt; +bool GraphicsLayer::showRepaintCounter()
&gt; +{
&gt; +    static bool showRepaintCounter = false; //[[NSUserDefaults standardUserDefaults] boolForKey:@&quot;WebCoreLayerRepaintCounter&quot;];
&gt; +    return showRepaintCounter;
&gt; +}
&gt; +#endif

You shouldn&apos;t check in commented out code. We should figure out how to store preferences on Windows, or remove these methods.

&gt; +void GraphicsLayerCACF::addChildBelow(GraphicsLayer* childLayer, GraphicsLayer* sibling)
&gt; +{
&gt; +    // FIXME share code
&gt; +    ASSERT(!childLayer-&gt;parent());
&gt; +    ASSERT(childLayer != this);

This is what used to be in GraphicsLayerCA.mm before I implemented batching. I wonder if it makes sense to share the same code on Windows but just commit the batch more eagerly? In addition, the change to use batching also fixed a number of bugs; you&apos;re copying older code with bugs in here.

&gt; +void GraphicsLayerCACF::removeFromParent()
&gt; +{
&gt; +    GraphicsLayer::removeFromParent();
&gt; +
&gt; +    
&gt; +    layerForSuperlayer()-&gt;removeFromSuperlayer();            
&gt; +}

Extra space here.

&gt; +
&gt; +void GraphicsLayerCACF::setPosition(const FloatPoint&amp; point)
&gt; +{
&gt; +    // don&apos;t short-circuit here, because position and anchor point
&gt; +    // are inter-related
&gt; +    GraphicsLayer::setPosition(point);
&gt; +
&gt; +    // position is offset on the layer by the layer anchor point
&gt; +    CGPoint posPoint = CGPointMake(m_position.x() + m_anchorPoint.x() * m_size.width(),
&gt; +                                   m_position.y() + m_anchorPoint.y() * m_size.height());
&gt; +    
&gt; +    primaryLayer()-&gt;setPosition(posPoint);
&gt; +}
&gt; +
&gt; +void GraphicsLayerCACF::setAnchorPoint(const FloatPoint3D&amp; point)
&gt; +{
&gt; +    // Don&apos;t short-circuit here, because position and anchor point are inter-dependent.

Use this same comment formatting in setPosition().

&gt; +void GraphicsLayerCACF::setOpacity(float opacity)
&gt; +{
&gt; +    float clampedOpacity = std::max(std::min(opacity, 1.0f), 0.0f);

You did &apos;using namespace std&apos; at the top so this should obmit the std::

&gt; +void GraphicsLayerCACF::setNeedsDisplayInRect(const FloatRect&amp; rect)
&gt; +{
&gt; +    if (drawsContent()) {
&gt; +		CGRect r;
&gt; +		r.origin.x = rect.x(); r.origin.y = rect.y();
&gt; +		r.size.width = rect.width(); r.size.height = rect.height();

Tabs here!

There&apos;s an operator CGRect on FloatRect; no need to convert here.

&gt; +void GraphicsLayerCACF::setContentsToImage(Image* image)
&gt; +{
&gt; +    if (image) {
&gt; +        if (!m_contentsLayer.get()) {
&gt; +
&gt; +            RefPtr&lt;WKCACFLayer&gt; imageLayer = WKCACFLayer::create(kCACFLayer, this);
&gt; +#ifndef NDEBUG
&gt; +            imageLayer-&gt;setName(&quot;Image Layer&quot;);
&gt; +#endif
&gt; +            setupContentsLayer(imageLayer.get());
&gt; +        }
&gt; +
&gt; +        // FIXME: maybe only do trilinear if the image is being scaled down,
&gt; +        // but then what if the layer size changes?
&gt; +        m_contentsLayer-&gt;setMinificationFilter(kCACFFilterTrilinear);
&gt; +        CGImageRef theImage = image-&gt;nativeImageForCurrentFrame();
&gt; +        m_contentsLayer-&gt;setContents(theImage);

This is missing the bug fix related to image color profiles.

&gt; +void GraphicsLayerCACF::setupContentsLayer(WKCACFLayer* contentsLayer)
&gt; +{
&gt; +    if (contentsLayer == m_contentsLayer)
&gt; +        return;
&gt; +
&gt; +    if (m_contentsLayer) {
&gt; +        m_contentsLayer-&gt;removeFromSuperlayer();
&gt; +        m_contentsLayer = 0;
&gt; +    }
&gt; +    
&gt; +    if (contentsLayer) {
&gt; +        // Turn off implicit animations on the inner layer.
&gt; +        m_contentsLayer = contentsLayer;

The comment is not relevant.

&gt; +#endif // USE(ACCELERATED_COMPOSITI
&gt; \ No newline at end of file

Looks like you truncated the file here.

&gt; Property changes on: WebCore/platform/graphics/win/GraphicsLayerCACF.cpp
&gt; ___________________________________________________________________
&gt; Added: svn:executable

Really? Other files have this too.

&gt; Index: WebCore/platform/graphics/win/GraphicsLayerCACF.h
&gt; ===================================================================

&gt; +    // return true if we started an animation
&gt; +    virtual void setOpacity(float opacity);

Comment is bogus.

&gt; Index: WebCore/platform/graphics/win/WKCACFContextFlusher.cpp
&gt; ===================================================================

&gt; +/*
&gt; + *  ContextFlusher.cpp
&gt; + *  WebCore
&gt; + *
&gt; + *  Created by Adam Roben on 6/24/08.
&gt; + *  Adapted from ContextFlusher by Chris Marrin on 10/21/08.
&gt; + *  Copyright 2008 Apple Inc. All rights reserved.
&gt; + *
&gt; + */

Needs a real license.

Does the whole file need #if USE(ACCELERATED_COMPOSITING) ?

&gt; +#include &lt;QuartzCore/CACFContext.h&gt;

How will people building WebKit standalone get that header file?

&gt; +void WKCACFContextFlusher::flushAllContexts()
&gt; +{
&gt; +    // addContext might get called beneath CACFContextFlush, and we don&apos;t want m_contexts to change while
&gt; +    // we&apos;re iterating over it, so we move the contexts into a local ContextSet and iterate over that instead.
&gt; +    ContextSet contextsToFlush;
&gt; +    contextsToFlush.swap(m_contexts);
&gt; +
&gt; +    ContextSet::const_iterator end = contextsToFlush.end();
&gt; +    for (ContextSet::const_iterator it = contextsToFlush.begin(); it != end; ++it) {
&gt; +        CACFContextRef context = *it;
&gt; +        CACFContextFlush(context);
&gt; +        didFlushContext(context);
&gt; +        CFRelease(context);

Why is this CFRelease here? Did *it implicitly CFRetain?

&gt; Index: WebCore/platform/graphics/win/WKCACFContextFlusher.h
&gt; ===================================================================

&gt; +/*
&gt; + *  ContextFlusher.h
&gt; + *  WebCore
&gt; + *
&gt; + *  Created by Adam Roben on 6/24/08.
&gt; + *  Adapted from ContextFlusher by Chris Marrin on 10/21/08.
&gt; + *  Copyright 2008 Apple Inc. All rights reserved.
&gt; + *
&gt; + */

Needs a real license.

Does the whole file need #if USE(ACCELERATED_COMPOSITING) ?

&gt; +
&gt; +#ifndef WKCACFContextFlusher_h
&gt; +#define WKCACFContextFlusher_h
&gt; +
&gt; +#include &quot;config.h&quot;

config.h should not be included in header files.

&gt; Index: WebCore/platform/graphics/win/WKCACFLayer.cpp
&gt; ===================================================================
&gt; +/*
&gt; + *  WKCACFLayer.cpp
&gt; + *  WebCore
&gt; + *
&gt; + *  Created by Adam Roben on 6/24/08.
&gt; + *  Adapted from CoreAnimationLayer by Chris Marrin on 10/21/08.
&gt; + *  Copyright 2008 Apple Inc. All rights reserved.
&gt; + *
&gt; + */

Needs license.

Does the whole file need #if USE(ACCELERATED_COMPOSITING) ?

&gt; +
&gt; +#include &quot;WKCACFLayer.h&quot;
&gt; +
&gt; +#include &quot;WKCACFContextFlusher.h&quot;
&gt; +
&gt; +#include &lt;stdio.h&gt;
&gt; +#include &lt;QuartzCore/CACFContext.h&gt;
&gt; +#include &lt;QuartzCore/CARender.h&gt;
&gt; +#include &lt;QuartzCore/CATransform3DPrivate.h&gt;

Can non-Apple people build this?

&gt; +    // These macros were copied from QuartzCore/LayerKit/utilities/CACGUtil.h

I don&apos;t think you should say this here.

&gt; +void WKCACFLayer::display(PlatformGraphicsContext* context)
&gt; +{
&gt; +    if (!m_owner)
&gt; +        return;
&gt; +
&gt; +    CGContextSaveGState(context);
&gt; +
&gt; +    CGRect layerBounds = bounds();
&gt; +    if (m_owner-&gt;contentsOrientation() == WebCore::GraphicsLayer::CompositingCoordinatesBottomUp) {
&gt; +        CGContextScaleCTM(context, 1, -1);
&gt; +        CGContextTranslateCTM(context, 0, -layerBounds.size.height);
&gt; +    }
&gt; +
&gt; +    if (m_owner-&gt;client()) {
&gt; +        GraphicsContext graphicsContext(context);
&gt; +
&gt; +        // It&apos;s important to get the clip from the context, because it may be significantly
&gt; +        // smaller than the layer bounds (e.g. tiled layers)
&gt; +        CGRect clipBounds = CGContextGetClipBoundingBox(context);
&gt; +        IntRect clip(enclosingIntRect(clipBounds));
&gt; +        m_owner-&gt;paintGraphicsLayerContents(graphicsContext, clip);
&gt; +    }
&gt; +#ifndef NDEBUG
&gt; +    else {
&gt; +        ASSERT_NOT_REACHED();
&gt; +
&gt; +        // FIXME: ideally we&apos;d avoid calling -setNeedsDisplay on a layer that is a plain color,
&gt; +        // so CA never makes backing store for it (which is what -setNeedsDisplay will do above).
&gt; +        CGContextSetRGBFillColor(context, 0.0f, 1.0f, 0.0f, 1.0f);
&gt; +        CGContextFillRect(context, layerBounds);
&gt; +    }
&gt; +#endif
&gt; +
&gt; +#ifndef NDEBUG
&gt; +    if (m_owner-&gt;showRepaintCounter()) {
&gt; +        char text[16]; // that&apos;s a lot of repaints
&gt; +        _snprintf(text, sizeof(text), &quot;%d&quot;, m_owner-&gt;incrementRepaintCount());
&gt; +
&gt; +        CGContextSaveGState(context);
&gt; +        CGContextSetRGBFillColor(context, 1.0f, 0.0f, 0.0f, 0.8f);
&gt; +        
&gt; +        CGRect aBounds = layerBounds;
&gt; +
&gt; +        aBounds.size.width = 10 + 12 * strlen(text);
&gt; +        aBounds.size.height = 25;
&gt; +        CGContextFillRect(context, aBounds);
&gt; +        
&gt; +        CGContextSetRGBFillColor(context, 0.0f, 0.0f, 0.0f, 1.0f);
&gt; +
&gt; +        CGContextSetTextMatrix(context, CGAffineTransformMakeScale(1.0f, -1.0f));
&gt; +        CGContextSelectFont(context, &quot;Helvetica&quot;, 25, kCGEncodingMacRoman);
&gt; +        CGContextShowTextAtPoint(context, aBounds.origin.x + 3.0f, aBounds.origin.y + 20.0f, text, strlen(text));
&gt; +        
&gt; +        CGContextRestoreGState(context);        
&gt; +    }
&gt; +#endif
&gt; +
&gt; +    CGContextRestoreGState(context);
&gt; +}

I&apos;m not sure this code belongs here. WKCACFLayer is really just a C++ wrapper around CACFLayer, and, and such, it should not have anything WebKit-specific. I think you need a subclass which knows about GraphicsContexts and painting.

&gt; +void WKCACFLayer::layout()
&gt; +{
&gt; +	if (m_owner)
&gt; +		m_owner-&gt;layout();
&gt; +}

Tabs here.

&gt; +void WKCACFLayer::becomeLayerForContext(CACFContextRef context)
&gt; +{
&gt; +    CACFContextSetLayer(context, layer());
&gt; +    setNeedsCommit();
&gt; +}
&gt; +
&gt; +void WKCACFLayer::setNeedsCommit()
&gt; +{
&gt; +    WKCACFContextFlusher::shared().addContext(CACFLayerGetContext(rootLayer()-&gt;layer()));
&gt; +    if (m_owner)
&gt; +        m_owner-&gt;notifySyncRequired();
&gt; +}

notifySyncRequired() is only required if you do layer property batching.

&gt; +void WKCACFLayer::insertSublayer(PassRefPtr&lt;WKCACFLayer&gt; prpSublayer, size_t index)

prpSublayer? No Hungarian notation please. Why is it a PassRefPtr when the code immediately makes a RefPtr out of it?

&gt; +void WKCACFLayer::setSublayersByAdoptingVector(Vector&lt;RefPtr&lt;WKCACFLayer&gt; &gt;&amp; sublayers)
&gt; +{
&gt; +    checkSublayersConsistency();
&gt; +
&gt; +    if (sublayers.isEmpty()) {
&gt; +        CACFLayerSetSublayers(layer(), 0);
&gt; +        m_sublayers.clear();
&gt; +    } else {
&gt; +        // FIXME: This call to CACFLayerSetSublayers is a workaround for
&gt; +        // &lt;rdar://6199008&gt;. We can remove it once that bug is fixed.
&gt; +        CACFLayerSetSublayers(layer(), 0);
&gt; +
&gt; +        // Create a vector of CACFLayers.
&gt; +        Vector&lt;const void*&gt; layers;
&gt; +        for (size_t i = 0; i &lt; sublayers.size(); i++)
&gt; +            layers.append(sublayers[i]-&gt;layer());
&gt; +    
&gt; +        RetainPtr&lt;CFArrayRef&gt; layersArray(AdoptCF, CFArrayCreate(0, layers.data(), layers.size(), 0));
&gt; +    
&gt; +        CACFLayerSetSublayers(layer(), layersArray.get());
&gt; +    
&gt; +        m_sublayers.clear();
&gt; +        m_sublayers.swap(sublayers);
&gt; +    }
&gt; +    
&gt; +    setNeedsCommit();
&gt; +
&gt; +    checkSublayersConsistency();
&gt; +}

I don&apos;t really like how both WKCACFLayer and CACFLayer both store an array of sublayers. That means that both have to be kept in sync, and is yet another paralell tree that we have to maintain (GraphicsLayer also has one). If you can always get from a CACFLayer to a WKCACFLayer, then no extra sublayer storage is required.


&gt; +#endif // CHECK_SUBLAYERS_CONSISTENCY
&gt; +
&gt; +}
&gt; \ No newline at end of file

Fix this.

&gt; Index: WebCore/platform/graphics/win/WKCACFLayer.h
&gt; ===================================================================
&gt; --- WebCore/platform/graphics/win/WKCACFLayer.h	(revision 0)
&gt; +++ WebCore/platform/graphics/win/WKCACFLayer.h	(revision 0)
&gt; @@ -0,0 +1,255 @@
&gt; +/*
&gt; + *  WKCACFLayer.h
&gt; + *  WebKit
&gt; + *
&gt; + *  Created by Adam Roben on 6/11/08.
&gt; + *  Adapted from CoreAnimationLayer by Chris Marrin on 10/21/08.
&gt; + *  Copyright 2008 Apple Inc. All rights reserved.
&gt; + *
&gt; + */

Needs license.


&gt; +#pragma mark Conversion to CFType
&gt; +    static RetainPtr&lt;CFTypeRef&gt; cfValue(float value) { return RetainPtr&lt;CFTypeRef&gt;(AdoptCF, CFNumberCreate(0, kCFNumberFloat32Type, &amp;value)); }
&gt; +    static RetainPtr&lt;CFTypeRef&gt; cfValue(const TransformationMatrix&amp; value)
&gt; +	{
&gt; +		CATransform3D t;
&gt; +		t.m11 = value.m11(); t.m12 = value.m12(); t.m13 = value.m13(); t.m14 = value.m14(); 
&gt; +		t.m21 = value.m21(); t.m22 = value.m22(); t.m23 = value.m23(); t.m24 = value.m24(); 
&gt; +		t.m31 = value.m31(); t.m32 = value.m32(); t.m33 = value.m33(); t.m34 = value.m34(); 
&gt; +		t.m41 = value.m41(); t.m42 = value.m42(); t.m43 = value.m43(); t.m44 = value.m44(); 
&gt; +		return RetainPtr&lt;CFTypeRef&gt;(AdoptCF, CACFVectorCreateTransform(t));
&gt; +	}
&gt; +    static RetainPtr&lt;CFTypeRef&gt; cfValue(const FloatPoint&amp; value)
&gt; +	{
&gt; +		CGPoint p;
&gt; +		p.x = value.x(); p.y = value.y();
&gt; +		return RetainPtr&lt;CFTypeRef&gt;(AdoptCF, CACFVectorCreatePoint(p));
&gt; +	}
&gt; +    static RetainPtr&lt;CFTypeRef&gt; cfValue(const FloatRect&amp; rect)
&gt; +    {
&gt; +		CGRect r;
&gt; +		r.origin.x = rect.x(); r.origin.y = rect.y();
&gt; +		r.size.width = rect.width(); r.size.height = rect.height();
&gt; +		CGFloat v[4] = { CGRectGetMinX(r), CGRectGetMinY(r), CGRectGetMaxX(r), CGRectGetMaxY(r) };

Lots of tabs here.

&gt; +#pragma mark Coordinate Mapping

I don&apos;t think you should use #pragma mark in WebCore code.

&gt; +    // FIXME: Make this private once &lt;rdar://6200213&gt; is fixed and the
&gt; +    // workaround in CylindricalGridLayer.cpp has been removed.
&gt; +    void setNeedsCommit();

Comment is not relevant here.

&gt; Index: WebCore/platform/graphics/win/WKCACFLayerWindow.cpp
&gt; ===================================================================
&gt; +/*
&gt; + *  WKCACFLayerWindow.cpp
&gt; + *  WebCore
&gt; + *
&gt; + *  Created by Adam Roben on 6/24/08.
&gt; + *  Adapted from CALayerWindow by Chris Marrin on 10/21/08.
&gt; + *  Copyright 2008 Apple Inc. All rights reserved.
&gt; + *
&gt; + */

License needed.

&gt; +#include &quot;WKCACFLayerWindow.h&quot;
&gt; +
&gt; +#include &quot;WKCACFContextFlusher.h&quot;
&gt; +#include &quot;WKCACFLayer.h&quot;
&gt; +//#include &quot;DrawingUtilities.h&quot;

Remove it if it&apos;s not needed.

&gt; +// pulled from DrawingUtilities.h

Not relevant here.

&gt; +static D3DPRESENT_PARAMETERS initialPresentationParameters()
&gt; +{
&gt; +    D3DPRESENT_PARAMETERS parameters = {0};
&gt; +    parameters.Windowed = TRUE;
&gt; +    parameters.SwapEffect = D3DSWAPEFFECT_COPY;
&gt; +    parameters.BackBufferCount = 1;
&gt; +    parameters.BackBufferFormat = D3DFMT_A8R8G8B8;
&gt; +    parameters.MultiSampleType = D3DMULTISAMPLE_NONE;
&gt; +
&gt; +	return parameters;

Tab here.

&gt; +void WKCACFLayerWindow::setScrollFrame(int width, int height, int scrollX, int scrollY)
&gt; +{
&gt; +    CGRect contentsRect = bounds();
&gt; +    contentsRect.size.width = width;
&gt; +    contentsRect.size.height = height;
&gt; +    contentsRect.origin.x = scrollX;
&gt; +    contentsRect.origin.y = scrollY;

Why init the rect to bounds() and then replace every member?

&gt; +void WKCACFLayerWindow::setRootContents(CGImageRef image)
&gt; +{
&gt; +    ASSERT(m_rootLayer);
&gt; +    m_rootLayer-&gt;setContents(image);
&gt; +	renderSoon();

Tab here.

&gt; +void WKCACFLayerWindow::setRootChildLayer(WebCore::PlatformLayer* layer)
&gt; +{
&gt; +    if (!m_scrollLayer)
&gt; +        return;
&gt; +
&gt; +    m_scrollLayer-&gt;removeAllSublayers();
&gt; +    if (layer)
&gt; +	    m_scrollLayer-&gt;addSublayer(layer);

Tab here.

&gt; +	// D3D doesn&apos;t like to make back buffers for 0 size windows. We skirt this problem if we make the
&gt; +	// passed backbuffer width and height non-zero. The window will necessarily get set to a non-zero
&gt; +	// size eventually, and then the backbuffer size will get reset.
&gt; +    RECT rect;
&gt; +    GetClientRect(m_hostWindow, &amp;rect);
&gt; +
&gt; +	if (rect.left-rect.right == 0 || rect.bottom-rect.top == 0) {
&gt; +		parameters.BackBufferWidth = 1;
&gt; +		parameters.BackBufferHeight = 1;
&gt; +	}

Lots of tabs.

&gt; +    // Create the root hierarchy
&gt; +	m_rootLayer = WKCACFLayer::create(kCACFLayer);
&gt; +	m_scrollLayer = WKCACFLayer::create(kCACFLayer);

Tabs.

&gt; +void WKCACFLayerWindow::resize()
&gt; +{
&gt; +    if (!m_d3dDevice)
&gt; +        return;
&gt; +
&gt; +    resetDevice();
&gt; +
&gt; +    if (m_rootLayer) {
&gt; +        m_rootLayer-&gt;setFrame(bounds());
&gt; +
&gt; +        // FIXME: This should be the bounds inside the scrollbars
&gt; +        m_scrollLayer-&gt;setFrame(bounds());

It worries me that there&apos;s code down here that has to know about scrollbars.

&gt; +void WKCACFLayerWindow::render(const Vector&lt;CGRect&gt;&amp; dirtyRects)
&gt; +{
&gt; +    ASSERT(m_d3dDevice);
&gt; +
&gt; +    // Flush the root layer to the render tree.
&gt; +    WKCACFContextFlusher::shared().flushAllContexts();
&gt; +
&gt; +    CGRect bounds = this-&gt;bounds();
&gt; +
&gt; +    CFTimeInterval t = CACurrentMediaTime();
&gt; +
&gt; +    char space[4096];

This is very myserious. What is it for?

&gt; +    CARenderUpdate* u = CARenderUpdateBegin(space, sizeof(space), t, 0, 0, &amp;bounds);

&gt; +        /* FIXME: don&apos;t need to clear dirty region if layer tree is opaque. */

The FIXMEs need bugs filed on them. Use C++ comments, not C-style comments.

&gt; +        if (err == D3DERR_DEVICELOST) {
&gt; +            /* Lost device situation. */

Use C++ comments.

&gt; +    CARenderUpdateFinish (u);

No space before (

&gt; +void WKCACFLayerWindow::renderSoon()
&gt; +{
&gt; +    m_renderTimer.startOneShot(0);

Should this make sure the timer isn&apos;t already active?
&gt; +}
&gt; \ No newline at end of file

Fix this.

&gt; Index: WebCore/platform/graphics/win/WKCACFLayerWindow.h
&gt; ===================================================================
&gt; +/*
&gt; + *  WKCACFLayerWindow.h
&gt; + *  WebCore
&gt; + *
&gt; + *  Created by Adam Roben on 6/24/08.
&gt; + *  Adapted from CALayerWindow by Chris Marrin on 10/21/08.
&gt; + *  Copyright 2008 Apple Inc. All rights reserved.
&gt; + *
&gt; + */

Needs license.


So my main concerns here are:
1. Is it buildable by someone outside of Apple?
2. GraphicsLayerCACF should be closer to GraphicsLayerCA, and maybe share some code.
3. The extra sublayer storage by WKCACFLayer
4. WKCACFLayer knowing about WebCore stuff</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>154253</commentid>
    <comment_count>7</comment_count>
      <attachid>41072</attachid>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2009-10-12 21:42:42 -0700</bug_when>
    <thetext>Comment on attachment 41072
Second patch (hooking up accelerated compositing, but not building)

&gt; Index: WebKit/win/WebView.cpp
&gt; ===================================================================
&gt; --- WebKit/win/WebView.cpp	(revision 49310)
&gt; +++ WebKit/win/WebView.cpp	(working copy)
&gt; @@ -321,6 +321,7 @@ WebView::WebView()
&gt;  , m_lastPanY(0)
&gt;  , m_xOverpan(0)
&gt;  , m_yOverpan(0)
&gt; +, m_isAcceleratedCompositing(false)

So accelerated compositing is a property of the entire WebView, rather than a single WebDocumentView? Does it work in framesets and iframes?

&gt;  void WebView::repaint(const WebCore::IntRect&amp; windowRect, bool contentChanged, bool immediate, bool repaintContentOnly)
&gt;  {
&gt; +#if USE(ACCELERATED_COMPOSITING)
&gt; +    if (isAcceleratedCompositing())
&gt; +	    setRootLayerNeedsDisplay();
&gt; +#endif

Tab here.

&gt; +#if USE(ACCELERATED_COMPOSITING)
&gt; +    if (!isAcceleratedCompositing()) {
&gt; +#endif

I don&apos;t like hiding logic flow inside of #ifdefs. Can the common code be moved into a new method?

&gt; +#if USE(ACCELERATED_COMPOSITING)
&gt; +    } else {
&gt; +        // Get the backing store into a CGImage
&gt; +        BITMAP bitmap;
&gt; +        GetObject(m_backingStoreBitmap.get(), sizeof(bitmap), &amp;bitmap);
&gt; +        int bmSize = bitmap.bmWidthBytes * bitmap.bmHeight;
&gt; +        RetainPtr&lt;CFDataRef&gt; data(AdoptCF, 
&gt; +                                    CFDataCreateWithBytesNoCopy(
&gt; +                                            0, static_cast&lt;UInt8*&gt;(bitmap.bmBits),
&gt; +                                            bmSize, kCFAllocatorNull));
&gt; +        CGDataProviderRef cgData = CGDataProviderCreateWithCFData(data.get());
&gt; +        CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB();
&gt; +        m_backingStoreImage.adoptCF(CGImageCreate(bitmap.bmWidth, bitmap.bmHeight,
&gt; +                                         8, bitmap.bmBitsPixel, 
&gt; +                                         bitmap.bmWidthBytes, space, 
&gt; +                                         kCGBitmapByteOrder32Little | kCGImageAlphaNoneSkipFirst,
&gt; +                                         cgData, 0, false, 
&gt; +                                         kCGRenderingIntentDefault));
&gt; +
&gt; +        // Hand the CGImage to CACF for compositing
&gt; +        m_layerWindow.setRootContents(m_backingStoreImage.get());
&gt; +        m_layerWindow.setScrollFrame(frameView-&gt;layoutWidth(), frameView-&gt;layoutHeight(), 
&gt; +                                     frameView-&gt;scrollX(), frameView-&gt;scrollY());
&gt; +        CGColorSpaceRelease(space);
&gt; +        CGDataProviderRelease(cgData);
&gt; +    }

Does this blow away any repaint rect optimizations that the non-accelerated path uses?

&gt; +#if USE(ACCELERATED_COMPOSITING)
&gt; +                if (webView-&gt;isAcceleratedCompositing())
&gt; +				    webView-&gt;setRootLayerNeedsDisplay();
&gt; +#endif

Tabs here.

&gt; +#if USE(ACCELERATED_COMPOSITING)
&gt; +void WebView::setRootChildLayer(WebCore::PlatformLayer* layer)
&gt; +{
&gt; +    setAcceleratedCompositing(layer ? true : false);
&gt; +    m_layerWindow.setRootChildLayer(layer);
&gt; +}
&gt; +
&gt; +void WebView::setAcceleratedCompositing(bool accelerated)
&gt; +{
&gt; +    if (m_isAcceleratedCompositing == accelerated)
&gt; +        return;
&gt; +
&gt; +    m_isAcceleratedCompositing = accelerated;
&gt; +    if (m_isAcceleratedCompositing) {
&gt; +	    // Create the root layer
&gt; +        ASSERT(m_viewWindow);
&gt; +	    m_layerWindow.setHostWindow(m_viewWindow);
&gt; +    } else {
&gt; +        // Tear down the root layer
&gt; +        m_layerWindow.destroyRenderer();
&gt; +    }
&gt; +}

Tabs here.

&gt; Index: WebKit/win/WebView.h
&gt; ===================================================================

&gt; +#if USE(ACCELERATED_COMPOSITING)
&gt; +    void setRootLayerNeedsDisplay()
&gt; +    {
&gt; +        //m_layerWindow.setRootContents(m_backingStoreImage.get());
&gt; +        m_layerWindow.setNeedsDisplay();
&gt; +    }

Remove commented code if it&apos;s not needed.

&gt; +    void resizeLayerWindow() { m_layerWindow.resize(); }
&gt; +    void showLayerWindow() { m_layerWindow.createRenderer(); }

showLayerWindow() sounds like an imperative. It&apos;s more layerWindowBecameVisible or something.


&gt; +#if USE(ACCELERATED_COMPOSITING)
&gt; +    void setAcceleratedCompositing(bool);
&gt; +	WebCore::WKCACFLayerWindow m_layerWindow;

Tab here.

&gt; Index: WebKit/win/WebCoreSupport/WebChromeClient.cpp
&gt; ===================================================================
&gt; +#if USE(ACCELERATED_COMPOSITING)
&gt; +void WebChromeClient::attachRootGraphicsLayer(Frame* frame, GraphicsLayer* graphicsLayer)
&gt; +{
&gt; +	m_webView-&gt;setRootChildLayer(graphicsLayer ? graphicsLayer-&gt;platformLayer() : 0);

Tab here.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>154348</commentid>
    <comment_count>8</comment_count>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2009-10-13 09:06:33 -0700</bug_when>
    <thetext>Given the need to also implement WebGL (e.g., Bug 28018), I&apos;m curious if the use of Direct3D means there will be replicated codepaths to set up OpenGL scenes and Direct3D scenes under Windows.  I&apos;m not sure how often both 3D CSS and WebGL will be used together, but is there any concern about contention between the 3D stacks over the hardware resources?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>154352</commentid>
    <comment_count>9</comment_count>
    <who name="Chris Marrin">cmarrin</who>
    <bug_when>2009-10-13 09:23:18 -0700</bug_when>
    <thetext>Both OpenGL and Direct3D can handle multiple contexts without any trouble. There is always the issue of running out of resources, but that&apos;s the case in general for WebKit or any app on Windows. I don&apos;t think this implementation exacerbates that issue.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>155700</commentid>
    <comment_count>10</comment_count>
      <attachid>41073</attachid>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-10-19 08:48:44 -0700</bug_when>
    <thetext>Comment on attachment 41073
Third patch (adding files to build - off by default)

Let commit bot land it</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>155746</commentid>
    <comment_count>11</comment_count>
    <who name="Chris Marrin">cmarrin</who>
    <bug_when>2009-10-19 09:40:16 -0700</bug_when>
    <thetext>The third patch cannot be committed until the other two are. Please do not submit to the commit queue</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>163159</commentid>
    <comment_count>12</comment_count>
      <attachid>41072</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2009-11-12 18:42:27 -0800</bug_when>
    <thetext>Comment on attachment 41072
Second patch (hooking up accelerated compositing, but not building)

Instructed not to commit with queue.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>165163</commentid>
    <comment_count>13</comment_count>
    <who name="Chris Marrin">cmarrin</who>
    <bug_when>2009-11-19 17:44:44 -0800</bug_when>
    <thetext>Issues below addressed by upcoming patch:

Simon Fraser said:

&gt; So my main concerns here are:
&gt; 1. Is it buildable by someone outside of Apple?

I got rid of the private headers. And QuartzCore will be shipped as a DLL and includes

&gt; 2. GraphicsLayerCACF should be closer to GraphicsLayerCA, and maybe share some code.

We discussed this. I think we should hold off on this for a while.

&gt; 3. The extra sublayer storage by WKCACFLayer

Gone.

&gt; 4. WKCACFLayer knowing about WebCore stuff

WKCACFLayer is more like a combination of a wrapper around CACFLayer and WebLayer. In fact the code you cite is from WebLayer. I think it&apos;s overkill to split these at this point. Other than that this code is all platform legal. It does reach outside platform for anything.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>165348</commentid>
    <comment_count>14</comment_count>
    <who name="Chris Marrin">cmarrin</who>
    <bug_when>2009-11-20 10:31:42 -0800</bug_when>
    <thetext>Looking at Simon&apos;s WebView comments:

1) The iframe and frameset cases might not be handled correctly. I will do more testing after checkin

2) I tried some ways of getting rid of the &quot;if (!accelerated...)&quot; flow control inside the ifdef. But it would require function calls and passing params which would make the rendering more expensive, which I want to avoid.

3) My technique of passing the entire bitmap to CACF does not take advantage of any paint rectangle optimizations. There is currently no way to do partial updates of CACF contents. But I plan to talk to John about this (also affects video rendering)

Other than that, all comments are integrated in the upcoming patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>165969</commentid>
    <comment_count>15</comment_count>
      <attachid>43743</attachid>
    <who name="Chris Marrin">cmarrin</who>
    <bug_when>2009-11-23 17:38:12 -0800</bug_when>
    <thetext>Created attachment 43743
Replacement patch for all 3 previous patches

This is a patch for the complete implementation. Since two of the three patches were r+, I just included everything in the replacement. It makes it much easier. I&apos;ve addressed all the issues with the exception of those called out in previous posts.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>166161</commentid>
    <comment_count>16</comment_count>
    <who name="Adam Roben (:aroben)">aroben</who>
    <bug_when>2009-11-24 10:37:09 -0800</bug_when>
    <thetext>I think it would be good to set things up so that the DirectX SDK is only required if USE(ACCELERATED_COMPOSITING) is enabled. This means all DirectX #includes should be guarded by the USE() flag, and we should soft-link to d3d9.lib. (See WebCore/platform/win/SoftLinking.h for some macros to make that easier.)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>166185</commentid>
    <comment_count>17</comment_count>
      <attachid>43743</attachid>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2009-11-24 10:56:16 -0800</bug_when>
    <thetext>Comment on attachment 43743
Replacement patch for all 3 previous patches

&gt; Index: WebCore/WebCore.vcproj/WebCore.vcproj
&gt; ===================================================================

&gt;  				&lt;File
&gt; +					RelativePath=&quot;..\platform\graphics\TextRenderingMode.h&quot;
&gt; +					&gt;
&gt; +				&lt;/File&gt;
&gt; +				&lt;File
&gt;  					RelativePath=&quot;..\platform\win\WCDataObject.cpp&quot;
&gt;  					&gt;
&gt;  					&lt;FileConfiguration
&gt; @@ -22110,6 +22120,68 @@
&gt;  					&gt;
&gt;  				&lt;/File&gt;
&gt;  				&lt;File
&gt; +					RelativePath=&quot;..\WebCorePrefix.cpp&quot;
&gt; +					&gt;

Not sure why this moved around.

&gt; Index: WebCore/platform/graphics/GraphicsLayer.cpp
&gt; ===================================================================
&gt; --- WebCore/platform/graphics/GraphicsLayer.cpp	(revision 51122)
&gt; +++ WebCore/platform/graphics/GraphicsLayer.cpp	(working copy)
&gt; @@ -69,7 +69,7 @@ GraphicsLayer::GraphicsLayer(GraphicsLay
&gt;      , m_drawsContent(false)
&gt;      , m_paintingPhase(GraphicsLayerPaintAll)
&gt;      , m_geometryOrientation(CompositingCoordinatesTopDown)
&gt; -    , m_contentsOrientation(CompositingCoordinatesTopDown)
&gt; +    , m_contentsOrientation(CompositingCoordinatesBottomUp)

Why this change?

&gt; Index: WebCore/platform/graphics/win/GraphicsLayerCACF.cpp
&gt; ===================================================================

&gt; +GraphicsLayerCACF::GraphicsLayerCACF(GraphicsLayerClient* client)
&gt; +: GraphicsLayer(client)
&gt; +, m_contentsLayerPurpose(NoContentsLayer)

These should be indented.

&gt; +void GraphicsLayerCACF::removeFromParent()
&gt; +{
&gt; +    GraphicsLayer::removeFromParent();
&gt; +    layerForSuperlayer()-&gt;removeFromSuperlayer();            
&gt; +}

Why isn&apos;t this updating the parent&apos;s sublayer list?

&gt; +void GraphicsLayerCACF::setAnchorPoint(const FloatPoint3D&amp; point)
&gt; +{
&gt; +    GraphicsLayer::setAnchorPoint(point);
&gt; +
&gt; +    // set the value on the layer to the new transform

Comment makes no sense.

&gt; +    primaryLayer()-&gt;setAnchorPoint(FloatPoint(point.x(), point.y()));
&gt; +    primaryLayer()-&gt;setAnchorPointZ(m_anchorPoint.z());
&gt; +
&gt; +    // position depends on anchor point
&gt; +    setPosition(m_position);
&gt; +}
&gt; +
&gt; +void GraphicsLayerCACF::setSize(const FloatSize&amp; size)
&gt; +{
&gt; +    GraphicsLayer::setSize(size);
&gt; +
&gt; +    CGRect rect = CGRectMake(0.0f, 0.0f, m_size.width(), m_size.height());
&gt; +    
&gt; +    if (m_transformLayer) {
&gt; +        m_transformLayer-&gt;setBounds(rect);
&gt; +    
&gt; +        // the anchor of the contents layer is always at 0.5, 0.5, so the position
&gt; +        // is center-relative

Sentence-case, please.

&gt; +    bool needTiledLayer = requiresTiledLayer(m_size);
&gt; +    if (needTiledLayer != m_usingTiledLayer) {
&gt; +        swapFromOrToTiledLayer(needTiledLayer);

I think you should just remove all the tiled layer code. It&apos;s better ot just make large layers
than have layers stop working when they get big.

&gt; +    // if we&apos;ve changed the bounds, we need to recalculate the position
&gt; +    // of the layer, taking anchor point into account

Sentence-case.

&gt; +void GraphicsLayerCACF::setTransform(const TransformationMatrix&amp; t)
&gt; +{
&gt; +    GraphicsLayer::setTransform(t);
&gt; +    
&gt; +    CATransform3D transform;
&gt; +    copyTransform(transform, t);
&gt; +    primaryLayer()-&gt;setTransform(transform);
&gt; +}

This should bail if t == m_transform.

&gt; +void GraphicsLayerCACF::setChildrenTransform(const TransformationMatrix&amp; t)
&gt; +{

This should bail if t == m_childrenTransform.


&gt; +void GraphicsLayerCACF::setPreserves3D(bool preserves3D)
&gt; +{
&gt; +    GraphicsLayer::setPreserves3D(preserves3D);

Do an early return if it didn&apos;t change.

&gt; +    CGPoint point = CGPointMake(m_size.width() / 2.0f, m_size.height() / 2.0f);
&gt; +    CGPoint centerPoint = CGPointMake(0.5f, 0.5f);
&gt; +    
&gt; +    if (preserves3D &amp;&amp; !m_transformLayer) {

Rather than do all this work here, I think it would be better for future refactoring
if you stayed closer to GraphicsLayerCA, and kept the update...() functions, so here
you&apos;d call updateLayerPreserves3D().

Also, you have some tabs in this code.

&gt; +void GraphicsLayerCACF::setDrawsContent(bool inDrawsContent)
&gt; +{
&gt; +    if (inDrawsContent != m_drawsContent) {

Early return is easier to read.

&gt; +void GraphicsLayerCACF::setBackfaceVisibility(bool visible)
&gt; +{
&gt; +    if (m_backfaceVisibility == visible)
&gt; +        return;
&gt; +    
&gt; +    GraphicsLayer::setBackfaceVisibility(visible);
&gt; +    
&gt; +    m_layer-&gt;setDoubleSided(visible);
&gt; +}
&gt; +    

Extra whitespace

&gt; +void GraphicsLayerCACF::setOpacity(float opacity)
&gt; +{
&gt; +    float clampedOpacity = max(min(opacity, 1.0f), 0.0f);
&gt; +    
&gt; +    bool opacitiesDiffer = (m_opacity != clampedOpacity);

opacitiesDiffer is unused. Use the early return form.

&gt; +void GraphicsLayerCACF::updateContentsRect()

So here is one update function. Why this and not the others?

&gt; +PlatformLayer* GraphicsLayerCACF::hostLayerForSublayers() const
&gt; +{
&gt; +    return m_transformLayer ? m_transformLayer.get() : m_layer.get();
&gt; +}
&gt; +
&gt; +PlatformLayer* GraphicsLayerCACF::layerForSuperlayer() const
&gt; +{
&gt; +    if (m_transformLayer)
&gt; +        return m_transformLayer.get();
&gt; +
&gt; +    return m_layer.get();
&gt; +}

Not sure why those methods don&apos;t both use the conditional operator.

&gt; +#ifndef NDEBUG
&gt; +void GraphicsLayerCACF::setDebugBackgroundColor(const Color&amp; color)

These are no longer debug-only.

&gt; +void GraphicsLayerCACF::updateContentsTransform()
&gt; +{
&gt; +    ASSERT(contentsOrientation() == CompositingCoordinatesTopDown);

Since updateContentsTransform() is an internal method, I&apos;m not sure why this is useful.

&gt; +void GraphicsLayerCACF::setupContentsLayer(WKCACFLayer* contentsLayer)
&gt; +#ifndef NDEBUG
&gt; +        if (showDebugBorders()) {
&gt; +            setLayerBorderColor(m_contentsLayer.get(), Color(0, 0, 128, 180));
&gt; +            m_contentsLayer-&gt;setBorderWidth(1.0f);
&gt; +        }
&gt; +#endif
&gt; +    }
&gt; +#ifndef NDEBUG
&gt; +    updateDebugIndicators();
&gt; +#endif

No longer debug-only.

&gt; Index: WebCore/platform/graphics/win/GraphicsLayerCACF.h
&gt; ===================================================================

&gt; +class GraphicsLayerCACF : public GraphicsLayer {
&gt; +public:
&gt; +
&gt; +    GraphicsLayerCACF(GraphicsLayerClient*);
&gt; +    virtual ~GraphicsLayerCACF();
&gt; +
&gt; +    virtual void layout() { }

Where did layout() come from?

&gt; +#ifndef NDEBUG
&gt; +    virtual void setDebugBackgroundColor(const Color&amp;);
&gt; +    virtual void setDebugBorder(const Color&amp;, float borderWidth);
&gt; +#endif

No longer debug-only.

&gt; +    CompositingCoordinatesOrientation defaultContentsOrientation() const;
&gt; +    void updateContentsTransform();
&gt; +	void updateSublayerList();

You have tabs here.

&gt; Index: WebCore/platform/graphics/win/WKCACFContextFlusher.cpp
&gt; ===================================================================

&gt; +WKCACFContextFlusher&amp; WKCACFContextFlusher::shared()
&gt; +{
&gt; +    static WKCACFContextFlusher&amp; flusher = *new WKCACFContextFlusher;

This should use the DEFINE_STATIC_LOCAL macro.

&gt; +void WKCACFContextFlusher::addContext(CACFContextRef context)
&gt; +{
&gt; +    if (!context)
&gt; +        return;

Or ASSERT, perhaps?

&gt; +
&gt; +    if (m_contexts.add(context).second)
&gt; +        CFRetain(context);

This is pretty confusing. What is add().second testing?

&gt; +void WKCACFContextFlusher::removeContext(CACFContextRef context)
&gt; +{
&gt; +    if (!context)
&gt; +        return;
&gt; +
&gt; +    ContextSet::iterator found = m_contexts.find(context);
&gt; +    if (found == m_contexts.end())
&gt; +        return;
&gt; +
&gt; +    CFRelease(*found);
&gt; +    m_contexts.remove(found);
&gt; +}

Do calls to addContext() and removeContext() with the same context properly nest?
This seems like fragile code.

&gt; Index: WebCore/platform/graphics/win/WKCACFContextFlusherWin.cpp
&gt; ===================================================================

&gt; +void WKCACFContextFlusher::didFlushContext(CACFContextRef context)
&gt; +{
&gt; +    WKCACFLayerWindow::didFlushContext(context);
&gt; +}

Since WKCACFContextFlusher will probably only ever be used on Windows,
I don&apos;t see the benefit of slicing this part into a separate file.

&gt; Index: WebCore/platform/graphics/win/WKCACFLayer.cpp
&gt; ===================================================================

&gt; +void WKCACFLayer::display(PlatformGraphicsContext* context)

&gt; +#ifndef NDEBUG

No longer debug-only.

&gt; +void WKCACFLayer::layout()
&gt; +{
&gt; +    if (m_owner)
&gt; +        m_owner-&gt;layout();
&gt; +}

GraphicsLayers have no notion of layout. I think this should just be a stub.

&gt; +void WKCACFLayer::becomeLayerForContext(CACFContextRef context)
&gt; +{
&gt; +    CACFContextSetLayer(context, layer());
&gt; +    setNeedsCommit();
&gt; +}

I&apos;ve no idea what this means. Does it make this layer the root layer for that context,
or something else? It needs a comment, and a better name.

&gt; +CGPoint WKCACFLayer::convertPoint(const CGPoint&amp; p, const WKCACFLayer* toLayer) const
&gt; +{
&gt; +    CGPoint convertedPoint = p;
&gt; +    CACFLayerConvertPoint(layer(), toLayer ? toLayer-&gt;layer() : 0, &amp;convertedPoint);
&gt; +    return convertedPoint;
&gt; +}
&gt; +
&gt; +CGRect WKCACFLayer::convertRect(const CGRect&amp; r, const WKCACFLayer* toLayer) const
&gt; +{
&gt; +    CGRect convertedRect = r;
&gt; +    CACFLayerConvertRect(layer(), toLayer ? toLayer-&gt;layer() : 0, &amp;convertedRect);
&gt; +    return convertedRect;
&gt; +}

I don&apos;t think we&apos;ll ever need these.

&gt; +bool WKCACFLayer::isDescendantOf(WKCACFLayer* ancestor) const

Will return true when called with itself. That should be more explicit in a comment
or in the method name.

&gt; +void WKCACFLayer::replaceSublayer(WKCACFLayer* reference, PassRefPtr&lt;WKCACFLayer&gt; newLayer)
&gt; +{
&gt; +    //RefPtr&lt;WKCACFLayer&gt; newLayerRef = newLayer;

Don&apos;t check in commented code.

&gt; +void WKCACFLayer::removeFromSuperlayer()
&gt; +{
&gt; +    WKCACFLayer* superlayer = this-&gt;superlayer();
&gt; +    if (!superlayer)
&gt; +        return;
&gt; +
&gt; +    superlayer-&gt;removeSublayer(this);
&gt; +    CACFLayerRemoveFromSuperlayer(layer());
&gt; +    setNeedsCommit();
&gt; +}

Why is setNeedsCommit() called on this, and not on the superlayer?

&gt; +WKCACFLayer* WKCACFLayer::ancestorOrSelfWithSuperlayer(WKCACFLayer* superlayer) const

Is this used in a way that isDescendantOf() would not work for?

&gt; +void WKCACFLayer::removeAllSublayers()
&gt; +{
&gt; +    CACFLayerSetSublayers(layer(), 0);
&gt; +}

I don&apos;t grok why setNeedsCommit() isn&apos;t needed here either.

&gt; +void WKCACFLayer::setSublayers(Vector&lt;RefPtr&lt;WKCACFLayer&gt; &gt;&amp; sublayers)

Can that parameter be const?

&gt; +{
&gt; +    if (sublayers.isEmpty())
&gt; +        CACFLayerSetSublayers(layer(), 0);
&gt; +    else {
&gt; +        // Create a vector of CACFLayers.
&gt; +        Vector&lt;const void*&gt; layers;
&gt; +        for (size_t i = 0; i &lt; sublayers.size(); i++)
&gt; +            layers.append(sublayers[i]-&gt;layer());
&gt; +    
&gt; +        RetainPtr&lt;CFArrayRef&gt; layersArray(AdoptCF, CFArrayCreate(0, layers.data(), layers.size(), 0));
&gt; +        CACFLayerSetSublayers(layer(), layersArray.get());

Does this work? Does CACFLayerSetSublayers() just copy out of the array and do its own retaining, or is it just
taking ownership of the array? If the latter, then the array members are not being retained.

&gt; +void WKCACFLayer::moveSublayers(WKCACFLayer* fromLayer, WKCACFLayer* toLayer)
&gt; +{
&gt; +    if (!fromLayer || !toLayer)
&gt; +        return;
&gt; +
&gt; +    CACFLayerSetSublayers(toLayer-&gt;layer(), CACFLayerGetSublayers(fromLayer-&gt;layer()));

Why no setNeedsCommit()?

&gt; +void WKCACFLayer::print()
&gt; +{
&gt; +    //CARenderShow(CACFLayerCopyRenderValue(layer()));
&gt; +}

Why commented out?

&gt; Index: WebCore/platform/graphics/win/WKCACFLayer.h
&gt; ===================================================================

&gt; +    void becomeLayerForContext(CACFContextRef);

This needs a comment explaining what it means.

&gt; +    using RefCounted&lt;WKCACFLayer&gt;::ref;
&gt; +    using RefCounted&lt;WKCACFLayer&gt;::deref;

Are these still required?

&gt; +    CGPoint anchorPoint() { return CACFLayerGetAnchorPoint(layer()); }

&gt; +    CGFloat anchorPointZ() { return CACFLayerGetAnchorPointZ(layer()); }

&gt; +    CFStringRef contentsGravity() { return CACFLayerGetContentsGravity(layer()); }

These should all be const.

&gt; +    void setNeedsDisplay(const CGRect&amp; dirtyRect)
&gt; +    {
&gt; +        if (m_owner)
&gt; +            CACFLayerSetNeedsDisplay(layer(), &amp;dirtyRect);
&gt; +        setNeedsCommit();
&gt; +    }
&gt; +
&gt; +    void setNeedsDisplay()
&gt; +    {
&gt; +        if (m_owner)
&gt; +            CACFLayerSetNeedsDisplay(layer(), 0);
&gt; +        setNeedsCommit();
&gt; +    }

I don&apos;t think these should be inline. I&apos;d prefer to see all the calls to setNeedsCommit() in the .cpp file.

&gt; +    void setOpacity(float opacity)
&gt; +    {
&gt; +        CACFLayerSetOpacity(layer(), opacity);
&gt; +        setNeedsCommit();
&gt; +    }

Ditto.

&gt; +    void setSublayers(Vector&lt;RefPtr&lt;WKCACFLayer&gt; &gt;&amp;);

const Vector?

&gt; +    int findSublayer(const WKCACFLayer*);

Badly named. What is the return value? Should be const.

&gt; Index: WebCore/platform/graphics/win/WKCACFLayerWindow.cpp
&gt; ===================================================================

&gt; +inline static CGRect winRectToCGRect(RECT rc)
&gt; +{
&gt; +    return CGRectMake((float)rc.left, (float)rc.top, (float)(rc.right - rc.left), (float)(rc.bottom - rc.top));

Use static_cast?

&gt; +inline static CGRect winRectToCGRect(RECT rc, RECT relativeToRect)
&gt; +{
&gt; +    return CGRectMake((float)rc.left, (float)(relativeToRect.bottom-rc.bottom), (float)(rc.right - rc.left), (float)(rc.bottom - rc.top));

Ditto.

&gt; +static ContextToWindowMap&amp; windowsForContexts()
&gt; +{
&gt; +    static ContextToWindowMap&amp; map = *new ContextToWindowMap;
&gt; +    return map;

Use DEFINE_STATIC_LOCAL.

&gt; +WKCACFLayerWindow::WKCACFLayerWindow()
&gt; +    : m_triedToCreateD3DRenderer(false)
&gt; +    , m_renderContext(0)
&gt; +    , m_renderer(0)
&gt; +    , m_hostWindow(0)
&gt; +    , m_renderTimer(this, &amp;WKCACFLayerWindow::renderTimerFired)
&gt; +    , m_scrollFrameWidth(1)
&gt; +    , m_scrollFrameHeight(1)

Are those reasonable defaults for m_scrollFrameWidth and m_scrollFrameHeight?

&gt; +void WKCACFLayerWindow::createRenderer()

&gt; +    CGColorRef debugColor = createCGColor(Color(255, 0, 0, 204));
&gt; +    m_rootLayer-&gt;setBackgroundColor(debugColor);
&gt; +    CGColorRelease(debugColor);

Do you really always want to do this?

&gt; +void WKCACFLayerWindow::createRenderer()

&gt; +    D3DXMATRIXA16 projection;
&gt; +    D3DXMatrixOrthoOffCenterRH(&amp;projection, rect.left, rect.right, rect.top, rect.bottom, -1.0f, 1.0f);

Why isn&apos;t this done with a call to initD3DGeometry() or resetDevice()?

&gt; Index: WebCore/platform/graphics/win/WKCACFLayerWindow.h
&gt; ===================================================================

This needs some comments explaining what it does, its lifetime, how many there are etc.

&gt; +class WKCACFLayerWindow : Noncopyable {

Should be public Noncopyable.

&gt; Index: WebKit/win/WebView.cpp
&gt; ===================================================================

&gt; +void WebView::setAcceleratedCompositing(bool accelerated)
&gt; +{
&gt; +    if (m_isAcceleratedCompositing == accelerated)
&gt; +        return;
&gt; +
&gt; +    m_isAcceleratedCompositing = accelerated;
&gt; +    if (m_isAcceleratedCompositing) {
&gt; +        // Create the root layer
&gt; +        ASSERT(m_viewWindow);
&gt; +        m_layerWindow.setHostWindow(m_viewWindow);
&gt; +        setRootLayerContents();
&gt; +    } else {
&gt; +        // Tear down the root layer
&gt; +        m_layerWindow.destroyRenderer();
&gt; +    }
&gt; +
&gt; +    //invalidateBackingStore(0);
&gt; +    //::UpdateWindow(m_viewWindow);
&gt; +    paint(0, 0);

Should not commit commented code.

&gt; +}
&gt; +
&gt; +void WebView::setRootLayerContents()

It&apos;s weird having a set() method with no parameters. Maybe updateRootLayerContents()?


&gt; +    RetainPtr&lt;CFDataRef&gt; data(AdoptCF, 
&gt; +                                CFDataCreateWithBytesNoCopy(
&gt; +                                        0, static_cast&lt;UInt8*&gt;(bitmap.bmBits),
&gt; +                                        bmSize, kCFAllocatorNull));

&gt; +    CGDataProviderRef cgData = CGDataProviderCreateWithCFData(data.get());
&gt; +    CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB();

Would be good to use RetainPtr consistently here, for these two.

&gt; Index: WebKit/win/WebCoreSupport/WebChromeClient.cpp
&gt; ===================================================================

&gt; +void WebChromeClient::attachRootGraphicsLayer(Frame* frame, GraphicsLayer* graphicsLayer)
&gt; +{
&gt; +	m_webView-&gt;setRootChildLayer(graphicsLayer ? graphicsLayer-&gt;platformLayer() : 0);

Tab here.

&gt; Index: WebKit/win/WebKit.vcproj/WebKit.vcproj
&gt; ===================================================================

&gt;  			&lt;/File&gt;
&gt;  			&lt;File
&gt; -				RelativePath=&quot;..\WebScriptWorld.h&quot;
&gt; -				&gt;
&gt; -			&lt;/File&gt;
&gt; -			&lt;File
&gt;  				RelativePath=&quot;..\WebKitStatistics.h&quot;
&gt;  				&gt;
&gt;  			&lt;/File&gt;
&gt; @@ -794,6 +790,10 @@
&gt;  				&gt;
&gt;  			&lt;/File&gt;
&gt;  			&lt;File
&gt; +				RelativePath=&quot;..\WebScriptWorld.h&quot;
&gt; +				&gt;
&gt; +			&lt;/File&gt;
&gt; +			&lt;File
&gt;  				RelativePath=&quot;..\WebScrollBar.h&quot;
&gt;  				&gt;
&gt;  			&lt;/File&gt;
&gt; @@ -1094,10 +1094,6 @@
&gt;  				&gt;
&gt;  			&lt;/File&gt;
&gt;  			&lt;File
&gt; -				RelativePath=&quot;..\WebScriptWorld.cpp&quot;
&gt; -				&gt;
&gt; -			&lt;/File&gt;
&gt; -			&lt;File
&gt;  				RelativePath=&quot;..\WebKitStatistics.cpp&quot;
&gt;  				&gt;
&gt;  			&lt;/File&gt;
&gt; @@ -1130,6 +1126,10 @@
&gt;  				&gt;
&gt;  			&lt;/File&gt;
&gt;  			&lt;File
&gt; +				RelativePath=&quot;..\WebScriptWorld.cpp&quot;
&gt; +				&gt;
&gt; +			&lt;/File&gt;
&gt; +			&lt;File
&gt;  				RelativePath=&quot;..\WebScrollBar.cpp&quot;
&gt;  				&gt;
&gt;  			&lt;/File&gt;

Maybe edit out thes unwanted changes.

&gt; Index: WebKitTools/Scripts/webkitdirs.pm
&gt; ===================================================================
&gt; --- WebKitTools/Scripts/webkitdirs.pm	(revision 51122)
&gt; +++ WebKitTools/Scripts/webkitdirs.pm	(working copy)
&gt; @@ -647,7 +647,8 @@ sub checkWebCoreSVGSupport
&gt;  
&gt;  sub hasAcceleratedCompositingSupport
&gt;  {
&gt; -    return 0 if isCygwin() || isQt();
&gt; +	# On platforms other than Mac the Skipped files are used to skip compositing tests
&gt; +    return 1 if !isAppleMacWebKit();

Tabs here.

&gt;      my $path = shift;
&gt;      return libraryContainsSymbol($path, &quot;GraphicsLayer&quot;);
&gt; @@ -667,7 +668,8 @@ sub checkWebCoreAcceleratedCompositingSu
&gt;  
&gt;  sub has3DRenderingSupport
&gt;  {
&gt; -    return 0 if isQt();
&gt; +	# On platforms other than Mac the Skipped files are used to skip 3D tests
&gt; +    return 1 if !isAppleMacWebKit();

Tabs here

r=me with all those changes addressed, but I would prefer that GraphicsLayerCACF stays closer to GraphicsLayerCA.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>166186</commentid>
    <comment_count>18</comment_count>
      <attachid>43743</attachid>
    <who name="Adam Roben (:aroben)">aroben</who>
    <bug_when>2009-11-24 11:08:57 -0800</bug_when>
    <thetext>Comment on attachment 43743
Replacement patch for all 3 previous patches

Having one IDirect3DDevice9 and one CARenderOGLContext per window will bloat
memory. You can have a single instance of each for all WebViews.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>166227</commentid>
    <comment_count>19</comment_count>
      <attachid>43743</attachid>
    <who name="Adam Roben (:aroben)">aroben</who>
    <bug_when>2009-11-24 12:08:22 -0800</bug_when>
    <thetext>Comment on attachment 43743
Replacement patch for all 3 previous patches

WKCACFLayerWindow is kind of a confusing name, since it doesn&apos;t own or represent a window. It&apos;s more like the layer-related aspects of WebView.

It looks like you aren&apos;t going through WKCACFLayerWindow::render in response to receiving a WM_PAINT message in WebView. This can lead to garbage pixels being displayed in the WebView (e.g., when dragging another window around in front of the WebView).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>166236</commentid>
    <comment_count>20</comment_count>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2009-11-24 12:18:15 -0800</bug_when>
    <thetext>Would WKCACFLayerWindow be better as WKCACFLayerRenderer?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>166335</commentid>
    <comment_count>21</comment_count>
    <who name="Chris Marrin">cmarrin</who>
    <bug_when>2009-11-24 19:01:24 -0800</bug_when>
    <thetext>I&apos;ve addressed all the issues raised by Simon and Adam, with some exceptions:

1) Framesets are not handled properly
(https://bugs.webkit.org/show_bug.cgi?id=31837)

2) There is extra glop in the vcproj files, from odd file movement I didn&apos;t do.
I fear trying to avoid this by editing the vcproj file!

3) the add/remove matching issue in WKCACFContextFlusher is copied from Adam&apos;s
version. When we unify this will be better handled.

4) I&apos;ve asked John about whether or not CACFLayerSetSublayers retains the
CACFLayers passed to it.

5) I don&apos;t understand Simon&apos;s question about D3DXMatrixOrthoOffCenterRH (&quot;Why
isn&apos;t this done with a call to initD3DGeometry() or resetDevice()?&quot;). This call
is also made in the two calls mentioned. Again, this will all be resolved when
we use common code for my and Adam&apos;s implementations.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>166345</commentid>
    <comment_count>22</comment_count>
    <who name="Chris Marrin">cmarrin</who>
    <bug_when>2009-11-24 20:31:14 -0800</bug_when>
    <thetext>Landed in http://trac.webkit.org/changeset/51371</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>41071</attachid>
            <date>2009-10-12 17:37:43 -0700</date>
            <delta_ts>2009-11-23 17:38:12 -0800</delta_ts>
            <desc>First patch (new files)</desc>
            <filename>accel-newfiles.patch.txt</filename>
            <type>text/plain</type>
            <size>75100</size>
            <attacher name="Chris Marrin">cmarrin</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotLS0gV2ViQ29yZS9DaGFuZ2VM
b2cJKHJldmlzaW9uIDQ5NDg0KQ0KKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkp
DQpAQCAtMSwzICsxLDIxNCBAQA0KKzIwMDktMTAtMTIgIENocmlzIE1hcnJpbiAgPGNtYXJyaW5A
YXBwbGUuY29tPg0KKw0KKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuDQorDQor
ICAgICAgICBOZXcgZmlsZXMgZm9yIGFjY2VsZXJhdGVkIGNvbXBvc2l0aW5nIG9uIFdpbmRvd3MN
CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yNzMxNA0K
Kw0KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW4vR3JhcGhpY3NMYXllckNBQ0YuY3Bw
OiBBZGRlZC4NCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0dyYXBoaWNzTGF5ZXJD
QUNGLmg6IEFkZGVkLg0KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW4vV0tDQUNGQ29u
dGV4dEZsdXNoZXIuY3BwOiBBZGRlZC4NCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2lu
L1dLQ0FDRkNvbnRleHRGbHVzaGVyLmg6IEFkZGVkLg0KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFw
aGljcy93aW4vV0tDQUNGQ29udGV4dEZsdXNoZXJXaW4uY3BwOiBBZGRlZC4NCisgICAgICAgICog
cGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1dLQ0FDRkxheWVyLmNwcDogQWRkZWQuDQorICAgICAgICAq
IHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9XS0NBQ0ZMYXllci5oOiBBZGRlZC4NCisgICAgICAgICog
cGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1dLQ0FDRkxheWVyV2luZG93LmNwcDogQWRkZWQuDQorICAg
ICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9XS0NBQ0ZMYXllcldpbmRvdy5oOiBBZGRlZC4N
CisNCiAyMDA5LTEwLTEyICBEYW4gQmVybnN0ZWluICA8bWl0ekBhcHBsZS5jb20+DQogDQogICAg
ICAgICBSZXZpZXdlZCBieSBTaW1vbiBGcmFzZXIuDQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy93aW4vR3JhcGhpY3NMYXllckNBQ0YuY3BwDQo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotLS0gV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vR3JhcGhpY3NMYXllckNBQ0YuY3BwCShyZXZpc2lvbiAw
KQ0KKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0dyYXBoaWNzTGF5ZXJDQUNGLmNw
cAkocmV2aXNpb24gMCkNCkBAIC0wLDAgKzEsNzM4IEBADQorLyoNCisgKiBDb3B5cmlnaHQgKEMp
IDIwMDkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKyAqDQorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
DQorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zDQorICogYXJlIG1ldDoNCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4N
CisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodA0KKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUNCisgKiAgICBkb2N1bWVudGF0aW9u
IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLg0K
KyAqDQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMn
JyBBTkQgQU5ZDQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUNCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVINCisgKiBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1INCisg
KiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwNCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sDQorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SDQorICogUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRI
RU9SWQ0KKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVA0KKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KKyAqIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIA0KKyAqLw0K
Kw0KKyNpbmNsdWRlICJjb25maWcuaCINCisNCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lU
SU5HKQ0KKw0KKyNpbmNsdWRlICJHcmFwaGljc0xheWVyQ0FDRi5oIg0KKw0KKyNpbmNsdWRlICJD
U3RyaW5nLmgiDQorI2luY2x1ZGUgIkZsb2F0Q29udmVyc2lvbi5oIg0KKyNpbmNsdWRlICJGbG9h
dFJlY3QuaCINCisjaW5jbHVkZSAiSW1hZ2UuaCINCisjaW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcu
aCINCisjaW5jbHVkZSAiU3lzdGVtVGltZS5oIg0KKyNpbmNsdWRlICJXS0NBQ0ZMYXllci5oIg0K
KyNpbmNsdWRlIDx3dGYvQ3VycmVudFRpbWUuaD4NCisjaW5jbHVkZSA8d3RmL1N0cmluZ0V4dHJh
cy5oPg0KKw0KK3VzaW5nIG5hbWVzcGFjZSBzdGQ7DQorDQorbmFtZXNwYWNlIFdlYkNvcmUgew0K
Kw0KKy8vIFRoZSB0aHJlc2hvbGQgd2lkdGggb3IgaGVpZ2h0IGFib3ZlIHdoaWNoIGEgdGlsZWQg
bGF5ZXIgd2lsbCBiZSB1c2VkLiBUaGlzIHNob3VsZCBiZQ0KKy8vIGxhcmdlIGVub3VnaCB0byBh
dm9pZCB0aWxlZCBsYXllcnMgZm9yIG1vc3QgR3JhcGhpY3NMYXllcnMsIGJ1dCBsZXNzIHRoYW4g
dGhlIE9wZW5HTA0KKy8vIHRleHR1cmUgc2l6ZSBsaW1pdCBvbiBhbGwgc3VwcG9ydGVkIGhhcmR3
YXJlLg0KK3N0YXRpYyBjb25zdCBpbnQgY01heFBpeGVsRGltZW5zaW9uID0gMjAwMDsNCisNCisv
LyBUaGUgd2lkdGggYW5kIGhlaWdodCBvZiBhIHNpbmdsZSB0aWxlIGluIGEgdGlsZWQgbGF5ZXIu
IFNob3VsZCBiZSBsYXJnZSBlbm91Z2ggdG8NCisvLyBhdm9pZCBsb3RzIG9mIHNtYWxsIHRpbGVz
IChhbmQgdGhlcmVmb3JlIGxvdHMgb2YgZHJhd2luZyBjYWxsYmFja3MpLCBidXQgc21hbGwgZW5v
dWdoDQorLy8gdG8ga2VlcCB0aGUgb3ZlcmFsbCB0aWxlIGNvc3QgbG93Lg0KK3N0YXRpYyBjb25z
dCBpbnQgY1RpbGVkTGF5ZXJUaWxlU2l6ZSA9IDUxMjsNCisNCisvLyBJZiB3ZSBzZW5kIGEgZHVy
YXRpb24gb2YgMCB0byBDQSwgdGhlbiBpdCB3aWxsIHVzZSB0aGUgZGVmYXVsdCBkdXJhdGlvbg0K
Ky8vIG9mIDI1MG1zLiBTbyBzZW5kIGEgdmVyeSBzbWFsbCB2YWx1ZSBpbnN0ZWFkLg0KK3N0YXRp
YyBjb25zdCBmbG9hdCBjQW5pbWF0aW9uQWxtb3N0WmVyb0R1cmF0aW9uID0gMWUtM2Y7DQorDQor
Ly8gQ0FDdXJyZW50TWVkaWFUaW1lKCkgaXMgYSB0aW1lIHNpbmNlIGJvb3QuIFRoZXNlIG1ldGhv
ZHMgY29udmVydCBiZXR3ZWVuIHRoYXQgYW5kDQorLy8gV2ViQ29yZSB0aW1lLCB3aGljaCBpcyBz
eXN0ZW0gdGltZSAoVVRDKS4NCitzdGF0aWMgQ0ZUaW1lSW50ZXJ2YWwgY3VycmVudFRpbWVUb01l
ZGlhVGltZShkb3VibGUgdCkNCit7DQorICAgIHJldHVybiBDQUN1cnJlbnRNZWRpYVRpbWUoKSAr
IHQgLSBXVEY6OmN1cnJlbnRUaW1lKCk7DQorfQ0KKw0KK3N0YXRpYyBkb3VibGUgbWVkaWFUaW1l
VG9DdXJyZW50VGltZShDRlRpbWVJbnRlcnZhbCB0KQ0KK3sNCisgICAgcmV0dXJuIFdURjo6Y3Vy
cmVudFRpbWUoKSArIHQgLSBDQUN1cnJlbnRNZWRpYVRpbWUoKTsNCit9DQorDQorfSAvLyBuYW1l
c3BhY2UgV2ViQ29yZQ0KKw0KK25hbWVzcGFjZSBXZWJDb3JlIHsNCisNCitzdGF0aWMgaW5saW5l
IHZvaWQgY29weVRyYW5zZm9ybShDQVRyYW5zZm9ybTNEJiB0b1QzRCwgY29uc3QgVHJhbnNmb3Jt
YXRpb25NYXRyaXgmIHQpDQorew0KKyAgICB0b1QzRC5tMTEgPSBuYXJyb3dQcmVjaXNpb25Ub0Zs
b2F0KHQubTExKCkpOw0KKyAgICB0b1QzRC5tMTIgPSBuYXJyb3dQcmVjaXNpb25Ub0Zsb2F0KHQu
bTEyKCkpOw0KKyAgICB0b1QzRC5tMTMgPSBuYXJyb3dQcmVjaXNpb25Ub0Zsb2F0KHQubTEzKCkp
Ow0KKyAgICB0b1QzRC5tMTQgPSBuYXJyb3dQcmVjaXNpb25Ub0Zsb2F0KHQubTE0KCkpOw0KKyAg
ICB0b1QzRC5tMjEgPSBuYXJyb3dQcmVjaXNpb25Ub0Zsb2F0KHQubTIxKCkpOw0KKyAgICB0b1Qz
RC5tMjIgPSBuYXJyb3dQcmVjaXNpb25Ub0Zsb2F0KHQubTIyKCkpOw0KKyAgICB0b1QzRC5tMjMg
PSBuYXJyb3dQcmVjaXNpb25Ub0Zsb2F0KHQubTIzKCkpOw0KKyAgICB0b1QzRC5tMjQgPSBuYXJy
b3dQcmVjaXNpb25Ub0Zsb2F0KHQubTI0KCkpOw0KKyAgICB0b1QzRC5tMzEgPSBuYXJyb3dQcmVj
aXNpb25Ub0Zsb2F0KHQubTMxKCkpOw0KKyAgICB0b1QzRC5tMzIgPSBuYXJyb3dQcmVjaXNpb25U
b0Zsb2F0KHQubTMyKCkpOw0KKyAgICB0b1QzRC5tMzMgPSBuYXJyb3dQcmVjaXNpb25Ub0Zsb2F0
KHQubTMzKCkpOw0KKyAgICB0b1QzRC5tMzQgPSBuYXJyb3dQcmVjaXNpb25Ub0Zsb2F0KHQubTM0
KCkpOw0KKyAgICB0b1QzRC5tNDEgPSBuYXJyb3dQcmVjaXNpb25Ub0Zsb2F0KHQubTQxKCkpOw0K
KyAgICB0b1QzRC5tNDIgPSBuYXJyb3dQcmVjaXNpb25Ub0Zsb2F0KHQubTQyKCkpOw0KKyAgICB0
b1QzRC5tNDMgPSBuYXJyb3dQcmVjaXNpb25Ub0Zsb2F0KHQubTQzKCkpOw0KKyAgICB0b1QzRC5t
NDQgPSBuYXJyb3dQcmVjaXNpb25Ub0Zsb2F0KHQubTQ0KCkpOw0KK30NCisNCitUcmFuc2Zvcm1h
dGlvbk1hdHJpeCBDQVRvVHJhbnNmb3JtM0QoY29uc3QgQ0FUcmFuc2Zvcm0zRCYgZnJvbVQzRCkN
Cit7DQorICAgIHJldHVybiBUcmFuc2Zvcm1hdGlvbk1hdHJpeCgNCisgICAgICAgIGZyb21UM0Qu
bTExLA0KKyAgICAgICAgZnJvbVQzRC5tMTIsDQorICAgICAgICBmcm9tVDNELm0xMywNCisgICAg
ICAgIGZyb21UM0QubTE0LA0KKyAgICAgICAgZnJvbVQzRC5tMjEsDQorICAgICAgICBmcm9tVDNE
Lm0yMiwNCisgICAgICAgIGZyb21UM0QubTIzLA0KKyAgICAgICAgZnJvbVQzRC5tMjQsDQorICAg
ICAgICBmcm9tVDNELm0zMSwNCisgICAgICAgIGZyb21UM0QubTMyLA0KKyAgICAgICAgZnJvbVQz
RC5tMzMsDQorICAgICAgICBmcm9tVDNELm0zNCwNCisgICAgICAgIGZyb21UM0QubTQxLA0KKyAg
ICAgICAgZnJvbVQzRC5tNDIsDQorICAgICAgICBmcm9tVDNELm00MywNCisgICAgICAgIGZyb21U
M0QubTQ0KTsNCit9DQorDQorI2lmbmRlZiBOREVCVUcNCitzdGF0aWMgdm9pZCBzZXRMYXllckJv
cmRlckNvbG9yKFdLQ0FDRkxheWVyKiBsYXllciwgY29uc3QgQ29sb3ImIGNvbG9yKQ0KK3sNCisg
ICAgQ0dDb2xvclJlZiBib3JkZXJDb2xvciA9IGNyZWF0ZUNHQ29sb3IoY29sb3IpOw0KKyAgICBs
YXllci0+c2V0Qm9yZGVyQ29sb3IoYm9yZGVyQ29sb3IpOw0KKyAgICBDR0NvbG9yUmVsZWFzZShi
b3JkZXJDb2xvcik7DQorfQ0KKw0KK3N0YXRpYyB2b2lkIGNsZWFyQm9yZGVyQ29sb3IoV0tDQUNG
TGF5ZXIqIGxheWVyKQ0KK3sNCisgICAgbGF5ZXItPnNldEJvcmRlckNvbG9yKDApOw0KK30NCisj
ZW5kaWYNCisNCitzdGF0aWMgdm9pZCBzZXRMYXllckJhY2tncm91bmRDb2xvcihXS0NBQ0ZMYXll
ciogbGF5ZXIsIGNvbnN0IENvbG9yJiBjb2xvcikNCit7DQorICAgIENHQ29sb3JSZWYgYmdDb2xv
ciA9IGNyZWF0ZUNHQ29sb3IoY29sb3IpOw0KKyAgICBsYXllci0+c2V0QmFja2dyb3VuZENvbG9y
KGJnQ29sb3IpOw0KKyAgICBDR0NvbG9yUmVsZWFzZShiZ0NvbG9yKTsNCit9DQorDQorc3RhdGlj
IHZvaWQgY2xlYXJMYXllckJhY2tncm91bmRDb2xvcihXS0NBQ0ZMYXllciogbGF5ZXIpDQorew0K
KyAgICBsYXllci0+c2V0QmFja2dyb3VuZENvbG9yKDApOw0KK30NCisNCitHcmFwaGljc0xheWVy
OjpDb21wb3NpdGluZ0Nvb3JkaW5hdGVzT3JpZW50YXRpb24gR3JhcGhpY3NMYXllcjo6Y29tcG9z
aXRpbmdDb29yZGluYXRlc09yaWVudGF0aW9uKCkNCit7DQorICAgIHJldHVybiBDb21wb3NpdGlu
Z0Nvb3JkaW5hdGVzQm90dG9tVXA7DQorfQ0KKw0KKyNpZm5kZWYgTkRFQlVHDQorYm9vbCBHcmFw
aGljc0xheWVyOjpzaG93RGVidWdCb3JkZXJzKCkNCit7DQorICAgIHN0YXRpYyBib29sIHNob3dE
ZWJ1Z0JvcmRlcnMgPSBmYWxzZTsgLy9bW05TVXNlckRlZmF1bHRzIHN0YW5kYXJkVXNlckRlZmF1
bHRzXSBib29sRm9yS2V5OkAiV2ViQ29yZUxheWVyQm9yZGVycyJdOw0KKyAgICByZXR1cm4gc2hv
d0RlYnVnQm9yZGVyczsNCit9DQorDQorYm9vbCBHcmFwaGljc0xheWVyOjpzaG93UmVwYWludENv
dW50ZXIoKQ0KK3sNCisgICAgc3RhdGljIGJvb2wgc2hvd1JlcGFpbnRDb3VudGVyID0gZmFsc2U7
IC8vW1tOU1VzZXJEZWZhdWx0cyBzdGFuZGFyZFVzZXJEZWZhdWx0c10gYm9vbEZvcktleTpAIldl
YkNvcmVMYXllclJlcGFpbnRDb3VudGVyIl07DQorICAgIHJldHVybiBzaG93UmVwYWludENvdW50
ZXI7DQorfQ0KKyNlbmRpZg0KKw0KK1Bhc3NPd25QdHI8R3JhcGhpY3NMYXllcj4gR3JhcGhpY3NM
YXllcjo6Y3JlYXRlKEdyYXBoaWNzTGF5ZXJDbGllbnQqIGNsaWVudCkNCit7DQorICAgIHJldHVy
biBuZXcgR3JhcGhpY3NMYXllckNBQ0YoY2xpZW50KTsNCit9DQorDQorR3JhcGhpY3NMYXllckNB
Q0Y6OkdyYXBoaWNzTGF5ZXJDQUNGKEdyYXBoaWNzTGF5ZXJDbGllbnQqIGNsaWVudCkNCis6IEdy
YXBoaWNzTGF5ZXIoY2xpZW50KQ0KKywgbV9jb250ZW50c0xheWVyUHVycG9zZShOb0NvbnRlbnRz
TGF5ZXIpDQorew0KKyAgICBtX2xheWVyID0gV0tDQUNGTGF5ZXI6OmNyZWF0ZShrQ0FDRkxheWVy
LCB0aGlzKTsNCisgICAgDQorI2lmbmRlZiBOREVCVUcNCisgICAgdXBkYXRlRGVidWdJbmRpY2F0
b3JzKCk7DQorI2VuZGlmDQorfQ0KKw0KK0dyYXBoaWNzTGF5ZXJDQUNGOjp+R3JhcGhpY3NMYXll
ckNBQ0YoKQ0KK3sNCisgICAgLy8gY2xlYW4gdXAgdGhlIFdLIGxheWVyDQorICAgIGlmIChtX2xh
eWVyKQ0KKyAgICAgICAgbV9sYXllci0+cmVtb3ZlRnJvbVN1cGVybGF5ZXIoKTsNCisgICAgDQor
ICAgIGlmIChtX3RyYW5zZm9ybUxheWVyKQ0KKyAgICAgICAgbV90cmFuc2Zvcm1MYXllci0+cmVt
b3ZlRnJvbVN1cGVybGF5ZXIoKTsNCit9DQorDQordm9pZCBHcmFwaGljc0xheWVyQ0FDRjo6c2V0
TmFtZShjb25zdCBTdHJpbmcmIGluTmFtZSkNCit7DQorICAgIFN0cmluZyBuYW1lID0gU3RyaW5n
Ojpmb3JtYXQoIkNBTGF5ZXIoJXApIEdyYXBoaWNzTGF5ZXIoJXApICIsIG1fbGF5ZXIuZ2V0KCks
IHRoaXMpICsgaW5OYW1lOw0KKyAgICBHcmFwaGljc0xheWVyOjpzZXROYW1lKG5hbWUpOw0KKyAg
ICANCisgICAgbV9sYXllci0+c2V0TmFtZShpbk5hbWUpOw0KK30NCisNCitOYXRpdmVMYXllciBH
cmFwaGljc0xheWVyQ0FDRjo6bmF0aXZlTGF5ZXIoKSBjb25zdA0KK3sNCisgICAgcmV0dXJuIG1f
bGF5ZXIuZ2V0KCk7DQorfQ0KKw0KK3ZvaWQgR3JhcGhpY3NMYXllckNBQ0Y6OmFkZENoaWxkKEdy
YXBoaWNzTGF5ZXIqIGNoaWxkTGF5ZXIpDQorew0KKyAgICBHcmFwaGljc0xheWVyOjphZGRDaGls
ZChjaGlsZExheWVyKTsNCisNCisgICAgR3JhcGhpY3NMYXllckNBQ0YqIGNoaWxkTGF5ZXJDQSA9
IHN0YXRpY19jYXN0PEdyYXBoaWNzTGF5ZXJDQUNGKj4oY2hpbGRMYXllcik7DQorICAgIGhvc3RM
YXllckZvclN1YmxheWVycygpLT5hZGRTdWJsYXllcihjaGlsZExheWVyQ0EtPmxheWVyRm9yU3Vw
ZXJsYXllcigpKTsNCit9DQorDQordm9pZCBHcmFwaGljc0xheWVyQ0FDRjo6YWRkQ2hpbGRBdElu
ZGV4KEdyYXBoaWNzTGF5ZXIqIGNoaWxkTGF5ZXIsIGludCBpbmRleCkNCit7DQorICAgIEdyYXBo
aWNzTGF5ZXI6OmFkZENoaWxkQXRJbmRleChjaGlsZExheWVyLCBpbmRleCk7DQorDQorICAgIEdy
YXBoaWNzTGF5ZXJDQUNGKiBjaGlsZExheWVyQ0EgPSBzdGF0aWNfY2FzdDxHcmFwaGljc0xheWVy
Q0FDRio+KGNoaWxkTGF5ZXIpOw0KKyAgICBob3N0TGF5ZXJGb3JTdWJsYXllcnMoKS0+aW5zZXJ0
U3VibGF5ZXIoY2hpbGRMYXllckNBLT5sYXllckZvclN1cGVybGF5ZXIoKSwgaW5kZXgpOw0KK30N
CisNCit2b2lkIEdyYXBoaWNzTGF5ZXJDQUNGOjphZGRDaGlsZEJlbG93KEdyYXBoaWNzTGF5ZXIq
IGNoaWxkTGF5ZXIsIEdyYXBoaWNzTGF5ZXIqIHNpYmxpbmcpDQorew0KKyAgICAvLyBGSVhNRSBz
aGFyZSBjb2RlDQorICAgIEFTU0VSVCghY2hpbGRMYXllci0+cGFyZW50KCkpOw0KKyAgICBBU1NF
UlQoY2hpbGRMYXllciAhPSB0aGlzKTsNCisNCisgICAgdW5zaWduZWQgaTsNCisgICAgYm9vbCBm
b3VuZCA9IGZhbHNlOw0KKyAgICBmb3IgKGkgPSAwOyBpIDwgbV9jaGlsZHJlbi5zaXplKCk7IGkr
Kykgew0KKyAgICAgICAgaWYgKHNpYmxpbmcgPT0gbV9jaGlsZHJlbltpXSkgew0KKyAgICAgICAg
ICAgIG1fY2hpbGRyZW4uaW5zZXJ0KGksIGNoaWxkTGF5ZXIpOw0KKyAgICAgICAgICAgIGZvdW5k
ID0gdHJ1ZTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBj
aGlsZExheWVyLT5yZW1vdmVGcm9tUGFyZW50KCk7DQorICAgIGNoaWxkTGF5ZXItPnNldFBhcmVu
dCh0aGlzKTsNCisNCisgICAgR3JhcGhpY3NMYXllckNBQ0YqIGNoaWxkTGF5ZXJDQSA9IHN0YXRp
Y19jYXN0PEdyYXBoaWNzTGF5ZXJDQUNGKj4oY2hpbGRMYXllcik7DQorICAgIEdyYXBoaWNzTGF5
ZXJDQUNGKiBzaWJsaW5nTGF5ZXJDQSA9IHN0YXRpY19jYXN0PEdyYXBoaWNzTGF5ZXJDQUNGKj4o
c2libGluZyk7DQorICAgIGlmIChmb3VuZCkgew0KKyAgICAgICAgaG9zdExheWVyRm9yU3VibGF5
ZXJzKCktPmluc2VydFN1YmxheWVyQmVsb3dMYXllcihjaGlsZExheWVyQ0EtPmxheWVyRm9yU3Vw
ZXJsYXllcigpLCBzaWJsaW5nTGF5ZXJDQS0+bGF5ZXJGb3JTdXBlcmxheWVyKCkpOw0KKyAgICB9
IGVsc2Ugew0KKyAgICAgICAgbV9jaGlsZHJlbi5hcHBlbmQoY2hpbGRMYXllcik7DQorICAgICAg
ICBob3N0TGF5ZXJGb3JTdWJsYXllcnMoKS0+YWRkU3VibGF5ZXIoY2hpbGRMYXllckNBLT5sYXll
ckZvclN1cGVybGF5ZXIoKSk7DQorICAgIH0NCit9DQorDQordm9pZCBHcmFwaGljc0xheWVyQ0FD
Rjo6YWRkQ2hpbGRBYm92ZShHcmFwaGljc0xheWVyKiBjaGlsZExheWVyLCBHcmFwaGljc0xheWVy
ICpzaWJsaW5nKQ0KK3sNCisgICAgLy8gRklYTUU6IHNoYXJlIGNvZGUNCisgICAgQVNTRVJUKCFj
aGlsZExheWVyLT5wYXJlbnQoKSk7DQorICAgIEFTU0VSVChjaGlsZExheWVyICE9IHRoaXMpOw0K
Kw0KKyAgICB1bnNpZ25lZCBpOw0KKyAgICBib29sIGZvdW5kID0gZmFsc2U7DQorICAgIGZvciAo
aSA9IDA7IGkgPCBtX2NoaWxkcmVuLnNpemUoKTsgaSsrKSB7DQorICAgICAgICBpZiAoc2libGlu
ZyA9PSBtX2NoaWxkcmVuW2ldKSB7DQorICAgICAgICAgICAgbV9jaGlsZHJlbi5pbnNlcnQoaSsx
LCBjaGlsZExheWVyKTsNCisgICAgICAgICAgICBmb3VuZCA9IHRydWU7DQorICAgICAgICAgICAg
YnJlYWs7DQorICAgICAgICB9DQorICAgIH0NCisgICAgY2hpbGRMYXllci0+cmVtb3ZlRnJvbVBh
cmVudCgpOw0KKyAgICBjaGlsZExheWVyLT5zZXRQYXJlbnQodGhpcyk7DQorDQorICAgIEdyYXBo
aWNzTGF5ZXJDQUNGKiBjaGlsZExheWVyQ0EgPSBzdGF0aWNfY2FzdDxHcmFwaGljc0xheWVyQ0FD
Rio+KGNoaWxkTGF5ZXIpOw0KKyAgICBHcmFwaGljc0xheWVyQ0FDRiogc2libGluZ0xheWVyQ0Eg
PSBzdGF0aWNfY2FzdDxHcmFwaGljc0xheWVyQ0FDRio+KHNpYmxpbmcpOw0KKyAgICBpZiAoZm91
bmQpIHsNCisgICAgICAgIGhvc3RMYXllckZvclN1YmxheWVycygpLT5pbnNlcnRTdWJsYXllckFi
b3ZlTGF5ZXIoY2hpbGRMYXllckNBLT5sYXllckZvclN1cGVybGF5ZXIoKSwgc2libGluZ0xheWVy
Q0EtPmxheWVyRm9yU3VwZXJsYXllcigpKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIG1fY2hp
bGRyZW4uYXBwZW5kKGNoaWxkTGF5ZXIpOw0KKyAgICAgICAgaG9zdExheWVyRm9yU3VibGF5ZXJz
KCktPmFkZFN1YmxheWVyKGNoaWxkTGF5ZXJDQS0+bGF5ZXJGb3JTdXBlcmxheWVyKCkpOw0KKyAg
ICB9DQorfQ0KKw0KK2Jvb2wgR3JhcGhpY3NMYXllckNBQ0Y6OnJlcGxhY2VDaGlsZChHcmFwaGlj
c0xheWVyKiBvbGRDaGlsZCwgR3JhcGhpY3NMYXllciogbmV3Q2hpbGQpDQorew0KKyAgICAvLyBG
SVhNRTogc2hhcmUgY29kZQ0KKyAgICBBU1NFUlQoIW5ld0NoaWxkLT5wYXJlbnQoKSk7DQorDQor
ICAgIGJvb2wgZm91bmQgPSBmYWxzZTsNCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG1f
Y2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsNCisgICAgICAgIGlmIChvbGRDaGlsZCA9PSBtX2NoaWxk
cmVuW2ldKSB7DQorICAgICAgICAgICAgbV9jaGlsZHJlbltpXSA9IG5ld0NoaWxkOw0KKyAgICAg
ICAgICAgIGZvdW5kID0gdHJ1ZTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisg
ICAgfQ0KKyAgICBpZiAoZm91bmQpIHsNCisgICAgICAgIG9sZENoaWxkLT5zZXRQYXJlbnQoMCk7
DQorICAgICAgICANCisgICAgICAgbmV3Q2hpbGQtPnJlbW92ZUZyb21QYXJlbnQoKTsNCisgICAg
ICAgbmV3Q2hpbGQtPnNldFBhcmVudCh0aGlzKTsNCisNCisgICAgICAgIEdyYXBoaWNzTGF5ZXJD
QUNGKiBvbGRDaGlsZENBID0gc3RhdGljX2Nhc3Q8R3JhcGhpY3NMYXllckNBQ0YqPihvbGRDaGls
ZCk7DQorICAgICAgICBHcmFwaGljc0xheWVyQ0FDRiogbmV3Q2hpbGRDQSA9IHN0YXRpY19jYXN0
PEdyYXBoaWNzTGF5ZXJDQUNGKj4obmV3Q2hpbGQpOw0KKyAgICAgICAgaG9zdExheWVyRm9yU3Vi
bGF5ZXJzKCktPnJlcGxhY2VTdWJsYXllcihvbGRDaGlsZENBLT5sYXllckZvclN1cGVybGF5ZXIo
KSwgbmV3Q2hpbGRDQS0+bGF5ZXJGb3JTdXBlcmxheWVyKCkpOw0KKyAgICAgICAgcmV0dXJuIHRy
dWU7DQorICAgIH0NCisgICAgcmV0dXJuIGZhbHNlOw0KK30NCisNCit2b2lkIEdyYXBoaWNzTGF5
ZXJDQUNGOjpyZW1vdmVGcm9tUGFyZW50KCkNCit7DQorICAgIEdyYXBoaWNzTGF5ZXI6OnJlbW92
ZUZyb21QYXJlbnQoKTsNCisNCisgICAgDQorICAgIGxheWVyRm9yU3VwZXJsYXllcigpLT5yZW1v
dmVGcm9tU3VwZXJsYXllcigpOyAgICAgICAgICAgIA0KK30NCisNCit2b2lkIEdyYXBoaWNzTGF5
ZXJDQUNGOjpzZXRQb3NpdGlvbihjb25zdCBGbG9hdFBvaW50JiBwb2ludCkNCit7DQorICAgIC8v
IGRvbid0IHNob3J0LWNpcmN1aXQgaGVyZSwgYmVjYXVzZSBwb3NpdGlvbiBhbmQgYW5jaG9yIHBv
aW50DQorICAgIC8vIGFyZSBpbnRlci1yZWxhdGVkDQorICAgIEdyYXBoaWNzTGF5ZXI6OnNldFBv
c2l0aW9uKHBvaW50KTsNCisNCisgICAgLy8gcG9zaXRpb24gaXMgb2Zmc2V0IG9uIHRoZSBsYXll
ciBieSB0aGUgbGF5ZXIgYW5jaG9yIHBvaW50DQorICAgIENHUG9pbnQgcG9zUG9pbnQgPSBDR1Bv
aW50TWFrZShtX3Bvc2l0aW9uLngoKSArIG1fYW5jaG9yUG9pbnQueCgpICogbV9zaXplLndpZHRo
KCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3Bvc2l0aW9uLnkoKSAr
IG1fYW5jaG9yUG9pbnQueSgpICogbV9zaXplLmhlaWdodCgpKTsNCisgICAgDQorICAgIHByaW1h
cnlMYXllcigpLT5zZXRQb3NpdGlvbihwb3NQb2ludCk7DQorfQ0KKw0KK3ZvaWQgR3JhcGhpY3NM
YXllckNBQ0Y6OnNldEFuY2hvclBvaW50KGNvbnN0IEZsb2F0UG9pbnQzRCYgcG9pbnQpDQorew0K
KyAgICAvLyBEb24ndCBzaG9ydC1jaXJjdWl0IGhlcmUsIGJlY2F1c2UgcG9zaXRpb24gYW5kIGFu
Y2hvciBwb2ludCBhcmUgaW50ZXItZGVwZW5kZW50Lg0KKyAgICBib29sIHpDaGFuZ2VkID0gKHBv
aW50LnooKSAhPSBtX2FuY2hvclBvaW50LnooKSk7DQorICAgIEdyYXBoaWNzTGF5ZXI6OnNldEFu
Y2hvclBvaW50KHBvaW50KTsNCisNCisgICAgLy8gc2V0IHRoZSB2YWx1ZSBvbiB0aGUgbGF5ZXIg
dG8gdGhlIG5ldyB0cmFuc2Zvcm0NCisgICAgcHJpbWFyeUxheWVyKCktPnNldEFuY2hvclBvaW50
KEZsb2F0UG9pbnQocG9pbnQueCgpLCBwb2ludC55KCkpKTsNCisNCisgICAgaWYgKHpDaGFuZ2Vk
KSANCisgICAgICAgIHByaW1hcnlMYXllcigpLT5zZXRBbmNob3JQb2ludFoobV9hbmNob3JQb2lu
dC56KCkpOw0KKw0KKyAgICAvLyBwb3NpdGlvbiBkZXBlbmRzIG9uIGFuY2hvciBwb2ludA0KKyAg
ICBzZXRQb3NpdGlvbihtX3Bvc2l0aW9uKTsNCit9DQorDQordm9pZCBHcmFwaGljc0xheWVyQ0FD
Rjo6c2V0U2l6ZShjb25zdCBGbG9hdFNpemUmIHNpemUpDQorew0KKyAgICBHcmFwaGljc0xheWVy
OjpzZXRTaXplKHNpemUpOw0KKw0KKyAgICBDR1JlY3QgcmVjdCA9IENHUmVjdE1ha2UoMC4wZiwN
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMGYsDQorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBtX3NpemUud2lkdGgoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IG1fc2l6ZS5oZWlnaHQoKSk7DQorICAgIA0KKyAgICBDR1BvaW50IGNlbnRlclBvaW50ID0gQ0dQ
b2ludE1ha2UobV9zaXplLndpZHRoKCkgLyAyLjBmLCBtX3NpemUuaGVpZ2h0KCkgLyAyLjBmKTsN
CisgICAgDQorICAgIGlmIChtX3RyYW5zZm9ybUxheWVyKSB7DQorICAgICAgICBtX3RyYW5zZm9y
bUxheWVyLT5zZXRCb3VuZHMocmVjdCk7DQorICAgIA0KKyAgICAgICAgLy8gdGhlIGFuY2hvciBv
ZiB0aGUgY29udGVudHMgbGF5ZXIgaXMgYWx3YXlzIGF0IDAuNSwgMC41LCBzbyB0aGUgcG9zaXRp
b24NCisgICAgICAgIC8vIGlzIGNlbnRlci1yZWxhdGl2ZQ0KKyAgICAgICAgbV9sYXllci0+c2V0
UG9zaXRpb24oY2VudGVyUG9pbnQpOw0KKyAgICB9DQorICAgIA0KKyAgICBib29sIG5lZWRUaWxl
ZExheWVyID0gcmVxdWlyZXNUaWxlZExheWVyKG1fc2l6ZSk7DQorICAgIGlmIChuZWVkVGlsZWRM
YXllciAhPSBtX3VzaW5nVGlsZWRMYXllcikgew0KKyAgICAgICAgc3dhcEZyb21PclRvVGlsZWRM
YXllcihuZWVkVGlsZWRMYXllcik7DQorICAgIH0NCisgICAgDQorICAgIG1fbGF5ZXItPnNldEJv
dW5kcyhyZWN0KTsNCisNCisgICAgLy8gTm90ZSB0aGF0IHdlIGRvbid0IHJlc2l6ZSBtX2NvbnRl
bnRzTGF5ZXIuIEl0J3MgdXAgdGhlIGNhbGxlciB0byBkbyB0aGF0Lg0KKw0KKyAgICAvLyBpZiB3
ZSd2ZSBjaGFuZ2VkIHRoZSBib3VuZHMsIHdlIG5lZWQgdG8gcmVjYWxjdWxhdGUgdGhlIHBvc2l0
aW9uDQorICAgIC8vIG9mIHRoZSBsYXllciwgdGFraW5nIGFuY2hvciBwb2ludCBpbnRvIGFjY291
bnQNCisgICAgc2V0UG9zaXRpb24obV9wb3NpdGlvbik7DQorfQ0KKw0KK3ZvaWQgR3JhcGhpY3NM
YXllckNBQ0Y6OnNldFRyYW5zZm9ybShjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgdCkNCit7
DQorICAgIEdyYXBoaWNzTGF5ZXI6OnNldFRyYW5zZm9ybSh0KTsNCisgICAgDQorICAgIENBVHJh
bnNmb3JtM0QgdHJhbnNmb3JtOw0KKyAgICBjb3B5VHJhbnNmb3JtKHRyYW5zZm9ybSwgdCk7DQor
ICAgIHByaW1hcnlMYXllcigpLT5zZXRUcmFuc2Zvcm0odHJhbnNmb3JtKTsNCit9DQorDQordm9p
ZCBHcmFwaGljc0xheWVyQ0FDRjo6c2V0Q2hpbGRyZW5UcmFuc2Zvcm0oY29uc3QgVHJhbnNmb3Jt
YXRpb25NYXRyaXgmIHQpDQorew0KKyAgICBpZiAodCA9PSBtX2NoaWxkcmVuVHJhbnNmb3JtKQ0K
KyAgICAgICAgcmV0dXJuOw0KKw0KKyAgICBHcmFwaGljc0xheWVyOjpzZXRDaGlsZHJlblRyYW5z
Zm9ybSh0KTsNCisNCisgICAgQ0FUcmFuc2Zvcm0zRCB0cmFuc2Zvcm07DQorICAgIGNvcHlUcmFu
c2Zvcm0odHJhbnNmb3JtLCB0KTsNCisNCisgICAgLy8gc2V0IHRoZSB2YWx1ZSBvbiB0aGUgbGF5
ZXIgdG8gdGhlIG5ldyB0cmFuc2Zvcm0NCisgICAgcHJpbWFyeUxheWVyKCktPnNldFN1YmxheWVy
VHJhbnNmb3JtKHRyYW5zZm9ybSk7DQorfQ0KKw0KK3N0YXRpYyB2b2lkIG1vdmVTdWJsYXllcnMo
V0tDQUNGTGF5ZXIqIGZyb21MYXllciwgV0tDQUNGTGF5ZXIqIHRvTGF5ZXIpDQorew0KKyAgICAv
LyBjb3B5IHN1YmxheWVycyB0byBhdm9pZCBtdXRhdGlvbiBkdXJpbmcgdHJhbnNmZXINCisgICAg
VmVjdG9yPFJlZlB0cjxXS0NBQ0ZMYXllcj4gPiBzdWJsYXllcnMgPSBmcm9tTGF5ZXItPnN1Ymxh
eWVycygpOw0KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN1YmxheWVycy5zaXplKCk7ICsr
aSkgew0KKyAgICAgICAgc3VibGF5ZXJzW2ldLT5yZW1vdmVGcm9tU3VwZXJsYXllcigpOw0KKyAg
ICAgICAgdG9MYXllci0+YWRkU3VibGF5ZXIoc3VibGF5ZXJzW2ldLmdldCgpKTsNCisgICAgfQ0K
K30NCisNCit2b2lkIEdyYXBoaWNzTGF5ZXJDQUNGOjpzZXRQcmVzZXJ2ZXMzRChib29sIHByZXNl
cnZlczNEKQ0KK3sNCisgICAgR3JhcGhpY3NMYXllcjo6c2V0UHJlc2VydmVzM0QocHJlc2VydmVz
M0QpOw0KKw0KKyAgICBDR1BvaW50IHBvaW50ID0gQ0dQb2ludE1ha2UobV9zaXplLndpZHRoKCkg
LyAyLjBmLCBtX3NpemUuaGVpZ2h0KCkgLyAyLjBmKTsNCisgICAgQ0dQb2ludCBjZW50ZXJQb2lu
dCA9IENHUG9pbnRNYWtlKDAuNWYsIDAuNWYpOw0KKyAgICANCisgICAgaWYgKHByZXNlcnZlczNE
ICYmICFtX3RyYW5zZm9ybUxheWVyKSB7DQorICAgICAgICAvLyBjcmVhdGUgdGhlIHRyYW5zZm9y
bSBsYXllcg0KKyAgICAgICAgbV90cmFuc2Zvcm1MYXllciA9IFdLQ0FDRkxheWVyOjpjcmVhdGUo
a0NBQ0ZUcmFuc2Zvcm1MYXllciwgdGhpcyk7DQorICAgICAgICANCisjaWZuZGVmIE5ERUJVRw0K
KyAgICAgICAgbV90cmFuc2Zvcm1MYXllci0+c2V0TmFtZShTdHJpbmcoKS5mb3JtYXQoIlRyYW5z
Zm9ybSBMYXllciBDQVRyYW5zZm9ybUxheWVyKCVwKSBHcmFwaGljc0xheWVyKCVwKSIsIG1fdHJh
bnNmb3JtTGF5ZXIuZ2V0KCksIHRoaXMpKTsNCisjZW5kaWYNCisgICAgICAgIA0KKyAgICAgICAg
Ly8gY29weSB0aGUgcG9zaXRpb24gZnJvbSB0aGlzIGxheWVyDQorICAgICAgICBtX3RyYW5zZm9y
bUxheWVyLT5zZXRCb3VuZHMobV9sYXllci0+Ym91bmRzKCkpOw0KKyAgICAgICAgbV90cmFuc2Zv
cm1MYXllci0+c2V0UG9zaXRpb24obV9sYXllci0+cG9zaXRpb24oKSk7DQorICAgICAgICBtX3Ry
YW5zZm9ybUxheWVyLT5zZXRaUG9zaXRpb24obV9sYXllci0+elBvc2l0aW9uKCkpOw0KKyAgICAg
ICAgbV90cmFuc2Zvcm1MYXllci0+c2V0QW5jaG9yUG9pbnQobV9sYXllci0+YW5jaG9yUG9pbnQo
KSk7DQorICAgICAgICBtX3RyYW5zZm9ybUxheWVyLT5zZXRBbmNob3JQb2ludFoobV9sYXllci0+
YW5jaG9yUG9pbnRaKCkpOw0KKyAgICAgICAgbV90cmFuc2Zvcm1MYXllci0+c2V0Q29udGVudHNS
ZWN0KG1fbGF5ZXItPmNvbnRlbnRzUmVjdCgpKTsNCisgICAgICAgIA0KKyAgICAgICAgLy8gVGhl
IGNvbnRlbnRzIGxheWVyIGlzIHBvc2l0aW9uZWQgYXQgKDAsMCkgcmVsYXRpdmUgdG8gdGhlIHRy
YW5zZm9ybUxheWVyLg0KKyAgICAgICAgbV9sYXllci0+c2V0UG9zaXRpb24ocG9pbnQpOw0KKyAg
ICAgICAgbV9sYXllci0+c2V0WlBvc2l0aW9uKDAuMGYpOw0KKyAgICAgICAgbV9sYXllci0+c2V0
QW5jaG9yUG9pbnQoY2VudGVyUG9pbnQpOw0KKyAgICAgICAgDQorICAgICAgICAvLyBUcmFuc2Zl
ciB0aGUgdHJhbnNmb3JtIG92ZXINCisgICAgICAgIG1fdHJhbnNmb3JtTGF5ZXItPnNldFRyYW5z
Zm9ybShtX2xheWVyLT50cmFuc2Zvcm0oKSk7DQorICAgICAgICBtX2xheWVyLT5zZXRUcmFuc2Zv
cm0oQ0FUcmFuc2Zvcm0zRElkZW50aXR5KTsNCisgICAgICAgIA0KKyAgICAgICAgLy8gVHJhbnNm
ZXIgdGhlIG9wYWNpdHkgZnJvbSB0aGUgb2xkIGxheWVyIHRvIHRoZSB0cmFuc2Zvcm0gbGF5ZXIN
CisgICAgICAgIG1fdHJhbnNmb3JtTGF5ZXItPnNldE9wYWNpdHkobV9vcGFjaXR5KTsNCisgICAg
ICAgIG1fbGF5ZXItPnNldE9wYWNpdHkoMSk7DQorDQorICAgICAgICAvLyBtb3ZlIHRoaXMgbGF5
ZXIgdG8gYmUgYSBjaGlsZCBvZiB0aGUgdHJhbnNmb3JtIGxheWVyDQorCQlpZiAobV9sYXllci0+
c3VwZXJsYXllcigpKQ0KKwkJCW1fbGF5ZXItPnN1cGVybGF5ZXIoKS0+cmVwbGFjZVN1YmxheWVy
KG1fbGF5ZXIuZ2V0KCksIG1fdHJhbnNmb3JtTGF5ZXIuZ2V0KCkpOw0KKyAgICAgICAgbV90cmFu
c2Zvcm1MYXllci0+YWRkU3VibGF5ZXIobV9sYXllci5nZXQoKSk7DQorDQorICAgICAgICBtb3Zl
U3VibGF5ZXJzKG1fbGF5ZXIuZ2V0KCksIG1fdHJhbnNmb3JtTGF5ZXIuZ2V0KCkpOw0KKyAgICB9
IGVsc2UgaWYgKCFwcmVzZXJ2ZXMzRCAmJiBtX3RyYW5zZm9ybUxheWVyKSB7DQorICAgICAgICAv
LyBSZWxhY2UgdGhlIHRyYW5zZm9ybUxheWVyIGluIHRoZSBwYXJlbnQgd2l0aCB0aGlzIGxheWVy
Lg0KKyAgICAgICAgbV9sYXllci0+cmVtb3ZlRnJvbVN1cGVybGF5ZXIoKTsNCisJCWlmIChtX3Ry
YW5zZm9ybUxheWVyLT5zdXBlcmxheWVyKCkpDQorCQkJbV90cmFuc2Zvcm1MYXllci0+c3VwZXJs
YXllcigpLT5yZXBsYWNlU3VibGF5ZXIobV90cmFuc2Zvcm1MYXllci5nZXQoKSwgbV9sYXllci5n
ZXQoKSk7DQorDQorICAgICAgICBtb3ZlU3VibGF5ZXJzKG1fdHJhbnNmb3JtTGF5ZXIuZ2V0KCks
IG1fbGF5ZXIuZ2V0KCkpOw0KKw0KKyAgICAgICAgLy8gcmVzZXQgdGhlIGxheWVyIHBvc2l0aW9u
IGFuZCB0cmFuc2Zvcm0NCisgICAgICAgIG1fbGF5ZXItPnNldFBvc2l0aW9uKG1fdHJhbnNmb3Jt
TGF5ZXItPnBvc2l0aW9uKCkpOw0KKyAgICAgICAgbV9sYXllci0+c2V0WlBvc2l0aW9uKG1fdHJh
bnNmb3JtTGF5ZXItPnpQb3NpdGlvbigpKTsNCisgICAgICAgIG1fbGF5ZXItPnNldEFuY2hvclBv
aW50KG1fdHJhbnNmb3JtTGF5ZXItPmFuY2hvclBvaW50KCkpOw0KKyAgICAgICAgbV9sYXllci0+
c2V0QW5jaG9yUG9pbnRaKG1fdHJhbnNmb3JtTGF5ZXItPmFuY2hvclBvaW50WigpKTsNCisgICAg
ICAgIG1fbGF5ZXItPnNldENvbnRlbnRzUmVjdChtX3RyYW5zZm9ybUxheWVyLT5jb250ZW50c1Jl
Y3QoKSk7DQorICAgICAgICBtX2xheWVyLT5zZXRUcmFuc2Zvcm0obV90cmFuc2Zvcm1MYXllci0+
dHJhbnNmb3JtKCkpOw0KKyAgICAgICAgbV9sYXllci0+c2V0T3BhY2l0eShtX3RyYW5zZm9ybUxh
eWVyLT5vcGFjaXR5KCkpOw0KKw0KKyAgICAgICAgLy8gZW1wdHkgdGhlIHRyYW5zZm9ybSBsYXll
cg0KKyAgICAgICAgbV90cmFuc2Zvcm1MYXllciA9IDA7DQorICAgIH0NCit9DQorDQordm9pZCBH
cmFwaGljc0xheWVyQ0FDRjo6c2V0TWFza3NUb0JvdW5kcyhib29sIG1hc2tzVG9Cb3VuZHMpDQor
ew0KKyAgICBpZiAobWFza3NUb0JvdW5kcyA9PSBtX21hc2tzVG9Cb3VuZHMpDQorICAgICAgICBy
ZXR1cm47DQorDQorICAgIEdyYXBoaWNzTGF5ZXI6OnNldE1hc2tzVG9Cb3VuZHMobWFza3NUb0Jv
dW5kcyk7DQorDQorICAgIG1fbGF5ZXItPnNldE1hc2tzVG9Cb3VuZHMobWFza3NUb0JvdW5kcyk7
DQorDQorI2lmbmRlZiBOREVCVUcNCisgICAgdXBkYXRlRGVidWdJbmRpY2F0b3JzKCk7DQorI2Vu
ZGlmDQorfQ0KKw0KK3ZvaWQgR3JhcGhpY3NMYXllckNBQ0Y6OnNldERyYXdzQ29udGVudChib29s
IGluRHJhd3NDb250ZW50KQ0KK3sNCisgICAgaWYgKGluRHJhd3NDb250ZW50ICE9IG1fZHJhd3ND
b250ZW50KSB7DQorICAgICAgICANCisgICAgICAgIEdyYXBoaWNzTGF5ZXI6OnNldERyYXdzQ29u
dGVudChpbkRyYXdzQ29udGVudCk7DQorDQorICAgICAgICBib29sIG5lZWRUaWxlZExheWVyID0g
cmVxdWlyZXNUaWxlZExheWVyKG1fc2l6ZSk7DQorICAgICAgICBpZiAobmVlZFRpbGVkTGF5ZXIg
IT0gbV91c2luZ1RpbGVkTGF5ZXIpDQorICAgICAgICAgICAgc3dhcEZyb21PclRvVGlsZWRMYXll
cihuZWVkVGlsZWRMYXllcik7DQorDQorICAgICAgICAgaWYgKG1fZHJhd3NDb250ZW50KQ0KKyAg
ICAgICAgICAgIG1fbGF5ZXItPnNldE5lZWRzRGlzcGxheSgpOw0KKyAgICAgICAgZWxzZQ0KKyAg
ICAgICAgICAgIG1fbGF5ZXItPnNldENvbnRlbnRzKDApOw0KKyAgICAgICAgDQorI2lmbmRlZiBO
REVCVUcNCisgICAgICAgIHVwZGF0ZURlYnVnSW5kaWNhdG9ycygpOw0KKyNlbmRpZg0KKyAgICB9
DQorfQ0KKw0KK3ZvaWQgR3JhcGhpY3NMYXllckNBQ0Y6OnNldEJhY2tncm91bmRDb2xvcihjb25z
dCBDb2xvciYgY29sb3IpDQorew0KKyAgICBpZiAobV9iYWNrZ3JvdW5kQ29sb3JTZXQgJiYgbV9i
YWNrZ3JvdW5kQ29sb3IgPT0gY29sb3IpDQorICAgICAgICByZXR1cm47DQorDQorICAgIEdyYXBo
aWNzTGF5ZXI6OnNldEJhY2tncm91bmRDb2xvcihjb2xvcik7DQorDQorICAgIGlmICghbV9jb250
ZW50c0xheWVyKQ0KKyAgICAgICAgcmV0dXJuOw0KKw0KKyAgICAvLyBXZSBuZXZlciBjcmVhdGUg
dGhlIGNvbnRlbnRzIGxheWVyIGp1c3QgZm9yIGJhY2tncm91bmQgY29sb3IgeWV0Lg0KKyAgICBz
ZXRMYXllckJhY2tncm91bmRDb2xvcihtX2NvbnRlbnRzTGF5ZXIuZ2V0KCksIG1fYmFja2dyb3Vu
ZENvbG9yKTsNCit9DQorDQordm9pZCBHcmFwaGljc0xheWVyQ0FDRjo6Y2xlYXJCYWNrZ3JvdW5k
Q29sb3IoKQ0KK3sNCisgICAgaWYgKCFtX2JhY2tncm91bmRDb2xvclNldCkNCisgICAgICAgIHJl
dHVybjsNCisNCisgICAgR3JhcGhpY3NMYXllcjo6Y2xlYXJCYWNrZ3JvdW5kQ29sb3IoKTsNCisg
ICAgY2xlYXJMYXllckJhY2tncm91bmRDb2xvcihtX2NvbnRlbnRzTGF5ZXIuZ2V0KCkpOw0KK30N
CisNCit2b2lkIEdyYXBoaWNzTGF5ZXJDQUNGOjpzZXRDb250ZW50c09wYXF1ZShib29sIGluT3Bh
cXVlKQ0KK3sNCisgICAgR3JhcGhpY3NMYXllcjo6c2V0Q29udGVudHNPcGFxdWUoaW5PcGFxdWUp
Ow0KKw0KKyAgICBtX2xheWVyLT5zZXRPcGFxdWUobV9jb250ZW50c09wYXF1ZSk7DQorfQ0KKw0K
K3ZvaWQgR3JhcGhpY3NMYXllckNBQ0Y6OnNldEJhY2tmYWNlVmlzaWJpbGl0eShib29sIHZpc2li
bGUpDQorew0KKyAgICBpZiAobV9iYWNrZmFjZVZpc2liaWxpdHkgPT0gdmlzaWJsZSkNCisgICAg
ICAgIHJldHVybjsNCisgICAgDQorICAgIEdyYXBoaWNzTGF5ZXI6OnNldEJhY2tmYWNlVmlzaWJp
bGl0eSh2aXNpYmxlKTsNCisgICAgDQorICAgIG1fbGF5ZXItPnNldERvdWJsZVNpZGVkKHZpc2li
bGUpOw0KK30NCisgICAgDQordm9pZCBHcmFwaGljc0xheWVyQ0FDRjo6c2V0T3BhY2l0eShmbG9h
dCBvcGFjaXR5KQ0KK3sNCisgICAgZmxvYXQgY2xhbXBlZE9wYWNpdHkgPSBzdGQ6Om1heChzdGQ6
Om1pbihvcGFjaXR5LCAxLjBmKSwgMC4wZik7DQorICAgIA0KKyAgICBib29sIG9wYWNpdGllc0Rp
ZmZlciA9IChtX29wYWNpdHkgIT0gY2xhbXBlZE9wYWNpdHkpOw0KKyAgICANCisgICAgR3JhcGhp
Y3NMYXllcjo6c2V0T3BhY2l0eShjbGFtcGVkT3BhY2l0eSk7DQorICAgIHByaW1hcnlMYXllcigp
LT5zZXRPcGFjaXR5KG9wYWNpdHkpOw0KK30NCisNCit2b2lkIEdyYXBoaWNzTGF5ZXJDQUNGOjpz
ZXROZWVkc0Rpc3BsYXkoKQ0KK3sNCisgICAgaWYgKGRyYXdzQ29udGVudCgpKQ0KKyAgICAgICAg
bV9sYXllci0+c2V0TmVlZHNEaXNwbGF5KCk7DQorfQ0KKw0KK3ZvaWQgR3JhcGhpY3NMYXllckNB
Q0Y6OnNldE5lZWRzRGlzcGxheUluUmVjdChjb25zdCBGbG9hdFJlY3QmIHJlY3QpDQorew0KKyAg
ICBpZiAoZHJhd3NDb250ZW50KCkpIHsNCisJCUNHUmVjdCByOw0KKwkJci5vcmlnaW4ueCA9IHJl
Y3QueCgpOyByLm9yaWdpbi55ID0gcmVjdC55KCk7DQorCQlyLnNpemUud2lkdGggPSByZWN0Lndp
ZHRoKCk7IHIuc2l6ZS5oZWlnaHQgPSByZWN0LmhlaWdodCgpOw0KKyAgICAgICAgbV9sYXllci0+
c2V0TmVlZHNEaXNwbGF5KCZyKTsNCisgICAgfQ0KK30NCisNCit2b2lkIEdyYXBoaWNzTGF5ZXJD
QUNGOjpzZXRDb250ZW50c1JlY3QoY29uc3QgSW50UmVjdCYgcmVjdCkNCit7DQorICAgIGlmIChy
ZWN0ID09IG1fY29udGVudHNSZWN0KQ0KKyAgICAgICAgcmV0dXJuOw0KKw0KKyAgICBHcmFwaGlj
c0xheWVyOjpzZXRDb250ZW50c1JlY3QocmVjdCk7DQorICAgIHVwZGF0ZUNvbnRlbnRzUmVjdCgp
Ow0KK30NCisNCit2b2lkIEdyYXBoaWNzTGF5ZXJDQUNGOjpzZXRDb250ZW50c1RvSW1hZ2UoSW1h
Z2UqIGltYWdlKQ0KK3sNCisgICAgaWYgKGltYWdlKSB7DQorICAgICAgICBpZiAoIW1fY29udGVu
dHNMYXllci5nZXQoKSkgew0KKw0KKyAgICAgICAgICAgIFJlZlB0cjxXS0NBQ0ZMYXllcj4gaW1h
Z2VMYXllciA9IFdLQ0FDRkxheWVyOjpjcmVhdGUoa0NBQ0ZMYXllciwgdGhpcyk7DQorI2lmbmRl
ZiBOREVCVUcNCisgICAgICAgICAgICBpbWFnZUxheWVyLT5zZXROYW1lKCJJbWFnZSBMYXllciIp
Ow0KKyNlbmRpZg0KKyAgICAgICAgICAgIHNldHVwQ29udGVudHNMYXllcihpbWFnZUxheWVyLmdl
dCgpKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vIEZJWE1FOiBtYXliZSBvbmx5IGRvIHRy
aWxpbmVhciBpZiB0aGUgaW1hZ2UgaXMgYmVpbmcgc2NhbGVkIGRvd24sDQorICAgICAgICAvLyBi
dXQgdGhlbiB3aGF0IGlmIHRoZSBsYXllciBzaXplIGNoYW5nZXM/DQorICAgICAgICBtX2NvbnRl
bnRzTGF5ZXItPnNldE1pbmlmaWNhdGlvbkZpbHRlcihrQ0FDRkZpbHRlclRyaWxpbmVhcik7DQor
ICAgICAgICBDR0ltYWdlUmVmIHRoZUltYWdlID0gaW1hZ2UtPm5hdGl2ZUltYWdlRm9yQ3VycmVu
dEZyYW1lKCk7DQorICAgICAgICBtX2NvbnRlbnRzTGF5ZXItPnNldENvbnRlbnRzKHRoZUltYWdl
KTsNCisgICAgfSBlbHNlDQorICAgICAgICBzZXR1cENvbnRlbnRzTGF5ZXIoMCk7DQorDQorICAg
IG1fY29udGVudHNMYXllclB1cnBvc2UgPSAoaW1hZ2UgIT0gMCkgPyBDb250ZW50c0xheWVyRm9y
SW1hZ2UgOiBOb0NvbnRlbnRzTGF5ZXI7DQorfQ0KKw0KK3ZvaWQgR3JhcGhpY3NMYXllckNBQ0Y6
OnNldENvbnRlbnRzVG9WaWRlbyhQbGF0Zm9ybUxheWVyKiB2aWRlb0xheWVyKQ0KK3sNCisgICAg
c2V0dXBDb250ZW50c0xheWVyKHZpZGVvTGF5ZXIpOw0KKyAgICBtX2NvbnRlbnRzTGF5ZXJQdXJw
b3NlID0gKHZpZGVvTGF5ZXIgIT0gMCkgPyBDb250ZW50c0xheWVyRm9yVmlkZW8gOiBOb0NvbnRl
bnRzTGF5ZXI7DQorfQ0KKw0KK3ZvaWQgR3JhcGhpY3NMYXllckNBQ0Y6OnVwZGF0ZUNvbnRlbnRz
UmVjdCgpDQorew0KKyAgICBpZiAoIW1fY29udGVudHNMYXllcikNCisgICAgICAgIHJldHVybjsN
CisgICAgICAgIA0KKyAgICBDR1BvaW50IHBvaW50ID0gQ0dQb2ludE1ha2UobV9jb250ZW50c1Jl
Y3QueCgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9jb250ZW50c1JlY3Qu
eSgpKTsNCisgICAgQ0dSZWN0IHJlY3QgPSBDR1JlY3RNYWtlKDAuMGYsDQorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAwLjBmLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9j
b250ZW50c1JlY3Qud2lkdGgoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fY29u
dGVudHNSZWN0LmhlaWdodCgpKTsNCisNCisgICAgbV9jb250ZW50c0xheWVyLT5zZXRQb3NpdGlv
bihwb2ludCk7DQorICAgIG1fY29udGVudHNMYXllci0+c2V0Qm91bmRzKHJlY3QpOw0KK30NCisN
Cit2b2lkIEdyYXBoaWNzTGF5ZXJDQUNGOjpzZXRHZW9tZXRyeU9yaWVudGF0aW9uKENvbXBvc2l0
aW5nQ29vcmRpbmF0ZXNPcmllbnRhdGlvbiBvcmllbnRhdGlvbikNCit7DQorICAgIHN3aXRjaCAo
b3JpZW50YXRpb24pIHsNCisgICAgY2FzZSBDb21wb3NpdGluZ0Nvb3JkaW5hdGVzVG9wRG93bjoN
CisgICAgICAgIG1fbGF5ZXItPnNldEdlb21ldHJ5RmxpcHBlZChmYWxzZSk7DQorICAgICAgICBi
cmVhazsNCisgICAgICAgIA0KKyAgICBjYXNlIENvbXBvc2l0aW5nQ29vcmRpbmF0ZXNCb3R0b21V
cDoNCisgICAgICAgIG1fbGF5ZXItPnNldEdlb21ldHJ5RmxpcHBlZCh0cnVlKTsNCisgICAgICAg
IGJyZWFrOw0KKyAgICB9DQorfQ0KKw0KK1BsYXRmb3JtTGF5ZXIqIEdyYXBoaWNzTGF5ZXJDQUNG
Ojpob3N0TGF5ZXJGb3JTdWJsYXllcnMoKSBjb25zdA0KK3sNCisgICAgcmV0dXJuIG1fdHJhbnNm
b3JtTGF5ZXIgPyBtX3RyYW5zZm9ybUxheWVyLmdldCgpIDogbV9sYXllci5nZXQoKTsNCit9DQor
DQorUGxhdGZvcm1MYXllciogR3JhcGhpY3NMYXllckNBQ0Y6OmxheWVyRm9yU3VwZXJsYXllcigp
IGNvbnN0DQorew0KKyAgICBpZiAobV90cmFuc2Zvcm1MYXllcikNCisgICAgICAgIHJldHVybiBt
X3RyYW5zZm9ybUxheWVyLmdldCgpOw0KKw0KKyAgICByZXR1cm4gbV9sYXllci5nZXQoKTsNCit9
DQorDQorUGxhdGZvcm1MYXllciogR3JhcGhpY3NMYXllckNBQ0Y6OnBsYXRmb3JtTGF5ZXIoKSBj
b25zdA0KK3sNCisgICAgcmV0dXJuIHByaW1hcnlMYXllcigpOw0KK30NCisNCisjaWZuZGVmIE5E
RUJVRw0KK3ZvaWQgR3JhcGhpY3NMYXllckNBQ0Y6OnNldERlYnVnQmFja2dyb3VuZENvbG9yKGNv
bnN0IENvbG9yJiBjb2xvcikNCit7DQorICAgIGlmIChjb2xvci5pc1ZhbGlkKCkpDQorICAgICAg
ICBzZXRMYXllckJhY2tncm91bmRDb2xvcihtX2xheWVyLmdldCgpLCBjb2xvcik7DQorICAgIGVs
c2UNCisgICAgICAgIGNsZWFyTGF5ZXJCYWNrZ3JvdW5kQ29sb3IobV9sYXllci5nZXQoKSk7DQor
fQ0KKw0KK3ZvaWQgR3JhcGhpY3NMYXllckNBQ0Y6OnNldERlYnVnQm9yZGVyKGNvbnN0IENvbG9y
JiBjb2xvciwgZmxvYXQgYm9yZGVyV2lkdGgpDQorew0KKyAgICBpZiAoY29sb3IuaXNWYWxpZCgp
KSB7DQorICAgICAgICBzZXRMYXllckJvcmRlckNvbG9yKG1fbGF5ZXIuZ2V0KCksIGNvbG9yKTsN
CisgICAgICAgIG1fbGF5ZXItPnNldEJvcmRlcldpZHRoKGJvcmRlcldpZHRoKTsNCisgICAgfSBl
bHNlIHsNCisgICAgICAgIGNsZWFyQm9yZGVyQ29sb3IobV9sYXllci5nZXQoKSk7DQorICAgICAg
ICBtX2xheWVyLT5zZXRCb3JkZXJXaWR0aCgwKTsNCisgICAgfQ0KK30NCisjZW5kaWYNCisNCiti
b29sIEdyYXBoaWNzTGF5ZXJDQUNGOjpyZXF1aXJlc1RpbGVkTGF5ZXIoY29uc3QgRmxvYXRTaXpl
JiBzaXplKSBjb25zdA0KK3sNCisgICAgaWYgKCFtX2RyYXdzQ29udGVudCkNCisgICAgICAgIHJl
dHVybiBmYWxzZTsNCisNCisgICAgLy8gRklYTUU6IGNhdGNoIHplcm8tc2l6ZSBoZWlnaHQgb3Ig
d2lkdGggaGVyZSAob3IgZWFybGllcik/DQorICAgIHJldHVybiBzaXplLndpZHRoKCkgPiBjTWF4
UGl4ZWxEaW1lbnNpb24gfHwgc2l6ZS5oZWlnaHQoKSA+IGNNYXhQaXhlbERpbWVuc2lvbjsNCit9
DQorDQorR3JhcGhpY3NMYXllcjo6Q29tcG9zaXRpbmdDb29yZGluYXRlc09yaWVudGF0aW9uIEdy
YXBoaWNzTGF5ZXJDQUNGOjpkZWZhdWx0Q29udGVudHNPcmllbnRhdGlvbigpIGNvbnN0DQorew0K
KyAgICByZXR1cm4gQ29tcG9zaXRpbmdDb29yZGluYXRlc0JvdHRvbVVwOw0KK30NCisNCit2b2lk
IEdyYXBoaWNzTGF5ZXJDQUNGOjp1cGRhdGVDb250ZW50c1RyYW5zZm9ybSgpDQorew0KKyAgICBB
U1NFUlQoY29udGVudHNPcmllbnRhdGlvbigpID09IENvbXBvc2l0aW5nQ29vcmRpbmF0ZXNUb3BE
b3duKTsNCit9DQorDQordm9pZCBHcmFwaGljc0xheWVyQ0FDRjo6c2V0dXBDb250ZW50c0xheWVy
KFdLQ0FDRkxheWVyKiBjb250ZW50c0xheWVyKQ0KK3sNCisgICAgaWYgKGNvbnRlbnRzTGF5ZXIg
PT0gbV9jb250ZW50c0xheWVyKQ0KKyAgICAgICAgcmV0dXJuOw0KKw0KKyAgICBpZiAobV9jb250
ZW50c0xheWVyKSB7DQorICAgICAgICBtX2NvbnRlbnRzTGF5ZXItPnJlbW92ZUZyb21TdXBlcmxh
eWVyKCk7DQorICAgICAgICBtX2NvbnRlbnRzTGF5ZXIgPSAwOw0KKyAgICB9DQorICAgIA0KKyAg
ICBpZiAoY29udGVudHNMYXllcikgew0KKyAgICAgICAgLy8gVHVybiBvZmYgaW1wbGljaXQgYW5p
bWF0aW9ucyBvbiB0aGUgaW5uZXIgbGF5ZXIuDQorICAgICAgICBtX2NvbnRlbnRzTGF5ZXIgPSBj
b250ZW50c0xheWVyOw0KKw0KKyAgICAgICAgaWYgKGRlZmF1bHRDb250ZW50c09yaWVudGF0aW9u
KCkgPT0gQ29tcG9zaXRpbmdDb29yZGluYXRlc0JvdHRvbVVwKSB7DQorICAgICAgICAgICAgQ0FU
cmFuc2Zvcm0zRCBmbGlwcGVyID0gew0KKyAgICAgICAgICAgICAgICAxLjBmLCAwLjBmLCAwLjBm
LCAwLjBmLA0KKyAgICAgICAgICAgICAgICAwLjBmLCAtMS4wZiwgMC4wZiwgMC4wZiwNCisgICAg
ICAgICAgICAgICAgMC4wZiwgMC4wZiwgMS4wZiwgMC4wZiwNCisgICAgICAgICAgICAgICAgMC4w
ZiwgMC4wZiwgMC4wZiwgMS4wZn07DQorICAgICAgICAgICAgbV9jb250ZW50c0xheWVyLT5zZXRU
cmFuc2Zvcm0oZmxpcHBlcik7DQorICAgICAgICAgICAgbV9jb250ZW50c0xheWVyLT5zZXRBbmNo
b3JQb2ludChDR1BvaW50TWFrZSgwLjBmLCAxLjBmKSk7DQorICAgICAgICB9IGVsc2UNCisgICAg
ICAgICAgICBtX2NvbnRlbnRzTGF5ZXItPnNldEFuY2hvclBvaW50KENHUG9pbnRNYWtlKDAuMGYs
IDAuMGYpKTsNCisNCisgICAgICAgIC8vIEluc2VydCB0aGUgY29udGVudCBsYXllciBmaXJzdC4g
VmlkZW8gZWxlbWVudHMgcmVxdWlyZSB0aGlzLCBiZWNhdXNlIHRoZXkgaGF2ZQ0KKyAgICAgICAg
Ly8gc2hhZG93IGNvbnRlbnQgdGhhdCBtdXN0IGRpc3BsYXkgaW4gZnJvbnQgb2YgdGhlIHZpZGVv
Lg0KKyAgICAgICAgbV9sYXllci0+aW5zZXJ0U3VibGF5ZXIobV9jb250ZW50c0xheWVyLmdldCgp
LCAwKTsNCisNCisgICAgICAgIHVwZGF0ZUNvbnRlbnRzUmVjdCgpOw0KKw0KKyNpZm5kZWYgTkRF
QlVHDQorICAgICAgICBpZiAoc2hvd0RlYnVnQm9yZGVycygpKSB7DQorICAgICAgICAgICAgc2V0
TGF5ZXJCb3JkZXJDb2xvcihtX2NvbnRlbnRzTGF5ZXIuZ2V0KCksIENvbG9yKDAsIDAsIDEyOCwg
MTgwKSk7DQorICAgICAgICAgICAgbV9jb250ZW50c0xheWVyLT5zZXRCb3JkZXJXaWR0aCgxLjBm
KTsNCisgICAgICAgIH0NCisjZW5kaWYNCisgICAgfQ0KKyNpZm5kZWYgTkRFQlVHDQorICAgIHVw
ZGF0ZURlYnVnSW5kaWNhdG9ycygpOw0KKyNlbmRpZg0KK30NCisNCit9IC8vIG5hbWVzcGFjZSBX
ZWJDb3JlDQorDQorI2VuZGlmIC8vIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVEkNClwgTm8gbmV3
bGluZSBhdCBlbmQgb2YgZmlsZQ0KDQpQcm9wZXJ0eSBjaGFuZ2VzIG9uOiBXZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL3dpbi9HcmFwaGljc0xheWVyQ0FDRi5jcHANCl9fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCkFkZGVk
OiBzdm46ZXhlY3V0YWJsZQ0KICAgKyAqDQoNCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL3dpbi9HcmFwaGljc0xheWVyQ0FDRi5oDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotLS0gV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy93aW4vR3JhcGhpY3NMYXllckNBQ0YuaAkocmV2aXNpb24gMCkNCisrKyBX
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9HcmFwaGljc0xheWVyQ0FDRi5oCShyZXZpc2lv
biAwKQ0KQEAgLTAsMCArMSwxMzMgQEANCisvKg0KKyAqIENvcHlyaWdodCAoQykgMjAwOSBBcHBs
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorICoNCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCisgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMNCisgKiBhcmUgbWV0Og0KKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKyAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0DQorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQ0KKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uDQorICoNCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkN
CisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRQ0KKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUg0KKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
ICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUg0KKyAqIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLA0KKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywNCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1INCisgKiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZDQorICog
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUDQorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFDQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gDQorICovDQorDQorI2lmbmRl
ZiBHcmFwaGljc0xheWVyQ0FDRl9oXw0KKyNkZWZpbmUgR3JhcGhpY3NMYXllckNBQ0ZfaF8NCisN
CisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQ0KKw0KKyNpbmNsdWRlICJHcmFwaGlj
c0xheWVyLmgiDQorI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIg0KKyNpbmNsdWRlIDx3dGYv
UmV0YWluUHRyLmg+DQorDQorbmFtZXNwYWNlIFdlYkNvcmUgew0KKw0KK2NsYXNzIFdLQ0FDRkxh
eWVyOw0KKw0KK2NsYXNzIEdyYXBoaWNzTGF5ZXJDQUNGIDogcHVibGljIEdyYXBoaWNzTGF5ZXIg
ew0KK3B1YmxpYzoNCisNCisgICAgR3JhcGhpY3NMYXllckNBQ0YoR3JhcGhpY3NMYXllckNsaWVu
dCopOw0KKyAgICB2aXJ0dWFsIH5HcmFwaGljc0xheWVyQ0FDRigpOw0KKw0KKyAgICB2aXJ0dWFs
IHZvaWQgbGF5b3V0KCkgeyB9DQorDQorICAgIHZpcnR1YWwgdm9pZCBzZXROYW1lKGNvbnN0IFN0
cmluZyYgaW5OYW1lKTsNCisNCisgICAgLy8gZm9yIGhvc3RpbmcgdGhpcyBHcmFwaGljc0xheWVy
IGluIGEgbmF0aXZlIGxheWVyIGhpZXJhcmNoeQ0KKyAgICB2aXJ0dWFsIE5hdGl2ZUxheWVyIG5h
dGl2ZUxheWVyKCkgY29uc3Q7DQorDQorICAgIHZpcnR1YWwgdm9pZCBhZGRDaGlsZChHcmFwaGlj
c0xheWVyICpsYXllcik7DQorICAgIHZpcnR1YWwgdm9pZCBhZGRDaGlsZEF0SW5kZXgoR3JhcGhp
Y3NMYXllciAqbGF5ZXIsIGludCBpbmRleCk7DQorICAgIHZpcnR1YWwgdm9pZCBhZGRDaGlsZEFi
b3ZlKEdyYXBoaWNzTGF5ZXIgKmxheWVyLCBHcmFwaGljc0xheWVyICpzaWJsaW5nKTsNCisgICAg
dmlydHVhbCB2b2lkIGFkZENoaWxkQmVsb3coR3JhcGhpY3NMYXllciAqbGF5ZXIsIEdyYXBoaWNz
TGF5ZXIgKnNpYmxpbmcpOw0KKyAgICB2aXJ0dWFsIGJvb2wgcmVwbGFjZUNoaWxkKEdyYXBoaWNz
TGF5ZXIgKm9sZENoaWxkLCBHcmFwaGljc0xheWVyICpuZXdDaGlsZCk7DQorDQorICAgIHZpcnR1
YWwgdm9pZCByZW1vdmVGcm9tUGFyZW50KCk7DQorDQorICAgIHZpcnR1YWwgdm9pZCBzZXRQb3Np
dGlvbihjb25zdCBGbG9hdFBvaW50JiBpblBvaW50KTsNCisgICAgdmlydHVhbCB2b2lkIHNldEFu
Y2hvclBvaW50KGNvbnN0IEZsb2F0UG9pbnQzRCYgaW5Qb2ludCk7DQorICAgIHZpcnR1YWwgdm9p
ZCBzZXRTaXplKGNvbnN0IEZsb2F0U2l6ZSYgaW5TaXplKTsNCisNCisgICAgdmlydHVhbCB2b2lk
IHNldFRyYW5zZm9ybShjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYpOw0KKw0KKyAgICB2aXJ0
dWFsIHZvaWQgc2V0Q2hpbGRyZW5UcmFuc2Zvcm0oY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgm
KTsNCisNCisgICAgdmlydHVhbCB2b2lkIHNldFByZXNlcnZlczNEKGJvb2wpOw0KKyAgICB2aXJ0
dWFsIHZvaWQgc2V0TWFza3NUb0JvdW5kcyhib29sKTsNCisgICAgdmlydHVhbCB2b2lkIHNldERy
YXdzQ29udGVudChib29sKTsNCisNCisgICAgdmlydHVhbCB2b2lkIHNldEJhY2tncm91bmRDb2xv
cihjb25zdCBDb2xvciYpOw0KKyAgICB2aXJ0dWFsIHZvaWQgY2xlYXJCYWNrZ3JvdW5kQ29sb3Io
KTsNCisNCisgICAgdmlydHVhbCB2b2lkIHNldENvbnRlbnRzT3BhcXVlKGJvb2wpOw0KKyAgICB2
aXJ0dWFsIHZvaWQgc2V0QmFja2ZhY2VWaXNpYmlsaXR5KGJvb2wpOw0KKw0KKyAgICAvLyByZXR1
cm4gdHJ1ZSBpZiB3ZSBzdGFydGVkIGFuIGFuaW1hdGlvbg0KKyAgICB2aXJ0dWFsIHZvaWQgc2V0
T3BhY2l0eShmbG9hdCBvcGFjaXR5KTsNCisNCisgICAgdmlydHVhbCB2b2lkIHNldE5lZWRzRGlz
cGxheSgpOw0KKyAgICB2aXJ0dWFsIHZvaWQgc2V0TmVlZHNEaXNwbGF5SW5SZWN0KGNvbnN0IEZs
b2F0UmVjdCYpOw0KKw0KKyAgICB2aXJ0dWFsIHZvaWQgc2V0Q29udGVudHNSZWN0KGNvbnN0IElu
dFJlY3QmKTsNCisNCisgICAgdmlydHVhbCB2b2lkIHNldENvbnRlbnRzVG9JbWFnZShJbWFnZSop
Ow0KKyAgICB2aXJ0dWFsIHZvaWQgc2V0Q29udGVudHNUb1ZpZGVvKFBsYXRmb3JtTGF5ZXIqKTsN
CisgICAgDQorICAgIHZpcnR1YWwgUGxhdGZvcm1MYXllciogcGxhdGZvcm1MYXllcigpIGNvbnN0
Ow0KKw0KKyNpZm5kZWYgTkRFQlVHDQorICAgIHZpcnR1YWwgdm9pZCBzZXREZWJ1Z0JhY2tncm91
bmRDb2xvcihjb25zdCBDb2xvciYpOw0KKyAgICB2aXJ0dWFsIHZvaWQgc2V0RGVidWdCb3JkZXIo
Y29uc3QgQ29sb3ImLCBmbG9hdCBib3JkZXJXaWR0aCk7DQorI2VuZGlmDQorDQorICAgIHZpcnR1
YWwgdm9pZCBzZXRHZW9tZXRyeU9yaWVudGF0aW9uKENvbXBvc2l0aW5nQ29vcmRpbmF0ZXNPcmll
bnRhdGlvbik7DQorDQorICAgIHZvaWQgbm90aWZ5U3luY1JlcXVpcmVkKCkgeyBpZiAobV9jbGll
bnQpIG1fY2xpZW50LT5ub3RpZnlTeW5jUmVxdWlyZWQodGhpcyk7IH0NCisNCitwcml2YXRlOg0K
KyAgICBXS0NBQ0ZMYXllciogcHJpbWFyeUxheWVyKCkgY29uc3QgIHsgcmV0dXJuIG1fdHJhbnNm
b3JtTGF5ZXIuZ2V0KCkgPyBtX3RyYW5zZm9ybUxheWVyLmdldCgpIDogbV9sYXllci5nZXQoKTsg
fQ0KKyAgICBXS0NBQ0ZMYXllciogaG9zdExheWVyRm9yU3VibGF5ZXJzKCkgY29uc3Q7DQorICAg
IFdLQ0FDRkxheWVyKiBsYXllckZvclN1cGVybGF5ZXIoKSBjb25zdDsNCisNCisgICAgdm9pZCB1
cGRhdGVDb250ZW50c1JlY3QoKTsNCisNCisgICAgYm9vbCByZXF1aXJlc1RpbGVkTGF5ZXIoY29u
c3QgRmxvYXRTaXplJikgY29uc3Q7DQorICAgIHZvaWQgc3dhcEZyb21PclRvVGlsZWRMYXllcihi
b29sIGluVXNlVGlsZWRMYXllcikgeyB9DQorDQorICAgIENvbXBvc2l0aW5nQ29vcmRpbmF0ZXNP
cmllbnRhdGlvbiBkZWZhdWx0Q29udGVudHNPcmllbnRhdGlvbigpIGNvbnN0Ow0KKyAgICB2b2lk
IHVwZGF0ZUNvbnRlbnRzVHJhbnNmb3JtKCk7DQorICAgIA0KKyAgICB2b2lkIHNldHVwQ29udGVu
dHNMYXllcihXS0NBQ0ZMYXllciopOw0KKyAgICBXS0NBQ0ZMYXllciogY29udGVudHNMYXllcigp
IGNvbnN0IHsgcmV0dXJuIG1fY29udGVudHNMYXllci5nZXQoKTsgfQ0KKyAgICANCisgICAgUmVm
UHRyPFdLQ0FDRkxheWVyPiBtX2xheWVyOw0KKyAgICBSZWZQdHI8V0tDQUNGTGF5ZXI+IG1fdHJh
bnNmb3JtTGF5ZXI7DQorICAgIFJlZlB0cjxXS0NBQ0ZMYXllcj4gbV9jb250ZW50c0xheWVyOw0K
Kw0KKyAgICBlbnVtIENvbnRlbnRzTGF5ZXJQdXJwb3NlIHsNCisgICAgICAgIE5vQ29udGVudHNM
YXllciA9IDAsDQorICAgICAgICBDb250ZW50c0xheWVyRm9ySW1hZ2UsDQorICAgICAgICBDb250
ZW50c0xheWVyRm9yVmlkZW8NCisgICAgfTsNCisgICAgDQorICAgIENvbnRlbnRzTGF5ZXJQdXJw
b3NlIG1fY29udGVudHNMYXllclB1cnBvc2U7DQorfTsNCisNCit9IC8vIG5hbWVzcGFjZSBXZWJD
b3JlDQorDQorI2VuZGlmIC8vIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykNCisNCisjZW5k
aWYgLy8gR3JhcGhpY3NMYXllckNBQ0ZfaF8NCg0KUHJvcGVydHkgY2hhbmdlcyBvbjogV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vR3JhcGhpY3NMYXllckNBQ0YuaA0KX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0K
QWRkZWQ6IHN2bjpleGVjdXRhYmxlDQogICArICoNCg0KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3Mvd2luL1dLQ0FDRkNvbnRleHRGbHVzaGVyLmNwcA0KPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLS0tIFdl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1dLQ0FDRkNvbnRleHRGbHVzaGVyLmNwcAkocmV2
aXNpb24gMCkNCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9XS0NBQ0ZDb250ZXh0
Rmx1c2hlci5jcHAJKHJldmlzaW9uIDApDQpAQCAtMCwwICsxLDcwIEBADQorLyoNCisgKiAgQ29u
dGV4dEZsdXNoZXIuY3BwDQorICogIFdlYkNvcmUNCisgKg0KKyAqICBDcmVhdGVkIGJ5IEFkYW0g
Um9iZW4gb24gNi8yNC8wOC4NCisgKiAgQWRhcHRlZCBmcm9tIENvbnRleHRGbHVzaGVyIGJ5IENo
cmlzIE1hcnJpbiBvbiAxMC8yMS8wOC4NCisgKiAgQ29weXJpZ2h0IDIwMDggQXBwbGUgSW5jLiBB
bGwgcmlnaHRzIHJlc2VydmVkLg0KKyAqDQorICovDQorDQorI2luY2x1ZGUgIldLQ0FDRkNvbnRl
eHRGbHVzaGVyLmgiDQorDQorI2luY2x1ZGUgPFF1YXJ0ekNvcmUvQ0FDRkNvbnRleHQuaD4NCisN
CituYW1lc3BhY2UgV2ViQ29yZSB7DQorDQorV0tDQUNGQ29udGV4dEZsdXNoZXImIFdLQ0FDRkNv
bnRleHRGbHVzaGVyOjpzaGFyZWQoKQ0KK3sNCisgICAgc3RhdGljIFdLQ0FDRkNvbnRleHRGbHVz
aGVyJiBmbHVzaGVyID0gKm5ldyBXS0NBQ0ZDb250ZXh0Rmx1c2hlcjsNCisgICAgcmV0dXJuIGZs
dXNoZXI7DQorfQ0KKw0KK1dLQ0FDRkNvbnRleHRGbHVzaGVyOjpXS0NBQ0ZDb250ZXh0Rmx1c2hl
cigpDQorew0KKyAgICBpbml0aWFsaXplKCk7DQorfQ0KKw0KK1dLQ0FDRkNvbnRleHRGbHVzaGVy
Ojp+V0tDQUNGQ29udGV4dEZsdXNoZXIoKQ0KK3sNCit9DQorDQordm9pZCBXS0NBQ0ZDb250ZXh0
Rmx1c2hlcjo6YWRkQ29udGV4dChDQUNGQ29udGV4dFJlZiBjb250ZXh0KQ0KK3sNCisgICAgaWYg
KCFjb250ZXh0KQ0KKyAgICAgICAgcmV0dXJuOw0KKw0KKyAgICBpZiAobV9jb250ZXh0cy5hZGQo
Y29udGV4dCkuc2Vjb25kKQ0KKyAgICAgICAgQ0ZSZXRhaW4oY29udGV4dCk7DQorfQ0KKw0KK3Zv
aWQgV0tDQUNGQ29udGV4dEZsdXNoZXI6OnJlbW92ZUNvbnRleHQoQ0FDRkNvbnRleHRSZWYgY29u
dGV4dCkNCit7DQorICAgIGlmICghY29udGV4dCkNCisgICAgICAgIHJldHVybjsNCisNCisgICAg
Q29udGV4dFNldDo6aXRlcmF0b3IgZm91bmQgPSBtX2NvbnRleHRzLmZpbmQoY29udGV4dCk7DQor
ICAgIGlmIChmb3VuZCA9PSBtX2NvbnRleHRzLmVuZCgpKQ0KKyAgICAgICAgcmV0dXJuOw0KKw0K
KyAgICBDRlJlbGVhc2UoKmZvdW5kKTsNCisgICAgbV9jb250ZXh0cy5yZW1vdmUoZm91bmQpOw0K
K30NCisNCit2b2lkIFdLQ0FDRkNvbnRleHRGbHVzaGVyOjpmbHVzaEFsbENvbnRleHRzKCkNCit7
DQorICAgIC8vIGFkZENvbnRleHQgbWlnaHQgZ2V0IGNhbGxlZCBiZW5lYXRoIENBQ0ZDb250ZXh0
Rmx1c2gsIGFuZCB3ZSBkb24ndCB3YW50IG1fY29udGV4dHMgdG8gY2hhbmdlIHdoaWxlDQorICAg
IC8vIHdlJ3JlIGl0ZXJhdGluZyBvdmVyIGl0LCBzbyB3ZSBtb3ZlIHRoZSBjb250ZXh0cyBpbnRv
IGEgbG9jYWwgQ29udGV4dFNldCBhbmQgaXRlcmF0ZSBvdmVyIHRoYXQgaW5zdGVhZC4NCisgICAg
Q29udGV4dFNldCBjb250ZXh0c1RvRmx1c2g7DQorICAgIGNvbnRleHRzVG9GbHVzaC5zd2FwKG1f
Y29udGV4dHMpOw0KKw0KKyAgICBDb250ZXh0U2V0Ojpjb25zdF9pdGVyYXRvciBlbmQgPSBjb250
ZXh0c1RvRmx1c2guZW5kKCk7DQorICAgIGZvciAoQ29udGV4dFNldDo6Y29uc3RfaXRlcmF0b3Ig
aXQgPSBjb250ZXh0c1RvRmx1c2guYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7DQorICAgICAg
ICBDQUNGQ29udGV4dFJlZiBjb250ZXh0ID0gKml0Ow0KKyAgICAgICAgQ0FDRkNvbnRleHRGbHVz
aChjb250ZXh0KTsNCisgICAgICAgIGRpZEZsdXNoQ29udGV4dChjb250ZXh0KTsNCisgICAgICAg
IENGUmVsZWFzZShjb250ZXh0KTsNCisgICAgfQ0KK30NCisNCit9DQoNClByb3BlcnR5IGNoYW5n
ZXMgb246IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1dLQ0FDRkNvbnRleHRGbHVzaGVy
LmNwcA0KX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fXw0KQWRkZWQ6IHN2bjpleGVjdXRhYmxlDQogICArICoNCg0KSW5kZXg6
IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1dLQ0FDRkNvbnRleHRGbHVzaGVyLmgNCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0NCi0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9XS0NBQ0ZDb250ZXh0
Rmx1c2hlci5oCShyZXZpc2lvbiAwKQ0KKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2lu
L1dLQ0FDRkNvbnRleHRGbHVzaGVyLmgJKHJldmlzaW9uIDApDQpAQCAtMCwwICsxLDQ3IEBADQor
LyoNCisgKiAgQ29udGV4dEZsdXNoZXIuaA0KKyAqICBXZWJDb3JlDQorICoNCisgKiAgQ3JlYXRl
ZCBieSBBZGFtIFJvYmVuIG9uIDYvMjQvMDguDQorICogIEFkYXB0ZWQgZnJvbSBDb250ZXh0Rmx1
c2hlciBieSBDaHJpcyBNYXJyaW4gb24gMTAvMjEvMDguDQorICogIENvcHlyaWdodCAyMDA4IEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisgKg0KKyAqLw0KKw0KKyNpZm5kZWYgV0tD
QUNGQ29udGV4dEZsdXNoZXJfaA0KKyNkZWZpbmUgV0tDQUNGQ29udGV4dEZsdXNoZXJfaA0KKw0K
KyNpbmNsdWRlICJjb25maWcuaCINCisNCisjaW5jbHVkZSA8d3RmL05vbmNvcHlhYmxlLmg+DQor
DQorI2luY2x1ZGUgPHd0Zi9IYXNoU2V0Lmg+DQorDQordHlwZWRlZiBzdHJ1Y3QgX0NBQ0ZDb250
ZXh0KiBDQUNGQ29udGV4dFJlZjsNCisNCituYW1lc3BhY2UgV2ViQ29yZSB7DQorDQorY2xhc3Mg
V0tDQUNGQ29udGV4dEZsdXNoZXIgOiBOb25jb3B5YWJsZSB7DQorcHVibGljOg0KKyAgICBzdGF0
aWMgV0tDQUNGQ29udGV4dEZsdXNoZXImIHNoYXJlZCgpOw0KKw0KKyAgICB2b2lkIGFkZENvbnRl
eHQoQ0FDRkNvbnRleHRSZWYpOw0KKyAgICB2b2lkIHJlbW92ZUNvbnRleHQoQ0FDRkNvbnRleHRS
ZWYpOw0KKw0KKyAgICB2b2lkIGZsdXNoQWxsQ29udGV4dHMoKTsNCisNCitwcml2YXRlOg0KKyAg
ICBXS0NBQ0ZDb250ZXh0Rmx1c2hlcigpOw0KKyAgICB+V0tDQUNGQ29udGV4dEZsdXNoZXIoKTsN
CisNCisgICAgc3RhdGljIHZvaWQgaW5pdGlhbGl6ZSgpOw0KKw0KKyAgICBzdGF0aWMgdm9pZCBk
aWRGbHVzaENvbnRleHQoQ0FDRkNvbnRleHRSZWYpOw0KKw0KKyAgICB0eXBlZGVmIEhhc2hTZXQ8
Q0FDRkNvbnRleHRSZWY+IENvbnRleHRTZXQ7DQorICAgIENvbnRleHRTZXQgbV9jb250ZXh0czsN
Cit9Ow0KKw0KK30NCisNCisjZW5kaWYgLy8gV0tDQUNGQ29udGV4dEZsdXNoZXJfaA0KDQpQcm9w
ZXJ0eSBjaGFuZ2VzIG9uOiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9XS0NBQ0ZDb250
ZXh0Rmx1c2hlci5oDQpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fDQpBZGRlZDogc3ZuOmV4ZWN1dGFibGUNCiAgICsgKg0K
DQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vV0tDQUNGQ29udGV4dEZsdXNo
ZXJXaW4uY3BwDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09DQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4v
V0tDQUNGQ29udGV4dEZsdXNoZXJXaW4uY3BwCShyZXZpc2lvbiAwKQ0KKysrIFdlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3Mvd2luL1dLQ0FDRkNvbnRleHRGbHVzaGVyV2luLmNwcAkocmV2aXNpb24g
MCkNCkBAIC0wLDAgKzEsMjYgQEANCisvKg0KKyAqICBDb250ZXh0Rmx1c2hlcldpbi5jcHANCisg
KiAgV2ViQ29yZQ0KKyAqDQorICogIENyZWF0ZWQgYnkgQWRhbSBSb2JlbiBvbiA2LzI0LzA4Lg0K
KyAqICBBZGFwdGVkIGZyb20gQ29udGV4dEZsdXNoZXIgYnkgQ2hyaXMgTWFycmluIG9uIDEwLzIx
LzA4Lg0KKyAqICBDb3B5cmlnaHQgMjAwOCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
DQorICoNCisgKi8NCisNCisjaW5jbHVkZSAiV0tDQUNGQ29udGV4dEZsdXNoZXIuaCINCisNCisj
aW5jbHVkZSAiV0tDQUNGTGF5ZXJXaW5kb3cuaCINCisNCituYW1lc3BhY2UgV2ViQ29yZSB7DQor
DQordm9pZCBXS0NBQ0ZDb250ZXh0Rmx1c2hlcjo6aW5pdGlhbGl6ZSgpDQorew0KK30NCisNCit2
b2lkIFdLQ0FDRkNvbnRleHRGbHVzaGVyOjpkaWRGbHVzaENvbnRleHQoQ0FDRkNvbnRleHRSZWYg
Y29udGV4dCkNCit7DQorICAgIFdLQ0FDRkxheWVyV2luZG93OjpkaWRGbHVzaENvbnRleHQoY29u
dGV4dCk7DQorfQ0KKw0KK30NCg0KUHJvcGVydHkgY2hhbmdlcyBvbjogV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy93aW4vV0tDQUNGQ29udGV4dEZsdXNoZXJXaW4uY3BwDQpfX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQpB
ZGRlZDogc3ZuOmV4ZWN1dGFibGUNCiAgICsgKg0KDQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy93aW4vV0tDQUNGTGF5ZXIuY3BwDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotLS0gV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy93aW4vV0tDQUNGTGF5ZXIuY3BwCShyZXZpc2lvbiAwKQ0KKysrIFdlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1dLQ0FDRkxheWVyLmNwcAkocmV2aXNpb24gMCkNCkBA
IC0wLDAgKzEsNDQ1IEBADQorLyoNCisgKiAgV0tDQUNGTGF5ZXIuY3BwDQorICogIFdlYkNvcmUN
CisgKg0KKyAqICBDcmVhdGVkIGJ5IEFkYW0gUm9iZW4gb24gNi8yNC8wOC4NCisgKiAgQWRhcHRl
ZCBmcm9tIENvcmVBbmltYXRpb25MYXllciBieSBDaHJpcyBNYXJyaW4gb24gMTAvMjEvMDguDQor
ICogIENvcHlyaWdodCAyMDA4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisgKg0K
KyAqLw0KKw0KKyNpbmNsdWRlICJXS0NBQ0ZMYXllci5oIg0KKw0KKyNpbmNsdWRlICJXS0NBQ0ZD
b250ZXh0Rmx1c2hlci5oIg0KKw0KKyNpbmNsdWRlIDxzdGRpby5oPg0KKyNpbmNsdWRlIDxRdWFy
dHpDb3JlL0NBQ0ZDb250ZXh0Lmg+DQorI2luY2x1ZGUgPFF1YXJ0ekNvcmUvQ0FSZW5kZXIuaD4N
CisjaW5jbHVkZSA8UXVhcnR6Q29yZS9DQVRyYW5zZm9ybTNEUHJpdmF0ZS5oPg0KKw0KK25hbWVz
cGFjZSBXZWJDb3JlIHsNCisNCisgICAgLy8gVGhlc2UgbWFjcm9zIHdlcmUgY29waWVkIGZyb20g
UXVhcnR6Q29yZS9MYXllcktpdC91dGlsaXRpZXMvQ0FDR1V0aWwuaA0KKyNpZm5kZWYgSFVHRV9W
QUxGDQorI2RlZmluZSBIVUdFX1ZBTEYgSFVHRV9WQUwNCisjZW5kaWYNCisNCisjaWYgIUNHRkxP
QVRfSVNfRE9VQkxFDQorI2RlZmluZSBDQV9DR0Zsb2F0X0hVR0UgSFVHRV9WQUxGDQorI2RlZmlu
ZSBDQV9DR0Zsb2F0X01BWCAgRkxUX01BWA0KKyNkZWZpbmUgQ0FfQ0dGbG9hdF9NSU4gIEZMVF9N
SU4NCisjZWxzZQ0KKyNkZWZpbmUgQ0FfQ0dGbG9hdF9IVUdFIEhVR0VfVkFMDQorI2RlZmluZSBD
QV9DR0Zsb2F0X01BWCAgREJMX01BWA0KKyNkZWZpbmUgQ0FfQ0dGbG9hdF9NSU4gIERCTF9NSU4N
CisjZW5kaWYNCisNCit1c2luZyBuYW1lc3BhY2Ugc3RkOw0KKw0KKyNwcmFnbWEgbWFyayBDYWxs
YmFja3MNCisNCitzdGF0aWMgdm9pZCBsYXlvdXRTdWJsYXllcnMoQ0FDRkxheWVyUmVmIGxheWVy
KQ0KK3sNCisgICAgQVNTRVJUX0FSRyhsYXllciwgV0tDQUNGTGF5ZXI6OmxheWVyKGxheWVyKSk7
DQorICAgIFdLQ0FDRkxheWVyOjpsYXllcihsYXllciktPmxheW91dCgpOw0KK30NCisNCitzdGF0
aWMgdm9pZCBkaXNwbGF5SW5Db250ZXh0KENBQ0ZMYXllclJlZiBsYXllciwgQ0dDb250ZXh0UmVm
IGNvbnRleHQpDQorew0KKyAgICBBU1NFUlRfQVJHKGxheWVyLCBXS0NBQ0ZMYXllcjo6bGF5ZXIo
bGF5ZXIpKTsNCisgICAgV0tDQUNGTGF5ZXI6OmxheWVyKGxheWVyKS0+ZGlzcGxheShjb250ZXh0
KTsNCit9DQorDQorI3ByYWdtYSBtYXJrIFdLQ0FDRkxheWVyDQorDQorLy8gRklYTUU6IEl0IG1p
Z2h0IGJlIGdvb2QgdG8gaGF2ZSBhIHdheSBvZiBlbnN1cmluZyB0aGF0IGFsbCBXS0NBQ0ZMYXll
cnMgZXZlbnR1YWxseQ0KKy8vIGdldCBkZXN0cm95ZWQgaW4gZGVidWcgYnVpbGRzLiBBIHN0YXRp
YyBjb3VudGVyIGNvdWxkIGFjY29tcGxpc2ggdGhpcyBwcmV0dHkgZWFzaWx5Lg0KKw0KK1dLQ0FD
RkxheWVyOjpXS0NBQ0ZMYXllcihDRlN0cmluZ1JlZiBjbGFzc05hbWUsIEdyYXBoaWNzTGF5ZXJD
QUNGKiBvd25lcikNCisgICAgOiBtX2xheWVyKEFkb3B0Q0YsIENBQ0ZMYXllckNyZWF0ZShjbGFz
c05hbWUpKQ0KKyAgICAsIG1fbmVlZHNMYXlvdXRPbkJvdW5kc0NoYW5nZShmYWxzZSkNCisgICAg
LCBtX25lZWRzRGlzcGxheU9uQm91bmRzQ2hhbmdlKGZhbHNlKQ0KKyAgICAsIG1fb3duZXIob3du
ZXIpDQorew0KKyAgICBDQUNGTGF5ZXJTZXRVc2VyRGF0YShsYXllcigpLCB0aGlzKTsNCisgICAg
Q0FDRkxheWVyU2V0TGF5b3V0Q2FsbGJhY2sobGF5ZXIoKSwgbGF5b3V0U3VibGF5ZXJzKTsNCisg
ICAgQ0FDRkxheWVyU2V0RGlzcGxheUNhbGxiYWNrKGxheWVyKCksIGRpc3BsYXlJbkNvbnRleHQp
Ow0KK30NCisNCitXS0NBQ0ZMYXllcjo6fldLQ0FDRkxheWVyKCkNCit7DQorICAgIC8vIE91ciBz
dXBlcmxheWVyIHNob3VsZCBiZSBob2xkaW5nIGEgcmVmZXJlbmNlIHRvIHVzLCBzbyB0aGVyZSBz
aG91bGQgYmUgbm8gd2F5IGZvciB1cyB0byBiZSBkZXN0cm95ZWQgd2hpbGUgd2Ugc3RpbGwgaGF2
ZSBhIHN1cGVybGF5ZXIuDQorICAgIEFTU0VSVCghc3VwZXJsYXllcigpKTsNCisNCisgICAgLy8g
V29ya2Fyb3VuZCBmb3IgPHJkYXI6Ly82MTI5Mzk3PiBDQUNGOiBXaGVuIGEgbGF5ZXIgaXMgZmlu
YWxpemVkLCBpdHMgc3VibGF5ZXJzJyBzdXBlcmxheWVyIHBvaW50ZXJzIGFyZSBub3QgY2xlYXJl
ZCwgbGVhZGluZyB0byBkZXJlZmVyZW5jZXMgb2YgZnJlZWQgbWVtb3J5L2NyYXNoZXMNCisgICAg
Zm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX3N1YmxheWVycy5zaXplKCk7ICsraSkNCisgICAgICAg
IENBQ0ZMYXllclJlbW92ZUZyb21TdXBlcmxheWVyKG1fc3VibGF5ZXJzW2ldLT5sYXllcigpKTsN
CisNCisgICAgQ0FDRkxheWVyU2V0VXNlckRhdGEobGF5ZXIoKSwgMCk7DQorICAgIENBQ0ZMYXll
clNldExheW91dENhbGxiYWNrKGxheWVyKCksIDApOw0KKyAgICBDQUNGTGF5ZXJTZXREaXNwbGF5
Q2FsbGJhY2sobGF5ZXIoKSwgMCk7DQorfQ0KKw0KK3ZvaWQgV0tDQUNGTGF5ZXI6OmRpc3BsYXko
UGxhdGZvcm1HcmFwaGljc0NvbnRleHQqIGNvbnRleHQpDQorew0KKyAgICBpZiAoIW1fb3duZXIp
DQorICAgICAgICByZXR1cm47DQorDQorICAgIENHQ29udGV4dFNhdmVHU3RhdGUoY29udGV4dCk7
DQorDQorICAgIENHUmVjdCBsYXllckJvdW5kcyA9IGJvdW5kcygpOw0KKyAgICBpZiAobV9vd25l
ci0+Y29udGVudHNPcmllbnRhdGlvbigpID09IFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXI6OkNvbXBv
c2l0aW5nQ29vcmRpbmF0ZXNCb3R0b21VcCkgew0KKyAgICAgICAgQ0dDb250ZXh0U2NhbGVDVE0o
Y29udGV4dCwgMSwgLTEpOw0KKyAgICAgICAgQ0dDb250ZXh0VHJhbnNsYXRlQ1RNKGNvbnRleHQs
IDAsIC1sYXllckJvdW5kcy5zaXplLmhlaWdodCk7DQorICAgIH0NCisNCisgICAgaWYgKG1fb3du
ZXItPmNsaWVudCgpKSB7DQorICAgICAgICBHcmFwaGljc0NvbnRleHQgZ3JhcGhpY3NDb250ZXh0
KGNvbnRleHQpOw0KKw0KKyAgICAgICAgLy8gSXQncyBpbXBvcnRhbnQgdG8gZ2V0IHRoZSBjbGlw
IGZyb20gdGhlIGNvbnRleHQsIGJlY2F1c2UgaXQgbWF5IGJlIHNpZ25pZmljYW50bHkNCisgICAg
ICAgIC8vIHNtYWxsZXIgdGhhbiB0aGUgbGF5ZXIgYm91bmRzIChlLmcuIHRpbGVkIGxheWVycykN
CisgICAgICAgIENHUmVjdCBjbGlwQm91bmRzID0gQ0dDb250ZXh0R2V0Q2xpcEJvdW5kaW5nQm94
KGNvbnRleHQpOw0KKyAgICAgICAgSW50UmVjdCBjbGlwKGVuY2xvc2luZ0ludFJlY3QoY2xpcEJv
dW5kcykpOw0KKyAgICAgICAgbV9vd25lci0+cGFpbnRHcmFwaGljc0xheWVyQ29udGVudHMoZ3Jh
cGhpY3NDb250ZXh0LCBjbGlwKTsNCisgICAgfQ0KKyNpZm5kZWYgTkRFQlVHDQorICAgIGVsc2Ug
ew0KKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7DQorDQorICAgICAgICAvLyBGSVhNRTog
aWRlYWxseSB3ZSdkIGF2b2lkIGNhbGxpbmcgLXNldE5lZWRzRGlzcGxheSBvbiBhIGxheWVyIHRo
YXQgaXMgYSBwbGFpbiBjb2xvciwNCisgICAgICAgIC8vIHNvIENBIG5ldmVyIG1ha2VzIGJhY2tp
bmcgc3RvcmUgZm9yIGl0ICh3aGljaCBpcyB3aGF0IC1zZXROZWVkc0Rpc3BsYXkgd2lsbCBkbyBh
Ym92ZSkuDQorICAgICAgICBDR0NvbnRleHRTZXRSR0JGaWxsQ29sb3IoY29udGV4dCwgMC4wZiwg
MS4wZiwgMC4wZiwgMS4wZik7DQorICAgICAgICBDR0NvbnRleHRGaWxsUmVjdChjb250ZXh0LCBs
YXllckJvdW5kcyk7DQorICAgIH0NCisjZW5kaWYNCisNCisjaWZuZGVmIE5ERUJVRw0KKyAgICBp
ZiAobV9vd25lci0+c2hvd1JlcGFpbnRDb3VudGVyKCkpIHsNCisgICAgICAgIGNoYXIgdGV4dFsx
Nl07IC8vIHRoYXQncyBhIGxvdCBvZiByZXBhaW50cw0KKyAgICAgICAgX3NucHJpbnRmKHRleHQs
IHNpemVvZih0ZXh0KSwgIiVkIiwgbV9vd25lci0+aW5jcmVtZW50UmVwYWludENvdW50KCkpOw0K
Kw0KKyAgICAgICAgQ0dDb250ZXh0U2F2ZUdTdGF0ZShjb250ZXh0KTsNCisgICAgICAgIENHQ29u
dGV4dFNldFJHQkZpbGxDb2xvcihjb250ZXh0LCAxLjBmLCAwLjBmLCAwLjBmLCAwLjhmKTsNCisg
ICAgICAgIA0KKyAgICAgICAgQ0dSZWN0IGFCb3VuZHMgPSBsYXllckJvdW5kczsNCisNCisgICAg
ICAgIGFCb3VuZHMuc2l6ZS53aWR0aCA9IDEwICsgMTIgKiBzdHJsZW4odGV4dCk7DQorICAgICAg
ICBhQm91bmRzLnNpemUuaGVpZ2h0ID0gMjU7DQorICAgICAgICBDR0NvbnRleHRGaWxsUmVjdChj
b250ZXh0LCBhQm91bmRzKTsNCisgICAgICAgIA0KKyAgICAgICAgQ0dDb250ZXh0U2V0UkdCRmls
bENvbG9yKGNvbnRleHQsIDAuMGYsIDAuMGYsIDAuMGYsIDEuMGYpOw0KKw0KKyAgICAgICAgQ0dD
b250ZXh0U2V0VGV4dE1hdHJpeChjb250ZXh0LCBDR0FmZmluZVRyYW5zZm9ybU1ha2VTY2FsZSgx
LjBmLCAtMS4wZikpOw0KKyAgICAgICAgQ0dDb250ZXh0U2VsZWN0Rm9udChjb250ZXh0LCAiSGVs
dmV0aWNhIiwgMjUsIGtDR0VuY29kaW5nTWFjUm9tYW4pOw0KKyAgICAgICAgQ0dDb250ZXh0U2hv
d1RleHRBdFBvaW50KGNvbnRleHQsIGFCb3VuZHMub3JpZ2luLnggKyAzLjBmLCBhQm91bmRzLm9y
aWdpbi55ICsgMjAuMGYsIHRleHQsIHN0cmxlbih0ZXh0KSk7DQorICAgICAgICANCisgICAgICAg
IENHQ29udGV4dFJlc3RvcmVHU3RhdGUoY29udGV4dCk7ICAgICAgICANCisgICAgfQ0KKyNlbmRp
Zg0KKw0KKyAgICBDR0NvbnRleHRSZXN0b3JlR1N0YXRlKGNvbnRleHQpOw0KK30NCisNCit2b2lk
IFdLQ0FDRkxheWVyOjpsYXlvdXQoKQ0KK3sNCisJaWYgKG1fb3duZXIpDQorCQltX293bmVyLT5s
YXlvdXQoKTsNCit9DQorDQordm9pZCBXS0NBQ0ZMYXllcjo6YmVjb21lTGF5ZXJGb3JDb250ZXh0
KENBQ0ZDb250ZXh0UmVmIGNvbnRleHQpDQorew0KKyAgICBDQUNGQ29udGV4dFNldExheWVyKGNv
bnRleHQsIGxheWVyKCkpOw0KKyAgICBzZXROZWVkc0NvbW1pdCgpOw0KK30NCisNCit2b2lkIFdL
Q0FDRkxheWVyOjpzZXROZWVkc0NvbW1pdCgpDQorew0KKyAgICBXS0NBQ0ZDb250ZXh0Rmx1c2hl
cjo6c2hhcmVkKCkuYWRkQ29udGV4dChDQUNGTGF5ZXJHZXRDb250ZXh0KHJvb3RMYXllcigpLT5s
YXllcigpKSk7DQorICAgIGlmIChtX293bmVyKQ0KKyAgICAgICAgbV9vd25lci0+bm90aWZ5U3lu
Y1JlcXVpcmVkKCk7DQorfQ0KKw0KKyNwcmFnbWEgbWFyayBDb29yZGluYXRlIE1hcHBpbmcNCisN
CitDRlRpbWVJbnRlcnZhbCBXS0NBQ0ZMYXllcjo6Y29udmVydFRpbWUoQ0ZUaW1lSW50ZXJ2YWwg
dCwgY29uc3QgV0tDQUNGTGF5ZXIqIHRvTGF5ZXIpIGNvbnN0DQorew0KKyAgICByZXR1cm4gQ0FD
RkxheWVyQ29udmVydFRpbWUobGF5ZXIoKSwgdG9MYXllciA/IHRvTGF5ZXItPmxheWVyKCkgOiAw
LCB0KTsNCit9DQorDQorQ0dQb2ludCBXS0NBQ0ZMYXllcjo6Y29udmVydFBvaW50KGNvbnN0IENH
UG9pbnQmIHAsIGNvbnN0IFdLQ0FDRkxheWVyKiB0b0xheWVyKSBjb25zdA0KK3sNCisgICAgQ0dQ
b2ludCBjb252ZXJ0ZWRQb2ludCA9IHA7DQorICAgIENBQ0ZMYXllckNvbnZlcnRQb2ludChsYXll
cigpLCB0b0xheWVyID8gdG9MYXllci0+bGF5ZXIoKSA6IDAsICZjb252ZXJ0ZWRQb2ludCk7DQor
ICAgIHJldHVybiBjb252ZXJ0ZWRQb2ludDsNCit9DQorDQorQ0dSZWN0IFdLQ0FDRkxheWVyOjpj
b252ZXJ0UmVjdChjb25zdCBDR1JlY3QmIHIsIGNvbnN0IFdLQ0FDRkxheWVyKiB0b0xheWVyKSBj
b25zdA0KK3sNCisgICAgQ0dSZWN0IGNvbnZlcnRlZFJlY3QgPSByOw0KKyAgICBDQUNGTGF5ZXJD
b252ZXJ0UmVjdChsYXllcigpLCB0b0xheWVyID8gdG9MYXllci0+bGF5ZXIoKSA6IDAsICZjb252
ZXJ0ZWRSZWN0KTsNCisgICAgcmV0dXJuIGNvbnZlcnRlZFJlY3Q7DQorfQ0KKw0KKyNwcmFnbWEg
bWFyayBBbmNlc3RyeQ0KKw0KK3ZvaWQgV0tDQUNGTGF5ZXI6Omluc2VydFN1YmxheWVyKFBhc3NS
ZWZQdHI8V0tDQUNGTGF5ZXI+IHBycFN1YmxheWVyLCBzaXplX3QgaW5kZXgpDQorew0KKyAgICBj
aGVja1N1YmxheWVyc0NvbnNpc3RlbmN5KCk7DQorDQorICAgIFJlZlB0cjxXS0NBQ0ZMYXllcj4g
c3VibGF5ZXIgPSBwcnBTdWJsYXllcjsNCisNCisgICAgaW5kZXggPSBtaW4oaW5kZXgsIG1fc3Vi
bGF5ZXJzLnNpemUoKSk7DQorDQorICAgIC8vIFRoaXMgYml0IG9mIGxvZ2ljIG1hdGNoZXMgLVtD
QUxheWVyIGluc2VydFN1YmxheWVyOmF0SW5kZXg6XS4NCisgICAgaWYgKFdLQ0FDRkxheWVyKiBz
dXBlcmxheWVyID0gc3VibGF5ZXItPnN1cGVybGF5ZXIoKSkgew0KKyAgICAgICAgaWYgKHN1cGVy
bGF5ZXIgPT0gdGhpcykgew0KKyAgICAgICAgICAgIHNpemVfdCBleGlzdGluZ0luZGV4ID0gbV9z
dWJsYXllcnMuZmluZChzdWJsYXllcik7DQorICAgICAgICAgICAgQVNTRVJUKGV4aXN0aW5nSW5k
ZXggIT0gV1RGOjpub3RGb3VuZCk7DQorICAgICAgICAgICAgaWYgKGV4aXN0aW5nSW5kZXggPT0g
aW5kZXgpDQorICAgICAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgICAgICAvLyBSZW1vdmlu
ZyB0aGlzIGxheWVyIGJlbG93IHdpbGwgc2hpZnQgYWxsIGxheWVycyBhZnRlciBpdCBkb3duIGJ5
DQorICAgICAgICAgICAgLy8gb25lLCBzbyB3ZSBzaGlmdCB0aGUgaW5kZXggYWNjb3JkaW5nbHku
DQorICAgICAgICAgICAgaWYgKGV4aXN0aW5nSW5kZXggPCBpbmRleCkNCisgICAgICAgICAgICAg
ICAgLS1pbmRleDsNCisgICAgICAgIH0NCisgICAgICAgIHN1YmxheWVyLT5yZW1vdmVGcm9tU3Vw
ZXJsYXllcigpOw0KKyAgICB9DQorDQorICAgIG1fc3VibGF5ZXJzLmluc2VydChpbmRleCwgc3Vi
bGF5ZXIpOw0KKyAgICBDQUNGTGF5ZXJJbnNlcnRTdWJsYXllcihsYXllcigpLCBzdWJsYXllci0+
bGF5ZXIoKSwgaW5kZXgpOw0KKyAgICBzZXROZWVkc0NvbW1pdCgpOw0KKw0KKyAgICBjaGVja1N1
YmxheWVyc0NvbnNpc3RlbmN5KCk7DQorfQ0KKw0KK3ZvaWQgV0tDQUNGTGF5ZXI6Omluc2VydFN1
YmxheWVyQWJvdmVMYXllcihQYXNzUmVmUHRyPFdLQ0FDRkxheWVyPiBwcnBTdWJsYXllciwgY29u
c3QgV0tDQUNGTGF5ZXIqIHJlZmVyZW5jZSkNCit7DQorICAgIGNoZWNrU3VibGF5ZXJzQ29uc2lz
dGVuY3koKTsNCisNCisgICAgaWYgKCFyZWZlcmVuY2UpIHsNCisgICAgICAgIGluc2VydFN1Ymxh
eWVyKHBycFN1YmxheWVyLCAwKTsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKw0KKyAgICBz
aXplX3QgcmVmZXJlbmNlSW5kZXggPSBtX3N1YmxheWVycy5maW5kKHJlZmVyZW5jZSk7DQorICAg
IGlmIChyZWZlcmVuY2VJbmRleCA9PSBXVEY6Om5vdEZvdW5kKSB7DQorICAgICAgICBhZGRTdWJs
YXllcihwcnBTdWJsYXllcik7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisNCisgICAgaW5z
ZXJ0U3VibGF5ZXIocHJwU3VibGF5ZXIsIHJlZmVyZW5jZUluZGV4ICsgMSk7DQorDQorICAgIGNo
ZWNrU3VibGF5ZXJzQ29uc2lzdGVuY3koKTsNCit9DQorDQordm9pZCBXS0NBQ0ZMYXllcjo6aW5z
ZXJ0U3VibGF5ZXJCZWxvd0xheWVyKFBhc3NSZWZQdHI8V0tDQUNGTGF5ZXI+IHBycFN1YmxheWVy
LCBjb25zdCBXS0NBQ0ZMYXllciogcmVmZXJlbmNlKQ0KK3sNCisgICAgY2hlY2tTdWJsYXllcnND
b25zaXN0ZW5jeSgpOw0KKw0KKyAgICBpZiAoIXJlZmVyZW5jZSkgew0KKyAgICAgICAgaW5zZXJ0
U3VibGF5ZXIocHJwU3VibGF5ZXIsIDApOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorDQor
ICAgIHNpemVfdCByZWZlcmVuY2VJbmRleCA9IG1fc3VibGF5ZXJzLmZpbmQocmVmZXJlbmNlKTsN
CisgICAgaWYgKHJlZmVyZW5jZUluZGV4ID09IFdURjo6bm90Rm91bmQpIHsNCisgICAgICAgIGFk
ZFN1YmxheWVyKHBycFN1YmxheWVyKTsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKw0KKyAg
ICBpbnNlcnRTdWJsYXllcihwcnBTdWJsYXllciwgcmVmZXJlbmNlSW5kZXgpOw0KKw0KKyAgICBj
aGVja1N1YmxheWVyc0NvbnNpc3RlbmN5KCk7DQorfQ0KKw0KK2Jvb2wgV0tDQUNGTGF5ZXI6Omlz
RGVzY2VuZGFudE9mKFdLQ0FDRkxheWVyKiBhbmNlc3RvcikgY29uc3QNCit7DQorICAgIGZvciAo
Y29uc3QgV0tDQUNGTGF5ZXIqIGxheWVyID0gdGhpczsgbGF5ZXI7IGxheWVyID0gbGF5ZXItPnN1
cGVybGF5ZXIoKSkgew0KKyAgICAgICAgaWYgKGxheWVyID09IGFuY2VzdG9yKQ0KKyAgICAgICAg
ICAgIHJldHVybiB0cnVlOw0KKyAgICB9DQorICAgIHJldHVybiBmYWxzZTsNCit9DQorDQordm9p
ZCBXS0NBQ0ZMYXllcjo6cmVwbGFjZVN1YmxheWVyKFdLQ0FDRkxheWVyKiByZWZlcmVuY2UsIFBh
c3NSZWZQdHI8V0tDQUNGTGF5ZXI+IHBycE5ld0xheWVyKQ0KK3sNCisgICAgQVNTRVJUX0FSRyhy
ZWZlcmVuY2UsIHJlZmVyZW5jZSk7DQorICAgIEFTU0VSVF9BUkcocmVmZXJlbmNlLCByZWZlcmVu
Y2UtPnN1cGVybGF5ZXIoKSA9PSB0aGlzKTsNCisNCisgICAgUmVmUHRyPFdLQ0FDRkxheWVyPiBu
ZXdMYXllciA9IHBycE5ld0xheWVyOw0KKw0KKyAgICBpZiAocmVmZXJlbmNlID09IG5ld0xheWVy
KQ0KKyAgICAgICAgcmV0dXJuOw0KKw0KKyAgICBpZiAoIW5ld0xheWVyKSB7DQorICAgICAgICBy
ZW1vdmVTdWJsYXllcihyZWZlcmVuY2UpOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorDQor
ICAgIG5ld0xheWVyLT5yZW1vdmVGcm9tU3VwZXJsYXllcigpOw0KKw0KKyAgICBzaXplX3QgcmVm
ZXJlbmNlSW5kZXggPSBtX3N1YmxheWVycy5maW5kKHJlZmVyZW5jZSk7DQorICAgIEFTU0VSVChy
ZWZlcmVuY2VJbmRleCAhPSBXVEY6Om5vdEZvdW5kKTsNCisgICAgaWYgKHJlZmVyZW5jZUluZGV4
ID09IFdURjo6bm90Rm91bmQpDQorICAgICAgICByZXR1cm47DQorDQorICAgIC8vIEZJWE1FOiBD
YW4gd2UgbWFrZSB0aGlzIG1vcmUgZWZmaWNpZW50PyBUaGUgY3VycmVudCBDQUNGIEFQSSBkb2Vz
bid0IHNlZW0gdG8gZ2l2ZSB1cyBhIHdheSB0byBkbyBzby4NCisgICAgcmVmZXJlbmNlLT5yZW1v
dmVGcm9tU3VwZXJsYXllcigpOw0KKyAgICBpbnNlcnRTdWJsYXllcihuZXdMYXllci5yZWxlYXNl
KCksIHJlZmVyZW5jZUluZGV4KTsNCit9DQorDQordm9pZCBXS0NBQ0ZMYXllcjo6cmVtb3ZlRnJv
bVN1cGVybGF5ZXIoKQ0KK3sNCisgICAgV0tDQUNGTGF5ZXIqIHN1cGVybGF5ZXIgPSB0aGlzLT5z
dXBlcmxheWVyKCk7DQorICAgIGlmICghc3VwZXJsYXllcikNCisgICAgICAgIHJldHVybjsNCisN
CisgICAgc3VwZXJsYXllci0+Y2hlY2tTdWJsYXllcnNDb25zaXN0ZW5jeSgpOw0KKw0KKyAgICBz
dXBlcmxheWVyLT5yZW1vdmVTdWJsYXllcih0aGlzKTsNCisgICAgQ0FDRkxheWVyUmVtb3ZlRnJv
bVN1cGVybGF5ZXIobGF5ZXIoKSk7DQorICAgIHNldE5lZWRzQ29tbWl0KCk7DQorDQorICAgIHN1
cGVybGF5ZXItPmNoZWNrU3VibGF5ZXJzQ29uc2lzdGVuY3koKTsNCit9DQorDQordm9pZCBXS0NB
Q0ZMYXllcjo6cmVtb3ZlU3VibGF5ZXIoY29uc3QgV0tDQUNGTGF5ZXIqIHN1YmxheWVyKQ0KK3sN
CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX3N1YmxheWVycy5zaXplKCk7ICsraSkgew0K
KyAgICAgICAgaWYgKG1fc3VibGF5ZXJzW2ldICE9IHN1YmxheWVyKQ0KKyAgICAgICAgICAgIGNv
bnRpbnVlOw0KKw0KKyAgICAgICAgbV9zdWJsYXllcnMucmVtb3ZlKGkpOw0KKyAgICAgICAgYnJl
YWs7DQorICAgIH0NCit9DQorDQorI3ByYWdtYSBtYXJrIEdldHRlcnMvU2V0dGVycw0KKw0KK1dL
Q0FDRkxheWVyKiBXS0NBQ0ZMYXllcjo6YW5jZXN0b3JPclNlbGZXaXRoU3VwZXJsYXllcihXS0NB
Q0ZMYXllciogc3VwZXJsYXllcikgY29uc3QNCit7DQorICAgIFdLQ0FDRkxheWVyKiBsYXllciA9
IGNvbnN0X2Nhc3Q8V0tDQUNGTGF5ZXIqPih0aGlzKTsNCisgICAgZm9yIChXS0NBQ0ZMYXllciog
YW5jZXN0b3IgPSB0aGlzLT5zdXBlcmxheWVyKCk7IGFuY2VzdG9yOyBsYXllciA9IGFuY2VzdG9y
LCBhbmNlc3RvciA9IGFuY2VzdG9yLT5zdXBlcmxheWVyKCkpIHsNCisgICAgICAgIGlmIChhbmNl
c3RvciA9PSBzdXBlcmxheWVyKQ0KKyAgICAgICAgICAgIHJldHVybiBsYXllcjsNCisgICAgfQ0K
KyAgICByZXR1cm4gMDsNCit9DQorDQordm9pZCBXS0NBQ0ZMYXllcjo6c2V0Qm91bmRzKGNvbnN0
IENHUmVjdCYgcmVjdCkNCit7DQorICAgIGlmIChDR1JlY3RFcXVhbFRvUmVjdChyZWN0LCBib3Vu
ZHMoKSkpDQorICAgICAgICByZXR1cm47DQorDQorICAgIENBQ0ZMYXllclNldEJvdW5kcyhsYXll
cigpLCByZWN0KTsNCisgICAgc2V0TmVlZHNDb21taXQoKTsNCisNCisgICAgaWYgKG1fbmVlZHNM
YXlvdXRPbkJvdW5kc0NoYW5nZSkNCisgICAgICAgIHNldE5lZWRzTGF5b3V0KCk7DQorICAgIGlm
IChtX25lZWRzRGlzcGxheU9uQm91bmRzQ2hhbmdlKQ0KKyAgICAgICAgc2V0TmVlZHNEaXNwbGF5
KCk7DQorfQ0KKw0KK3ZvaWQgV0tDQUNGTGF5ZXI6OnNldEZyYW1lKGNvbnN0IENHUmVjdCYgcmVj
dCkNCit7DQorICAgIENHUmVjdCBvbGRGcmFtZSA9IGZyYW1lKCk7DQorICAgIGlmIChDR1JlY3RF
cXVhbFRvUmVjdChyZWN0LCBvbGRGcmFtZSkpDQorICAgICAgICByZXR1cm47DQorDQorICAgIENB
Q0ZMYXllclNldEZyYW1lKGxheWVyKCksIHJlY3QpOw0KKyAgICBzZXROZWVkc0NvbW1pdCgpOw0K
Kw0KKyAgICBpZiAobV9uZWVkc0xheW91dE9uQm91bmRzQ2hhbmdlICYmICFDR1NpemVFcXVhbFRv
U2l6ZShvbGRGcmFtZS5zaXplLCByZWN0LnNpemUpKQ0KKyAgICAgICAgc2V0TmVlZHNMYXlvdXQo
KTsNCisgICAgaWYgKG1fbmVlZHNEaXNwbGF5T25Cb3VuZHNDaGFuZ2UpDQorICAgICAgICBzZXRO
ZWVkc0Rpc3BsYXkoKTsNCit9DQorDQorV0tDQUNGTGF5ZXIqIFdLQ0FDRkxheWVyOjpyb290TGF5
ZXIoKSBjb25zdA0KK3sNCisgICAgV0tDQUNGTGF5ZXIqIGxheWVyID0gY29uc3RfY2FzdDxXS0NB
Q0ZMYXllcio+KHRoaXMpOw0KKyAgICBmb3IgKFdLQ0FDRkxheWVyKiBzdXBlcmxheWVyID0gbGF5
ZXItPnN1cGVybGF5ZXIoKTsgc3VwZXJsYXllcjsgbGF5ZXIgPSBzdXBlcmxheWVyLCBzdXBlcmxh
eWVyID0gc3VwZXJsYXllci0+c3VwZXJsYXllcigpKSB7IH0NCisgICAgcmV0dXJuIGxheWVyOw0K
K30NCisNCit2b2lkIFdLQ0FDRkxheWVyOjpyZW1vdmVBbGxTdWJsYXllcnMoKQ0KK3sNCisgICAg
VmVjdG9yPFJlZlB0cjxXS0NBQ0ZMYXllcj4gPiBlbXB0eVZlY3RvcjsNCisgICAgc2V0U3VibGF5
ZXJzQnlBZG9wdGluZ1ZlY3RvcihlbXB0eVZlY3Rvcik7DQorfQ0KKw0KK3ZvaWQgV0tDQUNGTGF5
ZXI6OnNldFN1YmxheWVyc0J5QWRvcHRpbmdWZWN0b3IoVmVjdG9yPFJlZlB0cjxXS0NBQ0ZMYXll
cj4gPiYgc3VibGF5ZXJzKQ0KK3sNCisgICAgY2hlY2tTdWJsYXllcnNDb25zaXN0ZW5jeSgpOw0K
Kw0KKyAgICBpZiAoc3VibGF5ZXJzLmlzRW1wdHkoKSkgew0KKyAgICAgICAgQ0FDRkxheWVyU2V0
U3VibGF5ZXJzKGxheWVyKCksIDApOw0KKyAgICAgICAgbV9zdWJsYXllcnMuY2xlYXIoKTsNCisg
ICAgfSBlbHNlIHsNCisgICAgICAgIC8vIEZJWE1FOiBUaGlzIGNhbGwgdG8gQ0FDRkxheWVyU2V0
U3VibGF5ZXJzIGlzIGEgd29ya2Fyb3VuZCBmb3INCisgICAgICAgIC8vIDxyZGFyOi8vNjE5OTAw
OD4uIFdlIGNhbiByZW1vdmUgaXQgb25jZSB0aGF0IGJ1ZyBpcyBmaXhlZC4NCisgICAgICAgIENB
Q0ZMYXllclNldFN1YmxheWVycyhsYXllcigpLCAwKTsNCisNCisgICAgICAgIC8vIENyZWF0ZSBh
IHZlY3RvciBvZiBDQUNGTGF5ZXJzLg0KKyAgICAgICAgVmVjdG9yPGNvbnN0IHZvaWQqPiBsYXll
cnM7DQorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN1YmxheWVycy5zaXplKCk7IGkr
KykNCisgICAgICAgICAgICBsYXllcnMuYXBwZW5kKHN1YmxheWVyc1tpXS0+bGF5ZXIoKSk7DQor
ICAgIA0KKyAgICAgICAgUmV0YWluUHRyPENGQXJyYXlSZWY+IGxheWVyc0FycmF5KEFkb3B0Q0Ys
IENGQXJyYXlDcmVhdGUoMCwgbGF5ZXJzLmRhdGEoKSwgbGF5ZXJzLnNpemUoKSwgMCkpOw0KKyAg
ICANCisgICAgICAgIENBQ0ZMYXllclNldFN1YmxheWVycyhsYXllcigpLCBsYXllcnNBcnJheS5n
ZXQoKSk7DQorICAgIA0KKyAgICAgICAgbV9zdWJsYXllcnMuY2xlYXIoKTsNCisgICAgICAgIG1f
c3VibGF5ZXJzLnN3YXAoc3VibGF5ZXJzKTsNCisgICAgfQ0KKyAgICANCisgICAgc2V0TmVlZHND
b21taXQoKTsNCisNCisgICAgY2hlY2tTdWJsYXllcnNDb25zaXN0ZW5jeSgpOw0KK30NCisNCitX
S0NBQ0ZMYXllciogV0tDQUNGTGF5ZXI6OnN1cGVybGF5ZXIoKSBjb25zdA0KK3sNCisgICAgQ0FD
RkxheWVyUmVmIHN1cGVyID0gQ0FDRkxheWVyR2V0U3VwZXJsYXllcihsYXllcigpKTsNCisgICAg
aWYgKCFzdXBlcikNCisgICAgICAgIHJldHVybiAwOw0KKyAgICByZXR1cm4gV0tDQUNGTGF5ZXI6
OmxheWVyKHN1cGVyKTsNCit9DQorDQordm9pZCBXS0NBQ0ZMYXllcjo6cHJpbnQoKQ0KK3sNCisg
ICAgLy9DQVJlbmRlclNob3coQ0FDRkxheWVyQ29weVJlbmRlclZhbHVlKGxheWVyKCkpKTsNCit9
DQorDQorI3ByYWdtYSBtYXJrIENvbnNpc3RlbmN5IENoZWNrcw0KKw0KKyNpZiBDSEVDS19TVUJM
QVlFUlNfQ09OU0lTVEVOQ1kNCisNCit2b2lkIFdLQ0FDRkxheWVyOjpjaGVja1N1YmxheWVyc0Nv
bnNpc3RlbmN5KCkgY29uc3QNCit7DQorICAgIENGQXJyYXlSZWYgc3VibGF5ZXJzQXJyYXkgPSBD
QUNGTGF5ZXJHZXRTdWJsYXllcnMobGF5ZXIoKSk7DQorDQorDQorICAgIGlmICghc3VibGF5ZXJz
QXJyYXkpIHsNCisgICAgICAgIEFTU0VSVChtX3N1YmxheWVycy5pc0VtcHR5KCkpOw0KKyAgICAg
ICAgcmV0dXJuOw0KKyAgICB9DQorDQorICAgIENGSW5kZXggY291bnQgPSBDRkFycmF5R2V0Q291
bnQoc3VibGF5ZXJzQXJyYXkpOw0KKyAgICBBU1NFUlQoc3RhdGljX2Nhc3Q8c2l6ZV90Pihjb3Vu
dCkgPT0gbV9zdWJsYXllcnMuc2l6ZSgpKTsNCisgICAgaWYgKCFjb3VudCkNCisgICAgICAgIHJl
dHVybjsNCisNCisgICAgQ0FDRkxheWVyUmVmKiBzdWJsYXllcnMgPSBuZXcgQ0FDRkxheWVyUmVm
W2NvdW50XTsNCisgICAgQ0ZBcnJheUdldFZhbHVlcyhzdWJsYXllcnNBcnJheSwgQ0ZSYW5nZU1h
a2UoMCwgY291bnQpLCAoY29uc3Qgdm9pZCoqKXN1YmxheWVycyk7DQorDQorICAgIGZvciAoc2l6
ZV90IGkgPSAwOyBpIDwgbV9zdWJsYXllcnMuc2l6ZSgpOyArK2kpIHsNCisgICAgICAgIEFTU0VS
VChtX3N1YmxheWVyc1tpXS0+bGF5ZXIoKSA9PSBzdWJsYXllcnNbaV0pOw0KKyAgICB9DQorDQor
ICAgIGRlbGV0ZVtdIHN1YmxheWVyczsNCit9DQorDQorI2VuZGlmIC8vIENIRUNLX1NVQkxBWUVS
U19DT05TSVNURU5DWQ0KKw0KK30NClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQ0KDQpQcm9w
ZXJ0eSBjaGFuZ2VzIG9uOiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9XS0NBQ0ZMYXll
ci5jcHANCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX18NCkFkZGVkOiBzdm46ZXhlY3V0YWJsZQ0KICAgKyAqDQoNCkluZGV4
OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9XS0NBQ0ZMYXllci5oDQo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
DQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vV0tDQUNGTGF5ZXIuaAkocmV2aXNp
b24gMCkNCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9XS0NBQ0ZMYXllci5oCShy
ZXZpc2lvbiAwKQ0KQEAgLTAsMCArMSwyNTUgQEANCisvKg0KKyAqICBXS0NBQ0ZMYXllci5oDQor
ICogIFdlYktpdA0KKyAqDQorICogIENyZWF0ZWQgYnkgQWRhbSBSb2JlbiBvbiA2LzExLzA4Lg0K
KyAqICBBZGFwdGVkIGZyb20gQ29yZUFuaW1hdGlvbkxheWVyIGJ5IENocmlzIE1hcnJpbiBvbiAx
MC8yMS8wOC4NCisgKiAgQ29weXJpZ2h0IDIwMDggQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLg0KKyAqDQorICovDQorDQorI2lmbmRlZiBXS0NBQ0ZMYXllcl9oDQorI2RlZmluZSBXS0NB
Q0ZMYXllcl9oDQorDQorI2luY2x1ZGUgImNvbmZpZy5oIg0KKw0KKyNpbmNsdWRlICJTdHJpbmdI
YXNoLmgiDQorDQorI2luY2x1ZGUgPHd0Zi9SZWZDb3VudGVkLmg+DQorDQorI2luY2x1ZGUgPFF1
YXJ0ekNvcmUvQ0FDRkxheWVyLmg+DQorI2luY2x1ZGUgPFF1YXJ0ekNvcmUvQ0FDRlZlY3Rvci5o
Pg0KKyNpbmNsdWRlIDx3dGYvUGFzc1JlZlB0ci5oPg0KKyNpbmNsdWRlIDx3dGYvUmV0YWluUHRy
Lmg+DQorI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4NCisNCisjaW5jbHVkZSAiR3JhcGhpY3NDb250
ZXh0LmgiDQorI2luY2x1ZGUgIkdyYXBoaWNzTGF5ZXJDQUNGLmgiDQorI2luY2x1ZGUgIlBsYXRm
b3JtU3RyaW5nLmgiDQorI2luY2x1ZGUgIlRyYW5zZm9ybWF0aW9uTWF0cml4LmgiDQorDQorbmFt
ZXNwYWNlIFdlYkNvcmUgew0KKw0KK2NsYXNzIFdLQ0FDRkFuaW1hdGlvbjsNCitjbGFzcyBXS0NB
Q0ZUaW1pbmdGdW5jdGlvbjsNCisNCisjaWZkZWYgTkRFQlVHDQorI2RlZmluZSBDSEVDS19TVUJM
QVlFUlNfQ09OU0lTVEVOQ1kgMA0KKyNlbHNlDQorI2RlZmluZSBDSEVDS19TVUJMQVlFUlNfQ09O
U0lTVEVOQ1kgMQ0KKyNlbmRpZg0KKw0KK2NsYXNzIFdLQ0FDRkxheWVyIDogcHVibGljIFJlZkNv
dW50ZWQ8V0tDQUNGTGF5ZXI+IHsNCitwdWJsaWM6DQorICAgIHN0YXRpYyBQYXNzUmVmUHRyPFdL
Q0FDRkxheWVyPiBjcmVhdGUoQ0ZTdHJpbmdSZWYgY2xhc3NOYW1lLCBHcmFwaGljc0xheWVyQ0FD
Riogb3duZXI9MCkgeyByZXR1cm4gYWRvcHRSZWYobmV3IFdLQ0FDRkxheWVyKGNsYXNzTmFtZSwg
b3duZXIpKTsgfQ0KKyAgICBzdGF0aWMgV0tDQUNGTGF5ZXIqIGxheWVyKENBQ0ZMYXllclJlZiBs
YXllcikgeyByZXR1cm4gc3RhdGljX2Nhc3Q8V0tDQUNGTGF5ZXIqPihDQUNGTGF5ZXJHZXRVc2Vy
RGF0YShsYXllcikpOyB9DQorDQorICAgIH5XS0NBQ0ZMYXllcigpOw0KKw0KKyAgICB2b2lkIGJl
Y29tZUxheWVyRm9yQ29udGV4dChDQUNGQ29udGV4dFJlZik7DQorDQorI3ByYWdtYSBtYXJrIENv
bnZlcnNpb24gdG8gQ0ZUeXBlDQorICAgIHN0YXRpYyBSZXRhaW5QdHI8Q0ZUeXBlUmVmPiBjZlZh
bHVlKGZsb2F0IHZhbHVlKSB7IHJldHVybiBSZXRhaW5QdHI8Q0ZUeXBlUmVmPihBZG9wdENGLCBD
Rk51bWJlckNyZWF0ZSgwLCBrQ0ZOdW1iZXJGbG9hdDMyVHlwZSwgJnZhbHVlKSk7IH0NCisgICAg
c3RhdGljIFJldGFpblB0cjxDRlR5cGVSZWY+IGNmVmFsdWUoY29uc3QgVHJhbnNmb3JtYXRpb25N
YXRyaXgmIHZhbHVlKQ0KKwl7DQorCQlDQVRyYW5zZm9ybTNEIHQ7DQorCQl0Lm0xMSA9IHZhbHVl
Lm0xMSgpOyB0Lm0xMiA9IHZhbHVlLm0xMigpOyB0Lm0xMyA9IHZhbHVlLm0xMygpOyB0Lm0xNCA9
IHZhbHVlLm0xNCgpOyANCisJCXQubTIxID0gdmFsdWUubTIxKCk7IHQubTIyID0gdmFsdWUubTIy
KCk7IHQubTIzID0gdmFsdWUubTIzKCk7IHQubTI0ID0gdmFsdWUubTI0KCk7IA0KKwkJdC5tMzEg
PSB2YWx1ZS5tMzEoKTsgdC5tMzIgPSB2YWx1ZS5tMzIoKTsgdC5tMzMgPSB2YWx1ZS5tMzMoKTsg
dC5tMzQgPSB2YWx1ZS5tMzQoKTsgDQorCQl0Lm00MSA9IHZhbHVlLm00MSgpOyB0Lm00MiA9IHZh
bHVlLm00MigpOyB0Lm00MyA9IHZhbHVlLm00MygpOyB0Lm00NCA9IHZhbHVlLm00NCgpOyANCisJ
CXJldHVybiBSZXRhaW5QdHI8Q0ZUeXBlUmVmPihBZG9wdENGLCBDQUNGVmVjdG9yQ3JlYXRlVHJh
bnNmb3JtKHQpKTsNCisJfQ0KKyAgICBzdGF0aWMgUmV0YWluUHRyPENGVHlwZVJlZj4gY2ZWYWx1
ZShjb25zdCBGbG9hdFBvaW50JiB2YWx1ZSkNCisJew0KKwkJQ0dQb2ludCBwOw0KKwkJcC54ID0g
dmFsdWUueCgpOyBwLnkgPSB2YWx1ZS55KCk7DQorCQlyZXR1cm4gUmV0YWluUHRyPENGVHlwZVJl
Zj4oQWRvcHRDRiwgQ0FDRlZlY3RvckNyZWF0ZVBvaW50KHApKTsNCisJfQ0KKyAgICBzdGF0aWMg
UmV0YWluUHRyPENGVHlwZVJlZj4gY2ZWYWx1ZShjb25zdCBGbG9hdFJlY3QmIHJlY3QpDQorICAg
IHsNCisJCUNHUmVjdCByOw0KKwkJci5vcmlnaW4ueCA9IHJlY3QueCgpOyByLm9yaWdpbi55ID0g
cmVjdC55KCk7DQorCQlyLnNpemUud2lkdGggPSByZWN0LndpZHRoKCk7IHIuc2l6ZS5oZWlnaHQg
PSByZWN0LmhlaWdodCgpOw0KKwkJQ0dGbG9hdCB2WzRdID0geyBDR1JlY3RHZXRNaW5YKHIpLCBD
R1JlY3RHZXRNaW5ZKHIpLCBDR1JlY3RHZXRNYXhYKHIpLCBDR1JlY3RHZXRNYXhZKHIpIH07DQor
ICAgICAgICByZXR1cm4gUmV0YWluUHRyPENGVHlwZVJlZj4oQWRvcHRDRiwgQ0FDRlZlY3RvckNy
ZWF0ZSg0LCB2KSk7DQorICAgIH0NCisgICAgc3RhdGljIFJldGFpblB0cjxDRlR5cGVSZWY+IGNm
VmFsdWUoY29uc3QgQ29sb3ImIGNvbG9yKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gUmV0YWlu
UHRyPENGVHlwZVJlZj4oQWRvcHRDRiwgQ0dDb2xvckNyZWF0ZUdlbmVyaWNSR0IoY29sb3IucmVk
KCksIGNvbG9yLmdyZWVuKCksIGNvbG9yLmJsdWUoKSwgY29sb3IuYWxwaGEoKSkpOw0KKyAgICB9
DQorDQorI3ByYWdtYSBtYXJrIENvb3JkaW5hdGUgTWFwcGluZw0KKw0KKyAgICBDRlRpbWVJbnRl
cnZhbCBjb252ZXJ0VGltZShDRlRpbWVJbnRlcnZhbCwgY29uc3QgV0tDQUNGTGF5ZXIqIHRvTGF5
ZXIpIGNvbnN0Ow0KKyAgICBDR1BvaW50IGNvbnZlcnRQb2ludChjb25zdCBDR1BvaW50JiwgY29u
c3QgV0tDQUNGTGF5ZXIqIHRvTGF5ZXIpIGNvbnN0Ow0KKyAgICBDR1JlY3QgY29udmVydFJlY3Qo
Y29uc3QgQ0dSZWN0JiwgY29uc3QgV0tDQUNGTGF5ZXIqIHRvTGF5ZXIpIGNvbnN0Ow0KKw0KKyNw
cmFnbWEgbWFyayBSZWZlcmVuY2UgY291bnRpbmcNCisgICAgdXNpbmcgUmVmQ291bnRlZDxXS0NB
Q0ZMYXllcj46OnJlZjsNCisgICAgdXNpbmcgUmVmQ291bnRlZDxXS0NBQ0ZMYXllcj46OmRlcmVm
Ow0KKyAgICANCisjcHJhZ21hIG1hcmsgQ2FsbGJhY2tzDQorDQorICAgIHZvaWQgZGlzcGxheShQ
bGF0Zm9ybUdyYXBoaWNzQ29udGV4dCopOw0KKyAgICB2b2lkIGxheW91dCgpOw0KKw0KKyNwcmFn
bWEgbWFyayBUeXBlIEluZm9ybWF0aW9uDQorDQorICAgIGJvb2wgaXNUcmFuc2Zvcm1MYXllcigp
IGNvbnN0IHsgcmV0dXJuIENBQ0ZMYXllckdldENsYXNzKGxheWVyKCkpID09IGtDQUNGVHJhbnNm
b3JtTGF5ZXI7IH0NCisNCisjcHJhZ21hIG1hcmsgQW5jZXN0cnkNCisNCisgICAgdm9pZCBhZGRT
dWJsYXllcihQYXNzUmVmUHRyPFdLQ0FDRkxheWVyPiBzdWJsYXllcikgeyBpbnNlcnRTdWJsYXll
cihzdWJsYXllciwgbV9zdWJsYXllcnMuc2l6ZSgpKTsgfQ0KKyAgICB2b2lkIGluc2VydFN1Ymxh
eWVyKFBhc3NSZWZQdHI8V0tDQUNGTGF5ZXI+LCBzaXplX3QgaW5kZXgpOw0KKyAgICB2b2lkIGlu
c2VydFN1YmxheWVyQWJvdmVMYXllcihQYXNzUmVmUHRyPFdLQ0FDRkxheWVyPiwgY29uc3QgV0tD
QUNGTGF5ZXIqIHJlZmVyZW5jZSk7DQorICAgIHZvaWQgaW5zZXJ0U3VibGF5ZXJCZWxvd0xheWVy
KFBhc3NSZWZQdHI8V0tDQUNGTGF5ZXI+LCBjb25zdCBXS0NBQ0ZMYXllciogcmVmZXJlbmNlKTsN
CisgICAgYm9vbCBpc0Rlc2NlbmRhbnRPZihXS0NBQ0ZMYXllciopIGNvbnN0Ow0KKyAgICB2b2lk
IHJlcGxhY2VTdWJsYXllcihXS0NBQ0ZMYXllciogcmVmZXJlbmNlLCBQYXNzUmVmUHRyPFdLQ0FD
RkxheWVyPik7DQorICAgIHZvaWQgcmVtb3ZlRnJvbVN1cGVybGF5ZXIoKTsNCisNCisjcHJhZ21h
IG1hcmsgR2V0dGVycy9TZXR0ZXJzDQorDQorICAgIFdLQ0FDRkxheWVyKiBhbmNlc3Rvck9yU2Vs
ZldpdGhTdXBlcmxheWVyKFdLQ0FDRkxheWVyKikgY29uc3Q7DQorICAgIA0KKyAgICB2b2lkIHNl
dEFuY2hvclBvaW50KGNvbnN0IENHUG9pbnQmIHApIHsgQ0FDRkxheWVyU2V0QW5jaG9yUG9pbnQo
bGF5ZXIoKSwgcCk7IHNldE5lZWRzQ29tbWl0KCk7IH0NCisgICAgQ0dQb2ludCBhbmNob3JQb2lu
dCgpIHsgcmV0dXJuIENBQ0ZMYXllckdldEFuY2hvclBvaW50KGxheWVyKCkpOyB9DQorDQorICAg
IHZvaWQgc2V0QW5jaG9yUG9pbnRaKENHRmxvYXQgeikgeyBDQUNGTGF5ZXJTZXRBbmNob3JQb2lu
dFoobGF5ZXIoKSwgeik7IHNldE5lZWRzQ29tbWl0KCk7IH0NCisgICAgQ0dGbG9hdCBhbmNob3JQ
b2ludFooKSB7IHJldHVybiBDQUNGTGF5ZXJHZXRBbmNob3JQb2ludFoobGF5ZXIoKSk7IH0NCisN
CisgICAgdm9pZCBzZXRCYWNrZ3JvdW5kQ29sb3IoQ0dDb2xvclJlZiBjb2xvcikgeyBDQUNGTGF5
ZXJTZXRCYWNrZ3JvdW5kQ29sb3IobGF5ZXIoKSwgY29sb3IpOyBzZXROZWVkc0NvbW1pdCgpOyB9
DQorICAgIENHQ29sb3JSZWYgYmFja2dyb3VuZENvbG9yKCkgY29uc3QgeyByZXR1cm4gQ0FDRkxh
eWVyR2V0QmFja2dyb3VuZENvbG9yKGxheWVyKCkpOyB9DQorDQorICAgIHZvaWQgc2V0Qm9yZGVy
Q29sb3IoQ0dDb2xvclJlZiBjb2xvcikgeyBDQUNGTGF5ZXJTZXRCb3JkZXJDb2xvcihsYXllcigp
LCBjb2xvcik7IHNldE5lZWRzQ29tbWl0KCk7IH0NCisgICAgQ0dDb2xvclJlZiBib3JkZXJDb2xv
cigpIGNvbnN0IHsgcmV0dXJuIENBQ0ZMYXllckdldEJvcmRlckNvbG9yKGxheWVyKCkpOyB9DQor
DQorICAgIHZvaWQgc2V0Qm9yZGVyV2lkdGgoQ0dGbG9hdCB3aWR0aCkgeyBDQUNGTGF5ZXJTZXRC
b3JkZXJXaWR0aChsYXllcigpLCB3aWR0aCk7IHNldE5lZWRzQ29tbWl0KCk7IH0NCisgICAgQ0dG
bG9hdCBib3JkZXJXaWR0aCgpIGNvbnN0IHsgcmV0dXJuIENBQ0ZMYXllckdldEJvcmRlcldpZHRo
KGxheWVyKCkpOyB9DQorDQorICAgIHZvaWQgc2V0Qm91bmRzKGNvbnN0IENHUmVjdCYpOw0KKyAg
ICBDR1JlY3QgYm91bmRzKCkgY29uc3QgeyByZXR1cm4gQ0FDRkxheWVyR2V0Qm91bmRzKGxheWVy
KCkpOyB9DQorDQorICAgIHZvaWQgc2V0Q2xlYXJzQ29udGV4dChib29sIGNsZWFycykgeyBDQUNG
TGF5ZXJTZXRDbGVhcnNDb250ZXh0KGxheWVyKCksIGNsZWFycyk7IHNldE5lZWRzQ29tbWl0KCk7
IH0NCisgICAgYm9vbCBjbGVhcnNDb250ZXh0KCkgY29uc3QgeyByZXR1cm4gQ0FDRkxheWVyR2V0
Q2xlYXJzQ29udGV4dChsYXllcigpKTsgfQ0KKw0KKyAgICB2b2lkIHNldENvbnRlbnRzKENHSW1h
Z2VSZWYgY29udGVudHMpIHsgQ0FDRkxheWVyU2V0Q29udGVudHMobGF5ZXIoKSwgY29udGVudHMp
OyBzZXROZWVkc0NvbW1pdCgpOyB9DQorICAgIENHSW1hZ2VSZWYgY29udGVudHMoKSBjb25zdCB7
IHJldHVybiBzdGF0aWNfY2FzdDxDR0ltYWdlUmVmPihjb25zdF9jYXN0PHZvaWQqPihDQUNGTGF5
ZXJHZXRDb250ZW50cyhsYXllcigpKSkpOyB9DQorDQorICAgIHZvaWQgc2V0Q29udGVudHNSZWN0
KGNvbnN0IENHUmVjdCYgY29udGVudHNSZWN0KSB7IENBQ0ZMYXllclNldENvbnRlbnRzUmVjdChs
YXllcigpLCBjb250ZW50c1JlY3QpOyBzZXROZWVkc0NvbW1pdCgpOyB9DQorICAgIENHUmVjdCBj
b250ZW50c1JlY3QoKSBjb25zdCB7IHJldHVybiBDQUNGTGF5ZXJHZXRDb250ZW50c1JlY3QobGF5
ZXIoKSk7IH0NCisNCisgICAgdm9pZCBzZXRDb250ZW50c0dyYXZpdHkoQ0ZTdHJpbmdSZWYgc3Ry
KSB7IENBQ0ZMYXllclNldENvbnRlbnRzR3Jhdml0eShsYXllcigpLCBzdHIpOyBzZXROZWVkc0Nv
bW1pdCgpOyB9DQorICAgIENGU3RyaW5nUmVmIGNvbnRlbnRzR3Jhdml0eSgpIHsgcmV0dXJuIENB
Q0ZMYXllckdldENvbnRlbnRzR3Jhdml0eShsYXllcigpKTsgfQ0KKyAgICAgICAgDQorICAgIHZv
aWQgc2V0RG91YmxlU2lkZWQoYm9vbCBiKSB7IENBQ0ZMYXllclNldERvdWJsZVNpZGVkKGxheWVy
KCksIGIpOyBzZXROZWVkc0NvbW1pdCgpOyB9DQorICAgIGJvb2wgZG91YmxlU2lkZWQoKSBjb25z
dCB7IHJldHVybiBDQUNGTGF5ZXJJc0RvdWJsZVNpZGVkKGxheWVyKCkpOyB9DQorDQorICAgIHZv
aWQgc2V0RWRnZUFudGlhbGlhc2luZ01hc2sodWludDMyX3QgbWFzaykgeyBDQUNGTGF5ZXJTZXRF
ZGdlQW50aWFsaWFzaW5nTWFzayhsYXllcigpLCBtYXNrKTsgc2V0TmVlZHNDb21taXQoKTsgfQ0K
KyAgICB1aW50MzJfdCBlZGdlQW50aWFsaWFzaW5nTWFzaygpIGNvbnN0IHsgcmV0dXJuIENBQ0ZM
YXllckdldEVkZ2VBbnRpYWxpYXNpbmdNYXNrKGxheWVyKCkpOyB9DQorDQorICAgIHZvaWQgc2V0
RmlsdGVycyhDRkFycmF5UmVmIGZpbHRlcnMpIHsgQ0FDRkxheWVyU2V0RmlsdGVycyhsYXllcigp
LCBmaWx0ZXJzKTsgc2V0TmVlZHNDb21taXQoKTsgfQ0KKyAgICBDRkFycmF5UmVmIGZpbHRlcnMo
KSBjb25zdCB7IHJldHVybiBDQUNGTGF5ZXJHZXRGaWx0ZXJzKGxheWVyKCkpOyB9DQorDQorICAg
IHZvaWQgc2V0RnJhbWUoY29uc3QgQ0dSZWN0Jik7DQorICAgIENHUmVjdCBmcmFtZSgpIGNvbnN0
IHsgcmV0dXJuIENBQ0ZMYXllckdldEZyYW1lKGxheWVyKCkpOyB9DQorDQorICAgIHZvaWQgc2V0
SGlkZGVuKGJvb2wgaGlkZGVuKSB7IENBQ0ZMYXllclNldEhpZGRlbihsYXllcigpLCBoaWRkZW4p
OyBzZXROZWVkc0NvbW1pdCgpOyB9DQorICAgIGJvb2wgaXNIaWRkZW4oKSBjb25zdCB7IHJldHVy
biBDQUNGTGF5ZXJJc0hpZGRlbihsYXllcigpKTsgfQ0KKw0KKyAgICB2b2lkIHNldE1hc2tzVG9C
b3VuZHMoYm9vbCBiKSB7IENBQ0ZMYXllclNldE1hc2tzVG9Cb3VuZHMobGF5ZXIoKSwgYik7IH0N
CisgICAgYm9vbCBtYXNrc1RvQm91bmRzKCkgY29uc3QgeyByZXR1cm4gQ0FDRkxheWVyR2V0TWFz
a3NUb0JvdW5kcyhsYXllcigpKTsgfQ0KKw0KKyAgICB2b2lkIHNldE1hZ25pZmljYXRpb25GaWx0
ZXIoY29uc3QgU3RyaW5nJiBzdHJpbmcpIHsgQ0FDRkxheWVyU2V0TWFnbmlmaWNhdGlvbkZpbHRl
cihsYXllcigpLCBSZXRhaW5QdHI8Q0ZTdHJpbmdSZWY+KEFkb3B0Q0YsIHN0cmluZy5jcmVhdGVD
RlN0cmluZygpKS5nZXQoKSk7IH0NCisgICAgU3RyaW5nIG1hZ25pZmljYXRpb25GaWx0ZXIoKSBj
b25zdCB7IHJldHVybiBDQUNGTGF5ZXJHZXRNYWduaWZpY2F0aW9uRmlsdGVyKGxheWVyKCkpOyB9
DQorDQorICAgIHZvaWQgc2V0TWluaWZpY2F0aW9uRmlsdGVyKGNvbnN0IFN0cmluZyYgc3RyaW5n
KSB7IENBQ0ZMYXllclNldE1pbmlmaWNhdGlvbkZpbHRlcihsYXllcigpLCBSZXRhaW5QdHI8Q0ZT
dHJpbmdSZWY+KEFkb3B0Q0YsIHN0cmluZy5jcmVhdGVDRlN0cmluZygpKS5nZXQoKSk7IH0NCisg
ICAgU3RyaW5nIG1pbmlmaWNhdGlvbkZpbHRlcigpIGNvbnN0IHsgcmV0dXJuIENBQ0ZMYXllckdl
dE1pbmlmaWNhdGlvbkZpbHRlcihsYXllcigpKTsgfQ0KKw0KKyAgICB2b2lkIHNldE1pbmlmaWNh
dGlvbkZpbHRlckJpYXMoZmxvYXQgYmlhcykgeyBDQUNGTGF5ZXJTZXRNaW5pZmljYXRpb25GaWx0
ZXJCaWFzKGxheWVyKCksIGJpYXMpOyB9DQorICAgIGZsb2F0IG1pbmlmaWNhdGlvbkZpbHRlckJp
YXMoKSBjb25zdCB7IHJldHVybiBDQUNGTGF5ZXJHZXRNaW5pZmljYXRpb25GaWx0ZXJCaWFzKGxh
eWVyKCkpOyB9DQorDQorICAgIHZvaWQgc2V0TmFtZShjb25zdCBTdHJpbmcmIG5hbWUpIHsgQ0FD
RkxheWVyU2V0TmFtZShsYXllcigpLCBSZXRhaW5QdHI8Q0ZTdHJpbmdSZWY+KEFkb3B0Q0YsIG5h
bWUuY3JlYXRlQ0ZTdHJpbmcoKSkuZ2V0KCkpOyB9DQorICAgIFN0cmluZyBuYW1lKCkgY29uc3Qg
eyByZXR1cm4gQ0FDRkxheWVyR2V0TmFtZShsYXllcigpKTsgfQ0KKw0KKyAgICB2b2lkIHNldE5l
ZWRzRGlzcGxheShjb25zdCBDR1JlY3QqIGRpcnR5UmVjdCA9IDApIHsgQ0FDRkxheWVyU2V0TmVl
ZHNEaXNwbGF5KGxheWVyKCksIGRpcnR5UmVjdCk7IHNldE5lZWRzQ29tbWl0KCk7IH0NCisgICAg
dm9pZCBzZXROZWVkc0Rpc3BsYXlPbkJvdW5kc0NoYW5nZShib29sIG5lZWRzRGlzcGxheSkgeyBt
X25lZWRzRGlzcGxheU9uQm91bmRzQ2hhbmdlID0gbmVlZHNEaXNwbGF5OyB9DQorDQorICAgIHZv
aWQgc2V0TmVlZHNMYXlvdXQoKSB7IENBQ0ZMYXllclNldE5lZWRzTGF5b3V0KGxheWVyKCkpOyBz
ZXROZWVkc0NvbW1pdCgpOyB9DQorICAgIHZvaWQgc2V0TmVlZHNMYXlvdXRPbkJvdW5kc0NoYW5n
ZShib29sIG5lZWRzTGF5b3V0KSB7IG1fbmVlZHNMYXlvdXRPbkJvdW5kc0NoYW5nZSA9IG5lZWRz
TGF5b3V0OyB9DQorDQorICAgIHZvaWQgc2V0T3BhY2l0eShmbG9hdCBvcGFjaXR5KQ0KKyAgICB7
DQorICAgICAgICBDQUNGTGF5ZXJTZXRPcGFjaXR5KGxheWVyKCksIG9wYWNpdHkpOw0KKyAgICAg
ICAgc2V0TmVlZHNDb21taXQoKTsNCisgICAgfQ0KKw0KKyAgICBmbG9hdCBvcGFjaXR5KCkgY29u
c3QgeyByZXR1cm4gQ0FDRkxheWVyR2V0T3BhY2l0eShsYXllcigpKTsgfQ0KKw0KKyAgICB2b2lk
IHNldE9wYXF1ZShib29sIGIpIHsgQ0FDRkxheWVyU2V0T3BhcXVlKGxheWVyKCksIGIpOyBzZXRO
ZWVkc0NvbW1pdCgpOyB9DQorICAgIGJvb2wgb3BhcXVlKCkgY29uc3QgeyByZXR1cm4gQ0FDRkxh
eWVySXNPcGFxdWUobGF5ZXIoKSk7IH0NCisNCisgICAgdm9pZCBzZXRQb3NpdGlvbihjb25zdCBD
R1BvaW50JiBwb3NpdGlvbikgeyBDQUNGTGF5ZXJTZXRQb3NpdGlvbihsYXllcigpLCBwb3NpdGlv
bik7IHNldE5lZWRzQ29tbWl0KCk7IH0NCisgICAgQ0dQb2ludCBwb3NpdGlvbigpIGNvbnN0IHsg
cmV0dXJuIENBQ0ZMYXllckdldFBvc2l0aW9uKGxheWVyKCkpOyB9DQorDQorICAgIHZvaWQgc2V0
WlBvc2l0aW9uKENHRmxvYXQgcG9zaXRpb24pIHsgQ0FDRkxheWVyU2V0WlBvc2l0aW9uKGxheWVy
KCksIHBvc2l0aW9uKTsgc2V0TmVlZHNDb21taXQoKTsgfQ0KKyAgICBDR0Zsb2F0IHpQb3NpdGlv
bigpIGNvbnN0IHsgcmV0dXJuIENBQ0ZMYXllckdldFpQb3NpdGlvbihsYXllcigpKTsgfQ0KKw0K
KyAgICB2b2lkIHNldFNwZWVkKGZsb2F0IHNwZWVkKSB7IENBQ0ZMYXllclNldFNwZWVkKGxheWVy
KCksIHNwZWVkKTsgfQ0KKyAgICBDRlRpbWVJbnRlcnZhbCBzcGVlZCgpIGNvbnN0IHsgQ0FDRkxh
eWVyR2V0U3BlZWQobGF5ZXIoKSk7IH0NCisNCisgICAgdm9pZCBzZXRUaW1lT2Zmc2V0KENGVGlt
ZUludGVydmFsIHQpIHsgQ0FDRkxheWVyU2V0VGltZU9mZnNldChsYXllcigpLCB0KTsgfQ0KKyAg
ICBDRlRpbWVJbnRlcnZhbCB0aW1lT2Zmc2V0KCkgY29uc3QgeyBDQUNGTGF5ZXJHZXRUaW1lT2Zm
c2V0KGxheWVyKCkpOyB9DQorDQorICAgIFdLQ0FDRkxheWVyKiByb290TGF5ZXIoKSBjb25zdDsN
CisNCisgICAgdm9pZCBzZXRTb3J0c1N1YmxheWVycyhib29sIHNvcnRzKSB7IENBQ0ZMYXllclNl
dFNvcnRzU3VibGF5ZXJzKGxheWVyKCksIHNvcnRzKTsgc2V0TmVlZHNDb21taXQoKTsgfQ0KKyAg
ICBib29sIHNvcnRzU3VibGF5ZXJzKCkgY29uc3QgeyByZXR1cm4gQ0FDRkxheWVyR2V0U29ydHNT
dWJsYXllcnMobGF5ZXIoKSk7IH0NCisNCisgICAgdm9pZCByZW1vdmVBbGxTdWJsYXllcnMoKTsN
CisgICAgDQorICAgIHZvaWQgc2V0U3VibGF5ZXJzQnlBZG9wdGluZ1ZlY3RvcihWZWN0b3I8UmVm
UHRyPFdLQ0FDRkxheWVyPiA+Jik7DQorICAgIGNvbnN0IFZlY3RvcjxSZWZQdHI8V0tDQUNGTGF5
ZXI+ID4mIHN1YmxheWVycygpIGNvbnN0IHsgcmV0dXJuIG1fc3VibGF5ZXJzOyB9DQorDQorICAg
IHZvaWQgc2V0U3VibGF5ZXJUcmFuc2Zvcm0oY29uc3QgQ0FUcmFuc2Zvcm0zRCYgdHJhbnNmb3Jt
KSB7IENBQ0ZMYXllclNldFN1YmxheWVyVHJhbnNmb3JtKGxheWVyKCksIHRyYW5zZm9ybSk7IHNl
dE5lZWRzQ29tbWl0KCk7IH0NCisgICAgQ0FUcmFuc2Zvcm0zRCBzdWJsYXllclRyYW5zZm9ybSgp
IGNvbnN0IHsgcmV0dXJuIENBQ0ZMYXllckdldFN1YmxheWVyVHJhbnNmb3JtKGxheWVyKCkpOyB9
DQorDQorICAgIFdLQ0FDRkxheWVyKiBzdXBlcmxheWVyKCkgY29uc3Q7DQorDQorICAgIHZvaWQg
c2V0VHJhbnNmb3JtKGNvbnN0IENBVHJhbnNmb3JtM0QmIHRyYW5zZm9ybSkgeyBDQUNGTGF5ZXJT
ZXRUcmFuc2Zvcm0obGF5ZXIoKSwgdHJhbnNmb3JtKTsgc2V0TmVlZHNDb21taXQoKTsgfQ0KKyAg
ICBDQVRyYW5zZm9ybTNEIHRyYW5zZm9ybSgpIGNvbnN0IHsgcmV0dXJuIENBQ0ZMYXllckdldFRy
YW5zZm9ybShsYXllcigpKTsgfQ0KKw0KKyAgICB2b2lkIHNldEdlb21ldHJ5RmxpcHBlZChib29s
IGZsaXBwZWQpIHsgQ0FDRkxheWVyU2V0R2VvbWV0cnlGbGlwcGVkKGxheWVyKCksIGZsaXBwZWQp
OyBzZXROZWVkc0NvbW1pdCgpOyB9DQorICAgIGJvb2wgZ2VvbWV0cnlGbGlwcGVkKCkgY29uc3Qg
eyByZXR1cm4gQ0FDRkxheWVySXNHZW9tZXRyeUZsaXBwZWQobGF5ZXIoKSk7IH0NCisNCisgICAg
Ly8gUHJpbnQgdGhlIHRyZWUgZnJvbSB0aGlzIGxheWVyIGRvd24NCisgICAgdm9pZCBwcmludCgp
Ow0KKw0KKyAgICAvLyBGSVhNRTogTWFrZSB0aGlzIHByaXZhdGUgb25jZSA8cmRhcjovLzYyMDAy
MTM+IGlzIGZpeGVkIGFuZCB0aGUNCisgICAgLy8gd29ya2Fyb3VuZCBpbiBDeWxpbmRyaWNhbEdy
aWRMYXllci5jcHAgaGFzIGJlZW4gcmVtb3ZlZC4NCisgICAgdm9pZCBzZXROZWVkc0NvbW1pdCgp
Ow0KKw0KK3Byb3RlY3RlZDoNCisgICAgV0tDQUNGTGF5ZXIoQ0ZTdHJpbmdSZWYgY2xhc3NOYW1l
LCBHcmFwaGljc0xheWVyQ0FDRiogb3duZXIpOw0KKw0KK3ByaXZhdGU6DQorICAgIENBQ0ZMYXll
clJlZiBsYXllcigpIGNvbnN0IHsgcmV0dXJuIG1fbGF5ZXIuZ2V0KCk7IH0NCisNCisgICAgLy8g
VGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgZnJvbSByZW1vdmVGcm9tU3VwZXJsYXllci4NCisg
ICAgdm9pZCByZW1vdmVTdWJsYXllcihjb25zdCBXS0NBQ0ZMYXllciopOw0KKw0KKyNpZiBDSEVD
S19TVUJMQVlFUlNfQ09OU0lTVEVOQ1kNCisgICAgdm9pZCBjaGVja1N1YmxheWVyc0NvbnNpc3Rl
bmN5KCkgY29uc3Q7DQorI2Vsc2UNCisgICAgc3RhdGljIHZvaWQgY2hlY2tTdWJsYXllcnNDb25z
aXN0ZW5jeSgpIHsgfQ0KKyNlbmRpZg0KKw0KKyAgICBSZXRhaW5QdHI8Q0FDRkxheWVyUmVmPiBt
X2xheWVyOw0KKyAgICBWZWN0b3I8UmVmUHRyPFdLQ0FDRkxheWVyPiA+IG1fc3VibGF5ZXJzOw0K
KyAgICBib29sIG1fbmVlZHNMYXlvdXRPbkJvdW5kc0NoYW5nZTsNCisgICAgYm9vbCBtX25lZWRz
RGlzcGxheU9uQm91bmRzQ2hhbmdlOw0KKyAgICBHcmFwaGljc0xheWVyQ0FDRiogbV9vd25lcjsN
Cit9Ow0KKw0KK30NCisNCisjZW5kaWYgLy8gV0tDQUNGTGF5ZXJfaA0KDQpQcm9wZXJ0eSBjaGFu
Z2VzIG9uOiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9XS0NBQ0ZMYXllci5oDQpfX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fDQpBZGRlZDogc3ZuOmV4ZWN1dGFibGUNCiAgICsgKg0KDQpJbmRleDogV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy93aW4vV0tDQUNGTGF5ZXJXaW5kb3cuY3BwDQo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQot
LS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vV0tDQUNGTGF5ZXJXaW5kb3cuY3BwCShy
ZXZpc2lvbiAwKQ0KKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1dLQ0FDRkxheWVy
V2luZG93LmNwcAkocmV2aXNpb24gMCkNCkBAIC0wLDAgKzEsMzgxIEBADQorLyoNCisgKiAgV0tD
QUNGTGF5ZXJXaW5kb3cuY3BwDQorICogIFdlYkNvcmUNCisgKg0KKyAqICBDcmVhdGVkIGJ5IEFk
YW0gUm9iZW4gb24gNi8yNC8wOC4NCisgKiAgQWRhcHRlZCBmcm9tIENBTGF5ZXJXaW5kb3cgYnkg
Q2hyaXMgTWFycmluIG9uIDEwLzIxLzA4Lg0KKyAqICBDb3B5cmlnaHQgMjAwOCBBcHBsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorICoNCisgKi8NCisNCisjaW5jbHVkZSAiV0tDQUNGTGF5
ZXJXaW5kb3cuaCINCisNCisjaW5jbHVkZSAiV0tDQUNGQ29udGV4dEZsdXNoZXIuaCINCisjaW5j
bHVkZSAiV0tDQUNGTGF5ZXIuaCINCisvLyNpbmNsdWRlICJEcmF3aW5nVXRpbGl0aWVzLmgiDQor
I2luY2x1ZGUgPENvcmVHcmFwaGljcy9DR1NSZWdpb24uaD4NCisjaW5jbHVkZSA8UXVhcnR6Q29y
ZS9DQUNGQ29udGV4dC5oPg0KKyNpbmNsdWRlIDxRdWFydHpDb3JlL0NBUmVuZGVyT0dMLmg+DQor
I2luY2x1ZGUgPHd0Zi9IYXNoTWFwLmg+DQorI2luY2x1ZGUgPHd0Zi9Pd25BcnJheVB0ci5oPg0K
KyNpbmNsdWRlIDxkM2Q5Lmg+DQorI2luY2x1ZGUgPGQzZHg5Lmg+DQorI2luY2x1ZGUgPGR4ZXJy
OS5oPg0KKw0KK3N0YXRpYyBJRGlyZWN0M0Q5KiBzX2QzZCA9IDA7DQorc3RhdGljIElEaXJlY3Qz
RDkqIGQzZCgpDQorew0KKyAgICBpZiAoc19kM2QpDQorICAgICAgICByZXR1cm4gc19kM2Q7DQor
DQorICAgIGlmICghTG9hZExpYnJhcnkoVEVYVCgiZDNkOS5kbGwiKSkpDQorICAgICAgICByZXR1
cm4gMDsNCisNCisgICAgc19kM2QgPSBEaXJlY3QzRENyZWF0ZTkoRDNEX1NES19WRVJTSU9OKTsN
CisNCisgICAgcmV0dXJuIHNfZDNkOw0KK30NCisNCisvLyBwdWxsZWQgZnJvbSBEcmF3aW5nVXRp
bGl0aWVzLmgNCitpbmxpbmUgc3RhdGljIENHUmVjdCB3aW5SZWN0VG9DR1JlY3QoUkVDVCByYykN
Cit7DQorICAgIHJldHVybiBDR1JlY3RNYWtlKChmbG9hdClyYy5sZWZ0LCAoZmxvYXQpcmMudG9w
LCAoZmxvYXQpKHJjLnJpZ2h0IC0gcmMubGVmdCksIChmbG9hdCkocmMuYm90dG9tIC0gcmMudG9w
KSk7DQorfQ0KKw0KK2lubGluZSBzdGF0aWMgQ0dSZWN0IHdpblJlY3RUb0NHUmVjdChSRUNUIHJj
LCBSRUNUIHJlbGF0aXZlVG9SZWN0KQ0KK3sNCisgICAgcmV0dXJuIENHUmVjdE1ha2UoKGZsb2F0
KXJjLmxlZnQsIChmbG9hdCkocmVsYXRpdmVUb1JlY3QuYm90dG9tLXJjLmJvdHRvbSksIChmbG9h
dCkocmMucmlnaHQgLSByYy5sZWZ0KSwgKGZsb2F0KShyYy5ib3R0b20gLSByYy50b3ApKTsNCit9
DQorDQorbmFtZXNwYWNlIFdlYkNvcmUgew0KKw0KK3R5cGVkZWYgSGFzaE1hcDxDQUNGQ29udGV4
dFJlZiwgV0tDQUNGTGF5ZXJXaW5kb3cqPiBDb250ZXh0VG9XaW5kb3dNYXA7DQorDQorc3RhdGlj
IENvbnRleHRUb1dpbmRvd01hcCYgd2luZG93c0ZvckNvbnRleHRzKCkNCit7DQorICAgIHN0YXRp
YyBDb250ZXh0VG9XaW5kb3dNYXAmIG1hcCA9ICpuZXcgQ29udGV4dFRvV2luZG93TWFwOw0KKyAg
ICByZXR1cm4gbWFwOw0KK30NCisNCitzdGF0aWMgRDNEUFJFU0VOVF9QQVJBTUVURVJTIGluaXRp
YWxQcmVzZW50YXRpb25QYXJhbWV0ZXJzKCkNCit7DQorICAgIEQzRFBSRVNFTlRfUEFSQU1FVEVS
UyBwYXJhbWV0ZXJzID0gezB9Ow0KKyAgICBwYXJhbWV0ZXJzLldpbmRvd2VkID0gVFJVRTsNCisg
ICAgcGFyYW1ldGVycy5Td2FwRWZmZWN0ID0gRDNEU1dBUEVGRkVDVF9DT1BZOw0KKyAgICBwYXJh
bWV0ZXJzLkJhY2tCdWZmZXJDb3VudCA9IDE7DQorICAgIHBhcmFtZXRlcnMuQmFja0J1ZmZlckZv
cm1hdCA9IEQzREZNVF9BOFI4RzhCODsNCisgICAgcGFyYW1ldGVycy5NdWx0aVNhbXBsZVR5cGUg
PSBEM0RNVUxUSVNBTVBMRV9OT05FOw0KKw0KKwlyZXR1cm4gcGFyYW1ldGVyczsNCit9DQorDQor
dm9pZCBXS0NBQ0ZMYXllcldpbmRvdzo6ZGlkRmx1c2hDb250ZXh0KENBQ0ZDb250ZXh0UmVmIGNv
bnRleHQpDQorew0KKyAgICBXS0NBQ0ZMYXllcldpbmRvdyogd2luZG93ID0gd2luZG93c0ZvckNv
bnRleHRzKCkuZ2V0KGNvbnRleHQpOw0KKyAgICBpZiAoIXdpbmRvdykNCisgICAgICAgIHJldHVy
bjsNCisNCisgICAgd2luZG93LT5yZW5kZXJTb29uKCk7DQorfQ0KKw0KK1dLQ0FDRkxheWVyV2lu
ZG93OjpXS0NBQ0ZMYXllcldpbmRvdygpDQorICAgIDogbV90cmllZFRvQ3JlYXRlRDNEUmVuZGVy
ZXIoZmFsc2UpDQorICAgICwgbV9yZW5kZXJDb250ZXh0KDApDQorICAgICwgbV9yZW5kZXJlcigw
KQ0KKyAgICAsIG1faG9zdFdpbmRvdygwKQ0KKyAgICAsIG1fcmVuZGVyVGltZXIodGhpcywgJldL
Q0FDRkxheWVyV2luZG93OjpyZW5kZXJUaW1lckZpcmVkKQ0KK3sNCit9DQorDQorV0tDQUNGTGF5
ZXJXaW5kb3c6On5XS0NBQ0ZMYXllcldpbmRvdygpDQorew0KKyAgICBkZXN0cm95UmVuZGVyZXIo
KTsNCit9DQorDQordm9pZCBXS0NBQ0ZMYXllcldpbmRvdzo6c2V0U2Nyb2xsRnJhbWUoaW50IHdp
ZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc2Nyb2xsWCwgaW50IHNjcm9sbFkpDQorew0KKyAgICBDR1Jl
Y3QgY29udGVudHNSZWN0ID0gYm91bmRzKCk7DQorICAgIGNvbnRlbnRzUmVjdC5zaXplLndpZHRo
ID0gd2lkdGg7DQorICAgIGNvbnRlbnRzUmVjdC5zaXplLmhlaWdodCA9IGhlaWdodDsNCisgICAg
Y29udGVudHNSZWN0Lm9yaWdpbi54ID0gc2Nyb2xsWDsNCisgICAgY29udGVudHNSZWN0Lm9yaWdp
bi55ID0gc2Nyb2xsWTsNCisgICAgbV9zY3JvbGxMYXllci0+c2V0RnJhbWUoY29udGVudHNSZWN0
KTsNCit9DQorDQordm9pZCBXS0NBQ0ZMYXllcldpbmRvdzo6c2V0Um9vdENvbnRlbnRzKENHSW1h
Z2VSZWYgaW1hZ2UpDQorew0KKyAgICBBU1NFUlQobV9yb290TGF5ZXIpOw0KKyAgICBtX3Jvb3RM
YXllci0+c2V0Q29udGVudHMoaW1hZ2UpOw0KKwlyZW5kZXJTb29uKCk7DQorfQ0KKw0KK3ZvaWQg
V0tDQUNGTGF5ZXJXaW5kb3c6OnNldFJvb3RDaGlsZExheWVyKFdlYkNvcmU6OlBsYXRmb3JtTGF5
ZXIqIGxheWVyKQ0KK3sNCisgICAgaWYgKCFtX3Njcm9sbExheWVyKQ0KKyAgICAgICAgcmV0dXJu
Ow0KKw0KKyAgICBtX3Njcm9sbExheWVyLT5yZW1vdmVBbGxTdWJsYXllcnMoKTsNCisgICAgaWYg
KGxheWVyKQ0KKwkgICAgbV9zY3JvbGxMYXllci0+YWRkU3VibGF5ZXIobGF5ZXIpOw0KK30NCisg
ICANCit2b2lkIFdLQ0FDRkxheWVyV2luZG93OjpzZXROZWVkc0Rpc3BsYXkoKQ0KK3sNCisgICAg
QVNTRVJUKG1fcm9vdExheWVyKTsNCisgICAgbV9yb290TGF5ZXItPnNldE5lZWRzQ29tbWl0KCk7
DQorICAgIHJlbmRlclNvb24oKTsNCit9DQorDQordm9pZCBXS0NBQ0ZMYXllcldpbmRvdzo6Y3Jl
YXRlUmVuZGVyZXIoKQ0KK3sNCisgICAgaWYgKG1fdHJpZWRUb0NyZWF0ZUQzRFJlbmRlcmVyKQ0K
KyAgICAgICAgcmV0dXJuOw0KKw0KKyAgICBtX3RyaWVkVG9DcmVhdGVEM0RSZW5kZXJlciA9IHRy
dWU7DQorICAgIEQzRFBSRVNFTlRfUEFSQU1FVEVSUyBwYXJhbWV0ZXJzID0gaW5pdGlhbFByZXNl
bnRhdGlvblBhcmFtZXRlcnMoKTsNCisNCisgICAgaWYgKCFkM2QoKSB8fCAhOjpJc1dpbmRvdyht
X2hvc3RXaW5kb3cpKQ0KKyAgICAgICAgcmV0dXJuOw0KKw0KKwkvLyBEM0QgZG9lc24ndCBsaWtl
IHRvIG1ha2UgYmFjayBidWZmZXJzIGZvciAwIHNpemUgd2luZG93cy4gV2Ugc2tpcnQgdGhpcyBw
cm9ibGVtIGlmIHdlIG1ha2UgdGhlDQorCS8vIHBhc3NlZCBiYWNrYnVmZmVyIHdpZHRoIGFuZCBo
ZWlnaHQgbm9uLXplcm8uIFRoZSB3aW5kb3cgd2lsbCBuZWNlc3NhcmlseSBnZXQgc2V0IHRvIGEg
bm9uLXplcm8NCisJLy8gc2l6ZSBldmVudHVhbGx5LCBhbmQgdGhlbiB0aGUgYmFja2J1ZmZlciBz
aXplIHdpbGwgZ2V0IHJlc2V0Lg0KKyAgICBSRUNUIHJlY3Q7DQorICAgIEdldENsaWVudFJlY3Qo
bV9ob3N0V2luZG93LCAmcmVjdCk7DQorDQorCWlmIChyZWN0LmxlZnQtcmVjdC5yaWdodCA9PSAw
IHx8IHJlY3QuYm90dG9tLXJlY3QudG9wID09IDApIHsNCisJCXBhcmFtZXRlcnMuQmFja0J1ZmZl
cldpZHRoID0gMTsNCisJCXBhcmFtZXRlcnMuQmFja0J1ZmZlckhlaWdodCA9IDE7DQorCX0NCisN
CisgICAgaWYgKEZBSUxFRChkM2QoKS0+Q3JlYXRlRGV2aWNlKEQzREFEQVBURVJfREVGQVVMVCwg
RDNEREVWVFlQRV9IQUwsIG1faG9zdFdpbmRvdywgRDNEQ1JFQVRFX0hBUkRXQVJFX1ZFUlRFWFBS
T0NFU1NJTkcgfCBEM0RDUkVBVEVfRlBVX1BSRVNFUlZFLCAmcGFyYW1ldGVycywgJm1fZDNkRGV2
aWNlKSkpDQorICAgICAgICByZXR1cm47DQorDQorICAgIEQzRFhNQVRSSVhBMTYgcHJvamVjdGlv
bjsNCisgICAgRDNEWE1hdHJpeE9ydGhvT2ZmQ2VudGVyUkgoJnByb2plY3Rpb24sIHJlY3QubGVm
dCwgcmVjdC5yaWdodCwgcmVjdC50b3AsIHJlY3QuYm90dG9tLCAtMS4wZiwgMS4wZik7DQorDQor
ICAgIG1fZDNkRGV2aWNlLT5TZXRUcmFuc2Zvcm0oRDNEVFNfUFJPSkVDVElPTiwgJnByb2plY3Rp
b24pOw0KKw0KKyAgICBtX2NvbnRleHQuYWRvcHRDRihDQUNGQ29udGV4dENyZWF0ZSgwKSk7DQor
ICAgIHdpbmRvd3NGb3JDb250ZXh0cygpLnNldChtX2NvbnRleHQuZ2V0KCksIHRoaXMpOw0KKw0K
KyAgICBtX3JlbmRlckNvbnRleHQgPSBzdGF0aWNfY2FzdDxDQVJlbmRlckNvbnRleHQqPihDQUNG
Q29udGV4dEdldFJlbmRlckNvbnRleHQobV9jb250ZXh0LmdldCgpKSk7DQorICAgIG1fcmVuZGVy
ZXIgPSBDQVJlbmRlck9HTE5ldygma0NBUmVuZGVyRFg5Q2FsbGJhY2tzLCBtX2QzZERldmljZS5n
ZXQoKSwgMCk7DQorDQorICAgIC8vIENyZWF0ZSB0aGUgcm9vdCBoaWVyYXJjaHkNCisJbV9yb290
TGF5ZXIgPSBXS0NBQ0ZMYXllcjo6Y3JlYXRlKGtDQUNGTGF5ZXIpOw0KKwltX3Njcm9sbExheWVy
ID0gV0tDQUNGTGF5ZXI6OmNyZWF0ZShrQ0FDRkxheWVyKTsNCisNCisgICAgbV9yb290TGF5ZXIt
PmFkZFN1YmxheWVyKG1fc2Nyb2xsTGF5ZXIpOw0KKyAgICBtX3Njcm9sbExheWVyLT5zZXRNYXNr
c1RvQm91bmRzKHRydWUpOw0KKw0KKyAgICBDR0NvbG9yUmVmIGRlYnVnQ29sb3IgPSBjcmVhdGVD
R0NvbG9yKENvbG9yKDI1NSwgMCwgMCwgMjA0KSk7DQorICAgIG1fcm9vdExheWVyLT5zZXRCYWNr
Z3JvdW5kQ29sb3IoZGVidWdDb2xvcik7DQorICAgIENHQ29sb3JSZWxlYXNlKGRlYnVnQ29sb3Ip
Ow0KKw0KKyAgICBpZiAoSXNXaW5kb3cobV9ob3N0V2luZG93KSkgew0KKyAgICAgICAgbV9yb290
TGF5ZXItPnNldEZyYW1lKGJvdW5kcygpKTsNCisNCisgICAgICAgIC8vIEZvciBub3cgdGhpcyB3
aWxsIGluY2x1ZGUgdGhlIHNjcm9sbCBiYXJzLiBMYXRlciBpbiB0aGUgc2V0U2Nyb2xsRnJhbWUN
CisgICAgICAgIC8vIHdlIHdpbGwgZml4IGl0DQorICAgICAgICBtX3Njcm9sbExheWVyLT5zZXRG
cmFtZShib3VuZHMoKSk7DQorICAgIH0NCisNCisgICAgaWYgKG1fY29udGV4dCkNCisgICAgICAg
IG1fcm9vdExheWVyLT5iZWNvbWVMYXllckZvckNvbnRleHQobV9jb250ZXh0LmdldCgpKTsNCit9
DQorDQordm9pZCBXS0NBQ0ZMYXllcldpbmRvdzo6ZGVzdHJveVJlbmRlcmVyKCkNCit7DQorICAg
IHdpbmRvd3NGb3JDb250ZXh0cygpLnJlbW92ZShtX2NvbnRleHQuZ2V0KCkpOw0KKyAgICBXS0NB
Q0ZDb250ZXh0Rmx1c2hlcjo6c2hhcmVkKCkucmVtb3ZlQ29udGV4dChtX2NvbnRleHQuZ2V0KCkp
Ow0KKw0KKyAgICBpZiAobV9yZW5kZXJlcikNCisgICAgICAgIENBUmVuZGVyT0dMRGVzdHJveSht
X3JlbmRlcmVyKTsNCisgICAgbV9yZW5kZXJlciA9IDA7DQorICAgIG1fZDNkRGV2aWNlID0gMDsN
CisgICAgaWYgKHNfZDNkKQ0KKyAgICAgICAgc19kM2QtPlJlbGVhc2UoKTsNCisNCisgICAgc19k
M2QgPSAwOw0KKyAgICBtX3Jvb3RMYXllciA9IDA7DQorICAgIG1fc2Nyb2xsTGF5ZXIgPSAwOw0K
Kw0KKyAgICBtX3RyaWVkVG9DcmVhdGVEM0RSZW5kZXJlciA9IGZhbHNlOw0KK30NCisNCit2b2lk
IFdLQ0FDRkxheWVyV2luZG93OjpyZXNpemUoKQ0KK3sNCisgICAgaWYgKCFtX2QzZERldmljZSkN
CisgICAgICAgIHJldHVybjsNCisNCisgICAgcmVzZXREZXZpY2UoKTsNCisNCisgICAgaWYgKG1f
cm9vdExheWVyKSB7DQorICAgICAgICBtX3Jvb3RMYXllci0+c2V0RnJhbWUoYm91bmRzKCkpOw0K
Kw0KKyAgICAgICAgLy8gRklYTUU6IFRoaXMgc2hvdWxkIGJlIHRoZSBib3VuZHMgaW5zaWRlIHRo
ZSBzY3JvbGxiYXJzDQorICAgICAgICBtX3Njcm9sbExheWVyLT5zZXRGcmFtZShib3VuZHMoKSk7
DQorDQorICAgICAgICBXS0NBQ0ZDb250ZXh0Rmx1c2hlcjo6c2hhcmVkKCkuZmx1c2hBbGxDb250
ZXh0cygpOw0KKyAgICB9DQorfQ0KKw0KK3N0YXRpYyB2b2lkIGdldERpcnR5UmVjdHMoSFdORCB3
aW5kb3csIFZlY3RvcjxDR1JlY3Q+JiBvdXRSZWN0cykNCit7DQorICAgIEFTU0VSVF9BUkcob3V0
UmVjdHMsIG91dFJlY3RzLmlzRW1wdHkoKSk7DQorDQorICAgIFJFQ1QgY2xpZW50UmVjdDsNCisg
ICAgaWYgKCFHZXRDbGllbnRSZWN0KHdpbmRvdywgJmNsaWVudFJlY3QpKQ0KKyAgICAgICAgcmV0
dXJuOw0KKw0KKyAgICBIUkdOIHJlZ2lvbiA9IENyZWF0ZVJlY3RSZ24oMCwgMCwgMCwgMCk7DQor
ICAgIGludCByZWdpb25UeXBlID0gR2V0VXBkYXRlUmduKHdpbmRvdywgcmVnaW9uLCBmYWxzZSk7
DQorICAgIGlmIChyZWdpb25UeXBlICE9IENPTVBMRVhSRUdJT04pIHsNCisgICAgICAgIFJFQ1Qg
ZGlydHlSZWN0Ow0KKyAgICAgICAgaWYgKEdldFVwZGF0ZVJlY3Qod2luZG93LCAmZGlydHlSZWN0
LCBmYWxzZSkpDQorICAgICAgICAgICAgb3V0UmVjdHMuYXBwZW5kKHdpblJlY3RUb0NHUmVjdChk
aXJ0eVJlY3QsIGNsaWVudFJlY3QpKTsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKw0KKyAg
ICBEV09SRCBkYXRhU2l6ZSA9IEdldFJlZ2lvbkRhdGEocmVnaW9uLCAwLCAwKTsNCisgICAgT3du
QXJyYXlQdHI8dW5zaWduZWQgY2hhcj4gcmVnaW9uRGF0YUJ1ZmZlcihuZXcgdW5zaWduZWQgY2hh
cltkYXRhU2l6ZV0pOw0KKyAgICBSR05EQVRBKiByZWdpb25EYXRhID0gcmVpbnRlcnByZXRfY2Fz
dDxSR05EQVRBKj4ocmVnaW9uRGF0YUJ1ZmZlci5nZXQoKSk7DQorICAgIGlmICghR2V0UmVnaW9u
RGF0YShyZWdpb24sIGRhdGFTaXplLCByZWdpb25EYXRhKSkNCisgICAgICAgIHJldHVybjsNCisN
CisgICAgb3V0UmVjdHMucmVzaXplKHJlZ2lvbkRhdGEtPnJkaC5uQ291bnQpOw0KKw0KKyAgICBS
RUNUKiByZWN0ID0gcmVpbnRlcnByZXRfY2FzdDxSRUNUKj4ocmVnaW9uRGF0YS0+QnVmZmVyKTsN
CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdXRSZWN0cy5zaXplKCk7ICsraSwgKytyZWN0
KQ0KKyAgICAgICAgb3V0UmVjdHNbaV0gPSB3aW5SZWN0VG9DR1JlY3QoKnJlY3QsIGNsaWVudFJl
Y3QpOw0KKw0KKyAgICBEZWxldGVPYmplY3QocmVnaW9uKTsNCit9DQorDQordm9pZCBXS0NBQ0ZM
YXllcldpbmRvdzo6cmVuZGVyVGltZXJGaXJlZChUaW1lcjxXS0NBQ0ZMYXllcldpbmRvdz4qKQ0K
K3sNCisgICAgcGFpbnQoKTsNCit9DQorDQordm9pZCBXS0NBQ0ZMYXllcldpbmRvdzo6cGFpbnQo
KQ0KK3sNCisgICAgaWYgKCFtX2QzZERldmljZSkNCisgICAgICAgIHJldHVybjsNCisNCisgICAg
VmVjdG9yPENHUmVjdD4gZGlydHlSZWN0czsNCisgICAgZ2V0RGlydHlSZWN0cyhtX2hvc3RXaW5k
b3csIGRpcnR5UmVjdHMpOw0KKyAgICByZW5kZXIoZGlydHlSZWN0cyk7DQorDQorICAgIFZhbGlk
YXRlUmVjdChtX2hvc3RXaW5kb3csIDApOw0KK30NCisNCit2b2lkIFdLQ0FDRkxheWVyV2luZG93
OjpyZW5kZXIoY29uc3QgVmVjdG9yPENHUmVjdD4mIGRpcnR5UmVjdHMpDQorew0KKyAgICBBU1NF
UlQobV9kM2REZXZpY2UpOw0KKw0KKyAgICAvLyBGbHVzaCB0aGUgcm9vdCBsYXllciB0byB0aGUg
cmVuZGVyIHRyZWUuDQorICAgIFdLQ0FDRkNvbnRleHRGbHVzaGVyOjpzaGFyZWQoKS5mbHVzaEFs
bENvbnRleHRzKCk7DQorDQorICAgIENHUmVjdCBib3VuZHMgPSB0aGlzLT5ib3VuZHMoKTsNCisN
CisgICAgQ0ZUaW1lSW50ZXJ2YWwgdCA9IENBQ3VycmVudE1lZGlhVGltZSgpOw0KKw0KKyAgICBj
aGFyIHNwYWNlWzQwOTZdOw0KKyAgICBDQVJlbmRlclVwZGF0ZSogdSA9IENBUmVuZGVyVXBkYXRl
QmVnaW4oc3BhY2UsIHNpemVvZihzcGFjZSksIHQsIDAsIDAsICZib3VuZHMpOw0KKyAgICBpZiAo
IXUpDQorICAgICAgICByZXR1cm47DQorDQorICAgIENBUmVuZGVyQ29udGV4dExvY2sobV9yZW5k
ZXJDb250ZXh0KTsNCisgICAgQ0FSZW5kZXJVcGRhdGVBZGRDb250ZXh0KHUsIG1fcmVuZGVyQ29u
dGV4dCk7DQorICAgIENBUmVuZGVyQ29udGV4dFVubG9jayhtX3JlbmRlckNvbnRleHQpOw0KKw0K
KyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGRpcnR5UmVjdHMuc2l6ZSgpOyArK2kpDQorICAg
ICAgICBDQVJlbmRlclVwZGF0ZUFkZFJlY3QodSwgJmRpcnR5UmVjdHNbaV0pOw0KKw0KKyAgICBI
UkVTVUxUIGVyciA9IFNfT0s7DQorICAgIGRvIHsNCisgICAgICAgIENHU1JlZ2lvbk9iaiByZ24g
PSBDQVJlbmRlclVwZGF0ZUNvcHlSZWdpb24odSk7DQorDQorICAgICAgICBpZiAoIXJnbikNCisg
ICAgICAgICAgICBicmVhazsNCisNCisgICAgICAgIC8qIEZJWE1FOiBkb24ndCBuZWVkIHRvIGNs
ZWFyIGRpcnR5IHJlZ2lvbiBpZiBsYXllciB0cmVlIGlzIG9wYXF1ZS4gKi8NCisNCisgICAgICAg
IFZlY3RvcjxEM0RSRUNULCA2ND4gcmVjdHM7DQorICAgICAgICBDR1NSZWdpb25FbnVtZXJhdG9y
T2JqIGUgPSBDR1NSZWdpb25FbnVtZXJhdG9yKHJnbik7DQorICAgICAgICBmb3IgKGNvbnN0IENH
UmVjdCogciA9IENHU05leHRSZWN0KGUpOyByOyByID0gQ0dTTmV4dFJlY3QoZSkpIHsNCisgICAg
ICAgICAgICBEM0RSRUNUIHJlY3Q7DQorICAgICAgICAgICAgcmVjdC54MSA9IHItPm9yaWdpbi54
Ow0KKyAgICAgICAgICAgIHJlY3QueDIgPSByZWN0LngxICsgci0+c2l6ZS53aWR0aDsNCisgICAg
ICAgICAgICByZWN0LnkxID0gYm91bmRzLm9yaWdpbi55ICsgYm91bmRzLnNpemUuaGVpZ2h0IC0g
KHItPm9yaWdpbi55ICsgci0+c2l6ZS5oZWlnaHQpOw0KKyAgICAgICAgICAgIHJlY3QueTIgPSBy
ZWN0LnkxICsgci0+c2l6ZS5oZWlnaHQ7DQorDQorICAgICAgICAgICAgcmVjdHMuYXBwZW5kKHJl
Y3QpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ0dTUmVsZWFzZVJlZ2lvbkVudW1lcmF0b3IoZSk7
DQorICAgICAgICBDR1NSZWxlYXNlUmVnaW9uKHJnbik7DQorDQorICAgICAgICBpZiAocmVjdHMu
aXNFbXB0eSgpKQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgICAgbV9kM2REZXZpY2Ut
PkNsZWFyKHJlY3RzLnNpemUoKSwgcmVjdHMuZGF0YSgpLCBEM0RDTEVBUl9UQVJHRVQsIDAsIDEu
MGYsIDApOw0KKw0KKyAgICAgICAgbV9kM2REZXZpY2UtPkJlZ2luU2NlbmUoKTsNCisgICAgICAg
IENBUmVuZGVyT0dMUmVuZGVyKG1fcmVuZGVyZXIsIHUpOw0KKyAgICAgICAgbV9kM2REZXZpY2Ut
PkVuZFNjZW5lKCk7DQorDQorICAgICAgICBlcnIgPSBtX2QzZERldmljZS0+UHJlc2VudCgwLCAw
LCAwLCAwKTsNCisNCisgICAgICAgIGlmIChlcnIgPT0gRDNERVJSX0RFVklDRUxPU1QpIHsNCisg
ICAgICAgICAgICAvKiBMb3N0IGRldmljZSBzaXR1YXRpb24uICovDQorDQorICAgICAgICAgICAg
Q0FSZW5kZXJPR0xQdXJnZShtX3JlbmRlcmVyKTsNCisgICAgICAgICAgICByZXNldERldmljZSgp
Ow0KKyAgICAgICAgICAgIENBUmVuZGVyVXBkYXRlQWRkUmVjdCh1LCAmYm91bmRzKTsNCisgICAg
ICAgIH0NCisgICAgfSB3aGlsZSAoZXJyID09IEQzREVSUl9ERVZJQ0VMT1NUKTsNCisNCisgICAg
Q0FSZW5kZXJVcGRhdGVGaW5pc2ggKHUpOw0KK30NCisNCit2b2lkIFdLQ0FDRkxheWVyV2luZG93
OjpyZW5kZXJTb29uKCkNCit7DQorICAgIG1fcmVuZGVyVGltZXIuc3RhcnRPbmVTaG90KDApOw0K
K30NCisNCitDR1JlY3QgV0tDQUNGTGF5ZXJXaW5kb3c6OmJvdW5kcygpIGNvbnN0DQorew0KKyAg
ICBSRUNUIGNsaWVudFJlY3Q7DQorICAgIEdldENsaWVudFJlY3QobV9ob3N0V2luZG93LCAmY2xp
ZW50UmVjdCk7DQorDQorICAgIHJldHVybiB3aW5SZWN0VG9DR1JlY3QoY2xpZW50UmVjdCk7DQor
fQ0KKw0KK3ZvaWQgV0tDQUNGTGF5ZXJXaW5kb3c6OmluaXREM0RHZW9tZXRyeSgpDQorew0KKyAg
ICBBU1NFUlQobV9kM2REZXZpY2UpOw0KKw0KKyAgICBDR1JlY3QgYm91bmRzID0gdGhpcy0+Ym91
bmRzKCk7DQorDQorICAgIGZsb2F0IHgwID0gYm91bmRzLm9yaWdpbi54Ow0KKyAgICBmbG9hdCB5
MCA9IGJvdW5kcy5vcmlnaW4ueTsNCisgICAgZmxvYXQgeDEgPSB4MCArIGJvdW5kcy5zaXplLndp
ZHRoOw0KKyAgICBmbG9hdCB5MSA9IHkwICsgYm91bmRzLnNpemUuaGVpZ2h0Ow0KKw0KKyAgICBE
M0RYTUFUUklYQTE2IHByb2plY3Rpb247DQorICAgIEQzRFhNYXRyaXhPcnRob09mZkNlbnRlclJI
KCZwcm9qZWN0aW9uLCB4MCwgeDEsIHkwLCB5MSwgLTEuMGYsIDEuMGYpOw0KKw0KKyAgICBtX2Qz
ZERldmljZS0+U2V0VHJhbnNmb3JtKEQzRFRTX1BST0pFQ1RJT04sICZwcm9qZWN0aW9uKTsNCit9
DQorDQordm9pZCBXS0NBQ0ZMYXllcldpbmRvdzo6cmVzZXREZXZpY2UoKQ0KK3sNCisgICAgQVNT
RVJUKG1fZDNkRGV2aWNlKTsNCisNCisgICAgRDNEUFJFU0VOVF9QQVJBTUVURVJTIHBhcmFtZXRl
cnMgPSBpbml0aWFsUHJlc2VudGF0aW9uUGFyYW1ldGVycygpOw0KKyAgICBtX2QzZERldmljZS0+
UmVzZXQoJnBhcmFtZXRlcnMpOw0KKyAgICBpbml0RDNER2VvbWV0cnkoKTsNCit9DQorDQorfQ0K
XCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlDQoNClByb3BlcnR5IGNoYW5nZXMgb246IFdlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1dLQ0FDRkxheWVyV2luZG93LmNwcA0KX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
Xw0KQWRkZWQ6IHN2bjpleGVjdXRhYmxlDQogICArICoNCg0KSW5kZXg6IFdlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3Mvd2luL1dLQ0FDRkxheWVyV2luZG93LmgNCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0tLSBXZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9XS0NBQ0ZMYXllcldpbmRvdy5oCShyZXZpc2lvbiAw
KQ0KKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1dLQ0FDRkxheWVyV2luZG93LmgJ
KHJldmlzaW9uIDApDQpAQCAtMCwwICsxLDgyIEBADQorLyoNCisgKiAgV0tDQUNGTGF5ZXJXaW5k
b3cuaA0KKyAqICBXZWJDb3JlDQorICoNCisgKiAgQ3JlYXRlZCBieSBBZGFtIFJvYmVuIG9uIDYv
MjQvMDguDQorICogIEFkYXB0ZWQgZnJvbSBDQUxheWVyV2luZG93IGJ5IENocmlzIE1hcnJpbiBv
biAxMC8yMS8wOC4NCisgKiAgQ29weXJpZ2h0IDIwMDggQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLg0KKyAqDQorICovDQorDQorI2lmbmRlZiBXS0NBQ0ZMYXllcldpbmRvd19oDQorI2Rl
ZmluZSBXS0NBQ0ZMYXllcldpbmRvd19oDQorDQorI2luY2x1ZGUgImNvbmZpZy5oIg0KKw0KKyNp
bmNsdWRlICJDT01QdHIuaCINCisjaW5jbHVkZSAiVGltZXIuaCINCisjaW5jbHVkZSAiV0tDQUNG
TGF5ZXIuaCINCisNCisjaW5jbHVkZSA8d3RmL05vbmNvcHlhYmxlLmg+DQorDQorI2luY2x1ZGUg
PHd0Zi9QYXNzUmVmUHRyLmg+DQorI2luY2x1ZGUgPHd0Zi9SZWZQdHIuaD4NCisjaW5jbHVkZSA8
d3RmL1JldGFpblB0ci5oPg0KKw0KKyNpbmNsdWRlIDxDb3JlR3JhcGhpY3MvQ0dHZW9tZXRyeS5o
Pg0KKw0KK2ludGVyZmFjZSBJRGlyZWN0M0REZXZpY2U5Ow0KK3R5cGVkZWYgc3RydWN0IF9DQUNG
Q29udGV4dCogQ0FDRkNvbnRleHRSZWY7DQordHlwZWRlZiBzdHJ1Y3QgX0NBUmVuZGVyQ29udGV4
dCBDQVJlbmRlckNvbnRleHQ7DQordHlwZWRlZiBzdHJ1Y3QgX0NBUmVuZGVyT0dMQ29udGV4dCBD
QVJlbmRlck9HTENvbnRleHQ7DQorDQorbmFtZXNwYWNlIFdlYkNvcmUgew0KKw0KK2NsYXNzIFdL
Q0FDRkxheWVyV2luZG93IDogTm9uY29weWFibGUgew0KK3B1YmxpYzoNCisgICAgV0tDQUNGTGF5
ZXJXaW5kb3coKTsNCisgICAgfldLQ0FDRkxheWVyV2luZG93KCk7DQorDQorICAgIHN0YXRpYyB2
b2lkIGRpZEZsdXNoQ29udGV4dChDQUNGQ29udGV4dFJlZik7DQorDQorICAgIHZvaWQgc2V0U2Ny
b2xsRnJhbWUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc2Nyb2xsWCwgaW50IHNjcm9sbFkp
Ow0KKyAgICB2b2lkIHNldFJvb3RDb250ZW50cyhDR0ltYWdlUmVmKTsNCisgICAgdm9pZCBzZXRS
b290Q2hpbGRMYXllcihXZWJDb3JlOjpQbGF0Zm9ybUxheWVyKiBsYXllcik7DQorICAgIHZvaWQg
c2V0TmVlZHNEaXNwbGF5KCk7DQorICAgIHZvaWQgc2V0SG9zdFdpbmRvdyhIV05EIHdpbmRvdykg
eyBtX2hvc3RXaW5kb3cgPSB3aW5kb3c7IGNyZWF0ZVJlbmRlcmVyKCk7IH0NCisNCisgICAgdm9p
ZCBjcmVhdGVSZW5kZXJlcigpOw0KKyAgICB2b2lkIGRlc3Ryb3lSZW5kZXJlcigpOw0KKyAgICB2
b2lkIHJlc2l6ZSgpOw0KKyAgICB2b2lkIHJlbmRlclNvb24oKTsNCisNCitwcm90ZWN0ZWQ6DQor
ICAgIFdLQ0FDRkxheWVyKiByb290TGF5ZXIoKSBjb25zdCB7IHJldHVybiBtX3Jvb3RMYXllci5n
ZXQoKTsgfQ0KKw0KK3ByaXZhdGU6DQorICAgIHZvaWQgcmVuZGVyVGltZXJGaXJlZChUaW1lcjxX
S0NBQ0ZMYXllcldpbmRvdz4qKTsNCisNCisgICAgQ0dSZWN0IGJvdW5kcygpIGNvbnN0Ow0KKw0K
KyAgICB2b2lkIGluaXREM0RHZW9tZXRyeSgpOw0KKyAgICB2b2lkIHJlc2V0RGV2aWNlKCk7DQor
DQorICAgIHZvaWQgcmVuZGVyKGNvbnN0IFZlY3RvcjxDR1JlY3Q+JiBkaXJ0eVJlY3RzID0gVmVj
dG9yPENHUmVjdD4oKSk7DQorICAgIHZvaWQgcGFpbnQoKTsNCisNCisgICAgYm9vbCBtX3RyaWVk
VG9DcmVhdGVEM0RSZW5kZXJlcjsNCisgICAgQ09NUHRyPElEaXJlY3QzRERldmljZTk+IG1fZDNk
RGV2aWNlOw0KKyAgICBSZWZQdHI8V0tDQUNGTGF5ZXI+IG1fcm9vdExheWVyOw0KKyAgICBSZWZQ
dHI8V0tDQUNGTGF5ZXI+IG1fdmlld0xheWVyOw0KKyAgICBSZWZQdHI8V0tDQUNGTGF5ZXI+IG1f
c2Nyb2xsTGF5ZXI7DQorICAgIFJldGFpblB0cjxDQUNGQ29udGV4dFJlZj4gbV9jb250ZXh0Ow0K
KyAgICBDQVJlbmRlckNvbnRleHQqIG1fcmVuZGVyQ29udGV4dDsNCisgICAgQ0FSZW5kZXJPR0xD
b250ZXh0KiBtX3JlbmRlcmVyOw0KKyAgICBIV05EIG1faG9zdFdpbmRvdzsNCisgICAgVGltZXI8
V0tDQUNGTGF5ZXJXaW5kb3c+IG1fcmVuZGVyVGltZXI7DQorDQorfTsNCisNCit9DQorDQorI2Vu
ZGlmIC8vIFdLQ0FDRkxheWVyV2luZG93X2gNCg0KUHJvcGVydHkgY2hhbmdlcyBvbjogV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vV0tDQUNGTGF5ZXJXaW5kb3cuaA0KX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0K
QWRkZWQ6IHN2bjpleGVjdXRhYmxlDQogICArICoNCg==
</data>
<flag name="review"
          id="22391"
          type_id="1"
          status="-"
          setter="simon.fraser"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>41072</attachid>
            <date>2009-10-12 17:46:42 -0700</date>
            <delta_ts>2009-11-23 17:38:12 -0800</delta_ts>
            <desc>Second patch (hooking up accelerated compositing, but not building)</desc>
            <filename>accel-hookup.patch.txt</filename>
            <type>text/plain</type>
            <size>13265</size>
            <attacher name="Chris Marrin">cmarrin</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotLS0gV2ViQ29yZS9DaGFuZ2VM
b2cJKHJldmlzaW9uIDQ5NDg0KQ0KKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkp
DQpAQCAtMSwzICsxLDIxNCBAQA0KKzIwMDktMTAtMTIgIENocmlzIE1hcnJpbiAgPGNtYXJyaW5A
YXBwbGUuY29tPg0KKw0KKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuDQorDQor
ICAgICAgICBDb25uZWN0aW5nIHVwIGFjY2VsZXJhdGVkIGNvbXBvc2l0aW5nIG9uIFdpbmRvd3MN
CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yNzMxNA0K
Kw0KKyAgICAgICAgQWxsIGNoYW5nZXMgYXJlIGJlaGluZCBVU0VfQUNDRUxFUkFURURfQ09NUE9T
SVRJTkcgZmxhZy4gTm90IGVuYWJsZWQgeWV0DQorDQorICAgICAgICAqIHBhZ2UvRnJhbWVWaWV3
LmNwcDoNCisgICAgICAgIChXZWJDb3JlOjpGcmFtZVZpZXc6OnN5bmNDb21wb3NpdGluZ1N0YXRl
UmVjdXJzaXZlKToNCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3NMYXllci5o
Og0KKw0KIDIwMDktMTAtMTIgIERhbiBCZXJuc3RlaW4gIDxtaXR6QGFwcGxlLmNvbT4NCiANCiAg
ICAgICAgIFJldmlld2VkIGJ5IFNpbW9uIEZyYXNlci4NCkluZGV4OiBXZWJDb3JlL3BhZ2UvRnJh
bWVWaWV3LmNwcA0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQ0KLS0tIFdlYkNvcmUvcGFnZS9GcmFtZVZpZXcuY3BwCShy
ZXZpc2lvbiA0OTQ4MSkNCisrKyBXZWJDb3JlL3BhZ2UvRnJhbWVWaWV3LmNwcAkod29ya2luZyBj
b3B5KQ0KQEAgLTQ0NSw4ICs0NDUsOSBAQCBib29sIEZyYW1lVmlldzo6c3luY0NvbXBvc2l0aW5n
U3RhdGVSZWN1DQogICAgICAgICB9DQogICAgIH0NCiAgICAgcmV0dXJuIGFsbFN1YmZyYW1lc1N5
bmNlZDsNCi0jZW5kaWYgLy8gVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQ0KKyNlbHNlIC8v
IFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykNCiAgICAgcmV0dXJuIHRydWU7DQorI2VuZGlm
DQogfQ0KIA0KIHZvaWQgRnJhbWVWaWV3OjpkaWRNb3ZlT25zY3JlZW4oKQ0KSW5kZXg6IFdlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3NMYXllci5oDQo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotLS0gV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9HcmFwaGljc0xheWVyLmgJKHJldmlzaW9uIDQ5NDgxKQ0K
KysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3NMYXllci5oCSh3b3JraW5nIGNv
cHkpDQpAQCAtNTMsNiArNTMsMTIgQEAgdHlwZWRlZiBDQUxheWVyKiBOYXRpdmVMYXllcjsNCiB0
eXBlZGVmIHZvaWQqIFBsYXRmb3JtTGF5ZXI7DQogdHlwZWRlZiB2b2lkKiBOYXRpdmVMYXllcjsN
CiAjZW5kaWYNCisjZWxpZiBQTEFURk9STShXSU4pDQorbmFtZXNwYWNlIFdlYkNvcmUgew0KK2Ns
YXNzIFdLQ0FDRkxheWVyOw0KK3R5cGVkZWYgV0tDQUNGTGF5ZXIgUGxhdGZvcm1MYXllcjsNCit0
eXBlZGVmIHZvaWQqIE5hdGl2ZUxheWVyOw0KK30NCiAjZWxzZQ0KIHR5cGVkZWYgdm9pZCogUGxh
dGZvcm1MYXllcjsNCiB0eXBlZGVmIHZvaWQqIE5hdGl2ZUxheWVyOw0KSW5kZXg6IFdlYktpdC93
aW4vQ2hhbmdlTG9nDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09DQotLS0gV2ViS2l0L3dpbi9DaGFuZ2VMb2cJKHJldmlz
aW9uIDQ5NDg0KQ0KKysrIFdlYktpdC93aW4vQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpDQpAQCAt
MSwzICsxLDMwIEBADQorMjAwOS0xMC0xMiAgQ2hyaXMgTWFycmluICA8Y21hcnJpbkBhcHBsZS5j
b20+DQorDQorICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4NCisNCisgICAgICAg
IENvbm5lY3RpbmcgdXAgYWNjZWxlcmF0ZWQgY29tcG9zaXRpbmcgb24gV2luZG93cw0KKyAgICAg
ICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI3MzE0DQorDQorICAg
ICAgICAqIFdlYkNvcmVTdXBwb3J0L1dlYkNocm9tZUNsaWVudC5jcHA6DQorICAgICAgICAoV2Vi
Q2hyb21lQ2xpZW50OjphdHRhY2hSb290R3JhcGhpY3NMYXllcik6DQorICAgICAgICAoV2ViQ2hy
b21lQ2xpZW50OjpzY2hlZHVsZUNvbXBvc2l0aW5nTGF5ZXJTeW5jKToNCisgICAgICAgICogV2Vi
Q29yZVN1cHBvcnQvV2ViQ2hyb21lQ2xpZW50Lmg6DQorICAgICAgICAoV2ViQ2hyb21lQ2xpZW50
OjpzZXROZWVkc09uZVNob3REcmF3aW5nU3luY2hyb25pemF0aW9uKToNCisgICAgICAgICogV2Vi
Vmlldy5jcHA6DQorICAgICAgICAoV2ViVmlldzo6V2ViVmlldyk6DQorICAgICAgICAoV2ViVmll
dzo6Y2xvc2UpOg0KKyAgICAgICAgKFdlYlZpZXc6OnJlcGFpbnQpOg0KKyAgICAgICAgKFdlYlZp
ZXc6OnNjcm9sbEJhY2tpbmdTdG9yZSk6DQorICAgICAgICAoV2ViVmlldzo6cGFpbnQpOg0KKyAg
ICAgICAgKFdlYlZpZXdXbmRQcm9jKToNCisgICAgICAgIChXZWJWaWV3OjpzZXRSb290Q2hpbGRM
YXllcik6DQorICAgICAgICAoV2ViVmlldzo6c2V0QWNjZWxlcmF0ZWRDb21wb3NpdGluZyk6DQor
ICAgICAgICAqIFdlYlZpZXcuaDoNCisgICAgICAgIChXZWJWaWV3OjpzZXRSb290TGF5ZXJOZWVk
c0Rpc3BsYXkpOg0KKyAgICAgICAgKFdlYlZpZXc6OnJlc2l6ZUxheWVyV2luZG93KToNCisgICAg
ICAgIChXZWJWaWV3OjpzaG93TGF5ZXJXaW5kb3cpOg0KKyAgICAgICAgKFdlYlZpZXc6OmlzQWNj
ZWxlcmF0ZWRDb21wb3NpdGluZyk6DQorDQogMjAwOS0xMC0wOSAgQWRhbSBCYXJ0aCAgPGFiYXJ0
aEB3ZWJraXQub3JnPg0KIA0KICAgICAgICAgUmV2aWV3ZWQgYnkgRGFyaW4gQWRsZXIuDQpJbmRl
eDogV2ViS2l0L3dpbi9XZWJWaWV3LmNwcA0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLS0tIFdlYktpdC93aW4vV2Vi
Vmlldy5jcHAJKHJldmlzaW9uIDQ5MzEwKQ0KKysrIFdlYktpdC93aW4vV2ViVmlldy5jcHAJKHdv
cmtpbmcgY29weSkNCkBAIC0zMjEsNiArMzIxLDcgQEAgV2ViVmlldzo6V2ViVmlldygpDQogLCBt
X2xhc3RQYW5ZKDApDQogLCBtX3hPdmVycGFuKDApDQogLCBtX3lPdmVycGFuKDApDQorLCBtX2lz
QWNjZWxlcmF0ZWRDb21wb3NpdGluZyhmYWxzZSkNCiB7DQogICAgIEpTQzo6aW5pdGlhbGl6ZVRo
cmVhZGluZygpOw0KIA0KQEAgLTYxNiw2ICs2MTcsMTAgQEAgSFJFU1VMVCBTVERNRVRIT0RDQUxM
VFlQRSBXZWJWaWV3OjpjbG9zZQ0KIA0KICAgICBtX2RpZENsb3NlID0gdHJ1ZTsNCiANCisjaWYg
VVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQ0KKyAgICBzZXRBY2NlbGVyYXRlZENvbXBvc2l0
aW5nKGZhbHNlKTsNCisjZW5kaWYNCisNCiAgICAgV2ViTm90aWZpY2F0aW9uQ2VudGVyOjpkZWZh
dWx0Q2VudGVySW50ZXJuYWwoKS0+cG9zdE5vdGlmaWNhdGlvbk5hbWUoX2JzdHJfdChXZWJWaWV3
V2lsbENsb3NlTm90aWZpY2F0aW9uKS5HZXRCU1RSKCksIHN0YXRpY19jYXN0PElXZWJWaWV3Kj4o
dGhpcyksIDApOw0KIA0KICAgICBpZiAobV91aURlbGVnYXRlUHJpdmF0ZSkNCkBAIC02NzQsNiAr
Njc5LDExIEBAIEhSRVNVTFQgU1RETUVUSE9EQ0FMTFRZUEUgV2ViVmlldzo6Y2xvc2UNCiANCiB2
b2lkIFdlYlZpZXc6OnJlcGFpbnQoY29uc3QgV2ViQ29yZTo6SW50UmVjdCYgd2luZG93UmVjdCwg
Ym9vbCBjb250ZW50Q2hhbmdlZCwgYm9vbCBpbW1lZGlhdGUsIGJvb2wgcmVwYWludENvbnRlbnRP
bmx5KQ0KIHsNCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQ0KKyAgICBpZiAoaXNB
Y2NlbGVyYXRlZENvbXBvc2l0aW5nKCkpDQorCSAgICBzZXRSb290TGF5ZXJOZWVkc0Rpc3BsYXko
KTsNCisjZW5kaWYNCisNCiAgICAgaWYgKCFyZXBhaW50Q29udGVudE9ubHkpIHsNCiAgICAgICAg
IFJFQ1QgcmVjdCA9IHdpbmRvd1JlY3Q7DQogICAgICAgICA6OkludmFsaWRhdGVSZWN0KG1fdmll
d1dpbmRvdywgJnJlY3QsIGZhbHNlKTsNCkBAIC03OTIsNyArODAyLDYgQEAgdm9pZCBXZWJWaWV3
OjpzY3JvbGxCYWNraW5nU3RvcmUoRnJhbWVWaQ0KICAgICAvLyBDbGVhbiB1cC4NCiAgICAgOjpE
ZWxldGVEQyhiaXRtYXBEQyk7DQogICAgIDo6UmVsZWFzZURDKG1fdmlld1dpbmRvdywgd2luZG93
REMpOw0KLQ0KIH0NCiANCiAvLyBUaGlzIGVtdWxhdGVzIHRoZSBNYWMgc21hcnRzIGZvciBwYWlu
dGluZyByZWN0cyBpbnRlbGxpZ2VudGx5LiAgVGhpcyBpcyB2ZXJ5DQpAQCAtOTI1LDE4ICs5MzQs
NDggQEAgdm9pZCBXZWJWaWV3OjpwYWludChIREMgZGMsIExQQVJBTSBvcHRpbw0KICAgICAvLyBV
cGRhdGUgb3VyIGJhY2tpbmcgc3RvcmUgaWYgbmVlZGVkLg0KICAgICB1cGRhdGVCYWNraW5nU3Rv
cmUoZnJhbWVWaWV3LCBiaXRtYXBEQywgYmFja2luZ1N0b3JlQ29tcGxldGVseURpcnR5LCB3aW5k
b3dzVG9QYWludCk7DQogDQotICAgIC8vIE5vdyB3ZSBibGl0IHRoZSB1cGRhdGVkIGJhY2tpbmcg
c3RvcmUNCi0gICAgSW50UmVjdCB3aW5kb3dEaXJ0eVJlY3QgPSByY1BhaW50Ow0KLSAgICANCi0g
ICAgLy8gQXBwbHkgdGhlIHNhbWUgaGV1cmlzdGljIGZvciB0aGlzIHVwZGF0ZSByZWdpb24gdG9v
Lg0KLSAgICBWZWN0b3I8SW50UmVjdD4gYmxpdFJlY3RzOw0KLSAgICBpZiAocmVnaW9uICYmIHJl
Z2lvblR5cGUgPT0gQ09NUExFWFJFR0lPTikNCi0gICAgICAgIGdldFVwZGF0ZVJlY3RzKHJlZ2lv
bi5nZXQoKSwgd2luZG93RGlydHlSZWN0LCBibGl0UmVjdHMpOw0KLSAgICBlbHNlDQotICAgICAg
ICBibGl0UmVjdHMuYXBwZW5kKHdpbmRvd0RpcnR5UmVjdCk7DQorI2lmIFVTRShBQ0NFTEVSQVRF
RF9DT01QT1NJVElORykNCisgICAgaWYgKCFpc0FjY2VsZXJhdGVkQ29tcG9zaXRpbmcoKSkgew0K
KyNlbmRpZg0KKyAgICAgICAgLy8gTm93IHdlIGJsaXQgdGhlIHVwZGF0ZWQgYmFja2luZyBzdG9y
ZQ0KKyAgICAgICAgSW50UmVjdCB3aW5kb3dEaXJ0eVJlY3QgPSByY1BhaW50Ow0KKyAgICAgICAg
DQorICAgICAgICAvLyBBcHBseSB0aGUgc2FtZSBoZXVyaXN0aWMgZm9yIHRoaXMgdXBkYXRlIHJl
Z2lvbiB0b28uDQorICAgICAgICBWZWN0b3I8SW50UmVjdD4gYmxpdFJlY3RzOw0KKyAgICAgICAg
aWYgKHJlZ2lvbiAmJiByZWdpb25UeXBlID09IENPTVBMRVhSRUdJT04pDQorICAgICAgICAgICAg
Z2V0VXBkYXRlUmVjdHMocmVnaW9uLmdldCgpLCB3aW5kb3dEaXJ0eVJlY3QsIGJsaXRSZWN0cyk7
DQorICAgICAgICBlbHNlDQorICAgICAgICAgICAgYmxpdFJlY3RzLmFwcGVuZCh3aW5kb3dEaXJ0
eVJlY3QpOw0KIA0KLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgYmxpdFJlY3RzLnNpemUo
KTsgKytpKQ0KLSAgICAgICAgcGFpbnRJbnRvV2luZG93KGJpdG1hcERDLCBoZGMsIGJsaXRSZWN0
c1tpXSk7DQorICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgYmxpdFJlY3RzLnNpemUo
KTsgKytpKQ0KKyAgICAgICAgICAgIHBhaW50SW50b1dpbmRvdyhiaXRtYXBEQywgaGRjLCBibGl0
UmVjdHNbaV0pOw0KKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpDQorICAgIH0gZWxz
ZSB7DQorICAgICAgICAvLyBHZXQgdGhlIGJhY2tpbmcgc3RvcmUgaW50byBhIENHSW1hZ2UNCisg
ICAgICAgIEJJVE1BUCBiaXRtYXA7DQorICAgICAgICBHZXRPYmplY3QobV9iYWNraW5nU3RvcmVC
aXRtYXAuZ2V0KCksIHNpemVvZihiaXRtYXApLCAmYml0bWFwKTsNCisgICAgICAgIGludCBibVNp
emUgPSBiaXRtYXAuYm1XaWR0aEJ5dGVzICogYml0bWFwLmJtSGVpZ2h0Ow0KKyAgICAgICAgUmV0
YWluUHRyPENGRGF0YVJlZj4gZGF0YShBZG9wdENGLCANCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBDRkRhdGFDcmVhdGVXaXRoQnl0ZXNOb0NvcHkoDQorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBzdGF0aWNfY2FzdDxVSW50OCo+KGJp
dG1hcC5ibUJpdHMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgYm1TaXplLCBrQ0ZBbGxvY2F0b3JOdWxsKSk7DQorICAgICAgICBDR0RhdGFQcm92aWRlclJl
ZiBjZ0RhdGEgPSBDR0RhdGFQcm92aWRlckNyZWF0ZVdpdGhDRkRhdGEoZGF0YS5nZXQoKSk7DQor
ICAgICAgICBDR0NvbG9yU3BhY2VSZWYgc3BhY2UgPSBDR0NvbG9yU3BhY2VDcmVhdGVEZXZpY2VS
R0IoKTsNCisgICAgICAgIG1fYmFja2luZ1N0b3JlSW1hZ2UuYWRvcHRDRihDR0ltYWdlQ3JlYXRl
KGJpdG1hcC5ibVdpZHRoLCBiaXRtYXAuYm1IZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICA4LCBiaXRtYXAuYm1CaXRzUGl4ZWwsIA0KKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0bWFwLmJtV2lkdGhCeXRlcywgc3BhY2Us
IA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0NHQml0bWFwQnl0
ZU9yZGVyMzJMaXR0bGUgfCBrQ0dJbWFnZUFscGhhTm9uZVNraXBGaXJzdCwNCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNnRGF0YSwgMCwgZmFsc2UsIA0KKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0NHUmVuZGVyaW5nSW50ZW50RGVm
YXVsdCkpOw0KKw0KKyAgICAgICAgLy8gSGFuZCB0aGUgQ0dJbWFnZSB0byBDQUNGIGZvciBjb21w
b3NpdGluZw0KKyAgICAgICAgbV9sYXllcldpbmRvdy5zZXRSb290Q29udGVudHMobV9iYWNraW5n
U3RvcmVJbWFnZS5nZXQoKSk7DQorICAgICAgICBtX2xheWVyV2luZG93LnNldFNjcm9sbEZyYW1l
KGZyYW1lVmlldy0+bGF5b3V0V2lkdGgoKSwgZnJhbWVWaWV3LT5sYXlvdXRIZWlnaHQoKSwgDQor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lVmlldy0+c2Nyb2xsWCgp
LCBmcmFtZVZpZXctPnNjcm9sbFkoKSk7DQorICAgICAgICBDR0NvbG9yU3BhY2VSZWxlYXNlKHNw
YWNlKTsNCisgICAgICAgIENHRGF0YVByb3ZpZGVyUmVsZWFzZShjZ0RhdGEpOw0KKyAgICB9DQor
I2VuZGlmDQogDQogICAgIDo6RGVsZXRlREMoYml0bWFwREMpOw0KIA0KQEAgLTE5MzksMTYgKzE5
NzgsMjUgQEAgc3RhdGljIExSRVNVTFQgQ0FMTEJBQ0sgV2ViVmlld1duZFByb2MoSA0KIA0KICAg
ICAgICAgICAgIGlmIChsUGFyYW0gIT0gMCkgew0KICAgICAgICAgICAgICAgICB3ZWJWaWV3LT5k
ZWxldGVCYWNraW5nU3RvcmUoKTsNCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQ0K
KyAgICAgICAgICAgICAgICBpZiAod2ViVmlldy0+aXNBY2NlbGVyYXRlZENvbXBvc2l0aW5nKCkp
DQorICAgICAgICAgICAgICAgICAgICB3ZWJWaWV3LT5yZXNpemVMYXllcldpbmRvdygpOw0KKyNl
bmRpZg0KICAgICAgICAgICAgICAgICBpZiAoRnJhbWUqIGNvcmVGcmFtZSA9IGNvcmUobWFpbkZy
YW1lSW1wbCkpDQogICAgICAgICAgICAgICAgICAgICBjb3JlRnJhbWUtPnZpZXcoKS0+cmVzaXpl
KExPV09SRChsUGFyYW0pLCBISVdPUkQobFBhcmFtKSk7DQogICAgICAgICAgICAgfQ0KICAgICAg
ICAgICAgIGJyZWFrOw0KICAgICAgICAgY2FzZSBXTV9TSE9XV0lORE9XOg0KICAgICAgICAgICAg
IGxSZXN1bHQgPSBEZWZXaW5kb3dQcm9jKGhXbmQsIG1lc3NhZ2UsIHdQYXJhbSwgbFBhcmFtKTsN
Ci0gICAgICAgICAgICBpZiAod1BhcmFtID09IDApDQorICAgICAgICAgICAgaWYgKHdQYXJhbSA9
PSAwKSB7DQogICAgICAgICAgICAgICAgIC8vIFRoZSB3aW5kb3cgaXMgYmVpbmcgaGlkZGVuIChl
LmcuLCBiZWNhdXNlIHdlIHN3aXRjaGVkIHRhYnMpLg0KICAgICAgICAgICAgICAgICAvLyBOdWxs
IG91dCBvdXIgYmFja2luZyBzdG9yZS4NCiAgICAgICAgICAgICAgICAgd2ViVmlldy0+ZGVsZXRl
QmFja2luZ1N0b3JlKCk7DQorICAgICAgICAgICAgfQ0KKyNpZiBVU0UoQUNDRUxFUkFURURfQ09N
UE9TSVRJTkcpDQorICAgICAgICAgICAgZWxzZSBpZiAod2ViVmlldy0+aXNBY2NlbGVyYXRlZENv
bXBvc2l0aW5nKCkpDQorICAgICAgICAgICAgICAgIHdlYlZpZXctPnNob3dMYXllcldpbmRvdygp
Ow0KKyNlbmRpZg0KICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgY2FzZSBXTV9TRVRGT0NV
Uzogew0KICAgICAgICAgICAgIENPTVB0cjxJV2ViVUlEZWxlZ2F0ZT4gdWlEZWxlZ2F0ZTsNCkBA
IC0yMDM0LDcgKzIwODIsMTEgQEAgc3RhdGljIExSRVNVTFQgQ0FMTEJBQ0sgV2ViVmlld1duZFBy
b2MoSA0KICAgICAgICAgICAgICAgICBSRUNUIHdpbmRvd1JlY3Q7DQogICAgICAgICAgICAgICAg
IDo6R2V0Q2xpZW50UmVjdChoV25kLCAmd2luZG93UmVjdCk7DQogICAgICAgICAgICAgICAgIDo6
SW52YWxpZGF0ZVJlY3QoaFduZCwgJndpbmRvd1JlY3QsIGZhbHNlKTsNCi0gICAgICAgICAgICB9
DQorI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykNCisgICAgICAgICAgICAgICAgaWYg
KHdlYlZpZXctPmlzQWNjZWxlcmF0ZWRDb21wb3NpdGluZygpKQ0KKwkJCQkgICAgd2ViVmlldy0+
c2V0Um9vdExheWVyTmVlZHNEaXNwbGF5KCk7DQorI2VuZGlmDQorICAgICAgICAgICB9DQogICAg
ICAgICAgICAgYnJlYWs7DQogICAgICAgICBjYXNlIFdNX01PVVNFQUNUSVZBVEU6DQogICAgICAg
ICAgICAgd2ViVmlldy0+c2V0TW91c2VBY3RpdmF0ZWQodHJ1ZSk7DQpAQCAtNTU2OSw2ICs1NjIx
LDI5IEBAIHZvaWQgV2ViVmlldzo6ZG93bmxvYWRVUkwoY29uc3QgS1VSTCYgdXINCiAgICAgZG93
bmxvYWQtPnN0YXJ0KCk7DQogfQ0KIA0KKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcp
DQordm9pZCBXZWJWaWV3OjpzZXRSb290Q2hpbGRMYXllcihXZWJDb3JlOjpQbGF0Zm9ybUxheWVy
KiBsYXllcikNCit7DQorICAgIHNldEFjY2VsZXJhdGVkQ29tcG9zaXRpbmcobGF5ZXIgPyB0cnVl
IDogZmFsc2UpOw0KKyAgICBtX2xheWVyV2luZG93LnNldFJvb3RDaGlsZExheWVyKGxheWVyKTsN
Cit9DQorDQordm9pZCBXZWJWaWV3OjpzZXRBY2NlbGVyYXRlZENvbXBvc2l0aW5nKGJvb2wgYWNj
ZWxlcmF0ZWQpDQorew0KKyAgICBpZiAobV9pc0FjY2VsZXJhdGVkQ29tcG9zaXRpbmcgPT0gYWNj
ZWxlcmF0ZWQpDQorICAgICAgICByZXR1cm47DQorDQorICAgIG1faXNBY2NlbGVyYXRlZENvbXBv
c2l0aW5nID0gYWNjZWxlcmF0ZWQ7DQorICAgIGlmIChtX2lzQWNjZWxlcmF0ZWRDb21wb3NpdGlu
Zykgew0KKwkgICAgLy8gQ3JlYXRlIHRoZSByb290IGxheWVyDQorICAgICAgICBBU1NFUlQobV92
aWV3V2luZG93KTsNCisJICAgIG1fbGF5ZXJXaW5kb3cuc2V0SG9zdFdpbmRvdyhtX3ZpZXdXaW5k
b3cpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgLy8gVGVhciBkb3duIHRoZSByb290IGxheWVy
DQorICAgICAgICBtX2xheWVyV2luZG93LmRlc3Ryb3lSZW5kZXJlcigpOw0KKyAgICB9DQorfQ0K
KyNlbmRpZg0KIA0KIEhSRVNVTFQgU1RETUVUSE9EQ0FMTFRZUEUgV2ViVmlldzo6c2V0UGx1Z2lu
SGFsdGVyRGVsZWdhdGUoSVdlYlBsdWdpbkhhbHRlckRlbGVnYXRlKiBkKQ0KIHsNCkluZGV4OiBX
ZWJLaXQvd2luL1dlYlZpZXcuaA0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLS0tIFdlYktpdC93aW4vV2ViVmlldy5o
CShyZXZpc2lvbiA0OTQ4MSkNCisrKyBXZWJLaXQvd2luL1dlYlZpZXcuaAkod29ya2luZyBjb3B5
KQ0KQEAgLTM0LDYgKzM0LDggQEANCiAjaW5jbHVkZSA8V2ViQ29yZS9JbnRSZWN0Lmg+DQogI2lu
Y2x1ZGUgPFdlYkNvcmUvVGltZXIuaD4NCiAjaW5jbHVkZSA8V2ViQ29yZS9XaW5kb3dNZXNzYWdl
TGlzdGVuZXIuaD4NCisjaW5jbHVkZSA8V2ViQ29yZS9XS0NBQ0ZMYXllci5oPg0KKyNpbmNsdWRl
IDxXZWJDb3JlL1dLQ0FDRkxheWVyV2luZG93Lmg+DQogI2luY2x1ZGUgPHd0Zi9IYXNoU2V0Lmg+
DQogI2luY2x1ZGUgPHd0Zi9Pd25QdHIuaD4NCiANCkBAIC03MzcsNiArNzM5LDE4IEBAIHB1Ymxp
YzoNCiAgICAgdmlydHVhbCBIUkVTVUxUIFNURE1FVEhPRENBTExUWVBFIHNldEphdmFTY3JpcHRV
UkxzQXJlQWxsb3dlZCgNCiAgICAgICAgIC8qIFtpbl0gKi8gQk9PTCBhcmVBbGxvd2VkKTsNCiAN
CisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQ0KKyAgICB2b2lkIHNldFJvb3RMYXll
ck5lZWRzRGlzcGxheSgpDQorICAgIHsNCisgICAgICAgIC8vbV9sYXllcldpbmRvdy5zZXRSb290
Q29udGVudHMobV9iYWNraW5nU3RvcmVJbWFnZS5nZXQoKSk7DQorICAgICAgICBtX2xheWVyV2lu
ZG93LnNldE5lZWRzRGlzcGxheSgpOw0KKyAgICB9DQorICAgIHZvaWQgcmVzaXplTGF5ZXJXaW5k
b3coKSB7IG1fbGF5ZXJXaW5kb3cucmVzaXplKCk7IH0NCisgICAgdm9pZCBzaG93TGF5ZXJXaW5k
b3coKSB7IG1fbGF5ZXJXaW5kb3cuY3JlYXRlUmVuZGVyZXIoKTsgfQ0KKyAgICBib29sIGlzQWNj
ZWxlcmF0ZWRDb21wb3NpdGluZygpIGNvbnN0IHsgcmV0dXJuIG1faXNBY2NlbGVyYXRlZENvbXBv
c2l0aW5nOyB9DQorICAgIHZvaWQgc2V0Um9vdENoaWxkTGF5ZXIoV2ViQ29yZTo6UGxhdGZvcm1M
YXllciogbGF5ZXIpOw0KKyNlbmRpZg0KKw0KICAgICB2aXJ0dWFsIEhSRVNVTFQgU1RETUVUSE9E
Q0FMTFRZUEUgc2V0Q2FuU3RhcnRQbHVnaW5zKA0KICAgICAgICAgLyogW2luXSAqLyBCT09MIGNh
blN0YXJ0UGx1Z2lucyk7DQogDQpAQCAtOTUwLDYgKzk2NCwxMyBAQCBwcm90ZWN0ZWQ6DQogICAg
IGxvbmcgbV9sYXN0UGFuWTsNCiAgICAgbG9uZyBtX3hPdmVycGFuOw0KICAgICBsb25nIG1feU92
ZXJwYW47DQorDQorI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykNCisgICAgdm9pZCBz
ZXRBY2NlbGVyYXRlZENvbXBvc2l0aW5nKGJvb2wpOw0KKwlXZWJDb3JlOjpXS0NBQ0ZMYXllcldp
bmRvdyBtX2xheWVyV2luZG93Ow0KKyAgICBib29sIG1faXNBY2NlbGVyYXRlZENvbXBvc2l0aW5n
Ow0KKyAgICBSZXRhaW5QdHI8Q0dJbWFnZVJlZj4gbV9iYWNraW5nU3RvcmVJbWFnZTsNCisjZW5k
aWYNCiB9Ow0KIA0KICNlbmRpZg0KSW5kZXg6IFdlYktpdC93aW4vV2ViQ29yZVN1cHBvcnQvV2Vi
Q2hyb21lQ2xpZW50LmNwcA0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLS0tIFdlYktpdC93aW4vV2ViQ29yZVN1cHBv
cnQvV2ViQ2hyb21lQ2xpZW50LmNwcAkocmV2aXNpb24gNDk0ODEpDQorKysgV2ViS2l0L3dpbi9X
ZWJDb3JlU3VwcG9ydC9XZWJDaHJvbWVDbGllbnQuY3BwCSh3b3JraW5nIGNvcHkpDQpAQCAtNzQz
LDYgKzc0MywxOSBAQCB2b2lkIFdlYkNocm9tZUNsaWVudDo6cmVxdWVzdEdlb2xvY2F0aW9uDQog
ICAgIG5vdEltcGxlbWVudGVkKCk7DQogfQ0KIA0KKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9T
SVRJTkcpDQordm9pZCBXZWJDaHJvbWVDbGllbnQ6OmF0dGFjaFJvb3RHcmFwaGljc0xheWVyKEZy
YW1lKiBmcmFtZSwgR3JhcGhpY3NMYXllciogZ3JhcGhpY3NMYXllcikNCit7DQorCW1fd2ViVmll
dy0+c2V0Um9vdENoaWxkTGF5ZXIoZ3JhcGhpY3NMYXllciA/IGdyYXBoaWNzTGF5ZXItPnBsYXRm
b3JtTGF5ZXIoKSA6IDApOw0KK30NCisNCit2b2lkIFdlYkNocm9tZUNsaWVudDo6c2NoZWR1bGVD
b21wb3NpdGluZ0xheWVyU3luYygpDQorew0KKyAgICBtX3dlYlZpZXctPnNldFJvb3RMYXllck5l
ZWRzRGlzcGxheSgpOw0KK30NCisNCisjZW5kaWYNCisNCiBDT01QdHI8SVdlYlVJRGVsZWdhdGU+
IFdlYkNocm9tZUNsaWVudDo6dWlEZWxlZ2F0ZSgpDQogew0KICAgICBDT01QdHI8SVdlYlVJRGVs
ZWdhdGU+IGRlbGVnYXRlOw0KSW5kZXg6IFdlYktpdC93aW4vV2ViQ29yZVN1cHBvcnQvV2ViQ2hy
b21lQ2xpZW50LmgNCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0NCi0tLSBXZWJLaXQvd2luL1dlYkNvcmVTdXBwb3J0L1dl
YkNocm9tZUNsaWVudC5oCShyZXZpc2lvbiA0OTQ4MSkNCisrKyBXZWJLaXQvd2luL1dlYkNvcmVT
dXBwb3J0L1dlYkNocm9tZUNsaWVudC5oCSh3b3JraW5nIGNvcHkpDQpAQCAtMTMwLDYgKzEzMCwx
NyBAQCBwdWJsaWM6DQogDQogICAgIHZpcnR1YWwgUGFzc093blB0cjxXZWJDb3JlOjpIVE1MUGFy
c2VyUXVpcmtzPiBjcmVhdGVIVE1MUGFyc2VyUXVpcmtzKCkgeyByZXR1cm4gMDsgfQ0KIA0KKyNp
ZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpDQorICAgICAgICAvLyBQYXNzIDAgYXMgdGhl
IEdyYXBoaWNzTGF5ZXIgdG8gZGV0YXRjaCB0aGUgcm9vdCBsYXllci4NCisgICAgICAgIHZpcnR1
YWwgdm9pZCBhdHRhY2hSb290R3JhcGhpY3NMYXllcihXZWJDb3JlOjpGcmFtZSosIFdlYkNvcmU6
OkdyYXBoaWNzTGF5ZXIqKTsNCisgICAgICAgIC8vIFNldHMgYSBmbGFnIHRvIHNwZWNpZnkgdGhh
dCB0aGUgbmV4dCB0aW1lIGNvbnRlbnQgaXMgZHJhd24gdG8gdGhlIHdpbmRvdywNCisgICAgICAg
IC8vIHRoZSBjaGFuZ2VzIGFwcGVhciBvbiB0aGUgc2NyZWVuIGluIHN5bmNocm9ueSB3aXRoIHVw
ZGF0ZXMgdG8gR3JhcGhpY3NMYXllcnMuDQorICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0TmVlZHNP
bmVTaG90RHJhd2luZ1N5bmNocm9uaXphdGlvbigpIHsgfQ0KKyAgICAgICAgLy8gU2V0cyBhIGZs
YWcgdG8gc3BlY2lmeSB0aGF0IHRoZSB2aWV3IG5lZWRzIHRvIGJlIHVwZGF0ZWQsIHNvIHdlIG5l
ZWQNCisgICAgICAgIC8vIHRvIGRvIGFuIGVhZ2VyIGxheW91dCBiZWZvcmUgdGhlIGRyYXdpbmcu
DQorICAgICAgICB2aXJ0dWFsIHZvaWQgc2NoZWR1bGVDb21wb3NpdGluZ0xheWVyU3luYygpOw0K
KyNlbmRpZg0KKw0KICAgICB2aXJ0dWFsIHZvaWQgc2Nyb2xsUmVjdEludG9WaWV3KGNvbnN0IFdl
YkNvcmU6OkludFJlY3QmLCBjb25zdCBXZWJDb3JlOjpTY3JvbGxWaWV3KikgY29uc3Qge30NCiAN
CiAgICAgdmlydHVhbCB2b2lkIHJlcXVlc3RHZW9sb2NhdGlvblBlcm1pc3Npb25Gb3JGcmFtZShX
ZWJDb3JlOjpGcmFtZSosIFdlYkNvcmU6Okdlb2xvY2F0aW9uKik7DQo=
</data>
<flag name="review"
          id="22392"
          type_id="1"
          status="+"
          setter="simon.fraser"
    />
    <flag name="commit-queue"
          id="24798"
          type_id="3"
          status="-"
          setter="abarth"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>41073</attachid>
            <date>2009-10-12 17:52:01 -0700</date>
            <delta_ts>2009-11-23 17:38:12 -0800</delta_ts>
            <desc>Third patch (adding files to build - off by default)</desc>
            <filename>accel-build.patch.txt</filename>
            <type>text/plain</type>
            <size>17437</size>
            <attacher name="Chris Marrin">cmarrin</attacher>
            
              <data encoding="base64">SW5kZXg6IEphdmFTY3JpcHRDb3JlL0NoYW5nZUxvZw0KPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLS0tIEphdmFTY3Jp
cHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gNDk0ODQpDQorKysgSmF2YVNjcmlwdENvcmUvQ2hh
bmdlTG9nCSh3b3JraW5nIGNvcHkpDQpAQCAtMSwzICsxLDEyIEBADQorMjAwOS0xMC0xMiAgQ2hy
aXMgTWFycmluICA8Y21hcnJpbkBhcHBsZS5jb20+DQorDQorICAgICAgICBSZXZpZXdlZCBieSBO
T0JPRFkgKE9PUFMhKS4NCisNCisgICAgICAgIEFkZGluZyBpbiB0aGUgYnVpbGQgc3RlcHMgZm9y
IGFjY2VsZXJhdGVkIGNvbXBvc2l0aW5nIG9uIFdpbmRvd3MgLSBvZmYgYnkgZGVmYXVsdA0KKyAg
ICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI3MzE0DQorDQor
ICAgICAgICAqIEphdmFTY3JpcHRDb3JlLnZjcHJvai9XVEYvV1RGLnZjcHJvajoNCisgICAgICAg
ICogd3RmL1BsYXRmb3JtLmg6DQorDQogMjAwOS0xMC0xMSAgT2xpdmVyIEh1bnQgIDxvbGl2ZXJA
YXBwbGUuY29tPg0KIA0KICAgICAgICAgUmUtZW5hYmxlIHRoZSBKSVQuDQpJbmRleDogSmF2YVNj
cmlwdENvcmUvSmF2YVNjcmlwdENvcmUudmNwcm9qL1dURi9XVEYudmNwcm9qDQo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
DQotLS0gSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUudmNwcm9qL1dURi9XVEYudmNwcm9q
CShyZXZpc2lvbiA0OTQ4MSkNCisrKyBKYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS52Y3By
b2ovV1RGL1dURi52Y3Byb2oJKHdvcmtpbmcgY29weSkNCkBAIC0xLDQgKzEsNCBAQA0KLTw/eG1s
IHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IndpbmRvd3MtMTI1MSI/Pg0KKzw/eG1sIHZlcnNpb249
IjEuMCIgZW5jb2Rpbmc9IldpbmRvd3MtMTI1MiI/Pg0KIDxWaXN1YWxTdHVkaW9Qcm9qZWN0DQog
CVByb2plY3RUeXBlPSJWaXN1YWwgQysrIg0KIAlWZXJzaW9uPSI4LjAwIg0KSW5kZXg6IEphdmFT
Y3JpcHRDb3JlL3d0Zi9QbGF0Zm9ybS5oDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotLS0gSmF2YVNjcmlwdENvcmUv
d3RmL1BsYXRmb3JtLmgJKHJldmlzaW9uIDQ5NDgxKQ0KKysrIEphdmFTY3JpcHRDb3JlL3d0Zi9Q
bGF0Zm9ybS5oCSh3b3JraW5nIGNvcHkpDQpAQCAtODUzLDYgKzg1MywxMCBAQCBvbiBNaW5HVy4g
U2VlIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3NoDQogI2RlZmluZSBXVEZfVVNFX0FDQ0VMRVJB
VEVEX0NPTVBPU0lUSU5HIDENCiAjZW5kaWYNCiANCisjaWYgUExBVEZPUk0oV0lOKQ0KKyNkZWZp
bmUgV1RGX1VTRV9BQ0NFTEVSQVRFRF9DT01QT1NJVElORyAxDQorI2VuZGlmDQorDQogI2lmIENP
TVBJTEVSKEdDQykNCiAjZGVmaW5lIFdBUk5fVU5VU0VEX1JFVFVSTiBfX2F0dHJpYnV0ZV9fICgo
d2Fybl91bnVzZWRfcmVzdWx0KSkNCiAjZWxzZQ0KSW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nDQo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09DQotLS0gV2ViQ29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDQ5NDg0KQ0KKysrIFdl
YkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpDQpAQCAtMSwzICsxLDIxNCBAQA0KKzIwMDkt
MTAtMTIgIENocmlzIE1hcnJpbiAgPGNtYXJyaW5AYXBwbGUuY29tPg0KKw0KKyAgICAgICAgUmV2
aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuDQorDQorICAgICAgICBBZGRpbmcgaW4gdGhlIGJ1aWxk
IHN0ZXBzIGZvciBhY2NlbGVyYXRlZCBjb21wb3NpdGluZyBvbiBXaW5kb3dzIC0gb2ZmIGJ5IGRl
ZmF1bHQNCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0y
NzMxNA0KKw0KKyAgICAgICAgKiBXZWJDb3JlLnZjcHJvai9XZWJDb3JlLnZjcHJvajoNCisgICAg
ICAgICogV2ViQ29yZS52Y3Byb2ovV2ViQ29yZUNvbW1vbi52c3Byb3BzOg0KKw0KIDIwMDktMTAt
MTIgIERhbiBCZXJuc3RlaW4gIDxtaXR6QGFwcGxlLmNvbT4NCiANCiAgICAgICAgIFJldmlld2Vk
IGJ5IFNpbW9uIEZyYXNlci4NCkluZGV4OiBXZWJDb3JlL1dlYkNvcmUudmNwcm9qL1dlYkNvcmUu
dmNwcm9qDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09DQotLS0gV2ViQ29yZS9XZWJDb3JlLnZjcHJvai9XZWJDb3JlLnZj
cHJvagkocmV2aXNpb24gNDk0ODEpDQorKysgV2ViQ29yZS9XZWJDb3JlLnZjcHJvai9XZWJDb3Jl
LnZjcHJvagkod29ya2luZyBjb3B5KQ0KQEAgLTM5LDYgKzM5LDcgQEANCiAJCQk8VG9vbA0KIAkJ
CQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KIAkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9y
aWVzPSIiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJRVUFSVFpDT1JFX0RMTCINCiAJ
CQkJRm9yY2VkSW5jbHVkZUZpbGVzPSIiDQogCQkJLz4NCiAJCQk8VG9vbA0KQEAgLTE1MCw2ICsx
NTEsNyBAQA0KIAkJCTxUb29sDQogCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQogCQkJCUFk
ZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlv
bnM9IlFVQVJUWkNPUkVfRExMIg0KIAkJCQlGb3JjZWRJbmNsdWRlRmlsZXM9IiINCiAJCQkvPg0K
IAkJCTxUb29sDQpAQCAtMTg2NTMsNiArMTg2NTUsMTggQEANCiAJCQkJCT4NCiAJCQkJPC9GaWxl
Pg0KIAkJCQk8RmlsZQ0KKwkJCQkJUmVsYXRpdmVQYXRoPSIuLlxwbGF0Zm9ybVxncmFwaGljc1xH
cmFwaGljc0xheWVyLmNwcCINCisJCQkJCT4NCisJCQkJPC9GaWxlPg0KKwkJCQk8RmlsZQ0KKwkJ
CQkJUmVsYXRpdmVQYXRoPSIuLlxwbGF0Zm9ybVxncmFwaGljc1xHcmFwaGljc0xheWVyLmgiDQor
CQkJCQk+DQorCQkJCTwvRmlsZT4NCisJCQkJPEZpbGUNCisJCQkJCVJlbGF0aXZlUGF0aD0iLi5c
cGxhdGZvcm1cZ3JhcGhpY3NcR3JhcGhpY3NMYXllckNsaWVudC5oIg0KKwkJCQkJPg0KKwkJCQk8
L0ZpbGU+DQorCQkJCTxGaWxlDQogCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHBsYXRmb3JtXGdyYXBo
aWNzXEdyYXBoaWNzVHlwZXMuY3BwIg0KIAkJCQkJPg0KIAkJCQk8L0ZpbGU+DQpAQCAtMTkxMDAs
NiArMTkxMTQsMTQgQEANCiAJCQkJCQk+DQogCQkJCQk8L0ZpbGU+DQogCQkJCQk8RmlsZQ0KKwkJ
CQkJCVJlbGF0aXZlUGF0aD0iLi5ccGxhdGZvcm1cZ3JhcGhpY3Ncd2luXEdyYXBoaWNzTGF5ZXJD
QUNGLmNwcCINCisJCQkJCQk+DQorCQkJCQk8L0ZpbGU+DQorCQkJCQk8RmlsZQ0KKwkJCQkJCVJl
bGF0aXZlUGF0aD0iLi5ccGxhdGZvcm1cZ3JhcGhpY3Ncd2luXEdyYXBoaWNzTGF5ZXJDQUNGLmgi
DQorCQkJCQkJPg0KKwkJCQkJPC9GaWxlPg0KKwkJCQkJPEZpbGUNCiAJCQkJCQlSZWxhdGl2ZVBh
dGg9Ii4uXHBsYXRmb3JtXGdyYXBoaWNzXHdpblxJY29uV2luLmNwcCINCiAJCQkJCQk+DQogCQkJ
CQk8L0ZpbGU+DQpAQCAtMTkyNzksNiArMTkzMDEsMzQgQEANCiAJCQkJCQlSZWxhdGl2ZVBhdGg9
Ii4uXHBsYXRmb3JtXGdyYXBoaWNzXHdpblxVbmlzY3JpYmVDb250cm9sbGVyLmgiDQogCQkJCQkJ
Pg0KIAkJCQkJPC9GaWxlPg0KKwkJCQkJPEZpbGUNCisJCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHBs
YXRmb3JtXGdyYXBoaWNzXHdpblxXS0NBQ0ZDb250ZXh0Rmx1c2hlci5jcHAiDQorCQkJCQkJPg0K
KwkJCQkJPC9GaWxlPg0KKwkJCQkJPEZpbGUNCisJCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHBsYXRm
b3JtXGdyYXBoaWNzXHdpblxXS0NBQ0ZDb250ZXh0Rmx1c2hlci5oIg0KKwkJCQkJCT4NCisJCQkJ
CTwvRmlsZT4NCisJCQkJCTxGaWxlDQorCQkJCQkJUmVsYXRpdmVQYXRoPSIuLlxwbGF0Zm9ybVxn
cmFwaGljc1x3aW5cV0tDQUNGQ29udGV4dEZsdXNoZXJXaW4uY3BwIg0KKwkJCQkJCT4NCisJCQkJ
CTwvRmlsZT4NCisJCQkJCTxGaWxlDQorCQkJCQkJUmVsYXRpdmVQYXRoPSIuLlxwbGF0Zm9ybVxn
cmFwaGljc1x3aW5cV0tDQUNGTGF5ZXIuY3BwIg0KKwkJCQkJCT4NCisJCQkJCTwvRmlsZT4NCisJ
CQkJCTxGaWxlDQorCQkJCQkJUmVsYXRpdmVQYXRoPSIuLlxwbGF0Zm9ybVxncmFwaGljc1x3aW5c
V0tDQUNGTGF5ZXIuaCINCisJCQkJCQk+DQorCQkJCQk8L0ZpbGU+DQorCQkJCQk8RmlsZQ0KKwkJ
CQkJCVJlbGF0aXZlUGF0aD0iLi5ccGxhdGZvcm1cZ3JhcGhpY3Ncd2luXFdLQ0FDRkxheWVyV2lu
ZG93LmNwcCINCisJCQkJCQk+DQorCQkJCQk8L0ZpbGU+DQorCQkJCQk8RmlsZQ0KKwkJCQkJCVJl
bGF0aXZlUGF0aD0iLi5ccGxhdGZvcm1cZ3JhcGhpY3Ncd2luXFdLQ0FDRkxheWVyV2luZG93Lmgi
DQorCQkJCQkJPg0KKwkJCQkJPC9GaWxlPg0KIAkJCQk8L0ZpbHRlcj4NCiAJCQkJPEZpbHRlcg0K
IAkJCQkJTmFtZT0iY2ciDQpAQCAtMjI4NDAsNiArMjI4OTAsMjIgQEANCiAJCQkJPg0KIAkJCTwv
RmlsZT4NCiAJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHJlbmRlcmluZ1xSZW5kZXJM
YXllckJhY2tpbmcuY3BwIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJl
bGF0aXZlUGF0aD0iLi5ccmVuZGVyaW5nXFJlbmRlckxheWVyQmFja2luZy5oIg0KKwkJCQk+DQor
CQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5ccmVuZGVyaW5nXFJl
bmRlckxheWVyQ29tcG9zaXRvci5jcHAiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUN
CisJCQkJUmVsYXRpdmVQYXRoPSIuLlxyZW5kZXJpbmdcUmVuZGVyTGF5ZXJDb21wb3NpdG9yLmgi
DQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCiAJCQkJUmVsYXRpdmVQYXRoPSIuLlxy
ZW5kZXJpbmdcUmVuZGVyTGluZUJveExpc3QuY3BwIg0KIAkJCQk+DQogCQkJPC9GaWxlPg0KSW5k
ZXg6IFdlYkNvcmUvV2ViQ29yZS52Y3Byb2ovV2ViQ29yZUNvbW1vbi52c3Byb3BzDQo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09DQotLS0gV2ViQ29yZS9XZWJDb3JlLnZjcHJvai9XZWJDb3JlQ29tbW9uLnZzcHJvcHMJKHJl
dmlzaW9uIDQ5NDgxKQ0KKysrIFdlYkNvcmUvV2ViQ29yZS52Y3Byb2ovV2ViQ29yZUNvbW1vbi52
c3Byb3BzCSh3b3JraW5nIGNvcHkpDQpAQCAtMSwyNCArMSwyNCBAQA0KLTw/eG1sIHZlcnNpb249
IjEuMCIgZW5jb2Rpbmc9IldpbmRvd3MtMTI1MiI/Pg0KLTxWaXN1YWxTdHVkaW9Qcm9wZXJ0eVNo
ZWV0DQotCVByb2plY3RUeXBlPSJWaXN1YWwgQysrIg0KLQlWZXJzaW9uPSI4LjAwIg0KLQlOYW1l
PSJXZWJDb3JlQ29tbW9uIg0KLQlPdXRwdXREaXJlY3Rvcnk9IiQoV2ViS2l0T3V0cHV0RGlyKVxs
aWIiDQotCT4NCi0JPFRvb2wNCi0JCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQlBZGRpdGlv
bmFsSW5jbHVkZURpcmVjdG9yaWVzPSImcXVvdDskKFByb2plY3REaXIpLi5cJnF1b3Q7OyZxdW90
OyQoUHJvamVjdERpcikuLiZxdW90OzsmcXVvdDskKFByb2plY3REaXIpLi5cYWNjZXNzaWJpbGl0
eSZxdW90OzsmcXVvdDskKFByb2plY3REaXIpLi5cYWNjZXNzaWJpbGl0eVx3aW4mcXVvdDs7JnF1
b3Q7JChQcm9qZWN0RGlyKS4uXGJyaWRnZSZxdW90OzsmcXVvdDskKFByb2plY3REaXIpLi5cYnJp
ZGdlXGMmcXVvdDs7JnF1b3Q7JChQcm9qZWN0RGlyKS4uXGNzcyZxdW90OzsmcXVvdDskKFByb2pl
Y3REaXIpLi5cZWRpdGluZyZxdW90OzsmcXVvdDskKFByb2plY3REaXIpLi5ccmVuZGVyaW5nJnF1
b3Q7OyZxdW90OyQoUHJvamVjdERpcikuLlxyZW5kZXJpbmdcc3R5bGUmcXVvdDs7JnF1b3Q7JChQ
cm9qZWN0RGlyKS4uXGJpbmRpbmdzXGpzJnF1b3Q7OyZxdW90OyQoUHJvamVjdERpcikuLlxkb20m
cXVvdDs7JnF1b3Q7JChQcm9qZWN0RGlyKS4uXGRvbVxkZWZhdWx0JnF1b3Q7OyZxdW90OyQoUHJv
amVjdERpcikuLlxoaXN0b3J5JnF1b3Q7OyZxdW90OyQoUHJvamVjdERpcikuLlxodG1sJnF1b3Q7
OyZxdW90OyQoUHJvamVjdERpcikuLlxodG1sXGNhbnZhcyZxdW90OzsmcXVvdDskKFByb2plY3RE
aXIpLi5caW5zcGVjdG9yJnF1b3Q7OyZxdW90OyQoUHJvamVjdERpcikuLlxsb2FkZXImcXVvdDs7
JnF1b3Q7JChQcm9qZWN0RGlyKS4uXGxvYWRlclxhcHBjYWNoZSZxdW90OzsmcXVvdDskKFByb2pl
Y3REaXIpLi5cbG9hZGVyXGFyY2hpdmUmcXVvdDs7JnF1b3Q7JChQcm9qZWN0RGlyKS4uXGxvYWRl
clxhcmNoaXZlXGNmJnF1b3Q7OyZxdW90OyQoUHJvamVjdERpcikuLlxsb2FkZXJcaWNvbiZxdW90
OzsmcXVvdDskKFByb2plY3REaXIpLi5cbm90aWZpY2F0aW9ucyZxdW90OzsmcXVvdDskKFByb2pl
Y3REaXIpLi5ccGFnZSZxdW90OzsmcXVvdDskKFByb2plY3REaXIpLi5ccGFnZVxhbmltYXRpb24m
cXVvdDs7JnF1b3Q7JChQcm9qZWN0RGlyKS4uXHBhZ2Vcd2luJnF1b3Q7OyZxdW90OyQoUHJvamVj
dERpcikuLlxwbGF0Zm9ybSZxdW90OzsmcXVvdDskKFByb2plY3REaXIpLi5ccGxhdGZvcm1cYW5p
bWF0aW9uJnF1b3Q7OyZxdW90OyQoUHJvamVjdERpcikuLlxwbGF0Zm9ybVxtb2NrJnF1b3Q7OyZx
dW90OyQoUHJvamVjdERpcikuLlxwbGF0Zm9ybVxzcWwmcXVvdDs7JnF1b3Q7JChQcm9qZWN0RGly
KS4uXHBsYXRmb3JtXHdpbiZxdW90OzsmcXVvdDskKFByb2plY3REaXIpLi5ccGxhdGZvcm1cbmV0
d29yayZxdW90OzsmcXVvdDskKFByb2plY3REaXIpLi5ccGxhdGZvcm1cbmV0d29ya1x3aW4mcXVv
dDs7JnF1b3Q7JChQcm9qZWN0RGlyKS4uXHBsYXRmb3JtXGNmJnF1b3Q7OyZxdW90OyQoUHJvamVj
dERpcikuLlxwbGF0Zm9ybVxncmFwaGljcyZxdW90OzsmcXVvdDskKFByb2plY3REaXIpLi5ccGxh
dGZvcm1cZ3JhcGhpY3Ncb3BlbnR5cGUmcXVvdDs7JnF1b3Q7JChQcm9qZWN0RGlyKS4uXHBsYXRm
b3JtXGdyYXBoaWNzXHRyYW5zZm9ybXMmcXVvdDs7JnF1b3Q7JChQcm9qZWN0RGlyKS4uXHBsYXRm
b3JtXHRleHQmcXVvdDs7JnF1b3Q7JChQcm9qZWN0RGlyKS4uXHBsYXRmb3JtXGdyYXBoaWNzXHdp
biZxdW90OzsmcXVvdDskKFByb2plY3REaXIpLi5ceG1sJnF1b3Q7OyZxdW90OyQoV2ViS2l0T3V0
cHV0RGlyKVxvYmpcV2ViQ29yZVxEZXJpdmVkU291cmNlcyZxdW90OzsmcXVvdDskKFByb2plY3RE
aXIpLi5ccGx1Z2lucyZxdW90OzsmcXVvdDskKFByb2plY3REaXIpLi5ccGx1Z2luc1x3aW4mcXVv
dDs7JnF1b3Q7JChQcm9qZWN0RGlyKS4uXHN2Z1xncmFwaGljcyZxdW90OzsmcXVvdDskKFByb2pl
Y3REaXIpLi5cc3ZnXGdyYXBoaWNzXGZpbHRlcnMmcXVvdDs7JnF1b3Q7JChQcm9qZWN0RGlyKS4u
XHN2ZyZxdW90OzsmcXVvdDskKFByb2plY3REaXIpLi5cd21sJnF1b3Q7OyZxdW90OyQoUHJvamVj
dERpcikuLlxzdG9yYWdlJnF1b3Q7OyZxdW90OyQoUHJvamVjdERpcikuLlx3ZWJzb2NrZXRzJnF1
b3Q7OyZxdW90OyQoUHJvamVjdERpcikuLlx3b3JrZXJzJnF1b3Q7OyZxdW90OyQoV2ViS2l0T3V0
cHV0RGlyKVxpbmNsdWRlJnF1b3Q7OyZxdW90OyQoV2ViS2l0T3V0cHV0RGlyKVxpbmNsdWRlXHBy
aXZhdGUmcXVvdDs7JnF1b3Q7JChXZWJLaXRPdXRwdXREaXIpXGluY2x1ZGVcSmF2YVNjcmlwdENv
cmUmcXVvdDs7JnF1b3Q7JChXZWJLaXRPdXRwdXREaXIpXGluY2x1ZGVccHJpdmF0ZVxKYXZhU2Ny
aXB0Q29yZSZxdW90OzsmcXVvdDskKFByb2plY3REaXIpLi5cRm9yd2FyZGluZ0hlYWRlcnMmcXVv
dDs7JnF1b3Q7JChXZWJLaXRMaWJyYXJpZXNEaXIpXGluY2x1ZGUmcXVvdDs7JnF1b3Q7JChXZWJL
aXRMaWJyYXJpZXNEaXIpXGluY2x1ZGVccHJpdmF0ZSZxdW90OzsmcXVvdDskKFdlYktpdExpYnJh
cmllc0RpcilcaW5jbHVkZVxwcml2YXRlXEphdmFTY3JpcHRDb3JlJnF1b3Q7OyZxdW90OyQoV2Vi
S2l0TGlicmFyaWVzRGlyKVxpbmNsdWRlXGljdSZxdW90OzsmcXVvdDskKFdlYktpdExpYnJhcmll
c0RpcilcaW5jbHVkZVxpY29udiZxdW90OzsmcXVvdDskKFdlYktpdExpYnJhcmllc0RpcilcaW5j
bHVkZVxwdGhyZWFkcyZxdW90OzsmcXVvdDskKFdlYktpdExpYnJhcmllc0RpcilcaW5jbHVkZVxz
cWxpdGUmcXVvdDs7JnF1b3Q7JChXZWJLaXRMaWJyYXJpZXNEaXIpXGluY2x1ZGVcSmF2YVNjcmlw
dENvcmUmcXVvdDs7JnF1b3Q7JChXZWJLaXRMaWJyYXJpZXNEaXIpXEluY2x1ZGVcQ29yZUZvdW5k
YXRpb25cT1NYQ29tcGF0aWJpbGl0eUhlYWRlcnMmcXVvdDs7JnF1b3Q7JChXZWJLaXRMaWJyYXJp
ZXNEaXIpXEluY2x1ZGVcQ29yZUZvdW5kYXRpb25cT1NYQ29tcGF0aWJpbGl0eUhlYWRlcnNcR05V
Q29tcGF0aWJpbGl0eSZxdW90OzsmcXVvdDskKFByb2plY3REaXIpLi5cc3ZnXGFuaW1hdGlvbiZx
dW90OyINCi0JCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfX1dJTjMyX187V0VCQ09SRV9DT05U
RVhUX01FTlVTO0VOQUJMRV9DSEFOTkVMX01FU1NBR0lORztFTkFCTEVfREFUQUJBU0U7RU5BQkxF
X0RBVEFHUklEO0VOQUJMRV9EQVRBTElTVDtFTkFCTEVfRE9NX1NUT1JBR0U7RU5BQkxFX0VWRU5U
U09VUkNFO0VOQUJMRV9JQ09OREFUQUJBU0U7RU5BQkxFX09GRkxJTkVfV0VCX0FQUExJQ0FUSU9O
UztFTkFCTEVfUlVCWTtFTkFCTEVfU0hBUkVEX1dPUktFUlM7RU5BQkxFX1NWRztFTkFCTEVfU1ZH
X0FOSU1BVElPTjtFTkFCTEVfU1ZHX0FTX0lNQUdFO0VOQUJMRV9TVkdfRk9OVFM7RU5BQkxFX1NW
R19GT1JFSUdOX09CSkVDVDtFTkFCTEVfU1ZHX1VTRTtFTkFCTEVfV0VCX1NPQ0tFVFM7RU5BQkxF
X1dPUktFUlM7RU5BQkxFX1hQQVRIO0VOQUJMRV9YU0xUIg0KLQkJVXNlUHJlY29tcGlsZWRIZWFk
ZXI9IjIiDQotCQlQcmVjb21waWxlZEhlYWRlclRocm91Z2g9IldlYkNvcmVQcmVmaXguaCINCi0J
CUZvcmNlZEluY2x1ZGVGaWxlcz0iV2ViQ29yZVByZWZpeC5oIg0KLQkvPg0KLQk8VG9vbA0KLQkJ
TmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQotCQlDb21tYW5kTGluZT0iIg0KLQkvPg0KLQk8
VG9vbA0KLQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCi0JCUNvbW1hbmRMaW5lPSIlU3lz
dGVtRHJpdmUlXGN5Z3dpblxiaW5cd2hpY2guZXhlIGJhc2gmI3gwRDsmI3gwQTtpZiBlcnJvcmxl
dmVsIDEgc2V0IFBBVEg9JVN5c3RlbURyaXZlJVxjeWd3aW5cYmluOyVQQVRIJSYjeDBEOyYjeDBB
O2NtZCAvYyYjeDBEOyYjeDBBO2lmIGV4aXN0ICZxdW90OyQoV2ViS2l0T3V0cHV0RGlyKVxidWls
ZGZhaWxlZCZxdW90OyBncmVwIFhYJChQcm9qZWN0TmFtZSlYWCAmcXVvdDskKFdlYktpdE91dHB1
dERpcilcYnVpbGRmYWlsZWQmcXVvdDsmI3gwRDsmI3gwQTtpZiBlcnJvcmxldmVsIDEgZXhpdCAx
JiN4MEQ7JiN4MEE7ZWNobyBYWCQoUHJvamVjdE5hbWUpWFggJmd0OyAmcXVvdDskKFdlYktpdE91
dHB1dERpcilcYnVpbGRmYWlsZWQmcXVvdDsmI3gwRDsmI3gwQTsmI3gwRDsmI3gwQTt0b3VjaCAm
cXVvdDskKFdlYktpdE91dHB1dERpcilcdG1wLmNwcCZxdW90OyYjeDBEOyYjeDBBO2NsIC9hbmFs
eXplIC9ub2xvZ28gL2MgJnF1b3Q7JChXZWJLaXRPdXRwdXREaXIpXHRtcC5jcHAmcXVvdDsgL0Zv
JnF1b3Q7JChJbnREaXIpXHRtcC5vYmomcXVvdDsgMiZndDsmYW1wOzEgfCBmaW5kc3RyIEQ5MDQw
JiN4MEQ7JiN4MEE7aWYgRVJST1JMRVZFTCAxIChzZXQgRW5hYmxlUFJFZmFzdD0mcXVvdDt0cnVl
JnF1b3Q7KSBlbHNlIChzZXQgRW5hYmxlUFJFZmFzdD0mcXVvdDtmYWxzZSZxdW90OykmI3gwRDsm
I3gwQTtpZiBFUlJPUkxFVkVMIDEgKHNldCBBbmFseXplV2l0aExhcmdlU3RhY2s9JnF1b3Q7L2Fu
YWx5emU6NjU1MzYmcXVvdDspIGVsc2UgKHNldCBBbmFseXplV2l0aExhcmdlU3RhY2s9JnF1b3Q7
JnF1b3Q7KSYjeDBEOyYjeDBBO2V4aXQgL2ImI3gwRDsmI3gwQTsiDQotCS8+DQotPC9WaXN1YWxT
dHVkaW9Qcm9wZXJ0eVNoZWV0Pg0KKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IldpbmRv
d3MtMTI1MiI/Pg0KKzxWaXN1YWxTdHVkaW9Qcm9wZXJ0eVNoZWV0DQorCVByb2plY3RUeXBlPSJW
aXN1YWwgQysrIg0KKwlWZXJzaW9uPSI4LjAwIg0KKwlOYW1lPSJXZWJDb3JlQ29tbW9uIg0KKwlP
dXRwdXREaXJlY3Rvcnk9IiQoV2ViS2l0T3V0cHV0RGlyKVxsaWIiDQorCT4NCisJPFRvb2wNCisJ
CU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVz
PSImcXVvdDskKFByb2plY3REaXIpLi5cJnF1b3Q7OyZxdW90OyQoUHJvamVjdERpcikuLiZxdW90
OzsmcXVvdDskKFByb2plY3REaXIpLi5cYWNjZXNzaWJpbGl0eSZxdW90OzsmcXVvdDskKFByb2pl
Y3REaXIpLi5cYWNjZXNzaWJpbGl0eVx3aW4mcXVvdDs7JnF1b3Q7JChQcm9qZWN0RGlyKS4uXGJy
aWRnZSZxdW90OzsmcXVvdDskKFByb2plY3REaXIpLi5cYnJpZGdlXGMmcXVvdDs7JnF1b3Q7JChQ
cm9qZWN0RGlyKS4uXGNzcyZxdW90OzsmcXVvdDskKFByb2plY3REaXIpLi5cZWRpdGluZyZxdW90
OzsmcXVvdDskKFByb2plY3REaXIpLi5ccmVuZGVyaW5nJnF1b3Q7OyZxdW90OyQoUHJvamVjdERp
cikuLlxyZW5kZXJpbmdcc3R5bGUmcXVvdDs7JnF1b3Q7JChQcm9qZWN0RGlyKS4uXGJpbmRpbmdz
XGpzJnF1b3Q7OyZxdW90OyQoUHJvamVjdERpcikuLlxkb20mcXVvdDs7JnF1b3Q7JChQcm9qZWN0
RGlyKS4uXGRvbVxkZWZhdWx0JnF1b3Q7OyZxdW90OyQoUHJvamVjdERpcikuLlxoaXN0b3J5JnF1
b3Q7OyZxdW90OyQoUHJvamVjdERpcikuLlxodG1sJnF1b3Q7OyZxdW90OyQoUHJvamVjdERpciku
LlxodG1sXGNhbnZhcyZxdW90OzsmcXVvdDskKFByb2plY3REaXIpLi5caW5zcGVjdG9yJnF1b3Q7
OyZxdW90OyQoUHJvamVjdERpcikuLlxsb2FkZXImcXVvdDs7JnF1b3Q7JChQcm9qZWN0RGlyKS4u
XGxvYWRlclxhcHBjYWNoZSZxdW90OzsmcXVvdDskKFByb2plY3REaXIpLi5cbG9hZGVyXGFyY2hp
dmUmcXVvdDs7JnF1b3Q7JChQcm9qZWN0RGlyKS4uXGxvYWRlclxhcmNoaXZlXGNmJnF1b3Q7OyZx
dW90OyQoUHJvamVjdERpcikuLlxsb2FkZXJcaWNvbiZxdW90OzsmcXVvdDskKFByb2plY3REaXIp
Li5cbm90aWZpY2F0aW9ucyZxdW90OzsmcXVvdDskKFByb2plY3REaXIpLi5ccGFnZSZxdW90Ozsm
cXVvdDskKFByb2plY3REaXIpLi5ccGFnZVxhbmltYXRpb24mcXVvdDs7JnF1b3Q7JChQcm9qZWN0
RGlyKS4uXHBhZ2Vcd2luJnF1b3Q7OyZxdW90OyQoUHJvamVjdERpcikuLlxwbGF0Zm9ybSZxdW90
OzsmcXVvdDskKFByb2plY3REaXIpLi5ccGxhdGZvcm1cYW5pbWF0aW9uJnF1b3Q7OyZxdW90OyQo
UHJvamVjdERpcikuLlxwbGF0Zm9ybVxtb2NrJnF1b3Q7OyZxdW90OyQoUHJvamVjdERpcikuLlxw
bGF0Zm9ybVxzcWwmcXVvdDs7JnF1b3Q7JChQcm9qZWN0RGlyKS4uXHBsYXRmb3JtXHdpbiZxdW90
OzsmcXVvdDskKFByb2plY3REaXIpLi5ccGxhdGZvcm1cbmV0d29yayZxdW90OzsmcXVvdDskKFBy
b2plY3REaXIpLi5ccGxhdGZvcm1cbmV0d29ya1x3aW4mcXVvdDs7JnF1b3Q7JChQcm9qZWN0RGly
KS4uXHBsYXRmb3JtXGNmJnF1b3Q7OyZxdW90OyQoUHJvamVjdERpcikuLlxwbGF0Zm9ybVxncmFw
aGljcyZxdW90OzsmcXVvdDskKFByb2plY3REaXIpLi5ccGxhdGZvcm1cZ3JhcGhpY3Ncb3BlbnR5
cGUmcXVvdDs7JnF1b3Q7JChQcm9qZWN0RGlyKS4uXHBsYXRmb3JtXGdyYXBoaWNzXHRyYW5zZm9y
bXMmcXVvdDs7JnF1b3Q7JChQcm9qZWN0RGlyKS4uXHBsYXRmb3JtXHRleHQmcXVvdDs7JnF1b3Q7
JChQcm9qZWN0RGlyKS4uXHBsYXRmb3JtXGdyYXBoaWNzXHdpbiZxdW90OzsmcXVvdDskKFByb2pl
Y3REaXIpLi5ceG1sJnF1b3Q7OyZxdW90OyQoV2ViS2l0T3V0cHV0RGlyKVxvYmpcV2ViQ29yZVxE
ZXJpdmVkU291cmNlcyZxdW90OzsmcXVvdDskKFByb2plY3REaXIpLi5ccGx1Z2lucyZxdW90Ozsm
cXVvdDskKFByb2plY3REaXIpLi5ccGx1Z2luc1x3aW4mcXVvdDs7JnF1b3Q7JChQcm9qZWN0RGly
KS4uXHN2Z1xncmFwaGljcyZxdW90OzsmcXVvdDskKFByb2plY3REaXIpLi5cc3ZnXGdyYXBoaWNz
XGZpbHRlcnMmcXVvdDs7JnF1b3Q7JChQcm9qZWN0RGlyKS4uXHN2ZyZxdW90OzsmcXVvdDskKFBy
b2plY3REaXIpLi5cd21sJnF1b3Q7OyZxdW90OyQoUHJvamVjdERpcikuLlxzdG9yYWdlJnF1b3Q7
OyZxdW90OyQoUHJvamVjdERpcikuLlx3ZWJzb2NrZXRzJnF1b3Q7OyZxdW90OyQoUHJvamVjdERp
cikuLlx3b3JrZXJzJnF1b3Q7OyZxdW90OyQoV2ViS2l0T3V0cHV0RGlyKVxpbmNsdWRlJnF1b3Q7
OyZxdW90OyQoV2ViS2l0T3V0cHV0RGlyKVxpbmNsdWRlXHByaXZhdGUmcXVvdDs7JnF1b3Q7JChX
ZWJLaXRPdXRwdXREaXIpXGluY2x1ZGVcSmF2YVNjcmlwdENvcmUmcXVvdDs7JnF1b3Q7JChXZWJL
aXRPdXRwdXREaXIpXGluY2x1ZGVccHJpdmF0ZVxKYXZhU2NyaXB0Q29yZSZxdW90OzsmcXVvdDsk
KFByb2plY3REaXIpLi5cRm9yd2FyZGluZ0hlYWRlcnMmcXVvdDs7JnF1b3Q7JChXZWJLaXRMaWJy
YXJpZXNEaXIpXGluY2x1ZGUmcXVvdDs7JnF1b3Q7JChXZWJLaXRMaWJyYXJpZXNEaXIpXGluY2x1
ZGVccHJpdmF0ZSZxdW90OzsmcXVvdDskKFdlYktpdExpYnJhcmllc0RpcilcaW5jbHVkZVxwcml2
YXRlXEphdmFTY3JpcHRDb3JlJnF1b3Q7OyZxdW90OyQoV2ViS2l0TGlicmFyaWVzRGlyKVxpbmNs
dWRlXGljdSZxdW90OzsmcXVvdDskKFdlYktpdExpYnJhcmllc0RpcilcaW5jbHVkZVxpY29udiZx
dW90OzsmcXVvdDskKFdlYktpdExpYnJhcmllc0RpcilcaW5jbHVkZVxwdGhyZWFkcyZxdW90Ozsm
cXVvdDskKFdlYktpdExpYnJhcmllc0RpcilcaW5jbHVkZVxzcWxpdGUmcXVvdDs7JnF1b3Q7JChX
ZWJLaXRMaWJyYXJpZXNEaXIpXGluY2x1ZGVcSmF2YVNjcmlwdENvcmUmcXVvdDs7JnF1b3Q7JChX
ZWJLaXRMaWJyYXJpZXNEaXIpXEluY2x1ZGVcQ29yZUZvdW5kYXRpb25cT1NYQ29tcGF0aWJpbGl0
eUhlYWRlcnMmcXVvdDs7JnF1b3Q7JChXZWJLaXRMaWJyYXJpZXNEaXIpXEluY2x1ZGVcQ29yZUZv
dW5kYXRpb25cT1NYQ29tcGF0aWJpbGl0eUhlYWRlcnNcR05VQ29tcGF0aWJpbGl0eSZxdW90Ozsm
cXVvdDskKFByb2plY3REaXIpLi5cc3ZnXGFuaW1hdGlvbiZxdW90OyINCisJCVByZXByb2Nlc3Nv
ckRlZmluaXRpb25zPSJfX1dJTjMyX187ICAgICAgICAgICAgICAgICAgICBXRUJDT1JFX0NPTlRF
WFRfTUVOVVM7RU5BQkxFX0NIQU5ORUxfTUVTU0FHSU5HO0VOQUJMRV9EQVRBQkFTRTtFTkFCTEVf
REFUQUdSSUQ7RU5BQkxFX0RBVEFMSVNUO0VOQUJMRV9ET01fU1RPUkFHRTtFTkFCTEVfRVZFTlRT
T1VSQ0U7RU5BQkxFX0lDT05EQVRBQkFTRTtFTkFCTEVfT0ZGTElORV9XRUJfQVBQTElDQVRJT05T
O0VOQUJMRV9SVUJZO0VOQUJMRV9TSEFSRURfV09SS0VSUztFTkFCTEVfU1ZHO0VOQUJMRV9TVkdf
QU5JTUFUSU9OO0VOQUJMRV9TVkdfQVNfSU1BR0U7RU5BQkxFX1NWR19GT05UUztFTkFCTEVfU1ZH
X0ZPUkVJR05fT0JKRUNUO0VOQUJMRV9TVkdfVVNFO0VOQUJMRV9XRUJfU09DS0VUUztFTkFCTEVf
V09SS0VSUztFTkFCTEVfWFBBVEg7RU5BQkxFX1hTTFQiDQorCQlVc2VQcmVjb21waWxlZEhlYWRl
cj0iMiINCisJCVByZWNvbXBpbGVkSGVhZGVyVGhyb3VnaD0iV2ViQ29yZVByZWZpeC5oIg0KKwkJ
Rm9yY2VkSW5jbHVkZUZpbGVzPSJXZWJDb3JlUHJlZml4LmgiDQorCS8+DQorCTxUb29sDQorCQlO
YW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCUNvbW1hbmRMaW5lPSIiDQorCS8+DQorCTxU
b29sDQorCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJQ29tbWFuZExpbmU9IiVTeXN0
ZW1Ecml2ZSVcY3lnd2luXGJpblx3aGljaC5leGUgYmFzaCYjeDBEOyYjeDBBO2lmIGVycm9ybGV2
ZWwgMSBzZXQgUEFUSD0lU3lzdGVtRHJpdmUlXGN5Z3dpblxiaW47JVBBVEglJiN4MEQ7JiN4MEE7
Y21kIC9jJiN4MEQ7JiN4MEE7aWYgZXhpc3QgJnF1b3Q7JChXZWJLaXRPdXRwdXREaXIpXGJ1aWxk
ZmFpbGVkJnF1b3Q7IGdyZXAgWFgkKFByb2plY3ROYW1lKVhYICZxdW90OyQoV2ViS2l0T3V0cHV0
RGlyKVxidWlsZGZhaWxlZCZxdW90OyYjeDBEOyYjeDBBO2lmIGVycm9ybGV2ZWwgMSBleGl0IDEm
I3gwRDsmI3gwQTtlY2hvIFhYJChQcm9qZWN0TmFtZSlYWCAmZ3Q7ICZxdW90OyQoV2ViS2l0T3V0
cHV0RGlyKVxidWlsZGZhaWxlZCZxdW90OyYjeDBEOyYjeDBBOyYjeDBEOyYjeDBBO3RvdWNoICZx
dW90OyQoV2ViS2l0T3V0cHV0RGlyKVx0bXAuY3BwJnF1b3Q7JiN4MEQ7JiN4MEE7Y2wgL2FuYWx5
emUgL25vbG9nbyAvYyAmcXVvdDskKFdlYktpdE91dHB1dERpcilcdG1wLmNwcCZxdW90OyAvRm8m
cXVvdDskKEludERpcilcdG1wLm9iaiZxdW90OyAyJmd0OyZhbXA7MSB8IGZpbmRzdHIgRDkwNDAm
I3gwRDsmI3gwQTtpZiBFUlJPUkxFVkVMIDEgKHNldCBFbmFibGVQUkVmYXN0PSZxdW90O3RydWUm
cXVvdDspIGVsc2UgKHNldCBFbmFibGVQUkVmYXN0PSZxdW90O2ZhbHNlJnF1b3Q7KSYjeDBEOyYj
eDBBO2lmIEVSUk9STEVWRUwgMSAoc2V0IEFuYWx5emVXaXRoTGFyZ2VTdGFjaz0mcXVvdDsvYW5h
bHl6ZTo2NTUzNiZxdW90OykgZWxzZSAoc2V0IEFuYWx5emVXaXRoTGFyZ2VTdGFjaz0mcXVvdDsm
cXVvdDspJiN4MEQ7JiN4MEE7ZXhpdCAvYiYjeDBEOyYjeDBBOyINCisJLz4NCis8L1Zpc3VhbFN0
dWRpb1Byb3BlcnR5U2hlZXQ+DQpJbmRleDogV2ViS2l0L3dpbi9DaGFuZ2VMb2cNCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0NCi0tLSBXZWJLaXQvd2luL0NoYW5nZUxvZwkocmV2aXNpb24gNDk0ODQpDQorKysgV2ViS2l0
L3dpbi9DaGFuZ2VMb2cJKHdvcmtpbmcgY29weSkNCkBAIC0xLDMgKzEsMzAgQEANCisyMDA5LTEw
LTEyICBDaHJpcyBNYXJyaW4gIDxjbWFycmluQGFwcGxlLmNvbT4NCisNCisgICAgICAgIFJldmll
d2VkIGJ5IE5PQk9EWSAoT09QUyEpLg0KKw0KKyAgICAgICAgQWRkaW5nIGluIHRoZSBidWlsZCBz
dGVwcyBmb3IgYWNjZWxlcmF0ZWQgY29tcG9zaXRpbmcgb24gV2luZG93cyAtIG9mZiBieSBkZWZh
dWx0DQorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Mjcz
MTQNCisNCisgICAgICAgICogV2ViS2l0LnZjcHJvai9XZWJLaXQudmNwcm9qOg0KKw0KIDIwMDkt
MTAtMDkgIEFkYW0gQmFydGggIDxhYmFydGhAd2Via2l0Lm9yZz4NCiANCiAgICAgICAgIFJldmll
d2VkIGJ5IERhcmluIEFkbGVyLg0KSW5kZXg6IFdlYktpdC93aW4vV2ViS2l0LnZjcHJvai9XZWJL
aXQudmNwcm9qDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09DQotLS0gV2ViS2l0L3dpbi9XZWJLaXQudmNwcm9qL1dlYktp
dC52Y3Byb2oJKHJldmlzaW9uIDQ5NDgxKQ0KKysrIFdlYktpdC93aW4vV2ViS2l0LnZjcHJvai9X
ZWJLaXQudmNwcm9qCSh3b3JraW5nIGNvcHkpDQpAQCAtMjEzLDcgKzIxMyw3IEBADQogCQkJLz4N
CiAJCQk8VG9vbA0KIAkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQotCQkJCUFkZGl0aW9uYWxEZXBl
bmRlbmNpZXM9ImRlbGF5aW1wLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIg
Y29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIu
bGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIHVzcDEwLmxpYiBjb21jdGwzMi5s
aWIgdmVyc2lvbi5saWIgc2hsd2FwaS5saWIgbGlieG1sMiQoTGlicmFyeUNvbmZpZ1N1ZmZpeCku
bGliIGxpYnhzbHQkKExpYnJhcnlDb25maWdTdWZmaXgpLmxpYiBpY3VpbiQoTGlicmFyeUNvbmZp
Z1N1ZmZpeCkubGliIGljdXVjJChMaWJyYXJ5Q29uZmlnU3VmZml4KS5saWIgU1FMaXRlMyQoTGli
cmFyeUNvbmZpZ1N1ZmZpeCkubGliIHB0aHJlYWRWQzIkKExpYnJhcnlDb25maWdTdWZmaXgpLmxp
YiBDb3JlRm91bmRhdGlvbiQoTGlicmFyeUNvbmZpZ1N1ZmZpeCkubGliIEphdmFTY3JpcHRDb3Jl
JChXZWJLaXRETExDb25maWdTdWZmaXgpLmxpYiBDRk5ldHdvcmskKExpYnJhcnlDb25maWdTdWZm
aXgpLmxpYiBDb3JlR3JhcGhpY3MkKExpYnJhcnlDb25maWdTdWZmaXgpLmxpYiBXZWJLaXRHVUlE
JChXZWJLaXRDb25maWdTdWZmaXgpLmxpYiBXZWJDb3JlJChXZWJLaXRDb25maWdTdWZmaXgpLmxp
YiBXZWJLaXRTeXN0ZW1JbnRlcmZhY2UkKFdlYktpdENvbmZpZ1N1ZmZpeCkubGliIG1zaW1nMzIu
bGliIFFUTW92aWVXaW4kKFdlYktpdENvbmZpZ1N1ZmZpeCkubGliIGNyeXB0MzIubGliIGlwaGxw
YXBpLmxpYiB3aW5tbS5saWIgcnBjcnQ0LmxpYiBjb21zdXBwdy5saWIiDQorCQkJCUFkZGl0aW9u
YWxEZXBlbmRlbmNpZXM9ImRlbGF5aW1wLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkz
Mi5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xl
YXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIHVzcDEwLmxpYiBjb21j
dGwzMi5saWIgdmVyc2lvbi5saWIgc2hsd2FwaS5saWIgbGlieG1sMiQoTGlicmFyeUNvbmZpZ1N1
ZmZpeCkubGliIGxpYnhzbHQkKExpYnJhcnlDb25maWdTdWZmaXgpLmxpYiBpY3VpbiQoTGlicmFy
eUNvbmZpZ1N1ZmZpeCkubGliIGljdXVjJChMaWJyYXJ5Q29uZmlnU3VmZml4KS5saWIgU1FMaXRl
MyQoTGlicmFyeUNvbmZpZ1N1ZmZpeCkubGliIHB0aHJlYWRWQzIkKExpYnJhcnlDb25maWdTdWZm
aXgpLmxpYiBDb3JlRm91bmRhdGlvbiQoTGlicmFyeUNvbmZpZ1N1ZmZpeCkubGliIEphdmFTY3Jp
cHRDb3JlJChXZWJLaXRETExDb25maWdTdWZmaXgpLmxpYiBDRk5ldHdvcmskKExpYnJhcnlDb25m
aWdTdWZmaXgpLmxpYiBDb3JlR3JhcGhpY3MkKExpYnJhcnlDb25maWdTdWZmaXgpLmxpYiBRdWFy
dHpDb3JlJChMaWJyYXJ5Q29uZmlnU3VmZml4KS5saWIgV2ViS2l0R1VJRCQoV2ViS2l0Q29uZmln
U3VmZml4KS5saWIgV2ViQ29yZSQoV2ViS2l0Q29uZmlnU3VmZml4KS5saWIgV2ViS2l0U3lzdGVt
SW50ZXJmYWNlJChXZWJLaXRDb25maWdTdWZmaXgpLmxpYiBtc2ltZzMyLmxpYiBRVE1vdmllV2lu
JChXZWJLaXRDb25maWdTdWZmaXgpLmxpYiBjcnlwdDMyLmxpYiBpcGhscGFwaS5saWIgd2lubW0u
bGliIHJwY3J0NC5saWIgZDNkOS5saWIgZDNkeDkubGliIGNvbXN1cHB3LmxpYiINCiAJCQkJT3V0
cHV0RmlsZT0iJChPdXREaXIpXCQoUHJvamVjdE5hbWUpJChXZWJLaXRETExDb25maWdTdWZmaXgp
LmRsbCINCiAJCQkJQWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcz0iIg0KIAkJCQlNb2R1bGVE
ZWZpbml0aW9uRmlsZT0iV2ViS2l0JChXZWJLaXRETExDb25maWdTdWZmaXgpLmRlZiINCg==
</data>
<flag name="review"
          id="22393"
          type_id="1"
          status="+"
          setter="oliver"
    />
    <flag name="commit-queue"
          id="22807"
          type_id="3"
          status="-"
          setter="cmarrin"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>43743</attachid>
            <date>2009-11-23 17:38:12 -0800</date>
            <delta_ts>2009-11-24 12:08:22 -0800</delta_ts>
            <desc>Replacement patch for all 3 previous patches</desc>
            <filename>27314.patch</filename>
            <type>text/plain</type>
            <size>110133</size>
            <attacher name="Chris Marrin">cmarrin</attacher>
            
              <data encoding="base64">SW5kZXg6IEphdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDUxMzMxKQorKysgSmF2YVNjcmlwdENvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTIgQEAKKzIwMDktMTEtMjMgIENocmlzIE1h
cnJpbiAgPGNtYXJyaW5AYXBwbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAo
T09QUyEpLgorCisgICAgICAgIEFkZCBhYmlsaXR5IHRvIGVuYWJsZSBBQ0NFTEVSQVRFRF9DT01Q
T1NJVElORyBvbiBXaW5kb3dzIChjdXJyZW50bHkgZGlzYWJsZWQpCisgICAgICAgIGh0dHBzOi8v
YnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yNzMxNAorCisgICAgICAgICogd3RmL1Bs
YXRmb3JtLmg6CisKIDIwMDktMTEtMjMgIEdhdmluIEJhcnJhY2xvdWdoICA8YmFycmFjbG91Z2hA
YXBwbGUuY29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5IEdlb2ZmIEdhcmVuLgpJbmRleDogSmF2
YVNjcmlwdENvcmUvd3RmL1BsYXRmb3JtLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gSmF2YVNjcmlwdENvcmUv
d3RmL1BsYXRmb3JtLmgJKHJldmlzaW9uIDUxMTIyKQorKysgSmF2YVNjcmlwdENvcmUvd3RmL1Bs
YXRmb3JtLmgJKHdvcmtpbmcgY29weSkKQEAgLTg2Myw2ICs4NjMsMTAgQEAgb24gTWluR1cuIFNl
ZSBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaAogI2RlZmluZSBXVEZfVVNFX0FDQ0VMRVJBVEVE
X0NPTVBPU0lUSU5HIDEKICNlbmRpZgogCisjaWYgUExBVEZPUk0oV0lOKQorI2RlZmluZSBXVEZf
VVNFX0FDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HIDAKKyNlbmRpZgorCiAjaWYgQ09NUElMRVIoR0ND
KQogI2RlZmluZSBXQVJOX1VOVVNFRF9SRVRVUk4gX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2Vk
X3Jlc3VsdCkpCiAjZWxzZQpJbmRleDogV2ViQ29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
V2ViQ29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDUxMzMxKQorKysgV2ViQ29yZS9DaGFuZ2VMb2cJ
KHdvcmtpbmcgY29weSkKQEAgLTEsMyArMSwzMiBAQAorMjAwOS0xMS0yMyAgQ2hyaXMgTWFycmlu
ICA8Y21hcnJpbkBhcHBsZS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BT
ISkuCisKKyAgICAgICAgSW1wbGVtZW50IGFjY2VsZXJhdGVkIGNvbXBvc2l0aW5nCisgICAgICAg
IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yNzMxNAorICAgICAgICAK
KyAgICAgICAgVGhpcyBwYXJ0IG9mIHRoZSBjaGVja2luIGFkZHMgdGhlIFdpbmRvd3Mgc3BlY2lm
aWMgR3JhcGhpY3NMYXllciBzdXBwb3J0IGZpbGVzLgorICAgICAgICBJdCBwcm92aWRlcyB0aGUg
aW50ZXJmYWNlIGJldHdlZW4gR3JhcGhpY3NMYXllciBhbmQgQ0FDRi4gSXQgYWxzbyBkZWFscyB3
aXRoCisgICAgICAgIHRoZSBjb21wb3NpdGluZyBsb29wLCBhbmQgcHJvdmlkZXMgdGhlIHBsdW1i
aW5nIHRvIHBhc3MgdGhlIHJvb3QgbGF5ZXIgdXAgdG8KKyAgICAgICAgV2ViVmlldy4KKworICAg
ICAgICAqIFdlYkNvcmUudmNwcm9qL1dlYkNvcmUudmNwcm9qOgorICAgICAgICAqIFdlYkNvcmUu
dmNwcm9qL1dlYkNvcmVDb21tb24udnNwcm9wczoKKyAgICAgICAgKiBwYWdlL0ZyYW1lVmlldy5j
cHA6CisgICAgICAgIChXZWJDb3JlOjpGcmFtZVZpZXc6OnN5bmNDb21wb3NpdGluZ1N0YXRlUmVj
dXJzaXZlKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9HcmFwaGljc0xheWVyLmNwcDoK
KyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXI6OkdyYXBoaWNzTGF5ZXIpOgorICAgICAg
ICAqIHBsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzTGF5ZXIuaDoKKyAgICAgICAgKiBwbGF0Zm9y
bS9ncmFwaGljcy93aW4vR3JhcGhpY3NMYXllckNBQ0YuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBw
bGF0Zm9ybS9ncmFwaGljcy93aW4vR3JhcGhpY3NMYXllckNBQ0YuaDogQWRkZWQuCisgICAgICAg
ICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1dLQ0FDRkNvbnRleHRGbHVzaGVyLmNwcDogQWRkZWQu
CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1dLQ0FDRkNvbnRleHRGbHVzaGVyLmg6
IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9XS0NBQ0ZDb250ZXh0Rmx1
c2hlcldpbi5jcHA6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9XS0NB
Q0ZMYXllci5jcHA6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9XS0NB
Q0ZMYXllci5oOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW4vV0tDQUNG
TGF5ZXJXaW5kb3cuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW4v
V0tDQUNGTGF5ZXJXaW5kb3cuaDogQWRkZWQuCisKIDIwMDktMTEtMjMgIEFhcm9uIEdvbGRlbiAg
PGFnb2xkZW5AYXBwbGUuY29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5IEFsZXhleSBQcm9za3Vy
eWFrb3YuCkluZGV4OiBXZWJDb3JlL1dlYkNvcmUudmNwcm9qL1dlYkNvcmUudmNwcm9qCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFdlYkNvcmUvV2ViQ29yZS52Y3Byb2ovV2ViQ29yZS52Y3Byb2oJKHJldmlzaW9u
IDUxMTIyKQorKysgV2ViQ29yZS9XZWJDb3JlLnZjcHJvai9XZWJDb3JlLnZjcHJvagkod29ya2lu
ZyBjb3B5KQpAQCAtMzksNiArMzksNyBAQAogCQkJPFRvb2wNCiAJCQkJTmFtZT0iVkNDTENvbXBp
bGVyVG9vbCINCiAJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KKwkJCQlQcmVw
cm9jZXNzb3JEZWZpbml0aW9ucz0iUVVBUlRaQ09SRV9ETEwiDQogCQkJCUZvcmNlZEluY2x1ZGVG
aWxlcz0iIg0KIAkJCS8+DQogCQkJPFRvb2wNCkBAIC05NSw2ICs5Niw3IEBACiAJCQk8VG9vbA0K
IAkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KIAkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVj
dG9yaWVzPSIiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJRVUFSVFpDT1JFX0RMTCIN
CiAJCQkJRm9yY2VkSW5jbHVkZUZpbGVzPSIiDQogCQkJLz4NCiAJCQk8VG9vbA0KQEAgLTE1MCw2
ICsxNTIsNyBAQAogCQkJPFRvb2wNCiAJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCiAJCQkJ
QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0
aW9ucz0iUVVBUlRaQ09SRV9ETEwiDQogCQkJCUZvcmNlZEluY2x1ZGVGaWxlcz0iIg0KIAkJCS8+
DQogCQkJPFRvb2wNCkBAIC0yMDUsNiArMjA4LDcgQEAKIAkJCTxUb29sDQogCQkJCU5hbWU9IlZD
Q0xDb21waWxlclRvb2wiDQogCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJ
CQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IlFVQVJUWkNPUkVfRExMIg0KIAkJCQlGb3JjZWRJ
bmNsdWRlRmlsZXM9IiINCiAJCQkvPg0KIAkJCTxUb29sDQpAQCAtMjYxLDYgKzI2NSw3IEBACiAJ
CQk8VG9vbA0KIAkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KIAkJCQlBZGRpdGlvbmFsSW5j
bHVkZURpcmVjdG9yaWVzPSIiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJRVUFSVFpD
T1JFX0RMTCINCiAJCQkJRm9yY2VkSW5jbHVkZUZpbGVzPSIiDQogCQkJLz4NCiAJCQk8VG9vbA0K
QEAgLTMxNiw2ICszMjEsNyBAQAogCQkJPFRvb2wNCiAJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9v
bCINCiAJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KKwkJCQlQcmVwcm9jZXNz
b3JEZWZpbml0aW9ucz0iUVVBUlRaQ09SRV9ETEwiDQogCQkJCUZvcmNlZEluY2x1ZGVGaWxlcz0i
Ig0KIAkJCS8+DQogCQkJPFRvb2wNCkBAIC0yMjA0OCw2ICsyMjA1NCwxMCBAQAogCQkJCQk+DQog
CQkJCTwvRmlsZT4NCiAJCQkJPEZpbGUNCisJCQkJCVJlbGF0aXZlUGF0aD0iLi5ccGxhdGZvcm1c
Z3JhcGhpY3NcVGV4dFJlbmRlcmluZ01vZGUuaCINCisJCQkJCT4NCisJCQkJPC9GaWxlPg0KKwkJ
CQk8RmlsZQ0KIAkJCQkJUmVsYXRpdmVQYXRoPSIuLlxwbGF0Zm9ybVx3aW5cV0NEYXRhT2JqZWN0
LmNwcCINCiAJCQkJCT4NCiAJCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KQEAgLTIyMTEwLDYgKzIy
MTIwLDY4IEBACiAJCQkJCT4NCiAJCQkJPC9GaWxlPg0KIAkJCQk8RmlsZQ0KKwkJCQkJUmVsYXRp
dmVQYXRoPSIuLlxXZWJDb3JlUHJlZml4LmNwcCINCisJCQkJCT4NCisJCQkJCTxGaWxlQ29uZmln
dXJhdGlvbg0KKwkJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KKwkJCQkJCT4NCisJCQkJCQk8VG9v
bA0KKwkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCQlVc2VQcmVjb21waWxl
ZEhlYWRlcj0iMSINCisJCQkJCQkJRGlzYWJsZVNwZWNpZmljV2FybmluZ3M9IjQ4MTkiDQorCQkJ
CQkJLz4NCisJCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCQk8RmlsZUNvbmZpZ3VyYXRp
b24NCisJCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KKwkJCQkJCT4NCisJCQkJCQk8VG9vbA0K
KwkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCQlVc2VQcmVjb21waWxlZEhl
YWRlcj0iMSINCisJCQkJCQkJRGlzYWJsZVNwZWNpZmljV2FybmluZ3M9IjQ4MTkiDQorCQkJCQkJ
Lz4NCisJCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24N
CisJCQkJCQlOYW1lPSJEZWJ1Z19JbnRlcm5hbHxXaW4zMiINCisJCQkJCQk+DQorCQkJCQkJPFRv
b2wNCisJCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQkJVXNlUHJlY29tcGls
ZWRIZWFkZXI9IjEiDQorCQkJCQkJCURpc2FibGVTcGVjaWZpY1dhcm5pbmdzPSI0ODE5Ig0KKwkJ
CQkJCS8+DQorCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQkJPEZpbGVDb25maWd1cmF0
aW9uDQorCQkJCQkJTmFtZT0iRGVidWdfQ2Fpcm98V2luMzIiDQorCQkJCQkJPg0KKwkJCQkJCTxU
b29sDQorCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJCVVzZVByZWNvbXBp
bGVkSGVhZGVyPSIxIg0KKwkJCQkJCQlEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz0iNDgxOSINCisJ
CQkJCQkvPg0KKwkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJCTxGaWxlQ29uZmlndXJh
dGlvbg0KKwkJCQkJCU5hbWU9IlJlbGVhc2VfQ2Fpcm98V2luMzIiDQorCQkJCQkJPg0KKwkJCQkJ
CTxUb29sDQorCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJCVVzZVByZWNv
bXBpbGVkSGVhZGVyPSIxIg0KKwkJCQkJCQlEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz0iNDgxOSIN
CisJCQkJCQkvPg0KKwkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJCTxGaWxlQ29uZmln
dXJhdGlvbg0KKwkJCQkJCU5hbWU9IkRlYnVnX0FsbHxXaW4zMiINCisJCQkJCQk+DQorCQkJCQkJ
PFRvb2wNCisJCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQkJVXNlUHJlY29t
cGlsZWRIZWFkZXI9IjEiDQorCQkJCQkJCURpc2FibGVTcGVjaWZpY1dhcm5pbmdzPSI0ODE5Ig0K
KwkJCQkJCS8+DQorCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8L0ZpbGU+DQorCQkJ
CTxGaWxlDQorCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXFdlYkNvcmVQcmVmaXguaCINCisJCQkJCT4N
CisJCQkJPC9GaWxlPg0KKwkJCQk8RmlsZQ0KIAkJCQkJUmVsYXRpdmVQYXRoPSIuLlxwbGF0Zm9y
bVx3aW5cV2ViQ29yZVRleHRSZW5kZXJlci5jcHAiDQogCQkJCQk+DQogCQkJCTwvRmlsZT4NCkBA
IC0yMjM5NCw2ICsyMjQ2NiwxOCBAQAogCQkJCQk+DQogCQkJCTwvRmlsZT4NCiAJCQkJPEZpbGUN
CisJCQkJCVJlbGF0aXZlUGF0aD0iLi5ccGxhdGZvcm1cZ3JhcGhpY3NcR3JhcGhpY3NMYXllci5j
cHAiDQorCQkJCQk+DQorCQkJCTwvRmlsZT4NCisJCQkJPEZpbGUNCisJCQkJCVJlbGF0aXZlUGF0
aD0iLi5ccGxhdGZvcm1cZ3JhcGhpY3NcR3JhcGhpY3NMYXllci5oIg0KKwkJCQkJPg0KKwkJCQk8
L0ZpbGU+DQorCQkJCTxGaWxlDQorCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHBsYXRmb3JtXGdyYXBo
aWNzXEdyYXBoaWNzTGF5ZXJDbGllbnQuaCINCisJCQkJCT4NCisJCQkJPC9GaWxlPg0KKwkJCQk8
RmlsZQ0KIAkJCQkJUmVsYXRpdmVQYXRoPSIuLlxwbGF0Zm9ybVxncmFwaGljc1xHcmFwaGljc1R5
cGVzLmNwcCINCiAJCQkJCT4NCiAJCQkJPC9GaWxlPg0KQEAgLTIyODkzLDYgKzIyOTc3LDE0IEBA
CiAJCQkJCQk+DQogCQkJCQk8L0ZpbGU+DQogCQkJCQk8RmlsZQ0KKwkJCQkJCVJlbGF0aXZlUGF0
aD0iLi5ccGxhdGZvcm1cZ3JhcGhpY3Ncd2luXEdyYXBoaWNzTGF5ZXJDQUNGLmNwcCINCisJCQkJ
CQk+DQorCQkJCQk8L0ZpbGU+DQorCQkJCQk8RmlsZQ0KKwkJCQkJCVJlbGF0aXZlUGF0aD0iLi5c
cGxhdGZvcm1cZ3JhcGhpY3Ncd2luXEdyYXBoaWNzTGF5ZXJDQUNGLmgiDQorCQkJCQkJPg0KKwkJ
CQkJPC9GaWxlPg0KKwkJCQkJPEZpbGUNCiAJCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHBsYXRmb3Jt
XGdyYXBoaWNzXHdpblxJY29uV2luLmNwcCINCiAJCQkJCQk+DQogCQkJCQk8L0ZpbGU+DQpAQCAt
MjMwODgsNiArMjMxODAsMzQgQEAKIAkJCQkJCVJlbGF0aXZlUGF0aD0iLi5ccGxhdGZvcm1cZ3Jh
cGhpY3Ncd2luXFVuaXNjcmliZUNvbnRyb2xsZXIuaCINCiAJCQkJCQk+DQogCQkJCQk8L0ZpbGU+
DQorCQkJCQk8RmlsZQ0KKwkJCQkJCVJlbGF0aXZlUGF0aD0iLi5ccGxhdGZvcm1cZ3JhcGhpY3Nc
d2luXFdLQ0FDRkNvbnRleHRGbHVzaGVyLmNwcCINCisJCQkJCQk+DQorCQkJCQk8L0ZpbGU+DQor
CQkJCQk8RmlsZQ0KKwkJCQkJCVJlbGF0aXZlUGF0aD0iLi5ccGxhdGZvcm1cZ3JhcGhpY3Ncd2lu
XFdLQ0FDRkNvbnRleHRGbHVzaGVyLmgiDQorCQkJCQkJPg0KKwkJCQkJPC9GaWxlPg0KKwkJCQkJ
PEZpbGUNCisJCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHBsYXRmb3JtXGdyYXBoaWNzXHdpblxXS0NB
Q0ZDb250ZXh0Rmx1c2hlcldpbi5jcHAiDQorCQkJCQkJPg0KKwkJCQkJPC9GaWxlPg0KKwkJCQkJ
PEZpbGUNCisJCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHBsYXRmb3JtXGdyYXBoaWNzXHdpblxXS0NB
Q0ZMYXllci5jcHAiDQorCQkJCQkJPg0KKwkJCQkJPC9GaWxlPg0KKwkJCQkJPEZpbGUNCisJCQkJ
CQlSZWxhdGl2ZVBhdGg9Ii4uXHBsYXRmb3JtXGdyYXBoaWNzXHdpblxXS0NBQ0ZMYXllci5oIg0K
KwkJCQkJCT4NCisJCQkJCTwvRmlsZT4NCisJCQkJCTxGaWxlDQorCQkJCQkJUmVsYXRpdmVQYXRo
PSIuLlxwbGF0Zm9ybVxncmFwaGljc1x3aW5cV0tDQUNGTGF5ZXJXaW5kb3cuY3BwIg0KKwkJCQkJ
CT4NCisJCQkJCTwvRmlsZT4NCisJCQkJCTxGaWxlDQorCQkJCQkJUmVsYXRpdmVQYXRoPSIuLlxw
bGF0Zm9ybVxncmFwaGljc1x3aW5cV0tDQUNGTGF5ZXJXaW5kb3cuaCINCisJCQkJCQk+DQorCQkJ
CQk8L0ZpbGU+DQogCQkJCTwvRmlsdGVyPg0KIAkJCQk8RmlsdGVyDQogCQkJCQlOYW1lPSJjZyIN
CkBAIC0yNzA4Nyw2ICsyNzIwNywyMiBAQAogCQkJCT4NCiAJCQk8L0ZpbGU+DQogCQkJPEZpbGUN
CisJCQkJUmVsYXRpdmVQYXRoPSIuLlxyZW5kZXJpbmdcUmVuZGVyTGF5ZXJCYWNraW5nLmNwcCIN
CisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHJl
bmRlcmluZ1xSZW5kZXJMYXllckJhY2tpbmcuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8
RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHJlbmRlcmluZ1xSZW5kZXJMYXllckNvbXBvc2l0
b3IuY3BwIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0
aD0iLi5ccmVuZGVyaW5nXFJlbmRlckxheWVyQ29tcG9zaXRvci5oIg0KKwkJCQk+DQorCQkJPC9G
aWxlPg0KKwkJCTxGaWxlDQogCQkJCVJlbGF0aXZlUGF0aD0iLi5ccmVuZGVyaW5nXFJlbmRlckxp
bmVCb3hMaXN0LmNwcCINCiAJCQkJPg0KIAkJCTwvRmlsZT4NCkBAIC00Mjg4Nyw3MiArNDMwMjMs
NiBAQAogCQkJUmVsYXRpdmVQYXRoPSIuLlxjb25maWcuaCINCiAJCQk+DQogCQk8L0ZpbGU+DQot
CQk8RmlsZQ0KLQkJCVJlbGF0aXZlUGF0aD0iLi5ccGxhdGZvcm1cZ3JhcGhpY3NcVGV4dFJlbmRl
cmluZ01vZGUuaCINCi0JCQk+DQotCQk8L0ZpbGU+DQotCQk8RmlsZQ0KLQkJCVJlbGF0aXZlUGF0
aD0iLi5cV2ViQ29yZVByZWZpeC5jcHAiDQotCQkJPg0KLQkJCTxGaWxlQ29uZmlndXJhdGlvbg0K
LQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCi0JCQkJPg0KLQkJCQk8VG9vbA0KLQkJCQkJTmFtZT0i
VkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIxIg0KLQkJCQkJ
RGlzYWJsZVNwZWNpZmljV2FybmluZ3M9IjQ4MTkiDQotCQkJCS8+DQotCQkJPC9GaWxlQ29uZmln
dXJhdGlvbj4NCi0JCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJTmFtZT0iUmVsZWFzZXxXaW4z
MiINCi0JCQkJPg0KLQkJCQk8VG9vbA0KLQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0J
CQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIxIg0KLQkJCQkJRGlzYWJsZVNwZWNpZmljV2Fybmlu
Z3M9IjQ4MTkiDQotCQkJCS8+DQotCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQk8RmlsZUNv
bmZpZ3VyYXRpb24NCi0JCQkJTmFtZT0iRGVidWdfSW50ZXJuYWx8V2luMzIiDQotCQkJCT4NCi0J
CQkJPFRvb2wNCi0JCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQlVc2VQcmVjb21w
aWxlZEhlYWRlcj0iMSINCi0JCQkJCURpc2FibGVTcGVjaWZpY1dhcm5pbmdzPSI0ODE5Ig0KLQkJ
CQkvPg0KLQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJPEZpbGVDb25maWd1cmF0aW9uDQot
CQkJCU5hbWU9IkRlYnVnX0NhaXJvfFdpbjMyIg0KLQkJCQk+DQotCQkJCTxUb29sDQotCQkJCQlO
YW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjEiDQot
CQkJCQlEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz0iNDgxOSINCi0JCQkJLz4NCi0JCQk8L0ZpbGVD
b25maWd1cmF0aW9uPg0KLQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQlOYW1lPSJSZWxlYXNl
X0NhaXJvfFdpbjMyIg0KLQkJCQk+DQotCQkJCTxUb29sDQotCQkJCQlOYW1lPSJWQ0NMQ29tcGls
ZXJUb29sIg0KLQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjEiDQotCQkJCQlEaXNhYmxlU3Bl
Y2lmaWNXYXJuaW5ncz0iNDgxOSINCi0JCQkJLz4NCi0JCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0K
LQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQlOYW1lPSJEZWJ1Z19BbGx8V2luMzIiDQotCQkJ
CT4NCi0JCQkJPFRvb2wNCi0JCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQlVc2VQ
cmVjb21waWxlZEhlYWRlcj0iMSINCi0JCQkJCURpc2FibGVTcGVjaWZpY1dhcm5pbmdzPSI0ODE5
Ig0KLQkJCQkvPg0KLQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQk8L0ZpbGU+DQotCQk8Rmls
ZQ0KLQkJCVJlbGF0aXZlUGF0aD0iLi5cV2ViQ29yZVByZWZpeC5oIg0KLQkJCT4NCi0JCTwvRmls
ZT4NCiAJPC9GaWxlcz4NCiAJPEdsb2JhbHM+DQogCTwvR2xvYmFscz4NCkluZGV4OiBXZWJDb3Jl
L1dlYkNvcmUudmNwcm9qL1dlYkNvcmVDb21tb24udnNwcm9wcwo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJD
b3JlL1dlYkNvcmUudmNwcm9qL1dlYkNvcmVDb21tb24udnNwcm9wcwkocmV2aXNpb24gNTExMjIp
CisrKyBXZWJDb3JlL1dlYkNvcmUudmNwcm9qL1dlYkNvcmVDb21tb24udnNwcm9wcwkod29ya2lu
ZyBjb3B5KQpAQCAtOCw3ICs4LDcgQEAKIAk8VG9vbAogCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29s
IgogCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSImcXVvdDskKFByb2plY3REaXIpLi5c
JnF1b3Q7OyZxdW90OyQoUHJvamVjdERpcikuLiZxdW90OzsmcXVvdDskKFByb2plY3REaXIpLi5c
YWNjZXNzaWJpbGl0eSZxdW90OzsmcXVvdDskKFByb2plY3REaXIpLi5cYWNjZXNzaWJpbGl0eVx3
aW4mcXVvdDs7JnF1b3Q7JChQcm9qZWN0RGlyKS4uXGJyaWRnZSZxdW90OzsmcXVvdDskKFByb2pl
Y3REaXIpLi5cYnJpZGdlXGMmcXVvdDs7JnF1b3Q7JChQcm9qZWN0RGlyKS4uXGNzcyZxdW90Ozsm
cXVvdDskKFByb2plY3REaXIpLi5cZWRpdGluZyZxdW90OzsmcXVvdDskKFByb2plY3REaXIpLi5c
cmVuZGVyaW5nJnF1b3Q7OyZxdW90OyQoUHJvamVjdERpcikuLlxyZW5kZXJpbmdcc3R5bGUmcXVv
dDs7JnF1b3Q7JChQcm9qZWN0RGlyKS4uXGJpbmRpbmdzXGpzJnF1b3Q7OyZxdW90OyQoUHJvamVj
dERpcikuLlxkb20mcXVvdDs7JnF1b3Q7JChQcm9qZWN0RGlyKS4uXGRvbVxkZWZhdWx0JnF1b3Q7
OyZxdW90OyQoUHJvamVjdERpcikuLlxoaXN0b3J5JnF1b3Q7OyZxdW90OyQoUHJvamVjdERpciku
LlxodG1sJnF1b3Q7OyZxdW90OyQoUHJvamVjdERpcikuLlxodG1sXGNhbnZhcyZxdW90OzsmcXVv
dDskKFByb2plY3REaXIpLi5caW5zcGVjdG9yJnF1b3Q7OyZxdW90OyQoUHJvamVjdERpcikuLlxs
b2FkZXImcXVvdDs7JnF1b3Q7JChQcm9qZWN0RGlyKS4uXGxvYWRlclxhcHBjYWNoZSZxdW90Ozsm
cXVvdDskKFByb2plY3REaXIpLi5cbG9hZGVyXGFyY2hpdmUmcXVvdDs7JnF1b3Q7JChQcm9qZWN0
RGlyKS4uXGxvYWRlclxhcmNoaXZlXGNmJnF1b3Q7OyZxdW90OyQoUHJvamVjdERpcikuLlxsb2Fk
ZXJcaWNvbiZxdW90OzsmcXVvdDskKFByb2plY3REaXIpLi5cbm90aWZpY2F0aW9ucyZxdW90Ozsm
cXVvdDskKFByb2plY3REaXIpLi5ccGFnZSZxdW90OzsmcXVvdDskKFByb2plY3REaXIpLi5ccGFn
ZVxhbmltYXRpb24mcXVvdDs7JnF1b3Q7JChQcm9qZWN0RGlyKS4uXHBhZ2Vcd2luJnF1b3Q7OyZx
dW90OyQoUHJvamVjdERpcikuLlxwbGF0Zm9ybSZxdW90OzsmcXVvdDskKFByb2plY3REaXIpLi5c
cGxhdGZvcm1cYW5pbWF0aW9uJnF1b3Q7OyZxdW90OyQoUHJvamVjdERpcikuLlxwbGF0Zm9ybVxt
b2NrJnF1b3Q7OyZxdW90OyQoUHJvamVjdERpcikuLlxwbGF0Zm9ybVxzcWwmcXVvdDs7JnF1b3Q7
JChQcm9qZWN0RGlyKS4uXHBsYXRmb3JtXHdpbiZxdW90OzsmcXVvdDskKFByb2plY3REaXIpLi5c
cGxhdGZvcm1cbmV0d29yayZxdW90OzsmcXVvdDskKFByb2plY3REaXIpLi5ccGxhdGZvcm1cbmV0
d29ya1x3aW4mcXVvdDs7JnF1b3Q7JChQcm9qZWN0RGlyKS4uXHBsYXRmb3JtXGNmJnF1b3Q7OyZx
dW90OyQoUHJvamVjdERpcikuLlxwbGF0Zm9ybVxncmFwaGljcyZxdW90OzsmcXVvdDskKFByb2pl
Y3REaXIpLi5ccGxhdGZvcm1cZ3JhcGhpY3NcZmlsdGVycyZxdW90OzsmcXVvdDskKFByb2plY3RE
aXIpLi5ccGxhdGZvcm1cZ3JhcGhpY3Ncb3BlbnR5cGUmcXVvdDs7JnF1b3Q7JChQcm9qZWN0RGly
KS4uXHBsYXRmb3JtXGdyYXBoaWNzXHRyYW5zZm9ybXMmcXVvdDs7JnF1b3Q7JChQcm9qZWN0RGly
KS4uXHBsYXRmb3JtXHRleHQmcXVvdDs7JnF1b3Q7JChQcm9qZWN0RGlyKS4uXHBsYXRmb3JtXGdy
YXBoaWNzXHdpbiZxdW90OzsmcXVvdDskKFByb2plY3REaXIpLi5ceG1sJnF1b3Q7OyZxdW90OyQo
V2ViS2l0T3V0cHV0RGlyKVxvYmpcV2ViQ29yZVxEZXJpdmVkU291cmNlcyZxdW90OzsmcXVvdDsk
KFByb2plY3REaXIpLi5ccGx1Z2lucyZxdW90OzsmcXVvdDskKFByb2plY3REaXIpLi5ccGx1Z2lu
c1x3aW4mcXVvdDs7JnF1b3Q7JChQcm9qZWN0RGlyKS4uXHN2Z1xncmFwaGljcyZxdW90OzsmcXVv
dDskKFByb2plY3REaXIpLi5cc3ZnXGdyYXBoaWNzXGZpbHRlcnMmcXVvdDs7JnF1b3Q7JChQcm9q
ZWN0RGlyKS4uXHN2ZyZxdW90OzsmcXVvdDskKFByb2plY3REaXIpLi5cd21sJnF1b3Q7OyZxdW90
OyQoUHJvamVjdERpcikuLlxzdG9yYWdlJnF1b3Q7OyZxdW90OyQoUHJvamVjdERpcikuLlx3ZWJz
b2NrZXRzJnF1b3Q7OyZxdW90OyQoUHJvamVjdERpcikuLlx3b3JrZXJzJnF1b3Q7OyZxdW90OyQo
V2ViS2l0T3V0cHV0RGlyKVxpbmNsdWRlJnF1b3Q7OyZxdW90OyQoV2ViS2l0T3V0cHV0RGlyKVxp
bmNsdWRlXHByaXZhdGUmcXVvdDs7JnF1b3Q7JChXZWJLaXRPdXRwdXREaXIpXGluY2x1ZGVcSmF2
YVNjcmlwdENvcmUmcXVvdDs7JnF1b3Q7JChXZWJLaXRPdXRwdXREaXIpXGluY2x1ZGVccHJpdmF0
ZVxKYXZhU2NyaXB0Q29yZSZxdW90OzsmcXVvdDskKFByb2plY3REaXIpLi5cRm9yd2FyZGluZ0hl
YWRlcnMmcXVvdDs7JnF1b3Q7JChXZWJLaXRMaWJyYXJpZXNEaXIpXGluY2x1ZGUmcXVvdDs7JnF1
b3Q7JChXZWJLaXRMaWJyYXJpZXNEaXIpXGluY2x1ZGVccHJpdmF0ZSZxdW90OzsmcXVvdDskKFdl
YktpdExpYnJhcmllc0RpcilcaW5jbHVkZVxwcml2YXRlXEphdmFTY3JpcHRDb3JlJnF1b3Q7OyZx
dW90OyQoV2ViS2l0TGlicmFyaWVzRGlyKVxpbmNsdWRlXGljdSZxdW90OzsmcXVvdDskKFdlYktp
dExpYnJhcmllc0RpcilcaW5jbHVkZVxpY29udiZxdW90OzsmcXVvdDskKFdlYktpdExpYnJhcmll
c0RpcilcaW5jbHVkZVxwdGhyZWFkcyZxdW90OzsmcXVvdDskKFdlYktpdExpYnJhcmllc0Rpcilc
aW5jbHVkZVxzcWxpdGUmcXVvdDs7JnF1b3Q7JChXZWJLaXRMaWJyYXJpZXNEaXIpXGluY2x1ZGVc
SmF2YVNjcmlwdENvcmUmcXVvdDs7JnF1b3Q7JChXZWJLaXRMaWJyYXJpZXNEaXIpXEluY2x1ZGVc
Q29yZUZvdW5kYXRpb25cT1NYQ29tcGF0aWJpbGl0eUhlYWRlcnMmcXVvdDs7JnF1b3Q7JChXZWJL
aXRMaWJyYXJpZXNEaXIpXEluY2x1ZGVcQ29yZUZvdW5kYXRpb25cT1NYQ29tcGF0aWJpbGl0eUhl
YWRlcnNcR05VQ29tcGF0aWJpbGl0eSZxdW90OzsmcXVvdDskKFByb2plY3REaXIpLi5cc3ZnXGFu
aW1hdGlvbiZxdW90OyIKLQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9fV0lOMzJfXztXRUJD
T1JFX0NPTlRFWFRfTUVOVVM7RU5BQkxFX0NIQU5ORUxfTUVTU0FHSU5HO0VOQUJMRV9EQVRBQkFT
RTtFTkFCTEVfREFUQUdSSUQ7RU5BQkxFX0RBVEFMSVNUO0VOQUJMRV9ET01fU1RPUkFHRTtFTkFC
TEVfRVZFTlRTT1VSQ0U7RU5BQkxFX0lDT05EQVRBQkFTRTtFTkFCTEVfT0ZGTElORV9XRUJfQVBQ
TElDQVRJT05TO0VOQUJMRV9TSEFSRURfV09SS0VSUztFTkFCTEVfU1ZHO0VOQUJMRV9TVkdfQU5J
TUFUSU9OO0VOQUJMRV9TVkdfQVNfSU1BR0U7RU5BQkxFX1NWR19GT05UUztFTkFCTEVfU1ZHX0ZP
UkVJR05fT0JKRUNUO0VOQUJMRV9TVkdfVVNFO0VOQUJMRV9XRUJfU09DS0VUUztFTkFCTEVfV09S
S0VSUztFTkFCTEVfWFBBVEg7RU5BQkxFX1hTTFQiCisJCVByZXByb2Nlc3NvckRlZmluaXRpb25z
PSJfX1dJTjMyX187RElTQUJMRV8zRF9SRU5ERVJJTkc7V0VCQ09SRV9DT05URVhUX01FTlVTO0VO
QUJMRV9DSEFOTkVMX01FU1NBR0lORztFTkFCTEVfREFUQUJBU0U7RU5BQkxFX0RBVEFHUklEO0VO
QUJMRV9EQVRBTElTVDtFTkFCTEVfRE9NX1NUT1JBR0U7RU5BQkxFX0VWRU5UU09VUkNFO0VOQUJM
RV9JQ09OREFUQUJBU0U7RU5BQkxFX09GRkxJTkVfV0VCX0FQUExJQ0FUSU9OUztFTkFCTEVfU0hB
UkVEX1dPUktFUlM7RU5BQkxFX1NWRztFTkFCTEVfU1ZHX0FOSU1BVElPTjtFTkFCTEVfU1ZHX0FT
X0lNQUdFO0VOQUJMRV9TVkdfRk9OVFM7RU5BQkxFX1NWR19GT1JFSUdOX09CSkVDVDtFTkFCTEVf
U1ZHX1VTRTtFTkFCTEVfV0VCX1NPQ0tFVFM7RU5BQkxFX1dPUktFUlM7RU5BQkxFX1hQQVRIO0VO
QUJMRV9YU0xUIgogCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMiIKIAkJUHJlY29tcGlsZWRIZWFk
ZXJUaHJvdWdoPSJXZWJDb3JlUHJlZml4LmgiCiAJCUZvcmNlZEluY2x1ZGVGaWxlcz0iV2ViQ29y
ZVByZWZpeC5oIgpJbmRleDogV2ViQ29yZS9wYWdlL0ZyYW1lVmlldy5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gV2ViQ29yZS9wYWdlL0ZyYW1lVmlldy5jcHAJKHJldmlzaW9uIDUxMTIyKQorKysgV2ViQ29y
ZS9wYWdlL0ZyYW1lVmlldy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQ3OCw4ICs0NzgsOSBAQCBi
b29sIEZyYW1lVmlldzo6c3luY0NvbXBvc2l0aW5nU3RhdGVSZWN1CiAgICAgICAgIH0KICAgICB9
CiAgICAgcmV0dXJuIGFsbFN1YmZyYW1lc1N5bmNlZDsKLSNlbmRpZiAvLyBVU0UoQUNDRUxFUkFU
RURfQ09NUE9TSVRJTkcpCisjZWxzZSAvLyBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCiAg
ICAgcmV0dXJuIHRydWU7CisjZW5kaWYKIH0KIAogdm9pZCBGcmFtZVZpZXc6OmRpZE1vdmVPbnNj
cmVlbigpCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzTGF5ZXIuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3NMYXllci5j
cHAJKHJldmlzaW9uIDUxMTIyKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9HcmFwaGlj
c0xheWVyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNjksNyArNjksNyBAQCBHcmFwaGljc0xheWVy
OjpHcmFwaGljc0xheWVyKEdyYXBoaWNzTGF5CiAgICAgLCBtX2RyYXdzQ29udGVudChmYWxzZSkK
ICAgICAsIG1fcGFpbnRpbmdQaGFzZShHcmFwaGljc0xheWVyUGFpbnRBbGwpCiAgICAgLCBtX2dl
b21ldHJ5T3JpZW50YXRpb24oQ29tcG9zaXRpbmdDb29yZGluYXRlc1RvcERvd24pCi0gICAgLCBt
X2NvbnRlbnRzT3JpZW50YXRpb24oQ29tcG9zaXRpbmdDb29yZGluYXRlc1RvcERvd24pCisgICAg
LCBtX2NvbnRlbnRzT3JpZW50YXRpb24oQ29tcG9zaXRpbmdDb29yZGluYXRlc0JvdHRvbVVwKQog
ICAgICwgbV9wYXJlbnQoMCkKICAgICAsIG1fbWFza0xheWVyKDApCiAgICAgLCBtX3JlcGFpbnRD
b3VudCgwKQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9HcmFwaGljc0xheWVyLmgK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9HcmFwaGljc0xheWVyLmgJ
KHJldmlzaW9uIDUxMTIyKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9HcmFwaGljc0xh
eWVyLmgJKHdvcmtpbmcgY29weSkKQEAgLTUzLDYgKzUzLDEyIEBAIHR5cGVkZWYgQ0FMYXllciog
TmF0aXZlTGF5ZXI7CiB0eXBlZGVmIHZvaWQqIFBsYXRmb3JtTGF5ZXI7CiB0eXBlZGVmIHZvaWQq
IE5hdGl2ZUxheWVyOwogI2VuZGlmCisjZWxpZiBQTEFURk9STShXSU4pCituYW1lc3BhY2UgV2Vi
Q29yZSB7CitjbGFzcyBXS0NBQ0ZMYXllcjsKK3R5cGVkZWYgV0tDQUNGTGF5ZXIgUGxhdGZvcm1M
YXllcjsKK3R5cGVkZWYgdm9pZCogTmF0aXZlTGF5ZXI7Cit9CiAjZWxzZQogdHlwZWRlZiB2b2lk
KiBQbGF0Zm9ybUxheWVyOwogdHlwZWRlZiB2b2lkKiBOYXRpdmVMYXllcjsKSW5kZXg6IFdlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0dyYXBoaWNzTGF5ZXJDQUNGLmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9HcmFwaGljc0xheWVyQ0FDRi5jcHAJ
KHJldmlzaW9uIDApCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9HcmFwaGljc0xh
eWVyQ0FDRi5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsNjQ0IEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDA5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAq
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFO
RCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlN
RUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJ
QlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lO
RVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29u
ZmlnLmgiCisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisKKyNpbmNsdWRlICJH
cmFwaGljc0xheWVyQ0FDRi5oIgorCisjaW5jbHVkZSAiQ1N0cmluZy5oIgorI2luY2x1ZGUgIkZs
b2F0Q29udmVyc2lvbi5oIgorI2luY2x1ZGUgIkZsb2F0UmVjdC5oIgorI2luY2x1ZGUgIkltYWdl
LmgiCisjaW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIKKyNpbmNsdWRlICJTeXN0ZW1UaW1lLmgi
CisjaW5jbHVkZSAiV0tDQUNGTGF5ZXIuaCIKKyNpbmNsdWRlIDx3dGYvQ3VycmVudFRpbWUuaD4K
KyNpbmNsdWRlIDx3dGYvU3RyaW5nRXh0cmFzLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisK
K25hbWVzcGFjZSBXZWJDb3JlIHsKKworLy8gVGhlIHRocmVzaG9sZCB3aWR0aCBvciBoZWlnaHQg
YWJvdmUgd2hpY2ggYSB0aWxlZCBsYXllciB3aWxsIGJlIHVzZWQuIFRoaXMgc2hvdWxkIGJlCisv
LyBsYXJnZSBlbm91Z2ggdG8gYXZvaWQgdGlsZWQgbGF5ZXJzIGZvciBtb3N0IEdyYXBoaWNzTGF5
ZXJzLCBidXQgbGVzcyB0aGFuIHRoZSBPcGVuR0wKKy8vIHRleHR1cmUgc2l6ZSBsaW1pdCBvbiBh
bGwgc3VwcG9ydGVkIGhhcmR3YXJlLgorc3RhdGljIGNvbnN0IGludCBjTWF4UGl4ZWxEaW1lbnNp
b24gPSAyMDAwOworCisvLyBUaGUgd2lkdGggYW5kIGhlaWdodCBvZiBhIHNpbmdsZSB0aWxlIGlu
IGEgdGlsZWQgbGF5ZXIuIFNob3VsZCBiZSBsYXJnZSBlbm91Z2ggdG8KKy8vIGF2b2lkIGxvdHMg
b2Ygc21hbGwgdGlsZXMgKGFuZCB0aGVyZWZvcmUgbG90cyBvZiBkcmF3aW5nIGNhbGxiYWNrcyks
IGJ1dCBzbWFsbCBlbm91Z2gKKy8vIHRvIGtlZXAgdGhlIG92ZXJhbGwgdGlsZSBjb3N0IGxvdy4K
K3N0YXRpYyBjb25zdCBpbnQgY1RpbGVkTGF5ZXJUaWxlU2l6ZSA9IDUxMjsKKworc3RhdGljIGlu
bGluZSB2b2lkIGNvcHlUcmFuc2Zvcm0oQ0FUcmFuc2Zvcm0zRCYgdG9UM0QsIGNvbnN0IFRyYW5z
Zm9ybWF0aW9uTWF0cml4JiB0KQoreworICAgIHRvVDNELm0xMSA9IG5hcnJvd1ByZWNpc2lvblRv
RmxvYXQodC5tMTEoKSk7CisgICAgdG9UM0QubTEyID0gbmFycm93UHJlY2lzaW9uVG9GbG9hdCh0
Lm0xMigpKTsKKyAgICB0b1QzRC5tMTMgPSBuYXJyb3dQcmVjaXNpb25Ub0Zsb2F0KHQubTEzKCkp
OworICAgIHRvVDNELm0xNCA9IG5hcnJvd1ByZWNpc2lvblRvRmxvYXQodC5tMTQoKSk7CisgICAg
dG9UM0QubTIxID0gbmFycm93UHJlY2lzaW9uVG9GbG9hdCh0Lm0yMSgpKTsKKyAgICB0b1QzRC5t
MjIgPSBuYXJyb3dQcmVjaXNpb25Ub0Zsb2F0KHQubTIyKCkpOworICAgIHRvVDNELm0yMyA9IG5h
cnJvd1ByZWNpc2lvblRvRmxvYXQodC5tMjMoKSk7CisgICAgdG9UM0QubTI0ID0gbmFycm93UHJl
Y2lzaW9uVG9GbG9hdCh0Lm0yNCgpKTsKKyAgICB0b1QzRC5tMzEgPSBuYXJyb3dQcmVjaXNpb25U
b0Zsb2F0KHQubTMxKCkpOworICAgIHRvVDNELm0zMiA9IG5hcnJvd1ByZWNpc2lvblRvRmxvYXQo
dC5tMzIoKSk7CisgICAgdG9UM0QubTMzID0gbmFycm93UHJlY2lzaW9uVG9GbG9hdCh0Lm0zMygp
KTsKKyAgICB0b1QzRC5tMzQgPSBuYXJyb3dQcmVjaXNpb25Ub0Zsb2F0KHQubTM0KCkpOworICAg
IHRvVDNELm00MSA9IG5hcnJvd1ByZWNpc2lvblRvRmxvYXQodC5tNDEoKSk7CisgICAgdG9UM0Qu
bTQyID0gbmFycm93UHJlY2lzaW9uVG9GbG9hdCh0Lm00MigpKTsKKyAgICB0b1QzRC5tNDMgPSBu
YXJyb3dQcmVjaXNpb25Ub0Zsb2F0KHQubTQzKCkpOworICAgIHRvVDNELm00NCA9IG5hcnJvd1By
ZWNpc2lvblRvRmxvYXQodC5tNDQoKSk7Cit9CisKK1RyYW5zZm9ybWF0aW9uTWF0cml4IENBVG9U
cmFuc2Zvcm0zRChjb25zdCBDQVRyYW5zZm9ybTNEJiBmcm9tVDNEKQoreworICAgIHJldHVybiBU
cmFuc2Zvcm1hdGlvbk1hdHJpeCgKKyAgICAgICAgZnJvbVQzRC5tMTEsCisgICAgICAgIGZyb21U
M0QubTEyLAorICAgICAgICBmcm9tVDNELm0xMywKKyAgICAgICAgZnJvbVQzRC5tMTQsCisgICAg
ICAgIGZyb21UM0QubTIxLAorICAgICAgICBmcm9tVDNELm0yMiwKKyAgICAgICAgZnJvbVQzRC5t
MjMsCisgICAgICAgIGZyb21UM0QubTI0LAorICAgICAgICBmcm9tVDNELm0zMSwKKyAgICAgICAg
ZnJvbVQzRC5tMzIsCisgICAgICAgIGZyb21UM0QubTMzLAorICAgICAgICBmcm9tVDNELm0zNCwK
KyAgICAgICAgZnJvbVQzRC5tNDEsCisgICAgICAgIGZyb21UM0QubTQyLAorICAgICAgICBmcm9t
VDNELm00MywKKyAgICAgICAgZnJvbVQzRC5tNDQpOworfQorCisjaWZuZGVmIE5ERUJVRworc3Rh
dGljIHZvaWQgc2V0TGF5ZXJCb3JkZXJDb2xvcihXS0NBQ0ZMYXllciogbGF5ZXIsIGNvbnN0IENv
bG9yJiBjb2xvcikKK3sKKyAgICBDR0NvbG9yUmVmIGJvcmRlckNvbG9yID0gY3JlYXRlQ0dDb2xv
cihjb2xvcik7CisgICAgbGF5ZXItPnNldEJvcmRlckNvbG9yKGJvcmRlckNvbG9yKTsKKyAgICBD
R0NvbG9yUmVsZWFzZShib3JkZXJDb2xvcik7Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFyQm9yZGVy
Q29sb3IoV0tDQUNGTGF5ZXIqIGxheWVyKQoreworICAgIGxheWVyLT5zZXRCb3JkZXJDb2xvcigw
KTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBzZXRMYXllckJhY2tncm91bmRDb2xvcihXS0NB
Q0ZMYXllciogbGF5ZXIsIGNvbnN0IENvbG9yJiBjb2xvcikKK3sKKyAgICBDR0NvbG9yUmVmIGJn
Q29sb3IgPSBjcmVhdGVDR0NvbG9yKGNvbG9yKTsKKyAgICBsYXllci0+c2V0QmFja2dyb3VuZENv
bG9yKGJnQ29sb3IpOworICAgIENHQ29sb3JSZWxlYXNlKGJnQ29sb3IpOworfQorCitzdGF0aWMg
dm9pZCBjbGVhckxheWVyQmFja2dyb3VuZENvbG9yKFdLQ0FDRkxheWVyKiBsYXllcikKK3sKKyAg
ICBsYXllci0+c2V0QmFja2dyb3VuZENvbG9yKDApOworfQorCitHcmFwaGljc0xheWVyOjpDb21w
b3NpdGluZ0Nvb3JkaW5hdGVzT3JpZW50YXRpb24gR3JhcGhpY3NMYXllcjo6Y29tcG9zaXRpbmdD
b29yZGluYXRlc09yaWVudGF0aW9uKCkKK3sKKyAgICByZXR1cm4gQ29tcG9zaXRpbmdDb29yZGlu
YXRlc0JvdHRvbVVwOworfQorCitQYXNzT3duUHRyPEdyYXBoaWNzTGF5ZXI+IEdyYXBoaWNzTGF5
ZXI6OmNyZWF0ZShHcmFwaGljc0xheWVyQ2xpZW50KiBjbGllbnQpCit7CisgICAgcmV0dXJuIG5l
dyBHcmFwaGljc0xheWVyQ0FDRihjbGllbnQpOworfQorCitHcmFwaGljc0xheWVyQ0FDRjo6R3Jh
cGhpY3NMYXllckNBQ0YoR3JhcGhpY3NMYXllckNsaWVudCogY2xpZW50KQorOiBHcmFwaGljc0xh
eWVyKGNsaWVudCkKKywgbV9jb250ZW50c0xheWVyUHVycG9zZShOb0NvbnRlbnRzTGF5ZXIpCit7
CisgICAgbV9sYXllciA9IFdLQ0FDRkxheWVyOjpjcmVhdGUoa0NBQ0ZMYXllciwgdGhpcyk7Cisg
ICAgCisjaWZuZGVmIE5ERUJVRworICAgIHVwZGF0ZURlYnVnSW5kaWNhdG9ycygpOworI2VuZGlm
Cit9CisKK0dyYXBoaWNzTGF5ZXJDQUNGOjp+R3JhcGhpY3NMYXllckNBQ0YoKQoreworICAgIC8v
IGNsZWFuIHVwIHRoZSBXSyBsYXllcgorICAgIGlmIChtX2xheWVyKQorICAgICAgICBtX2xheWVy
LT5yZW1vdmVGcm9tU3VwZXJsYXllcigpOworICAgIAorICAgIGlmIChtX3RyYW5zZm9ybUxheWVy
KQorICAgICAgICBtX3RyYW5zZm9ybUxheWVyLT5yZW1vdmVGcm9tU3VwZXJsYXllcigpOworfQor
Cit2b2lkIEdyYXBoaWNzTGF5ZXJDQUNGOjpzZXROYW1lKGNvbnN0IFN0cmluZyYgaW5OYW1lKQor
eworICAgIFN0cmluZyBuYW1lID0gU3RyaW5nOjpmb3JtYXQoIkNBTGF5ZXIoJXApIEdyYXBoaWNz
TGF5ZXIoJXApICIsIG1fbGF5ZXIuZ2V0KCksIHRoaXMpICsgaW5OYW1lOworICAgIEdyYXBoaWNz
TGF5ZXI6OnNldE5hbWUobmFtZSk7CisgICAgCisgICAgbV9sYXllci0+c2V0TmFtZShpbk5hbWUp
OworfQorCitOYXRpdmVMYXllciBHcmFwaGljc0xheWVyQ0FDRjo6bmF0aXZlTGF5ZXIoKSBjb25z
dAoreworICAgIHJldHVybiBtX2xheWVyLmdldCgpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJD
QUNGOjphZGRDaGlsZChHcmFwaGljc0xheWVyKiBjaGlsZExheWVyKQoreworICAgIEdyYXBoaWNz
TGF5ZXI6OmFkZENoaWxkKGNoaWxkTGF5ZXIpOworICAgIHVwZGF0ZVN1YmxheWVyTGlzdCgpOwor
fQorCit2b2lkIEdyYXBoaWNzTGF5ZXJDQUNGOjphZGRDaGlsZEF0SW5kZXgoR3JhcGhpY3NMYXll
ciogY2hpbGRMYXllciwgaW50IGluZGV4KQoreworICAgIEdyYXBoaWNzTGF5ZXI6OmFkZENoaWxk
QXRJbmRleChjaGlsZExheWVyLCBpbmRleCk7CisgICAgdXBkYXRlU3VibGF5ZXJMaXN0KCk7Cit9
CisKK3ZvaWQgR3JhcGhpY3NMYXllckNBQ0Y6OmFkZENoaWxkQmVsb3coR3JhcGhpY3NMYXllciog
Y2hpbGRMYXllciwgR3JhcGhpY3NMYXllciogc2libGluZykKK3sKKyAgICBHcmFwaGljc0xheWVy
OjphZGRDaGlsZEJlbG93KGNoaWxkTGF5ZXIsIHNpYmxpbmcpOworICAgIHVwZGF0ZVN1YmxheWVy
TGlzdCgpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJDQUNGOjphZGRDaGlsZEFib3ZlKEdyYXBo
aWNzTGF5ZXIqIGNoaWxkTGF5ZXIsIEdyYXBoaWNzTGF5ZXIgKnNpYmxpbmcpCit7CisgICAgR3Jh
cGhpY3NMYXllcjo6YWRkQ2hpbGRBYm92ZShjaGlsZExheWVyLCBzaWJsaW5nKTsKKyAgICB1cGRh
dGVTdWJsYXllckxpc3QoKTsKK30KKworYm9vbCBHcmFwaGljc0xheWVyQ0FDRjo6cmVwbGFjZUNo
aWxkKEdyYXBoaWNzTGF5ZXIqIG9sZENoaWxkLCBHcmFwaGljc0xheWVyKiBuZXdDaGlsZCkKK3sK
KyAgICBpZiAoR3JhcGhpY3NMYXllcjo6cmVwbGFjZUNoaWxkKG9sZENoaWxkLCBuZXdDaGlsZCkp
IHsKKyAgICAgICAgdXBkYXRlU3VibGF5ZXJMaXN0KCk7CisgICAgICAgIHJldHVybiB0cnVlOwor
ICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckNBQ0Y6OnJl
bW92ZUZyb21QYXJlbnQoKQoreworICAgIEdyYXBoaWNzTGF5ZXI6OnJlbW92ZUZyb21QYXJlbnQo
KTsKKyAgICBsYXllckZvclN1cGVybGF5ZXIoKS0+cmVtb3ZlRnJvbVN1cGVybGF5ZXIoKTsgICAg
ICAgICAgICAKK30KKwordm9pZCBHcmFwaGljc0xheWVyQ0FDRjo6c2V0UG9zaXRpb24oY29uc3Qg
RmxvYXRQb2ludCYgcG9pbnQpCit7CisgICAgR3JhcGhpY3NMYXllcjo6c2V0UG9zaXRpb24ocG9p
bnQpOworCisgICAgLy8gcG9zaXRpb24gaXMgb2Zmc2V0IG9uIHRoZSBsYXllciBieSB0aGUgbGF5
ZXIgYW5jaG9yIHBvaW50CisgICAgQ0dQb2ludCBwb3NQb2ludCA9IENHUG9pbnRNYWtlKG1fcG9z
aXRpb24ueCgpICsgbV9hbmNob3JQb2ludC54KCkgKiBtX3NpemUud2lkdGgoKSwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wb3NpdGlvbi55KCkgKyBtX2FuY2hvclBvaW50
LnkoKSAqIG1fc2l6ZS5oZWlnaHQoKSk7CisgICAgCisgICAgcHJpbWFyeUxheWVyKCktPnNldFBv
c2l0aW9uKHBvc1BvaW50KTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyQ0FDRjo6c2V0QW5jaG9y
UG9pbnQoY29uc3QgRmxvYXRQb2ludDNEJiBwb2ludCkKK3sKKyAgICBHcmFwaGljc0xheWVyOjpz
ZXRBbmNob3JQb2ludChwb2ludCk7CisKKyAgICAvLyBzZXQgdGhlIHZhbHVlIG9uIHRoZSBsYXll
ciB0byB0aGUgbmV3IHRyYW5zZm9ybQorICAgIHByaW1hcnlMYXllcigpLT5zZXRBbmNob3JQb2lu
dChGbG9hdFBvaW50KHBvaW50LngoKSwgcG9pbnQueSgpKSk7CisgICAgcHJpbWFyeUxheWVyKCkt
PnNldEFuY2hvclBvaW50WihtX2FuY2hvclBvaW50LnooKSk7CisKKyAgICAvLyBwb3NpdGlvbiBk
ZXBlbmRzIG9uIGFuY2hvciBwb2ludAorICAgIHNldFBvc2l0aW9uKG1fcG9zaXRpb24pOworfQor
Cit2b2lkIEdyYXBoaWNzTGF5ZXJDQUNGOjpzZXRTaXplKGNvbnN0IEZsb2F0U2l6ZSYgc2l6ZSkK
K3sKKyAgICBHcmFwaGljc0xheWVyOjpzZXRTaXplKHNpemUpOworCisgICAgQ0dSZWN0IHJlY3Qg
PSBDR1JlY3RNYWtlKDAuMGYsIDAuMGYsIG1fc2l6ZS53aWR0aCgpLCBtX3NpemUuaGVpZ2h0KCkp
OworICAgIAorICAgIGlmIChtX3RyYW5zZm9ybUxheWVyKSB7CisgICAgICAgIG1fdHJhbnNmb3Jt
TGF5ZXItPnNldEJvdW5kcyhyZWN0KTsKKyAgICAKKyAgICAgICAgLy8gdGhlIGFuY2hvciBvZiB0
aGUgY29udGVudHMgbGF5ZXIgaXMgYWx3YXlzIGF0IDAuNSwgMC41LCBzbyB0aGUgcG9zaXRpb24K
KyAgICAgICAgLy8gaXMgY2VudGVyLXJlbGF0aXZlCisgICAgICAgIG1fbGF5ZXItPnNldFBvc2l0
aW9uKENHUG9pbnRNYWtlKG1fc2l6ZS53aWR0aCgpIC8gMi4wZiwgbV9zaXplLmhlaWdodCgpIC8g
Mi4wZikpOworICAgIH0KKyAgICAKKyAgICBib29sIG5lZWRUaWxlZExheWVyID0gcmVxdWlyZXNU
aWxlZExheWVyKG1fc2l6ZSk7CisgICAgaWYgKG5lZWRUaWxlZExheWVyICE9IG1fdXNpbmdUaWxl
ZExheWVyKSB7CisgICAgICAgIHN3YXBGcm9tT3JUb1RpbGVkTGF5ZXIobmVlZFRpbGVkTGF5ZXIp
OworICAgIH0KKyAgICAKKyAgICBtX2xheWVyLT5zZXRCb3VuZHMocmVjdCk7CisKKyAgICAvLyBO
b3RlIHRoYXQgd2UgZG9uJ3QgcmVzaXplIG1fY29udGVudHNMYXllci4gSXQncyB1cCB0aGUgY2Fs
bGVyIHRvIGRvIHRoYXQuCisKKyAgICAvLyBpZiB3ZSd2ZSBjaGFuZ2VkIHRoZSBib3VuZHMsIHdl
IG5lZWQgdG8gcmVjYWxjdWxhdGUgdGhlIHBvc2l0aW9uCisgICAgLy8gb2YgdGhlIGxheWVyLCB0
YWtpbmcgYW5jaG9yIHBvaW50IGludG8gYWNjb3VudAorICAgIHNldFBvc2l0aW9uKG1fcG9zaXRp
b24pOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJDQUNGOjpzZXRUcmFuc2Zvcm0oY29uc3QgVHJh
bnNmb3JtYXRpb25NYXRyaXgmIHQpCit7CisgICAgR3JhcGhpY3NMYXllcjo6c2V0VHJhbnNmb3Jt
KHQpOworICAgIAorICAgIENBVHJhbnNmb3JtM0QgdHJhbnNmb3JtOworICAgIGNvcHlUcmFuc2Zv
cm0odHJhbnNmb3JtLCB0KTsKKyAgICBwcmltYXJ5TGF5ZXIoKS0+c2V0VHJhbnNmb3JtKHRyYW5z
Zm9ybSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckNBQ0Y6OnNldENoaWxkcmVuVHJhbnNmb3Jt
KGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiB0KQoreworICAgIEdyYXBoaWNzTGF5ZXI6OnNl
dENoaWxkcmVuVHJhbnNmb3JtKHQpOworCisgICAgQ0FUcmFuc2Zvcm0zRCB0cmFuc2Zvcm07Cisg
ICAgY29weVRyYW5zZm9ybSh0cmFuc2Zvcm0sIHQpOworICAgIHByaW1hcnlMYXllcigpLT5zZXRT
dWJsYXllclRyYW5zZm9ybSh0cmFuc2Zvcm0pOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJDQUNG
OjpzZXRQcmVzZXJ2ZXMzRChib29sIHByZXNlcnZlczNEKQoreworICAgIEdyYXBoaWNzTGF5ZXI6
OnNldFByZXNlcnZlczNEKHByZXNlcnZlczNEKTsKKworICAgIENHUG9pbnQgcG9pbnQgPSBDR1Bv
aW50TWFrZShtX3NpemUud2lkdGgoKSAvIDIuMGYsIG1fc2l6ZS5oZWlnaHQoKSAvIDIuMGYpOwor
ICAgIENHUG9pbnQgY2VudGVyUG9pbnQgPSBDR1BvaW50TWFrZSgwLjVmLCAwLjVmKTsKKyAgICAK
KyAgICBpZiAocHJlc2VydmVzM0QgJiYgIW1fdHJhbnNmb3JtTGF5ZXIpIHsKKyAgICAgICAgLy8g
Y3JlYXRlIHRoZSB0cmFuc2Zvcm0gbGF5ZXIKKyAgICAgICAgbV90cmFuc2Zvcm1MYXllciA9IFdL
Q0FDRkxheWVyOjpjcmVhdGUoa0NBQ0ZUcmFuc2Zvcm1MYXllciwgdGhpcyk7CisgICAgICAgIAor
I2lmbmRlZiBOREVCVUcKKyAgICAgICAgbV90cmFuc2Zvcm1MYXllci0+c2V0TmFtZShTdHJpbmco
KS5mb3JtYXQoIlRyYW5zZm9ybSBMYXllciBDQVRyYW5zZm9ybUxheWVyKCVwKSBHcmFwaGljc0xh
eWVyKCVwKSIsIG1fdHJhbnNmb3JtTGF5ZXIuZ2V0KCksIHRoaXMpKTsKKyNlbmRpZgorICAgICAg
ICAKKyAgICAgICAgLy8gY29weSB0aGUgcG9zaXRpb24gZnJvbSB0aGlzIGxheWVyCisgICAgICAg
IG1fdHJhbnNmb3JtTGF5ZXItPnNldEJvdW5kcyhtX2xheWVyLT5ib3VuZHMoKSk7CisgICAgICAg
IG1fdHJhbnNmb3JtTGF5ZXItPnNldFBvc2l0aW9uKG1fbGF5ZXItPnBvc2l0aW9uKCkpOworICAg
ICAgICBtX3RyYW5zZm9ybUxheWVyLT5zZXRaUG9zaXRpb24obV9sYXllci0+elBvc2l0aW9uKCkp
OworICAgICAgICBtX3RyYW5zZm9ybUxheWVyLT5zZXRBbmNob3JQb2ludChtX2xheWVyLT5hbmNo
b3JQb2ludCgpKTsKKyAgICAgICAgbV90cmFuc2Zvcm1MYXllci0+c2V0QW5jaG9yUG9pbnRaKG1f
bGF5ZXItPmFuY2hvclBvaW50WigpKTsKKyAgICAgICAgbV90cmFuc2Zvcm1MYXllci0+c2V0Q29u
dGVudHNSZWN0KG1fbGF5ZXItPmNvbnRlbnRzUmVjdCgpKTsKKyAgICAgICAgCisgICAgICAgIC8v
IFRoZSBjb250ZW50cyBsYXllciBpcyBwb3NpdGlvbmVkIGF0ICgwLDApIHJlbGF0aXZlIHRvIHRo
ZSB0cmFuc2Zvcm1MYXllci4KKyAgICAgICAgbV9sYXllci0+c2V0UG9zaXRpb24ocG9pbnQpOwor
ICAgICAgICBtX2xheWVyLT5zZXRaUG9zaXRpb24oMC4wZik7CisgICAgICAgIG1fbGF5ZXItPnNl
dEFuY2hvclBvaW50KGNlbnRlclBvaW50KTsKKyAgICAgICAgCisgICAgICAgIC8vIFRyYW5zZmVy
IHRoZSB0cmFuc2Zvcm0gb3ZlcgorICAgICAgICBtX3RyYW5zZm9ybUxheWVyLT5zZXRUcmFuc2Zv
cm0obV9sYXllci0+dHJhbnNmb3JtKCkpOworICAgICAgICBtX2xheWVyLT5zZXRUcmFuc2Zvcm0o
Q0FUcmFuc2Zvcm0zRElkZW50aXR5KTsKKyAgICAgICAgCisgICAgICAgIC8vIFRyYW5zZmVyIHRo
ZSBvcGFjaXR5IGZyb20gdGhlIG9sZCBsYXllciB0byB0aGUgdHJhbnNmb3JtIGxheWVyCisgICAg
ICAgIG1fdHJhbnNmb3JtTGF5ZXItPnNldE9wYWNpdHkobV9vcGFjaXR5KTsKKyAgICAgICAgbV9s
YXllci0+c2V0T3BhY2l0eSgxKTsKKworICAgICAgICAvLyBtb3ZlIHRoaXMgbGF5ZXIgdG8gYmUg
YSBjaGlsZCBvZiB0aGUgdHJhbnNmb3JtIGxheWVyCisJCWlmIChtX2xheWVyLT5zdXBlcmxheWVy
KCkpCisJCQltX2xheWVyLT5zdXBlcmxheWVyKCktPnJlcGxhY2VTdWJsYXllcihtX2xheWVyLmdl
dCgpLCBtX3RyYW5zZm9ybUxheWVyLmdldCgpKTsKKyAgICAgICAgbV90cmFuc2Zvcm1MYXllci0+
YWRkU3VibGF5ZXIobV9sYXllci5nZXQoKSk7CisKKyAgICAgICAgV0tDQUNGTGF5ZXI6Om1vdmVT
dWJsYXllcnMobV9sYXllci5nZXQoKSwgbV90cmFuc2Zvcm1MYXllci5nZXQoKSk7CisgICAgfSBl
bHNlIGlmICghcHJlc2VydmVzM0QgJiYgbV90cmFuc2Zvcm1MYXllcikgeworICAgICAgICAvLyBS
ZWxhY2UgdGhlIHRyYW5zZm9ybUxheWVyIGluIHRoZSBwYXJlbnQgd2l0aCB0aGlzIGxheWVyLgor
ICAgICAgICBtX2xheWVyLT5yZW1vdmVGcm9tU3VwZXJsYXllcigpOworCQlpZiAobV90cmFuc2Zv
cm1MYXllci0+c3VwZXJsYXllcigpKQorCQkJbV90cmFuc2Zvcm1MYXllci0+c3VwZXJsYXllcigp
LT5yZXBsYWNlU3VibGF5ZXIobV90cmFuc2Zvcm1MYXllci5nZXQoKSwgbV9sYXllci5nZXQoKSk7
CisKKyAgICAgICAgV0tDQUNGTGF5ZXI6Om1vdmVTdWJsYXllcnMobV90cmFuc2Zvcm1MYXllci5n
ZXQoKSwgbV9sYXllci5nZXQoKSk7CisKKyAgICAgICAgLy8gcmVzZXQgdGhlIGxheWVyIHBvc2l0
aW9uIGFuZCB0cmFuc2Zvcm0KKyAgICAgICAgbV9sYXllci0+c2V0UG9zaXRpb24obV90cmFuc2Zv
cm1MYXllci0+cG9zaXRpb24oKSk7CisgICAgICAgIG1fbGF5ZXItPnNldFpQb3NpdGlvbihtX3Ry
YW5zZm9ybUxheWVyLT56UG9zaXRpb24oKSk7CisgICAgICAgIG1fbGF5ZXItPnNldEFuY2hvclBv
aW50KG1fdHJhbnNmb3JtTGF5ZXItPmFuY2hvclBvaW50KCkpOworICAgICAgICBtX2xheWVyLT5z
ZXRBbmNob3JQb2ludFoobV90cmFuc2Zvcm1MYXllci0+YW5jaG9yUG9pbnRaKCkpOworICAgICAg
ICBtX2xheWVyLT5zZXRDb250ZW50c1JlY3QobV90cmFuc2Zvcm1MYXllci0+Y29udGVudHNSZWN0
KCkpOworICAgICAgICBtX2xheWVyLT5zZXRUcmFuc2Zvcm0obV90cmFuc2Zvcm1MYXllci0+dHJh
bnNmb3JtKCkpOworICAgICAgICBtX2xheWVyLT5zZXRPcGFjaXR5KG1fdHJhbnNmb3JtTGF5ZXIt
Pm9wYWNpdHkoKSk7CisKKyAgICAgICAgLy8gZW1wdHkgdGhlIHRyYW5zZm9ybSBsYXllcgorICAg
ICAgICBtX3RyYW5zZm9ybUxheWVyID0gMDsKKyAgICB9Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXll
ckNBQ0Y6OnNldE1hc2tzVG9Cb3VuZHMoYm9vbCBtYXNrc1RvQm91bmRzKQoreworICAgIGlmICht
YXNrc1RvQm91bmRzID09IG1fbWFza3NUb0JvdW5kcykKKyAgICAgICAgcmV0dXJuOworCisgICAg
R3JhcGhpY3NMYXllcjo6c2V0TWFza3NUb0JvdW5kcyhtYXNrc1RvQm91bmRzKTsKKworICAgIG1f
bGF5ZXItPnNldE1hc2tzVG9Cb3VuZHMobWFza3NUb0JvdW5kcyk7CisKKyNpZm5kZWYgTkRFQlVH
CisgICAgdXBkYXRlRGVidWdJbmRpY2F0b3JzKCk7CisjZW5kaWYKK30KKwordm9pZCBHcmFwaGlj
c0xheWVyQ0FDRjo6c2V0RHJhd3NDb250ZW50KGJvb2wgaW5EcmF3c0NvbnRlbnQpCit7CisgICAg
aWYgKGluRHJhd3NDb250ZW50ICE9IG1fZHJhd3NDb250ZW50KSB7CisgICAgICAgIAorICAgICAg
ICBHcmFwaGljc0xheWVyOjpzZXREcmF3c0NvbnRlbnQoaW5EcmF3c0NvbnRlbnQpOworCisgICAg
ICAgIGJvb2wgbmVlZFRpbGVkTGF5ZXIgPSByZXF1aXJlc1RpbGVkTGF5ZXIobV9zaXplKTsKKyAg
ICAgICAgaWYgKG5lZWRUaWxlZExheWVyICE9IG1fdXNpbmdUaWxlZExheWVyKQorICAgICAgICAg
ICAgc3dhcEZyb21PclRvVGlsZWRMYXllcihuZWVkVGlsZWRMYXllcik7CisKKyAgICAgICAgIGlm
IChtX2RyYXdzQ29udGVudCkKKyAgICAgICAgICAgIG1fbGF5ZXItPnNldE5lZWRzRGlzcGxheSgp
OworICAgICAgICBlbHNlCisgICAgICAgICAgICBtX2xheWVyLT5zZXRDb250ZW50cygwKTsKKyAg
ICAgICAgCisjaWZuZGVmIE5ERUJVRworICAgICAgICB1cGRhdGVEZWJ1Z0luZGljYXRvcnMoKTsK
KyNlbmRpZgorICAgIH0KK30KKwordm9pZCBHcmFwaGljc0xheWVyQ0FDRjo6c2V0QmFja2dyb3Vu
ZENvbG9yKGNvbnN0IENvbG9yJiBjb2xvcikKK3sKKyAgICBpZiAobV9iYWNrZ3JvdW5kQ29sb3JT
ZXQgJiYgbV9iYWNrZ3JvdW5kQ29sb3IgPT0gY29sb3IpCisgICAgICAgIHJldHVybjsKKworICAg
IEdyYXBoaWNzTGF5ZXI6OnNldEJhY2tncm91bmRDb2xvcihjb2xvcik7CisKKyAgICBpZiAoIW1f
Y29udGVudHNMYXllcikKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gV2UgbmV2ZXIgY3JlYXRl
IHRoZSBjb250ZW50cyBsYXllciBqdXN0IGZvciBiYWNrZ3JvdW5kIGNvbG9yIHlldC4KKyAgICBz
ZXRMYXllckJhY2tncm91bmRDb2xvcihtX2NvbnRlbnRzTGF5ZXIuZ2V0KCksIG1fYmFja2dyb3Vu
ZENvbG9yKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyQ0FDRjo6Y2xlYXJCYWNrZ3JvdW5kQ29s
b3IoKQoreworICAgIGlmICghbV9iYWNrZ3JvdW5kQ29sb3JTZXQpCisgICAgICAgIHJldHVybjsK
KworICAgIEdyYXBoaWNzTGF5ZXI6OmNsZWFyQmFja2dyb3VuZENvbG9yKCk7CisgICAgY2xlYXJM
YXllckJhY2tncm91bmRDb2xvcihtX2NvbnRlbnRzTGF5ZXIuZ2V0KCkpOworfQorCit2b2lkIEdy
YXBoaWNzTGF5ZXJDQUNGOjpzZXRDb250ZW50c09wYXF1ZShib29sIGluT3BhcXVlKQoreworICAg
IEdyYXBoaWNzTGF5ZXI6OnNldENvbnRlbnRzT3BhcXVlKGluT3BhcXVlKTsKKworICAgIG1fbGF5
ZXItPnNldE9wYXF1ZShtX2NvbnRlbnRzT3BhcXVlKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVy
Q0FDRjo6c2V0QmFja2ZhY2VWaXNpYmlsaXR5KGJvb2wgdmlzaWJsZSkKK3sKKyAgICBpZiAobV9i
YWNrZmFjZVZpc2liaWxpdHkgPT0gdmlzaWJsZSkKKyAgICAgICAgcmV0dXJuOworICAgIAorICAg
IEdyYXBoaWNzTGF5ZXI6OnNldEJhY2tmYWNlVmlzaWJpbGl0eSh2aXNpYmxlKTsKKyAgICAKKyAg
ICBtX2xheWVyLT5zZXREb3VibGVTaWRlZCh2aXNpYmxlKTsKK30KKyAgICAKK3ZvaWQgR3JhcGhp
Y3NMYXllckNBQ0Y6OnNldE9wYWNpdHkoZmxvYXQgb3BhY2l0eSkKK3sKKyAgICBmbG9hdCBjbGFt
cGVkT3BhY2l0eSA9IG1heChtaW4ob3BhY2l0eSwgMS4wZiksIDAuMGYpOworICAgIAorICAgIGJv
b2wgb3BhY2l0aWVzRGlmZmVyID0gKG1fb3BhY2l0eSAhPSBjbGFtcGVkT3BhY2l0eSk7CisgICAg
CisgICAgR3JhcGhpY3NMYXllcjo6c2V0T3BhY2l0eShjbGFtcGVkT3BhY2l0eSk7CisgICAgcHJp
bWFyeUxheWVyKCktPnNldE9wYWNpdHkob3BhY2l0eSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXll
ckNBQ0Y6OnNldE5lZWRzRGlzcGxheSgpCit7CisgICAgaWYgKGRyYXdzQ29udGVudCgpKQorICAg
ICAgICBtX2xheWVyLT5zZXROZWVkc0Rpc3BsYXkoKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVy
Q0FDRjo6c2V0TmVlZHNEaXNwbGF5SW5SZWN0KGNvbnN0IEZsb2F0UmVjdCYgcmVjdCkKK3sKKyAg
ICBpZiAoZHJhd3NDb250ZW50KCkpCisgICAgICAgIG1fbGF5ZXItPnNldE5lZWRzRGlzcGxheShy
ZWN0KTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyQ0FDRjo6c2V0Q29udGVudHNSZWN0KGNvbnN0
IEludFJlY3QmIHJlY3QpCit7CisgICAgaWYgKHJlY3QgPT0gbV9jb250ZW50c1JlY3QpCisgICAg
ICAgIHJldHVybjsKKworICAgIEdyYXBoaWNzTGF5ZXI6OnNldENvbnRlbnRzUmVjdChyZWN0KTsK
KyAgICB1cGRhdGVDb250ZW50c1JlY3QoKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyQ0FDRjo6
c2V0Q29udGVudHNUb0ltYWdlKEltYWdlKiBpbWFnZSkKK3sKKyAgICBpZiAoaW1hZ2UpIHsKKyAg
ICAgICAgaWYgKCFtX2NvbnRlbnRzTGF5ZXIuZ2V0KCkpIHsKKworICAgICAgICAgICAgUmVmUHRy
PFdLQ0FDRkxheWVyPiBpbWFnZUxheWVyID0gV0tDQUNGTGF5ZXI6OmNyZWF0ZShrQ0FDRkxheWVy
LCB0aGlzKTsKKyNpZm5kZWYgTkRFQlVHCisgICAgICAgICAgICBpbWFnZUxheWVyLT5zZXROYW1l
KCJJbWFnZSBMYXllciIpOworI2VuZGlmCisgICAgICAgICAgICBzZXR1cENvbnRlbnRzTGF5ZXIo
aW1hZ2VMYXllci5nZXQoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBGSVhNRTogbWF5YmUg
b25seSBkbyB0cmlsaW5lYXIgaWYgdGhlIGltYWdlIGlzIGJlaW5nIHNjYWxlZCBkb3duLAorICAg
ICAgICAvLyBidXQgdGhlbiB3aGF0IGlmIHRoZSBsYXllciBzaXplIGNoYW5nZXM/CisgICAgICAg
IG1fY29udGVudHNMYXllci0+c2V0TWluaWZpY2F0aW9uRmlsdGVyKGtDQUNGRmlsdGVyVHJpbGlu
ZWFyKTsKKyAgICAgICAgQ0dJbWFnZVJlZiB0aGVJbWFnZSA9IGltYWdlLT5uYXRpdmVJbWFnZUZv
ckN1cnJlbnRGcmFtZSgpOworICAgICAgICBtX2NvbnRlbnRzTGF5ZXItPnNldENvbnRlbnRzKHRo
ZUltYWdlKTsKKyAgICB9IGVsc2UKKyAgICAgICAgc2V0dXBDb250ZW50c0xheWVyKDApOworCisg
ICAgbV9jb250ZW50c0xheWVyUHVycG9zZSA9IChpbWFnZSAhPSAwKSA/IENvbnRlbnRzTGF5ZXJG
b3JJbWFnZSA6IE5vQ29udGVudHNMYXllcjsKK30KKwordm9pZCBHcmFwaGljc0xheWVyQ0FDRjo6
c2V0Q29udGVudHNUb1ZpZGVvKFBsYXRmb3JtTGF5ZXIqIHZpZGVvTGF5ZXIpCit7CisgICAgc2V0
dXBDb250ZW50c0xheWVyKHZpZGVvTGF5ZXIpOworICAgIG1fY29udGVudHNMYXllclB1cnBvc2Ug
PSAodmlkZW9MYXllciAhPSAwKSA/IENvbnRlbnRzTGF5ZXJGb3JWaWRlbyA6IE5vQ29udGVudHNM
YXllcjsKK30KKwordm9pZCBHcmFwaGljc0xheWVyQ0FDRjo6dXBkYXRlQ29udGVudHNSZWN0KCkK
K3sKKyAgICBpZiAoIW1fY29udGVudHNMYXllcikKKyAgICAgICAgcmV0dXJuOworICAgICAgICAK
KyAgICBDR1BvaW50IHBvaW50ID0gQ0dQb2ludE1ha2UobV9jb250ZW50c1JlY3QueCgpLAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2NvbnRlbnRzUmVjdC55KCkpOworICAgIENH
UmVjdCByZWN0ID0gQ0dSZWN0TWFrZSgwLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAwLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2NvbnRlbnRzUmVjdC53aWR0
aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2NvbnRlbnRzUmVjdC5oZWlnaHQo
KSk7CisKKyAgICBtX2NvbnRlbnRzTGF5ZXItPnNldFBvc2l0aW9uKHBvaW50KTsKKyAgICBtX2Nv
bnRlbnRzTGF5ZXItPnNldEJvdW5kcyhyZWN0KTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyQ0FD
Rjo6c2V0R2VvbWV0cnlPcmllbnRhdGlvbihDb21wb3NpdGluZ0Nvb3JkaW5hdGVzT3JpZW50YXRp
b24gb3JpZW50YXRpb24pCit7CisgICAgc3dpdGNoIChvcmllbnRhdGlvbikgeworICAgIGNhc2Ug
Q29tcG9zaXRpbmdDb29yZGluYXRlc1RvcERvd246CisgICAgICAgIG1fbGF5ZXItPnNldEdlb21l
dHJ5RmxpcHBlZChmYWxzZSk7CisgICAgICAgIGJyZWFrOworICAgICAgICAKKyAgICBjYXNlIENv
bXBvc2l0aW5nQ29vcmRpbmF0ZXNCb3R0b21VcDoKKyAgICAgICAgbV9sYXllci0+c2V0R2VvbWV0
cnlGbGlwcGVkKHRydWUpOworICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK1BsYXRmb3JtTGF5
ZXIqIEdyYXBoaWNzTGF5ZXJDQUNGOjpob3N0TGF5ZXJGb3JTdWJsYXllcnMoKSBjb25zdAorewor
ICAgIHJldHVybiBtX3RyYW5zZm9ybUxheWVyID8gbV90cmFuc2Zvcm1MYXllci5nZXQoKSA6IG1f
bGF5ZXIuZ2V0KCk7Cit9CisKK1BsYXRmb3JtTGF5ZXIqIEdyYXBoaWNzTGF5ZXJDQUNGOjpsYXll
ckZvclN1cGVybGF5ZXIoKSBjb25zdAoreworICAgIGlmIChtX3RyYW5zZm9ybUxheWVyKQorICAg
ICAgICByZXR1cm4gbV90cmFuc2Zvcm1MYXllci5nZXQoKTsKKworICAgIHJldHVybiBtX2xheWVy
LmdldCgpOworfQorCitQbGF0Zm9ybUxheWVyKiBHcmFwaGljc0xheWVyQ0FDRjo6cGxhdGZvcm1M
YXllcigpIGNvbnN0Cit7CisgICAgcmV0dXJuIHByaW1hcnlMYXllcigpOworfQorCisjaWZuZGVm
IE5ERUJVRwordm9pZCBHcmFwaGljc0xheWVyQ0FDRjo6c2V0RGVidWdCYWNrZ3JvdW5kQ29sb3Io
Y29uc3QgQ29sb3ImIGNvbG9yKQoreworICAgIGlmIChjb2xvci5pc1ZhbGlkKCkpCisgICAgICAg
IHNldExheWVyQmFja2dyb3VuZENvbG9yKG1fbGF5ZXIuZ2V0KCksIGNvbG9yKTsKKyAgICBlbHNl
CisgICAgICAgIGNsZWFyTGF5ZXJCYWNrZ3JvdW5kQ29sb3IobV9sYXllci5nZXQoKSk7Cit9CisK
K3ZvaWQgR3JhcGhpY3NMYXllckNBQ0Y6OnNldERlYnVnQm9yZGVyKGNvbnN0IENvbG9yJiBjb2xv
ciwgZmxvYXQgYm9yZGVyV2lkdGgpCit7CisgICAgaWYgKGNvbG9yLmlzVmFsaWQoKSkgeworICAg
ICAgICBzZXRMYXllckJvcmRlckNvbG9yKG1fbGF5ZXIuZ2V0KCksIGNvbG9yKTsKKyAgICAgICAg
bV9sYXllci0+c2V0Qm9yZGVyV2lkdGgoYm9yZGVyV2lkdGgpOworICAgIH0gZWxzZSB7CisgICAg
ICAgIGNsZWFyQm9yZGVyQ29sb3IobV9sYXllci5nZXQoKSk7CisgICAgICAgIG1fbGF5ZXItPnNl
dEJvcmRlcldpZHRoKDApOworICAgIH0KK30KKyNlbmRpZgorCitib29sIEdyYXBoaWNzTGF5ZXJD
QUNGOjpyZXF1aXJlc1RpbGVkTGF5ZXIoY29uc3QgRmxvYXRTaXplJiBzaXplKSBjb25zdAorewor
ICAgIGlmICghbV9kcmF3c0NvbnRlbnQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8v
IEZJWE1FOiBjYXRjaCB6ZXJvLXNpemUgaGVpZ2h0IG9yIHdpZHRoIGhlcmUgKG9yIGVhcmxpZXIp
PworICAgIHJldHVybiBzaXplLndpZHRoKCkgPiBjTWF4UGl4ZWxEaW1lbnNpb24gfHwgc2l6ZS5o
ZWlnaHQoKSA+IGNNYXhQaXhlbERpbWVuc2lvbjsKK30KKworR3JhcGhpY3NMYXllcjo6Q29tcG9z
aXRpbmdDb29yZGluYXRlc09yaWVudGF0aW9uIEdyYXBoaWNzTGF5ZXJDQUNGOjpkZWZhdWx0Q29u
dGVudHNPcmllbnRhdGlvbigpIGNvbnN0Cit7CisgICAgcmV0dXJuIENvbXBvc2l0aW5nQ29vcmRp
bmF0ZXNCb3R0b21VcDsKK30KKwordm9pZCBHcmFwaGljc0xheWVyQ0FDRjo6dXBkYXRlQ29udGVu
dHNUcmFuc2Zvcm0oKQoreworICAgIEFTU0VSVChjb250ZW50c09yaWVudGF0aW9uKCkgPT0gQ29t
cG9zaXRpbmdDb29yZGluYXRlc1RvcERvd24pOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJDQUNG
Ojp1cGRhdGVTdWJsYXllckxpc3QoKQoreworICAgIFZlY3RvcjxSZWZQdHI8V0tDQUNGTGF5ZXI+
ID4gbmV3U3VibGF5ZXJzOworCisgICAgaWYgKG1fdHJhbnNmb3JtTGF5ZXIpIHsKKyAgICAgICAg
Ly8gQWRkIHRoZSBwcmltYXJ5IGxheWVyIGZpcnN0LiBFdmVuIGlmIHdlIGhhdmUgbmVnYXRpdmUg
ei1vcmRlciBjaGlsZHJlbiwgdGhlIHByaW1hcnkgbGF5ZXIgYWx3YXlzIGNvbWVzIGJlaGluZC4K
KyAgICAgICAgbmV3U3VibGF5ZXJzLmFwcGVuZChtX2xheWVyLmdldCgpKTsKKyAgICB9IGVsc2Ug
aWYgKG1fY29udGVudHNMYXllcikgeworICAgICAgICAvLyBGSVhNRTogYWRkIHRoZSBjb250ZW50
cyBsYXllciBpbiB0aGUgY29ycmVjdCBvcmRlciB3aXRoIG5lZ2F0aXZlIHotb3JkZXIgY2hpbGRy
ZW4uCisgICAgICAgIC8vIFRoaXMgZG9lcyBub3QgY2F1c2UgdmlzaWJsZSByZW5kZXJpbmcgaXNz
dWVzIGJlY2F1c2UgY3VycmVudGx5IGNvbnRlbnRzIGxheWVycyBhcmUgb25seSB1c2VkCisgICAg
ICAgIC8vIGZvciByZXBsYWNlZCBlbGVtZW50cyB0aGF0IGRvbid0IGhhdmUgY2hpbGRyZW4uCisg
ICAgICAgIG5ld1N1YmxheWVycy5hcHBlbmQobV9jb250ZW50c0xheWVyLmdldCgpKTsKKyAgICB9
CisgICAgCisgICAgY29uc3QgVmVjdG9yPEdyYXBoaWNzTGF5ZXIqPiYgY2hpbGRMYXllcnMgPSBj
aGlsZHJlbigpOworICAgIHNpemVfdCBudW1DaGlsZHJlbiA9IGNoaWxkTGF5ZXJzLnNpemUoKTsK
KyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bUNoaWxkcmVuOyArK2kpIHsKKyAgICAgICAg
R3JhcGhpY3NMYXllckNBQ0YqIGN1ckNoaWxkID0gc3RhdGljX2Nhc3Q8R3JhcGhpY3NMYXllckNB
Q0YqPihjaGlsZExheWVyc1tpXSk7CisgICAgIAorICAgICAgICBXS0NBQ0ZMYXllciogY2hpbGRM
YXllciA9IGN1ckNoaWxkLT5sYXllckZvclN1cGVybGF5ZXIoKTsKKyAgICAgICAgbmV3U3VibGF5
ZXJzLmFwcGVuZChjaGlsZExheWVyKTsKKyAgICB9CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8
IG5ld1N1YmxheWVycy5zaXplKCk7ICsraSkKKyAgICAgICAgbmV3U3VibGF5ZXJzW2ldLT5yZW1v
dmVGcm9tU3VwZXJsYXllcigpOworCisgICAgaWYgKG1fdHJhbnNmb3JtTGF5ZXIpIHsKKyAgICAg
ICAgbV90cmFuc2Zvcm1MYXllci0+c2V0U3VibGF5ZXJzKG5ld1N1YmxheWVycyk7CisKKyAgICAg
ICAgaWYgKG1fY29udGVudHNMYXllcikgeworICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIHRy
YW5zZm9ybSBsYXllciwgdGhlbiB0aGUgY29udGVudHMgbGF5ZXIgaXMgcGFyZW50ZWQgaW4gdGhl
IAorICAgICAgICAgICAgLy8gcHJpbWFyeSBsYXllciAod2hpY2ggaXMgaXRzZWxmIGEgY2hpbGQg
b2YgdGhlIHRyYW5zZm9ybSBsYXllcikuCisgICAgICAgICAgICBtX2xheWVyLT5yZW1vdmVBbGxT
dWJsYXllcnMoKTsKKyAgICAgICAgICAgIG1fbGF5ZXItPmFkZFN1YmxheWVyKG1fY29udGVudHNM
YXllcik7CisgICAgICAgIH0KKyAgICB9IGVsc2UKKyAgICAgICAgbV9sYXllci0+c2V0U3VibGF5
ZXJzKG5ld1N1YmxheWVycyk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckNBQ0Y6OnNldHVwQ29u
dGVudHNMYXllcihXS0NBQ0ZMYXllciogY29udGVudHNMYXllcikKK3sKKyAgICBpZiAoY29udGVu
dHNMYXllciA9PSBtX2NvbnRlbnRzTGF5ZXIpCisgICAgICAgIHJldHVybjsKKworICAgIGlmICht
X2NvbnRlbnRzTGF5ZXIpIHsKKyAgICAgICAgbV9jb250ZW50c0xheWVyLT5yZW1vdmVGcm9tU3Vw
ZXJsYXllcigpOworICAgICAgICBtX2NvbnRlbnRzTGF5ZXIgPSAwOworICAgIH0KKyAgICAKKyAg
ICBpZiAoY29udGVudHNMYXllcikgeworICAgICAgICBtX2NvbnRlbnRzTGF5ZXIgPSBjb250ZW50
c0xheWVyOworCisgICAgICAgIGlmIChkZWZhdWx0Q29udGVudHNPcmllbnRhdGlvbigpID09IENv
bXBvc2l0aW5nQ29vcmRpbmF0ZXNCb3R0b21VcCkgeworICAgICAgICAgICAgQ0FUcmFuc2Zvcm0z
RCBmbGlwcGVyID0geworICAgICAgICAgICAgICAgIDEuMGYsIDAuMGYsIDAuMGYsIDAuMGYsCisg
ICAgICAgICAgICAgICAgMC4wZiwgLTEuMGYsIDAuMGYsIDAuMGYsCisgICAgICAgICAgICAgICAg
MC4wZiwgMC4wZiwgMS4wZiwgMC4wZiwKKyAgICAgICAgICAgICAgICAwLjBmLCAwLjBmLCAwLjBm
LCAxLjBmfTsKKyAgICAgICAgICAgIG1fY29udGVudHNMYXllci0+c2V0VHJhbnNmb3JtKGZsaXBw
ZXIpOworICAgICAgICAgICAgbV9jb250ZW50c0xheWVyLT5zZXRBbmNob3JQb2ludChDR1BvaW50
TWFrZSgwLjBmLCAxLjBmKSk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgbV9jb250ZW50
c0xheWVyLT5zZXRBbmNob3JQb2ludChDR1BvaW50TWFrZSgwLjBmLCAwLjBmKSk7CisKKyAgICAg
ICAgLy8gSW5zZXJ0IHRoZSBjb250ZW50IGxheWVyIGZpcnN0LiBWaWRlbyBlbGVtZW50cyByZXF1
aXJlIHRoaXMsIGJlY2F1c2UgdGhleSBoYXZlCisgICAgICAgIC8vIHNoYWRvdyBjb250ZW50IHRo
YXQgbXVzdCBkaXNwbGF5IGluIGZyb250IG9mIHRoZSB2aWRlby4KKyAgICAgICAgbV9sYXllci0+
aW5zZXJ0U3VibGF5ZXIobV9jb250ZW50c0xheWVyLmdldCgpLCAwKTsKKworICAgICAgICB1cGRh
dGVDb250ZW50c1JlY3QoKTsKKworI2lmbmRlZiBOREVCVUcKKyAgICAgICAgaWYgKHNob3dEZWJ1
Z0JvcmRlcnMoKSkgeworICAgICAgICAgICAgc2V0TGF5ZXJCb3JkZXJDb2xvcihtX2NvbnRlbnRz
TGF5ZXIuZ2V0KCksIENvbG9yKDAsIDAsIDEyOCwgMTgwKSk7CisgICAgICAgICAgICBtX2NvbnRl
bnRzTGF5ZXItPnNldEJvcmRlcldpZHRoKDEuMGYpOworICAgICAgICB9CisjZW5kaWYKKyAgICB9
CisjaWZuZGVmIE5ERUJVRworICAgIHVwZGF0ZURlYnVnSW5kaWNhdG9ycygpOworI2VuZGlmCit9
CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIFVTRShBQ0NFTEVSQVRFRF9D
T01QT1NJVElORykKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0dyYXBoaWNz
TGF5ZXJDQUNGLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4v
R3JhcGhpY3NMYXllckNBQ0YuaAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3Mvd2luL0dyYXBoaWNzTGF5ZXJDQUNGLmgJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMTMz
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwg
SU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwg
REFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBP
RiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAq
IFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9O
IEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNU
IExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lT
RSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJF
LCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAq
LworCisjaWZuZGVmIEdyYXBoaWNzTGF5ZXJDQUNGX2hfCisjZGVmaW5lIEdyYXBoaWNzTGF5ZXJD
QUNGX2hfCisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisKKyNpbmNsdWRlICJH
cmFwaGljc0xheWVyLmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisjaW5jbHVkZSA8
d3RmL1JldGFpblB0ci5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIFdLQ0FDRkxh
eWVyOworCitjbGFzcyBHcmFwaGljc0xheWVyQ0FDRiA6IHB1YmxpYyBHcmFwaGljc0xheWVyIHsK
K3B1YmxpYzoKKworICAgIEdyYXBoaWNzTGF5ZXJDQUNGKEdyYXBoaWNzTGF5ZXJDbGllbnQqKTsK
KyAgICB2aXJ0dWFsIH5HcmFwaGljc0xheWVyQ0FDRigpOworCisgICAgdmlydHVhbCB2b2lkIGxh
eW91dCgpIHsgfQorCisgICAgdmlydHVhbCB2b2lkIHNldE5hbWUoY29uc3QgU3RyaW5nJiBpbk5h
bWUpOworCisgICAgLy8gZm9yIGhvc3RpbmcgdGhpcyBHcmFwaGljc0xheWVyIGluIGEgbmF0aXZl
IGxheWVyIGhpZXJhcmNoeQorICAgIHZpcnR1YWwgTmF0aXZlTGF5ZXIgbmF0aXZlTGF5ZXIoKSBj
b25zdDsKKworICAgIHZpcnR1YWwgdm9pZCBhZGRDaGlsZChHcmFwaGljc0xheWVyICpsYXllcik7
CisgICAgdmlydHVhbCB2b2lkIGFkZENoaWxkQXRJbmRleChHcmFwaGljc0xheWVyICpsYXllciwg
aW50IGluZGV4KTsKKyAgICB2aXJ0dWFsIHZvaWQgYWRkQ2hpbGRBYm92ZShHcmFwaGljc0xheWVy
ICpsYXllciwgR3JhcGhpY3NMYXllciAqc2libGluZyk7CisgICAgdmlydHVhbCB2b2lkIGFkZENo
aWxkQmVsb3coR3JhcGhpY3NMYXllciAqbGF5ZXIsIEdyYXBoaWNzTGF5ZXIgKnNpYmxpbmcpOwor
ICAgIHZpcnR1YWwgYm9vbCByZXBsYWNlQ2hpbGQoR3JhcGhpY3NMYXllciAqb2xkQ2hpbGQsIEdy
YXBoaWNzTGF5ZXIgKm5ld0NoaWxkKTsKKworICAgIHZpcnR1YWwgdm9pZCByZW1vdmVGcm9tUGFy
ZW50KCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0UG9zaXRpb24oY29uc3QgRmxvYXRQb2ludCYg
aW5Qb2ludCk7CisgICAgdmlydHVhbCB2b2lkIHNldEFuY2hvclBvaW50KGNvbnN0IEZsb2F0UG9p
bnQzRCYgaW5Qb2ludCk7CisgICAgdmlydHVhbCB2b2lkIHNldFNpemUoY29uc3QgRmxvYXRTaXpl
JiBpblNpemUpOworCisgICAgdmlydHVhbCB2b2lkIHNldFRyYW5zZm9ybShjb25zdCBUcmFuc2Zv
cm1hdGlvbk1hdHJpeCYpOworCisgICAgdmlydHVhbCB2b2lkIHNldENoaWxkcmVuVHJhbnNmb3Jt
KGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4Jik7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0UHJl
c2VydmVzM0QoYm9vbCk7CisgICAgdmlydHVhbCB2b2lkIHNldE1hc2tzVG9Cb3VuZHMoYm9vbCk7
CisgICAgdmlydHVhbCB2b2lkIHNldERyYXdzQ29udGVudChib29sKTsKKworICAgIHZpcnR1YWwg
dm9pZCBzZXRCYWNrZ3JvdW5kQ29sb3IoY29uc3QgQ29sb3ImKTsKKyAgICB2aXJ0dWFsIHZvaWQg
Y2xlYXJCYWNrZ3JvdW5kQ29sb3IoKTsKKworICAgIHZpcnR1YWwgdm9pZCBzZXRDb250ZW50c09w
YXF1ZShib29sKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0QmFja2ZhY2VWaXNpYmlsaXR5KGJvb2wp
OworCisgICAgdmlydHVhbCB2b2lkIHNldE9wYWNpdHkoZmxvYXQgb3BhY2l0eSk7CisKKyAgICB2
aXJ0dWFsIHZvaWQgc2V0TmVlZHNEaXNwbGF5KCk7CisgICAgdmlydHVhbCB2b2lkIHNldE5lZWRz
RGlzcGxheUluUmVjdChjb25zdCBGbG9hdFJlY3QmKTsKKworICAgIHZpcnR1YWwgdm9pZCBzZXRD
b250ZW50c1JlY3QoY29uc3QgSW50UmVjdCYpOworCisgICAgdmlydHVhbCB2b2lkIHNldENvbnRl
bnRzVG9JbWFnZShJbWFnZSopOworICAgIHZpcnR1YWwgdm9pZCBzZXRDb250ZW50c1RvVmlkZW8o
UGxhdGZvcm1MYXllciopOworICAgIAorICAgIHZpcnR1YWwgUGxhdGZvcm1MYXllciogcGxhdGZv
cm1MYXllcigpIGNvbnN0OworCisjaWZuZGVmIE5ERUJVRworICAgIHZpcnR1YWwgdm9pZCBzZXRE
ZWJ1Z0JhY2tncm91bmRDb2xvcihjb25zdCBDb2xvciYpOworICAgIHZpcnR1YWwgdm9pZCBzZXRE
ZWJ1Z0JvcmRlcihjb25zdCBDb2xvciYsIGZsb2F0IGJvcmRlcldpZHRoKTsKKyNlbmRpZgorCisg
ICAgdmlydHVhbCB2b2lkIHNldEdlb21ldHJ5T3JpZW50YXRpb24oQ29tcG9zaXRpbmdDb29yZGlu
YXRlc09yaWVudGF0aW9uKTsKKworICAgIHZvaWQgbm90aWZ5U3luY1JlcXVpcmVkKCkgeyBpZiAo
bV9jbGllbnQpIG1fY2xpZW50LT5ub3RpZnlTeW5jUmVxdWlyZWQodGhpcyk7IH0KKworcHJpdmF0
ZToKKyAgICBXS0NBQ0ZMYXllciogcHJpbWFyeUxheWVyKCkgY29uc3QgIHsgcmV0dXJuIG1fdHJh
bnNmb3JtTGF5ZXIuZ2V0KCkgPyBtX3RyYW5zZm9ybUxheWVyLmdldCgpIDogbV9sYXllci5nZXQo
KTsgfQorICAgIFdLQ0FDRkxheWVyKiBob3N0TGF5ZXJGb3JTdWJsYXllcnMoKSBjb25zdDsKKyAg
ICBXS0NBQ0ZMYXllciogbGF5ZXJGb3JTdXBlcmxheWVyKCkgY29uc3Q7CisKKyAgICB2b2lkIHVw
ZGF0ZUNvbnRlbnRzUmVjdCgpOworCisgICAgYm9vbCByZXF1aXJlc1RpbGVkTGF5ZXIoY29uc3Qg
RmxvYXRTaXplJikgY29uc3Q7CisgICAgdm9pZCBzd2FwRnJvbU9yVG9UaWxlZExheWVyKGJvb2wg
aW5Vc2VUaWxlZExheWVyKSB7IH0KKworICAgIENvbXBvc2l0aW5nQ29vcmRpbmF0ZXNPcmllbnRh
dGlvbiBkZWZhdWx0Q29udGVudHNPcmllbnRhdGlvbigpIGNvbnN0OworICAgIHZvaWQgdXBkYXRl
Q29udGVudHNUcmFuc2Zvcm0oKTsKKwl2b2lkIHVwZGF0ZVN1YmxheWVyTGlzdCgpOworICAgIAor
ICAgIHZvaWQgc2V0dXBDb250ZW50c0xheWVyKFdLQ0FDRkxheWVyKik7CisgICAgV0tDQUNGTGF5
ZXIqIGNvbnRlbnRzTGF5ZXIoKSBjb25zdCB7IHJldHVybiBtX2NvbnRlbnRzTGF5ZXIuZ2V0KCk7
IH0KKyAgICAKKyAgICBSZWZQdHI8V0tDQUNGTGF5ZXI+IG1fbGF5ZXI7CisgICAgUmVmUHRyPFdL
Q0FDRkxheWVyPiBtX3RyYW5zZm9ybUxheWVyOworICAgIFJlZlB0cjxXS0NBQ0ZMYXllcj4gbV9j
b250ZW50c0xheWVyOworCisgICAgZW51bSBDb250ZW50c0xheWVyUHVycG9zZSB7CisgICAgICAg
IE5vQ29udGVudHNMYXllciA9IDAsCisgICAgICAgIENvbnRlbnRzTGF5ZXJGb3JJbWFnZSwKKyAg
ICAgICAgQ29udGVudHNMYXllckZvclZpZGVvCisgICAgfTsKKyAgICAKKyAgICBDb250ZW50c0xh
eWVyUHVycG9zZSBtX2NvbnRlbnRzTGF5ZXJQdXJwb3NlOworfTsKKworfSAvLyBuYW1lc3BhY2Ug
V2ViQ29yZQorCisjZW5kaWYgLy8gVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorCisjZW5k
aWYgLy8gR3JhcGhpY3NMYXllckNBQ0ZfaF8KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3Mvd2luL1dLQ0FDRkNvbnRleHRGbHVzaGVyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL3dpbi9XS0NBQ0ZDb250ZXh0Rmx1c2hlci5jcHAJKHJldmlzaW9uIDAp
CisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9XS0NBQ0ZDb250ZXh0Rmx1c2hlci5j
cHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MDkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICog
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAq
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKwor
I2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKworI2luY2x1ZGUgIldLQ0FDRkNvbnRl
eHRGbHVzaGVyLmgiCisKKyNpbmNsdWRlIDxRdWFydHpDb3JlL0NBQ0ZDb250ZXh0Lmg+CisKK25h
bWVzcGFjZSBXZWJDb3JlIHsKKworV0tDQUNGQ29udGV4dEZsdXNoZXImIFdLQ0FDRkNvbnRleHRG
bHVzaGVyOjpzaGFyZWQoKQoreworICAgIHN0YXRpYyBXS0NBQ0ZDb250ZXh0Rmx1c2hlciYgZmx1
c2hlciA9ICpuZXcgV0tDQUNGQ29udGV4dEZsdXNoZXI7CisgICAgcmV0dXJuIGZsdXNoZXI7Cit9
CisKK1dLQ0FDRkNvbnRleHRGbHVzaGVyOjpXS0NBQ0ZDb250ZXh0Rmx1c2hlcigpCit7CisgICAg
aW5pdGlhbGl6ZSgpOworfQorCitXS0NBQ0ZDb250ZXh0Rmx1c2hlcjo6fldLQ0FDRkNvbnRleHRG
bHVzaGVyKCkKK3sKK30KKwordm9pZCBXS0NBQ0ZDb250ZXh0Rmx1c2hlcjo6YWRkQ29udGV4dChD
QUNGQ29udGV4dFJlZiBjb250ZXh0KQoreworICAgIGlmICghY29udGV4dCkKKyAgICAgICAgcmV0
dXJuOworCisgICAgaWYgKG1fY29udGV4dHMuYWRkKGNvbnRleHQpLnNlY29uZCkKKyAgICAgICAg
Q0ZSZXRhaW4oY29udGV4dCk7Cit9CisKK3ZvaWQgV0tDQUNGQ29udGV4dEZsdXNoZXI6OnJlbW92
ZUNvbnRleHQoQ0FDRkNvbnRleHRSZWYgY29udGV4dCkKK3sKKyAgICBpZiAoIWNvbnRleHQpCisg
ICAgICAgIHJldHVybjsKKworICAgIENvbnRleHRTZXQ6Oml0ZXJhdG9yIGZvdW5kID0gbV9jb250
ZXh0cy5maW5kKGNvbnRleHQpOworICAgIGlmIChmb3VuZCA9PSBtX2NvbnRleHRzLmVuZCgpKQor
ICAgICAgICByZXR1cm47CisKKyAgICBDRlJlbGVhc2UoKmZvdW5kKTsKKyAgICBtX2NvbnRleHRz
LnJlbW92ZShmb3VuZCk7Cit9CisKK3ZvaWQgV0tDQUNGQ29udGV4dEZsdXNoZXI6OmZsdXNoQWxs
Q29udGV4dHMoKQoreworICAgIC8vIGFkZENvbnRleHQgbWlnaHQgZ2V0IGNhbGxlZCBiZW5lYXRo
IENBQ0ZDb250ZXh0Rmx1c2gsIGFuZCB3ZSBkb24ndCB3YW50IG1fY29udGV4dHMgdG8gY2hhbmdl
IHdoaWxlCisgICAgLy8gd2UncmUgaXRlcmF0aW5nIG92ZXIgaXQsIHNvIHdlIG1vdmUgdGhlIGNv
bnRleHRzIGludG8gYSBsb2NhbCBDb250ZXh0U2V0IGFuZCBpdGVyYXRlIG92ZXIgdGhhdCBpbnN0
ZWFkLgorICAgIENvbnRleHRTZXQgY29udGV4dHNUb0ZsdXNoOworICAgIGNvbnRleHRzVG9GbHVz
aC5zd2FwKG1fY29udGV4dHMpOworCisgICAgQ29udGV4dFNldDo6Y29uc3RfaXRlcmF0b3IgZW5k
ID0gY29udGV4dHNUb0ZsdXNoLmVuZCgpOworICAgIGZvciAoQ29udGV4dFNldDo6Y29uc3RfaXRl
cmF0b3IgaXQgPSBjb250ZXh0c1RvRmx1c2guYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7Cisg
ICAgICAgIENBQ0ZDb250ZXh0UmVmIGNvbnRleHQgPSAqaXQ7CisgICAgICAgIENBQ0ZDb250ZXh0
Rmx1c2goY29udGV4dCk7CisgICAgICAgIGRpZEZsdXNoQ29udGV4dChjb250ZXh0KTsKKyAgICAg
ICAgQ0ZSZWxlYXNlKGNvbnRleHQpOworICAgIH0KK30KKworfQorCisjZW5kaWYgLy8gVVNFKEFD
Q0VMRVJBVEVEX0NPTVBPU0lUSU5HKQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93
aW4vV0tDQUNGQ29udGV4dEZsdXNoZXIuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL3dpbi9XS0NBQ0ZDb250ZXh0Rmx1c2hlci5oCShyZXZpc2lvbiAwKQorKysgV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vV0tDQUNGQ29udGV4dEZsdXNoZXIuaAkocmV2aXNp
b24gMCkKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQor
ICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQor
ICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBXS0NBQ0ZDb250ZXh0Rmx1c2hlcl9oCisj
ZGVmaW5lIFdLQ0FDRkNvbnRleHRGbHVzaGVyX2gKKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01Q
T1NJVElORykKKworI2luY2x1ZGUgPHd0Zi9Ob25jb3B5YWJsZS5oPgorCisjaW5jbHVkZSA8d3Rm
L0hhc2hTZXQuaD4KKwordHlwZWRlZiBzdHJ1Y3QgX0NBQ0ZDb250ZXh0KiBDQUNGQ29udGV4dFJl
ZjsKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBXS0NBQ0ZDb250ZXh0Rmx1c2hlciA6
IE5vbmNvcHlhYmxlIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgV0tDQUNGQ29udGV4dEZsdXNoZXIm
IHNoYXJlZCgpOworCisgICAgdm9pZCBhZGRDb250ZXh0KENBQ0ZDb250ZXh0UmVmKTsKKyAgICB2
b2lkIHJlbW92ZUNvbnRleHQoQ0FDRkNvbnRleHRSZWYpOworCisgICAgdm9pZCBmbHVzaEFsbENv
bnRleHRzKCk7CisKK3ByaXZhdGU6CisgICAgV0tDQUNGQ29udGV4dEZsdXNoZXIoKTsKKyAgICB+
V0tDQUNGQ29udGV4dEZsdXNoZXIoKTsKKworICAgIHN0YXRpYyB2b2lkIGluaXRpYWxpemUoKTsK
KworICAgIHN0YXRpYyB2b2lkIGRpZEZsdXNoQ29udGV4dChDQUNGQ29udGV4dFJlZik7CisKKyAg
ICB0eXBlZGVmIEhhc2hTZXQ8Q0FDRkNvbnRleHRSZWY+IENvbnRleHRTZXQ7CisgICAgQ29udGV4
dFNldCBtX2NvbnRleHRzOworfTsKKworfQorCisjZW5kaWYgLy8gVVNFKEFDQ0VMRVJBVEVEX0NP
TVBPU0lUSU5HKQorCisjZW5kaWYgLy8gV0tDQUNGQ29udGV4dEZsdXNoZXJfaApJbmRleDogV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vV0tDQUNGQ29udGV4dEZsdXNoZXJXaW4uY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1dLQ0FDRkNvbnRleHRG
bHVzaGVyV2luLmNwcAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
d2luL1dLQ0FDRkNvbnRleHRGbHVzaGVyV2luLmNwcAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw0
NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAx
LiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAq
ICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBM
RSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIs
IElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisg
KiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisg
Ki8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lU
SU5HKQorCisjaW5jbHVkZSAiV0tDQUNGQ29udGV4dEZsdXNoZXIuaCIKKworI2luY2x1ZGUgIldL
Q0FDRkxheWVyV2luZG93LmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKwordm9pZCBXS0NBQ0ZD
b250ZXh0Rmx1c2hlcjo6aW5pdGlhbGl6ZSgpCit7Cit9CisKK3ZvaWQgV0tDQUNGQ29udGV4dEZs
dXNoZXI6OmRpZEZsdXNoQ29udGV4dChDQUNGQ29udGV4dFJlZiBjb250ZXh0KQoreworICAgIFdL
Q0FDRkxheWVyV2luZG93OjpkaWRGbHVzaENvbnRleHQoY29udGV4dCk7Cit9CisKK30KKworI2Vu
ZGlmIC8vIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKSW5kZXg6IFdlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3Mvd2luL1dLQ0FDRkxheWVyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL3dpbi9XS0NBQ0ZMYXllci5jcHAJKHJldmlzaW9uIDApCisrKyBXZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9XS0NBQ0ZMYXllci5jcHAJKHJldmlzaW9uIDApCkBA
IC0wLDAgKzEsMzg3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJ
UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENP
TlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQ
Uk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwg
REFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNF
IE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBU
SElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gg
REFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpZiBVU0UoQUNDRUxFUkFU
RURfQ09NUE9TSVRJTkcpCisKKyNpbmNsdWRlICJXS0NBQ0ZMYXllci5oIgorCisjaW5jbHVkZSAi
V0tDQUNGQ29udGV4dEZsdXNoZXIuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8
UXVhcnR6Q29yZS9DQUNGQ29udGV4dC5oPgorI2luY2x1ZGUgPFF1YXJ0ekNvcmUvQ0FSZW5kZXIu
aD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCitzdGF0
aWMgdm9pZCBsYXlvdXRTdWJsYXllcnMoQ0FDRkxheWVyUmVmIGxheWVyKQoreworICAgIEFTU0VS
VF9BUkcobGF5ZXIsIFdLQ0FDRkxheWVyOjpsYXllcihsYXllcikpOworICAgIFdLQ0FDRkxheWVy
OjpsYXllcihsYXllciktPmxheW91dCgpOworfQorCitzdGF0aWMgdm9pZCBkaXNwbGF5SW5Db250
ZXh0KENBQ0ZMYXllclJlZiBsYXllciwgQ0dDb250ZXh0UmVmIGNvbnRleHQpCit7CisgICAgQVNT
RVJUX0FSRyhsYXllciwgV0tDQUNGTGF5ZXI6OmxheWVyKGxheWVyKSk7CisgICAgV0tDQUNGTGF5
ZXI6OmxheWVyKGxheWVyKS0+ZGlzcGxheShjb250ZXh0KTsKK30KKworLy8gRklYTUU6IEl0IG1p
Z2h0IGJlIGdvb2QgdG8gaGF2ZSBhIHdheSBvZiBlbnN1cmluZyB0aGF0IGFsbCBXS0NBQ0ZMYXll
cnMgZXZlbnR1YWxseQorLy8gZ2V0IGRlc3Ryb3llZCBpbiBkZWJ1ZyBidWlsZHMuIEEgc3RhdGlj
IGNvdW50ZXIgY291bGQgYWNjb21wbGlzaCB0aGlzIHByZXR0eSBlYXNpbHkuCisKK1dLQ0FDRkxh
eWVyOjpXS0NBQ0ZMYXllcihDRlN0cmluZ1JlZiBjbGFzc05hbWUsIEdyYXBoaWNzTGF5ZXJDQUNG
KiBvd25lcikKKyAgICA6IG1fbGF5ZXIoQWRvcHRDRiwgQ0FDRkxheWVyQ3JlYXRlKGNsYXNzTmFt
ZSkpCisgICAgLCBtX25lZWRzTGF5b3V0T25Cb3VuZHNDaGFuZ2UoZmFsc2UpCisgICAgLCBtX25l
ZWRzRGlzcGxheU9uQm91bmRzQ2hhbmdlKGZhbHNlKQorICAgICwgbV9vd25lcihvd25lcikKK3sK
KyAgICBDQUNGTGF5ZXJTZXRVc2VyRGF0YShsYXllcigpLCB0aGlzKTsKKyAgICBDQUNGTGF5ZXJT
ZXRMYXlvdXRDYWxsYmFjayhsYXllcigpLCBsYXlvdXRTdWJsYXllcnMpOworICAgIENBQ0ZMYXll
clNldERpc3BsYXlDYWxsYmFjayhsYXllcigpLCBkaXNwbGF5SW5Db250ZXh0KTsKK30KKworV0tD
QUNGTGF5ZXI6On5XS0NBQ0ZMYXllcigpCit7CisgICAgLy8gT3VyIHN1cGVybGF5ZXIgc2hvdWxk
IGJlIGhvbGRpbmcgYSByZWZlcmVuY2UgdG8gdXMsIHNvIHRoZXJlIHNob3VsZCBiZSBubyB3YXkg
Zm9yIHVzIHRvIGJlIGRlc3Ryb3llZCB3aGlsZSB3ZSBzdGlsbCBoYXZlIGEgc3VwZXJsYXllci4K
KyAgICBBU1NFUlQoIXN1cGVybGF5ZXIoKSk7CisKKyAgICBDQUNGTGF5ZXJTZXRVc2VyRGF0YShs
YXllcigpLCAwKTsKKyAgICBDQUNGTGF5ZXJTZXRMYXlvdXRDYWxsYmFjayhsYXllcigpLCAwKTsK
KyAgICBDQUNGTGF5ZXJTZXREaXNwbGF5Q2FsbGJhY2sobGF5ZXIoKSwgMCk7Cit9CisKK3ZvaWQg
V0tDQUNGTGF5ZXI6OmRpc3BsYXkoUGxhdGZvcm1HcmFwaGljc0NvbnRleHQqIGNvbnRleHQpCit7
CisgICAgaWYgKCFtX293bmVyKQorICAgICAgICByZXR1cm47CisKKyAgICBDR0NvbnRleHRTYXZl
R1N0YXRlKGNvbnRleHQpOworCisgICAgQ0dSZWN0IGxheWVyQm91bmRzID0gYm91bmRzKCk7Cisg
ICAgaWYgKG1fb3duZXItPmNvbnRlbnRzT3JpZW50YXRpb24oKSA9PSBXZWJDb3JlOjpHcmFwaGlj
c0xheWVyOjpDb21wb3NpdGluZ0Nvb3JkaW5hdGVzQm90dG9tVXApIHsKKyAgICAgICAgQ0dDb250
ZXh0U2NhbGVDVE0oY29udGV4dCwgMSwgLTEpOworICAgICAgICBDR0NvbnRleHRUcmFuc2xhdGVD
VE0oY29udGV4dCwgMCwgLWxheWVyQm91bmRzLnNpemUuaGVpZ2h0KTsKKyAgICB9CisKKyAgICBp
ZiAobV9vd25lci0+Y2xpZW50KCkpIHsKKyAgICAgICAgR3JhcGhpY3NDb250ZXh0IGdyYXBoaWNz
Q29udGV4dChjb250ZXh0KTsKKworICAgICAgICAvLyBJdCdzIGltcG9ydGFudCB0byBnZXQgdGhl
IGNsaXAgZnJvbSB0aGUgY29udGV4dCwgYmVjYXVzZSBpdCBtYXkgYmUgc2lnbmlmaWNhbnRseQor
ICAgICAgICAvLyBzbWFsbGVyIHRoYW4gdGhlIGxheWVyIGJvdW5kcyAoZS5nLiB0aWxlZCBsYXll
cnMpCisgICAgICAgIENHUmVjdCBjbGlwQm91bmRzID0gQ0dDb250ZXh0R2V0Q2xpcEJvdW5kaW5n
Qm94KGNvbnRleHQpOworICAgICAgICBJbnRSZWN0IGNsaXAoZW5jbG9zaW5nSW50UmVjdChjbGlw
Qm91bmRzKSk7CisgICAgICAgIG1fb3duZXItPnBhaW50R3JhcGhpY3NMYXllckNvbnRlbnRzKGdy
YXBoaWNzQ29udGV4dCwgY2xpcCk7CisgICAgfQorI2lmbmRlZiBOREVCVUcKKyAgICBlbHNlIHsK
KyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisKKyAgICAgICAgLy8gRklYTUU6IGlkZWFs
bHkgd2UnZCBhdm9pZCBjYWxsaW5nIC1zZXROZWVkc0Rpc3BsYXkgb24gYSBsYXllciB0aGF0IGlz
IGEgcGxhaW4gY29sb3IsCisgICAgICAgIC8vIHNvIENBIG5ldmVyIG1ha2VzIGJhY2tpbmcgc3Rv
cmUgZm9yIGl0ICh3aGljaCBpcyB3aGF0IC1zZXROZWVkc0Rpc3BsYXkgd2lsbCBkbyBhYm92ZSku
CisgICAgICAgIENHQ29udGV4dFNldFJHQkZpbGxDb2xvcihjb250ZXh0LCAwLjBmLCAxLjBmLCAw
LjBmLCAxLjBmKTsKKyAgICAgICAgQ0dDb250ZXh0RmlsbFJlY3QoY29udGV4dCwgbGF5ZXJCb3Vu
ZHMpOworICAgIH0KKyNlbmRpZgorCisjaWZuZGVmIE5ERUJVRworICAgIGlmIChtX293bmVyLT5z
aG93UmVwYWludENvdW50ZXIoKSkgeworICAgICAgICBjaGFyIHRleHRbMTZdOyAvLyB0aGF0J3Mg
YSBsb3Qgb2YgcmVwYWludHMKKyAgICAgICAgX3NucHJpbnRmKHRleHQsIHNpemVvZih0ZXh0KSwg
IiVkIiwgbV9vd25lci0+aW5jcmVtZW50UmVwYWludENvdW50KCkpOworCisgICAgICAgIENHQ29u
dGV4dFNhdmVHU3RhdGUoY29udGV4dCk7CisgICAgICAgIENHQ29udGV4dFNldFJHQkZpbGxDb2xv
cihjb250ZXh0LCAxLjBmLCAwLjBmLCAwLjBmLCAwLjhmKTsKKyAgICAgICAgCisgICAgICAgIENH
UmVjdCBhQm91bmRzID0gbGF5ZXJCb3VuZHM7CisKKyAgICAgICAgYUJvdW5kcy5zaXplLndpZHRo
ID0gMTAgKyAxMiAqIHN0cmxlbih0ZXh0KTsKKyAgICAgICAgYUJvdW5kcy5zaXplLmhlaWdodCA9
IDI1OworICAgICAgICBDR0NvbnRleHRGaWxsUmVjdChjb250ZXh0LCBhQm91bmRzKTsKKyAgICAg
ICAgCisgICAgICAgIENHQ29udGV4dFNldFJHQkZpbGxDb2xvcihjb250ZXh0LCAwLjBmLCAwLjBm
LCAwLjBmLCAxLjBmKTsKKworICAgICAgICBDR0NvbnRleHRTZXRUZXh0TWF0cml4KGNvbnRleHQs
IENHQWZmaW5lVHJhbnNmb3JtTWFrZVNjYWxlKDEuMGYsIC0xLjBmKSk7CisgICAgICAgIENHQ29u
dGV4dFNlbGVjdEZvbnQoY29udGV4dCwgIkhlbHZldGljYSIsIDI1LCBrQ0dFbmNvZGluZ01hY1Jv
bWFuKTsKKyAgICAgICAgQ0dDb250ZXh0U2hvd1RleHRBdFBvaW50KGNvbnRleHQsIGFCb3VuZHMu
b3JpZ2luLnggKyAzLjBmLCBhQm91bmRzLm9yaWdpbi55ICsgMjAuMGYsIHRleHQsIHN0cmxlbih0
ZXh0KSk7CisgICAgICAgIAorICAgICAgICBDR0NvbnRleHRSZXN0b3JlR1N0YXRlKGNvbnRleHQp
OyAgICAgICAgCisgICAgfQorI2VuZGlmCisKKyAgICBDR0NvbnRleHRSZXN0b3JlR1N0YXRlKGNv
bnRleHQpOworfQorCit2b2lkIFdLQ0FDRkxheWVyOjpsYXlvdXQoKQoreworICAgIGlmIChtX293
bmVyKQorICAgICAgICBtX293bmVyLT5sYXlvdXQoKTsKK30KKwordm9pZCBXS0NBQ0ZMYXllcjo6
YmVjb21lTGF5ZXJGb3JDb250ZXh0KENBQ0ZDb250ZXh0UmVmIGNvbnRleHQpCit7CisgICAgQ0FD
RkNvbnRleHRTZXRMYXllcihjb250ZXh0LCBsYXllcigpKTsKKyAgICBzZXROZWVkc0NvbW1pdCgp
OworfQorCit2b2lkIFdLQ0FDRkxheWVyOjpzZXROZWVkc0NvbW1pdCgpCit7CisgICAgV0tDQUNG
Q29udGV4dEZsdXNoZXI6OnNoYXJlZCgpLmFkZENvbnRleHQoQ0FDRkxheWVyR2V0Q29udGV4dChy
b290TGF5ZXIoKS0+bGF5ZXIoKSkpOworCisgICAgLy8gQ2FsbCBub3RpZnlTeW5jUmVxdWlyZWQo
KSwgd2hpY2ggaW4gdGhpcyBpbXBsZW1lbnRhdGlvbiBwbHVtYnMgdGhyb3VnaCB0bworICAgIC8v
IGNhbGwgc2V0Um9vdExheWVyTmVlZHNEaXNwbGF5KCkgb24gdGhlIFdlYlZpZXcsIHdoaWNoIGNh
dXNlcyB0aGUgQ0FDRlJlbmRlcmVyCisgICAgLy8gdG8gcmVuZGVyIGEgZnJhbWUuCisgICAgaWYg
KG1fb3duZXIpCisgICAgICAgIG1fb3duZXItPm5vdGlmeVN5bmNSZXF1aXJlZCgpOworfQorCitD
RlRpbWVJbnRlcnZhbCBXS0NBQ0ZMYXllcjo6Y29udmVydFRpbWUoQ0ZUaW1lSW50ZXJ2YWwgdCwg
Y29uc3QgV0tDQUNGTGF5ZXIqIHRvTGF5ZXIpIGNvbnN0Cit7CisgICAgcmV0dXJuIENBQ0ZMYXll
ckNvbnZlcnRUaW1lKGxheWVyKCksIHRvTGF5ZXIgPyB0b0xheWVyLT5sYXllcigpIDogMCwgdCk7
Cit9CisKK0NHUG9pbnQgV0tDQUNGTGF5ZXI6OmNvbnZlcnRQb2ludChjb25zdCBDR1BvaW50JiBw
LCBjb25zdCBXS0NBQ0ZMYXllciogdG9MYXllcikgY29uc3QKK3sKKyAgICBDR1BvaW50IGNvbnZl
cnRlZFBvaW50ID0gcDsKKyAgICBDQUNGTGF5ZXJDb252ZXJ0UG9pbnQobGF5ZXIoKSwgdG9MYXll
ciA/IHRvTGF5ZXItPmxheWVyKCkgOiAwLCAmY29udmVydGVkUG9pbnQpOworICAgIHJldHVybiBj
b252ZXJ0ZWRQb2ludDsKK30KKworQ0dSZWN0IFdLQ0FDRkxheWVyOjpjb252ZXJ0UmVjdChjb25z
dCBDR1JlY3QmIHIsIGNvbnN0IFdLQ0FDRkxheWVyKiB0b0xheWVyKSBjb25zdAoreworICAgIENH
UmVjdCBjb252ZXJ0ZWRSZWN0ID0gcjsKKyAgICBDQUNGTGF5ZXJDb252ZXJ0UmVjdChsYXllcigp
LCB0b0xheWVyID8gdG9MYXllci0+bGF5ZXIoKSA6IDAsICZjb252ZXJ0ZWRSZWN0KTsKKyAgICBy
ZXR1cm4gY29udmVydGVkUmVjdDsKK30KKwordm9pZCBXS0NBQ0ZMYXllcjo6YWRkU3VibGF5ZXIo
UGFzc1JlZlB0cjxXS0NBQ0ZMYXllcj4gc3VibGF5ZXIpCit7CisgICAgaW5zZXJ0U3VibGF5ZXIo
c3VibGF5ZXIsIG51bVN1YmxheWVycygpKTsKK30KKwordm9pZCBXS0NBQ0ZMYXllcjo6aW5zZXJ0
U3VibGF5ZXIoUGFzc1JlZlB0cjxXS0NBQ0ZMYXllcj4gc3VibGF5ZXIsIHNpemVfdCBpbmRleCkK
K3sKKyAgICBpbmRleCA9IG1pbihpbmRleCwgbnVtU3VibGF5ZXJzKCkpOworICAgIENBQ0ZMYXll
ckluc2VydFN1YmxheWVyKGxheWVyKCksIHN1YmxheWVyLT5sYXllcigpLCBpbmRleCk7CisgICAg
c2V0TmVlZHNDb21taXQoKTsKK30KKwordm9pZCBXS0NBQ0ZMYXllcjo6aW5zZXJ0U3VibGF5ZXJB
Ym92ZUxheWVyKFBhc3NSZWZQdHI8V0tDQUNGTGF5ZXI+IHN1YmxheWVyLCBjb25zdCBXS0NBQ0ZM
YXllciogcmVmZXJlbmNlKQoreworICAgIGlmICghcmVmZXJlbmNlKSB7CisgICAgICAgIGluc2Vy
dFN1YmxheWVyKHN1YmxheWVyLCAwKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlu
dCByZWZlcmVuY2VJbmRleCA9IGZpbmRTdWJsYXllcihyZWZlcmVuY2UpOworICAgIGlmIChyZWZl
cmVuY2VJbmRleCA9PSAtMSkgeworICAgICAgICBhZGRTdWJsYXllcihzdWJsYXllcik7CisgICAg
ICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnNlcnRTdWJsYXllcihzdWJsYXllciwgcmVmZXJl
bmNlSW5kZXggKyAxKTsKK30KKwordm9pZCBXS0NBQ0ZMYXllcjo6aW5zZXJ0U3VibGF5ZXJCZWxv
d0xheWVyKFBhc3NSZWZQdHI8V0tDQUNGTGF5ZXI+IHN1YmxheWVyLCBjb25zdCBXS0NBQ0ZMYXll
ciogcmVmZXJlbmNlKQoreworICAgIGlmICghcmVmZXJlbmNlKSB7CisgICAgICAgIGluc2VydFN1
YmxheWVyKHN1YmxheWVyLCAwKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludCBy
ZWZlcmVuY2VJbmRleCA9IGZpbmRTdWJsYXllcihyZWZlcmVuY2UpOworICAgIGlmIChyZWZlcmVu
Y2VJbmRleCA9PSAtMSkgeworICAgICAgICBhZGRTdWJsYXllcihzdWJsYXllcik7CisgICAgICAg
IHJldHVybjsKKyAgICB9CisKKyAgICBpbnNlcnRTdWJsYXllcihzdWJsYXllciwgcmVmZXJlbmNl
SW5kZXgpOworfQorCitib29sIFdLQ0FDRkxheWVyOjppc0Rlc2NlbmRhbnRPZihXS0NBQ0ZMYXll
ciogYW5jZXN0b3IpIGNvbnN0Cit7CisgICAgZm9yIChjb25zdCBXS0NBQ0ZMYXllciogbGF5ZXIg
PSB0aGlzOyBsYXllcjsgbGF5ZXIgPSBsYXllci0+c3VwZXJsYXllcigpKSB7CisgICAgICAgIGlm
IChsYXllciA9PSBhbmNlc3RvcikKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAg
ICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgV0tDQUNGTGF5ZXI6OnJlcGxhY2VTdWJsYXllcihX
S0NBQ0ZMYXllciogcmVmZXJlbmNlLCBQYXNzUmVmUHRyPFdLQ0FDRkxheWVyPiBuZXdMYXllcikK
K3sKKyAgICBBU1NFUlRfQVJHKHJlZmVyZW5jZSwgcmVmZXJlbmNlKTsKKyAgICBBU1NFUlRfQVJH
KHJlZmVyZW5jZSwgcmVmZXJlbmNlLT5zdXBlcmxheWVyKCkgPT0gdGhpcyk7CisKKyAgICBpZiAo
cmVmZXJlbmNlID09IG5ld0xheWVyKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoIW5ld0xh
eWVyKSB7CisgICAgICAgIHJlbW92ZVN1YmxheWVyKHJlZmVyZW5jZSk7CisgICAgICAgIHJldHVy
bjsKKyAgICB9CisKKyAgICAvL1JlZlB0cjxXS0NBQ0ZMYXllcj4gbmV3TGF5ZXJSZWYgPSBuZXdM
YXllcjsKKworICAgIG5ld0xheWVyLT5yZW1vdmVGcm9tU3VwZXJsYXllcigpOworCisgICAgaW50
IHJlZmVyZW5jZUluZGV4ID0gZmluZFN1YmxheWVyKHJlZmVyZW5jZSk7CisgICAgQVNTRVJUKHJl
ZmVyZW5jZUluZGV4ICE9IC0xKTsKKyAgICBpZiAocmVmZXJlbmNlSW5kZXggPT0gLTEpCisgICAg
ICAgIHJldHVybjsKKworICAgIC8vIEZJWE1FOiBDYW4gd2UgbWFrZSB0aGlzIG1vcmUgZWZmaWNp
ZW50PyBUaGUgY3VycmVudCBDQUNGIEFQSSBkb2Vzbid0IHNlZW0gdG8gZ2l2ZSB1cyBhIHdheSB0
byBkbyBzby4KKyAgICByZWZlcmVuY2UtPnJlbW92ZUZyb21TdXBlcmxheWVyKCk7CisgICAgaW5z
ZXJ0U3VibGF5ZXIobmV3TGF5ZXIsIHJlZmVyZW5jZUluZGV4KTsKK30KKwordm9pZCBXS0NBQ0ZM
YXllcjo6cmVtb3ZlRnJvbVN1cGVybGF5ZXIoKQoreworICAgIFdLQ0FDRkxheWVyKiBzdXBlcmxh
eWVyID0gdGhpcy0+c3VwZXJsYXllcigpOworICAgIGlmICghc3VwZXJsYXllcikKKyAgICAgICAg
cmV0dXJuOworCisgICAgc3VwZXJsYXllci0+cmVtb3ZlU3VibGF5ZXIodGhpcyk7CisgICAgQ0FD
RkxheWVyUmVtb3ZlRnJvbVN1cGVybGF5ZXIobGF5ZXIoKSk7CisgICAgc2V0TmVlZHNDb21taXQo
KTsKK30KKwordm9pZCBXS0NBQ0ZMYXllcjo6cmVtb3ZlU3VibGF5ZXIoY29uc3QgV0tDQUNGTGF5
ZXIqIHN1YmxheWVyKQoreworICAgIGludCBmb3VuZEluZGV4ID0gZmluZFN1YmxheWVyKHN1Ymxh
eWVyKTsKKyAgICBpZiAoZm91bmRJbmRleCA9PSAtMSkKKyAgICAgICAgcmV0dXJuOworCisgICAg
Q0FDRkxheWVyUmVtb3ZlRnJvbVN1cGVybGF5ZXIoc3VibGF5ZXItPmxheWVyKCkpOworfQorCitp
bnQgV0tDQUNGTGF5ZXI6OmZpbmRTdWJsYXllcihjb25zdCBXS0NBQ0ZMYXllciogcmVmZXJlbmNl
KQoreworICAgIENBQ0ZMYXllclJlZiByZWYgPSByZWZlcmVuY2UtPmxheWVyKCk7CisgICAgaWYg
KCFyZWYpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIENGQXJyYXlSZWYgc3VibGF5ZXJzID0g
Q0FDRkxheWVyR2V0U3VibGF5ZXJzKGxheWVyKCkpOworICAgIHNpemVfdCBuID0gQ0ZBcnJheUdl
dENvdW50KHN1YmxheWVycyk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG47ICsraSkK
KyAgICAgICAgaWYgKENGQXJyYXlHZXRWYWx1ZUF0SW5kZXgoc3VibGF5ZXJzLCBpKSA9PSByZWYp
CisgICAgICAgICAgICByZXR1cm4gaTsKKworICAgIHJldHVybiAtMTsKK30KKworV0tDQUNGTGF5
ZXIqIFdLQ0FDRkxheWVyOjphbmNlc3Rvck9yU2VsZldpdGhTdXBlcmxheWVyKFdLQ0FDRkxheWVy
KiBzdXBlcmxheWVyKSBjb25zdAoreworICAgIFdLQ0FDRkxheWVyKiBsYXllciA9IGNvbnN0X2Nh
c3Q8V0tDQUNGTGF5ZXIqPih0aGlzKTsKKyAgICBmb3IgKFdLQ0FDRkxheWVyKiBhbmNlc3RvciA9
IHRoaXMtPnN1cGVybGF5ZXIoKTsgYW5jZXN0b3I7IGxheWVyID0gYW5jZXN0b3IsIGFuY2VzdG9y
ID0gYW5jZXN0b3ItPnN1cGVybGF5ZXIoKSkgeworICAgICAgICBpZiAoYW5jZXN0b3IgPT0gc3Vw
ZXJsYXllcikKKyAgICAgICAgICAgIHJldHVybiBsYXllcjsKKyAgICB9CisgICAgcmV0dXJuIDA7
Cit9CisKK3ZvaWQgV0tDQUNGTGF5ZXI6OnNldEJvdW5kcyhjb25zdCBDR1JlY3QmIHJlY3QpCit7
CisgICAgaWYgKENHUmVjdEVxdWFsVG9SZWN0KHJlY3QsIGJvdW5kcygpKSkKKyAgICAgICAgcmV0
dXJuOworCisgICAgQ0FDRkxheWVyU2V0Qm91bmRzKGxheWVyKCksIHJlY3QpOworICAgIHNldE5l
ZWRzQ29tbWl0KCk7CisKKyAgICBpZiAobV9uZWVkc0xheW91dE9uQm91bmRzQ2hhbmdlKQorICAg
ICAgICBzZXROZWVkc0xheW91dCgpOworICAgIGlmIChtX25lZWRzRGlzcGxheU9uQm91bmRzQ2hh
bmdlKQorICAgICAgICBzZXROZWVkc0Rpc3BsYXkoKTsKK30KKwordm9pZCBXS0NBQ0ZMYXllcjo6
c2V0RnJhbWUoY29uc3QgQ0dSZWN0JiByZWN0KQoreworICAgIENHUmVjdCBvbGRGcmFtZSA9IGZy
YW1lKCk7CisgICAgaWYgKENHUmVjdEVxdWFsVG9SZWN0KHJlY3QsIG9sZEZyYW1lKSkKKyAgICAg
ICAgcmV0dXJuOworCisgICAgQ0FDRkxheWVyU2V0RnJhbWUobGF5ZXIoKSwgcmVjdCk7CisgICAg
c2V0TmVlZHNDb21taXQoKTsKKworICAgIGlmIChtX25lZWRzTGF5b3V0T25Cb3VuZHNDaGFuZ2Ug
JiYgIUNHU2l6ZUVxdWFsVG9TaXplKG9sZEZyYW1lLnNpemUsIHJlY3Quc2l6ZSkpCisgICAgICAg
IHNldE5lZWRzTGF5b3V0KCk7CisgICAgaWYgKG1fbmVlZHNEaXNwbGF5T25Cb3VuZHNDaGFuZ2Up
CisgICAgICAgIHNldE5lZWRzRGlzcGxheSgpOworfQorCitXS0NBQ0ZMYXllciogV0tDQUNGTGF5
ZXI6OnJvb3RMYXllcigpIGNvbnN0Cit7CisgICAgV0tDQUNGTGF5ZXIqIGxheWVyID0gY29uc3Rf
Y2FzdDxXS0NBQ0ZMYXllcio+KHRoaXMpOworICAgIGZvciAoV0tDQUNGTGF5ZXIqIHN1cGVybGF5
ZXIgPSBsYXllci0+c3VwZXJsYXllcigpOyBzdXBlcmxheWVyOyBsYXllciA9IHN1cGVybGF5ZXIs
IHN1cGVybGF5ZXIgPSBzdXBlcmxheWVyLT5zdXBlcmxheWVyKCkpIHsgfQorICAgIHJldHVybiBs
YXllcjsKK30KKwordm9pZCBXS0NBQ0ZMYXllcjo6cmVtb3ZlQWxsU3VibGF5ZXJzKCkKK3sKKyAg
ICBDQUNGTGF5ZXJTZXRTdWJsYXllcnMobGF5ZXIoKSwgMCk7Cit9CisKK3ZvaWQgV0tDQUNGTGF5
ZXI6OnNldFN1YmxheWVycyhWZWN0b3I8UmVmUHRyPFdLQ0FDRkxheWVyPiA+JiBzdWJsYXllcnMp
Cit7CisgICAgaWYgKHN1YmxheWVycy5pc0VtcHR5KCkpCisgICAgICAgIENBQ0ZMYXllclNldFN1
YmxheWVycyhsYXllcigpLCAwKTsKKyAgICBlbHNlIHsKKyAgICAgICAgLy8gQ3JlYXRlIGEgdmVj
dG9yIG9mIENBQ0ZMYXllcnMuCisgICAgICAgIFZlY3Rvcjxjb25zdCB2b2lkKj4gbGF5ZXJzOwor
ICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN1YmxheWVycy5zaXplKCk7IGkrKykKKyAg
ICAgICAgICAgIGxheWVycy5hcHBlbmQoc3VibGF5ZXJzW2ldLT5sYXllcigpKTsKKyAgICAKKyAg
ICAgICAgUmV0YWluUHRyPENGQXJyYXlSZWY+IGxheWVyc0FycmF5KEFkb3B0Q0YsIENGQXJyYXlD
cmVhdGUoMCwgbGF5ZXJzLmRhdGEoKSwgbGF5ZXJzLnNpemUoKSwgMCkpOworICAgICAgICBDQUNG
TGF5ZXJTZXRTdWJsYXllcnMobGF5ZXIoKSwgbGF5ZXJzQXJyYXkuZ2V0KCkpOworICAgIH0KKyAg
ICAKKyAgICBzZXROZWVkc0NvbW1pdCgpOworfQorCit2b2lkIFdLQ0FDRkxheWVyOjptb3ZlU3Vi
bGF5ZXJzKFdLQ0FDRkxheWVyKiBmcm9tTGF5ZXIsIFdLQ0FDRkxheWVyKiB0b0xheWVyKQorewor
ICAgIGlmICghZnJvbUxheWVyIHx8ICF0b0xheWVyKQorICAgICAgICByZXR1cm47CisKKyAgICBD
QUNGTGF5ZXJTZXRTdWJsYXllcnModG9MYXllci0+bGF5ZXIoKSwgQ0FDRkxheWVyR2V0U3VibGF5
ZXJzKGZyb21MYXllci0+bGF5ZXIoKSkpOworfQorCitXS0NBQ0ZMYXllciogV0tDQUNGTGF5ZXI6
OnN1cGVybGF5ZXIoKSBjb25zdAoreworICAgIENBQ0ZMYXllclJlZiBzdXBlciA9IENBQ0ZMYXll
ckdldFN1cGVybGF5ZXIobGF5ZXIoKSk7CisgICAgaWYgKCFzdXBlcikKKyAgICAgICAgcmV0dXJu
IDA7CisgICAgcmV0dXJuIFdLQ0FDRkxheWVyOjpsYXllcihzdXBlcik7Cit9CisKK3ZvaWQgV0tD
QUNGTGF5ZXI6OnByaW50KCkKK3sKKyAgICAvL0NBUmVuZGVyU2hvdyhDQUNGTGF5ZXJDb3B5UmVu
ZGVyVmFsdWUobGF5ZXIoKSkpOworfQorCit9CisKKyNlbmRpZiAvLyBVU0UoQUNDRUxFUkFURURf
Q09NUE9TSVRJTkcpCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9XS0NBQ0ZM
YXllci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1dLQ0FD
RkxheWVyLmgJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9X
S0NBQ0ZMYXllci5oCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDI2NSBAQAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAwOSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisg
KgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBB
TkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBXS0NB
Q0ZMYXllcl9oCisjZGVmaW5lIFdLQ0FDRkxheWVyX2gKKworI2lmIFVTRShBQ0NFTEVSQVRFRF9D
T01QT1NJVElORykKKworI2luY2x1ZGUgIlN0cmluZ0hhc2guaCIKKworI2luY2x1ZGUgPHd0Zi9S
ZWZDb3VudGVkLmg+CisKKyNpbmNsdWRlIDxRdWFydHpDb3JlL0NBQ0ZMYXllci5oPgorI2luY2x1
ZGUgPFF1YXJ0ekNvcmUvQ0FDRlZlY3Rvci5oPgorI2luY2x1ZGUgPHd0Zi9QYXNzUmVmUHRyLmg+
CisjaW5jbHVkZSA8d3RmL1JldGFpblB0ci5oPgorI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKwor
I2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgorI2luY2x1ZGUgIkdyYXBoaWNzTGF5ZXJDQUNG
LmgiCisjaW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIKKyNpbmNsdWRlICJUcmFuc2Zvcm1hdGlv
bk1hdHJpeC5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIFdLQ0FDRkFuaW1hdGlv
bjsKK2NsYXNzIFdLQ0FDRlRpbWluZ0Z1bmN0aW9uOworCitjbGFzcyBXS0NBQ0ZMYXllciA6IHB1
YmxpYyBSZWZDb3VudGVkPFdLQ0FDRkxheWVyPiB7CitwdWJsaWM6CisgICAgc3RhdGljIFBhc3NS
ZWZQdHI8V0tDQUNGTGF5ZXI+IGNyZWF0ZShDRlN0cmluZ1JlZiBjbGFzc05hbWUsIEdyYXBoaWNz
TGF5ZXJDQUNGKiBvd25lcj0wKSB7IHJldHVybiBhZG9wdFJlZihuZXcgV0tDQUNGTGF5ZXIoY2xh
c3NOYW1lLCBvd25lcikpOyB9CisgICAgc3RhdGljIFdLQ0FDRkxheWVyKiBsYXllcihDQUNGTGF5
ZXJSZWYgbGF5ZXIpIHsgcmV0dXJuIHN0YXRpY19jYXN0PFdLQ0FDRkxheWVyKj4oQ0FDRkxheWVy
R2V0VXNlckRhdGEobGF5ZXIpKTsgfQorCisgICAgfldLQ0FDRkxheWVyKCk7CisKKyAgICB2b2lk
IGJlY29tZUxheWVyRm9yQ29udGV4dChDQUNGQ29udGV4dFJlZik7CisKKyAgICBzdGF0aWMgUmV0
YWluUHRyPENGVHlwZVJlZj4gY2ZWYWx1ZShmbG9hdCB2YWx1ZSkgeyByZXR1cm4gUmV0YWluUHRy
PENGVHlwZVJlZj4oQWRvcHRDRiwgQ0ZOdW1iZXJDcmVhdGUoMCwga0NGTnVtYmVyRmxvYXQzMlR5
cGUsICZ2YWx1ZSkpOyB9CisgICAgc3RhdGljIFJldGFpblB0cjxDRlR5cGVSZWY+IGNmVmFsdWUo
Y29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIHZhbHVlKQorICAgIHsKKyAgICAgICAgQ0FUcmFu
c2Zvcm0zRCB0OworICAgICAgICB0Lm0xMSA9IHZhbHVlLm0xMSgpOyB0Lm0xMiA9IHZhbHVlLm0x
MigpOyB0Lm0xMyA9IHZhbHVlLm0xMygpOyB0Lm0xNCA9IHZhbHVlLm0xNCgpOyAKKyAgICAgICAg
dC5tMjEgPSB2YWx1ZS5tMjEoKTsgdC5tMjIgPSB2YWx1ZS5tMjIoKTsgdC5tMjMgPSB2YWx1ZS5t
MjMoKTsgdC5tMjQgPSB2YWx1ZS5tMjQoKTsgCisgICAgICAgIHQubTMxID0gdmFsdWUubTMxKCk7
IHQubTMyID0gdmFsdWUubTMyKCk7IHQubTMzID0gdmFsdWUubTMzKCk7IHQubTM0ID0gdmFsdWUu
bTM0KCk7IAorICAgICAgICB0Lm00MSA9IHZhbHVlLm00MSgpOyB0Lm00MiA9IHZhbHVlLm00Migp
OyB0Lm00MyA9IHZhbHVlLm00MygpOyB0Lm00NCA9IHZhbHVlLm00NCgpOyAKKyAgICAgICAgcmV0
dXJuIFJldGFpblB0cjxDRlR5cGVSZWY+KEFkb3B0Q0YsIENBQ0ZWZWN0b3JDcmVhdGVUcmFuc2Zv
cm0odCkpOworICAgIH0KKyAgICBzdGF0aWMgUmV0YWluUHRyPENGVHlwZVJlZj4gY2ZWYWx1ZShj
b25zdCBGbG9hdFBvaW50JiB2YWx1ZSkKKyAgICB7CisgICAgICAgIENHUG9pbnQgcDsKKyAgICAg
ICAgcC54ID0gdmFsdWUueCgpOyBwLnkgPSB2YWx1ZS55KCk7CisgICAgICAgIHJldHVybiBSZXRh
aW5QdHI8Q0ZUeXBlUmVmPihBZG9wdENGLCBDQUNGVmVjdG9yQ3JlYXRlUG9pbnQocCkpOworICAg
IH0KKyAgICBzdGF0aWMgUmV0YWluUHRyPENGVHlwZVJlZj4gY2ZWYWx1ZShjb25zdCBGbG9hdFJl
Y3QmIHJlY3QpCisgICAgeworICAgICAgICBDR1JlY3QgcjsKKyAgICAgICAgci5vcmlnaW4ueCA9
IHJlY3QueCgpOyByLm9yaWdpbi55ID0gcmVjdC55KCk7CisgICAgICAgIHIuc2l6ZS53aWR0aCA9
IHJlY3Qud2lkdGgoKTsgci5zaXplLmhlaWdodCA9IHJlY3QuaGVpZ2h0KCk7CisgICAgICAgIENH
RmxvYXQgdls0XSA9IHsgQ0dSZWN0R2V0TWluWChyKSwgQ0dSZWN0R2V0TWluWShyKSwgQ0dSZWN0
R2V0TWF4WChyKSwgQ0dSZWN0R2V0TWF4WShyKSB9OworICAgICAgICByZXR1cm4gUmV0YWluUHRy
PENGVHlwZVJlZj4oQWRvcHRDRiwgQ0FDRlZlY3RvckNyZWF0ZSg0LCB2KSk7CisgICAgfQorICAg
IHN0YXRpYyBSZXRhaW5QdHI8Q0ZUeXBlUmVmPiBjZlZhbHVlKGNvbnN0IENvbG9yJiBjb2xvcikK
KyAgICB7CisgICAgICAgIHJldHVybiBSZXRhaW5QdHI8Q0ZUeXBlUmVmPihBZG9wdENGLCBDR0Nv
bG9yQ3JlYXRlR2VuZXJpY1JHQihjb2xvci5yZWQoKSwgY29sb3IuZ3JlZW4oKSwgY29sb3IuYmx1
ZSgpLCBjb2xvci5hbHBoYSgpKSk7CisgICAgfQorCisgICAgQ0ZUaW1lSW50ZXJ2YWwgY29udmVy
dFRpbWUoQ0ZUaW1lSW50ZXJ2YWwsIGNvbnN0IFdLQ0FDRkxheWVyKiB0b0xheWVyKSBjb25zdDsK
KyAgICBDR1BvaW50IGNvbnZlcnRQb2ludChjb25zdCBDR1BvaW50JiwgY29uc3QgV0tDQUNGTGF5
ZXIqIHRvTGF5ZXIpIGNvbnN0OworICAgIENHUmVjdCBjb252ZXJ0UmVjdChjb25zdCBDR1JlY3Qm
LCBjb25zdCBXS0NBQ0ZMYXllciogdG9MYXllcikgY29uc3Q7CisKKyAgICB1c2luZyBSZWZDb3Vu
dGVkPFdLQ0FDRkxheWVyPjo6cmVmOworICAgIHVzaW5nIFJlZkNvdW50ZWQ8V0tDQUNGTGF5ZXI+
OjpkZXJlZjsKKyAgICAKKyAgICB2b2lkIGRpc3BsYXkoUGxhdGZvcm1HcmFwaGljc0NvbnRleHQq
KTsKKyAgICB2b2lkIGxheW91dCgpOworCisgICAgYm9vbCBpc1RyYW5zZm9ybUxheWVyKCkgY29u
c3QgeyByZXR1cm4gQ0FDRkxheWVyR2V0Q2xhc3MobGF5ZXIoKSkgPT0ga0NBQ0ZUcmFuc2Zvcm1M
YXllcjsgfQorCisgICAgdm9pZCBhZGRTdWJsYXllcihQYXNzUmVmUHRyPFdLQ0FDRkxheWVyPiBz
dWJsYXllcik7CisgICAgdm9pZCBpbnNlcnRTdWJsYXllcihQYXNzUmVmUHRyPFdLQ0FDRkxheWVy
Piwgc2l6ZV90IGluZGV4KTsKKyAgICB2b2lkIGluc2VydFN1YmxheWVyQWJvdmVMYXllcihQYXNz
UmVmUHRyPFdLQ0FDRkxheWVyPiwgY29uc3QgV0tDQUNGTGF5ZXIqIHJlZmVyZW5jZSk7CisgICAg
dm9pZCBpbnNlcnRTdWJsYXllckJlbG93TGF5ZXIoUGFzc1JlZlB0cjxXS0NBQ0ZMYXllcj4sIGNv
bnN0IFdLQ0FDRkxheWVyKiByZWZlcmVuY2UpOworICAgIGJvb2wgaXNEZXNjZW5kYW50T2YoV0tD
QUNGTGF5ZXIqKSBjb25zdDsKKyAgICB2b2lkIHJlcGxhY2VTdWJsYXllcihXS0NBQ0ZMYXllciog
cmVmZXJlbmNlLCBQYXNzUmVmUHRyPFdLQ0FDRkxheWVyPik7CisgICAgdm9pZCByZW1vdmVGcm9t
U3VwZXJsYXllcigpOworICAgIHN0YXRpYyB2b2lkIG1vdmVTdWJsYXllcnMoV0tDQUNGTGF5ZXIq
IGZyb21MYXllciwgV0tDQUNGTGF5ZXIqIHRvTGF5ZXIpOworCisgICAgV0tDQUNGTGF5ZXIqIGFu
Y2VzdG9yT3JTZWxmV2l0aFN1cGVybGF5ZXIoV0tDQUNGTGF5ZXIqKSBjb25zdDsKKyAgICAKKyAg
ICB2b2lkIHNldEFuY2hvclBvaW50KGNvbnN0IENHUG9pbnQmIHApIHsgQ0FDRkxheWVyU2V0QW5j
aG9yUG9pbnQobGF5ZXIoKSwgcCk7IHNldE5lZWRzQ29tbWl0KCk7IH0KKyAgICBDR1BvaW50IGFu
Y2hvclBvaW50KCkgeyByZXR1cm4gQ0FDRkxheWVyR2V0QW5jaG9yUG9pbnQobGF5ZXIoKSk7IH0K
KworICAgIHZvaWQgc2V0QW5jaG9yUG9pbnRaKENHRmxvYXQgeikgeyBDQUNGTGF5ZXJTZXRBbmNo
b3JQb2ludFoobGF5ZXIoKSwgeik7IHNldE5lZWRzQ29tbWl0KCk7IH0KKyAgICBDR0Zsb2F0IGFu
Y2hvclBvaW50WigpIHsgcmV0dXJuIENBQ0ZMYXllckdldEFuY2hvclBvaW50WihsYXllcigpKTsg
fQorCisgICAgdm9pZCBzZXRCYWNrZ3JvdW5kQ29sb3IoQ0dDb2xvclJlZiBjb2xvcikgeyBDQUNG
TGF5ZXJTZXRCYWNrZ3JvdW5kQ29sb3IobGF5ZXIoKSwgY29sb3IpOyBzZXROZWVkc0NvbW1pdCgp
OyB9CisgICAgQ0dDb2xvclJlZiBiYWNrZ3JvdW5kQ29sb3IoKSBjb25zdCB7IHJldHVybiBDQUNG
TGF5ZXJHZXRCYWNrZ3JvdW5kQ29sb3IobGF5ZXIoKSk7IH0KKworICAgIHZvaWQgc2V0Qm9yZGVy
Q29sb3IoQ0dDb2xvclJlZiBjb2xvcikgeyBDQUNGTGF5ZXJTZXRCb3JkZXJDb2xvcihsYXllcigp
LCBjb2xvcik7IHNldE5lZWRzQ29tbWl0KCk7IH0KKyAgICBDR0NvbG9yUmVmIGJvcmRlckNvbG9y
KCkgY29uc3QgeyByZXR1cm4gQ0FDRkxheWVyR2V0Qm9yZGVyQ29sb3IobGF5ZXIoKSk7IH0KKwor
ICAgIHZvaWQgc2V0Qm9yZGVyV2lkdGgoQ0dGbG9hdCB3aWR0aCkgeyBDQUNGTGF5ZXJTZXRCb3Jk
ZXJXaWR0aChsYXllcigpLCB3aWR0aCk7IHNldE5lZWRzQ29tbWl0KCk7IH0KKyAgICBDR0Zsb2F0
IGJvcmRlcldpZHRoKCkgY29uc3QgeyByZXR1cm4gQ0FDRkxheWVyR2V0Qm9yZGVyV2lkdGgobGF5
ZXIoKSk7IH0KKworICAgIHZvaWQgc2V0Qm91bmRzKGNvbnN0IENHUmVjdCYpOworICAgIENHUmVj
dCBib3VuZHMoKSBjb25zdCB7IHJldHVybiBDQUNGTGF5ZXJHZXRCb3VuZHMobGF5ZXIoKSk7IH0K
KworICAgIHZvaWQgc2V0Q2xlYXJzQ29udGV4dChib29sIGNsZWFycykgeyBDQUNGTGF5ZXJTZXRD
bGVhcnNDb250ZXh0KGxheWVyKCksIGNsZWFycyk7IHNldE5lZWRzQ29tbWl0KCk7IH0KKyAgICBi
b29sIGNsZWFyc0NvbnRleHQoKSBjb25zdCB7IHJldHVybiBDQUNGTGF5ZXJHZXRDbGVhcnNDb250
ZXh0KGxheWVyKCkpOyB9CisKKyAgICB2b2lkIHNldENvbnRlbnRzKENHSW1hZ2VSZWYgY29udGVu
dHMpIHsgQ0FDRkxheWVyU2V0Q29udGVudHMobGF5ZXIoKSwgY29udGVudHMpOyBzZXROZWVkc0Nv
bW1pdCgpOyB9CisgICAgQ0dJbWFnZVJlZiBjb250ZW50cygpIGNvbnN0IHsgcmV0dXJuIHN0YXRp
Y19jYXN0PENHSW1hZ2VSZWY+KGNvbnN0X2Nhc3Q8dm9pZCo+KENBQ0ZMYXllckdldENvbnRlbnRz
KGxheWVyKCkpKSk7IH0KKworICAgIHZvaWQgc2V0Q29udGVudHNSZWN0KGNvbnN0IENHUmVjdCYg
Y29udGVudHNSZWN0KSB7IENBQ0ZMYXllclNldENvbnRlbnRzUmVjdChsYXllcigpLCBjb250ZW50
c1JlY3QpOyBzZXROZWVkc0NvbW1pdCgpOyB9CisgICAgQ0dSZWN0IGNvbnRlbnRzUmVjdCgpIGNv
bnN0IHsgcmV0dXJuIENBQ0ZMYXllckdldENvbnRlbnRzUmVjdChsYXllcigpKTsgfQorCisgICAg
dm9pZCBzZXRDb250ZW50c0dyYXZpdHkoQ0ZTdHJpbmdSZWYgc3RyKSB7IENBQ0ZMYXllclNldENv
bnRlbnRzR3Jhdml0eShsYXllcigpLCBzdHIpOyBzZXROZWVkc0NvbW1pdCgpOyB9CisgICAgQ0ZT
dHJpbmdSZWYgY29udGVudHNHcmF2aXR5KCkgeyByZXR1cm4gQ0FDRkxheWVyR2V0Q29udGVudHNH
cmF2aXR5KGxheWVyKCkpOyB9CisgICAgICAgIAorICAgIHZvaWQgc2V0RG91YmxlU2lkZWQoYm9v
bCBiKSB7IENBQ0ZMYXllclNldERvdWJsZVNpZGVkKGxheWVyKCksIGIpOyBzZXROZWVkc0NvbW1p
dCgpOyB9CisgICAgYm9vbCBkb3VibGVTaWRlZCgpIGNvbnN0IHsgcmV0dXJuIENBQ0ZMYXllcklz
RG91YmxlU2lkZWQobGF5ZXIoKSk7IH0KKworICAgIHZvaWQgc2V0RWRnZUFudGlhbGlhc2luZ01h
c2sodWludDMyX3QgbWFzaykgeyBDQUNGTGF5ZXJTZXRFZGdlQW50aWFsaWFzaW5nTWFzayhsYXll
cigpLCBtYXNrKTsgc2V0TmVlZHNDb21taXQoKTsgfQorICAgIHVpbnQzMl90IGVkZ2VBbnRpYWxp
YXNpbmdNYXNrKCkgY29uc3QgeyByZXR1cm4gQ0FDRkxheWVyR2V0RWRnZUFudGlhbGlhc2luZ01h
c2sobGF5ZXIoKSk7IH0KKworICAgIHZvaWQgc2V0RmlsdGVycyhDRkFycmF5UmVmIGZpbHRlcnMp
IHsgQ0FDRkxheWVyU2V0RmlsdGVycyhsYXllcigpLCBmaWx0ZXJzKTsgc2V0TmVlZHNDb21taXQo
KTsgfQorICAgIENGQXJyYXlSZWYgZmlsdGVycygpIGNvbnN0IHsgcmV0dXJuIENBQ0ZMYXllckdl
dEZpbHRlcnMobGF5ZXIoKSk7IH0KKworICAgIHZvaWQgc2V0RnJhbWUoY29uc3QgQ0dSZWN0Jik7
CisgICAgQ0dSZWN0IGZyYW1lKCkgY29uc3QgeyByZXR1cm4gQ0FDRkxheWVyR2V0RnJhbWUobGF5
ZXIoKSk7IH0KKworICAgIHZvaWQgc2V0SGlkZGVuKGJvb2wgaGlkZGVuKSB7IENBQ0ZMYXllclNl
dEhpZGRlbihsYXllcigpLCBoaWRkZW4pOyBzZXROZWVkc0NvbW1pdCgpOyB9CisgICAgYm9vbCBp
c0hpZGRlbigpIGNvbnN0IHsgcmV0dXJuIENBQ0ZMYXllcklzSGlkZGVuKGxheWVyKCkpOyB9CisK
KyAgICB2b2lkIHNldE1hc2tzVG9Cb3VuZHMoYm9vbCBiKSB7IENBQ0ZMYXllclNldE1hc2tzVG9C
b3VuZHMobGF5ZXIoKSwgYik7IH0KKyAgICBib29sIG1hc2tzVG9Cb3VuZHMoKSBjb25zdCB7IHJl
dHVybiBDQUNGTGF5ZXJHZXRNYXNrc1RvQm91bmRzKGxheWVyKCkpOyB9CisKKyAgICB2b2lkIHNl
dE1hZ25pZmljYXRpb25GaWx0ZXIoY29uc3QgU3RyaW5nJiBzdHJpbmcpIHsgQ0FDRkxheWVyU2V0
TWFnbmlmaWNhdGlvbkZpbHRlcihsYXllcigpLCBSZXRhaW5QdHI8Q0ZTdHJpbmdSZWY+KEFkb3B0
Q0YsIHN0cmluZy5jcmVhdGVDRlN0cmluZygpKS5nZXQoKSk7IH0KKyAgICBTdHJpbmcgbWFnbmlm
aWNhdGlvbkZpbHRlcigpIGNvbnN0IHsgcmV0dXJuIENBQ0ZMYXllckdldE1hZ25pZmljYXRpb25G
aWx0ZXIobGF5ZXIoKSk7IH0KKworICAgIHZvaWQgc2V0TWluaWZpY2F0aW9uRmlsdGVyKGNvbnN0
IFN0cmluZyYgc3RyaW5nKSB7IENBQ0ZMYXllclNldE1pbmlmaWNhdGlvbkZpbHRlcihsYXllcigp
LCBSZXRhaW5QdHI8Q0ZTdHJpbmdSZWY+KEFkb3B0Q0YsIHN0cmluZy5jcmVhdGVDRlN0cmluZygp
KS5nZXQoKSk7IH0KKyAgICBTdHJpbmcgbWluaWZpY2F0aW9uRmlsdGVyKCkgY29uc3QgeyByZXR1
cm4gQ0FDRkxheWVyR2V0TWluaWZpY2F0aW9uRmlsdGVyKGxheWVyKCkpOyB9CisKKyAgICB2b2lk
IHNldE1pbmlmaWNhdGlvbkZpbHRlckJpYXMoZmxvYXQgYmlhcykgeyBDQUNGTGF5ZXJTZXRNaW5p
ZmljYXRpb25GaWx0ZXJCaWFzKGxheWVyKCksIGJpYXMpOyB9CisgICAgZmxvYXQgbWluaWZpY2F0
aW9uRmlsdGVyQmlhcygpIGNvbnN0IHsgcmV0dXJuIENBQ0ZMYXllckdldE1pbmlmaWNhdGlvbkZp
bHRlckJpYXMobGF5ZXIoKSk7IH0KKworICAgIHZvaWQgc2V0TmFtZShjb25zdCBTdHJpbmcmIG5h
bWUpIHsgQ0FDRkxheWVyU2V0TmFtZShsYXllcigpLCBSZXRhaW5QdHI8Q0ZTdHJpbmdSZWY+KEFk
b3B0Q0YsIG5hbWUuY3JlYXRlQ0ZTdHJpbmcoKSkuZ2V0KCkpOyB9CisgICAgU3RyaW5nIG5hbWUo
KSBjb25zdCB7IHJldHVybiBDQUNGTGF5ZXJHZXROYW1lKGxheWVyKCkpOyB9CisKKyAgICB2b2lk
IHNldE5lZWRzRGlzcGxheShjb25zdCBDR1JlY3QmIGRpcnR5UmVjdCkKKyAgICB7CisgICAgICAg
IGlmIChtX293bmVyKQorICAgICAgICAgICAgQ0FDRkxheWVyU2V0TmVlZHNEaXNwbGF5KGxheWVy
KCksICZkaXJ0eVJlY3QpOworICAgICAgICBzZXROZWVkc0NvbW1pdCgpOworICAgIH0KKworICAg
IHZvaWQgc2V0TmVlZHNEaXNwbGF5KCkKKyAgICB7CisgICAgICAgIGlmIChtX293bmVyKQorICAg
ICAgICAgICAgQ0FDRkxheWVyU2V0TmVlZHNEaXNwbGF5KGxheWVyKCksIDApOworICAgICAgICBz
ZXROZWVkc0NvbW1pdCgpOworICAgIH0KKyAgICAKKyAgICB2b2lkIHNldE5lZWRzRGlzcGxheU9u
Qm91bmRzQ2hhbmdlKGJvb2wgbmVlZHNEaXNwbGF5KSB7IG1fbmVlZHNEaXNwbGF5T25Cb3VuZHND
aGFuZ2UgPSBuZWVkc0Rpc3BsYXk7IH0KKworICAgIHZvaWQgc2V0TmVlZHNMYXlvdXQoKSB7IENB
Q0ZMYXllclNldE5lZWRzTGF5b3V0KGxheWVyKCkpOyBzZXROZWVkc0NvbW1pdCgpOyB9CisgICAg
dm9pZCBzZXROZWVkc0xheW91dE9uQm91bmRzQ2hhbmdlKGJvb2wgbmVlZHNMYXlvdXQpIHsgbV9u
ZWVkc0xheW91dE9uQm91bmRzQ2hhbmdlID0gbmVlZHNMYXlvdXQ7IH0KKworICAgIHZvaWQgc2V0
T3BhY2l0eShmbG9hdCBvcGFjaXR5KQorICAgIHsKKyAgICAgICAgQ0FDRkxheWVyU2V0T3BhY2l0
eShsYXllcigpLCBvcGFjaXR5KTsKKyAgICAgICAgc2V0TmVlZHNDb21taXQoKTsKKyAgICB9CisK
KyAgICBmbG9hdCBvcGFjaXR5KCkgY29uc3QgeyByZXR1cm4gQ0FDRkxheWVyR2V0T3BhY2l0eShs
YXllcigpKTsgfQorCisgICAgdm9pZCBzZXRPcGFxdWUoYm9vbCBiKSB7IENBQ0ZMYXllclNldE9w
YXF1ZShsYXllcigpLCBiKTsgc2V0TmVlZHNDb21taXQoKTsgfQorICAgIGJvb2wgb3BhcXVlKCkg
Y29uc3QgeyByZXR1cm4gQ0FDRkxheWVySXNPcGFxdWUobGF5ZXIoKSk7IH0KKworICAgIHZvaWQg
c2V0UG9zaXRpb24oY29uc3QgQ0dQb2ludCYgcG9zaXRpb24pIHsgQ0FDRkxheWVyU2V0UG9zaXRp
b24obGF5ZXIoKSwgcG9zaXRpb24pOyBzZXROZWVkc0NvbW1pdCgpOyB9CisgICAgQ0dQb2ludCBw
b3NpdGlvbigpIGNvbnN0IHsgcmV0dXJuIENBQ0ZMYXllckdldFBvc2l0aW9uKGxheWVyKCkpOyB9
CisKKyAgICB2b2lkIHNldFpQb3NpdGlvbihDR0Zsb2F0IHBvc2l0aW9uKSB7IENBQ0ZMYXllclNl
dFpQb3NpdGlvbihsYXllcigpLCBwb3NpdGlvbik7IHNldE5lZWRzQ29tbWl0KCk7IH0KKyAgICBD
R0Zsb2F0IHpQb3NpdGlvbigpIGNvbnN0IHsgcmV0dXJuIENBQ0ZMYXllckdldFpQb3NpdGlvbihs
YXllcigpKTsgfQorCisgICAgdm9pZCBzZXRTcGVlZChmbG9hdCBzcGVlZCkgeyBDQUNGTGF5ZXJT
ZXRTcGVlZChsYXllcigpLCBzcGVlZCk7IH0KKyAgICBDRlRpbWVJbnRlcnZhbCBzcGVlZCgpIGNv
bnN0IHsgQ0FDRkxheWVyR2V0U3BlZWQobGF5ZXIoKSk7IH0KKworICAgIHZvaWQgc2V0VGltZU9m
ZnNldChDRlRpbWVJbnRlcnZhbCB0KSB7IENBQ0ZMYXllclNldFRpbWVPZmZzZXQobGF5ZXIoKSwg
dCk7IH0KKyAgICBDRlRpbWVJbnRlcnZhbCB0aW1lT2Zmc2V0KCkgY29uc3QgeyBDQUNGTGF5ZXJH
ZXRUaW1lT2Zmc2V0KGxheWVyKCkpOyB9CisKKyAgICBXS0NBQ0ZMYXllciogcm9vdExheWVyKCkg
Y29uc3Q7CisKKyAgICB2b2lkIHNldFNvcnRzU3VibGF5ZXJzKGJvb2wgc29ydHMpIHsgQ0FDRkxh
eWVyU2V0U29ydHNTdWJsYXllcnMobGF5ZXIoKSwgc29ydHMpOyBzZXROZWVkc0NvbW1pdCgpOyB9
CisgICAgYm9vbCBzb3J0c1N1YmxheWVycygpIGNvbnN0IHsgcmV0dXJuIENBQ0ZMYXllckdldFNv
cnRzU3VibGF5ZXJzKGxheWVyKCkpOyB9CisKKyAgICB2b2lkIHJlbW92ZUFsbFN1YmxheWVycygp
OworICAgIAorICAgIHZvaWQgc2V0U3VibGF5ZXJzKFZlY3RvcjxSZWZQdHI8V0tDQUNGTGF5ZXI+
ID4mKTsKKworICAgIHZvaWQgc2V0U3VibGF5ZXJUcmFuc2Zvcm0oY29uc3QgQ0FUcmFuc2Zvcm0z
RCYgdHJhbnNmb3JtKSB7IENBQ0ZMYXllclNldFN1YmxheWVyVHJhbnNmb3JtKGxheWVyKCksIHRy
YW5zZm9ybSk7IHNldE5lZWRzQ29tbWl0KCk7IH0KKyAgICBDQVRyYW5zZm9ybTNEIHN1YmxheWVy
VHJhbnNmb3JtKCkgY29uc3QgeyByZXR1cm4gQ0FDRkxheWVyR2V0U3VibGF5ZXJUcmFuc2Zvcm0o
bGF5ZXIoKSk7IH0KKworICAgIFdLQ0FDRkxheWVyKiBzdXBlcmxheWVyKCkgY29uc3Q7CisKKyAg
ICB2b2lkIHNldFRyYW5zZm9ybShjb25zdCBDQVRyYW5zZm9ybTNEJiB0cmFuc2Zvcm0pIHsgQ0FD
RkxheWVyU2V0VHJhbnNmb3JtKGxheWVyKCksIHRyYW5zZm9ybSk7IHNldE5lZWRzQ29tbWl0KCk7
IH0KKyAgICBDQVRyYW5zZm9ybTNEIHRyYW5zZm9ybSgpIGNvbnN0IHsgcmV0dXJuIENBQ0ZMYXll
ckdldFRyYW5zZm9ybShsYXllcigpKTsgfQorCisgICAgdm9pZCBzZXRHZW9tZXRyeUZsaXBwZWQo
Ym9vbCBmbGlwcGVkKSB7IENBQ0ZMYXllclNldEdlb21ldHJ5RmxpcHBlZChsYXllcigpLCBmbGlw
cGVkKTsgc2V0TmVlZHNDb21taXQoKTsgfQorICAgIGJvb2wgZ2VvbWV0cnlGbGlwcGVkKCkgY29u
c3QgeyByZXR1cm4gQ0FDRkxheWVySXNHZW9tZXRyeUZsaXBwZWQobGF5ZXIoKSk7IH0KKworICAg
IC8vIFByaW50IHRoZSB0cmVlIGZyb20gdGhpcyBsYXllciBkb3duCisgICAgdm9pZCBwcmludCgp
OworCisKK3Byb3RlY3RlZDoKKyAgICBXS0NBQ0ZMYXllcihDRlN0cmluZ1JlZiBjbGFzc05hbWUs
IEdyYXBoaWNzTGF5ZXJDQUNGKiBvd25lcik7CisKK3ByaXZhdGU6CisgICAgdm9pZCBzZXROZWVk
c0NvbW1pdCgpOworICAgIENBQ0ZMYXllclJlZiBsYXllcigpIGNvbnN0IHsgcmV0dXJuIG1fbGF5
ZXIuZ2V0KCk7IH0KKyAgICBzaXplX3QgbnVtU3VibGF5ZXJzKCkgY29uc3QKKyAgICB7CisgICAg
ICAgIENGQXJyYXlSZWYgc3VibGF5ZXJzID0gQ0FDRkxheWVyR2V0U3VibGF5ZXJzKGxheWVyKCkp
OworICAgICAgICByZXR1cm4gc3VibGF5ZXJzID8gQ0ZBcnJheUdldENvdW50KHN1YmxheWVycykg
OiAwOworICAgIH0KKyAgICAKKyAgICBpbnQgZmluZFN1YmxheWVyKGNvbnN0IFdLQ0FDRkxheWVy
Kik7CisKKyAgICAvLyBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBmcm9tIHJlbW92ZUZyb21T
dXBlcmxheWVyLgorICAgIHZvaWQgcmVtb3ZlU3VibGF5ZXIoY29uc3QgV0tDQUNGTGF5ZXIqKTsK
KworICAgIFJldGFpblB0cjxDQUNGTGF5ZXJSZWY+IG1fbGF5ZXI7CisgICAgYm9vbCBtX25lZWRz
TGF5b3V0T25Cb3VuZHNDaGFuZ2U7CisgICAgYm9vbCBtX25lZWRzRGlzcGxheU9uQm91bmRzQ2hh
bmdlOworICAgIEdyYXBoaWNzTGF5ZXJDQUNGKiBtX293bmVyOworfTsKKworfQorCisjZW5kaWYg
Ly8gVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorCisjZW5kaWYgLy8gV0tDQUNGTGF5ZXJf
aApJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vV0tDQUNGTGF5ZXJXaW5kb3cu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1dLQ0FDRkxh
eWVyV2luZG93LmNwcAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
d2luL1dLQ0FDRkxheWVyV2luZG93LmNwcAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw0MTMgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5D
LiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMu
IE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisK
KyNpbmNsdWRlICJjb25maWcuaCIKKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykK
KworI2luY2x1ZGUgIldLQ0FDRkxheWVyV2luZG93LmgiCisKKyNpbmNsdWRlICJXS0NBQ0ZDb250
ZXh0Rmx1c2hlci5oIgorI2luY2x1ZGUgIldLQ0FDRkxheWVyLmgiCisjaW5jbHVkZSA8Q29yZUdy
YXBoaWNzL0NHU1JlZ2lvbi5oPgorI2luY2x1ZGUgPFF1YXJ0ekNvcmUvQ0FDRkNvbnRleHQuaD4K
KyNpbmNsdWRlIDxRdWFydHpDb3JlL0NBUmVuZGVyT0dMLmg+CisjaW5jbHVkZSA8d3RmL0hhc2hN
YXAuaD4KKyNpbmNsdWRlIDx3dGYvT3duQXJyYXlQdHIuaD4KKyNpbmNsdWRlIDxkM2Q5Lmg+Cisj
aW5jbHVkZSA8ZDNkeDkuaD4KKyNpbmNsdWRlIDxkeGVycjkuaD4KKworc3RhdGljIElEaXJlY3Qz
RDkqIHNfZDNkID0gMDsKK3N0YXRpYyBJRGlyZWN0M0Q5KiBkM2QoKQoreworICAgIGlmIChzX2Qz
ZCkKKyAgICAgICAgcmV0dXJuIHNfZDNkOworCisgICAgaWYgKCFMb2FkTGlicmFyeShURVhUKCJk
M2Q5LmRsbCIpKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBzX2QzZCA9IERpcmVjdDNEQ3Jl
YXRlOShEM0RfU0RLX1ZFUlNJT04pOworCisgICAgcmV0dXJuIHNfZDNkOworfQorCitpbmxpbmUg
c3RhdGljIENHUmVjdCB3aW5SZWN0VG9DR1JlY3QoUkVDVCByYykKK3sKKyAgICByZXR1cm4gQ0dS
ZWN0TWFrZSgoZmxvYXQpcmMubGVmdCwgKGZsb2F0KXJjLnRvcCwgKGZsb2F0KShyYy5yaWdodCAt
IHJjLmxlZnQpLCAoZmxvYXQpKHJjLmJvdHRvbSAtIHJjLnRvcCkpOworfQorCitpbmxpbmUgc3Rh
dGljIENHUmVjdCB3aW5SZWN0VG9DR1JlY3QoUkVDVCByYywgUkVDVCByZWxhdGl2ZVRvUmVjdCkK
K3sKKyAgICByZXR1cm4gQ0dSZWN0TWFrZSgoZmxvYXQpcmMubGVmdCwgKGZsb2F0KShyZWxhdGl2
ZVRvUmVjdC5ib3R0b20tcmMuYm90dG9tKSwgKGZsb2F0KShyYy5yaWdodCAtIHJjLmxlZnQpLCAo
ZmxvYXQpKHJjLmJvdHRvbSAtIHJjLnRvcCkpOworfQorCituYW1lc3BhY2UgV2ViQ29yZSB7CisK
K3R5cGVkZWYgSGFzaE1hcDxDQUNGQ29udGV4dFJlZiwgV0tDQUNGTGF5ZXJXaW5kb3cqPiBDb250
ZXh0VG9XaW5kb3dNYXA7CisKK3N0YXRpYyBDb250ZXh0VG9XaW5kb3dNYXAmIHdpbmRvd3NGb3JD
b250ZXh0cygpCit7CisgICAgc3RhdGljIENvbnRleHRUb1dpbmRvd01hcCYgbWFwID0gKm5ldyBD
b250ZXh0VG9XaW5kb3dNYXA7CisgICAgcmV0dXJuIG1hcDsKK30KKworc3RhdGljIEQzRFBSRVNF
TlRfUEFSQU1FVEVSUyBpbml0aWFsUHJlc2VudGF0aW9uUGFyYW1ldGVycygpCit7CisgICAgRDNE
UFJFU0VOVF9QQVJBTUVURVJTIHBhcmFtZXRlcnMgPSB7MH07CisgICAgcGFyYW1ldGVycy5XaW5k
b3dlZCA9IFRSVUU7CisgICAgcGFyYW1ldGVycy5Td2FwRWZmZWN0ID0gRDNEU1dBUEVGRkVDVF9D
T1BZOworICAgIHBhcmFtZXRlcnMuQmFja0J1ZmZlckNvdW50ID0gMTsKKyAgICBwYXJhbWV0ZXJz
LkJhY2tCdWZmZXJGb3JtYXQgPSBEM0RGTVRfQThSOEc4Qjg7CisgICAgcGFyYW1ldGVycy5NdWx0
aVNhbXBsZVR5cGUgPSBEM0RNVUxUSVNBTVBMRV9OT05FOworCisgICAgcmV0dXJuIHBhcmFtZXRl
cnM7Cit9CisKK3ZvaWQgV0tDQUNGTGF5ZXJXaW5kb3c6OmRpZEZsdXNoQ29udGV4dChDQUNGQ29u
dGV4dFJlZiBjb250ZXh0KQoreworICAgIFdLQ0FDRkxheWVyV2luZG93KiB3aW5kb3cgPSB3aW5k
b3dzRm9yQ29udGV4dHMoKS5nZXQoY29udGV4dCk7CisgICAgaWYgKCF3aW5kb3cpCisgICAgICAg
IHJldHVybjsKKworICAgIHdpbmRvdy0+cmVuZGVyU29vbigpOworfQorCitXS0NBQ0ZMYXllcldp
bmRvdzo6V0tDQUNGTGF5ZXJXaW5kb3coKQorICAgIDogbV90cmllZFRvQ3JlYXRlRDNEUmVuZGVy
ZXIoZmFsc2UpCisgICAgLCBtX3JlbmRlckNvbnRleHQoMCkKKyAgICAsIG1fcmVuZGVyZXIoMCkK
KyAgICAsIG1faG9zdFdpbmRvdygwKQorICAgICwgbV9yZW5kZXJUaW1lcih0aGlzLCAmV0tDQUNG
TGF5ZXJXaW5kb3c6OnJlbmRlclRpbWVyRmlyZWQpCisgICAgLCBtX3Njcm9sbEZyYW1lV2lkdGgo
MSkKKyAgICAsIG1fc2Nyb2xsRnJhbWVIZWlnaHQoMSkKK3sKK30KKworV0tDQUNGTGF5ZXJXaW5k
b3c6On5XS0NBQ0ZMYXllcldpbmRvdygpCit7CisgICAgZGVzdHJveVJlbmRlcmVyKCk7Cit9CisK
K3ZvaWQgV0tDQUNGTGF5ZXJXaW5kb3c6OnNldFNjcm9sbEZyYW1lKGludCB3aWR0aCwgaW50IGhl
aWdodCwgaW50IHNjcm9sbFgsIGludCBzY3JvbGxZKQoreworICAgIG1fc2Nyb2xsRnJhbWVXaWR0
aCA9IHdpZHRoOworICAgIG1fc2Nyb2xsRnJhbWVIZWlnaHQgPSBoZWlnaHQ7CisKKyAgICBDR1Jl
Y3QgY29udGVudHNSZWN0ID0gQ0dSZWN0TWFrZShzY3JvbGxYLCBzY3JvbGxZLCB3aWR0aCwgaGVp
Z2h0KTsKKyAgICBtX3Njcm9sbExheWVyLT5zZXRGcmFtZShjb250ZW50c1JlY3QpOworCisgICAg
aWYgKG1fcm9vdENoaWxkTGF5ZXIpIHsKKyAgICAgICAgY29udGVudHNSZWN0Lm9yaWdpbi54ID0g
MDsKKyAgICAgICAgY29udGVudHNSZWN0Lm9yaWdpbi55ID0gMDsKKyAgICAgICAgbV9yb290Q2hp
bGRMYXllci0+c2V0RnJhbWUoY29udGVudHNSZWN0KTsKKyAgICB9Cit9CisKK3ZvaWQgV0tDQUNG
TGF5ZXJXaW5kb3c6OnNldFJvb3RDb250ZW50cyhDR0ltYWdlUmVmIGltYWdlKQoreworICAgIEFT
U0VSVChtX3Jvb3RMYXllcik7CisgICAgbV9yb290TGF5ZXItPnNldENvbnRlbnRzKGltYWdlKTsK
KyAgICByZW5kZXJTb29uKCk7Cit9CisKK3ZvaWQgV0tDQUNGTGF5ZXJXaW5kb3c6OnNldFJvb3RD
aGlsZExheWVyKFdlYkNvcmU6OlBsYXRmb3JtTGF5ZXIqIGxheWVyKQoreworICAgIGlmICghbV9z
Y3JvbGxMYXllcikKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9zY3JvbGxMYXllci0+cmVtb3Zl
QWxsU3VibGF5ZXJzKCk7CisgICAgaWYgKGxheWVyKSB7CisgICAgICAgIG1fc2Nyb2xsTGF5ZXIt
PmFkZFN1YmxheWVyKGxheWVyKTsKKworICAgICAgICAvLyBTZXQgdGhlIGZyYW1lCisgICAgICAg
IGxheWVyLT5zZXRGcmFtZShDR1JlY3RNYWtlKDAsIDAsIG1fc2Nyb2xsRnJhbWVXaWR0aCwgbV9z
Y3JvbGxGcmFtZUhlaWdodCkpOworICAgIH0KKworICAgIG1fcm9vdENoaWxkTGF5ZXIgPSBsYXll
cjsKKworfQorICAgCit2b2lkIFdLQ0FDRkxheWVyV2luZG93OjpzZXROZWVkc0Rpc3BsYXkoKQor
eworICAgIEFTU0VSVChtX3Jvb3RMYXllcik7CisgICAgbV9yb290TGF5ZXItPnNldE5lZWRzRGlz
cGxheSgpOworICAgIHJlbmRlclNvb24oKTsKK30KKwordm9pZCBXS0NBQ0ZMYXllcldpbmRvdzo6
Y3JlYXRlUmVuZGVyZXIoKQoreworICAgIGlmIChtX3RyaWVkVG9DcmVhdGVEM0RSZW5kZXJlcikK
KyAgICAgICAgcmV0dXJuOworCisgICAgbV90cmllZFRvQ3JlYXRlRDNEUmVuZGVyZXIgPSB0cnVl
OworICAgIEQzRFBSRVNFTlRfUEFSQU1FVEVSUyBwYXJhbWV0ZXJzID0gaW5pdGlhbFByZXNlbnRh
dGlvblBhcmFtZXRlcnMoKTsKKworICAgIGlmICghZDNkKCkgfHwgITo6SXNXaW5kb3cobV9ob3N0
V2luZG93KSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gRDNEIGRvZXNuJ3QgbGlrZSB0byBt
YWtlIGJhY2sgYnVmZmVycyBmb3IgMCBzaXplIHdpbmRvd3MuIFdlIHNraXJ0IHRoaXMgcHJvYmxl
bSBpZiB3ZSBtYWtlIHRoZQorICAgIC8vIHBhc3NlZCBiYWNrYnVmZmVyIHdpZHRoIGFuZCBoZWln
aHQgbm9uLXplcm8uIFRoZSB3aW5kb3cgd2lsbCBuZWNlc3NhcmlseSBnZXQgc2V0IHRvIGEgbm9u
LXplcm8KKyAgICAvLyBzaXplIGV2ZW50dWFsbHksIGFuZCB0aGVuIHRoZSBiYWNrYnVmZmVyIHNp
emUgd2lsbCBnZXQgcmVzZXQuCisgICAgUkVDVCByZWN0OworICAgIEdldENsaWVudFJlY3QobV9o
b3N0V2luZG93LCAmcmVjdCk7CisKKyAgICBpZiAocmVjdC5sZWZ0LXJlY3QucmlnaHQgPT0gMCB8
fCByZWN0LmJvdHRvbS1yZWN0LnRvcCA9PSAwKSB7CisgICAgICAgIHBhcmFtZXRlcnMuQmFja0J1
ZmZlcldpZHRoID0gMTsKKyAgICAgICAgcGFyYW1ldGVycy5CYWNrQnVmZmVySGVpZ2h0ID0gMTsK
KyAgICB9CisKKyAgICBpZiAoRkFJTEVEKGQzZCgpLT5DcmVhdGVEZXZpY2UoRDNEQURBUFRFUl9E
RUZBVUxULCBEM0RERVZUWVBFX0hBTCwgbV9ob3N0V2luZG93LCBEM0RDUkVBVEVfSEFSRFdBUkVf
VkVSVEVYUFJPQ0VTU0lORyB8IEQzRENSRUFURV9GUFVfUFJFU0VSVkUsICZwYXJhbWV0ZXJzLCAm
bV9kM2REZXZpY2UpKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgRDNEWE1BVFJJWEExNiBwcm9q
ZWN0aW9uOworICAgIEQzRFhNYXRyaXhPcnRob09mZkNlbnRlclJIKCZwcm9qZWN0aW9uLCByZWN0
LmxlZnQsIHJlY3QucmlnaHQsIHJlY3QudG9wLCByZWN0LmJvdHRvbSwgLTEuMGYsIDEuMGYpOwor
CisgICAgbV9kM2REZXZpY2UtPlNldFRyYW5zZm9ybShEM0RUU19QUk9KRUNUSU9OLCAmcHJvamVj
dGlvbik7CisKKyAgICBtX2NvbnRleHQuYWRvcHRDRihDQUNGQ29udGV4dENyZWF0ZSgwKSk7Cisg
ICAgd2luZG93c0ZvckNvbnRleHRzKCkuc2V0KG1fY29udGV4dC5nZXQoKSwgdGhpcyk7CisKKyAg
ICBtX3JlbmRlckNvbnRleHQgPSBzdGF0aWNfY2FzdDxDQVJlbmRlckNvbnRleHQqPihDQUNGQ29u
dGV4dEdldFJlbmRlckNvbnRleHQobV9jb250ZXh0LmdldCgpKSk7CisgICAgbV9yZW5kZXJlciA9
IENBUmVuZGVyT0dMTmV3KCZrQ0FSZW5kZXJEWDlDYWxsYmFja3MsIG1fZDNkRGV2aWNlLmdldCgp
LCAwKTsKKworICAgIC8vIENyZWF0ZSB0aGUgcm9vdCBoaWVyYXJjaHkKKyAgICBtX3Jvb3RMYXll
ciA9IFdLQ0FDRkxheWVyOjpjcmVhdGUoa0NBQ0ZMYXllcik7CisgICAgbV9zY3JvbGxMYXllciA9
IFdLQ0FDRkxheWVyOjpjcmVhdGUoa0NBQ0ZMYXllcik7CisKKyAgICBtX3Jvb3RMYXllci0+YWRk
U3VibGF5ZXIobV9zY3JvbGxMYXllcik7CisgICAgbV9zY3JvbGxMYXllci0+c2V0TWFza3NUb0Jv
dW5kcyh0cnVlKTsKKworICAgIENHQ29sb3JSZWYgZGVidWdDb2xvciA9IGNyZWF0ZUNHQ29sb3Io
Q29sb3IoMjU1LCAwLCAwLCAyMDQpKTsKKyAgICBtX3Jvb3RMYXllci0+c2V0QmFja2dyb3VuZENv
bG9yKGRlYnVnQ29sb3IpOworICAgIENHQ29sb3JSZWxlYXNlKGRlYnVnQ29sb3IpOworCisgICAg
aWYgKElzV2luZG93KG1faG9zdFdpbmRvdykpIHsKKyAgICAgICAgbV9yb290TGF5ZXItPnNldEZy
YW1lKGJvdW5kcygpKTsKKworICAgICAgICAvLyBGb3Igbm93IHRoaXMgd2lsbCBpbmNsdWRlIHRo
ZSBzY3JvbGwgYmFycy4gTGF0ZXIgaW4gdGhlIHNldFNjcm9sbEZyYW1lCisgICAgICAgIC8vIHdl
IHdpbGwgZml4IGl0CisgICAgICAgIG1fc2Nyb2xsTGF5ZXItPnNldEZyYW1lKGJvdW5kcygpKTsK
KyAgICB9CisKKyAgICBpZiAobV9jb250ZXh0KQorICAgICAgICBtX3Jvb3RMYXllci0+YmVjb21l
TGF5ZXJGb3JDb250ZXh0KG1fY29udGV4dC5nZXQoKSk7Cit9CisKK3ZvaWQgV0tDQUNGTGF5ZXJX
aW5kb3c6OmRlc3Ryb3lSZW5kZXJlcigpCit7CisgICAgaWYgKG1fY29udGV4dCkgeworICAgICAg
ICB3aW5kb3dzRm9yQ29udGV4dHMoKS5yZW1vdmUobV9jb250ZXh0LmdldCgpKTsKKyAgICAgICAg
V0tDQUNGQ29udGV4dEZsdXNoZXI6OnNoYXJlZCgpLnJlbW92ZUNvbnRleHQobV9jb250ZXh0Lmdl
dCgpKTsKKyAgICB9CisKKyAgICBpZiAobV9yZW5kZXJlcikKKyAgICAgICAgQ0FSZW5kZXJPR0xE
ZXN0cm95KG1fcmVuZGVyZXIpOworICAgIG1fcmVuZGVyZXIgPSAwOworICAgIG1fZDNkRGV2aWNl
ID0gMDsKKyAgICBpZiAoc19kM2QpCisgICAgICAgIHNfZDNkLT5SZWxlYXNlKCk7CisKKyAgICBz
X2QzZCA9IDA7CisgICAgbV9yb290TGF5ZXIgPSAwOworICAgIG1fc2Nyb2xsTGF5ZXIgPSAwOwor
ICAgIG1fcm9vdENoaWxkTGF5ZXIgPSAwOworCisgICAgbV90cmllZFRvQ3JlYXRlRDNEUmVuZGVy
ZXIgPSBmYWxzZTsKK30KKwordm9pZCBXS0NBQ0ZMYXllcldpbmRvdzo6cmVzaXplKCkKK3sKKyAg
ICBpZiAoIW1fZDNkRGV2aWNlKQorICAgICAgICByZXR1cm47CisKKyAgICByZXNldERldmljZSgp
OworCisgICAgaWYgKG1fcm9vdExheWVyKSB7CisgICAgICAgIG1fcm9vdExheWVyLT5zZXRGcmFt
ZShib3VuZHMoKSk7CisgICAgICAgIFdLQ0FDRkNvbnRleHRGbHVzaGVyOjpzaGFyZWQoKS5mbHVz
aEFsbENvbnRleHRzKCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBnZXREaXJ0eVJlY3RzKEhX
TkQgd2luZG93LCBWZWN0b3I8Q0dSZWN0PiYgb3V0UmVjdHMpCit7CisgICAgQVNTRVJUX0FSRyhv
dXRSZWN0cywgb3V0UmVjdHMuaXNFbXB0eSgpKTsKKworICAgIFJFQ1QgY2xpZW50UmVjdDsKKyAg
ICBpZiAoIUdldENsaWVudFJlY3Qod2luZG93LCAmY2xpZW50UmVjdCkpCisgICAgICAgIHJldHVy
bjsKKworICAgIEhSR04gcmVnaW9uID0gQ3JlYXRlUmVjdFJnbigwLCAwLCAwLCAwKTsKKyAgICBp
bnQgcmVnaW9uVHlwZSA9IEdldFVwZGF0ZVJnbih3aW5kb3csIHJlZ2lvbiwgZmFsc2UpOworICAg
IGlmIChyZWdpb25UeXBlICE9IENPTVBMRVhSRUdJT04pIHsKKyAgICAgICAgUkVDVCBkaXJ0eVJl
Y3Q7CisgICAgICAgIGlmIChHZXRVcGRhdGVSZWN0KHdpbmRvdywgJmRpcnR5UmVjdCwgZmFsc2Up
KQorICAgICAgICAgICAgb3V0UmVjdHMuYXBwZW5kKHdpblJlY3RUb0NHUmVjdChkaXJ0eVJlY3Qs
IGNsaWVudFJlY3QpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIERXT1JEIGRhdGFT
aXplID0gR2V0UmVnaW9uRGF0YShyZWdpb24sIDAsIDApOworICAgIE93bkFycmF5UHRyPHVuc2ln
bmVkIGNoYXI+IHJlZ2lvbkRhdGFCdWZmZXIobmV3IHVuc2lnbmVkIGNoYXJbZGF0YVNpemVdKTsK
KyAgICBSR05EQVRBKiByZWdpb25EYXRhID0gcmVpbnRlcnByZXRfY2FzdDxSR05EQVRBKj4ocmVn
aW9uRGF0YUJ1ZmZlci5nZXQoKSk7CisgICAgaWYgKCFHZXRSZWdpb25EYXRhKHJlZ2lvbiwgZGF0
YVNpemUsIHJlZ2lvbkRhdGEpKQorICAgICAgICByZXR1cm47CisKKyAgICBvdXRSZWN0cy5yZXNp
emUocmVnaW9uRGF0YS0+cmRoLm5Db3VudCk7CisKKyAgICBSRUNUKiByZWN0ID0gcmVpbnRlcnBy
ZXRfY2FzdDxSRUNUKj4ocmVnaW9uRGF0YS0+QnVmZmVyKTsKKyAgICBmb3IgKHNpemVfdCBpID0g
MDsgaSA8IG91dFJlY3RzLnNpemUoKTsgKytpLCArK3JlY3QpCisgICAgICAgIG91dFJlY3RzW2ld
ID0gd2luUmVjdFRvQ0dSZWN0KCpyZWN0LCBjbGllbnRSZWN0KTsKKworICAgIERlbGV0ZU9iamVj
dChyZWdpb24pOworfQorCit2b2lkIFdLQ0FDRkxheWVyV2luZG93OjpyZW5kZXJUaW1lckZpcmVk
KFRpbWVyPFdLQ0FDRkxheWVyV2luZG93PiopCit7CisgICAgcGFpbnQoKTsKK30KKwordm9pZCBX
S0NBQ0ZMYXllcldpbmRvdzo6cGFpbnQoKQoreworICAgIGlmICghbV9kM2REZXZpY2UpCisgICAg
ICAgIHJldHVybjsKKworICAgIFZlY3RvcjxDR1JlY3Q+IGRpcnR5UmVjdHM7CisgICAgZ2V0RGly
dHlSZWN0cyhtX2hvc3RXaW5kb3csIGRpcnR5UmVjdHMpOworICAgIHJlbmRlcihkaXJ0eVJlY3Rz
KTsKK30KKwordm9pZCBXS0NBQ0ZMYXllcldpbmRvdzo6cmVuZGVyKGNvbnN0IFZlY3RvcjxDR1Jl
Y3Q+JiBkaXJ0eVJlY3RzKQoreworICAgIEFTU0VSVChtX2QzZERldmljZSk7CisKKyAgICAvLyBG
bHVzaCB0aGUgcm9vdCBsYXllciB0byB0aGUgcmVuZGVyIHRyZWUuCisgICAgV0tDQUNGQ29udGV4
dEZsdXNoZXI6OnNoYXJlZCgpLmZsdXNoQWxsQ29udGV4dHMoKTsKKworICAgIENHUmVjdCBib3Vu
ZHMgPSB0aGlzLT5ib3VuZHMoKTsKKworICAgIENGVGltZUludGVydmFsIHQgPSBDQUN1cnJlbnRN
ZWRpYVRpbWUoKTsKKworICAgIC8vIEdpdmUgdGhlIHJlbmRlcmVyIHNvbWUgc3BhY2UgdG8gdXNl
LiBUaGlzIG5lZWRzIHRvIGJlIHZhbGlkIHVudGlsIHRoZQorICAgIC8vIENBUmVuZGVyVXBkYXRl
RmluaXNoKCkgY2FsbCBiZWxvdy4KKyAgICBjaGFyIHNwYWNlWzQwOTZdOworICAgIENBUmVuZGVy
VXBkYXRlKiB1ID0gQ0FSZW5kZXJVcGRhdGVCZWdpbihzcGFjZSwgc2l6ZW9mKHNwYWNlKSwgdCwg
MCwgMCwgJmJvdW5kcyk7CisgICAgaWYgKCF1KQorICAgICAgICByZXR1cm47CisKKyAgICBDQVJl
bmRlckNvbnRleHRMb2NrKG1fcmVuZGVyQ29udGV4dCk7CisgICAgQ0FSZW5kZXJVcGRhdGVBZGRD
b250ZXh0KHUsIG1fcmVuZGVyQ29udGV4dCk7CisgICAgQ0FSZW5kZXJDb250ZXh0VW5sb2NrKG1f
cmVuZGVyQ29udGV4dCk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGRpcnR5UmVjdHMu
c2l6ZSgpOyArK2kpCisgICAgICAgIENBUmVuZGVyVXBkYXRlQWRkUmVjdCh1LCAmZGlydHlSZWN0
c1tpXSk7CisKKyAgICBIUkVTVUxUIGVyciA9IFNfT0s7CisgICAgZG8geworICAgICAgICBDR1NS
ZWdpb25PYmogcmduID0gQ0FSZW5kZXJVcGRhdGVDb3B5UmVnaW9uKHUpOworCisgICAgICAgIGlm
ICghcmduKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLy8gRklYTUU6IGRvbid0IG5l
ZWQgdG8gY2xlYXIgZGlydHkgcmVnaW9uIGlmIGxheWVyIHRyZWUgaXMgb3BhcXVlLgorCisgICAg
ICAgIFZlY3RvcjxEM0RSRUNULCA2ND4gcmVjdHM7CisgICAgICAgIENHU1JlZ2lvbkVudW1lcmF0
b3JPYmogZSA9IENHU1JlZ2lvbkVudW1lcmF0b3IocmduKTsKKyAgICAgICAgZm9yIChjb25zdCBD
R1JlY3QqIHIgPSBDR1NOZXh0UmVjdChlKTsgcjsgciA9IENHU05leHRSZWN0KGUpKSB7CisgICAg
ICAgICAgICBEM0RSRUNUIHJlY3Q7CisgICAgICAgICAgICByZWN0LngxID0gci0+b3JpZ2luLng7
CisgICAgICAgICAgICByZWN0LngyID0gcmVjdC54MSArIHItPnNpemUud2lkdGg7CisgICAgICAg
ICAgICByZWN0LnkxID0gYm91bmRzLm9yaWdpbi55ICsgYm91bmRzLnNpemUuaGVpZ2h0IC0gKHIt
Pm9yaWdpbi55ICsgci0+c2l6ZS5oZWlnaHQpOworICAgICAgICAgICAgcmVjdC55MiA9IHJlY3Qu
eTEgKyByLT5zaXplLmhlaWdodDsKKworICAgICAgICAgICAgcmVjdHMuYXBwZW5kKHJlY3QpOwor
ICAgICAgICB9CisgICAgICAgIENHU1JlbGVhc2VSZWdpb25FbnVtZXJhdG9yKGUpOworICAgICAg
ICBDR1NSZWxlYXNlUmVnaW9uKHJnbik7CisKKyAgICAgICAgaWYgKHJlY3RzLmlzRW1wdHkoKSkK
KyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIG1fZDNkRGV2aWNlLT5DbGVhcihyZWN0cy5z
aXplKCksIHJlY3RzLmRhdGEoKSwgRDNEQ0xFQVJfVEFSR0VULCAwLCAxLjBmLCAwKTsKKworICAg
ICAgICBtX2QzZERldmljZS0+QmVnaW5TY2VuZSgpOworICAgICAgICBDQVJlbmRlck9HTFJlbmRl
cihtX3JlbmRlcmVyLCB1KTsKKyAgICAgICAgbV9kM2REZXZpY2UtPkVuZFNjZW5lKCk7CisKKyAg
ICAgICAgZXJyID0gbV9kM2REZXZpY2UtPlByZXNlbnQoMCwgMCwgMCwgMCk7CisKKyAgICAgICAg
aWYgKGVyciA9PSBEM0RFUlJfREVWSUNFTE9TVCkgeworICAgICAgICAgICAgLy8gTG9zdCBkZXZp
Y2Ugc2l0dWF0aW9uLgorICAgICAgICAgICAgQ0FSZW5kZXJPR0xQdXJnZShtX3JlbmRlcmVyKTsK
KyAgICAgICAgICAgIHJlc2V0RGV2aWNlKCk7CisgICAgICAgICAgICBDQVJlbmRlclVwZGF0ZUFk
ZFJlY3QodSwgJmJvdW5kcyk7CisgICAgICAgIH0KKyAgICB9IHdoaWxlIChlcnIgPT0gRDNERVJS
X0RFVklDRUxPU1QpOworCisgICAgQ0FSZW5kZXJVcGRhdGVGaW5pc2godSk7Cit9CisKK3ZvaWQg
V0tDQUNGTGF5ZXJXaW5kb3c6OnJlbmRlclNvb24oKQoreworICAgIGlmICghbV9yZW5kZXJUaW1l
ci5pc0FjdGl2ZSgpKQorICAgICAgICBtX3JlbmRlclRpbWVyLnN0YXJ0T25lU2hvdCgwKTsKK30K
KworQ0dSZWN0IFdLQ0FDRkxheWVyV2luZG93Ojpib3VuZHMoKSBjb25zdAoreworICAgIFJFQ1Qg
Y2xpZW50UmVjdDsKKyAgICBHZXRDbGllbnRSZWN0KG1faG9zdFdpbmRvdywgJmNsaWVudFJlY3Qp
OworCisgICAgcmV0dXJuIHdpblJlY3RUb0NHUmVjdChjbGllbnRSZWN0KTsKK30KKwordm9pZCBX
S0NBQ0ZMYXllcldpbmRvdzo6aW5pdEQzREdlb21ldHJ5KCkKK3sKKyAgICBBU1NFUlQobV9kM2RE
ZXZpY2UpOworCisgICAgQ0dSZWN0IGJvdW5kcyA9IHRoaXMtPmJvdW5kcygpOworCisgICAgZmxv
YXQgeDAgPSBib3VuZHMub3JpZ2luLng7CisgICAgZmxvYXQgeTAgPSBib3VuZHMub3JpZ2luLnk7
CisgICAgZmxvYXQgeDEgPSB4MCArIGJvdW5kcy5zaXplLndpZHRoOworICAgIGZsb2F0IHkxID0g
eTAgKyBib3VuZHMuc2l6ZS5oZWlnaHQ7CisKKyAgICBEM0RYTUFUUklYQTE2IHByb2plY3Rpb247
CisgICAgRDNEWE1hdHJpeE9ydGhvT2ZmQ2VudGVyUkgoJnByb2plY3Rpb24sIHgwLCB4MSwgeTAs
IHkxLCAtMS4wZiwgMS4wZik7CisKKyAgICBtX2QzZERldmljZS0+U2V0VHJhbnNmb3JtKEQzRFRT
X1BST0pFQ1RJT04sICZwcm9qZWN0aW9uKTsKK30KKwordm9pZCBXS0NBQ0ZMYXllcldpbmRvdzo6
cmVzZXREZXZpY2UoKQoreworICAgIEFTU0VSVChtX2QzZERldmljZSk7CisKKyAgICBEM0RQUkVT
RU5UX1BBUkFNRVRFUlMgcGFyYW1ldGVycyA9IGluaXRpYWxQcmVzZW50YXRpb25QYXJhbWV0ZXJz
KCk7CisgICAgbV9kM2REZXZpY2UtPlJlc2V0KCZwYXJhbWV0ZXJzKTsKKyAgICBpbml0RDNER2Vv
bWV0cnkoKTsKK30KKworfQorCisjZW5kaWYgLy8gVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5H
KQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vV0tDQUNGTGF5ZXJXaW5kb3cu
aAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9XS0NBQ0ZMYXll
cldpbmRvdy5oCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4v
V0tDQUNGTGF5ZXJXaW5kb3cuaAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwxMDAgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMDkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFT
IElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisg
KiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5k
ZWYgV0tDQUNGTGF5ZXJXaW5kb3dfaAorI2RlZmluZSBXS0NBQ0ZMYXllcldpbmRvd19oCisKKyNp
ZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisKKyNpbmNsdWRlICJDT01QdHIuaCIKKyNp
bmNsdWRlICJUaW1lci5oIgorI2luY2x1ZGUgIldLQ0FDRkxheWVyLmgiCisKKyNpbmNsdWRlIDx3
dGYvTm9uY29weWFibGUuaD4KKworI2luY2x1ZGUgPHd0Zi9QYXNzUmVmUHRyLmg+CisjaW5jbHVk
ZSA8d3RmL1JlZlB0ci5oPgorI2luY2x1ZGUgPHd0Zi9SZXRhaW5QdHIuaD4KKworI2luY2x1ZGUg
PENvcmVHcmFwaGljcy9DR0dlb21ldHJ5Lmg+CisKK2ludGVyZmFjZSBJRGlyZWN0M0REZXZpY2U5
OwordHlwZWRlZiBzdHJ1Y3QgX0NBQ0ZDb250ZXh0KiBDQUNGQ29udGV4dFJlZjsKK3R5cGVkZWYg
c3RydWN0IF9DQVJlbmRlckNvbnRleHQgQ0FSZW5kZXJDb250ZXh0OwordHlwZWRlZiBzdHJ1Y3Qg
X0NBUmVuZGVyT0dMQ29udGV4dCBDQVJlbmRlck9HTENvbnRleHQ7CisKK25hbWVzcGFjZSBXZWJD
b3JlIHsKKworY2xhc3MgV0tDQUNGTGF5ZXJXaW5kb3cgOiBOb25jb3B5YWJsZSB7CitwdWJsaWM6
CisgICAgV0tDQUNGTGF5ZXJXaW5kb3coKTsKKyAgICB+V0tDQUNGTGF5ZXJXaW5kb3coKTsKKwor
ICAgIHN0YXRpYyB2b2lkIGRpZEZsdXNoQ29udGV4dChDQUNGQ29udGV4dFJlZik7CisKKyAgICB2
b2lkIHNldFNjcm9sbEZyYW1lKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHNjcm9sbFgsIGlu
dCBzY3JvbGxZKTsKKyAgICB2b2lkIHNldFJvb3RDb250ZW50cyhDR0ltYWdlUmVmKTsKKyAgICB2
b2lkIHNldFJvb3RDaGlsZExheWVyKFdlYkNvcmU6OlBsYXRmb3JtTGF5ZXIqIGxheWVyKTsKKyAg
ICB2b2lkIHNldE5lZWRzRGlzcGxheSgpOworICAgIHZvaWQgc2V0SG9zdFdpbmRvdyhIV05EIHdp
bmRvdykgeyBtX2hvc3RXaW5kb3cgPSB3aW5kb3c7IGNyZWF0ZVJlbmRlcmVyKCk7IH0KKworICAg
IHZvaWQgY3JlYXRlUmVuZGVyZXIoKTsKKyAgICB2b2lkIGRlc3Ryb3lSZW5kZXJlcigpOworICAg
IHZvaWQgcmVzaXplKCk7CisgICAgdm9pZCByZW5kZXJTb29uKCk7CisKK3Byb3RlY3RlZDoKKyAg
ICBXS0NBQ0ZMYXllciogcm9vdExheWVyKCkgY29uc3QgeyByZXR1cm4gbV9yb290TGF5ZXIuZ2V0
KCk7IH0KKworcHJpdmF0ZToKKyAgICB2b2lkIHJlbmRlclRpbWVyRmlyZWQoVGltZXI8V0tDQUNG
TGF5ZXJXaW5kb3c+Kik7CisKKyAgICBDR1JlY3QgYm91bmRzKCkgY29uc3Q7CisKKyAgICB2b2lk
IGluaXREM0RHZW9tZXRyeSgpOworICAgIHZvaWQgcmVzZXREZXZpY2UoKTsKKworICAgIHZvaWQg
cmVuZGVyKGNvbnN0IFZlY3RvcjxDR1JlY3Q+JiBkaXJ0eVJlY3RzID0gVmVjdG9yPENHUmVjdD4o
KSk7CisgICAgdm9pZCBwYWludCgpOworCisgICAgYm9vbCBtX3RyaWVkVG9DcmVhdGVEM0RSZW5k
ZXJlcjsKKyAgICBDT01QdHI8SURpcmVjdDNERGV2aWNlOT4gbV9kM2REZXZpY2U7CisgICAgUmVm
UHRyPFdLQ0FDRkxheWVyPiBtX3Jvb3RMYXllcjsKKyAgICBSZWZQdHI8V0tDQUNGTGF5ZXI+IG1f
dmlld0xheWVyOworICAgIFJlZlB0cjxXS0NBQ0ZMYXllcj4gbV9zY3JvbGxMYXllcjsKKyAgICBS
ZWZQdHI8V0tDQUNGTGF5ZXI+IG1fcm9vdENoaWxkTGF5ZXI7CisgICAgUmV0YWluUHRyPENBQ0ZD
b250ZXh0UmVmPiBtX2NvbnRleHQ7CisgICAgQ0FSZW5kZXJDb250ZXh0KiBtX3JlbmRlckNvbnRl
eHQ7CisgICAgQ0FSZW5kZXJPR0xDb250ZXh0KiBtX3JlbmRlcmVyOworICAgIEhXTkQgbV9ob3N0
V2luZG93OworICAgIFRpbWVyPFdLQ0FDRkxheWVyV2luZG93PiBtX3JlbmRlclRpbWVyOworICAg
IGludCBtX3Njcm9sbEZyYW1lV2lkdGgsIG1fc2Nyb2xsRnJhbWVIZWlnaHQ7Cit9OworCit9CisK
KyNlbmRpZiAvLyBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisKKyNlbmRpZiAvLyBXS0NB
Q0ZMYXllcldpbmRvd19oCkluZGV4OiBXZWJLaXQvd2luL0NoYW5nZUxvZwo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBXZWJLaXQvd2luL0NoYW5nZUxvZwkocmV2aXNpb24gNTEzMzEpCisrKyBXZWJLaXQvd2luL0No
YW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDM4IEBACisyMDA5LTExLTIzICBDaHJp
cyBNYXJyaW4gIDxjbWFycmluQGFwcGxlLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JP
RFkgKE9PUFMhKS4KKworICAgICAgICBJbXBsZW1lbnQgYWNjZWxlcmF0ZWQgY29tcG9zaXRpbmcK
KyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI3MzE0Cisg
ICAgICAgIAorICAgICAgICBUaGlzIGlzIHRoZSBXZWJLaXQgc2lkZSBvZiB0aGUgaW1wbGVtZW50
YXRpb24uIEl0IHBsdW1icyB0aGUgcm9vdCBsYXllcgorICAgICAgICBmcm9tIFdlYkNvcmUuIEl0
IGFsc28gbWFrZXMgY2hhbmdlcyB0byBXZWJWaWV3IHdoaWNoIHBsYWNlcyB0aGUgCisgICAgICAg
IGJhY2tpbmcgc3RvcmUgb2YgdGhlIHBhZ2UgaW50byB0aGUgcm9vdCBjb21wb3NpdGluZyBsYXll
ciBzbyBpdCBpcyAKKyAgICAgICAgcHJvcGVybHkgY29tcG9zaXRlZCB3aXRoIGFsbCB0aGUgb3Ro
ZXIgbGF5ZXJzLiBUaGlzIGRlYWxzIHdpdGggcmVzaXppbmcsIAorICAgICAgICBzY3JvbGxpbmcs
IGFuZCBpbmNyZW1lbnRhbCByZXBhaW50IG9mIHRoZSBwYWdlLgorCisgICAgICAgICogV2ViQ29y
ZVN1cHBvcnQvV2ViQ2hyb21lQ2xpZW50LmNwcDoKKyAgICAgICAgKFdlYkNocm9tZUNsaWVudDo6
YXR0YWNoUm9vdEdyYXBoaWNzTGF5ZXIpOgorICAgICAgICAoV2ViQ2hyb21lQ2xpZW50OjpzY2hl
ZHVsZUNvbXBvc2l0aW5nTGF5ZXJTeW5jKToKKyAgICAgICAgKiBXZWJDb3JlU3VwcG9ydC9XZWJD
aHJvbWVDbGllbnQuaDoKKyAgICAgICAgKFdlYkNocm9tZUNsaWVudDo6c2V0TmVlZHNPbmVTaG90
RHJhd2luZ1N5bmNocm9uaXphdGlvbik6CisgICAgICAgICogV2ViS2l0LnZjcHJvai9XZWJLaXQu
dmNwcm9qOgorICAgICAgICAqIFdlYlZpZXcuY3BwOgorICAgICAgICAoV2ViVmlldzo6V2ViVmll
dyk6CisgICAgICAgIChXZWJWaWV3OjpjbG9zZSk6CisgICAgICAgIChXZWJWaWV3OjpyZXBhaW50
KToKKyAgICAgICAgKFdlYlZpZXc6OnNjcm9sbEJhY2tpbmdTdG9yZSk6CisgICAgICAgIChXZWJW
aWV3OjpwYWludCk6CisgICAgICAgIChXZWJWaWV3V25kUHJvYyk6CisgICAgICAgIChXZWJWaWV3
OjpzZXRSb290Q2hpbGRMYXllcik6CisgICAgICAgIChXZWJWaWV3OjpzZXRBY2NlbGVyYXRlZENv
bXBvc2l0aW5nKToKKyAgICAgICAgKFdlYlZpZXc6OnNldFJvb3RMYXllckNvbnRlbnRzKToKKyAg
ICAgICAgKiBXZWJWaWV3Lmg6CisgICAgICAgIChXZWJWaWV3Ojppc0FjY2VsZXJhdGVkQ29tcG9z
aXRpbmcpOgorICAgICAgICAoV2ViVmlldzo6cmVzaXplTGF5ZXJXaW5kb3cpOgorICAgICAgICAo
V2ViVmlldzo6bGF5ZXJXaW5kb3dCZWNhbWVWaXNpYmxlKToKKyAgICAgICAgKFdlYlZpZXc6OnNl
dFJvb3RMYXllck5lZWRzRGlzcGxheSk6CisKIDIwMDktMTEtMjEgIEpvbiBIb25leWN1dHQgIDxq
aG9uZXljdXR0QGFwcGxlLmNvbT4KIAogICAgICAgICBXaW5kb3dzIGJ1aWxkIGZpeC4gVW5yZXZp
ZXdlZC4KSW5kZXg6IFdlYktpdC93aW4vV2ViVmlldy5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0
L3dpbi9XZWJWaWV3LmNwcAkocmV2aXNpb24gNTExMjIpCisrKyBXZWJLaXQvd2luL1dlYlZpZXcu
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMjMsNiArMzIzLDkgQEAgV2ViVmlldzo6V2ViVmlldygp
CiAsIG1fbGFzdFBhblkoMCkKICwgbV94T3ZlcnBhbigwKQogLCBtX3lPdmVycGFuKDApCisjaWYg
VVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorLCBtX2lzQWNjZWxlcmF0ZWRDb21wb3NpdGlu
ZyhmYWxzZSkKKyNlbmRpZgogewogICAgIEpTQzo6aW5pdGlhbGl6ZVRocmVhZGluZygpOwogCkBA
IC02MTgsNiArNjIxLDEwIEBAIEhSRVNVTFQgU1RETUVUSE9EQ0FMTFRZUEUgV2ViVmlldzo6Y2xv
c2UKIAogICAgIG1fZGlkQ2xvc2UgPSB0cnVlOwogCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBP
U0lUSU5HKQorICAgIHNldEFjY2VsZXJhdGVkQ29tcG9zaXRpbmcoZmFsc2UpOworI2VuZGlmCisK
ICAgICBXZWJOb3RpZmljYXRpb25DZW50ZXI6OmRlZmF1bHRDZW50ZXJJbnRlcm5hbCgpLT5wb3N0
Tm90aWZpY2F0aW9uTmFtZShfYnN0cl90KFdlYlZpZXdXaWxsQ2xvc2VOb3RpZmljYXRpb24pLkdl
dEJTVFIoKSwgc3RhdGljX2Nhc3Q8SVdlYlZpZXcqPih0aGlzKSwgMCk7CiAKICAgICBpZiAobV91
aURlbGVnYXRlUHJpdmF0ZSkKQEAgLTY3Nyw2ICs2ODQsMTEgQEAgSFJFU1VMVCBTVERNRVRIT0RD
QUxMVFlQRSBXZWJWaWV3OjpjbG9zZQogCiB2b2lkIFdlYlZpZXc6OnJlcGFpbnQoY29uc3QgV2Vi
Q29yZTo6SW50UmVjdCYgd2luZG93UmVjdCwgYm9vbCBjb250ZW50Q2hhbmdlZCwgYm9vbCBpbW1l
ZGlhdGUsIGJvb2wgcmVwYWludENvbnRlbnRPbmx5KQogeworI2lmIFVTRShBQ0NFTEVSQVRFRF9D
T01QT1NJVElORykKKyAgICBpZiAoaXNBY2NlbGVyYXRlZENvbXBvc2l0aW5nKCkpCisgICAgICAg
IHNldFJvb3RMYXllck5lZWRzRGlzcGxheSgpOworI2VuZGlmCisKICAgICBpZiAoIXJlcGFpbnRD
b250ZW50T25seSkgewogICAgICAgICBSRUNUIHJlY3QgPSB3aW5kb3dSZWN0OwogICAgICAgICA6
OkludmFsaWRhdGVSZWN0KG1fdmlld1dpbmRvdywgJnJlY3QsIGZhbHNlKTsKQEAgLTc5NSw3ICs4
MDcsNiBAQCB2b2lkIFdlYlZpZXc6OnNjcm9sbEJhY2tpbmdTdG9yZShGcmFtZVZpCiAgICAgLy8g
Q2xlYW4gdXAuCiAgICAgOjpEZWxldGVEQyhiaXRtYXBEQyk7CiAgICAgOjpSZWxlYXNlREMobV92
aWV3V2luZG93LCB3aW5kb3dEQyk7Ci0KIH0KIAogLy8gVGhpcyBlbXVsYXRlcyB0aGUgTWFjIHNt
YXJ0cyBmb3IgcGFpbnRpbmcgcmVjdHMgaW50ZWxsaWdlbnRseS4gIFRoaXMgaXMgdmVyeQpAQCAt
OTI4LDE4ICs5MzksMjUgQEAgdm9pZCBXZWJWaWV3OjpwYWludChIREMgZGMsIExQQVJBTSBvcHRp
bwogICAgIC8vIFVwZGF0ZSBvdXIgYmFja2luZyBzdG9yZSBpZiBuZWVkZWQuCiAgICAgdXBkYXRl
QmFja2luZ1N0b3JlKGZyYW1lVmlldywgYml0bWFwREMsIGJhY2tpbmdTdG9yZUNvbXBsZXRlbHlE
aXJ0eSwgd2luZG93c1RvUGFpbnQpOwogCi0gICAgLy8gTm93IHdlIGJsaXQgdGhlIHVwZGF0ZWQg
YmFja2luZyBzdG9yZQotICAgIEludFJlY3Qgd2luZG93RGlydHlSZWN0ID0gcmNQYWludDsKLSAg
ICAKLSAgICAvLyBBcHBseSB0aGUgc2FtZSBoZXVyaXN0aWMgZm9yIHRoaXMgdXBkYXRlIHJlZ2lv
biB0b28uCi0gICAgVmVjdG9yPEludFJlY3Q+IGJsaXRSZWN0czsKLSAgICBpZiAocmVnaW9uICYm
IHJlZ2lvblR5cGUgPT0gQ09NUExFWFJFR0lPTikKLSAgICAgICAgZ2V0VXBkYXRlUmVjdHMocmVn
aW9uLmdldCgpLCB3aW5kb3dEaXJ0eVJlY3QsIGJsaXRSZWN0cyk7Ci0gICAgZWxzZQotICAgICAg
ICBibGl0UmVjdHMuYXBwZW5kKHdpbmRvd0RpcnR5UmVjdCk7CisjaWYgVVNFKEFDQ0VMRVJBVEVE
X0NPTVBPU0lUSU5HKQorICAgIGlmICghaXNBY2NlbGVyYXRlZENvbXBvc2l0aW5nKCkpIHsKKyNl
bmRpZgorICAgICAgICAvLyBOb3cgd2UgYmxpdCB0aGUgdXBkYXRlZCBiYWNraW5nIHN0b3JlCisg
ICAgICAgIEludFJlY3Qgd2luZG93RGlydHlSZWN0ID0gcmNQYWludDsKKyAgICAgICAgCisgICAg
ICAgIC8vIEFwcGx5IHRoZSBzYW1lIGhldXJpc3RpYyBmb3IgdGhpcyB1cGRhdGUgcmVnaW9uIHRv
by4KKyAgICAgICAgVmVjdG9yPEludFJlY3Q+IGJsaXRSZWN0czsKKyAgICAgICAgaWYgKHJlZ2lv
biAmJiByZWdpb25UeXBlID09IENPTVBMRVhSRUdJT04pCisgICAgICAgICAgICBnZXRVcGRhdGVS
ZWN0cyhyZWdpb24uZ2V0KCksIHdpbmRvd0RpcnR5UmVjdCwgYmxpdFJlY3RzKTsKKyAgICAgICAg
ZWxzZQorICAgICAgICAgICAgYmxpdFJlY3RzLmFwcGVuZCh3aW5kb3dEaXJ0eVJlY3QpOwogCi0g
ICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGJsaXRSZWN0cy5zaXplKCk7ICsraSkKLSAgICAg
ICAgcGFpbnRJbnRvV2luZG93KGJpdG1hcERDLCBoZGMsIGJsaXRSZWN0c1tpXSk7CisgICAgICAg
IGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBibGl0UmVjdHMuc2l6ZSgpOyArK2kpCisgICAgICAg
ICAgICBwYWludEludG9XaW5kb3coYml0bWFwREMsIGhkYywgYmxpdFJlY3RzW2ldKTsKKyNpZiBV
U0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisgICAgfSBlbHNlCisgICAgICAgIHNldFJvb3RM
YXllckNvbnRlbnRzKCk7CisjZW5kaWYKIAogICAgIDo6RGVsZXRlREMoYml0bWFwREMpOwogCkBA
IC0xOTQyLDE2ICsxOTYwLDI1IEBAIHN0YXRpYyBMUkVTVUxUIENBTExCQUNLIFdlYlZpZXdXbmRQ
cm9jKEgKIAogICAgICAgICAgICAgaWYgKGxQYXJhbSAhPSAwKSB7CiAgICAgICAgICAgICAgICAg
d2ViVmlldy0+ZGVsZXRlQmFja2luZ1N0b3JlKCk7CisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBP
U0lUSU5HKQorICAgICAgICAgICAgICAgIGlmICh3ZWJWaWV3LT5pc0FjY2VsZXJhdGVkQ29tcG9z
aXRpbmcoKSkKKyAgICAgICAgICAgICAgICAgICAgd2ViVmlldy0+cmVzaXplTGF5ZXJXaW5kb3co
KTsKKyNlbmRpZgogICAgICAgICAgICAgICAgIGlmIChGcmFtZSogY29yZUZyYW1lID0gY29yZSht
YWluRnJhbWVJbXBsKSkKICAgICAgICAgICAgICAgICAgICAgY29yZUZyYW1lLT52aWV3KCktPnJl
c2l6ZShMT1dPUkQobFBhcmFtKSwgSElXT1JEKGxQYXJhbSkpOwogICAgICAgICAgICAgfQogICAg
ICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgV01fU0hPV1dJTkRPVzoKICAgICAgICAgICAg
IGxSZXN1bHQgPSBEZWZXaW5kb3dQcm9jKGhXbmQsIG1lc3NhZ2UsIHdQYXJhbSwgbFBhcmFtKTsK
LSAgICAgICAgICAgIGlmICh3UGFyYW0gPT0gMCkKKyAgICAgICAgICAgIGlmICh3UGFyYW0gPT0g
MCkgewogICAgICAgICAgICAgICAgIC8vIFRoZSB3aW5kb3cgaXMgYmVpbmcgaGlkZGVuIChlLmcu
LCBiZWNhdXNlIHdlIHN3aXRjaGVkIHRhYnMpLgogICAgICAgICAgICAgICAgIC8vIE51bGwgb3V0
IG91ciBiYWNraW5nIHN0b3JlLgogICAgICAgICAgICAgICAgIHdlYlZpZXctPmRlbGV0ZUJhY2tp
bmdTdG9yZSgpOworICAgICAgICAgICAgfQorI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElO
RykKKyAgICAgICAgICAgIGVsc2UgaWYgKHdlYlZpZXctPmlzQWNjZWxlcmF0ZWRDb21wb3NpdGlu
ZygpKQorICAgICAgICAgICAgICAgIHdlYlZpZXctPmxheWVyV2luZG93QmVjYW1lVmlzaWJsZSgp
OworI2VuZGlmCiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBXTV9TRVRGT0NVUzog
ewogICAgICAgICAgICAgQ09NUHRyPElXZWJVSURlbGVnYXRlPiB1aURlbGVnYXRlOwpAQCAtMjA0
MSw3ICsyMDY4LDExIEBAIHN0YXRpYyBMUkVTVUxUIENBTExCQUNLIFdlYlZpZXdXbmRQcm9jKEgK
ICAgICAgICAgICAgICAgICBSRUNUIHdpbmRvd1JlY3Q7CiAgICAgICAgICAgICAgICAgOjpHZXRD
bGllbnRSZWN0KGhXbmQsICZ3aW5kb3dSZWN0KTsKICAgICAgICAgICAgICAgICA6OkludmFsaWRh
dGVSZWN0KGhXbmQsICZ3aW5kb3dSZWN0LCBmYWxzZSk7Ci0gICAgICAgICAgICB9CisjaWYgVVNF
KEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorICAgICAgICAgICAgICAgIGlmICh3ZWJWaWV3LT5p
c0FjY2VsZXJhdGVkQ29tcG9zaXRpbmcoKSkKKyAgICAgICAgICAgICAgICAgICAgd2ViVmlldy0+
c2V0Um9vdExheWVyTmVlZHNEaXNwbGF5KCk7CisjZW5kaWYKKyAgICAgICAgICAgfQogICAgICAg
ICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgV01fTU9VU0VBQ1RJVkFURToKICAgICAgICAgICAg
IHdlYlZpZXctPnNldE1vdXNlQWN0aXZhdGVkKHRydWUpOwpAQCAtNTY5OCw2ICs1NzI5LDcxIEBA
IHZvaWQgV2ViVmlldzo6ZG93bmxvYWRVUkwoY29uc3QgS1VSTCYgdXIKICAgICBkb3dubG9hZC0+
c3RhcnQoKTsKIH0KIAorI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKK3ZvaWQgV2Vi
Vmlldzo6c2V0Um9vdENoaWxkTGF5ZXIoV2ViQ29yZTo6UGxhdGZvcm1MYXllciogbGF5ZXIpCit7
CisgICAgc2V0QWNjZWxlcmF0ZWRDb21wb3NpdGluZyhsYXllciA/IHRydWUgOiBmYWxzZSk7Cisg
ICAgbV9sYXllcldpbmRvdy5zZXRSb290Q2hpbGRMYXllcihsYXllcik7Cit9CisKK3ZvaWQgV2Vi
Vmlldzo6c2V0QWNjZWxlcmF0ZWRDb21wb3NpdGluZyhib29sIGFjY2VsZXJhdGVkKQoreworICAg
IGlmIChtX2lzQWNjZWxlcmF0ZWRDb21wb3NpdGluZyA9PSBhY2NlbGVyYXRlZCkKKyAgICAgICAg
cmV0dXJuOworCisgICAgbV9pc0FjY2VsZXJhdGVkQ29tcG9zaXRpbmcgPSBhY2NlbGVyYXRlZDsK
KyAgICBpZiAobV9pc0FjY2VsZXJhdGVkQ29tcG9zaXRpbmcpIHsKKyAgICAgICAgLy8gQ3JlYXRl
IHRoZSByb290IGxheWVyCisgICAgICAgIEFTU0VSVChtX3ZpZXdXaW5kb3cpOworICAgICAgICBt
X2xheWVyV2luZG93LnNldEhvc3RXaW5kb3cobV92aWV3V2luZG93KTsKKyAgICAgICAgc2V0Um9v
dExheWVyQ29udGVudHMoKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBUZWFyIGRvd24gdGhl
IHJvb3QgbGF5ZXIKKyAgICAgICAgbV9sYXllcldpbmRvdy5kZXN0cm95UmVuZGVyZXIoKTsKKyAg
ICB9CisKKyAgICAvL2ludmFsaWRhdGVCYWNraW5nU3RvcmUoMCk7CisgICAgLy86OlVwZGF0ZVdp
bmRvdyhtX3ZpZXdXaW5kb3cpOworICAgIHBhaW50KDAsIDApOworfQorCit2b2lkIFdlYlZpZXc6
OnNldFJvb3RMYXllckNvbnRlbnRzKCkKK3sKKyAgICBpZiAoIW1fYmFja2luZ1N0b3JlQml0bWFw
KQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBHZXQgdGhlIGJhY2tpbmcgc3RvcmUgaW50byBh
IENHSW1hZ2UKKyAgICBCSVRNQVAgYml0bWFwOworICAgIEdldE9iamVjdChtX2JhY2tpbmdTdG9y
ZUJpdG1hcC5nZXQoKSwgc2l6ZW9mKGJpdG1hcCksICZiaXRtYXApOworICAgIGludCBibVNpemUg
PSBiaXRtYXAuYm1XaWR0aEJ5dGVzICogYml0bWFwLmJtSGVpZ2h0OworICAgIFJldGFpblB0cjxD
RkRhdGFSZWY+IGRhdGEoQWRvcHRDRiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IENGRGF0YUNyZWF0ZVdpdGhCeXRlc05vQ29weSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAwLCBzdGF0aWNfY2FzdDxVSW50OCo+KGJpdG1hcC5ibUJpdHMpLAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtU2l6ZSwga0NGQWxsb2NhdG9y
TnVsbCkpOworICAgIENHRGF0YVByb3ZpZGVyUmVmIGNnRGF0YSA9IENHRGF0YVByb3ZpZGVyQ3Jl
YXRlV2l0aENGRGF0YShkYXRhLmdldCgpKTsKKyAgICBDR0NvbG9yU3BhY2VSZWYgc3BhY2UgPSBD
R0NvbG9yU3BhY2VDcmVhdGVEZXZpY2VSR0IoKTsKKyAgICBSZXRhaW5QdHI8Q0dJbWFnZVJlZj4g
YmFja2luZ1N0b3JlSW1hZ2UoQWRvcHRDRiwgQ0dJbWFnZUNyZWF0ZShiaXRtYXAuYm1XaWR0aCwg
Yml0bWFwLmJtSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgs
IGJpdG1hcC5ibUJpdHNQaXhlbCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgYml0bWFwLmJtV2lkdGhCeXRlcywgc3BhY2UsIAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGtDR0JpdG1hcEJ5dGVPcmRlcjMyTGl0dGxlIHwga0NHSW1hZ2VBbHBoYU5v
bmVTa2lwRmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2dEYXRh
LCAwLCBmYWxzZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0NHUmVu
ZGVyaW5nSW50ZW50RGVmYXVsdCkpOworCisgICAgLy8gSGFuZCB0aGUgQ0dJbWFnZSB0byBDQUNG
IGZvciBjb21wb3NpdGluZworICAgIG1fbGF5ZXJXaW5kb3cuc2V0Um9vdENvbnRlbnRzKGJhY2tp
bmdTdG9yZUltYWdlLmdldCgpKTsKKworICAgIC8vIFNldCB0aGUgZnJhbWUgYW5kIHNjcm9sbCBw
b3NpdGlvbgorICAgIEZyYW1lKiBjb3JlRnJhbWUgPSBjb3JlKG1fbWFpbkZyYW1lKTsKKyAgICBp
ZiAoIWNvcmVGcmFtZSkKKyAgICAgICAgcmV0dXJuOworICAgIEZyYW1lVmlldyogZnJhbWVWaWV3
ID0gY29yZUZyYW1lLT52aWV3KCk7CisKKyAgICBtX2xheWVyV2luZG93LnNldFNjcm9sbEZyYW1l
KGZyYW1lVmlldy0+bGF5b3V0V2lkdGgoKSwgZnJhbWVWaWV3LT5sYXlvdXRIZWlnaHQoKSwgCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZVZpZXctPnNjcm9sbFgoKSwgZnJh
bWVWaWV3LT5zY3JvbGxZKCkpOworICAgIENHQ29sb3JTcGFjZVJlbGVhc2Uoc3BhY2UpOworICAg
IENHRGF0YVByb3ZpZGVyUmVsZWFzZShjZ0RhdGEpOworfQorI2VuZGlmCiAKIEhSRVNVTFQgU1RE
TUVUSE9EQ0FMTFRZUEUgV2ViVmlldzo6c2V0UGx1Z2luSGFsdGVyRGVsZWdhdGUoSVdlYlBsdWdp
bkhhbHRlckRlbGVnYXRlKiBkKQogewpJbmRleDogV2ViS2l0L3dpbi9XZWJWaWV3LmgKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViS2l0L3dpbi9XZWJWaWV3LmgJKHJldmlzaW9uIDUxMTIyKQorKysgV2ViS2l0
L3dpbi9XZWJWaWV3LmgJKHdvcmtpbmcgY29weSkKQEAgLTM0LDYgKzM0LDggQEAKICNpbmNsdWRl
IDxXZWJDb3JlL0ludFJlY3QuaD4KICNpbmNsdWRlIDxXZWJDb3JlL1RpbWVyLmg+CiAjaW5jbHVk
ZSA8V2ViQ29yZS9XaW5kb3dNZXNzYWdlTGlzdGVuZXIuaD4KKyNpbmNsdWRlIDxXZWJDb3JlL1dL
Q0FDRkxheWVyLmg+CisjaW5jbHVkZSA8V2ViQ29yZS9XS0NBQ0ZMYXllcldpbmRvdy5oPgogI2lu
Y2x1ZGUgPHd0Zi9IYXNoU2V0Lmg+CiAjaW5jbHVkZSA8d3RmL093blB0ci5oPgogCkBAIC04NjEs
NiArODYzLDE0IEBAIHB1YmxpYzoKIAogICAgIHZvaWQgZG93bmxvYWRVUkwoY29uc3QgV2ViQ29y
ZTo6S1VSTCYpOwogCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorICAgIGJvb2wg
aXNBY2NlbGVyYXRlZENvbXBvc2l0aW5nKCkgY29uc3QgeyByZXR1cm4gbV9pc0FjY2VsZXJhdGVk
Q29tcG9zaXRpbmc7IH0KKyAgICB2b2lkIHJlc2l6ZUxheWVyV2luZG93KCkgeyBtX2xheWVyV2lu
ZG93LnJlc2l6ZSgpOyB9CisgICAgdm9pZCBsYXllcldpbmRvd0JlY2FtZVZpc2libGUoKSB7IG1f
bGF5ZXJXaW5kb3cuY3JlYXRlUmVuZGVyZXIoKTsgfQorICAgIHZvaWQgc2V0Um9vdExheWVyTmVl
ZHNEaXNwbGF5KCkgeyBtX2xheWVyV2luZG93LnNldE5lZWRzRGlzcGxheSgpOyB9CisgICAgdm9p
ZCBzZXRSb290Q2hpbGRMYXllcihXZWJDb3JlOjpQbGF0Zm9ybUxheWVyKiBsYXllcik7CisjZW5k
aWYKKwogcHJpdmF0ZToKICAgICB2b2lkIHNldFpvb21NdWx0aXBsaWVyKGZsb2F0IG11bHRpcGxp
ZXIsIGJvb2wgaXNUZXh0T25seSk7CiAgICAgZmxvYXQgem9vbU11bHRpcGxpZXIoYm9vbCBpc1Rl
eHRPbmx5KTsKQEAgLTk3MCw2ICs5ODAsMTQgQEAgcHJvdGVjdGVkOgogICAgIGxvbmcgbV9sYXN0
UGFuWTsKICAgICBsb25nIG1feE92ZXJwYW47CiAgICAgbG9uZyBtX3lPdmVycGFuOworCisjaWYg
VVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorICAgIHZvaWQgc2V0QWNjZWxlcmF0ZWRDb21w
b3NpdGluZyhib29sKTsKKyAgICB2b2lkIHNldFJvb3RMYXllckNvbnRlbnRzKCk7CisKKyAgICBX
ZWJDb3JlOjpXS0NBQ0ZMYXllcldpbmRvdyBtX2xheWVyV2luZG93OworICAgIGJvb2wgbV9pc0Fj
Y2VsZXJhdGVkQ29tcG9zaXRpbmc7CisjZW5kaWYKIH07CiAKICNlbmRpZgpJbmRleDogV2ViS2l0
L3dpbi9XZWJDb3JlU3VwcG9ydC9XZWJDaHJvbWVDbGllbnQuY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdl
YktpdC93aW4vV2ViQ29yZVN1cHBvcnQvV2ViQ2hyb21lQ2xpZW50LmNwcAkocmV2aXNpb24gNTEx
MjIpCisrKyBXZWJLaXQvd2luL1dlYkNvcmVTdXBwb3J0L1dlYkNocm9tZUNsaWVudC5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTc1NCw2ICs3NTQsMTkgQEAgdm9pZCBXZWJDaHJvbWVDbGllbnQ6OnJl
cXVlc3RHZW9sb2NhdGlvbgogICAgIG5vdEltcGxlbWVudGVkKCk7CiB9CiAKKyNpZiBVU0UoQUND
RUxFUkFURURfQ09NUE9TSVRJTkcpCit2b2lkIFdlYkNocm9tZUNsaWVudDo6YXR0YWNoUm9vdEdy
YXBoaWNzTGF5ZXIoRnJhbWUqIGZyYW1lLCBHcmFwaGljc0xheWVyKiBncmFwaGljc0xheWVyKQor
eworCW1fd2ViVmlldy0+c2V0Um9vdENoaWxkTGF5ZXIoZ3JhcGhpY3NMYXllciA/IGdyYXBoaWNz
TGF5ZXItPnBsYXRmb3JtTGF5ZXIoKSA6IDApOworfQorCit2b2lkIFdlYkNocm9tZUNsaWVudDo6
c2NoZWR1bGVDb21wb3NpdGluZ0xheWVyU3luYygpCit7CisgICAgbV93ZWJWaWV3LT5zZXRSb290
TGF5ZXJOZWVkc0Rpc3BsYXkoKTsKK30KKworI2VuZGlmCisKIENPTVB0cjxJV2ViVUlEZWxlZ2F0
ZT4gV2ViQ2hyb21lQ2xpZW50Ojp1aURlbGVnYXRlKCkKIHsKICAgICBDT01QdHI8SVdlYlVJRGVs
ZWdhdGU+IGRlbGVnYXRlOwpJbmRleDogV2ViS2l0L3dpbi9XZWJDb3JlU3VwcG9ydC9XZWJDaHJv
bWVDbGllbnQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvd2luL1dlYkNvcmVTdXBwb3J0L1dlYkNo
cm9tZUNsaWVudC5oCShyZXZpc2lvbiA1MTEyMikKKysrIFdlYktpdC93aW4vV2ViQ29yZVN1cHBv
cnQvV2ViQ2hyb21lQ2xpZW50LmgJKHdvcmtpbmcgY29weSkKQEAgLTEzMiw2ICsxMzIsMTcgQEAg
cHVibGljOgogCiAgICAgdmlydHVhbCBQYXNzT3duUHRyPFdlYkNvcmU6OkhUTUxQYXJzZXJRdWly
a3M+IGNyZWF0ZUhUTUxQYXJzZXJRdWlya3MoKSB7IHJldHVybiAwOyB9CiAKKyNpZiBVU0UoQUND
RUxFUkFURURfQ09NUE9TSVRJTkcpCisgICAgICAgIC8vIFBhc3MgMCBhcyB0aGUgR3JhcGhpY3NM
YXllciB0byBkZXRhdGNoIHRoZSByb290IGxheWVyLgorICAgICAgICB2aXJ0dWFsIHZvaWQgYXR0
YWNoUm9vdEdyYXBoaWNzTGF5ZXIoV2ViQ29yZTo6RnJhbWUqLCBXZWJDb3JlOjpHcmFwaGljc0xh
eWVyKik7CisgICAgICAgIC8vIFNldHMgYSBmbGFnIHRvIHNwZWNpZnkgdGhhdCB0aGUgbmV4dCB0
aW1lIGNvbnRlbnQgaXMgZHJhd24gdG8gdGhlIHdpbmRvdywKKyAgICAgICAgLy8gdGhlIGNoYW5n
ZXMgYXBwZWFyIG9uIHRoZSBzY3JlZW4gaW4gc3luY2hyb255IHdpdGggdXBkYXRlcyB0byBHcmFw
aGljc0xheWVycy4KKyAgICAgICAgdmlydHVhbCB2b2lkIHNldE5lZWRzT25lU2hvdERyYXdpbmdT
eW5jaHJvbml6YXRpb24oKSB7IH0KKyAgICAgICAgLy8gU2V0cyBhIGZsYWcgdG8gc3BlY2lmeSB0
aGF0IHRoZSB2aWV3IG5lZWRzIHRvIGJlIHVwZGF0ZWQsIHNvIHdlIG5lZWQKKyAgICAgICAgLy8g
dG8gZG8gYW4gZWFnZXIgbGF5b3V0IGJlZm9yZSB0aGUgZHJhd2luZy4KKyAgICAgICAgdmlydHVh
bCB2b2lkIHNjaGVkdWxlQ29tcG9zaXRpbmdMYXllclN5bmMoKTsKKyNlbmRpZgorCiAgICAgdmly
dHVhbCB2b2lkIHNjcm9sbFJlY3RJbnRvVmlldyhjb25zdCBXZWJDb3JlOjpJbnRSZWN0JiwgY29u
c3QgV2ViQ29yZTo6U2Nyb2xsVmlldyopIGNvbnN0IHt9CiAKICAgICB2aXJ0dWFsIHZvaWQgcmVx
dWVzdEdlb2xvY2F0aW9uUGVybWlzc2lvbkZvckZyYW1lKFdlYkNvcmU6OkZyYW1lKiwgV2ViQ29y
ZTo6R2VvbG9jYXRpb24qKTsKSW5kZXg6IFdlYktpdC93aW4vV2ViS2l0LnZjcHJvai9XZWJLaXQu
dmNwcm9qCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC93aW4vV2ViS2l0LnZjcHJvai9XZWJLaXQudmNw
cm9qCShyZXZpc2lvbiA1MTEyMikKKysrIFdlYktpdC93aW4vV2ViS2l0LnZjcHJvai9XZWJLaXQu
dmNwcm9qCSh3b3JraW5nIGNvcHkpCkBAIC0xMzYsNyArMTM2LDcgQEAKIAkJCS8+DQogCQkJPFRv
b2wNCiAJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KLQkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVz
PSJkZWxheWltcC5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIGNvbWRsZzMy
LmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlk
LmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiB1c3AxMC5saWIgY29tY3RsMzIubGliIHZlcnNp
b24ubGliIHNobHdhcGkubGliIGxpYnhtbDIkKExpYnJhcnlDb25maWdTdWZmaXgpLmxpYiBsaWJ4
c2x0JChMaWJyYXJ5Q29uZmlnU3VmZml4KS5saWIgaWN1aW4kKExpYnJhcnlDb25maWdTdWZmaXgp
LmxpYiBpY3V1YyQoTGlicmFyeUNvbmZpZ1N1ZmZpeCkubGliIFNRTGl0ZTMkKExpYnJhcnlDb25m
aWdTdWZmaXgpLmxpYiBwdGhyZWFkVkMyJChMaWJyYXJ5Q29uZmlnU3VmZml4KS5saWIgQ29yZUZv
dW5kYXRpb24kKExpYnJhcnlDb25maWdTdWZmaXgpLmxpYiBKYXZhU2NyaXB0Q29yZSQoV2ViS2l0
RExMQ29uZmlnU3VmZml4KS5saWIgQ0ZOZXR3b3JrJChMaWJyYXJ5Q29uZmlnU3VmZml4KS5saWIg
Q29yZUdyYXBoaWNzJChMaWJyYXJ5Q29uZmlnU3VmZml4KS5saWIgV2ViS2l0R1VJRCQoV2ViS2l0
Q29uZmlnU3VmZml4KS5saWIgV2ViQ29yZSQoV2ViS2l0Q29uZmlnU3VmZml4KS5saWIgV2ViS2l0
U3lzdGVtSW50ZXJmYWNlJChXZWJLaXRDb25maWdTdWZmaXgpLmxpYiBtc2ltZzMyLmxpYiBRVE1v
dmllV2luJChXZWJLaXRDb25maWdTdWZmaXgpLmxpYiBjcnlwdDMyLmxpYiBpcGhscGFwaS5saWIg
d2lubW0ubGliIHJwY3J0NC5saWIgY29tc3VwcHcubGliIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5k
ZW5jaWVzPSJkZWxheWltcC5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIGNv
bWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxp
YiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiB1c3AxMC5saWIgY29tY3RsMzIubGli
IHZlcnNpb24ubGliIHNobHdhcGkubGliIGxpYnhtbDIkKExpYnJhcnlDb25maWdTdWZmaXgpLmxp
YiBsaWJ4c2x0JChMaWJyYXJ5Q29uZmlnU3VmZml4KS5saWIgaWN1aW4kKExpYnJhcnlDb25maWdT
dWZmaXgpLmxpYiBpY3V1YyQoTGlicmFyeUNvbmZpZ1N1ZmZpeCkubGliIFNRTGl0ZTMkKExpYnJh
cnlDb25maWdTdWZmaXgpLmxpYiBwdGhyZWFkVkMyJChMaWJyYXJ5Q29uZmlnU3VmZml4KS5saWIg
Q29yZUZvdW5kYXRpb24kKExpYnJhcnlDb25maWdTdWZmaXgpLmxpYiBKYXZhU2NyaXB0Q29yZSQo
V2ViS2l0RExMQ29uZmlnU3VmZml4KS5saWIgQ0ZOZXR3b3JrJChMaWJyYXJ5Q29uZmlnU3VmZml4
KS5saWIgQ29yZUdyYXBoaWNzJChMaWJyYXJ5Q29uZmlnU3VmZml4KS5saWIgUXVhcnR6Q29yZSQo
TGlicmFyeUNvbmZpZ1N1ZmZpeCkubGliIFdlYktpdEdVSUQkKFdlYktpdENvbmZpZ1N1ZmZpeCku
bGliIFdlYkNvcmUkKFdlYktpdENvbmZpZ1N1ZmZpeCkubGliIFdlYktpdFN5c3RlbUludGVyZmFj
ZSQoV2ViS2l0Q29uZmlnU3VmZml4KS5saWIgbXNpbWczMi5saWIgUVRNb3ZpZVdpbiQoV2ViS2l0
Q29uZmlnU3VmZml4KS5saWIgY3J5cHQzMi5saWIgaXBobHBhcGkubGliIHdpbm1tLmxpYiBycGNy
dDQubGliIGQzZDkubGliIGQzZHg5LmxpYiBjb21zdXBwdy5saWIiDQogCQkJCU91dHB1dEZpbGU9
IiQoT3V0RGlyKVwkKFByb2plY3ROYW1lKSQoV2ViS2l0RExMQ29uZmlnU3VmZml4KS5kbGwiDQog
CQkJCUFkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM9IiINCiAJCQkJTW9kdWxlRGVmaW5pdGlv
bkZpbGU9IldlYktpdCQoV2ViS2l0RExMQ29uZmlnU3VmZml4KS5kZWYiDQpAQCAtMjEzLDcgKzIx
Myw3IEBACiAJCQkvPg0KIAkJCTxUb29sDQogCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCi0JCQkJ
QWRkaXRpb25hbERlcGVuZGVuY2llcz0iZGVsYXlpbXAubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIu
bGliIGdkaTMyLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMy
LmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgdXNwMTAu
bGliIGNvbWN0bDMyLmxpYiB2ZXJzaW9uLmxpYiBzaGx3YXBpLmxpYiBsaWJ4bWwyJChMaWJyYXJ5
Q29uZmlnU3VmZml4KS5saWIgbGlieHNsdCQoTGlicmFyeUNvbmZpZ1N1ZmZpeCkubGliIGljdWlu
JChMaWJyYXJ5Q29uZmlnU3VmZml4KS5saWIgaWN1dWMkKExpYnJhcnlDb25maWdTdWZmaXgpLmxp
YiBTUUxpdGUzJChMaWJyYXJ5Q29uZmlnU3VmZml4KS5saWIgcHRocmVhZFZDMiQoTGlicmFyeUNv
bmZpZ1N1ZmZpeCkubGliIENvcmVGb3VuZGF0aW9uJChMaWJyYXJ5Q29uZmlnU3VmZml4KS5saWIg
SmF2YVNjcmlwdENvcmUkKFdlYktpdERMTENvbmZpZ1N1ZmZpeCkubGliIENGTmV0d29yayQoTGli
cmFyeUNvbmZpZ1N1ZmZpeCkubGliIENvcmVHcmFwaGljcyQoTGlicmFyeUNvbmZpZ1N1ZmZpeCku
bGliIFdlYktpdEdVSUQkKFdlYktpdENvbmZpZ1N1ZmZpeCkubGliIFdlYkNvcmUkKFdlYktpdENv
bmZpZ1N1ZmZpeCkubGliIFdlYktpdFN5c3RlbUludGVyZmFjZSQoV2ViS2l0Q29uZmlnU3VmZml4
KS5saWIgbXNpbWczMi5saWIgUVRNb3ZpZVdpbiQoV2ViS2l0Q29uZmlnU3VmZml4KS5saWIgY3J5
cHQzMi5saWIgaXBobHBhcGkubGliIHdpbm1tLmxpYiBycGNydDQubGliIGNvbXN1cHB3LmxpYiIN
CisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0iZGVsYXlpbXAubGliIGtlcm5lbDMyLmxpYiB1
c2VyMzIubGliIGdkaTMyLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGli
IG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIg
dXNwMTAubGliIGNvbWN0bDMyLmxpYiB2ZXJzaW9uLmxpYiBzaGx3YXBpLmxpYiBsaWJ4bWwyJChM
aWJyYXJ5Q29uZmlnU3VmZml4KS5saWIgbGlieHNsdCQoTGlicmFyeUNvbmZpZ1N1ZmZpeCkubGli
IGljdWluJChMaWJyYXJ5Q29uZmlnU3VmZml4KS5saWIgaWN1dWMkKExpYnJhcnlDb25maWdTdWZm
aXgpLmxpYiBTUUxpdGUzJChMaWJyYXJ5Q29uZmlnU3VmZml4KS5saWIgcHRocmVhZFZDMiQoTGli
cmFyeUNvbmZpZ1N1ZmZpeCkubGliIENvcmVGb3VuZGF0aW9uJChMaWJyYXJ5Q29uZmlnU3VmZml4
KS5saWIgSmF2YVNjcmlwdENvcmUkKFdlYktpdERMTENvbmZpZ1N1ZmZpeCkubGliIENGTmV0d29y
ayQoTGlicmFyeUNvbmZpZ1N1ZmZpeCkubGliIENvcmVHcmFwaGljcyQoTGlicmFyeUNvbmZpZ1N1
ZmZpeCkubGliIFdlYktpdEdVSUQkKFdlYktpdENvbmZpZ1N1ZmZpeCkubGliIFdlYkNvcmUkKFdl
YktpdENvbmZpZ1N1ZmZpeCkubGliIFdlYktpdFN5c3RlbUludGVyZmFjZSQoV2ViS2l0Q29uZmln
U3VmZml4KS5saWIgbXNpbWczMi5saWIgUVRNb3ZpZVdpbiQoV2ViS2l0Q29uZmlnU3VmZml4KS5s
aWIgY3J5cHQzMi5saWIgaXBobHBhcGkubGliIHdpbm1tLmxpYiBycGNydDQubGliIGNvbXN1cHB3
LmxpYiBRdWFydHpDb3JlJChMaWJyYXJ5Q29uZmlnU3VmZml4KS5saWIgZDNkOS5saWIgZDNkeDku
bGliIg0KIAkJCQlPdXRwdXRGaWxlPSIkKE91dERpcilcJChQcm9qZWN0TmFtZSkkKFdlYktpdERM
TENvbmZpZ1N1ZmZpeCkuZGxsIg0KIAkJCQlBZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPSIi
DQogCQkJCU1vZHVsZURlZmluaXRpb25GaWxlPSJXZWJLaXQkKFdlYktpdERMTENvbmZpZ1N1ZmZp
eCkuZGVmIg0KQEAgLTcyMiwxMCArNzIyLDYgQEAKIAkJCQk+DQogCQkJPC9GaWxlPg0KIAkJCTxG
aWxlDQotCQkJCVJlbGF0aXZlUGF0aD0iLi5cV2ViU2NyaXB0V29ybGQuaCINCi0JCQkJPg0KLQkJ
CTwvRmlsZT4NCi0JCQk8RmlsZQ0KIAkJCQlSZWxhdGl2ZVBhdGg9Ii4uXFdlYktpdFN0YXRpc3Rp
Y3MuaCINCiAJCQkJPg0KIAkJCTwvRmlsZT4NCkBAIC03OTQsNiArNzkwLDEwIEBACiAJCQkJPg0K
IAkJCTwvRmlsZT4NCiAJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXFdlYlNjcmlwdFdv
cmxkLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCiAJCQkJUmVsYXRpdmVQYXRo
PSIuLlxXZWJTY3JvbGxCYXIuaCINCiAJCQkJPg0KIAkJCTwvRmlsZT4NCkBAIC0xMDk0LDEwICsx
MDk0LDYgQEAKIAkJCQk+DQogCQkJPC9GaWxlPg0KIAkJCTxGaWxlDQotCQkJCVJlbGF0aXZlUGF0
aD0iLi5cV2ViU2NyaXB0V29ybGQuY3BwIg0KLQkJCQk+DQotCQkJPC9GaWxlPg0KLQkJCTxGaWxl
DQogCQkJCVJlbGF0aXZlUGF0aD0iLi5cV2ViS2l0U3RhdGlzdGljcy5jcHAiDQogCQkJCT4NCiAJ
CQk8L0ZpbGU+DQpAQCAtMTEzMCw2ICsxMTI2LDEwIEBACiAJCQkJPg0KIAkJCTwvRmlsZT4NCiAJ
CQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXFdlYlNjcmlwdFdvcmxkLmNwcCINCisJCQkJ
Pg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KIAkJCQlSZWxhdGl2ZVBhdGg9Ii4uXFdlYlNjcm9s
bEJhci5jcHAiDQogCQkJCT4NCiAJCQk8L0ZpbGU+DQpJbmRleDogV2ViS2l0VG9vbHMvQ2hhbmdl
TG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYktpdFRvb2xzL0NoYW5nZUxvZwkocmV2aXNpb24gNTEzMzEp
CisrKyBXZWJLaXRUb29scy9DaGFuZ2VMb2cJKHdvcmtpbmcgY29weSkKQEAgLTEsMyArMSwxNyBA
QAorMjAwOS0xMS0yMyAgQ2hyaXMgTWFycmluICA8Y21hcnJpbkBhcHBsZS5jb20+CisKKyAgICAg
ICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgQ2hhbmdlcyB0aGUgd2F5
IDNEX1JFTkRFUklORyBhbmQgQUNDRUxFUkFURURfQ09NUE9TSVRJTkcgcmVsYXRlZCB0ZXN0cyBh
cmUgZXhjbHVkZWQKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dp
P2lkPTI3MzE0CisgICAgICAgIAorICAgICAgICBOb3cgdGhlIHNjcmlwdCBhbGxvd3MgdGhlIGRp
cmVjdG9yaWVzIHdpdGggdGhlc2UgdGVzdHMgdG8gYmUgaW5jbHVkZWQgb24gYWxsCisgICAgICAg
IHBsYXRmb3JtcyBidXQgTWFjLCB3aGVyZSB0aGV5IGJlaGF2ZSB0aGUgc2FtZSBhcyBhbHdheXMu
IEZvciBhbGwgb3RoZXIgcGxhdGZvcm1zCisgICAgICAgIHRoZSB0ZXN0cyBuZWVkIHRvIGJlIGV4
Y2x1ZGVkIHVzaW5nIHRoZSBTa2lwcGVkIGZpbGVzLCB3aGljaCBpcyBjdXJyZW50bHkgZG9uZQor
ICAgICAgICBmb3IgYWxsIHBsYXRmb3JtcyAoaW5jbHVkaW5nIHdpbiBzaW5jZSB3ZSdyZSBub3Qg
dHVybmVkIG9uIHlldCkKKworICAgICAgICAqIFNjcmlwdHMvd2Via2l0ZGlycy5wbToKKwogMjAw
OS0xMS0yMyAgR3VzdGF2byBOb3JvbmhhIFNpbHZhICA8Z3VzdGF2by5ub3JvbmhhQGNvbGxhYm9y
YS5jby51az4KIAogICAgICAgICBSZXZpZXdlZCBieSBPbGl2ZXIgSHVudC4KSW5kZXg6IFdlYktp
dFRvb2xzL1NjcmlwdHMvd2Via2l0ZGlycy5wbQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXRUb29scy9T
Y3JpcHRzL3dlYmtpdGRpcnMucG0JKHJldmlzaW9uIDUxMTIyKQorKysgV2ViS2l0VG9vbHMvU2Ny
aXB0cy93ZWJraXRkaXJzLnBtCSh3b3JraW5nIGNvcHkpCkBAIC02NDcsNyArNjQ3LDggQEAgc3Vi
IGNoZWNrV2ViQ29yZVNWR1N1cHBvcnQKIAogc3ViIGhhc0FjY2VsZXJhdGVkQ29tcG9zaXRpbmdT
dXBwb3J0CiB7Ci0gICAgcmV0dXJuIDAgaWYgaXNDeWd3aW4oKSB8fCBpc1F0KCk7CisJIyBPbiBw
bGF0Zm9ybXMgb3RoZXIgdGhhbiBNYWMgdGhlIFNraXBwZWQgZmlsZXMgYXJlIHVzZWQgdG8gc2tp
cCBjb21wb3NpdGluZyB0ZXN0cworICAgIHJldHVybiAxIGlmICFpc0FwcGxlTWFjV2ViS2l0KCk7
CiAKICAgICBteSAkcGF0aCA9IHNoaWZ0OwogICAgIHJldHVybiBsaWJyYXJ5Q29udGFpbnNTeW1i
b2woJHBhdGgsICJHcmFwaGljc0xheWVyIik7CkBAIC02NjcsNyArNjY4LDggQEAgc3ViIGNoZWNr
V2ViQ29yZUFjY2VsZXJhdGVkQ29tcG9zaXRpbmdTdQogCiBzdWIgaGFzM0RSZW5kZXJpbmdTdXBw
b3J0CiB7Ci0gICAgcmV0dXJuIDAgaWYgaXNRdCgpOworCSMgT24gcGxhdGZvcm1zIG90aGVyIHRo
YW4gTWFjIHRoZSBTa2lwcGVkIGZpbGVzIGFyZSB1c2VkIHRvIHNraXAgM0QgdGVzdHMKKyAgICBy
ZXR1cm4gMSBpZiAhaXNBcHBsZU1hY1dlYktpdCgpOwogCiAgICAgbXkgJHBhdGggPSBzaGlmdDsK
ICAgICByZXR1cm4gbGlicmFyeUNvbnRhaW5zU3ltYm9sKCRwYXRoLCAiV2ViQ29yZUhhczNEUmVu
ZGVyaW5nIik7CkluZGV4OiBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5
b3V0VGVzdHMvQ2hhbmdlTG9nCShyZXZpc2lvbiA1MTMzMSkKKysrIExheW91dFRlc3RzL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDE3IEBACisyMDA5LTExLTIzICBDaHJpcyBN
YXJyaW4gIDxjbWFycmluQGFwcGxlLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkg
KE9PUFMhKS4KKworICAgICAgICBTa2lwIDNkIGFuZCBjb21wb3NpdGluZyB0ZXN0cyBvbiBhbGwg
cGxhdGZvcm1zIGJ1dCBNYWMKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19i
dWcuY2dpP2lkPTI3MzE0CisgICAgICAgIAorICAgICAgICBGb3IgTWFjLCB0ZXN0cyBhcmUgcGVy
Zm9ybWVkIGluIHdlYmtpdGRpcnMucG0gdG8gZGV0ZXJtaW5lCisgICAgICAgIHdoZXRoZXIgdGhl
c2UgdGVzdHMgc2hvdWxkIGJlIHNraXBwZWQuCisKKyAgICAgICAgKiBwbGF0Zm9ybS9ndGsvU2tp
cHBlZDoKKyAgICAgICAgKiBwbGF0Zm9ybS9xdC9Ta2lwcGVkOgorICAgICAgICAqIHBsYXRmb3Jt
L3dpbi9Ta2lwcGVkOgorCiAyMDA5LTExLTIzICBDaHJpcyBNYXJyaW4gIDxjbWFycmluQGFwcGxl
LmNvbT4KIApJbmRleDogTGF5b3V0VGVzdHMvcGxhdGZvcm0vZ3RrL1NraXBwZWQKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gTGF5b3V0VGVzdHMvcGxhdGZvcm0vZ3RrL1NraXBwZWQJKHJldmlzaW9uIDUxMTIyKQor
KysgTGF5b3V0VGVzdHMvcGxhdGZvcm0vZ3RrL1NraXBwZWQJKHdvcmtpbmcgY29weSkKQEAgLTU2
ODUsMyArNTY4NSw4IEBAIGluc3BlY3Rvci9jb25zb2xlLWRpcnhtbC5odG1sCiBpbnNwZWN0b3Iv
Y29uc29sZS1mb3JtYXQtY29sbGVjdGlvbnMuaHRtbAogaW5zcGVjdG9yL2NvbnNvbGUtZm9ybWF0
Lmh0bWwKIGluc3BlY3Rvci9jb25zb2xlLXRlc3RzLmh0bWwKKworIyBUZXN0cyByZXF1aXJpbmcg
M0RfUkVOREVSSU5HIGFuZCBBQ0NFTEVSQVRFRF9DT01QT1NJVElORyBzdXBwb3J0CithbmltYXRp
b25zLzNkCit0cmFuc2Zvcm1zLzNkCitjb21wb3NpdGluZwpJbmRleDogTGF5b3V0VGVzdHMvcGxh
dGZvcm0vcXQvU2tpcHBlZAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9wbGF0Zm9ybS9xdC9T
a2lwcGVkCShyZXZpc2lvbiA1MTEyMikKKysrIExheW91dFRlc3RzL3BsYXRmb3JtL3F0L1NraXBw
ZWQJKHdvcmtpbmcgY29weSkKQEAgLTUxNzksMyArNTE3OSw4IEBAIHN0b3JhZ2UvZG9tc3RvcmFn
ZS9sb2NhbHN0b3JhZ2Uvd2luZG93LW8KICNjcmFzaGVkOiBzdmcvY2FydG8ubmV0L2ZyYW1lbGVz
cy1zdmctcGFyc2UtZXJyb3IuaHRtbAogI2NyYXNoZXI6CiBzdG9yYWdlL2RvbXN0b3JhZ2Uvc2Vz
c2lvbnN0b3JhZ2Uvd2luZG93LW9wZW4uaHRtbAorCisjIFRlc3RzIHJlcXVpcmluZyAzRF9SRU5E
RVJJTkcgYW5kIEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HIHN1cHBvcnQKK2FuaW1hdGlvbnMvM2QK
K3RyYW5zZm9ybXMvM2QKK2NvbXBvc2l0aW5nCkluZGV4OiBMYXlvdXRUZXN0cy9wbGF0Zm9ybS93
aW4vU2tpcHBlZAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9wbGF0Zm9ybS93aW4vU2tpcHBl
ZAkocmV2aXNpb24gNTExMjIpCisrKyBMYXlvdXRUZXN0cy9wbGF0Zm9ybS93aW4vU2tpcHBlZAko
d29ya2luZyBjb3B5KQpAQCAtNzAzLDMgKzcwMyw4IEBAIGZhc3QvaGlzdG9yeS9iYWNrLWZvcndh
cmQtcmVzZXQtYWZ0ZXItZXIKICMgV2ViU29ja2V0IHNlcnZlciBkb2Vzbid0IHN0YXJ0IG9uIFdp
bmRvd3MuCiAjIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zMTQ3OQog
d2Vic29ja2V0CisKKyMgVGVzdHMgcmVxdWlyaW5nIDNEX1JFTkRFUklORyBhbmQgQUNDRUxFUkFU
RURfQ09NUE9TSVRJTkcgc3VwcG9ydAorYW5pbWF0aW9ucy8zZAordHJhbnNmb3Jtcy8zZAorY29t
cG9zaXRpbmcK
</data>
<flag name="review"
          id="25506"
          type_id="1"
          status="+"
          setter="simon.fraser"
    />
          </attachment>
      

    </bug>

</bugzilla>